toysolver 0.0.6 → 0.1.0
raw patch · 239 files changed
+58080/−17712 lines, 239 filesdep +exceptionsdep +ghc-primdep +interndep −algebradep −latticesdep ~QuickCheckdep ~basedep ~containersnew-component:exe:maxsatverifynew-component:exe:pbverifynew-component:exe:pigeonhole
Dependencies added: exceptions, ghc-prim, intern, loop, process, sign, temporary, unordered-containers
Dependencies removed: algebra, lattices
Dependency ranges changed: QuickCheck, base, containers, data-interval, deepseq, logic-TPTP, mtl, random, test-framework-quickcheck2
Files
- .ghci +1/−0
- .travis.yml +56/−1
- COPYING +1/−1
- README.md +4/−2
- benchmarks/BenchmarkSATLIB.hs +39/−39
- lpconvert/lpconvert.hs +61/−49
- maxsatverify/maxsatverify.hs +42/−0
- pbconvert/pbconvert.hs +48/−33
- pbverify/pbverify.hs +40/−0
- pigeonhole/pigeonhole.hs +41/−0
- samples/gcnf/camus.cnf +1/−1
- samples/lp/hoge.lp +0/−7
- samples/lp/test-semiint.lp +16/−0
- samples/maxsat/test.cnf +0/−1
- samples/maxsat/ubcsat-sample.cnf +1073/−0
- samples/maxsat/ubcsat-sample.wcnf +1072/−0
- samples/mps/enlight13.mps +1648/−0
- samples/mps/example2.mps +18/−0
- samples/mps/ind1.mps +25/−0
- samples/mps/intvar1.mps +25/−0
- samples/mps/intvar2.mps +23/−0
- samples/mps/quadobj1.mps +16/−0
- samples/mps/quadobj2.mps +15/−0
- samples/mps/ranges.mps +14/−0
- samples/mps/sc.mps +11/−0
- samples/mps/sos.mps +28/−0
- samples/mps/test-qcp.mps +39/−0
- samples/mps/test-semiint-gurobi.mps +26/−0
- samples/mps/test-semiint-lpsolve.mps +27/−0
- samples/pbo/normalized-mds_50_10_4.opb +57/−0
- samples/pbo/normalized-opt-market-split_4_30_2.opb +15/−0
- samples/pbs/normalized-j3025_1-sat.opb +19164/−0
- samples/pbs/pigeonhole_150_149.opb +300/−0
- samples/smt/chain.smt2 +6/−0
- samples/smt/yices-floating-point.ys +9/−0
- samples/wbo/normalized-satellite01ac_wcsp.wbo +12610/−0
- src/Algebra/Lattice/Boolean.hs +0/−66
- src/Algorithm/BoundsInference.hs +0/−109
- src/Algorithm/CAD.hs +0/−593
- src/Algorithm/CongruenceClosure.hs +0/−188
- src/Algorithm/ContiTraverso.hs +0/−123
- src/Algorithm/Cooper.hs +0/−50
- src/Algorithm/Cooper/Core.hs +0/−449
- src/Algorithm/Cooper/FOL.hs +0/−54
- src/Algorithm/FOLModelFinder.hs +0/−555
- src/Algorithm/FourierMotzkin.hs +0/−29
- src/Algorithm/FourierMotzkin/Core.hs +0/−229
- src/Algorithm/FourierMotzkin/FOL.hs +0/−59
- src/Algorithm/LPSolver.hs +0/−253
- src/Algorithm/LPSolverHL.hs +0/−277
- src/Algorithm/LPUtil.hs +0/−91
- src/Algorithm/MIPSolver2.hs +0/−490
- src/Algorithm/MIPSolverHL.hs +0/−286
- src/Algorithm/OmegaTest.hs +0/−292
- src/Algorithm/OmegaTest/Misc.hs +0/−39
- src/Algorithm/Simplex.hs +0/−309
- src/Algorithm/Simplex2.hs +0/−1029
- src/Algorithm/Wang.hs +0/−46
- src/Converter/LP2SMT.hs +0/−304
- src/Converter/MaxSAT2LP.hs +0/−25
- src/Converter/MaxSAT2NLPB.hs +0/−28
- src/Converter/MaxSAT2WBO.hs +0/−32
- src/Converter/ObjType.hs +0/−18
- src/Converter/PB2LP.hs +0/−218
- src/Converter/PB2LSP.hs +0/−60
- src/Converter/PB2SMP.hs +0/−85
- src/Converter/PB2WBO.hs +0/−33
- src/Converter/PBSetObj.hs +0/−31
- src/Converter/SAT2LP.hs +0/−25
- src/Converter/SAT2PB.hs +0/−24
- src/Converter/WBO2PB.hs +0/−47
- src/Data/AlgebraicNumber/Real.hs +0/−436
- src/Data/AlgebraicNumber/Root.hs +0/−120
- src/Data/ArithRel.hs +0/−133
- src/Data/DNF.hs +0/−46
- src/Data/Delta.hs +0/−93
- src/Data/FOL/Arith.hs +0/−113
- src/Data/FOL/Formula.hs +0/−92
- src/Data/IndexedPriorityQueue.hs +0/−297
- src/Data/LA.hs +0/−279
- src/Data/LA/FOL.hs +0/−56
- src/Data/LBool.hs +0/−84
- src/Data/Polyhedron.hs +0/−152
- src/Data/Polynomial.hs +0/−125
- src/Data/Polynomial/Base.hs +0/−802
- src/Data/Polynomial/Factorization/FiniteField.hs +0/−150
- src/Data/Polynomial/Factorization/Hensel.hs +0/−147
- src/Data/Polynomial/Factorization/Integer.hs +0/−20
- src/Data/Polynomial/Factorization/Kronecker.hs +0/−132
- src/Data/Polynomial/Factorization/Rational.hs +0/−16
- src/Data/Polynomial/Factorization/SquareFree.hs +0/−62
- src/Data/Polynomial/Factorization/Zassenhaus.hs +0/−171
- src/Data/Polynomial/GroebnerBasis.hs +0/−144
- src/Data/Polynomial/Interpolation/Lagrange.hs +0/−14
- src/Data/Polynomial/RootSeparation/Graeffe.hs +0/−76
- src/Data/Polynomial/RootSeparation/Sturm.hs +0/−167
- src/Data/SeqQueue.hs +0/−67
- src/Data/Sign.hs +0/−141
- src/Data/Var.hs +0/−46
- src/SAT.hs +0/−2428
- src/SAT/CAMUS.hs +0/−128
- src/SAT/Integer.hs +0/−93
- src/SAT/MUS.hs +0/−91
- src/SAT/PBO.hs +0/−210
- src/SAT/PBO/MSU4.hs +0/−109
- src/SAT/PBO/UnsatBased.hs +0/−93
- src/SAT/Printer.hs +0/−85
- src/SAT/TheorySolver.hs +0/−25
- src/SAT/TseitinEncoder.hs +0/−203
- src/SAT/Types.hs +0/−247
- src/Text/GCNF.hs +0/−93
- src/Text/GurobiSol.hs +0/−18
- src/Text/LPFile.hs +0/−754
- src/Text/MPSFile.hs +0/−537
- src/Text/MaxSAT.hs +0/−101
- src/Text/PBFile.hs +0/−350
- src/Text/SDPFile.hs +0/−400
- src/Text/Util.hs +0/−80
- src/ToySolver/BoundsInference.hs +109/−0
- src/ToySolver/CAD.hs +667/−0
- src/ToySolver/CongruenceClosure.hs +188/−0
- src/ToySolver/ContiTraverso.hs +124/−0
- src/ToySolver/Converter/MIP2SMT.hs +379/−0
- src/ToySolver/Converter/MaxSAT2IP.hs +25/−0
- src/ToySolver/Converter/MaxSAT2NLPB.hs +35/−0
- src/ToySolver/Converter/MaxSAT2WBO.hs +40/−0
- src/ToySolver/Converter/ObjType.hs +18/−0
- src/ToySolver/Converter/PB2IP.hs +192/−0
- src/ToySolver/Converter/PB2LSP.hs +103/−0
- src/ToySolver/Converter/PB2SMP.hs +85/−0
- src/ToySolver/Converter/PB2WBO.hs +39/−0
- src/ToySolver/Converter/PBSetObj.hs +31/−0
- src/ToySolver/Converter/SAT2IP.hs +26/−0
- src/ToySolver/Converter/SAT2PB.hs +31/−0
- src/ToySolver/Converter/WBO2PB.hs +57/−0
- src/ToySolver/Cooper.hs +50/−0
- src/ToySolver/Cooper/Core.hs +435/−0
- src/ToySolver/Cooper/FOL.hs +52/−0
- src/ToySolver/Data/AlgebraicNumber/Complex.hs +167/−0
- src/ToySolver/Data/AlgebraicNumber/Graeffe.hs +76/−0
- src/ToySolver/Data/AlgebraicNumber/Real.hs +447/−0
- src/ToySolver/Data/AlgebraicNumber/Root.hs +120/−0
- src/ToySolver/Data/AlgebraicNumber/Sturm.hs +168/−0
- src/ToySolver/Data/ArithRel.hs +134/−0
- src/ToySolver/Data/Boolean.hs +55/−0
- src/ToySolver/Data/DNF.hs +33/−0
- src/ToySolver/Data/Delta.hs +93/−0
- src/ToySolver/Data/FOL/Arith.hs +113/−0
- src/ToySolver/Data/FOL/Formula.hs +79/−0
- src/ToySolver/Data/LA.hs +282/−0
- src/ToySolver/Data/LA/FOL.hs +55/−0
- src/ToySolver/Data/LBool.hs +84/−0
- src/ToySolver/Data/MIP.hs +222/−0
- src/ToySolver/Data/Polyhedron.hs +152/−0
- src/ToySolver/Data/Polynomial.hs +126/−0
- src/ToySolver/Data/Polynomial/Base.hs +873/−0
- src/ToySolver/Data/Polynomial/Factorization/FiniteField.hs +148/−0
- src/ToySolver/Data/Polynomial/Factorization/Hensel.hs +22/−0
- src/ToySolver/Data/Polynomial/Factorization/Hensel/Internal.hs +122/−0
- src/ToySolver/Data/Polynomial/Factorization/Integer.hs +20/−0
- src/ToySolver/Data/Polynomial/Factorization/Kronecker.hs +133/−0
- src/ToySolver/Data/Polynomial/Factorization/Rational.hs +17/−0
- src/ToySolver/Data/Polynomial/Factorization/SquareFree.hs +63/−0
- src/ToySolver/Data/Polynomial/Factorization/Zassenhaus.hs +149/−0
- src/ToySolver/Data/Polynomial/GroebnerBasis.hs +144/−0
- src/ToySolver/Data/Polynomial/Interpolation/Lagrange.hs +14/−0
- src/ToySolver/Data/Var.hs +46/−0
- src/ToySolver/Data/Vec.hs +210/−0
- src/ToySolver/FOLModelFinder.hs +555/−0
- src/ToySolver/FourierMotzkin.hs +29/−0
- src/ToySolver/FourierMotzkin/Core.hs +237/−0
- src/ToySolver/FourierMotzkin/FOL.hs +59/−0
- src/ToySolver/HittingSet.hs +55/−0
- src/ToySolver/HittingSet/HTCBDD.hs +105/−0
- src/ToySolver/HittingSet/SHD.hs +99/−0
- src/ToySolver/Internal/Data/IndexedPriorityQueue.hs +254/−0
- src/ToySolver/Internal/Data/PriorityQueue.hs +208/−0
- src/ToySolver/Internal/Data/SeqQueue.hs +67/−0
- src/ToySolver/Internal/ProcessUtil.hs +97/−0
- src/ToySolver/Internal/TextUtil.hs +87/−0
- src/ToySolver/Internal/Util.hs +87/−0
- src/ToySolver/Knapsack.hs +63/−0
- src/ToySolver/LPSolver.hs +350/−0
- src/ToySolver/LPSolverHL.hs +275/−0
- src/ToySolver/LPUtil.hs +92/−0
- src/ToySolver/MIPSolver2.hs +501/−0
- src/ToySolver/MIPSolverHL.hs +283/−0
- src/ToySolver/OmegaTest.hs +291/−0
- src/ToySolver/OmegaTest/Misc.hs +39/−0
- src/ToySolver/SAT.hs +3116/−0
- src/ToySolver/SAT/CAMUS.hs +131/−0
- src/ToySolver/SAT/Integer.hs +94/−0
- src/ToySolver/SAT/MUS.hs +92/−0
- src/ToySolver/SAT/PBO.hs +334/−0
- src/ToySolver/SAT/PBO/BC.hs +83/−0
- src/ToySolver/SAT/PBO/BCD.hs +137/−0
- src/ToySolver/SAT/PBO/BCD2.hs +221/−0
- src/ToySolver/SAT/PBO/Context.hs +210/−0
- src/ToySolver/SAT/PBO/MSU4.hs +81/−0
- src/ToySolver/SAT/PBO/UnsatBased.hs +75/−0
- src/ToySolver/SAT/Printer.hs +85/−0
- src/ToySolver/SAT/TheorySolver.hs +25/−0
- src/ToySolver/SAT/TseitinEncoder.hs +205/−0
- src/ToySolver/SAT/Types.hs +304/−0
- src/ToySolver/Simplex.hs +366/−0
- src/ToySolver/Simplex2.hs +1029/−0
- src/ToySolver/Text/GCNF.hs +93/−0
- src/ToySolver/Text/GurobiSol.hs +18/−0
- src/ToySolver/Text/LPFile.hs +628/−0
- src/ToySolver/Text/MPSFile.hs +843/−0
- src/ToySolver/Text/MaxSAT.hs +181/−0
- src/ToySolver/Text/PBFile.hs +388/−0
- src/ToySolver/Text/SDPFile.hs +338/−0
- src/ToySolver/Version.hs +107/−0
- src/ToySolver/Wang.hs +48/−0
- src/Util.hs +0/−87
- src/Version.hs +0/−77
- src/maxsatverify.hs +0/−42
- src/pbverify.hs +0/−40
- src/pigeonhole.hs +0/−33
- test/TestAReal.hs +55/−4
- test/TestCongruenceClosure.hs +1/−1
- test/TestContiTraverso.hs +7/−6
- test/TestLPFile.hs +1/−1
- test/TestMIPSolver2.hs +13/−13
- test/TestMPSFile.hs +1/−1
- test/TestPBFile.hs +1/−1
- test/TestPolynomial.hs +75/−56
- test/TestQE.hs +26/−12
- test/TestSAT.hs +231/−30
- test/TestSDPFile.hs +80/−0
- test/TestSimplex.hs +178/−0
- test/TestSimplex2.hs +2/−2
- test/TestUtil.hs +54/−3
- toyfmf/toyfmf.hs +1/−1
- toysat/UBCSAT.hs +61/−0
- toysat/toysat.hs +309/−199
- toysolver.cabal +199/−107
- toysolver/toysolver.hs +96/−90
+ .ghci view
@@ -0,0 +1,1 @@+:set -isrc -idist/build/autogen -optP-include -optPdist/build/autogen/cabal_macros.h
.travis.yml view
@@ -1,1 +1,56 @@-language: haskell+# NB: don't set `language: haskell` here++# The following enables several GHC versions to be tested; often it's enough to test only against the last release in a major GHC version. Feel free to omit lines listings versions you don't need/want testing for.+env:+# - GHCVER=6.12.3+# - GHCVER=7.0.1+# - GHCVER=7.0.2+# - GHCVER=7.0.3+# - GHCVER=7.0.4+# - GHCVER=7.2.1+# - GHCVER=7.2.2+# - GHCVER=7.4.1+ - GHCVER=7.4.2+# - GHCVER=7.6.1+# - GHCVER=7.6.2+ - GHCVER=7.6.3+# - GHCVER=7.8.1 # see note about Alex/Happy+# - GHCVER=7.8.2 # see note about Alex/Happy+ - GHCVER=7.8.3 # see note about Alex/Happy+# - GHCVER=head # see section about GHC HEAD snapshots++# Note: the distinction between `before_install` and `install` is not important.+before_install:+ - travis_retry sudo add-apt-repository -y ppa:hvr/ghc+ - travis_retry sudo apt-get update+ - travis_retry sudo apt-get install cabal-install-1.18 ghc-$GHCVER # see note about happy/alex+ - export PATH=/opt/ghc/$GHCVER/bin:/opt/cabal/1.18/bin:$PATH+ - |+ if [ $GHCVER = "head" ] || [ ${GHCVER%.*} = "7.8" ]; then+ travis_retry sudo apt-get install happy-1.19.3 alex-3.1.3+ export PATH=/opt/alex/3.1.3/bin:/opt/happy/1.19.3/bin:$PATH+ else+ travis_retry sudo apt-get install happy alex+ fi++install:+ - cabal update+ - cabal install --only-dependencies --enable-tests -v2 # -v2 provides useful information for debugging++# Here starts the actual work to be performed for the package under test; any command which exits with a non-zero exit code causes the build to fail.+script:+ - cabal configure --enable-tests -v2 # -v2 provides useful information for debugging+ - cabal build # this builds all libraries and executables (including tests/benchmarks)+ - cabal test+ - cabal check+ - cabal sdist # tests that a source-distribution can be generated++# The following scriptlet checks that the resulting source distribution can be built & installed+ - export SRC_TGZ=$(cabal-1.18 info . | awk '{print $2 ".tar.gz";exit}') ;+ cd dist/;+ if [ -f "$SRC_TGZ" ]; then+ cabal install "$SRC_TGZ";+ else+ echo "expected '$SRC_TGZ' not found";+ exit 1;+ fi
COPYING view
@@ -1,4 +1,4 @@-Copyright 2010-2012 Masahiro Sakai. All rights reserved.+Copyright 2010-2013 Masahiro Sakai. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are
README.md view
@@ -1,6 +1,8 @@ toysolver ========= +[](http://travis-ci.org/msakai/toysolver)+ Assorted decision procedures for SAT, Max-SAT, PB, MIP, etc. Installation@@ -44,7 +46,7 @@ Usage: - toysat [file.cnf||-]+ toysat [file.cnf|-] toysat --mus [file.gcnf|file.cnf|-] toysat --pb [file.opb|-] toysat --wbo [file.wbo|-]@@ -89,7 +91,7 @@ Supported formats: * Input formats: cnf, wcnf, opb, wbo-* Output formats: opb wbo+* Output formats: opb, wbo, lsp, lp, mps, smp, smt2, ys TODO ----
benchmarks/BenchmarkSATLIB.hs view
@@ -1,39 +1,39 @@-module Main where - -import Control.Monad -import Data.Array.IArray -import Text.Printf -import Criterion.Main -import qualified Language.CNF.Parse.ParseDIMACS as DIMACS -import qualified SAT - -solve :: FilePath -> IO () -solve fname = do - ret <- DIMACS.parseFile fname - case ret of - Left err -> error $ show err - Right cnf -> do - solver <- SAT.newSolver - SAT.setRandomFreq solver 0 - _ <- replicateM (DIMACS.numVars cnf) (SAT.newVar solver) - forM_ (DIMACS.clauses cnf) $ \clause -> - SAT.addClause solver (elems clause) - SAT.solve solver - return () - -main :: IO () -main = do - Criterion.Main.defaultMain - [ bgroup "uf250-1065" - [ bench fname (solve path) - | i <- [(1::Int)..100] - , let fname = printf "uf250-0%d.cnf" i - , let path = "benchmarks/UF250.1065.100/" ++ fname - ] - , bgroup "uuf250-1065" - [ bench fname (solve path) - | i <- [(1::Int)..100] - , let fname = printf "uuf250-0%d.cnf" i - , let path = "benchmarks/UUF250.1065.100/" ++ fname - ] - ] +module Main where++import Control.Monad+import Data.Array.IArray+import Text.Printf+import Criterion.Main+import qualified Language.CNF.Parse.ParseDIMACS as DIMACS+import qualified SAT++solve :: FilePath -> IO ()+solve fname = do+ ret <- DIMACS.parseFile fname+ case ret of+ Left err -> error $ show err+ Right cnf -> do+ solver <- SAT.newSolver+ SAT.setRandomFreq solver 0+ _ <- replicateM (DIMACS.numVars cnf) (SAT.newVar solver)+ forM_ (DIMACS.clauses cnf) $ \clause ->+ SAT.addClause solver (elems clause)+ SAT.solve solver+ return ()++main :: IO ()+main = do+ Criterion.Main.defaultMain+ [ bgroup "uf250-1065"+ [ bench fname (solve path)+ | i <- [(1::Int)..100]+ , let fname = printf "uf250-0%d.cnf" i+ , let path = "benchmarks/UF250.1065.100/" ++ fname+ ]+ , bgroup "uuf250-1065"+ [ bench fname (solve path)+ | i <- [(1::Int)..100]+ , let fname = printf "uuf250-0%d.cnf" i+ , let path = "benchmarks/UUF250.1065.100/" ++ fname+ ]+ ]
lpconvert/lpconvert.hs view
@@ -2,7 +2,7 @@ ----------------------------------------------------------------------------- -- | -- Module : lpconvert--- Copyright : (c) Masahiro Sakai 2012+-- Copyright : (c) Masahiro Sakai 2012-2014 -- License : BSD-style -- -- Maintainer : masahiro.sakai@gmail.com@@ -14,6 +14,7 @@ module Main where import Data.Char+import Data.Maybe import qualified Data.Version as V import System.Environment import System.IO@@ -22,18 +23,19 @@ import System.Console.GetOpt import qualified Language.CNF.Parse.ParseDIMACS as DIMACS -import qualified Text.LPFile as LPFile-import qualified Text.MaxSAT as MaxSAT-import qualified Text.MPSFile as MPSFile-import qualified Text.PBFile as PBFile-import Converter.ObjType-import qualified Converter.LP2SMT as LP2SMT-import qualified Converter.MaxSAT2LP as MaxSAT2LP-import qualified Converter.MaxSAT2NLPB as MaxSAT2NLPB-import qualified Converter.PB2LP as PB2LP-import qualified Converter.PBSetObj as PBSetObj-import qualified Converter.SAT2PB as SAT2PB-import Version+import qualified ToySolver.Data.MIP as MIP+import qualified ToySolver.Text.LPFile as LPFile+import qualified ToySolver.Text.MaxSAT as MaxSAT+import qualified ToySolver.Text.MPSFile as MPSFile+import qualified ToySolver.Text.PBFile as PBFile+import ToySolver.Converter.ObjType+import qualified ToySolver.Converter.MIP2SMT as MIP2SMT+import qualified ToySolver.Converter.MaxSAT2IP as MaxSAT2IP+import qualified ToySolver.Converter.MaxSAT2NLPB as MaxSAT2NLPB+import qualified ToySolver.Converter.PB2IP as PB2IP+import qualified ToySolver.Converter.PBSetObj as PBSetObj+import qualified ToySolver.Converter.SAT2PB as SAT2PB+import ToySolver.Version data Flag = Help@@ -42,10 +44,12 @@ | AsMaxSAT | ObjType ObjType | IndicatorConstraint- | Optimize- | NoCheck- | NoProduceModel+ | SMTSetLogic String+ | SMTOptimize+ | SMTNoCheck+ | SMTNoProduceModel | MaxSATNonLinear+ | Yices2 deriving Eq options :: [OptDescr Flag]@@ -56,10 +60,12 @@ , Option [] ["maxsat"] (NoArg AsMaxSAT) "treat *.cnf file as MAX-SAT problem" , Option [] ["obj"] (ReqArg (ObjType . parseObjType) "STRING") "objective function for SAT/PBS: none (default), max-one, max-zero" , Option [] ["indicator"] (NoArg IndicatorConstraint) "use indicator constraints in output LP file"- , Option [] ["smt-optimize"] (NoArg Optimize) "output optimiality condition which uses quantifiers"- , Option [] ["smt-no-check"] (NoArg NoCheck) "do not output \"(check)\""- , Option [] ["smt-no-produce-model"] (NoArg NoProduceModel) "do not output \"(set-option :produce-models true)\"" + , Option [] ["smt-set-logic"] (ReqArg SMTSetLogic "STRING") "output \"(set-logic STRING)\""+ , Option [] ["smt-optimize"] (NoArg SMTOptimize) "output optimiality condition which uses quantifiers"+ , Option [] ["smt-no-check"] (NoArg SMTNoCheck) "do not output \"(check)\""+ , Option [] ["smt-no-produce-model"] (NoArg SMTNoProduceModel) "do not output \"(set-option :produce-models true)\"" , Option [] ["maxsat-nonlinear"] (NoArg MaxSATNonLinear) "use non-linear formulation of Max-SAT"+ , Option [] ["yices2"] (NoArg Yices2) "output for yices2 rather than yices1" ] where parseObjType s =@@ -76,12 +82,12 @@ , "" , "Supported formats:" , " input: .lp .mps .cnf .wcnf .opb .wbo"- , " output: .lp .smt2 .ys"+ , " output: .lp .mps .smt2 .ys" , "" , "Options:" ] -readLP :: [Flag] -> String -> IO LPFile.LP+readLP :: [Flag] -> String -> IO MIP.Problem readLP o fname = do case map toLower (takeExtension fname) of ".cnf"@@ -92,8 +98,8 @@ Left err -> hPrint stderr err >> exitFailure Right cnf -> do let pb = transformPBFile o $ SAT2PB.convert cnf- let (lp, _) = PB2LP.convert pb- return lp+ let (mip, _) = PB2IP.convert pb+ return mip ".wcnf" -> readWCNF ".opb" -> do ret <- PBFile.parseOPBFile fname@@ -101,74 +107,80 @@ Left err -> hPrint stderr err >> exitFailure Right formula -> do let pb = transformPBFile o formula- let (lp, _) = PB2LP.convert pb- return lp+ let (mip, _) = PB2IP.convert pb+ return mip ".wbo" -> do ret <- PBFile.parseWBOFile fname case ret of Left err -> hPrint stderr err >> exitFailure Right formula -> do- let (lp, _) = PB2LP.convertWBO (IndicatorConstraint `elem` o) formula- return lp+ let (mip, _) = PB2IP.convertWBO (IndicatorConstraint `elem` o) formula+ return mip ".lp" -> do ret <- LPFile.parseFile fname case ret of Left err -> hPrint stderr err >> exitFailure- Right lp -> return lp+ Right mip -> return mip ".mps" -> do ret <- MPSFile.parseFile fname case ret of Left err -> hPrint stderr err >> exitFailure- Right lp -> return lp+ Right mip -> return mip ext -> error $ "unknown file extension: " ++ show ext where readWCNF = do- ret <- MaxSAT.parseWCNFFile fname+ ret <- MaxSAT.parseFile fname case ret of Left err -> hPutStrLn stderr err >> exitFailure Right wcnf | MaxSATNonLinear `elem` o -> do let pb = transformPBFile o $ MaxSAT2NLPB.convert wcnf- (lp, _) = PB2LP.convert pb- return lp+ (mip, _) = PB2IP.convert pb+ return mip | otherwise -> do- let (lp, _) = MaxSAT2LP.convert (IndicatorConstraint `elem` o) wcnf- return lp+ let (mip, _) = MaxSAT2IP.convert (IndicatorConstraint `elem` o) wcnf+ return mip transformPBFile :: [Flag] -> PBFile.Formula -> PBFile.Formula-transformPBFile o opb@(Nothing,_) = PBSetObj.setObj objType opb+transformPBFile o opb | isNothing (PBFile.pbObjectiveFunction opb) = PBSetObj.setObj objType opb where objType = last (ObjNone : [t | ObjType t <- o]) transformPBFile _ opb = opb -writeLP :: [Flag] -> LPFile.LP -> IO ()-writeLP o lp = do- let lp2smtOpt =- LP2SMT.defaultOptions- { LP2SMT.optCheckSAT = not (NoCheck `elem` o)- , LP2SMT.optProduceModel = not (NoProduceModel `elem` o)- , LP2SMT.optOptimize = Optimize `elem` o+writeLP :: [Flag] -> MIP.Problem -> IO ()+writeLP o mip = do+ let mip2smtOpt =+ MIP2SMT.defaultOptions+ { MIP2SMT.optSetLogic = listToMaybe [logic | SMTSetLogic logic <- o]+ , MIP2SMT.optCheckSAT = not (SMTNoCheck `elem` o)+ , MIP2SMT.optProduceModel = not (SMTNoProduceModel `elem` o)+ , MIP2SMT.optOptimize = SMTOptimize `elem` o } case head ([Just fname | Output fname <- o] ++ [Nothing]) of Nothing -> do- case LPFile.render lp of+ case LPFile.render mip of Nothing -> hPutStrLn stderr "conversion failure" >> exitFailure Just s -> putStr s Just fname -> do case map toLower (takeExtension fname) of ".lp" -> do- case LPFile.render lp of+ case LPFile.render mip of Nothing -> hPutStrLn stderr "conversion failure" >> exitFailure Just s -> writeFile fname s+ ".mps" -> do+ case MPSFile.render mip of+ Nothing -> hPutStrLn stderr "conversion failure" >> exitFailure+ Just s -> writeFile fname s ".smt2" -> do- writeFile fname (LP2SMT.convert lp2smtOpt lp "")+ writeFile fname (MIP2SMT.convert mip2smtOpt mip "") ".ys" -> do- writeFile fname (LP2SMT.convert lp2smtOpt{ LP2SMT.optLanguage = LP2SMT.YICES } lp "")+ let lang = MIP2SMT.YICES (if Yices2 `elem` o then MIP2SMT.Yices2 else MIP2SMT.Yices1)+ writeFile fname (MIP2SMT.convert mip2smtOpt{ MIP2SMT.optLanguage = lang } mip "") ext -> do error $ "unknown file extension: " ++ show ext- + main :: IO () main = do args <- getArgs@@ -177,8 +189,8 @@ | Help `elem` o -> putStrLn (usageInfo header options) | Version `elem` o -> putStrLn (V.showVersion version) (o,[fname],[]) -> do- lp <- readLP o fname- writeLP o lp+ mip <- readLP o fname+ writeLP o mip (_,_,errs) -> do hPutStrLn stderr $ concat errs ++ usageInfo header options exitFailure
+ maxsatverify/maxsatverify.hs view
@@ -0,0 +1,42 @@+module Main where++import Control.Monad+import Data.Array.IArray+import Data.IORef+import System.Environment+import Text.Printf+import qualified Text.MaxSAT as MaxSAT+import SAT.Types++main :: IO ()+main = do+ [problemFile, modelFile] <- getArgs+ Right wcnf <- MaxSAT.parseFile problemFile+ model <- liftM readModel (readFile modelFile)+ costRef <- newIORef 0+ forM_ (MaxSAT.clauses wcnf) $ \(w,c) ->+ unless (eval model c) $+ if w == MaxSAT.topCost wcnf+ then printf "violated hard constraint: %s\n" (show c)+ else do+ tc <- readIORef costRef+ writeIORef costRef $! tc + w+ printf "total cost = %d\n" =<< readIORef costRef++eval :: Model -> Clause -> Bool+eval m lits = or [evalLit m lit | lit <- lits]++readModel :: String -> Model+readModel s = array (1, maximum (0 : map fst ls2)) ls2+ where+ ls = lines s+ ls2 = do+ l <- ls+ case l of+ 'v':xs -> do+ w <- words xs+ case w of+ '-':ys -> return (read ys, False)+ ys -> return (read ys, True)+ _ -> mzero+
pbconvert/pbconvert.hs view
@@ -14,6 +14,7 @@ module Main where import Data.Char+import Data.Maybe import qualified Data.Version as V import System.Environment import System.IO@@ -22,21 +23,22 @@ import System.Console.GetOpt import qualified Language.CNF.Parse.ParseDIMACS as DIMACS -import qualified Text.LPFile as LPFile-import qualified Text.MaxSAT as MaxSAT-import qualified Text.PBFile as PBFile-import Converter.ObjType-import qualified Converter.SAT2PB as SAT2PB-import qualified Converter.LP2SMT as LP2SMT-import qualified Converter.MaxSAT2WBO as MaxSAT2WBO-import qualified Converter.MaxSAT2NLPB as MaxSAT2NLPB-import qualified Converter.PB2LP as PB2LP-import qualified Converter.PB2LSP as PB2LSP-import qualified Converter.PB2WBO as PB2WBO-import qualified Converter.PBSetObj as PBSetObj-import qualified Converter.PB2SMP as PB2SMP-import qualified Converter.WBO2PB as WBO2PB-import Version+import qualified ToySolver.Text.LPFile as LPFile+import qualified ToySolver.Text.MPSFile as MPSFile+import qualified ToySolver.Text.MaxSAT as MaxSAT+import qualified ToySolver.Text.PBFile as PBFile+import ToySolver.Converter.ObjType+import qualified ToySolver.Converter.SAT2PB as SAT2PB+import qualified ToySolver.Converter.MIP2SMT as MIP2SMT+import qualified ToySolver.Converter.MaxSAT2WBO as MaxSAT2WBO+import qualified ToySolver.Converter.MaxSAT2NLPB as MaxSAT2NLPB+import qualified ToySolver.Converter.PB2IP as PB2IP+import qualified ToySolver.Converter.PB2LSP as PB2LSP+import qualified ToySolver.Converter.PB2WBO as PB2WBO+import qualified ToySolver.Converter.PBSetObj as PBSetObj+import qualified ToySolver.Converter.PB2SMP as PB2SMP+import qualified ToySolver.Converter.WBO2PB as WBO2PB+import ToySolver.Version data Flag = Help@@ -45,10 +47,12 @@ | AsMaxSAT | ObjType ObjType | IndicatorConstraint- | Optimize- | NoCheck- | NoProduceModel+ | SMTSetLogic String+ | SMTOptimize+ | SMTNoCheck+ | SMTNoProduceModel | MaxSATNonLinear+ | Yices2 deriving Eq options :: [OptDescr Flag]@@ -59,10 +63,12 @@ , Option [] ["maxsat"] (NoArg AsMaxSAT) "treat *.cnf file as MAX-SAT problem" , Option [] ["obj"] (ReqArg (ObjType . parseObjType) "STRING") "objective function for SAT/PBS: none (default), max-one, max-zero" , Option [] ["indicator"] (NoArg IndicatorConstraint) "use indicator constraints in output LP file"- , Option [] ["smt-optimize"] (NoArg Optimize) "output optimiality condition which uses quantifiers"- , Option [] ["smt-no-check"] (NoArg NoCheck) "do not output \"(check)\""- , Option [] ["smt-no-produce-model"] (NoArg NoProduceModel) "do not output \"(set-option :produce-models true)\"" + , Option [] ["smt-set-logic"] (ReqArg SMTSetLogic "STRING") "output \"(set-logic STRING)\""+ , Option [] ["smt-optimize"] (NoArg SMTOptimize) "output optimiality condition which uses quantifiers"+ , Option [] ["smt-no-check"] (NoArg SMTNoCheck) "do not output \"(check)\""+ , Option [] ["smt-no-produce-model"] (NoArg SMTNoProduceModel) "do not output \"(set-option :produce-models true)\"" , Option [] ["maxsat-nonlinear"] (NoArg MaxSATNonLinear) "use non-linear formulation of Max-SAT"+ , Option [] ["yices2"] (NoArg Yices2) "output for yices2 rather than yices1" ] where parseObjType s =@@ -109,7 +115,7 @@ error $ "unknown file extension: " ++ show ext where readWCNF = do- ret <- MaxSAT.parseWCNFFile fname+ ret <- MaxSAT.parseFile fname case ret of Left err -> hPutStrLn stderr err >> exitFailure Right wcnf@@ -119,18 +125,19 @@ transformPBFile :: [Flag] -> Either PBFile.Formula PBFile.SoftFormula -> Either PBFile.Formula PBFile.SoftFormula transformPBFile o pb = case pb of- Left opb@(Nothing,_) -> Left $ PBSetObj.setObj objType opb+ Left opb | isNothing (PBFile.pbObjectiveFunction opb) -> Left $ PBSetObj.setObj objType opb _ -> pb where objType = last (ObjNone : [t | ObjType t <- o]) writePBFile :: [Flag] -> Either PBFile.Formula PBFile.SoftFormula -> IO () writePBFile o pb = do- let lp2smtOpt =- LP2SMT.defaultOptions- { LP2SMT.optCheckSAT = not (NoCheck `elem` o)- , LP2SMT.optProduceModel = not (NoProduceModel `elem` o)- , LP2SMT.optOptimize = Optimize `elem` o+ let mip2smtOpt =+ MIP2SMT.defaultOptions+ { MIP2SMT.optSetLogic = listToMaybe [logic | SMTSetLogic logic <- o]+ , MIP2SMT.optCheckSAT = not (SMTNoCheck `elem` o)+ , MIP2SMT.optProduceModel = not (SMTNoProduceModel `elem` o)+ , MIP2SMT.optOptimize = SMTOptimize `elem` o } case head ([Just fname | Output fname <- o] ++ [Nothing]) of Nothing -> do@@ -145,22 +152,30 @@ Left opb -> PB2WBO.convert opb Right wbo -> wbo lp = case pb of- Left opb -> fst $ PB2LP.convert opb- Right wbo -> fst $ PB2LP.convertWBO (IndicatorConstraint `elem` o) wbo+ Left opb -> fst $ PB2IP.convert opb+ Right wbo -> fst $ PB2IP.convertWBO (IndicatorConstraint `elem` o) wbo+ lsp = case pb of+ Left opb -> PB2LSP.convert opb+ Right wbo -> PB2LSP.convertWBO wbo case map toLower (takeExtension fname) of ".opb" -> writeFile fname (PBFile.showOPB opb "") ".wbo" -> writeFile fname (PBFile.showWBO wbo "")- ".lsp" -> writeFile fname (PB2LSP.convert opb "")+ ".lsp" -> writeFile fname (lsp "") ".lp" -> do case LPFile.render lp of Nothing -> hPutStrLn stderr "conversion failure" >> exitFailure Just s -> writeFile fname s+ ".mps" -> do+ case MPSFile.render lp of+ Nothing -> hPutStrLn stderr "conversion failure" >> exitFailure+ Just s -> writeFile fname s ".smp" -> do writeFile fname (PB2SMP.convert False opb "") ".smt2" -> do- writeFile fname (LP2SMT.convert lp2smtOpt lp "")+ writeFile fname (MIP2SMT.convert mip2smtOpt lp "") ".ys" -> do- writeFile fname (LP2SMT.convert lp2smtOpt{ LP2SMT.optLanguage = LP2SMT.YICES } lp "")+ let lang = MIP2SMT.YICES (if Yices2 `elem` o then MIP2SMT.Yices2 else MIP2SMT.Yices1)+ writeFile fname (MIP2SMT.convert mip2smtOpt{ MIP2SMT.optLanguage = lang } lp "") ext -> do error $ "unknown file extension: " ++ show ext
+ pbverify/pbverify.hs view
@@ -0,0 +1,40 @@+module Main where++import Control.Monad+import Data.Array.IArray+import System.Environment+import Text.Printf+import qualified ToySolver.Text.PBFile as PBFile+import ToySolver.SAT.Types++main :: IO ()+main = do+ [problemFile, modelFile] <- getArgs+ Right formula <- PBFile.parseOPBFile problemFile+ model <- liftM readModel (readFile modelFile)+ forM_ (PBFile.pbConstraints formula) $ \c ->+ unless (eval model c) $+ printf "violated: %s\n" (show c)++eval :: Model -> PBFile.Constraint -> Bool+eval m (lhs, op, rhs) = op_v lhs_v rhs+ where+ lhs_v = sum [c | (c,lits) <- lhs, all (evalLit m) lits]+ op_v = case op of+ PBFile.Ge -> (>=)+ PBFile.Eq -> (==)++readModel :: String -> Model+readModel s = array (1, maximum (0 : map fst ls2)) ls2+ where+ ls = lines s+ ls2 = do+ l <- ls+ case l of+ 'v':xs -> do+ w <- words xs+ case w of+ '-':'x':ys -> return (read ys, False)+ 'x':ys -> return (read ys, True)+ _ -> mzero+
+ pigeonhole/pigeonhole.hs view
@@ -0,0 +1,41 @@+module Main where++import Data.List+import qualified Data.Map as Map+import Data.Map (Map)+import System.Environment+import System.Exit+import System.IO+import Text.PBFile as PBFile++pigeonHole :: Integer -> Integer -> Formula+pigeonHole p h =+ Formula+ { pbObjectiveFunction = Nothing+ , pbConstraints = cs1 ++ cs2+ , pbNumVars = fromIntegral $ p*h+ , pbNumConstraints = fromIntegral $ p+h+ }+ where+ vs :: Map (Integer,Integer) Int+ vs = Map.fromList $ zip [(i,j) | i<-[1..p], j<-[1..h]] [1..]++ cs1 :: [Constraint]+ cs1 = [ ([(1,[v]) | j<-[1..h], let v = vs Map.! (i,j)], PBFile.Ge, 1)+ | i<-[1..p]+ ]+ cs2 :: [Constraint]+ cs2 = [ ([(-1,[v]) | i<-[1..p], let v = vs Map.! (i,j)], PBFile.Ge, -1)+ | j<-[1..h]+ ]++main :: IO ()+main = do+ xs <- getArgs+ case xs of+ [p,h] -> do+ let opb = pigeonHole (read p) (read h)+ putStr $ showOPB opb ""+ _ -> do+ hPutStrLn stderr "Usage: pigeonhole number_of_pigeons number_of_holes"+ exitFailure
samples/gcnf/camus.cnf view
@@ -1,5 +1,5 @@ c http://sun.iwu.edu/~mliffito/publications/jar_liffiton_CAMUS.pdf-cφ= (x1) ∧ (¬x1) ∧ (¬x1∨x2) ∧ (¬x2) ∧ (¬x1∨x3) ∧ (¬x3)+c φ= (x1) ∧ (¬x1) ∧ (¬x1∨x2) ∧ (¬x2) ∧ (¬x1∨x3) ∧ (¬x3) c MUSes(φ) = {{C1, C2}, {C1, C3, C4}, {C1, C5, C6}} c MCSes(φ) = {{C1}, {C2, C3, C5}, {C2, C3, C6}, {C2, C4, C5}, {C2, C4, C6}} p cnf 3 6
− samples/lp/hoge.lp
@@ -1,7 +0,0 @@-Minimize- obj: x1 + x2-Subject To- c1: x1 + 2 x2 + x3 = 3-General- x1 x2 x3-End
+ samples/lp/test-semiint.lp view
@@ -0,0 +1,16 @@+\ Converted from Example 2 of http://lpsolve.sourceforge.net/5.5/Xpress-format.htm+Minimize+ obj: -2 x3+Subject To+ c1: +x2 -x1 <= 10+ c2: +x3 +x2 +x1 <= 20+Bounds+ x3 >= 2+ x3 <= 3+ x1 >= 2.1+ x1 <= 30+General+ x3 x1+Semi-continuous+ x3 x1+End
− samples/maxsat/test.cnf
@@ -1,1 +0,0 @@-p cnf 4 3
+ samples/maxsat/ubcsat-sample.cnf view
@@ -0,0 +1,1073 @@+c This Formular is generated by mcnf+c+c horn? no +c forced? no +c mixed sat? no +c clause length = 3 +c+p cnf 250 1065 +-108 246 59 0+-161 -43 234 0+7 41 -88 0+26 178 -41 0+-7 -145 -33 0+206 18 -136 0+-15 173 -213 0+31 -91 215 0+3 216 196 0+234 -85 179 0+155 -195 106 0+-211 -223 -41 0+97 2 -217 0+-81 -122 27 0+-149 34 239 0+69 -216 183 0+-69 148 -92 0+-89 -120 184 0+231 110 -213 0+67 173 -195 0+132 155 183 0+-115 83 4 0+173 163 -242 0+-198 43 90 0+71 -116 37 0+-232 52 28 0+21 -230 -124 0+-146 -108 -110 0+-116 163 214 0+69 -143 128 0+228 141 -99 0+-47 75 -193 0+-118 -244 -235 0+148 -246 -112 0+124 19 -76 0+-49 102 -125 0+110 155 3 0+-180 -192 -94 0+-114 -67 -219 0+-159 53 187 0+219 -102 162 0+21 -109 -173 0+-124 90 189 0+-191 117 175 0+77 -250 -155 0+-74 203 60 0+-4 65 166 0+174 -212 -165 0+-220 119 -35 0+-247 105 126 0+-110 -192 63 0+-227 181 172 0+-219 -31 -221 0+51 113 19 0+212 -4 151 0+197 -14 -211 0+117 159 -69 0+48 -19 207 0+-168 203 -212 0+-232 250 -222 0+151 34 139 0+249 -159 229 0+-243 244 -48 0+48 180 -153 0+-227 -98 190 0+-73 -130 60 0+33 239 -11 0+41 -48 -201 0+-39 43 143 0+131 -28 106 0+-97 49 -215 0+7 42 -194 0+-224 -94 46 0+137 -220 -84 0+-38 41 -163 0+-229 208 -187 0+149 -120 238 0+-90 111 135 0+176 -171 -36 0+144 -238 237 0+-194 111 -55 0+76 203 -38 0+-105 134 34 0+55 -194 -239 0+37 -95 177 0+-121 -94 -169 0+-93 49 -175 0+54 -217 102 0+-155 11 63 0+83 -138 109 0+-68 -30 103 0+-208 -48 -125 0+-100 230 -204 0+-70 222 171 0+146 -198 158 0+13 24 98 0+191 217 100 0+52 -198 5 0+166 219 -43 0+107 -247 105 0+-83 -13 86 0+232 -68 -61 0+-107 185 -112 0+-106 225 -226 0+48 71 238 0+144 -83 -135 0+-56 -27 -39 0+243 94 55 0+38 139 35 0+-146 -127 180 0+182 -83 84 0+45 211 -70 0+31 -91 72 0+-146 -232 244 0+-39 140 -200 0+219 205 -220 0+-94 -65 -87 0+-143 180 -24 0+70 161 -201 0+136 128 85 0+-223 64 62 0+-69 209 147 0+88 -15 -225 0+80 48 -149 0+224 246 -117 0+-166 -53 -26 0+-59 -63 -100 0+-1 -55 -237 0+214 246 13 0+-101 249 -118 0+-180 -222 -250 0+-97 -7 58 0+-169 -213 -80 0+-120 152 242 0+5 115 15 0+70 -12 -43 0+65 63 -248 0+-148 177 173 0+-224 201 12 0+-231 -88 -141 0+66 29 -233 0+99 163 12 0+-56 -183 197 0+89 133 229 0+126 79 149 0+-238 -139 -137 0+-170 -95 -148 0+-202 -246 115 0+-176 -63 158 0+216 38 -83 0+221 41 44 0+-91 181 135 0+171 -63 71 0+-60 136 107 0+222 5 57 0+210 -89 -151 0+-44 36 -91 0+3 -194 -15 0+-117 38 -110 0+242 226 155 0+158 -240 110 0+218 -37 90 0+11 217 57 0+250 -157 73 0+-9 -122 53 0+185 -76 73 0+-99 -101 102 0+52 -171 33 0+-143 195 228 0+42 -63 -229 0+-178 -160 224 0+-65 -54 208 0+232 -43 -38 0+85 43 -178 0+-171 -50 45 0+47 71 -180 0+127 135 -187 0+-201 33 222 0+-221 -131 -165 0+-131 114 221 0+195 60 185 0+-8 206 -140 0+124 -240 223 0+-217 198 149 0+52 -227 -206 0+136 -96 29 0+-76 -228 64 0+-157 -47 93 0+148 -108 17 0+139 40 -89 0+63 198 86 0+199 94 -33 0+-116 216 -2 0+27 242 -1 0+-156 177 28 0+234 -83 37 0+-124 -123 -149 0+112 -1 173 0+7 235 10 0+245 -184 -224 0+-112 -161 77 0+203 104 124 0+-59 -123 -10 0+250 -242 -203 0+56 243 164 0+24 126 -2 0+-101 227 86 0+-233 138 -218 0+-211 -119 -196 0+143 -183 -186 0+-148 236 76 0+-131 -187 -77 0+62 -144 -43 0+-232 96 -30 0+121 -152 89 0+7 105 37 0+182 135 -58 0+-164 -162 -112 0+-118 173 93 0+-54 220 -2 0+-193 32 65 0+-101 46 203 0+-127 -219 -215 0+235 -42 -77 0+-179 -242 -145 0+-140 77 203 0+-23 157 -112 0+-28 -193 134 0+-147 -166 100 0+148 171 -31 0+-214 241 -166 0+-217 204 93 0+-219 -211 -142 0+107 57 50 0+227 220 119 0+-234 62 24 0+-131 -223 24 0+232 133 -4 0+74 200 -201 0+211 6 220 0+-113 -9 102 0+-207 39 -80 0+24 244 -125 0+171 190 -167 0+122 24 -201 0+-132 216 -235 0+-90 58 -181 0+161 62 185 0+-3 -9 242 0+115 2 -78 0+42 -225 -145 0+168 -46 55 0+-40 -126 -154 0+26 164 -1 0+-71 199 -133 0+-78 55 -201 0+219 249 -203 0+116 137 -43 0+11 -137 -118 0+143 224 -150 0+-2 -199 218 0+108 -140 -47 0+228 28 -30 0+224 58 -27 0+-42 -211 153 0+104 -238 -222 0+-120 47 -33 0+61 85 223 0+230 -78 -77 0+185 -210 106 0+111 4 80 0+226 195 -66 0+-204 172 8 0+195 -241 191 0+166 182 -69 0+-114 -130 223 0+213 -189 243 0+-201 151 26 0+70 21 28 0+-119 -208 -207 0+-156 94 106 0+-177 250 -6 0+24 -227 -103 0+87 4 -200 0+139 133 -200 0+-71 226 23 0+-244 -32 60 0+202 225 -63 0+-233 -111 1 0+175 -114 -147 0+54 -30 193 0+-137 -199 78 0+31 -149 3 0+90 186 138 0+105 -43 -227 0+-218 220 -216 0+206 -182 119 0+62 158 -215 0+-92 -91 -103 0+92 35 -13 0+-4 -148 -219 0+-119 125 8 0+214 -160 -39 0+120 -1 59 0+190 216 -43 0+-11 -5 119 0+-118 -36 -187 0+-200 -152 98 0+194 -50 -8 0+32 88 -154 0+-45 106 159 0+-226 202 112 0+-101 28 -201 0+-206 -209 180 0+152 244 165 0+210 112 -115 0+195 -1 -151 0+104 -14 5 0+185 -167 -229 0+192 31 184 0+-116 -46 -113 0+178 -108 140 0+56 17 67 0+80 6 195 0+-250 -61 -106 0+184 31 -236 0+185 188 -7 0+-127 -72 187 0+-221 212 -13 0+240 -19 192 0+36 -135 -139 0+-170 -116 87 0+96 66 173 0+40 -229 16 0+184 -134 55 0+233 13 141 0+19 -204 -188 0+-208 226 -192 0+-185 48 178 0+236 -34 -204 0+-46 141 -194 0+-8 -30 181 0+72 -92 37 0+-212 157 -92 0+-210 -92 -225 0+95 176 23 0+-16 120 -63 0+7 -136 40 0+-88 -110 168 0+121 208 -115 0+228 215 171 0+35 -19 -151 0+45 222 -101 0+95 103 108 0+-35 -152 -64 0+144 -226 -149 0+-95 11 -170 0+211 -152 106 0+-59 80 223 0+22 126 -156 0+-19 -167 128 0+-68 76 -114 0+-121 32 122 0+96 152 187 0+-72 -90 -152 0+129 193 93 0+-109 -177 -149 0+193 35 2 0+172 -106 246 0+134 -245 152 0+212 100 -19 0+127 -214 -56 0+-245 -128 3 0+89 -114 119 0+147 -105 37 0+-125 -102 -108 0+22 33 177 0+46 52 -240 0+-62 -136 45 0+222 -117 120 0+16 -40 111 0+86 206 49 0+123 -78 -158 0+44 188 90 0+-103 89 176 0+232 -112 130 0+-109 70 19 0+-15 204 128 0+-127 -110 192 0+-26 52 -147 0+-41 5 105 0+234 206 -160 0+-52 128 195 0+-184 -176 121 0+184 167 -120 0+-74 158 -148 0+-18 62 200 0+169 115 -190 0+-124 229 164 0+-63 37 221 0+-76 190 245 0+-217 136 -134 0+-228 231 62 0+156 -218 -85 0+124 -25 225 0+-182 32 -31 0+-250 -221 35 0+-80 114 -78 0+248 186 139 0+-19 -128 125 0+85 154 113 0+14 -80 -88 0+-145 -43 88 0+145 181 55 0+134 31 -187 0+-89 -109 -62 0+-68 237 -222 0+-130 -180 -227 0+-86 48 90 0+-199 -215 -132 0+44 60 -14 0+-248 -79 224 0+-154 114 189 0+-39 167 -139 0+230 -5 -184 0+17 184 -215 0+-17 37 54 0+-249 159 -151 0+-29 -78 -148 0+136 186 209 0+-224 64 33 0+-163 111 108 0+-4 99 23 0+137 -64 138 0+-237 -116 29 0+44 158 -139 0+147 -8 -92 0+-118 -228 42 0+201 19 141 0+-182 -39 -238 0+-36 27 -79 0+-157 249 -181 0+-191 121 132 0+-59 212 32 0+72 -233 122 0+230 -229 -132 0+-231 60 -233 0+-66 -249 106 0+-210 -40 -79 0+-75 61 111 0+-51 -98 -32 0+-166 137 245 0+-134 113 52 0+-107 19 72 0+-64 85 -121 0+227 82 -87 0+-194 180 -128 0+241 -211 38 0+-74 -56 115 0+206 -54 -210 0+-66 -204 72 0+144 156 16 0+-197 84 54 0+-80 199 59 0+69 49 103 0+19 190 -34 0+-176 235 -151 0+33 -202 -78 0+-90 -15 -151 0+198 28 -43 0+-131 -74 -108 0+159 89 -184 0+-54 -62 141 0+-83 -238 91 0+227 -84 -76 0+187 -15 205 0+-243 -87 -207 0+115 200 -48 0+-82 -163 184 0+221 -122 153 0+-178 77 -52 0+-250 113 -65 0+-192 -153 -161 0+185 -240 153 0+187 -133 171 0+-127 -108 139 0+-158 -240 -121 0+183 -137 -62 0+-84 -60 210 0+-35 -115 -5 0+-16 81 41 0+163 -167 -20 0+192 -71 -102 0+-223 -248 -37 0+54 -18 79 0+242 -238 114 0+64 55 -39 0+-48 30 -248 0+-126 -6 -159 0+-127 242 -160 0+238 42 120 0+224 -138 -66 0+-189 -18 -183 0+99 -43 -220 0+149 -82 -59 0+-25 239 60 0+99 -201 137 0+-50 188 -223 0+84 147 157 0+240 -183 -212 0+239 243 -149 0+119 217 162 0+46 126 21 0+204 196 21 0+-174 26 53 0+-45 63 -15 0+155 -229 -99 0+-149 29 -51 0+43 250 -107 0+-183 -34 -169 0+7 -214 -55 0+154 -61 -143 0+-176 -25 -155 0+-138 235 201 0+137 -231 95 0+48 -223 -227 0+-16 -147 193 0+-34 75 94 0+140 -189 21 0+-152 70 49 0+-9 173 -238 0+118 -39 129 0+-129 -230 -101 0+7 -58 89 0+-96 50 -92 0+-158 54 -139 0+126 -156 -201 0+-31 94 127 0+32 72 103 0+-142 195 51 0+200 -246 -150 0+-1 17 94 0+-98 -52 -152 0+20 213 -38 0+-123 -225 -81 0+-19 -158 165 0+-107 -246 73 0+-9 45 145 0+-127 39 164 0+-34 95 130 0+-226 -210 213 0+-250 -201 -91 0+209 -191 -78 0+-245 -248 192 0+208 -191 -157 0+136 123 169 0+-117 -17 -74 0+-140 174 162 0+121 -37 119 0+124 -152 217 0+-240 -125 237 0+33 90 -20 0+-77 -187 -160 0+-109 24 -239 0+-3 -209 85 0+84 -229 -199 0+74 170 12 0+-79 102 -245 0+-191 -197 172 0+-111 -176 -216 0+-19 229 184 0+-139 -123 240 0+-208 45 -116 0+100 -224 151 0+-28 -13 -249 0+-198 -226 -122 0+-201 -81 43 0+205 -189 53 0+-23 240 -60 0+-246 38 -224 0+138 229 156 0+-179 -60 -221 0+204 -98 32 0+-46 -228 -178 0+-215 25 112 0+96 -34 198 0+32 -203 -225 0+231 -156 -232 0+130 -224 -197 0+196 156 209 0+99 210 -49 0+91 95 143 0+-199 79 -250 0+150 221 152 0+-31 223 249 0+4 -127 -73 0+-244 13 231 0+-231 -27 -156 0+159 -107 -217 0+-153 -234 -216 0+15 227 122 0+-223 -23 -56 0+-31 139 160 0+-183 28 -223 0+142 -241 -159 0+-102 -157 -109 0+17 -216 160 0+206 -200 207 0+-232 -70 -104 0+131 -110 182 0+171 70 -230 0+167 -58 189 0+145 -86 -57 0+177 -183 -13 0+-221 18 90 0+-225 228 -127 0+177 -174 226 0+222 -144 -191 0+-222 -171 -74 0+214 172 229 0+-111 49 12 0+-155 179 -192 0+-236 14 86 0+-68 -13 -1 0+103 210 -123 0+-116 124 -244 0+145 -14 -174 0+28 129 230 0+-192 123 35 0+143 -118 241 0+-211 -64 -128 0+201 -85 -1 0+91 198 24 0+-92 -2 -201 0+-158 87 83 0+152 63 94 0+17 218 119 0+-162 183 237 0+-13 -95 -49 0+179 129 -79 0+-42 -178 242 0+169 -224 227 0+76 152 1 0+-109 98 99 0+-150 240 -198 0+-158 -43 152 0+-159 -97 82 0+-203 210 223 0+208 132 -157 0+127 -189 -208 0+-48 -74 -1 0+-57 132 -26 0+-210 -220 -120 0+-241 -131 23 0+115 -64 -250 0+31 -185 -239 0+-210 190 94 0+144 -38 80 0+-155 211 134 0+-238 222 134 0+-153 74 205 0+-103 64 28 0+-57 -193 143 0+139 110 -73 0+-93 25 -153 0+-247 164 20 0+40 157 -189 0+172 160 -180 0+-177 -185 245 0+180 49 56 0+28 -22 232 0+172 13 193 0+97 1 206 0+-161 -242 -185 0+-186 170 -190 0+59 28 -236 0+76 246 222 0+64 -202 51 0+-20 138 107 0+96 -228 16 0+-249 28 44 0+-193 -143 -113 0+215 -224 -170 0+-131 -12 35 0+84 61 54 0+-116 94 50 0+-26 -21 -9 0+107 -150 -143 0+-174 45 147 0+34 -116 174 0+-109 -80 -113 0+25 -14 -212 0+203 9 -46 0+-231 -209 4 0+-239 200 151 0+181 146 -195 0+-234 79 195 0+-91 -65 -105 0+96 141 98 0+135 -6 215 0+150 -98 -147 0+-26 124 -30 0+-66 160 206 0+-60 -142 6 0+-173 -126 -28 0+138 -60 -43 0+235 -179 57 0+156 -215 34 0+-227 195 -221 0+6 -25 -87 0+228 49 -57 0+203 68 139 0+-133 237 -1 0+-247 74 -80 0+179 62 206 0+12 73 -165 0+-28 45 -65 0+-203 186 -132 0+-88 99 53 0+99 246 171 0+172 23 -88 0+-84 119 224 0+-44 -237 211 0+-155 -28 -163 0+-67 44 -224 0+3 19 7 0+-19 189 -216 0+-18 130 -237 0+-42 -210 -204 0+-183 -233 192 0+-141 222 -59 0+-244 80 -102 0+-210 90 68 0+123 110 -82 0+-226 -246 -231 0+206 -43 -172 0+178 -184 -63 0+217 103 224 0+-157 -172 -152 0+-236 -223 211 0+166 96 155 0+-70 38 -28 0+-18 34 23 0+-33 -224 -242 0+149 -197 213 0+-222 -79 198 0+-220 235 -95 0+-167 -135 194 0+10 159 -235 0+-241 242 143 0+55 -72 133 0+-59 -168 -33 0+64 81 -35 0+18 30 -70 0+198 -22 153 0+146 29 75 0+76 -89 189 0+10 55 -184 0+205 79 233 0+186 29 35 0+-91 14 37 0+187 -118 -155 0+-228 236 201 0+115 235 -90 0+-111 193 199 0+-153 122 80 0+-6 223 -239 0+57 -76 -200 0+18 -101 -214 0+-28 -59 -165 0+42 107 67 0+-243 -52 -77 0+-196 20 -249 0+125 -45 87 0+-60 -179 93 0+-169 196 -154 0+-89 60 -1 0+88 -237 233 0+-73 7 -53 0+193 -154 133 0+-82 46 232 0+-184 119 -109 0+-148 -121 136 0+-138 -30 24 0+145 -130 -23 0+63 -247 -195 0+-94 166 93 0+-103 -247 -246 0+6 -14 -232 0+-148 98 -50 0+69 -187 -212 0+237 76 -108 0+-205 130 204 0+-152 -124 93 0+54 -51 143 0+68 39 -204 0+222 39 11 0+-37 72 169 0+-69 173 160 0+206 -110 112 0+116 30 -121 0+4 29 210 0+-53 -144 -149 0+-7 202 -93 0+228 -69 -9 0+171 32 1 0+-212 104 -87 0+-249 -170 -89 0+-68 146 175 0+59 -39 105 0+39 48 -53 0+-98 -50 7 0+-129 221 -44 0+190 186 -79 0+151 -155 179 0+27 11 -104 0+-233 147 -242 0+-113 -210 183 0+-89 -118 237 0+-58 -132 -236 0+-42 -163 218 0+87 -225 -164 0+-40 -76 -204 0+24 -71 -249 0+91 46 -111 0+-33 -73 -161 0+-17 -54 127 0+-174 -172 -167 0+9 -168 -219 0+237 19 1 0+95 -128 105 0+157 144 127 0+124 247 180 0+-188 -134 -241 0+112 -127 187 0+-145 68 158 0+-73 228 179 0+-207 -135 249 0+-210 113 -6 0+119 -130 -23 0+-87 -138 -63 0+-30 -210 112 0+-210 116 -7 0+81 -211 43 0+233 30 -191 0+250 -171 -71 0+196 -194 168 0+-179 111 -191 0+-116 -150 153 0+-220 -219 -93 0+-94 224 99 0+122 232 207 0+115 -218 219 0+-247 -19 -187 0+214 147 143 0+234 150 -90 0+95 -185 -107 0+-160 -88 113 0+167 140 -33 0+-27 2 -106 0+35 42 61 0+249 219 59 0+2 180 120 0+-129 225 -151 0+-121 104 -192 0+-138 -57 -41 0+-73 179 -133 0+164 -36 -83 0+-45 -28 -116 0+135 60 47 0+76 173 125 0+-31 194 233 0+-67 239 -53 0+-40 67 -231 0+-98 -148 229 0+213 -50 187 0+141 197 2 0+-140 177 66 0+145 115 -155 0+44 117 65 0+-36 223 88 0+30 200 31 0+-212 237 174 0+-49 -177 167 0+-218 63 -148 0+-25 46 23 0+25 -54 226 0+163 -88 21 0+98 -41 -9 0+-98 -181 18 0+-182 -194 -137 0+-230 214 -46 0+240 182 9 0+93 -116 41 0+57 -228 186 0+165 154 -49 0+42 88 -202 0+8 33 -152 0+17 -136 -35 0+-62 45 141 0+-102 33 -18 0+138 -126 214 0+-59 -221 39 0+-130 4 -218 0+-78 123 250 0+83 221 -151 0+-225 8 110 0+-194 156 43 0+65 -245 34 0+-238 -237 217 0+106 -37 -56 0+240 111 184 0+-172 -243 185 0+245 40 -45 0+122 60 -189 0+-174 -152 181 0+155 -147 -178 0+117 -168 -219 0+-102 -127 234 0+99 26 -114 0+181 36 -62 0+178 169 116 0+81 -123 -30 0+-243 -26 -38 0+-31 20 217 0+55 239 -116 0+-85 -27 49 0+62 212 177 0+3 -4 127 0+-233 -9 68 0+-28 208 -114 0+23 159 240 0+125 171 83 0+152 16 97 0+-77 -39 -84 0+-19 -15 195 0+95 -180 177 0+204 -125 -207 0+-130 78 235 0+-51 182 79 0+122 -95 -80 0+85 -72 -167 0+48 -109 -41 0+-223 -25 -44 0+248 -51 -81 0+-141 57 -2 0+208 -207 -50 0+41 15 -63 0+48 -242 -232 0+240 196 -32 0+-227 -163 -23 0+207 -90 102 0+210 5 84 0+-230 -134 95 0+-193 214 239 0+-192 -11 173 0+-109 -196 145 0+30 -161 -113 0+216 164 83 0+103 67 21 0+102 -233 66 0+-79 56 -250 0+-82 -45 112 0+-144 -124 208 0+33 -37 -149 0+-109 230 173 0+-229 82 -174 0+179 137 -235 0+84 -225 -16 0+123 233 235 0+-211 144 92 0+-2 46 -177 0+115 -202 -119 0+241 75 174 0+-205 238 -105 0+-53 219 34 0+-239 103 -148 0+147 -143 123 0+-214 -232 188 0+10 -193 41 0+6 185 18 0+141 -68 -222 0+209 -129 -143 0+-194 -108 116 0+-184 5 -46 0+23 -125 -113 0+-159 54 -8 0+130 -50 119 0+156 -74 120 0+-124 139 -119 0+-97 -134 112 0+-150 -82 -79 0+148 91 219 0+-30 19 -172 0+-13 164 -15 0+-119 -179 -11 0+5 -38 -15 0+-4 94 -66 0+-71 140 -198 0+-119 -51 -151 0+9 50 162 0+-203 35 88 0+192 122 -127 0+-187 -164 -126 0+121 -25 -215 0+-5 -167 -196 0+216 138 -11 0+-86 46 250 0+199 239 -8 0+-238 244 188 0+98 -19 -11 0+19 -151 -83 0+-158 40 232 0+1 200 -23 0+171 -11 -139 0+-203 60 173 0+-160 -122 -8 0+-179 -58 1 0+-194 -216 -202 0+-111 144 -237 0+153 -206 9 0+-182 79 -233 0+-150 -249 -191 0+153 102 121 0+79 -178 -239 0+14 -79 196 0+133 84 193 0+-248 173 -13 0+-93 225 22 0+58 -158 -16 0+-36 236 -20 0+96 140 7 0+53 -2 202 0+235 -32 249 0+94 53 -234 0+50 134 -191 0+-243 -211 88 0+-28 52 94 0+3 101 65 0+78 200 -112 0+-16 -108 -93 0+-154 -169 242 0+-196 220 -177 0+-177 187 24 0+5 242 -195 0+81 157 -247 0+-191 -3 123 0+-16 115 10 0+-152 -217 33 0+-7 -149 67 0+105 45 23 0+-55 -23 109 0+-217 -220 -144 0+73 -63 149 0+-180 -245 -191 0+-113 -50 199 0+242 -205 52 0+129 98 -226 0+205 146 -200 0+145 -180 -182 0+-240 -39 176 0+217 166 -31 0+-24 -144 9 0+137 -120 -228 0+-24 -117 158 0
+ samples/maxsat/ubcsat-sample.wcnf view
@@ -0,0 +1,1072 @@+c This is a sample .wcnf file+c The first entry for each clause is the weight+c+c Note: This file was generated randomly and is not an "interesting" instance per se+c+c+p wcnf 250 1065 +820 -108 246 59 0+3832 -161 -43 234 0+44 7 41 -88 0+958 26 178 -41 0+2822 -7 -145 -33 0+2341 206 18 -136 0+71 -15 173 -213 0+4550 31 -91 215 0+3018 3 216 196 0+68 234 -85 179 0+3916 155 -195 106 0+3553 -211 -223 -41 0+633 97 2 -217 0+4010 -81 -122 27 0+3407 -149 34 239 0+738 69 -216 183 0+417 -69 148 -92 0+242 -89 -120 184 0+3032 231 110 -213 0+4273 67 173 -195 0+2880 132 155 183 0+4211 -115 83 4 0+2229 173 163 -242 0+2536 -198 43 90 0+1948 71 -116 37 0+2084 -232 52 28 0+4364 21 -230 -124 0+305 -146 -108 -110 0+2876 -116 163 214 0+1519 69 -143 128 0+4247 228 141 -99 0+4127 -47 75 -193 0+1662 -118 -244 -235 0+4853 148 -246 -112 0+711 124 19 -76 0+658 -49 102 -125 0+26 110 155 3 0+4950 -180 -192 -94 0+493 -114 -67 -219 0+690 -159 53 187 0+2631 219 -102 162 0+1884 21 -109 -173 0+2669 -124 90 189 0+1626 -191 117 175 0+2997 77 -250 -155 0+4849 -74 203 60 0+4059 -4 65 166 0+3515 174 -212 -165 0+4540 -220 119 -35 0+2289 -247 105 126 0+1208 -110 -192 63 0+3009 -227 181 172 0+2679 -219 -31 -221 0+1880 51 113 19 0+2099 212 -4 151 0+3657 197 -14 -211 0+905 117 159 -69 0+699 48 -19 207 0+4984 -168 203 -212 0+3654 -232 250 -222 0+3470 151 34 139 0+445 249 -159 229 0+3392 -243 244 -48 0+1859 48 180 -153 0+2241 -227 -98 190 0+3705 -73 -130 60 0+1394 33 239 -11 0+767 41 -48 -201 0+4481 -39 43 143 0+4891 131 -28 106 0+2758 -97 49 -215 0+3892 7 42 -194 0+371 -224 -94 46 0+777 137 -220 -84 0+3904 -38 41 -163 0+1284 -229 208 -187 0+4726 149 -120 238 0+3570 -90 111 135 0+1459 176 -171 -36 0+4524 144 -238 237 0+1428 -194 111 -55 0+2102 76 203 -38 0+05 -105 134 34 0+4651 55 -194 -239 0+705 37 -95 177 0+4112 -121 -94 -169 0+93 -93 49 -175 0+2898 54 -217 102 0+2125 -155 11 63 0+3323 83 -138 109 0+1694 -68 -30 103 0+716 -208 -48 -125 0+4428 -100 230 -204 0+4969 -70 222 171 0+4377 146 -198 158 0+2452 13 24 98 0+2911 191 217 100 0+4684 52 -198 5 0+1318 166 219 -43 0+4334 107 -247 105 0+2977 -83 -13 86 0+3164 232 -68 -61 0+736 -107 185 -112 0+1300 -106 225 -226 0+4828 48 71 238 0+4529 144 -83 -135 0+2886 -56 -27 -39 0+757 243 94 55 0+569 38 139 35 0+1205 -146 -127 180 0+929 182 -83 84 0+320 45 211 -70 0+2472 31 -91 72 0+4343 -146 -232 244 0+2097 -39 140 -200 0+2798 219 205 -220 0+4838 -94 -65 -87 0+909 -143 180 -24 0+249 70 161 -201 0+3096 136 128 85 0+812 -223 64 62 0+1736 -69 209 147 0+2621 88 -15 -225 0+2297 80 48 -149 0+4729 224 246 -117 0+105 -166 -53 -26 0+3402 -59 -63 -100 0+1135 -1 -55 -237 0+3254 214 246 13 0+3765 -101 249 -118 0+4488 -180 -222 -250 0+2576 -97 -7 58 0+4332 -169 -213 -80 0+762 -120 152 242 0+770 5 115 15 0+4339 70 -12 -43 0+3654 65 63 -248 0+1579 -148 177 173 0+1076 -224 201 12 0+2589 -231 -88 -141 0+3851 66 29 -233 0+3015 99 163 12 0+718 -56 -183 197 0+57 89 133 229 0+1042 126 79 149 0+1149 -238 -139 -137 0+838 -170 -95 -148 0+4905 -202 -246 115 0+2588 -176 -63 158 0+364 216 38 -83 0+4131 221 41 44 0+3540 -91 181 135 0+4313 171 -63 71 0+2441 -60 136 107 0+25 222 5 57 0+3639 210 -89 -151 0+266 -44 36 -91 0+4164 3 -194 -15 0+4765 -117 38 -110 0+1217 242 226 155 0+4096 158 -240 110 0+3515 218 -37 90 0+1595 11 217 57 0+118 250 -157 73 0+107 -9 -122 53 0+2234 185 -76 73 0+3908 -99 -101 102 0+469 52 -171 33 0+953 -143 195 228 0+4041 42 -63 -229 0+3946 -178 -160 224 0+2020 -65 -54 208 0+3795 232 -43 -38 0+3463 85 43 -178 0+4118 -171 -50 45 0+2629 47 71 -180 0+4279 127 135 -187 0+2918 -201 33 222 0+4708 -221 -131 -165 0+4475 -131 114 221 0+653 195 60 185 0+1776 -8 206 -140 0+399 124 -240 223 0+3298 -217 198 149 0+3433 52 -227 -206 0+456 136 -96 29 0+2120 -76 -228 64 0+2221 -157 -47 93 0+3267 148 -108 17 0+1531 139 40 -89 0+3206 63 198 86 0+769 199 94 -33 0+3651 -116 216 -2 0+442 27 242 -1 0+3485 -156 177 28 0+4911 234 -83 37 0+17 -124 -123 -149 0+4408 112 -1 173 0+2797 7 235 10 0+727 245 -184 -224 0+4569 -112 -161 77 0+955 203 104 124 0+4892 -59 -123 -10 0+1704 250 -242 -203 0+2376 56 243 164 0+4966 24 126 -2 0+1662 -101 227 86 0+4085 -233 138 -218 0+2428 -211 -119 -196 0+2742 143 -183 -186 0+1887 -148 236 76 0+2673 -131 -187 -77 0+2667 62 -144 -43 0+1195 -232 96 -30 0+457 121 -152 89 0+81 7 105 37 0+1666 182 135 -58 0+555 -164 -162 -112 0+4392 -118 173 93 0+4436 -54 220 -2 0+4918 -193 32 65 0+2398 -101 46 203 0+3405 -127 -219 -215 0+537 235 -42 -77 0+3804 -179 -242 -145 0+3238 -140 77 203 0+2866 -23 157 -112 0+4465 -28 -193 134 0+3118 -147 -166 100 0+2642 148 171 -31 0+4207 -214 241 -166 0+2767 -217 204 93 0+344 -219 -211 -142 0+3201 107 57 50 0+540 227 220 119 0+302 -234 62 24 0+1692 -131 -223 24 0+3832 232 133 -4 0+4160 74 200 -201 0+3048 211 6 220 0+553 -113 -9 102 0+3789 -207 39 -80 0+2456 24 244 -125 0+3829 171 190 -167 0+3834 122 24 -201 0+3682 -132 216 -235 0+2784 -90 58 -181 0+264 161 62 185 0+248 -3 -9 242 0+66 115 2 -78 0+4165 42 -225 -145 0+4866 168 -46 55 0+3894 -40 -126 -154 0+461 26 164 -1 0+1514 -71 199 -133 0+1774 -78 55 -201 0+4356 219 249 -203 0+2001 116 137 -43 0+2704 11 -137 -118 0+435 143 224 -150 0+3816 -2 -199 218 0+1175 108 -140 -47 0+4019 228 28 -30 0+3387 224 58 -27 0+1167 -42 -211 153 0+2190 104 -238 -222 0+4611 -120 47 -33 0+4771 61 85 223 0+1693 230 -78 -77 0+23 185 -210 106 0+4185 111 4 80 0+360 226 195 -66 0+144 -204 172 8 0+3111 195 -241 191 0+2914 166 182 -69 0+2940 -114 -130 223 0+2716 213 -189 243 0+2603 -201 151 26 0+1795 70 21 28 0+503 -119 -208 -207 0+4394 -156 94 106 0+1385 -177 250 -6 0+3980 24 -227 -103 0+225 87 4 -200 0+71 139 133 -200 0+1188 -71 226 23 0+3879 -244 -32 60 0+3535 202 225 -63 0+3760 -233 -111 1 0+4726 175 -114 -147 0+968 54 -30 193 0+2772 -137 -199 78 0+88 31 -149 3 0+3220 90 186 138 0+3495 105 -43 -227 0+486 -218 220 -216 0+2358 206 -182 119 0+3882 62 158 -215 0+658 -92 -91 -103 0+1675 92 35 -13 0+3674 -4 -148 -219 0+4680 -119 125 8 0+1114 214 -160 -39 0+2537 120 -1 59 0+123 190 216 -43 0+2174 -11 -5 119 0+2434 -118 -36 -187 0+1550 -200 -152 98 0+2756 194 -50 -8 0+450 32 88 -154 0+3533 -45 106 159 0+4117 -226 202 112 0+1459 -101 28 -201 0+1862 -206 -209 180 0+3464 152 244 165 0+2595 210 112 -115 0+2547 195 -1 -151 0+1717 104 -14 5 0+4997 185 -167 -229 0+690 192 31 184 0+12 -116 -46 -113 0+2339 178 -108 140 0+2306 56 17 67 0+556 80 6 195 0+2995 -250 -61 -106 0+2570 184 31 -236 0+1644 185 188 -7 0+2438 -127 -72 187 0+4934 -221 212 -13 0+3534 240 -19 192 0+4302 36 -135 -139 0+3436 -170 -116 87 0+4751 96 66 173 0+130 40 -229 16 0+1605 184 -134 55 0+3360 233 13 141 0+168 19 -204 -188 0+3626 -208 226 -192 0+2377 -185 48 178 0+2074 236 -34 -204 0+4244 -46 141 -194 0+3561 -8 -30 181 0+2875 72 -92 37 0+766 -212 157 -92 0+1723 -210 -92 -225 0+321 95 176 23 0+2342 -16 120 -63 0+1014 7 -136 40 0+3037 -88 -110 168 0+1633 121 208 -115 0+3645 228 215 171 0+1878 35 -19 -151 0+1067 45 222 -101 0+4075 95 103 108 0+2641 -35 -152 -64 0+161 144 -226 -149 0+4939 -95 11 -170 0+2542 211 -152 106 0+4343 -59 80 223 0+4682 22 126 -156 0+858 -19 -167 128 0+1473 -68 76 -114 0+4342 -121 32 122 0+3725 96 152 187 0+3580 -72 -90 -152 0+979 129 193 93 0+4875 -109 -177 -149 0+268 193 35 2 0+1592 172 -106 246 0+4368 134 -245 152 0+3245 212 100 -19 0+534 127 -214 -56 0+4294 -245 -128 3 0+925 89 -114 119 0+3958 147 -105 37 0+890 -125 -102 -108 0+897 22 33 177 0+3712 46 52 -240 0+206 -62 -136 45 0+3999 222 -117 120 0+4454 16 -40 111 0+3324 86 206 49 0+2233 123 -78 -158 0+4865 44 188 90 0+1513 -103 89 176 0+2866 232 -112 130 0+3876 -109 70 19 0+1238 -15 204 128 0+00 -127 -110 192 0+848 -26 52 -147 0+3702 -41 5 105 0+2974 234 206 -160 0+4550 -52 128 195 0+3196 -184 -176 121 0+2509 184 167 -120 0+1040 -74 158 -148 0+3723 -18 62 200 0+1823 169 115 -190 0+3854 -124 229 164 0+3899 -63 37 221 0+2371 -76 190 245 0+1993 -217 136 -134 0+1700 -228 231 62 0+69 156 -218 -85 0+4512 124 -25 225 0+655 -182 32 -31 0+3149 -250 -221 35 0+162 -80 114 -78 0+1147 248 186 139 0+599 -19 -128 125 0+2094 85 154 113 0+1189 14 -80 -88 0+2548 -145 -43 88 0+814 145 181 55 0+2912 134 31 -187 0+3346 -89 -109 -62 0+2142 -68 237 -222 0+1269 -130 -180 -227 0+3877 -86 48 90 0+352 -199 -215 -132 0+1365 44 60 -14 0+4794 -248 -79 224 0+3911 -154 114 189 0+630 -39 167 -139 0+1827 230 -5 -184 0+1202 17 184 -215 0+239 -17 37 54 0+2040 -249 159 -151 0+2504 -29 -78 -148 0+1156 136 186 209 0+1620 -224 64 33 0+3417 -163 111 108 0+3159 -4 99 23 0+1412 137 -64 138 0+4297 -237 -116 29 0+3524 44 158 -139 0+4290 147 -8 -92 0+4874 -118 -228 42 0+1582 201 19 141 0+3317 -182 -39 -238 0+4535 -36 27 -79 0+4337 -157 249 -181 0+2456 -191 121 132 0+1605 -59 212 32 0+3255 72 -233 122 0+3349 230 -229 -132 0+1093 -231 60 -233 0+221 -66 -249 106 0+1852 -210 -40 -79 0+2659 -75 61 111 0+1201 -51 -98 -32 0+2994 -166 137 245 0+684 -134 113 52 0+2256 -107 19 72 0+4680 -64 85 -121 0+1085 227 82 -87 0+1025 -194 180 -128 0+2712 241 -211 38 0+933 -74 -56 115 0+1384 206 -54 -210 0+3415 -66 -204 72 0+1535 144 156 16 0+1628 -197 84 54 0+3613 -80 199 59 0+379 69 49 103 0+728 19 190 -34 0+122 -176 235 -151 0+3378 33 -202 -78 0+3570 -90 -15 -151 0+2458 198 28 -43 0+4315 -131 -74 -108 0+971 159 89 -184 0+3629 -54 -62 141 0+2103 -83 -238 91 0+4057 227 -84 -76 0+1078 187 -15 205 0+1620 -243 -87 -207 0+4155 115 200 -48 0+2938 -82 -163 184 0+3207 221 -122 153 0+3177 -178 77 -52 0+4968 -250 113 -65 0+637 -192 -153 -161 0+1100 185 -240 153 0+4484 187 -133 171 0+4218 -127 -108 139 0+3901 -158 -240 -121 0+875 183 -137 -62 0+4803 -84 -60 210 0+4215 -35 -115 -5 0+2739 -16 81 41 0+3746 163 -167 -20 0+3764 192 -71 -102 0+930 -223 -248 -37 0+2835 54 -18 79 0+3959 242 -238 114 0+2435 64 55 -39 0+1469 -48 30 -248 0+2733 -126 -6 -159 0+3590 -127 242 -160 0+3096 238 42 120 0+2836 224 -138 -66 0+2540 -189 -18 -183 0+4331 99 -43 -220 0+124 149 -82 -59 0+546 -25 239 60 0+4349 99 -201 137 0+4075 -50 188 -223 0+1503 84 147 157 0+2390 240 -183 -212 0+2453 239 243 -149 0+3884 119 217 162 0+142 46 126 21 0+586 204 196 21 0+445 -174 26 53 0+4508 -45 63 -15 0+1475 155 -229 -99 0+4433 -149 29 -51 0+126 43 250 -107 0+2422 -183 -34 -169 0+4444 7 -214 -55 0+79 154 -61 -143 0+3823 -176 -25 -155 0+1483 -138 235 201 0+1105 137 -231 95 0+2860 48 -223 -227 0+258 -16 -147 193 0+3300 -34 75 94 0+2021 140 -189 21 0+3869 -152 70 49 0+3161 -9 173 -238 0+1672 118 -39 129 0+3714 -129 -230 -101 0+4612 7 -58 89 0+2195 -96 50 -92 0+2607 -158 54 -139 0+968 126 -156 -201 0+2894 -31 94 127 0+4651 32 72 103 0+1185 -142 195 51 0+3124 200 -246 -150 0+1153 -1 17 94 0+3241 -98 -52 -152 0+88 20 213 -38 0+2198 -123 -225 -81 0+232 -19 -158 165 0+611 -107 -246 73 0+2793 -9 45 145 0+2143 -127 39 164 0+1789 -34 95 130 0+4945 -226 -210 213 0+1601 -250 -201 -91 0+2165 209 -191 -78 0+2721 -245 -248 192 0+532 208 -191 -157 0+1915 136 123 169 0+2134 -117 -17 -74 0+1072 -140 174 162 0+2020 121 -37 119 0+2921 124 -152 217 0+4524 -240 -125 237 0+2998 33 90 -20 0+2165 -77 -187 -160 0+287 -109 24 -239 0+494 -3 -209 85 0+499 84 -229 -199 0+2459 74 170 12 0+2466 -79 102 -245 0+3069 -191 -197 172 0+1494 -111 -176 -216 0+2555 -19 229 184 0+1661 -139 -123 240 0+1713 -208 45 -116 0+2842 100 -224 151 0+524 -28 -13 -249 0+28 -198 -226 -122 0+458 -201 -81 43 0+01 205 -189 53 0+114 -23 240 -60 0+1488 -246 38 -224 0+334 138 229 156 0+582 -179 -60 -221 0+4425 204 -98 32 0+3229 -46 -228 -178 0+520 -215 25 112 0+327 96 -34 198 0+2025 32 -203 -225 0+2346 231 -156 -232 0+312 130 -224 -197 0+4439 196 156 209 0+1440 99 210 -49 0+2152 91 95 143 0+2234 -199 79 -250 0+592 150 221 152 0+3874 -31 223 249 0+3484 4 -127 -73 0+18 -244 13 231 0+3225 -231 -27 -156 0+903 159 -107 -217 0+2199 -153 -234 -216 0+4913 15 227 122 0+658 -223 -23 -56 0+3513 -31 139 160 0+2592 -183 28 -223 0+2053 142 -241 -159 0+1664 -102 -157 -109 0+2671 17 -216 160 0+4851 206 -200 207 0+1318 -232 -70 -104 0+3184 131 -110 182 0+1628 171 70 -230 0+2401 167 -58 189 0+2369 145 -86 -57 0+2919 177 -183 -13 0+2577 -221 18 90 0+4963 -225 228 -127 0+3521 177 -174 226 0+2552 222 -144 -191 0+131 -222 -171 -74 0+2435 214 172 229 0+2511 -111 49 12 0+1201 -155 179 -192 0+3946 -236 14 86 0+1147 -68 -13 -1 0+1510 103 210 -123 0+35 -116 124 -244 0+2222 145 -14 -174 0+4999 28 129 230 0+2850 -192 123 35 0+581 143 -118 241 0+3965 -211 -64 -128 0+3725 201 -85 -1 0+4298 91 198 24 0+622 -92 -2 -201 0+2245 -158 87 83 0+908 152 63 94 0+1456 17 218 119 0+3728 -162 183 237 0+3210 -13 -95 -49 0+1183 179 129 -79 0+521 -42 -178 242 0+3078 169 -224 227 0+4442 76 152 1 0+1438 -109 98 99 0+2321 -150 240 -198 0+1817 -158 -43 152 0+1314 -159 -97 82 0+3589 -203 210 223 0+1048 208 132 -157 0+1889 127 -189 -208 0+3967 -48 -74 -1 0+696 -57 132 -26 0+1623 -210 -220 -120 0+4947 -241 -131 23 0+4188 115 -64 -250 0+2927 31 -185 -239 0+3861 -210 190 94 0+4888 144 -38 80 0+3225 -155 211 134 0+4959 -238 222 134 0+1716 -153 74 205 0+468 -103 64 28 0+1729 -57 -193 143 0+2579 139 110 -73 0+1053 -93 25 -153 0+4159 -247 164 20 0+3073 40 157 -189 0+1445 172 160 -180 0+3889 -177 -185 245 0+1960 180 49 56 0+3518 28 -22 232 0+1469 172 13 193 0+949 97 1 206 0+1217 -161 -242 -185 0+214 -186 170 -190 0+1152 59 28 -236 0+2112 76 246 222 0+1664 64 -202 51 0+3966 -20 138 107 0+1352 96 -228 16 0+4100 -249 28 44 0+2512 -193 -143 -113 0+326 215 -224 -170 0+4240 -131 -12 35 0+1813 84 61 54 0+4591 -116 94 50 0+2089 -26 -21 -9 0+2032 107 -150 -143 0+1286 -174 45 147 0+4149 34 -116 174 0+1521 -109 -80 -113 0+1875 25 -14 -212 0+4197 203 9 -46 0+1032 -231 -209 4 0+45 -239 200 151 0+4761 181 146 -195 0+3682 -234 79 195 0+2902 -91 -65 -105 0+2957 96 141 98 0+1867 135 -6 215 0+4376 150 -98 -147 0+2583 -26 124 -30 0+3840 -66 160 206 0+1462 -60 -142 6 0+1895 -173 -126 -28 0+87 138 -60 -43 0+4913 235 -179 57 0+221 156 -215 34 0+2060 -227 195 -221 0+1602 6 -25 -87 0+2264 228 49 -57 0+1524 203 68 139 0+582 -133 237 -1 0+595 -247 74 -80 0+4362 179 62 206 0+682 12 73 -165 0+4112 -28 45 -65 0+3193 -203 186 -132 0+4271 -88 99 53 0+4661 99 246 171 0+2455 172 23 -88 0+1978 -84 119 224 0+4284 -44 -237 211 0+906 -155 -28 -163 0+1490 -67 44 -224 0+2110 3 19 7 0+876 -19 189 -216 0+1942 -18 130 -237 0+2722 -42 -210 -204 0+305 -183 -233 192 0+2122 -141 222 -59 0+953 -244 80 -102 0+334 -210 90 68 0+2306 123 110 -82 0+2164 -226 -246 -231 0+682 206 -43 -172 0+3433 178 -184 -63 0+2436 217 103 224 0+3249 -157 -172 -152 0+2432 -236 -223 211 0+825 166 96 155 0+4853 -70 38 -28 0+4206 -18 34 23 0+3688 -33 -224 -242 0+2235 149 -197 213 0+3943 -222 -79 198 0+4470 -220 235 -95 0+2941 -167 -135 194 0+2630 10 159 -235 0+3292 -241 242 143 0+1932 55 -72 133 0+3586 -59 -168 -33 0+4220 64 81 -35 0+2156 18 30 -70 0+2350 198 -22 153 0+4462 146 29 75 0+2141 76 -89 189 0+2875 10 55 -184 0+1851 205 79 233 0+3416 186 29 35 0+3633 -91 14 37 0+3640 187 -118 -155 0+2414 -228 236 201 0+1927 115 235 -90 0+91 -111 193 199 0+544 -153 122 80 0+4434 -6 223 -239 0+3262 57 -76 -200 0+2933 18 -101 -214 0+2055 -28 -59 -165 0+1421 42 107 67 0+4415 -243 -52 -77 0+2649 -196 20 -249 0+140 125 -45 87 0+676 -60 -179 93 0+3320 -169 196 -154 0+2213 -89 60 -1 0+1843 88 -237 233 0+4146 -73 7 -53 0+691 193 -154 133 0+1580 -82 46 232 0+4296 -184 119 -109 0+1695 -148 -121 136 0+692 -138 -30 24 0+3378 145 -130 -23 0+1607 63 -247 -195 0+3802 -94 166 93 0+807 -103 -247 -246 0+3955 6 -14 -232 0+2560 -148 98 -50 0+1802 69 -187 -212 0+2642 237 76 -108 0+3144 -205 130 204 0+3191 -152 -124 93 0+2761 54 -51 143 0+2883 68 39 -204 0+1099 222 39 11 0+3567 -37 72 169 0+25 -69 173 160 0+1884 206 -110 112 0+110 116 30 -121 0+2523 4 29 210 0+3352 -53 -144 -149 0+3421 -7 202 -93 0+4482 228 -69 -9 0+2521 171 32 1 0+1137 -212 104 -87 0+4913 -249 -170 -89 0+3093 -68 146 175 0+2447 59 -39 105 0+3409 39 48 -53 0+1939 -98 -50 7 0+4803 -129 221 -44 0+2341 190 186 -79 0+4610 151 -155 179 0+3109 27 11 -104 0+3944 -233 147 -242 0+1332 -113 -210 183 0+4077 -89 -118 237 0+267 -58 -132 -236 0+3689 -42 -163 218 0+4413 87 -225 -164 0+1964 -40 -76 -204 0+1524 24 -71 -249 0+2654 91 46 -111 0+2435 -33 -73 -161 0+2656 -17 -54 127 0+1766 -174 -172 -167 0+3315 9 -168 -219 0+1989 237 19 1 0+3199 95 -128 105 0+3110 157 144 127 0+4537 124 247 180 0+1670 -188 -134 -241 0+527 112 -127 187 0+1867 -145 68 158 0+1561 -73 228 179 0+215 -207 -135 249 0+1831 -210 113 -6 0+596 119 -130 -23 0+4860 -87 -138 -63 0+2553 -30 -210 112 0+3279 -210 116 -7 0+4108 81 -211 43 0+3160 233 30 -191 0+3286 250 -171 -71 0+3166 196 -194 168 0+712 -179 111 -191 0+4974 -116 -150 153 0+3117 -220 -219 -93 0+640 -94 224 99 0+4319 122 232 207 0+4295 115 -218 219 0+4719 -247 -19 -187 0+1926 214 147 143 0+1924 234 150 -90 0+2777 95 -185 -107 0+2956 -160 -88 113 0+3370 167 140 -33 0+2273 -27 2 -106 0+13 35 42 61 0+898 249 219 59 0+4458 2 180 120 0+3955 -129 225 -151 0+2934 -121 104 -192 0+2557 -138 -57 -41 0+697 -73 179 -133 0+2562 164 -36 -83 0+810 -45 -28 -116 0+845 135 60 47 0+4832 76 173 125 0+4665 -31 194 233 0+276 -67 239 -53 0+4963 -40 67 -231 0+1641 -98 -148 229 0+3712 213 -50 187 0+3825 141 197 2 0+2238 -140 177 66 0+1565 145 115 -155 0+927 44 117 65 0+4578 -36 223 88 0+65 30 200 31 0+4873 -212 237 174 0+2025 -49 -177 167 0+4773 -218 63 -148 0+3210 -25 46 23 0+4628 25 -54 226 0+4698 163 -88 21 0+3546 98 -41 -9 0+2707 -98 -181 18 0+702 -182 -194 -137 0+2410 -230 214 -46 0+4538 240 182 9 0+4320 93 -116 41 0+325 57 -228 186 0+3991 165 154 -49 0+3967 42 88 -202 0+2981 8 33 -152 0+1934 17 -136 -35 0+3955 -62 45 141 0+2416 -102 33 -18 0+4481 138 -126 214 0+3239 -59 -221 39 0+3596 -130 4 -218 0+4385 -78 123 250 0+4779 83 221 -151 0+3472 -225 8 110 0+2661 -194 156 43 0+554 65 -245 34 0+2827 -238 -237 217 0+3406 106 -37 -56 0+2867 240 111 184 0+2600 -172 -243 185 0+1653 245 40 -45 0+2009 122 60 -189 0+1483 -174 -152 181 0+1434 155 -147 -178 0+2718 117 -168 -219 0+4526 -102 -127 234 0+3183 99 26 -114 0+2069 181 36 -62 0+2530 178 169 116 0+351 81 -123 -30 0+3821 -243 -26 -38 0+180 -31 20 217 0+425 55 239 -116 0+722 -85 -27 49 0+426 62 212 177 0+2272 3 -4 127 0+1410 -233 -9 68 0+1959 -28 208 -114 0+2415 23 159 240 0+823 125 171 83 0+4792 152 16 97 0+423 -77 -39 -84 0+3280 -19 -15 195 0+38 95 -180 177 0+3363 204 -125 -207 0+812 -130 78 235 0+3207 -51 182 79 0+2448 122 -95 -80 0+3853 85 -72 -167 0+1708 48 -109 -41 0+913 -223 -25 -44 0+1504 248 -51 -81 0+4053 -141 57 -2 0+2583 208 -207 -50 0+3006 41 15 -63 0+4567 48 -242 -232 0+1898 240 196 -32 0+1499 -227 -163 -23 0+4850 207 -90 102 0+3335 210 5 84 0+4990 -230 -134 95 0+4241 -193 214 239 0+1424 -192 -11 173 0+590 -109 -196 145 0+4603 30 -161 -113 0+771 216 164 83 0+3396 103 67 21 0+878 102 -233 66 0+4210 -79 56 -250 0+198 -82 -45 112 0+1649 -144 -124 208 0+498 33 -37 -149 0+3248 -109 230 173 0+2145 -229 82 -174 0+660 179 137 -235 0+4030 84 -225 -16 0+3131 123 233 235 0+3210 -211 144 92 0+3335 -2 46 -177 0+685 115 -202 -119 0+1280 241 75 174 0+3085 -205 238 -105 0+3397 -53 219 34 0+357 -239 103 -148 0+3660 147 -143 123 0+3505 -214 -232 188 0+4015 10 -193 41 0+2219 6 185 18 0+3788 141 -68 -222 0+4709 209 -129 -143 0+1059 -194 -108 116 0+4048 -184 5 -46 0+371 23 -125 -113 0+3140 -159 54 -8 0+4948 130 -50 119 0+4784 156 -74 120 0+4592 -124 139 -119 0+439 -97 -134 112 0+137 -150 -82 -79 0+4594 148 91 219 0+1891 -30 19 -172 0+1071 -13 164 -15 0+1258 -119 -179 -11 0+3721 5 -38 -15 0+1762 -4 94 -66 0+386 -71 140 -198 0+661 -119 -51 -151 0+1018 9 50 162 0+1590 -203 35 88 0+3582 192 122 -127 0+633 -187 -164 -126 0+1363 121 -25 -215 0+2261 -5 -167 -196 0+4961 216 138 -11 0+4056 -86 46 250 0+3232 199 239 -8 0+1413 -238 244 188 0+2072 98 -19 -11 0+1798 19 -151 -83 0+1806 -158 40 232 0+854 1 200 -23 0+3753 171 -11 -139 0+2122 -203 60 173 0+2555 -160 -122 -8 0+1844 -179 -58 1 0+4583 -194 -216 -202 0+2489 -111 144 -237 0+630 153 -206 9 0+105 -182 79 -233 0+1777 -150 -249 -191 0+3174 153 102 121 0+1095 79 -178 -239 0+2583 14 -79 196 0+2615 133 84 193 0+798 -248 173 -13 0+560 -93 225 22 0+3660 58 -158 -16 0+2507 -36 236 -20 0+2351 96 140 7 0+2448 53 -2 202 0+658 235 -32 249 0+4296 94 53 -234 0+554 50 134 -191 0+271 -243 -211 88 0+4694 -28 52 94 0+3031 3 101 65 0+4539 78 200 -112 0+4706 -16 -108 -93 0+4986 -154 -169 242 0+593 -196 220 -177 0+3708 -177 187 24 0+1533 5 242 -195 0+3526 81 157 -247 0+2746 -191 -3 123 0+2408 -16 115 10 0+3593 -152 -217 33 0+1219 -7 -149 67 0+4527 105 45 23 0+2850 -55 -23 109 0+2226 -217 -220 -144 0+2922 73 -63 149 0+3414 -180 -245 -191 0+1499 -113 -50 199 0+1522 242 -205 52 0+2456 129 98 -226 0+4241 205 146 -200 0+4837 145 -180 -182 0+2073 -240 -39 176 0+2576 217 166 -31 0+555 -24 -144 9 0+4102 137 -120 -228 0+786 -24 -117 158 0
+ samples/mps/enlight13.mps view
@@ -0,0 +1,1648 @@+NAME enlight13+ROWS+ N moves + E inner_area_1 + E inner_area_2 + E inner_area_3 + E inner_area_4 + E inner_area_5 + E inner_area_6 + E inner_area_7 + E inner_area_8 + E inner_area_9 + E inner_area_10 + E inner_area_11 + E inner_area_12 + E inner_area_13 + E inner_area_14 + E inner_area_15 + E inner_area_16 + E inner_area_17 + E inner_area_18 + E inner_area_19 + E inner_area_20 + E inner_area_21 + E inner_area_22 + E inner_area_23 + E inner_area_24 + E inner_area_25 + E inner_area_26 + E inner_area_27 + E inner_area_28 + E inner_area_29 + E inner_area_30 + E inner_area_31 + E inner_area_32 + E inner_area_33 + E inner_area_34 + E inner_area_35 + E inner_area_36 + E inner_area_37 + E inner_area_38 + E inner_area_39 + E inner_area_40 + E inner_area_41 + E inner_area_42 + E inner_area_43 + E inner_area_44 + E inner_area_45 + E inner_area_46 + E inner_area_47 + E inner_area_48 + E inner_area_49 + E inner_area_50 + E inner_area_51 + E inner_area_52 + E inner_area_53 + E inner_area_54 + E inner_area_55 + E inner_area_56 + E inner_area_57 + E inner_area_58 + E inner_area_59 + E inner_area_60 + E inner_area_61 + E inner_area_62 + E inner_area_63 + E inner_area_64 + E inner_area_65 + E inner_area_66 + E inner_area_67 + E inner_area_68 + E inner_area_69 + E inner_area_70 + E inner_area_71 + E inner_area_72 + E inner_area_73 + E inner_area_74 + E inner_area_75 + E inner_area_76 + E inner_area_77 + E inner_area_78 + E inner_area_79 + E inner_area_80 + E inner_area_81 + E inner_area_82 + E inner_area_83 + E inner_area_84 + E inner_area_85 + E inner_area_86 + E inner_area_87 + E inner_area_88 + E inner_area_89 + E inner_area_90 + E inner_area_91 + E inner_area_92 + E inner_area_93 + E inner_area_94 + E inner_area_95 + E inner_area_96 + E inner_area_97 + E inner_area_98 + E inner_area_99 + E inner_area_100 + E inner_area_101 + E inner_area_102 + E inner_area_103 + E inner_area_104 + E inner_area_105 + E inner_area_106 + E inner_area_107 + E inner_area_108 + E inner_area_109 + E inner_area_110 + E inner_area_111 + E inner_area_112 + E inner_area_113 + E inner_area_114 + E inner_area_115 + E inner_area_116 + E inner_area_117 + E inner_area_118 + E inner_area_119 + E inner_area_120 + E inner_area_121 + E upper_border_1 + E upper_border_2 + E upper_border_3 + E upper_border_4 + E upper_border_5 + E upper_border_6 + E upper_border_7 + E upper_border_8 + E upper_border_9 + E upper_border_10 + E upper_border_11 + E lower_border_1 + E lower_border_2 + E lower_border_3 + E lower_border_4 + E lower_border_5 + E lower_border_6 + E lower_border_7 + E lower_border_8 + E lower_border_9 + E lower_border_10 + E lower_border_11 + E left_border_1 + E left_border_2 + E left_border_3 + E left_border_4 + E left_border_5 + E left_border_6 + E left_border_7 + E left_border_8 + E left_border_9 + E left_border_10 + E left_border_11 + E right_border_1 + E right_border_2 + E right_border_3 + E right_border_4 + E right_border_5 + E right_border_6 + E right_border_7 + E right_border_8 + E right_border_9 + E right_border_10 + E right_border_11 + E left_upper_co@a5+ E left_lower_co@a6+ E right_upper_c@a7+ E right_lower_c@a8+COLUMNS+ MARK0000 'MARKER' 'INTORG'+ x#1#1 moves 1+ x#1#1 upper_border_1 1+ x#1#1 left_border_1 1+ x#1#1 left_upper_co@a5 1+ x#1#2 moves 1+ x#1#2 inner_area_1 1+ x#1#2 upper_border_1 1+ x#1#2 upper_border_2 1+ x#1#2 left_upper_co@a5 1+ x#1#3 moves 1+ x#1#3 inner_area_2 1+ x#1#3 upper_border_1 1+ x#1#3 upper_border_2 1+ x#1#3 upper_border_3 1+ x#1#4 moves 1+ x#1#4 inner_area_3 1+ x#1#4 upper_border_2 1+ x#1#4 upper_border_3 1+ x#1#4 upper_border_4 1+ x#1#5 moves 1+ x#1#5 inner_area_4 1+ x#1#5 upper_border_3 1+ x#1#5 upper_border_4 1+ x#1#5 upper_border_5 1+ x#1#6 moves 1+ x#1#6 inner_area_5 1+ x#1#6 upper_border_4 1+ x#1#6 upper_border_5 1+ x#1#6 upper_border_6 1+ x#1#7 moves 1+ x#1#7 inner_area_6 1+ x#1#7 upper_border_5 1+ x#1#7 upper_border_6 1+ x#1#7 upper_border_7 1+ x#1#8 moves 1+ x#1#8 inner_area_7 1+ x#1#8 upper_border_6 1+ x#1#8 upper_border_7 1+ x#1#8 upper_border_8 1+ x#1#9 moves 1+ x#1#9 inner_area_8 1+ x#1#9 upper_border_7 1+ x#1#9 upper_border_8 1+ x#1#9 upper_border_9 1+ x#1#10 moves 1+ x#1#10 inner_area_9 1+ x#1#10 upper_border_8 1+ x#1#10 upper_border_9 1+ x#1#10 upper_border_10 1+ x#1#11 moves 1+ x#1#11 inner_area_10 1+ x#1#11 upper_border_9 1+ x#1#11 upper_border_10 1+ x#1#11 upper_border_11 1+ x#1#12 moves 1+ x#1#12 inner_area_11 1+ x#1#12 upper_border_10 1+ x#1#12 upper_border_11 1+ x#1#12 right_upper_c@a7 1+ x#1#13 moves 1+ x#1#13 upper_border_11 1+ x#1#13 right_border_1 1+ x#1#13 right_upper_c@a7 1+ x#2#1 moves 1+ x#2#1 inner_area_1 1+ x#2#1 left_border_1 1+ x#2#1 left_border_2 1+ x#2#1 left_upper_co@a5 1+ x#2#2 moves 1+ x#2#2 inner_area_1 1+ x#2#2 inner_area_2 1+ x#2#2 inner_area_12 1+ x#2#2 upper_border_1 1+ x#2#2 left_border_1 1+ x#2#3 moves 1+ x#2#3 inner_area_1 1+ x#2#3 inner_area_2 1+ x#2#3 inner_area_3 1+ x#2#3 inner_area_13 1+ x#2#3 upper_border_2 1+ x#2#4 moves 1+ x#2#4 inner_area_2 1+ x#2#4 inner_area_3 1+ x#2#4 inner_area_4 1+ x#2#4 inner_area_14 1+ x#2#4 upper_border_3 1+ x#2#5 moves 1+ x#2#5 inner_area_3 1+ x#2#5 inner_area_4 1+ x#2#5 inner_area_5 1+ x#2#5 inner_area_15 1+ x#2#5 upper_border_4 1+ x#2#6 moves 1+ x#2#6 inner_area_4 1+ x#2#6 inner_area_5 1+ x#2#6 inner_area_6 1+ x#2#6 inner_area_16 1+ x#2#6 upper_border_5 1+ x#2#7 moves 1+ x#2#7 inner_area_5 1+ x#2#7 inner_area_6 1+ x#2#7 inner_area_7 1+ x#2#7 inner_area_17 1+ x#2#7 upper_border_6 1+ x#2#8 moves 1+ x#2#8 inner_area_6 1+ x#2#8 inner_area_7 1+ x#2#8 inner_area_8 1+ x#2#8 inner_area_18 1+ x#2#8 upper_border_7 1+ x#2#9 moves 1+ x#2#9 inner_area_7 1+ x#2#9 inner_area_8 1+ x#2#9 inner_area_9 1+ x#2#9 inner_area_19 1+ x#2#9 upper_border_8 1+ x#2#10 moves 1+ x#2#10 inner_area_8 1+ x#2#10 inner_area_9 1+ x#2#10 inner_area_10 1+ x#2#10 inner_area_20 1+ x#2#10 upper_border_9 1+ x#2#11 moves 1+ x#2#11 inner_area_9 1+ x#2#11 inner_area_10 1+ x#2#11 inner_area_11 1+ x#2#11 inner_area_21 1+ x#2#11 upper_border_10 1+ x#2#12 moves 1+ x#2#12 inner_area_10 1+ x#2#12 inner_area_11 1+ x#2#12 inner_area_22 1+ x#2#12 upper_border_11 1+ x#2#12 right_border_1 1+ x#2#13 moves 1+ x#2#13 inner_area_11 1+ x#2#13 right_border_1 1+ x#2#13 right_border_2 1+ x#2#13 right_upper_c@a7 1+ x#3#1 moves 1+ x#3#1 inner_area_12 1+ x#3#1 left_border_1 1+ x#3#1 left_border_2 1+ x#3#1 left_border_3 1+ x#3#2 moves 1+ x#3#2 inner_area_1 1+ x#3#2 inner_area_12 1+ x#3#2 inner_area_13 1+ x#3#2 inner_area_23 1+ x#3#2 left_border_2 1+ x#3#3 moves 1+ x#3#3 inner_area_2 1+ x#3#3 inner_area_12 1+ x#3#3 inner_area_13 1+ x#3#3 inner_area_14 1+ x#3#3 inner_area_24 1+ x#3#4 moves 1+ x#3#4 inner_area_3 1+ x#3#4 inner_area_13 1+ x#3#4 inner_area_14 1+ x#3#4 inner_area_15 1+ x#3#4 inner_area_25 1+ x#3#5 moves 1+ x#3#5 inner_area_4 1+ x#3#5 inner_area_14 1+ x#3#5 inner_area_15 1+ x#3#5 inner_area_16 1+ x#3#5 inner_area_26 1+ x#3#6 moves 1+ x#3#6 inner_area_5 1+ x#3#6 inner_area_15 1+ x#3#6 inner_area_16 1+ x#3#6 inner_area_17 1+ x#3#6 inner_area_27 1+ x#3#7 moves 1+ x#3#7 inner_area_6 1+ x#3#7 inner_area_16 1+ x#3#7 inner_area_17 1+ x#3#7 inner_area_18 1+ x#3#7 inner_area_28 1+ x#3#8 moves 1+ x#3#8 inner_area_7 1+ x#3#8 inner_area_17 1+ x#3#8 inner_area_18 1+ x#3#8 inner_area_19 1+ x#3#8 inner_area_29 1+ x#3#9 moves 1+ x#3#9 inner_area_8 1+ x#3#9 inner_area_18 1+ x#3#9 inner_area_19 1+ x#3#9 inner_area_20 1+ x#3#9 inner_area_30 1+ x#3#10 moves 1+ x#3#10 inner_area_9 1+ x#3#10 inner_area_19 1+ x#3#10 inner_area_20 1+ x#3#10 inner_area_21 1+ x#3#10 inner_area_31 1+ x#3#11 moves 1+ x#3#11 inner_area_10 1+ x#3#11 inner_area_20 1+ x#3#11 inner_area_21 1+ x#3#11 inner_area_22 1+ x#3#11 inner_area_32 1+ x#3#12 moves 1+ x#3#12 inner_area_11 1+ x#3#12 inner_area_21 1+ x#3#12 inner_area_22 1+ x#3#12 inner_area_33 1+ x#3#12 right_border_2 1+ x#3#13 moves 1+ x#3#13 inner_area_22 1+ x#3#13 right_border_1 1+ x#3#13 right_border_2 1+ x#3#13 right_border_3 1+ x#4#1 moves 1+ x#4#1 inner_area_23 1+ x#4#1 left_border_2 1+ x#4#1 left_border_3 1+ x#4#1 left_border_4 1+ x#4#2 moves 1+ x#4#2 inner_area_12 1+ x#4#2 inner_area_23 1+ x#4#2 inner_area_24 1+ x#4#2 inner_area_34 1+ x#4#2 left_border_3 1+ x#4#3 moves 1+ x#4#3 inner_area_13 1+ x#4#3 inner_area_23 1+ x#4#3 inner_area_24 1+ x#4#3 inner_area_25 1+ x#4#3 inner_area_35 1+ x#4#4 moves 1+ x#4#4 inner_area_14 1+ x#4#4 inner_area_24 1+ x#4#4 inner_area_25 1+ x#4#4 inner_area_26 1+ x#4#4 inner_area_36 1+ x#4#5 moves 1+ x#4#5 inner_area_15 1+ x#4#5 inner_area_25 1+ x#4#5 inner_area_26 1+ x#4#5 inner_area_27 1+ x#4#5 inner_area_37 1+ x#4#6 moves 1+ x#4#6 inner_area_16 1+ x#4#6 inner_area_26 1+ x#4#6 inner_area_27 1+ x#4#6 inner_area_28 1+ x#4#6 inner_area_38 1+ x#4#7 moves 1+ x#4#7 inner_area_17 1+ x#4#7 inner_area_27 1+ x#4#7 inner_area_28 1+ x#4#7 inner_area_29 1+ x#4#7 inner_area_39 1+ x#4#8 moves 1+ x#4#8 inner_area_18 1+ x#4#8 inner_area_28 1+ x#4#8 inner_area_29 1+ x#4#8 inner_area_30 1+ x#4#8 inner_area_40 1+ x#4#9 moves 1+ x#4#9 inner_area_19 1+ x#4#9 inner_area_29 1+ x#4#9 inner_area_30 1+ x#4#9 inner_area_31 1+ x#4#9 inner_area_41 1+ x#4#10 moves 1+ x#4#10 inner_area_20 1+ x#4#10 inner_area_30 1+ x#4#10 inner_area_31 1+ x#4#10 inner_area_32 1+ x#4#10 inner_area_42 1+ x#4#11 moves 1+ x#4#11 inner_area_21 1+ x#4#11 inner_area_31 1+ x#4#11 inner_area_32 1+ x#4#11 inner_area_33 1+ x#4#11 inner_area_43 1+ x#4#12 moves 1+ x#4#12 inner_area_22 1+ x#4#12 inner_area_32 1+ x#4#12 inner_area_33 1+ x#4#12 inner_area_44 1+ x#4#12 right_border_3 1+ x#4#13 moves 1+ x#4#13 inner_area_33 1+ x#4#13 right_border_2 1+ x#4#13 right_border_3 1+ x#4#13 right_border_4 1+ x#5#1 moves 1+ x#5#1 inner_area_34 1+ x#5#1 left_border_3 1+ x#5#1 left_border_4 1+ x#5#1 left_border_5 1+ x#5#2 moves 1+ x#5#2 inner_area_23 1+ x#5#2 inner_area_34 1+ x#5#2 inner_area_35 1+ x#5#2 inner_area_45 1+ x#5#2 left_border_4 1+ x#5#3 moves 1+ x#5#3 inner_area_24 1+ x#5#3 inner_area_34 1+ x#5#3 inner_area_35 1+ x#5#3 inner_area_36 1+ x#5#3 inner_area_46 1+ x#5#4 moves 1+ x#5#4 inner_area_25 1+ x#5#4 inner_area_35 1+ x#5#4 inner_area_36 1+ x#5#4 inner_area_37 1+ x#5#4 inner_area_47 1+ x#5#5 moves 1+ x#5#5 inner_area_26 1+ x#5#5 inner_area_36 1+ x#5#5 inner_area_37 1+ x#5#5 inner_area_38 1+ x#5#5 inner_area_48 1+ x#5#6 moves 1+ x#5#6 inner_area_27 1+ x#5#6 inner_area_37 1+ x#5#6 inner_area_38 1+ x#5#6 inner_area_39 1+ x#5#6 inner_area_49 1+ x#5#7 moves 1+ x#5#7 inner_area_28 1+ x#5#7 inner_area_38 1+ x#5#7 inner_area_39 1+ x#5#7 inner_area_40 1+ x#5#7 inner_area_50 1+ x#5#8 moves 1+ x#5#8 inner_area_29 1+ x#5#8 inner_area_39 1+ x#5#8 inner_area_40 1+ x#5#8 inner_area_41 1+ x#5#8 inner_area_51 1+ x#5#9 moves 1+ x#5#9 inner_area_30 1+ x#5#9 inner_area_40 1+ x#5#9 inner_area_41 1+ x#5#9 inner_area_42 1+ x#5#9 inner_area_52 1+ x#5#10 moves 1+ x#5#10 inner_area_31 1+ x#5#10 inner_area_41 1+ x#5#10 inner_area_42 1+ x#5#10 inner_area_43 1+ x#5#10 inner_area_53 1+ x#5#11 moves 1+ x#5#11 inner_area_32 1+ x#5#11 inner_area_42 1+ x#5#11 inner_area_43 1+ x#5#11 inner_area_44 1+ x#5#11 inner_area_54 1+ x#5#12 moves 1+ x#5#12 inner_area_33 1+ x#5#12 inner_area_43 1+ x#5#12 inner_area_44 1+ x#5#12 inner_area_55 1+ x#5#12 right_border_4 1+ x#5#13 moves 1+ x#5#13 inner_area_44 1+ x#5#13 right_border_3 1+ x#5#13 right_border_4 1+ x#5#13 right_border_5 1+ x#6#1 moves 1+ x#6#1 inner_area_45 1+ x#6#1 left_border_4 1+ x#6#1 left_border_5 1+ x#6#1 left_border_6 1+ x#6#2 moves 1+ x#6#2 inner_area_34 1+ x#6#2 inner_area_45 1+ x#6#2 inner_area_46 1+ x#6#2 inner_area_56 1+ x#6#2 left_border_5 1+ x#6#3 moves 1+ x#6#3 inner_area_35 1+ x#6#3 inner_area_45 1+ x#6#3 inner_area_46 1+ x#6#3 inner_area_47 1+ x#6#3 inner_area_57 1+ x#6#4 moves 1+ x#6#4 inner_area_36 1+ x#6#4 inner_area_46 1+ x#6#4 inner_area_47 1+ x#6#4 inner_area_48 1+ x#6#4 inner_area_58 1+ x#6#5 moves 1+ x#6#5 inner_area_37 1+ x#6#5 inner_area_47 1+ x#6#5 inner_area_48 1+ x#6#5 inner_area_49 1+ x#6#5 inner_area_59 1+ x#6#6 moves 1+ x#6#6 inner_area_38 1+ x#6#6 inner_area_48 1+ x#6#6 inner_area_49 1+ x#6#6 inner_area_50 1+ x#6#6 inner_area_60 1+ x#6#7 moves 1+ x#6#7 inner_area_39 1+ x#6#7 inner_area_49 1+ x#6#7 inner_area_50 1+ x#6#7 inner_area_51 1+ x#6#7 inner_area_61 1+ x#6#8 moves 1+ x#6#8 inner_area_40 1+ x#6#8 inner_area_50 1+ x#6#8 inner_area_51 1+ x#6#8 inner_area_52 1+ x#6#8 inner_area_62 1+ x#6#9 moves 1+ x#6#9 inner_area_41 1+ x#6#9 inner_area_51 1+ x#6#9 inner_area_52 1+ x#6#9 inner_area_53 1+ x#6#9 inner_area_63 1+ x#6#10 moves 1+ x#6#10 inner_area_42 1+ x#6#10 inner_area_52 1+ x#6#10 inner_area_53 1+ x#6#10 inner_area_54 1+ x#6#10 inner_area_64 1+ x#6#11 moves 1+ x#6#11 inner_area_43 1+ x#6#11 inner_area_53 1+ x#6#11 inner_area_54 1+ x#6#11 inner_area_55 1+ x#6#11 inner_area_65 1+ x#6#12 moves 1+ x#6#12 inner_area_44 1+ x#6#12 inner_area_54 1+ x#6#12 inner_area_55 1+ x#6#12 inner_area_66 1+ x#6#12 right_border_5 1+ x#6#13 moves 1+ x#6#13 inner_area_55 1+ x#6#13 right_border_4 1+ x#6#13 right_border_5 1+ x#6#13 right_border_6 1+ x#7#1 moves 1+ x#7#1 inner_area_56 1+ x#7#1 left_border_5 1+ x#7#1 left_border_6 1+ x#7#1 left_border_7 1+ x#7#2 moves 1+ x#7#2 inner_area_45 1+ x#7#2 inner_area_56 1+ x#7#2 inner_area_57 1+ x#7#2 inner_area_67 1+ x#7#2 left_border_6 1+ x#7#3 moves 1+ x#7#3 inner_area_46 1+ x#7#3 inner_area_56 1+ x#7#3 inner_area_57 1+ x#7#3 inner_area_58 1+ x#7#3 inner_area_68 1+ x#7#4 moves 1+ x#7#4 inner_area_47 1+ x#7#4 inner_area_57 1+ x#7#4 inner_area_58 1+ x#7#4 inner_area_59 1+ x#7#4 inner_area_69 1+ x#7#5 moves 1+ x#7#5 inner_area_48 1+ x#7#5 inner_area_58 1+ x#7#5 inner_area_59 1+ x#7#5 inner_area_60 1+ x#7#5 inner_area_70 1+ x#7#6 moves 1+ x#7#6 inner_area_49 1+ x#7#6 inner_area_59 1+ x#7#6 inner_area_60 1+ x#7#6 inner_area_61 1+ x#7#6 inner_area_71 1+ x#7#7 moves 1+ x#7#7 inner_area_50 1+ x#7#7 inner_area_60 1+ x#7#7 inner_area_61 1+ x#7#7 inner_area_62 1+ x#7#7 inner_area_72 1+ x#7#8 moves 1+ x#7#8 inner_area_51 1+ x#7#8 inner_area_61 1+ x#7#8 inner_area_62 1+ x#7#8 inner_area_63 1+ x#7#8 inner_area_73 1+ x#7#9 moves 1+ x#7#9 inner_area_52 1+ x#7#9 inner_area_62 1+ x#7#9 inner_area_63 1+ x#7#9 inner_area_64 1+ x#7#9 inner_area_74 1+ x#7#10 moves 1+ x#7#10 inner_area_53 1+ x#7#10 inner_area_63 1+ x#7#10 inner_area_64 1+ x#7#10 inner_area_65 1+ x#7#10 inner_area_75 1+ x#7#11 moves 1+ x#7#11 inner_area_54 1+ x#7#11 inner_area_64 1+ x#7#11 inner_area_65 1+ x#7#11 inner_area_66 1+ x#7#11 inner_area_76 1+ x#7#12 moves 1+ x#7#12 inner_area_55 1+ x#7#12 inner_area_65 1+ x#7#12 inner_area_66 1+ x#7#12 inner_area_77 1+ x#7#12 right_border_6 1+ x#7#13 moves 1+ x#7#13 inner_area_66 1+ x#7#13 right_border_5 1+ x#7#13 right_border_6 1+ x#7#13 right_border_7 1+ x#8#1 moves 1+ x#8#1 inner_area_67 1+ x#8#1 left_border_6 1+ x#8#1 left_border_7 1+ x#8#1 left_border_8 1+ x#8#2 moves 1+ x#8#2 inner_area_56 1+ x#8#2 inner_area_67 1+ x#8#2 inner_area_68 1+ x#8#2 inner_area_78 1+ x#8#2 left_border_7 1+ x#8#3 moves 1+ x#8#3 inner_area_57 1+ x#8#3 inner_area_67 1+ x#8#3 inner_area_68 1+ x#8#3 inner_area_69 1+ x#8#3 inner_area_79 1+ x#8#4 moves 1+ x#8#4 inner_area_58 1+ x#8#4 inner_area_68 1+ x#8#4 inner_area_69 1+ x#8#4 inner_area_70 1+ x#8#4 inner_area_80 1+ x#8#5 moves 1+ x#8#5 inner_area_59 1+ x#8#5 inner_area_69 1+ x#8#5 inner_area_70 1+ x#8#5 inner_area_71 1+ x#8#5 inner_area_81 1+ x#8#6 moves 1+ x#8#6 inner_area_60 1+ x#8#6 inner_area_70 1+ x#8#6 inner_area_71 1+ x#8#6 inner_area_72 1+ x#8#6 inner_area_82 1+ x#8#7 moves 1+ x#8#7 inner_area_61 1+ x#8#7 inner_area_71 1+ x#8#7 inner_area_72 1+ x#8#7 inner_area_73 1+ x#8#7 inner_area_83 1+ x#8#8 moves 1+ x#8#8 inner_area_62 1+ x#8#8 inner_area_72 1+ x#8#8 inner_area_73 1+ x#8#8 inner_area_74 1+ x#8#8 inner_area_84 1+ x#8#9 moves 1+ x#8#9 inner_area_63 1+ x#8#9 inner_area_73 1+ x#8#9 inner_area_74 1+ x#8#9 inner_area_75 1+ x#8#9 inner_area_85 1+ x#8#10 moves 1+ x#8#10 inner_area_64 1+ x#8#10 inner_area_74 1+ x#8#10 inner_area_75 1+ x#8#10 inner_area_76 1+ x#8#10 inner_area_86 1+ x#8#11 moves 1+ x#8#11 inner_area_65 1+ x#8#11 inner_area_75 1+ x#8#11 inner_area_76 1+ x#8#11 inner_area_77 1+ x#8#11 inner_area_87 1+ x#8#12 moves 1+ x#8#12 inner_area_66 1+ x#8#12 inner_area_76 1+ x#8#12 inner_area_77 1+ x#8#12 inner_area_88 1+ x#8#12 right_border_7 1+ x#8#13 moves 1+ x#8#13 inner_area_77 1+ x#8#13 right_border_6 1+ x#8#13 right_border_7 1+ x#8#13 right_border_8 1+ x#9#1 moves 1+ x#9#1 inner_area_78 1+ x#9#1 left_border_7 1+ x#9#1 left_border_8 1+ x#9#1 left_border_9 1+ x#9#2 moves 1+ x#9#2 inner_area_67 1+ x#9#2 inner_area_78 1+ x#9#2 inner_area_79 1+ x#9#2 inner_area_89 1+ x#9#2 left_border_8 1+ x#9#3 moves 1+ x#9#3 inner_area_68 1+ x#9#3 inner_area_78 1+ x#9#3 inner_area_79 1+ x#9#3 inner_area_80 1+ x#9#3 inner_area_90 1+ x#9#4 moves 1+ x#9#4 inner_area_69 1+ x#9#4 inner_area_79 1+ x#9#4 inner_area_80 1+ x#9#4 inner_area_81 1+ x#9#4 inner_area_91 1+ x#9#5 moves 1+ x#9#5 inner_area_70 1+ x#9#5 inner_area_80 1+ x#9#5 inner_area_81 1+ x#9#5 inner_area_82 1+ x#9#5 inner_area_92 1+ x#9#6 moves 1+ x#9#6 inner_area_71 1+ x#9#6 inner_area_81 1+ x#9#6 inner_area_82 1+ x#9#6 inner_area_83 1+ x#9#6 inner_area_93 1+ x#9#7 moves 1+ x#9#7 inner_area_72 1+ x#9#7 inner_area_82 1+ x#9#7 inner_area_83 1+ x#9#7 inner_area_84 1+ x#9#7 inner_area_94 1+ x#9#8 moves 1+ x#9#8 inner_area_73 1+ x#9#8 inner_area_83 1+ x#9#8 inner_area_84 1+ x#9#8 inner_area_85 1+ x#9#8 inner_area_95 1+ x#9#9 moves 1+ x#9#9 inner_area_74 1+ x#9#9 inner_area_84 1+ x#9#9 inner_area_85 1+ x#9#9 inner_area_86 1+ x#9#9 inner_area_96 1+ x#9#10 moves 1+ x#9#10 inner_area_75 1+ x#9#10 inner_area_85 1+ x#9#10 inner_area_86 1+ x#9#10 inner_area_87 1+ x#9#10 inner_area_97 1+ x#9#11 moves 1+ x#9#11 inner_area_76 1+ x#9#11 inner_area_86 1+ x#9#11 inner_area_87 1+ x#9#11 inner_area_88 1+ x#9#11 inner_area_98 1+ x#9#12 moves 1+ x#9#12 inner_area_77 1+ x#9#12 inner_area_87 1+ x#9#12 inner_area_88 1+ x#9#12 inner_area_99 1+ x#9#12 right_border_8 1+ x#9#13 moves 1+ x#9#13 inner_area_88 1+ x#9#13 right_border_7 1+ x#9#13 right_border_8 1+ x#9#13 right_border_9 1+ x#10#1 moves 1+ x#10#1 inner_area_89 1+ x#10#1 left_border_8 1+ x#10#1 left_border_9 1+ x#10#1 left_border_10 1+ x#10#2 moves 1+ x#10#2 inner_area_78 1+ x#10#2 inner_area_89 1+ x#10#2 inner_area_90 1+ x#10#2 inner_area_100 1+ x#10#2 left_border_9 1+ x#10#3 moves 1+ x#10#3 inner_area_79 1+ x#10#3 inner_area_89 1+ x#10#3 inner_area_90 1+ x#10#3 inner_area_91 1+ x#10#3 inner_area_101 1+ x#10#4 moves 1+ x#10#4 inner_area_80 1+ x#10#4 inner_area_90 1+ x#10#4 inner_area_91 1+ x#10#4 inner_area_92 1+ x#10#4 inner_area_102 1+ x#10#5 moves 1+ x#10#5 inner_area_81 1+ x#10#5 inner_area_91 1+ x#10#5 inner_area_92 1+ x#10#5 inner_area_93 1+ x#10#5 inner_area_103 1+ x#10#6 moves 1+ x#10#6 inner_area_82 1+ x#10#6 inner_area_92 1+ x#10#6 inner_area_93 1+ x#10#6 inner_area_94 1+ x#10#6 inner_area_104 1+ x#10#7 moves 1+ x#10#7 inner_area_83 1+ x#10#7 inner_area_93 1+ x#10#7 inner_area_94 1+ x#10#7 inner_area_95 1+ x#10#7 inner_area_105 1+ x#10#8 moves 1+ x#10#8 inner_area_84 1+ x#10#8 inner_area_94 1+ x#10#8 inner_area_95 1+ x#10#8 inner_area_96 1+ x#10#8 inner_area_106 1+ x#10#9 moves 1+ x#10#9 inner_area_85 1+ x#10#9 inner_area_95 1+ x#10#9 inner_area_96 1+ x#10#9 inner_area_97 1+ x#10#9 inner_area_107 1+ x#10#10 moves 1+ x#10#10 inner_area_86 1+ x#10#10 inner_area_96 1+ x#10#10 inner_area_97 1+ x#10#10 inner_area_98 1+ x#10#10 inner_area_108 1+ x#10#11 moves 1+ x#10#11 inner_area_87 1+ x#10#11 inner_area_97 1+ x#10#11 inner_area_98 1+ x#10#11 inner_area_99 1+ x#10#11 inner_area_109 1+ x#10#12 moves 1+ x#10#12 inner_area_88 1+ x#10#12 inner_area_98 1+ x#10#12 inner_area_99 1+ x#10#12 inner_area_110 1+ x#10#12 right_border_9 1+ x#10#13 moves 1+ x#10#13 inner_area_99 1+ x#10#13 right_border_8 1+ x#10#13 right_border_9 1+ x#10#13 right_border_10 1+ x#11#1 moves 1+ x#11#1 inner_area_100 1+ x#11#1 left_border_9 1+ x#11#1 left_border_10 1+ x#11#1 left_border_11 1+ x#11#2 moves 1+ x#11#2 inner_area_89 1+ x#11#2 inner_area_100 1+ x#11#2 inner_area_101 1+ x#11#2 inner_area_111 1+ x#11#2 left_border_10 1+ x#11#3 moves 1+ x#11#3 inner_area_90 1+ x#11#3 inner_area_100 1+ x#11#3 inner_area_101 1+ x#11#3 inner_area_102 1+ x#11#3 inner_area_112 1+ x#11#4 moves 1+ x#11#4 inner_area_91 1+ x#11#4 inner_area_101 1+ x#11#4 inner_area_102 1+ x#11#4 inner_area_103 1+ x#11#4 inner_area_113 1+ x#11#5 moves 1+ x#11#5 inner_area_92 1+ x#11#5 inner_area_102 1+ x#11#5 inner_area_103 1+ x#11#5 inner_area_104 1+ x#11#5 inner_area_114 1+ x#11#6 moves 1+ x#11#6 inner_area_93 1+ x#11#6 inner_area_103 1+ x#11#6 inner_area_104 1+ x#11#6 inner_area_105 1+ x#11#6 inner_area_115 1+ x#11#7 moves 1+ x#11#7 inner_area_94 1+ x#11#7 inner_area_104 1+ x#11#7 inner_area_105 1+ x#11#7 inner_area_106 1+ x#11#7 inner_area_116 1+ x#11#8 moves 1+ x#11#8 inner_area_95 1+ x#11#8 inner_area_105 1+ x#11#8 inner_area_106 1+ x#11#8 inner_area_107 1+ x#11#8 inner_area_117 1+ x#11#9 moves 1+ x#11#9 inner_area_96 1+ x#11#9 inner_area_106 1+ x#11#9 inner_area_107 1+ x#11#9 inner_area_108 1+ x#11#9 inner_area_118 1+ x#11#10 moves 1+ x#11#10 inner_area_97 1+ x#11#10 inner_area_107 1+ x#11#10 inner_area_108 1+ x#11#10 inner_area_109 1+ x#11#10 inner_area_119 1+ x#11#11 moves 1+ x#11#11 inner_area_98 1+ x#11#11 inner_area_108 1+ x#11#11 inner_area_109 1+ x#11#11 inner_area_110 1+ x#11#11 inner_area_120 1+ x#11#12 moves 1+ x#11#12 inner_area_99 1+ x#11#12 inner_area_109 1+ x#11#12 inner_area_110 1+ x#11#12 inner_area_121 1+ x#11#12 right_border_10 1+ x#11#13 moves 1+ x#11#13 inner_area_110 1+ x#11#13 right_border_9 1+ x#11#13 right_border_10 1+ x#11#13 right_border_11 1+ x#12#1 moves 1+ x#12#1 inner_area_111 1+ x#12#1 left_border_10 1+ x#12#1 left_border_11 1+ x#12#1 left_lower_co@a6 1+ x#12#2 moves 1+ x#12#2 inner_area_100 1+ x#12#2 inner_area_111 1+ x#12#2 inner_area_112 1+ x#12#2 lower_border_1 1+ x#12#2 left_border_11 1+ x#12#3 moves 1+ x#12#3 inner_area_101 1+ x#12#3 inner_area_111 1+ x#12#3 inner_area_112 1+ x#12#3 inner_area_113 1+ x#12#3 lower_border_2 1+ x#12#4 moves 1+ x#12#4 inner_area_102 1+ x#12#4 inner_area_112 1+ x#12#4 inner_area_113 1+ x#12#4 inner_area_114 1+ x#12#4 lower_border_3 1+ x#12#5 moves 1+ x#12#5 inner_area_103 1+ x#12#5 inner_area_113 1+ x#12#5 inner_area_114 1+ x#12#5 inner_area_115 1+ x#12#5 lower_border_4 1+ x#12#6 moves 1+ x#12#6 inner_area_104 1+ x#12#6 inner_area_114 1+ x#12#6 inner_area_115 1+ x#12#6 inner_area_116 1+ x#12#6 lower_border_5 1+ x#12#7 moves 1+ x#12#7 inner_area_105 1+ x#12#7 inner_area_115 1+ x#12#7 inner_area_116 1+ x#12#7 inner_area_117 1+ x#12#7 lower_border_6 1+ x#12#8 moves 1+ x#12#8 inner_area_106 1+ x#12#8 inner_area_116 1+ x#12#8 inner_area_117 1+ x#12#8 inner_area_118 1+ x#12#8 lower_border_7 1+ x#12#9 moves 1+ x#12#9 inner_area_107 1+ x#12#9 inner_area_117 1+ x#12#9 inner_area_118 1+ x#12#9 inner_area_119 1+ x#12#9 lower_border_8 1+ x#12#10 moves 1+ x#12#10 inner_area_108 1+ x#12#10 inner_area_118 1+ x#12#10 inner_area_119 1+ x#12#10 inner_area_120 1+ x#12#10 lower_border_9 1+ x#12#11 moves 1+ x#12#11 inner_area_109 1+ x#12#11 inner_area_119 1+ x#12#11 inner_area_120 1+ x#12#11 inner_area_121 1+ x#12#11 lower_border_10 1+ x#12#12 moves 1+ x#12#12 inner_area_110 1+ x#12#12 inner_area_120 1+ x#12#12 inner_area_121 1+ x#12#12 lower_border_11 1+ x#12#12 right_border_11 1+ x#12#13 moves 1+ x#12#13 inner_area_121 1+ x#12#13 right_border_10 1+ x#12#13 right_border_11 1+ x#12#13 right_lower_c@a8 1+ x#13#1 moves 1+ x#13#1 lower_border_1 1+ x#13#1 left_border_11 1+ x#13#1 left_lower_co@a6 1+ x#13#2 moves 1+ x#13#2 inner_area_111 1+ x#13#2 lower_border_1 1+ x#13#2 lower_border_2 1+ x#13#2 left_lower_co@a6 1+ x#13#3 moves 1+ x#13#3 inner_area_112 1+ x#13#3 lower_border_1 1+ x#13#3 lower_border_2 1+ x#13#3 lower_border_3 1+ x#13#4 moves 1+ x#13#4 inner_area_113 1+ x#13#4 lower_border_2 1+ x#13#4 lower_border_3 1+ x#13#4 lower_border_4 1+ x#13#5 moves 1+ x#13#5 inner_area_114 1+ x#13#5 lower_border_3 1+ x#13#5 lower_border_4 1+ x#13#5 lower_border_5 1+ x#13#6 moves 1+ x#13#6 inner_area_115 1+ x#13#6 lower_border_4 1+ x#13#6 lower_border_5 1+ x#13#6 lower_border_6 1+ x#13#7 moves 1+ x#13#7 inner_area_116 1+ x#13#7 lower_border_5 1+ x#13#7 lower_border_6 1+ x#13#7 lower_border_7 1+ x#13#8 moves 1+ x#13#8 inner_area_117 1+ x#13#8 lower_border_6 1+ x#13#8 lower_border_7 1+ x#13#8 lower_border_8 1+ x#13#9 moves 1+ x#13#9 inner_area_118 1+ x#13#9 lower_border_7 1+ x#13#9 lower_border_8 1+ x#13#9 lower_border_9 1+ x#13#10 moves 1+ x#13#10 inner_area_119 1+ x#13#10 lower_border_8 1+ x#13#10 lower_border_9 1+ x#13#10 lower_border_10 1+ x#13#11 moves 1+ x#13#11 inner_area_120 1+ x#13#11 lower_border_9 1+ x#13#11 lower_border_10 1+ x#13#11 lower_border_11 1+ x#13#12 moves 1+ x#13#12 inner_area_121 1+ x#13#12 lower_border_10 1+ x#13#12 lower_border_11 1+ x#13#12 right_lower_c@a8 1+ x#13#13 moves 1+ x#13#13 lower_border_11 1+ x#13#13 right_border_11 1+ x#13#13 right_lower_c@a8 1+ y#2#2 inner_area_1 -2+ y#2#3 inner_area_2 -2+ y#2#4 inner_area_3 -2+ y#2#5 inner_area_4 -2+ y#2#6 inner_area_5 -2+ y#2#7 inner_area_6 -2+ y#2#8 inner_area_7 -2+ y#2#9 inner_area_8 -2+ y#2#10 inner_area_9 -2+ y#2#11 inner_area_10 -2+ y#2#12 inner_area_11 -2+ y#3#2 inner_area_12 -2+ y#3#3 inner_area_13 -2+ y#3#4 inner_area_14 -2+ y#3#5 inner_area_15 -2+ y#3#6 inner_area_16 -2+ y#3#7 inner_area_17 -2+ y#3#8 inner_area_18 -2+ y#3#9 inner_area_19 -2+ y#3#10 inner_area_20 -2+ y#3#11 inner_area_21 -2+ y#3#12 inner_area_22 -2+ y#4#2 inner_area_23 -2+ y#4#3 inner_area_24 -2+ y#4#4 inner_area_25 -2+ y#4#5 inner_area_26 -2+ y#4#6 inner_area_27 -2+ y#4#7 inner_area_28 -2+ y#4#8 inner_area_29 -2+ y#4#9 inner_area_30 -2+ y#4#10 inner_area_31 -2+ y#4#11 inner_area_32 -2+ y#4#12 inner_area_33 -2+ y#5#2 inner_area_34 -2+ y#5#3 inner_area_35 -2+ y#5#4 inner_area_36 -2+ y#5#5 inner_area_37 -2+ y#5#6 inner_area_38 -2+ y#5#7 inner_area_39 -2+ y#5#8 inner_area_40 -2+ y#5#9 inner_area_41 -2+ y#5#10 inner_area_42 -2+ y#5#11 inner_area_43 -2+ y#5#12 inner_area_44 -2+ y#6#2 inner_area_45 -2+ y#6#3 inner_area_46 -2+ y#6#4 inner_area_47 -2+ y#6#5 inner_area_48 -2+ y#6#6 inner_area_49 -2+ y#6#7 inner_area_50 -2+ y#6#8 inner_area_51 -2+ y#6#9 inner_area_52 -2+ y#6#10 inner_area_53 -2+ y#6#11 inner_area_54 -2+ y#6#12 inner_area_55 -2+ y#7#2 inner_area_56 -2+ y#7#3 inner_area_57 -2+ y#7#4 inner_area_58 -2+ y#7#5 inner_area_59 -2+ y#7#6 inner_area_60 -2+ y#7#7 inner_area_61 -2+ y#7#8 inner_area_62 -2+ y#7#9 inner_area_63 -2+ y#7#10 inner_area_64 -2+ y#7#11 inner_area_65 -2+ y#7#12 inner_area_66 -2+ y#8#2 inner_area_67 -2+ y#8#3 inner_area_68 -2+ y#8#4 inner_area_69 -2+ y#8#5 inner_area_70 -2+ y#8#6 inner_area_71 -2+ y#8#7 inner_area_72 -2+ y#8#8 inner_area_73 -2+ y#8#9 inner_area_74 -2+ y#8#10 inner_area_75 -2+ y#8#11 inner_area_76 -2+ y#8#12 inner_area_77 -2+ y#9#2 inner_area_78 -2+ y#9#3 inner_area_79 -2+ y#9#4 inner_area_80 -2+ y#9#5 inner_area_81 -2+ y#9#6 inner_area_82 -2+ y#9#7 inner_area_83 -2+ y#9#8 inner_area_84 -2+ y#9#9 inner_area_85 -2+ y#9#10 inner_area_86 -2+ y#9#11 inner_area_87 -2+ y#9#12 inner_area_88 -2+ y#10#2 inner_area_89 -2+ y#10#3 inner_area_90 -2+ y#10#4 inner_area_91 -2+ y#10#5 inner_area_92 -2+ y#10#6 inner_area_93 -2+ y#10#7 inner_area_94 -2+ y#10#8 inner_area_95 -2+ y#10#9 inner_area_96 -2+ y#10#10 inner_area_97 -2+ y#10#11 inner_area_98 -2+ y#10#12 inner_area_99 -2+ y#11#2 inner_area_100 -2+ y#11#3 inner_area_101 -2+ y#11#4 inner_area_102 -2+ y#11#5 inner_area_103 -2+ y#11#6 inner_area_104 -2+ y#11#7 inner_area_105 -2+ y#11#8 inner_area_106 -2+ y#11#9 inner_area_107 -2+ y#11#10 inner_area_108 -2+ y#11#11 inner_area_109 -2+ y#11#12 inner_area_110 -2+ y#12#2 inner_area_111 -2+ y#12#3 inner_area_112 -2+ y#12#4 inner_area_113 -2+ y#12#5 inner_area_114 -2+ y#12#6 inner_area_115 -2+ y#12#7 inner_area_116 -2+ y#12#8 inner_area_117 -2+ y#12#9 inner_area_118 -2+ y#12#10 inner_area_119 -2+ y#12#11 inner_area_120 -2+ y#12#12 inner_area_121 -2+ y#1#2 upper_border_1 -2+ y#1#3 upper_border_2 -2+ y#1#4 upper_border_3 -2+ y#1#5 upper_border_4 -2+ y#1#6 upper_border_5 -2+ y#1#7 upper_border_6 -2+ y#1#8 upper_border_7 -2+ y#1#9 upper_border_8 -2+ y#1#10 upper_border_9 -2+ y#1#11 upper_border_10 -2+ y#1#12 upper_border_11 -2+ y#13#2 lower_border_1 -2+ y#13#3 lower_border_2 -2+ y#13#4 lower_border_3 -2+ y#13#5 lower_border_4 -2+ y#13#6 lower_border_5 -2+ y#13#7 lower_border_6 -2+ y#13#8 lower_border_7 -2+ y#13#9 lower_border_8 -2+ y#13#10 lower_border_9 -2+ y#13#11 lower_border_10 -2+ y#13#12 lower_border_11 -2+ y#2#1 left_border_1 -2+ y#3#1 left_border_2 -2+ y#4#1 left_border_3 -2+ y#5#1 left_border_4 -2+ y#6#1 left_border_5 -2+ y#7#1 left_border_6 -2+ y#8#1 left_border_7 -2+ y#9#1 left_border_8 -2+ y#10#1 left_border_9 -2+ y#11#1 left_border_10 -2+ y#12#1 left_border_11 -2+ y#2#13 right_border_1 -2+ y#3#13 right_border_2 -2+ y#4#13 right_border_3 -2+ y#5#13 right_border_4 -2+ y#6#13 right_border_5 -2+ y#7#13 right_border_6 -2+ y#8#13 right_border_7 -2+ y#9#13 right_border_8 -2+ y#10#13 right_border_9 -2+ y#11#13 right_border_10 -2+ y#12#13 right_border_11 -2+ y#1#1 left_upper_co@a5 -2+ y#13#1 left_lower_co@a6 -2+ y#1#13 right_upper_c@a7 -2+ y#13#13 right_lower_c@a8 -2+ MARK0001 'MARKER' 'INTEND'+RHS+ rhs left_upper_co@a5 -1+BOUNDS+ UP bnd x#1#1 1+ UP bnd x#1#2 1+ UP bnd x#1#3 1+ UP bnd x#1#4 1+ UP bnd x#1#5 1+ UP bnd x#1#6 1+ UP bnd x#1#7 1+ UP bnd x#1#8 1+ UP bnd x#1#9 1+ UP bnd x#1#10 1+ UP bnd x#1#11 1+ UP bnd x#1#12 1+ UP bnd x#1#13 1+ UP bnd x#2#1 1+ UP bnd x#2#2 1+ UP bnd x#2#3 1+ UP bnd x#2#4 1+ UP bnd x#2#5 1+ UP bnd x#2#6 1+ UP bnd x#2#7 1+ UP bnd x#2#8 1+ UP bnd x#2#9 1+ UP bnd x#2#10 1+ UP bnd x#2#11 1+ UP bnd x#2#12 1+ UP bnd x#2#13 1+ UP bnd x#3#1 1+ UP bnd x#3#2 1+ UP bnd x#3#3 1+ UP bnd x#3#4 1+ UP bnd x#3#5 1+ UP bnd x#3#6 1+ UP bnd x#3#7 1+ UP bnd x#3#8 1+ UP bnd x#3#9 1+ UP bnd x#3#10 1+ UP bnd x#3#11 1+ UP bnd x#3#12 1+ UP bnd x#3#13 1+ UP bnd x#4#1 1+ UP bnd x#4#2 1+ UP bnd x#4#3 1+ UP bnd x#4#4 1+ UP bnd x#4#5 1+ UP bnd x#4#6 1+ UP bnd x#4#7 1+ UP bnd x#4#8 1+ UP bnd x#4#9 1+ UP bnd x#4#10 1+ UP bnd x#4#11 1+ UP bnd x#4#12 1+ UP bnd x#4#13 1+ UP bnd x#5#1 1+ UP bnd x#5#2 1+ UP bnd x#5#3 1+ UP bnd x#5#4 1+ UP bnd x#5#5 1+ UP bnd x#5#6 1+ UP bnd x#5#7 1+ UP bnd x#5#8 1+ UP bnd x#5#9 1+ UP bnd x#5#10 1+ UP bnd x#5#11 1+ UP bnd x#5#12 1+ UP bnd x#5#13 1+ UP bnd x#6#1 1+ UP bnd x#6#2 1+ UP bnd x#6#3 1+ UP bnd x#6#4 1+ UP bnd x#6#5 1+ UP bnd x#6#6 1+ UP bnd x#6#7 1+ UP bnd x#6#8 1+ UP bnd x#6#9 1+ UP bnd x#6#10 1+ UP bnd x#6#11 1+ UP bnd x#6#12 1+ UP bnd x#6#13 1+ UP bnd x#7#1 1+ UP bnd x#7#2 1+ UP bnd x#7#3 1+ UP bnd x#7#4 1+ UP bnd x#7#5 1+ UP bnd x#7#6 1+ UP bnd x#7#7 1+ UP bnd x#7#8 1+ UP bnd x#7#9 1+ UP bnd x#7#10 1+ UP bnd x#7#11 1+ UP bnd x#7#12 1+ UP bnd x#7#13 1+ UP bnd x#8#1 1+ UP bnd x#8#2 1+ UP bnd x#8#3 1+ UP bnd x#8#4 1+ UP bnd x#8#5 1+ UP bnd x#8#6 1+ UP bnd x#8#7 1+ UP bnd x#8#8 1+ UP bnd x#8#9 1+ UP bnd x#8#10 1+ UP bnd x#8#11 1+ UP bnd x#8#12 1+ UP bnd x#8#13 1+ UP bnd x#9#1 1+ UP bnd x#9#2 1+ UP bnd x#9#3 1+ UP bnd x#9#4 1+ UP bnd x#9#5 1+ UP bnd x#9#6 1+ UP bnd x#9#7 1+ UP bnd x#9#8 1+ UP bnd x#9#9 1+ UP bnd x#9#10 1+ UP bnd x#9#11 1+ UP bnd x#9#12 1+ UP bnd x#9#13 1+ UP bnd x#10#1 1+ UP bnd x#10#2 1+ UP bnd x#10#3 1+ UP bnd x#10#4 1+ UP bnd x#10#5 1+ UP bnd x#10#6 1+ UP bnd x#10#7 1+ UP bnd x#10#8 1+ UP bnd x#10#9 1+ UP bnd x#10#10 1+ UP bnd x#10#11 1+ UP bnd x#10#12 1+ UP bnd x#10#13 1+ UP bnd x#11#1 1+ UP bnd x#11#2 1+ UP bnd x#11#3 1+ UP bnd x#11#4 1+ UP bnd x#11#5 1+ UP bnd x#11#6 1+ UP bnd x#11#7 1+ UP bnd x#11#8 1+ UP bnd x#11#9 1+ UP bnd x#11#10 1+ UP bnd x#11#11 1+ UP bnd x#11#12 1+ UP bnd x#11#13 1+ UP bnd x#12#1 1+ UP bnd x#12#2 1+ UP bnd x#12#3 1+ UP bnd x#12#4 1+ UP bnd x#12#5 1+ UP bnd x#12#6 1+ UP bnd x#12#7 1+ UP bnd x#12#8 1+ UP bnd x#12#9 1+ UP bnd x#12#10 1+ UP bnd x#12#11 1+ UP bnd x#12#12 1+ UP bnd x#12#13 1+ UP bnd x#13#1 1+ UP bnd x#13#2 1+ UP bnd x#13#3 1+ UP bnd x#13#4 1+ UP bnd x#13#5 1+ UP bnd x#13#6 1+ UP bnd x#13#7 1+ UP bnd x#13#8 1+ UP bnd x#13#9 1+ UP bnd x#13#10 1+ UP bnd x#13#11 1+ UP bnd x#13#12 1+ UP bnd x#13#13 1+ LI bnd y#2#2 0+ LI bnd y#2#3 0+ LI bnd y#2#4 0+ LI bnd y#2#5 0+ LI bnd y#2#6 0+ LI bnd y#2#7 0+ LI bnd y#2#8 0+ LI bnd y#2#9 0+ LI bnd y#2#10 0+ LI bnd y#2#11 0+ LI bnd y#2#12 0+ LI bnd y#3#2 0+ LI bnd y#3#3 0+ LI bnd y#3#4 0+ LI bnd y#3#5 0+ LI bnd y#3#6 0+ LI bnd y#3#7 0+ LI bnd y#3#8 0+ LI bnd y#3#9 0+ LI bnd y#3#10 0+ LI bnd y#3#11 0+ LI bnd y#3#12 0+ LI bnd y#4#2 0+ LI bnd y#4#3 0+ LI bnd y#4#4 0+ LI bnd y#4#5 0+ LI bnd y#4#6 0+ LI bnd y#4#7 0+ LI bnd y#4#8 0+ LI bnd y#4#9 0+ LI bnd y#4#10 0+ LI bnd y#4#11 0+ LI bnd y#4#12 0+ LI bnd y#5#2 0+ LI bnd y#5#3 0+ LI bnd y#5#4 0+ LI bnd y#5#5 0+ LI bnd y#5#6 0+ LI bnd y#5#7 0+ LI bnd y#5#8 0+ LI bnd y#5#9 0+ LI bnd y#5#10 0+ LI bnd y#5#11 0+ LI bnd y#5#12 0+ LI bnd y#6#2 0+ LI bnd y#6#3 0+ LI bnd y#6#4 0+ LI bnd y#6#5 0+ LI bnd y#6#6 0+ LI bnd y#6#7 0+ LI bnd y#6#8 0+ LI bnd y#6#9 0+ LI bnd y#6#10 0+ LI bnd y#6#11 0+ LI bnd y#6#12 0+ LI bnd y#7#2 0+ LI bnd y#7#3 0+ LI bnd y#7#4 0+ LI bnd y#7#5 0+ LI bnd y#7#6 0+ LI bnd y#7#7 0+ LI bnd y#7#8 0+ LI bnd y#7#9 0+ LI bnd y#7#10 0+ LI bnd y#7#11 0+ LI bnd y#7#12 0+ LI bnd y#8#2 0+ LI bnd y#8#3 0+ LI bnd y#8#4 0+ LI bnd y#8#5 0+ LI bnd y#8#6 0+ LI bnd y#8#7 0+ LI bnd y#8#8 0+ LI bnd y#8#9 0+ LI bnd y#8#10 0+ LI bnd y#8#11 0+ LI bnd y#8#12 0+ LI bnd y#9#2 0+ LI bnd y#9#3 0+ LI bnd y#9#4 0+ LI bnd y#9#5 0+ LI bnd y#9#6 0+ LI bnd y#9#7 0+ LI bnd y#9#8 0+ LI bnd y#9#9 0+ LI bnd y#9#10 0+ LI bnd y#9#11 0+ LI bnd y#9#12 0+ LI bnd y#10#2 0+ LI bnd y#10#3 0+ LI bnd y#10#4 0+ LI bnd y#10#5 0+ LI bnd y#10#6 0+ LI bnd y#10#7 0+ LI bnd y#10#8 0+ LI bnd y#10#9 0+ LI bnd y#10#10 0+ LI bnd y#10#11 0+ LI bnd y#10#12 0+ LI bnd y#11#2 0+ LI bnd y#11#3 0+ LI bnd y#11#4 0+ LI bnd y#11#5 0+ LI bnd y#11#6 0+ LI bnd y#11#7 0+ LI bnd y#11#8 0+ LI bnd y#11#9 0+ LI bnd y#11#10 0+ LI bnd y#11#11 0+ LI bnd y#11#12 0+ LI bnd y#12#2 0+ LI bnd y#12#3 0+ LI bnd y#12#4 0+ LI bnd y#12#5 0+ LI bnd y#12#6 0+ LI bnd y#12#7 0+ LI bnd y#12#8 0+ LI bnd y#12#9 0+ LI bnd y#12#10 0+ LI bnd y#12#11 0+ LI bnd y#12#12 0+ LI bnd y#1#2 0+ LI bnd y#1#3 0+ LI bnd y#1#4 0+ LI bnd y#1#5 0+ LI bnd y#1#6 0+ LI bnd y#1#7 0+ LI bnd y#1#8 0+ LI bnd y#1#9 0+ LI bnd y#1#10 0+ LI bnd y#1#11 0+ LI bnd y#1#12 0+ LI bnd y#13#2 0+ LI bnd y#13#3 0+ LI bnd y#13#4 0+ LI bnd y#13#5 0+ LI bnd y#13#6 0+ LI bnd y#13#7 0+ LI bnd y#13#8 0+ LI bnd y#13#9 0+ LI bnd y#13#10 0+ LI bnd y#13#11 0+ LI bnd y#13#12 0+ LI bnd y#2#1 0+ LI bnd y#3#1 0+ LI bnd y#4#1 0+ LI bnd y#5#1 0+ LI bnd y#6#1 0+ LI bnd y#7#1 0+ LI bnd y#8#1 0+ LI bnd y#9#1 0+ LI bnd y#10#1 0+ LI bnd y#11#1 0+ LI bnd y#12#1 0+ LI bnd y#2#13 0+ LI bnd y#3#13 0+ LI bnd y#4#13 0+ LI bnd y#5#13 0+ LI bnd y#6#13 0+ LI bnd y#7#13 0+ LI bnd y#8#13 0+ LI bnd y#9#13 0+ LI bnd y#10#13 0+ LI bnd y#11#13 0+ LI bnd y#12#13 0+ LI bnd y#1#1 0+ LI bnd y#13#1 0+ LI bnd y#1#13 0+ LI bnd y#13#13 0+ENDATA
+ samples/mps/example2.mps view
@@ -0,0 +1,18 @@+* http://pic.dhe.ibm.com/infocenter/cosinfoc/v12r4/topic/ilog.odms.cplex.help/CPLEX/File_formats_reference/topics/MPS_synopsis.html+NAME example2.mps+ROWS+ N obj + L c1 + L c2 +COLUMNS+ x1 obj -1 c1 -1+ x1 c2 1+ x2 obj -2 c1 1+ x2 c2 -3+ x3 obj -3 c1 1+ x3 c2 1+RHS+ rhs c1 20 c2 30+BOUNDS+ UP BOUND x1 40+ENDATA
+ samples/mps/ind1.mps view
@@ -0,0 +1,25 @@+* http://pic.dhe.ibm.com/infocenter/cosinfoc/v12r4/topic/ilog.odms.cplex.help/CPLEX/File_formats_reference/topics/MPS_ext_indicators.html+NAME ind1.mps+ROWS+ N obj+ L row2+ L row4+ E row1+ E row3+COLUMNS+ x obj -1+ x row2 1+ x row4 1+ x row1 1+ y row4 1+ z row4 1+ z row3 1+RHS+ rhs row2 10+ rhs row4 15+BOUNDS+ UI bnd y 1+INDICATORS+ IF row1 y 1+ IF row3 y 0+ENDATA
+ samples/mps/intvar1.mps view
@@ -0,0 +1,25 @@+* http://pic.dhe.ibm.com/infocenter/cosinfoc/v12r4/topic/ilog.odms.cplex.help/CPLEX/File_formats_reference/topics/MPS_ext_intvar.html+NAME+ROWS+ N obj + L c1 + L c2 + E c3 +COLUMNS+ x1 obj -1 c1 -1+ x1 c2 1+ x2 obj -2 c1 1+ x2 c2 -3 c3 1+ x3 obj -3 c1 1+ x3 c2 1+ MARK0000 'MARKER' 'INTORG'+ x4 obj -1 c1 10+ x4 c3 -3.5+ MARK0001 'MARKER' 'INTEND'+RHS+ rhs c1 20 c2 30+BOUNDS+ UP BOUND x1 40+ LO BOUND x4 2+ UP BOUND x4 3+ENDATA
+ samples/mps/intvar2.mps view
@@ -0,0 +1,23 @@+* http://pic.dhe.ibm.com/infocenter/cosinfoc/v12r4/topic/ilog.odms.cplex.help/CPLEX/File_formats_reference/topics/MPS_ext_intvar.html+NAME+ROWS+ N obj + L c1 + L c2 + E c3 +COLUMNS+ x1 obj -1 c1 -1+ x1 c2 1+ x2 obj -2 c1 1+ x2 c2 -3 c3 1+ x3 obj -3 c1 1+ x3 c2 1+ x4 obj -1 c1 10+ x4 c3 -3.5+RHS+ rhs c1 20 c2 30+BOUNDS+ UP BOUND x1 40+ LI BOUND x4 2+ UI BOUND x4 3+ENDATA
+ samples/mps/quadobj1.mps view
@@ -0,0 +1,16 @@+* http://pic.dhe.ibm.com/infocenter/cosinfoc/v12r4/topic/ilog.odms.cplex.help/CPLEX/File_formats_reference/topics/MPS_ext_quadobj.html+NAME problem+ROWS+ N obj+ G c1+COLUMNS+ a obj 1 c1 1+ b obj 1 c1 1+RHS+ rhs c1 10+QMATRIX+ a a 1+ a b 2+ b a 2+ b b 7+ENDATA
+ samples/mps/quadobj2.mps view
@@ -0,0 +1,15 @@+* http://pic.dhe.ibm.com/infocenter/cosinfoc/v12r4/topic/ilog.odms.cplex.help/CPLEX/File_formats_reference/topics/MPS_ext_quadobj.html+NAME problem+ROWS+ N obj+ G c1+COLUMNS+ a obj 1 c1 1+ b obj 1 c1 1+RHS+ rhs c1 10+QUADOBJ+ a a 1+ a b 2+ b b 7+ENDATA
+ samples/mps/ranges.mps view
@@ -0,0 +1,14 @@+NAME example2.mps+ROWS+ N obj + E c1 +COLUMNS+ x1 obj -1 c1 1+ x2 obj -2 c1 -3+ x3 obj -3 c1 1+RHS+ rhs c1 15+RANGES+ rhs c1 15+BOUNDS+ENDATA
+ samples/mps/sc.mps view
@@ -0,0 +1,11 @@+NAME sc.mps+ROWS+ N obj + E c1 +COLUMNS+ x1 obj -1 c1 1+RHS+ rhs c1 0.5+BOUNDS+ SC BOUND x1 40+ENDATA
+ samples/mps/sos.mps view
@@ -0,0 +1,28 @@+* http://pic.dhe.ibm.com/infocenter/cosinfoc/v12r4/topic/ilog.odms.cplex.help/CPLEX/File_formats_reference/topics/MPS_ext_sos.html+NAME+ROWS+ N obj + L c1 + L c2 + E c3 +COLUMNS+ x1 obj -1 c1 -1+ x1 c2 1+ x2 obj -2 c1 1+ x2 c2 -3 c3 1+ x3 obj -3 c1 1+ x3 c2 1+ x4 obj -1 c1 10+ x4 c3 -3.5+RHS+ rhs c1 20 c2 30+BOUNDS+ UP BOUND x1 40+ LI BOUND x4 2+ UI BOUND x4 3+SOS+ S1 set1+ x1 10000+ x2 20000+ x4 40000+ENDATA
+ samples/mps/test-qcp.mps view
@@ -0,0 +1,39 @@+* converted from http://www.gurobi.com/documentation/5.0/reference-manual/node746+NAME problem +OBJSENSE+ MAX+ROWS+ N obj1+ E c0+ L c1+ L qc0+COLUMNS+ MARK0000 'MARKER' 'INTORG'+ x c0 1+ x c1 1+ x obj1 1+ x qc0 1+ y c0 1+ y c1 5+ y obj1 1+ y qc0 1+ z c1 2+ z obj1 1+ MARK0001 'MARKER' 'INTEND'+RHS+ rhs c0 1+ rhs c1 10+ rhs qc0 5+BOUNDS+ LI bound x 0+ UI bound x 5+ LI bound y 0+ PL bound y+ LI bound z 2+ PL bound z+QCMATRIX qc0+ x x 1+ x y -1+ y x -1+ y y 3+ENDATA
+ samples/mps/test-semiint-gurobi.mps view
@@ -0,0 +1,26 @@+* Converted from Example 2 of http://lpsolve.sourceforge.net/5.5/Xpress-format.htm+NAME example2.lpx+ROWS+ N OBJ + L c1 + L c2 +COLUMNS+ MARK0000 'MARKER' 'INTORG'+ x3 OBJ -2+ x3 c2 1+ MARK0001 'MARKER' 'INTEND'+ x2 c1 1+ x2 c2 1+ MARK0002 'MARKER' 'INTORG'+ x1 c1 -1+ x1 c2 1+ MARK0003 'MARKER' 'INTEND'+RHS+ RHS c1 10+ RHS c2 20+BOUNDS+ LO BND x3 2+ SC BND x3 3+ LO BND x1 2.1+ SC BND x1 30+ENDATA
+ samples/mps/test-semiint-lpsolve.mps view
@@ -0,0 +1,27 @@+* Converted from Example 2 of http://lpsolve.sourceforge.net/5.5/Xpress-format.htm+* SCIP-2.1.1 and Gurobi-5.6.3 do not support 'SI' bound+NAME example2.lpx+ROWS+ N OBJ + L c1 + L c2 +COLUMNS+ MARK0000 'MARKER' 'INTORG'+ x3 OBJ -2+ x3 c2 1+ MARK0001 'MARKER' 'INTEND'+ x2 c1 1+ x2 c2 1+ MARK0002 'MARKER' 'INTORG'+ x1 c1 -1+ x1 c2 1+ MARK0003 'MARKER' 'INTEND'+RHS+ RHS c1 10+ RHS c2 20+BOUNDS+ LO BND x3 2+ SI BND x3 3+ LO BND x1 2.1+ SI BND x1 30+ENDATA
+ samples/pbo/normalized-mds_50_10_4.opb view
@@ -0,0 +1,57 @@+* #variable= 50 #constraint= 50 #product= 614 sizeproduct= 1228+****************************************+* begin normalizer comments+* category= OPT-SMALLINT-NLC+* end normalizer comments+****************************************+min: +1 x1 +1 x2 +1 x3 +1 x4 +1 x5 +1 x6 +1 x7 +1 x8 +1 x9 +1 x10 +1 x11 +1 x12 +1 x13 +1 x14 +1 x15 +1 x16 +1 x17 +1 x18 +1 x19 +1 x20 +1 x21 +1 x22 +1 x23 +1 x24 +1 x25 +1 x26 +1 x27 +1 x28 +1 x29 +1 x30 +1 x31 +1 x32 +1 x33 +1 x34 +1 x35 +1 x36 +1 x37 +1 x38 +1 x39 +1 x40 +1 x41 +1 x42 +1 x43 +1 x44 +1 x45 +1 x46 +1 x47 +1 x48 +1 x49 +1 x50 ;++1 ~x1 x2 +1 ~x1 x34 +1 ~x1 x25 +1 ~x1 x27 +1 ~x1 x14 +1 ~x1 x38 +1 ~x1 x26 +1 ~x1 x29 +1 ~x1 x36 +1 ~x1 x45 +1 ~x1 x8 +1 ~x1 x9 +1 ~x1 x17 +1 ~x1 x46 +1 x1 >= 1 ;++1 x1 ~x2 +1 ~x2 x5 +1 ~x2 x15 +1 ~x2 x4 +1 ~x2 x3 +1 ~x2 x42 +1 ~x2 x50 +1 ~x2 x18 +1 ~x2 x19 +1 ~x2 x30 +1 ~x2 x12 +1 ~x2 x16 +1 ~x2 x20 +1 ~x2 x24 +1 ~x2 x40 +1 ~x2 x48 +1 x2 >= 1 ;++1 x2 ~x3 +1 ~x3 x24 +1 ~x3 x19 +1 ~x3 x23 +1 ~x3 x33 +1 ~x3 x21 +1 ~x3 x31 +1 ~x3 x5 +1 ~x3 x7 +1 ~x3 x50 +1 ~x3 x8 +1 ~x3 x11 +1 ~x3 x14 +1 ~x3 x26 +1 ~x3 x41 +1 ~x3 x43 +1 x3 >= 1 ;++1 x2 ~x4 +1 ~x4 x20 +1 ~x4 x45 +1 ~x4 x25 +1 ~x4 x34 +1 ~x4 x23 +1 ~x4 x12 +1 ~x4 x30 +1 ~x4 x27 +1 ~x4 x26 +1 ~x4 x38 +1 ~x4 x43 +1 ~x4 x44 +1 ~x4 x49 +1 x4 >= 1 ;++1 x2 ~x5 +1 x3 ~x5 +1 ~x5 x45 +1 ~x5 x32 +1 ~x5 x43 +1 ~x5 x49 +1 ~x5 x23 +1 ~x5 x44 +1 ~x5 x48 +1 ~x5 x40 +1 ~x5 x6 +1 ~x5 x14 +1 ~x5 x17 +1 ~x5 x27 +1 ~x5 x29 +1 x5 >= 1 ;++1 x5 ~x6 +1 ~x6 x48 +1 ~x6 x18 +1 ~x6 x22 +1 ~x6 x23 +1 ~x6 x37 +1 ~x6 x46 +1 ~x6 x7 +1 ~x6 x17 +1 ~x6 x38 +1 ~x6 x9 +1 ~x6 x14 +1 ~x6 x19 +1 ~x6 x25 +1 ~x6 x49 +1 ~x6 x50 +1 x6 >= 1 ;++1 x3 ~x7 +1 x6 ~x7 +1 ~x7 x32 +1 ~x7 x23 +1 ~x7 x44 +1 ~x7 x42 +1 ~x7 x40 +1 ~x7 x8 +1 ~x7 x27 +1 ~x7 x12 +1 ~x7 x9 +1 ~x7 x10 +1 ~x7 x16 +1 ~x7 x25 +1 ~x7 x36 +1 ~x7 x45 +1 x7 >= 1 ;++1 x1 ~x8 +1 x3 ~x8 +1 x7 ~x8 +1 ~x8 x20 +1 ~x8 x41 +1 ~x8 x47 +1 ~x8 x24 +1 ~x8 x39 +1 ~x8 x34 +1 ~x8 x50 +1 ~x8 x22 +1 x8 >= 1 ;++1 x1 ~x9 +1 x6 ~x9 +1 x7 ~x9 +1 ~x9 x38 +1 ~x9 x33 +1 ~x9 x18 +1 ~x9 x11 +1 ~x9 x12 +1 ~x9 x14 +1 ~x9 x25 +1 ~x9 x24 +1 ~x9 x28 +1 ~x9 x29 +1 ~x9 x32 +1 ~x9 x34 +1 ~x9 x45 +1 x9 >= 1 ;++1 x7 ~x10 +1 ~x10 x45 +1 ~x10 x49 +1 ~x10 x47 +1 ~x10 x28 +1 ~x10 x40 +1 ~x10 x36 +1 ~x10 x17 +1 ~x10 x50 +1 ~x10 x25 +1 ~x10 x15 +1 ~x10 x16 +1 ~x10 x18 +1 x10 >= 1 ;++1 x3 ~x11 +1 x9 ~x11 +1 ~x11 x42 +1 ~x11 x27 +1 ~x11 x15 +1 ~x11 x44 +1 ~x11 x29 +1 ~x11 x13 +1 ~x11 x28 +1 ~x11 x12 +1 ~x11 x22 +1 ~x11 x24 +1 ~x11 x36 +1 ~x11 x50 +1 x11 >= 1 ;++1 x2 ~x12 +1 x4 ~x12 +1 x7 ~x12 +1 x9 ~x12 +1 x11 ~x12 +1 ~x12 x47 +1 ~x12 x15 +1 ~x12 x17 +1 ~x12 x21 +1 ~x12 x30 +1 ~x12 x13 +1 ~x12 x48 +1 x12 >= 1 ;++1 x11 ~x13 +1 x12 ~x13 +1 ~x13 x15 +1 ~x13 x47 +1 ~x13 x31 +1 ~x13 x45 +1 ~x13 x27 +1 ~x13 x39 +1 ~x13 x35 +1 ~x13 x14 +1 ~x13 x20 +1 ~x13 x22 +1 ~x13 x42 +1 x13 >= 1 ;++1 x1 ~x14 +1 x3 ~x14 +1 x5 ~x14 +1 x6 ~x14 +1 x9 ~x14 +1 x13 ~x14 +1 ~x14 x26 +1 ~x14 x34 +1 ~x14 x27 +1 ~x14 x39 +1 ~x14 x21 +1 ~x14 x25 +1 x14 >= 1 ;++1 x2 ~x15 +1 x10 ~x15 +1 x11 ~x15 +1 x12 ~x15 +1 x13 ~x15 +1 ~x15 x21 +1 ~x15 x32 +1 ~x15 x33 +1 ~x15 x35 +1 ~x15 x37 +1 ~x15 x17 +1 ~x15 x23 +1 ~x15 x38 +1 ~x15 x46 +1 x15 >= 1 ;++1 x2 ~x16 +1 x7 ~x16 +1 x10 ~x16 +1 ~x16 x21 +1 ~x16 x37 +1 ~x16 x24 +1 ~x16 x19 +1 ~x16 x27 +1 ~x16 x49 +1 ~x16 x38 +1 ~x16 x20 +1 ~x16 x26 +1 ~x16 x30 +1 ~x16 x35 +1 ~x16 x36 +1 ~x16 x45 +1 x16 >= 1 ;++1 x1 ~x17 +1 x5 ~x17 +1 x6 ~x17 +1 x10 ~x17 +1 x12 ~x17 +1 x15 ~x17 +1 ~x17 x27 +1 ~x17 x28 +1 ~x17 x40 +1 ~x17 x39 +1 ~x17 x18 +1 x17 >= 1 ;++1 x2 ~x18 +1 x6 ~x18 +1 x9 ~x18 +1 x10 ~x18 +1 x17 ~x18 +1 ~x18 x33 +1 ~x18 x27 +1 ~x18 x37 +1 ~x18 x32 +1 ~x18 x19 +1 ~x18 x24 +1 ~x18 x31 +1 ~x18 x42 +1 ~x18 x44 +1 x18 >= 1 ;++1 x2 ~x19 +1 x3 ~x19 +1 x6 ~x19 +1 x16 ~x19 +1 x18 ~x19 +1 ~x19 x20 +1 ~x19 x29 +1 ~x19 x40 +1 ~x19 x37 +1 ~x19 x46 +1 ~x19 x21 +1 ~x19 x24 +1 ~x19 x33 +1 ~x19 x43 +1 x19 >= 1 ;++1 x2 ~x20 +1 x4 ~x20 +1 x8 ~x20 +1 x13 ~x20 +1 x16 ~x20 +1 x19 ~x20 +1 ~x20 x30 +1 ~x20 x47 +1 ~x20 x24 +1 ~x20 x23 +1 ~x20 x21 +1 ~x20 x29 +1 ~x20 x36 +1 ~x20 x44 +1 x20 >= 1 ;++1 x3 ~x21 +1 x12 ~x21 +1 x14 ~x21 +1 x15 ~x21 +1 x16 ~x21 +1 x19 ~x21 +1 x20 ~x21 +1 ~x21 x41 +1 ~x21 x48 +1 ~x21 x25 +1 ~x21 x28 +1 ~x21 x29 +1 x21 >= 1 ;++1 x6 ~x22 +1 x8 ~x22 +1 x11 ~x22 +1 x13 ~x22 +1 ~x22 x36 +1 ~x22 x30 +1 ~x22 x44 +1 ~x22 x29 +1 ~x22 x43 +1 ~x22 x32 +1 ~x22 x31 +1 x22 >= 1 ;++1 x3 ~x23 +1 x4 ~x23 +1 x5 ~x23 +1 x6 ~x23 +1 x7 ~x23 +1 x15 ~x23 +1 x20 ~x23 +1 ~x23 x35 +1 ~x23 x31 +1 ~x23 x39 +1 x23 >= 1 ;++1 x2 ~x24 +1 x3 ~x24 +1 x8 ~x24 +1 x9 ~x24 +1 x11 ~x24 +1 x16 ~x24 +1 x18 ~x24 +1 x19 ~x24 +1 x20 ~x24 +1 ~x24 x28 +1 ~x24 x38 +1 ~x24 x39 +1 x24 >= 1 ;++1 x1 ~x25 +1 x4 ~x25 +1 x6 ~x25 +1 x7 ~x25 +1 x9 ~x25 +1 x10 ~x25 +1 x14 ~x25 +1 x21 ~x25 +1 ~x25 x37 +1 ~x25 x33 +1 ~x25 x34 +1 ~x25 x35 +1 ~x25 x40 +1 ~x25 x42 +1 x25 >= 1 ;++1 x1 ~x26 +1 x3 ~x26 +1 x4 ~x26 +1 x14 ~x26 +1 x16 ~x26 +1 ~x26 x46 +1 ~x26 x31 +1 ~x26 x41 +1 ~x26 x38 +1 ~x26 x47 +1 ~x26 x28 +1 ~x26 x50 +1 x26 >= 1 ;++1 x1 ~x27 +1 x4 ~x27 +1 x5 ~x27 +1 x7 ~x27 +1 x11 ~x27 +1 x13 ~x27 +1 x14 ~x27 +1 x16 ~x27 +1 x17 ~x27 +1 x18 ~x27 +1 ~x27 x43 +1 x27 >= 1 ;++1 x9 ~x28 +1 x10 ~x28 +1 x11 ~x28 +1 x17 ~x28 +1 x21 ~x28 +1 x24 ~x28 +1 x26 ~x28 +1 ~x28 x32 +1 ~x28 x46 +1 ~x28 x38 +1 ~x28 x31 +1 ~x28 x34 +1 x28 >= 1 ;++1 x1 ~x29 +1 x5 ~x29 +1 x9 ~x29 +1 x11 ~x29 +1 x19 ~x29 +1 x20 ~x29 +1 x21 ~x29 +1 x22 ~x29 +1 ~x29 x40 +1 ~x29 x49 +1 ~x29 x30 +1 ~x29 x33 +1 x29 >= 1 ;++1 x2 ~x30 +1 x4 ~x30 +1 x12 ~x30 +1 x16 ~x30 +1 x20 ~x30 +1 x22 ~x30 +1 x29 ~x30 +1 ~x30 x31 +1 ~x30 x47 +1 ~x30 x39 +1 x30 >= 1 ;++1 x3 ~x31 +1 x13 ~x31 +1 x18 ~x31 +1 x22 ~x31 +1 x23 ~x31 +1 x26 ~x31 +1 x28 ~x31 +1 x30 ~x31 +1 ~x31 x35 +1 ~x31 x41 +1 ~x31 x32 +1 ~x31 x45 +1 ~x31 x50 +1 x31 >= 1 ;++1 x5 ~x32 +1 x7 ~x32 +1 x9 ~x32 +1 x15 ~x32 +1 x18 ~x32 +1 x22 ~x32 +1 x28 ~x32 +1 x31 ~x32 +1 ~x32 x35 +1 ~x32 x42 +1 ~x32 x36 +1 ~x32 x47 +1 x32 >= 1 ;++1 x3 ~x33 +1 x9 ~x33 +1 x15 ~x33 +1 x18 ~x33 +1 x19 ~x33 +1 x25 ~x33 +1 x29 ~x33 +1 ~x33 x42 +1 ~x33 x49 +1 ~x33 x39 +1 x33 >= 1 ;++1 x1 ~x34 +1 x4 ~x34 +1 x8 ~x34 +1 x9 ~x34 +1 x14 ~x34 +1 x25 ~x34 +1 x28 ~x34 +1 ~x34 x49 +1 ~x34 x43 +1 ~x34 x48 +1 ~x34 x35 +1 x34 >= 1 ;++1 x13 ~x35 +1 x15 ~x35 +1 x16 ~x35 +1 x23 ~x35 +1 x25 ~x35 +1 x31 ~x35 +1 x32 ~x35 +1 x34 ~x35 +1 ~x35 x37 +1 ~x35 x49 +1 x35 >= 1 ;++1 x1 ~x36 +1 x7 ~x36 +1 x10 ~x36 +1 x11 ~x36 +1 x16 ~x36 +1 x20 ~x36 +1 x22 ~x36 +1 x32 ~x36 +1 ~x36 x37 +1 ~x36 x39 +1 ~x36 x38 +1 ~x36 x48 +1 x36 >= 1 ;++1 x6 ~x37 +1 x15 ~x37 +1 x16 ~x37 +1 x18 ~x37 +1 x19 ~x37 +1 x25 ~x37 +1 x35 ~x37 +1 x36 ~x37 +1 ~x37 x41 +1 ~x37 x42 +1 ~x37 x44 +1 ~x37 x48 +1 x37 >= 1 ;++1 x1 ~x38 +1 x4 ~x38 +1 x6 ~x38 +1 x9 ~x38 +1 x15 ~x38 +1 x16 ~x38 +1 x24 ~x38 +1 x26 ~x38 +1 x28 ~x38 +1 x36 ~x38 +1 x38 >= 1 ;++1 x8 ~x39 +1 x13 ~x39 +1 x14 ~x39 +1 x17 ~x39 +1 x23 ~x39 +1 x24 ~x39 +1 x30 ~x39 +1 x33 ~x39 +1 x36 ~x39 +1 ~x39 x43 +1 ~x39 x46 +1 x39 >= 1 ;++1 x2 ~x40 +1 x5 ~x40 +1 x7 ~x40 +1 x10 ~x40 +1 x17 ~x40 +1 x19 ~x40 +1 x25 ~x40 +1 x29 ~x40 +1 ~x40 x43 +1 ~x40 x49 +1 ~x40 x41 +1 ~x40 x46 +1 ~x40 x47 +1 x40 >= 1 ;++1 x3 ~x41 +1 x8 ~x41 +1 x21 ~x41 +1 x26 ~x41 +1 x31 ~x41 +1 x37 ~x41 +1 x40 ~x41 +1 ~x41 x50 +1 ~x41 x44 +1 ~x41 x47 +1 ~x41 x45 +1 x41 >= 1 ;++1 x2 ~x42 +1 x7 ~x42 +1 x11 ~x42 +1 x13 ~x42 +1 x18 ~x42 +1 x25 ~x42 +1 x32 ~x42 +1 x33 ~x42 +1 x37 ~x42 +1 ~x42 x48 +1 ~x42 x46 +1 x42 >= 1 ;++1 x3 ~x43 +1 x4 ~x43 +1 x5 ~x43 +1 x19 ~x43 +1 x22 ~x43 +1 x27 ~x43 +1 x34 ~x43 +1 x39 ~x43 +1 x40 ~x43 +1 ~x43 x44 +1 x43 >= 1 ;++1 x4 ~x44 +1 x5 ~x44 +1 x7 ~x44 +1 x11 ~x44 +1 x18 ~x44 +1 x20 ~x44 +1 x22 ~x44 +1 x37 ~x44 +1 x41 ~x44 +1 x43 ~x44 +1 x44 >= 1 ;++1 x1 ~x45 +1 x4 ~x45 +1 x5 ~x45 +1 x7 ~x45 +1 x9 ~x45 +1 x10 ~x45 +1 x13 ~x45 +1 x16 ~x45 +1 x31 ~x45 +1 x41 ~x45 +1 ~x45 x46 +1 x45 >= 1 ;++1 x1 ~x46 +1 x6 ~x46 +1 x15 ~x46 +1 x19 ~x46 +1 x26 ~x46 +1 x28 ~x46 +1 x39 ~x46 +1 x40 ~x46 +1 x42 ~x46 +1 x45 ~x46 +1 x46 >= 1 ;++1 x8 ~x47 +1 x10 ~x47 +1 x12 ~x47 +1 x13 ~x47 +1 x20 ~x47 +1 x26 ~x47 +1 x30 ~x47 +1 x32 ~x47 +1 x40 ~x47 +1 x41 ~x47 +1 x47 >= 1 ;++1 x2 ~x48 +1 x5 ~x48 +1 x6 ~x48 +1 x12 ~x48 +1 x21 ~x48 +1 x34 ~x48 +1 x36 ~x48 +1 x37 ~x48 +1 x42 ~x48 +1 ~x48 x50 +1 x48 >= 1 ;++1 x4 ~x49 +1 x5 ~x49 +1 x6 ~x49 +1 x10 ~x49 +1 x16 ~x49 +1 x29 ~x49 +1 x33 ~x49 +1 x34 ~x49 +1 x35 ~x49 +1 x40 ~x49 +1 x49 >= 1 ;++1 x2 ~x50 +1 x3 ~x50 +1 x6 ~x50 +1 x8 ~x50 +1 x10 ~x50 +1 x11 ~x50 +1 x26 ~x50 +1 x31 ~x50 +1 x41 ~x50 +1 x48 ~x50 +1 x50 >= 1 ;
+ samples/pbo/normalized-opt-market-split_4_30_2.opb view
@@ -0,0 +1,15 @@+* #variable= 94 #constraint= 8+****************************************+* begin normalizer comments+* category= OPT-SMALLINT+* end normalizer comments+****************************************+min: +1 x1 +2 x2 +4 x3 +8 x4 +16 x5 +32 x6 +64 x7 +128 x8 +1 x9 +2 x10 +4 x11 +8 x12 +16 x13 +32 x14 +64 x15 +128 x16 +1 x17 +2 x18 +4 x19 +8 x20 +16 x21 +32 x22 +64 x23 +128 x24 +1 x25 +2 x26 +4 x27 +8 x28 +16 x29 +32 x30 +64 x31 +128 x32 +1 x33 +2 x34 +4 x35 +8 x36 +16 x37 +32 x38 +64 x39 +128 x40 +1 x41 +2 x42 +4 x43 +8 x44 +16 x45 +32 x46 +64 x47 +128 x48 +1 x49 +2 x50 +4 x51 +8 x52 +16 x53 +32 x54 +64 x55 +128 x56 +1 x57 +2 x58 +4 x59 +8 x60 +16 x61 +32 x62 +64 x63 +128 x64 ;+-1 x49 -2 x50 -4 x51 -8 x52 -16 x53 -32 x54 -64 x55 -128 x56 +1 x57 +2 x58 +4 x59 +8 x60 +16 x61 +32 x62 +64 x63 +128 x64 -48 x65 -71 x66 -5 x67 -77 x68 -43 x70 -23 x71 -3 x72 -6 x73 -47 x74 -17 x75 -56 x76 -17 x77 -67 x78 -70 x79 -67 x80 -93 x81 -99 x82 -5 x83 -9 x84 -86 x85 -46 x86 -96 x87 -61 x88 -86 x89 -75 x90 -55 x91 -41 x92 -3 x93 -1 x94 >= -686 ;++1 x49 +2 x50 +4 x51 +8 x52 +16 x53 +32 x54 +64 x55 +128 x56 -1 x57 -2 x58 -4 x59 -8 x60 -16 x61 -32 x62 -64 x63 -128 x64 +48 x65 +71 x66 +5 x67 +77 x68 +43 x70 +23 x71 +3 x72 +6 x73 +47 x74 +17 x75 +56 x76 +17 x77 +67 x78 +70 x79 +67 x80 +93 x81 +99 x82 +5 x83 +9 x84 +86 x85 +46 x86 +96 x87 +61 x88 +86 x89 +75 x90 +55 x91 +41 x92 +3 x93 +1 x94 >= 686 ;+-1 x33 -2 x34 -4 x35 -8 x36 -16 x37 -32 x38 -64 x39 -128 x40 +1 x41 +2 x42 +4 x43 +8 x44 +16 x45 +32 x46 +64 x47 +128 x48 -77 x65 -16 x66 -29 x67 -77 x68 -86 x69 -46 x70 -3 x71 -11 x72 -72 x73 -62 x74 -49 x75 -70 x76 -50 x77 -14 x78 -97 x79 -73 x80 -29 x81 -38 x82 -16 x83 -34 x84 -89 x85 -86 x86 -23 x87 -87 x88 -27 x89 -41 x90 -55 x91 -76 x92 -94 x93 -89 x94 >= -808 ;++1 x33 +2 x34 +4 x35 +8 x36 +16 x37 +32 x38 +64 x39 +128 x40 -1 x41 -2 x42 -4 x43 -8 x44 -16 x45 -32 x46 -64 x47 -128 x48 +77 x65 +16 x66 +29 x67 +77 x68 +86 x69 +46 x70 +3 x71 +11 x72 +72 x73 +62 x74 +49 x75 +70 x76 +50 x77 +14 x78 +97 x79 +73 x80 +29 x81 +38 x82 +16 x83 +34 x84 +89 x85 +86 x86 +23 x87 +87 x88 +27 x89 +41 x90 +55 x91 +76 x92 +94 x93 +89 x94 >= 808 ;+-1 x17 -2 x18 -4 x19 -8 x20 -16 x21 -32 x22 -64 x23 -128 x24 +1 x25 +2 x26 +4 x27 +8 x28 +16 x29 +32 x30 +64 x31 +128 x32 -30 x65 -57 x66 -70 x68 -17 x69 -74 x70 -73 x71 -74 x72 -58 x73 -86 x74 -46 x75 -36 x76 -13 x77 -27 x78 -23 x79 -14 x80 -89 x81 -91 x82 -5 x83 -50 x84 -18 x85 -37 x86 -98 x87 -40 x88 -66 x89 -15 x90 -49 x91 -34 x93 -20 x94 >= -655 ;++1 x17 +2 x18 +4 x19 +8 x20 +16 x21 +32 x22 +64 x23 +128 x24 -1 x25 -2 x26 -4 x27 -8 x28 -16 x29 -32 x30 -64 x31 -128 x32 +30 x65 +57 x66 +70 x68 +17 x69 +74 x70 +73 x71 +74 x72 +58 x73 +86 x74 +46 x75 +36 x76 +13 x77 +27 x78 +23 x79 +14 x80 +89 x81 +91 x82 +5 x83 +50 x84 +18 x85 +37 x86 +98 x87 +40 x88 +66 x89 +15 x90 +49 x91 +34 x93 +20 x94 >= 655 ;+-1 x1 -2 x2 -4 x3 -8 x4 -16 x5 -32 x6 -64 x7 -128 x8 +1 x9 +2 x10 +4 x11 +8 x12 +16 x13 +32 x14 +64 x15 +128 x16 -86 x65 -23 x66 -88 x67 -8 x68 -22 x69 -51 x70 -57 x71 -84 x72 -60 x73 -20 x74 -25 x75 -27 x76 -80 x77 -87 x78 -49 x79 -62 x80 -15 x81 -91 x82 -9 x83 -27 x84 -31 x85 -96 x86 -70 x87 -77 x88 -65 x89 -56 x90 -82 x91 -18 x92 -71 x93 -24 x94 >= -780 ;++1 x1 +2 x2 +4 x3 +8 x4 +16 x5 +32 x6 +64 x7 +128 x8 -1 x9 -2 x10 -4 x11 -8 x12 -16 x13 -32 x14 -64 x15 -128 x16 +86 x65 +23 x66 +88 x67 +8 x68 +22 x69 +51 x70 +57 x71 +84 x72 +60 x73 +20 x74 +25 x75 +27 x76 +80 x77 +87 x78 +49 x79 +62 x80 +15 x81 +91 x82 +9 x83 +27 x84 +31 x85 +96 x86 +70 x87 +77 x88 +65 x89 +56 x90 +82 x91 +18 x92 +71 x93 +24 x94 >= 780 ;
+ samples/pbs/normalized-j3025_1-sat.opb view
@@ -0,0 +1,19164 @@+* #variable= 5828 #constraint= 19158+****************************************+* begin normalizer comments+* category= DEC-SMALLINT-LIN+* end normalizer comments+****************************************++1 x2914 >= 1 ;+-1 x1 +1 x2 >= 0 ;+-1 x2 +1 x3 >= 0 ;+-1 x3 +1 x4 >= 0 ;+-1 x4 +1 x5 >= 0 ;+-1 x5 +1 x6 >= 0 ;+-1 x6 +1 x7 >= 0 ;+-1 x7 +1 x8 >= 0 ;+-1 x8 +1 x9 >= 0 ;+-1 x9 +1 x10 >= 0 ;+-1 x10 +1 x11 >= 0 ;+-1 x11 +1 x12 >= 0 ;+-1 x12 +1 x13 >= 0 ;+-1 x13 +1 x14 >= 0 ;+-1 x14 +1 x15 >= 0 ;+-1 x15 +1 x16 >= 0 ;+-1 x16 +1 x17 >= 0 ;+-1 x17 +1 x18 >= 0 ;+-1 x18 +1 x19 >= 0 ;+-1 x19 +1 x20 >= 0 ;+-1 x20 +1 x21 >= 0 ;+-1 x21 +1 x22 >= 0 ;+-1 x22 +1 x23 >= 0 ;+-1 x23 +1 x24 >= 0 ;+-1 x24 +1 x25 >= 0 ;+-1 x25 +1 x26 >= 0 ;+-1 x26 +1 x27 >= 0 ;+-1 x27 +1 x28 >= 0 ;+-1 x28 +1 x29 >= 0 ;+-1 x29 +1 x30 >= 0 ;+-1 x30 +1 x31 >= 0 ;+-1 x31 +1 x32 >= 0 ;+-1 x32 +1 x33 >= 0 ;+-1 x33 +1 x34 >= 0 ;+-1 x34 +1 x35 >= 0 ;+-1 x35 +1 x36 >= 0 ;+-1 x36 +1 x37 >= 0 ;+-1 x37 +1 x38 >= 0 ;+-1 x38 +1 x39 >= 0 ;+-1 x39 +1 x40 >= 0 ;+-1 x40 +1 x41 >= 0 ;+-1 x41 +1 x42 >= 0 ;+-1 x42 +1 x43 >= 0 ;+-1 x43 +1 x44 >= 0 ;+-1 x44 +1 x45 >= 0 ;+-1 x45 +1 x46 >= 0 ;+-1 x46 +1 x47 >= 0 ;+-1 x47 +1 x48 >= 0 ;+-1 x48 +1 x49 >= 0 ;+-1 x49 +1 x50 >= 0 ;+-1 x50 +1 x51 >= 0 ;+-1 x51 +1 x52 >= 0 ;+-1 x52 +1 x53 >= 0 ;+-1 x53 +1 x54 >= 0 ;+-1 x54 +1 x55 >= 0 ;+-1 x55 +1 x56 >= 0 ;+-1 x56 +1 x57 >= 0 ;+-1 x57 +1 x58 >= 0 ;+-1 x58 +1 x59 >= 0 ;+-1 x59 +1 x60 >= 0 ;+-1 x60 +1 x61 >= 0 ;+-1 x61 +1 x62 >= 0 ;+-1 x62 +1 x63 >= 0 ;+-1 x63 +1 x64 >= 0 ;+-1 x64 +1 x65 >= 0 ;+-1 x65 +1 x66 >= 0 ;+-1 x66 +1 x67 >= 0 ;+-1 x67 +1 x68 >= 0 ;+-1 x68 +1 x69 >= 0 ;+-1 x69 +1 x70 >= 0 ;+-1 x70 +1 x71 >= 0 ;+-1 x71 +1 x72 >= 0 ;+-1 x72 +1 x73 >= 0 ;+-1 x73 +1 x74 >= 0 ;+-1 x74 +1 x75 >= 0 ;+-1 x75 +1 x76 >= 0 ;+-1 x76 +1 x77 >= 0 ;+-1 x77 +1 x78 >= 0 ;+-1 x78 +1 x79 >= 0 ;+-1 x79 +1 x80 >= 0 ;+-1 x80 +1 x81 >= 0 ;+-1 x81 +1 x82 >= 0 ;+-1 x82 +1 x83 >= 0 ;+-1 x83 +1 x84 >= 0 ;+-1 x84 +1 x85 >= 0 ;+-1 x85 +1 x86 >= 0 ;+-1 x86 +1 x87 >= 0 ;+-1 x87 +1 x88 >= 0 ;+-1 x88 +1 x89 >= 0 ;+-1 x89 +1 x90 >= 0 ;+-1 x90 +1 x91 >= 0 ;+-1 x91 +1 x92 >= 0 ;+-1 x92 +1 x93 >= 0 ;+-1 x93 +1 x94 >= 0 ;+-1 x95 +1 x96 >= 0 ;+-1 x96 +1 x97 >= 0 ;+-1 x97 +1 x98 >= 0 ;+-1 x98 +1 x99 >= 0 ;+-1 x99 +1 x100 >= 0 ;+-1 x100 +1 x101 >= 0 ;+-1 x101 +1 x102 >= 0 ;+-1 x102 +1 x103 >= 0 ;+-1 x103 +1 x104 >= 0 ;+-1 x104 +1 x105 >= 0 ;+-1 x105 +1 x106 >= 0 ;+-1 x106 +1 x107 >= 0 ;+-1 x107 +1 x108 >= 0 ;+-1 x108 +1 x109 >= 0 ;+-1 x109 +1 x110 >= 0 ;+-1 x110 +1 x111 >= 0 ;+-1 x111 +1 x112 >= 0 ;+-1 x112 +1 x113 >= 0 ;+-1 x113 +1 x114 >= 0 ;+-1 x114 +1 x115 >= 0 ;+-1 x115 +1 x116 >= 0 ;+-1 x116 +1 x117 >= 0 ;+-1 x117 +1 x118 >= 0 ;+-1 x118 +1 x119 >= 0 ;+-1 x119 +1 x120 >= 0 ;+-1 x120 +1 x121 >= 0 ;+-1 x121 +1 x122 >= 0 ;+-1 x122 +1 x123 >= 0 ;+-1 x123 +1 x124 >= 0 ;+-1 x124 +1 x125 >= 0 ;+-1 x125 +1 x126 >= 0 ;+-1 x126 +1 x127 >= 0 ;+-1 x127 +1 x128 >= 0 ;+-1 x128 +1 x129 >= 0 ;+-1 x129 +1 x130 >= 0 ;+-1 x130 +1 x131 >= 0 ;+-1 x131 +1 x132 >= 0 ;+-1 x132 +1 x133 >= 0 ;+-1 x133 +1 x134 >= 0 ;+-1 x134 +1 x135 >= 0 ;+-1 x135 +1 x136 >= 0 ;+-1 x136 +1 x137 >= 0 ;+-1 x137 +1 x138 >= 0 ;+-1 x138 +1 x139 >= 0 ;+-1 x139 +1 x140 >= 0 ;+-1 x140 +1 x141 >= 0 ;+-1 x141 +1 x142 >= 0 ;+-1 x142 +1 x143 >= 0 ;+-1 x143 +1 x144 >= 0 ;+-1 x144 +1 x145 >= 0 ;+-1 x145 +1 x146 >= 0 ;+-1 x146 +1 x147 >= 0 ;+-1 x147 +1 x148 >= 0 ;+-1 x148 +1 x149 >= 0 ;+-1 x149 +1 x150 >= 0 ;+-1 x150 +1 x151 >= 0 ;+-1 x151 +1 x152 >= 0 ;+-1 x152 +1 x153 >= 0 ;+-1 x153 +1 x154 >= 0 ;+-1 x154 +1 x155 >= 0 ;+-1 x155 +1 x156 >= 0 ;+-1 x156 +1 x157 >= 0 ;+-1 x157 +1 x158 >= 0 ;+-1 x158 +1 x159 >= 0 ;+-1 x159 +1 x160 >= 0 ;+-1 x160 +1 x161 >= 0 ;+-1 x161 +1 x162 >= 0 ;+-1 x162 +1 x163 >= 0 ;+-1 x163 +1 x164 >= 0 ;+-1 x164 +1 x165 >= 0 ;+-1 x165 +1 x166 >= 0 ;+-1 x166 +1 x167 >= 0 ;+-1 x167 +1 x168 >= 0 ;+-1 x168 +1 x169 >= 0 ;+-1 x169 +1 x170 >= 0 ;+-1 x170 +1 x171 >= 0 ;+-1 x171 +1 x172 >= 0 ;+-1 x172 +1 x173 >= 0 ;+-1 x173 +1 x174 >= 0 ;+-1 x174 +1 x175 >= 0 ;+-1 x175 +1 x176 >= 0 ;+-1 x176 +1 x177 >= 0 ;+-1 x177 +1 x178 >= 0 ;+-1 x178 +1 x179 >= 0 ;+-1 x179 +1 x180 >= 0 ;+-1 x180 +1 x181 >= 0 ;+-1 x181 +1 x182 >= 0 ;+-1 x182 +1 x183 >= 0 ;+-1 x183 +1 x184 >= 0 ;+-1 x184 +1 x185 >= 0 ;+-1 x185 +1 x186 >= 0 ;+-1 x186 +1 x187 >= 0 ;+-1 x187 +1 x188 >= 0 ;+-1 x189 +1 x190 >= 0 ;+-1 x190 +1 x191 >= 0 ;+-1 x191 +1 x192 >= 0 ;+-1 x192 +1 x193 >= 0 ;+-1 x193 +1 x194 >= 0 ;+-1 x194 +1 x195 >= 0 ;+-1 x195 +1 x196 >= 0 ;+-1 x196 +1 x197 >= 0 ;+-1 x197 +1 x198 >= 0 ;+-1 x198 +1 x199 >= 0 ;+-1 x199 +1 x200 >= 0 ;+-1 x200 +1 x201 >= 0 ;+-1 x201 +1 x202 >= 0 ;+-1 x202 +1 x203 >= 0 ;+-1 x203 +1 x204 >= 0 ;+-1 x204 +1 x205 >= 0 ;+-1 x205 +1 x206 >= 0 ;+-1 x206 +1 x207 >= 0 ;+-1 x207 +1 x208 >= 0 ;+-1 x208 +1 x209 >= 0 ;+-1 x209 +1 x210 >= 0 ;+-1 x210 +1 x211 >= 0 ;+-1 x211 +1 x212 >= 0 ;+-1 x212 +1 x213 >= 0 ;+-1 x213 +1 x214 >= 0 ;+-1 x214 +1 x215 >= 0 ;+-1 x215 +1 x216 >= 0 ;+-1 x216 +1 x217 >= 0 ;+-1 x217 +1 x218 >= 0 ;+-1 x218 +1 x219 >= 0 ;+-1 x219 +1 x220 >= 0 ;+-1 x220 +1 x221 >= 0 ;+-1 x221 +1 x222 >= 0 ;+-1 x222 +1 x223 >= 0 ;+-1 x223 +1 x224 >= 0 ;+-1 x224 +1 x225 >= 0 ;+-1 x225 +1 x226 >= 0 ;+-1 x226 +1 x227 >= 0 ;+-1 x227 +1 x228 >= 0 ;+-1 x228 +1 x229 >= 0 ;+-1 x229 +1 x230 >= 0 ;+-1 x230 +1 x231 >= 0 ;+-1 x231 +1 x232 >= 0 ;+-1 x232 +1 x233 >= 0 ;+-1 x233 +1 x234 >= 0 ;+-1 x234 +1 x235 >= 0 ;+-1 x235 +1 x236 >= 0 ;+-1 x236 +1 x237 >= 0 ;+-1 x237 +1 x238 >= 0 ;+-1 x238 +1 x239 >= 0 ;+-1 x239 +1 x240 >= 0 ;+-1 x240 +1 x241 >= 0 ;+-1 x241 +1 x242 >= 0 ;+-1 x242 +1 x243 >= 0 ;+-1 x243 +1 x244 >= 0 ;+-1 x244 +1 x245 >= 0 ;+-1 x245 +1 x246 >= 0 ;+-1 x246 +1 x247 >= 0 ;+-1 x247 +1 x248 >= 0 ;+-1 x248 +1 x249 >= 0 ;+-1 x249 +1 x250 >= 0 ;+-1 x250 +1 x251 >= 0 ;+-1 x251 +1 x252 >= 0 ;+-1 x252 +1 x253 >= 0 ;+-1 x253 +1 x254 >= 0 ;+-1 x254 +1 x255 >= 0 ;+-1 x255 +1 x256 >= 0 ;+-1 x256 +1 x257 >= 0 ;+-1 x257 +1 x258 >= 0 ;+-1 x258 +1 x259 >= 0 ;+-1 x259 +1 x260 >= 0 ;+-1 x260 +1 x261 >= 0 ;+-1 x261 +1 x262 >= 0 ;+-1 x262 +1 x263 >= 0 ;+-1 x263 +1 x264 >= 0 ;+-1 x264 +1 x265 >= 0 ;+-1 x265 +1 x266 >= 0 ;+-1 x266 +1 x267 >= 0 ;+-1 x267 +1 x268 >= 0 ;+-1 x268 +1 x269 >= 0 ;+-1 x269 +1 x270 >= 0 ;+-1 x270 +1 x271 >= 0 ;+-1 x271 +1 x272 >= 0 ;+-1 x272 +1 x273 >= 0 ;+-1 x273 +1 x274 >= 0 ;+-1 x274 +1 x275 >= 0 ;+-1 x275 +1 x276 >= 0 ;+-1 x276 +1 x277 >= 0 ;+-1 x277 +1 x278 >= 0 ;+-1 x278 +1 x279 >= 0 ;+-1 x279 +1 x280 >= 0 ;+-1 x280 +1 x281 >= 0 ;+-1 x281 +1 x282 >= 0 ;+-1 x283 +1 x284 >= 0 ;+-1 x284 +1 x285 >= 0 ;+-1 x285 +1 x286 >= 0 ;+-1 x286 +1 x287 >= 0 ;+-1 x287 +1 x288 >= 0 ;+-1 x288 +1 x289 >= 0 ;+-1 x289 +1 x290 >= 0 ;+-1 x290 +1 x291 >= 0 ;+-1 x291 +1 x292 >= 0 ;+-1 x292 +1 x293 >= 0 ;+-1 x293 +1 x294 >= 0 ;+-1 x294 +1 x295 >= 0 ;+-1 x295 +1 x296 >= 0 ;+-1 x296 +1 x297 >= 0 ;+-1 x297 +1 x298 >= 0 ;+-1 x298 +1 x299 >= 0 ;+-1 x299 +1 x300 >= 0 ;+-1 x300 +1 x301 >= 0 ;+-1 x301 +1 x302 >= 0 ;+-1 x302 +1 x303 >= 0 ;+-1 x303 +1 x304 >= 0 ;+-1 x304 +1 x305 >= 0 ;+-1 x305 +1 x306 >= 0 ;+-1 x306 +1 x307 >= 0 ;+-1 x307 +1 x308 >= 0 ;+-1 x308 +1 x309 >= 0 ;+-1 x309 +1 x310 >= 0 ;+-1 x310 +1 x311 >= 0 ;+-1 x311 +1 x312 >= 0 ;+-1 x312 +1 x313 >= 0 ;+-1 x313 +1 x314 >= 0 ;+-1 x314 +1 x315 >= 0 ;+-1 x315 +1 x316 >= 0 ;+-1 x316 +1 x317 >= 0 ;+-1 x317 +1 x318 >= 0 ;+-1 x318 +1 x319 >= 0 ;+-1 x319 +1 x320 >= 0 ;+-1 x320 +1 x321 >= 0 ;+-1 x321 +1 x322 >= 0 ;+-1 x322 +1 x323 >= 0 ;+-1 x323 +1 x324 >= 0 ;+-1 x324 +1 x325 >= 0 ;+-1 x325 +1 x326 >= 0 ;+-1 x326 +1 x327 >= 0 ;+-1 x327 +1 x328 >= 0 ;+-1 x328 +1 x329 >= 0 ;+-1 x329 +1 x330 >= 0 ;+-1 x330 +1 x331 >= 0 ;+-1 x331 +1 x332 >= 0 ;+-1 x332 +1 x333 >= 0 ;+-1 x333 +1 x334 >= 0 ;+-1 x334 +1 x335 >= 0 ;+-1 x335 +1 x336 >= 0 ;+-1 x336 +1 x337 >= 0 ;+-1 x337 +1 x338 >= 0 ;+-1 x338 +1 x339 >= 0 ;+-1 x339 +1 x340 >= 0 ;+-1 x340 +1 x341 >= 0 ;+-1 x341 +1 x342 >= 0 ;+-1 x342 +1 x343 >= 0 ;+-1 x343 +1 x344 >= 0 ;+-1 x344 +1 x345 >= 0 ;+-1 x345 +1 x346 >= 0 ;+-1 x346 +1 x347 >= 0 ;+-1 x347 +1 x348 >= 0 ;+-1 x348 +1 x349 >= 0 ;+-1 x349 +1 x350 >= 0 ;+-1 x350 +1 x351 >= 0 ;+-1 x351 +1 x352 >= 0 ;+-1 x352 +1 x353 >= 0 ;+-1 x353 +1 x354 >= 0 ;+-1 x354 +1 x355 >= 0 ;+-1 x355 +1 x356 >= 0 ;+-1 x356 +1 x357 >= 0 ;+-1 x357 +1 x358 >= 0 ;+-1 x358 +1 x359 >= 0 ;+-1 x359 +1 x360 >= 0 ;+-1 x360 +1 x361 >= 0 ;+-1 x361 +1 x362 >= 0 ;+-1 x362 +1 x363 >= 0 ;+-1 x363 +1 x364 >= 0 ;+-1 x364 +1 x365 >= 0 ;+-1 x365 +1 x366 >= 0 ;+-1 x366 +1 x367 >= 0 ;+-1 x367 +1 x368 >= 0 ;+-1 x368 +1 x369 >= 0 ;+-1 x369 +1 x370 >= 0 ;+-1 x370 +1 x371 >= 0 ;+-1 x371 +1 x372 >= 0 ;+-1 x372 +1 x373 >= 0 ;+-1 x373 +1 x374 >= 0 ;+-1 x374 +1 x375 >= 0 ;+-1 x375 +1 x376 >= 0 ;+-1 x377 +1 x378 >= 0 ;+-1 x378 +1 x379 >= 0 ;+-1 x379 +1 x380 >= 0 ;+-1 x380 +1 x381 >= 0 ;+-1 x381 +1 x382 >= 0 ;+-1 x382 +1 x383 >= 0 ;+-1 x383 +1 x384 >= 0 ;+-1 x384 +1 x385 >= 0 ;+-1 x385 +1 x386 >= 0 ;+-1 x386 +1 x387 >= 0 ;+-1 x387 +1 x388 >= 0 ;+-1 x388 +1 x389 >= 0 ;+-1 x389 +1 x390 >= 0 ;+-1 x390 +1 x391 >= 0 ;+-1 x391 +1 x392 >= 0 ;+-1 x392 +1 x393 >= 0 ;+-1 x393 +1 x394 >= 0 ;+-1 x394 +1 x395 >= 0 ;+-1 x395 +1 x396 >= 0 ;+-1 x396 +1 x397 >= 0 ;+-1 x397 +1 x398 >= 0 ;+-1 x398 +1 x399 >= 0 ;+-1 x399 +1 x400 >= 0 ;+-1 x400 +1 x401 >= 0 ;+-1 x401 +1 x402 >= 0 ;+-1 x402 +1 x403 >= 0 ;+-1 x403 +1 x404 >= 0 ;+-1 x404 +1 x405 >= 0 ;+-1 x405 +1 x406 >= 0 ;+-1 x406 +1 x407 >= 0 ;+-1 x407 +1 x408 >= 0 ;+-1 x408 +1 x409 >= 0 ;+-1 x409 +1 x410 >= 0 ;+-1 x410 +1 x411 >= 0 ;+-1 x411 +1 x412 >= 0 ;+-1 x412 +1 x413 >= 0 ;+-1 x413 +1 x414 >= 0 ;+-1 x414 +1 x415 >= 0 ;+-1 x415 +1 x416 >= 0 ;+-1 x416 +1 x417 >= 0 ;+-1 x417 +1 x418 >= 0 ;+-1 x418 +1 x419 >= 0 ;+-1 x419 +1 x420 >= 0 ;+-1 x420 +1 x421 >= 0 ;+-1 x421 +1 x422 >= 0 ;+-1 x422 +1 x423 >= 0 ;+-1 x423 +1 x424 >= 0 ;+-1 x424 +1 x425 >= 0 ;+-1 x425 +1 x426 >= 0 ;+-1 x426 +1 x427 >= 0 ;+-1 x427 +1 x428 >= 0 ;+-1 x428 +1 x429 >= 0 ;+-1 x429 +1 x430 >= 0 ;+-1 x430 +1 x431 >= 0 ;+-1 x431 +1 x432 >= 0 ;+-1 x432 +1 x433 >= 0 ;+-1 x433 +1 x434 >= 0 ;+-1 x434 +1 x435 >= 0 ;+-1 x435 +1 x436 >= 0 ;+-1 x436 +1 x437 >= 0 ;+-1 x437 +1 x438 >= 0 ;+-1 x438 +1 x439 >= 0 ;+-1 x439 +1 x440 >= 0 ;+-1 x440 +1 x441 >= 0 ;+-1 x441 +1 x442 >= 0 ;+-1 x442 +1 x443 >= 0 ;+-1 x443 +1 x444 >= 0 ;+-1 x444 +1 x445 >= 0 ;+-1 x445 +1 x446 >= 0 ;+-1 x446 +1 x447 >= 0 ;+-1 x447 +1 x448 >= 0 ;+-1 x448 +1 x449 >= 0 ;+-1 x449 +1 x450 >= 0 ;+-1 x450 +1 x451 >= 0 ;+-1 x451 +1 x452 >= 0 ;+-1 x452 +1 x453 >= 0 ;+-1 x453 +1 x454 >= 0 ;+-1 x454 +1 x455 >= 0 ;+-1 x455 +1 x456 >= 0 ;+-1 x456 +1 x457 >= 0 ;+-1 x457 +1 x458 >= 0 ;+-1 x458 +1 x459 >= 0 ;+-1 x459 +1 x460 >= 0 ;+-1 x460 +1 x461 >= 0 ;+-1 x461 +1 x462 >= 0 ;+-1 x462 +1 x463 >= 0 ;+-1 x463 +1 x464 >= 0 ;+-1 x464 +1 x465 >= 0 ;+-1 x465 +1 x466 >= 0 ;+-1 x466 +1 x467 >= 0 ;+-1 x467 +1 x468 >= 0 ;+-1 x468 +1 x469 >= 0 ;+-1 x469 +1 x470 >= 0 ;+-1 x471 +1 x472 >= 0 ;+-1 x472 +1 x473 >= 0 ;+-1 x473 +1 x474 >= 0 ;+-1 x474 +1 x475 >= 0 ;+-1 x475 +1 x476 >= 0 ;+-1 x476 +1 x477 >= 0 ;+-1 x477 +1 x478 >= 0 ;+-1 x478 +1 x479 >= 0 ;+-1 x479 +1 x480 >= 0 ;+-1 x480 +1 x481 >= 0 ;+-1 x481 +1 x482 >= 0 ;+-1 x482 +1 x483 >= 0 ;+-1 x483 +1 x484 >= 0 ;+-1 x484 +1 x485 >= 0 ;+-1 x485 +1 x486 >= 0 ;+-1 x486 +1 x487 >= 0 ;+-1 x487 +1 x488 >= 0 ;+-1 x488 +1 x489 >= 0 ;+-1 x489 +1 x490 >= 0 ;+-1 x490 +1 x491 >= 0 ;+-1 x491 +1 x492 >= 0 ;+-1 x492 +1 x493 >= 0 ;+-1 x493 +1 x494 >= 0 ;+-1 x494 +1 x495 >= 0 ;+-1 x495 +1 x496 >= 0 ;+-1 x496 +1 x497 >= 0 ;+-1 x497 +1 x498 >= 0 ;+-1 x498 +1 x499 >= 0 ;+-1 x499 +1 x500 >= 0 ;+-1 x500 +1 x501 >= 0 ;+-1 x501 +1 x502 >= 0 ;+-1 x502 +1 x503 >= 0 ;+-1 x503 +1 x504 >= 0 ;+-1 x504 +1 x505 >= 0 ;+-1 x505 +1 x506 >= 0 ;+-1 x506 +1 x507 >= 0 ;+-1 x507 +1 x508 >= 0 ;+-1 x508 +1 x509 >= 0 ;+-1 x509 +1 x510 >= 0 ;+-1 x510 +1 x511 >= 0 ;+-1 x511 +1 x512 >= 0 ;+-1 x512 +1 x513 >= 0 ;+-1 x513 +1 x514 >= 0 ;+-1 x514 +1 x515 >= 0 ;+-1 x515 +1 x516 >= 0 ;+-1 x516 +1 x517 >= 0 ;+-1 x517 +1 x518 >= 0 ;+-1 x518 +1 x519 >= 0 ;+-1 x519 +1 x520 >= 0 ;+-1 x520 +1 x521 >= 0 ;+-1 x521 +1 x522 >= 0 ;+-1 x522 +1 x523 >= 0 ;+-1 x523 +1 x524 >= 0 ;+-1 x524 +1 x525 >= 0 ;+-1 x525 +1 x526 >= 0 ;+-1 x526 +1 x527 >= 0 ;+-1 x527 +1 x528 >= 0 ;+-1 x528 +1 x529 >= 0 ;+-1 x529 +1 x530 >= 0 ;+-1 x530 +1 x531 >= 0 ;+-1 x531 +1 x532 >= 0 ;+-1 x532 +1 x533 >= 0 ;+-1 x533 +1 x534 >= 0 ;+-1 x534 +1 x535 >= 0 ;+-1 x535 +1 x536 >= 0 ;+-1 x536 +1 x537 >= 0 ;+-1 x537 +1 x538 >= 0 ;+-1 x538 +1 x539 >= 0 ;+-1 x539 +1 x540 >= 0 ;+-1 x540 +1 x541 >= 0 ;+-1 x541 +1 x542 >= 0 ;+-1 x542 +1 x543 >= 0 ;+-1 x543 +1 x544 >= 0 ;+-1 x544 +1 x545 >= 0 ;+-1 x545 +1 x546 >= 0 ;+-1 x546 +1 x547 >= 0 ;+-1 x547 +1 x548 >= 0 ;+-1 x548 +1 x549 >= 0 ;+-1 x549 +1 x550 >= 0 ;+-1 x550 +1 x551 >= 0 ;+-1 x551 +1 x552 >= 0 ;+-1 x552 +1 x553 >= 0 ;+-1 x553 +1 x554 >= 0 ;+-1 x554 +1 x555 >= 0 ;+-1 x555 +1 x556 >= 0 ;+-1 x556 +1 x557 >= 0 ;+-1 x557 +1 x558 >= 0 ;+-1 x558 +1 x559 >= 0 ;+-1 x559 +1 x560 >= 0 ;+-1 x560 +1 x561 >= 0 ;+-1 x561 +1 x562 >= 0 ;+-1 x562 +1 x563 >= 0 ;+-1 x563 +1 x564 >= 0 ;+-1 x565 +1 x566 >= 0 ;+-1 x566 +1 x567 >= 0 ;+-1 x567 +1 x568 >= 0 ;+-1 x568 +1 x569 >= 0 ;+-1 x569 +1 x570 >= 0 ;+-1 x570 +1 x571 >= 0 ;+-1 x571 +1 x572 >= 0 ;+-1 x572 +1 x573 >= 0 ;+-1 x573 +1 x574 >= 0 ;+-1 x574 +1 x575 >= 0 ;+-1 x575 +1 x576 >= 0 ;+-1 x576 +1 x577 >= 0 ;+-1 x577 +1 x578 >= 0 ;+-1 x578 +1 x579 >= 0 ;+-1 x579 +1 x580 >= 0 ;+-1 x580 +1 x581 >= 0 ;+-1 x581 +1 x582 >= 0 ;+-1 x582 +1 x583 >= 0 ;+-1 x583 +1 x584 >= 0 ;+-1 x584 +1 x585 >= 0 ;+-1 x585 +1 x586 >= 0 ;+-1 x586 +1 x587 >= 0 ;+-1 x587 +1 x588 >= 0 ;+-1 x588 +1 x589 >= 0 ;+-1 x589 +1 x590 >= 0 ;+-1 x590 +1 x591 >= 0 ;+-1 x591 +1 x592 >= 0 ;+-1 x592 +1 x593 >= 0 ;+-1 x593 +1 x594 >= 0 ;+-1 x594 +1 x595 >= 0 ;+-1 x595 +1 x596 >= 0 ;+-1 x596 +1 x597 >= 0 ;+-1 x597 +1 x598 >= 0 ;+-1 x598 +1 x599 >= 0 ;+-1 x599 +1 x600 >= 0 ;+-1 x600 +1 x601 >= 0 ;+-1 x601 +1 x602 >= 0 ;+-1 x602 +1 x603 >= 0 ;+-1 x603 +1 x604 >= 0 ;+-1 x604 +1 x605 >= 0 ;+-1 x605 +1 x606 >= 0 ;+-1 x606 +1 x607 >= 0 ;+-1 x607 +1 x608 >= 0 ;+-1 x608 +1 x609 >= 0 ;+-1 x609 +1 x610 >= 0 ;+-1 x610 +1 x611 >= 0 ;+-1 x611 +1 x612 >= 0 ;+-1 x612 +1 x613 >= 0 ;+-1 x613 +1 x614 >= 0 ;+-1 x614 +1 x615 >= 0 ;+-1 x615 +1 x616 >= 0 ;+-1 x616 +1 x617 >= 0 ;+-1 x617 +1 x618 >= 0 ;+-1 x618 +1 x619 >= 0 ;+-1 x619 +1 x620 >= 0 ;+-1 x620 +1 x621 >= 0 ;+-1 x621 +1 x622 >= 0 ;+-1 x622 +1 x623 >= 0 ;+-1 x623 +1 x624 >= 0 ;+-1 x624 +1 x625 >= 0 ;+-1 x625 +1 x626 >= 0 ;+-1 x626 +1 x627 >= 0 ;+-1 x627 +1 x628 >= 0 ;+-1 x628 +1 x629 >= 0 ;+-1 x629 +1 x630 >= 0 ;+-1 x630 +1 x631 >= 0 ;+-1 x631 +1 x632 >= 0 ;+-1 x632 +1 x633 >= 0 ;+-1 x633 +1 x634 >= 0 ;+-1 x634 +1 x635 >= 0 ;+-1 x635 +1 x636 >= 0 ;+-1 x636 +1 x637 >= 0 ;+-1 x637 +1 x638 >= 0 ;+-1 x638 +1 x639 >= 0 ;+-1 x639 +1 x640 >= 0 ;+-1 x640 +1 x641 >= 0 ;+-1 x641 +1 x642 >= 0 ;+-1 x642 +1 x643 >= 0 ;+-1 x643 +1 x644 >= 0 ;+-1 x644 +1 x645 >= 0 ;+-1 x645 +1 x646 >= 0 ;+-1 x646 +1 x647 >= 0 ;+-1 x647 +1 x648 >= 0 ;+-1 x648 +1 x649 >= 0 ;+-1 x649 +1 x650 >= 0 ;+-1 x650 +1 x651 >= 0 ;+-1 x651 +1 x652 >= 0 ;+-1 x652 +1 x653 >= 0 ;+-1 x653 +1 x654 >= 0 ;+-1 x654 +1 x655 >= 0 ;+-1 x655 +1 x656 >= 0 ;+-1 x656 +1 x657 >= 0 ;+-1 x657 +1 x658 >= 0 ;+-1 x659 +1 x660 >= 0 ;+-1 x660 +1 x661 >= 0 ;+-1 x661 +1 x662 >= 0 ;+-1 x662 +1 x663 >= 0 ;+-1 x663 +1 x664 >= 0 ;+-1 x664 +1 x665 >= 0 ;+-1 x665 +1 x666 >= 0 ;+-1 x666 +1 x667 >= 0 ;+-1 x667 +1 x668 >= 0 ;+-1 x668 +1 x669 >= 0 ;+-1 x669 +1 x670 >= 0 ;+-1 x670 +1 x671 >= 0 ;+-1 x671 +1 x672 >= 0 ;+-1 x672 +1 x673 >= 0 ;+-1 x673 +1 x674 >= 0 ;+-1 x674 +1 x675 >= 0 ;+-1 x675 +1 x676 >= 0 ;+-1 x676 +1 x677 >= 0 ;+-1 x677 +1 x678 >= 0 ;+-1 x678 +1 x679 >= 0 ;+-1 x679 +1 x680 >= 0 ;+-1 x680 +1 x681 >= 0 ;+-1 x681 +1 x682 >= 0 ;+-1 x682 +1 x683 >= 0 ;+-1 x683 +1 x684 >= 0 ;+-1 x684 +1 x685 >= 0 ;+-1 x685 +1 x686 >= 0 ;+-1 x686 +1 x687 >= 0 ;+-1 x687 +1 x688 >= 0 ;+-1 x688 +1 x689 >= 0 ;+-1 x689 +1 x690 >= 0 ;+-1 x690 +1 x691 >= 0 ;+-1 x691 +1 x692 >= 0 ;+-1 x692 +1 x693 >= 0 ;+-1 x693 +1 x694 >= 0 ;+-1 x694 +1 x695 >= 0 ;+-1 x695 +1 x696 >= 0 ;+-1 x696 +1 x697 >= 0 ;+-1 x697 +1 x698 >= 0 ;+-1 x698 +1 x699 >= 0 ;+-1 x699 +1 x700 >= 0 ;+-1 x700 +1 x701 >= 0 ;+-1 x701 +1 x702 >= 0 ;+-1 x702 +1 x703 >= 0 ;+-1 x703 +1 x704 >= 0 ;+-1 x704 +1 x705 >= 0 ;+-1 x705 +1 x706 >= 0 ;+-1 x706 +1 x707 >= 0 ;+-1 x707 +1 x708 >= 0 ;+-1 x708 +1 x709 >= 0 ;+-1 x709 +1 x710 >= 0 ;+-1 x710 +1 x711 >= 0 ;+-1 x711 +1 x712 >= 0 ;+-1 x712 +1 x713 >= 0 ;+-1 x713 +1 x714 >= 0 ;+-1 x714 +1 x715 >= 0 ;+-1 x715 +1 x716 >= 0 ;+-1 x716 +1 x717 >= 0 ;+-1 x717 +1 x718 >= 0 ;+-1 x718 +1 x719 >= 0 ;+-1 x719 +1 x720 >= 0 ;+-1 x720 +1 x721 >= 0 ;+-1 x721 +1 x722 >= 0 ;+-1 x722 +1 x723 >= 0 ;+-1 x723 +1 x724 >= 0 ;+-1 x724 +1 x725 >= 0 ;+-1 x725 +1 x726 >= 0 ;+-1 x726 +1 x727 >= 0 ;+-1 x727 +1 x728 >= 0 ;+-1 x728 +1 x729 >= 0 ;+-1 x729 +1 x730 >= 0 ;+-1 x730 +1 x731 >= 0 ;+-1 x731 +1 x732 >= 0 ;+-1 x732 +1 x733 >= 0 ;+-1 x733 +1 x734 >= 0 ;+-1 x734 +1 x735 >= 0 ;+-1 x735 +1 x736 >= 0 ;+-1 x736 +1 x737 >= 0 ;+-1 x737 +1 x738 >= 0 ;+-1 x738 +1 x739 >= 0 ;+-1 x739 +1 x740 >= 0 ;+-1 x740 +1 x741 >= 0 ;+-1 x741 +1 x742 >= 0 ;+-1 x742 +1 x743 >= 0 ;+-1 x743 +1 x744 >= 0 ;+-1 x744 +1 x745 >= 0 ;+-1 x745 +1 x746 >= 0 ;+-1 x746 +1 x747 >= 0 ;+-1 x747 +1 x748 >= 0 ;+-1 x748 +1 x749 >= 0 ;+-1 x749 +1 x750 >= 0 ;+-1 x750 +1 x751 >= 0 ;+-1 x751 +1 x752 >= 0 ;+-1 x753 +1 x754 >= 0 ;+-1 x754 +1 x755 >= 0 ;+-1 x755 +1 x756 >= 0 ;+-1 x756 +1 x757 >= 0 ;+-1 x757 +1 x758 >= 0 ;+-1 x758 +1 x759 >= 0 ;+-1 x759 +1 x760 >= 0 ;+-1 x760 +1 x761 >= 0 ;+-1 x761 +1 x762 >= 0 ;+-1 x762 +1 x763 >= 0 ;+-1 x763 +1 x764 >= 0 ;+-1 x764 +1 x765 >= 0 ;+-1 x765 +1 x766 >= 0 ;+-1 x766 +1 x767 >= 0 ;+-1 x767 +1 x768 >= 0 ;+-1 x768 +1 x769 >= 0 ;+-1 x769 +1 x770 >= 0 ;+-1 x770 +1 x771 >= 0 ;+-1 x771 +1 x772 >= 0 ;+-1 x772 +1 x773 >= 0 ;+-1 x773 +1 x774 >= 0 ;+-1 x774 +1 x775 >= 0 ;+-1 x775 +1 x776 >= 0 ;+-1 x776 +1 x777 >= 0 ;+-1 x777 +1 x778 >= 0 ;+-1 x778 +1 x779 >= 0 ;+-1 x779 +1 x780 >= 0 ;+-1 x780 +1 x781 >= 0 ;+-1 x781 +1 x782 >= 0 ;+-1 x782 +1 x783 >= 0 ;+-1 x783 +1 x784 >= 0 ;+-1 x784 +1 x785 >= 0 ;+-1 x785 +1 x786 >= 0 ;+-1 x786 +1 x787 >= 0 ;+-1 x787 +1 x788 >= 0 ;+-1 x788 +1 x789 >= 0 ;+-1 x789 +1 x790 >= 0 ;+-1 x790 +1 x791 >= 0 ;+-1 x791 +1 x792 >= 0 ;+-1 x792 +1 x793 >= 0 ;+-1 x793 +1 x794 >= 0 ;+-1 x794 +1 x795 >= 0 ;+-1 x795 +1 x796 >= 0 ;+-1 x796 +1 x797 >= 0 ;+-1 x797 +1 x798 >= 0 ;+-1 x798 +1 x799 >= 0 ;+-1 x799 +1 x800 >= 0 ;+-1 x800 +1 x801 >= 0 ;+-1 x801 +1 x802 >= 0 ;+-1 x802 +1 x803 >= 0 ;+-1 x803 +1 x804 >= 0 ;+-1 x804 +1 x805 >= 0 ;+-1 x805 +1 x806 >= 0 ;+-1 x806 +1 x807 >= 0 ;+-1 x807 +1 x808 >= 0 ;+-1 x808 +1 x809 >= 0 ;+-1 x809 +1 x810 >= 0 ;+-1 x810 +1 x811 >= 0 ;+-1 x811 +1 x812 >= 0 ;+-1 x812 +1 x813 >= 0 ;+-1 x813 +1 x814 >= 0 ;+-1 x814 +1 x815 >= 0 ;+-1 x815 +1 x816 >= 0 ;+-1 x816 +1 x817 >= 0 ;+-1 x817 +1 x818 >= 0 ;+-1 x818 +1 x819 >= 0 ;+-1 x819 +1 x820 >= 0 ;+-1 x820 +1 x821 >= 0 ;+-1 x821 +1 x822 >= 0 ;+-1 x822 +1 x823 >= 0 ;+-1 x823 +1 x824 >= 0 ;+-1 x824 +1 x825 >= 0 ;+-1 x825 +1 x826 >= 0 ;+-1 x826 +1 x827 >= 0 ;+-1 x827 +1 x828 >= 0 ;+-1 x828 +1 x829 >= 0 ;+-1 x829 +1 x830 >= 0 ;+-1 x830 +1 x831 >= 0 ;+-1 x831 +1 x832 >= 0 ;+-1 x832 +1 x833 >= 0 ;+-1 x833 +1 x834 >= 0 ;+-1 x834 +1 x835 >= 0 ;+-1 x835 +1 x836 >= 0 ;+-1 x836 +1 x837 >= 0 ;+-1 x837 +1 x838 >= 0 ;+-1 x838 +1 x839 >= 0 ;+-1 x839 +1 x840 >= 0 ;+-1 x840 +1 x841 >= 0 ;+-1 x841 +1 x842 >= 0 ;+-1 x842 +1 x843 >= 0 ;+-1 x843 +1 x844 >= 0 ;+-1 x844 +1 x845 >= 0 ;+-1 x845 +1 x846 >= 0 ;+-1 x847 +1 x848 >= 0 ;+-1 x848 +1 x849 >= 0 ;+-1 x849 +1 x850 >= 0 ;+-1 x850 +1 x851 >= 0 ;+-1 x851 +1 x852 >= 0 ;+-1 x852 +1 x853 >= 0 ;+-1 x853 +1 x854 >= 0 ;+-1 x854 +1 x855 >= 0 ;+-1 x855 +1 x856 >= 0 ;+-1 x856 +1 x857 >= 0 ;+-1 x857 +1 x858 >= 0 ;+-1 x858 +1 x859 >= 0 ;+-1 x859 +1 x860 >= 0 ;+-1 x860 +1 x861 >= 0 ;+-1 x861 +1 x862 >= 0 ;+-1 x862 +1 x863 >= 0 ;+-1 x863 +1 x864 >= 0 ;+-1 x864 +1 x865 >= 0 ;+-1 x865 +1 x866 >= 0 ;+-1 x866 +1 x867 >= 0 ;+-1 x867 +1 x868 >= 0 ;+-1 x868 +1 x869 >= 0 ;+-1 x869 +1 x870 >= 0 ;+-1 x870 +1 x871 >= 0 ;+-1 x871 +1 x872 >= 0 ;+-1 x872 +1 x873 >= 0 ;+-1 x873 +1 x874 >= 0 ;+-1 x874 +1 x875 >= 0 ;+-1 x875 +1 x876 >= 0 ;+-1 x876 +1 x877 >= 0 ;+-1 x877 +1 x878 >= 0 ;+-1 x878 +1 x879 >= 0 ;+-1 x879 +1 x880 >= 0 ;+-1 x880 +1 x881 >= 0 ;+-1 x881 +1 x882 >= 0 ;+-1 x882 +1 x883 >= 0 ;+-1 x883 +1 x884 >= 0 ;+-1 x884 +1 x885 >= 0 ;+-1 x885 +1 x886 >= 0 ;+-1 x886 +1 x887 >= 0 ;+-1 x887 +1 x888 >= 0 ;+-1 x888 +1 x889 >= 0 ;+-1 x889 +1 x890 >= 0 ;+-1 x890 +1 x891 >= 0 ;+-1 x891 +1 x892 >= 0 ;+-1 x892 +1 x893 >= 0 ;+-1 x893 +1 x894 >= 0 ;+-1 x894 +1 x895 >= 0 ;+-1 x895 +1 x896 >= 0 ;+-1 x896 +1 x897 >= 0 ;+-1 x897 +1 x898 >= 0 ;+-1 x898 +1 x899 >= 0 ;+-1 x899 +1 x900 >= 0 ;+-1 x900 +1 x901 >= 0 ;+-1 x901 +1 x902 >= 0 ;+-1 x902 +1 x903 >= 0 ;+-1 x903 +1 x904 >= 0 ;+-1 x904 +1 x905 >= 0 ;+-1 x905 +1 x906 >= 0 ;+-1 x906 +1 x907 >= 0 ;+-1 x907 +1 x908 >= 0 ;+-1 x908 +1 x909 >= 0 ;+-1 x909 +1 x910 >= 0 ;+-1 x910 +1 x911 >= 0 ;+-1 x911 +1 x912 >= 0 ;+-1 x912 +1 x913 >= 0 ;+-1 x913 +1 x914 >= 0 ;+-1 x914 +1 x915 >= 0 ;+-1 x915 +1 x916 >= 0 ;+-1 x916 +1 x917 >= 0 ;+-1 x917 +1 x918 >= 0 ;+-1 x918 +1 x919 >= 0 ;+-1 x919 +1 x920 >= 0 ;+-1 x920 +1 x921 >= 0 ;+-1 x921 +1 x922 >= 0 ;+-1 x922 +1 x923 >= 0 ;+-1 x923 +1 x924 >= 0 ;+-1 x924 +1 x925 >= 0 ;+-1 x925 +1 x926 >= 0 ;+-1 x926 +1 x927 >= 0 ;+-1 x927 +1 x928 >= 0 ;+-1 x928 +1 x929 >= 0 ;+-1 x929 +1 x930 >= 0 ;+-1 x930 +1 x931 >= 0 ;+-1 x931 +1 x932 >= 0 ;+-1 x932 +1 x933 >= 0 ;+-1 x933 +1 x934 >= 0 ;+-1 x934 +1 x935 >= 0 ;+-1 x935 +1 x936 >= 0 ;+-1 x936 +1 x937 >= 0 ;+-1 x937 +1 x938 >= 0 ;+-1 x938 +1 x939 >= 0 ;+-1 x939 +1 x940 >= 0 ;+-1 x941 +1 x942 >= 0 ;+-1 x942 +1 x943 >= 0 ;+-1 x943 +1 x944 >= 0 ;+-1 x944 +1 x945 >= 0 ;+-1 x945 +1 x946 >= 0 ;+-1 x946 +1 x947 >= 0 ;+-1 x947 +1 x948 >= 0 ;+-1 x948 +1 x949 >= 0 ;+-1 x949 +1 x950 >= 0 ;+-1 x950 +1 x951 >= 0 ;+-1 x951 +1 x952 >= 0 ;+-1 x952 +1 x953 >= 0 ;+-1 x953 +1 x954 >= 0 ;+-1 x954 +1 x955 >= 0 ;+-1 x955 +1 x956 >= 0 ;+-1 x956 +1 x957 >= 0 ;+-1 x957 +1 x958 >= 0 ;+-1 x958 +1 x959 >= 0 ;+-1 x959 +1 x960 >= 0 ;+-1 x960 +1 x961 >= 0 ;+-1 x961 +1 x962 >= 0 ;+-1 x962 +1 x963 >= 0 ;+-1 x963 +1 x964 >= 0 ;+-1 x964 +1 x965 >= 0 ;+-1 x965 +1 x966 >= 0 ;+-1 x966 +1 x967 >= 0 ;+-1 x967 +1 x968 >= 0 ;+-1 x968 +1 x969 >= 0 ;+-1 x969 +1 x970 >= 0 ;+-1 x970 +1 x971 >= 0 ;+-1 x971 +1 x972 >= 0 ;+-1 x972 +1 x973 >= 0 ;+-1 x973 +1 x974 >= 0 ;+-1 x974 +1 x975 >= 0 ;+-1 x975 +1 x976 >= 0 ;+-1 x976 +1 x977 >= 0 ;+-1 x977 +1 x978 >= 0 ;+-1 x978 +1 x979 >= 0 ;+-1 x979 +1 x980 >= 0 ;+-1 x980 +1 x981 >= 0 ;+-1 x981 +1 x982 >= 0 ;+-1 x982 +1 x983 >= 0 ;+-1 x983 +1 x984 >= 0 ;+-1 x984 +1 x985 >= 0 ;+-1 x985 +1 x986 >= 0 ;+-1 x986 +1 x987 >= 0 ;+-1 x987 +1 x988 >= 0 ;+-1 x988 +1 x989 >= 0 ;+-1 x989 +1 x990 >= 0 ;+-1 x990 +1 x991 >= 0 ;+-1 x991 +1 x992 >= 0 ;+-1 x992 +1 x993 >= 0 ;+-1 x993 +1 x994 >= 0 ;+-1 x994 +1 x995 >= 0 ;+-1 x995 +1 x996 >= 0 ;+-1 x996 +1 x997 >= 0 ;+-1 x997 +1 x998 >= 0 ;+-1 x998 +1 x999 >= 0 ;+-1 x999 +1 x1000 >= 0 ;+-1 x1000 +1 x1001 >= 0 ;+-1 x1001 +1 x1002 >= 0 ;+-1 x1002 +1 x1003 >= 0 ;+-1 x1003 +1 x1004 >= 0 ;+-1 x1004 +1 x1005 >= 0 ;+-1 x1005 +1 x1006 >= 0 ;+-1 x1006 +1 x1007 >= 0 ;+-1 x1007 +1 x1008 >= 0 ;+-1 x1008 +1 x1009 >= 0 ;+-1 x1009 +1 x1010 >= 0 ;+-1 x1010 +1 x1011 >= 0 ;+-1 x1011 +1 x1012 >= 0 ;+-1 x1012 +1 x1013 >= 0 ;+-1 x1013 +1 x1014 >= 0 ;+-1 x1014 +1 x1015 >= 0 ;+-1 x1015 +1 x1016 >= 0 ;+-1 x1016 +1 x1017 >= 0 ;+-1 x1017 +1 x1018 >= 0 ;+-1 x1018 +1 x1019 >= 0 ;+-1 x1019 +1 x1020 >= 0 ;+-1 x1020 +1 x1021 >= 0 ;+-1 x1021 +1 x1022 >= 0 ;+-1 x1022 +1 x1023 >= 0 ;+-1 x1023 +1 x1024 >= 0 ;+-1 x1024 +1 x1025 >= 0 ;+-1 x1025 +1 x1026 >= 0 ;+-1 x1026 +1 x1027 >= 0 ;+-1 x1027 +1 x1028 >= 0 ;+-1 x1028 +1 x1029 >= 0 ;+-1 x1029 +1 x1030 >= 0 ;+-1 x1030 +1 x1031 >= 0 ;+-1 x1031 +1 x1032 >= 0 ;+-1 x1032 +1 x1033 >= 0 ;+-1 x1033 +1 x1034 >= 0 ;+-1 x1035 +1 x1036 >= 0 ;+-1 x1036 +1 x1037 >= 0 ;+-1 x1037 +1 x1038 >= 0 ;+-1 x1038 +1 x1039 >= 0 ;+-1 x1039 +1 x1040 >= 0 ;+-1 x1040 +1 x1041 >= 0 ;+-1 x1041 +1 x1042 >= 0 ;+-1 x1042 +1 x1043 >= 0 ;+-1 x1043 +1 x1044 >= 0 ;+-1 x1044 +1 x1045 >= 0 ;+-1 x1045 +1 x1046 >= 0 ;+-1 x1046 +1 x1047 >= 0 ;+-1 x1047 +1 x1048 >= 0 ;+-1 x1048 +1 x1049 >= 0 ;+-1 x1049 +1 x1050 >= 0 ;+-1 x1050 +1 x1051 >= 0 ;+-1 x1051 +1 x1052 >= 0 ;+-1 x1052 +1 x1053 >= 0 ;+-1 x1053 +1 x1054 >= 0 ;+-1 x1054 +1 x1055 >= 0 ;+-1 x1055 +1 x1056 >= 0 ;+-1 x1056 +1 x1057 >= 0 ;+-1 x1057 +1 x1058 >= 0 ;+-1 x1058 +1 x1059 >= 0 ;+-1 x1059 +1 x1060 >= 0 ;+-1 x1060 +1 x1061 >= 0 ;+-1 x1061 +1 x1062 >= 0 ;+-1 x1062 +1 x1063 >= 0 ;+-1 x1063 +1 x1064 >= 0 ;+-1 x1064 +1 x1065 >= 0 ;+-1 x1065 +1 x1066 >= 0 ;+-1 x1066 +1 x1067 >= 0 ;+-1 x1067 +1 x1068 >= 0 ;+-1 x1068 +1 x1069 >= 0 ;+-1 x1069 +1 x1070 >= 0 ;+-1 x1070 +1 x1071 >= 0 ;+-1 x1071 +1 x1072 >= 0 ;+-1 x1072 +1 x1073 >= 0 ;+-1 x1073 +1 x1074 >= 0 ;+-1 x1074 +1 x1075 >= 0 ;+-1 x1075 +1 x1076 >= 0 ;+-1 x1076 +1 x1077 >= 0 ;+-1 x1077 +1 x1078 >= 0 ;+-1 x1078 +1 x1079 >= 0 ;+-1 x1079 +1 x1080 >= 0 ;+-1 x1080 +1 x1081 >= 0 ;+-1 x1081 +1 x1082 >= 0 ;+-1 x1082 +1 x1083 >= 0 ;+-1 x1083 +1 x1084 >= 0 ;+-1 x1084 +1 x1085 >= 0 ;+-1 x1085 +1 x1086 >= 0 ;+-1 x1086 +1 x1087 >= 0 ;+-1 x1087 +1 x1088 >= 0 ;+-1 x1088 +1 x1089 >= 0 ;+-1 x1089 +1 x1090 >= 0 ;+-1 x1090 +1 x1091 >= 0 ;+-1 x1091 +1 x1092 >= 0 ;+-1 x1092 +1 x1093 >= 0 ;+-1 x1093 +1 x1094 >= 0 ;+-1 x1094 +1 x1095 >= 0 ;+-1 x1095 +1 x1096 >= 0 ;+-1 x1096 +1 x1097 >= 0 ;+-1 x1097 +1 x1098 >= 0 ;+-1 x1098 +1 x1099 >= 0 ;+-1 x1099 +1 x1100 >= 0 ;+-1 x1100 +1 x1101 >= 0 ;+-1 x1101 +1 x1102 >= 0 ;+-1 x1102 +1 x1103 >= 0 ;+-1 x1103 +1 x1104 >= 0 ;+-1 x1104 +1 x1105 >= 0 ;+-1 x1105 +1 x1106 >= 0 ;+-1 x1106 +1 x1107 >= 0 ;+-1 x1107 +1 x1108 >= 0 ;+-1 x1108 +1 x1109 >= 0 ;+-1 x1109 +1 x1110 >= 0 ;+-1 x1110 +1 x1111 >= 0 ;+-1 x1111 +1 x1112 >= 0 ;+-1 x1112 +1 x1113 >= 0 ;+-1 x1113 +1 x1114 >= 0 ;+-1 x1114 +1 x1115 >= 0 ;+-1 x1115 +1 x1116 >= 0 ;+-1 x1116 +1 x1117 >= 0 ;+-1 x1117 +1 x1118 >= 0 ;+-1 x1118 +1 x1119 >= 0 ;+-1 x1119 +1 x1120 >= 0 ;+-1 x1120 +1 x1121 >= 0 ;+-1 x1121 +1 x1122 >= 0 ;+-1 x1122 +1 x1123 >= 0 ;+-1 x1123 +1 x1124 >= 0 ;+-1 x1124 +1 x1125 >= 0 ;+-1 x1125 +1 x1126 >= 0 ;+-1 x1126 +1 x1127 >= 0 ;+-1 x1127 +1 x1128 >= 0 ;+-1 x1129 +1 x1130 >= 0 ;+-1 x1130 +1 x1131 >= 0 ;+-1 x1131 +1 x1132 >= 0 ;+-1 x1132 +1 x1133 >= 0 ;+-1 x1133 +1 x1134 >= 0 ;+-1 x1134 +1 x1135 >= 0 ;+-1 x1135 +1 x1136 >= 0 ;+-1 x1136 +1 x1137 >= 0 ;+-1 x1137 +1 x1138 >= 0 ;+-1 x1138 +1 x1139 >= 0 ;+-1 x1139 +1 x1140 >= 0 ;+-1 x1140 +1 x1141 >= 0 ;+-1 x1141 +1 x1142 >= 0 ;+-1 x1142 +1 x1143 >= 0 ;+-1 x1143 +1 x1144 >= 0 ;+-1 x1144 +1 x1145 >= 0 ;+-1 x1145 +1 x1146 >= 0 ;+-1 x1146 +1 x1147 >= 0 ;+-1 x1147 +1 x1148 >= 0 ;+-1 x1148 +1 x1149 >= 0 ;+-1 x1149 +1 x1150 >= 0 ;+-1 x1150 +1 x1151 >= 0 ;+-1 x1151 +1 x1152 >= 0 ;+-1 x1152 +1 x1153 >= 0 ;+-1 x1153 +1 x1154 >= 0 ;+-1 x1154 +1 x1155 >= 0 ;+-1 x1155 +1 x1156 >= 0 ;+-1 x1156 +1 x1157 >= 0 ;+-1 x1157 +1 x1158 >= 0 ;+-1 x1158 +1 x1159 >= 0 ;+-1 x1159 +1 x1160 >= 0 ;+-1 x1160 +1 x1161 >= 0 ;+-1 x1161 +1 x1162 >= 0 ;+-1 x1162 +1 x1163 >= 0 ;+-1 x1163 +1 x1164 >= 0 ;+-1 x1164 +1 x1165 >= 0 ;+-1 x1165 +1 x1166 >= 0 ;+-1 x1166 +1 x1167 >= 0 ;+-1 x1167 +1 x1168 >= 0 ;+-1 x1168 +1 x1169 >= 0 ;+-1 x1169 +1 x1170 >= 0 ;+-1 x1170 +1 x1171 >= 0 ;+-1 x1171 +1 x1172 >= 0 ;+-1 x1172 +1 x1173 >= 0 ;+-1 x1173 +1 x1174 >= 0 ;+-1 x1174 +1 x1175 >= 0 ;+-1 x1175 +1 x1176 >= 0 ;+-1 x1176 +1 x1177 >= 0 ;+-1 x1177 +1 x1178 >= 0 ;+-1 x1178 +1 x1179 >= 0 ;+-1 x1179 +1 x1180 >= 0 ;+-1 x1180 +1 x1181 >= 0 ;+-1 x1181 +1 x1182 >= 0 ;+-1 x1182 +1 x1183 >= 0 ;+-1 x1183 +1 x1184 >= 0 ;+-1 x1184 +1 x1185 >= 0 ;+-1 x1185 +1 x1186 >= 0 ;+-1 x1186 +1 x1187 >= 0 ;+-1 x1187 +1 x1188 >= 0 ;+-1 x1188 +1 x1189 >= 0 ;+-1 x1189 +1 x1190 >= 0 ;+-1 x1190 +1 x1191 >= 0 ;+-1 x1191 +1 x1192 >= 0 ;+-1 x1192 +1 x1193 >= 0 ;+-1 x1193 +1 x1194 >= 0 ;+-1 x1194 +1 x1195 >= 0 ;+-1 x1195 +1 x1196 >= 0 ;+-1 x1196 +1 x1197 >= 0 ;+-1 x1197 +1 x1198 >= 0 ;+-1 x1198 +1 x1199 >= 0 ;+-1 x1199 +1 x1200 >= 0 ;+-1 x1200 +1 x1201 >= 0 ;+-1 x1201 +1 x1202 >= 0 ;+-1 x1202 +1 x1203 >= 0 ;+-1 x1203 +1 x1204 >= 0 ;+-1 x1204 +1 x1205 >= 0 ;+-1 x1205 +1 x1206 >= 0 ;+-1 x1206 +1 x1207 >= 0 ;+-1 x1207 +1 x1208 >= 0 ;+-1 x1208 +1 x1209 >= 0 ;+-1 x1209 +1 x1210 >= 0 ;+-1 x1210 +1 x1211 >= 0 ;+-1 x1211 +1 x1212 >= 0 ;+-1 x1212 +1 x1213 >= 0 ;+-1 x1213 +1 x1214 >= 0 ;+-1 x1214 +1 x1215 >= 0 ;+-1 x1215 +1 x1216 >= 0 ;+-1 x1216 +1 x1217 >= 0 ;+-1 x1217 +1 x1218 >= 0 ;+-1 x1218 +1 x1219 >= 0 ;+-1 x1219 +1 x1220 >= 0 ;+-1 x1220 +1 x1221 >= 0 ;+-1 x1221 +1 x1222 >= 0 ;+-1 x1223 +1 x1224 >= 0 ;+-1 x1224 +1 x1225 >= 0 ;+-1 x1225 +1 x1226 >= 0 ;+-1 x1226 +1 x1227 >= 0 ;+-1 x1227 +1 x1228 >= 0 ;+-1 x1228 +1 x1229 >= 0 ;+-1 x1229 +1 x1230 >= 0 ;+-1 x1230 +1 x1231 >= 0 ;+-1 x1231 +1 x1232 >= 0 ;+-1 x1232 +1 x1233 >= 0 ;+-1 x1233 +1 x1234 >= 0 ;+-1 x1234 +1 x1235 >= 0 ;+-1 x1235 +1 x1236 >= 0 ;+-1 x1236 +1 x1237 >= 0 ;+-1 x1237 +1 x1238 >= 0 ;+-1 x1238 +1 x1239 >= 0 ;+-1 x1239 +1 x1240 >= 0 ;+-1 x1240 +1 x1241 >= 0 ;+-1 x1241 +1 x1242 >= 0 ;+-1 x1242 +1 x1243 >= 0 ;+-1 x1243 +1 x1244 >= 0 ;+-1 x1244 +1 x1245 >= 0 ;+-1 x1245 +1 x1246 >= 0 ;+-1 x1246 +1 x1247 >= 0 ;+-1 x1247 +1 x1248 >= 0 ;+-1 x1248 +1 x1249 >= 0 ;+-1 x1249 +1 x1250 >= 0 ;+-1 x1250 +1 x1251 >= 0 ;+-1 x1251 +1 x1252 >= 0 ;+-1 x1252 +1 x1253 >= 0 ;+-1 x1253 +1 x1254 >= 0 ;+-1 x1254 +1 x1255 >= 0 ;+-1 x1255 +1 x1256 >= 0 ;+-1 x1256 +1 x1257 >= 0 ;+-1 x1257 +1 x1258 >= 0 ;+-1 x1258 +1 x1259 >= 0 ;+-1 x1259 +1 x1260 >= 0 ;+-1 x1260 +1 x1261 >= 0 ;+-1 x1261 +1 x1262 >= 0 ;+-1 x1262 +1 x1263 >= 0 ;+-1 x1263 +1 x1264 >= 0 ;+-1 x1264 +1 x1265 >= 0 ;+-1 x1265 +1 x1266 >= 0 ;+-1 x1266 +1 x1267 >= 0 ;+-1 x1267 +1 x1268 >= 0 ;+-1 x1268 +1 x1269 >= 0 ;+-1 x1269 +1 x1270 >= 0 ;+-1 x1270 +1 x1271 >= 0 ;+-1 x1271 +1 x1272 >= 0 ;+-1 x1272 +1 x1273 >= 0 ;+-1 x1273 +1 x1274 >= 0 ;+-1 x1274 +1 x1275 >= 0 ;+-1 x1275 +1 x1276 >= 0 ;+-1 x1276 +1 x1277 >= 0 ;+-1 x1277 +1 x1278 >= 0 ;+-1 x1278 +1 x1279 >= 0 ;+-1 x1279 +1 x1280 >= 0 ;+-1 x1280 +1 x1281 >= 0 ;+-1 x1281 +1 x1282 >= 0 ;+-1 x1282 +1 x1283 >= 0 ;+-1 x1283 +1 x1284 >= 0 ;+-1 x1284 +1 x1285 >= 0 ;+-1 x1285 +1 x1286 >= 0 ;+-1 x1286 +1 x1287 >= 0 ;+-1 x1287 +1 x1288 >= 0 ;+-1 x1288 +1 x1289 >= 0 ;+-1 x1289 +1 x1290 >= 0 ;+-1 x1290 +1 x1291 >= 0 ;+-1 x1291 +1 x1292 >= 0 ;+-1 x1292 +1 x1293 >= 0 ;+-1 x1293 +1 x1294 >= 0 ;+-1 x1294 +1 x1295 >= 0 ;+-1 x1295 +1 x1296 >= 0 ;+-1 x1296 +1 x1297 >= 0 ;+-1 x1297 +1 x1298 >= 0 ;+-1 x1298 +1 x1299 >= 0 ;+-1 x1299 +1 x1300 >= 0 ;+-1 x1300 +1 x1301 >= 0 ;+-1 x1301 +1 x1302 >= 0 ;+-1 x1302 +1 x1303 >= 0 ;+-1 x1303 +1 x1304 >= 0 ;+-1 x1304 +1 x1305 >= 0 ;+-1 x1305 +1 x1306 >= 0 ;+-1 x1306 +1 x1307 >= 0 ;+-1 x1307 +1 x1308 >= 0 ;+-1 x1308 +1 x1309 >= 0 ;+-1 x1309 +1 x1310 >= 0 ;+-1 x1310 +1 x1311 >= 0 ;+-1 x1311 +1 x1312 >= 0 ;+-1 x1312 +1 x1313 >= 0 ;+-1 x1313 +1 x1314 >= 0 ;+-1 x1314 +1 x1315 >= 0 ;+-1 x1315 +1 x1316 >= 0 ;+-1 x1317 +1 x1318 >= 0 ;+-1 x1318 +1 x1319 >= 0 ;+-1 x1319 +1 x1320 >= 0 ;+-1 x1320 +1 x1321 >= 0 ;+-1 x1321 +1 x1322 >= 0 ;+-1 x1322 +1 x1323 >= 0 ;+-1 x1323 +1 x1324 >= 0 ;+-1 x1324 +1 x1325 >= 0 ;+-1 x1325 +1 x1326 >= 0 ;+-1 x1326 +1 x1327 >= 0 ;+-1 x1327 +1 x1328 >= 0 ;+-1 x1328 +1 x1329 >= 0 ;+-1 x1329 +1 x1330 >= 0 ;+-1 x1330 +1 x1331 >= 0 ;+-1 x1331 +1 x1332 >= 0 ;+-1 x1332 +1 x1333 >= 0 ;+-1 x1333 +1 x1334 >= 0 ;+-1 x1334 +1 x1335 >= 0 ;+-1 x1335 +1 x1336 >= 0 ;+-1 x1336 +1 x1337 >= 0 ;+-1 x1337 +1 x1338 >= 0 ;+-1 x1338 +1 x1339 >= 0 ;+-1 x1339 +1 x1340 >= 0 ;+-1 x1340 +1 x1341 >= 0 ;+-1 x1341 +1 x1342 >= 0 ;+-1 x1342 +1 x1343 >= 0 ;+-1 x1343 +1 x1344 >= 0 ;+-1 x1344 +1 x1345 >= 0 ;+-1 x1345 +1 x1346 >= 0 ;+-1 x1346 +1 x1347 >= 0 ;+-1 x1347 +1 x1348 >= 0 ;+-1 x1348 +1 x1349 >= 0 ;+-1 x1349 +1 x1350 >= 0 ;+-1 x1350 +1 x1351 >= 0 ;+-1 x1351 +1 x1352 >= 0 ;+-1 x1352 +1 x1353 >= 0 ;+-1 x1353 +1 x1354 >= 0 ;+-1 x1354 +1 x1355 >= 0 ;+-1 x1355 +1 x1356 >= 0 ;+-1 x1356 +1 x1357 >= 0 ;+-1 x1357 +1 x1358 >= 0 ;+-1 x1358 +1 x1359 >= 0 ;+-1 x1359 +1 x1360 >= 0 ;+-1 x1360 +1 x1361 >= 0 ;+-1 x1361 +1 x1362 >= 0 ;+-1 x1362 +1 x1363 >= 0 ;+-1 x1363 +1 x1364 >= 0 ;+-1 x1364 +1 x1365 >= 0 ;+-1 x1365 +1 x1366 >= 0 ;+-1 x1366 +1 x1367 >= 0 ;+-1 x1367 +1 x1368 >= 0 ;+-1 x1368 +1 x1369 >= 0 ;+-1 x1369 +1 x1370 >= 0 ;+-1 x1370 +1 x1371 >= 0 ;+-1 x1371 +1 x1372 >= 0 ;+-1 x1372 +1 x1373 >= 0 ;+-1 x1373 +1 x1374 >= 0 ;+-1 x1374 +1 x1375 >= 0 ;+-1 x1375 +1 x1376 >= 0 ;+-1 x1376 +1 x1377 >= 0 ;+-1 x1377 +1 x1378 >= 0 ;+-1 x1378 +1 x1379 >= 0 ;+-1 x1379 +1 x1380 >= 0 ;+-1 x1380 +1 x1381 >= 0 ;+-1 x1381 +1 x1382 >= 0 ;+-1 x1382 +1 x1383 >= 0 ;+-1 x1383 +1 x1384 >= 0 ;+-1 x1384 +1 x1385 >= 0 ;+-1 x1385 +1 x1386 >= 0 ;+-1 x1386 +1 x1387 >= 0 ;+-1 x1387 +1 x1388 >= 0 ;+-1 x1388 +1 x1389 >= 0 ;+-1 x1389 +1 x1390 >= 0 ;+-1 x1390 +1 x1391 >= 0 ;+-1 x1391 +1 x1392 >= 0 ;+-1 x1392 +1 x1393 >= 0 ;+-1 x1393 +1 x1394 >= 0 ;+-1 x1394 +1 x1395 >= 0 ;+-1 x1395 +1 x1396 >= 0 ;+-1 x1396 +1 x1397 >= 0 ;+-1 x1397 +1 x1398 >= 0 ;+-1 x1398 +1 x1399 >= 0 ;+-1 x1399 +1 x1400 >= 0 ;+-1 x1400 +1 x1401 >= 0 ;+-1 x1401 +1 x1402 >= 0 ;+-1 x1402 +1 x1403 >= 0 ;+-1 x1403 +1 x1404 >= 0 ;+-1 x1404 +1 x1405 >= 0 ;+-1 x1405 +1 x1406 >= 0 ;+-1 x1406 +1 x1407 >= 0 ;+-1 x1407 +1 x1408 >= 0 ;+-1 x1408 +1 x1409 >= 0 ;+-1 x1409 +1 x1410 >= 0 ;+-1 x1411 +1 x1412 >= 0 ;+-1 x1412 +1 x1413 >= 0 ;+-1 x1413 +1 x1414 >= 0 ;+-1 x1414 +1 x1415 >= 0 ;+-1 x1415 +1 x1416 >= 0 ;+-1 x1416 +1 x1417 >= 0 ;+-1 x1417 +1 x1418 >= 0 ;+-1 x1418 +1 x1419 >= 0 ;+-1 x1419 +1 x1420 >= 0 ;+-1 x1420 +1 x1421 >= 0 ;+-1 x1421 +1 x1422 >= 0 ;+-1 x1422 +1 x1423 >= 0 ;+-1 x1423 +1 x1424 >= 0 ;+-1 x1424 +1 x1425 >= 0 ;+-1 x1425 +1 x1426 >= 0 ;+-1 x1426 +1 x1427 >= 0 ;+-1 x1427 +1 x1428 >= 0 ;+-1 x1428 +1 x1429 >= 0 ;+-1 x1429 +1 x1430 >= 0 ;+-1 x1430 +1 x1431 >= 0 ;+-1 x1431 +1 x1432 >= 0 ;+-1 x1432 +1 x1433 >= 0 ;+-1 x1433 +1 x1434 >= 0 ;+-1 x1434 +1 x1435 >= 0 ;+-1 x1435 +1 x1436 >= 0 ;+-1 x1436 +1 x1437 >= 0 ;+-1 x1437 +1 x1438 >= 0 ;+-1 x1438 +1 x1439 >= 0 ;+-1 x1439 +1 x1440 >= 0 ;+-1 x1440 +1 x1441 >= 0 ;+-1 x1441 +1 x1442 >= 0 ;+-1 x1442 +1 x1443 >= 0 ;+-1 x1443 +1 x1444 >= 0 ;+-1 x1444 +1 x1445 >= 0 ;+-1 x1445 +1 x1446 >= 0 ;+-1 x1446 +1 x1447 >= 0 ;+-1 x1447 +1 x1448 >= 0 ;+-1 x1448 +1 x1449 >= 0 ;+-1 x1449 +1 x1450 >= 0 ;+-1 x1450 +1 x1451 >= 0 ;+-1 x1451 +1 x1452 >= 0 ;+-1 x1452 +1 x1453 >= 0 ;+-1 x1453 +1 x1454 >= 0 ;+-1 x1454 +1 x1455 >= 0 ;+-1 x1455 +1 x1456 >= 0 ;+-1 x1456 +1 x1457 >= 0 ;+-1 x1457 +1 x1458 >= 0 ;+-1 x1458 +1 x1459 >= 0 ;+-1 x1459 +1 x1460 >= 0 ;+-1 x1460 +1 x1461 >= 0 ;+-1 x1461 +1 x1462 >= 0 ;+-1 x1462 +1 x1463 >= 0 ;+-1 x1463 +1 x1464 >= 0 ;+-1 x1464 +1 x1465 >= 0 ;+-1 x1465 +1 x1466 >= 0 ;+-1 x1466 +1 x1467 >= 0 ;+-1 x1467 +1 x1468 >= 0 ;+-1 x1468 +1 x1469 >= 0 ;+-1 x1469 +1 x1470 >= 0 ;+-1 x1470 +1 x1471 >= 0 ;+-1 x1471 +1 x1472 >= 0 ;+-1 x1472 +1 x1473 >= 0 ;+-1 x1473 +1 x1474 >= 0 ;+-1 x1474 +1 x1475 >= 0 ;+-1 x1475 +1 x1476 >= 0 ;+-1 x1476 +1 x1477 >= 0 ;+-1 x1477 +1 x1478 >= 0 ;+-1 x1478 +1 x1479 >= 0 ;+-1 x1479 +1 x1480 >= 0 ;+-1 x1480 +1 x1481 >= 0 ;+-1 x1481 +1 x1482 >= 0 ;+-1 x1482 +1 x1483 >= 0 ;+-1 x1483 +1 x1484 >= 0 ;+-1 x1484 +1 x1485 >= 0 ;+-1 x1485 +1 x1486 >= 0 ;+-1 x1486 +1 x1487 >= 0 ;+-1 x1487 +1 x1488 >= 0 ;+-1 x1488 +1 x1489 >= 0 ;+-1 x1489 +1 x1490 >= 0 ;+-1 x1490 +1 x1491 >= 0 ;+-1 x1491 +1 x1492 >= 0 ;+-1 x1492 +1 x1493 >= 0 ;+-1 x1493 +1 x1494 >= 0 ;+-1 x1494 +1 x1495 >= 0 ;+-1 x1495 +1 x1496 >= 0 ;+-1 x1496 +1 x1497 >= 0 ;+-1 x1497 +1 x1498 >= 0 ;+-1 x1498 +1 x1499 >= 0 ;+-1 x1499 +1 x1500 >= 0 ;+-1 x1500 +1 x1501 >= 0 ;+-1 x1501 +1 x1502 >= 0 ;+-1 x1502 +1 x1503 >= 0 ;+-1 x1503 +1 x1504 >= 0 ;+-1 x1505 +1 x1506 >= 0 ;+-1 x1506 +1 x1507 >= 0 ;+-1 x1507 +1 x1508 >= 0 ;+-1 x1508 +1 x1509 >= 0 ;+-1 x1509 +1 x1510 >= 0 ;+-1 x1510 +1 x1511 >= 0 ;+-1 x1511 +1 x1512 >= 0 ;+-1 x1512 +1 x1513 >= 0 ;+-1 x1513 +1 x1514 >= 0 ;+-1 x1514 +1 x1515 >= 0 ;+-1 x1515 +1 x1516 >= 0 ;+-1 x1516 +1 x1517 >= 0 ;+-1 x1517 +1 x1518 >= 0 ;+-1 x1518 +1 x1519 >= 0 ;+-1 x1519 +1 x1520 >= 0 ;+-1 x1520 +1 x1521 >= 0 ;+-1 x1521 +1 x1522 >= 0 ;+-1 x1522 +1 x1523 >= 0 ;+-1 x1523 +1 x1524 >= 0 ;+-1 x1524 +1 x1525 >= 0 ;+-1 x1525 +1 x1526 >= 0 ;+-1 x1526 +1 x1527 >= 0 ;+-1 x1527 +1 x1528 >= 0 ;+-1 x1528 +1 x1529 >= 0 ;+-1 x1529 +1 x1530 >= 0 ;+-1 x1530 +1 x1531 >= 0 ;+-1 x1531 +1 x1532 >= 0 ;+-1 x1532 +1 x1533 >= 0 ;+-1 x1533 +1 x1534 >= 0 ;+-1 x1534 +1 x1535 >= 0 ;+-1 x1535 +1 x1536 >= 0 ;+-1 x1536 +1 x1537 >= 0 ;+-1 x1537 +1 x1538 >= 0 ;+-1 x1538 +1 x1539 >= 0 ;+-1 x1539 +1 x1540 >= 0 ;+-1 x1540 +1 x1541 >= 0 ;+-1 x1541 +1 x1542 >= 0 ;+-1 x1542 +1 x1543 >= 0 ;+-1 x1543 +1 x1544 >= 0 ;+-1 x1544 +1 x1545 >= 0 ;+-1 x1545 +1 x1546 >= 0 ;+-1 x1546 +1 x1547 >= 0 ;+-1 x1547 +1 x1548 >= 0 ;+-1 x1548 +1 x1549 >= 0 ;+-1 x1549 +1 x1550 >= 0 ;+-1 x1550 +1 x1551 >= 0 ;+-1 x1551 +1 x1552 >= 0 ;+-1 x1552 +1 x1553 >= 0 ;+-1 x1553 +1 x1554 >= 0 ;+-1 x1554 +1 x1555 >= 0 ;+-1 x1555 +1 x1556 >= 0 ;+-1 x1556 +1 x1557 >= 0 ;+-1 x1557 +1 x1558 >= 0 ;+-1 x1558 +1 x1559 >= 0 ;+-1 x1559 +1 x1560 >= 0 ;+-1 x1560 +1 x1561 >= 0 ;+-1 x1561 +1 x1562 >= 0 ;+-1 x1562 +1 x1563 >= 0 ;+-1 x1563 +1 x1564 >= 0 ;+-1 x1564 +1 x1565 >= 0 ;+-1 x1565 +1 x1566 >= 0 ;+-1 x1566 +1 x1567 >= 0 ;+-1 x1567 +1 x1568 >= 0 ;+-1 x1568 +1 x1569 >= 0 ;+-1 x1569 +1 x1570 >= 0 ;+-1 x1570 +1 x1571 >= 0 ;+-1 x1571 +1 x1572 >= 0 ;+-1 x1572 +1 x1573 >= 0 ;+-1 x1573 +1 x1574 >= 0 ;+-1 x1574 +1 x1575 >= 0 ;+-1 x1575 +1 x1576 >= 0 ;+-1 x1576 +1 x1577 >= 0 ;+-1 x1577 +1 x1578 >= 0 ;+-1 x1578 +1 x1579 >= 0 ;+-1 x1579 +1 x1580 >= 0 ;+-1 x1580 +1 x1581 >= 0 ;+-1 x1581 +1 x1582 >= 0 ;+-1 x1582 +1 x1583 >= 0 ;+-1 x1583 +1 x1584 >= 0 ;+-1 x1584 +1 x1585 >= 0 ;+-1 x1585 +1 x1586 >= 0 ;+-1 x1586 +1 x1587 >= 0 ;+-1 x1587 +1 x1588 >= 0 ;+-1 x1588 +1 x1589 >= 0 ;+-1 x1589 +1 x1590 >= 0 ;+-1 x1590 +1 x1591 >= 0 ;+-1 x1591 +1 x1592 >= 0 ;+-1 x1592 +1 x1593 >= 0 ;+-1 x1593 +1 x1594 >= 0 ;+-1 x1594 +1 x1595 >= 0 ;+-1 x1595 +1 x1596 >= 0 ;+-1 x1596 +1 x1597 >= 0 ;+-1 x1597 +1 x1598 >= 0 ;+-1 x1599 +1 x1600 >= 0 ;+-1 x1600 +1 x1601 >= 0 ;+-1 x1601 +1 x1602 >= 0 ;+-1 x1602 +1 x1603 >= 0 ;+-1 x1603 +1 x1604 >= 0 ;+-1 x1604 +1 x1605 >= 0 ;+-1 x1605 +1 x1606 >= 0 ;+-1 x1606 +1 x1607 >= 0 ;+-1 x1607 +1 x1608 >= 0 ;+-1 x1608 +1 x1609 >= 0 ;+-1 x1609 +1 x1610 >= 0 ;+-1 x1610 +1 x1611 >= 0 ;+-1 x1611 +1 x1612 >= 0 ;+-1 x1612 +1 x1613 >= 0 ;+-1 x1613 +1 x1614 >= 0 ;+-1 x1614 +1 x1615 >= 0 ;+-1 x1615 +1 x1616 >= 0 ;+-1 x1616 +1 x1617 >= 0 ;+-1 x1617 +1 x1618 >= 0 ;+-1 x1618 +1 x1619 >= 0 ;+-1 x1619 +1 x1620 >= 0 ;+-1 x1620 +1 x1621 >= 0 ;+-1 x1621 +1 x1622 >= 0 ;+-1 x1622 +1 x1623 >= 0 ;+-1 x1623 +1 x1624 >= 0 ;+-1 x1624 +1 x1625 >= 0 ;+-1 x1625 +1 x1626 >= 0 ;+-1 x1626 +1 x1627 >= 0 ;+-1 x1627 +1 x1628 >= 0 ;+-1 x1628 +1 x1629 >= 0 ;+-1 x1629 +1 x1630 >= 0 ;+-1 x1630 +1 x1631 >= 0 ;+-1 x1631 +1 x1632 >= 0 ;+-1 x1632 +1 x1633 >= 0 ;+-1 x1633 +1 x1634 >= 0 ;+-1 x1634 +1 x1635 >= 0 ;+-1 x1635 +1 x1636 >= 0 ;+-1 x1636 +1 x1637 >= 0 ;+-1 x1637 +1 x1638 >= 0 ;+-1 x1638 +1 x1639 >= 0 ;+-1 x1639 +1 x1640 >= 0 ;+-1 x1640 +1 x1641 >= 0 ;+-1 x1641 +1 x1642 >= 0 ;+-1 x1642 +1 x1643 >= 0 ;+-1 x1643 +1 x1644 >= 0 ;+-1 x1644 +1 x1645 >= 0 ;+-1 x1645 +1 x1646 >= 0 ;+-1 x1646 +1 x1647 >= 0 ;+-1 x1647 +1 x1648 >= 0 ;+-1 x1648 +1 x1649 >= 0 ;+-1 x1649 +1 x1650 >= 0 ;+-1 x1650 +1 x1651 >= 0 ;+-1 x1651 +1 x1652 >= 0 ;+-1 x1652 +1 x1653 >= 0 ;+-1 x1653 +1 x1654 >= 0 ;+-1 x1654 +1 x1655 >= 0 ;+-1 x1655 +1 x1656 >= 0 ;+-1 x1656 +1 x1657 >= 0 ;+-1 x1657 +1 x1658 >= 0 ;+-1 x1658 +1 x1659 >= 0 ;+-1 x1659 +1 x1660 >= 0 ;+-1 x1660 +1 x1661 >= 0 ;+-1 x1661 +1 x1662 >= 0 ;+-1 x1662 +1 x1663 >= 0 ;+-1 x1663 +1 x1664 >= 0 ;+-1 x1664 +1 x1665 >= 0 ;+-1 x1665 +1 x1666 >= 0 ;+-1 x1666 +1 x1667 >= 0 ;+-1 x1667 +1 x1668 >= 0 ;+-1 x1668 +1 x1669 >= 0 ;+-1 x1669 +1 x1670 >= 0 ;+-1 x1670 +1 x1671 >= 0 ;+-1 x1671 +1 x1672 >= 0 ;+-1 x1672 +1 x1673 >= 0 ;+-1 x1673 +1 x1674 >= 0 ;+-1 x1674 +1 x1675 >= 0 ;+-1 x1675 +1 x1676 >= 0 ;+-1 x1676 +1 x1677 >= 0 ;+-1 x1677 +1 x1678 >= 0 ;+-1 x1678 +1 x1679 >= 0 ;+-1 x1679 +1 x1680 >= 0 ;+-1 x1680 +1 x1681 >= 0 ;+-1 x1681 +1 x1682 >= 0 ;+-1 x1682 +1 x1683 >= 0 ;+-1 x1683 +1 x1684 >= 0 ;+-1 x1684 +1 x1685 >= 0 ;+-1 x1685 +1 x1686 >= 0 ;+-1 x1686 +1 x1687 >= 0 ;+-1 x1687 +1 x1688 >= 0 ;+-1 x1688 +1 x1689 >= 0 ;+-1 x1689 +1 x1690 >= 0 ;+-1 x1690 +1 x1691 >= 0 ;+-1 x1691 +1 x1692 >= 0 ;+-1 x1693 +1 x1694 >= 0 ;+-1 x1694 +1 x1695 >= 0 ;+-1 x1695 +1 x1696 >= 0 ;+-1 x1696 +1 x1697 >= 0 ;+-1 x1697 +1 x1698 >= 0 ;+-1 x1698 +1 x1699 >= 0 ;+-1 x1699 +1 x1700 >= 0 ;+-1 x1700 +1 x1701 >= 0 ;+-1 x1701 +1 x1702 >= 0 ;+-1 x1702 +1 x1703 >= 0 ;+-1 x1703 +1 x1704 >= 0 ;+-1 x1704 +1 x1705 >= 0 ;+-1 x1705 +1 x1706 >= 0 ;+-1 x1706 +1 x1707 >= 0 ;+-1 x1707 +1 x1708 >= 0 ;+-1 x1708 +1 x1709 >= 0 ;+-1 x1709 +1 x1710 >= 0 ;+-1 x1710 +1 x1711 >= 0 ;+-1 x1711 +1 x1712 >= 0 ;+-1 x1712 +1 x1713 >= 0 ;+-1 x1713 +1 x1714 >= 0 ;+-1 x1714 +1 x1715 >= 0 ;+-1 x1715 +1 x1716 >= 0 ;+-1 x1716 +1 x1717 >= 0 ;+-1 x1717 +1 x1718 >= 0 ;+-1 x1718 +1 x1719 >= 0 ;+-1 x1719 +1 x1720 >= 0 ;+-1 x1720 +1 x1721 >= 0 ;+-1 x1721 +1 x1722 >= 0 ;+-1 x1722 +1 x1723 >= 0 ;+-1 x1723 +1 x1724 >= 0 ;+-1 x1724 +1 x1725 >= 0 ;+-1 x1725 +1 x1726 >= 0 ;+-1 x1726 +1 x1727 >= 0 ;+-1 x1727 +1 x1728 >= 0 ;+-1 x1728 +1 x1729 >= 0 ;+-1 x1729 +1 x1730 >= 0 ;+-1 x1730 +1 x1731 >= 0 ;+-1 x1731 +1 x1732 >= 0 ;+-1 x1732 +1 x1733 >= 0 ;+-1 x1733 +1 x1734 >= 0 ;+-1 x1734 +1 x1735 >= 0 ;+-1 x1735 +1 x1736 >= 0 ;+-1 x1736 +1 x1737 >= 0 ;+-1 x1737 +1 x1738 >= 0 ;+-1 x1738 +1 x1739 >= 0 ;+-1 x1739 +1 x1740 >= 0 ;+-1 x1740 +1 x1741 >= 0 ;+-1 x1741 +1 x1742 >= 0 ;+-1 x1742 +1 x1743 >= 0 ;+-1 x1743 +1 x1744 >= 0 ;+-1 x1744 +1 x1745 >= 0 ;+-1 x1745 +1 x1746 >= 0 ;+-1 x1746 +1 x1747 >= 0 ;+-1 x1747 +1 x1748 >= 0 ;+-1 x1748 +1 x1749 >= 0 ;+-1 x1749 +1 x1750 >= 0 ;+-1 x1750 +1 x1751 >= 0 ;+-1 x1751 +1 x1752 >= 0 ;+-1 x1752 +1 x1753 >= 0 ;+-1 x1753 +1 x1754 >= 0 ;+-1 x1754 +1 x1755 >= 0 ;+-1 x1755 +1 x1756 >= 0 ;+-1 x1756 +1 x1757 >= 0 ;+-1 x1757 +1 x1758 >= 0 ;+-1 x1758 +1 x1759 >= 0 ;+-1 x1759 +1 x1760 >= 0 ;+-1 x1760 +1 x1761 >= 0 ;+-1 x1761 +1 x1762 >= 0 ;+-1 x1762 +1 x1763 >= 0 ;+-1 x1763 +1 x1764 >= 0 ;+-1 x1764 +1 x1765 >= 0 ;+-1 x1765 +1 x1766 >= 0 ;+-1 x1766 +1 x1767 >= 0 ;+-1 x1767 +1 x1768 >= 0 ;+-1 x1768 +1 x1769 >= 0 ;+-1 x1769 +1 x1770 >= 0 ;+-1 x1770 +1 x1771 >= 0 ;+-1 x1771 +1 x1772 >= 0 ;+-1 x1772 +1 x1773 >= 0 ;+-1 x1773 +1 x1774 >= 0 ;+-1 x1774 +1 x1775 >= 0 ;+-1 x1775 +1 x1776 >= 0 ;+-1 x1776 +1 x1777 >= 0 ;+-1 x1777 +1 x1778 >= 0 ;+-1 x1778 +1 x1779 >= 0 ;+-1 x1779 +1 x1780 >= 0 ;+-1 x1780 +1 x1781 >= 0 ;+-1 x1781 +1 x1782 >= 0 ;+-1 x1782 +1 x1783 >= 0 ;+-1 x1783 +1 x1784 >= 0 ;+-1 x1784 +1 x1785 >= 0 ;+-1 x1785 +1 x1786 >= 0 ;+-1 x1787 +1 x1788 >= 0 ;+-1 x1788 +1 x1789 >= 0 ;+-1 x1789 +1 x1790 >= 0 ;+-1 x1790 +1 x1791 >= 0 ;+-1 x1791 +1 x1792 >= 0 ;+-1 x1792 +1 x1793 >= 0 ;+-1 x1793 +1 x1794 >= 0 ;+-1 x1794 +1 x1795 >= 0 ;+-1 x1795 +1 x1796 >= 0 ;+-1 x1796 +1 x1797 >= 0 ;+-1 x1797 +1 x1798 >= 0 ;+-1 x1798 +1 x1799 >= 0 ;+-1 x1799 +1 x1800 >= 0 ;+-1 x1800 +1 x1801 >= 0 ;+-1 x1801 +1 x1802 >= 0 ;+-1 x1802 +1 x1803 >= 0 ;+-1 x1803 +1 x1804 >= 0 ;+-1 x1804 +1 x1805 >= 0 ;+-1 x1805 +1 x1806 >= 0 ;+-1 x1806 +1 x1807 >= 0 ;+-1 x1807 +1 x1808 >= 0 ;+-1 x1808 +1 x1809 >= 0 ;+-1 x1809 +1 x1810 >= 0 ;+-1 x1810 +1 x1811 >= 0 ;+-1 x1811 +1 x1812 >= 0 ;+-1 x1812 +1 x1813 >= 0 ;+-1 x1813 +1 x1814 >= 0 ;+-1 x1814 +1 x1815 >= 0 ;+-1 x1815 +1 x1816 >= 0 ;+-1 x1816 +1 x1817 >= 0 ;+-1 x1817 +1 x1818 >= 0 ;+-1 x1818 +1 x1819 >= 0 ;+-1 x1819 +1 x1820 >= 0 ;+-1 x1820 +1 x1821 >= 0 ;+-1 x1821 +1 x1822 >= 0 ;+-1 x1822 +1 x1823 >= 0 ;+-1 x1823 +1 x1824 >= 0 ;+-1 x1824 +1 x1825 >= 0 ;+-1 x1825 +1 x1826 >= 0 ;+-1 x1826 +1 x1827 >= 0 ;+-1 x1827 +1 x1828 >= 0 ;+-1 x1828 +1 x1829 >= 0 ;+-1 x1829 +1 x1830 >= 0 ;+-1 x1830 +1 x1831 >= 0 ;+-1 x1831 +1 x1832 >= 0 ;+-1 x1832 +1 x1833 >= 0 ;+-1 x1833 +1 x1834 >= 0 ;+-1 x1834 +1 x1835 >= 0 ;+-1 x1835 +1 x1836 >= 0 ;+-1 x1836 +1 x1837 >= 0 ;+-1 x1837 +1 x1838 >= 0 ;+-1 x1838 +1 x1839 >= 0 ;+-1 x1839 +1 x1840 >= 0 ;+-1 x1840 +1 x1841 >= 0 ;+-1 x1841 +1 x1842 >= 0 ;+-1 x1842 +1 x1843 >= 0 ;+-1 x1843 +1 x1844 >= 0 ;+-1 x1844 +1 x1845 >= 0 ;+-1 x1845 +1 x1846 >= 0 ;+-1 x1846 +1 x1847 >= 0 ;+-1 x1847 +1 x1848 >= 0 ;+-1 x1848 +1 x1849 >= 0 ;+-1 x1849 +1 x1850 >= 0 ;+-1 x1850 +1 x1851 >= 0 ;+-1 x1851 +1 x1852 >= 0 ;+-1 x1852 +1 x1853 >= 0 ;+-1 x1853 +1 x1854 >= 0 ;+-1 x1854 +1 x1855 >= 0 ;+-1 x1855 +1 x1856 >= 0 ;+-1 x1856 +1 x1857 >= 0 ;+-1 x1857 +1 x1858 >= 0 ;+-1 x1858 +1 x1859 >= 0 ;+-1 x1859 +1 x1860 >= 0 ;+-1 x1860 +1 x1861 >= 0 ;+-1 x1861 +1 x1862 >= 0 ;+-1 x1862 +1 x1863 >= 0 ;+-1 x1863 +1 x1864 >= 0 ;+-1 x1864 +1 x1865 >= 0 ;+-1 x1865 +1 x1866 >= 0 ;+-1 x1866 +1 x1867 >= 0 ;+-1 x1867 +1 x1868 >= 0 ;+-1 x1868 +1 x1869 >= 0 ;+-1 x1869 +1 x1870 >= 0 ;+-1 x1870 +1 x1871 >= 0 ;+-1 x1871 +1 x1872 >= 0 ;+-1 x1872 +1 x1873 >= 0 ;+-1 x1873 +1 x1874 >= 0 ;+-1 x1874 +1 x1875 >= 0 ;+-1 x1875 +1 x1876 >= 0 ;+-1 x1876 +1 x1877 >= 0 ;+-1 x1877 +1 x1878 >= 0 ;+-1 x1878 +1 x1879 >= 0 ;+-1 x1879 +1 x1880 >= 0 ;+-1 x1881 +1 x1882 >= 0 ;+-1 x1882 +1 x1883 >= 0 ;+-1 x1883 +1 x1884 >= 0 ;+-1 x1884 +1 x1885 >= 0 ;+-1 x1885 +1 x1886 >= 0 ;+-1 x1886 +1 x1887 >= 0 ;+-1 x1887 +1 x1888 >= 0 ;+-1 x1888 +1 x1889 >= 0 ;+-1 x1889 +1 x1890 >= 0 ;+-1 x1890 +1 x1891 >= 0 ;+-1 x1891 +1 x1892 >= 0 ;+-1 x1892 +1 x1893 >= 0 ;+-1 x1893 +1 x1894 >= 0 ;+-1 x1894 +1 x1895 >= 0 ;+-1 x1895 +1 x1896 >= 0 ;+-1 x1896 +1 x1897 >= 0 ;+-1 x1897 +1 x1898 >= 0 ;+-1 x1898 +1 x1899 >= 0 ;+-1 x1899 +1 x1900 >= 0 ;+-1 x1900 +1 x1901 >= 0 ;+-1 x1901 +1 x1902 >= 0 ;+-1 x1902 +1 x1903 >= 0 ;+-1 x1903 +1 x1904 >= 0 ;+-1 x1904 +1 x1905 >= 0 ;+-1 x1905 +1 x1906 >= 0 ;+-1 x1906 +1 x1907 >= 0 ;+-1 x1907 +1 x1908 >= 0 ;+-1 x1908 +1 x1909 >= 0 ;+-1 x1909 +1 x1910 >= 0 ;+-1 x1910 +1 x1911 >= 0 ;+-1 x1911 +1 x1912 >= 0 ;+-1 x1912 +1 x1913 >= 0 ;+-1 x1913 +1 x1914 >= 0 ;+-1 x1914 +1 x1915 >= 0 ;+-1 x1915 +1 x1916 >= 0 ;+-1 x1916 +1 x1917 >= 0 ;+-1 x1917 +1 x1918 >= 0 ;+-1 x1918 +1 x1919 >= 0 ;+-1 x1919 +1 x1920 >= 0 ;+-1 x1920 +1 x1921 >= 0 ;+-1 x1921 +1 x1922 >= 0 ;+-1 x1922 +1 x1923 >= 0 ;+-1 x1923 +1 x1924 >= 0 ;+-1 x1924 +1 x1925 >= 0 ;+-1 x1925 +1 x1926 >= 0 ;+-1 x1926 +1 x1927 >= 0 ;+-1 x1927 +1 x1928 >= 0 ;+-1 x1928 +1 x1929 >= 0 ;+-1 x1929 +1 x1930 >= 0 ;+-1 x1930 +1 x1931 >= 0 ;+-1 x1931 +1 x1932 >= 0 ;+-1 x1932 +1 x1933 >= 0 ;+-1 x1933 +1 x1934 >= 0 ;+-1 x1934 +1 x1935 >= 0 ;+-1 x1935 +1 x1936 >= 0 ;+-1 x1936 +1 x1937 >= 0 ;+-1 x1937 +1 x1938 >= 0 ;+-1 x1938 +1 x1939 >= 0 ;+-1 x1939 +1 x1940 >= 0 ;+-1 x1940 +1 x1941 >= 0 ;+-1 x1941 +1 x1942 >= 0 ;+-1 x1942 +1 x1943 >= 0 ;+-1 x1943 +1 x1944 >= 0 ;+-1 x1944 +1 x1945 >= 0 ;+-1 x1945 +1 x1946 >= 0 ;+-1 x1946 +1 x1947 >= 0 ;+-1 x1947 +1 x1948 >= 0 ;+-1 x1948 +1 x1949 >= 0 ;+-1 x1949 +1 x1950 >= 0 ;+-1 x1950 +1 x1951 >= 0 ;+-1 x1951 +1 x1952 >= 0 ;+-1 x1952 +1 x1953 >= 0 ;+-1 x1953 +1 x1954 >= 0 ;+-1 x1954 +1 x1955 >= 0 ;+-1 x1955 +1 x1956 >= 0 ;+-1 x1956 +1 x1957 >= 0 ;+-1 x1957 +1 x1958 >= 0 ;+-1 x1958 +1 x1959 >= 0 ;+-1 x1959 +1 x1960 >= 0 ;+-1 x1960 +1 x1961 >= 0 ;+-1 x1961 +1 x1962 >= 0 ;+-1 x1962 +1 x1963 >= 0 ;+-1 x1963 +1 x1964 >= 0 ;+-1 x1964 +1 x1965 >= 0 ;+-1 x1965 +1 x1966 >= 0 ;+-1 x1966 +1 x1967 >= 0 ;+-1 x1967 +1 x1968 >= 0 ;+-1 x1968 +1 x1969 >= 0 ;+-1 x1969 +1 x1970 >= 0 ;+-1 x1970 +1 x1971 >= 0 ;+-1 x1971 +1 x1972 >= 0 ;+-1 x1972 +1 x1973 >= 0 ;+-1 x1973 +1 x1974 >= 0 ;+-1 x1975 +1 x1976 >= 0 ;+-1 x1976 +1 x1977 >= 0 ;+-1 x1977 +1 x1978 >= 0 ;+-1 x1978 +1 x1979 >= 0 ;+-1 x1979 +1 x1980 >= 0 ;+-1 x1980 +1 x1981 >= 0 ;+-1 x1981 +1 x1982 >= 0 ;+-1 x1982 +1 x1983 >= 0 ;+-1 x1983 +1 x1984 >= 0 ;+-1 x1984 +1 x1985 >= 0 ;+-1 x1985 +1 x1986 >= 0 ;+-1 x1986 +1 x1987 >= 0 ;+-1 x1987 +1 x1988 >= 0 ;+-1 x1988 +1 x1989 >= 0 ;+-1 x1989 +1 x1990 >= 0 ;+-1 x1990 +1 x1991 >= 0 ;+-1 x1991 +1 x1992 >= 0 ;+-1 x1992 +1 x1993 >= 0 ;+-1 x1993 +1 x1994 >= 0 ;+-1 x1994 +1 x1995 >= 0 ;+-1 x1995 +1 x1996 >= 0 ;+-1 x1996 +1 x1997 >= 0 ;+-1 x1997 +1 x1998 >= 0 ;+-1 x1998 +1 x1999 >= 0 ;+-1 x1999 +1 x2000 >= 0 ;+-1 x2000 +1 x2001 >= 0 ;+-1 x2001 +1 x2002 >= 0 ;+-1 x2002 +1 x2003 >= 0 ;+-1 x2003 +1 x2004 >= 0 ;+-1 x2004 +1 x2005 >= 0 ;+-1 x2005 +1 x2006 >= 0 ;+-1 x2006 +1 x2007 >= 0 ;+-1 x2007 +1 x2008 >= 0 ;+-1 x2008 +1 x2009 >= 0 ;+-1 x2009 +1 x2010 >= 0 ;+-1 x2010 +1 x2011 >= 0 ;+-1 x2011 +1 x2012 >= 0 ;+-1 x2012 +1 x2013 >= 0 ;+-1 x2013 +1 x2014 >= 0 ;+-1 x2014 +1 x2015 >= 0 ;+-1 x2015 +1 x2016 >= 0 ;+-1 x2016 +1 x2017 >= 0 ;+-1 x2017 +1 x2018 >= 0 ;+-1 x2018 +1 x2019 >= 0 ;+-1 x2019 +1 x2020 >= 0 ;+-1 x2020 +1 x2021 >= 0 ;+-1 x2021 +1 x2022 >= 0 ;+-1 x2022 +1 x2023 >= 0 ;+-1 x2023 +1 x2024 >= 0 ;+-1 x2024 +1 x2025 >= 0 ;+-1 x2025 +1 x2026 >= 0 ;+-1 x2026 +1 x2027 >= 0 ;+-1 x2027 +1 x2028 >= 0 ;+-1 x2028 +1 x2029 >= 0 ;+-1 x2029 +1 x2030 >= 0 ;+-1 x2030 +1 x2031 >= 0 ;+-1 x2031 +1 x2032 >= 0 ;+-1 x2032 +1 x2033 >= 0 ;+-1 x2033 +1 x2034 >= 0 ;+-1 x2034 +1 x2035 >= 0 ;+-1 x2035 +1 x2036 >= 0 ;+-1 x2036 +1 x2037 >= 0 ;+-1 x2037 +1 x2038 >= 0 ;+-1 x2038 +1 x2039 >= 0 ;+-1 x2039 +1 x2040 >= 0 ;+-1 x2040 +1 x2041 >= 0 ;+-1 x2041 +1 x2042 >= 0 ;+-1 x2042 +1 x2043 >= 0 ;+-1 x2043 +1 x2044 >= 0 ;+-1 x2044 +1 x2045 >= 0 ;+-1 x2045 +1 x2046 >= 0 ;+-1 x2046 +1 x2047 >= 0 ;+-1 x2047 +1 x2048 >= 0 ;+-1 x2048 +1 x2049 >= 0 ;+-1 x2049 +1 x2050 >= 0 ;+-1 x2050 +1 x2051 >= 0 ;+-1 x2051 +1 x2052 >= 0 ;+-1 x2052 +1 x2053 >= 0 ;+-1 x2053 +1 x2054 >= 0 ;+-1 x2054 +1 x2055 >= 0 ;+-1 x2055 +1 x2056 >= 0 ;+-1 x2056 +1 x2057 >= 0 ;+-1 x2057 +1 x2058 >= 0 ;+-1 x2058 +1 x2059 >= 0 ;+-1 x2059 +1 x2060 >= 0 ;+-1 x2060 +1 x2061 >= 0 ;+-1 x2061 +1 x2062 >= 0 ;+-1 x2062 +1 x2063 >= 0 ;+-1 x2063 +1 x2064 >= 0 ;+-1 x2064 +1 x2065 >= 0 ;+-1 x2065 +1 x2066 >= 0 ;+-1 x2066 +1 x2067 >= 0 ;+-1 x2067 +1 x2068 >= 0 ;+-1 x2069 +1 x2070 >= 0 ;+-1 x2070 +1 x2071 >= 0 ;+-1 x2071 +1 x2072 >= 0 ;+-1 x2072 +1 x2073 >= 0 ;+-1 x2073 +1 x2074 >= 0 ;+-1 x2074 +1 x2075 >= 0 ;+-1 x2075 +1 x2076 >= 0 ;+-1 x2076 +1 x2077 >= 0 ;+-1 x2077 +1 x2078 >= 0 ;+-1 x2078 +1 x2079 >= 0 ;+-1 x2079 +1 x2080 >= 0 ;+-1 x2080 +1 x2081 >= 0 ;+-1 x2081 +1 x2082 >= 0 ;+-1 x2082 +1 x2083 >= 0 ;+-1 x2083 +1 x2084 >= 0 ;+-1 x2084 +1 x2085 >= 0 ;+-1 x2085 +1 x2086 >= 0 ;+-1 x2086 +1 x2087 >= 0 ;+-1 x2087 +1 x2088 >= 0 ;+-1 x2088 +1 x2089 >= 0 ;+-1 x2089 +1 x2090 >= 0 ;+-1 x2090 +1 x2091 >= 0 ;+-1 x2091 +1 x2092 >= 0 ;+-1 x2092 +1 x2093 >= 0 ;+-1 x2093 +1 x2094 >= 0 ;+-1 x2094 +1 x2095 >= 0 ;+-1 x2095 +1 x2096 >= 0 ;+-1 x2096 +1 x2097 >= 0 ;+-1 x2097 +1 x2098 >= 0 ;+-1 x2098 +1 x2099 >= 0 ;+-1 x2099 +1 x2100 >= 0 ;+-1 x2100 +1 x2101 >= 0 ;+-1 x2101 +1 x2102 >= 0 ;+-1 x2102 +1 x2103 >= 0 ;+-1 x2103 +1 x2104 >= 0 ;+-1 x2104 +1 x2105 >= 0 ;+-1 x2105 +1 x2106 >= 0 ;+-1 x2106 +1 x2107 >= 0 ;+-1 x2107 +1 x2108 >= 0 ;+-1 x2108 +1 x2109 >= 0 ;+-1 x2109 +1 x2110 >= 0 ;+-1 x2110 +1 x2111 >= 0 ;+-1 x2111 +1 x2112 >= 0 ;+-1 x2112 +1 x2113 >= 0 ;+-1 x2113 +1 x2114 >= 0 ;+-1 x2114 +1 x2115 >= 0 ;+-1 x2115 +1 x2116 >= 0 ;+-1 x2116 +1 x2117 >= 0 ;+-1 x2117 +1 x2118 >= 0 ;+-1 x2118 +1 x2119 >= 0 ;+-1 x2119 +1 x2120 >= 0 ;+-1 x2120 +1 x2121 >= 0 ;+-1 x2121 +1 x2122 >= 0 ;+-1 x2122 +1 x2123 >= 0 ;+-1 x2123 +1 x2124 >= 0 ;+-1 x2124 +1 x2125 >= 0 ;+-1 x2125 +1 x2126 >= 0 ;+-1 x2126 +1 x2127 >= 0 ;+-1 x2127 +1 x2128 >= 0 ;+-1 x2128 +1 x2129 >= 0 ;+-1 x2129 +1 x2130 >= 0 ;+-1 x2130 +1 x2131 >= 0 ;+-1 x2131 +1 x2132 >= 0 ;+-1 x2132 +1 x2133 >= 0 ;+-1 x2133 +1 x2134 >= 0 ;+-1 x2134 +1 x2135 >= 0 ;+-1 x2135 +1 x2136 >= 0 ;+-1 x2136 +1 x2137 >= 0 ;+-1 x2137 +1 x2138 >= 0 ;+-1 x2138 +1 x2139 >= 0 ;+-1 x2139 +1 x2140 >= 0 ;+-1 x2140 +1 x2141 >= 0 ;+-1 x2141 +1 x2142 >= 0 ;+-1 x2142 +1 x2143 >= 0 ;+-1 x2143 +1 x2144 >= 0 ;+-1 x2144 +1 x2145 >= 0 ;+-1 x2145 +1 x2146 >= 0 ;+-1 x2146 +1 x2147 >= 0 ;+-1 x2147 +1 x2148 >= 0 ;+-1 x2148 +1 x2149 >= 0 ;+-1 x2149 +1 x2150 >= 0 ;+-1 x2150 +1 x2151 >= 0 ;+-1 x2151 +1 x2152 >= 0 ;+-1 x2152 +1 x2153 >= 0 ;+-1 x2153 +1 x2154 >= 0 ;+-1 x2154 +1 x2155 >= 0 ;+-1 x2155 +1 x2156 >= 0 ;+-1 x2156 +1 x2157 >= 0 ;+-1 x2157 +1 x2158 >= 0 ;+-1 x2158 +1 x2159 >= 0 ;+-1 x2159 +1 x2160 >= 0 ;+-1 x2160 +1 x2161 >= 0 ;+-1 x2161 +1 x2162 >= 0 ;+-1 x2163 +1 x2164 >= 0 ;+-1 x2164 +1 x2165 >= 0 ;+-1 x2165 +1 x2166 >= 0 ;+-1 x2166 +1 x2167 >= 0 ;+-1 x2167 +1 x2168 >= 0 ;+-1 x2168 +1 x2169 >= 0 ;+-1 x2169 +1 x2170 >= 0 ;+-1 x2170 +1 x2171 >= 0 ;+-1 x2171 +1 x2172 >= 0 ;+-1 x2172 +1 x2173 >= 0 ;+-1 x2173 +1 x2174 >= 0 ;+-1 x2174 +1 x2175 >= 0 ;+-1 x2175 +1 x2176 >= 0 ;+-1 x2176 +1 x2177 >= 0 ;+-1 x2177 +1 x2178 >= 0 ;+-1 x2178 +1 x2179 >= 0 ;+-1 x2179 +1 x2180 >= 0 ;+-1 x2180 +1 x2181 >= 0 ;+-1 x2181 +1 x2182 >= 0 ;+-1 x2182 +1 x2183 >= 0 ;+-1 x2183 +1 x2184 >= 0 ;+-1 x2184 +1 x2185 >= 0 ;+-1 x2185 +1 x2186 >= 0 ;+-1 x2186 +1 x2187 >= 0 ;+-1 x2187 +1 x2188 >= 0 ;+-1 x2188 +1 x2189 >= 0 ;+-1 x2189 +1 x2190 >= 0 ;+-1 x2190 +1 x2191 >= 0 ;+-1 x2191 +1 x2192 >= 0 ;+-1 x2192 +1 x2193 >= 0 ;+-1 x2193 +1 x2194 >= 0 ;+-1 x2194 +1 x2195 >= 0 ;+-1 x2195 +1 x2196 >= 0 ;+-1 x2196 +1 x2197 >= 0 ;+-1 x2197 +1 x2198 >= 0 ;+-1 x2198 +1 x2199 >= 0 ;+-1 x2199 +1 x2200 >= 0 ;+-1 x2200 +1 x2201 >= 0 ;+-1 x2201 +1 x2202 >= 0 ;+-1 x2202 +1 x2203 >= 0 ;+-1 x2203 +1 x2204 >= 0 ;+-1 x2204 +1 x2205 >= 0 ;+-1 x2205 +1 x2206 >= 0 ;+-1 x2206 +1 x2207 >= 0 ;+-1 x2207 +1 x2208 >= 0 ;+-1 x2208 +1 x2209 >= 0 ;+-1 x2209 +1 x2210 >= 0 ;+-1 x2210 +1 x2211 >= 0 ;+-1 x2211 +1 x2212 >= 0 ;+-1 x2212 +1 x2213 >= 0 ;+-1 x2213 +1 x2214 >= 0 ;+-1 x2214 +1 x2215 >= 0 ;+-1 x2215 +1 x2216 >= 0 ;+-1 x2216 +1 x2217 >= 0 ;+-1 x2217 +1 x2218 >= 0 ;+-1 x2218 +1 x2219 >= 0 ;+-1 x2219 +1 x2220 >= 0 ;+-1 x2220 +1 x2221 >= 0 ;+-1 x2221 +1 x2222 >= 0 ;+-1 x2222 +1 x2223 >= 0 ;+-1 x2223 +1 x2224 >= 0 ;+-1 x2224 +1 x2225 >= 0 ;+-1 x2225 +1 x2226 >= 0 ;+-1 x2226 +1 x2227 >= 0 ;+-1 x2227 +1 x2228 >= 0 ;+-1 x2228 +1 x2229 >= 0 ;+-1 x2229 +1 x2230 >= 0 ;+-1 x2230 +1 x2231 >= 0 ;+-1 x2231 +1 x2232 >= 0 ;+-1 x2232 +1 x2233 >= 0 ;+-1 x2233 +1 x2234 >= 0 ;+-1 x2234 +1 x2235 >= 0 ;+-1 x2235 +1 x2236 >= 0 ;+-1 x2236 +1 x2237 >= 0 ;+-1 x2237 +1 x2238 >= 0 ;+-1 x2238 +1 x2239 >= 0 ;+-1 x2239 +1 x2240 >= 0 ;+-1 x2240 +1 x2241 >= 0 ;+-1 x2241 +1 x2242 >= 0 ;+-1 x2242 +1 x2243 >= 0 ;+-1 x2243 +1 x2244 >= 0 ;+-1 x2244 +1 x2245 >= 0 ;+-1 x2245 +1 x2246 >= 0 ;+-1 x2246 +1 x2247 >= 0 ;+-1 x2247 +1 x2248 >= 0 ;+-1 x2248 +1 x2249 >= 0 ;+-1 x2249 +1 x2250 >= 0 ;+-1 x2250 +1 x2251 >= 0 ;+-1 x2251 +1 x2252 >= 0 ;+-1 x2252 +1 x2253 >= 0 ;+-1 x2253 +1 x2254 >= 0 ;+-1 x2254 +1 x2255 >= 0 ;+-1 x2255 +1 x2256 >= 0 ;+-1 x2257 +1 x2258 >= 0 ;+-1 x2258 +1 x2259 >= 0 ;+-1 x2259 +1 x2260 >= 0 ;+-1 x2260 +1 x2261 >= 0 ;+-1 x2261 +1 x2262 >= 0 ;+-1 x2262 +1 x2263 >= 0 ;+-1 x2263 +1 x2264 >= 0 ;+-1 x2264 +1 x2265 >= 0 ;+-1 x2265 +1 x2266 >= 0 ;+-1 x2266 +1 x2267 >= 0 ;+-1 x2267 +1 x2268 >= 0 ;+-1 x2268 +1 x2269 >= 0 ;+-1 x2269 +1 x2270 >= 0 ;+-1 x2270 +1 x2271 >= 0 ;+-1 x2271 +1 x2272 >= 0 ;+-1 x2272 +1 x2273 >= 0 ;+-1 x2273 +1 x2274 >= 0 ;+-1 x2274 +1 x2275 >= 0 ;+-1 x2275 +1 x2276 >= 0 ;+-1 x2276 +1 x2277 >= 0 ;+-1 x2277 +1 x2278 >= 0 ;+-1 x2278 +1 x2279 >= 0 ;+-1 x2279 +1 x2280 >= 0 ;+-1 x2280 +1 x2281 >= 0 ;+-1 x2281 +1 x2282 >= 0 ;+-1 x2282 +1 x2283 >= 0 ;+-1 x2283 +1 x2284 >= 0 ;+-1 x2284 +1 x2285 >= 0 ;+-1 x2285 +1 x2286 >= 0 ;+-1 x2286 +1 x2287 >= 0 ;+-1 x2287 +1 x2288 >= 0 ;+-1 x2288 +1 x2289 >= 0 ;+-1 x2289 +1 x2290 >= 0 ;+-1 x2290 +1 x2291 >= 0 ;+-1 x2291 +1 x2292 >= 0 ;+-1 x2292 +1 x2293 >= 0 ;+-1 x2293 +1 x2294 >= 0 ;+-1 x2294 +1 x2295 >= 0 ;+-1 x2295 +1 x2296 >= 0 ;+-1 x2296 +1 x2297 >= 0 ;+-1 x2297 +1 x2298 >= 0 ;+-1 x2298 +1 x2299 >= 0 ;+-1 x2299 +1 x2300 >= 0 ;+-1 x2300 +1 x2301 >= 0 ;+-1 x2301 +1 x2302 >= 0 ;+-1 x2302 +1 x2303 >= 0 ;+-1 x2303 +1 x2304 >= 0 ;+-1 x2304 +1 x2305 >= 0 ;+-1 x2305 +1 x2306 >= 0 ;+-1 x2306 +1 x2307 >= 0 ;+-1 x2307 +1 x2308 >= 0 ;+-1 x2308 +1 x2309 >= 0 ;+-1 x2309 +1 x2310 >= 0 ;+-1 x2310 +1 x2311 >= 0 ;+-1 x2311 +1 x2312 >= 0 ;+-1 x2312 +1 x2313 >= 0 ;+-1 x2313 +1 x2314 >= 0 ;+-1 x2314 +1 x2315 >= 0 ;+-1 x2315 +1 x2316 >= 0 ;+-1 x2316 +1 x2317 >= 0 ;+-1 x2317 +1 x2318 >= 0 ;+-1 x2318 +1 x2319 >= 0 ;+-1 x2319 +1 x2320 >= 0 ;+-1 x2320 +1 x2321 >= 0 ;+-1 x2321 +1 x2322 >= 0 ;+-1 x2322 +1 x2323 >= 0 ;+-1 x2323 +1 x2324 >= 0 ;+-1 x2324 +1 x2325 >= 0 ;+-1 x2325 +1 x2326 >= 0 ;+-1 x2326 +1 x2327 >= 0 ;+-1 x2327 +1 x2328 >= 0 ;+-1 x2328 +1 x2329 >= 0 ;+-1 x2329 +1 x2330 >= 0 ;+-1 x2330 +1 x2331 >= 0 ;+-1 x2331 +1 x2332 >= 0 ;+-1 x2332 +1 x2333 >= 0 ;+-1 x2333 +1 x2334 >= 0 ;+-1 x2334 +1 x2335 >= 0 ;+-1 x2335 +1 x2336 >= 0 ;+-1 x2336 +1 x2337 >= 0 ;+-1 x2337 +1 x2338 >= 0 ;+-1 x2338 +1 x2339 >= 0 ;+-1 x2339 +1 x2340 >= 0 ;+-1 x2340 +1 x2341 >= 0 ;+-1 x2341 +1 x2342 >= 0 ;+-1 x2342 +1 x2343 >= 0 ;+-1 x2343 +1 x2344 >= 0 ;+-1 x2344 +1 x2345 >= 0 ;+-1 x2345 +1 x2346 >= 0 ;+-1 x2346 +1 x2347 >= 0 ;+-1 x2347 +1 x2348 >= 0 ;+-1 x2348 +1 x2349 >= 0 ;+-1 x2349 +1 x2350 >= 0 ;+-1 x2351 +1 x2352 >= 0 ;+-1 x2352 +1 x2353 >= 0 ;+-1 x2353 +1 x2354 >= 0 ;+-1 x2354 +1 x2355 >= 0 ;+-1 x2355 +1 x2356 >= 0 ;+-1 x2356 +1 x2357 >= 0 ;+-1 x2357 +1 x2358 >= 0 ;+-1 x2358 +1 x2359 >= 0 ;+-1 x2359 +1 x2360 >= 0 ;+-1 x2360 +1 x2361 >= 0 ;+-1 x2361 +1 x2362 >= 0 ;+-1 x2362 +1 x2363 >= 0 ;+-1 x2363 +1 x2364 >= 0 ;+-1 x2364 +1 x2365 >= 0 ;+-1 x2365 +1 x2366 >= 0 ;+-1 x2366 +1 x2367 >= 0 ;+-1 x2367 +1 x2368 >= 0 ;+-1 x2368 +1 x2369 >= 0 ;+-1 x2369 +1 x2370 >= 0 ;+-1 x2370 +1 x2371 >= 0 ;+-1 x2371 +1 x2372 >= 0 ;+-1 x2372 +1 x2373 >= 0 ;+-1 x2373 +1 x2374 >= 0 ;+-1 x2374 +1 x2375 >= 0 ;+-1 x2375 +1 x2376 >= 0 ;+-1 x2376 +1 x2377 >= 0 ;+-1 x2377 +1 x2378 >= 0 ;+-1 x2378 +1 x2379 >= 0 ;+-1 x2379 +1 x2380 >= 0 ;+-1 x2380 +1 x2381 >= 0 ;+-1 x2381 +1 x2382 >= 0 ;+-1 x2382 +1 x2383 >= 0 ;+-1 x2383 +1 x2384 >= 0 ;+-1 x2384 +1 x2385 >= 0 ;+-1 x2385 +1 x2386 >= 0 ;+-1 x2386 +1 x2387 >= 0 ;+-1 x2387 +1 x2388 >= 0 ;+-1 x2388 +1 x2389 >= 0 ;+-1 x2389 +1 x2390 >= 0 ;+-1 x2390 +1 x2391 >= 0 ;+-1 x2391 +1 x2392 >= 0 ;+-1 x2392 +1 x2393 >= 0 ;+-1 x2393 +1 x2394 >= 0 ;+-1 x2394 +1 x2395 >= 0 ;+-1 x2395 +1 x2396 >= 0 ;+-1 x2396 +1 x2397 >= 0 ;+-1 x2397 +1 x2398 >= 0 ;+-1 x2398 +1 x2399 >= 0 ;+-1 x2399 +1 x2400 >= 0 ;+-1 x2400 +1 x2401 >= 0 ;+-1 x2401 +1 x2402 >= 0 ;+-1 x2402 +1 x2403 >= 0 ;+-1 x2403 +1 x2404 >= 0 ;+-1 x2404 +1 x2405 >= 0 ;+-1 x2405 +1 x2406 >= 0 ;+-1 x2406 +1 x2407 >= 0 ;+-1 x2407 +1 x2408 >= 0 ;+-1 x2408 +1 x2409 >= 0 ;+-1 x2409 +1 x2410 >= 0 ;+-1 x2410 +1 x2411 >= 0 ;+-1 x2411 +1 x2412 >= 0 ;+-1 x2412 +1 x2413 >= 0 ;+-1 x2413 +1 x2414 >= 0 ;+-1 x2414 +1 x2415 >= 0 ;+-1 x2415 +1 x2416 >= 0 ;+-1 x2416 +1 x2417 >= 0 ;+-1 x2417 +1 x2418 >= 0 ;+-1 x2418 +1 x2419 >= 0 ;+-1 x2419 +1 x2420 >= 0 ;+-1 x2420 +1 x2421 >= 0 ;+-1 x2421 +1 x2422 >= 0 ;+-1 x2422 +1 x2423 >= 0 ;+-1 x2423 +1 x2424 >= 0 ;+-1 x2424 +1 x2425 >= 0 ;+-1 x2425 +1 x2426 >= 0 ;+-1 x2426 +1 x2427 >= 0 ;+-1 x2427 +1 x2428 >= 0 ;+-1 x2428 +1 x2429 >= 0 ;+-1 x2429 +1 x2430 >= 0 ;+-1 x2430 +1 x2431 >= 0 ;+-1 x2431 +1 x2432 >= 0 ;+-1 x2432 +1 x2433 >= 0 ;+-1 x2433 +1 x2434 >= 0 ;+-1 x2434 +1 x2435 >= 0 ;+-1 x2435 +1 x2436 >= 0 ;+-1 x2436 +1 x2437 >= 0 ;+-1 x2437 +1 x2438 >= 0 ;+-1 x2438 +1 x2439 >= 0 ;+-1 x2439 +1 x2440 >= 0 ;+-1 x2440 +1 x2441 >= 0 ;+-1 x2441 +1 x2442 >= 0 ;+-1 x2442 +1 x2443 >= 0 ;+-1 x2443 +1 x2444 >= 0 ;+-1 x2445 +1 x2446 >= 0 ;+-1 x2446 +1 x2447 >= 0 ;+-1 x2447 +1 x2448 >= 0 ;+-1 x2448 +1 x2449 >= 0 ;+-1 x2449 +1 x2450 >= 0 ;+-1 x2450 +1 x2451 >= 0 ;+-1 x2451 +1 x2452 >= 0 ;+-1 x2452 +1 x2453 >= 0 ;+-1 x2453 +1 x2454 >= 0 ;+-1 x2454 +1 x2455 >= 0 ;+-1 x2455 +1 x2456 >= 0 ;+-1 x2456 +1 x2457 >= 0 ;+-1 x2457 +1 x2458 >= 0 ;+-1 x2458 +1 x2459 >= 0 ;+-1 x2459 +1 x2460 >= 0 ;+-1 x2460 +1 x2461 >= 0 ;+-1 x2461 +1 x2462 >= 0 ;+-1 x2462 +1 x2463 >= 0 ;+-1 x2463 +1 x2464 >= 0 ;+-1 x2464 +1 x2465 >= 0 ;+-1 x2465 +1 x2466 >= 0 ;+-1 x2466 +1 x2467 >= 0 ;+-1 x2467 +1 x2468 >= 0 ;+-1 x2468 +1 x2469 >= 0 ;+-1 x2469 +1 x2470 >= 0 ;+-1 x2470 +1 x2471 >= 0 ;+-1 x2471 +1 x2472 >= 0 ;+-1 x2472 +1 x2473 >= 0 ;+-1 x2473 +1 x2474 >= 0 ;+-1 x2474 +1 x2475 >= 0 ;+-1 x2475 +1 x2476 >= 0 ;+-1 x2476 +1 x2477 >= 0 ;+-1 x2477 +1 x2478 >= 0 ;+-1 x2478 +1 x2479 >= 0 ;+-1 x2479 +1 x2480 >= 0 ;+-1 x2480 +1 x2481 >= 0 ;+-1 x2481 +1 x2482 >= 0 ;+-1 x2482 +1 x2483 >= 0 ;+-1 x2483 +1 x2484 >= 0 ;+-1 x2484 +1 x2485 >= 0 ;+-1 x2485 +1 x2486 >= 0 ;+-1 x2486 +1 x2487 >= 0 ;+-1 x2487 +1 x2488 >= 0 ;+-1 x2488 +1 x2489 >= 0 ;+-1 x2489 +1 x2490 >= 0 ;+-1 x2490 +1 x2491 >= 0 ;+-1 x2491 +1 x2492 >= 0 ;+-1 x2492 +1 x2493 >= 0 ;+-1 x2493 +1 x2494 >= 0 ;+-1 x2494 +1 x2495 >= 0 ;+-1 x2495 +1 x2496 >= 0 ;+-1 x2496 +1 x2497 >= 0 ;+-1 x2497 +1 x2498 >= 0 ;+-1 x2498 +1 x2499 >= 0 ;+-1 x2499 +1 x2500 >= 0 ;+-1 x2500 +1 x2501 >= 0 ;+-1 x2501 +1 x2502 >= 0 ;+-1 x2502 +1 x2503 >= 0 ;+-1 x2503 +1 x2504 >= 0 ;+-1 x2504 +1 x2505 >= 0 ;+-1 x2505 +1 x2506 >= 0 ;+-1 x2506 +1 x2507 >= 0 ;+-1 x2507 +1 x2508 >= 0 ;+-1 x2508 +1 x2509 >= 0 ;+-1 x2509 +1 x2510 >= 0 ;+-1 x2510 +1 x2511 >= 0 ;+-1 x2511 +1 x2512 >= 0 ;+-1 x2512 +1 x2513 >= 0 ;+-1 x2513 +1 x2514 >= 0 ;+-1 x2514 +1 x2515 >= 0 ;+-1 x2515 +1 x2516 >= 0 ;+-1 x2516 +1 x2517 >= 0 ;+-1 x2517 +1 x2518 >= 0 ;+-1 x2518 +1 x2519 >= 0 ;+-1 x2519 +1 x2520 >= 0 ;+-1 x2520 +1 x2521 >= 0 ;+-1 x2521 +1 x2522 >= 0 ;+-1 x2522 +1 x2523 >= 0 ;+-1 x2523 +1 x2524 >= 0 ;+-1 x2524 +1 x2525 >= 0 ;+-1 x2525 +1 x2526 >= 0 ;+-1 x2526 +1 x2527 >= 0 ;+-1 x2527 +1 x2528 >= 0 ;+-1 x2528 +1 x2529 >= 0 ;+-1 x2529 +1 x2530 >= 0 ;+-1 x2530 +1 x2531 >= 0 ;+-1 x2531 +1 x2532 >= 0 ;+-1 x2532 +1 x2533 >= 0 ;+-1 x2533 +1 x2534 >= 0 ;+-1 x2534 +1 x2535 >= 0 ;+-1 x2535 +1 x2536 >= 0 ;+-1 x2536 +1 x2537 >= 0 ;+-1 x2537 +1 x2538 >= 0 ;+-1 x2539 +1 x2540 >= 0 ;+-1 x2540 +1 x2541 >= 0 ;+-1 x2541 +1 x2542 >= 0 ;+-1 x2542 +1 x2543 >= 0 ;+-1 x2543 +1 x2544 >= 0 ;+-1 x2544 +1 x2545 >= 0 ;+-1 x2545 +1 x2546 >= 0 ;+-1 x2546 +1 x2547 >= 0 ;+-1 x2547 +1 x2548 >= 0 ;+-1 x2548 +1 x2549 >= 0 ;+-1 x2549 +1 x2550 >= 0 ;+-1 x2550 +1 x2551 >= 0 ;+-1 x2551 +1 x2552 >= 0 ;+-1 x2552 +1 x2553 >= 0 ;+-1 x2553 +1 x2554 >= 0 ;+-1 x2554 +1 x2555 >= 0 ;+-1 x2555 +1 x2556 >= 0 ;+-1 x2556 +1 x2557 >= 0 ;+-1 x2557 +1 x2558 >= 0 ;+-1 x2558 +1 x2559 >= 0 ;+-1 x2559 +1 x2560 >= 0 ;+-1 x2560 +1 x2561 >= 0 ;+-1 x2561 +1 x2562 >= 0 ;+-1 x2562 +1 x2563 >= 0 ;+-1 x2563 +1 x2564 >= 0 ;+-1 x2564 +1 x2565 >= 0 ;+-1 x2565 +1 x2566 >= 0 ;+-1 x2566 +1 x2567 >= 0 ;+-1 x2567 +1 x2568 >= 0 ;+-1 x2568 +1 x2569 >= 0 ;+-1 x2569 +1 x2570 >= 0 ;+-1 x2570 +1 x2571 >= 0 ;+-1 x2571 +1 x2572 >= 0 ;+-1 x2572 +1 x2573 >= 0 ;+-1 x2573 +1 x2574 >= 0 ;+-1 x2574 +1 x2575 >= 0 ;+-1 x2575 +1 x2576 >= 0 ;+-1 x2576 +1 x2577 >= 0 ;+-1 x2577 +1 x2578 >= 0 ;+-1 x2578 +1 x2579 >= 0 ;+-1 x2579 +1 x2580 >= 0 ;+-1 x2580 +1 x2581 >= 0 ;+-1 x2581 +1 x2582 >= 0 ;+-1 x2582 +1 x2583 >= 0 ;+-1 x2583 +1 x2584 >= 0 ;+-1 x2584 +1 x2585 >= 0 ;+-1 x2585 +1 x2586 >= 0 ;+-1 x2586 +1 x2587 >= 0 ;+-1 x2587 +1 x2588 >= 0 ;+-1 x2588 +1 x2589 >= 0 ;+-1 x2589 +1 x2590 >= 0 ;+-1 x2590 +1 x2591 >= 0 ;+-1 x2591 +1 x2592 >= 0 ;+-1 x2592 +1 x2593 >= 0 ;+-1 x2593 +1 x2594 >= 0 ;+-1 x2594 +1 x2595 >= 0 ;+-1 x2595 +1 x2596 >= 0 ;+-1 x2596 +1 x2597 >= 0 ;+-1 x2597 +1 x2598 >= 0 ;+-1 x2598 +1 x2599 >= 0 ;+-1 x2599 +1 x2600 >= 0 ;+-1 x2600 +1 x2601 >= 0 ;+-1 x2601 +1 x2602 >= 0 ;+-1 x2602 +1 x2603 >= 0 ;+-1 x2603 +1 x2604 >= 0 ;+-1 x2604 +1 x2605 >= 0 ;+-1 x2605 +1 x2606 >= 0 ;+-1 x2606 +1 x2607 >= 0 ;+-1 x2607 +1 x2608 >= 0 ;+-1 x2608 +1 x2609 >= 0 ;+-1 x2609 +1 x2610 >= 0 ;+-1 x2610 +1 x2611 >= 0 ;+-1 x2611 +1 x2612 >= 0 ;+-1 x2612 +1 x2613 >= 0 ;+-1 x2613 +1 x2614 >= 0 ;+-1 x2614 +1 x2615 >= 0 ;+-1 x2615 +1 x2616 >= 0 ;+-1 x2616 +1 x2617 >= 0 ;+-1 x2617 +1 x2618 >= 0 ;+-1 x2618 +1 x2619 >= 0 ;+-1 x2619 +1 x2620 >= 0 ;+-1 x2620 +1 x2621 >= 0 ;+-1 x2621 +1 x2622 >= 0 ;+-1 x2622 +1 x2623 >= 0 ;+-1 x2623 +1 x2624 >= 0 ;+-1 x2624 +1 x2625 >= 0 ;+-1 x2625 +1 x2626 >= 0 ;+-1 x2626 +1 x2627 >= 0 ;+-1 x2627 +1 x2628 >= 0 ;+-1 x2628 +1 x2629 >= 0 ;+-1 x2629 +1 x2630 >= 0 ;+-1 x2630 +1 x2631 >= 0 ;+-1 x2631 +1 x2632 >= 0 ;+-1 x2633 +1 x2634 >= 0 ;+-1 x2634 +1 x2635 >= 0 ;+-1 x2635 +1 x2636 >= 0 ;+-1 x2636 +1 x2637 >= 0 ;+-1 x2637 +1 x2638 >= 0 ;+-1 x2638 +1 x2639 >= 0 ;+-1 x2639 +1 x2640 >= 0 ;+-1 x2640 +1 x2641 >= 0 ;+-1 x2641 +1 x2642 >= 0 ;+-1 x2642 +1 x2643 >= 0 ;+-1 x2643 +1 x2644 >= 0 ;+-1 x2644 +1 x2645 >= 0 ;+-1 x2645 +1 x2646 >= 0 ;+-1 x2646 +1 x2647 >= 0 ;+-1 x2647 +1 x2648 >= 0 ;+-1 x2648 +1 x2649 >= 0 ;+-1 x2649 +1 x2650 >= 0 ;+-1 x2650 +1 x2651 >= 0 ;+-1 x2651 +1 x2652 >= 0 ;+-1 x2652 +1 x2653 >= 0 ;+-1 x2653 +1 x2654 >= 0 ;+-1 x2654 +1 x2655 >= 0 ;+-1 x2655 +1 x2656 >= 0 ;+-1 x2656 +1 x2657 >= 0 ;+-1 x2657 +1 x2658 >= 0 ;+-1 x2658 +1 x2659 >= 0 ;+-1 x2659 +1 x2660 >= 0 ;+-1 x2660 +1 x2661 >= 0 ;+-1 x2661 +1 x2662 >= 0 ;+-1 x2662 +1 x2663 >= 0 ;+-1 x2663 +1 x2664 >= 0 ;+-1 x2664 +1 x2665 >= 0 ;+-1 x2665 +1 x2666 >= 0 ;+-1 x2666 +1 x2667 >= 0 ;+-1 x2667 +1 x2668 >= 0 ;+-1 x2668 +1 x2669 >= 0 ;+-1 x2669 +1 x2670 >= 0 ;+-1 x2670 +1 x2671 >= 0 ;+-1 x2671 +1 x2672 >= 0 ;+-1 x2672 +1 x2673 >= 0 ;+-1 x2673 +1 x2674 >= 0 ;+-1 x2674 +1 x2675 >= 0 ;+-1 x2675 +1 x2676 >= 0 ;+-1 x2676 +1 x2677 >= 0 ;+-1 x2677 +1 x2678 >= 0 ;+-1 x2678 +1 x2679 >= 0 ;+-1 x2679 +1 x2680 >= 0 ;+-1 x2680 +1 x2681 >= 0 ;+-1 x2681 +1 x2682 >= 0 ;+-1 x2682 +1 x2683 >= 0 ;+-1 x2683 +1 x2684 >= 0 ;+-1 x2684 +1 x2685 >= 0 ;+-1 x2685 +1 x2686 >= 0 ;+-1 x2686 +1 x2687 >= 0 ;+-1 x2687 +1 x2688 >= 0 ;+-1 x2688 +1 x2689 >= 0 ;+-1 x2689 +1 x2690 >= 0 ;+-1 x2690 +1 x2691 >= 0 ;+-1 x2691 +1 x2692 >= 0 ;+-1 x2692 +1 x2693 >= 0 ;+-1 x2693 +1 x2694 >= 0 ;+-1 x2694 +1 x2695 >= 0 ;+-1 x2695 +1 x2696 >= 0 ;+-1 x2696 +1 x2697 >= 0 ;+-1 x2697 +1 x2698 >= 0 ;+-1 x2698 +1 x2699 >= 0 ;+-1 x2699 +1 x2700 >= 0 ;+-1 x2700 +1 x2701 >= 0 ;+-1 x2701 +1 x2702 >= 0 ;+-1 x2702 +1 x2703 >= 0 ;+-1 x2703 +1 x2704 >= 0 ;+-1 x2704 +1 x2705 >= 0 ;+-1 x2705 +1 x2706 >= 0 ;+-1 x2706 +1 x2707 >= 0 ;+-1 x2707 +1 x2708 >= 0 ;+-1 x2708 +1 x2709 >= 0 ;+-1 x2709 +1 x2710 >= 0 ;+-1 x2710 +1 x2711 >= 0 ;+-1 x2711 +1 x2712 >= 0 ;+-1 x2712 +1 x2713 >= 0 ;+-1 x2713 +1 x2714 >= 0 ;+-1 x2714 +1 x2715 >= 0 ;+-1 x2715 +1 x2716 >= 0 ;+-1 x2716 +1 x2717 >= 0 ;+-1 x2717 +1 x2718 >= 0 ;+-1 x2718 +1 x2719 >= 0 ;+-1 x2719 +1 x2720 >= 0 ;+-1 x2720 +1 x2721 >= 0 ;+-1 x2721 +1 x2722 >= 0 ;+-1 x2722 +1 x2723 >= 0 ;+-1 x2723 +1 x2724 >= 0 ;+-1 x2724 +1 x2725 >= 0 ;+-1 x2725 +1 x2726 >= 0 ;+-1 x2727 +1 x2728 >= 0 ;+-1 x2728 +1 x2729 >= 0 ;+-1 x2729 +1 x2730 >= 0 ;+-1 x2730 +1 x2731 >= 0 ;+-1 x2731 +1 x2732 >= 0 ;+-1 x2732 +1 x2733 >= 0 ;+-1 x2733 +1 x2734 >= 0 ;+-1 x2734 +1 x2735 >= 0 ;+-1 x2735 +1 x2736 >= 0 ;+-1 x2736 +1 x2737 >= 0 ;+-1 x2737 +1 x2738 >= 0 ;+-1 x2738 +1 x2739 >= 0 ;+-1 x2739 +1 x2740 >= 0 ;+-1 x2740 +1 x2741 >= 0 ;+-1 x2741 +1 x2742 >= 0 ;+-1 x2742 +1 x2743 >= 0 ;+-1 x2743 +1 x2744 >= 0 ;+-1 x2744 +1 x2745 >= 0 ;+-1 x2745 +1 x2746 >= 0 ;+-1 x2746 +1 x2747 >= 0 ;+-1 x2747 +1 x2748 >= 0 ;+-1 x2748 +1 x2749 >= 0 ;+-1 x2749 +1 x2750 >= 0 ;+-1 x2750 +1 x2751 >= 0 ;+-1 x2751 +1 x2752 >= 0 ;+-1 x2752 +1 x2753 >= 0 ;+-1 x2753 +1 x2754 >= 0 ;+-1 x2754 +1 x2755 >= 0 ;+-1 x2755 +1 x2756 >= 0 ;+-1 x2756 +1 x2757 >= 0 ;+-1 x2757 +1 x2758 >= 0 ;+-1 x2758 +1 x2759 >= 0 ;+-1 x2759 +1 x2760 >= 0 ;+-1 x2760 +1 x2761 >= 0 ;+-1 x2761 +1 x2762 >= 0 ;+-1 x2762 +1 x2763 >= 0 ;+-1 x2763 +1 x2764 >= 0 ;+-1 x2764 +1 x2765 >= 0 ;+-1 x2765 +1 x2766 >= 0 ;+-1 x2766 +1 x2767 >= 0 ;+-1 x2767 +1 x2768 >= 0 ;+-1 x2768 +1 x2769 >= 0 ;+-1 x2769 +1 x2770 >= 0 ;+-1 x2770 +1 x2771 >= 0 ;+-1 x2771 +1 x2772 >= 0 ;+-1 x2772 +1 x2773 >= 0 ;+-1 x2773 +1 x2774 >= 0 ;+-1 x2774 +1 x2775 >= 0 ;+-1 x2775 +1 x2776 >= 0 ;+-1 x2776 +1 x2777 >= 0 ;+-1 x2777 +1 x2778 >= 0 ;+-1 x2778 +1 x2779 >= 0 ;+-1 x2779 +1 x2780 >= 0 ;+-1 x2780 +1 x2781 >= 0 ;+-1 x2781 +1 x2782 >= 0 ;+-1 x2782 +1 x2783 >= 0 ;+-1 x2783 +1 x2784 >= 0 ;+-1 x2784 +1 x2785 >= 0 ;+-1 x2785 +1 x2786 >= 0 ;+-1 x2786 +1 x2787 >= 0 ;+-1 x2787 +1 x2788 >= 0 ;+-1 x2788 +1 x2789 >= 0 ;+-1 x2789 +1 x2790 >= 0 ;+-1 x2790 +1 x2791 >= 0 ;+-1 x2791 +1 x2792 >= 0 ;+-1 x2792 +1 x2793 >= 0 ;+-1 x2793 +1 x2794 >= 0 ;+-1 x2794 +1 x2795 >= 0 ;+-1 x2795 +1 x2796 >= 0 ;+-1 x2796 +1 x2797 >= 0 ;+-1 x2797 +1 x2798 >= 0 ;+-1 x2798 +1 x2799 >= 0 ;+-1 x2799 +1 x2800 >= 0 ;+-1 x2800 +1 x2801 >= 0 ;+-1 x2801 +1 x2802 >= 0 ;+-1 x2802 +1 x2803 >= 0 ;+-1 x2803 +1 x2804 >= 0 ;+-1 x2804 +1 x2805 >= 0 ;+-1 x2805 +1 x2806 >= 0 ;+-1 x2806 +1 x2807 >= 0 ;+-1 x2807 +1 x2808 >= 0 ;+-1 x2808 +1 x2809 >= 0 ;+-1 x2809 +1 x2810 >= 0 ;+-1 x2810 +1 x2811 >= 0 ;+-1 x2811 +1 x2812 >= 0 ;+-1 x2812 +1 x2813 >= 0 ;+-1 x2813 +1 x2814 >= 0 ;+-1 x2814 +1 x2815 >= 0 ;+-1 x2815 +1 x2816 >= 0 ;+-1 x2816 +1 x2817 >= 0 ;+-1 x2817 +1 x2818 >= 0 ;+-1 x2818 +1 x2819 >= 0 ;+-1 x2819 +1 x2820 >= 0 ;+-1 x2821 +1 x2822 >= 0 ;+-1 x2822 +1 x2823 >= 0 ;+-1 x2823 +1 x2824 >= 0 ;+-1 x2824 +1 x2825 >= 0 ;+-1 x2825 +1 x2826 >= 0 ;+-1 x2826 +1 x2827 >= 0 ;+-1 x2827 +1 x2828 >= 0 ;+-1 x2828 +1 x2829 >= 0 ;+-1 x2829 +1 x2830 >= 0 ;+-1 x2830 +1 x2831 >= 0 ;+-1 x2831 +1 x2832 >= 0 ;+-1 x2832 +1 x2833 >= 0 ;+-1 x2833 +1 x2834 >= 0 ;+-1 x2834 +1 x2835 >= 0 ;+-1 x2835 +1 x2836 >= 0 ;+-1 x2836 +1 x2837 >= 0 ;+-1 x2837 +1 x2838 >= 0 ;+-1 x2838 +1 x2839 >= 0 ;+-1 x2839 +1 x2840 >= 0 ;+-1 x2840 +1 x2841 >= 0 ;+-1 x2841 +1 x2842 >= 0 ;+-1 x2842 +1 x2843 >= 0 ;+-1 x2843 +1 x2844 >= 0 ;+-1 x2844 +1 x2845 >= 0 ;+-1 x2845 +1 x2846 >= 0 ;+-1 x2846 +1 x2847 >= 0 ;+-1 x2847 +1 x2848 >= 0 ;+-1 x2848 +1 x2849 >= 0 ;+-1 x2849 +1 x2850 >= 0 ;+-1 x2850 +1 x2851 >= 0 ;+-1 x2851 +1 x2852 >= 0 ;+-1 x2852 +1 x2853 >= 0 ;+-1 x2853 +1 x2854 >= 0 ;+-1 x2854 +1 x2855 >= 0 ;+-1 x2855 +1 x2856 >= 0 ;+-1 x2856 +1 x2857 >= 0 ;+-1 x2857 +1 x2858 >= 0 ;+-1 x2858 +1 x2859 >= 0 ;+-1 x2859 +1 x2860 >= 0 ;+-1 x2860 +1 x2861 >= 0 ;+-1 x2861 +1 x2862 >= 0 ;+-1 x2862 +1 x2863 >= 0 ;+-1 x2863 +1 x2864 >= 0 ;+-1 x2864 +1 x2865 >= 0 ;+-1 x2865 +1 x2866 >= 0 ;+-1 x2866 +1 x2867 >= 0 ;+-1 x2867 +1 x2868 >= 0 ;+-1 x2868 +1 x2869 >= 0 ;+-1 x2869 +1 x2870 >= 0 ;+-1 x2870 +1 x2871 >= 0 ;+-1 x2871 +1 x2872 >= 0 ;+-1 x2872 +1 x2873 >= 0 ;+-1 x2873 +1 x2874 >= 0 ;+-1 x2874 +1 x2875 >= 0 ;+-1 x2875 +1 x2876 >= 0 ;+-1 x2876 +1 x2877 >= 0 ;+-1 x2877 +1 x2878 >= 0 ;+-1 x2878 +1 x2879 >= 0 ;+-1 x2879 +1 x2880 >= 0 ;+-1 x2880 +1 x2881 >= 0 ;+-1 x2881 +1 x2882 >= 0 ;+-1 x2882 +1 x2883 >= 0 ;+-1 x2883 +1 x2884 >= 0 ;+-1 x2884 +1 x2885 >= 0 ;+-1 x2885 +1 x2886 >= 0 ;+-1 x2886 +1 x2887 >= 0 ;+-1 x2887 +1 x2888 >= 0 ;+-1 x2888 +1 x2889 >= 0 ;+-1 x2889 +1 x2890 >= 0 ;+-1 x2890 +1 x2891 >= 0 ;+-1 x2891 +1 x2892 >= 0 ;+-1 x2892 +1 x2893 >= 0 ;+-1 x2893 +1 x2894 >= 0 ;+-1 x2894 +1 x2895 >= 0 ;+-1 x2895 +1 x2896 >= 0 ;+-1 x2896 +1 x2897 >= 0 ;+-1 x2897 +1 x2898 >= 0 ;+-1 x2898 +1 x2899 >= 0 ;+-1 x2899 +1 x2900 >= 0 ;+-1 x2900 +1 x2901 >= 0 ;+-1 x2901 +1 x2902 >= 0 ;+-1 x2902 +1 x2903 >= 0 ;+-1 x2903 +1 x2904 >= 0 ;+-1 x2904 +1 x2905 >= 0 ;+-1 x2905 +1 x2906 >= 0 ;+-1 x2906 +1 x2907 >= 0 ;+-1 x2907 +1 x2908 >= 0 ;+-1 x2908 +1 x2909 >= 0 ;+-1 x2909 +1 x2910 >= 0 ;+-1 x2910 +1 x2911 >= 0 ;+-1 x2911 +1 x2912 >= 0 ;+-1 x2912 +1 x2913 >= 0 ;+-1 x2913 +1 x2914 >= 0 ;++1 x86 >= 1 ;++1 x182 >= 1 ;++1 x274 >= 1 ;++1 x374 >= 1 ;++1 x467 >= 1 ;++1 x556 >= 1 ;++1 x649 >= 1 ;++1 x750 >= 1 ;++1 x843 >= 1 ;++1 x934 >= 1 ;++1 x1027 >= 1 ;++1 x1123 >= 1 ;++1 x1217 >= 1 ;++1 x1307 >= 1 ;++1 x1402 >= 1 ;++1 x1499 >= 1 ;++1 x1592 >= 1 ;++1 x1690 >= 1 ;++1 x1780 >= 1 ;++1 x1879 >= 1 ;++1 x1971 >= 1 ;++1 x2065 >= 1 ;++1 x2156 >= 1 ;++1 x2254 >= 1 ;++1 x2342 >= 1 ;++1 x2441 >= 1 ;++1 x2536 >= 1 ;++1 x2631 >= 1 ;++1 x2726 >= 1 ;++1 x2812 >= 1 ;++1 x2914 >= 1 ;+-1 x289 >= 0 ;++1 x95 -1 x290 >= 0 ;++1 x96 -1 x291 >= 0 ;++1 x97 -1 x292 >= 0 ;++1 x98 -1 x293 >= 0 ;++1 x99 -1 x294 >= 0 ;++1 x100 -1 x295 >= 0 ;++1 x101 -1 x296 >= 0 ;++1 x102 -1 x297 >= 0 ;++1 x103 -1 x298 >= 0 ;++1 x104 -1 x299 >= 0 ;++1 x105 -1 x300 >= 0 ;++1 x106 -1 x301 >= 0 ;++1 x107 -1 x302 >= 0 ;++1 x108 -1 x303 >= 0 ;++1 x109 -1 x304 >= 0 ;++1 x110 -1 x305 >= 0 ;++1 x111 -1 x306 >= 0 ;++1 x112 -1 x307 >= 0 ;++1 x113 -1 x308 >= 0 ;++1 x114 -1 x309 >= 0 ;++1 x115 -1 x310 >= 0 ;++1 x116 -1 x311 >= 0 ;++1 x117 -1 x312 >= 0 ;++1 x118 -1 x313 >= 0 ;++1 x119 -1 x314 >= 0 ;++1 x120 -1 x315 >= 0 ;++1 x121 -1 x316 >= 0 ;++1 x122 -1 x317 >= 0 ;++1 x123 -1 x318 >= 0 ;++1 x124 -1 x319 >= 0 ;++1 x125 -1 x320 >= 0 ;++1 x126 -1 x321 >= 0 ;++1 x127 -1 x322 >= 0 ;++1 x128 -1 x323 >= 0 ;++1 x129 -1 x324 >= 0 ;++1 x130 -1 x325 >= 0 ;++1 x131 -1 x326 >= 0 ;++1 x132 -1 x327 >= 0 ;++1 x133 -1 x328 >= 0 ;++1 x134 -1 x329 >= 0 ;++1 x135 -1 x330 >= 0 ;++1 x136 -1 x331 >= 0 ;++1 x137 -1 x332 >= 0 ;++1 x138 -1 x333 >= 0 ;++1 x139 -1 x334 >= 0 ;++1 x140 -1 x335 >= 0 ;++1 x141 -1 x336 >= 0 ;++1 x142 -1 x337 >= 0 ;++1 x143 -1 x338 >= 0 ;++1 x144 -1 x339 >= 0 ;++1 x145 -1 x340 >= 0 ;++1 x146 -1 x341 >= 0 ;++1 x147 -1 x342 >= 0 ;++1 x148 -1 x343 >= 0 ;++1 x149 -1 x344 >= 0 ;++1 x150 -1 x345 >= 0 ;++1 x151 -1 x346 >= 0 ;++1 x152 -1 x347 >= 0 ;++1 x153 -1 x348 >= 0 ;++1 x154 -1 x349 >= 0 ;++1 x155 -1 x350 >= 0 ;++1 x156 -1 x351 >= 0 ;++1 x157 -1 x352 >= 0 ;++1 x158 -1 x353 >= 0 ;++1 x159 -1 x354 >= 0 ;++1 x160 -1 x355 >= 0 ;++1 x161 -1 x356 >= 0 ;++1 x162 -1 x357 >= 0 ;++1 x163 -1 x358 >= 0 ;++1 x164 -1 x359 >= 0 ;++1 x165 -1 x360 >= 0 ;++1 x166 -1 x361 >= 0 ;++1 x167 -1 x362 >= 0 ;++1 x168 -1 x363 >= 0 ;++1 x169 -1 x364 >= 0 ;++1 x170 -1 x365 >= 0 ;++1 x171 -1 x366 >= 0 ;++1 x172 -1 x367 >= 0 ;++1 x173 -1 x368 >= 0 ;++1 x174 -1 x369 >= 0 ;++1 x175 -1 x370 >= 0 ;++1 x176 -1 x371 >= 0 ;++1 x177 -1 x372 >= 0 ;++1 x178 -1 x373 >= 0 ;++1 x179 -1 x374 >= 0 ;++1 x180 -1 x375 >= 0 ;++1 x181 >= 1 ;+-1 x383 >= 0 ;++1 x95 -1 x384 >= 0 ;++1 x96 -1 x385 >= 0 ;++1 x97 -1 x386 >= 0 ;++1 x98 -1 x387 >= 0 ;++1 x99 -1 x388 >= 0 ;++1 x100 -1 x389 >= 0 ;++1 x101 -1 x390 >= 0 ;++1 x102 -1 x391 >= 0 ;++1 x103 -1 x392 >= 0 ;++1 x104 -1 x393 >= 0 ;++1 x105 -1 x394 >= 0 ;++1 x106 -1 x395 >= 0 ;++1 x107 -1 x396 >= 0 ;++1 x108 -1 x397 >= 0 ;++1 x109 -1 x398 >= 0 ;++1 x110 -1 x399 >= 0 ;++1 x111 -1 x400 >= 0 ;++1 x112 -1 x401 >= 0 ;++1 x113 -1 x402 >= 0 ;++1 x114 -1 x403 >= 0 ;++1 x115 -1 x404 >= 0 ;++1 x116 -1 x405 >= 0 ;++1 x117 -1 x406 >= 0 ;++1 x118 -1 x407 >= 0 ;++1 x119 -1 x408 >= 0 ;++1 x120 -1 x409 >= 0 ;++1 x121 -1 x410 >= 0 ;++1 x122 -1 x411 >= 0 ;++1 x123 -1 x412 >= 0 ;++1 x124 -1 x413 >= 0 ;++1 x125 -1 x414 >= 0 ;++1 x126 -1 x415 >= 0 ;++1 x127 -1 x416 >= 0 ;++1 x128 -1 x417 >= 0 ;++1 x129 -1 x418 >= 0 ;++1 x130 -1 x419 >= 0 ;++1 x131 -1 x420 >= 0 ;++1 x132 -1 x421 >= 0 ;++1 x133 -1 x422 >= 0 ;++1 x134 -1 x423 >= 0 ;++1 x135 -1 x424 >= 0 ;++1 x136 -1 x425 >= 0 ;++1 x137 -1 x426 >= 0 ;++1 x138 -1 x427 >= 0 ;++1 x139 -1 x428 >= 0 ;++1 x140 -1 x429 >= 0 ;++1 x141 -1 x430 >= 0 ;++1 x142 -1 x431 >= 0 ;++1 x143 -1 x432 >= 0 ;++1 x144 -1 x433 >= 0 ;++1 x145 -1 x434 >= 0 ;++1 x146 -1 x435 >= 0 ;++1 x147 -1 x436 >= 0 ;++1 x148 -1 x437 >= 0 ;++1 x149 -1 x438 >= 0 ;++1 x150 -1 x439 >= 0 ;++1 x151 -1 x440 >= 0 ;++1 x152 -1 x441 >= 0 ;++1 x153 -1 x442 >= 0 ;++1 x154 -1 x443 >= 0 ;++1 x155 -1 x444 >= 0 ;++1 x156 -1 x445 >= 0 ;++1 x157 -1 x446 >= 0 ;++1 x158 -1 x447 >= 0 ;++1 x159 -1 x448 >= 0 ;++1 x160 -1 x449 >= 0 ;++1 x161 -1 x450 >= 0 ;++1 x162 -1 x451 >= 0 ;++1 x163 -1 x452 >= 0 ;++1 x164 -1 x453 >= 0 ;++1 x165 -1 x454 >= 0 ;++1 x166 -1 x455 >= 0 ;++1 x167 -1 x456 >= 0 ;++1 x168 -1 x457 >= 0 ;++1 x169 -1 x458 >= 0 ;++1 x170 -1 x459 >= 0 ;++1 x171 -1 x460 >= 0 ;++1 x172 -1 x461 >= 0 ;++1 x173 -1 x462 >= 0 ;++1 x174 -1 x463 >= 0 ;++1 x175 -1 x464 >= 0 ;++1 x176 -1 x465 >= 0 ;++1 x177 -1 x466 >= 0 ;++1 x178 -1 x467 >= 0 ;++1 x179 -1 x468 >= 0 ;++1 x180 -1 x469 >= 0 ;++1 x181 >= 1 ;+-1 x479 >= 0 ;++1 x189 -1 x480 >= 0 ;++1 x190 -1 x481 >= 0 ;++1 x191 -1 x482 >= 0 ;++1 x192 -1 x483 >= 0 ;++1 x193 -1 x484 >= 0 ;++1 x194 -1 x485 >= 0 ;++1 x195 -1 x486 >= 0 ;++1 x196 -1 x487 >= 0 ;++1 x197 -1 x488 >= 0 ;++1 x198 -1 x489 >= 0 ;++1 x199 -1 x490 >= 0 ;++1 x200 -1 x491 >= 0 ;++1 x201 -1 x492 >= 0 ;++1 x202 -1 x493 >= 0 ;++1 x203 -1 x494 >= 0 ;++1 x204 -1 x495 >= 0 ;++1 x205 -1 x496 >= 0 ;++1 x206 -1 x497 >= 0 ;++1 x207 -1 x498 >= 0 ;++1 x208 -1 x499 >= 0 ;++1 x209 -1 x500 >= 0 ;++1 x210 -1 x501 >= 0 ;++1 x211 -1 x502 >= 0 ;++1 x212 -1 x503 >= 0 ;++1 x213 -1 x504 >= 0 ;++1 x214 -1 x505 >= 0 ;++1 x215 -1 x506 >= 0 ;++1 x216 -1 x507 >= 0 ;++1 x217 -1 x508 >= 0 ;++1 x218 -1 x509 >= 0 ;++1 x219 -1 x510 >= 0 ;++1 x220 -1 x511 >= 0 ;++1 x221 -1 x512 >= 0 ;++1 x222 -1 x513 >= 0 ;++1 x223 -1 x514 >= 0 ;++1 x224 -1 x515 >= 0 ;++1 x225 -1 x516 >= 0 ;++1 x226 -1 x517 >= 0 ;++1 x227 -1 x518 >= 0 ;++1 x228 -1 x519 >= 0 ;++1 x229 -1 x520 >= 0 ;++1 x230 -1 x521 >= 0 ;++1 x231 -1 x522 >= 0 ;++1 x232 -1 x523 >= 0 ;++1 x233 -1 x524 >= 0 ;++1 x234 -1 x525 >= 0 ;++1 x235 -1 x526 >= 0 ;++1 x236 -1 x527 >= 0 ;++1 x237 -1 x528 >= 0 ;++1 x238 -1 x529 >= 0 ;++1 x239 -1 x530 >= 0 ;++1 x240 -1 x531 >= 0 ;++1 x241 -1 x532 >= 0 ;++1 x242 -1 x533 >= 0 ;++1 x243 -1 x534 >= 0 ;++1 x244 -1 x535 >= 0 ;++1 x245 -1 x536 >= 0 ;++1 x246 -1 x537 >= 0 ;++1 x247 -1 x538 >= 0 ;++1 x248 -1 x539 >= 0 ;++1 x249 -1 x540 >= 0 ;++1 x250 -1 x541 >= 0 ;++1 x251 -1 x542 >= 0 ;++1 x252 -1 x543 >= 0 ;++1 x253 -1 x544 >= 0 ;++1 x254 -1 x545 >= 0 ;++1 x255 -1 x546 >= 0 ;++1 x256 -1 x547 >= 0 ;++1 x257 -1 x548 >= 0 ;++1 x258 -1 x549 >= 0 ;++1 x259 -1 x550 >= 0 ;++1 x260 -1 x551 >= 0 ;++1 x261 -1 x552 >= 0 ;++1 x262 -1 x553 >= 0 ;++1 x263 -1 x554 >= 0 ;++1 x264 -1 x555 >= 0 ;++1 x265 -1 x556 >= 0 ;++1 x266 -1 x557 >= 0 ;++1 x267 -1 x558 >= 0 ;++1 x268 -1 x559 >= 0 ;++1 x269 -1 x560 >= 0 ;++1 x270 -1 x561 >= 0 ;++1 x271 -1 x562 >= 0 ;++1 x272 -1 x563 >= 0 ;++1 x273 >= 1 ;+-1 x573 >= 0 ;++1 x1 -1 x574 >= 0 ;++1 x2 -1 x575 >= 0 ;++1 x3 -1 x576 >= 0 ;++1 x4 -1 x577 >= 0 ;++1 x5 -1 x578 >= 0 ;++1 x6 -1 x579 >= 0 ;++1 x7 -1 x580 >= 0 ;++1 x8 -1 x581 >= 0 ;++1 x9 -1 x582 >= 0 ;++1 x10 -1 x583 >= 0 ;++1 x11 -1 x584 >= 0 ;++1 x12 -1 x585 >= 0 ;++1 x13 -1 x586 >= 0 ;++1 x14 -1 x587 >= 0 ;++1 x15 -1 x588 >= 0 ;++1 x16 -1 x589 >= 0 ;++1 x17 -1 x590 >= 0 ;++1 x18 -1 x591 >= 0 ;++1 x19 -1 x592 >= 0 ;++1 x20 -1 x593 >= 0 ;++1 x21 -1 x594 >= 0 ;++1 x22 -1 x595 >= 0 ;++1 x23 -1 x596 >= 0 ;++1 x24 -1 x597 >= 0 ;++1 x25 -1 x598 >= 0 ;++1 x26 -1 x599 >= 0 ;++1 x27 -1 x600 >= 0 ;++1 x28 -1 x601 >= 0 ;++1 x29 -1 x602 >= 0 ;++1 x30 -1 x603 >= 0 ;++1 x31 -1 x604 >= 0 ;++1 x32 -1 x605 >= 0 ;++1 x33 -1 x606 >= 0 ;++1 x34 -1 x607 >= 0 ;++1 x35 -1 x608 >= 0 ;++1 x36 -1 x609 >= 0 ;++1 x37 -1 x610 >= 0 ;++1 x38 -1 x611 >= 0 ;++1 x39 -1 x612 >= 0 ;++1 x40 -1 x613 >= 0 ;++1 x41 -1 x614 >= 0 ;++1 x42 -1 x615 >= 0 ;++1 x43 -1 x616 >= 0 ;++1 x44 -1 x617 >= 0 ;++1 x45 -1 x618 >= 0 ;++1 x46 -1 x619 >= 0 ;++1 x47 -1 x620 >= 0 ;++1 x48 -1 x621 >= 0 ;++1 x49 -1 x622 >= 0 ;++1 x50 -1 x623 >= 0 ;++1 x51 -1 x624 >= 0 ;++1 x52 -1 x625 >= 0 ;++1 x53 -1 x626 >= 0 ;++1 x54 -1 x627 >= 0 ;++1 x55 -1 x628 >= 0 ;++1 x56 -1 x629 >= 0 ;++1 x57 -1 x630 >= 0 ;++1 x58 -1 x631 >= 0 ;++1 x59 -1 x632 >= 0 ;++1 x60 -1 x633 >= 0 ;++1 x61 -1 x634 >= 0 ;++1 x62 -1 x635 >= 0 ;++1 x63 -1 x636 >= 0 ;++1 x64 -1 x637 >= 0 ;++1 x65 -1 x638 >= 0 ;++1 x66 -1 x639 >= 0 ;++1 x67 -1 x640 >= 0 ;++1 x68 -1 x641 >= 0 ;++1 x69 -1 x642 >= 0 ;++1 x70 -1 x643 >= 0 ;++1 x71 -1 x644 >= 0 ;++1 x72 -1 x645 >= 0 ;++1 x73 -1 x646 >= 0 ;++1 x74 -1 x647 >= 0 ;++1 x75 -1 x648 >= 0 ;++1 x76 -1 x649 >= 0 ;++1 x77 -1 x650 >= 0 ;++1 x78 -1 x651 >= 0 ;++1 x79 -1 x652 >= 0 ;++1 x80 -1 x653 >= 0 ;++1 x81 -1 x654 >= 0 ;++1 x82 -1 x655 >= 0 ;++1 x83 -1 x656 >= 0 ;++1 x84 -1 x657 >= 0 ;++1 x85 >= 1 ;+-1 x668 >= 0 ;++1 x565 -1 x669 >= 0 ;++1 x566 -1 x670 >= 0 ;++1 x567 -1 x671 >= 0 ;++1 x568 -1 x672 >= 0 ;++1 x569 -1 x673 >= 0 ;++1 x570 -1 x674 >= 0 ;++1 x571 -1 x675 >= 0 ;++1 x572 -1 x676 >= 0 ;++1 x573 -1 x677 >= 0 ;++1 x574 -1 x678 >= 0 ;++1 x575 -1 x679 >= 0 ;++1 x576 -1 x680 >= 0 ;++1 x577 -1 x681 >= 0 ;++1 x578 -1 x682 >= 0 ;++1 x579 -1 x683 >= 0 ;++1 x580 -1 x684 >= 0 ;++1 x581 -1 x685 >= 0 ;++1 x582 -1 x686 >= 0 ;++1 x583 -1 x687 >= 0 ;++1 x584 -1 x688 >= 0 ;++1 x585 -1 x689 >= 0 ;++1 x586 -1 x690 >= 0 ;++1 x587 -1 x691 >= 0 ;++1 x588 -1 x692 >= 0 ;++1 x589 -1 x693 >= 0 ;++1 x590 -1 x694 >= 0 ;++1 x591 -1 x695 >= 0 ;++1 x592 -1 x696 >= 0 ;++1 x593 -1 x697 >= 0 ;++1 x594 -1 x698 >= 0 ;++1 x595 -1 x699 >= 0 ;++1 x596 -1 x700 >= 0 ;++1 x597 -1 x701 >= 0 ;++1 x598 -1 x702 >= 0 ;++1 x599 -1 x703 >= 0 ;++1 x600 -1 x704 >= 0 ;++1 x601 -1 x705 >= 0 ;++1 x602 -1 x706 >= 0 ;++1 x603 -1 x707 >= 0 ;++1 x604 -1 x708 >= 0 ;++1 x605 -1 x709 >= 0 ;++1 x606 -1 x710 >= 0 ;++1 x607 -1 x711 >= 0 ;++1 x608 -1 x712 >= 0 ;++1 x609 -1 x713 >= 0 ;++1 x610 -1 x714 >= 0 ;++1 x611 -1 x715 >= 0 ;++1 x612 -1 x716 >= 0 ;++1 x613 -1 x717 >= 0 ;++1 x614 -1 x718 >= 0 ;++1 x615 -1 x719 >= 0 ;++1 x616 -1 x720 >= 0 ;++1 x617 -1 x721 >= 0 ;++1 x618 -1 x722 >= 0 ;++1 x619 -1 x723 >= 0 ;++1 x620 -1 x724 >= 0 ;++1 x621 -1 x725 >= 0 ;++1 x622 -1 x726 >= 0 ;++1 x623 -1 x727 >= 0 ;++1 x624 -1 x728 >= 0 ;++1 x625 -1 x729 >= 0 ;++1 x626 -1 x730 >= 0 ;++1 x627 -1 x731 >= 0 ;++1 x628 -1 x732 >= 0 ;++1 x629 -1 x733 >= 0 ;++1 x630 -1 x734 >= 0 ;++1 x631 -1 x735 >= 0 ;++1 x632 -1 x736 >= 0 ;++1 x633 -1 x737 >= 0 ;++1 x634 -1 x738 >= 0 ;++1 x635 -1 x739 >= 0 ;++1 x636 -1 x740 >= 0 ;++1 x637 -1 x741 >= 0 ;++1 x638 -1 x742 >= 0 ;++1 x639 -1 x743 >= 0 ;++1 x640 -1 x744 >= 0 ;++1 x641 -1 x745 >= 0 ;++1 x642 -1 x746 >= 0 ;++1 x643 -1 x747 >= 0 ;++1 x644 -1 x748 >= 0 ;++1 x645 -1 x749 >= 0 ;++1 x646 -1 x750 >= 0 ;++1 x647 -1 x751 >= 0 ;++1 x648 >= 1 ;+-1 x762 >= 0 ;++1 x565 -1 x763 >= 0 ;++1 x566 -1 x764 >= 0 ;++1 x567 -1 x765 >= 0 ;++1 x568 -1 x766 >= 0 ;++1 x569 -1 x767 >= 0 ;++1 x570 -1 x768 >= 0 ;++1 x571 -1 x769 >= 0 ;++1 x572 -1 x770 >= 0 ;++1 x573 -1 x771 >= 0 ;++1 x574 -1 x772 >= 0 ;++1 x575 -1 x773 >= 0 ;++1 x576 -1 x774 >= 0 ;++1 x577 -1 x775 >= 0 ;++1 x578 -1 x776 >= 0 ;++1 x579 -1 x777 >= 0 ;++1 x580 -1 x778 >= 0 ;++1 x581 -1 x779 >= 0 ;++1 x582 -1 x780 >= 0 ;++1 x583 -1 x781 >= 0 ;++1 x584 -1 x782 >= 0 ;++1 x585 -1 x783 >= 0 ;++1 x586 -1 x784 >= 0 ;++1 x587 -1 x785 >= 0 ;++1 x588 -1 x786 >= 0 ;++1 x589 -1 x787 >= 0 ;++1 x590 -1 x788 >= 0 ;++1 x591 -1 x789 >= 0 ;++1 x592 -1 x790 >= 0 ;++1 x593 -1 x791 >= 0 ;++1 x594 -1 x792 >= 0 ;++1 x595 -1 x793 >= 0 ;++1 x596 -1 x794 >= 0 ;++1 x597 -1 x795 >= 0 ;++1 x598 -1 x796 >= 0 ;++1 x599 -1 x797 >= 0 ;++1 x600 -1 x798 >= 0 ;++1 x601 -1 x799 >= 0 ;++1 x602 -1 x800 >= 0 ;++1 x603 -1 x801 >= 0 ;++1 x604 -1 x802 >= 0 ;++1 x605 -1 x803 >= 0 ;++1 x606 -1 x804 >= 0 ;++1 x607 -1 x805 >= 0 ;++1 x608 -1 x806 >= 0 ;++1 x609 -1 x807 >= 0 ;++1 x610 -1 x808 >= 0 ;++1 x611 -1 x809 >= 0 ;++1 x612 -1 x810 >= 0 ;++1 x613 -1 x811 >= 0 ;++1 x614 -1 x812 >= 0 ;++1 x615 -1 x813 >= 0 ;++1 x616 -1 x814 >= 0 ;++1 x617 -1 x815 >= 0 ;++1 x618 -1 x816 >= 0 ;++1 x619 -1 x817 >= 0 ;++1 x620 -1 x818 >= 0 ;++1 x621 -1 x819 >= 0 ;++1 x622 -1 x820 >= 0 ;++1 x623 -1 x821 >= 0 ;++1 x624 -1 x822 >= 0 ;++1 x625 -1 x823 >= 0 ;++1 x626 -1 x824 >= 0 ;++1 x627 -1 x825 >= 0 ;++1 x628 -1 x826 >= 0 ;++1 x629 -1 x827 >= 0 ;++1 x630 -1 x828 >= 0 ;++1 x631 -1 x829 >= 0 ;++1 x632 -1 x830 >= 0 ;++1 x633 -1 x831 >= 0 ;++1 x634 -1 x832 >= 0 ;++1 x635 -1 x833 >= 0 ;++1 x636 -1 x834 >= 0 ;++1 x637 -1 x835 >= 0 ;++1 x638 -1 x836 >= 0 ;++1 x639 -1 x837 >= 0 ;++1 x640 -1 x838 >= 0 ;++1 x641 -1 x839 >= 0 ;++1 x642 -1 x840 >= 0 ;++1 x643 -1 x841 >= 0 ;++1 x644 -1 x842 >= 0 ;++1 x645 -1 x843 >= 0 ;++1 x646 -1 x844 >= 0 ;++1 x647 -1 x845 >= 0 ;++1 x648 >= 1 ;+-1 x849 >= 0 ;++1 x283 -1 x850 >= 0 ;++1 x284 -1 x851 >= 0 ;++1 x285 -1 x852 >= 0 ;++1 x286 -1 x853 >= 0 ;++1 x287 -1 x854 >= 0 ;++1 x288 -1 x855 >= 0 ;++1 x289 -1 x856 >= 0 ;++1 x290 -1 x857 >= 0 ;++1 x291 -1 x858 >= 0 ;++1 x292 -1 x859 >= 0 ;++1 x293 -1 x860 >= 0 ;++1 x294 -1 x861 >= 0 ;++1 x295 -1 x862 >= 0 ;++1 x296 -1 x863 >= 0 ;++1 x297 -1 x864 >= 0 ;++1 x298 -1 x865 >= 0 ;++1 x299 -1 x866 >= 0 ;++1 x300 -1 x867 >= 0 ;++1 x301 -1 x868 >= 0 ;++1 x302 -1 x869 >= 0 ;++1 x303 -1 x870 >= 0 ;++1 x304 -1 x871 >= 0 ;++1 x305 -1 x872 >= 0 ;++1 x306 -1 x873 >= 0 ;++1 x307 -1 x874 >= 0 ;++1 x308 -1 x875 >= 0 ;++1 x309 -1 x876 >= 0 ;++1 x310 -1 x877 >= 0 ;++1 x311 -1 x878 >= 0 ;++1 x312 -1 x879 >= 0 ;++1 x313 -1 x880 >= 0 ;++1 x314 -1 x881 >= 0 ;++1 x315 -1 x882 >= 0 ;++1 x316 -1 x883 >= 0 ;++1 x317 -1 x884 >= 0 ;++1 x318 -1 x885 >= 0 ;++1 x319 -1 x886 >= 0 ;++1 x320 -1 x887 >= 0 ;++1 x321 -1 x888 >= 0 ;++1 x322 -1 x889 >= 0 ;++1 x323 -1 x890 >= 0 ;++1 x324 -1 x891 >= 0 ;++1 x325 -1 x892 >= 0 ;++1 x326 -1 x893 >= 0 ;++1 x327 -1 x894 >= 0 ;++1 x328 -1 x895 >= 0 ;++1 x329 -1 x896 >= 0 ;++1 x330 -1 x897 >= 0 ;++1 x331 -1 x898 >= 0 ;++1 x332 -1 x899 >= 0 ;++1 x333 -1 x900 >= 0 ;++1 x334 -1 x901 >= 0 ;++1 x335 -1 x902 >= 0 ;++1 x336 -1 x903 >= 0 ;++1 x337 -1 x904 >= 0 ;++1 x338 -1 x905 >= 0 ;++1 x339 -1 x906 >= 0 ;++1 x340 -1 x907 >= 0 ;++1 x341 -1 x908 >= 0 ;++1 x342 -1 x909 >= 0 ;++1 x343 -1 x910 >= 0 ;++1 x344 -1 x911 >= 0 ;++1 x345 -1 x912 >= 0 ;++1 x346 -1 x913 >= 0 ;++1 x347 -1 x914 >= 0 ;++1 x348 -1 x915 >= 0 ;++1 x349 -1 x916 >= 0 ;++1 x350 -1 x917 >= 0 ;++1 x351 -1 x918 >= 0 ;++1 x352 -1 x919 >= 0 ;++1 x353 -1 x920 >= 0 ;++1 x354 -1 x921 >= 0 ;++1 x355 -1 x922 >= 0 ;++1 x356 -1 x923 >= 0 ;++1 x357 -1 x924 >= 0 ;++1 x358 -1 x925 >= 0 ;++1 x359 -1 x926 >= 0 ;++1 x360 -1 x927 >= 0 ;++1 x361 -1 x928 >= 0 ;++1 x362 -1 x929 >= 0 ;++1 x363 -1 x930 >= 0 ;++1 x364 -1 x931 >= 0 ;++1 x365 -1 x932 >= 0 ;++1 x366 -1 x933 >= 0 ;++1 x367 -1 x934 >= 0 ;++1 x368 -1 x935 >= 0 ;++1 x369 -1 x936 >= 0 ;++1 x370 -1 x937 >= 0 ;++1 x371 -1 x938 >= 0 ;++1 x372 -1 x939 >= 0 ;++1 x373 >= 1 ;+-1 x949 >= 0 ;++1 x189 -1 x950 >= 0 ;++1 x190 -1 x951 >= 0 ;++1 x191 -1 x952 >= 0 ;++1 x192 -1 x953 >= 0 ;++1 x193 -1 x954 >= 0 ;++1 x194 -1 x955 >= 0 ;++1 x195 -1 x956 >= 0 ;++1 x196 -1 x957 >= 0 ;++1 x197 -1 x958 >= 0 ;++1 x198 -1 x959 >= 0 ;++1 x199 -1 x960 >= 0 ;++1 x200 -1 x961 >= 0 ;++1 x201 -1 x962 >= 0 ;++1 x202 -1 x963 >= 0 ;++1 x203 -1 x964 >= 0 ;++1 x204 -1 x965 >= 0 ;++1 x205 -1 x966 >= 0 ;++1 x206 -1 x967 >= 0 ;++1 x207 -1 x968 >= 0 ;++1 x208 -1 x969 >= 0 ;++1 x209 -1 x970 >= 0 ;++1 x210 -1 x971 >= 0 ;++1 x211 -1 x972 >= 0 ;++1 x212 -1 x973 >= 0 ;++1 x213 -1 x974 >= 0 ;++1 x214 -1 x975 >= 0 ;++1 x215 -1 x976 >= 0 ;++1 x216 -1 x977 >= 0 ;++1 x217 -1 x978 >= 0 ;++1 x218 -1 x979 >= 0 ;++1 x219 -1 x980 >= 0 ;++1 x220 -1 x981 >= 0 ;++1 x221 -1 x982 >= 0 ;++1 x222 -1 x983 >= 0 ;++1 x223 -1 x984 >= 0 ;++1 x224 -1 x985 >= 0 ;++1 x225 -1 x986 >= 0 ;++1 x226 -1 x987 >= 0 ;++1 x227 -1 x988 >= 0 ;++1 x228 -1 x989 >= 0 ;++1 x229 -1 x990 >= 0 ;++1 x230 -1 x991 >= 0 ;++1 x231 -1 x992 >= 0 ;++1 x232 -1 x993 >= 0 ;++1 x233 -1 x994 >= 0 ;++1 x234 -1 x995 >= 0 ;++1 x235 -1 x996 >= 0 ;++1 x236 -1 x997 >= 0 ;++1 x237 -1 x998 >= 0 ;++1 x238 -1 x999 >= 0 ;++1 x239 -1 x1000 >= 0 ;++1 x240 -1 x1001 >= 0 ;++1 x241 -1 x1002 >= 0 ;++1 x242 -1 x1003 >= 0 ;++1 x243 -1 x1004 >= 0 ;++1 x244 -1 x1005 >= 0 ;++1 x245 -1 x1006 >= 0 ;++1 x246 -1 x1007 >= 0 ;++1 x247 -1 x1008 >= 0 ;++1 x248 -1 x1009 >= 0 ;++1 x249 -1 x1010 >= 0 ;++1 x250 -1 x1011 >= 0 ;++1 x251 -1 x1012 >= 0 ;++1 x252 -1 x1013 >= 0 ;++1 x253 -1 x1014 >= 0 ;++1 x254 -1 x1015 >= 0 ;++1 x255 -1 x1016 >= 0 ;++1 x256 -1 x1017 >= 0 ;++1 x257 -1 x1018 >= 0 ;++1 x258 -1 x1019 >= 0 ;++1 x259 -1 x1020 >= 0 ;++1 x260 -1 x1021 >= 0 ;++1 x261 -1 x1022 >= 0 ;++1 x262 -1 x1023 >= 0 ;++1 x263 -1 x1024 >= 0 ;++1 x264 -1 x1025 >= 0 ;++1 x265 -1 x1026 >= 0 ;++1 x266 -1 x1027 >= 0 ;++1 x267 -1 x1028 >= 0 ;++1 x268 -1 x1029 >= 0 ;++1 x269 -1 x1030 >= 0 ;++1 x270 -1 x1031 >= 0 ;++1 x271 -1 x1032 >= 0 ;++1 x272 -1 x1033 >= 0 ;++1 x273 >= 1 ;+-1 x1044 >= 0 ;++1 x565 -1 x1045 >= 0 ;++1 x566 -1 x1046 >= 0 ;++1 x567 -1 x1047 >= 0 ;++1 x568 -1 x1048 >= 0 ;++1 x569 -1 x1049 >= 0 ;++1 x570 -1 x1050 >= 0 ;++1 x571 -1 x1051 >= 0 ;++1 x572 -1 x1052 >= 0 ;++1 x573 -1 x1053 >= 0 ;++1 x574 -1 x1054 >= 0 ;++1 x575 -1 x1055 >= 0 ;++1 x576 -1 x1056 >= 0 ;++1 x577 -1 x1057 >= 0 ;++1 x578 -1 x1058 >= 0 ;++1 x579 -1 x1059 >= 0 ;++1 x580 -1 x1060 >= 0 ;++1 x581 -1 x1061 >= 0 ;++1 x582 -1 x1062 >= 0 ;++1 x583 -1 x1063 >= 0 ;++1 x584 -1 x1064 >= 0 ;++1 x585 -1 x1065 >= 0 ;++1 x586 -1 x1066 >= 0 ;++1 x587 -1 x1067 >= 0 ;++1 x588 -1 x1068 >= 0 ;++1 x589 -1 x1069 >= 0 ;++1 x590 -1 x1070 >= 0 ;++1 x591 -1 x1071 >= 0 ;++1 x592 -1 x1072 >= 0 ;++1 x593 -1 x1073 >= 0 ;++1 x594 -1 x1074 >= 0 ;++1 x595 -1 x1075 >= 0 ;++1 x596 -1 x1076 >= 0 ;++1 x597 -1 x1077 >= 0 ;++1 x598 -1 x1078 >= 0 ;++1 x599 -1 x1079 >= 0 ;++1 x600 -1 x1080 >= 0 ;++1 x601 -1 x1081 >= 0 ;++1 x602 -1 x1082 >= 0 ;++1 x603 -1 x1083 >= 0 ;++1 x604 -1 x1084 >= 0 ;++1 x605 -1 x1085 >= 0 ;++1 x606 -1 x1086 >= 0 ;++1 x607 -1 x1087 >= 0 ;++1 x608 -1 x1088 >= 0 ;++1 x609 -1 x1089 >= 0 ;++1 x610 -1 x1090 >= 0 ;++1 x611 -1 x1091 >= 0 ;++1 x612 -1 x1092 >= 0 ;++1 x613 -1 x1093 >= 0 ;++1 x614 -1 x1094 >= 0 ;++1 x615 -1 x1095 >= 0 ;++1 x616 -1 x1096 >= 0 ;++1 x617 -1 x1097 >= 0 ;++1 x618 -1 x1098 >= 0 ;++1 x619 -1 x1099 >= 0 ;++1 x620 -1 x1100 >= 0 ;++1 x621 -1 x1101 >= 0 ;++1 x622 -1 x1102 >= 0 ;++1 x623 -1 x1103 >= 0 ;++1 x624 -1 x1104 >= 0 ;++1 x625 -1 x1105 >= 0 ;++1 x626 -1 x1106 >= 0 ;++1 x627 -1 x1107 >= 0 ;++1 x628 -1 x1108 >= 0 ;++1 x629 -1 x1109 >= 0 ;++1 x630 -1 x1110 >= 0 ;++1 x631 -1 x1111 >= 0 ;++1 x632 -1 x1112 >= 0 ;++1 x633 -1 x1113 >= 0 ;++1 x634 -1 x1114 >= 0 ;++1 x635 -1 x1115 >= 0 ;++1 x636 -1 x1116 >= 0 ;++1 x637 -1 x1117 >= 0 ;++1 x638 -1 x1118 >= 0 ;++1 x639 -1 x1119 >= 0 ;++1 x640 -1 x1120 >= 0 ;++1 x641 -1 x1121 >= 0 ;++1 x642 -1 x1122 >= 0 ;++1 x643 -1 x1123 >= 0 ;++1 x644 -1 x1124 >= 0 ;++1 x645 -1 x1125 >= 0 ;++1 x646 -1 x1126 >= 0 ;++1 x647 -1 x1127 >= 0 ;++1 x648 >= 1 ;+-1 x1137 >= 0 ;++1 x1 -1 x1138 >= 0 ;++1 x2 -1 x1139 >= 0 ;++1 x3 -1 x1140 >= 0 ;++1 x4 -1 x1141 >= 0 ;++1 x5 -1 x1142 >= 0 ;++1 x6 -1 x1143 >= 0 ;++1 x7 -1 x1144 >= 0 ;++1 x8 -1 x1145 >= 0 ;++1 x9 -1 x1146 >= 0 ;++1 x10 -1 x1147 >= 0 ;++1 x11 -1 x1148 >= 0 ;++1 x12 -1 x1149 >= 0 ;++1 x13 -1 x1150 >= 0 ;++1 x14 -1 x1151 >= 0 ;++1 x15 -1 x1152 >= 0 ;++1 x16 -1 x1153 >= 0 ;++1 x17 -1 x1154 >= 0 ;++1 x18 -1 x1155 >= 0 ;++1 x19 -1 x1156 >= 0 ;++1 x20 -1 x1157 >= 0 ;++1 x21 -1 x1158 >= 0 ;++1 x22 -1 x1159 >= 0 ;++1 x23 -1 x1160 >= 0 ;++1 x24 -1 x1161 >= 0 ;++1 x25 -1 x1162 >= 0 ;++1 x26 -1 x1163 >= 0 ;++1 x27 -1 x1164 >= 0 ;++1 x28 -1 x1165 >= 0 ;++1 x29 -1 x1166 >= 0 ;++1 x30 -1 x1167 >= 0 ;++1 x31 -1 x1168 >= 0 ;++1 x32 -1 x1169 >= 0 ;++1 x33 -1 x1170 >= 0 ;++1 x34 -1 x1171 >= 0 ;++1 x35 -1 x1172 >= 0 ;++1 x36 -1 x1173 >= 0 ;++1 x37 -1 x1174 >= 0 ;++1 x38 -1 x1175 >= 0 ;++1 x39 -1 x1176 >= 0 ;++1 x40 -1 x1177 >= 0 ;++1 x41 -1 x1178 >= 0 ;++1 x42 -1 x1179 >= 0 ;++1 x43 -1 x1180 >= 0 ;++1 x44 -1 x1181 >= 0 ;++1 x45 -1 x1182 >= 0 ;++1 x46 -1 x1183 >= 0 ;++1 x47 -1 x1184 >= 0 ;++1 x48 -1 x1185 >= 0 ;++1 x49 -1 x1186 >= 0 ;++1 x50 -1 x1187 >= 0 ;++1 x51 -1 x1188 >= 0 ;++1 x52 -1 x1189 >= 0 ;++1 x53 -1 x1190 >= 0 ;++1 x54 -1 x1191 >= 0 ;++1 x55 -1 x1192 >= 0 ;++1 x56 -1 x1193 >= 0 ;++1 x57 -1 x1194 >= 0 ;++1 x58 -1 x1195 >= 0 ;++1 x59 -1 x1196 >= 0 ;++1 x60 -1 x1197 >= 0 ;++1 x61 -1 x1198 >= 0 ;++1 x62 -1 x1199 >= 0 ;++1 x63 -1 x1200 >= 0 ;++1 x64 -1 x1201 >= 0 ;++1 x65 -1 x1202 >= 0 ;++1 x66 -1 x1203 >= 0 ;++1 x67 -1 x1204 >= 0 ;++1 x68 -1 x1205 >= 0 ;++1 x69 -1 x1206 >= 0 ;++1 x70 -1 x1207 >= 0 ;++1 x71 -1 x1208 >= 0 ;++1 x72 -1 x1209 >= 0 ;++1 x73 -1 x1210 >= 0 ;++1 x74 -1 x1211 >= 0 ;++1 x75 -1 x1212 >= 0 ;++1 x76 -1 x1213 >= 0 ;++1 x77 -1 x1214 >= 0 ;++1 x78 -1 x1215 >= 0 ;++1 x79 -1 x1216 >= 0 ;++1 x80 -1 x1217 >= 0 ;++1 x81 -1 x1218 >= 0 ;++1 x82 -1 x1219 >= 0 ;++1 x83 -1 x1220 >= 0 ;++1 x84 -1 x1221 >= 0 ;++1 x85 >= 1 ;+-1 x1132 >= 0 ;++1 x377 -1 x1133 >= 0 ;++1 x378 -1 x1134 >= 0 ;++1 x379 -1 x1135 >= 0 ;++1 x380 -1 x1136 >= 0 ;++1 x381 -1 x1137 >= 0 ;++1 x382 -1 x1138 >= 0 ;++1 x383 -1 x1139 >= 0 ;++1 x384 -1 x1140 >= 0 ;++1 x385 -1 x1141 >= 0 ;++1 x386 -1 x1142 >= 0 ;++1 x387 -1 x1143 >= 0 ;++1 x388 -1 x1144 >= 0 ;++1 x389 -1 x1145 >= 0 ;++1 x390 -1 x1146 >= 0 ;++1 x391 -1 x1147 >= 0 ;++1 x392 -1 x1148 >= 0 ;++1 x393 -1 x1149 >= 0 ;++1 x394 -1 x1150 >= 0 ;++1 x395 -1 x1151 >= 0 ;++1 x396 -1 x1152 >= 0 ;++1 x397 -1 x1153 >= 0 ;++1 x398 -1 x1154 >= 0 ;++1 x399 -1 x1155 >= 0 ;++1 x400 -1 x1156 >= 0 ;++1 x401 -1 x1157 >= 0 ;++1 x402 -1 x1158 >= 0 ;++1 x403 -1 x1159 >= 0 ;++1 x404 -1 x1160 >= 0 ;++1 x405 -1 x1161 >= 0 ;++1 x406 -1 x1162 >= 0 ;++1 x407 -1 x1163 >= 0 ;++1 x408 -1 x1164 >= 0 ;++1 x409 -1 x1165 >= 0 ;++1 x410 -1 x1166 >= 0 ;++1 x411 -1 x1167 >= 0 ;++1 x412 -1 x1168 >= 0 ;++1 x413 -1 x1169 >= 0 ;++1 x414 -1 x1170 >= 0 ;++1 x415 -1 x1171 >= 0 ;++1 x416 -1 x1172 >= 0 ;++1 x417 -1 x1173 >= 0 ;++1 x418 -1 x1174 >= 0 ;++1 x419 -1 x1175 >= 0 ;++1 x420 -1 x1176 >= 0 ;++1 x421 -1 x1177 >= 0 ;++1 x422 -1 x1178 >= 0 ;++1 x423 -1 x1179 >= 0 ;++1 x424 -1 x1180 >= 0 ;++1 x425 -1 x1181 >= 0 ;++1 x426 -1 x1182 >= 0 ;++1 x427 -1 x1183 >= 0 ;++1 x428 -1 x1184 >= 0 ;++1 x429 -1 x1185 >= 0 ;++1 x430 -1 x1186 >= 0 ;++1 x431 -1 x1187 >= 0 ;++1 x432 -1 x1188 >= 0 ;++1 x433 -1 x1189 >= 0 ;++1 x434 -1 x1190 >= 0 ;++1 x435 -1 x1191 >= 0 ;++1 x436 -1 x1192 >= 0 ;++1 x437 -1 x1193 >= 0 ;++1 x438 -1 x1194 >= 0 ;++1 x439 -1 x1195 >= 0 ;++1 x440 -1 x1196 >= 0 ;++1 x441 -1 x1197 >= 0 ;++1 x442 -1 x1198 >= 0 ;++1 x443 -1 x1199 >= 0 ;++1 x444 -1 x1200 >= 0 ;++1 x445 -1 x1201 >= 0 ;++1 x446 -1 x1202 >= 0 ;++1 x447 -1 x1203 >= 0 ;++1 x448 -1 x1204 >= 0 ;++1 x449 -1 x1205 >= 0 ;++1 x450 -1 x1206 >= 0 ;++1 x451 -1 x1207 >= 0 ;++1 x452 -1 x1208 >= 0 ;++1 x453 -1 x1209 >= 0 ;++1 x454 -1 x1210 >= 0 ;++1 x455 -1 x1211 >= 0 ;++1 x456 -1 x1212 >= 0 ;++1 x457 -1 x1213 >= 0 ;++1 x458 -1 x1214 >= 0 ;++1 x459 -1 x1215 >= 0 ;++1 x460 -1 x1216 >= 0 ;++1 x461 -1 x1217 >= 0 ;++1 x462 -1 x1218 >= 0 ;++1 x463 -1 x1219 >= 0 ;++1 x464 -1 x1220 >= 0 ;++1 x465 -1 x1221 >= 0 ;++1 x466 >= 1 ;+-1 x1225 >= 0 ;++1 x659 -1 x1226 >= 0 ;++1 x660 -1 x1227 >= 0 ;++1 x661 -1 x1228 >= 0 ;++1 x662 -1 x1229 >= 0 ;++1 x663 -1 x1230 >= 0 ;++1 x664 -1 x1231 >= 0 ;++1 x665 -1 x1232 >= 0 ;++1 x666 -1 x1233 >= 0 ;++1 x667 -1 x1234 >= 0 ;++1 x668 -1 x1235 >= 0 ;++1 x669 -1 x1236 >= 0 ;++1 x670 -1 x1237 >= 0 ;++1 x671 -1 x1238 >= 0 ;++1 x672 -1 x1239 >= 0 ;++1 x673 -1 x1240 >= 0 ;++1 x674 -1 x1241 >= 0 ;++1 x675 -1 x1242 >= 0 ;++1 x676 -1 x1243 >= 0 ;++1 x677 -1 x1244 >= 0 ;++1 x678 -1 x1245 >= 0 ;++1 x679 -1 x1246 >= 0 ;++1 x680 -1 x1247 >= 0 ;++1 x681 -1 x1248 >= 0 ;++1 x682 -1 x1249 >= 0 ;++1 x683 -1 x1250 >= 0 ;++1 x684 -1 x1251 >= 0 ;++1 x685 -1 x1252 >= 0 ;++1 x686 -1 x1253 >= 0 ;++1 x687 -1 x1254 >= 0 ;++1 x688 -1 x1255 >= 0 ;++1 x689 -1 x1256 >= 0 ;++1 x690 -1 x1257 >= 0 ;++1 x691 -1 x1258 >= 0 ;++1 x692 -1 x1259 >= 0 ;++1 x693 -1 x1260 >= 0 ;++1 x694 -1 x1261 >= 0 ;++1 x695 -1 x1262 >= 0 ;++1 x696 -1 x1263 >= 0 ;++1 x697 -1 x1264 >= 0 ;++1 x698 -1 x1265 >= 0 ;++1 x699 -1 x1266 >= 0 ;++1 x700 -1 x1267 >= 0 ;++1 x701 -1 x1268 >= 0 ;++1 x702 -1 x1269 >= 0 ;++1 x703 -1 x1270 >= 0 ;++1 x704 -1 x1271 >= 0 ;++1 x705 -1 x1272 >= 0 ;++1 x706 -1 x1273 >= 0 ;++1 x707 -1 x1274 >= 0 ;++1 x708 -1 x1275 >= 0 ;++1 x709 -1 x1276 >= 0 ;++1 x710 -1 x1277 >= 0 ;++1 x711 -1 x1278 >= 0 ;++1 x712 -1 x1279 >= 0 ;++1 x713 -1 x1280 >= 0 ;++1 x714 -1 x1281 >= 0 ;++1 x715 -1 x1282 >= 0 ;++1 x716 -1 x1283 >= 0 ;++1 x717 -1 x1284 >= 0 ;++1 x718 -1 x1285 >= 0 ;++1 x719 -1 x1286 >= 0 ;++1 x720 -1 x1287 >= 0 ;++1 x721 -1 x1288 >= 0 ;++1 x722 -1 x1289 >= 0 ;++1 x723 -1 x1290 >= 0 ;++1 x724 -1 x1291 >= 0 ;++1 x725 -1 x1292 >= 0 ;++1 x726 -1 x1293 >= 0 ;++1 x727 -1 x1294 >= 0 ;++1 x728 -1 x1295 >= 0 ;++1 x729 -1 x1296 >= 0 ;++1 x730 -1 x1297 >= 0 ;++1 x731 -1 x1298 >= 0 ;++1 x732 -1 x1299 >= 0 ;++1 x733 -1 x1300 >= 0 ;++1 x734 -1 x1301 >= 0 ;++1 x735 -1 x1302 >= 0 ;++1 x736 -1 x1303 >= 0 ;++1 x737 -1 x1304 >= 0 ;++1 x738 -1 x1305 >= 0 ;++1 x739 -1 x1306 >= 0 ;++1 x740 -1 x1307 >= 0 ;++1 x741 -1 x1308 >= 0 ;++1 x742 -1 x1309 >= 0 ;++1 x743 -1 x1310 >= 0 ;++1 x744 -1 x1311 >= 0 ;++1 x745 -1 x1312 >= 0 ;++1 x746 -1 x1313 >= 0 ;++1 x747 -1 x1314 >= 0 ;++1 x748 -1 x1315 >= 0 ;++1 x749 >= 1 ;+-1 x1230 >= 0 ;++1 x941 -1 x1231 >= 0 ;++1 x942 -1 x1232 >= 0 ;++1 x943 -1 x1233 >= 0 ;++1 x944 -1 x1234 >= 0 ;++1 x945 -1 x1235 >= 0 ;++1 x946 -1 x1236 >= 0 ;++1 x947 -1 x1237 >= 0 ;++1 x948 -1 x1238 >= 0 ;++1 x949 -1 x1239 >= 0 ;++1 x950 -1 x1240 >= 0 ;++1 x951 -1 x1241 >= 0 ;++1 x952 -1 x1242 >= 0 ;++1 x953 -1 x1243 >= 0 ;++1 x954 -1 x1244 >= 0 ;++1 x955 -1 x1245 >= 0 ;++1 x956 -1 x1246 >= 0 ;++1 x957 -1 x1247 >= 0 ;++1 x958 -1 x1248 >= 0 ;++1 x959 -1 x1249 >= 0 ;++1 x960 -1 x1250 >= 0 ;++1 x961 -1 x1251 >= 0 ;++1 x962 -1 x1252 >= 0 ;++1 x963 -1 x1253 >= 0 ;++1 x964 -1 x1254 >= 0 ;++1 x965 -1 x1255 >= 0 ;++1 x966 -1 x1256 >= 0 ;++1 x967 -1 x1257 >= 0 ;++1 x968 -1 x1258 >= 0 ;++1 x969 -1 x1259 >= 0 ;++1 x970 -1 x1260 >= 0 ;++1 x971 -1 x1261 >= 0 ;++1 x972 -1 x1262 >= 0 ;++1 x973 -1 x1263 >= 0 ;++1 x974 -1 x1264 >= 0 ;++1 x975 -1 x1265 >= 0 ;++1 x976 -1 x1266 >= 0 ;++1 x977 -1 x1267 >= 0 ;++1 x978 -1 x1268 >= 0 ;++1 x979 -1 x1269 >= 0 ;++1 x980 -1 x1270 >= 0 ;++1 x981 -1 x1271 >= 0 ;++1 x982 -1 x1272 >= 0 ;++1 x983 -1 x1273 >= 0 ;++1 x984 -1 x1274 >= 0 ;++1 x985 -1 x1275 >= 0 ;++1 x986 -1 x1276 >= 0 ;++1 x987 -1 x1277 >= 0 ;++1 x988 -1 x1278 >= 0 ;++1 x989 -1 x1279 >= 0 ;++1 x990 -1 x1280 >= 0 ;++1 x991 -1 x1281 >= 0 ;++1 x992 -1 x1282 >= 0 ;++1 x993 -1 x1283 >= 0 ;++1 x994 -1 x1284 >= 0 ;++1 x995 -1 x1285 >= 0 ;++1 x996 -1 x1286 >= 0 ;++1 x997 -1 x1287 >= 0 ;++1 x998 -1 x1288 >= 0 ;++1 x999 -1 x1289 >= 0 ;++1 x1000 -1 x1290 >= 0 ;++1 x1001 -1 x1291 >= 0 ;++1 x1002 -1 x1292 >= 0 ;++1 x1003 -1 x1293 >= 0 ;++1 x1004 -1 x1294 >= 0 ;++1 x1005 -1 x1295 >= 0 ;++1 x1006 -1 x1296 >= 0 ;++1 x1007 -1 x1297 >= 0 ;++1 x1008 -1 x1298 >= 0 ;++1 x1009 -1 x1299 >= 0 ;++1 x1010 -1 x1300 >= 0 ;++1 x1011 -1 x1301 >= 0 ;++1 x1012 -1 x1302 >= 0 ;++1 x1013 -1 x1303 >= 0 ;++1 x1014 -1 x1304 >= 0 ;++1 x1015 -1 x1305 >= 0 ;++1 x1016 -1 x1306 >= 0 ;++1 x1017 -1 x1307 >= 0 ;++1 x1018 -1 x1308 >= 0 ;++1 x1019 -1 x1309 >= 0 ;++1 x1020 -1 x1310 >= 0 ;++1 x1021 -1 x1311 >= 0 ;++1 x1022 -1 x1312 >= 0 ;++1 x1023 -1 x1313 >= 0 ;++1 x1024 -1 x1314 >= 0 ;++1 x1025 -1 x1315 >= 0 ;++1 x1026 >= 1 ;+-1 x1228 >= 0 ;++1 x1035 -1 x1229 >= 0 ;++1 x1036 -1 x1230 >= 0 ;++1 x1037 -1 x1231 >= 0 ;++1 x1038 -1 x1232 >= 0 ;++1 x1039 -1 x1233 >= 0 ;++1 x1040 -1 x1234 >= 0 ;++1 x1041 -1 x1235 >= 0 ;++1 x1042 -1 x1236 >= 0 ;++1 x1043 -1 x1237 >= 0 ;++1 x1044 -1 x1238 >= 0 ;++1 x1045 -1 x1239 >= 0 ;++1 x1046 -1 x1240 >= 0 ;++1 x1047 -1 x1241 >= 0 ;++1 x1048 -1 x1242 >= 0 ;++1 x1049 -1 x1243 >= 0 ;++1 x1050 -1 x1244 >= 0 ;++1 x1051 -1 x1245 >= 0 ;++1 x1052 -1 x1246 >= 0 ;++1 x1053 -1 x1247 >= 0 ;++1 x1054 -1 x1248 >= 0 ;++1 x1055 -1 x1249 >= 0 ;++1 x1056 -1 x1250 >= 0 ;++1 x1057 -1 x1251 >= 0 ;++1 x1058 -1 x1252 >= 0 ;++1 x1059 -1 x1253 >= 0 ;++1 x1060 -1 x1254 >= 0 ;++1 x1061 -1 x1255 >= 0 ;++1 x1062 -1 x1256 >= 0 ;++1 x1063 -1 x1257 >= 0 ;++1 x1064 -1 x1258 >= 0 ;++1 x1065 -1 x1259 >= 0 ;++1 x1066 -1 x1260 >= 0 ;++1 x1067 -1 x1261 >= 0 ;++1 x1068 -1 x1262 >= 0 ;++1 x1069 -1 x1263 >= 0 ;++1 x1070 -1 x1264 >= 0 ;++1 x1071 -1 x1265 >= 0 ;++1 x1072 -1 x1266 >= 0 ;++1 x1073 -1 x1267 >= 0 ;++1 x1074 -1 x1268 >= 0 ;++1 x1075 -1 x1269 >= 0 ;++1 x1076 -1 x1270 >= 0 ;++1 x1077 -1 x1271 >= 0 ;++1 x1078 -1 x1272 >= 0 ;++1 x1079 -1 x1273 >= 0 ;++1 x1080 -1 x1274 >= 0 ;++1 x1081 -1 x1275 >= 0 ;++1 x1082 -1 x1276 >= 0 ;++1 x1083 -1 x1277 >= 0 ;++1 x1084 -1 x1278 >= 0 ;++1 x1085 -1 x1279 >= 0 ;++1 x1086 -1 x1280 >= 0 ;++1 x1087 -1 x1281 >= 0 ;++1 x1088 -1 x1282 >= 0 ;++1 x1089 -1 x1283 >= 0 ;++1 x1090 -1 x1284 >= 0 ;++1 x1091 -1 x1285 >= 0 ;++1 x1092 -1 x1286 >= 0 ;++1 x1093 -1 x1287 >= 0 ;++1 x1094 -1 x1288 >= 0 ;++1 x1095 -1 x1289 >= 0 ;++1 x1096 -1 x1290 >= 0 ;++1 x1097 -1 x1291 >= 0 ;++1 x1098 -1 x1292 >= 0 ;++1 x1099 -1 x1293 >= 0 ;++1 x1100 -1 x1294 >= 0 ;++1 x1101 -1 x1295 >= 0 ;++1 x1102 -1 x1296 >= 0 ;++1 x1103 -1 x1297 >= 0 ;++1 x1104 -1 x1298 >= 0 ;++1 x1105 -1 x1299 >= 0 ;++1 x1106 -1 x1300 >= 0 ;++1 x1107 -1 x1301 >= 0 ;++1 x1108 -1 x1302 >= 0 ;++1 x1109 -1 x1303 >= 0 ;++1 x1110 -1 x1304 >= 0 ;++1 x1111 -1 x1305 >= 0 ;++1 x1112 -1 x1306 >= 0 ;++1 x1113 -1 x1307 >= 0 ;++1 x1114 -1 x1308 >= 0 ;++1 x1115 -1 x1309 >= 0 ;++1 x1116 -1 x1310 >= 0 ;++1 x1117 -1 x1311 >= 0 ;++1 x1118 -1 x1312 >= 0 ;++1 x1119 -1 x1313 >= 0 ;++1 x1120 -1 x1314 >= 0 ;++1 x1121 -1 x1315 >= 0 ;++1 x1122 >= 1 ;+-1 x1323 >= 0 ;++1 x95 -1 x1324 >= 0 ;++1 x96 -1 x1325 >= 0 ;++1 x97 -1 x1326 >= 0 ;++1 x98 -1 x1327 >= 0 ;++1 x99 -1 x1328 >= 0 ;++1 x100 -1 x1329 >= 0 ;++1 x101 -1 x1330 >= 0 ;++1 x102 -1 x1331 >= 0 ;++1 x103 -1 x1332 >= 0 ;++1 x104 -1 x1333 >= 0 ;++1 x105 -1 x1334 >= 0 ;++1 x106 -1 x1335 >= 0 ;++1 x107 -1 x1336 >= 0 ;++1 x108 -1 x1337 >= 0 ;++1 x109 -1 x1338 >= 0 ;++1 x110 -1 x1339 >= 0 ;++1 x111 -1 x1340 >= 0 ;++1 x112 -1 x1341 >= 0 ;++1 x113 -1 x1342 >= 0 ;++1 x114 -1 x1343 >= 0 ;++1 x115 -1 x1344 >= 0 ;++1 x116 -1 x1345 >= 0 ;++1 x117 -1 x1346 >= 0 ;++1 x118 -1 x1347 >= 0 ;++1 x119 -1 x1348 >= 0 ;++1 x120 -1 x1349 >= 0 ;++1 x121 -1 x1350 >= 0 ;++1 x122 -1 x1351 >= 0 ;++1 x123 -1 x1352 >= 0 ;++1 x124 -1 x1353 >= 0 ;++1 x125 -1 x1354 >= 0 ;++1 x126 -1 x1355 >= 0 ;++1 x127 -1 x1356 >= 0 ;++1 x128 -1 x1357 >= 0 ;++1 x129 -1 x1358 >= 0 ;++1 x130 -1 x1359 >= 0 ;++1 x131 -1 x1360 >= 0 ;++1 x132 -1 x1361 >= 0 ;++1 x133 -1 x1362 >= 0 ;++1 x134 -1 x1363 >= 0 ;++1 x135 -1 x1364 >= 0 ;++1 x136 -1 x1365 >= 0 ;++1 x137 -1 x1366 >= 0 ;++1 x138 -1 x1367 >= 0 ;++1 x139 -1 x1368 >= 0 ;++1 x140 -1 x1369 >= 0 ;++1 x141 -1 x1370 >= 0 ;++1 x142 -1 x1371 >= 0 ;++1 x143 -1 x1372 >= 0 ;++1 x144 -1 x1373 >= 0 ;++1 x145 -1 x1374 >= 0 ;++1 x146 -1 x1375 >= 0 ;++1 x147 -1 x1376 >= 0 ;++1 x148 -1 x1377 >= 0 ;++1 x149 -1 x1378 >= 0 ;++1 x150 -1 x1379 >= 0 ;++1 x151 -1 x1380 >= 0 ;++1 x152 -1 x1381 >= 0 ;++1 x153 -1 x1382 >= 0 ;++1 x154 -1 x1383 >= 0 ;++1 x155 -1 x1384 >= 0 ;++1 x156 -1 x1385 >= 0 ;++1 x157 -1 x1386 >= 0 ;++1 x158 -1 x1387 >= 0 ;++1 x159 -1 x1388 >= 0 ;++1 x160 -1 x1389 >= 0 ;++1 x161 -1 x1390 >= 0 ;++1 x162 -1 x1391 >= 0 ;++1 x163 -1 x1392 >= 0 ;++1 x164 -1 x1393 >= 0 ;++1 x165 -1 x1394 >= 0 ;++1 x166 -1 x1395 >= 0 ;++1 x167 -1 x1396 >= 0 ;++1 x168 -1 x1397 >= 0 ;++1 x169 -1 x1398 >= 0 ;++1 x170 -1 x1399 >= 0 ;++1 x171 -1 x1400 >= 0 ;++1 x172 -1 x1401 >= 0 ;++1 x173 -1 x1402 >= 0 ;++1 x174 -1 x1403 >= 0 ;++1 x175 -1 x1404 >= 0 ;++1 x176 -1 x1405 >= 0 ;++1 x177 -1 x1406 >= 0 ;++1 x178 -1 x1407 >= 0 ;++1 x179 -1 x1408 >= 0 ;++1 x180 -1 x1409 >= 0 ;++1 x181 >= 1 ;+-1 x1320 >= 0 ;++1 x753 -1 x1321 >= 0 ;++1 x754 -1 x1322 >= 0 ;++1 x755 -1 x1323 >= 0 ;++1 x756 -1 x1324 >= 0 ;++1 x757 -1 x1325 >= 0 ;++1 x758 -1 x1326 >= 0 ;++1 x759 -1 x1327 >= 0 ;++1 x760 -1 x1328 >= 0 ;++1 x761 -1 x1329 >= 0 ;++1 x762 -1 x1330 >= 0 ;++1 x763 -1 x1331 >= 0 ;++1 x764 -1 x1332 >= 0 ;++1 x765 -1 x1333 >= 0 ;++1 x766 -1 x1334 >= 0 ;++1 x767 -1 x1335 >= 0 ;++1 x768 -1 x1336 >= 0 ;++1 x769 -1 x1337 >= 0 ;++1 x770 -1 x1338 >= 0 ;++1 x771 -1 x1339 >= 0 ;++1 x772 -1 x1340 >= 0 ;++1 x773 -1 x1341 >= 0 ;++1 x774 -1 x1342 >= 0 ;++1 x775 -1 x1343 >= 0 ;++1 x776 -1 x1344 >= 0 ;++1 x777 -1 x1345 >= 0 ;++1 x778 -1 x1346 >= 0 ;++1 x779 -1 x1347 >= 0 ;++1 x780 -1 x1348 >= 0 ;++1 x781 -1 x1349 >= 0 ;++1 x782 -1 x1350 >= 0 ;++1 x783 -1 x1351 >= 0 ;++1 x784 -1 x1352 >= 0 ;++1 x785 -1 x1353 >= 0 ;++1 x786 -1 x1354 >= 0 ;++1 x787 -1 x1355 >= 0 ;++1 x788 -1 x1356 >= 0 ;++1 x789 -1 x1357 >= 0 ;++1 x790 -1 x1358 >= 0 ;++1 x791 -1 x1359 >= 0 ;++1 x792 -1 x1360 >= 0 ;++1 x793 -1 x1361 >= 0 ;++1 x794 -1 x1362 >= 0 ;++1 x795 -1 x1363 >= 0 ;++1 x796 -1 x1364 >= 0 ;++1 x797 -1 x1365 >= 0 ;++1 x798 -1 x1366 >= 0 ;++1 x799 -1 x1367 >= 0 ;++1 x800 -1 x1368 >= 0 ;++1 x801 -1 x1369 >= 0 ;++1 x802 -1 x1370 >= 0 ;++1 x803 -1 x1371 >= 0 ;++1 x804 -1 x1372 >= 0 ;++1 x805 -1 x1373 >= 0 ;++1 x806 -1 x1374 >= 0 ;++1 x807 -1 x1375 >= 0 ;++1 x808 -1 x1376 >= 0 ;++1 x809 -1 x1377 >= 0 ;++1 x810 -1 x1378 >= 0 ;++1 x811 -1 x1379 >= 0 ;++1 x812 -1 x1380 >= 0 ;++1 x813 -1 x1381 >= 0 ;++1 x814 -1 x1382 >= 0 ;++1 x815 -1 x1383 >= 0 ;++1 x816 -1 x1384 >= 0 ;++1 x817 -1 x1385 >= 0 ;++1 x818 -1 x1386 >= 0 ;++1 x819 -1 x1387 >= 0 ;++1 x820 -1 x1388 >= 0 ;++1 x821 -1 x1389 >= 0 ;++1 x822 -1 x1390 >= 0 ;++1 x823 -1 x1391 >= 0 ;++1 x824 -1 x1392 >= 0 ;++1 x825 -1 x1393 >= 0 ;++1 x826 -1 x1394 >= 0 ;++1 x827 -1 x1395 >= 0 ;++1 x828 -1 x1396 >= 0 ;++1 x829 -1 x1397 >= 0 ;++1 x830 -1 x1398 >= 0 ;++1 x831 -1 x1399 >= 0 ;++1 x832 -1 x1400 >= 0 ;++1 x833 -1 x1401 >= 0 ;++1 x834 -1 x1402 >= 0 ;++1 x835 -1 x1403 >= 0 ;++1 x836 -1 x1404 >= 0 ;++1 x837 -1 x1405 >= 0 ;++1 x838 -1 x1406 >= 0 ;++1 x839 -1 x1407 >= 0 ;++1 x840 -1 x1408 >= 0 ;++1 x841 -1 x1409 >= 0 ;++1 x842 >= 1 ;+-1 x1418 >= 0 ;++1 x941 -1 x1419 >= 0 ;++1 x942 -1 x1420 >= 0 ;++1 x943 -1 x1421 >= 0 ;++1 x944 -1 x1422 >= 0 ;++1 x945 -1 x1423 >= 0 ;++1 x946 -1 x1424 >= 0 ;++1 x947 -1 x1425 >= 0 ;++1 x948 -1 x1426 >= 0 ;++1 x949 -1 x1427 >= 0 ;++1 x950 -1 x1428 >= 0 ;++1 x951 -1 x1429 >= 0 ;++1 x952 -1 x1430 >= 0 ;++1 x953 -1 x1431 >= 0 ;++1 x954 -1 x1432 >= 0 ;++1 x955 -1 x1433 >= 0 ;++1 x956 -1 x1434 >= 0 ;++1 x957 -1 x1435 >= 0 ;++1 x958 -1 x1436 >= 0 ;++1 x959 -1 x1437 >= 0 ;++1 x960 -1 x1438 >= 0 ;++1 x961 -1 x1439 >= 0 ;++1 x962 -1 x1440 >= 0 ;++1 x963 -1 x1441 >= 0 ;++1 x964 -1 x1442 >= 0 ;++1 x965 -1 x1443 >= 0 ;++1 x966 -1 x1444 >= 0 ;++1 x967 -1 x1445 >= 0 ;++1 x968 -1 x1446 >= 0 ;++1 x969 -1 x1447 >= 0 ;++1 x970 -1 x1448 >= 0 ;++1 x971 -1 x1449 >= 0 ;++1 x972 -1 x1450 >= 0 ;++1 x973 -1 x1451 >= 0 ;++1 x974 -1 x1452 >= 0 ;++1 x975 -1 x1453 >= 0 ;++1 x976 -1 x1454 >= 0 ;++1 x977 -1 x1455 >= 0 ;++1 x978 -1 x1456 >= 0 ;++1 x979 -1 x1457 >= 0 ;++1 x980 -1 x1458 >= 0 ;++1 x981 -1 x1459 >= 0 ;++1 x982 -1 x1460 >= 0 ;++1 x983 -1 x1461 >= 0 ;++1 x984 -1 x1462 >= 0 ;++1 x985 -1 x1463 >= 0 ;++1 x986 -1 x1464 >= 0 ;++1 x987 -1 x1465 >= 0 ;++1 x988 -1 x1466 >= 0 ;++1 x989 -1 x1467 >= 0 ;++1 x990 -1 x1468 >= 0 ;++1 x991 -1 x1469 >= 0 ;++1 x992 -1 x1470 >= 0 ;++1 x993 -1 x1471 >= 0 ;++1 x994 -1 x1472 >= 0 ;++1 x995 -1 x1473 >= 0 ;++1 x996 -1 x1474 >= 0 ;++1 x997 -1 x1475 >= 0 ;++1 x998 -1 x1476 >= 0 ;++1 x999 -1 x1477 >= 0 ;++1 x1000 -1 x1478 >= 0 ;++1 x1001 -1 x1479 >= 0 ;++1 x1002 -1 x1480 >= 0 ;++1 x1003 -1 x1481 >= 0 ;++1 x1004 -1 x1482 >= 0 ;++1 x1005 -1 x1483 >= 0 ;++1 x1006 -1 x1484 >= 0 ;++1 x1007 -1 x1485 >= 0 ;++1 x1008 -1 x1486 >= 0 ;++1 x1009 -1 x1487 >= 0 ;++1 x1010 -1 x1488 >= 0 ;++1 x1011 -1 x1489 >= 0 ;++1 x1012 -1 x1490 >= 0 ;++1 x1013 -1 x1491 >= 0 ;++1 x1014 -1 x1492 >= 0 ;++1 x1015 -1 x1493 >= 0 ;++1 x1016 -1 x1494 >= 0 ;++1 x1017 -1 x1495 >= 0 ;++1 x1018 -1 x1496 >= 0 ;++1 x1019 -1 x1497 >= 0 ;++1 x1020 -1 x1498 >= 0 ;++1 x1021 -1 x1499 >= 0 ;++1 x1022 -1 x1500 >= 0 ;++1 x1023 -1 x1501 >= 0 ;++1 x1024 -1 x1502 >= 0 ;++1 x1025 -1 x1503 >= 0 ;++1 x1026 >= 1 ;+-1 x1416 >= 0 ;++1 x1035 -1 x1417 >= 0 ;++1 x1036 -1 x1418 >= 0 ;++1 x1037 -1 x1419 >= 0 ;++1 x1038 -1 x1420 >= 0 ;++1 x1039 -1 x1421 >= 0 ;++1 x1040 -1 x1422 >= 0 ;++1 x1041 -1 x1423 >= 0 ;++1 x1042 -1 x1424 >= 0 ;++1 x1043 -1 x1425 >= 0 ;++1 x1044 -1 x1426 >= 0 ;++1 x1045 -1 x1427 >= 0 ;++1 x1046 -1 x1428 >= 0 ;++1 x1047 -1 x1429 >= 0 ;++1 x1048 -1 x1430 >= 0 ;++1 x1049 -1 x1431 >= 0 ;++1 x1050 -1 x1432 >= 0 ;++1 x1051 -1 x1433 >= 0 ;++1 x1052 -1 x1434 >= 0 ;++1 x1053 -1 x1435 >= 0 ;++1 x1054 -1 x1436 >= 0 ;++1 x1055 -1 x1437 >= 0 ;++1 x1056 -1 x1438 >= 0 ;++1 x1057 -1 x1439 >= 0 ;++1 x1058 -1 x1440 >= 0 ;++1 x1059 -1 x1441 >= 0 ;++1 x1060 -1 x1442 >= 0 ;++1 x1061 -1 x1443 >= 0 ;++1 x1062 -1 x1444 >= 0 ;++1 x1063 -1 x1445 >= 0 ;++1 x1064 -1 x1446 >= 0 ;++1 x1065 -1 x1447 >= 0 ;++1 x1066 -1 x1448 >= 0 ;++1 x1067 -1 x1449 >= 0 ;++1 x1068 -1 x1450 >= 0 ;++1 x1069 -1 x1451 >= 0 ;++1 x1070 -1 x1452 >= 0 ;++1 x1071 -1 x1453 >= 0 ;++1 x1072 -1 x1454 >= 0 ;++1 x1073 -1 x1455 >= 0 ;++1 x1074 -1 x1456 >= 0 ;++1 x1075 -1 x1457 >= 0 ;++1 x1076 -1 x1458 >= 0 ;++1 x1077 -1 x1459 >= 0 ;++1 x1078 -1 x1460 >= 0 ;++1 x1079 -1 x1461 >= 0 ;++1 x1080 -1 x1462 >= 0 ;++1 x1081 -1 x1463 >= 0 ;++1 x1082 -1 x1464 >= 0 ;++1 x1083 -1 x1465 >= 0 ;++1 x1084 -1 x1466 >= 0 ;++1 x1085 -1 x1467 >= 0 ;++1 x1086 -1 x1468 >= 0 ;++1 x1087 -1 x1469 >= 0 ;++1 x1088 -1 x1470 >= 0 ;++1 x1089 -1 x1471 >= 0 ;++1 x1090 -1 x1472 >= 0 ;++1 x1091 -1 x1473 >= 0 ;++1 x1092 -1 x1474 >= 0 ;++1 x1093 -1 x1475 >= 0 ;++1 x1094 -1 x1476 >= 0 ;++1 x1095 -1 x1477 >= 0 ;++1 x1096 -1 x1478 >= 0 ;++1 x1097 -1 x1479 >= 0 ;++1 x1098 -1 x1480 >= 0 ;++1 x1099 -1 x1481 >= 0 ;++1 x1100 -1 x1482 >= 0 ;++1 x1101 -1 x1483 >= 0 ;++1 x1102 -1 x1484 >= 0 ;++1 x1103 -1 x1485 >= 0 ;++1 x1104 -1 x1486 >= 0 ;++1 x1105 -1 x1487 >= 0 ;++1 x1106 -1 x1488 >= 0 ;++1 x1107 -1 x1489 >= 0 ;++1 x1108 -1 x1490 >= 0 ;++1 x1109 -1 x1491 >= 0 ;++1 x1110 -1 x1492 >= 0 ;++1 x1111 -1 x1493 >= 0 ;++1 x1112 -1 x1494 >= 0 ;++1 x1113 -1 x1495 >= 0 ;++1 x1114 -1 x1496 >= 0 ;++1 x1115 -1 x1497 >= 0 ;++1 x1116 -1 x1498 >= 0 ;++1 x1117 -1 x1499 >= 0 ;++1 x1118 -1 x1500 >= 0 ;++1 x1119 -1 x1501 >= 0 ;++1 x1120 -1 x1502 >= 0 ;++1 x1121 -1 x1503 >= 0 ;++1 x1122 >= 1 ;+-1 x1511 >= 0 ;++1 x847 -1 x1512 >= 0 ;++1 x848 -1 x1513 >= 0 ;++1 x849 -1 x1514 >= 0 ;++1 x850 -1 x1515 >= 0 ;++1 x851 -1 x1516 >= 0 ;++1 x852 -1 x1517 >= 0 ;++1 x853 -1 x1518 >= 0 ;++1 x854 -1 x1519 >= 0 ;++1 x855 -1 x1520 >= 0 ;++1 x856 -1 x1521 >= 0 ;++1 x857 -1 x1522 >= 0 ;++1 x858 -1 x1523 >= 0 ;++1 x859 -1 x1524 >= 0 ;++1 x860 -1 x1525 >= 0 ;++1 x861 -1 x1526 >= 0 ;++1 x862 -1 x1527 >= 0 ;++1 x863 -1 x1528 >= 0 ;++1 x864 -1 x1529 >= 0 ;++1 x865 -1 x1530 >= 0 ;++1 x866 -1 x1531 >= 0 ;++1 x867 -1 x1532 >= 0 ;++1 x868 -1 x1533 >= 0 ;++1 x869 -1 x1534 >= 0 ;++1 x870 -1 x1535 >= 0 ;++1 x871 -1 x1536 >= 0 ;++1 x872 -1 x1537 >= 0 ;++1 x873 -1 x1538 >= 0 ;++1 x874 -1 x1539 >= 0 ;++1 x875 -1 x1540 >= 0 ;++1 x876 -1 x1541 >= 0 ;++1 x877 -1 x1542 >= 0 ;++1 x878 -1 x1543 >= 0 ;++1 x879 -1 x1544 >= 0 ;++1 x880 -1 x1545 >= 0 ;++1 x881 -1 x1546 >= 0 ;++1 x882 -1 x1547 >= 0 ;++1 x883 -1 x1548 >= 0 ;++1 x884 -1 x1549 >= 0 ;++1 x885 -1 x1550 >= 0 ;++1 x886 -1 x1551 >= 0 ;++1 x887 -1 x1552 >= 0 ;++1 x888 -1 x1553 >= 0 ;++1 x889 -1 x1554 >= 0 ;++1 x890 -1 x1555 >= 0 ;++1 x891 -1 x1556 >= 0 ;++1 x892 -1 x1557 >= 0 ;++1 x893 -1 x1558 >= 0 ;++1 x894 -1 x1559 >= 0 ;++1 x895 -1 x1560 >= 0 ;++1 x896 -1 x1561 >= 0 ;++1 x897 -1 x1562 >= 0 ;++1 x898 -1 x1563 >= 0 ;++1 x899 -1 x1564 >= 0 ;++1 x900 -1 x1565 >= 0 ;++1 x901 -1 x1566 >= 0 ;++1 x902 -1 x1567 >= 0 ;++1 x903 -1 x1568 >= 0 ;++1 x904 -1 x1569 >= 0 ;++1 x905 -1 x1570 >= 0 ;++1 x906 -1 x1571 >= 0 ;++1 x907 -1 x1572 >= 0 ;++1 x908 -1 x1573 >= 0 ;++1 x909 -1 x1574 >= 0 ;++1 x910 -1 x1575 >= 0 ;++1 x911 -1 x1576 >= 0 ;++1 x912 -1 x1577 >= 0 ;++1 x913 -1 x1578 >= 0 ;++1 x914 -1 x1579 >= 0 ;++1 x915 -1 x1580 >= 0 ;++1 x916 -1 x1581 >= 0 ;++1 x917 -1 x1582 >= 0 ;++1 x918 -1 x1583 >= 0 ;++1 x919 -1 x1584 >= 0 ;++1 x920 -1 x1585 >= 0 ;++1 x921 -1 x1586 >= 0 ;++1 x922 -1 x1587 >= 0 ;++1 x923 -1 x1588 >= 0 ;++1 x924 -1 x1589 >= 0 ;++1 x925 -1 x1590 >= 0 ;++1 x926 -1 x1591 >= 0 ;++1 x927 -1 x1592 >= 0 ;++1 x928 -1 x1593 >= 0 ;++1 x929 -1 x1594 >= 0 ;++1 x930 -1 x1595 >= 0 ;++1 x931 -1 x1596 >= 0 ;++1 x932 -1 x1597 >= 0 ;++1 x933 >= 1 ;+-1 x1510 >= 0 ;++1 x1411 -1 x1511 >= 0 ;++1 x1412 -1 x1512 >= 0 ;++1 x1413 -1 x1513 >= 0 ;++1 x1414 -1 x1514 >= 0 ;++1 x1415 -1 x1515 >= 0 ;++1 x1416 -1 x1516 >= 0 ;++1 x1417 -1 x1517 >= 0 ;++1 x1418 -1 x1518 >= 0 ;++1 x1419 -1 x1519 >= 0 ;++1 x1420 -1 x1520 >= 0 ;++1 x1421 -1 x1521 >= 0 ;++1 x1422 -1 x1522 >= 0 ;++1 x1423 -1 x1523 >= 0 ;++1 x1424 -1 x1524 >= 0 ;++1 x1425 -1 x1525 >= 0 ;++1 x1426 -1 x1526 >= 0 ;++1 x1427 -1 x1527 >= 0 ;++1 x1428 -1 x1528 >= 0 ;++1 x1429 -1 x1529 >= 0 ;++1 x1430 -1 x1530 >= 0 ;++1 x1431 -1 x1531 >= 0 ;++1 x1432 -1 x1532 >= 0 ;++1 x1433 -1 x1533 >= 0 ;++1 x1434 -1 x1534 >= 0 ;++1 x1435 -1 x1535 >= 0 ;++1 x1436 -1 x1536 >= 0 ;++1 x1437 -1 x1537 >= 0 ;++1 x1438 -1 x1538 >= 0 ;++1 x1439 -1 x1539 >= 0 ;++1 x1440 -1 x1540 >= 0 ;++1 x1441 -1 x1541 >= 0 ;++1 x1442 -1 x1542 >= 0 ;++1 x1443 -1 x1543 >= 0 ;++1 x1444 -1 x1544 >= 0 ;++1 x1445 -1 x1545 >= 0 ;++1 x1446 -1 x1546 >= 0 ;++1 x1447 -1 x1547 >= 0 ;++1 x1448 -1 x1548 >= 0 ;++1 x1449 -1 x1549 >= 0 ;++1 x1450 -1 x1550 >= 0 ;++1 x1451 -1 x1551 >= 0 ;++1 x1452 -1 x1552 >= 0 ;++1 x1453 -1 x1553 >= 0 ;++1 x1454 -1 x1554 >= 0 ;++1 x1455 -1 x1555 >= 0 ;++1 x1456 -1 x1556 >= 0 ;++1 x1457 -1 x1557 >= 0 ;++1 x1458 -1 x1558 >= 0 ;++1 x1459 -1 x1559 >= 0 ;++1 x1460 -1 x1560 >= 0 ;++1 x1461 -1 x1561 >= 0 ;++1 x1462 -1 x1562 >= 0 ;++1 x1463 -1 x1563 >= 0 ;++1 x1464 -1 x1564 >= 0 ;++1 x1465 -1 x1565 >= 0 ;++1 x1466 -1 x1566 >= 0 ;++1 x1467 -1 x1567 >= 0 ;++1 x1468 -1 x1568 >= 0 ;++1 x1469 -1 x1569 >= 0 ;++1 x1470 -1 x1570 >= 0 ;++1 x1471 -1 x1571 >= 0 ;++1 x1472 -1 x1572 >= 0 ;++1 x1473 -1 x1573 >= 0 ;++1 x1474 -1 x1574 >= 0 ;++1 x1475 -1 x1575 >= 0 ;++1 x1476 -1 x1576 >= 0 ;++1 x1477 -1 x1577 >= 0 ;++1 x1478 -1 x1578 >= 0 ;++1 x1479 -1 x1579 >= 0 ;++1 x1480 -1 x1580 >= 0 ;++1 x1481 -1 x1581 >= 0 ;++1 x1482 -1 x1582 >= 0 ;++1 x1483 -1 x1583 >= 0 ;++1 x1484 -1 x1584 >= 0 ;++1 x1485 -1 x1585 >= 0 ;++1 x1486 -1 x1586 >= 0 ;++1 x1487 -1 x1587 >= 0 ;++1 x1488 -1 x1588 >= 0 ;++1 x1489 -1 x1589 >= 0 ;++1 x1490 -1 x1590 >= 0 ;++1 x1491 -1 x1591 >= 0 ;++1 x1492 -1 x1592 >= 0 ;++1 x1493 -1 x1593 >= 0 ;++1 x1494 -1 x1594 >= 0 ;++1 x1495 -1 x1595 >= 0 ;++1 x1496 -1 x1596 >= 0 ;++1 x1497 -1 x1597 >= 0 ;++1 x1498 >= 1 ;+-1 x1607 >= 0 ;++1 x1 -1 x1608 >= 0 ;++1 x2 -1 x1609 >= 0 ;++1 x3 -1 x1610 >= 0 ;++1 x4 -1 x1611 >= 0 ;++1 x5 -1 x1612 >= 0 ;++1 x6 -1 x1613 >= 0 ;++1 x7 -1 x1614 >= 0 ;++1 x8 -1 x1615 >= 0 ;++1 x9 -1 x1616 >= 0 ;++1 x10 -1 x1617 >= 0 ;++1 x11 -1 x1618 >= 0 ;++1 x12 -1 x1619 >= 0 ;++1 x13 -1 x1620 >= 0 ;++1 x14 -1 x1621 >= 0 ;++1 x15 -1 x1622 >= 0 ;++1 x16 -1 x1623 >= 0 ;++1 x17 -1 x1624 >= 0 ;++1 x18 -1 x1625 >= 0 ;++1 x19 -1 x1626 >= 0 ;++1 x20 -1 x1627 >= 0 ;++1 x21 -1 x1628 >= 0 ;++1 x22 -1 x1629 >= 0 ;++1 x23 -1 x1630 >= 0 ;++1 x24 -1 x1631 >= 0 ;++1 x25 -1 x1632 >= 0 ;++1 x26 -1 x1633 >= 0 ;++1 x27 -1 x1634 >= 0 ;++1 x28 -1 x1635 >= 0 ;++1 x29 -1 x1636 >= 0 ;++1 x30 -1 x1637 >= 0 ;++1 x31 -1 x1638 >= 0 ;++1 x32 -1 x1639 >= 0 ;++1 x33 -1 x1640 >= 0 ;++1 x34 -1 x1641 >= 0 ;++1 x35 -1 x1642 >= 0 ;++1 x36 -1 x1643 >= 0 ;++1 x37 -1 x1644 >= 0 ;++1 x38 -1 x1645 >= 0 ;++1 x39 -1 x1646 >= 0 ;++1 x40 -1 x1647 >= 0 ;++1 x41 -1 x1648 >= 0 ;++1 x42 -1 x1649 >= 0 ;++1 x43 -1 x1650 >= 0 ;++1 x44 -1 x1651 >= 0 ;++1 x45 -1 x1652 >= 0 ;++1 x46 -1 x1653 >= 0 ;++1 x47 -1 x1654 >= 0 ;++1 x48 -1 x1655 >= 0 ;++1 x49 -1 x1656 >= 0 ;++1 x50 -1 x1657 >= 0 ;++1 x51 -1 x1658 >= 0 ;++1 x52 -1 x1659 >= 0 ;++1 x53 -1 x1660 >= 0 ;++1 x54 -1 x1661 >= 0 ;++1 x55 -1 x1662 >= 0 ;++1 x56 -1 x1663 >= 0 ;++1 x57 -1 x1664 >= 0 ;++1 x58 -1 x1665 >= 0 ;++1 x59 -1 x1666 >= 0 ;++1 x60 -1 x1667 >= 0 ;++1 x61 -1 x1668 >= 0 ;++1 x62 -1 x1669 >= 0 ;++1 x63 -1 x1670 >= 0 ;++1 x64 -1 x1671 >= 0 ;++1 x65 -1 x1672 >= 0 ;++1 x66 -1 x1673 >= 0 ;++1 x67 -1 x1674 >= 0 ;++1 x68 -1 x1675 >= 0 ;++1 x69 -1 x1676 >= 0 ;++1 x70 -1 x1677 >= 0 ;++1 x71 -1 x1678 >= 0 ;++1 x72 -1 x1679 >= 0 ;++1 x73 -1 x1680 >= 0 ;++1 x74 -1 x1681 >= 0 ;++1 x75 -1 x1682 >= 0 ;++1 x76 -1 x1683 >= 0 ;++1 x77 -1 x1684 >= 0 ;++1 x78 -1 x1685 >= 0 ;++1 x79 -1 x1686 >= 0 ;++1 x80 -1 x1687 >= 0 ;++1 x81 -1 x1688 >= 0 ;++1 x82 -1 x1689 >= 0 ;++1 x83 -1 x1690 >= 0 ;++1 x84 -1 x1691 >= 0 ;++1 x85 >= 1 ;+-1 x1696 >= 0 ;++1 x377 -1 x1697 >= 0 ;++1 x378 -1 x1698 >= 0 ;++1 x379 -1 x1699 >= 0 ;++1 x380 -1 x1700 >= 0 ;++1 x381 -1 x1701 >= 0 ;++1 x382 -1 x1702 >= 0 ;++1 x383 -1 x1703 >= 0 ;++1 x384 -1 x1704 >= 0 ;++1 x385 -1 x1705 >= 0 ;++1 x386 -1 x1706 >= 0 ;++1 x387 -1 x1707 >= 0 ;++1 x388 -1 x1708 >= 0 ;++1 x389 -1 x1709 >= 0 ;++1 x390 -1 x1710 >= 0 ;++1 x391 -1 x1711 >= 0 ;++1 x392 -1 x1712 >= 0 ;++1 x393 -1 x1713 >= 0 ;++1 x394 -1 x1714 >= 0 ;++1 x395 -1 x1715 >= 0 ;++1 x396 -1 x1716 >= 0 ;++1 x397 -1 x1717 >= 0 ;++1 x398 -1 x1718 >= 0 ;++1 x399 -1 x1719 >= 0 ;++1 x400 -1 x1720 >= 0 ;++1 x401 -1 x1721 >= 0 ;++1 x402 -1 x1722 >= 0 ;++1 x403 -1 x1723 >= 0 ;++1 x404 -1 x1724 >= 0 ;++1 x405 -1 x1725 >= 0 ;++1 x406 -1 x1726 >= 0 ;++1 x407 -1 x1727 >= 0 ;++1 x408 -1 x1728 >= 0 ;++1 x409 -1 x1729 >= 0 ;++1 x410 -1 x1730 >= 0 ;++1 x411 -1 x1731 >= 0 ;++1 x412 -1 x1732 >= 0 ;++1 x413 -1 x1733 >= 0 ;++1 x414 -1 x1734 >= 0 ;++1 x415 -1 x1735 >= 0 ;++1 x416 -1 x1736 >= 0 ;++1 x417 -1 x1737 >= 0 ;++1 x418 -1 x1738 >= 0 ;++1 x419 -1 x1739 >= 0 ;++1 x420 -1 x1740 >= 0 ;++1 x421 -1 x1741 >= 0 ;++1 x422 -1 x1742 >= 0 ;++1 x423 -1 x1743 >= 0 ;++1 x424 -1 x1744 >= 0 ;++1 x425 -1 x1745 >= 0 ;++1 x426 -1 x1746 >= 0 ;++1 x427 -1 x1747 >= 0 ;++1 x428 -1 x1748 >= 0 ;++1 x429 -1 x1749 >= 0 ;++1 x430 -1 x1750 >= 0 ;++1 x431 -1 x1751 >= 0 ;++1 x432 -1 x1752 >= 0 ;++1 x433 -1 x1753 >= 0 ;++1 x434 -1 x1754 >= 0 ;++1 x435 -1 x1755 >= 0 ;++1 x436 -1 x1756 >= 0 ;++1 x437 -1 x1757 >= 0 ;++1 x438 -1 x1758 >= 0 ;++1 x439 -1 x1759 >= 0 ;++1 x440 -1 x1760 >= 0 ;++1 x441 -1 x1761 >= 0 ;++1 x442 -1 x1762 >= 0 ;++1 x443 -1 x1763 >= 0 ;++1 x444 -1 x1764 >= 0 ;++1 x445 -1 x1765 >= 0 ;++1 x446 -1 x1766 >= 0 ;++1 x447 -1 x1767 >= 0 ;++1 x448 -1 x1768 >= 0 ;++1 x449 -1 x1769 >= 0 ;++1 x450 -1 x1770 >= 0 ;++1 x451 -1 x1771 >= 0 ;++1 x452 -1 x1772 >= 0 ;++1 x453 -1 x1773 >= 0 ;++1 x454 -1 x1774 >= 0 ;++1 x455 -1 x1775 >= 0 ;++1 x456 -1 x1776 >= 0 ;++1 x457 -1 x1777 >= 0 ;++1 x458 -1 x1778 >= 0 ;++1 x459 -1 x1779 >= 0 ;++1 x460 -1 x1780 >= 0 ;++1 x461 -1 x1781 >= 0 ;++1 x462 -1 x1782 >= 0 ;++1 x463 -1 x1783 >= 0 ;++1 x464 -1 x1784 >= 0 ;++1 x465 -1 x1785 >= 0 ;++1 x466 >= 1 ;+-1 x1699 >= 0 ;++1 x1505 -1 x1700 >= 0 ;++1 x1506 -1 x1701 >= 0 ;++1 x1507 -1 x1702 >= 0 ;++1 x1508 -1 x1703 >= 0 ;++1 x1509 -1 x1704 >= 0 ;++1 x1510 -1 x1705 >= 0 ;++1 x1511 -1 x1706 >= 0 ;++1 x1512 -1 x1707 >= 0 ;++1 x1513 -1 x1708 >= 0 ;++1 x1514 -1 x1709 >= 0 ;++1 x1515 -1 x1710 >= 0 ;++1 x1516 -1 x1711 >= 0 ;++1 x1517 -1 x1712 >= 0 ;++1 x1518 -1 x1713 >= 0 ;++1 x1519 -1 x1714 >= 0 ;++1 x1520 -1 x1715 >= 0 ;++1 x1521 -1 x1716 >= 0 ;++1 x1522 -1 x1717 >= 0 ;++1 x1523 -1 x1718 >= 0 ;++1 x1524 -1 x1719 >= 0 ;++1 x1525 -1 x1720 >= 0 ;++1 x1526 -1 x1721 >= 0 ;++1 x1527 -1 x1722 >= 0 ;++1 x1528 -1 x1723 >= 0 ;++1 x1529 -1 x1724 >= 0 ;++1 x1530 -1 x1725 >= 0 ;++1 x1531 -1 x1726 >= 0 ;++1 x1532 -1 x1727 >= 0 ;++1 x1533 -1 x1728 >= 0 ;++1 x1534 -1 x1729 >= 0 ;++1 x1535 -1 x1730 >= 0 ;++1 x1536 -1 x1731 >= 0 ;++1 x1537 -1 x1732 >= 0 ;++1 x1538 -1 x1733 >= 0 ;++1 x1539 -1 x1734 >= 0 ;++1 x1540 -1 x1735 >= 0 ;++1 x1541 -1 x1736 >= 0 ;++1 x1542 -1 x1737 >= 0 ;++1 x1543 -1 x1738 >= 0 ;++1 x1544 -1 x1739 >= 0 ;++1 x1545 -1 x1740 >= 0 ;++1 x1546 -1 x1741 >= 0 ;++1 x1547 -1 x1742 >= 0 ;++1 x1548 -1 x1743 >= 0 ;++1 x1549 -1 x1744 >= 0 ;++1 x1550 -1 x1745 >= 0 ;++1 x1551 -1 x1746 >= 0 ;++1 x1552 -1 x1747 >= 0 ;++1 x1553 -1 x1748 >= 0 ;++1 x1554 -1 x1749 >= 0 ;++1 x1555 -1 x1750 >= 0 ;++1 x1556 -1 x1751 >= 0 ;++1 x1557 -1 x1752 >= 0 ;++1 x1558 -1 x1753 >= 0 ;++1 x1559 -1 x1754 >= 0 ;++1 x1560 -1 x1755 >= 0 ;++1 x1561 -1 x1756 >= 0 ;++1 x1562 -1 x1757 >= 0 ;++1 x1563 -1 x1758 >= 0 ;++1 x1564 -1 x1759 >= 0 ;++1 x1565 -1 x1760 >= 0 ;++1 x1566 -1 x1761 >= 0 ;++1 x1567 -1 x1762 >= 0 ;++1 x1568 -1 x1763 >= 0 ;++1 x1569 -1 x1764 >= 0 ;++1 x1570 -1 x1765 >= 0 ;++1 x1571 -1 x1766 >= 0 ;++1 x1572 -1 x1767 >= 0 ;++1 x1573 -1 x1768 >= 0 ;++1 x1574 -1 x1769 >= 0 ;++1 x1575 -1 x1770 >= 0 ;++1 x1576 -1 x1771 >= 0 ;++1 x1577 -1 x1772 >= 0 ;++1 x1578 -1 x1773 >= 0 ;++1 x1579 -1 x1774 >= 0 ;++1 x1580 -1 x1775 >= 0 ;++1 x1581 -1 x1776 >= 0 ;++1 x1582 -1 x1777 >= 0 ;++1 x1583 -1 x1778 >= 0 ;++1 x1584 -1 x1779 >= 0 ;++1 x1585 -1 x1780 >= 0 ;++1 x1586 -1 x1781 >= 0 ;++1 x1587 -1 x1782 >= 0 ;++1 x1588 -1 x1783 >= 0 ;++1 x1589 -1 x1784 >= 0 ;++1 x1590 -1 x1785 >= 0 ;++1 x1591 >= 1 ;+-1 x1695 >= 0 ;++1 x1599 -1 x1696 >= 0 ;++1 x1600 -1 x1697 >= 0 ;++1 x1601 -1 x1698 >= 0 ;++1 x1602 -1 x1699 >= 0 ;++1 x1603 -1 x1700 >= 0 ;++1 x1604 -1 x1701 >= 0 ;++1 x1605 -1 x1702 >= 0 ;++1 x1606 -1 x1703 >= 0 ;++1 x1607 -1 x1704 >= 0 ;++1 x1608 -1 x1705 >= 0 ;++1 x1609 -1 x1706 >= 0 ;++1 x1610 -1 x1707 >= 0 ;++1 x1611 -1 x1708 >= 0 ;++1 x1612 -1 x1709 >= 0 ;++1 x1613 -1 x1710 >= 0 ;++1 x1614 -1 x1711 >= 0 ;++1 x1615 -1 x1712 >= 0 ;++1 x1616 -1 x1713 >= 0 ;++1 x1617 -1 x1714 >= 0 ;++1 x1618 -1 x1715 >= 0 ;++1 x1619 -1 x1716 >= 0 ;++1 x1620 -1 x1717 >= 0 ;++1 x1621 -1 x1718 >= 0 ;++1 x1622 -1 x1719 >= 0 ;++1 x1623 -1 x1720 >= 0 ;++1 x1624 -1 x1721 >= 0 ;++1 x1625 -1 x1722 >= 0 ;++1 x1626 -1 x1723 >= 0 ;++1 x1627 -1 x1724 >= 0 ;++1 x1628 -1 x1725 >= 0 ;++1 x1629 -1 x1726 >= 0 ;++1 x1630 -1 x1727 >= 0 ;++1 x1631 -1 x1728 >= 0 ;++1 x1632 -1 x1729 >= 0 ;++1 x1633 -1 x1730 >= 0 ;++1 x1634 -1 x1731 >= 0 ;++1 x1635 -1 x1732 >= 0 ;++1 x1636 -1 x1733 >= 0 ;++1 x1637 -1 x1734 >= 0 ;++1 x1638 -1 x1735 >= 0 ;++1 x1639 -1 x1736 >= 0 ;++1 x1640 -1 x1737 >= 0 ;++1 x1641 -1 x1738 >= 0 ;++1 x1642 -1 x1739 >= 0 ;++1 x1643 -1 x1740 >= 0 ;++1 x1644 -1 x1741 >= 0 ;++1 x1645 -1 x1742 >= 0 ;++1 x1646 -1 x1743 >= 0 ;++1 x1647 -1 x1744 >= 0 ;++1 x1648 -1 x1745 >= 0 ;++1 x1649 -1 x1746 >= 0 ;++1 x1650 -1 x1747 >= 0 ;++1 x1651 -1 x1748 >= 0 ;++1 x1652 -1 x1749 >= 0 ;++1 x1653 -1 x1750 >= 0 ;++1 x1654 -1 x1751 >= 0 ;++1 x1655 -1 x1752 >= 0 ;++1 x1656 -1 x1753 >= 0 ;++1 x1657 -1 x1754 >= 0 ;++1 x1658 -1 x1755 >= 0 ;++1 x1659 -1 x1756 >= 0 ;++1 x1660 -1 x1757 >= 0 ;++1 x1661 -1 x1758 >= 0 ;++1 x1662 -1 x1759 >= 0 ;++1 x1663 -1 x1760 >= 0 ;++1 x1664 -1 x1761 >= 0 ;++1 x1665 -1 x1762 >= 0 ;++1 x1666 -1 x1763 >= 0 ;++1 x1667 -1 x1764 >= 0 ;++1 x1668 -1 x1765 >= 0 ;++1 x1669 -1 x1766 >= 0 ;++1 x1670 -1 x1767 >= 0 ;++1 x1671 -1 x1768 >= 0 ;++1 x1672 -1 x1769 >= 0 ;++1 x1673 -1 x1770 >= 0 ;++1 x1674 -1 x1771 >= 0 ;++1 x1675 -1 x1772 >= 0 ;++1 x1676 -1 x1773 >= 0 ;++1 x1677 -1 x1774 >= 0 ;++1 x1678 -1 x1775 >= 0 ;++1 x1679 -1 x1776 >= 0 ;++1 x1680 -1 x1777 >= 0 ;++1 x1681 -1 x1778 >= 0 ;++1 x1682 -1 x1779 >= 0 ;++1 x1683 -1 x1780 >= 0 ;++1 x1684 -1 x1781 >= 0 ;++1 x1685 -1 x1782 >= 0 ;++1 x1686 -1 x1783 >= 0 ;++1 x1687 -1 x1784 >= 0 ;++1 x1688 -1 x1785 >= 0 ;++1 x1689 >= 1 ;+-1 x1790 >= 0 ;++1 x753 -1 x1791 >= 0 ;++1 x754 -1 x1792 >= 0 ;++1 x755 -1 x1793 >= 0 ;++1 x756 -1 x1794 >= 0 ;++1 x757 -1 x1795 >= 0 ;++1 x758 -1 x1796 >= 0 ;++1 x759 -1 x1797 >= 0 ;++1 x760 -1 x1798 >= 0 ;++1 x761 -1 x1799 >= 0 ;++1 x762 -1 x1800 >= 0 ;++1 x763 -1 x1801 >= 0 ;++1 x764 -1 x1802 >= 0 ;++1 x765 -1 x1803 >= 0 ;++1 x766 -1 x1804 >= 0 ;++1 x767 -1 x1805 >= 0 ;++1 x768 -1 x1806 >= 0 ;++1 x769 -1 x1807 >= 0 ;++1 x770 -1 x1808 >= 0 ;++1 x771 -1 x1809 >= 0 ;++1 x772 -1 x1810 >= 0 ;++1 x773 -1 x1811 >= 0 ;++1 x774 -1 x1812 >= 0 ;++1 x775 -1 x1813 >= 0 ;++1 x776 -1 x1814 >= 0 ;++1 x777 -1 x1815 >= 0 ;++1 x778 -1 x1816 >= 0 ;++1 x779 -1 x1817 >= 0 ;++1 x780 -1 x1818 >= 0 ;++1 x781 -1 x1819 >= 0 ;++1 x782 -1 x1820 >= 0 ;++1 x783 -1 x1821 >= 0 ;++1 x784 -1 x1822 >= 0 ;++1 x785 -1 x1823 >= 0 ;++1 x786 -1 x1824 >= 0 ;++1 x787 -1 x1825 >= 0 ;++1 x788 -1 x1826 >= 0 ;++1 x789 -1 x1827 >= 0 ;++1 x790 -1 x1828 >= 0 ;++1 x791 -1 x1829 >= 0 ;++1 x792 -1 x1830 >= 0 ;++1 x793 -1 x1831 >= 0 ;++1 x794 -1 x1832 >= 0 ;++1 x795 -1 x1833 >= 0 ;++1 x796 -1 x1834 >= 0 ;++1 x797 -1 x1835 >= 0 ;++1 x798 -1 x1836 >= 0 ;++1 x799 -1 x1837 >= 0 ;++1 x800 -1 x1838 >= 0 ;++1 x801 -1 x1839 >= 0 ;++1 x802 -1 x1840 >= 0 ;++1 x803 -1 x1841 >= 0 ;++1 x804 -1 x1842 >= 0 ;++1 x805 -1 x1843 >= 0 ;++1 x806 -1 x1844 >= 0 ;++1 x807 -1 x1845 >= 0 ;++1 x808 -1 x1846 >= 0 ;++1 x809 -1 x1847 >= 0 ;++1 x810 -1 x1848 >= 0 ;++1 x811 -1 x1849 >= 0 ;++1 x812 -1 x1850 >= 0 ;++1 x813 -1 x1851 >= 0 ;++1 x814 -1 x1852 >= 0 ;++1 x815 -1 x1853 >= 0 ;++1 x816 -1 x1854 >= 0 ;++1 x817 -1 x1855 >= 0 ;++1 x818 -1 x1856 >= 0 ;++1 x819 -1 x1857 >= 0 ;++1 x820 -1 x1858 >= 0 ;++1 x821 -1 x1859 >= 0 ;++1 x822 -1 x1860 >= 0 ;++1 x823 -1 x1861 >= 0 ;++1 x824 -1 x1862 >= 0 ;++1 x825 -1 x1863 >= 0 ;++1 x826 -1 x1864 >= 0 ;++1 x827 -1 x1865 >= 0 ;++1 x828 -1 x1866 >= 0 ;++1 x829 -1 x1867 >= 0 ;++1 x830 -1 x1868 >= 0 ;++1 x831 -1 x1869 >= 0 ;++1 x832 -1 x1870 >= 0 ;++1 x833 -1 x1871 >= 0 ;++1 x834 -1 x1872 >= 0 ;++1 x835 -1 x1873 >= 0 ;++1 x836 -1 x1874 >= 0 ;++1 x837 -1 x1875 >= 0 ;++1 x838 -1 x1876 >= 0 ;++1 x839 -1 x1877 >= 0 ;++1 x840 -1 x1878 >= 0 ;++1 x841 -1 x1879 >= 0 ;++1 x842 >= 1 ;+-1 x1883 >= 0 ;++1 x283 -1 x1884 >= 0 ;++1 x284 -1 x1885 >= 0 ;++1 x285 -1 x1886 >= 0 ;++1 x286 -1 x1887 >= 0 ;++1 x287 -1 x1888 >= 0 ;++1 x288 -1 x1889 >= 0 ;++1 x289 -1 x1890 >= 0 ;++1 x290 -1 x1891 >= 0 ;++1 x291 -1 x1892 >= 0 ;++1 x292 -1 x1893 >= 0 ;++1 x293 -1 x1894 >= 0 ;++1 x294 -1 x1895 >= 0 ;++1 x295 -1 x1896 >= 0 ;++1 x296 -1 x1897 >= 0 ;++1 x297 -1 x1898 >= 0 ;++1 x298 -1 x1899 >= 0 ;++1 x299 -1 x1900 >= 0 ;++1 x300 -1 x1901 >= 0 ;++1 x301 -1 x1902 >= 0 ;++1 x302 -1 x1903 >= 0 ;++1 x303 -1 x1904 >= 0 ;++1 x304 -1 x1905 >= 0 ;++1 x305 -1 x1906 >= 0 ;++1 x306 -1 x1907 >= 0 ;++1 x307 -1 x1908 >= 0 ;++1 x308 -1 x1909 >= 0 ;++1 x309 -1 x1910 >= 0 ;++1 x310 -1 x1911 >= 0 ;++1 x311 -1 x1912 >= 0 ;++1 x312 -1 x1913 >= 0 ;++1 x313 -1 x1914 >= 0 ;++1 x314 -1 x1915 >= 0 ;++1 x315 -1 x1916 >= 0 ;++1 x316 -1 x1917 >= 0 ;++1 x317 -1 x1918 >= 0 ;++1 x318 -1 x1919 >= 0 ;++1 x319 -1 x1920 >= 0 ;++1 x320 -1 x1921 >= 0 ;++1 x321 -1 x1922 >= 0 ;++1 x322 -1 x1923 >= 0 ;++1 x323 -1 x1924 >= 0 ;++1 x324 -1 x1925 >= 0 ;++1 x325 -1 x1926 >= 0 ;++1 x326 -1 x1927 >= 0 ;++1 x327 -1 x1928 >= 0 ;++1 x328 -1 x1929 >= 0 ;++1 x329 -1 x1930 >= 0 ;++1 x330 -1 x1931 >= 0 ;++1 x331 -1 x1932 >= 0 ;++1 x332 -1 x1933 >= 0 ;++1 x333 -1 x1934 >= 0 ;++1 x334 -1 x1935 >= 0 ;++1 x335 -1 x1936 >= 0 ;++1 x336 -1 x1937 >= 0 ;++1 x337 -1 x1938 >= 0 ;++1 x338 -1 x1939 >= 0 ;++1 x339 -1 x1940 >= 0 ;++1 x340 -1 x1941 >= 0 ;++1 x341 -1 x1942 >= 0 ;++1 x342 -1 x1943 >= 0 ;++1 x343 -1 x1944 >= 0 ;++1 x344 -1 x1945 >= 0 ;++1 x345 -1 x1946 >= 0 ;++1 x346 -1 x1947 >= 0 ;++1 x347 -1 x1948 >= 0 ;++1 x348 -1 x1949 >= 0 ;++1 x349 -1 x1950 >= 0 ;++1 x350 -1 x1951 >= 0 ;++1 x351 -1 x1952 >= 0 ;++1 x352 -1 x1953 >= 0 ;++1 x353 -1 x1954 >= 0 ;++1 x354 -1 x1955 >= 0 ;++1 x355 -1 x1956 >= 0 ;++1 x356 -1 x1957 >= 0 ;++1 x357 -1 x1958 >= 0 ;++1 x358 -1 x1959 >= 0 ;++1 x359 -1 x1960 >= 0 ;++1 x360 -1 x1961 >= 0 ;++1 x361 -1 x1962 >= 0 ;++1 x362 -1 x1963 >= 0 ;++1 x363 -1 x1964 >= 0 ;++1 x364 -1 x1965 >= 0 ;++1 x365 -1 x1966 >= 0 ;++1 x366 -1 x1967 >= 0 ;++1 x367 -1 x1968 >= 0 ;++1 x368 -1 x1969 >= 0 ;++1 x369 -1 x1970 >= 0 ;++1 x370 -1 x1971 >= 0 ;++1 x371 -1 x1972 >= 0 ;++1 x372 -1 x1973 >= 0 ;++1 x373 >= 1 ;+-1 x1977 >= 0 ;++1 x659 -1 x1978 >= 0 ;++1 x660 -1 x1979 >= 0 ;++1 x661 -1 x1980 >= 0 ;++1 x662 -1 x1981 >= 0 ;++1 x663 -1 x1982 >= 0 ;++1 x664 -1 x1983 >= 0 ;++1 x665 -1 x1984 >= 0 ;++1 x666 -1 x1985 >= 0 ;++1 x667 -1 x1986 >= 0 ;++1 x668 -1 x1987 >= 0 ;++1 x669 -1 x1988 >= 0 ;++1 x670 -1 x1989 >= 0 ;++1 x671 -1 x1990 >= 0 ;++1 x672 -1 x1991 >= 0 ;++1 x673 -1 x1992 >= 0 ;++1 x674 -1 x1993 >= 0 ;++1 x675 -1 x1994 >= 0 ;++1 x676 -1 x1995 >= 0 ;++1 x677 -1 x1996 >= 0 ;++1 x678 -1 x1997 >= 0 ;++1 x679 -1 x1998 >= 0 ;++1 x680 -1 x1999 >= 0 ;++1 x681 -1 x2000 >= 0 ;++1 x682 -1 x2001 >= 0 ;++1 x683 -1 x2002 >= 0 ;++1 x684 -1 x2003 >= 0 ;++1 x685 -1 x2004 >= 0 ;++1 x686 -1 x2005 >= 0 ;++1 x687 -1 x2006 >= 0 ;++1 x688 -1 x2007 >= 0 ;++1 x689 -1 x2008 >= 0 ;++1 x690 -1 x2009 >= 0 ;++1 x691 -1 x2010 >= 0 ;++1 x692 -1 x2011 >= 0 ;++1 x693 -1 x2012 >= 0 ;++1 x694 -1 x2013 >= 0 ;++1 x695 -1 x2014 >= 0 ;++1 x696 -1 x2015 >= 0 ;++1 x697 -1 x2016 >= 0 ;++1 x698 -1 x2017 >= 0 ;++1 x699 -1 x2018 >= 0 ;++1 x700 -1 x2019 >= 0 ;++1 x701 -1 x2020 >= 0 ;++1 x702 -1 x2021 >= 0 ;++1 x703 -1 x2022 >= 0 ;++1 x704 -1 x2023 >= 0 ;++1 x705 -1 x2024 >= 0 ;++1 x706 -1 x2025 >= 0 ;++1 x707 -1 x2026 >= 0 ;++1 x708 -1 x2027 >= 0 ;++1 x709 -1 x2028 >= 0 ;++1 x710 -1 x2029 >= 0 ;++1 x711 -1 x2030 >= 0 ;++1 x712 -1 x2031 >= 0 ;++1 x713 -1 x2032 >= 0 ;++1 x714 -1 x2033 >= 0 ;++1 x715 -1 x2034 >= 0 ;++1 x716 -1 x2035 >= 0 ;++1 x717 -1 x2036 >= 0 ;++1 x718 -1 x2037 >= 0 ;++1 x719 -1 x2038 >= 0 ;++1 x720 -1 x2039 >= 0 ;++1 x721 -1 x2040 >= 0 ;++1 x722 -1 x2041 >= 0 ;++1 x723 -1 x2042 >= 0 ;++1 x724 -1 x2043 >= 0 ;++1 x725 -1 x2044 >= 0 ;++1 x726 -1 x2045 >= 0 ;++1 x727 -1 x2046 >= 0 ;++1 x728 -1 x2047 >= 0 ;++1 x729 -1 x2048 >= 0 ;++1 x730 -1 x2049 >= 0 ;++1 x731 -1 x2050 >= 0 ;++1 x732 -1 x2051 >= 0 ;++1 x733 -1 x2052 >= 0 ;++1 x734 -1 x2053 >= 0 ;++1 x735 -1 x2054 >= 0 ;++1 x736 -1 x2055 >= 0 ;++1 x737 -1 x2056 >= 0 ;++1 x738 -1 x2057 >= 0 ;++1 x739 -1 x2058 >= 0 ;++1 x740 -1 x2059 >= 0 ;++1 x741 -1 x2060 >= 0 ;++1 x742 -1 x2061 >= 0 ;++1 x743 -1 x2062 >= 0 ;++1 x744 -1 x2063 >= 0 ;++1 x745 -1 x2064 >= 0 ;++1 x746 -1 x2065 >= 0 ;++1 x747 -1 x2066 >= 0 ;++1 x748 -1 x2067 >= 0 ;++1 x749 >= 1 ;+-1 x1980 >= 0 ;++1 x1129 -1 x1981 >= 0 ;++1 x1130 -1 x1982 >= 0 ;++1 x1131 -1 x1983 >= 0 ;++1 x1132 -1 x1984 >= 0 ;++1 x1133 -1 x1985 >= 0 ;++1 x1134 -1 x1986 >= 0 ;++1 x1135 -1 x1987 >= 0 ;++1 x1136 -1 x1988 >= 0 ;++1 x1137 -1 x1989 >= 0 ;++1 x1138 -1 x1990 >= 0 ;++1 x1139 -1 x1991 >= 0 ;++1 x1140 -1 x1992 >= 0 ;++1 x1141 -1 x1993 >= 0 ;++1 x1142 -1 x1994 >= 0 ;++1 x1143 -1 x1995 >= 0 ;++1 x1144 -1 x1996 >= 0 ;++1 x1145 -1 x1997 >= 0 ;++1 x1146 -1 x1998 >= 0 ;++1 x1147 -1 x1999 >= 0 ;++1 x1148 -1 x2000 >= 0 ;++1 x1149 -1 x2001 >= 0 ;++1 x1150 -1 x2002 >= 0 ;++1 x1151 -1 x2003 >= 0 ;++1 x1152 -1 x2004 >= 0 ;++1 x1153 -1 x2005 >= 0 ;++1 x1154 -1 x2006 >= 0 ;++1 x1155 -1 x2007 >= 0 ;++1 x1156 -1 x2008 >= 0 ;++1 x1157 -1 x2009 >= 0 ;++1 x1158 -1 x2010 >= 0 ;++1 x1159 -1 x2011 >= 0 ;++1 x1160 -1 x2012 >= 0 ;++1 x1161 -1 x2013 >= 0 ;++1 x1162 -1 x2014 >= 0 ;++1 x1163 -1 x2015 >= 0 ;++1 x1164 -1 x2016 >= 0 ;++1 x1165 -1 x2017 >= 0 ;++1 x1166 -1 x2018 >= 0 ;++1 x1167 -1 x2019 >= 0 ;++1 x1168 -1 x2020 >= 0 ;++1 x1169 -1 x2021 >= 0 ;++1 x1170 -1 x2022 >= 0 ;++1 x1171 -1 x2023 >= 0 ;++1 x1172 -1 x2024 >= 0 ;++1 x1173 -1 x2025 >= 0 ;++1 x1174 -1 x2026 >= 0 ;++1 x1175 -1 x2027 >= 0 ;++1 x1176 -1 x2028 >= 0 ;++1 x1177 -1 x2029 >= 0 ;++1 x1178 -1 x2030 >= 0 ;++1 x1179 -1 x2031 >= 0 ;++1 x1180 -1 x2032 >= 0 ;++1 x1181 -1 x2033 >= 0 ;++1 x1182 -1 x2034 >= 0 ;++1 x1183 -1 x2035 >= 0 ;++1 x1184 -1 x2036 >= 0 ;++1 x1185 -1 x2037 >= 0 ;++1 x1186 -1 x2038 >= 0 ;++1 x1187 -1 x2039 >= 0 ;++1 x1188 -1 x2040 >= 0 ;++1 x1189 -1 x2041 >= 0 ;++1 x1190 -1 x2042 >= 0 ;++1 x1191 -1 x2043 >= 0 ;++1 x1192 -1 x2044 >= 0 ;++1 x1193 -1 x2045 >= 0 ;++1 x1194 -1 x2046 >= 0 ;++1 x1195 -1 x2047 >= 0 ;++1 x1196 -1 x2048 >= 0 ;++1 x1197 -1 x2049 >= 0 ;++1 x1198 -1 x2050 >= 0 ;++1 x1199 -1 x2051 >= 0 ;++1 x1200 -1 x2052 >= 0 ;++1 x1201 -1 x2053 >= 0 ;++1 x1202 -1 x2054 >= 0 ;++1 x1203 -1 x2055 >= 0 ;++1 x1204 -1 x2056 >= 0 ;++1 x1205 -1 x2057 >= 0 ;++1 x1206 -1 x2058 >= 0 ;++1 x1207 -1 x2059 >= 0 ;++1 x1208 -1 x2060 >= 0 ;++1 x1209 -1 x2061 >= 0 ;++1 x1210 -1 x2062 >= 0 ;++1 x1211 -1 x2063 >= 0 ;++1 x1212 -1 x2064 >= 0 ;++1 x1213 -1 x2065 >= 0 ;++1 x1214 -1 x2066 >= 0 ;++1 x1215 -1 x2067 >= 0 ;++1 x1216 >= 1 ;+-1 x1981 >= 0 ;++1 x1693 -1 x1982 >= 0 ;++1 x1694 -1 x1983 >= 0 ;++1 x1695 -1 x1984 >= 0 ;++1 x1696 -1 x1985 >= 0 ;++1 x1697 -1 x1986 >= 0 ;++1 x1698 -1 x1987 >= 0 ;++1 x1699 -1 x1988 >= 0 ;++1 x1700 -1 x1989 >= 0 ;++1 x1701 -1 x1990 >= 0 ;++1 x1702 -1 x1991 >= 0 ;++1 x1703 -1 x1992 >= 0 ;++1 x1704 -1 x1993 >= 0 ;++1 x1705 -1 x1994 >= 0 ;++1 x1706 -1 x1995 >= 0 ;++1 x1707 -1 x1996 >= 0 ;++1 x1708 -1 x1997 >= 0 ;++1 x1709 -1 x1998 >= 0 ;++1 x1710 -1 x1999 >= 0 ;++1 x1711 -1 x2000 >= 0 ;++1 x1712 -1 x2001 >= 0 ;++1 x1713 -1 x2002 >= 0 ;++1 x1714 -1 x2003 >= 0 ;++1 x1715 -1 x2004 >= 0 ;++1 x1716 -1 x2005 >= 0 ;++1 x1717 -1 x2006 >= 0 ;++1 x1718 -1 x2007 >= 0 ;++1 x1719 -1 x2008 >= 0 ;++1 x1720 -1 x2009 >= 0 ;++1 x1721 -1 x2010 >= 0 ;++1 x1722 -1 x2011 >= 0 ;++1 x1723 -1 x2012 >= 0 ;++1 x1724 -1 x2013 >= 0 ;++1 x1725 -1 x2014 >= 0 ;++1 x1726 -1 x2015 >= 0 ;++1 x1727 -1 x2016 >= 0 ;++1 x1728 -1 x2017 >= 0 ;++1 x1729 -1 x2018 >= 0 ;++1 x1730 -1 x2019 >= 0 ;++1 x1731 -1 x2020 >= 0 ;++1 x1732 -1 x2021 >= 0 ;++1 x1733 -1 x2022 >= 0 ;++1 x1734 -1 x2023 >= 0 ;++1 x1735 -1 x2024 >= 0 ;++1 x1736 -1 x2025 >= 0 ;++1 x1737 -1 x2026 >= 0 ;++1 x1738 -1 x2027 >= 0 ;++1 x1739 -1 x2028 >= 0 ;++1 x1740 -1 x2029 >= 0 ;++1 x1741 -1 x2030 >= 0 ;++1 x1742 -1 x2031 >= 0 ;++1 x1743 -1 x2032 >= 0 ;++1 x1744 -1 x2033 >= 0 ;++1 x1745 -1 x2034 >= 0 ;++1 x1746 -1 x2035 >= 0 ;++1 x1747 -1 x2036 >= 0 ;++1 x1748 -1 x2037 >= 0 ;++1 x1749 -1 x2038 >= 0 ;++1 x1750 -1 x2039 >= 0 ;++1 x1751 -1 x2040 >= 0 ;++1 x1752 -1 x2041 >= 0 ;++1 x1753 -1 x2042 >= 0 ;++1 x1754 -1 x2043 >= 0 ;++1 x1755 -1 x2044 >= 0 ;++1 x1756 -1 x2045 >= 0 ;++1 x1757 -1 x2046 >= 0 ;++1 x1758 -1 x2047 >= 0 ;++1 x1759 -1 x2048 >= 0 ;++1 x1760 -1 x2049 >= 0 ;++1 x1761 -1 x2050 >= 0 ;++1 x1762 -1 x2051 >= 0 ;++1 x1763 -1 x2052 >= 0 ;++1 x1764 -1 x2053 >= 0 ;++1 x1765 -1 x2054 >= 0 ;++1 x1766 -1 x2055 >= 0 ;++1 x1767 -1 x2056 >= 0 ;++1 x1768 -1 x2057 >= 0 ;++1 x1769 -1 x2058 >= 0 ;++1 x1770 -1 x2059 >= 0 ;++1 x1771 -1 x2060 >= 0 ;++1 x1772 -1 x2061 >= 0 ;++1 x1773 -1 x2062 >= 0 ;++1 x1774 -1 x2063 >= 0 ;++1 x1775 -1 x2064 >= 0 ;++1 x1776 -1 x2065 >= 0 ;++1 x1777 -1 x2066 >= 0 ;++1 x1778 -1 x2067 >= 0 ;++1 x1779 >= 1 ;+-1 x2071 >= 0 ;++1 x659 -1 x2072 >= 0 ;++1 x660 -1 x2073 >= 0 ;++1 x661 -1 x2074 >= 0 ;++1 x662 -1 x2075 >= 0 ;++1 x663 -1 x2076 >= 0 ;++1 x664 -1 x2077 >= 0 ;++1 x665 -1 x2078 >= 0 ;++1 x666 -1 x2079 >= 0 ;++1 x667 -1 x2080 >= 0 ;++1 x668 -1 x2081 >= 0 ;++1 x669 -1 x2082 >= 0 ;++1 x670 -1 x2083 >= 0 ;++1 x671 -1 x2084 >= 0 ;++1 x672 -1 x2085 >= 0 ;++1 x673 -1 x2086 >= 0 ;++1 x674 -1 x2087 >= 0 ;++1 x675 -1 x2088 >= 0 ;++1 x676 -1 x2089 >= 0 ;++1 x677 -1 x2090 >= 0 ;++1 x678 -1 x2091 >= 0 ;++1 x679 -1 x2092 >= 0 ;++1 x680 -1 x2093 >= 0 ;++1 x681 -1 x2094 >= 0 ;++1 x682 -1 x2095 >= 0 ;++1 x683 -1 x2096 >= 0 ;++1 x684 -1 x2097 >= 0 ;++1 x685 -1 x2098 >= 0 ;++1 x686 -1 x2099 >= 0 ;++1 x687 -1 x2100 >= 0 ;++1 x688 -1 x2101 >= 0 ;++1 x689 -1 x2102 >= 0 ;++1 x690 -1 x2103 >= 0 ;++1 x691 -1 x2104 >= 0 ;++1 x692 -1 x2105 >= 0 ;++1 x693 -1 x2106 >= 0 ;++1 x694 -1 x2107 >= 0 ;++1 x695 -1 x2108 >= 0 ;++1 x696 -1 x2109 >= 0 ;++1 x697 -1 x2110 >= 0 ;++1 x698 -1 x2111 >= 0 ;++1 x699 -1 x2112 >= 0 ;++1 x700 -1 x2113 >= 0 ;++1 x701 -1 x2114 >= 0 ;++1 x702 -1 x2115 >= 0 ;++1 x703 -1 x2116 >= 0 ;++1 x704 -1 x2117 >= 0 ;++1 x705 -1 x2118 >= 0 ;++1 x706 -1 x2119 >= 0 ;++1 x707 -1 x2120 >= 0 ;++1 x708 -1 x2121 >= 0 ;++1 x709 -1 x2122 >= 0 ;++1 x710 -1 x2123 >= 0 ;++1 x711 -1 x2124 >= 0 ;++1 x712 -1 x2125 >= 0 ;++1 x713 -1 x2126 >= 0 ;++1 x714 -1 x2127 >= 0 ;++1 x715 -1 x2128 >= 0 ;++1 x716 -1 x2129 >= 0 ;++1 x717 -1 x2130 >= 0 ;++1 x718 -1 x2131 >= 0 ;++1 x719 -1 x2132 >= 0 ;++1 x720 -1 x2133 >= 0 ;++1 x721 -1 x2134 >= 0 ;++1 x722 -1 x2135 >= 0 ;++1 x723 -1 x2136 >= 0 ;++1 x724 -1 x2137 >= 0 ;++1 x725 -1 x2138 >= 0 ;++1 x726 -1 x2139 >= 0 ;++1 x727 -1 x2140 >= 0 ;++1 x728 -1 x2141 >= 0 ;++1 x729 -1 x2142 >= 0 ;++1 x730 -1 x2143 >= 0 ;++1 x731 -1 x2144 >= 0 ;++1 x732 -1 x2145 >= 0 ;++1 x733 -1 x2146 >= 0 ;++1 x734 -1 x2147 >= 0 ;++1 x735 -1 x2148 >= 0 ;++1 x736 -1 x2149 >= 0 ;++1 x737 -1 x2150 >= 0 ;++1 x738 -1 x2151 >= 0 ;++1 x739 -1 x2152 >= 0 ;++1 x740 -1 x2153 >= 0 ;++1 x741 -1 x2154 >= 0 ;++1 x742 -1 x2155 >= 0 ;++1 x743 -1 x2156 >= 0 ;++1 x744 -1 x2157 >= 0 ;++1 x745 -1 x2158 >= 0 ;++1 x746 -1 x2159 >= 0 ;++1 x747 -1 x2160 >= 0 ;++1 x748 -1 x2161 >= 0 ;++1 x749 >= 1 ;+-1 x2075 >= 0 ;++1 x1505 -1 x2076 >= 0 ;++1 x1506 -1 x2077 >= 0 ;++1 x1507 -1 x2078 >= 0 ;++1 x1508 -1 x2079 >= 0 ;++1 x1509 -1 x2080 >= 0 ;++1 x1510 -1 x2081 >= 0 ;++1 x1511 -1 x2082 >= 0 ;++1 x1512 -1 x2083 >= 0 ;++1 x1513 -1 x2084 >= 0 ;++1 x1514 -1 x2085 >= 0 ;++1 x1515 -1 x2086 >= 0 ;++1 x1516 -1 x2087 >= 0 ;++1 x1517 -1 x2088 >= 0 ;++1 x1518 -1 x2089 >= 0 ;++1 x1519 -1 x2090 >= 0 ;++1 x1520 -1 x2091 >= 0 ;++1 x1521 -1 x2092 >= 0 ;++1 x1522 -1 x2093 >= 0 ;++1 x1523 -1 x2094 >= 0 ;++1 x1524 -1 x2095 >= 0 ;++1 x1525 -1 x2096 >= 0 ;++1 x1526 -1 x2097 >= 0 ;++1 x1527 -1 x2098 >= 0 ;++1 x1528 -1 x2099 >= 0 ;++1 x1529 -1 x2100 >= 0 ;++1 x1530 -1 x2101 >= 0 ;++1 x1531 -1 x2102 >= 0 ;++1 x1532 -1 x2103 >= 0 ;++1 x1533 -1 x2104 >= 0 ;++1 x1534 -1 x2105 >= 0 ;++1 x1535 -1 x2106 >= 0 ;++1 x1536 -1 x2107 >= 0 ;++1 x1537 -1 x2108 >= 0 ;++1 x1538 -1 x2109 >= 0 ;++1 x1539 -1 x2110 >= 0 ;++1 x1540 -1 x2111 >= 0 ;++1 x1541 -1 x2112 >= 0 ;++1 x1542 -1 x2113 >= 0 ;++1 x1543 -1 x2114 >= 0 ;++1 x1544 -1 x2115 >= 0 ;++1 x1545 -1 x2116 >= 0 ;++1 x1546 -1 x2117 >= 0 ;++1 x1547 -1 x2118 >= 0 ;++1 x1548 -1 x2119 >= 0 ;++1 x1549 -1 x2120 >= 0 ;++1 x1550 -1 x2121 >= 0 ;++1 x1551 -1 x2122 >= 0 ;++1 x1552 -1 x2123 >= 0 ;++1 x1553 -1 x2124 >= 0 ;++1 x1554 -1 x2125 >= 0 ;++1 x1555 -1 x2126 >= 0 ;++1 x1556 -1 x2127 >= 0 ;++1 x1557 -1 x2128 >= 0 ;++1 x1558 -1 x2129 >= 0 ;++1 x1559 -1 x2130 >= 0 ;++1 x1560 -1 x2131 >= 0 ;++1 x1561 -1 x2132 >= 0 ;++1 x1562 -1 x2133 >= 0 ;++1 x1563 -1 x2134 >= 0 ;++1 x1564 -1 x2135 >= 0 ;++1 x1565 -1 x2136 >= 0 ;++1 x1566 -1 x2137 >= 0 ;++1 x1567 -1 x2138 >= 0 ;++1 x1568 -1 x2139 >= 0 ;++1 x1569 -1 x2140 >= 0 ;++1 x1570 -1 x2141 >= 0 ;++1 x1571 -1 x2142 >= 0 ;++1 x1572 -1 x2143 >= 0 ;++1 x1573 -1 x2144 >= 0 ;++1 x1574 -1 x2145 >= 0 ;++1 x1575 -1 x2146 >= 0 ;++1 x1576 -1 x2147 >= 0 ;++1 x1577 -1 x2148 >= 0 ;++1 x1578 -1 x2149 >= 0 ;++1 x1579 -1 x2150 >= 0 ;++1 x1580 -1 x2151 >= 0 ;++1 x1581 -1 x2152 >= 0 ;++1 x1582 -1 x2153 >= 0 ;++1 x1583 -1 x2154 >= 0 ;++1 x1584 -1 x2155 >= 0 ;++1 x1585 -1 x2156 >= 0 ;++1 x1586 -1 x2157 >= 0 ;++1 x1587 -1 x2158 >= 0 ;++1 x1588 -1 x2159 >= 0 ;++1 x1589 -1 x2160 >= 0 ;++1 x1590 -1 x2161 >= 0 ;++1 x1591 >= 1 ;+-1 x2072 >= 0 ;++1 x1881 -1 x2073 >= 0 ;++1 x1882 -1 x2074 >= 0 ;++1 x1883 -1 x2075 >= 0 ;++1 x1884 -1 x2076 >= 0 ;++1 x1885 -1 x2077 >= 0 ;++1 x1886 -1 x2078 >= 0 ;++1 x1887 -1 x2079 >= 0 ;++1 x1888 -1 x2080 >= 0 ;++1 x1889 -1 x2081 >= 0 ;++1 x1890 -1 x2082 >= 0 ;++1 x1891 -1 x2083 >= 0 ;++1 x1892 -1 x2084 >= 0 ;++1 x1893 -1 x2085 >= 0 ;++1 x1894 -1 x2086 >= 0 ;++1 x1895 -1 x2087 >= 0 ;++1 x1896 -1 x2088 >= 0 ;++1 x1897 -1 x2089 >= 0 ;++1 x1898 -1 x2090 >= 0 ;++1 x1899 -1 x2091 >= 0 ;++1 x1900 -1 x2092 >= 0 ;++1 x1901 -1 x2093 >= 0 ;++1 x1902 -1 x2094 >= 0 ;++1 x1903 -1 x2095 >= 0 ;++1 x1904 -1 x2096 >= 0 ;++1 x1905 -1 x2097 >= 0 ;++1 x1906 -1 x2098 >= 0 ;++1 x1907 -1 x2099 >= 0 ;++1 x1908 -1 x2100 >= 0 ;++1 x1909 -1 x2101 >= 0 ;++1 x1910 -1 x2102 >= 0 ;++1 x1911 -1 x2103 >= 0 ;++1 x1912 -1 x2104 >= 0 ;++1 x1913 -1 x2105 >= 0 ;++1 x1914 -1 x2106 >= 0 ;++1 x1915 -1 x2107 >= 0 ;++1 x1916 -1 x2108 >= 0 ;++1 x1917 -1 x2109 >= 0 ;++1 x1918 -1 x2110 >= 0 ;++1 x1919 -1 x2111 >= 0 ;++1 x1920 -1 x2112 >= 0 ;++1 x1921 -1 x2113 >= 0 ;++1 x1922 -1 x2114 >= 0 ;++1 x1923 -1 x2115 >= 0 ;++1 x1924 -1 x2116 >= 0 ;++1 x1925 -1 x2117 >= 0 ;++1 x1926 -1 x2118 >= 0 ;++1 x1927 -1 x2119 >= 0 ;++1 x1928 -1 x2120 >= 0 ;++1 x1929 -1 x2121 >= 0 ;++1 x1930 -1 x2122 >= 0 ;++1 x1931 -1 x2123 >= 0 ;++1 x1932 -1 x2124 >= 0 ;++1 x1933 -1 x2125 >= 0 ;++1 x1934 -1 x2126 >= 0 ;++1 x1935 -1 x2127 >= 0 ;++1 x1936 -1 x2128 >= 0 ;++1 x1937 -1 x2129 >= 0 ;++1 x1938 -1 x2130 >= 0 ;++1 x1939 -1 x2131 >= 0 ;++1 x1940 -1 x2132 >= 0 ;++1 x1941 -1 x2133 >= 0 ;++1 x1942 -1 x2134 >= 0 ;++1 x1943 -1 x2135 >= 0 ;++1 x1944 -1 x2136 >= 0 ;++1 x1945 -1 x2137 >= 0 ;++1 x1946 -1 x2138 >= 0 ;++1 x1947 -1 x2139 >= 0 ;++1 x1948 -1 x2140 >= 0 ;++1 x1949 -1 x2141 >= 0 ;++1 x1950 -1 x2142 >= 0 ;++1 x1951 -1 x2143 >= 0 ;++1 x1952 -1 x2144 >= 0 ;++1 x1953 -1 x2145 >= 0 ;++1 x1954 -1 x2146 >= 0 ;++1 x1955 -1 x2147 >= 0 ;++1 x1956 -1 x2148 >= 0 ;++1 x1957 -1 x2149 >= 0 ;++1 x1958 -1 x2150 >= 0 ;++1 x1959 -1 x2151 >= 0 ;++1 x1960 -1 x2152 >= 0 ;++1 x1961 -1 x2153 >= 0 ;++1 x1962 -1 x2154 >= 0 ;++1 x1963 -1 x2155 >= 0 ;++1 x1964 -1 x2156 >= 0 ;++1 x1965 -1 x2157 >= 0 ;++1 x1966 -1 x2158 >= 0 ;++1 x1967 -1 x2159 >= 0 ;++1 x1968 -1 x2160 >= 0 ;++1 x1969 -1 x2161 >= 0 ;++1 x1970 >= 1 ;+-1 x2165 >= 0 ;++1 x283 -1 x2166 >= 0 ;++1 x284 -1 x2167 >= 0 ;++1 x285 -1 x2168 >= 0 ;++1 x286 -1 x2169 >= 0 ;++1 x287 -1 x2170 >= 0 ;++1 x288 -1 x2171 >= 0 ;++1 x289 -1 x2172 >= 0 ;++1 x290 -1 x2173 >= 0 ;++1 x291 -1 x2174 >= 0 ;++1 x292 -1 x2175 >= 0 ;++1 x293 -1 x2176 >= 0 ;++1 x294 -1 x2177 >= 0 ;++1 x295 -1 x2178 >= 0 ;++1 x296 -1 x2179 >= 0 ;++1 x297 -1 x2180 >= 0 ;++1 x298 -1 x2181 >= 0 ;++1 x299 -1 x2182 >= 0 ;++1 x300 -1 x2183 >= 0 ;++1 x301 -1 x2184 >= 0 ;++1 x302 -1 x2185 >= 0 ;++1 x303 -1 x2186 >= 0 ;++1 x304 -1 x2187 >= 0 ;++1 x305 -1 x2188 >= 0 ;++1 x306 -1 x2189 >= 0 ;++1 x307 -1 x2190 >= 0 ;++1 x308 -1 x2191 >= 0 ;++1 x309 -1 x2192 >= 0 ;++1 x310 -1 x2193 >= 0 ;++1 x311 -1 x2194 >= 0 ;++1 x312 -1 x2195 >= 0 ;++1 x313 -1 x2196 >= 0 ;++1 x314 -1 x2197 >= 0 ;++1 x315 -1 x2198 >= 0 ;++1 x316 -1 x2199 >= 0 ;++1 x317 -1 x2200 >= 0 ;++1 x318 -1 x2201 >= 0 ;++1 x319 -1 x2202 >= 0 ;++1 x320 -1 x2203 >= 0 ;++1 x321 -1 x2204 >= 0 ;++1 x322 -1 x2205 >= 0 ;++1 x323 -1 x2206 >= 0 ;++1 x324 -1 x2207 >= 0 ;++1 x325 -1 x2208 >= 0 ;++1 x326 -1 x2209 >= 0 ;++1 x327 -1 x2210 >= 0 ;++1 x328 -1 x2211 >= 0 ;++1 x329 -1 x2212 >= 0 ;++1 x330 -1 x2213 >= 0 ;++1 x331 -1 x2214 >= 0 ;++1 x332 -1 x2215 >= 0 ;++1 x333 -1 x2216 >= 0 ;++1 x334 -1 x2217 >= 0 ;++1 x335 -1 x2218 >= 0 ;++1 x336 -1 x2219 >= 0 ;++1 x337 -1 x2220 >= 0 ;++1 x338 -1 x2221 >= 0 ;++1 x339 -1 x2222 >= 0 ;++1 x340 -1 x2223 >= 0 ;++1 x341 -1 x2224 >= 0 ;++1 x342 -1 x2225 >= 0 ;++1 x343 -1 x2226 >= 0 ;++1 x344 -1 x2227 >= 0 ;++1 x345 -1 x2228 >= 0 ;++1 x346 -1 x2229 >= 0 ;++1 x347 -1 x2230 >= 0 ;++1 x348 -1 x2231 >= 0 ;++1 x349 -1 x2232 >= 0 ;++1 x350 -1 x2233 >= 0 ;++1 x351 -1 x2234 >= 0 ;++1 x352 -1 x2235 >= 0 ;++1 x353 -1 x2236 >= 0 ;++1 x354 -1 x2237 >= 0 ;++1 x355 -1 x2238 >= 0 ;++1 x356 -1 x2239 >= 0 ;++1 x357 -1 x2240 >= 0 ;++1 x358 -1 x2241 >= 0 ;++1 x359 -1 x2242 >= 0 ;++1 x360 -1 x2243 >= 0 ;++1 x361 -1 x2244 >= 0 ;++1 x362 -1 x2245 >= 0 ;++1 x363 -1 x2246 >= 0 ;++1 x364 -1 x2247 >= 0 ;++1 x365 -1 x2248 >= 0 ;++1 x366 -1 x2249 >= 0 ;++1 x367 -1 x2250 >= 0 ;++1 x368 -1 x2251 >= 0 ;++1 x369 -1 x2252 >= 0 ;++1 x370 -1 x2253 >= 0 ;++1 x371 -1 x2254 >= 0 ;++1 x372 -1 x2255 >= 0 ;++1 x373 >= 1 ;+-1 x2164 >= 0 ;++1 x1787 -1 x2165 >= 0 ;++1 x1788 -1 x2166 >= 0 ;++1 x1789 -1 x2167 >= 0 ;++1 x1790 -1 x2168 >= 0 ;++1 x1791 -1 x2169 >= 0 ;++1 x1792 -1 x2170 >= 0 ;++1 x1793 -1 x2171 >= 0 ;++1 x1794 -1 x2172 >= 0 ;++1 x1795 -1 x2173 >= 0 ;++1 x1796 -1 x2174 >= 0 ;++1 x1797 -1 x2175 >= 0 ;++1 x1798 -1 x2176 >= 0 ;++1 x1799 -1 x2177 >= 0 ;++1 x1800 -1 x2178 >= 0 ;++1 x1801 -1 x2179 >= 0 ;++1 x1802 -1 x2180 >= 0 ;++1 x1803 -1 x2181 >= 0 ;++1 x1804 -1 x2182 >= 0 ;++1 x1805 -1 x2183 >= 0 ;++1 x1806 -1 x2184 >= 0 ;++1 x1807 -1 x2185 >= 0 ;++1 x1808 -1 x2186 >= 0 ;++1 x1809 -1 x2187 >= 0 ;++1 x1810 -1 x2188 >= 0 ;++1 x1811 -1 x2189 >= 0 ;++1 x1812 -1 x2190 >= 0 ;++1 x1813 -1 x2191 >= 0 ;++1 x1814 -1 x2192 >= 0 ;++1 x1815 -1 x2193 >= 0 ;++1 x1816 -1 x2194 >= 0 ;++1 x1817 -1 x2195 >= 0 ;++1 x1818 -1 x2196 >= 0 ;++1 x1819 -1 x2197 >= 0 ;++1 x1820 -1 x2198 >= 0 ;++1 x1821 -1 x2199 >= 0 ;++1 x1822 -1 x2200 >= 0 ;++1 x1823 -1 x2201 >= 0 ;++1 x1824 -1 x2202 >= 0 ;++1 x1825 -1 x2203 >= 0 ;++1 x1826 -1 x2204 >= 0 ;++1 x1827 -1 x2205 >= 0 ;++1 x1828 -1 x2206 >= 0 ;++1 x1829 -1 x2207 >= 0 ;++1 x1830 -1 x2208 >= 0 ;++1 x1831 -1 x2209 >= 0 ;++1 x1832 -1 x2210 >= 0 ;++1 x1833 -1 x2211 >= 0 ;++1 x1834 -1 x2212 >= 0 ;++1 x1835 -1 x2213 >= 0 ;++1 x1836 -1 x2214 >= 0 ;++1 x1837 -1 x2215 >= 0 ;++1 x1838 -1 x2216 >= 0 ;++1 x1839 -1 x2217 >= 0 ;++1 x1840 -1 x2218 >= 0 ;++1 x1841 -1 x2219 >= 0 ;++1 x1842 -1 x2220 >= 0 ;++1 x1843 -1 x2221 >= 0 ;++1 x1844 -1 x2222 >= 0 ;++1 x1845 -1 x2223 >= 0 ;++1 x1846 -1 x2224 >= 0 ;++1 x1847 -1 x2225 >= 0 ;++1 x1848 -1 x2226 >= 0 ;++1 x1849 -1 x2227 >= 0 ;++1 x1850 -1 x2228 >= 0 ;++1 x1851 -1 x2229 >= 0 ;++1 x1852 -1 x2230 >= 0 ;++1 x1853 -1 x2231 >= 0 ;++1 x1854 -1 x2232 >= 0 ;++1 x1855 -1 x2233 >= 0 ;++1 x1856 -1 x2234 >= 0 ;++1 x1857 -1 x2235 >= 0 ;++1 x1858 -1 x2236 >= 0 ;++1 x1859 -1 x2237 >= 0 ;++1 x1860 -1 x2238 >= 0 ;++1 x1861 -1 x2239 >= 0 ;++1 x1862 -1 x2240 >= 0 ;++1 x1863 -1 x2241 >= 0 ;++1 x1864 -1 x2242 >= 0 ;++1 x1865 -1 x2243 >= 0 ;++1 x1866 -1 x2244 >= 0 ;++1 x1867 -1 x2245 >= 0 ;++1 x1868 -1 x2246 >= 0 ;++1 x1869 -1 x2247 >= 0 ;++1 x1870 -1 x2248 >= 0 ;++1 x1871 -1 x2249 >= 0 ;++1 x1872 -1 x2250 >= 0 ;++1 x1873 -1 x2251 >= 0 ;++1 x1874 -1 x2252 >= 0 ;++1 x1875 -1 x2253 >= 0 ;++1 x1876 -1 x2254 >= 0 ;++1 x1877 -1 x2255 >= 0 ;++1 x1878 >= 1 ;+-1 x2265 >= 0 ;++1 x471 -1 x2266 >= 0 ;++1 x472 -1 x2267 >= 0 ;++1 x473 -1 x2268 >= 0 ;++1 x474 -1 x2269 >= 0 ;++1 x475 -1 x2270 >= 0 ;++1 x476 -1 x2271 >= 0 ;++1 x477 -1 x2272 >= 0 ;++1 x478 -1 x2273 >= 0 ;++1 x479 -1 x2274 >= 0 ;++1 x480 -1 x2275 >= 0 ;++1 x481 -1 x2276 >= 0 ;++1 x482 -1 x2277 >= 0 ;++1 x483 -1 x2278 >= 0 ;++1 x484 -1 x2279 >= 0 ;++1 x485 -1 x2280 >= 0 ;++1 x486 -1 x2281 >= 0 ;++1 x487 -1 x2282 >= 0 ;++1 x488 -1 x2283 >= 0 ;++1 x489 -1 x2284 >= 0 ;++1 x490 -1 x2285 >= 0 ;++1 x491 -1 x2286 >= 0 ;++1 x492 -1 x2287 >= 0 ;++1 x493 -1 x2288 >= 0 ;++1 x494 -1 x2289 >= 0 ;++1 x495 -1 x2290 >= 0 ;++1 x496 -1 x2291 >= 0 ;++1 x497 -1 x2292 >= 0 ;++1 x498 -1 x2293 >= 0 ;++1 x499 -1 x2294 >= 0 ;++1 x500 -1 x2295 >= 0 ;++1 x501 -1 x2296 >= 0 ;++1 x502 -1 x2297 >= 0 ;++1 x503 -1 x2298 >= 0 ;++1 x504 -1 x2299 >= 0 ;++1 x505 -1 x2300 >= 0 ;++1 x506 -1 x2301 >= 0 ;++1 x507 -1 x2302 >= 0 ;++1 x508 -1 x2303 >= 0 ;++1 x509 -1 x2304 >= 0 ;++1 x510 -1 x2305 >= 0 ;++1 x511 -1 x2306 >= 0 ;++1 x512 -1 x2307 >= 0 ;++1 x513 -1 x2308 >= 0 ;++1 x514 -1 x2309 >= 0 ;++1 x515 -1 x2310 >= 0 ;++1 x516 -1 x2311 >= 0 ;++1 x517 -1 x2312 >= 0 ;++1 x518 -1 x2313 >= 0 ;++1 x519 -1 x2314 >= 0 ;++1 x520 -1 x2315 >= 0 ;++1 x521 -1 x2316 >= 0 ;++1 x522 -1 x2317 >= 0 ;++1 x523 -1 x2318 >= 0 ;++1 x524 -1 x2319 >= 0 ;++1 x525 -1 x2320 >= 0 ;++1 x526 -1 x2321 >= 0 ;++1 x527 -1 x2322 >= 0 ;++1 x528 -1 x2323 >= 0 ;++1 x529 -1 x2324 >= 0 ;++1 x530 -1 x2325 >= 0 ;++1 x531 -1 x2326 >= 0 ;++1 x532 -1 x2327 >= 0 ;++1 x533 -1 x2328 >= 0 ;++1 x534 -1 x2329 >= 0 ;++1 x535 -1 x2330 >= 0 ;++1 x536 -1 x2331 >= 0 ;++1 x537 -1 x2332 >= 0 ;++1 x538 -1 x2333 >= 0 ;++1 x539 -1 x2334 >= 0 ;++1 x540 -1 x2335 >= 0 ;++1 x541 -1 x2336 >= 0 ;++1 x542 -1 x2337 >= 0 ;++1 x543 -1 x2338 >= 0 ;++1 x544 -1 x2339 >= 0 ;++1 x545 -1 x2340 >= 0 ;++1 x546 -1 x2341 >= 0 ;++1 x547 -1 x2342 >= 0 ;++1 x548 -1 x2343 >= 0 ;++1 x549 -1 x2344 >= 0 ;++1 x550 -1 x2345 >= 0 ;++1 x551 -1 x2346 >= 0 ;++1 x552 -1 x2347 >= 0 ;++1 x553 -1 x2348 >= 0 ;++1 x554 -1 x2349 >= 0 ;++1 x555 >= 1 ;+-1 x2260 >= 0 ;++1 x1975 -1 x2261 >= 0 ;++1 x1976 -1 x2262 >= 0 ;++1 x1977 -1 x2263 >= 0 ;++1 x1978 -1 x2264 >= 0 ;++1 x1979 -1 x2265 >= 0 ;++1 x1980 -1 x2266 >= 0 ;++1 x1981 -1 x2267 >= 0 ;++1 x1982 -1 x2268 >= 0 ;++1 x1983 -1 x2269 >= 0 ;++1 x1984 -1 x2270 >= 0 ;++1 x1985 -1 x2271 >= 0 ;++1 x1986 -1 x2272 >= 0 ;++1 x1987 -1 x2273 >= 0 ;++1 x1988 -1 x2274 >= 0 ;++1 x1989 -1 x2275 >= 0 ;++1 x1990 -1 x2276 >= 0 ;++1 x1991 -1 x2277 >= 0 ;++1 x1992 -1 x2278 >= 0 ;++1 x1993 -1 x2279 >= 0 ;++1 x1994 -1 x2280 >= 0 ;++1 x1995 -1 x2281 >= 0 ;++1 x1996 -1 x2282 >= 0 ;++1 x1997 -1 x2283 >= 0 ;++1 x1998 -1 x2284 >= 0 ;++1 x1999 -1 x2285 >= 0 ;++1 x2000 -1 x2286 >= 0 ;++1 x2001 -1 x2287 >= 0 ;++1 x2002 -1 x2288 >= 0 ;++1 x2003 -1 x2289 >= 0 ;++1 x2004 -1 x2290 >= 0 ;++1 x2005 -1 x2291 >= 0 ;++1 x2006 -1 x2292 >= 0 ;++1 x2007 -1 x2293 >= 0 ;++1 x2008 -1 x2294 >= 0 ;++1 x2009 -1 x2295 >= 0 ;++1 x2010 -1 x2296 >= 0 ;++1 x2011 -1 x2297 >= 0 ;++1 x2012 -1 x2298 >= 0 ;++1 x2013 -1 x2299 >= 0 ;++1 x2014 -1 x2300 >= 0 ;++1 x2015 -1 x2301 >= 0 ;++1 x2016 -1 x2302 >= 0 ;++1 x2017 -1 x2303 >= 0 ;++1 x2018 -1 x2304 >= 0 ;++1 x2019 -1 x2305 >= 0 ;++1 x2020 -1 x2306 >= 0 ;++1 x2021 -1 x2307 >= 0 ;++1 x2022 -1 x2308 >= 0 ;++1 x2023 -1 x2309 >= 0 ;++1 x2024 -1 x2310 >= 0 ;++1 x2025 -1 x2311 >= 0 ;++1 x2026 -1 x2312 >= 0 ;++1 x2027 -1 x2313 >= 0 ;++1 x2028 -1 x2314 >= 0 ;++1 x2029 -1 x2315 >= 0 ;++1 x2030 -1 x2316 >= 0 ;++1 x2031 -1 x2317 >= 0 ;++1 x2032 -1 x2318 >= 0 ;++1 x2033 -1 x2319 >= 0 ;++1 x2034 -1 x2320 >= 0 ;++1 x2035 -1 x2321 >= 0 ;++1 x2036 -1 x2322 >= 0 ;++1 x2037 -1 x2323 >= 0 ;++1 x2038 -1 x2324 >= 0 ;++1 x2039 -1 x2325 >= 0 ;++1 x2040 -1 x2326 >= 0 ;++1 x2041 -1 x2327 >= 0 ;++1 x2042 -1 x2328 >= 0 ;++1 x2043 -1 x2329 >= 0 ;++1 x2044 -1 x2330 >= 0 ;++1 x2045 -1 x2331 >= 0 ;++1 x2046 -1 x2332 >= 0 ;++1 x2047 -1 x2333 >= 0 ;++1 x2048 -1 x2334 >= 0 ;++1 x2049 -1 x2335 >= 0 ;++1 x2050 -1 x2336 >= 0 ;++1 x2051 -1 x2337 >= 0 ;++1 x2052 -1 x2338 >= 0 ;++1 x2053 -1 x2339 >= 0 ;++1 x2054 -1 x2340 >= 0 ;++1 x2055 -1 x2341 >= 0 ;++1 x2056 -1 x2342 >= 0 ;++1 x2057 -1 x2343 >= 0 ;++1 x2058 -1 x2344 >= 0 ;++1 x2059 -1 x2345 >= 0 ;++1 x2060 -1 x2346 >= 0 ;++1 x2061 -1 x2347 >= 0 ;++1 x2062 -1 x2348 >= 0 ;++1 x2063 -1 x2349 >= 0 ;++1 x2064 >= 1 ;+-1 x2263 >= 0 ;++1 x2069 -1 x2264 >= 0 ;++1 x2070 -1 x2265 >= 0 ;++1 x2071 -1 x2266 >= 0 ;++1 x2072 -1 x2267 >= 0 ;++1 x2073 -1 x2268 >= 0 ;++1 x2074 -1 x2269 >= 0 ;++1 x2075 -1 x2270 >= 0 ;++1 x2076 -1 x2271 >= 0 ;++1 x2077 -1 x2272 >= 0 ;++1 x2078 -1 x2273 >= 0 ;++1 x2079 -1 x2274 >= 0 ;++1 x2080 -1 x2275 >= 0 ;++1 x2081 -1 x2276 >= 0 ;++1 x2082 -1 x2277 >= 0 ;++1 x2083 -1 x2278 >= 0 ;++1 x2084 -1 x2279 >= 0 ;++1 x2085 -1 x2280 >= 0 ;++1 x2086 -1 x2281 >= 0 ;++1 x2087 -1 x2282 >= 0 ;++1 x2088 -1 x2283 >= 0 ;++1 x2089 -1 x2284 >= 0 ;++1 x2090 -1 x2285 >= 0 ;++1 x2091 -1 x2286 >= 0 ;++1 x2092 -1 x2287 >= 0 ;++1 x2093 -1 x2288 >= 0 ;++1 x2094 -1 x2289 >= 0 ;++1 x2095 -1 x2290 >= 0 ;++1 x2096 -1 x2291 >= 0 ;++1 x2097 -1 x2292 >= 0 ;++1 x2098 -1 x2293 >= 0 ;++1 x2099 -1 x2294 >= 0 ;++1 x2100 -1 x2295 >= 0 ;++1 x2101 -1 x2296 >= 0 ;++1 x2102 -1 x2297 >= 0 ;++1 x2103 -1 x2298 >= 0 ;++1 x2104 -1 x2299 >= 0 ;++1 x2105 -1 x2300 >= 0 ;++1 x2106 -1 x2301 >= 0 ;++1 x2107 -1 x2302 >= 0 ;++1 x2108 -1 x2303 >= 0 ;++1 x2109 -1 x2304 >= 0 ;++1 x2110 -1 x2305 >= 0 ;++1 x2111 -1 x2306 >= 0 ;++1 x2112 -1 x2307 >= 0 ;++1 x2113 -1 x2308 >= 0 ;++1 x2114 -1 x2309 >= 0 ;++1 x2115 -1 x2310 >= 0 ;++1 x2116 -1 x2311 >= 0 ;++1 x2117 -1 x2312 >= 0 ;++1 x2118 -1 x2313 >= 0 ;++1 x2119 -1 x2314 >= 0 ;++1 x2120 -1 x2315 >= 0 ;++1 x2121 -1 x2316 >= 0 ;++1 x2122 -1 x2317 >= 0 ;++1 x2123 -1 x2318 >= 0 ;++1 x2124 -1 x2319 >= 0 ;++1 x2125 -1 x2320 >= 0 ;++1 x2126 -1 x2321 >= 0 ;++1 x2127 -1 x2322 >= 0 ;++1 x2128 -1 x2323 >= 0 ;++1 x2129 -1 x2324 >= 0 ;++1 x2130 -1 x2325 >= 0 ;++1 x2131 -1 x2326 >= 0 ;++1 x2132 -1 x2327 >= 0 ;++1 x2133 -1 x2328 >= 0 ;++1 x2134 -1 x2329 >= 0 ;++1 x2135 -1 x2330 >= 0 ;++1 x2136 -1 x2331 >= 0 ;++1 x2137 -1 x2332 >= 0 ;++1 x2138 -1 x2333 >= 0 ;++1 x2139 -1 x2334 >= 0 ;++1 x2140 -1 x2335 >= 0 ;++1 x2141 -1 x2336 >= 0 ;++1 x2142 -1 x2337 >= 0 ;++1 x2143 -1 x2338 >= 0 ;++1 x2144 -1 x2339 >= 0 ;++1 x2145 -1 x2340 >= 0 ;++1 x2146 -1 x2341 >= 0 ;++1 x2147 -1 x2342 >= 0 ;++1 x2148 -1 x2343 >= 0 ;++1 x2149 -1 x2344 >= 0 ;++1 x2150 -1 x2345 >= 0 ;++1 x2151 -1 x2346 >= 0 ;++1 x2152 -1 x2347 >= 0 ;++1 x2153 -1 x2348 >= 0 ;++1 x2154 -1 x2349 >= 0 ;++1 x2155 >= 1 ;+-1 x2356 >= 0 ;++1 x1129 -1 x2357 >= 0 ;++1 x1130 -1 x2358 >= 0 ;++1 x1131 -1 x2359 >= 0 ;++1 x1132 -1 x2360 >= 0 ;++1 x1133 -1 x2361 >= 0 ;++1 x1134 -1 x2362 >= 0 ;++1 x1135 -1 x2363 >= 0 ;++1 x1136 -1 x2364 >= 0 ;++1 x1137 -1 x2365 >= 0 ;++1 x1138 -1 x2366 >= 0 ;++1 x1139 -1 x2367 >= 0 ;++1 x1140 -1 x2368 >= 0 ;++1 x1141 -1 x2369 >= 0 ;++1 x1142 -1 x2370 >= 0 ;++1 x1143 -1 x2371 >= 0 ;++1 x1144 -1 x2372 >= 0 ;++1 x1145 -1 x2373 >= 0 ;++1 x1146 -1 x2374 >= 0 ;++1 x1147 -1 x2375 >= 0 ;++1 x1148 -1 x2376 >= 0 ;++1 x1149 -1 x2377 >= 0 ;++1 x1150 -1 x2378 >= 0 ;++1 x1151 -1 x2379 >= 0 ;++1 x1152 -1 x2380 >= 0 ;++1 x1153 -1 x2381 >= 0 ;++1 x1154 -1 x2382 >= 0 ;++1 x1155 -1 x2383 >= 0 ;++1 x1156 -1 x2384 >= 0 ;++1 x1157 -1 x2385 >= 0 ;++1 x1158 -1 x2386 >= 0 ;++1 x1159 -1 x2387 >= 0 ;++1 x1160 -1 x2388 >= 0 ;++1 x1161 -1 x2389 >= 0 ;++1 x1162 -1 x2390 >= 0 ;++1 x1163 -1 x2391 >= 0 ;++1 x1164 -1 x2392 >= 0 ;++1 x1165 -1 x2393 >= 0 ;++1 x1166 -1 x2394 >= 0 ;++1 x1167 -1 x2395 >= 0 ;++1 x1168 -1 x2396 >= 0 ;++1 x1169 -1 x2397 >= 0 ;++1 x1170 -1 x2398 >= 0 ;++1 x1171 -1 x2399 >= 0 ;++1 x1172 -1 x2400 >= 0 ;++1 x1173 -1 x2401 >= 0 ;++1 x1174 -1 x2402 >= 0 ;++1 x1175 -1 x2403 >= 0 ;++1 x1176 -1 x2404 >= 0 ;++1 x1177 -1 x2405 >= 0 ;++1 x1178 -1 x2406 >= 0 ;++1 x1179 -1 x2407 >= 0 ;++1 x1180 -1 x2408 >= 0 ;++1 x1181 -1 x2409 >= 0 ;++1 x1182 -1 x2410 >= 0 ;++1 x1183 -1 x2411 >= 0 ;++1 x1184 -1 x2412 >= 0 ;++1 x1185 -1 x2413 >= 0 ;++1 x1186 -1 x2414 >= 0 ;++1 x1187 -1 x2415 >= 0 ;++1 x1188 -1 x2416 >= 0 ;++1 x1189 -1 x2417 >= 0 ;++1 x1190 -1 x2418 >= 0 ;++1 x1191 -1 x2419 >= 0 ;++1 x1192 -1 x2420 >= 0 ;++1 x1193 -1 x2421 >= 0 ;++1 x1194 -1 x2422 >= 0 ;++1 x1195 -1 x2423 >= 0 ;++1 x1196 -1 x2424 >= 0 ;++1 x1197 -1 x2425 >= 0 ;++1 x1198 -1 x2426 >= 0 ;++1 x1199 -1 x2427 >= 0 ;++1 x1200 -1 x2428 >= 0 ;++1 x1201 -1 x2429 >= 0 ;++1 x1202 -1 x2430 >= 0 ;++1 x1203 -1 x2431 >= 0 ;++1 x1204 -1 x2432 >= 0 ;++1 x1205 -1 x2433 >= 0 ;++1 x1206 -1 x2434 >= 0 ;++1 x1207 -1 x2435 >= 0 ;++1 x1208 -1 x2436 >= 0 ;++1 x1209 -1 x2437 >= 0 ;++1 x1210 -1 x2438 >= 0 ;++1 x1211 -1 x2439 >= 0 ;++1 x1212 -1 x2440 >= 0 ;++1 x1213 -1 x2441 >= 0 ;++1 x1214 -1 x2442 >= 0 ;++1 x1215 -1 x2443 >= 0 ;++1 x1216 >= 1 ;+-1 x2353 >= 0 ;++1 x1599 -1 x2354 >= 0 ;++1 x1600 -1 x2355 >= 0 ;++1 x1601 -1 x2356 >= 0 ;++1 x1602 -1 x2357 >= 0 ;++1 x1603 -1 x2358 >= 0 ;++1 x1604 -1 x2359 >= 0 ;++1 x1605 -1 x2360 >= 0 ;++1 x1606 -1 x2361 >= 0 ;++1 x1607 -1 x2362 >= 0 ;++1 x1608 -1 x2363 >= 0 ;++1 x1609 -1 x2364 >= 0 ;++1 x1610 -1 x2365 >= 0 ;++1 x1611 -1 x2366 >= 0 ;++1 x1612 -1 x2367 >= 0 ;++1 x1613 -1 x2368 >= 0 ;++1 x1614 -1 x2369 >= 0 ;++1 x1615 -1 x2370 >= 0 ;++1 x1616 -1 x2371 >= 0 ;++1 x1617 -1 x2372 >= 0 ;++1 x1618 -1 x2373 >= 0 ;++1 x1619 -1 x2374 >= 0 ;++1 x1620 -1 x2375 >= 0 ;++1 x1621 -1 x2376 >= 0 ;++1 x1622 -1 x2377 >= 0 ;++1 x1623 -1 x2378 >= 0 ;++1 x1624 -1 x2379 >= 0 ;++1 x1625 -1 x2380 >= 0 ;++1 x1626 -1 x2381 >= 0 ;++1 x1627 -1 x2382 >= 0 ;++1 x1628 -1 x2383 >= 0 ;++1 x1629 -1 x2384 >= 0 ;++1 x1630 -1 x2385 >= 0 ;++1 x1631 -1 x2386 >= 0 ;++1 x1632 -1 x2387 >= 0 ;++1 x1633 -1 x2388 >= 0 ;++1 x1634 -1 x2389 >= 0 ;++1 x1635 -1 x2390 >= 0 ;++1 x1636 -1 x2391 >= 0 ;++1 x1637 -1 x2392 >= 0 ;++1 x1638 -1 x2393 >= 0 ;++1 x1639 -1 x2394 >= 0 ;++1 x1640 -1 x2395 >= 0 ;++1 x1641 -1 x2396 >= 0 ;++1 x1642 -1 x2397 >= 0 ;++1 x1643 -1 x2398 >= 0 ;++1 x1644 -1 x2399 >= 0 ;++1 x1645 -1 x2400 >= 0 ;++1 x1646 -1 x2401 >= 0 ;++1 x1647 -1 x2402 >= 0 ;++1 x1648 -1 x2403 >= 0 ;++1 x1649 -1 x2404 >= 0 ;++1 x1650 -1 x2405 >= 0 ;++1 x1651 -1 x2406 >= 0 ;++1 x1652 -1 x2407 >= 0 ;++1 x1653 -1 x2408 >= 0 ;++1 x1654 -1 x2409 >= 0 ;++1 x1655 -1 x2410 >= 0 ;++1 x1656 -1 x2411 >= 0 ;++1 x1657 -1 x2412 >= 0 ;++1 x1658 -1 x2413 >= 0 ;++1 x1659 -1 x2414 >= 0 ;++1 x1660 -1 x2415 >= 0 ;++1 x1661 -1 x2416 >= 0 ;++1 x1662 -1 x2417 >= 0 ;++1 x1663 -1 x2418 >= 0 ;++1 x1664 -1 x2419 >= 0 ;++1 x1665 -1 x2420 >= 0 ;++1 x1666 -1 x2421 >= 0 ;++1 x1667 -1 x2422 >= 0 ;++1 x1668 -1 x2423 >= 0 ;++1 x1669 -1 x2424 >= 0 ;++1 x1670 -1 x2425 >= 0 ;++1 x1671 -1 x2426 >= 0 ;++1 x1672 -1 x2427 >= 0 ;++1 x1673 -1 x2428 >= 0 ;++1 x1674 -1 x2429 >= 0 ;++1 x1675 -1 x2430 >= 0 ;++1 x1676 -1 x2431 >= 0 ;++1 x1677 -1 x2432 >= 0 ;++1 x1678 -1 x2433 >= 0 ;++1 x1679 -1 x2434 >= 0 ;++1 x1680 -1 x2435 >= 0 ;++1 x1681 -1 x2436 >= 0 ;++1 x1682 -1 x2437 >= 0 ;++1 x1683 -1 x2438 >= 0 ;++1 x1684 -1 x2439 >= 0 ;++1 x1685 -1 x2440 >= 0 ;++1 x1686 -1 x2441 >= 0 ;++1 x1687 -1 x2442 >= 0 ;++1 x1688 -1 x2443 >= 0 ;++1 x1689 >= 1 ;+-1 x2353 >= 0 ;++1 x2163 -1 x2354 >= 0 ;++1 x2164 -1 x2355 >= 0 ;++1 x2165 -1 x2356 >= 0 ;++1 x2166 -1 x2357 >= 0 ;++1 x2167 -1 x2358 >= 0 ;++1 x2168 -1 x2359 >= 0 ;++1 x2169 -1 x2360 >= 0 ;++1 x2170 -1 x2361 >= 0 ;++1 x2171 -1 x2362 >= 0 ;++1 x2172 -1 x2363 >= 0 ;++1 x2173 -1 x2364 >= 0 ;++1 x2174 -1 x2365 >= 0 ;++1 x2175 -1 x2366 >= 0 ;++1 x2176 -1 x2367 >= 0 ;++1 x2177 -1 x2368 >= 0 ;++1 x2178 -1 x2369 >= 0 ;++1 x2179 -1 x2370 >= 0 ;++1 x2180 -1 x2371 >= 0 ;++1 x2181 -1 x2372 >= 0 ;++1 x2182 -1 x2373 >= 0 ;++1 x2183 -1 x2374 >= 0 ;++1 x2184 -1 x2375 >= 0 ;++1 x2185 -1 x2376 >= 0 ;++1 x2186 -1 x2377 >= 0 ;++1 x2187 -1 x2378 >= 0 ;++1 x2188 -1 x2379 >= 0 ;++1 x2189 -1 x2380 >= 0 ;++1 x2190 -1 x2381 >= 0 ;++1 x2191 -1 x2382 >= 0 ;++1 x2192 -1 x2383 >= 0 ;++1 x2193 -1 x2384 >= 0 ;++1 x2194 -1 x2385 >= 0 ;++1 x2195 -1 x2386 >= 0 ;++1 x2196 -1 x2387 >= 0 ;++1 x2197 -1 x2388 >= 0 ;++1 x2198 -1 x2389 >= 0 ;++1 x2199 -1 x2390 >= 0 ;++1 x2200 -1 x2391 >= 0 ;++1 x2201 -1 x2392 >= 0 ;++1 x2202 -1 x2393 >= 0 ;++1 x2203 -1 x2394 >= 0 ;++1 x2204 -1 x2395 >= 0 ;++1 x2205 -1 x2396 >= 0 ;++1 x2206 -1 x2397 >= 0 ;++1 x2207 -1 x2398 >= 0 ;++1 x2208 -1 x2399 >= 0 ;++1 x2209 -1 x2400 >= 0 ;++1 x2210 -1 x2401 >= 0 ;++1 x2211 -1 x2402 >= 0 ;++1 x2212 -1 x2403 >= 0 ;++1 x2213 -1 x2404 >= 0 ;++1 x2214 -1 x2405 >= 0 ;++1 x2215 -1 x2406 >= 0 ;++1 x2216 -1 x2407 >= 0 ;++1 x2217 -1 x2408 >= 0 ;++1 x2218 -1 x2409 >= 0 ;++1 x2219 -1 x2410 >= 0 ;++1 x2220 -1 x2411 >= 0 ;++1 x2221 -1 x2412 >= 0 ;++1 x2222 -1 x2413 >= 0 ;++1 x2223 -1 x2414 >= 0 ;++1 x2224 -1 x2415 >= 0 ;++1 x2225 -1 x2416 >= 0 ;++1 x2226 -1 x2417 >= 0 ;++1 x2227 -1 x2418 >= 0 ;++1 x2228 -1 x2419 >= 0 ;++1 x2229 -1 x2420 >= 0 ;++1 x2230 -1 x2421 >= 0 ;++1 x2231 -1 x2422 >= 0 ;++1 x2232 -1 x2423 >= 0 ;++1 x2233 -1 x2424 >= 0 ;++1 x2234 -1 x2425 >= 0 ;++1 x2235 -1 x2426 >= 0 ;++1 x2236 -1 x2427 >= 0 ;++1 x2237 -1 x2428 >= 0 ;++1 x2238 -1 x2429 >= 0 ;++1 x2239 -1 x2430 >= 0 ;++1 x2240 -1 x2431 >= 0 ;++1 x2241 -1 x2432 >= 0 ;++1 x2242 -1 x2433 >= 0 ;++1 x2243 -1 x2434 >= 0 ;++1 x2244 -1 x2435 >= 0 ;++1 x2245 -1 x2436 >= 0 ;++1 x2246 -1 x2437 >= 0 ;++1 x2247 -1 x2438 >= 0 ;++1 x2248 -1 x2439 >= 0 ;++1 x2249 -1 x2440 >= 0 ;++1 x2250 -1 x2441 >= 0 ;++1 x2251 -1 x2442 >= 0 ;++1 x2252 -1 x2443 >= 0 ;++1 x2253 >= 1 ;+-1 x2448 >= 0 ;++1 x753 -1 x2449 >= 0 ;++1 x754 -1 x2450 >= 0 ;++1 x755 -1 x2451 >= 0 ;++1 x756 -1 x2452 >= 0 ;++1 x757 -1 x2453 >= 0 ;++1 x758 -1 x2454 >= 0 ;++1 x759 -1 x2455 >= 0 ;++1 x760 -1 x2456 >= 0 ;++1 x761 -1 x2457 >= 0 ;++1 x762 -1 x2458 >= 0 ;++1 x763 -1 x2459 >= 0 ;++1 x764 -1 x2460 >= 0 ;++1 x765 -1 x2461 >= 0 ;++1 x766 -1 x2462 >= 0 ;++1 x767 -1 x2463 >= 0 ;++1 x768 -1 x2464 >= 0 ;++1 x769 -1 x2465 >= 0 ;++1 x770 -1 x2466 >= 0 ;++1 x771 -1 x2467 >= 0 ;++1 x772 -1 x2468 >= 0 ;++1 x773 -1 x2469 >= 0 ;++1 x774 -1 x2470 >= 0 ;++1 x775 -1 x2471 >= 0 ;++1 x776 -1 x2472 >= 0 ;++1 x777 -1 x2473 >= 0 ;++1 x778 -1 x2474 >= 0 ;++1 x779 -1 x2475 >= 0 ;++1 x780 -1 x2476 >= 0 ;++1 x781 -1 x2477 >= 0 ;++1 x782 -1 x2478 >= 0 ;++1 x783 -1 x2479 >= 0 ;++1 x784 -1 x2480 >= 0 ;++1 x785 -1 x2481 >= 0 ;++1 x786 -1 x2482 >= 0 ;++1 x787 -1 x2483 >= 0 ;++1 x788 -1 x2484 >= 0 ;++1 x789 -1 x2485 >= 0 ;++1 x790 -1 x2486 >= 0 ;++1 x791 -1 x2487 >= 0 ;++1 x792 -1 x2488 >= 0 ;++1 x793 -1 x2489 >= 0 ;++1 x794 -1 x2490 >= 0 ;++1 x795 -1 x2491 >= 0 ;++1 x796 -1 x2492 >= 0 ;++1 x797 -1 x2493 >= 0 ;++1 x798 -1 x2494 >= 0 ;++1 x799 -1 x2495 >= 0 ;++1 x800 -1 x2496 >= 0 ;++1 x801 -1 x2497 >= 0 ;++1 x802 -1 x2498 >= 0 ;++1 x803 -1 x2499 >= 0 ;++1 x804 -1 x2500 >= 0 ;++1 x805 -1 x2501 >= 0 ;++1 x806 -1 x2502 >= 0 ;++1 x807 -1 x2503 >= 0 ;++1 x808 -1 x2504 >= 0 ;++1 x809 -1 x2505 >= 0 ;++1 x810 -1 x2506 >= 0 ;++1 x811 -1 x2507 >= 0 ;++1 x812 -1 x2508 >= 0 ;++1 x813 -1 x2509 >= 0 ;++1 x814 -1 x2510 >= 0 ;++1 x815 -1 x2511 >= 0 ;++1 x816 -1 x2512 >= 0 ;++1 x817 -1 x2513 >= 0 ;++1 x818 -1 x2514 >= 0 ;++1 x819 -1 x2515 >= 0 ;++1 x820 -1 x2516 >= 0 ;++1 x821 -1 x2517 >= 0 ;++1 x822 -1 x2518 >= 0 ;++1 x823 -1 x2519 >= 0 ;++1 x824 -1 x2520 >= 0 ;++1 x825 -1 x2521 >= 0 ;++1 x826 -1 x2522 >= 0 ;++1 x827 -1 x2523 >= 0 ;++1 x828 -1 x2524 >= 0 ;++1 x829 -1 x2525 >= 0 ;++1 x830 -1 x2526 >= 0 ;++1 x831 -1 x2527 >= 0 ;++1 x832 -1 x2528 >= 0 ;++1 x833 -1 x2529 >= 0 ;++1 x834 -1 x2530 >= 0 ;++1 x835 -1 x2531 >= 0 ;++1 x836 -1 x2532 >= 0 ;++1 x837 -1 x2533 >= 0 ;++1 x838 -1 x2534 >= 0 ;++1 x839 -1 x2535 >= 0 ;++1 x840 -1 x2536 >= 0 ;++1 x841 -1 x2537 >= 0 ;++1 x842 >= 1 ;+-1 x2454 >= 0 ;++1 x1223 -1 x2455 >= 0 ;++1 x1224 -1 x2456 >= 0 ;++1 x1225 -1 x2457 >= 0 ;++1 x1226 -1 x2458 >= 0 ;++1 x1227 -1 x2459 >= 0 ;++1 x1228 -1 x2460 >= 0 ;++1 x1229 -1 x2461 >= 0 ;++1 x1230 -1 x2462 >= 0 ;++1 x1231 -1 x2463 >= 0 ;++1 x1232 -1 x2464 >= 0 ;++1 x1233 -1 x2465 >= 0 ;++1 x1234 -1 x2466 >= 0 ;++1 x1235 -1 x2467 >= 0 ;++1 x1236 -1 x2468 >= 0 ;++1 x1237 -1 x2469 >= 0 ;++1 x1238 -1 x2470 >= 0 ;++1 x1239 -1 x2471 >= 0 ;++1 x1240 -1 x2472 >= 0 ;++1 x1241 -1 x2473 >= 0 ;++1 x1242 -1 x2474 >= 0 ;++1 x1243 -1 x2475 >= 0 ;++1 x1244 -1 x2476 >= 0 ;++1 x1245 -1 x2477 >= 0 ;++1 x1246 -1 x2478 >= 0 ;++1 x1247 -1 x2479 >= 0 ;++1 x1248 -1 x2480 >= 0 ;++1 x1249 -1 x2481 >= 0 ;++1 x1250 -1 x2482 >= 0 ;++1 x1251 -1 x2483 >= 0 ;++1 x1252 -1 x2484 >= 0 ;++1 x1253 -1 x2485 >= 0 ;++1 x1254 -1 x2486 >= 0 ;++1 x1255 -1 x2487 >= 0 ;++1 x1256 -1 x2488 >= 0 ;++1 x1257 -1 x2489 >= 0 ;++1 x1258 -1 x2490 >= 0 ;++1 x1259 -1 x2491 >= 0 ;++1 x1260 -1 x2492 >= 0 ;++1 x1261 -1 x2493 >= 0 ;++1 x1262 -1 x2494 >= 0 ;++1 x1263 -1 x2495 >= 0 ;++1 x1264 -1 x2496 >= 0 ;++1 x1265 -1 x2497 >= 0 ;++1 x1266 -1 x2498 >= 0 ;++1 x1267 -1 x2499 >= 0 ;++1 x1268 -1 x2500 >= 0 ;++1 x1269 -1 x2501 >= 0 ;++1 x1270 -1 x2502 >= 0 ;++1 x1271 -1 x2503 >= 0 ;++1 x1272 -1 x2504 >= 0 ;++1 x1273 -1 x2505 >= 0 ;++1 x1274 -1 x2506 >= 0 ;++1 x1275 -1 x2507 >= 0 ;++1 x1276 -1 x2508 >= 0 ;++1 x1277 -1 x2509 >= 0 ;++1 x1278 -1 x2510 >= 0 ;++1 x1279 -1 x2511 >= 0 ;++1 x1280 -1 x2512 >= 0 ;++1 x1281 -1 x2513 >= 0 ;++1 x1282 -1 x2514 >= 0 ;++1 x1283 -1 x2515 >= 0 ;++1 x1284 -1 x2516 >= 0 ;++1 x1285 -1 x2517 >= 0 ;++1 x1286 -1 x2518 >= 0 ;++1 x1287 -1 x2519 >= 0 ;++1 x1288 -1 x2520 >= 0 ;++1 x1289 -1 x2521 >= 0 ;++1 x1290 -1 x2522 >= 0 ;++1 x1291 -1 x2523 >= 0 ;++1 x1292 -1 x2524 >= 0 ;++1 x1293 -1 x2525 >= 0 ;++1 x1294 -1 x2526 >= 0 ;++1 x1295 -1 x2527 >= 0 ;++1 x1296 -1 x2528 >= 0 ;++1 x1297 -1 x2529 >= 0 ;++1 x1298 -1 x2530 >= 0 ;++1 x1299 -1 x2531 >= 0 ;++1 x1300 -1 x2532 >= 0 ;++1 x1301 -1 x2533 >= 0 ;++1 x1302 -1 x2534 >= 0 ;++1 x1303 -1 x2535 >= 0 ;++1 x1304 -1 x2536 >= 0 ;++1 x1305 -1 x2537 >= 0 ;++1 x1306 >= 1 ;+-1 x2453 >= 0 ;++1 x2257 -1 x2454 >= 0 ;++1 x2258 -1 x2455 >= 0 ;++1 x2259 -1 x2456 >= 0 ;++1 x2260 -1 x2457 >= 0 ;++1 x2261 -1 x2458 >= 0 ;++1 x2262 -1 x2459 >= 0 ;++1 x2263 -1 x2460 >= 0 ;++1 x2264 -1 x2461 >= 0 ;++1 x2265 -1 x2462 >= 0 ;++1 x2266 -1 x2463 >= 0 ;++1 x2267 -1 x2464 >= 0 ;++1 x2268 -1 x2465 >= 0 ;++1 x2269 -1 x2466 >= 0 ;++1 x2270 -1 x2467 >= 0 ;++1 x2271 -1 x2468 >= 0 ;++1 x2272 -1 x2469 >= 0 ;++1 x2273 -1 x2470 >= 0 ;++1 x2274 -1 x2471 >= 0 ;++1 x2275 -1 x2472 >= 0 ;++1 x2276 -1 x2473 >= 0 ;++1 x2277 -1 x2474 >= 0 ;++1 x2278 -1 x2475 >= 0 ;++1 x2279 -1 x2476 >= 0 ;++1 x2280 -1 x2477 >= 0 ;++1 x2281 -1 x2478 >= 0 ;++1 x2282 -1 x2479 >= 0 ;++1 x2283 -1 x2480 >= 0 ;++1 x2284 -1 x2481 >= 0 ;++1 x2285 -1 x2482 >= 0 ;++1 x2286 -1 x2483 >= 0 ;++1 x2287 -1 x2484 >= 0 ;++1 x2288 -1 x2485 >= 0 ;++1 x2289 -1 x2486 >= 0 ;++1 x2290 -1 x2487 >= 0 ;++1 x2291 -1 x2488 >= 0 ;++1 x2292 -1 x2489 >= 0 ;++1 x2293 -1 x2490 >= 0 ;++1 x2294 -1 x2491 >= 0 ;++1 x2295 -1 x2492 >= 0 ;++1 x2296 -1 x2493 >= 0 ;++1 x2297 -1 x2494 >= 0 ;++1 x2298 -1 x2495 >= 0 ;++1 x2299 -1 x2496 >= 0 ;++1 x2300 -1 x2497 >= 0 ;++1 x2301 -1 x2498 >= 0 ;++1 x2302 -1 x2499 >= 0 ;++1 x2303 -1 x2500 >= 0 ;++1 x2304 -1 x2501 >= 0 ;++1 x2305 -1 x2502 >= 0 ;++1 x2306 -1 x2503 >= 0 ;++1 x2307 -1 x2504 >= 0 ;++1 x2308 -1 x2505 >= 0 ;++1 x2309 -1 x2506 >= 0 ;++1 x2310 -1 x2507 >= 0 ;++1 x2311 -1 x2508 >= 0 ;++1 x2312 -1 x2509 >= 0 ;++1 x2313 -1 x2510 >= 0 ;++1 x2314 -1 x2511 >= 0 ;++1 x2315 -1 x2512 >= 0 ;++1 x2316 -1 x2513 >= 0 ;++1 x2317 -1 x2514 >= 0 ;++1 x2318 -1 x2515 >= 0 ;++1 x2319 -1 x2516 >= 0 ;++1 x2320 -1 x2517 >= 0 ;++1 x2321 -1 x2518 >= 0 ;++1 x2322 -1 x2519 >= 0 ;++1 x2323 -1 x2520 >= 0 ;++1 x2324 -1 x2521 >= 0 ;++1 x2325 -1 x2522 >= 0 ;++1 x2326 -1 x2523 >= 0 ;++1 x2327 -1 x2524 >= 0 ;++1 x2328 -1 x2525 >= 0 ;++1 x2329 -1 x2526 >= 0 ;++1 x2330 -1 x2527 >= 0 ;++1 x2331 -1 x2528 >= 0 ;++1 x2332 -1 x2529 >= 0 ;++1 x2333 -1 x2530 >= 0 ;++1 x2334 -1 x2531 >= 0 ;++1 x2335 -1 x2532 >= 0 ;++1 x2336 -1 x2533 >= 0 ;++1 x2337 -1 x2534 >= 0 ;++1 x2338 -1 x2535 >= 0 ;++1 x2339 -1 x2536 >= 0 ;++1 x2340 -1 x2537 >= 0 ;++1 x2341 >= 1 ;+-1 x2547 >= 0 ;++1 x1317 -1 x2548 >= 0 ;++1 x1318 -1 x2549 >= 0 ;++1 x1319 -1 x2550 >= 0 ;++1 x1320 -1 x2551 >= 0 ;++1 x1321 -1 x2552 >= 0 ;++1 x1322 -1 x2553 >= 0 ;++1 x1323 -1 x2554 >= 0 ;++1 x1324 -1 x2555 >= 0 ;++1 x1325 -1 x2556 >= 0 ;++1 x1326 -1 x2557 >= 0 ;++1 x1327 -1 x2558 >= 0 ;++1 x1328 -1 x2559 >= 0 ;++1 x1329 -1 x2560 >= 0 ;++1 x1330 -1 x2561 >= 0 ;++1 x1331 -1 x2562 >= 0 ;++1 x1332 -1 x2563 >= 0 ;++1 x1333 -1 x2564 >= 0 ;++1 x1334 -1 x2565 >= 0 ;++1 x1335 -1 x2566 >= 0 ;++1 x1336 -1 x2567 >= 0 ;++1 x1337 -1 x2568 >= 0 ;++1 x1338 -1 x2569 >= 0 ;++1 x1339 -1 x2570 >= 0 ;++1 x1340 -1 x2571 >= 0 ;++1 x1341 -1 x2572 >= 0 ;++1 x1342 -1 x2573 >= 0 ;++1 x1343 -1 x2574 >= 0 ;++1 x1344 -1 x2575 >= 0 ;++1 x1345 -1 x2576 >= 0 ;++1 x1346 -1 x2577 >= 0 ;++1 x1347 -1 x2578 >= 0 ;++1 x1348 -1 x2579 >= 0 ;++1 x1349 -1 x2580 >= 0 ;++1 x1350 -1 x2581 >= 0 ;++1 x1351 -1 x2582 >= 0 ;++1 x1352 -1 x2583 >= 0 ;++1 x1353 -1 x2584 >= 0 ;++1 x1354 -1 x2585 >= 0 ;++1 x1355 -1 x2586 >= 0 ;++1 x1356 -1 x2587 >= 0 ;++1 x1357 -1 x2588 >= 0 ;++1 x1358 -1 x2589 >= 0 ;++1 x1359 -1 x2590 >= 0 ;++1 x1360 -1 x2591 >= 0 ;++1 x1361 -1 x2592 >= 0 ;++1 x1362 -1 x2593 >= 0 ;++1 x1363 -1 x2594 >= 0 ;++1 x1364 -1 x2595 >= 0 ;++1 x1365 -1 x2596 >= 0 ;++1 x1366 -1 x2597 >= 0 ;++1 x1367 -1 x2598 >= 0 ;++1 x1368 -1 x2599 >= 0 ;++1 x1369 -1 x2600 >= 0 ;++1 x1370 -1 x2601 >= 0 ;++1 x1371 -1 x2602 >= 0 ;++1 x1372 -1 x2603 >= 0 ;++1 x1373 -1 x2604 >= 0 ;++1 x1374 -1 x2605 >= 0 ;++1 x1375 -1 x2606 >= 0 ;++1 x1376 -1 x2607 >= 0 ;++1 x1377 -1 x2608 >= 0 ;++1 x1378 -1 x2609 >= 0 ;++1 x1379 -1 x2610 >= 0 ;++1 x1380 -1 x2611 >= 0 ;++1 x1381 -1 x2612 >= 0 ;++1 x1382 -1 x2613 >= 0 ;++1 x1383 -1 x2614 >= 0 ;++1 x1384 -1 x2615 >= 0 ;++1 x1385 -1 x2616 >= 0 ;++1 x1386 -1 x2617 >= 0 ;++1 x1387 -1 x2618 >= 0 ;++1 x1388 -1 x2619 >= 0 ;++1 x1389 -1 x2620 >= 0 ;++1 x1390 -1 x2621 >= 0 ;++1 x1391 -1 x2622 >= 0 ;++1 x1392 -1 x2623 >= 0 ;++1 x1393 -1 x2624 >= 0 ;++1 x1394 -1 x2625 >= 0 ;++1 x1395 -1 x2626 >= 0 ;++1 x1396 -1 x2627 >= 0 ;++1 x1397 -1 x2628 >= 0 ;++1 x1398 -1 x2629 >= 0 ;++1 x1399 -1 x2630 >= 0 ;++1 x1400 -1 x2631 >= 0 ;++1 x1401 >= 1 ;+-1 x2542 >= 0 ;++1 x2351 -1 x2543 >= 0 ;++1 x2352 -1 x2544 >= 0 ;++1 x2353 -1 x2545 >= 0 ;++1 x2354 -1 x2546 >= 0 ;++1 x2355 -1 x2547 >= 0 ;++1 x2356 -1 x2548 >= 0 ;++1 x2357 -1 x2549 >= 0 ;++1 x2358 -1 x2550 >= 0 ;++1 x2359 -1 x2551 >= 0 ;++1 x2360 -1 x2552 >= 0 ;++1 x2361 -1 x2553 >= 0 ;++1 x2362 -1 x2554 >= 0 ;++1 x2363 -1 x2555 >= 0 ;++1 x2364 -1 x2556 >= 0 ;++1 x2365 -1 x2557 >= 0 ;++1 x2366 -1 x2558 >= 0 ;++1 x2367 -1 x2559 >= 0 ;++1 x2368 -1 x2560 >= 0 ;++1 x2369 -1 x2561 >= 0 ;++1 x2370 -1 x2562 >= 0 ;++1 x2371 -1 x2563 >= 0 ;++1 x2372 -1 x2564 >= 0 ;++1 x2373 -1 x2565 >= 0 ;++1 x2374 -1 x2566 >= 0 ;++1 x2375 -1 x2567 >= 0 ;++1 x2376 -1 x2568 >= 0 ;++1 x2377 -1 x2569 >= 0 ;++1 x2378 -1 x2570 >= 0 ;++1 x2379 -1 x2571 >= 0 ;++1 x2380 -1 x2572 >= 0 ;++1 x2381 -1 x2573 >= 0 ;++1 x2382 -1 x2574 >= 0 ;++1 x2383 -1 x2575 >= 0 ;++1 x2384 -1 x2576 >= 0 ;++1 x2385 -1 x2577 >= 0 ;++1 x2386 -1 x2578 >= 0 ;++1 x2387 -1 x2579 >= 0 ;++1 x2388 -1 x2580 >= 0 ;++1 x2389 -1 x2581 >= 0 ;++1 x2390 -1 x2582 >= 0 ;++1 x2391 -1 x2583 >= 0 ;++1 x2392 -1 x2584 >= 0 ;++1 x2393 -1 x2585 >= 0 ;++1 x2394 -1 x2586 >= 0 ;++1 x2395 -1 x2587 >= 0 ;++1 x2396 -1 x2588 >= 0 ;++1 x2397 -1 x2589 >= 0 ;++1 x2398 -1 x2590 >= 0 ;++1 x2399 -1 x2591 >= 0 ;++1 x2400 -1 x2592 >= 0 ;++1 x2401 -1 x2593 >= 0 ;++1 x2402 -1 x2594 >= 0 ;++1 x2403 -1 x2595 >= 0 ;++1 x2404 -1 x2596 >= 0 ;++1 x2405 -1 x2597 >= 0 ;++1 x2406 -1 x2598 >= 0 ;++1 x2407 -1 x2599 >= 0 ;++1 x2408 -1 x2600 >= 0 ;++1 x2409 -1 x2601 >= 0 ;++1 x2410 -1 x2602 >= 0 ;++1 x2411 -1 x2603 >= 0 ;++1 x2412 -1 x2604 >= 0 ;++1 x2413 -1 x2605 >= 0 ;++1 x2414 -1 x2606 >= 0 ;++1 x2415 -1 x2607 >= 0 ;++1 x2416 -1 x2608 >= 0 ;++1 x2417 -1 x2609 >= 0 ;++1 x2418 -1 x2610 >= 0 ;++1 x2419 -1 x2611 >= 0 ;++1 x2420 -1 x2612 >= 0 ;++1 x2421 -1 x2613 >= 0 ;++1 x2422 -1 x2614 >= 0 ;++1 x2423 -1 x2615 >= 0 ;++1 x2424 -1 x2616 >= 0 ;++1 x2425 -1 x2617 >= 0 ;++1 x2426 -1 x2618 >= 0 ;++1 x2427 -1 x2619 >= 0 ;++1 x2428 -1 x2620 >= 0 ;++1 x2429 -1 x2621 >= 0 ;++1 x2430 -1 x2622 >= 0 ;++1 x2431 -1 x2623 >= 0 ;++1 x2432 -1 x2624 >= 0 ;++1 x2433 -1 x2625 >= 0 ;++1 x2434 -1 x2626 >= 0 ;++1 x2435 -1 x2627 >= 0 ;++1 x2436 -1 x2628 >= 0 ;++1 x2437 -1 x2629 >= 0 ;++1 x2438 -1 x2630 >= 0 ;++1 x2439 -1 x2631 >= 0 ;++1 x2440 >= 1 ;+-1 x2541 >= 0 ;++1 x2445 -1 x2542 >= 0 ;++1 x2446 -1 x2543 >= 0 ;++1 x2447 -1 x2544 >= 0 ;++1 x2448 -1 x2545 >= 0 ;++1 x2449 -1 x2546 >= 0 ;++1 x2450 -1 x2547 >= 0 ;++1 x2451 -1 x2548 >= 0 ;++1 x2452 -1 x2549 >= 0 ;++1 x2453 -1 x2550 >= 0 ;++1 x2454 -1 x2551 >= 0 ;++1 x2455 -1 x2552 >= 0 ;++1 x2456 -1 x2553 >= 0 ;++1 x2457 -1 x2554 >= 0 ;++1 x2458 -1 x2555 >= 0 ;++1 x2459 -1 x2556 >= 0 ;++1 x2460 -1 x2557 >= 0 ;++1 x2461 -1 x2558 >= 0 ;++1 x2462 -1 x2559 >= 0 ;++1 x2463 -1 x2560 >= 0 ;++1 x2464 -1 x2561 >= 0 ;++1 x2465 -1 x2562 >= 0 ;++1 x2466 -1 x2563 >= 0 ;++1 x2467 -1 x2564 >= 0 ;++1 x2468 -1 x2565 >= 0 ;++1 x2469 -1 x2566 >= 0 ;++1 x2470 -1 x2567 >= 0 ;++1 x2471 -1 x2568 >= 0 ;++1 x2472 -1 x2569 >= 0 ;++1 x2473 -1 x2570 >= 0 ;++1 x2474 -1 x2571 >= 0 ;++1 x2475 -1 x2572 >= 0 ;++1 x2476 -1 x2573 >= 0 ;++1 x2477 -1 x2574 >= 0 ;++1 x2478 -1 x2575 >= 0 ;++1 x2479 -1 x2576 >= 0 ;++1 x2480 -1 x2577 >= 0 ;++1 x2481 -1 x2578 >= 0 ;++1 x2482 -1 x2579 >= 0 ;++1 x2483 -1 x2580 >= 0 ;++1 x2484 -1 x2581 >= 0 ;++1 x2485 -1 x2582 >= 0 ;++1 x2486 -1 x2583 >= 0 ;++1 x2487 -1 x2584 >= 0 ;++1 x2488 -1 x2585 >= 0 ;++1 x2489 -1 x2586 >= 0 ;++1 x2490 -1 x2587 >= 0 ;++1 x2491 -1 x2588 >= 0 ;++1 x2492 -1 x2589 >= 0 ;++1 x2493 -1 x2590 >= 0 ;++1 x2494 -1 x2591 >= 0 ;++1 x2495 -1 x2592 >= 0 ;++1 x2496 -1 x2593 >= 0 ;++1 x2497 -1 x2594 >= 0 ;++1 x2498 -1 x2595 >= 0 ;++1 x2499 -1 x2596 >= 0 ;++1 x2500 -1 x2597 >= 0 ;++1 x2501 -1 x2598 >= 0 ;++1 x2502 -1 x2599 >= 0 ;++1 x2503 -1 x2600 >= 0 ;++1 x2504 -1 x2601 >= 0 ;++1 x2505 -1 x2602 >= 0 ;++1 x2506 -1 x2603 >= 0 ;++1 x2507 -1 x2604 >= 0 ;++1 x2508 -1 x2605 >= 0 ;++1 x2509 -1 x2606 >= 0 ;++1 x2510 -1 x2607 >= 0 ;++1 x2511 -1 x2608 >= 0 ;++1 x2512 -1 x2609 >= 0 ;++1 x2513 -1 x2610 >= 0 ;++1 x2514 -1 x2611 >= 0 ;++1 x2515 -1 x2612 >= 0 ;++1 x2516 -1 x2613 >= 0 ;++1 x2517 -1 x2614 >= 0 ;++1 x2518 -1 x2615 >= 0 ;++1 x2519 -1 x2616 >= 0 ;++1 x2520 -1 x2617 >= 0 ;++1 x2521 -1 x2618 >= 0 ;++1 x2522 -1 x2619 >= 0 ;++1 x2523 -1 x2620 >= 0 ;++1 x2524 -1 x2621 >= 0 ;++1 x2525 -1 x2622 >= 0 ;++1 x2526 -1 x2623 >= 0 ;++1 x2527 -1 x2624 >= 0 ;++1 x2528 -1 x2625 >= 0 ;++1 x2529 -1 x2626 >= 0 ;++1 x2530 -1 x2627 >= 0 ;++1 x2531 -1 x2628 >= 0 ;++1 x2532 -1 x2629 >= 0 ;++1 x2533 -1 x2630 >= 0 ;++1 x2534 -1 x2631 >= 0 ;++1 x2535 >= 1 ;+-1 x2636 >= 0 ;++1 x377 -1 x2637 >= 0 ;++1 x378 -1 x2638 >= 0 ;++1 x379 -1 x2639 >= 0 ;++1 x380 -1 x2640 >= 0 ;++1 x381 -1 x2641 >= 0 ;++1 x382 -1 x2642 >= 0 ;++1 x383 -1 x2643 >= 0 ;++1 x384 -1 x2644 >= 0 ;++1 x385 -1 x2645 >= 0 ;++1 x386 -1 x2646 >= 0 ;++1 x387 -1 x2647 >= 0 ;++1 x388 -1 x2648 >= 0 ;++1 x389 -1 x2649 >= 0 ;++1 x390 -1 x2650 >= 0 ;++1 x391 -1 x2651 >= 0 ;++1 x392 -1 x2652 >= 0 ;++1 x393 -1 x2653 >= 0 ;++1 x394 -1 x2654 >= 0 ;++1 x395 -1 x2655 >= 0 ;++1 x396 -1 x2656 >= 0 ;++1 x397 -1 x2657 >= 0 ;++1 x398 -1 x2658 >= 0 ;++1 x399 -1 x2659 >= 0 ;++1 x400 -1 x2660 >= 0 ;++1 x401 -1 x2661 >= 0 ;++1 x402 -1 x2662 >= 0 ;++1 x403 -1 x2663 >= 0 ;++1 x404 -1 x2664 >= 0 ;++1 x405 -1 x2665 >= 0 ;++1 x406 -1 x2666 >= 0 ;++1 x407 -1 x2667 >= 0 ;++1 x408 -1 x2668 >= 0 ;++1 x409 -1 x2669 >= 0 ;++1 x410 -1 x2670 >= 0 ;++1 x411 -1 x2671 >= 0 ;++1 x412 -1 x2672 >= 0 ;++1 x413 -1 x2673 >= 0 ;++1 x414 -1 x2674 >= 0 ;++1 x415 -1 x2675 >= 0 ;++1 x416 -1 x2676 >= 0 ;++1 x417 -1 x2677 >= 0 ;++1 x418 -1 x2678 >= 0 ;++1 x419 -1 x2679 >= 0 ;++1 x420 -1 x2680 >= 0 ;++1 x421 -1 x2681 >= 0 ;++1 x422 -1 x2682 >= 0 ;++1 x423 -1 x2683 >= 0 ;++1 x424 -1 x2684 >= 0 ;++1 x425 -1 x2685 >= 0 ;++1 x426 -1 x2686 >= 0 ;++1 x427 -1 x2687 >= 0 ;++1 x428 -1 x2688 >= 0 ;++1 x429 -1 x2689 >= 0 ;++1 x430 -1 x2690 >= 0 ;++1 x431 -1 x2691 >= 0 ;++1 x432 -1 x2692 >= 0 ;++1 x433 -1 x2693 >= 0 ;++1 x434 -1 x2694 >= 0 ;++1 x435 -1 x2695 >= 0 ;++1 x436 -1 x2696 >= 0 ;++1 x437 -1 x2697 >= 0 ;++1 x438 -1 x2698 >= 0 ;++1 x439 -1 x2699 >= 0 ;++1 x440 -1 x2700 >= 0 ;++1 x441 -1 x2701 >= 0 ;++1 x442 -1 x2702 >= 0 ;++1 x443 -1 x2703 >= 0 ;++1 x444 -1 x2704 >= 0 ;++1 x445 -1 x2705 >= 0 ;++1 x446 -1 x2706 >= 0 ;++1 x447 -1 x2707 >= 0 ;++1 x448 -1 x2708 >= 0 ;++1 x449 -1 x2709 >= 0 ;++1 x450 -1 x2710 >= 0 ;++1 x451 -1 x2711 >= 0 ;++1 x452 -1 x2712 >= 0 ;++1 x453 -1 x2713 >= 0 ;++1 x454 -1 x2714 >= 0 ;++1 x455 -1 x2715 >= 0 ;++1 x456 -1 x2716 >= 0 ;++1 x457 -1 x2717 >= 0 ;++1 x458 -1 x2718 >= 0 ;++1 x459 -1 x2719 >= 0 ;++1 x460 -1 x2720 >= 0 ;++1 x461 -1 x2721 >= 0 ;++1 x462 -1 x2722 >= 0 ;++1 x463 -1 x2723 >= 0 ;++1 x464 -1 x2724 >= 0 ;++1 x465 -1 x2725 >= 0 ;++1 x466 >= 1 ;+-1 x2641 >= 0 ;++1 x1317 -1 x2642 >= 0 ;++1 x1318 -1 x2643 >= 0 ;++1 x1319 -1 x2644 >= 0 ;++1 x1320 -1 x2645 >= 0 ;++1 x1321 -1 x2646 >= 0 ;++1 x1322 -1 x2647 >= 0 ;++1 x1323 -1 x2648 >= 0 ;++1 x1324 -1 x2649 >= 0 ;++1 x1325 -1 x2650 >= 0 ;++1 x1326 -1 x2651 >= 0 ;++1 x1327 -1 x2652 >= 0 ;++1 x1328 -1 x2653 >= 0 ;++1 x1329 -1 x2654 >= 0 ;++1 x1330 -1 x2655 >= 0 ;++1 x1331 -1 x2656 >= 0 ;++1 x1332 -1 x2657 >= 0 ;++1 x1333 -1 x2658 >= 0 ;++1 x1334 -1 x2659 >= 0 ;++1 x1335 -1 x2660 >= 0 ;++1 x1336 -1 x2661 >= 0 ;++1 x1337 -1 x2662 >= 0 ;++1 x1338 -1 x2663 >= 0 ;++1 x1339 -1 x2664 >= 0 ;++1 x1340 -1 x2665 >= 0 ;++1 x1341 -1 x2666 >= 0 ;++1 x1342 -1 x2667 >= 0 ;++1 x1343 -1 x2668 >= 0 ;++1 x1344 -1 x2669 >= 0 ;++1 x1345 -1 x2670 >= 0 ;++1 x1346 -1 x2671 >= 0 ;++1 x1347 -1 x2672 >= 0 ;++1 x1348 -1 x2673 >= 0 ;++1 x1349 -1 x2674 >= 0 ;++1 x1350 -1 x2675 >= 0 ;++1 x1351 -1 x2676 >= 0 ;++1 x1352 -1 x2677 >= 0 ;++1 x1353 -1 x2678 >= 0 ;++1 x1354 -1 x2679 >= 0 ;++1 x1355 -1 x2680 >= 0 ;++1 x1356 -1 x2681 >= 0 ;++1 x1357 -1 x2682 >= 0 ;++1 x1358 -1 x2683 >= 0 ;++1 x1359 -1 x2684 >= 0 ;++1 x1360 -1 x2685 >= 0 ;++1 x1361 -1 x2686 >= 0 ;++1 x1362 -1 x2687 >= 0 ;++1 x1363 -1 x2688 >= 0 ;++1 x1364 -1 x2689 >= 0 ;++1 x1365 -1 x2690 >= 0 ;++1 x1366 -1 x2691 >= 0 ;++1 x1367 -1 x2692 >= 0 ;++1 x1368 -1 x2693 >= 0 ;++1 x1369 -1 x2694 >= 0 ;++1 x1370 -1 x2695 >= 0 ;++1 x1371 -1 x2696 >= 0 ;++1 x1372 -1 x2697 >= 0 ;++1 x1373 -1 x2698 >= 0 ;++1 x1374 -1 x2699 >= 0 ;++1 x1375 -1 x2700 >= 0 ;++1 x1376 -1 x2701 >= 0 ;++1 x1377 -1 x2702 >= 0 ;++1 x1378 -1 x2703 >= 0 ;++1 x1379 -1 x2704 >= 0 ;++1 x1380 -1 x2705 >= 0 ;++1 x1381 -1 x2706 >= 0 ;++1 x1382 -1 x2707 >= 0 ;++1 x1383 -1 x2708 >= 0 ;++1 x1384 -1 x2709 >= 0 ;++1 x1385 -1 x2710 >= 0 ;++1 x1386 -1 x2711 >= 0 ;++1 x1387 -1 x2712 >= 0 ;++1 x1388 -1 x2713 >= 0 ;++1 x1389 -1 x2714 >= 0 ;++1 x1390 -1 x2715 >= 0 ;++1 x1391 -1 x2716 >= 0 ;++1 x1392 -1 x2717 >= 0 ;++1 x1393 -1 x2718 >= 0 ;++1 x1394 -1 x2719 >= 0 ;++1 x1395 -1 x2720 >= 0 ;++1 x1396 -1 x2721 >= 0 ;++1 x1397 -1 x2722 >= 0 ;++1 x1398 -1 x2723 >= 0 ;++1 x1399 -1 x2724 >= 0 ;++1 x1400 -1 x2725 >= 0 ;++1 x1401 >= 1 ;+-1 x2635 >= 0 ;++1 x1599 -1 x2636 >= 0 ;++1 x1600 -1 x2637 >= 0 ;++1 x1601 -1 x2638 >= 0 ;++1 x1602 -1 x2639 >= 0 ;++1 x1603 -1 x2640 >= 0 ;++1 x1604 -1 x2641 >= 0 ;++1 x1605 -1 x2642 >= 0 ;++1 x1606 -1 x2643 >= 0 ;++1 x1607 -1 x2644 >= 0 ;++1 x1608 -1 x2645 >= 0 ;++1 x1609 -1 x2646 >= 0 ;++1 x1610 -1 x2647 >= 0 ;++1 x1611 -1 x2648 >= 0 ;++1 x1612 -1 x2649 >= 0 ;++1 x1613 -1 x2650 >= 0 ;++1 x1614 -1 x2651 >= 0 ;++1 x1615 -1 x2652 >= 0 ;++1 x1616 -1 x2653 >= 0 ;++1 x1617 -1 x2654 >= 0 ;++1 x1618 -1 x2655 >= 0 ;++1 x1619 -1 x2656 >= 0 ;++1 x1620 -1 x2657 >= 0 ;++1 x1621 -1 x2658 >= 0 ;++1 x1622 -1 x2659 >= 0 ;++1 x1623 -1 x2660 >= 0 ;++1 x1624 -1 x2661 >= 0 ;++1 x1625 -1 x2662 >= 0 ;++1 x1626 -1 x2663 >= 0 ;++1 x1627 -1 x2664 >= 0 ;++1 x1628 -1 x2665 >= 0 ;++1 x1629 -1 x2666 >= 0 ;++1 x1630 -1 x2667 >= 0 ;++1 x1631 -1 x2668 >= 0 ;++1 x1632 -1 x2669 >= 0 ;++1 x1633 -1 x2670 >= 0 ;++1 x1634 -1 x2671 >= 0 ;++1 x1635 -1 x2672 >= 0 ;++1 x1636 -1 x2673 >= 0 ;++1 x1637 -1 x2674 >= 0 ;++1 x1638 -1 x2675 >= 0 ;++1 x1639 -1 x2676 >= 0 ;++1 x1640 -1 x2677 >= 0 ;++1 x1641 -1 x2678 >= 0 ;++1 x1642 -1 x2679 >= 0 ;++1 x1643 -1 x2680 >= 0 ;++1 x1644 -1 x2681 >= 0 ;++1 x1645 -1 x2682 >= 0 ;++1 x1646 -1 x2683 >= 0 ;++1 x1647 -1 x2684 >= 0 ;++1 x1648 -1 x2685 >= 0 ;++1 x1649 -1 x2686 >= 0 ;++1 x1650 -1 x2687 >= 0 ;++1 x1651 -1 x2688 >= 0 ;++1 x1652 -1 x2689 >= 0 ;++1 x1653 -1 x2690 >= 0 ;++1 x1654 -1 x2691 >= 0 ;++1 x1655 -1 x2692 >= 0 ;++1 x1656 -1 x2693 >= 0 ;++1 x1657 -1 x2694 >= 0 ;++1 x1658 -1 x2695 >= 0 ;++1 x1659 -1 x2696 >= 0 ;++1 x1660 -1 x2697 >= 0 ;++1 x1661 -1 x2698 >= 0 ;++1 x1662 -1 x2699 >= 0 ;++1 x1663 -1 x2700 >= 0 ;++1 x1664 -1 x2701 >= 0 ;++1 x1665 -1 x2702 >= 0 ;++1 x1666 -1 x2703 >= 0 ;++1 x1667 -1 x2704 >= 0 ;++1 x1668 -1 x2705 >= 0 ;++1 x1669 -1 x2706 >= 0 ;++1 x1670 -1 x2707 >= 0 ;++1 x1671 -1 x2708 >= 0 ;++1 x1672 -1 x2709 >= 0 ;++1 x1673 -1 x2710 >= 0 ;++1 x1674 -1 x2711 >= 0 ;++1 x1675 -1 x2712 >= 0 ;++1 x1676 -1 x2713 >= 0 ;++1 x1677 -1 x2714 >= 0 ;++1 x1678 -1 x2715 >= 0 ;++1 x1679 -1 x2716 >= 0 ;++1 x1680 -1 x2717 >= 0 ;++1 x1681 -1 x2718 >= 0 ;++1 x1682 -1 x2719 >= 0 ;++1 x1683 -1 x2720 >= 0 ;++1 x1684 -1 x2721 >= 0 ;++1 x1685 -1 x2722 >= 0 ;++1 x1686 -1 x2723 >= 0 ;++1 x1687 -1 x2724 >= 0 ;++1 x1688 -1 x2725 >= 0 ;++1 x1689 >= 1 ;+-1 x2734 >= 0 ;++1 x941 -1 x2735 >= 0 ;++1 x942 -1 x2736 >= 0 ;++1 x943 -1 x2737 >= 0 ;++1 x944 -1 x2738 >= 0 ;++1 x945 -1 x2739 >= 0 ;++1 x946 -1 x2740 >= 0 ;++1 x947 -1 x2741 >= 0 ;++1 x948 -1 x2742 >= 0 ;++1 x949 -1 x2743 >= 0 ;++1 x950 -1 x2744 >= 0 ;++1 x951 -1 x2745 >= 0 ;++1 x952 -1 x2746 >= 0 ;++1 x953 -1 x2747 >= 0 ;++1 x954 -1 x2748 >= 0 ;++1 x955 -1 x2749 >= 0 ;++1 x956 -1 x2750 >= 0 ;++1 x957 -1 x2751 >= 0 ;++1 x958 -1 x2752 >= 0 ;++1 x959 -1 x2753 >= 0 ;++1 x960 -1 x2754 >= 0 ;++1 x961 -1 x2755 >= 0 ;++1 x962 -1 x2756 >= 0 ;++1 x963 -1 x2757 >= 0 ;++1 x964 -1 x2758 >= 0 ;++1 x965 -1 x2759 >= 0 ;++1 x966 -1 x2760 >= 0 ;++1 x967 -1 x2761 >= 0 ;++1 x968 -1 x2762 >= 0 ;++1 x969 -1 x2763 >= 0 ;++1 x970 -1 x2764 >= 0 ;++1 x971 -1 x2765 >= 0 ;++1 x972 -1 x2766 >= 0 ;++1 x973 -1 x2767 >= 0 ;++1 x974 -1 x2768 >= 0 ;++1 x975 -1 x2769 >= 0 ;++1 x976 -1 x2770 >= 0 ;++1 x977 -1 x2771 >= 0 ;++1 x978 -1 x2772 >= 0 ;++1 x979 -1 x2773 >= 0 ;++1 x980 -1 x2774 >= 0 ;++1 x981 -1 x2775 >= 0 ;++1 x982 -1 x2776 >= 0 ;++1 x983 -1 x2777 >= 0 ;++1 x984 -1 x2778 >= 0 ;++1 x985 -1 x2779 >= 0 ;++1 x986 -1 x2780 >= 0 ;++1 x987 -1 x2781 >= 0 ;++1 x988 -1 x2782 >= 0 ;++1 x989 -1 x2783 >= 0 ;++1 x990 -1 x2784 >= 0 ;++1 x991 -1 x2785 >= 0 ;++1 x992 -1 x2786 >= 0 ;++1 x993 -1 x2787 >= 0 ;++1 x994 -1 x2788 >= 0 ;++1 x995 -1 x2789 >= 0 ;++1 x996 -1 x2790 >= 0 ;++1 x997 -1 x2791 >= 0 ;++1 x998 -1 x2792 >= 0 ;++1 x999 -1 x2793 >= 0 ;++1 x1000 -1 x2794 >= 0 ;++1 x1001 -1 x2795 >= 0 ;++1 x1002 -1 x2796 >= 0 ;++1 x1003 -1 x2797 >= 0 ;++1 x1004 -1 x2798 >= 0 ;++1 x1005 -1 x2799 >= 0 ;++1 x1006 -1 x2800 >= 0 ;++1 x1007 -1 x2801 >= 0 ;++1 x1008 -1 x2802 >= 0 ;++1 x1009 -1 x2803 >= 0 ;++1 x1010 -1 x2804 >= 0 ;++1 x1011 -1 x2805 >= 0 ;++1 x1012 -1 x2806 >= 0 ;++1 x1013 -1 x2807 >= 0 ;++1 x1014 -1 x2808 >= 0 ;++1 x1015 -1 x2809 >= 0 ;++1 x1016 -1 x2810 >= 0 ;++1 x1017 -1 x2811 >= 0 ;++1 x1018 -1 x2812 >= 0 ;++1 x1019 -1 x2813 >= 0 ;++1 x1020 -1 x2814 >= 0 ;++1 x1021 -1 x2815 >= 0 ;++1 x1022 -1 x2816 >= 0 ;++1 x1023 -1 x2817 >= 0 ;++1 x1024 -1 x2818 >= 0 ;++1 x1025 -1 x2819 >= 0 ;++1 x1026 >= 1 ;+-1 x2730 >= 0 ;++1 x1881 -1 x2731 >= 0 ;++1 x1882 -1 x2732 >= 0 ;++1 x1883 -1 x2733 >= 0 ;++1 x1884 -1 x2734 >= 0 ;++1 x1885 -1 x2735 >= 0 ;++1 x1886 -1 x2736 >= 0 ;++1 x1887 -1 x2737 >= 0 ;++1 x1888 -1 x2738 >= 0 ;++1 x1889 -1 x2739 >= 0 ;++1 x1890 -1 x2740 >= 0 ;++1 x1891 -1 x2741 >= 0 ;++1 x1892 -1 x2742 >= 0 ;++1 x1893 -1 x2743 >= 0 ;++1 x1894 -1 x2744 >= 0 ;++1 x1895 -1 x2745 >= 0 ;++1 x1896 -1 x2746 >= 0 ;++1 x1897 -1 x2747 >= 0 ;++1 x1898 -1 x2748 >= 0 ;++1 x1899 -1 x2749 >= 0 ;++1 x1900 -1 x2750 >= 0 ;++1 x1901 -1 x2751 >= 0 ;++1 x1902 -1 x2752 >= 0 ;++1 x1903 -1 x2753 >= 0 ;++1 x1904 -1 x2754 >= 0 ;++1 x1905 -1 x2755 >= 0 ;++1 x1906 -1 x2756 >= 0 ;++1 x1907 -1 x2757 >= 0 ;++1 x1908 -1 x2758 >= 0 ;++1 x1909 -1 x2759 >= 0 ;++1 x1910 -1 x2760 >= 0 ;++1 x1911 -1 x2761 >= 0 ;++1 x1912 -1 x2762 >= 0 ;++1 x1913 -1 x2763 >= 0 ;++1 x1914 -1 x2764 >= 0 ;++1 x1915 -1 x2765 >= 0 ;++1 x1916 -1 x2766 >= 0 ;++1 x1917 -1 x2767 >= 0 ;++1 x1918 -1 x2768 >= 0 ;++1 x1919 -1 x2769 >= 0 ;++1 x1920 -1 x2770 >= 0 ;++1 x1921 -1 x2771 >= 0 ;++1 x1922 -1 x2772 >= 0 ;++1 x1923 -1 x2773 >= 0 ;++1 x1924 -1 x2774 >= 0 ;++1 x1925 -1 x2775 >= 0 ;++1 x1926 -1 x2776 >= 0 ;++1 x1927 -1 x2777 >= 0 ;++1 x1928 -1 x2778 >= 0 ;++1 x1929 -1 x2779 >= 0 ;++1 x1930 -1 x2780 >= 0 ;++1 x1931 -1 x2781 >= 0 ;++1 x1932 -1 x2782 >= 0 ;++1 x1933 -1 x2783 >= 0 ;++1 x1934 -1 x2784 >= 0 ;++1 x1935 -1 x2785 >= 0 ;++1 x1936 -1 x2786 >= 0 ;++1 x1937 -1 x2787 >= 0 ;++1 x1938 -1 x2788 >= 0 ;++1 x1939 -1 x2789 >= 0 ;++1 x1940 -1 x2790 >= 0 ;++1 x1941 -1 x2791 >= 0 ;++1 x1942 -1 x2792 >= 0 ;++1 x1943 -1 x2793 >= 0 ;++1 x1944 -1 x2794 >= 0 ;++1 x1945 -1 x2795 >= 0 ;++1 x1946 -1 x2796 >= 0 ;++1 x1947 -1 x2797 >= 0 ;++1 x1948 -1 x2798 >= 0 ;++1 x1949 -1 x2799 >= 0 ;++1 x1950 -1 x2800 >= 0 ;++1 x1951 -1 x2801 >= 0 ;++1 x1952 -1 x2802 >= 0 ;++1 x1953 -1 x2803 >= 0 ;++1 x1954 -1 x2804 >= 0 ;++1 x1955 -1 x2805 >= 0 ;++1 x1956 -1 x2806 >= 0 ;++1 x1957 -1 x2807 >= 0 ;++1 x1958 -1 x2808 >= 0 ;++1 x1959 -1 x2809 >= 0 ;++1 x1960 -1 x2810 >= 0 ;++1 x1961 -1 x2811 >= 0 ;++1 x1962 -1 x2812 >= 0 ;++1 x1963 -1 x2813 >= 0 ;++1 x1964 -1 x2814 >= 0 ;++1 x1965 -1 x2815 >= 0 ;++1 x1966 -1 x2816 >= 0 ;++1 x1967 -1 x2817 >= 0 ;++1 x1968 -1 x2818 >= 0 ;++1 x1969 -1 x2819 >= 0 ;++1 x1970 >= 1 ;+-1 x2730 >= 0 ;++1 x2351 -1 x2731 >= 0 ;++1 x2352 -1 x2732 >= 0 ;++1 x2353 -1 x2733 >= 0 ;++1 x2354 -1 x2734 >= 0 ;++1 x2355 -1 x2735 >= 0 ;++1 x2356 -1 x2736 >= 0 ;++1 x2357 -1 x2737 >= 0 ;++1 x2358 -1 x2738 >= 0 ;++1 x2359 -1 x2739 >= 0 ;++1 x2360 -1 x2740 >= 0 ;++1 x2361 -1 x2741 >= 0 ;++1 x2362 -1 x2742 >= 0 ;++1 x2363 -1 x2743 >= 0 ;++1 x2364 -1 x2744 >= 0 ;++1 x2365 -1 x2745 >= 0 ;++1 x2366 -1 x2746 >= 0 ;++1 x2367 -1 x2747 >= 0 ;++1 x2368 -1 x2748 >= 0 ;++1 x2369 -1 x2749 >= 0 ;++1 x2370 -1 x2750 >= 0 ;++1 x2371 -1 x2751 >= 0 ;++1 x2372 -1 x2752 >= 0 ;++1 x2373 -1 x2753 >= 0 ;++1 x2374 -1 x2754 >= 0 ;++1 x2375 -1 x2755 >= 0 ;++1 x2376 -1 x2756 >= 0 ;++1 x2377 -1 x2757 >= 0 ;++1 x2378 -1 x2758 >= 0 ;++1 x2379 -1 x2759 >= 0 ;++1 x2380 -1 x2760 >= 0 ;++1 x2381 -1 x2761 >= 0 ;++1 x2382 -1 x2762 >= 0 ;++1 x2383 -1 x2763 >= 0 ;++1 x2384 -1 x2764 >= 0 ;++1 x2385 -1 x2765 >= 0 ;++1 x2386 -1 x2766 >= 0 ;++1 x2387 -1 x2767 >= 0 ;++1 x2388 -1 x2768 >= 0 ;++1 x2389 -1 x2769 >= 0 ;++1 x2390 -1 x2770 >= 0 ;++1 x2391 -1 x2771 >= 0 ;++1 x2392 -1 x2772 >= 0 ;++1 x2393 -1 x2773 >= 0 ;++1 x2394 -1 x2774 >= 0 ;++1 x2395 -1 x2775 >= 0 ;++1 x2396 -1 x2776 >= 0 ;++1 x2397 -1 x2777 >= 0 ;++1 x2398 -1 x2778 >= 0 ;++1 x2399 -1 x2779 >= 0 ;++1 x2400 -1 x2780 >= 0 ;++1 x2401 -1 x2781 >= 0 ;++1 x2402 -1 x2782 >= 0 ;++1 x2403 -1 x2783 >= 0 ;++1 x2404 -1 x2784 >= 0 ;++1 x2405 -1 x2785 >= 0 ;++1 x2406 -1 x2786 >= 0 ;++1 x2407 -1 x2787 >= 0 ;++1 x2408 -1 x2788 >= 0 ;++1 x2409 -1 x2789 >= 0 ;++1 x2410 -1 x2790 >= 0 ;++1 x2411 -1 x2791 >= 0 ;++1 x2412 -1 x2792 >= 0 ;++1 x2413 -1 x2793 >= 0 ;++1 x2414 -1 x2794 >= 0 ;++1 x2415 -1 x2795 >= 0 ;++1 x2416 -1 x2796 >= 0 ;++1 x2417 -1 x2797 >= 0 ;++1 x2418 -1 x2798 >= 0 ;++1 x2419 -1 x2799 >= 0 ;++1 x2420 -1 x2800 >= 0 ;++1 x2421 -1 x2801 >= 0 ;++1 x2422 -1 x2802 >= 0 ;++1 x2423 -1 x2803 >= 0 ;++1 x2424 -1 x2804 >= 0 ;++1 x2425 -1 x2805 >= 0 ;++1 x2426 -1 x2806 >= 0 ;++1 x2427 -1 x2807 >= 0 ;++1 x2428 -1 x2808 >= 0 ;++1 x2429 -1 x2809 >= 0 ;++1 x2430 -1 x2810 >= 0 ;++1 x2431 -1 x2811 >= 0 ;++1 x2432 -1 x2812 >= 0 ;++1 x2433 -1 x2813 >= 0 ;++1 x2434 -1 x2814 >= 0 ;++1 x2435 -1 x2815 >= 0 ;++1 x2436 -1 x2816 >= 0 ;++1 x2437 -1 x2817 >= 0 ;++1 x2438 -1 x2818 >= 0 ;++1 x2439 -1 x2819 >= 0 ;++1 x2440 >= 1 ;+-1 x2829 >= 0 ;++1 x1 -1 x2830 >= 0 ;++1 x2 -1 x2831 >= 0 ;++1 x3 -1 x2832 >= 0 ;++1 x4 -1 x2833 >= 0 ;++1 x5 -1 x2834 >= 0 ;++1 x6 -1 x2835 >= 0 ;++1 x7 -1 x2836 >= 0 ;++1 x8 -1 x2837 >= 0 ;++1 x9 -1 x2838 >= 0 ;++1 x10 -1 x2839 >= 0 ;++1 x11 -1 x2840 >= 0 ;++1 x12 -1 x2841 >= 0 ;++1 x13 -1 x2842 >= 0 ;++1 x14 -1 x2843 >= 0 ;++1 x15 -1 x2844 >= 0 ;++1 x16 -1 x2845 >= 0 ;++1 x17 -1 x2846 >= 0 ;++1 x18 -1 x2847 >= 0 ;++1 x19 -1 x2848 >= 0 ;++1 x20 -1 x2849 >= 0 ;++1 x21 -1 x2850 >= 0 ;++1 x22 -1 x2851 >= 0 ;++1 x23 -1 x2852 >= 0 ;++1 x24 -1 x2853 >= 0 ;++1 x25 -1 x2854 >= 0 ;++1 x26 -1 x2855 >= 0 ;++1 x27 -1 x2856 >= 0 ;++1 x28 -1 x2857 >= 0 ;++1 x29 -1 x2858 >= 0 ;++1 x30 -1 x2859 >= 0 ;++1 x31 -1 x2860 >= 0 ;++1 x32 -1 x2861 >= 0 ;++1 x33 -1 x2862 >= 0 ;++1 x34 -1 x2863 >= 0 ;++1 x35 -1 x2864 >= 0 ;++1 x36 -1 x2865 >= 0 ;++1 x37 -1 x2866 >= 0 ;++1 x38 -1 x2867 >= 0 ;++1 x39 -1 x2868 >= 0 ;++1 x40 -1 x2869 >= 0 ;++1 x41 -1 x2870 >= 0 ;++1 x42 -1 x2871 >= 0 ;++1 x43 -1 x2872 >= 0 ;++1 x44 -1 x2873 >= 0 ;++1 x45 -1 x2874 >= 0 ;++1 x46 -1 x2875 >= 0 ;++1 x47 -1 x2876 >= 0 ;++1 x48 -1 x2877 >= 0 ;++1 x49 -1 x2878 >= 0 ;++1 x50 -1 x2879 >= 0 ;++1 x51 -1 x2880 >= 0 ;++1 x52 -1 x2881 >= 0 ;++1 x53 -1 x2882 >= 0 ;++1 x54 -1 x2883 >= 0 ;++1 x55 -1 x2884 >= 0 ;++1 x56 -1 x2885 >= 0 ;++1 x57 -1 x2886 >= 0 ;++1 x58 -1 x2887 >= 0 ;++1 x59 -1 x2888 >= 0 ;++1 x60 -1 x2889 >= 0 ;++1 x61 -1 x2890 >= 0 ;++1 x62 -1 x2891 >= 0 ;++1 x63 -1 x2892 >= 0 ;++1 x64 -1 x2893 >= 0 ;++1 x65 -1 x2894 >= 0 ;++1 x66 -1 x2895 >= 0 ;++1 x67 -1 x2896 >= 0 ;++1 x68 -1 x2897 >= 0 ;++1 x69 -1 x2898 >= 0 ;++1 x70 -1 x2899 >= 0 ;++1 x71 -1 x2900 >= 0 ;++1 x72 -1 x2901 >= 0 ;++1 x73 -1 x2902 >= 0 ;++1 x74 -1 x2903 >= 0 ;++1 x75 -1 x2904 >= 0 ;++1 x76 -1 x2905 >= 0 ;++1 x77 -1 x2906 >= 0 ;++1 x78 -1 x2907 >= 0 ;++1 x79 -1 x2908 >= 0 ;++1 x80 -1 x2909 >= 0 ;++1 x81 -1 x2910 >= 0 ;++1 x82 -1 x2911 >= 0 ;++1 x83 -1 x2912 >= 0 ;++1 x84 -1 x2913 >= 0 ;++1 x85 >= 1 ;+-1 x2827 >= 0 ;++1 x95 -1 x2828 >= 0 ;++1 x96 -1 x2829 >= 0 ;++1 x97 -1 x2830 >= 0 ;++1 x98 -1 x2831 >= 0 ;++1 x99 -1 x2832 >= 0 ;++1 x100 -1 x2833 >= 0 ;++1 x101 -1 x2834 >= 0 ;++1 x102 -1 x2835 >= 0 ;++1 x103 -1 x2836 >= 0 ;++1 x104 -1 x2837 >= 0 ;++1 x105 -1 x2838 >= 0 ;++1 x106 -1 x2839 >= 0 ;++1 x107 -1 x2840 >= 0 ;++1 x108 -1 x2841 >= 0 ;++1 x109 -1 x2842 >= 0 ;++1 x110 -1 x2843 >= 0 ;++1 x111 -1 x2844 >= 0 ;++1 x112 -1 x2845 >= 0 ;++1 x113 -1 x2846 >= 0 ;++1 x114 -1 x2847 >= 0 ;++1 x115 -1 x2848 >= 0 ;++1 x116 -1 x2849 >= 0 ;++1 x117 -1 x2850 >= 0 ;++1 x118 -1 x2851 >= 0 ;++1 x119 -1 x2852 >= 0 ;++1 x120 -1 x2853 >= 0 ;++1 x121 -1 x2854 >= 0 ;++1 x122 -1 x2855 >= 0 ;++1 x123 -1 x2856 >= 0 ;++1 x124 -1 x2857 >= 0 ;++1 x125 -1 x2858 >= 0 ;++1 x126 -1 x2859 >= 0 ;++1 x127 -1 x2860 >= 0 ;++1 x128 -1 x2861 >= 0 ;++1 x129 -1 x2862 >= 0 ;++1 x130 -1 x2863 >= 0 ;++1 x131 -1 x2864 >= 0 ;++1 x132 -1 x2865 >= 0 ;++1 x133 -1 x2866 >= 0 ;++1 x134 -1 x2867 >= 0 ;++1 x135 -1 x2868 >= 0 ;++1 x136 -1 x2869 >= 0 ;++1 x137 -1 x2870 >= 0 ;++1 x138 -1 x2871 >= 0 ;++1 x139 -1 x2872 >= 0 ;++1 x140 -1 x2873 >= 0 ;++1 x141 -1 x2874 >= 0 ;++1 x142 -1 x2875 >= 0 ;++1 x143 -1 x2876 >= 0 ;++1 x144 -1 x2877 >= 0 ;++1 x145 -1 x2878 >= 0 ;++1 x146 -1 x2879 >= 0 ;++1 x147 -1 x2880 >= 0 ;++1 x148 -1 x2881 >= 0 ;++1 x149 -1 x2882 >= 0 ;++1 x150 -1 x2883 >= 0 ;++1 x151 -1 x2884 >= 0 ;++1 x152 -1 x2885 >= 0 ;++1 x153 -1 x2886 >= 0 ;++1 x154 -1 x2887 >= 0 ;++1 x155 -1 x2888 >= 0 ;++1 x156 -1 x2889 >= 0 ;++1 x157 -1 x2890 >= 0 ;++1 x158 -1 x2891 >= 0 ;++1 x159 -1 x2892 >= 0 ;++1 x160 -1 x2893 >= 0 ;++1 x161 -1 x2894 >= 0 ;++1 x162 -1 x2895 >= 0 ;++1 x163 -1 x2896 >= 0 ;++1 x164 -1 x2897 >= 0 ;++1 x165 -1 x2898 >= 0 ;++1 x166 -1 x2899 >= 0 ;++1 x167 -1 x2900 >= 0 ;++1 x168 -1 x2901 >= 0 ;++1 x169 -1 x2902 >= 0 ;++1 x170 -1 x2903 >= 0 ;++1 x171 -1 x2904 >= 0 ;++1 x172 -1 x2905 >= 0 ;++1 x173 -1 x2906 >= 0 ;++1 x174 -1 x2907 >= 0 ;++1 x175 -1 x2908 >= 0 ;++1 x176 -1 x2909 >= 0 ;++1 x177 -1 x2910 >= 0 ;++1 x178 -1 x2911 >= 0 ;++1 x179 -1 x2912 >= 0 ;++1 x180 -1 x2913 >= 0 ;++1 x181 >= 1 ;+-1 x2829 >= 0 ;++1 x189 -1 x2830 >= 0 ;++1 x190 -1 x2831 >= 0 ;++1 x191 -1 x2832 >= 0 ;++1 x192 -1 x2833 >= 0 ;++1 x193 -1 x2834 >= 0 ;++1 x194 -1 x2835 >= 0 ;++1 x195 -1 x2836 >= 0 ;++1 x196 -1 x2837 >= 0 ;++1 x197 -1 x2838 >= 0 ;++1 x198 -1 x2839 >= 0 ;++1 x199 -1 x2840 >= 0 ;++1 x200 -1 x2841 >= 0 ;++1 x201 -1 x2842 >= 0 ;++1 x202 -1 x2843 >= 0 ;++1 x203 -1 x2844 >= 0 ;++1 x204 -1 x2845 >= 0 ;++1 x205 -1 x2846 >= 0 ;++1 x206 -1 x2847 >= 0 ;++1 x207 -1 x2848 >= 0 ;++1 x208 -1 x2849 >= 0 ;++1 x209 -1 x2850 >= 0 ;++1 x210 -1 x2851 >= 0 ;++1 x211 -1 x2852 >= 0 ;++1 x212 -1 x2853 >= 0 ;++1 x213 -1 x2854 >= 0 ;++1 x214 -1 x2855 >= 0 ;++1 x215 -1 x2856 >= 0 ;++1 x216 -1 x2857 >= 0 ;++1 x217 -1 x2858 >= 0 ;++1 x218 -1 x2859 >= 0 ;++1 x219 -1 x2860 >= 0 ;++1 x220 -1 x2861 >= 0 ;++1 x221 -1 x2862 >= 0 ;++1 x222 -1 x2863 >= 0 ;++1 x223 -1 x2864 >= 0 ;++1 x224 -1 x2865 >= 0 ;++1 x225 -1 x2866 >= 0 ;++1 x226 -1 x2867 >= 0 ;++1 x227 -1 x2868 >= 0 ;++1 x228 -1 x2869 >= 0 ;++1 x229 -1 x2870 >= 0 ;++1 x230 -1 x2871 >= 0 ;++1 x231 -1 x2872 >= 0 ;++1 x232 -1 x2873 >= 0 ;++1 x233 -1 x2874 >= 0 ;++1 x234 -1 x2875 >= 0 ;++1 x235 -1 x2876 >= 0 ;++1 x236 -1 x2877 >= 0 ;++1 x237 -1 x2878 >= 0 ;++1 x238 -1 x2879 >= 0 ;++1 x239 -1 x2880 >= 0 ;++1 x240 -1 x2881 >= 0 ;++1 x241 -1 x2882 >= 0 ;++1 x242 -1 x2883 >= 0 ;++1 x243 -1 x2884 >= 0 ;++1 x244 -1 x2885 >= 0 ;++1 x245 -1 x2886 >= 0 ;++1 x246 -1 x2887 >= 0 ;++1 x247 -1 x2888 >= 0 ;++1 x248 -1 x2889 >= 0 ;++1 x249 -1 x2890 >= 0 ;++1 x250 -1 x2891 >= 0 ;++1 x251 -1 x2892 >= 0 ;++1 x252 -1 x2893 >= 0 ;++1 x253 -1 x2894 >= 0 ;++1 x254 -1 x2895 >= 0 ;++1 x255 -1 x2896 >= 0 ;++1 x256 -1 x2897 >= 0 ;++1 x257 -1 x2898 >= 0 ;++1 x258 -1 x2899 >= 0 ;++1 x259 -1 x2900 >= 0 ;++1 x260 -1 x2901 >= 0 ;++1 x261 -1 x2902 >= 0 ;++1 x262 -1 x2903 >= 0 ;++1 x263 -1 x2904 >= 0 ;++1 x264 -1 x2905 >= 0 ;++1 x265 -1 x2906 >= 0 ;++1 x266 -1 x2907 >= 0 ;++1 x267 -1 x2908 >= 0 ;++1 x268 -1 x2909 >= 0 ;++1 x269 -1 x2910 >= 0 ;++1 x270 -1 x2911 >= 0 ;++1 x271 -1 x2912 >= 0 ;++1 x272 -1 x2913 >= 0 ;++1 x273 >= 1 ;+-1 x2823 >= 0 ;++1 x283 -1 x2824 >= 0 ;++1 x284 -1 x2825 >= 0 ;++1 x285 -1 x2826 >= 0 ;++1 x286 -1 x2827 >= 0 ;++1 x287 -1 x2828 >= 0 ;++1 x288 -1 x2829 >= 0 ;++1 x289 -1 x2830 >= 0 ;++1 x290 -1 x2831 >= 0 ;++1 x291 -1 x2832 >= 0 ;++1 x292 -1 x2833 >= 0 ;++1 x293 -1 x2834 >= 0 ;++1 x294 -1 x2835 >= 0 ;++1 x295 -1 x2836 >= 0 ;++1 x296 -1 x2837 >= 0 ;++1 x297 -1 x2838 >= 0 ;++1 x298 -1 x2839 >= 0 ;++1 x299 -1 x2840 >= 0 ;++1 x300 -1 x2841 >= 0 ;++1 x301 -1 x2842 >= 0 ;++1 x302 -1 x2843 >= 0 ;++1 x303 -1 x2844 >= 0 ;++1 x304 -1 x2845 >= 0 ;++1 x305 -1 x2846 >= 0 ;++1 x306 -1 x2847 >= 0 ;++1 x307 -1 x2848 >= 0 ;++1 x308 -1 x2849 >= 0 ;++1 x309 -1 x2850 >= 0 ;++1 x310 -1 x2851 >= 0 ;++1 x311 -1 x2852 >= 0 ;++1 x312 -1 x2853 >= 0 ;++1 x313 -1 x2854 >= 0 ;++1 x314 -1 x2855 >= 0 ;++1 x315 -1 x2856 >= 0 ;++1 x316 -1 x2857 >= 0 ;++1 x317 -1 x2858 >= 0 ;++1 x318 -1 x2859 >= 0 ;++1 x319 -1 x2860 >= 0 ;++1 x320 -1 x2861 >= 0 ;++1 x321 -1 x2862 >= 0 ;++1 x322 -1 x2863 >= 0 ;++1 x323 -1 x2864 >= 0 ;++1 x324 -1 x2865 >= 0 ;++1 x325 -1 x2866 >= 0 ;++1 x326 -1 x2867 >= 0 ;++1 x327 -1 x2868 >= 0 ;++1 x328 -1 x2869 >= 0 ;++1 x329 -1 x2870 >= 0 ;++1 x330 -1 x2871 >= 0 ;++1 x331 -1 x2872 >= 0 ;++1 x332 -1 x2873 >= 0 ;++1 x333 -1 x2874 >= 0 ;++1 x334 -1 x2875 >= 0 ;++1 x335 -1 x2876 >= 0 ;++1 x336 -1 x2877 >= 0 ;++1 x337 -1 x2878 >= 0 ;++1 x338 -1 x2879 >= 0 ;++1 x339 -1 x2880 >= 0 ;++1 x340 -1 x2881 >= 0 ;++1 x341 -1 x2882 >= 0 ;++1 x342 -1 x2883 >= 0 ;++1 x343 -1 x2884 >= 0 ;++1 x344 -1 x2885 >= 0 ;++1 x345 -1 x2886 >= 0 ;++1 x346 -1 x2887 >= 0 ;++1 x347 -1 x2888 >= 0 ;++1 x348 -1 x2889 >= 0 ;++1 x349 -1 x2890 >= 0 ;++1 x350 -1 x2891 >= 0 ;++1 x351 -1 x2892 >= 0 ;++1 x352 -1 x2893 >= 0 ;++1 x353 -1 x2894 >= 0 ;++1 x354 -1 x2895 >= 0 ;++1 x355 -1 x2896 >= 0 ;++1 x356 -1 x2897 >= 0 ;++1 x357 -1 x2898 >= 0 ;++1 x358 -1 x2899 >= 0 ;++1 x359 -1 x2900 >= 0 ;++1 x360 -1 x2901 >= 0 ;++1 x361 -1 x2902 >= 0 ;++1 x362 -1 x2903 >= 0 ;++1 x363 -1 x2904 >= 0 ;++1 x364 -1 x2905 >= 0 ;++1 x365 -1 x2906 >= 0 ;++1 x366 -1 x2907 >= 0 ;++1 x367 -1 x2908 >= 0 ;++1 x368 -1 x2909 >= 0 ;++1 x369 -1 x2910 >= 0 ;++1 x370 -1 x2911 >= 0 ;++1 x371 -1 x2912 >= 0 ;++1 x372 -1 x2913 >= 0 ;++1 x373 >= 1 ;+-1 x2824 >= 0 ;++1 x377 -1 x2825 >= 0 ;++1 x378 -1 x2826 >= 0 ;++1 x379 -1 x2827 >= 0 ;++1 x380 -1 x2828 >= 0 ;++1 x381 -1 x2829 >= 0 ;++1 x382 -1 x2830 >= 0 ;++1 x383 -1 x2831 >= 0 ;++1 x384 -1 x2832 >= 0 ;++1 x385 -1 x2833 >= 0 ;++1 x386 -1 x2834 >= 0 ;++1 x387 -1 x2835 >= 0 ;++1 x388 -1 x2836 >= 0 ;++1 x389 -1 x2837 >= 0 ;++1 x390 -1 x2838 >= 0 ;++1 x391 -1 x2839 >= 0 ;++1 x392 -1 x2840 >= 0 ;++1 x393 -1 x2841 >= 0 ;++1 x394 -1 x2842 >= 0 ;++1 x395 -1 x2843 >= 0 ;++1 x396 -1 x2844 >= 0 ;++1 x397 -1 x2845 >= 0 ;++1 x398 -1 x2846 >= 0 ;++1 x399 -1 x2847 >= 0 ;++1 x400 -1 x2848 >= 0 ;++1 x401 -1 x2849 >= 0 ;++1 x402 -1 x2850 >= 0 ;++1 x403 -1 x2851 >= 0 ;++1 x404 -1 x2852 >= 0 ;++1 x405 -1 x2853 >= 0 ;++1 x406 -1 x2854 >= 0 ;++1 x407 -1 x2855 >= 0 ;++1 x408 -1 x2856 >= 0 ;++1 x409 -1 x2857 >= 0 ;++1 x410 -1 x2858 >= 0 ;++1 x411 -1 x2859 >= 0 ;++1 x412 -1 x2860 >= 0 ;++1 x413 -1 x2861 >= 0 ;++1 x414 -1 x2862 >= 0 ;++1 x415 -1 x2863 >= 0 ;++1 x416 -1 x2864 >= 0 ;++1 x417 -1 x2865 >= 0 ;++1 x418 -1 x2866 >= 0 ;++1 x419 -1 x2867 >= 0 ;++1 x420 -1 x2868 >= 0 ;++1 x421 -1 x2869 >= 0 ;++1 x422 -1 x2870 >= 0 ;++1 x423 -1 x2871 >= 0 ;++1 x424 -1 x2872 >= 0 ;++1 x425 -1 x2873 >= 0 ;++1 x426 -1 x2874 >= 0 ;++1 x427 -1 x2875 >= 0 ;++1 x428 -1 x2876 >= 0 ;++1 x429 -1 x2877 >= 0 ;++1 x430 -1 x2878 >= 0 ;++1 x431 -1 x2879 >= 0 ;++1 x432 -1 x2880 >= 0 ;++1 x433 -1 x2881 >= 0 ;++1 x434 -1 x2882 >= 0 ;++1 x435 -1 x2883 >= 0 ;++1 x436 -1 x2884 >= 0 ;++1 x437 -1 x2885 >= 0 ;++1 x438 -1 x2886 >= 0 ;++1 x439 -1 x2887 >= 0 ;++1 x440 -1 x2888 >= 0 ;++1 x441 -1 x2889 >= 0 ;++1 x442 -1 x2890 >= 0 ;++1 x443 -1 x2891 >= 0 ;++1 x444 -1 x2892 >= 0 ;++1 x445 -1 x2893 >= 0 ;++1 x446 -1 x2894 >= 0 ;++1 x447 -1 x2895 >= 0 ;++1 x448 -1 x2896 >= 0 ;++1 x449 -1 x2897 >= 0 ;++1 x450 -1 x2898 >= 0 ;++1 x451 -1 x2899 >= 0 ;++1 x452 -1 x2900 >= 0 ;++1 x453 -1 x2901 >= 0 ;++1 x454 -1 x2902 >= 0 ;++1 x455 -1 x2903 >= 0 ;++1 x456 -1 x2904 >= 0 ;++1 x457 -1 x2905 >= 0 ;++1 x458 -1 x2906 >= 0 ;++1 x459 -1 x2907 >= 0 ;++1 x460 -1 x2908 >= 0 ;++1 x461 -1 x2909 >= 0 ;++1 x462 -1 x2910 >= 0 ;++1 x463 -1 x2911 >= 0 ;++1 x464 -1 x2912 >= 0 ;++1 x465 -1 x2913 >= 0 ;++1 x466 >= 1 ;+-1 x2829 >= 0 ;++1 x471 -1 x2830 >= 0 ;++1 x472 -1 x2831 >= 0 ;++1 x473 -1 x2832 >= 0 ;++1 x474 -1 x2833 >= 0 ;++1 x475 -1 x2834 >= 0 ;++1 x476 -1 x2835 >= 0 ;++1 x477 -1 x2836 >= 0 ;++1 x478 -1 x2837 >= 0 ;++1 x479 -1 x2838 >= 0 ;++1 x480 -1 x2839 >= 0 ;++1 x481 -1 x2840 >= 0 ;++1 x482 -1 x2841 >= 0 ;++1 x483 -1 x2842 >= 0 ;++1 x484 -1 x2843 >= 0 ;++1 x485 -1 x2844 >= 0 ;++1 x486 -1 x2845 >= 0 ;++1 x487 -1 x2846 >= 0 ;++1 x488 -1 x2847 >= 0 ;++1 x489 -1 x2848 >= 0 ;++1 x490 -1 x2849 >= 0 ;++1 x491 -1 x2850 >= 0 ;++1 x492 -1 x2851 >= 0 ;++1 x493 -1 x2852 >= 0 ;++1 x494 -1 x2853 >= 0 ;++1 x495 -1 x2854 >= 0 ;++1 x496 -1 x2855 >= 0 ;++1 x497 -1 x2856 >= 0 ;++1 x498 -1 x2857 >= 0 ;++1 x499 -1 x2858 >= 0 ;++1 x500 -1 x2859 >= 0 ;++1 x501 -1 x2860 >= 0 ;++1 x502 -1 x2861 >= 0 ;++1 x503 -1 x2862 >= 0 ;++1 x504 -1 x2863 >= 0 ;++1 x505 -1 x2864 >= 0 ;++1 x506 -1 x2865 >= 0 ;++1 x507 -1 x2866 >= 0 ;++1 x508 -1 x2867 >= 0 ;++1 x509 -1 x2868 >= 0 ;++1 x510 -1 x2869 >= 0 ;++1 x511 -1 x2870 >= 0 ;++1 x512 -1 x2871 >= 0 ;++1 x513 -1 x2872 >= 0 ;++1 x514 -1 x2873 >= 0 ;++1 x515 -1 x2874 >= 0 ;++1 x516 -1 x2875 >= 0 ;++1 x517 -1 x2876 >= 0 ;++1 x518 -1 x2877 >= 0 ;++1 x519 -1 x2878 >= 0 ;++1 x520 -1 x2879 >= 0 ;++1 x521 -1 x2880 >= 0 ;++1 x522 -1 x2881 >= 0 ;++1 x523 -1 x2882 >= 0 ;++1 x524 -1 x2883 >= 0 ;++1 x525 -1 x2884 >= 0 ;++1 x526 -1 x2885 >= 0 ;++1 x527 -1 x2886 >= 0 ;++1 x528 -1 x2887 >= 0 ;++1 x529 -1 x2888 >= 0 ;++1 x530 -1 x2889 >= 0 ;++1 x531 -1 x2890 >= 0 ;++1 x532 -1 x2891 >= 0 ;++1 x533 -1 x2892 >= 0 ;++1 x534 -1 x2893 >= 0 ;++1 x535 -1 x2894 >= 0 ;++1 x536 -1 x2895 >= 0 ;++1 x537 -1 x2896 >= 0 ;++1 x538 -1 x2897 >= 0 ;++1 x539 -1 x2898 >= 0 ;++1 x540 -1 x2899 >= 0 ;++1 x541 -1 x2900 >= 0 ;++1 x542 -1 x2901 >= 0 ;++1 x543 -1 x2902 >= 0 ;++1 x544 -1 x2903 >= 0 ;++1 x545 -1 x2904 >= 0 ;++1 x546 -1 x2905 >= 0 ;++1 x547 -1 x2906 >= 0 ;++1 x548 -1 x2907 >= 0 ;++1 x549 -1 x2908 >= 0 ;++1 x550 -1 x2909 >= 0 ;++1 x551 -1 x2910 >= 0 ;++1 x552 -1 x2911 >= 0 ;++1 x553 -1 x2912 >= 0 ;++1 x554 -1 x2913 >= 0 ;++1 x555 >= 1 ;+-1 x2830 >= 0 ;++1 x565 -1 x2831 >= 0 ;++1 x566 -1 x2832 >= 0 ;++1 x567 -1 x2833 >= 0 ;++1 x568 -1 x2834 >= 0 ;++1 x569 -1 x2835 >= 0 ;++1 x570 -1 x2836 >= 0 ;++1 x571 -1 x2837 >= 0 ;++1 x572 -1 x2838 >= 0 ;++1 x573 -1 x2839 >= 0 ;++1 x574 -1 x2840 >= 0 ;++1 x575 -1 x2841 >= 0 ;++1 x576 -1 x2842 >= 0 ;++1 x577 -1 x2843 >= 0 ;++1 x578 -1 x2844 >= 0 ;++1 x579 -1 x2845 >= 0 ;++1 x580 -1 x2846 >= 0 ;++1 x581 -1 x2847 >= 0 ;++1 x582 -1 x2848 >= 0 ;++1 x583 -1 x2849 >= 0 ;++1 x584 -1 x2850 >= 0 ;++1 x585 -1 x2851 >= 0 ;++1 x586 -1 x2852 >= 0 ;++1 x587 -1 x2853 >= 0 ;++1 x588 -1 x2854 >= 0 ;++1 x589 -1 x2855 >= 0 ;++1 x590 -1 x2856 >= 0 ;++1 x591 -1 x2857 >= 0 ;++1 x592 -1 x2858 >= 0 ;++1 x593 -1 x2859 >= 0 ;++1 x594 -1 x2860 >= 0 ;++1 x595 -1 x2861 >= 0 ;++1 x596 -1 x2862 >= 0 ;++1 x597 -1 x2863 >= 0 ;++1 x598 -1 x2864 >= 0 ;++1 x599 -1 x2865 >= 0 ;++1 x600 -1 x2866 >= 0 ;++1 x601 -1 x2867 >= 0 ;++1 x602 -1 x2868 >= 0 ;++1 x603 -1 x2869 >= 0 ;++1 x604 -1 x2870 >= 0 ;++1 x605 -1 x2871 >= 0 ;++1 x606 -1 x2872 >= 0 ;++1 x607 -1 x2873 >= 0 ;++1 x608 -1 x2874 >= 0 ;++1 x609 -1 x2875 >= 0 ;++1 x610 -1 x2876 >= 0 ;++1 x611 -1 x2877 >= 0 ;++1 x612 -1 x2878 >= 0 ;++1 x613 -1 x2879 >= 0 ;++1 x614 -1 x2880 >= 0 ;++1 x615 -1 x2881 >= 0 ;++1 x616 -1 x2882 >= 0 ;++1 x617 -1 x2883 >= 0 ;++1 x618 -1 x2884 >= 0 ;++1 x619 -1 x2885 >= 0 ;++1 x620 -1 x2886 >= 0 ;++1 x621 -1 x2887 >= 0 ;++1 x622 -1 x2888 >= 0 ;++1 x623 -1 x2889 >= 0 ;++1 x624 -1 x2890 >= 0 ;++1 x625 -1 x2891 >= 0 ;++1 x626 -1 x2892 >= 0 ;++1 x627 -1 x2893 >= 0 ;++1 x628 -1 x2894 >= 0 ;++1 x629 -1 x2895 >= 0 ;++1 x630 -1 x2896 >= 0 ;++1 x631 -1 x2897 >= 0 ;++1 x632 -1 x2898 >= 0 ;++1 x633 -1 x2899 >= 0 ;++1 x634 -1 x2900 >= 0 ;++1 x635 -1 x2901 >= 0 ;++1 x636 -1 x2902 >= 0 ;++1 x637 -1 x2903 >= 0 ;++1 x638 -1 x2904 >= 0 ;++1 x639 -1 x2905 >= 0 ;++1 x640 -1 x2906 >= 0 ;++1 x641 -1 x2907 >= 0 ;++1 x642 -1 x2908 >= 0 ;++1 x643 -1 x2909 >= 0 ;++1 x644 -1 x2910 >= 0 ;++1 x645 -1 x2911 >= 0 ;++1 x646 -1 x2912 >= 0 ;++1 x647 -1 x2913 >= 0 ;++1 x648 >= 1 ;+-1 x2823 >= 0 ;++1 x659 -1 x2824 >= 0 ;++1 x660 -1 x2825 >= 0 ;++1 x661 -1 x2826 >= 0 ;++1 x662 -1 x2827 >= 0 ;++1 x663 -1 x2828 >= 0 ;++1 x664 -1 x2829 >= 0 ;++1 x665 -1 x2830 >= 0 ;++1 x666 -1 x2831 >= 0 ;++1 x667 -1 x2832 >= 0 ;++1 x668 -1 x2833 >= 0 ;++1 x669 -1 x2834 >= 0 ;++1 x670 -1 x2835 >= 0 ;++1 x671 -1 x2836 >= 0 ;++1 x672 -1 x2837 >= 0 ;++1 x673 -1 x2838 >= 0 ;++1 x674 -1 x2839 >= 0 ;++1 x675 -1 x2840 >= 0 ;++1 x676 -1 x2841 >= 0 ;++1 x677 -1 x2842 >= 0 ;++1 x678 -1 x2843 >= 0 ;++1 x679 -1 x2844 >= 0 ;++1 x680 -1 x2845 >= 0 ;++1 x681 -1 x2846 >= 0 ;++1 x682 -1 x2847 >= 0 ;++1 x683 -1 x2848 >= 0 ;++1 x684 -1 x2849 >= 0 ;++1 x685 -1 x2850 >= 0 ;++1 x686 -1 x2851 >= 0 ;++1 x687 -1 x2852 >= 0 ;++1 x688 -1 x2853 >= 0 ;++1 x689 -1 x2854 >= 0 ;++1 x690 -1 x2855 >= 0 ;++1 x691 -1 x2856 >= 0 ;++1 x692 -1 x2857 >= 0 ;++1 x693 -1 x2858 >= 0 ;++1 x694 -1 x2859 >= 0 ;++1 x695 -1 x2860 >= 0 ;++1 x696 -1 x2861 >= 0 ;++1 x697 -1 x2862 >= 0 ;++1 x698 -1 x2863 >= 0 ;++1 x699 -1 x2864 >= 0 ;++1 x700 -1 x2865 >= 0 ;++1 x701 -1 x2866 >= 0 ;++1 x702 -1 x2867 >= 0 ;++1 x703 -1 x2868 >= 0 ;++1 x704 -1 x2869 >= 0 ;++1 x705 -1 x2870 >= 0 ;++1 x706 -1 x2871 >= 0 ;++1 x707 -1 x2872 >= 0 ;++1 x708 -1 x2873 >= 0 ;++1 x709 -1 x2874 >= 0 ;++1 x710 -1 x2875 >= 0 ;++1 x711 -1 x2876 >= 0 ;++1 x712 -1 x2877 >= 0 ;++1 x713 -1 x2878 >= 0 ;++1 x714 -1 x2879 >= 0 ;++1 x715 -1 x2880 >= 0 ;++1 x716 -1 x2881 >= 0 ;++1 x717 -1 x2882 >= 0 ;++1 x718 -1 x2883 >= 0 ;++1 x719 -1 x2884 >= 0 ;++1 x720 -1 x2885 >= 0 ;++1 x721 -1 x2886 >= 0 ;++1 x722 -1 x2887 >= 0 ;++1 x723 -1 x2888 >= 0 ;++1 x724 -1 x2889 >= 0 ;++1 x725 -1 x2890 >= 0 ;++1 x726 -1 x2891 >= 0 ;++1 x727 -1 x2892 >= 0 ;++1 x728 -1 x2893 >= 0 ;++1 x729 -1 x2894 >= 0 ;++1 x730 -1 x2895 >= 0 ;++1 x731 -1 x2896 >= 0 ;++1 x732 -1 x2897 >= 0 ;++1 x733 -1 x2898 >= 0 ;++1 x734 -1 x2899 >= 0 ;++1 x735 -1 x2900 >= 0 ;++1 x736 -1 x2901 >= 0 ;++1 x737 -1 x2902 >= 0 ;++1 x738 -1 x2903 >= 0 ;++1 x739 -1 x2904 >= 0 ;++1 x740 -1 x2905 >= 0 ;++1 x741 -1 x2906 >= 0 ;++1 x742 -1 x2907 >= 0 ;++1 x743 -1 x2908 >= 0 ;++1 x744 -1 x2909 >= 0 ;++1 x745 -1 x2910 >= 0 ;++1 x746 -1 x2911 >= 0 ;++1 x747 -1 x2912 >= 0 ;++1 x748 -1 x2913 >= 0 ;++1 x749 >= 1 ;+-1 x2824 >= 0 ;++1 x753 -1 x2825 >= 0 ;++1 x754 -1 x2826 >= 0 ;++1 x755 -1 x2827 >= 0 ;++1 x756 -1 x2828 >= 0 ;++1 x757 -1 x2829 >= 0 ;++1 x758 -1 x2830 >= 0 ;++1 x759 -1 x2831 >= 0 ;++1 x760 -1 x2832 >= 0 ;++1 x761 -1 x2833 >= 0 ;++1 x762 -1 x2834 >= 0 ;++1 x763 -1 x2835 >= 0 ;++1 x764 -1 x2836 >= 0 ;++1 x765 -1 x2837 >= 0 ;++1 x766 -1 x2838 >= 0 ;++1 x767 -1 x2839 >= 0 ;++1 x768 -1 x2840 >= 0 ;++1 x769 -1 x2841 >= 0 ;++1 x770 -1 x2842 >= 0 ;++1 x771 -1 x2843 >= 0 ;++1 x772 -1 x2844 >= 0 ;++1 x773 -1 x2845 >= 0 ;++1 x774 -1 x2846 >= 0 ;++1 x775 -1 x2847 >= 0 ;++1 x776 -1 x2848 >= 0 ;++1 x777 -1 x2849 >= 0 ;++1 x778 -1 x2850 >= 0 ;++1 x779 -1 x2851 >= 0 ;++1 x780 -1 x2852 >= 0 ;++1 x781 -1 x2853 >= 0 ;++1 x782 -1 x2854 >= 0 ;++1 x783 -1 x2855 >= 0 ;++1 x784 -1 x2856 >= 0 ;++1 x785 -1 x2857 >= 0 ;++1 x786 -1 x2858 >= 0 ;++1 x787 -1 x2859 >= 0 ;++1 x788 -1 x2860 >= 0 ;++1 x789 -1 x2861 >= 0 ;++1 x790 -1 x2862 >= 0 ;++1 x791 -1 x2863 >= 0 ;++1 x792 -1 x2864 >= 0 ;++1 x793 -1 x2865 >= 0 ;++1 x794 -1 x2866 >= 0 ;++1 x795 -1 x2867 >= 0 ;++1 x796 -1 x2868 >= 0 ;++1 x797 -1 x2869 >= 0 ;++1 x798 -1 x2870 >= 0 ;++1 x799 -1 x2871 >= 0 ;++1 x800 -1 x2872 >= 0 ;++1 x801 -1 x2873 >= 0 ;++1 x802 -1 x2874 >= 0 ;++1 x803 -1 x2875 >= 0 ;++1 x804 -1 x2876 >= 0 ;++1 x805 -1 x2877 >= 0 ;++1 x806 -1 x2878 >= 0 ;++1 x807 -1 x2879 >= 0 ;++1 x808 -1 x2880 >= 0 ;++1 x809 -1 x2881 >= 0 ;++1 x810 -1 x2882 >= 0 ;++1 x811 -1 x2883 >= 0 ;++1 x812 -1 x2884 >= 0 ;++1 x813 -1 x2885 >= 0 ;++1 x814 -1 x2886 >= 0 ;++1 x815 -1 x2887 >= 0 ;++1 x816 -1 x2888 >= 0 ;++1 x817 -1 x2889 >= 0 ;++1 x818 -1 x2890 >= 0 ;++1 x819 -1 x2891 >= 0 ;++1 x820 -1 x2892 >= 0 ;++1 x821 -1 x2893 >= 0 ;++1 x822 -1 x2894 >= 0 ;++1 x823 -1 x2895 >= 0 ;++1 x824 -1 x2896 >= 0 ;++1 x825 -1 x2897 >= 0 ;++1 x826 -1 x2898 >= 0 ;++1 x827 -1 x2899 >= 0 ;++1 x828 -1 x2900 >= 0 ;++1 x829 -1 x2901 >= 0 ;++1 x830 -1 x2902 >= 0 ;++1 x831 -1 x2903 >= 0 ;++1 x832 -1 x2904 >= 0 ;++1 x833 -1 x2905 >= 0 ;++1 x834 -1 x2906 >= 0 ;++1 x835 -1 x2907 >= 0 ;++1 x836 -1 x2908 >= 0 ;++1 x837 -1 x2909 >= 0 ;++1 x838 -1 x2910 >= 0 ;++1 x839 -1 x2911 >= 0 ;++1 x840 -1 x2912 >= 0 ;++1 x841 -1 x2913 >= 0 ;++1 x842 >= 1 ;+-1 x2827 >= 0 ;++1 x847 -1 x2828 >= 0 ;++1 x848 -1 x2829 >= 0 ;++1 x849 -1 x2830 >= 0 ;++1 x850 -1 x2831 >= 0 ;++1 x851 -1 x2832 >= 0 ;++1 x852 -1 x2833 >= 0 ;++1 x853 -1 x2834 >= 0 ;++1 x854 -1 x2835 >= 0 ;++1 x855 -1 x2836 >= 0 ;++1 x856 -1 x2837 >= 0 ;++1 x857 -1 x2838 >= 0 ;++1 x858 -1 x2839 >= 0 ;++1 x859 -1 x2840 >= 0 ;++1 x860 -1 x2841 >= 0 ;++1 x861 -1 x2842 >= 0 ;++1 x862 -1 x2843 >= 0 ;++1 x863 -1 x2844 >= 0 ;++1 x864 -1 x2845 >= 0 ;++1 x865 -1 x2846 >= 0 ;++1 x866 -1 x2847 >= 0 ;++1 x867 -1 x2848 >= 0 ;++1 x868 -1 x2849 >= 0 ;++1 x869 -1 x2850 >= 0 ;++1 x870 -1 x2851 >= 0 ;++1 x871 -1 x2852 >= 0 ;++1 x872 -1 x2853 >= 0 ;++1 x873 -1 x2854 >= 0 ;++1 x874 -1 x2855 >= 0 ;++1 x875 -1 x2856 >= 0 ;++1 x876 -1 x2857 >= 0 ;++1 x877 -1 x2858 >= 0 ;++1 x878 -1 x2859 >= 0 ;++1 x879 -1 x2860 >= 0 ;++1 x880 -1 x2861 >= 0 ;++1 x881 -1 x2862 >= 0 ;++1 x882 -1 x2863 >= 0 ;++1 x883 -1 x2864 >= 0 ;++1 x884 -1 x2865 >= 0 ;++1 x885 -1 x2866 >= 0 ;++1 x886 -1 x2867 >= 0 ;++1 x887 -1 x2868 >= 0 ;++1 x888 -1 x2869 >= 0 ;++1 x889 -1 x2870 >= 0 ;++1 x890 -1 x2871 >= 0 ;++1 x891 -1 x2872 >= 0 ;++1 x892 -1 x2873 >= 0 ;++1 x893 -1 x2874 >= 0 ;++1 x894 -1 x2875 >= 0 ;++1 x895 -1 x2876 >= 0 ;++1 x896 -1 x2877 >= 0 ;++1 x897 -1 x2878 >= 0 ;++1 x898 -1 x2879 >= 0 ;++1 x899 -1 x2880 >= 0 ;++1 x900 -1 x2881 >= 0 ;++1 x901 -1 x2882 >= 0 ;++1 x902 -1 x2883 >= 0 ;++1 x903 -1 x2884 >= 0 ;++1 x904 -1 x2885 >= 0 ;++1 x905 -1 x2886 >= 0 ;++1 x906 -1 x2887 >= 0 ;++1 x907 -1 x2888 >= 0 ;++1 x908 -1 x2889 >= 0 ;++1 x909 -1 x2890 >= 0 ;++1 x910 -1 x2891 >= 0 ;++1 x911 -1 x2892 >= 0 ;++1 x912 -1 x2893 >= 0 ;++1 x913 -1 x2894 >= 0 ;++1 x914 -1 x2895 >= 0 ;++1 x915 -1 x2896 >= 0 ;++1 x916 -1 x2897 >= 0 ;++1 x917 -1 x2898 >= 0 ;++1 x918 -1 x2899 >= 0 ;++1 x919 -1 x2900 >= 0 ;++1 x920 -1 x2901 >= 0 ;++1 x921 -1 x2902 >= 0 ;++1 x922 -1 x2903 >= 0 ;++1 x923 -1 x2904 >= 0 ;++1 x924 -1 x2905 >= 0 ;++1 x925 -1 x2906 >= 0 ;++1 x926 -1 x2907 >= 0 ;++1 x927 -1 x2908 >= 0 ;++1 x928 -1 x2909 >= 0 ;++1 x929 -1 x2910 >= 0 ;++1 x930 -1 x2911 >= 0 ;++1 x931 -1 x2912 >= 0 ;++1 x932 -1 x2913 >= 0 ;++1 x933 >= 1 ;+-1 x2828 >= 0 ;++1 x941 -1 x2829 >= 0 ;++1 x942 -1 x2830 >= 0 ;++1 x943 -1 x2831 >= 0 ;++1 x944 -1 x2832 >= 0 ;++1 x945 -1 x2833 >= 0 ;++1 x946 -1 x2834 >= 0 ;++1 x947 -1 x2835 >= 0 ;++1 x948 -1 x2836 >= 0 ;++1 x949 -1 x2837 >= 0 ;++1 x950 -1 x2838 >= 0 ;++1 x951 -1 x2839 >= 0 ;++1 x952 -1 x2840 >= 0 ;++1 x953 -1 x2841 >= 0 ;++1 x954 -1 x2842 >= 0 ;++1 x955 -1 x2843 >= 0 ;++1 x956 -1 x2844 >= 0 ;++1 x957 -1 x2845 >= 0 ;++1 x958 -1 x2846 >= 0 ;++1 x959 -1 x2847 >= 0 ;++1 x960 -1 x2848 >= 0 ;++1 x961 -1 x2849 >= 0 ;++1 x962 -1 x2850 >= 0 ;++1 x963 -1 x2851 >= 0 ;++1 x964 -1 x2852 >= 0 ;++1 x965 -1 x2853 >= 0 ;++1 x966 -1 x2854 >= 0 ;++1 x967 -1 x2855 >= 0 ;++1 x968 -1 x2856 >= 0 ;++1 x969 -1 x2857 >= 0 ;++1 x970 -1 x2858 >= 0 ;++1 x971 -1 x2859 >= 0 ;++1 x972 -1 x2860 >= 0 ;++1 x973 -1 x2861 >= 0 ;++1 x974 -1 x2862 >= 0 ;++1 x975 -1 x2863 >= 0 ;++1 x976 -1 x2864 >= 0 ;++1 x977 -1 x2865 >= 0 ;++1 x978 -1 x2866 >= 0 ;++1 x979 -1 x2867 >= 0 ;++1 x980 -1 x2868 >= 0 ;++1 x981 -1 x2869 >= 0 ;++1 x982 -1 x2870 >= 0 ;++1 x983 -1 x2871 >= 0 ;++1 x984 -1 x2872 >= 0 ;++1 x985 -1 x2873 >= 0 ;++1 x986 -1 x2874 >= 0 ;++1 x987 -1 x2875 >= 0 ;++1 x988 -1 x2876 >= 0 ;++1 x989 -1 x2877 >= 0 ;++1 x990 -1 x2878 >= 0 ;++1 x991 -1 x2879 >= 0 ;++1 x992 -1 x2880 >= 0 ;++1 x993 -1 x2881 >= 0 ;++1 x994 -1 x2882 >= 0 ;++1 x995 -1 x2883 >= 0 ;++1 x996 -1 x2884 >= 0 ;++1 x997 -1 x2885 >= 0 ;++1 x998 -1 x2886 >= 0 ;++1 x999 -1 x2887 >= 0 ;++1 x1000 -1 x2888 >= 0 ;++1 x1001 -1 x2889 >= 0 ;++1 x1002 -1 x2890 >= 0 ;++1 x1003 -1 x2891 >= 0 ;++1 x1004 -1 x2892 >= 0 ;++1 x1005 -1 x2893 >= 0 ;++1 x1006 -1 x2894 >= 0 ;++1 x1007 -1 x2895 >= 0 ;++1 x1008 -1 x2896 >= 0 ;++1 x1009 -1 x2897 >= 0 ;++1 x1010 -1 x2898 >= 0 ;++1 x1011 -1 x2899 >= 0 ;++1 x1012 -1 x2900 >= 0 ;++1 x1013 -1 x2901 >= 0 ;++1 x1014 -1 x2902 >= 0 ;++1 x1015 -1 x2903 >= 0 ;++1 x1016 -1 x2904 >= 0 ;++1 x1017 -1 x2905 >= 0 ;++1 x1018 -1 x2906 >= 0 ;++1 x1019 -1 x2907 >= 0 ;++1 x1020 -1 x2908 >= 0 ;++1 x1021 -1 x2909 >= 0 ;++1 x1022 -1 x2910 >= 0 ;++1 x1023 -1 x2911 >= 0 ;++1 x1024 -1 x2912 >= 0 ;++1 x1025 -1 x2913 >= 0 ;++1 x1026 >= 1 ;+-1 x2826 >= 0 ;++1 x1035 -1 x2827 >= 0 ;++1 x1036 -1 x2828 >= 0 ;++1 x1037 -1 x2829 >= 0 ;++1 x1038 -1 x2830 >= 0 ;++1 x1039 -1 x2831 >= 0 ;++1 x1040 -1 x2832 >= 0 ;++1 x1041 -1 x2833 >= 0 ;++1 x1042 -1 x2834 >= 0 ;++1 x1043 -1 x2835 >= 0 ;++1 x1044 -1 x2836 >= 0 ;++1 x1045 -1 x2837 >= 0 ;++1 x1046 -1 x2838 >= 0 ;++1 x1047 -1 x2839 >= 0 ;++1 x1048 -1 x2840 >= 0 ;++1 x1049 -1 x2841 >= 0 ;++1 x1050 -1 x2842 >= 0 ;++1 x1051 -1 x2843 >= 0 ;++1 x1052 -1 x2844 >= 0 ;++1 x1053 -1 x2845 >= 0 ;++1 x1054 -1 x2846 >= 0 ;++1 x1055 -1 x2847 >= 0 ;++1 x1056 -1 x2848 >= 0 ;++1 x1057 -1 x2849 >= 0 ;++1 x1058 -1 x2850 >= 0 ;++1 x1059 -1 x2851 >= 0 ;++1 x1060 -1 x2852 >= 0 ;++1 x1061 -1 x2853 >= 0 ;++1 x1062 -1 x2854 >= 0 ;++1 x1063 -1 x2855 >= 0 ;++1 x1064 -1 x2856 >= 0 ;++1 x1065 -1 x2857 >= 0 ;++1 x1066 -1 x2858 >= 0 ;++1 x1067 -1 x2859 >= 0 ;++1 x1068 -1 x2860 >= 0 ;++1 x1069 -1 x2861 >= 0 ;++1 x1070 -1 x2862 >= 0 ;++1 x1071 -1 x2863 >= 0 ;++1 x1072 -1 x2864 >= 0 ;++1 x1073 -1 x2865 >= 0 ;++1 x1074 -1 x2866 >= 0 ;++1 x1075 -1 x2867 >= 0 ;++1 x1076 -1 x2868 >= 0 ;++1 x1077 -1 x2869 >= 0 ;++1 x1078 -1 x2870 >= 0 ;++1 x1079 -1 x2871 >= 0 ;++1 x1080 -1 x2872 >= 0 ;++1 x1081 -1 x2873 >= 0 ;++1 x1082 -1 x2874 >= 0 ;++1 x1083 -1 x2875 >= 0 ;++1 x1084 -1 x2876 >= 0 ;++1 x1085 -1 x2877 >= 0 ;++1 x1086 -1 x2878 >= 0 ;++1 x1087 -1 x2879 >= 0 ;++1 x1088 -1 x2880 >= 0 ;++1 x1089 -1 x2881 >= 0 ;++1 x1090 -1 x2882 >= 0 ;++1 x1091 -1 x2883 >= 0 ;++1 x1092 -1 x2884 >= 0 ;++1 x1093 -1 x2885 >= 0 ;++1 x1094 -1 x2886 >= 0 ;++1 x1095 -1 x2887 >= 0 ;++1 x1096 -1 x2888 >= 0 ;++1 x1097 -1 x2889 >= 0 ;++1 x1098 -1 x2890 >= 0 ;++1 x1099 -1 x2891 >= 0 ;++1 x1100 -1 x2892 >= 0 ;++1 x1101 -1 x2893 >= 0 ;++1 x1102 -1 x2894 >= 0 ;++1 x1103 -1 x2895 >= 0 ;++1 x1104 -1 x2896 >= 0 ;++1 x1105 -1 x2897 >= 0 ;++1 x1106 -1 x2898 >= 0 ;++1 x1107 -1 x2899 >= 0 ;++1 x1108 -1 x2900 >= 0 ;++1 x1109 -1 x2901 >= 0 ;++1 x1110 -1 x2902 >= 0 ;++1 x1111 -1 x2903 >= 0 ;++1 x1112 -1 x2904 >= 0 ;++1 x1113 -1 x2905 >= 0 ;++1 x1114 -1 x2906 >= 0 ;++1 x1115 -1 x2907 >= 0 ;++1 x1116 -1 x2908 >= 0 ;++1 x1117 -1 x2909 >= 0 ;++1 x1118 -1 x2910 >= 0 ;++1 x1119 -1 x2911 >= 0 ;++1 x1120 -1 x2912 >= 0 ;++1 x1121 -1 x2913 >= 0 ;++1 x1122 >= 1 ;+-1 x2826 >= 0 ;++1 x1129 -1 x2827 >= 0 ;++1 x1130 -1 x2828 >= 0 ;++1 x1131 -1 x2829 >= 0 ;++1 x1132 -1 x2830 >= 0 ;++1 x1133 -1 x2831 >= 0 ;++1 x1134 -1 x2832 >= 0 ;++1 x1135 -1 x2833 >= 0 ;++1 x1136 -1 x2834 >= 0 ;++1 x1137 -1 x2835 >= 0 ;++1 x1138 -1 x2836 >= 0 ;++1 x1139 -1 x2837 >= 0 ;++1 x1140 -1 x2838 >= 0 ;++1 x1141 -1 x2839 >= 0 ;++1 x1142 -1 x2840 >= 0 ;++1 x1143 -1 x2841 >= 0 ;++1 x1144 -1 x2842 >= 0 ;++1 x1145 -1 x2843 >= 0 ;++1 x1146 -1 x2844 >= 0 ;++1 x1147 -1 x2845 >= 0 ;++1 x1148 -1 x2846 >= 0 ;++1 x1149 -1 x2847 >= 0 ;++1 x1150 -1 x2848 >= 0 ;++1 x1151 -1 x2849 >= 0 ;++1 x1152 -1 x2850 >= 0 ;++1 x1153 -1 x2851 >= 0 ;++1 x1154 -1 x2852 >= 0 ;++1 x1155 -1 x2853 >= 0 ;++1 x1156 -1 x2854 >= 0 ;++1 x1157 -1 x2855 >= 0 ;++1 x1158 -1 x2856 >= 0 ;++1 x1159 -1 x2857 >= 0 ;++1 x1160 -1 x2858 >= 0 ;++1 x1161 -1 x2859 >= 0 ;++1 x1162 -1 x2860 >= 0 ;++1 x1163 -1 x2861 >= 0 ;++1 x1164 -1 x2862 >= 0 ;++1 x1165 -1 x2863 >= 0 ;++1 x1166 -1 x2864 >= 0 ;++1 x1167 -1 x2865 >= 0 ;++1 x1168 -1 x2866 >= 0 ;++1 x1169 -1 x2867 >= 0 ;++1 x1170 -1 x2868 >= 0 ;++1 x1171 -1 x2869 >= 0 ;++1 x1172 -1 x2870 >= 0 ;++1 x1173 -1 x2871 >= 0 ;++1 x1174 -1 x2872 >= 0 ;++1 x1175 -1 x2873 >= 0 ;++1 x1176 -1 x2874 >= 0 ;++1 x1177 -1 x2875 >= 0 ;++1 x1178 -1 x2876 >= 0 ;++1 x1179 -1 x2877 >= 0 ;++1 x1180 -1 x2878 >= 0 ;++1 x1181 -1 x2879 >= 0 ;++1 x1182 -1 x2880 >= 0 ;++1 x1183 -1 x2881 >= 0 ;++1 x1184 -1 x2882 >= 0 ;++1 x1185 -1 x2883 >= 0 ;++1 x1186 -1 x2884 >= 0 ;++1 x1187 -1 x2885 >= 0 ;++1 x1188 -1 x2886 >= 0 ;++1 x1189 -1 x2887 >= 0 ;++1 x1190 -1 x2888 >= 0 ;++1 x1191 -1 x2889 >= 0 ;++1 x1192 -1 x2890 >= 0 ;++1 x1193 -1 x2891 >= 0 ;++1 x1194 -1 x2892 >= 0 ;++1 x1195 -1 x2893 >= 0 ;++1 x1196 -1 x2894 >= 0 ;++1 x1197 -1 x2895 >= 0 ;++1 x1198 -1 x2896 >= 0 ;++1 x1199 -1 x2897 >= 0 ;++1 x1200 -1 x2898 >= 0 ;++1 x1201 -1 x2899 >= 0 ;++1 x1202 -1 x2900 >= 0 ;++1 x1203 -1 x2901 >= 0 ;++1 x1204 -1 x2902 >= 0 ;++1 x1205 -1 x2903 >= 0 ;++1 x1206 -1 x2904 >= 0 ;++1 x1207 -1 x2905 >= 0 ;++1 x1208 -1 x2906 >= 0 ;++1 x1209 -1 x2907 >= 0 ;++1 x1210 -1 x2908 >= 0 ;++1 x1211 -1 x2909 >= 0 ;++1 x1212 -1 x2910 >= 0 ;++1 x1213 -1 x2911 >= 0 ;++1 x1214 -1 x2912 >= 0 ;++1 x1215 -1 x2913 >= 0 ;++1 x1216 >= 1 ;+-1 x2830 >= 0 ;++1 x1223 -1 x2831 >= 0 ;++1 x1224 -1 x2832 >= 0 ;++1 x1225 -1 x2833 >= 0 ;++1 x1226 -1 x2834 >= 0 ;++1 x1227 -1 x2835 >= 0 ;++1 x1228 -1 x2836 >= 0 ;++1 x1229 -1 x2837 >= 0 ;++1 x1230 -1 x2838 >= 0 ;++1 x1231 -1 x2839 >= 0 ;++1 x1232 -1 x2840 >= 0 ;++1 x1233 -1 x2841 >= 0 ;++1 x1234 -1 x2842 >= 0 ;++1 x1235 -1 x2843 >= 0 ;++1 x1236 -1 x2844 >= 0 ;++1 x1237 -1 x2845 >= 0 ;++1 x1238 -1 x2846 >= 0 ;++1 x1239 -1 x2847 >= 0 ;++1 x1240 -1 x2848 >= 0 ;++1 x1241 -1 x2849 >= 0 ;++1 x1242 -1 x2850 >= 0 ;++1 x1243 -1 x2851 >= 0 ;++1 x1244 -1 x2852 >= 0 ;++1 x1245 -1 x2853 >= 0 ;++1 x1246 -1 x2854 >= 0 ;++1 x1247 -1 x2855 >= 0 ;++1 x1248 -1 x2856 >= 0 ;++1 x1249 -1 x2857 >= 0 ;++1 x1250 -1 x2858 >= 0 ;++1 x1251 -1 x2859 >= 0 ;++1 x1252 -1 x2860 >= 0 ;++1 x1253 -1 x2861 >= 0 ;++1 x1254 -1 x2862 >= 0 ;++1 x1255 -1 x2863 >= 0 ;++1 x1256 -1 x2864 >= 0 ;++1 x1257 -1 x2865 >= 0 ;++1 x1258 -1 x2866 >= 0 ;++1 x1259 -1 x2867 >= 0 ;++1 x1260 -1 x2868 >= 0 ;++1 x1261 -1 x2869 >= 0 ;++1 x1262 -1 x2870 >= 0 ;++1 x1263 -1 x2871 >= 0 ;++1 x1264 -1 x2872 >= 0 ;++1 x1265 -1 x2873 >= 0 ;++1 x1266 -1 x2874 >= 0 ;++1 x1267 -1 x2875 >= 0 ;++1 x1268 -1 x2876 >= 0 ;++1 x1269 -1 x2877 >= 0 ;++1 x1270 -1 x2878 >= 0 ;++1 x1271 -1 x2879 >= 0 ;++1 x1272 -1 x2880 >= 0 ;++1 x1273 -1 x2881 >= 0 ;++1 x1274 -1 x2882 >= 0 ;++1 x1275 -1 x2883 >= 0 ;++1 x1276 -1 x2884 >= 0 ;++1 x1277 -1 x2885 >= 0 ;++1 x1278 -1 x2886 >= 0 ;++1 x1279 -1 x2887 >= 0 ;++1 x1280 -1 x2888 >= 0 ;++1 x1281 -1 x2889 >= 0 ;++1 x1282 -1 x2890 >= 0 ;++1 x1283 -1 x2891 >= 0 ;++1 x1284 -1 x2892 >= 0 ;++1 x1285 -1 x2893 >= 0 ;++1 x1286 -1 x2894 >= 0 ;++1 x1287 -1 x2895 >= 0 ;++1 x1288 -1 x2896 >= 0 ;++1 x1289 -1 x2897 >= 0 ;++1 x1290 -1 x2898 >= 0 ;++1 x1291 -1 x2899 >= 0 ;++1 x1292 -1 x2900 >= 0 ;++1 x1293 -1 x2901 >= 0 ;++1 x1294 -1 x2902 >= 0 ;++1 x1295 -1 x2903 >= 0 ;++1 x1296 -1 x2904 >= 0 ;++1 x1297 -1 x2905 >= 0 ;++1 x1298 -1 x2906 >= 0 ;++1 x1299 -1 x2907 >= 0 ;++1 x1300 -1 x2908 >= 0 ;++1 x1301 -1 x2909 >= 0 ;++1 x1302 -1 x2910 >= 0 ;++1 x1303 -1 x2911 >= 0 ;++1 x1304 -1 x2912 >= 0 ;++1 x1305 -1 x2913 >= 0 ;++1 x1306 >= 1 ;+-1 x2829 >= 0 ;++1 x1317 -1 x2830 >= 0 ;++1 x1318 -1 x2831 >= 0 ;++1 x1319 -1 x2832 >= 0 ;++1 x1320 -1 x2833 >= 0 ;++1 x1321 -1 x2834 >= 0 ;++1 x1322 -1 x2835 >= 0 ;++1 x1323 -1 x2836 >= 0 ;++1 x1324 -1 x2837 >= 0 ;++1 x1325 -1 x2838 >= 0 ;++1 x1326 -1 x2839 >= 0 ;++1 x1327 -1 x2840 >= 0 ;++1 x1328 -1 x2841 >= 0 ;++1 x1329 -1 x2842 >= 0 ;++1 x1330 -1 x2843 >= 0 ;++1 x1331 -1 x2844 >= 0 ;++1 x1332 -1 x2845 >= 0 ;++1 x1333 -1 x2846 >= 0 ;++1 x1334 -1 x2847 >= 0 ;++1 x1335 -1 x2848 >= 0 ;++1 x1336 -1 x2849 >= 0 ;++1 x1337 -1 x2850 >= 0 ;++1 x1338 -1 x2851 >= 0 ;++1 x1339 -1 x2852 >= 0 ;++1 x1340 -1 x2853 >= 0 ;++1 x1341 -1 x2854 >= 0 ;++1 x1342 -1 x2855 >= 0 ;++1 x1343 -1 x2856 >= 0 ;++1 x1344 -1 x2857 >= 0 ;++1 x1345 -1 x2858 >= 0 ;++1 x1346 -1 x2859 >= 0 ;++1 x1347 -1 x2860 >= 0 ;++1 x1348 -1 x2861 >= 0 ;++1 x1349 -1 x2862 >= 0 ;++1 x1350 -1 x2863 >= 0 ;++1 x1351 -1 x2864 >= 0 ;++1 x1352 -1 x2865 >= 0 ;++1 x1353 -1 x2866 >= 0 ;++1 x1354 -1 x2867 >= 0 ;++1 x1355 -1 x2868 >= 0 ;++1 x1356 -1 x2869 >= 0 ;++1 x1357 -1 x2870 >= 0 ;++1 x1358 -1 x2871 >= 0 ;++1 x1359 -1 x2872 >= 0 ;++1 x1360 -1 x2873 >= 0 ;++1 x1361 -1 x2874 >= 0 ;++1 x1362 -1 x2875 >= 0 ;++1 x1363 -1 x2876 >= 0 ;++1 x1364 -1 x2877 >= 0 ;++1 x1365 -1 x2878 >= 0 ;++1 x1366 -1 x2879 >= 0 ;++1 x1367 -1 x2880 >= 0 ;++1 x1368 -1 x2881 >= 0 ;++1 x1369 -1 x2882 >= 0 ;++1 x1370 -1 x2883 >= 0 ;++1 x1371 -1 x2884 >= 0 ;++1 x1372 -1 x2885 >= 0 ;++1 x1373 -1 x2886 >= 0 ;++1 x1374 -1 x2887 >= 0 ;++1 x1375 -1 x2888 >= 0 ;++1 x1376 -1 x2889 >= 0 ;++1 x1377 -1 x2890 >= 0 ;++1 x1378 -1 x2891 >= 0 ;++1 x1379 -1 x2892 >= 0 ;++1 x1380 -1 x2893 >= 0 ;++1 x1381 -1 x2894 >= 0 ;++1 x1382 -1 x2895 >= 0 ;++1 x1383 -1 x2896 >= 0 ;++1 x1384 -1 x2897 >= 0 ;++1 x1385 -1 x2898 >= 0 ;++1 x1386 -1 x2899 >= 0 ;++1 x1387 -1 x2900 >= 0 ;++1 x1388 -1 x2901 >= 0 ;++1 x1389 -1 x2902 >= 0 ;++1 x1390 -1 x2903 >= 0 ;++1 x1391 -1 x2904 >= 0 ;++1 x1392 -1 x2905 >= 0 ;++1 x1393 -1 x2906 >= 0 ;++1 x1394 -1 x2907 >= 0 ;++1 x1395 -1 x2908 >= 0 ;++1 x1396 -1 x2909 >= 0 ;++1 x1397 -1 x2910 >= 0 ;++1 x1398 -1 x2911 >= 0 ;++1 x1399 -1 x2912 >= 0 ;++1 x1400 -1 x2913 >= 0 ;++1 x1401 >= 1 ;+-1 x2826 >= 0 ;++1 x1411 -1 x2827 >= 0 ;++1 x1412 -1 x2828 >= 0 ;++1 x1413 -1 x2829 >= 0 ;++1 x1414 -1 x2830 >= 0 ;++1 x1415 -1 x2831 >= 0 ;++1 x1416 -1 x2832 >= 0 ;++1 x1417 -1 x2833 >= 0 ;++1 x1418 -1 x2834 >= 0 ;++1 x1419 -1 x2835 >= 0 ;++1 x1420 -1 x2836 >= 0 ;++1 x1421 -1 x2837 >= 0 ;++1 x1422 -1 x2838 >= 0 ;++1 x1423 -1 x2839 >= 0 ;++1 x1424 -1 x2840 >= 0 ;++1 x1425 -1 x2841 >= 0 ;++1 x1426 -1 x2842 >= 0 ;++1 x1427 -1 x2843 >= 0 ;++1 x1428 -1 x2844 >= 0 ;++1 x1429 -1 x2845 >= 0 ;++1 x1430 -1 x2846 >= 0 ;++1 x1431 -1 x2847 >= 0 ;++1 x1432 -1 x2848 >= 0 ;++1 x1433 -1 x2849 >= 0 ;++1 x1434 -1 x2850 >= 0 ;++1 x1435 -1 x2851 >= 0 ;++1 x1436 -1 x2852 >= 0 ;++1 x1437 -1 x2853 >= 0 ;++1 x1438 -1 x2854 >= 0 ;++1 x1439 -1 x2855 >= 0 ;++1 x1440 -1 x2856 >= 0 ;++1 x1441 -1 x2857 >= 0 ;++1 x1442 -1 x2858 >= 0 ;++1 x1443 -1 x2859 >= 0 ;++1 x1444 -1 x2860 >= 0 ;++1 x1445 -1 x2861 >= 0 ;++1 x1446 -1 x2862 >= 0 ;++1 x1447 -1 x2863 >= 0 ;++1 x1448 -1 x2864 >= 0 ;++1 x1449 -1 x2865 >= 0 ;++1 x1450 -1 x2866 >= 0 ;++1 x1451 -1 x2867 >= 0 ;++1 x1452 -1 x2868 >= 0 ;++1 x1453 -1 x2869 >= 0 ;++1 x1454 -1 x2870 >= 0 ;++1 x1455 -1 x2871 >= 0 ;++1 x1456 -1 x2872 >= 0 ;++1 x1457 -1 x2873 >= 0 ;++1 x1458 -1 x2874 >= 0 ;++1 x1459 -1 x2875 >= 0 ;++1 x1460 -1 x2876 >= 0 ;++1 x1461 -1 x2877 >= 0 ;++1 x1462 -1 x2878 >= 0 ;++1 x1463 -1 x2879 >= 0 ;++1 x1464 -1 x2880 >= 0 ;++1 x1465 -1 x2881 >= 0 ;++1 x1466 -1 x2882 >= 0 ;++1 x1467 -1 x2883 >= 0 ;++1 x1468 -1 x2884 >= 0 ;++1 x1469 -1 x2885 >= 0 ;++1 x1470 -1 x2886 >= 0 ;++1 x1471 -1 x2887 >= 0 ;++1 x1472 -1 x2888 >= 0 ;++1 x1473 -1 x2889 >= 0 ;++1 x1474 -1 x2890 >= 0 ;++1 x1475 -1 x2891 >= 0 ;++1 x1476 -1 x2892 >= 0 ;++1 x1477 -1 x2893 >= 0 ;++1 x1478 -1 x2894 >= 0 ;++1 x1479 -1 x2895 >= 0 ;++1 x1480 -1 x2896 >= 0 ;++1 x1481 -1 x2897 >= 0 ;++1 x1482 -1 x2898 >= 0 ;++1 x1483 -1 x2899 >= 0 ;++1 x1484 -1 x2900 >= 0 ;++1 x1485 -1 x2901 >= 0 ;++1 x1486 -1 x2902 >= 0 ;++1 x1487 -1 x2903 >= 0 ;++1 x1488 -1 x2904 >= 0 ;++1 x1489 -1 x2905 >= 0 ;++1 x1490 -1 x2906 >= 0 ;++1 x1491 -1 x2907 >= 0 ;++1 x1492 -1 x2908 >= 0 ;++1 x1493 -1 x2909 >= 0 ;++1 x1494 -1 x2910 >= 0 ;++1 x1495 -1 x2911 >= 0 ;++1 x1496 -1 x2912 >= 0 ;++1 x1497 -1 x2913 >= 0 ;++1 x1498 >= 1 ;+-1 x2827 >= 0 ;++1 x1505 -1 x2828 >= 0 ;++1 x1506 -1 x2829 >= 0 ;++1 x1507 -1 x2830 >= 0 ;++1 x1508 -1 x2831 >= 0 ;++1 x1509 -1 x2832 >= 0 ;++1 x1510 -1 x2833 >= 0 ;++1 x1511 -1 x2834 >= 0 ;++1 x1512 -1 x2835 >= 0 ;++1 x1513 -1 x2836 >= 0 ;++1 x1514 -1 x2837 >= 0 ;++1 x1515 -1 x2838 >= 0 ;++1 x1516 -1 x2839 >= 0 ;++1 x1517 -1 x2840 >= 0 ;++1 x1518 -1 x2841 >= 0 ;++1 x1519 -1 x2842 >= 0 ;++1 x1520 -1 x2843 >= 0 ;++1 x1521 -1 x2844 >= 0 ;++1 x1522 -1 x2845 >= 0 ;++1 x1523 -1 x2846 >= 0 ;++1 x1524 -1 x2847 >= 0 ;++1 x1525 -1 x2848 >= 0 ;++1 x1526 -1 x2849 >= 0 ;++1 x1527 -1 x2850 >= 0 ;++1 x1528 -1 x2851 >= 0 ;++1 x1529 -1 x2852 >= 0 ;++1 x1530 -1 x2853 >= 0 ;++1 x1531 -1 x2854 >= 0 ;++1 x1532 -1 x2855 >= 0 ;++1 x1533 -1 x2856 >= 0 ;++1 x1534 -1 x2857 >= 0 ;++1 x1535 -1 x2858 >= 0 ;++1 x1536 -1 x2859 >= 0 ;++1 x1537 -1 x2860 >= 0 ;++1 x1538 -1 x2861 >= 0 ;++1 x1539 -1 x2862 >= 0 ;++1 x1540 -1 x2863 >= 0 ;++1 x1541 -1 x2864 >= 0 ;++1 x1542 -1 x2865 >= 0 ;++1 x1543 -1 x2866 >= 0 ;++1 x1544 -1 x2867 >= 0 ;++1 x1545 -1 x2868 >= 0 ;++1 x1546 -1 x2869 >= 0 ;++1 x1547 -1 x2870 >= 0 ;++1 x1548 -1 x2871 >= 0 ;++1 x1549 -1 x2872 >= 0 ;++1 x1550 -1 x2873 >= 0 ;++1 x1551 -1 x2874 >= 0 ;++1 x1552 -1 x2875 >= 0 ;++1 x1553 -1 x2876 >= 0 ;++1 x1554 -1 x2877 >= 0 ;++1 x1555 -1 x2878 >= 0 ;++1 x1556 -1 x2879 >= 0 ;++1 x1557 -1 x2880 >= 0 ;++1 x1558 -1 x2881 >= 0 ;++1 x1559 -1 x2882 >= 0 ;++1 x1560 -1 x2883 >= 0 ;++1 x1561 -1 x2884 >= 0 ;++1 x1562 -1 x2885 >= 0 ;++1 x1563 -1 x2886 >= 0 ;++1 x1564 -1 x2887 >= 0 ;++1 x1565 -1 x2888 >= 0 ;++1 x1566 -1 x2889 >= 0 ;++1 x1567 -1 x2890 >= 0 ;++1 x1568 -1 x2891 >= 0 ;++1 x1569 -1 x2892 >= 0 ;++1 x1570 -1 x2893 >= 0 ;++1 x1571 -1 x2894 >= 0 ;++1 x1572 -1 x2895 >= 0 ;++1 x1573 -1 x2896 >= 0 ;++1 x1574 -1 x2897 >= 0 ;++1 x1575 -1 x2898 >= 0 ;++1 x1576 -1 x2899 >= 0 ;++1 x1577 -1 x2900 >= 0 ;++1 x1578 -1 x2901 >= 0 ;++1 x1579 -1 x2902 >= 0 ;++1 x1580 -1 x2903 >= 0 ;++1 x1581 -1 x2904 >= 0 ;++1 x1582 -1 x2905 >= 0 ;++1 x1583 -1 x2906 >= 0 ;++1 x1584 -1 x2907 >= 0 ;++1 x1585 -1 x2908 >= 0 ;++1 x1586 -1 x2909 >= 0 ;++1 x1587 -1 x2910 >= 0 ;++1 x1588 -1 x2911 >= 0 ;++1 x1589 -1 x2912 >= 0 ;++1 x1590 -1 x2913 >= 0 ;++1 x1591 >= 1 ;+-1 x2823 >= 0 ;++1 x1599 -1 x2824 >= 0 ;++1 x1600 -1 x2825 >= 0 ;++1 x1601 -1 x2826 >= 0 ;++1 x1602 -1 x2827 >= 0 ;++1 x1603 -1 x2828 >= 0 ;++1 x1604 -1 x2829 >= 0 ;++1 x1605 -1 x2830 >= 0 ;++1 x1606 -1 x2831 >= 0 ;++1 x1607 -1 x2832 >= 0 ;++1 x1608 -1 x2833 >= 0 ;++1 x1609 -1 x2834 >= 0 ;++1 x1610 -1 x2835 >= 0 ;++1 x1611 -1 x2836 >= 0 ;++1 x1612 -1 x2837 >= 0 ;++1 x1613 -1 x2838 >= 0 ;++1 x1614 -1 x2839 >= 0 ;++1 x1615 -1 x2840 >= 0 ;++1 x1616 -1 x2841 >= 0 ;++1 x1617 -1 x2842 >= 0 ;++1 x1618 -1 x2843 >= 0 ;++1 x1619 -1 x2844 >= 0 ;++1 x1620 -1 x2845 >= 0 ;++1 x1621 -1 x2846 >= 0 ;++1 x1622 -1 x2847 >= 0 ;++1 x1623 -1 x2848 >= 0 ;++1 x1624 -1 x2849 >= 0 ;++1 x1625 -1 x2850 >= 0 ;++1 x1626 -1 x2851 >= 0 ;++1 x1627 -1 x2852 >= 0 ;++1 x1628 -1 x2853 >= 0 ;++1 x1629 -1 x2854 >= 0 ;++1 x1630 -1 x2855 >= 0 ;++1 x1631 -1 x2856 >= 0 ;++1 x1632 -1 x2857 >= 0 ;++1 x1633 -1 x2858 >= 0 ;++1 x1634 -1 x2859 >= 0 ;++1 x1635 -1 x2860 >= 0 ;++1 x1636 -1 x2861 >= 0 ;++1 x1637 -1 x2862 >= 0 ;++1 x1638 -1 x2863 >= 0 ;++1 x1639 -1 x2864 >= 0 ;++1 x1640 -1 x2865 >= 0 ;++1 x1641 -1 x2866 >= 0 ;++1 x1642 -1 x2867 >= 0 ;++1 x1643 -1 x2868 >= 0 ;++1 x1644 -1 x2869 >= 0 ;++1 x1645 -1 x2870 >= 0 ;++1 x1646 -1 x2871 >= 0 ;++1 x1647 -1 x2872 >= 0 ;++1 x1648 -1 x2873 >= 0 ;++1 x1649 -1 x2874 >= 0 ;++1 x1650 -1 x2875 >= 0 ;++1 x1651 -1 x2876 >= 0 ;++1 x1652 -1 x2877 >= 0 ;++1 x1653 -1 x2878 >= 0 ;++1 x1654 -1 x2879 >= 0 ;++1 x1655 -1 x2880 >= 0 ;++1 x1656 -1 x2881 >= 0 ;++1 x1657 -1 x2882 >= 0 ;++1 x1658 -1 x2883 >= 0 ;++1 x1659 -1 x2884 >= 0 ;++1 x1660 -1 x2885 >= 0 ;++1 x1661 -1 x2886 >= 0 ;++1 x1662 -1 x2887 >= 0 ;++1 x1663 -1 x2888 >= 0 ;++1 x1664 -1 x2889 >= 0 ;++1 x1665 -1 x2890 >= 0 ;++1 x1666 -1 x2891 >= 0 ;++1 x1667 -1 x2892 >= 0 ;++1 x1668 -1 x2893 >= 0 ;++1 x1669 -1 x2894 >= 0 ;++1 x1670 -1 x2895 >= 0 ;++1 x1671 -1 x2896 >= 0 ;++1 x1672 -1 x2897 >= 0 ;++1 x1673 -1 x2898 >= 0 ;++1 x1674 -1 x2899 >= 0 ;++1 x1675 -1 x2900 >= 0 ;++1 x1676 -1 x2901 >= 0 ;++1 x1677 -1 x2902 >= 0 ;++1 x1678 -1 x2903 >= 0 ;++1 x1679 -1 x2904 >= 0 ;++1 x1680 -1 x2905 >= 0 ;++1 x1681 -1 x2906 >= 0 ;++1 x1682 -1 x2907 >= 0 ;++1 x1683 -1 x2908 >= 0 ;++1 x1684 -1 x2909 >= 0 ;++1 x1685 -1 x2910 >= 0 ;++1 x1686 -1 x2911 >= 0 ;++1 x1687 -1 x2912 >= 0 ;++1 x1688 -1 x2913 >= 0 ;++1 x1689 >= 1 ;+-1 x2827 >= 0 ;++1 x1693 -1 x2828 >= 0 ;++1 x1694 -1 x2829 >= 0 ;++1 x1695 -1 x2830 >= 0 ;++1 x1696 -1 x2831 >= 0 ;++1 x1697 -1 x2832 >= 0 ;++1 x1698 -1 x2833 >= 0 ;++1 x1699 -1 x2834 >= 0 ;++1 x1700 -1 x2835 >= 0 ;++1 x1701 -1 x2836 >= 0 ;++1 x1702 -1 x2837 >= 0 ;++1 x1703 -1 x2838 >= 0 ;++1 x1704 -1 x2839 >= 0 ;++1 x1705 -1 x2840 >= 0 ;++1 x1706 -1 x2841 >= 0 ;++1 x1707 -1 x2842 >= 0 ;++1 x1708 -1 x2843 >= 0 ;++1 x1709 -1 x2844 >= 0 ;++1 x1710 -1 x2845 >= 0 ;++1 x1711 -1 x2846 >= 0 ;++1 x1712 -1 x2847 >= 0 ;++1 x1713 -1 x2848 >= 0 ;++1 x1714 -1 x2849 >= 0 ;++1 x1715 -1 x2850 >= 0 ;++1 x1716 -1 x2851 >= 0 ;++1 x1717 -1 x2852 >= 0 ;++1 x1718 -1 x2853 >= 0 ;++1 x1719 -1 x2854 >= 0 ;++1 x1720 -1 x2855 >= 0 ;++1 x1721 -1 x2856 >= 0 ;++1 x1722 -1 x2857 >= 0 ;++1 x1723 -1 x2858 >= 0 ;++1 x1724 -1 x2859 >= 0 ;++1 x1725 -1 x2860 >= 0 ;++1 x1726 -1 x2861 >= 0 ;++1 x1727 -1 x2862 >= 0 ;++1 x1728 -1 x2863 >= 0 ;++1 x1729 -1 x2864 >= 0 ;++1 x1730 -1 x2865 >= 0 ;++1 x1731 -1 x2866 >= 0 ;++1 x1732 -1 x2867 >= 0 ;++1 x1733 -1 x2868 >= 0 ;++1 x1734 -1 x2869 >= 0 ;++1 x1735 -1 x2870 >= 0 ;++1 x1736 -1 x2871 >= 0 ;++1 x1737 -1 x2872 >= 0 ;++1 x1738 -1 x2873 >= 0 ;++1 x1739 -1 x2874 >= 0 ;++1 x1740 -1 x2875 >= 0 ;++1 x1741 -1 x2876 >= 0 ;++1 x1742 -1 x2877 >= 0 ;++1 x1743 -1 x2878 >= 0 ;++1 x1744 -1 x2879 >= 0 ;++1 x1745 -1 x2880 >= 0 ;++1 x1746 -1 x2881 >= 0 ;++1 x1747 -1 x2882 >= 0 ;++1 x1748 -1 x2883 >= 0 ;++1 x1749 -1 x2884 >= 0 ;++1 x1750 -1 x2885 >= 0 ;++1 x1751 -1 x2886 >= 0 ;++1 x1752 -1 x2887 >= 0 ;++1 x1753 -1 x2888 >= 0 ;++1 x1754 -1 x2889 >= 0 ;++1 x1755 -1 x2890 >= 0 ;++1 x1756 -1 x2891 >= 0 ;++1 x1757 -1 x2892 >= 0 ;++1 x1758 -1 x2893 >= 0 ;++1 x1759 -1 x2894 >= 0 ;++1 x1760 -1 x2895 >= 0 ;++1 x1761 -1 x2896 >= 0 ;++1 x1762 -1 x2897 >= 0 ;++1 x1763 -1 x2898 >= 0 ;++1 x1764 -1 x2899 >= 0 ;++1 x1765 -1 x2900 >= 0 ;++1 x1766 -1 x2901 >= 0 ;++1 x1767 -1 x2902 >= 0 ;++1 x1768 -1 x2903 >= 0 ;++1 x1769 -1 x2904 >= 0 ;++1 x1770 -1 x2905 >= 0 ;++1 x1771 -1 x2906 >= 0 ;++1 x1772 -1 x2907 >= 0 ;++1 x1773 -1 x2908 >= 0 ;++1 x1774 -1 x2909 >= 0 ;++1 x1775 -1 x2910 >= 0 ;++1 x1776 -1 x2911 >= 0 ;++1 x1777 -1 x2912 >= 0 ;++1 x1778 -1 x2913 >= 0 ;++1 x1779 >= 1 ;+-1 x2822 >= 0 ;++1 x1787 -1 x2823 >= 0 ;++1 x1788 -1 x2824 >= 0 ;++1 x1789 -1 x2825 >= 0 ;++1 x1790 -1 x2826 >= 0 ;++1 x1791 -1 x2827 >= 0 ;++1 x1792 -1 x2828 >= 0 ;++1 x1793 -1 x2829 >= 0 ;++1 x1794 -1 x2830 >= 0 ;++1 x1795 -1 x2831 >= 0 ;++1 x1796 -1 x2832 >= 0 ;++1 x1797 -1 x2833 >= 0 ;++1 x1798 -1 x2834 >= 0 ;++1 x1799 -1 x2835 >= 0 ;++1 x1800 -1 x2836 >= 0 ;++1 x1801 -1 x2837 >= 0 ;++1 x1802 -1 x2838 >= 0 ;++1 x1803 -1 x2839 >= 0 ;++1 x1804 -1 x2840 >= 0 ;++1 x1805 -1 x2841 >= 0 ;++1 x1806 -1 x2842 >= 0 ;++1 x1807 -1 x2843 >= 0 ;++1 x1808 -1 x2844 >= 0 ;++1 x1809 -1 x2845 >= 0 ;++1 x1810 -1 x2846 >= 0 ;++1 x1811 -1 x2847 >= 0 ;++1 x1812 -1 x2848 >= 0 ;++1 x1813 -1 x2849 >= 0 ;++1 x1814 -1 x2850 >= 0 ;++1 x1815 -1 x2851 >= 0 ;++1 x1816 -1 x2852 >= 0 ;++1 x1817 -1 x2853 >= 0 ;++1 x1818 -1 x2854 >= 0 ;++1 x1819 -1 x2855 >= 0 ;++1 x1820 -1 x2856 >= 0 ;++1 x1821 -1 x2857 >= 0 ;++1 x1822 -1 x2858 >= 0 ;++1 x1823 -1 x2859 >= 0 ;++1 x1824 -1 x2860 >= 0 ;++1 x1825 -1 x2861 >= 0 ;++1 x1826 -1 x2862 >= 0 ;++1 x1827 -1 x2863 >= 0 ;++1 x1828 -1 x2864 >= 0 ;++1 x1829 -1 x2865 >= 0 ;++1 x1830 -1 x2866 >= 0 ;++1 x1831 -1 x2867 >= 0 ;++1 x1832 -1 x2868 >= 0 ;++1 x1833 -1 x2869 >= 0 ;++1 x1834 -1 x2870 >= 0 ;++1 x1835 -1 x2871 >= 0 ;++1 x1836 -1 x2872 >= 0 ;++1 x1837 -1 x2873 >= 0 ;++1 x1838 -1 x2874 >= 0 ;++1 x1839 -1 x2875 >= 0 ;++1 x1840 -1 x2876 >= 0 ;++1 x1841 -1 x2877 >= 0 ;++1 x1842 -1 x2878 >= 0 ;++1 x1843 -1 x2879 >= 0 ;++1 x1844 -1 x2880 >= 0 ;++1 x1845 -1 x2881 >= 0 ;++1 x1846 -1 x2882 >= 0 ;++1 x1847 -1 x2883 >= 0 ;++1 x1848 -1 x2884 >= 0 ;++1 x1849 -1 x2885 >= 0 ;++1 x1850 -1 x2886 >= 0 ;++1 x1851 -1 x2887 >= 0 ;++1 x1852 -1 x2888 >= 0 ;++1 x1853 -1 x2889 >= 0 ;++1 x1854 -1 x2890 >= 0 ;++1 x1855 -1 x2891 >= 0 ;++1 x1856 -1 x2892 >= 0 ;++1 x1857 -1 x2893 >= 0 ;++1 x1858 -1 x2894 >= 0 ;++1 x1859 -1 x2895 >= 0 ;++1 x1860 -1 x2896 >= 0 ;++1 x1861 -1 x2897 >= 0 ;++1 x1862 -1 x2898 >= 0 ;++1 x1863 -1 x2899 >= 0 ;++1 x1864 -1 x2900 >= 0 ;++1 x1865 -1 x2901 >= 0 ;++1 x1866 -1 x2902 >= 0 ;++1 x1867 -1 x2903 >= 0 ;++1 x1868 -1 x2904 >= 0 ;++1 x1869 -1 x2905 >= 0 ;++1 x1870 -1 x2906 >= 0 ;++1 x1871 -1 x2907 >= 0 ;++1 x1872 -1 x2908 >= 0 ;++1 x1873 -1 x2909 >= 0 ;++1 x1874 -1 x2910 >= 0 ;++1 x1875 -1 x2911 >= 0 ;++1 x1876 -1 x2912 >= 0 ;++1 x1877 -1 x2913 >= 0 ;++1 x1878 >= 1 ;+-1 x2824 >= 0 ;++1 x1881 -1 x2825 >= 0 ;++1 x1882 -1 x2826 >= 0 ;++1 x1883 -1 x2827 >= 0 ;++1 x1884 -1 x2828 >= 0 ;++1 x1885 -1 x2829 >= 0 ;++1 x1886 -1 x2830 >= 0 ;++1 x1887 -1 x2831 >= 0 ;++1 x1888 -1 x2832 >= 0 ;++1 x1889 -1 x2833 >= 0 ;++1 x1890 -1 x2834 >= 0 ;++1 x1891 -1 x2835 >= 0 ;++1 x1892 -1 x2836 >= 0 ;++1 x1893 -1 x2837 >= 0 ;++1 x1894 -1 x2838 >= 0 ;++1 x1895 -1 x2839 >= 0 ;++1 x1896 -1 x2840 >= 0 ;++1 x1897 -1 x2841 >= 0 ;++1 x1898 -1 x2842 >= 0 ;++1 x1899 -1 x2843 >= 0 ;++1 x1900 -1 x2844 >= 0 ;++1 x1901 -1 x2845 >= 0 ;++1 x1902 -1 x2846 >= 0 ;++1 x1903 -1 x2847 >= 0 ;++1 x1904 -1 x2848 >= 0 ;++1 x1905 -1 x2849 >= 0 ;++1 x1906 -1 x2850 >= 0 ;++1 x1907 -1 x2851 >= 0 ;++1 x1908 -1 x2852 >= 0 ;++1 x1909 -1 x2853 >= 0 ;++1 x1910 -1 x2854 >= 0 ;++1 x1911 -1 x2855 >= 0 ;++1 x1912 -1 x2856 >= 0 ;++1 x1913 -1 x2857 >= 0 ;++1 x1914 -1 x2858 >= 0 ;++1 x1915 -1 x2859 >= 0 ;++1 x1916 -1 x2860 >= 0 ;++1 x1917 -1 x2861 >= 0 ;++1 x1918 -1 x2862 >= 0 ;++1 x1919 -1 x2863 >= 0 ;++1 x1920 -1 x2864 >= 0 ;++1 x1921 -1 x2865 >= 0 ;++1 x1922 -1 x2866 >= 0 ;++1 x1923 -1 x2867 >= 0 ;++1 x1924 -1 x2868 >= 0 ;++1 x1925 -1 x2869 >= 0 ;++1 x1926 -1 x2870 >= 0 ;++1 x1927 -1 x2871 >= 0 ;++1 x1928 -1 x2872 >= 0 ;++1 x1929 -1 x2873 >= 0 ;++1 x1930 -1 x2874 >= 0 ;++1 x1931 -1 x2875 >= 0 ;++1 x1932 -1 x2876 >= 0 ;++1 x1933 -1 x2877 >= 0 ;++1 x1934 -1 x2878 >= 0 ;++1 x1935 -1 x2879 >= 0 ;++1 x1936 -1 x2880 >= 0 ;++1 x1937 -1 x2881 >= 0 ;++1 x1938 -1 x2882 >= 0 ;++1 x1939 -1 x2883 >= 0 ;++1 x1940 -1 x2884 >= 0 ;++1 x1941 -1 x2885 >= 0 ;++1 x1942 -1 x2886 >= 0 ;++1 x1943 -1 x2887 >= 0 ;++1 x1944 -1 x2888 >= 0 ;++1 x1945 -1 x2889 >= 0 ;++1 x1946 -1 x2890 >= 0 ;++1 x1947 -1 x2891 >= 0 ;++1 x1948 -1 x2892 >= 0 ;++1 x1949 -1 x2893 >= 0 ;++1 x1950 -1 x2894 >= 0 ;++1 x1951 -1 x2895 >= 0 ;++1 x1952 -1 x2896 >= 0 ;++1 x1953 -1 x2897 >= 0 ;++1 x1954 -1 x2898 >= 0 ;++1 x1955 -1 x2899 >= 0 ;++1 x1956 -1 x2900 >= 0 ;++1 x1957 -1 x2901 >= 0 ;++1 x1958 -1 x2902 >= 0 ;++1 x1959 -1 x2903 >= 0 ;++1 x1960 -1 x2904 >= 0 ;++1 x1961 -1 x2905 >= 0 ;++1 x1962 -1 x2906 >= 0 ;++1 x1963 -1 x2907 >= 0 ;++1 x1964 -1 x2908 >= 0 ;++1 x1965 -1 x2909 >= 0 ;++1 x1966 -1 x2910 >= 0 ;++1 x1967 -1 x2911 >= 0 ;++1 x1968 -1 x2912 >= 0 ;++1 x1969 -1 x2913 >= 0 ;++1 x1970 >= 1 ;+-1 x2824 >= 0 ;++1 x1975 -1 x2825 >= 0 ;++1 x1976 -1 x2826 >= 0 ;++1 x1977 -1 x2827 >= 0 ;++1 x1978 -1 x2828 >= 0 ;++1 x1979 -1 x2829 >= 0 ;++1 x1980 -1 x2830 >= 0 ;++1 x1981 -1 x2831 >= 0 ;++1 x1982 -1 x2832 >= 0 ;++1 x1983 -1 x2833 >= 0 ;++1 x1984 -1 x2834 >= 0 ;++1 x1985 -1 x2835 >= 0 ;++1 x1986 -1 x2836 >= 0 ;++1 x1987 -1 x2837 >= 0 ;++1 x1988 -1 x2838 >= 0 ;++1 x1989 -1 x2839 >= 0 ;++1 x1990 -1 x2840 >= 0 ;++1 x1991 -1 x2841 >= 0 ;++1 x1992 -1 x2842 >= 0 ;++1 x1993 -1 x2843 >= 0 ;++1 x1994 -1 x2844 >= 0 ;++1 x1995 -1 x2845 >= 0 ;++1 x1996 -1 x2846 >= 0 ;++1 x1997 -1 x2847 >= 0 ;++1 x1998 -1 x2848 >= 0 ;++1 x1999 -1 x2849 >= 0 ;++1 x2000 -1 x2850 >= 0 ;++1 x2001 -1 x2851 >= 0 ;++1 x2002 -1 x2852 >= 0 ;++1 x2003 -1 x2853 >= 0 ;++1 x2004 -1 x2854 >= 0 ;++1 x2005 -1 x2855 >= 0 ;++1 x2006 -1 x2856 >= 0 ;++1 x2007 -1 x2857 >= 0 ;++1 x2008 -1 x2858 >= 0 ;++1 x2009 -1 x2859 >= 0 ;++1 x2010 -1 x2860 >= 0 ;++1 x2011 -1 x2861 >= 0 ;++1 x2012 -1 x2862 >= 0 ;++1 x2013 -1 x2863 >= 0 ;++1 x2014 -1 x2864 >= 0 ;++1 x2015 -1 x2865 >= 0 ;++1 x2016 -1 x2866 >= 0 ;++1 x2017 -1 x2867 >= 0 ;++1 x2018 -1 x2868 >= 0 ;++1 x2019 -1 x2869 >= 0 ;++1 x2020 -1 x2870 >= 0 ;++1 x2021 -1 x2871 >= 0 ;++1 x2022 -1 x2872 >= 0 ;++1 x2023 -1 x2873 >= 0 ;++1 x2024 -1 x2874 >= 0 ;++1 x2025 -1 x2875 >= 0 ;++1 x2026 -1 x2876 >= 0 ;++1 x2027 -1 x2877 >= 0 ;++1 x2028 -1 x2878 >= 0 ;++1 x2029 -1 x2879 >= 0 ;++1 x2030 -1 x2880 >= 0 ;++1 x2031 -1 x2881 >= 0 ;++1 x2032 -1 x2882 >= 0 ;++1 x2033 -1 x2883 >= 0 ;++1 x2034 -1 x2884 >= 0 ;++1 x2035 -1 x2885 >= 0 ;++1 x2036 -1 x2886 >= 0 ;++1 x2037 -1 x2887 >= 0 ;++1 x2038 -1 x2888 >= 0 ;++1 x2039 -1 x2889 >= 0 ;++1 x2040 -1 x2890 >= 0 ;++1 x2041 -1 x2891 >= 0 ;++1 x2042 -1 x2892 >= 0 ;++1 x2043 -1 x2893 >= 0 ;++1 x2044 -1 x2894 >= 0 ;++1 x2045 -1 x2895 >= 0 ;++1 x2046 -1 x2896 >= 0 ;++1 x2047 -1 x2897 >= 0 ;++1 x2048 -1 x2898 >= 0 ;++1 x2049 -1 x2899 >= 0 ;++1 x2050 -1 x2900 >= 0 ;++1 x2051 -1 x2901 >= 0 ;++1 x2052 -1 x2902 >= 0 ;++1 x2053 -1 x2903 >= 0 ;++1 x2054 -1 x2904 >= 0 ;++1 x2055 -1 x2905 >= 0 ;++1 x2056 -1 x2906 >= 0 ;++1 x2057 -1 x2907 >= 0 ;++1 x2058 -1 x2908 >= 0 ;++1 x2059 -1 x2909 >= 0 ;++1 x2060 -1 x2910 >= 0 ;++1 x2061 -1 x2911 >= 0 ;++1 x2062 -1 x2912 >= 0 ;++1 x2063 -1 x2913 >= 0 ;++1 x2064 >= 1 ;+-1 x2827 >= 0 ;++1 x2069 -1 x2828 >= 0 ;++1 x2070 -1 x2829 >= 0 ;++1 x2071 -1 x2830 >= 0 ;++1 x2072 -1 x2831 >= 0 ;++1 x2073 -1 x2832 >= 0 ;++1 x2074 -1 x2833 >= 0 ;++1 x2075 -1 x2834 >= 0 ;++1 x2076 -1 x2835 >= 0 ;++1 x2077 -1 x2836 >= 0 ;++1 x2078 -1 x2837 >= 0 ;++1 x2079 -1 x2838 >= 0 ;++1 x2080 -1 x2839 >= 0 ;++1 x2081 -1 x2840 >= 0 ;++1 x2082 -1 x2841 >= 0 ;++1 x2083 -1 x2842 >= 0 ;++1 x2084 -1 x2843 >= 0 ;++1 x2085 -1 x2844 >= 0 ;++1 x2086 -1 x2845 >= 0 ;++1 x2087 -1 x2846 >= 0 ;++1 x2088 -1 x2847 >= 0 ;++1 x2089 -1 x2848 >= 0 ;++1 x2090 -1 x2849 >= 0 ;++1 x2091 -1 x2850 >= 0 ;++1 x2092 -1 x2851 >= 0 ;++1 x2093 -1 x2852 >= 0 ;++1 x2094 -1 x2853 >= 0 ;++1 x2095 -1 x2854 >= 0 ;++1 x2096 -1 x2855 >= 0 ;++1 x2097 -1 x2856 >= 0 ;++1 x2098 -1 x2857 >= 0 ;++1 x2099 -1 x2858 >= 0 ;++1 x2100 -1 x2859 >= 0 ;++1 x2101 -1 x2860 >= 0 ;++1 x2102 -1 x2861 >= 0 ;++1 x2103 -1 x2862 >= 0 ;++1 x2104 -1 x2863 >= 0 ;++1 x2105 -1 x2864 >= 0 ;++1 x2106 -1 x2865 >= 0 ;++1 x2107 -1 x2866 >= 0 ;++1 x2108 -1 x2867 >= 0 ;++1 x2109 -1 x2868 >= 0 ;++1 x2110 -1 x2869 >= 0 ;++1 x2111 -1 x2870 >= 0 ;++1 x2112 -1 x2871 >= 0 ;++1 x2113 -1 x2872 >= 0 ;++1 x2114 -1 x2873 >= 0 ;++1 x2115 -1 x2874 >= 0 ;++1 x2116 -1 x2875 >= 0 ;++1 x2117 -1 x2876 >= 0 ;++1 x2118 -1 x2877 >= 0 ;++1 x2119 -1 x2878 >= 0 ;++1 x2120 -1 x2879 >= 0 ;++1 x2121 -1 x2880 >= 0 ;++1 x2122 -1 x2881 >= 0 ;++1 x2123 -1 x2882 >= 0 ;++1 x2124 -1 x2883 >= 0 ;++1 x2125 -1 x2884 >= 0 ;++1 x2126 -1 x2885 >= 0 ;++1 x2127 -1 x2886 >= 0 ;++1 x2128 -1 x2887 >= 0 ;++1 x2129 -1 x2888 >= 0 ;++1 x2130 -1 x2889 >= 0 ;++1 x2131 -1 x2890 >= 0 ;++1 x2132 -1 x2891 >= 0 ;++1 x2133 -1 x2892 >= 0 ;++1 x2134 -1 x2893 >= 0 ;++1 x2135 -1 x2894 >= 0 ;++1 x2136 -1 x2895 >= 0 ;++1 x2137 -1 x2896 >= 0 ;++1 x2138 -1 x2897 >= 0 ;++1 x2139 -1 x2898 >= 0 ;++1 x2140 -1 x2899 >= 0 ;++1 x2141 -1 x2900 >= 0 ;++1 x2142 -1 x2901 >= 0 ;++1 x2143 -1 x2902 >= 0 ;++1 x2144 -1 x2903 >= 0 ;++1 x2145 -1 x2904 >= 0 ;++1 x2146 -1 x2905 >= 0 ;++1 x2147 -1 x2906 >= 0 ;++1 x2148 -1 x2907 >= 0 ;++1 x2149 -1 x2908 >= 0 ;++1 x2150 -1 x2909 >= 0 ;++1 x2151 -1 x2910 >= 0 ;++1 x2152 -1 x2911 >= 0 ;++1 x2153 -1 x2912 >= 0 ;++1 x2154 -1 x2913 >= 0 ;++1 x2155 >= 1 ;+-1 x2823 >= 0 ;++1 x2163 -1 x2824 >= 0 ;++1 x2164 -1 x2825 >= 0 ;++1 x2165 -1 x2826 >= 0 ;++1 x2166 -1 x2827 >= 0 ;++1 x2167 -1 x2828 >= 0 ;++1 x2168 -1 x2829 >= 0 ;++1 x2169 -1 x2830 >= 0 ;++1 x2170 -1 x2831 >= 0 ;++1 x2171 -1 x2832 >= 0 ;++1 x2172 -1 x2833 >= 0 ;++1 x2173 -1 x2834 >= 0 ;++1 x2174 -1 x2835 >= 0 ;++1 x2175 -1 x2836 >= 0 ;++1 x2176 -1 x2837 >= 0 ;++1 x2177 -1 x2838 >= 0 ;++1 x2178 -1 x2839 >= 0 ;++1 x2179 -1 x2840 >= 0 ;++1 x2180 -1 x2841 >= 0 ;++1 x2181 -1 x2842 >= 0 ;++1 x2182 -1 x2843 >= 0 ;++1 x2183 -1 x2844 >= 0 ;++1 x2184 -1 x2845 >= 0 ;++1 x2185 -1 x2846 >= 0 ;++1 x2186 -1 x2847 >= 0 ;++1 x2187 -1 x2848 >= 0 ;++1 x2188 -1 x2849 >= 0 ;++1 x2189 -1 x2850 >= 0 ;++1 x2190 -1 x2851 >= 0 ;++1 x2191 -1 x2852 >= 0 ;++1 x2192 -1 x2853 >= 0 ;++1 x2193 -1 x2854 >= 0 ;++1 x2194 -1 x2855 >= 0 ;++1 x2195 -1 x2856 >= 0 ;++1 x2196 -1 x2857 >= 0 ;++1 x2197 -1 x2858 >= 0 ;++1 x2198 -1 x2859 >= 0 ;++1 x2199 -1 x2860 >= 0 ;++1 x2200 -1 x2861 >= 0 ;++1 x2201 -1 x2862 >= 0 ;++1 x2202 -1 x2863 >= 0 ;++1 x2203 -1 x2864 >= 0 ;++1 x2204 -1 x2865 >= 0 ;++1 x2205 -1 x2866 >= 0 ;++1 x2206 -1 x2867 >= 0 ;++1 x2207 -1 x2868 >= 0 ;++1 x2208 -1 x2869 >= 0 ;++1 x2209 -1 x2870 >= 0 ;++1 x2210 -1 x2871 >= 0 ;++1 x2211 -1 x2872 >= 0 ;++1 x2212 -1 x2873 >= 0 ;++1 x2213 -1 x2874 >= 0 ;++1 x2214 -1 x2875 >= 0 ;++1 x2215 -1 x2876 >= 0 ;++1 x2216 -1 x2877 >= 0 ;++1 x2217 -1 x2878 >= 0 ;++1 x2218 -1 x2879 >= 0 ;++1 x2219 -1 x2880 >= 0 ;++1 x2220 -1 x2881 >= 0 ;++1 x2221 -1 x2882 >= 0 ;++1 x2222 -1 x2883 >= 0 ;++1 x2223 -1 x2884 >= 0 ;++1 x2224 -1 x2885 >= 0 ;++1 x2225 -1 x2886 >= 0 ;++1 x2226 -1 x2887 >= 0 ;++1 x2227 -1 x2888 >= 0 ;++1 x2228 -1 x2889 >= 0 ;++1 x2229 -1 x2890 >= 0 ;++1 x2230 -1 x2891 >= 0 ;++1 x2231 -1 x2892 >= 0 ;++1 x2232 -1 x2893 >= 0 ;++1 x2233 -1 x2894 >= 0 ;++1 x2234 -1 x2895 >= 0 ;++1 x2235 -1 x2896 >= 0 ;++1 x2236 -1 x2897 >= 0 ;++1 x2237 -1 x2898 >= 0 ;++1 x2238 -1 x2899 >= 0 ;++1 x2239 -1 x2900 >= 0 ;++1 x2240 -1 x2901 >= 0 ;++1 x2241 -1 x2902 >= 0 ;++1 x2242 -1 x2903 >= 0 ;++1 x2243 -1 x2904 >= 0 ;++1 x2244 -1 x2905 >= 0 ;++1 x2245 -1 x2906 >= 0 ;++1 x2246 -1 x2907 >= 0 ;++1 x2247 -1 x2908 >= 0 ;++1 x2248 -1 x2909 >= 0 ;++1 x2249 -1 x2910 >= 0 ;++1 x2250 -1 x2911 >= 0 ;++1 x2251 -1 x2912 >= 0 ;++1 x2252 -1 x2913 >= 0 ;++1 x2253 >= 1 ;+-1 x2829 >= 0 ;++1 x2257 -1 x2830 >= 0 ;++1 x2258 -1 x2831 >= 0 ;++1 x2259 -1 x2832 >= 0 ;++1 x2260 -1 x2833 >= 0 ;++1 x2261 -1 x2834 >= 0 ;++1 x2262 -1 x2835 >= 0 ;++1 x2263 -1 x2836 >= 0 ;++1 x2264 -1 x2837 >= 0 ;++1 x2265 -1 x2838 >= 0 ;++1 x2266 -1 x2839 >= 0 ;++1 x2267 -1 x2840 >= 0 ;++1 x2268 -1 x2841 >= 0 ;++1 x2269 -1 x2842 >= 0 ;++1 x2270 -1 x2843 >= 0 ;++1 x2271 -1 x2844 >= 0 ;++1 x2272 -1 x2845 >= 0 ;++1 x2273 -1 x2846 >= 0 ;++1 x2274 -1 x2847 >= 0 ;++1 x2275 -1 x2848 >= 0 ;++1 x2276 -1 x2849 >= 0 ;++1 x2277 -1 x2850 >= 0 ;++1 x2278 -1 x2851 >= 0 ;++1 x2279 -1 x2852 >= 0 ;++1 x2280 -1 x2853 >= 0 ;++1 x2281 -1 x2854 >= 0 ;++1 x2282 -1 x2855 >= 0 ;++1 x2283 -1 x2856 >= 0 ;++1 x2284 -1 x2857 >= 0 ;++1 x2285 -1 x2858 >= 0 ;++1 x2286 -1 x2859 >= 0 ;++1 x2287 -1 x2860 >= 0 ;++1 x2288 -1 x2861 >= 0 ;++1 x2289 -1 x2862 >= 0 ;++1 x2290 -1 x2863 >= 0 ;++1 x2291 -1 x2864 >= 0 ;++1 x2292 -1 x2865 >= 0 ;++1 x2293 -1 x2866 >= 0 ;++1 x2294 -1 x2867 >= 0 ;++1 x2295 -1 x2868 >= 0 ;++1 x2296 -1 x2869 >= 0 ;++1 x2297 -1 x2870 >= 0 ;++1 x2298 -1 x2871 >= 0 ;++1 x2299 -1 x2872 >= 0 ;++1 x2300 -1 x2873 >= 0 ;++1 x2301 -1 x2874 >= 0 ;++1 x2302 -1 x2875 >= 0 ;++1 x2303 -1 x2876 >= 0 ;++1 x2304 -1 x2877 >= 0 ;++1 x2305 -1 x2878 >= 0 ;++1 x2306 -1 x2879 >= 0 ;++1 x2307 -1 x2880 >= 0 ;++1 x2308 -1 x2881 >= 0 ;++1 x2309 -1 x2882 >= 0 ;++1 x2310 -1 x2883 >= 0 ;++1 x2311 -1 x2884 >= 0 ;++1 x2312 -1 x2885 >= 0 ;++1 x2313 -1 x2886 >= 0 ;++1 x2314 -1 x2887 >= 0 ;++1 x2315 -1 x2888 >= 0 ;++1 x2316 -1 x2889 >= 0 ;++1 x2317 -1 x2890 >= 0 ;++1 x2318 -1 x2891 >= 0 ;++1 x2319 -1 x2892 >= 0 ;++1 x2320 -1 x2893 >= 0 ;++1 x2321 -1 x2894 >= 0 ;++1 x2322 -1 x2895 >= 0 ;++1 x2323 -1 x2896 >= 0 ;++1 x2324 -1 x2897 >= 0 ;++1 x2325 -1 x2898 >= 0 ;++1 x2326 -1 x2899 >= 0 ;++1 x2327 -1 x2900 >= 0 ;++1 x2328 -1 x2901 >= 0 ;++1 x2329 -1 x2902 >= 0 ;++1 x2330 -1 x2903 >= 0 ;++1 x2331 -1 x2904 >= 0 ;++1 x2332 -1 x2905 >= 0 ;++1 x2333 -1 x2906 >= 0 ;++1 x2334 -1 x2907 >= 0 ;++1 x2335 -1 x2908 >= 0 ;++1 x2336 -1 x2909 >= 0 ;++1 x2337 -1 x2910 >= 0 ;++1 x2338 -1 x2911 >= 0 ;++1 x2339 -1 x2912 >= 0 ;++1 x2340 -1 x2913 >= 0 ;++1 x2341 >= 1 ;+-1 x2824 >= 0 ;++1 x2351 -1 x2825 >= 0 ;++1 x2352 -1 x2826 >= 0 ;++1 x2353 -1 x2827 >= 0 ;++1 x2354 -1 x2828 >= 0 ;++1 x2355 -1 x2829 >= 0 ;++1 x2356 -1 x2830 >= 0 ;++1 x2357 -1 x2831 >= 0 ;++1 x2358 -1 x2832 >= 0 ;++1 x2359 -1 x2833 >= 0 ;++1 x2360 -1 x2834 >= 0 ;++1 x2361 -1 x2835 >= 0 ;++1 x2362 -1 x2836 >= 0 ;++1 x2363 -1 x2837 >= 0 ;++1 x2364 -1 x2838 >= 0 ;++1 x2365 -1 x2839 >= 0 ;++1 x2366 -1 x2840 >= 0 ;++1 x2367 -1 x2841 >= 0 ;++1 x2368 -1 x2842 >= 0 ;++1 x2369 -1 x2843 >= 0 ;++1 x2370 -1 x2844 >= 0 ;++1 x2371 -1 x2845 >= 0 ;++1 x2372 -1 x2846 >= 0 ;++1 x2373 -1 x2847 >= 0 ;++1 x2374 -1 x2848 >= 0 ;++1 x2375 -1 x2849 >= 0 ;++1 x2376 -1 x2850 >= 0 ;++1 x2377 -1 x2851 >= 0 ;++1 x2378 -1 x2852 >= 0 ;++1 x2379 -1 x2853 >= 0 ;++1 x2380 -1 x2854 >= 0 ;++1 x2381 -1 x2855 >= 0 ;++1 x2382 -1 x2856 >= 0 ;++1 x2383 -1 x2857 >= 0 ;++1 x2384 -1 x2858 >= 0 ;++1 x2385 -1 x2859 >= 0 ;++1 x2386 -1 x2860 >= 0 ;++1 x2387 -1 x2861 >= 0 ;++1 x2388 -1 x2862 >= 0 ;++1 x2389 -1 x2863 >= 0 ;++1 x2390 -1 x2864 >= 0 ;++1 x2391 -1 x2865 >= 0 ;++1 x2392 -1 x2866 >= 0 ;++1 x2393 -1 x2867 >= 0 ;++1 x2394 -1 x2868 >= 0 ;++1 x2395 -1 x2869 >= 0 ;++1 x2396 -1 x2870 >= 0 ;++1 x2397 -1 x2871 >= 0 ;++1 x2398 -1 x2872 >= 0 ;++1 x2399 -1 x2873 >= 0 ;++1 x2400 -1 x2874 >= 0 ;++1 x2401 -1 x2875 >= 0 ;++1 x2402 -1 x2876 >= 0 ;++1 x2403 -1 x2877 >= 0 ;++1 x2404 -1 x2878 >= 0 ;++1 x2405 -1 x2879 >= 0 ;++1 x2406 -1 x2880 >= 0 ;++1 x2407 -1 x2881 >= 0 ;++1 x2408 -1 x2882 >= 0 ;++1 x2409 -1 x2883 >= 0 ;++1 x2410 -1 x2884 >= 0 ;++1 x2411 -1 x2885 >= 0 ;++1 x2412 -1 x2886 >= 0 ;++1 x2413 -1 x2887 >= 0 ;++1 x2414 -1 x2888 >= 0 ;++1 x2415 -1 x2889 >= 0 ;++1 x2416 -1 x2890 >= 0 ;++1 x2417 -1 x2891 >= 0 ;++1 x2418 -1 x2892 >= 0 ;++1 x2419 -1 x2893 >= 0 ;++1 x2420 -1 x2894 >= 0 ;++1 x2421 -1 x2895 >= 0 ;++1 x2422 -1 x2896 >= 0 ;++1 x2423 -1 x2897 >= 0 ;++1 x2424 -1 x2898 >= 0 ;++1 x2425 -1 x2899 >= 0 ;++1 x2426 -1 x2900 >= 0 ;++1 x2427 -1 x2901 >= 0 ;++1 x2428 -1 x2902 >= 0 ;++1 x2429 -1 x2903 >= 0 ;++1 x2430 -1 x2904 >= 0 ;++1 x2431 -1 x2905 >= 0 ;++1 x2432 -1 x2906 >= 0 ;++1 x2433 -1 x2907 >= 0 ;++1 x2434 -1 x2908 >= 0 ;++1 x2435 -1 x2909 >= 0 ;++1 x2436 -1 x2910 >= 0 ;++1 x2437 -1 x2911 >= 0 ;++1 x2438 -1 x2912 >= 0 ;++1 x2439 -1 x2913 >= 0 ;++1 x2440 >= 1 ;+-1 x2823 >= 0 ;++1 x2445 -1 x2824 >= 0 ;++1 x2446 -1 x2825 >= 0 ;++1 x2447 -1 x2826 >= 0 ;++1 x2448 -1 x2827 >= 0 ;++1 x2449 -1 x2828 >= 0 ;++1 x2450 -1 x2829 >= 0 ;++1 x2451 -1 x2830 >= 0 ;++1 x2452 -1 x2831 >= 0 ;++1 x2453 -1 x2832 >= 0 ;++1 x2454 -1 x2833 >= 0 ;++1 x2455 -1 x2834 >= 0 ;++1 x2456 -1 x2835 >= 0 ;++1 x2457 -1 x2836 >= 0 ;++1 x2458 -1 x2837 >= 0 ;++1 x2459 -1 x2838 >= 0 ;++1 x2460 -1 x2839 >= 0 ;++1 x2461 -1 x2840 >= 0 ;++1 x2462 -1 x2841 >= 0 ;++1 x2463 -1 x2842 >= 0 ;++1 x2464 -1 x2843 >= 0 ;++1 x2465 -1 x2844 >= 0 ;++1 x2466 -1 x2845 >= 0 ;++1 x2467 -1 x2846 >= 0 ;++1 x2468 -1 x2847 >= 0 ;++1 x2469 -1 x2848 >= 0 ;++1 x2470 -1 x2849 >= 0 ;++1 x2471 -1 x2850 >= 0 ;++1 x2472 -1 x2851 >= 0 ;++1 x2473 -1 x2852 >= 0 ;++1 x2474 -1 x2853 >= 0 ;++1 x2475 -1 x2854 >= 0 ;++1 x2476 -1 x2855 >= 0 ;++1 x2477 -1 x2856 >= 0 ;++1 x2478 -1 x2857 >= 0 ;++1 x2479 -1 x2858 >= 0 ;++1 x2480 -1 x2859 >= 0 ;++1 x2481 -1 x2860 >= 0 ;++1 x2482 -1 x2861 >= 0 ;++1 x2483 -1 x2862 >= 0 ;++1 x2484 -1 x2863 >= 0 ;++1 x2485 -1 x2864 >= 0 ;++1 x2486 -1 x2865 >= 0 ;++1 x2487 -1 x2866 >= 0 ;++1 x2488 -1 x2867 >= 0 ;++1 x2489 -1 x2868 >= 0 ;++1 x2490 -1 x2869 >= 0 ;++1 x2491 -1 x2870 >= 0 ;++1 x2492 -1 x2871 >= 0 ;++1 x2493 -1 x2872 >= 0 ;++1 x2494 -1 x2873 >= 0 ;++1 x2495 -1 x2874 >= 0 ;++1 x2496 -1 x2875 >= 0 ;++1 x2497 -1 x2876 >= 0 ;++1 x2498 -1 x2877 >= 0 ;++1 x2499 -1 x2878 >= 0 ;++1 x2500 -1 x2879 >= 0 ;++1 x2501 -1 x2880 >= 0 ;++1 x2502 -1 x2881 >= 0 ;++1 x2503 -1 x2882 >= 0 ;++1 x2504 -1 x2883 >= 0 ;++1 x2505 -1 x2884 >= 0 ;++1 x2506 -1 x2885 >= 0 ;++1 x2507 -1 x2886 >= 0 ;++1 x2508 -1 x2887 >= 0 ;++1 x2509 -1 x2888 >= 0 ;++1 x2510 -1 x2889 >= 0 ;++1 x2511 -1 x2890 >= 0 ;++1 x2512 -1 x2891 >= 0 ;++1 x2513 -1 x2892 >= 0 ;++1 x2514 -1 x2893 >= 0 ;++1 x2515 -1 x2894 >= 0 ;++1 x2516 -1 x2895 >= 0 ;++1 x2517 -1 x2896 >= 0 ;++1 x2518 -1 x2897 >= 0 ;++1 x2519 -1 x2898 >= 0 ;++1 x2520 -1 x2899 >= 0 ;++1 x2521 -1 x2900 >= 0 ;++1 x2522 -1 x2901 >= 0 ;++1 x2523 -1 x2902 >= 0 ;++1 x2524 -1 x2903 >= 0 ;++1 x2525 -1 x2904 >= 0 ;++1 x2526 -1 x2905 >= 0 ;++1 x2527 -1 x2906 >= 0 ;++1 x2528 -1 x2907 >= 0 ;++1 x2529 -1 x2908 >= 0 ;++1 x2530 -1 x2909 >= 0 ;++1 x2531 -1 x2910 >= 0 ;++1 x2532 -1 x2911 >= 0 ;++1 x2533 -1 x2912 >= 0 ;++1 x2534 -1 x2913 >= 0 ;++1 x2535 >= 1 ;+-1 x2822 >= 0 ;++1 x2539 -1 x2823 >= 0 ;++1 x2540 -1 x2824 >= 0 ;++1 x2541 -1 x2825 >= 0 ;++1 x2542 -1 x2826 >= 0 ;++1 x2543 -1 x2827 >= 0 ;++1 x2544 -1 x2828 >= 0 ;++1 x2545 -1 x2829 >= 0 ;++1 x2546 -1 x2830 >= 0 ;++1 x2547 -1 x2831 >= 0 ;++1 x2548 -1 x2832 >= 0 ;++1 x2549 -1 x2833 >= 0 ;++1 x2550 -1 x2834 >= 0 ;++1 x2551 -1 x2835 >= 0 ;++1 x2552 -1 x2836 >= 0 ;++1 x2553 -1 x2837 >= 0 ;++1 x2554 -1 x2838 >= 0 ;++1 x2555 -1 x2839 >= 0 ;++1 x2556 -1 x2840 >= 0 ;++1 x2557 -1 x2841 >= 0 ;++1 x2558 -1 x2842 >= 0 ;++1 x2559 -1 x2843 >= 0 ;++1 x2560 -1 x2844 >= 0 ;++1 x2561 -1 x2845 >= 0 ;++1 x2562 -1 x2846 >= 0 ;++1 x2563 -1 x2847 >= 0 ;++1 x2564 -1 x2848 >= 0 ;++1 x2565 -1 x2849 >= 0 ;++1 x2566 -1 x2850 >= 0 ;++1 x2567 -1 x2851 >= 0 ;++1 x2568 -1 x2852 >= 0 ;++1 x2569 -1 x2853 >= 0 ;++1 x2570 -1 x2854 >= 0 ;++1 x2571 -1 x2855 >= 0 ;++1 x2572 -1 x2856 >= 0 ;++1 x2573 -1 x2857 >= 0 ;++1 x2574 -1 x2858 >= 0 ;++1 x2575 -1 x2859 >= 0 ;++1 x2576 -1 x2860 >= 0 ;++1 x2577 -1 x2861 >= 0 ;++1 x2578 -1 x2862 >= 0 ;++1 x2579 -1 x2863 >= 0 ;++1 x2580 -1 x2864 >= 0 ;++1 x2581 -1 x2865 >= 0 ;++1 x2582 -1 x2866 >= 0 ;++1 x2583 -1 x2867 >= 0 ;++1 x2584 -1 x2868 >= 0 ;++1 x2585 -1 x2869 >= 0 ;++1 x2586 -1 x2870 >= 0 ;++1 x2587 -1 x2871 >= 0 ;++1 x2588 -1 x2872 >= 0 ;++1 x2589 -1 x2873 >= 0 ;++1 x2590 -1 x2874 >= 0 ;++1 x2591 -1 x2875 >= 0 ;++1 x2592 -1 x2876 >= 0 ;++1 x2593 -1 x2877 >= 0 ;++1 x2594 -1 x2878 >= 0 ;++1 x2595 -1 x2879 >= 0 ;++1 x2596 -1 x2880 >= 0 ;++1 x2597 -1 x2881 >= 0 ;++1 x2598 -1 x2882 >= 0 ;++1 x2599 -1 x2883 >= 0 ;++1 x2600 -1 x2884 >= 0 ;++1 x2601 -1 x2885 >= 0 ;++1 x2602 -1 x2886 >= 0 ;++1 x2603 -1 x2887 >= 0 ;++1 x2604 -1 x2888 >= 0 ;++1 x2605 -1 x2889 >= 0 ;++1 x2606 -1 x2890 >= 0 ;++1 x2607 -1 x2891 >= 0 ;++1 x2608 -1 x2892 >= 0 ;++1 x2609 -1 x2893 >= 0 ;++1 x2610 -1 x2894 >= 0 ;++1 x2611 -1 x2895 >= 0 ;++1 x2612 -1 x2896 >= 0 ;++1 x2613 -1 x2897 >= 0 ;++1 x2614 -1 x2898 >= 0 ;++1 x2615 -1 x2899 >= 0 ;++1 x2616 -1 x2900 >= 0 ;++1 x2617 -1 x2901 >= 0 ;++1 x2618 -1 x2902 >= 0 ;++1 x2619 -1 x2903 >= 0 ;++1 x2620 -1 x2904 >= 0 ;++1 x2621 -1 x2905 >= 0 ;++1 x2622 -1 x2906 >= 0 ;++1 x2623 -1 x2907 >= 0 ;++1 x2624 -1 x2908 >= 0 ;++1 x2625 -1 x2909 >= 0 ;++1 x2626 -1 x2910 >= 0 ;++1 x2627 -1 x2911 >= 0 ;++1 x2628 -1 x2912 >= 0 ;++1 x2629 -1 x2913 >= 0 ;++1 x2630 >= 1 ;+-1 x2821 >= 0 ;++1 x2633 -1 x2822 >= 0 ;++1 x2634 -1 x2823 >= 0 ;++1 x2635 -1 x2824 >= 0 ;++1 x2636 -1 x2825 >= 0 ;++1 x2637 -1 x2826 >= 0 ;++1 x2638 -1 x2827 >= 0 ;++1 x2639 -1 x2828 >= 0 ;++1 x2640 -1 x2829 >= 0 ;++1 x2641 -1 x2830 >= 0 ;++1 x2642 -1 x2831 >= 0 ;++1 x2643 -1 x2832 >= 0 ;++1 x2644 -1 x2833 >= 0 ;++1 x2645 -1 x2834 >= 0 ;++1 x2646 -1 x2835 >= 0 ;++1 x2647 -1 x2836 >= 0 ;++1 x2648 -1 x2837 >= 0 ;++1 x2649 -1 x2838 >= 0 ;++1 x2650 -1 x2839 >= 0 ;++1 x2651 -1 x2840 >= 0 ;++1 x2652 -1 x2841 >= 0 ;++1 x2653 -1 x2842 >= 0 ;++1 x2654 -1 x2843 >= 0 ;++1 x2655 -1 x2844 >= 0 ;++1 x2656 -1 x2845 >= 0 ;++1 x2657 -1 x2846 >= 0 ;++1 x2658 -1 x2847 >= 0 ;++1 x2659 -1 x2848 >= 0 ;++1 x2660 -1 x2849 >= 0 ;++1 x2661 -1 x2850 >= 0 ;++1 x2662 -1 x2851 >= 0 ;++1 x2663 -1 x2852 >= 0 ;++1 x2664 -1 x2853 >= 0 ;++1 x2665 -1 x2854 >= 0 ;++1 x2666 -1 x2855 >= 0 ;++1 x2667 -1 x2856 >= 0 ;++1 x2668 -1 x2857 >= 0 ;++1 x2669 -1 x2858 >= 0 ;++1 x2670 -1 x2859 >= 0 ;++1 x2671 -1 x2860 >= 0 ;++1 x2672 -1 x2861 >= 0 ;++1 x2673 -1 x2862 >= 0 ;++1 x2674 -1 x2863 >= 0 ;++1 x2675 -1 x2864 >= 0 ;++1 x2676 -1 x2865 >= 0 ;++1 x2677 -1 x2866 >= 0 ;++1 x2678 -1 x2867 >= 0 ;++1 x2679 -1 x2868 >= 0 ;++1 x2680 -1 x2869 >= 0 ;++1 x2681 -1 x2870 >= 0 ;++1 x2682 -1 x2871 >= 0 ;++1 x2683 -1 x2872 >= 0 ;++1 x2684 -1 x2873 >= 0 ;++1 x2685 -1 x2874 >= 0 ;++1 x2686 -1 x2875 >= 0 ;++1 x2687 -1 x2876 >= 0 ;++1 x2688 -1 x2877 >= 0 ;++1 x2689 -1 x2878 >= 0 ;++1 x2690 -1 x2879 >= 0 ;++1 x2691 -1 x2880 >= 0 ;++1 x2692 -1 x2881 >= 0 ;++1 x2693 -1 x2882 >= 0 ;++1 x2694 -1 x2883 >= 0 ;++1 x2695 -1 x2884 >= 0 ;++1 x2696 -1 x2885 >= 0 ;++1 x2697 -1 x2886 >= 0 ;++1 x2698 -1 x2887 >= 0 ;++1 x2699 -1 x2888 >= 0 ;++1 x2700 -1 x2889 >= 0 ;++1 x2701 -1 x2890 >= 0 ;++1 x2702 -1 x2891 >= 0 ;++1 x2703 -1 x2892 >= 0 ;++1 x2704 -1 x2893 >= 0 ;++1 x2705 -1 x2894 >= 0 ;++1 x2706 -1 x2895 >= 0 ;++1 x2707 -1 x2896 >= 0 ;++1 x2708 -1 x2897 >= 0 ;++1 x2709 -1 x2898 >= 0 ;++1 x2710 -1 x2899 >= 0 ;++1 x2711 -1 x2900 >= 0 ;++1 x2712 -1 x2901 >= 0 ;++1 x2713 -1 x2902 >= 0 ;++1 x2714 -1 x2903 >= 0 ;++1 x2715 -1 x2904 >= 0 ;++1 x2716 -1 x2905 >= 0 ;++1 x2717 -1 x2906 >= 0 ;++1 x2718 -1 x2907 >= 0 ;++1 x2719 -1 x2908 >= 0 ;++1 x2720 -1 x2909 >= 0 ;++1 x2721 -1 x2910 >= 0 ;++1 x2722 -1 x2911 >= 0 ;++1 x2723 -1 x2912 >= 0 ;++1 x2724 -1 x2913 >= 0 ;++1 x2725 >= 1 ;+-1 x2829 >= 0 ;++1 x2727 -1 x2830 >= 0 ;++1 x2728 -1 x2831 >= 0 ;++1 x2729 -1 x2832 >= 0 ;++1 x2730 -1 x2833 >= 0 ;++1 x2731 -1 x2834 >= 0 ;++1 x2732 -1 x2835 >= 0 ;++1 x2733 -1 x2836 >= 0 ;++1 x2734 -1 x2837 >= 0 ;++1 x2735 -1 x2838 >= 0 ;++1 x2736 -1 x2839 >= 0 ;++1 x2737 -1 x2840 >= 0 ;++1 x2738 -1 x2841 >= 0 ;++1 x2739 -1 x2842 >= 0 ;++1 x2740 -1 x2843 >= 0 ;++1 x2741 -1 x2844 >= 0 ;++1 x2742 -1 x2845 >= 0 ;++1 x2743 -1 x2846 >= 0 ;++1 x2744 -1 x2847 >= 0 ;++1 x2745 -1 x2848 >= 0 ;++1 x2746 -1 x2849 >= 0 ;++1 x2747 -1 x2850 >= 0 ;++1 x2748 -1 x2851 >= 0 ;++1 x2749 -1 x2852 >= 0 ;++1 x2750 -1 x2853 >= 0 ;++1 x2751 -1 x2854 >= 0 ;++1 x2752 -1 x2855 >= 0 ;++1 x2753 -1 x2856 >= 0 ;++1 x2754 -1 x2857 >= 0 ;++1 x2755 -1 x2858 >= 0 ;++1 x2756 -1 x2859 >= 0 ;++1 x2757 -1 x2860 >= 0 ;++1 x2758 -1 x2861 >= 0 ;++1 x2759 -1 x2862 >= 0 ;++1 x2760 -1 x2863 >= 0 ;++1 x2761 -1 x2864 >= 0 ;++1 x2762 -1 x2865 >= 0 ;++1 x2763 -1 x2866 >= 0 ;++1 x2764 -1 x2867 >= 0 ;++1 x2765 -1 x2868 >= 0 ;++1 x2766 -1 x2869 >= 0 ;++1 x2767 -1 x2870 >= 0 ;++1 x2768 -1 x2871 >= 0 ;++1 x2769 -1 x2872 >= 0 ;++1 x2770 -1 x2873 >= 0 ;++1 x2771 -1 x2874 >= 0 ;++1 x2772 -1 x2875 >= 0 ;++1 x2773 -1 x2876 >= 0 ;++1 x2774 -1 x2877 >= 0 ;++1 x2775 -1 x2878 >= 0 ;++1 x2776 -1 x2879 >= 0 ;++1 x2777 -1 x2880 >= 0 ;++1 x2778 -1 x2881 >= 0 ;++1 x2779 -1 x2882 >= 0 ;++1 x2780 -1 x2883 >= 0 ;++1 x2781 -1 x2884 >= 0 ;++1 x2782 -1 x2885 >= 0 ;++1 x2783 -1 x2886 >= 0 ;++1 x2784 -1 x2887 >= 0 ;++1 x2785 -1 x2888 >= 0 ;++1 x2786 -1 x2889 >= 0 ;++1 x2787 -1 x2890 >= 0 ;++1 x2788 -1 x2891 >= 0 ;++1 x2789 -1 x2892 >= 0 ;++1 x2790 -1 x2893 >= 0 ;++1 x2791 -1 x2894 >= 0 ;++1 x2792 -1 x2895 >= 0 ;++1 x2793 -1 x2896 >= 0 ;++1 x2794 -1 x2897 >= 0 ;++1 x2795 -1 x2898 >= 0 ;++1 x2796 -1 x2899 >= 0 ;++1 x2797 -1 x2900 >= 0 ;++1 x2798 -1 x2901 >= 0 ;++1 x2799 -1 x2902 >= 0 ;++1 x2800 -1 x2903 >= 0 ;++1 x2801 -1 x2904 >= 0 ;++1 x2802 -1 x2905 >= 0 ;++1 x2803 -1 x2906 >= 0 ;++1 x2804 -1 x2907 >= 0 ;++1 x2805 -1 x2908 >= 0 ;++1 x2806 -1 x2909 >= 0 ;++1 x2807 -1 x2910 >= 0 ;++1 x2808 -1 x2911 >= 0 ;++1 x2809 -1 x2912 >= 0 ;++1 x2810 -1 x2913 >= 0 ;++1 x2811 >= 1 ;+-1 x2915 +1 x1 >= 0 ;++1 x2915 -1 x1 >= 0 ;+-1 x2916 +1 x2 >= 0 ;++1 x2916 -1 x2 >= 0 ;+-1 x2917 +1 x3 >= 0 ;++1 x2917 -1 x3 >= 0 ;+-1 x2918 +1 x4 >= 0 ;++1 x2918 -1 x4 >= 0 ;+-1 x2919 +1 x5 >= 0 ;++1 x2919 -1 x5 >= 0 ;+-1 x2920 +1 x6 >= 0 ;++1 x2920 -1 x6 >= 0 ;+-1 x2921 +1 x7 >= 0 ;++1 x2921 -1 x7 >= 0 ;+-1 x2922 +1 x8 >= 0 ;++1 x2922 -1 x8 >= 0 ;+-1 x2923 +1 x9 >= 0 ;++1 x2923 -1 x9 >= 0 ;+-1 x2924 +1 x10 >= 0 ;+-1 x2924 -1 x1 >= -1 ;++1 x2924 -1 x10 +1 x1 >= 0 ;+-1 x2925 +1 x11 >= 0 ;+-1 x2925 -1 x2 >= -1 ;++1 x2925 -1 x11 +1 x2 >= 0 ;+-1 x2926 +1 x12 >= 0 ;+-1 x2926 -1 x3 >= -1 ;++1 x2926 -1 x12 +1 x3 >= 0 ;+-1 x2927 +1 x13 >= 0 ;+-1 x2927 -1 x4 >= -1 ;++1 x2927 -1 x13 +1 x4 >= 0 ;+-1 x2928 +1 x14 >= 0 ;+-1 x2928 -1 x5 >= -1 ;++1 x2928 -1 x14 +1 x5 >= 0 ;+-1 x2929 +1 x15 >= 0 ;+-1 x2929 -1 x6 >= -1 ;++1 x2929 -1 x15 +1 x6 >= 0 ;+-1 x2930 +1 x16 >= 0 ;+-1 x2930 -1 x7 >= -1 ;++1 x2930 -1 x16 +1 x7 >= 0 ;+-1 x2931 +1 x17 >= 0 ;+-1 x2931 -1 x8 >= -1 ;++1 x2931 -1 x17 +1 x8 >= 0 ;+-1 x2932 +1 x18 >= 0 ;+-1 x2932 -1 x9 >= -1 ;++1 x2932 -1 x18 +1 x9 >= 0 ;+-1 x2933 +1 x19 >= 0 ;+-1 x2933 -1 x10 >= -1 ;++1 x2933 -1 x19 +1 x10 >= 0 ;+-1 x2934 +1 x20 >= 0 ;+-1 x2934 -1 x11 >= -1 ;++1 x2934 -1 x20 +1 x11 >= 0 ;+-1 x2935 +1 x21 >= 0 ;+-1 x2935 -1 x12 >= -1 ;++1 x2935 -1 x21 +1 x12 >= 0 ;+-1 x2936 +1 x22 >= 0 ;+-1 x2936 -1 x13 >= -1 ;++1 x2936 -1 x22 +1 x13 >= 0 ;+-1 x2937 +1 x23 >= 0 ;+-1 x2937 -1 x14 >= -1 ;++1 x2937 -1 x23 +1 x14 >= 0 ;+-1 x2938 +1 x24 >= 0 ;+-1 x2938 -1 x15 >= -1 ;++1 x2938 -1 x24 +1 x15 >= 0 ;+-1 x2939 +1 x25 >= 0 ;+-1 x2939 -1 x16 >= -1 ;++1 x2939 -1 x25 +1 x16 >= 0 ;+-1 x2940 +1 x26 >= 0 ;+-1 x2940 -1 x17 >= -1 ;++1 x2940 -1 x26 +1 x17 >= 0 ;+-1 x2941 +1 x27 >= 0 ;+-1 x2941 -1 x18 >= -1 ;++1 x2941 -1 x27 +1 x18 >= 0 ;+-1 x2942 +1 x28 >= 0 ;+-1 x2942 -1 x19 >= -1 ;++1 x2942 -1 x28 +1 x19 >= 0 ;+-1 x2943 +1 x29 >= 0 ;+-1 x2943 -1 x20 >= -1 ;++1 x2943 -1 x29 +1 x20 >= 0 ;+-1 x2944 +1 x30 >= 0 ;+-1 x2944 -1 x21 >= -1 ;++1 x2944 -1 x30 +1 x21 >= 0 ;+-1 x2945 +1 x31 >= 0 ;+-1 x2945 -1 x22 >= -1 ;++1 x2945 -1 x31 +1 x22 >= 0 ;+-1 x2946 +1 x32 >= 0 ;+-1 x2946 -1 x23 >= -1 ;++1 x2946 -1 x32 +1 x23 >= 0 ;+-1 x2947 +1 x33 >= 0 ;+-1 x2947 -1 x24 >= -1 ;++1 x2947 -1 x33 +1 x24 >= 0 ;+-1 x2948 +1 x34 >= 0 ;+-1 x2948 -1 x25 >= -1 ;++1 x2948 -1 x34 +1 x25 >= 0 ;+-1 x2949 +1 x35 >= 0 ;+-1 x2949 -1 x26 >= -1 ;++1 x2949 -1 x35 +1 x26 >= 0 ;+-1 x2950 +1 x36 >= 0 ;+-1 x2950 -1 x27 >= -1 ;++1 x2950 -1 x36 +1 x27 >= 0 ;+-1 x2951 +1 x37 >= 0 ;+-1 x2951 -1 x28 >= -1 ;++1 x2951 -1 x37 +1 x28 >= 0 ;+-1 x2952 +1 x38 >= 0 ;+-1 x2952 -1 x29 >= -1 ;++1 x2952 -1 x38 +1 x29 >= 0 ;+-1 x2953 +1 x39 >= 0 ;+-1 x2953 -1 x30 >= -1 ;++1 x2953 -1 x39 +1 x30 >= 0 ;+-1 x2954 +1 x40 >= 0 ;+-1 x2954 -1 x31 >= -1 ;++1 x2954 -1 x40 +1 x31 >= 0 ;+-1 x2955 +1 x41 >= 0 ;+-1 x2955 -1 x32 >= -1 ;++1 x2955 -1 x41 +1 x32 >= 0 ;+-1 x2956 +1 x42 >= 0 ;+-1 x2956 -1 x33 >= -1 ;++1 x2956 -1 x42 +1 x33 >= 0 ;+-1 x2957 +1 x43 >= 0 ;+-1 x2957 -1 x34 >= -1 ;++1 x2957 -1 x43 +1 x34 >= 0 ;+-1 x2958 +1 x44 >= 0 ;+-1 x2958 -1 x35 >= -1 ;++1 x2958 -1 x44 +1 x35 >= 0 ;+-1 x2959 +1 x45 >= 0 ;+-1 x2959 -1 x36 >= -1 ;++1 x2959 -1 x45 +1 x36 >= 0 ;+-1 x2960 +1 x46 >= 0 ;+-1 x2960 -1 x37 >= -1 ;++1 x2960 -1 x46 +1 x37 >= 0 ;+-1 x2961 +1 x47 >= 0 ;+-1 x2961 -1 x38 >= -1 ;++1 x2961 -1 x47 +1 x38 >= 0 ;+-1 x2962 +1 x48 >= 0 ;+-1 x2962 -1 x39 >= -1 ;++1 x2962 -1 x48 +1 x39 >= 0 ;+-1 x2963 +1 x49 >= 0 ;+-1 x2963 -1 x40 >= -1 ;++1 x2963 -1 x49 +1 x40 >= 0 ;+-1 x2964 +1 x50 >= 0 ;+-1 x2964 -1 x41 >= -1 ;++1 x2964 -1 x50 +1 x41 >= 0 ;+-1 x2965 +1 x51 >= 0 ;+-1 x2965 -1 x42 >= -1 ;++1 x2965 -1 x51 +1 x42 >= 0 ;+-1 x2966 +1 x52 >= 0 ;+-1 x2966 -1 x43 >= -1 ;++1 x2966 -1 x52 +1 x43 >= 0 ;+-1 x2967 +1 x53 >= 0 ;+-1 x2967 -1 x44 >= -1 ;++1 x2967 -1 x53 +1 x44 >= 0 ;+-1 x2968 +1 x54 >= 0 ;+-1 x2968 -1 x45 >= -1 ;++1 x2968 -1 x54 +1 x45 >= 0 ;+-1 x2969 +1 x55 >= 0 ;+-1 x2969 -1 x46 >= -1 ;++1 x2969 -1 x55 +1 x46 >= 0 ;+-1 x2970 +1 x56 >= 0 ;+-1 x2970 -1 x47 >= -1 ;++1 x2970 -1 x56 +1 x47 >= 0 ;+-1 x2971 +1 x57 >= 0 ;+-1 x2971 -1 x48 >= -1 ;++1 x2971 -1 x57 +1 x48 >= 0 ;+-1 x2972 +1 x58 >= 0 ;+-1 x2972 -1 x49 >= -1 ;++1 x2972 -1 x58 +1 x49 >= 0 ;+-1 x2973 +1 x59 >= 0 ;+-1 x2973 -1 x50 >= -1 ;++1 x2973 -1 x59 +1 x50 >= 0 ;+-1 x2974 +1 x60 >= 0 ;+-1 x2974 -1 x51 >= -1 ;++1 x2974 -1 x60 +1 x51 >= 0 ;+-1 x2975 +1 x61 >= 0 ;+-1 x2975 -1 x52 >= -1 ;++1 x2975 -1 x61 +1 x52 >= 0 ;+-1 x2976 +1 x62 >= 0 ;+-1 x2976 -1 x53 >= -1 ;++1 x2976 -1 x62 +1 x53 >= 0 ;+-1 x2977 +1 x63 >= 0 ;+-1 x2977 -1 x54 >= -1 ;++1 x2977 -1 x63 +1 x54 >= 0 ;+-1 x2978 +1 x64 >= 0 ;+-1 x2978 -1 x55 >= -1 ;++1 x2978 -1 x64 +1 x55 >= 0 ;+-1 x2979 +1 x65 >= 0 ;+-1 x2979 -1 x56 >= -1 ;++1 x2979 -1 x65 +1 x56 >= 0 ;+-1 x2980 +1 x66 >= 0 ;+-1 x2980 -1 x57 >= -1 ;++1 x2980 -1 x66 +1 x57 >= 0 ;+-1 x2981 +1 x67 >= 0 ;+-1 x2981 -1 x58 >= -1 ;++1 x2981 -1 x67 +1 x58 >= 0 ;+-1 x2982 +1 x68 >= 0 ;+-1 x2982 -1 x59 >= -1 ;++1 x2982 -1 x68 +1 x59 >= 0 ;+-1 x2983 +1 x69 >= 0 ;+-1 x2983 -1 x60 >= -1 ;++1 x2983 -1 x69 +1 x60 >= 0 ;+-1 x2984 +1 x70 >= 0 ;+-1 x2984 -1 x61 >= -1 ;++1 x2984 -1 x70 +1 x61 >= 0 ;+-1 x2985 +1 x71 >= 0 ;+-1 x2985 -1 x62 >= -1 ;++1 x2985 -1 x71 +1 x62 >= 0 ;+-1 x2986 +1 x72 >= 0 ;+-1 x2986 -1 x63 >= -1 ;++1 x2986 -1 x72 +1 x63 >= 0 ;+-1 x2987 +1 x73 >= 0 ;+-1 x2987 -1 x64 >= -1 ;++1 x2987 -1 x73 +1 x64 >= 0 ;+-1 x2988 +1 x74 >= 0 ;+-1 x2988 -1 x65 >= -1 ;++1 x2988 -1 x74 +1 x65 >= 0 ;+-1 x2989 +1 x75 >= 0 ;+-1 x2989 -1 x66 >= -1 ;++1 x2989 -1 x75 +1 x66 >= 0 ;+-1 x2990 +1 x76 >= 0 ;+-1 x2990 -1 x67 >= -1 ;++1 x2990 -1 x76 +1 x67 >= 0 ;+-1 x2991 +1 x77 >= 0 ;+-1 x2991 -1 x68 >= -1 ;++1 x2991 -1 x77 +1 x68 >= 0 ;+-1 x2992 +1 x78 >= 0 ;+-1 x2992 -1 x69 >= -1 ;++1 x2992 -1 x78 +1 x69 >= 0 ;+-1 x2993 +1 x79 >= 0 ;+-1 x2993 -1 x70 >= -1 ;++1 x2993 -1 x79 +1 x70 >= 0 ;+-1 x2994 +1 x80 >= 0 ;+-1 x2994 -1 x71 >= -1 ;++1 x2994 -1 x80 +1 x71 >= 0 ;+-1 x2995 +1 x81 >= 0 ;+-1 x2995 -1 x72 >= -1 ;++1 x2995 -1 x81 +1 x72 >= 0 ;+-1 x2996 +1 x82 >= 0 ;+-1 x2996 -1 x73 >= -1 ;++1 x2996 -1 x82 +1 x73 >= 0 ;+-1 x2997 +1 x83 >= 0 ;+-1 x2997 -1 x74 >= -1 ;++1 x2997 -1 x83 +1 x74 >= 0 ;+-1 x2998 +1 x84 >= 0 ;+-1 x2998 -1 x75 >= -1 ;++1 x2998 -1 x84 +1 x75 >= 0 ;+-1 x2999 +1 x85 >= 0 ;+-1 x2999 -1 x76 >= -1 ;++1 x2999 -1 x85 +1 x76 >= 0 ;+-1 x3000 +1 x86 >= 0 ;+-1 x3000 -1 x77 >= -1 ;++1 x3000 -1 x86 +1 x77 >= 0 ;+-1 x3001 +1 x87 >= 0 ;+-1 x3001 -1 x78 >= -1 ;++1 x3001 -1 x87 +1 x78 >= 0 ;+-1 x3002 +1 x88 >= 0 ;+-1 x3002 -1 x79 >= -1 ;++1 x3002 -1 x88 +1 x79 >= 0 ;+-1 x3003 +1 x89 >= 0 ;+-1 x3003 -1 x80 >= -1 ;++1 x3003 -1 x89 +1 x80 >= 0 ;+-1 x3004 +1 x90 >= 0 ;+-1 x3004 -1 x81 >= -1 ;++1 x3004 -1 x90 +1 x81 >= 0 ;+-1 x3005 +1 x91 >= 0 ;+-1 x3005 -1 x82 >= -1 ;++1 x3005 -1 x91 +1 x82 >= 0 ;+-1 x3006 +1 x92 >= 0 ;+-1 x3006 -1 x83 >= -1 ;++1 x3006 -1 x92 +1 x83 >= 0 ;+-1 x3007 +1 x93 >= 0 ;+-1 x3007 -1 x84 >= -1 ;++1 x3007 -1 x93 +1 x84 >= 0 ;+-1 x3008 +1 x94 >= 0 ;+-1 x3008 -1 x85 >= -1 ;++1 x3008 -1 x94 +1 x85 >= 0 ;+-1 x3009 +1 x95 >= 0 ;++1 x3009 -1 x95 >= 0 ;+-1 x3010 +1 x96 >= 0 ;++1 x3010 -1 x96 >= 0 ;+-1 x3011 +1 x97 >= 0 ;++1 x3011 -1 x97 >= 0 ;+-1 x3012 +1 x98 >= 0 ;++1 x3012 -1 x98 >= 0 ;+-1 x3013 +1 x99 >= 0 ;++1 x3013 -1 x99 >= 0 ;+-1 x3014 +1 x100 >= 0 ;++1 x3014 -1 x100 >= 0 ;+-1 x3015 +1 x101 >= 0 ;++1 x3015 -1 x101 >= 0 ;+-1 x3016 +1 x102 >= 0 ;+-1 x3016 -1 x95 >= -1 ;++1 x3016 -1 x102 +1 x95 >= 0 ;+-1 x3017 +1 x103 >= 0 ;+-1 x3017 -1 x96 >= -1 ;++1 x3017 -1 x103 +1 x96 >= 0 ;+-1 x3018 +1 x104 >= 0 ;+-1 x3018 -1 x97 >= -1 ;++1 x3018 -1 x104 +1 x97 >= 0 ;+-1 x3019 +1 x105 >= 0 ;+-1 x3019 -1 x98 >= -1 ;++1 x3019 -1 x105 +1 x98 >= 0 ;+-1 x3020 +1 x106 >= 0 ;+-1 x3020 -1 x99 >= -1 ;++1 x3020 -1 x106 +1 x99 >= 0 ;+-1 x3021 +1 x107 >= 0 ;+-1 x3021 -1 x100 >= -1 ;++1 x3021 -1 x107 +1 x100 >= 0 ;+-1 x3022 +1 x108 >= 0 ;+-1 x3022 -1 x101 >= -1 ;++1 x3022 -1 x108 +1 x101 >= 0 ;+-1 x3023 +1 x109 >= 0 ;+-1 x3023 -1 x102 >= -1 ;++1 x3023 -1 x109 +1 x102 >= 0 ;+-1 x3024 +1 x110 >= 0 ;+-1 x3024 -1 x103 >= -1 ;++1 x3024 -1 x110 +1 x103 >= 0 ;+-1 x3025 +1 x111 >= 0 ;+-1 x3025 -1 x104 >= -1 ;++1 x3025 -1 x111 +1 x104 >= 0 ;+-1 x3026 +1 x112 >= 0 ;+-1 x3026 -1 x105 >= -1 ;++1 x3026 -1 x112 +1 x105 >= 0 ;+-1 x3027 +1 x113 >= 0 ;+-1 x3027 -1 x106 >= -1 ;++1 x3027 -1 x113 +1 x106 >= 0 ;+-1 x3028 +1 x114 >= 0 ;+-1 x3028 -1 x107 >= -1 ;++1 x3028 -1 x114 +1 x107 >= 0 ;+-1 x3029 +1 x115 >= 0 ;+-1 x3029 -1 x108 >= -1 ;++1 x3029 -1 x115 +1 x108 >= 0 ;+-1 x3030 +1 x116 >= 0 ;+-1 x3030 -1 x109 >= -1 ;++1 x3030 -1 x116 +1 x109 >= 0 ;+-1 x3031 +1 x117 >= 0 ;+-1 x3031 -1 x110 >= -1 ;++1 x3031 -1 x117 +1 x110 >= 0 ;+-1 x3032 +1 x118 >= 0 ;+-1 x3032 -1 x111 >= -1 ;++1 x3032 -1 x118 +1 x111 >= 0 ;+-1 x3033 +1 x119 >= 0 ;+-1 x3033 -1 x112 >= -1 ;++1 x3033 -1 x119 +1 x112 >= 0 ;+-1 x3034 +1 x120 >= 0 ;+-1 x3034 -1 x113 >= -1 ;++1 x3034 -1 x120 +1 x113 >= 0 ;+-1 x3035 +1 x121 >= 0 ;+-1 x3035 -1 x114 >= -1 ;++1 x3035 -1 x121 +1 x114 >= 0 ;+-1 x3036 +1 x122 >= 0 ;+-1 x3036 -1 x115 >= -1 ;++1 x3036 -1 x122 +1 x115 >= 0 ;+-1 x3037 +1 x123 >= 0 ;+-1 x3037 -1 x116 >= -1 ;++1 x3037 -1 x123 +1 x116 >= 0 ;+-1 x3038 +1 x124 >= 0 ;+-1 x3038 -1 x117 >= -1 ;++1 x3038 -1 x124 +1 x117 >= 0 ;+-1 x3039 +1 x125 >= 0 ;+-1 x3039 -1 x118 >= -1 ;++1 x3039 -1 x125 +1 x118 >= 0 ;+-1 x3040 +1 x126 >= 0 ;+-1 x3040 -1 x119 >= -1 ;++1 x3040 -1 x126 +1 x119 >= 0 ;+-1 x3041 +1 x127 >= 0 ;+-1 x3041 -1 x120 >= -1 ;++1 x3041 -1 x127 +1 x120 >= 0 ;+-1 x3042 +1 x128 >= 0 ;+-1 x3042 -1 x121 >= -1 ;++1 x3042 -1 x128 +1 x121 >= 0 ;+-1 x3043 +1 x129 >= 0 ;+-1 x3043 -1 x122 >= -1 ;++1 x3043 -1 x129 +1 x122 >= 0 ;+-1 x3044 +1 x130 >= 0 ;+-1 x3044 -1 x123 >= -1 ;++1 x3044 -1 x130 +1 x123 >= 0 ;+-1 x3045 +1 x131 >= 0 ;+-1 x3045 -1 x124 >= -1 ;++1 x3045 -1 x131 +1 x124 >= 0 ;+-1 x3046 +1 x132 >= 0 ;+-1 x3046 -1 x125 >= -1 ;++1 x3046 -1 x132 +1 x125 >= 0 ;+-1 x3047 +1 x133 >= 0 ;+-1 x3047 -1 x126 >= -1 ;++1 x3047 -1 x133 +1 x126 >= 0 ;+-1 x3048 +1 x134 >= 0 ;+-1 x3048 -1 x127 >= -1 ;++1 x3048 -1 x134 +1 x127 >= 0 ;+-1 x3049 +1 x135 >= 0 ;+-1 x3049 -1 x128 >= -1 ;++1 x3049 -1 x135 +1 x128 >= 0 ;+-1 x3050 +1 x136 >= 0 ;+-1 x3050 -1 x129 >= -1 ;++1 x3050 -1 x136 +1 x129 >= 0 ;+-1 x3051 +1 x137 >= 0 ;+-1 x3051 -1 x130 >= -1 ;++1 x3051 -1 x137 +1 x130 >= 0 ;+-1 x3052 +1 x138 >= 0 ;+-1 x3052 -1 x131 >= -1 ;++1 x3052 -1 x138 +1 x131 >= 0 ;+-1 x3053 +1 x139 >= 0 ;+-1 x3053 -1 x132 >= -1 ;++1 x3053 -1 x139 +1 x132 >= 0 ;+-1 x3054 +1 x140 >= 0 ;+-1 x3054 -1 x133 >= -1 ;++1 x3054 -1 x140 +1 x133 >= 0 ;+-1 x3055 +1 x141 >= 0 ;+-1 x3055 -1 x134 >= -1 ;++1 x3055 -1 x141 +1 x134 >= 0 ;+-1 x3056 +1 x142 >= 0 ;+-1 x3056 -1 x135 >= -1 ;++1 x3056 -1 x142 +1 x135 >= 0 ;+-1 x3057 +1 x143 >= 0 ;+-1 x3057 -1 x136 >= -1 ;++1 x3057 -1 x143 +1 x136 >= 0 ;+-1 x3058 +1 x144 >= 0 ;+-1 x3058 -1 x137 >= -1 ;++1 x3058 -1 x144 +1 x137 >= 0 ;+-1 x3059 +1 x145 >= 0 ;+-1 x3059 -1 x138 >= -1 ;++1 x3059 -1 x145 +1 x138 >= 0 ;+-1 x3060 +1 x146 >= 0 ;+-1 x3060 -1 x139 >= -1 ;++1 x3060 -1 x146 +1 x139 >= 0 ;+-1 x3061 +1 x147 >= 0 ;+-1 x3061 -1 x140 >= -1 ;++1 x3061 -1 x147 +1 x140 >= 0 ;+-1 x3062 +1 x148 >= 0 ;+-1 x3062 -1 x141 >= -1 ;++1 x3062 -1 x148 +1 x141 >= 0 ;+-1 x3063 +1 x149 >= 0 ;+-1 x3063 -1 x142 >= -1 ;++1 x3063 -1 x149 +1 x142 >= 0 ;+-1 x3064 +1 x150 >= 0 ;+-1 x3064 -1 x143 >= -1 ;++1 x3064 -1 x150 +1 x143 >= 0 ;+-1 x3065 +1 x151 >= 0 ;+-1 x3065 -1 x144 >= -1 ;++1 x3065 -1 x151 +1 x144 >= 0 ;+-1 x3066 +1 x152 >= 0 ;+-1 x3066 -1 x145 >= -1 ;++1 x3066 -1 x152 +1 x145 >= 0 ;+-1 x3067 +1 x153 >= 0 ;+-1 x3067 -1 x146 >= -1 ;++1 x3067 -1 x153 +1 x146 >= 0 ;+-1 x3068 +1 x154 >= 0 ;+-1 x3068 -1 x147 >= -1 ;++1 x3068 -1 x154 +1 x147 >= 0 ;+-1 x3069 +1 x155 >= 0 ;+-1 x3069 -1 x148 >= -1 ;++1 x3069 -1 x155 +1 x148 >= 0 ;+-1 x3070 +1 x156 >= 0 ;+-1 x3070 -1 x149 >= -1 ;++1 x3070 -1 x156 +1 x149 >= 0 ;+-1 x3071 +1 x157 >= 0 ;+-1 x3071 -1 x150 >= -1 ;++1 x3071 -1 x157 +1 x150 >= 0 ;+-1 x3072 +1 x158 >= 0 ;+-1 x3072 -1 x151 >= -1 ;++1 x3072 -1 x158 +1 x151 >= 0 ;+-1 x3073 +1 x159 >= 0 ;+-1 x3073 -1 x152 >= -1 ;++1 x3073 -1 x159 +1 x152 >= 0 ;+-1 x3074 +1 x160 >= 0 ;+-1 x3074 -1 x153 >= -1 ;++1 x3074 -1 x160 +1 x153 >= 0 ;+-1 x3075 +1 x161 >= 0 ;+-1 x3075 -1 x154 >= -1 ;++1 x3075 -1 x161 +1 x154 >= 0 ;+-1 x3076 +1 x162 >= 0 ;+-1 x3076 -1 x155 >= -1 ;++1 x3076 -1 x162 +1 x155 >= 0 ;+-1 x3077 +1 x163 >= 0 ;+-1 x3077 -1 x156 >= -1 ;++1 x3077 -1 x163 +1 x156 >= 0 ;+-1 x3078 +1 x164 >= 0 ;+-1 x3078 -1 x157 >= -1 ;++1 x3078 -1 x164 +1 x157 >= 0 ;+-1 x3079 +1 x165 >= 0 ;+-1 x3079 -1 x158 >= -1 ;++1 x3079 -1 x165 +1 x158 >= 0 ;+-1 x3080 +1 x166 >= 0 ;+-1 x3080 -1 x159 >= -1 ;++1 x3080 -1 x166 +1 x159 >= 0 ;+-1 x3081 +1 x167 >= 0 ;+-1 x3081 -1 x160 >= -1 ;++1 x3081 -1 x167 +1 x160 >= 0 ;+-1 x3082 +1 x168 >= 0 ;+-1 x3082 -1 x161 >= -1 ;++1 x3082 -1 x168 +1 x161 >= 0 ;+-1 x3083 +1 x169 >= 0 ;+-1 x3083 -1 x162 >= -1 ;++1 x3083 -1 x169 +1 x162 >= 0 ;+-1 x3084 +1 x170 >= 0 ;+-1 x3084 -1 x163 >= -1 ;++1 x3084 -1 x170 +1 x163 >= 0 ;+-1 x3085 +1 x171 >= 0 ;+-1 x3085 -1 x164 >= -1 ;++1 x3085 -1 x171 +1 x164 >= 0 ;+-1 x3086 +1 x172 >= 0 ;+-1 x3086 -1 x165 >= -1 ;++1 x3086 -1 x172 +1 x165 >= 0 ;+-1 x3087 +1 x173 >= 0 ;+-1 x3087 -1 x166 >= -1 ;++1 x3087 -1 x173 +1 x166 >= 0 ;+-1 x3088 +1 x174 >= 0 ;+-1 x3088 -1 x167 >= -1 ;++1 x3088 -1 x174 +1 x167 >= 0 ;+-1 x3089 +1 x175 >= 0 ;+-1 x3089 -1 x168 >= -1 ;++1 x3089 -1 x175 +1 x168 >= 0 ;+-1 x3090 +1 x176 >= 0 ;+-1 x3090 -1 x169 >= -1 ;++1 x3090 -1 x176 +1 x169 >= 0 ;+-1 x3091 +1 x177 >= 0 ;+-1 x3091 -1 x170 >= -1 ;++1 x3091 -1 x177 +1 x170 >= 0 ;+-1 x3092 +1 x178 >= 0 ;+-1 x3092 -1 x171 >= -1 ;++1 x3092 -1 x178 +1 x171 >= 0 ;+-1 x3093 +1 x179 >= 0 ;+-1 x3093 -1 x172 >= -1 ;++1 x3093 -1 x179 +1 x172 >= 0 ;+-1 x3094 +1 x180 >= 0 ;+-1 x3094 -1 x173 >= -1 ;++1 x3094 -1 x180 +1 x173 >= 0 ;+-1 x3095 +1 x181 >= 0 ;+-1 x3095 -1 x174 >= -1 ;++1 x3095 -1 x181 +1 x174 >= 0 ;+-1 x3096 +1 x182 >= 0 ;+-1 x3096 -1 x175 >= -1 ;++1 x3096 -1 x182 +1 x175 >= 0 ;+-1 x3097 +1 x183 >= 0 ;+-1 x3097 -1 x176 >= -1 ;++1 x3097 -1 x183 +1 x176 >= 0 ;+-1 x3098 +1 x184 >= 0 ;+-1 x3098 -1 x177 >= -1 ;++1 x3098 -1 x184 +1 x177 >= 0 ;+-1 x3099 +1 x185 >= 0 ;+-1 x3099 -1 x178 >= -1 ;++1 x3099 -1 x185 +1 x178 >= 0 ;+-1 x3100 +1 x186 >= 0 ;+-1 x3100 -1 x179 >= -1 ;++1 x3100 -1 x186 +1 x179 >= 0 ;+-1 x3101 +1 x187 >= 0 ;+-1 x3101 -1 x180 >= -1 ;++1 x3101 -1 x187 +1 x180 >= 0 ;+-1 x3102 +1 x188 >= 0 ;+-1 x3102 -1 x181 >= -1 ;++1 x3102 -1 x188 +1 x181 >= 0 ;+-1 x3103 +1 x189 >= 0 ;++1 x3103 -1 x189 >= 0 ;+-1 x3104 +1 x190 >= 0 ;++1 x3104 -1 x190 >= 0 ;+-1 x3105 +1 x191 >= 0 ;++1 x3105 -1 x191 >= 0 ;+-1 x3106 +1 x192 >= 0 ;++1 x3106 -1 x192 >= 0 ;+-1 x3107 +1 x193 >= 0 ;++1 x3107 -1 x193 >= 0 ;+-1 x3108 +1 x194 >= 0 ;++1 x3108 -1 x194 >= 0 ;+-1 x3109 +1 x195 >= 0 ;++1 x3109 -1 x195 >= 0 ;+-1 x3110 +1 x196 >= 0 ;++1 x3110 -1 x196 >= 0 ;+-1 x3111 +1 x197 >= 0 ;++1 x3111 -1 x197 >= 0 ;+-1 x3112 +1 x198 >= 0 ;+-1 x3112 -1 x189 >= -1 ;++1 x3112 -1 x198 +1 x189 >= 0 ;+-1 x3113 +1 x199 >= 0 ;+-1 x3113 -1 x190 >= -1 ;++1 x3113 -1 x199 +1 x190 >= 0 ;+-1 x3114 +1 x200 >= 0 ;+-1 x3114 -1 x191 >= -1 ;++1 x3114 -1 x200 +1 x191 >= 0 ;+-1 x3115 +1 x201 >= 0 ;+-1 x3115 -1 x192 >= -1 ;++1 x3115 -1 x201 +1 x192 >= 0 ;+-1 x3116 +1 x202 >= 0 ;+-1 x3116 -1 x193 >= -1 ;++1 x3116 -1 x202 +1 x193 >= 0 ;+-1 x3117 +1 x203 >= 0 ;+-1 x3117 -1 x194 >= -1 ;++1 x3117 -1 x203 +1 x194 >= 0 ;+-1 x3118 +1 x204 >= 0 ;+-1 x3118 -1 x195 >= -1 ;++1 x3118 -1 x204 +1 x195 >= 0 ;+-1 x3119 +1 x205 >= 0 ;+-1 x3119 -1 x196 >= -1 ;++1 x3119 -1 x205 +1 x196 >= 0 ;+-1 x3120 +1 x206 >= 0 ;+-1 x3120 -1 x197 >= -1 ;++1 x3120 -1 x206 +1 x197 >= 0 ;+-1 x3121 +1 x207 >= 0 ;+-1 x3121 -1 x198 >= -1 ;++1 x3121 -1 x207 +1 x198 >= 0 ;+-1 x3122 +1 x208 >= 0 ;+-1 x3122 -1 x199 >= -1 ;++1 x3122 -1 x208 +1 x199 >= 0 ;+-1 x3123 +1 x209 >= 0 ;+-1 x3123 -1 x200 >= -1 ;++1 x3123 -1 x209 +1 x200 >= 0 ;+-1 x3124 +1 x210 >= 0 ;+-1 x3124 -1 x201 >= -1 ;++1 x3124 -1 x210 +1 x201 >= 0 ;+-1 x3125 +1 x211 >= 0 ;+-1 x3125 -1 x202 >= -1 ;++1 x3125 -1 x211 +1 x202 >= 0 ;+-1 x3126 +1 x212 >= 0 ;+-1 x3126 -1 x203 >= -1 ;++1 x3126 -1 x212 +1 x203 >= 0 ;+-1 x3127 +1 x213 >= 0 ;+-1 x3127 -1 x204 >= -1 ;++1 x3127 -1 x213 +1 x204 >= 0 ;+-1 x3128 +1 x214 >= 0 ;+-1 x3128 -1 x205 >= -1 ;++1 x3128 -1 x214 +1 x205 >= 0 ;+-1 x3129 +1 x215 >= 0 ;+-1 x3129 -1 x206 >= -1 ;++1 x3129 -1 x215 +1 x206 >= 0 ;+-1 x3130 +1 x216 >= 0 ;+-1 x3130 -1 x207 >= -1 ;++1 x3130 -1 x216 +1 x207 >= 0 ;+-1 x3131 +1 x217 >= 0 ;+-1 x3131 -1 x208 >= -1 ;++1 x3131 -1 x217 +1 x208 >= 0 ;+-1 x3132 +1 x218 >= 0 ;+-1 x3132 -1 x209 >= -1 ;++1 x3132 -1 x218 +1 x209 >= 0 ;+-1 x3133 +1 x219 >= 0 ;+-1 x3133 -1 x210 >= -1 ;++1 x3133 -1 x219 +1 x210 >= 0 ;+-1 x3134 +1 x220 >= 0 ;+-1 x3134 -1 x211 >= -1 ;++1 x3134 -1 x220 +1 x211 >= 0 ;+-1 x3135 +1 x221 >= 0 ;+-1 x3135 -1 x212 >= -1 ;++1 x3135 -1 x221 +1 x212 >= 0 ;+-1 x3136 +1 x222 >= 0 ;+-1 x3136 -1 x213 >= -1 ;++1 x3136 -1 x222 +1 x213 >= 0 ;+-1 x3137 +1 x223 >= 0 ;+-1 x3137 -1 x214 >= -1 ;++1 x3137 -1 x223 +1 x214 >= 0 ;+-1 x3138 +1 x224 >= 0 ;+-1 x3138 -1 x215 >= -1 ;++1 x3138 -1 x224 +1 x215 >= 0 ;+-1 x3139 +1 x225 >= 0 ;+-1 x3139 -1 x216 >= -1 ;++1 x3139 -1 x225 +1 x216 >= 0 ;+-1 x3140 +1 x226 >= 0 ;+-1 x3140 -1 x217 >= -1 ;++1 x3140 -1 x226 +1 x217 >= 0 ;+-1 x3141 +1 x227 >= 0 ;+-1 x3141 -1 x218 >= -1 ;++1 x3141 -1 x227 +1 x218 >= 0 ;+-1 x3142 +1 x228 >= 0 ;+-1 x3142 -1 x219 >= -1 ;++1 x3142 -1 x228 +1 x219 >= 0 ;+-1 x3143 +1 x229 >= 0 ;+-1 x3143 -1 x220 >= -1 ;++1 x3143 -1 x229 +1 x220 >= 0 ;+-1 x3144 +1 x230 >= 0 ;+-1 x3144 -1 x221 >= -1 ;++1 x3144 -1 x230 +1 x221 >= 0 ;+-1 x3145 +1 x231 >= 0 ;+-1 x3145 -1 x222 >= -1 ;++1 x3145 -1 x231 +1 x222 >= 0 ;+-1 x3146 +1 x232 >= 0 ;+-1 x3146 -1 x223 >= -1 ;++1 x3146 -1 x232 +1 x223 >= 0 ;+-1 x3147 +1 x233 >= 0 ;+-1 x3147 -1 x224 >= -1 ;++1 x3147 -1 x233 +1 x224 >= 0 ;+-1 x3148 +1 x234 >= 0 ;+-1 x3148 -1 x225 >= -1 ;++1 x3148 -1 x234 +1 x225 >= 0 ;+-1 x3149 +1 x235 >= 0 ;+-1 x3149 -1 x226 >= -1 ;++1 x3149 -1 x235 +1 x226 >= 0 ;+-1 x3150 +1 x236 >= 0 ;+-1 x3150 -1 x227 >= -1 ;++1 x3150 -1 x236 +1 x227 >= 0 ;+-1 x3151 +1 x237 >= 0 ;+-1 x3151 -1 x228 >= -1 ;++1 x3151 -1 x237 +1 x228 >= 0 ;+-1 x3152 +1 x238 >= 0 ;+-1 x3152 -1 x229 >= -1 ;++1 x3152 -1 x238 +1 x229 >= 0 ;+-1 x3153 +1 x239 >= 0 ;+-1 x3153 -1 x230 >= -1 ;++1 x3153 -1 x239 +1 x230 >= 0 ;+-1 x3154 +1 x240 >= 0 ;+-1 x3154 -1 x231 >= -1 ;++1 x3154 -1 x240 +1 x231 >= 0 ;+-1 x3155 +1 x241 >= 0 ;+-1 x3155 -1 x232 >= -1 ;++1 x3155 -1 x241 +1 x232 >= 0 ;+-1 x3156 +1 x242 >= 0 ;+-1 x3156 -1 x233 >= -1 ;++1 x3156 -1 x242 +1 x233 >= 0 ;+-1 x3157 +1 x243 >= 0 ;+-1 x3157 -1 x234 >= -1 ;++1 x3157 -1 x243 +1 x234 >= 0 ;+-1 x3158 +1 x244 >= 0 ;+-1 x3158 -1 x235 >= -1 ;++1 x3158 -1 x244 +1 x235 >= 0 ;+-1 x3159 +1 x245 >= 0 ;+-1 x3159 -1 x236 >= -1 ;++1 x3159 -1 x245 +1 x236 >= 0 ;+-1 x3160 +1 x246 >= 0 ;+-1 x3160 -1 x237 >= -1 ;++1 x3160 -1 x246 +1 x237 >= 0 ;+-1 x3161 +1 x247 >= 0 ;+-1 x3161 -1 x238 >= -1 ;++1 x3161 -1 x247 +1 x238 >= 0 ;+-1 x3162 +1 x248 >= 0 ;+-1 x3162 -1 x239 >= -1 ;++1 x3162 -1 x248 +1 x239 >= 0 ;+-1 x3163 +1 x249 >= 0 ;+-1 x3163 -1 x240 >= -1 ;++1 x3163 -1 x249 +1 x240 >= 0 ;+-1 x3164 +1 x250 >= 0 ;+-1 x3164 -1 x241 >= -1 ;++1 x3164 -1 x250 +1 x241 >= 0 ;+-1 x3165 +1 x251 >= 0 ;+-1 x3165 -1 x242 >= -1 ;++1 x3165 -1 x251 +1 x242 >= 0 ;+-1 x3166 +1 x252 >= 0 ;+-1 x3166 -1 x243 >= -1 ;++1 x3166 -1 x252 +1 x243 >= 0 ;+-1 x3167 +1 x253 >= 0 ;+-1 x3167 -1 x244 >= -1 ;++1 x3167 -1 x253 +1 x244 >= 0 ;+-1 x3168 +1 x254 >= 0 ;+-1 x3168 -1 x245 >= -1 ;++1 x3168 -1 x254 +1 x245 >= 0 ;+-1 x3169 +1 x255 >= 0 ;+-1 x3169 -1 x246 >= -1 ;++1 x3169 -1 x255 +1 x246 >= 0 ;+-1 x3170 +1 x256 >= 0 ;+-1 x3170 -1 x247 >= -1 ;++1 x3170 -1 x256 +1 x247 >= 0 ;+-1 x3171 +1 x257 >= 0 ;+-1 x3171 -1 x248 >= -1 ;++1 x3171 -1 x257 +1 x248 >= 0 ;+-1 x3172 +1 x258 >= 0 ;+-1 x3172 -1 x249 >= -1 ;++1 x3172 -1 x258 +1 x249 >= 0 ;+-1 x3173 +1 x259 >= 0 ;+-1 x3173 -1 x250 >= -1 ;++1 x3173 -1 x259 +1 x250 >= 0 ;+-1 x3174 +1 x260 >= 0 ;+-1 x3174 -1 x251 >= -1 ;++1 x3174 -1 x260 +1 x251 >= 0 ;+-1 x3175 +1 x261 >= 0 ;+-1 x3175 -1 x252 >= -1 ;++1 x3175 -1 x261 +1 x252 >= 0 ;+-1 x3176 +1 x262 >= 0 ;+-1 x3176 -1 x253 >= -1 ;++1 x3176 -1 x262 +1 x253 >= 0 ;+-1 x3177 +1 x263 >= 0 ;+-1 x3177 -1 x254 >= -1 ;++1 x3177 -1 x263 +1 x254 >= 0 ;+-1 x3178 +1 x264 >= 0 ;+-1 x3178 -1 x255 >= -1 ;++1 x3178 -1 x264 +1 x255 >= 0 ;+-1 x3179 +1 x265 >= 0 ;+-1 x3179 -1 x256 >= -1 ;++1 x3179 -1 x265 +1 x256 >= 0 ;+-1 x3180 +1 x266 >= 0 ;+-1 x3180 -1 x257 >= -1 ;++1 x3180 -1 x266 +1 x257 >= 0 ;+-1 x3181 +1 x267 >= 0 ;+-1 x3181 -1 x258 >= -1 ;++1 x3181 -1 x267 +1 x258 >= 0 ;+-1 x3182 +1 x268 >= 0 ;+-1 x3182 -1 x259 >= -1 ;++1 x3182 -1 x268 +1 x259 >= 0 ;+-1 x3183 +1 x269 >= 0 ;+-1 x3183 -1 x260 >= -1 ;++1 x3183 -1 x269 +1 x260 >= 0 ;+-1 x3184 +1 x270 >= 0 ;+-1 x3184 -1 x261 >= -1 ;++1 x3184 -1 x270 +1 x261 >= 0 ;+-1 x3185 +1 x271 >= 0 ;+-1 x3185 -1 x262 >= -1 ;++1 x3185 -1 x271 +1 x262 >= 0 ;+-1 x3186 +1 x272 >= 0 ;+-1 x3186 -1 x263 >= -1 ;++1 x3186 -1 x272 +1 x263 >= 0 ;+-1 x3187 +1 x273 >= 0 ;+-1 x3187 -1 x264 >= -1 ;++1 x3187 -1 x273 +1 x264 >= 0 ;+-1 x3188 +1 x274 >= 0 ;+-1 x3188 -1 x265 >= -1 ;++1 x3188 -1 x274 +1 x265 >= 0 ;+-1 x3189 +1 x275 >= 0 ;+-1 x3189 -1 x266 >= -1 ;++1 x3189 -1 x275 +1 x266 >= 0 ;+-1 x3190 +1 x276 >= 0 ;+-1 x3190 -1 x267 >= -1 ;++1 x3190 -1 x276 +1 x267 >= 0 ;+-1 x3191 +1 x277 >= 0 ;+-1 x3191 -1 x268 >= -1 ;++1 x3191 -1 x277 +1 x268 >= 0 ;+-1 x3192 +1 x278 >= 0 ;+-1 x3192 -1 x269 >= -1 ;++1 x3192 -1 x278 +1 x269 >= 0 ;+-1 x3193 +1 x279 >= 0 ;+-1 x3193 -1 x270 >= -1 ;++1 x3193 -1 x279 +1 x270 >= 0 ;+-1 x3194 +1 x280 >= 0 ;+-1 x3194 -1 x271 >= -1 ;++1 x3194 -1 x280 +1 x271 >= 0 ;+-1 x3195 +1 x281 >= 0 ;+-1 x3195 -1 x272 >= -1 ;++1 x3195 -1 x281 +1 x272 >= 0 ;+-1 x3196 +1 x282 >= 0 ;+-1 x3196 -1 x273 >= -1 ;++1 x3196 -1 x282 +1 x273 >= 0 ;+-1 x3197 +1 x283 >= 0 ;++1 x3197 -1 x283 >= 0 ;+-1 x3198 +1 x284 >= 0 ;++1 x3198 -1 x284 >= 0 ;+-1 x3199 +1 x285 >= 0 ;++1 x3199 -1 x285 >= 0 ;+-1 x3200 +1 x286 >= 0 ;+-1 x3200 -1 x283 >= -1 ;++1 x3200 -1 x286 +1 x283 >= 0 ;+-1 x3201 +1 x287 >= 0 ;+-1 x3201 -1 x284 >= -1 ;++1 x3201 -1 x287 +1 x284 >= 0 ;+-1 x3202 +1 x288 >= 0 ;+-1 x3202 -1 x285 >= -1 ;++1 x3202 -1 x288 +1 x285 >= 0 ;+-1 x3203 +1 x289 >= 0 ;+-1 x3203 -1 x286 >= -1 ;++1 x3203 -1 x289 +1 x286 >= 0 ;+-1 x3204 +1 x290 >= 0 ;+-1 x3204 -1 x287 >= -1 ;++1 x3204 -1 x290 +1 x287 >= 0 ;+-1 x3205 +1 x291 >= 0 ;+-1 x3205 -1 x288 >= -1 ;++1 x3205 -1 x291 +1 x288 >= 0 ;+-1 x3206 +1 x292 >= 0 ;+-1 x3206 -1 x289 >= -1 ;++1 x3206 -1 x292 +1 x289 >= 0 ;+-1 x3207 +1 x293 >= 0 ;+-1 x3207 -1 x290 >= -1 ;++1 x3207 -1 x293 +1 x290 >= 0 ;+-1 x3208 +1 x294 >= 0 ;+-1 x3208 -1 x291 >= -1 ;++1 x3208 -1 x294 +1 x291 >= 0 ;+-1 x3209 +1 x295 >= 0 ;+-1 x3209 -1 x292 >= -1 ;++1 x3209 -1 x295 +1 x292 >= 0 ;+-1 x3210 +1 x296 >= 0 ;+-1 x3210 -1 x293 >= -1 ;++1 x3210 -1 x296 +1 x293 >= 0 ;+-1 x3211 +1 x297 >= 0 ;+-1 x3211 -1 x294 >= -1 ;++1 x3211 -1 x297 +1 x294 >= 0 ;+-1 x3212 +1 x298 >= 0 ;+-1 x3212 -1 x295 >= -1 ;++1 x3212 -1 x298 +1 x295 >= 0 ;+-1 x3213 +1 x299 >= 0 ;+-1 x3213 -1 x296 >= -1 ;++1 x3213 -1 x299 +1 x296 >= 0 ;+-1 x3214 +1 x300 >= 0 ;+-1 x3214 -1 x297 >= -1 ;++1 x3214 -1 x300 +1 x297 >= 0 ;+-1 x3215 +1 x301 >= 0 ;+-1 x3215 -1 x298 >= -1 ;++1 x3215 -1 x301 +1 x298 >= 0 ;+-1 x3216 +1 x302 >= 0 ;+-1 x3216 -1 x299 >= -1 ;++1 x3216 -1 x302 +1 x299 >= 0 ;+-1 x3217 +1 x303 >= 0 ;+-1 x3217 -1 x300 >= -1 ;++1 x3217 -1 x303 +1 x300 >= 0 ;+-1 x3218 +1 x304 >= 0 ;+-1 x3218 -1 x301 >= -1 ;++1 x3218 -1 x304 +1 x301 >= 0 ;+-1 x3219 +1 x305 >= 0 ;+-1 x3219 -1 x302 >= -1 ;++1 x3219 -1 x305 +1 x302 >= 0 ;+-1 x3220 +1 x306 >= 0 ;+-1 x3220 -1 x303 >= -1 ;++1 x3220 -1 x306 +1 x303 >= 0 ;+-1 x3221 +1 x307 >= 0 ;+-1 x3221 -1 x304 >= -1 ;++1 x3221 -1 x307 +1 x304 >= 0 ;+-1 x3222 +1 x308 >= 0 ;+-1 x3222 -1 x305 >= -1 ;++1 x3222 -1 x308 +1 x305 >= 0 ;+-1 x3223 +1 x309 >= 0 ;+-1 x3223 -1 x306 >= -1 ;++1 x3223 -1 x309 +1 x306 >= 0 ;+-1 x3224 +1 x310 >= 0 ;+-1 x3224 -1 x307 >= -1 ;++1 x3224 -1 x310 +1 x307 >= 0 ;+-1 x3225 +1 x311 >= 0 ;+-1 x3225 -1 x308 >= -1 ;++1 x3225 -1 x311 +1 x308 >= 0 ;+-1 x3226 +1 x312 >= 0 ;+-1 x3226 -1 x309 >= -1 ;++1 x3226 -1 x312 +1 x309 >= 0 ;+-1 x3227 +1 x313 >= 0 ;+-1 x3227 -1 x310 >= -1 ;++1 x3227 -1 x313 +1 x310 >= 0 ;+-1 x3228 +1 x314 >= 0 ;+-1 x3228 -1 x311 >= -1 ;++1 x3228 -1 x314 +1 x311 >= 0 ;+-1 x3229 +1 x315 >= 0 ;+-1 x3229 -1 x312 >= -1 ;++1 x3229 -1 x315 +1 x312 >= 0 ;+-1 x3230 +1 x316 >= 0 ;+-1 x3230 -1 x313 >= -1 ;++1 x3230 -1 x316 +1 x313 >= 0 ;+-1 x3231 +1 x317 >= 0 ;+-1 x3231 -1 x314 >= -1 ;++1 x3231 -1 x317 +1 x314 >= 0 ;+-1 x3232 +1 x318 >= 0 ;+-1 x3232 -1 x315 >= -1 ;++1 x3232 -1 x318 +1 x315 >= 0 ;+-1 x3233 +1 x319 >= 0 ;+-1 x3233 -1 x316 >= -1 ;++1 x3233 -1 x319 +1 x316 >= 0 ;+-1 x3234 +1 x320 >= 0 ;+-1 x3234 -1 x317 >= -1 ;++1 x3234 -1 x320 +1 x317 >= 0 ;+-1 x3235 +1 x321 >= 0 ;+-1 x3235 -1 x318 >= -1 ;++1 x3235 -1 x321 +1 x318 >= 0 ;+-1 x3236 +1 x322 >= 0 ;+-1 x3236 -1 x319 >= -1 ;++1 x3236 -1 x322 +1 x319 >= 0 ;+-1 x3237 +1 x323 >= 0 ;+-1 x3237 -1 x320 >= -1 ;++1 x3237 -1 x323 +1 x320 >= 0 ;+-1 x3238 +1 x324 >= 0 ;+-1 x3238 -1 x321 >= -1 ;++1 x3238 -1 x324 +1 x321 >= 0 ;+-1 x3239 +1 x325 >= 0 ;+-1 x3239 -1 x322 >= -1 ;++1 x3239 -1 x325 +1 x322 >= 0 ;+-1 x3240 +1 x326 >= 0 ;+-1 x3240 -1 x323 >= -1 ;++1 x3240 -1 x326 +1 x323 >= 0 ;+-1 x3241 +1 x327 >= 0 ;+-1 x3241 -1 x324 >= -1 ;++1 x3241 -1 x327 +1 x324 >= 0 ;+-1 x3242 +1 x328 >= 0 ;+-1 x3242 -1 x325 >= -1 ;++1 x3242 -1 x328 +1 x325 >= 0 ;+-1 x3243 +1 x329 >= 0 ;+-1 x3243 -1 x326 >= -1 ;++1 x3243 -1 x329 +1 x326 >= 0 ;+-1 x3244 +1 x330 >= 0 ;+-1 x3244 -1 x327 >= -1 ;++1 x3244 -1 x330 +1 x327 >= 0 ;+-1 x3245 +1 x331 >= 0 ;+-1 x3245 -1 x328 >= -1 ;++1 x3245 -1 x331 +1 x328 >= 0 ;+-1 x3246 +1 x332 >= 0 ;+-1 x3246 -1 x329 >= -1 ;++1 x3246 -1 x332 +1 x329 >= 0 ;+-1 x3247 +1 x333 >= 0 ;+-1 x3247 -1 x330 >= -1 ;++1 x3247 -1 x333 +1 x330 >= 0 ;+-1 x3248 +1 x334 >= 0 ;+-1 x3248 -1 x331 >= -1 ;++1 x3248 -1 x334 +1 x331 >= 0 ;+-1 x3249 +1 x335 >= 0 ;+-1 x3249 -1 x332 >= -1 ;++1 x3249 -1 x335 +1 x332 >= 0 ;+-1 x3250 +1 x336 >= 0 ;+-1 x3250 -1 x333 >= -1 ;++1 x3250 -1 x336 +1 x333 >= 0 ;+-1 x3251 +1 x337 >= 0 ;+-1 x3251 -1 x334 >= -1 ;++1 x3251 -1 x337 +1 x334 >= 0 ;+-1 x3252 +1 x338 >= 0 ;+-1 x3252 -1 x335 >= -1 ;++1 x3252 -1 x338 +1 x335 >= 0 ;+-1 x3253 +1 x339 >= 0 ;+-1 x3253 -1 x336 >= -1 ;++1 x3253 -1 x339 +1 x336 >= 0 ;+-1 x3254 +1 x340 >= 0 ;+-1 x3254 -1 x337 >= -1 ;++1 x3254 -1 x340 +1 x337 >= 0 ;+-1 x3255 +1 x341 >= 0 ;+-1 x3255 -1 x338 >= -1 ;++1 x3255 -1 x341 +1 x338 >= 0 ;+-1 x3256 +1 x342 >= 0 ;+-1 x3256 -1 x339 >= -1 ;++1 x3256 -1 x342 +1 x339 >= 0 ;+-1 x3257 +1 x343 >= 0 ;+-1 x3257 -1 x340 >= -1 ;++1 x3257 -1 x343 +1 x340 >= 0 ;+-1 x3258 +1 x344 >= 0 ;+-1 x3258 -1 x341 >= -1 ;++1 x3258 -1 x344 +1 x341 >= 0 ;+-1 x3259 +1 x345 >= 0 ;+-1 x3259 -1 x342 >= -1 ;++1 x3259 -1 x345 +1 x342 >= 0 ;+-1 x3260 +1 x346 >= 0 ;+-1 x3260 -1 x343 >= -1 ;++1 x3260 -1 x346 +1 x343 >= 0 ;+-1 x3261 +1 x347 >= 0 ;+-1 x3261 -1 x344 >= -1 ;++1 x3261 -1 x347 +1 x344 >= 0 ;+-1 x3262 +1 x348 >= 0 ;+-1 x3262 -1 x345 >= -1 ;++1 x3262 -1 x348 +1 x345 >= 0 ;+-1 x3263 +1 x349 >= 0 ;+-1 x3263 -1 x346 >= -1 ;++1 x3263 -1 x349 +1 x346 >= 0 ;+-1 x3264 +1 x350 >= 0 ;+-1 x3264 -1 x347 >= -1 ;++1 x3264 -1 x350 +1 x347 >= 0 ;+-1 x3265 +1 x351 >= 0 ;+-1 x3265 -1 x348 >= -1 ;++1 x3265 -1 x351 +1 x348 >= 0 ;+-1 x3266 +1 x352 >= 0 ;+-1 x3266 -1 x349 >= -1 ;++1 x3266 -1 x352 +1 x349 >= 0 ;+-1 x3267 +1 x353 >= 0 ;+-1 x3267 -1 x350 >= -1 ;++1 x3267 -1 x353 +1 x350 >= 0 ;+-1 x3268 +1 x354 >= 0 ;+-1 x3268 -1 x351 >= -1 ;++1 x3268 -1 x354 +1 x351 >= 0 ;+-1 x3269 +1 x355 >= 0 ;+-1 x3269 -1 x352 >= -1 ;++1 x3269 -1 x355 +1 x352 >= 0 ;+-1 x3270 +1 x356 >= 0 ;+-1 x3270 -1 x353 >= -1 ;++1 x3270 -1 x356 +1 x353 >= 0 ;+-1 x3271 +1 x357 >= 0 ;+-1 x3271 -1 x354 >= -1 ;++1 x3271 -1 x357 +1 x354 >= 0 ;+-1 x3272 +1 x358 >= 0 ;+-1 x3272 -1 x355 >= -1 ;++1 x3272 -1 x358 +1 x355 >= 0 ;+-1 x3273 +1 x359 >= 0 ;+-1 x3273 -1 x356 >= -1 ;++1 x3273 -1 x359 +1 x356 >= 0 ;+-1 x3274 +1 x360 >= 0 ;+-1 x3274 -1 x357 >= -1 ;++1 x3274 -1 x360 +1 x357 >= 0 ;+-1 x3275 +1 x361 >= 0 ;+-1 x3275 -1 x358 >= -1 ;++1 x3275 -1 x361 +1 x358 >= 0 ;+-1 x3276 +1 x362 >= 0 ;+-1 x3276 -1 x359 >= -1 ;++1 x3276 -1 x362 +1 x359 >= 0 ;+-1 x3277 +1 x363 >= 0 ;+-1 x3277 -1 x360 >= -1 ;++1 x3277 -1 x363 +1 x360 >= 0 ;+-1 x3278 +1 x364 >= 0 ;+-1 x3278 -1 x361 >= -1 ;++1 x3278 -1 x364 +1 x361 >= 0 ;+-1 x3279 +1 x365 >= 0 ;+-1 x3279 -1 x362 >= -1 ;++1 x3279 -1 x365 +1 x362 >= 0 ;+-1 x3280 +1 x366 >= 0 ;+-1 x3280 -1 x363 >= -1 ;++1 x3280 -1 x366 +1 x363 >= 0 ;+-1 x3281 +1 x367 >= 0 ;+-1 x3281 -1 x364 >= -1 ;++1 x3281 -1 x367 +1 x364 >= 0 ;+-1 x3282 +1 x368 >= 0 ;+-1 x3282 -1 x365 >= -1 ;++1 x3282 -1 x368 +1 x365 >= 0 ;+-1 x3283 +1 x369 >= 0 ;+-1 x3283 -1 x366 >= -1 ;++1 x3283 -1 x369 +1 x366 >= 0 ;+-1 x3284 +1 x370 >= 0 ;+-1 x3284 -1 x367 >= -1 ;++1 x3284 -1 x370 +1 x367 >= 0 ;+-1 x3285 +1 x371 >= 0 ;+-1 x3285 -1 x368 >= -1 ;++1 x3285 -1 x371 +1 x368 >= 0 ;+-1 x3286 +1 x372 >= 0 ;+-1 x3286 -1 x369 >= -1 ;++1 x3286 -1 x372 +1 x369 >= 0 ;+-1 x3287 +1 x373 >= 0 ;+-1 x3287 -1 x370 >= -1 ;++1 x3287 -1 x373 +1 x370 >= 0 ;+-1 x3288 +1 x374 >= 0 ;+-1 x3288 -1 x371 >= -1 ;++1 x3288 -1 x374 +1 x371 >= 0 ;+-1 x3289 +1 x375 >= 0 ;+-1 x3289 -1 x372 >= -1 ;++1 x3289 -1 x375 +1 x372 >= 0 ;+-1 x3290 +1 x376 >= 0 ;+-1 x3290 -1 x373 >= -1 ;++1 x3290 -1 x376 +1 x373 >= 0 ;+-1 x3291 +1 x377 >= 0 ;++1 x3291 -1 x377 >= 0 ;+-1 x3292 +1 x378 >= 0 ;++1 x3292 -1 x378 >= 0 ;+-1 x3293 +1 x379 >= 0 ;++1 x3293 -1 x379 >= 0 ;+-1 x3294 +1 x380 >= 0 ;++1 x3294 -1 x380 >= 0 ;+-1 x3295 +1 x381 >= 0 ;+-1 x3295 -1 x377 >= -1 ;++1 x3295 -1 x381 +1 x377 >= 0 ;+-1 x3296 +1 x382 >= 0 ;+-1 x3296 -1 x378 >= -1 ;++1 x3296 -1 x382 +1 x378 >= 0 ;+-1 x3297 +1 x383 >= 0 ;+-1 x3297 -1 x379 >= -1 ;++1 x3297 -1 x383 +1 x379 >= 0 ;+-1 x3298 +1 x384 >= 0 ;+-1 x3298 -1 x380 >= -1 ;++1 x3298 -1 x384 +1 x380 >= 0 ;+-1 x3299 +1 x385 >= 0 ;+-1 x3299 -1 x381 >= -1 ;++1 x3299 -1 x385 +1 x381 >= 0 ;+-1 x3300 +1 x386 >= 0 ;+-1 x3300 -1 x382 >= -1 ;++1 x3300 -1 x386 +1 x382 >= 0 ;+-1 x3301 +1 x387 >= 0 ;+-1 x3301 -1 x383 >= -1 ;++1 x3301 -1 x387 +1 x383 >= 0 ;+-1 x3302 +1 x388 >= 0 ;+-1 x3302 -1 x384 >= -1 ;++1 x3302 -1 x388 +1 x384 >= 0 ;+-1 x3303 +1 x389 >= 0 ;+-1 x3303 -1 x385 >= -1 ;++1 x3303 -1 x389 +1 x385 >= 0 ;+-1 x3304 +1 x390 >= 0 ;+-1 x3304 -1 x386 >= -1 ;++1 x3304 -1 x390 +1 x386 >= 0 ;+-1 x3305 +1 x391 >= 0 ;+-1 x3305 -1 x387 >= -1 ;++1 x3305 -1 x391 +1 x387 >= 0 ;+-1 x3306 +1 x392 >= 0 ;+-1 x3306 -1 x388 >= -1 ;++1 x3306 -1 x392 +1 x388 >= 0 ;+-1 x3307 +1 x393 >= 0 ;+-1 x3307 -1 x389 >= -1 ;++1 x3307 -1 x393 +1 x389 >= 0 ;+-1 x3308 +1 x394 >= 0 ;+-1 x3308 -1 x390 >= -1 ;++1 x3308 -1 x394 +1 x390 >= 0 ;+-1 x3309 +1 x395 >= 0 ;+-1 x3309 -1 x391 >= -1 ;++1 x3309 -1 x395 +1 x391 >= 0 ;+-1 x3310 +1 x396 >= 0 ;+-1 x3310 -1 x392 >= -1 ;++1 x3310 -1 x396 +1 x392 >= 0 ;+-1 x3311 +1 x397 >= 0 ;+-1 x3311 -1 x393 >= -1 ;++1 x3311 -1 x397 +1 x393 >= 0 ;+-1 x3312 +1 x398 >= 0 ;+-1 x3312 -1 x394 >= -1 ;++1 x3312 -1 x398 +1 x394 >= 0 ;+-1 x3313 +1 x399 >= 0 ;+-1 x3313 -1 x395 >= -1 ;++1 x3313 -1 x399 +1 x395 >= 0 ;+-1 x3314 +1 x400 >= 0 ;+-1 x3314 -1 x396 >= -1 ;++1 x3314 -1 x400 +1 x396 >= 0 ;+-1 x3315 +1 x401 >= 0 ;+-1 x3315 -1 x397 >= -1 ;++1 x3315 -1 x401 +1 x397 >= 0 ;+-1 x3316 +1 x402 >= 0 ;+-1 x3316 -1 x398 >= -1 ;++1 x3316 -1 x402 +1 x398 >= 0 ;+-1 x3317 +1 x403 >= 0 ;+-1 x3317 -1 x399 >= -1 ;++1 x3317 -1 x403 +1 x399 >= 0 ;+-1 x3318 +1 x404 >= 0 ;+-1 x3318 -1 x400 >= -1 ;++1 x3318 -1 x404 +1 x400 >= 0 ;+-1 x3319 +1 x405 >= 0 ;+-1 x3319 -1 x401 >= -1 ;++1 x3319 -1 x405 +1 x401 >= 0 ;+-1 x3320 +1 x406 >= 0 ;+-1 x3320 -1 x402 >= -1 ;++1 x3320 -1 x406 +1 x402 >= 0 ;+-1 x3321 +1 x407 >= 0 ;+-1 x3321 -1 x403 >= -1 ;++1 x3321 -1 x407 +1 x403 >= 0 ;+-1 x3322 +1 x408 >= 0 ;+-1 x3322 -1 x404 >= -1 ;++1 x3322 -1 x408 +1 x404 >= 0 ;+-1 x3323 +1 x409 >= 0 ;+-1 x3323 -1 x405 >= -1 ;++1 x3323 -1 x409 +1 x405 >= 0 ;+-1 x3324 +1 x410 >= 0 ;+-1 x3324 -1 x406 >= -1 ;++1 x3324 -1 x410 +1 x406 >= 0 ;+-1 x3325 +1 x411 >= 0 ;+-1 x3325 -1 x407 >= -1 ;++1 x3325 -1 x411 +1 x407 >= 0 ;+-1 x3326 +1 x412 >= 0 ;+-1 x3326 -1 x408 >= -1 ;++1 x3326 -1 x412 +1 x408 >= 0 ;+-1 x3327 +1 x413 >= 0 ;+-1 x3327 -1 x409 >= -1 ;++1 x3327 -1 x413 +1 x409 >= 0 ;+-1 x3328 +1 x414 >= 0 ;+-1 x3328 -1 x410 >= -1 ;++1 x3328 -1 x414 +1 x410 >= 0 ;+-1 x3329 +1 x415 >= 0 ;+-1 x3329 -1 x411 >= -1 ;++1 x3329 -1 x415 +1 x411 >= 0 ;+-1 x3330 +1 x416 >= 0 ;+-1 x3330 -1 x412 >= -1 ;++1 x3330 -1 x416 +1 x412 >= 0 ;+-1 x3331 +1 x417 >= 0 ;+-1 x3331 -1 x413 >= -1 ;++1 x3331 -1 x417 +1 x413 >= 0 ;+-1 x3332 +1 x418 >= 0 ;+-1 x3332 -1 x414 >= -1 ;++1 x3332 -1 x418 +1 x414 >= 0 ;+-1 x3333 +1 x419 >= 0 ;+-1 x3333 -1 x415 >= -1 ;++1 x3333 -1 x419 +1 x415 >= 0 ;+-1 x3334 +1 x420 >= 0 ;+-1 x3334 -1 x416 >= -1 ;++1 x3334 -1 x420 +1 x416 >= 0 ;+-1 x3335 +1 x421 >= 0 ;+-1 x3335 -1 x417 >= -1 ;++1 x3335 -1 x421 +1 x417 >= 0 ;+-1 x3336 +1 x422 >= 0 ;+-1 x3336 -1 x418 >= -1 ;++1 x3336 -1 x422 +1 x418 >= 0 ;+-1 x3337 +1 x423 >= 0 ;+-1 x3337 -1 x419 >= -1 ;++1 x3337 -1 x423 +1 x419 >= 0 ;+-1 x3338 +1 x424 >= 0 ;+-1 x3338 -1 x420 >= -1 ;++1 x3338 -1 x424 +1 x420 >= 0 ;+-1 x3339 +1 x425 >= 0 ;+-1 x3339 -1 x421 >= -1 ;++1 x3339 -1 x425 +1 x421 >= 0 ;+-1 x3340 +1 x426 >= 0 ;+-1 x3340 -1 x422 >= -1 ;++1 x3340 -1 x426 +1 x422 >= 0 ;+-1 x3341 +1 x427 >= 0 ;+-1 x3341 -1 x423 >= -1 ;++1 x3341 -1 x427 +1 x423 >= 0 ;+-1 x3342 +1 x428 >= 0 ;+-1 x3342 -1 x424 >= -1 ;++1 x3342 -1 x428 +1 x424 >= 0 ;+-1 x3343 +1 x429 >= 0 ;+-1 x3343 -1 x425 >= -1 ;++1 x3343 -1 x429 +1 x425 >= 0 ;+-1 x3344 +1 x430 >= 0 ;+-1 x3344 -1 x426 >= -1 ;++1 x3344 -1 x430 +1 x426 >= 0 ;+-1 x3345 +1 x431 >= 0 ;+-1 x3345 -1 x427 >= -1 ;++1 x3345 -1 x431 +1 x427 >= 0 ;+-1 x3346 +1 x432 >= 0 ;+-1 x3346 -1 x428 >= -1 ;++1 x3346 -1 x432 +1 x428 >= 0 ;+-1 x3347 +1 x433 >= 0 ;+-1 x3347 -1 x429 >= -1 ;++1 x3347 -1 x433 +1 x429 >= 0 ;+-1 x3348 +1 x434 >= 0 ;+-1 x3348 -1 x430 >= -1 ;++1 x3348 -1 x434 +1 x430 >= 0 ;+-1 x3349 +1 x435 >= 0 ;+-1 x3349 -1 x431 >= -1 ;++1 x3349 -1 x435 +1 x431 >= 0 ;+-1 x3350 +1 x436 >= 0 ;+-1 x3350 -1 x432 >= -1 ;++1 x3350 -1 x436 +1 x432 >= 0 ;+-1 x3351 +1 x437 >= 0 ;+-1 x3351 -1 x433 >= -1 ;++1 x3351 -1 x437 +1 x433 >= 0 ;+-1 x3352 +1 x438 >= 0 ;+-1 x3352 -1 x434 >= -1 ;++1 x3352 -1 x438 +1 x434 >= 0 ;+-1 x3353 +1 x439 >= 0 ;+-1 x3353 -1 x435 >= -1 ;++1 x3353 -1 x439 +1 x435 >= 0 ;+-1 x3354 +1 x440 >= 0 ;+-1 x3354 -1 x436 >= -1 ;++1 x3354 -1 x440 +1 x436 >= 0 ;+-1 x3355 +1 x441 >= 0 ;+-1 x3355 -1 x437 >= -1 ;++1 x3355 -1 x441 +1 x437 >= 0 ;+-1 x3356 +1 x442 >= 0 ;+-1 x3356 -1 x438 >= -1 ;++1 x3356 -1 x442 +1 x438 >= 0 ;+-1 x3357 +1 x443 >= 0 ;+-1 x3357 -1 x439 >= -1 ;++1 x3357 -1 x443 +1 x439 >= 0 ;+-1 x3358 +1 x444 >= 0 ;+-1 x3358 -1 x440 >= -1 ;++1 x3358 -1 x444 +1 x440 >= 0 ;+-1 x3359 +1 x445 >= 0 ;+-1 x3359 -1 x441 >= -1 ;++1 x3359 -1 x445 +1 x441 >= 0 ;+-1 x3360 +1 x446 >= 0 ;+-1 x3360 -1 x442 >= -1 ;++1 x3360 -1 x446 +1 x442 >= 0 ;+-1 x3361 +1 x447 >= 0 ;+-1 x3361 -1 x443 >= -1 ;++1 x3361 -1 x447 +1 x443 >= 0 ;+-1 x3362 +1 x448 >= 0 ;+-1 x3362 -1 x444 >= -1 ;++1 x3362 -1 x448 +1 x444 >= 0 ;+-1 x3363 +1 x449 >= 0 ;+-1 x3363 -1 x445 >= -1 ;++1 x3363 -1 x449 +1 x445 >= 0 ;+-1 x3364 +1 x450 >= 0 ;+-1 x3364 -1 x446 >= -1 ;++1 x3364 -1 x450 +1 x446 >= 0 ;+-1 x3365 +1 x451 >= 0 ;+-1 x3365 -1 x447 >= -1 ;++1 x3365 -1 x451 +1 x447 >= 0 ;+-1 x3366 +1 x452 >= 0 ;+-1 x3366 -1 x448 >= -1 ;++1 x3366 -1 x452 +1 x448 >= 0 ;+-1 x3367 +1 x453 >= 0 ;+-1 x3367 -1 x449 >= -1 ;++1 x3367 -1 x453 +1 x449 >= 0 ;+-1 x3368 +1 x454 >= 0 ;+-1 x3368 -1 x450 >= -1 ;++1 x3368 -1 x454 +1 x450 >= 0 ;+-1 x3369 +1 x455 >= 0 ;+-1 x3369 -1 x451 >= -1 ;++1 x3369 -1 x455 +1 x451 >= 0 ;+-1 x3370 +1 x456 >= 0 ;+-1 x3370 -1 x452 >= -1 ;++1 x3370 -1 x456 +1 x452 >= 0 ;+-1 x3371 +1 x457 >= 0 ;+-1 x3371 -1 x453 >= -1 ;++1 x3371 -1 x457 +1 x453 >= 0 ;+-1 x3372 +1 x458 >= 0 ;+-1 x3372 -1 x454 >= -1 ;++1 x3372 -1 x458 +1 x454 >= 0 ;+-1 x3373 +1 x459 >= 0 ;+-1 x3373 -1 x455 >= -1 ;++1 x3373 -1 x459 +1 x455 >= 0 ;+-1 x3374 +1 x460 >= 0 ;+-1 x3374 -1 x456 >= -1 ;++1 x3374 -1 x460 +1 x456 >= 0 ;+-1 x3375 +1 x461 >= 0 ;+-1 x3375 -1 x457 >= -1 ;++1 x3375 -1 x461 +1 x457 >= 0 ;+-1 x3376 +1 x462 >= 0 ;+-1 x3376 -1 x458 >= -1 ;++1 x3376 -1 x462 +1 x458 >= 0 ;+-1 x3377 +1 x463 >= 0 ;+-1 x3377 -1 x459 >= -1 ;++1 x3377 -1 x463 +1 x459 >= 0 ;+-1 x3378 +1 x464 >= 0 ;+-1 x3378 -1 x460 >= -1 ;++1 x3378 -1 x464 +1 x460 >= 0 ;+-1 x3379 +1 x465 >= 0 ;+-1 x3379 -1 x461 >= -1 ;++1 x3379 -1 x465 +1 x461 >= 0 ;+-1 x3380 +1 x466 >= 0 ;+-1 x3380 -1 x462 >= -1 ;++1 x3380 -1 x466 +1 x462 >= 0 ;+-1 x3381 +1 x467 >= 0 ;+-1 x3381 -1 x463 >= -1 ;++1 x3381 -1 x467 +1 x463 >= 0 ;+-1 x3382 +1 x468 >= 0 ;+-1 x3382 -1 x464 >= -1 ;++1 x3382 -1 x468 +1 x464 >= 0 ;+-1 x3383 +1 x469 >= 0 ;+-1 x3383 -1 x465 >= -1 ;++1 x3383 -1 x469 +1 x465 >= 0 ;+-1 x3384 +1 x470 >= 0 ;+-1 x3384 -1 x466 >= -1 ;++1 x3384 -1 x470 +1 x466 >= 0 ;+-1 x3385 +1 x471 >= 0 ;++1 x3385 -1 x471 >= 0 ;+-1 x3386 +1 x472 >= 0 ;++1 x3386 -1 x472 >= 0 ;+-1 x3387 +1 x473 >= 0 ;++1 x3387 -1 x473 >= 0 ;+-1 x3388 +1 x474 >= 0 ;++1 x3388 -1 x474 >= 0 ;+-1 x3389 +1 x475 >= 0 ;++1 x3389 -1 x475 >= 0 ;+-1 x3390 +1 x476 >= 0 ;++1 x3390 -1 x476 >= 0 ;+-1 x3391 +1 x477 >= 0 ;++1 x3391 -1 x477 >= 0 ;+-1 x3392 +1 x478 >= 0 ;++1 x3392 -1 x478 >= 0 ;+-1 x3393 +1 x479 >= 0 ;++1 x3393 -1 x479 >= 0 ;+-1 x3394 +1 x480 >= 0 ;+-1 x3394 -1 x471 >= -1 ;++1 x3394 -1 x480 +1 x471 >= 0 ;+-1 x3395 +1 x481 >= 0 ;+-1 x3395 -1 x472 >= -1 ;++1 x3395 -1 x481 +1 x472 >= 0 ;+-1 x3396 +1 x482 >= 0 ;+-1 x3396 -1 x473 >= -1 ;++1 x3396 -1 x482 +1 x473 >= 0 ;+-1 x3397 +1 x483 >= 0 ;+-1 x3397 -1 x474 >= -1 ;++1 x3397 -1 x483 +1 x474 >= 0 ;+-1 x3398 +1 x484 >= 0 ;+-1 x3398 -1 x475 >= -1 ;++1 x3398 -1 x484 +1 x475 >= 0 ;+-1 x3399 +1 x485 >= 0 ;+-1 x3399 -1 x476 >= -1 ;++1 x3399 -1 x485 +1 x476 >= 0 ;+-1 x3400 +1 x486 >= 0 ;+-1 x3400 -1 x477 >= -1 ;++1 x3400 -1 x486 +1 x477 >= 0 ;+-1 x3401 +1 x487 >= 0 ;+-1 x3401 -1 x478 >= -1 ;++1 x3401 -1 x487 +1 x478 >= 0 ;+-1 x3402 +1 x488 >= 0 ;+-1 x3402 -1 x479 >= -1 ;++1 x3402 -1 x488 +1 x479 >= 0 ;+-1 x3403 +1 x489 >= 0 ;+-1 x3403 -1 x480 >= -1 ;++1 x3403 -1 x489 +1 x480 >= 0 ;+-1 x3404 +1 x490 >= 0 ;+-1 x3404 -1 x481 >= -1 ;++1 x3404 -1 x490 +1 x481 >= 0 ;+-1 x3405 +1 x491 >= 0 ;+-1 x3405 -1 x482 >= -1 ;++1 x3405 -1 x491 +1 x482 >= 0 ;+-1 x3406 +1 x492 >= 0 ;+-1 x3406 -1 x483 >= -1 ;++1 x3406 -1 x492 +1 x483 >= 0 ;+-1 x3407 +1 x493 >= 0 ;+-1 x3407 -1 x484 >= -1 ;++1 x3407 -1 x493 +1 x484 >= 0 ;+-1 x3408 +1 x494 >= 0 ;+-1 x3408 -1 x485 >= -1 ;++1 x3408 -1 x494 +1 x485 >= 0 ;+-1 x3409 +1 x495 >= 0 ;+-1 x3409 -1 x486 >= -1 ;++1 x3409 -1 x495 +1 x486 >= 0 ;+-1 x3410 +1 x496 >= 0 ;+-1 x3410 -1 x487 >= -1 ;++1 x3410 -1 x496 +1 x487 >= 0 ;+-1 x3411 +1 x497 >= 0 ;+-1 x3411 -1 x488 >= -1 ;++1 x3411 -1 x497 +1 x488 >= 0 ;+-1 x3412 +1 x498 >= 0 ;+-1 x3412 -1 x489 >= -1 ;++1 x3412 -1 x498 +1 x489 >= 0 ;+-1 x3413 +1 x499 >= 0 ;+-1 x3413 -1 x490 >= -1 ;++1 x3413 -1 x499 +1 x490 >= 0 ;+-1 x3414 +1 x500 >= 0 ;+-1 x3414 -1 x491 >= -1 ;++1 x3414 -1 x500 +1 x491 >= 0 ;+-1 x3415 +1 x501 >= 0 ;+-1 x3415 -1 x492 >= -1 ;++1 x3415 -1 x501 +1 x492 >= 0 ;+-1 x3416 +1 x502 >= 0 ;+-1 x3416 -1 x493 >= -1 ;++1 x3416 -1 x502 +1 x493 >= 0 ;+-1 x3417 +1 x503 >= 0 ;+-1 x3417 -1 x494 >= -1 ;++1 x3417 -1 x503 +1 x494 >= 0 ;+-1 x3418 +1 x504 >= 0 ;+-1 x3418 -1 x495 >= -1 ;++1 x3418 -1 x504 +1 x495 >= 0 ;+-1 x3419 +1 x505 >= 0 ;+-1 x3419 -1 x496 >= -1 ;++1 x3419 -1 x505 +1 x496 >= 0 ;+-1 x3420 +1 x506 >= 0 ;+-1 x3420 -1 x497 >= -1 ;++1 x3420 -1 x506 +1 x497 >= 0 ;+-1 x3421 +1 x507 >= 0 ;+-1 x3421 -1 x498 >= -1 ;++1 x3421 -1 x507 +1 x498 >= 0 ;+-1 x3422 +1 x508 >= 0 ;+-1 x3422 -1 x499 >= -1 ;++1 x3422 -1 x508 +1 x499 >= 0 ;+-1 x3423 +1 x509 >= 0 ;+-1 x3423 -1 x500 >= -1 ;++1 x3423 -1 x509 +1 x500 >= 0 ;+-1 x3424 +1 x510 >= 0 ;+-1 x3424 -1 x501 >= -1 ;++1 x3424 -1 x510 +1 x501 >= 0 ;+-1 x3425 +1 x511 >= 0 ;+-1 x3425 -1 x502 >= -1 ;++1 x3425 -1 x511 +1 x502 >= 0 ;+-1 x3426 +1 x512 >= 0 ;+-1 x3426 -1 x503 >= -1 ;++1 x3426 -1 x512 +1 x503 >= 0 ;+-1 x3427 +1 x513 >= 0 ;+-1 x3427 -1 x504 >= -1 ;++1 x3427 -1 x513 +1 x504 >= 0 ;+-1 x3428 +1 x514 >= 0 ;+-1 x3428 -1 x505 >= -1 ;++1 x3428 -1 x514 +1 x505 >= 0 ;+-1 x3429 +1 x515 >= 0 ;+-1 x3429 -1 x506 >= -1 ;++1 x3429 -1 x515 +1 x506 >= 0 ;+-1 x3430 +1 x516 >= 0 ;+-1 x3430 -1 x507 >= -1 ;++1 x3430 -1 x516 +1 x507 >= 0 ;+-1 x3431 +1 x517 >= 0 ;+-1 x3431 -1 x508 >= -1 ;++1 x3431 -1 x517 +1 x508 >= 0 ;+-1 x3432 +1 x518 >= 0 ;+-1 x3432 -1 x509 >= -1 ;++1 x3432 -1 x518 +1 x509 >= 0 ;+-1 x3433 +1 x519 >= 0 ;+-1 x3433 -1 x510 >= -1 ;++1 x3433 -1 x519 +1 x510 >= 0 ;+-1 x3434 +1 x520 >= 0 ;+-1 x3434 -1 x511 >= -1 ;++1 x3434 -1 x520 +1 x511 >= 0 ;+-1 x3435 +1 x521 >= 0 ;+-1 x3435 -1 x512 >= -1 ;++1 x3435 -1 x521 +1 x512 >= 0 ;+-1 x3436 +1 x522 >= 0 ;+-1 x3436 -1 x513 >= -1 ;++1 x3436 -1 x522 +1 x513 >= 0 ;+-1 x3437 +1 x523 >= 0 ;+-1 x3437 -1 x514 >= -1 ;++1 x3437 -1 x523 +1 x514 >= 0 ;+-1 x3438 +1 x524 >= 0 ;+-1 x3438 -1 x515 >= -1 ;++1 x3438 -1 x524 +1 x515 >= 0 ;+-1 x3439 +1 x525 >= 0 ;+-1 x3439 -1 x516 >= -1 ;++1 x3439 -1 x525 +1 x516 >= 0 ;+-1 x3440 +1 x526 >= 0 ;+-1 x3440 -1 x517 >= -1 ;++1 x3440 -1 x526 +1 x517 >= 0 ;+-1 x3441 +1 x527 >= 0 ;+-1 x3441 -1 x518 >= -1 ;++1 x3441 -1 x527 +1 x518 >= 0 ;+-1 x3442 +1 x528 >= 0 ;+-1 x3442 -1 x519 >= -1 ;++1 x3442 -1 x528 +1 x519 >= 0 ;+-1 x3443 +1 x529 >= 0 ;+-1 x3443 -1 x520 >= -1 ;++1 x3443 -1 x529 +1 x520 >= 0 ;+-1 x3444 +1 x530 >= 0 ;+-1 x3444 -1 x521 >= -1 ;++1 x3444 -1 x530 +1 x521 >= 0 ;+-1 x3445 +1 x531 >= 0 ;+-1 x3445 -1 x522 >= -1 ;++1 x3445 -1 x531 +1 x522 >= 0 ;+-1 x3446 +1 x532 >= 0 ;+-1 x3446 -1 x523 >= -1 ;++1 x3446 -1 x532 +1 x523 >= 0 ;+-1 x3447 +1 x533 >= 0 ;+-1 x3447 -1 x524 >= -1 ;++1 x3447 -1 x533 +1 x524 >= 0 ;+-1 x3448 +1 x534 >= 0 ;+-1 x3448 -1 x525 >= -1 ;++1 x3448 -1 x534 +1 x525 >= 0 ;+-1 x3449 +1 x535 >= 0 ;+-1 x3449 -1 x526 >= -1 ;++1 x3449 -1 x535 +1 x526 >= 0 ;+-1 x3450 +1 x536 >= 0 ;+-1 x3450 -1 x527 >= -1 ;++1 x3450 -1 x536 +1 x527 >= 0 ;+-1 x3451 +1 x537 >= 0 ;+-1 x3451 -1 x528 >= -1 ;++1 x3451 -1 x537 +1 x528 >= 0 ;+-1 x3452 +1 x538 >= 0 ;+-1 x3452 -1 x529 >= -1 ;++1 x3452 -1 x538 +1 x529 >= 0 ;+-1 x3453 +1 x539 >= 0 ;+-1 x3453 -1 x530 >= -1 ;++1 x3453 -1 x539 +1 x530 >= 0 ;+-1 x3454 +1 x540 >= 0 ;+-1 x3454 -1 x531 >= -1 ;++1 x3454 -1 x540 +1 x531 >= 0 ;+-1 x3455 +1 x541 >= 0 ;+-1 x3455 -1 x532 >= -1 ;++1 x3455 -1 x541 +1 x532 >= 0 ;+-1 x3456 +1 x542 >= 0 ;+-1 x3456 -1 x533 >= -1 ;++1 x3456 -1 x542 +1 x533 >= 0 ;+-1 x3457 +1 x543 >= 0 ;+-1 x3457 -1 x534 >= -1 ;++1 x3457 -1 x543 +1 x534 >= 0 ;+-1 x3458 +1 x544 >= 0 ;+-1 x3458 -1 x535 >= -1 ;++1 x3458 -1 x544 +1 x535 >= 0 ;+-1 x3459 +1 x545 >= 0 ;+-1 x3459 -1 x536 >= -1 ;++1 x3459 -1 x545 +1 x536 >= 0 ;+-1 x3460 +1 x546 >= 0 ;+-1 x3460 -1 x537 >= -1 ;++1 x3460 -1 x546 +1 x537 >= 0 ;+-1 x3461 +1 x547 >= 0 ;+-1 x3461 -1 x538 >= -1 ;++1 x3461 -1 x547 +1 x538 >= 0 ;+-1 x3462 +1 x548 >= 0 ;+-1 x3462 -1 x539 >= -1 ;++1 x3462 -1 x548 +1 x539 >= 0 ;+-1 x3463 +1 x549 >= 0 ;+-1 x3463 -1 x540 >= -1 ;++1 x3463 -1 x549 +1 x540 >= 0 ;+-1 x3464 +1 x550 >= 0 ;+-1 x3464 -1 x541 >= -1 ;++1 x3464 -1 x550 +1 x541 >= 0 ;+-1 x3465 +1 x551 >= 0 ;+-1 x3465 -1 x542 >= -1 ;++1 x3465 -1 x551 +1 x542 >= 0 ;+-1 x3466 +1 x552 >= 0 ;+-1 x3466 -1 x543 >= -1 ;++1 x3466 -1 x552 +1 x543 >= 0 ;+-1 x3467 +1 x553 >= 0 ;+-1 x3467 -1 x544 >= -1 ;++1 x3467 -1 x553 +1 x544 >= 0 ;+-1 x3468 +1 x554 >= 0 ;+-1 x3468 -1 x545 >= -1 ;++1 x3468 -1 x554 +1 x545 >= 0 ;+-1 x3469 +1 x555 >= 0 ;+-1 x3469 -1 x546 >= -1 ;++1 x3469 -1 x555 +1 x546 >= 0 ;+-1 x3470 +1 x556 >= 0 ;+-1 x3470 -1 x547 >= -1 ;++1 x3470 -1 x556 +1 x547 >= 0 ;+-1 x3471 +1 x557 >= 0 ;+-1 x3471 -1 x548 >= -1 ;++1 x3471 -1 x557 +1 x548 >= 0 ;+-1 x3472 +1 x558 >= 0 ;+-1 x3472 -1 x549 >= -1 ;++1 x3472 -1 x558 +1 x549 >= 0 ;+-1 x3473 +1 x559 >= 0 ;+-1 x3473 -1 x550 >= -1 ;++1 x3473 -1 x559 +1 x550 >= 0 ;+-1 x3474 +1 x560 >= 0 ;+-1 x3474 -1 x551 >= -1 ;++1 x3474 -1 x560 +1 x551 >= 0 ;+-1 x3475 +1 x561 >= 0 ;+-1 x3475 -1 x552 >= -1 ;++1 x3475 -1 x561 +1 x552 >= 0 ;+-1 x3476 +1 x562 >= 0 ;+-1 x3476 -1 x553 >= -1 ;++1 x3476 -1 x562 +1 x553 >= 0 ;+-1 x3477 +1 x563 >= 0 ;+-1 x3477 -1 x554 >= -1 ;++1 x3477 -1 x563 +1 x554 >= 0 ;+-1 x3478 +1 x564 >= 0 ;+-1 x3478 -1 x555 >= -1 ;++1 x3478 -1 x564 +1 x555 >= 0 ;+-1 x3479 +1 x565 >= 0 ;++1 x3479 -1 x565 >= 0 ;+-1 x3480 +1 x566 >= 0 ;++1 x3480 -1 x566 >= 0 ;+-1 x3481 +1 x567 >= 0 ;++1 x3481 -1 x567 >= 0 ;+-1 x3482 +1 x568 >= 0 ;++1 x3482 -1 x568 >= 0 ;+-1 x3483 +1 x569 >= 0 ;++1 x3483 -1 x569 >= 0 ;+-1 x3484 +1 x570 >= 0 ;++1 x3484 -1 x570 >= 0 ;+-1 x3485 +1 x571 >= 0 ;++1 x3485 -1 x571 >= 0 ;+-1 x3486 +1 x572 >= 0 ;++1 x3486 -1 x572 >= 0 ;+-1 x3487 +1 x573 >= 0 ;++1 x3487 -1 x573 >= 0 ;+-1 x3488 +1 x574 >= 0 ;++1 x3488 -1 x574 >= 0 ;+-1 x3489 +1 x575 >= 0 ;+-1 x3489 -1 x565 >= -1 ;++1 x3489 -1 x575 +1 x565 >= 0 ;+-1 x3490 +1 x576 >= 0 ;+-1 x3490 -1 x566 >= -1 ;++1 x3490 -1 x576 +1 x566 >= 0 ;+-1 x3491 +1 x577 >= 0 ;+-1 x3491 -1 x567 >= -1 ;++1 x3491 -1 x577 +1 x567 >= 0 ;+-1 x3492 +1 x578 >= 0 ;+-1 x3492 -1 x568 >= -1 ;++1 x3492 -1 x578 +1 x568 >= 0 ;+-1 x3493 +1 x579 >= 0 ;+-1 x3493 -1 x569 >= -1 ;++1 x3493 -1 x579 +1 x569 >= 0 ;+-1 x3494 +1 x580 >= 0 ;+-1 x3494 -1 x570 >= -1 ;++1 x3494 -1 x580 +1 x570 >= 0 ;+-1 x3495 +1 x581 >= 0 ;+-1 x3495 -1 x571 >= -1 ;++1 x3495 -1 x581 +1 x571 >= 0 ;+-1 x3496 +1 x582 >= 0 ;+-1 x3496 -1 x572 >= -1 ;++1 x3496 -1 x582 +1 x572 >= 0 ;+-1 x3497 +1 x583 >= 0 ;+-1 x3497 -1 x573 >= -1 ;++1 x3497 -1 x583 +1 x573 >= 0 ;+-1 x3498 +1 x584 >= 0 ;+-1 x3498 -1 x574 >= -1 ;++1 x3498 -1 x584 +1 x574 >= 0 ;+-1 x3499 +1 x585 >= 0 ;+-1 x3499 -1 x575 >= -1 ;++1 x3499 -1 x585 +1 x575 >= 0 ;+-1 x3500 +1 x586 >= 0 ;+-1 x3500 -1 x576 >= -1 ;++1 x3500 -1 x586 +1 x576 >= 0 ;+-1 x3501 +1 x587 >= 0 ;+-1 x3501 -1 x577 >= -1 ;++1 x3501 -1 x587 +1 x577 >= 0 ;+-1 x3502 +1 x588 >= 0 ;+-1 x3502 -1 x578 >= -1 ;++1 x3502 -1 x588 +1 x578 >= 0 ;+-1 x3503 +1 x589 >= 0 ;+-1 x3503 -1 x579 >= -1 ;++1 x3503 -1 x589 +1 x579 >= 0 ;+-1 x3504 +1 x590 >= 0 ;+-1 x3504 -1 x580 >= -1 ;++1 x3504 -1 x590 +1 x580 >= 0 ;+-1 x3505 +1 x591 >= 0 ;+-1 x3505 -1 x581 >= -1 ;++1 x3505 -1 x591 +1 x581 >= 0 ;+-1 x3506 +1 x592 >= 0 ;+-1 x3506 -1 x582 >= -1 ;++1 x3506 -1 x592 +1 x582 >= 0 ;+-1 x3507 +1 x593 >= 0 ;+-1 x3507 -1 x583 >= -1 ;++1 x3507 -1 x593 +1 x583 >= 0 ;+-1 x3508 +1 x594 >= 0 ;+-1 x3508 -1 x584 >= -1 ;++1 x3508 -1 x594 +1 x584 >= 0 ;+-1 x3509 +1 x595 >= 0 ;+-1 x3509 -1 x585 >= -1 ;++1 x3509 -1 x595 +1 x585 >= 0 ;+-1 x3510 +1 x596 >= 0 ;+-1 x3510 -1 x586 >= -1 ;++1 x3510 -1 x596 +1 x586 >= 0 ;+-1 x3511 +1 x597 >= 0 ;+-1 x3511 -1 x587 >= -1 ;++1 x3511 -1 x597 +1 x587 >= 0 ;+-1 x3512 +1 x598 >= 0 ;+-1 x3512 -1 x588 >= -1 ;++1 x3512 -1 x598 +1 x588 >= 0 ;+-1 x3513 +1 x599 >= 0 ;+-1 x3513 -1 x589 >= -1 ;++1 x3513 -1 x599 +1 x589 >= 0 ;+-1 x3514 +1 x600 >= 0 ;+-1 x3514 -1 x590 >= -1 ;++1 x3514 -1 x600 +1 x590 >= 0 ;+-1 x3515 +1 x601 >= 0 ;+-1 x3515 -1 x591 >= -1 ;++1 x3515 -1 x601 +1 x591 >= 0 ;+-1 x3516 +1 x602 >= 0 ;+-1 x3516 -1 x592 >= -1 ;++1 x3516 -1 x602 +1 x592 >= 0 ;+-1 x3517 +1 x603 >= 0 ;+-1 x3517 -1 x593 >= -1 ;++1 x3517 -1 x603 +1 x593 >= 0 ;+-1 x3518 +1 x604 >= 0 ;+-1 x3518 -1 x594 >= -1 ;++1 x3518 -1 x604 +1 x594 >= 0 ;+-1 x3519 +1 x605 >= 0 ;+-1 x3519 -1 x595 >= -1 ;++1 x3519 -1 x605 +1 x595 >= 0 ;+-1 x3520 +1 x606 >= 0 ;+-1 x3520 -1 x596 >= -1 ;++1 x3520 -1 x606 +1 x596 >= 0 ;+-1 x3521 +1 x607 >= 0 ;+-1 x3521 -1 x597 >= -1 ;++1 x3521 -1 x607 +1 x597 >= 0 ;+-1 x3522 +1 x608 >= 0 ;+-1 x3522 -1 x598 >= -1 ;++1 x3522 -1 x608 +1 x598 >= 0 ;+-1 x3523 +1 x609 >= 0 ;+-1 x3523 -1 x599 >= -1 ;++1 x3523 -1 x609 +1 x599 >= 0 ;+-1 x3524 +1 x610 >= 0 ;+-1 x3524 -1 x600 >= -1 ;++1 x3524 -1 x610 +1 x600 >= 0 ;+-1 x3525 +1 x611 >= 0 ;+-1 x3525 -1 x601 >= -1 ;++1 x3525 -1 x611 +1 x601 >= 0 ;+-1 x3526 +1 x612 >= 0 ;+-1 x3526 -1 x602 >= -1 ;++1 x3526 -1 x612 +1 x602 >= 0 ;+-1 x3527 +1 x613 >= 0 ;+-1 x3527 -1 x603 >= -1 ;++1 x3527 -1 x613 +1 x603 >= 0 ;+-1 x3528 +1 x614 >= 0 ;+-1 x3528 -1 x604 >= -1 ;++1 x3528 -1 x614 +1 x604 >= 0 ;+-1 x3529 +1 x615 >= 0 ;+-1 x3529 -1 x605 >= -1 ;++1 x3529 -1 x615 +1 x605 >= 0 ;+-1 x3530 +1 x616 >= 0 ;+-1 x3530 -1 x606 >= -1 ;++1 x3530 -1 x616 +1 x606 >= 0 ;+-1 x3531 +1 x617 >= 0 ;+-1 x3531 -1 x607 >= -1 ;++1 x3531 -1 x617 +1 x607 >= 0 ;+-1 x3532 +1 x618 >= 0 ;+-1 x3532 -1 x608 >= -1 ;++1 x3532 -1 x618 +1 x608 >= 0 ;+-1 x3533 +1 x619 >= 0 ;+-1 x3533 -1 x609 >= -1 ;++1 x3533 -1 x619 +1 x609 >= 0 ;+-1 x3534 +1 x620 >= 0 ;+-1 x3534 -1 x610 >= -1 ;++1 x3534 -1 x620 +1 x610 >= 0 ;+-1 x3535 +1 x621 >= 0 ;+-1 x3535 -1 x611 >= -1 ;++1 x3535 -1 x621 +1 x611 >= 0 ;+-1 x3536 +1 x622 >= 0 ;+-1 x3536 -1 x612 >= -1 ;++1 x3536 -1 x622 +1 x612 >= 0 ;+-1 x3537 +1 x623 >= 0 ;+-1 x3537 -1 x613 >= -1 ;++1 x3537 -1 x623 +1 x613 >= 0 ;+-1 x3538 +1 x624 >= 0 ;+-1 x3538 -1 x614 >= -1 ;++1 x3538 -1 x624 +1 x614 >= 0 ;+-1 x3539 +1 x625 >= 0 ;+-1 x3539 -1 x615 >= -1 ;++1 x3539 -1 x625 +1 x615 >= 0 ;+-1 x3540 +1 x626 >= 0 ;+-1 x3540 -1 x616 >= -1 ;++1 x3540 -1 x626 +1 x616 >= 0 ;+-1 x3541 +1 x627 >= 0 ;+-1 x3541 -1 x617 >= -1 ;++1 x3541 -1 x627 +1 x617 >= 0 ;+-1 x3542 +1 x628 >= 0 ;+-1 x3542 -1 x618 >= -1 ;++1 x3542 -1 x628 +1 x618 >= 0 ;+-1 x3543 +1 x629 >= 0 ;+-1 x3543 -1 x619 >= -1 ;++1 x3543 -1 x629 +1 x619 >= 0 ;+-1 x3544 +1 x630 >= 0 ;+-1 x3544 -1 x620 >= -1 ;++1 x3544 -1 x630 +1 x620 >= 0 ;+-1 x3545 +1 x631 >= 0 ;+-1 x3545 -1 x621 >= -1 ;++1 x3545 -1 x631 +1 x621 >= 0 ;+-1 x3546 +1 x632 >= 0 ;+-1 x3546 -1 x622 >= -1 ;++1 x3546 -1 x632 +1 x622 >= 0 ;+-1 x3547 +1 x633 >= 0 ;+-1 x3547 -1 x623 >= -1 ;++1 x3547 -1 x633 +1 x623 >= 0 ;+-1 x3548 +1 x634 >= 0 ;+-1 x3548 -1 x624 >= -1 ;++1 x3548 -1 x634 +1 x624 >= 0 ;+-1 x3549 +1 x635 >= 0 ;+-1 x3549 -1 x625 >= -1 ;++1 x3549 -1 x635 +1 x625 >= 0 ;+-1 x3550 +1 x636 >= 0 ;+-1 x3550 -1 x626 >= -1 ;++1 x3550 -1 x636 +1 x626 >= 0 ;+-1 x3551 +1 x637 >= 0 ;+-1 x3551 -1 x627 >= -1 ;++1 x3551 -1 x637 +1 x627 >= 0 ;+-1 x3552 +1 x638 >= 0 ;+-1 x3552 -1 x628 >= -1 ;++1 x3552 -1 x638 +1 x628 >= 0 ;+-1 x3553 +1 x639 >= 0 ;+-1 x3553 -1 x629 >= -1 ;++1 x3553 -1 x639 +1 x629 >= 0 ;+-1 x3554 +1 x640 >= 0 ;+-1 x3554 -1 x630 >= -1 ;++1 x3554 -1 x640 +1 x630 >= 0 ;+-1 x3555 +1 x641 >= 0 ;+-1 x3555 -1 x631 >= -1 ;++1 x3555 -1 x641 +1 x631 >= 0 ;+-1 x3556 +1 x642 >= 0 ;+-1 x3556 -1 x632 >= -1 ;++1 x3556 -1 x642 +1 x632 >= 0 ;+-1 x3557 +1 x643 >= 0 ;+-1 x3557 -1 x633 >= -1 ;++1 x3557 -1 x643 +1 x633 >= 0 ;+-1 x3558 +1 x644 >= 0 ;+-1 x3558 -1 x634 >= -1 ;++1 x3558 -1 x644 +1 x634 >= 0 ;+-1 x3559 +1 x645 >= 0 ;+-1 x3559 -1 x635 >= -1 ;++1 x3559 -1 x645 +1 x635 >= 0 ;+-1 x3560 +1 x646 >= 0 ;+-1 x3560 -1 x636 >= -1 ;++1 x3560 -1 x646 +1 x636 >= 0 ;+-1 x3561 +1 x647 >= 0 ;+-1 x3561 -1 x637 >= -1 ;++1 x3561 -1 x647 +1 x637 >= 0 ;+-1 x3562 +1 x648 >= 0 ;+-1 x3562 -1 x638 >= -1 ;++1 x3562 -1 x648 +1 x638 >= 0 ;+-1 x3563 +1 x649 >= 0 ;+-1 x3563 -1 x639 >= -1 ;++1 x3563 -1 x649 +1 x639 >= 0 ;+-1 x3564 +1 x650 >= 0 ;+-1 x3564 -1 x640 >= -1 ;++1 x3564 -1 x650 +1 x640 >= 0 ;+-1 x3565 +1 x651 >= 0 ;+-1 x3565 -1 x641 >= -1 ;++1 x3565 -1 x651 +1 x641 >= 0 ;+-1 x3566 +1 x652 >= 0 ;+-1 x3566 -1 x642 >= -1 ;++1 x3566 -1 x652 +1 x642 >= 0 ;+-1 x3567 +1 x653 >= 0 ;+-1 x3567 -1 x643 >= -1 ;++1 x3567 -1 x653 +1 x643 >= 0 ;+-1 x3568 +1 x654 >= 0 ;+-1 x3568 -1 x644 >= -1 ;++1 x3568 -1 x654 +1 x644 >= 0 ;+-1 x3569 +1 x655 >= 0 ;+-1 x3569 -1 x645 >= -1 ;++1 x3569 -1 x655 +1 x645 >= 0 ;+-1 x3570 +1 x656 >= 0 ;+-1 x3570 -1 x646 >= -1 ;++1 x3570 -1 x656 +1 x646 >= 0 ;+-1 x3571 +1 x657 >= 0 ;+-1 x3571 -1 x647 >= -1 ;++1 x3571 -1 x657 +1 x647 >= 0 ;+-1 x3572 +1 x658 >= 0 ;+-1 x3572 -1 x648 >= -1 ;++1 x3572 -1 x658 +1 x648 >= 0 ;+-1 x3573 +1 x659 >= 0 ;++1 x3573 -1 x659 >= 0 ;+-1 x3574 +1 x660 >= 0 ;++1 x3574 -1 x660 >= 0 ;+-1 x3575 +1 x661 >= 0 ;++1 x3575 -1 x661 >= 0 ;+-1 x3576 +1 x662 >= 0 ;+-1 x3576 -1 x659 >= -1 ;++1 x3576 -1 x662 +1 x659 >= 0 ;+-1 x3577 +1 x663 >= 0 ;+-1 x3577 -1 x660 >= -1 ;++1 x3577 -1 x663 +1 x660 >= 0 ;+-1 x3578 +1 x664 >= 0 ;+-1 x3578 -1 x661 >= -1 ;++1 x3578 -1 x664 +1 x661 >= 0 ;+-1 x3579 +1 x665 >= 0 ;+-1 x3579 -1 x662 >= -1 ;++1 x3579 -1 x665 +1 x662 >= 0 ;+-1 x3580 +1 x666 >= 0 ;+-1 x3580 -1 x663 >= -1 ;++1 x3580 -1 x666 +1 x663 >= 0 ;+-1 x3581 +1 x667 >= 0 ;+-1 x3581 -1 x664 >= -1 ;++1 x3581 -1 x667 +1 x664 >= 0 ;+-1 x3582 +1 x668 >= 0 ;+-1 x3582 -1 x665 >= -1 ;++1 x3582 -1 x668 +1 x665 >= 0 ;+-1 x3583 +1 x669 >= 0 ;+-1 x3583 -1 x666 >= -1 ;++1 x3583 -1 x669 +1 x666 >= 0 ;+-1 x3584 +1 x670 >= 0 ;+-1 x3584 -1 x667 >= -1 ;++1 x3584 -1 x670 +1 x667 >= 0 ;+-1 x3585 +1 x671 >= 0 ;+-1 x3585 -1 x668 >= -1 ;++1 x3585 -1 x671 +1 x668 >= 0 ;+-1 x3586 +1 x672 >= 0 ;+-1 x3586 -1 x669 >= -1 ;++1 x3586 -1 x672 +1 x669 >= 0 ;+-1 x3587 +1 x673 >= 0 ;+-1 x3587 -1 x670 >= -1 ;++1 x3587 -1 x673 +1 x670 >= 0 ;+-1 x3588 +1 x674 >= 0 ;+-1 x3588 -1 x671 >= -1 ;++1 x3588 -1 x674 +1 x671 >= 0 ;+-1 x3589 +1 x675 >= 0 ;+-1 x3589 -1 x672 >= -1 ;++1 x3589 -1 x675 +1 x672 >= 0 ;+-1 x3590 +1 x676 >= 0 ;+-1 x3590 -1 x673 >= -1 ;++1 x3590 -1 x676 +1 x673 >= 0 ;+-1 x3591 +1 x677 >= 0 ;+-1 x3591 -1 x674 >= -1 ;++1 x3591 -1 x677 +1 x674 >= 0 ;+-1 x3592 +1 x678 >= 0 ;+-1 x3592 -1 x675 >= -1 ;++1 x3592 -1 x678 +1 x675 >= 0 ;+-1 x3593 +1 x679 >= 0 ;+-1 x3593 -1 x676 >= -1 ;++1 x3593 -1 x679 +1 x676 >= 0 ;+-1 x3594 +1 x680 >= 0 ;+-1 x3594 -1 x677 >= -1 ;++1 x3594 -1 x680 +1 x677 >= 0 ;+-1 x3595 +1 x681 >= 0 ;+-1 x3595 -1 x678 >= -1 ;++1 x3595 -1 x681 +1 x678 >= 0 ;+-1 x3596 +1 x682 >= 0 ;+-1 x3596 -1 x679 >= -1 ;++1 x3596 -1 x682 +1 x679 >= 0 ;+-1 x3597 +1 x683 >= 0 ;+-1 x3597 -1 x680 >= -1 ;++1 x3597 -1 x683 +1 x680 >= 0 ;+-1 x3598 +1 x684 >= 0 ;+-1 x3598 -1 x681 >= -1 ;++1 x3598 -1 x684 +1 x681 >= 0 ;+-1 x3599 +1 x685 >= 0 ;+-1 x3599 -1 x682 >= -1 ;++1 x3599 -1 x685 +1 x682 >= 0 ;+-1 x3600 +1 x686 >= 0 ;+-1 x3600 -1 x683 >= -1 ;++1 x3600 -1 x686 +1 x683 >= 0 ;+-1 x3601 +1 x687 >= 0 ;+-1 x3601 -1 x684 >= -1 ;++1 x3601 -1 x687 +1 x684 >= 0 ;+-1 x3602 +1 x688 >= 0 ;+-1 x3602 -1 x685 >= -1 ;++1 x3602 -1 x688 +1 x685 >= 0 ;+-1 x3603 +1 x689 >= 0 ;+-1 x3603 -1 x686 >= -1 ;++1 x3603 -1 x689 +1 x686 >= 0 ;+-1 x3604 +1 x690 >= 0 ;+-1 x3604 -1 x687 >= -1 ;++1 x3604 -1 x690 +1 x687 >= 0 ;+-1 x3605 +1 x691 >= 0 ;+-1 x3605 -1 x688 >= -1 ;++1 x3605 -1 x691 +1 x688 >= 0 ;+-1 x3606 +1 x692 >= 0 ;+-1 x3606 -1 x689 >= -1 ;++1 x3606 -1 x692 +1 x689 >= 0 ;+-1 x3607 +1 x693 >= 0 ;+-1 x3607 -1 x690 >= -1 ;++1 x3607 -1 x693 +1 x690 >= 0 ;+-1 x3608 +1 x694 >= 0 ;+-1 x3608 -1 x691 >= -1 ;++1 x3608 -1 x694 +1 x691 >= 0 ;+-1 x3609 +1 x695 >= 0 ;+-1 x3609 -1 x692 >= -1 ;++1 x3609 -1 x695 +1 x692 >= 0 ;+-1 x3610 +1 x696 >= 0 ;+-1 x3610 -1 x693 >= -1 ;++1 x3610 -1 x696 +1 x693 >= 0 ;+-1 x3611 +1 x697 >= 0 ;+-1 x3611 -1 x694 >= -1 ;++1 x3611 -1 x697 +1 x694 >= 0 ;+-1 x3612 +1 x698 >= 0 ;+-1 x3612 -1 x695 >= -1 ;++1 x3612 -1 x698 +1 x695 >= 0 ;+-1 x3613 +1 x699 >= 0 ;+-1 x3613 -1 x696 >= -1 ;++1 x3613 -1 x699 +1 x696 >= 0 ;+-1 x3614 +1 x700 >= 0 ;+-1 x3614 -1 x697 >= -1 ;++1 x3614 -1 x700 +1 x697 >= 0 ;+-1 x3615 +1 x701 >= 0 ;+-1 x3615 -1 x698 >= -1 ;++1 x3615 -1 x701 +1 x698 >= 0 ;+-1 x3616 +1 x702 >= 0 ;+-1 x3616 -1 x699 >= -1 ;++1 x3616 -1 x702 +1 x699 >= 0 ;+-1 x3617 +1 x703 >= 0 ;+-1 x3617 -1 x700 >= -1 ;++1 x3617 -1 x703 +1 x700 >= 0 ;+-1 x3618 +1 x704 >= 0 ;+-1 x3618 -1 x701 >= -1 ;++1 x3618 -1 x704 +1 x701 >= 0 ;+-1 x3619 +1 x705 >= 0 ;+-1 x3619 -1 x702 >= -1 ;++1 x3619 -1 x705 +1 x702 >= 0 ;+-1 x3620 +1 x706 >= 0 ;+-1 x3620 -1 x703 >= -1 ;++1 x3620 -1 x706 +1 x703 >= 0 ;+-1 x3621 +1 x707 >= 0 ;+-1 x3621 -1 x704 >= -1 ;++1 x3621 -1 x707 +1 x704 >= 0 ;+-1 x3622 +1 x708 >= 0 ;+-1 x3622 -1 x705 >= -1 ;++1 x3622 -1 x708 +1 x705 >= 0 ;+-1 x3623 +1 x709 >= 0 ;+-1 x3623 -1 x706 >= -1 ;++1 x3623 -1 x709 +1 x706 >= 0 ;+-1 x3624 +1 x710 >= 0 ;+-1 x3624 -1 x707 >= -1 ;++1 x3624 -1 x710 +1 x707 >= 0 ;+-1 x3625 +1 x711 >= 0 ;+-1 x3625 -1 x708 >= -1 ;++1 x3625 -1 x711 +1 x708 >= 0 ;+-1 x3626 +1 x712 >= 0 ;+-1 x3626 -1 x709 >= -1 ;++1 x3626 -1 x712 +1 x709 >= 0 ;+-1 x3627 +1 x713 >= 0 ;+-1 x3627 -1 x710 >= -1 ;++1 x3627 -1 x713 +1 x710 >= 0 ;+-1 x3628 +1 x714 >= 0 ;+-1 x3628 -1 x711 >= -1 ;++1 x3628 -1 x714 +1 x711 >= 0 ;+-1 x3629 +1 x715 >= 0 ;+-1 x3629 -1 x712 >= -1 ;++1 x3629 -1 x715 +1 x712 >= 0 ;+-1 x3630 +1 x716 >= 0 ;+-1 x3630 -1 x713 >= -1 ;++1 x3630 -1 x716 +1 x713 >= 0 ;+-1 x3631 +1 x717 >= 0 ;+-1 x3631 -1 x714 >= -1 ;++1 x3631 -1 x717 +1 x714 >= 0 ;+-1 x3632 +1 x718 >= 0 ;+-1 x3632 -1 x715 >= -1 ;++1 x3632 -1 x718 +1 x715 >= 0 ;+-1 x3633 +1 x719 >= 0 ;+-1 x3633 -1 x716 >= -1 ;++1 x3633 -1 x719 +1 x716 >= 0 ;+-1 x3634 +1 x720 >= 0 ;+-1 x3634 -1 x717 >= -1 ;++1 x3634 -1 x720 +1 x717 >= 0 ;+-1 x3635 +1 x721 >= 0 ;+-1 x3635 -1 x718 >= -1 ;++1 x3635 -1 x721 +1 x718 >= 0 ;+-1 x3636 +1 x722 >= 0 ;+-1 x3636 -1 x719 >= -1 ;++1 x3636 -1 x722 +1 x719 >= 0 ;+-1 x3637 +1 x723 >= 0 ;+-1 x3637 -1 x720 >= -1 ;++1 x3637 -1 x723 +1 x720 >= 0 ;+-1 x3638 +1 x724 >= 0 ;+-1 x3638 -1 x721 >= -1 ;++1 x3638 -1 x724 +1 x721 >= 0 ;+-1 x3639 +1 x725 >= 0 ;+-1 x3639 -1 x722 >= -1 ;++1 x3639 -1 x725 +1 x722 >= 0 ;+-1 x3640 +1 x726 >= 0 ;+-1 x3640 -1 x723 >= -1 ;++1 x3640 -1 x726 +1 x723 >= 0 ;+-1 x3641 +1 x727 >= 0 ;+-1 x3641 -1 x724 >= -1 ;++1 x3641 -1 x727 +1 x724 >= 0 ;+-1 x3642 +1 x728 >= 0 ;+-1 x3642 -1 x725 >= -1 ;++1 x3642 -1 x728 +1 x725 >= 0 ;+-1 x3643 +1 x729 >= 0 ;+-1 x3643 -1 x726 >= -1 ;++1 x3643 -1 x729 +1 x726 >= 0 ;+-1 x3644 +1 x730 >= 0 ;+-1 x3644 -1 x727 >= -1 ;++1 x3644 -1 x730 +1 x727 >= 0 ;+-1 x3645 +1 x731 >= 0 ;+-1 x3645 -1 x728 >= -1 ;++1 x3645 -1 x731 +1 x728 >= 0 ;+-1 x3646 +1 x732 >= 0 ;+-1 x3646 -1 x729 >= -1 ;++1 x3646 -1 x732 +1 x729 >= 0 ;+-1 x3647 +1 x733 >= 0 ;+-1 x3647 -1 x730 >= -1 ;++1 x3647 -1 x733 +1 x730 >= 0 ;+-1 x3648 +1 x734 >= 0 ;+-1 x3648 -1 x731 >= -1 ;++1 x3648 -1 x734 +1 x731 >= 0 ;+-1 x3649 +1 x735 >= 0 ;+-1 x3649 -1 x732 >= -1 ;++1 x3649 -1 x735 +1 x732 >= 0 ;+-1 x3650 +1 x736 >= 0 ;+-1 x3650 -1 x733 >= -1 ;++1 x3650 -1 x736 +1 x733 >= 0 ;+-1 x3651 +1 x737 >= 0 ;+-1 x3651 -1 x734 >= -1 ;++1 x3651 -1 x737 +1 x734 >= 0 ;+-1 x3652 +1 x738 >= 0 ;+-1 x3652 -1 x735 >= -1 ;++1 x3652 -1 x738 +1 x735 >= 0 ;+-1 x3653 +1 x739 >= 0 ;+-1 x3653 -1 x736 >= -1 ;++1 x3653 -1 x739 +1 x736 >= 0 ;+-1 x3654 +1 x740 >= 0 ;+-1 x3654 -1 x737 >= -1 ;++1 x3654 -1 x740 +1 x737 >= 0 ;+-1 x3655 +1 x741 >= 0 ;+-1 x3655 -1 x738 >= -1 ;++1 x3655 -1 x741 +1 x738 >= 0 ;+-1 x3656 +1 x742 >= 0 ;+-1 x3656 -1 x739 >= -1 ;++1 x3656 -1 x742 +1 x739 >= 0 ;+-1 x3657 +1 x743 >= 0 ;+-1 x3657 -1 x740 >= -1 ;++1 x3657 -1 x743 +1 x740 >= 0 ;+-1 x3658 +1 x744 >= 0 ;+-1 x3658 -1 x741 >= -1 ;++1 x3658 -1 x744 +1 x741 >= 0 ;+-1 x3659 +1 x745 >= 0 ;+-1 x3659 -1 x742 >= -1 ;++1 x3659 -1 x745 +1 x742 >= 0 ;+-1 x3660 +1 x746 >= 0 ;+-1 x3660 -1 x743 >= -1 ;++1 x3660 -1 x746 +1 x743 >= 0 ;+-1 x3661 +1 x747 >= 0 ;+-1 x3661 -1 x744 >= -1 ;++1 x3661 -1 x747 +1 x744 >= 0 ;+-1 x3662 +1 x748 >= 0 ;+-1 x3662 -1 x745 >= -1 ;++1 x3662 -1 x748 +1 x745 >= 0 ;+-1 x3663 +1 x749 >= 0 ;+-1 x3663 -1 x746 >= -1 ;++1 x3663 -1 x749 +1 x746 >= 0 ;+-1 x3664 +1 x750 >= 0 ;+-1 x3664 -1 x747 >= -1 ;++1 x3664 -1 x750 +1 x747 >= 0 ;+-1 x3665 +1 x751 >= 0 ;+-1 x3665 -1 x748 >= -1 ;++1 x3665 -1 x751 +1 x748 >= 0 ;+-1 x3666 +1 x752 >= 0 ;+-1 x3666 -1 x749 >= -1 ;++1 x3666 -1 x752 +1 x749 >= 0 ;+-1 x3667 +1 x753 >= 0 ;++1 x3667 -1 x753 >= 0 ;+-1 x3668 +1 x754 >= 0 ;++1 x3668 -1 x754 >= 0 ;+-1 x3669 +1 x755 >= 0 ;++1 x3669 -1 x755 >= 0 ;+-1 x3670 +1 x756 >= 0 ;++1 x3670 -1 x756 >= 0 ;+-1 x3671 +1 x757 >= 0 ;+-1 x3671 -1 x753 >= -1 ;++1 x3671 -1 x757 +1 x753 >= 0 ;+-1 x3672 +1 x758 >= 0 ;+-1 x3672 -1 x754 >= -1 ;++1 x3672 -1 x758 +1 x754 >= 0 ;+-1 x3673 +1 x759 >= 0 ;+-1 x3673 -1 x755 >= -1 ;++1 x3673 -1 x759 +1 x755 >= 0 ;+-1 x3674 +1 x760 >= 0 ;+-1 x3674 -1 x756 >= -1 ;++1 x3674 -1 x760 +1 x756 >= 0 ;+-1 x3675 +1 x761 >= 0 ;+-1 x3675 -1 x757 >= -1 ;++1 x3675 -1 x761 +1 x757 >= 0 ;+-1 x3676 +1 x762 >= 0 ;+-1 x3676 -1 x758 >= -1 ;++1 x3676 -1 x762 +1 x758 >= 0 ;+-1 x3677 +1 x763 >= 0 ;+-1 x3677 -1 x759 >= -1 ;++1 x3677 -1 x763 +1 x759 >= 0 ;+-1 x3678 +1 x764 >= 0 ;+-1 x3678 -1 x760 >= -1 ;++1 x3678 -1 x764 +1 x760 >= 0 ;+-1 x3679 +1 x765 >= 0 ;+-1 x3679 -1 x761 >= -1 ;++1 x3679 -1 x765 +1 x761 >= 0 ;+-1 x3680 +1 x766 >= 0 ;+-1 x3680 -1 x762 >= -1 ;++1 x3680 -1 x766 +1 x762 >= 0 ;+-1 x3681 +1 x767 >= 0 ;+-1 x3681 -1 x763 >= -1 ;++1 x3681 -1 x767 +1 x763 >= 0 ;+-1 x3682 +1 x768 >= 0 ;+-1 x3682 -1 x764 >= -1 ;++1 x3682 -1 x768 +1 x764 >= 0 ;+-1 x3683 +1 x769 >= 0 ;+-1 x3683 -1 x765 >= -1 ;++1 x3683 -1 x769 +1 x765 >= 0 ;+-1 x3684 +1 x770 >= 0 ;+-1 x3684 -1 x766 >= -1 ;++1 x3684 -1 x770 +1 x766 >= 0 ;+-1 x3685 +1 x771 >= 0 ;+-1 x3685 -1 x767 >= -1 ;++1 x3685 -1 x771 +1 x767 >= 0 ;+-1 x3686 +1 x772 >= 0 ;+-1 x3686 -1 x768 >= -1 ;++1 x3686 -1 x772 +1 x768 >= 0 ;+-1 x3687 +1 x773 >= 0 ;+-1 x3687 -1 x769 >= -1 ;++1 x3687 -1 x773 +1 x769 >= 0 ;+-1 x3688 +1 x774 >= 0 ;+-1 x3688 -1 x770 >= -1 ;++1 x3688 -1 x774 +1 x770 >= 0 ;+-1 x3689 +1 x775 >= 0 ;+-1 x3689 -1 x771 >= -1 ;++1 x3689 -1 x775 +1 x771 >= 0 ;+-1 x3690 +1 x776 >= 0 ;+-1 x3690 -1 x772 >= -1 ;++1 x3690 -1 x776 +1 x772 >= 0 ;+-1 x3691 +1 x777 >= 0 ;+-1 x3691 -1 x773 >= -1 ;++1 x3691 -1 x777 +1 x773 >= 0 ;+-1 x3692 +1 x778 >= 0 ;+-1 x3692 -1 x774 >= -1 ;++1 x3692 -1 x778 +1 x774 >= 0 ;+-1 x3693 +1 x779 >= 0 ;+-1 x3693 -1 x775 >= -1 ;++1 x3693 -1 x779 +1 x775 >= 0 ;+-1 x3694 +1 x780 >= 0 ;+-1 x3694 -1 x776 >= -1 ;++1 x3694 -1 x780 +1 x776 >= 0 ;+-1 x3695 +1 x781 >= 0 ;+-1 x3695 -1 x777 >= -1 ;++1 x3695 -1 x781 +1 x777 >= 0 ;+-1 x3696 +1 x782 >= 0 ;+-1 x3696 -1 x778 >= -1 ;++1 x3696 -1 x782 +1 x778 >= 0 ;+-1 x3697 +1 x783 >= 0 ;+-1 x3697 -1 x779 >= -1 ;++1 x3697 -1 x783 +1 x779 >= 0 ;+-1 x3698 +1 x784 >= 0 ;+-1 x3698 -1 x780 >= -1 ;++1 x3698 -1 x784 +1 x780 >= 0 ;+-1 x3699 +1 x785 >= 0 ;+-1 x3699 -1 x781 >= -1 ;++1 x3699 -1 x785 +1 x781 >= 0 ;+-1 x3700 +1 x786 >= 0 ;+-1 x3700 -1 x782 >= -1 ;++1 x3700 -1 x786 +1 x782 >= 0 ;+-1 x3701 +1 x787 >= 0 ;+-1 x3701 -1 x783 >= -1 ;++1 x3701 -1 x787 +1 x783 >= 0 ;+-1 x3702 +1 x788 >= 0 ;+-1 x3702 -1 x784 >= -1 ;++1 x3702 -1 x788 +1 x784 >= 0 ;+-1 x3703 +1 x789 >= 0 ;+-1 x3703 -1 x785 >= -1 ;++1 x3703 -1 x789 +1 x785 >= 0 ;+-1 x3704 +1 x790 >= 0 ;+-1 x3704 -1 x786 >= -1 ;++1 x3704 -1 x790 +1 x786 >= 0 ;+-1 x3705 +1 x791 >= 0 ;+-1 x3705 -1 x787 >= -1 ;++1 x3705 -1 x791 +1 x787 >= 0 ;+-1 x3706 +1 x792 >= 0 ;+-1 x3706 -1 x788 >= -1 ;++1 x3706 -1 x792 +1 x788 >= 0 ;+-1 x3707 +1 x793 >= 0 ;+-1 x3707 -1 x789 >= -1 ;++1 x3707 -1 x793 +1 x789 >= 0 ;+-1 x3708 +1 x794 >= 0 ;+-1 x3708 -1 x790 >= -1 ;++1 x3708 -1 x794 +1 x790 >= 0 ;+-1 x3709 +1 x795 >= 0 ;+-1 x3709 -1 x791 >= -1 ;++1 x3709 -1 x795 +1 x791 >= 0 ;+-1 x3710 +1 x796 >= 0 ;+-1 x3710 -1 x792 >= -1 ;++1 x3710 -1 x796 +1 x792 >= 0 ;+-1 x3711 +1 x797 >= 0 ;+-1 x3711 -1 x793 >= -1 ;++1 x3711 -1 x797 +1 x793 >= 0 ;+-1 x3712 +1 x798 >= 0 ;+-1 x3712 -1 x794 >= -1 ;++1 x3712 -1 x798 +1 x794 >= 0 ;+-1 x3713 +1 x799 >= 0 ;+-1 x3713 -1 x795 >= -1 ;++1 x3713 -1 x799 +1 x795 >= 0 ;+-1 x3714 +1 x800 >= 0 ;+-1 x3714 -1 x796 >= -1 ;++1 x3714 -1 x800 +1 x796 >= 0 ;+-1 x3715 +1 x801 >= 0 ;+-1 x3715 -1 x797 >= -1 ;++1 x3715 -1 x801 +1 x797 >= 0 ;+-1 x3716 +1 x802 >= 0 ;+-1 x3716 -1 x798 >= -1 ;++1 x3716 -1 x802 +1 x798 >= 0 ;+-1 x3717 +1 x803 >= 0 ;+-1 x3717 -1 x799 >= -1 ;++1 x3717 -1 x803 +1 x799 >= 0 ;+-1 x3718 +1 x804 >= 0 ;+-1 x3718 -1 x800 >= -1 ;++1 x3718 -1 x804 +1 x800 >= 0 ;+-1 x3719 +1 x805 >= 0 ;+-1 x3719 -1 x801 >= -1 ;++1 x3719 -1 x805 +1 x801 >= 0 ;+-1 x3720 +1 x806 >= 0 ;+-1 x3720 -1 x802 >= -1 ;++1 x3720 -1 x806 +1 x802 >= 0 ;+-1 x3721 +1 x807 >= 0 ;+-1 x3721 -1 x803 >= -1 ;++1 x3721 -1 x807 +1 x803 >= 0 ;+-1 x3722 +1 x808 >= 0 ;+-1 x3722 -1 x804 >= -1 ;++1 x3722 -1 x808 +1 x804 >= 0 ;+-1 x3723 +1 x809 >= 0 ;+-1 x3723 -1 x805 >= -1 ;++1 x3723 -1 x809 +1 x805 >= 0 ;+-1 x3724 +1 x810 >= 0 ;+-1 x3724 -1 x806 >= -1 ;++1 x3724 -1 x810 +1 x806 >= 0 ;+-1 x3725 +1 x811 >= 0 ;+-1 x3725 -1 x807 >= -1 ;++1 x3725 -1 x811 +1 x807 >= 0 ;+-1 x3726 +1 x812 >= 0 ;+-1 x3726 -1 x808 >= -1 ;++1 x3726 -1 x812 +1 x808 >= 0 ;+-1 x3727 +1 x813 >= 0 ;+-1 x3727 -1 x809 >= -1 ;++1 x3727 -1 x813 +1 x809 >= 0 ;+-1 x3728 +1 x814 >= 0 ;+-1 x3728 -1 x810 >= -1 ;++1 x3728 -1 x814 +1 x810 >= 0 ;+-1 x3729 +1 x815 >= 0 ;+-1 x3729 -1 x811 >= -1 ;++1 x3729 -1 x815 +1 x811 >= 0 ;+-1 x3730 +1 x816 >= 0 ;+-1 x3730 -1 x812 >= -1 ;++1 x3730 -1 x816 +1 x812 >= 0 ;+-1 x3731 +1 x817 >= 0 ;+-1 x3731 -1 x813 >= -1 ;++1 x3731 -1 x817 +1 x813 >= 0 ;+-1 x3732 +1 x818 >= 0 ;+-1 x3732 -1 x814 >= -1 ;++1 x3732 -1 x818 +1 x814 >= 0 ;+-1 x3733 +1 x819 >= 0 ;+-1 x3733 -1 x815 >= -1 ;++1 x3733 -1 x819 +1 x815 >= 0 ;+-1 x3734 +1 x820 >= 0 ;+-1 x3734 -1 x816 >= -1 ;++1 x3734 -1 x820 +1 x816 >= 0 ;+-1 x3735 +1 x821 >= 0 ;+-1 x3735 -1 x817 >= -1 ;++1 x3735 -1 x821 +1 x817 >= 0 ;+-1 x3736 +1 x822 >= 0 ;+-1 x3736 -1 x818 >= -1 ;++1 x3736 -1 x822 +1 x818 >= 0 ;+-1 x3737 +1 x823 >= 0 ;+-1 x3737 -1 x819 >= -1 ;++1 x3737 -1 x823 +1 x819 >= 0 ;+-1 x3738 +1 x824 >= 0 ;+-1 x3738 -1 x820 >= -1 ;++1 x3738 -1 x824 +1 x820 >= 0 ;+-1 x3739 +1 x825 >= 0 ;+-1 x3739 -1 x821 >= -1 ;++1 x3739 -1 x825 +1 x821 >= 0 ;+-1 x3740 +1 x826 >= 0 ;+-1 x3740 -1 x822 >= -1 ;++1 x3740 -1 x826 +1 x822 >= 0 ;+-1 x3741 +1 x827 >= 0 ;+-1 x3741 -1 x823 >= -1 ;++1 x3741 -1 x827 +1 x823 >= 0 ;+-1 x3742 +1 x828 >= 0 ;+-1 x3742 -1 x824 >= -1 ;++1 x3742 -1 x828 +1 x824 >= 0 ;+-1 x3743 +1 x829 >= 0 ;+-1 x3743 -1 x825 >= -1 ;++1 x3743 -1 x829 +1 x825 >= 0 ;+-1 x3744 +1 x830 >= 0 ;+-1 x3744 -1 x826 >= -1 ;++1 x3744 -1 x830 +1 x826 >= 0 ;+-1 x3745 +1 x831 >= 0 ;+-1 x3745 -1 x827 >= -1 ;++1 x3745 -1 x831 +1 x827 >= 0 ;+-1 x3746 +1 x832 >= 0 ;+-1 x3746 -1 x828 >= -1 ;++1 x3746 -1 x832 +1 x828 >= 0 ;+-1 x3747 +1 x833 >= 0 ;+-1 x3747 -1 x829 >= -1 ;++1 x3747 -1 x833 +1 x829 >= 0 ;+-1 x3748 +1 x834 >= 0 ;+-1 x3748 -1 x830 >= -1 ;++1 x3748 -1 x834 +1 x830 >= 0 ;+-1 x3749 +1 x835 >= 0 ;+-1 x3749 -1 x831 >= -1 ;++1 x3749 -1 x835 +1 x831 >= 0 ;+-1 x3750 +1 x836 >= 0 ;+-1 x3750 -1 x832 >= -1 ;++1 x3750 -1 x836 +1 x832 >= 0 ;+-1 x3751 +1 x837 >= 0 ;+-1 x3751 -1 x833 >= -1 ;++1 x3751 -1 x837 +1 x833 >= 0 ;+-1 x3752 +1 x838 >= 0 ;+-1 x3752 -1 x834 >= -1 ;++1 x3752 -1 x838 +1 x834 >= 0 ;+-1 x3753 +1 x839 >= 0 ;+-1 x3753 -1 x835 >= -1 ;++1 x3753 -1 x839 +1 x835 >= 0 ;+-1 x3754 +1 x840 >= 0 ;+-1 x3754 -1 x836 >= -1 ;++1 x3754 -1 x840 +1 x836 >= 0 ;+-1 x3755 +1 x841 >= 0 ;+-1 x3755 -1 x837 >= -1 ;++1 x3755 -1 x841 +1 x837 >= 0 ;+-1 x3756 +1 x842 >= 0 ;+-1 x3756 -1 x838 >= -1 ;++1 x3756 -1 x842 +1 x838 >= 0 ;+-1 x3757 +1 x843 >= 0 ;+-1 x3757 -1 x839 >= -1 ;++1 x3757 -1 x843 +1 x839 >= 0 ;+-1 x3758 +1 x844 >= 0 ;+-1 x3758 -1 x840 >= -1 ;++1 x3758 -1 x844 +1 x840 >= 0 ;+-1 x3759 +1 x845 >= 0 ;+-1 x3759 -1 x841 >= -1 ;++1 x3759 -1 x845 +1 x841 >= 0 ;+-1 x3760 +1 x846 >= 0 ;+-1 x3760 -1 x842 >= -1 ;++1 x3760 -1 x846 +1 x842 >= 0 ;+-1 x3761 +1 x847 >= 0 ;++1 x3761 -1 x847 >= 0 ;+-1 x3762 +1 x848 >= 0 ;++1 x3762 -1 x848 >= 0 ;+-1 x3763 +1 x849 >= 0 ;++1 x3763 -1 x849 >= 0 ;+-1 x3764 +1 x850 >= 0 ;++1 x3764 -1 x850 >= 0 ;+-1 x3765 +1 x851 >= 0 ;++1 x3765 -1 x851 >= 0 ;+-1 x3766 +1 x852 >= 0 ;++1 x3766 -1 x852 >= 0 ;+-1 x3767 +1 x853 >= 0 ;++1 x3767 -1 x853 >= 0 ;+-1 x3768 +1 x854 >= 0 ;+-1 x3768 -1 x847 >= -1 ;++1 x3768 -1 x854 +1 x847 >= 0 ;+-1 x3769 +1 x855 >= 0 ;+-1 x3769 -1 x848 >= -1 ;++1 x3769 -1 x855 +1 x848 >= 0 ;+-1 x3770 +1 x856 >= 0 ;+-1 x3770 -1 x849 >= -1 ;++1 x3770 -1 x856 +1 x849 >= 0 ;+-1 x3771 +1 x857 >= 0 ;+-1 x3771 -1 x850 >= -1 ;++1 x3771 -1 x857 +1 x850 >= 0 ;+-1 x3772 +1 x858 >= 0 ;+-1 x3772 -1 x851 >= -1 ;++1 x3772 -1 x858 +1 x851 >= 0 ;+-1 x3773 +1 x859 >= 0 ;+-1 x3773 -1 x852 >= -1 ;++1 x3773 -1 x859 +1 x852 >= 0 ;+-1 x3774 +1 x860 >= 0 ;+-1 x3774 -1 x853 >= -1 ;++1 x3774 -1 x860 +1 x853 >= 0 ;+-1 x3775 +1 x861 >= 0 ;+-1 x3775 -1 x854 >= -1 ;++1 x3775 -1 x861 +1 x854 >= 0 ;+-1 x3776 +1 x862 >= 0 ;+-1 x3776 -1 x855 >= -1 ;++1 x3776 -1 x862 +1 x855 >= 0 ;+-1 x3777 +1 x863 >= 0 ;+-1 x3777 -1 x856 >= -1 ;++1 x3777 -1 x863 +1 x856 >= 0 ;+-1 x3778 +1 x864 >= 0 ;+-1 x3778 -1 x857 >= -1 ;++1 x3778 -1 x864 +1 x857 >= 0 ;+-1 x3779 +1 x865 >= 0 ;+-1 x3779 -1 x858 >= -1 ;++1 x3779 -1 x865 +1 x858 >= 0 ;+-1 x3780 +1 x866 >= 0 ;+-1 x3780 -1 x859 >= -1 ;++1 x3780 -1 x866 +1 x859 >= 0 ;+-1 x3781 +1 x867 >= 0 ;+-1 x3781 -1 x860 >= -1 ;++1 x3781 -1 x867 +1 x860 >= 0 ;+-1 x3782 +1 x868 >= 0 ;+-1 x3782 -1 x861 >= -1 ;++1 x3782 -1 x868 +1 x861 >= 0 ;+-1 x3783 +1 x869 >= 0 ;+-1 x3783 -1 x862 >= -1 ;++1 x3783 -1 x869 +1 x862 >= 0 ;+-1 x3784 +1 x870 >= 0 ;+-1 x3784 -1 x863 >= -1 ;++1 x3784 -1 x870 +1 x863 >= 0 ;+-1 x3785 +1 x871 >= 0 ;+-1 x3785 -1 x864 >= -1 ;++1 x3785 -1 x871 +1 x864 >= 0 ;+-1 x3786 +1 x872 >= 0 ;+-1 x3786 -1 x865 >= -1 ;++1 x3786 -1 x872 +1 x865 >= 0 ;+-1 x3787 +1 x873 >= 0 ;+-1 x3787 -1 x866 >= -1 ;++1 x3787 -1 x873 +1 x866 >= 0 ;+-1 x3788 +1 x874 >= 0 ;+-1 x3788 -1 x867 >= -1 ;++1 x3788 -1 x874 +1 x867 >= 0 ;+-1 x3789 +1 x875 >= 0 ;+-1 x3789 -1 x868 >= -1 ;++1 x3789 -1 x875 +1 x868 >= 0 ;+-1 x3790 +1 x876 >= 0 ;+-1 x3790 -1 x869 >= -1 ;++1 x3790 -1 x876 +1 x869 >= 0 ;+-1 x3791 +1 x877 >= 0 ;+-1 x3791 -1 x870 >= -1 ;++1 x3791 -1 x877 +1 x870 >= 0 ;+-1 x3792 +1 x878 >= 0 ;+-1 x3792 -1 x871 >= -1 ;++1 x3792 -1 x878 +1 x871 >= 0 ;+-1 x3793 +1 x879 >= 0 ;+-1 x3793 -1 x872 >= -1 ;++1 x3793 -1 x879 +1 x872 >= 0 ;+-1 x3794 +1 x880 >= 0 ;+-1 x3794 -1 x873 >= -1 ;++1 x3794 -1 x880 +1 x873 >= 0 ;+-1 x3795 +1 x881 >= 0 ;+-1 x3795 -1 x874 >= -1 ;++1 x3795 -1 x881 +1 x874 >= 0 ;+-1 x3796 +1 x882 >= 0 ;+-1 x3796 -1 x875 >= -1 ;++1 x3796 -1 x882 +1 x875 >= 0 ;+-1 x3797 +1 x883 >= 0 ;+-1 x3797 -1 x876 >= -1 ;++1 x3797 -1 x883 +1 x876 >= 0 ;+-1 x3798 +1 x884 >= 0 ;+-1 x3798 -1 x877 >= -1 ;++1 x3798 -1 x884 +1 x877 >= 0 ;+-1 x3799 +1 x885 >= 0 ;+-1 x3799 -1 x878 >= -1 ;++1 x3799 -1 x885 +1 x878 >= 0 ;+-1 x3800 +1 x886 >= 0 ;+-1 x3800 -1 x879 >= -1 ;++1 x3800 -1 x886 +1 x879 >= 0 ;+-1 x3801 +1 x887 >= 0 ;+-1 x3801 -1 x880 >= -1 ;++1 x3801 -1 x887 +1 x880 >= 0 ;+-1 x3802 +1 x888 >= 0 ;+-1 x3802 -1 x881 >= -1 ;++1 x3802 -1 x888 +1 x881 >= 0 ;+-1 x3803 +1 x889 >= 0 ;+-1 x3803 -1 x882 >= -1 ;++1 x3803 -1 x889 +1 x882 >= 0 ;+-1 x3804 +1 x890 >= 0 ;+-1 x3804 -1 x883 >= -1 ;++1 x3804 -1 x890 +1 x883 >= 0 ;+-1 x3805 +1 x891 >= 0 ;+-1 x3805 -1 x884 >= -1 ;++1 x3805 -1 x891 +1 x884 >= 0 ;+-1 x3806 +1 x892 >= 0 ;+-1 x3806 -1 x885 >= -1 ;++1 x3806 -1 x892 +1 x885 >= 0 ;+-1 x3807 +1 x893 >= 0 ;+-1 x3807 -1 x886 >= -1 ;++1 x3807 -1 x893 +1 x886 >= 0 ;+-1 x3808 +1 x894 >= 0 ;+-1 x3808 -1 x887 >= -1 ;++1 x3808 -1 x894 +1 x887 >= 0 ;+-1 x3809 +1 x895 >= 0 ;+-1 x3809 -1 x888 >= -1 ;++1 x3809 -1 x895 +1 x888 >= 0 ;+-1 x3810 +1 x896 >= 0 ;+-1 x3810 -1 x889 >= -1 ;++1 x3810 -1 x896 +1 x889 >= 0 ;+-1 x3811 +1 x897 >= 0 ;+-1 x3811 -1 x890 >= -1 ;++1 x3811 -1 x897 +1 x890 >= 0 ;+-1 x3812 +1 x898 >= 0 ;+-1 x3812 -1 x891 >= -1 ;++1 x3812 -1 x898 +1 x891 >= 0 ;+-1 x3813 +1 x899 >= 0 ;+-1 x3813 -1 x892 >= -1 ;++1 x3813 -1 x899 +1 x892 >= 0 ;+-1 x3814 +1 x900 >= 0 ;+-1 x3814 -1 x893 >= -1 ;++1 x3814 -1 x900 +1 x893 >= 0 ;+-1 x3815 +1 x901 >= 0 ;+-1 x3815 -1 x894 >= -1 ;++1 x3815 -1 x901 +1 x894 >= 0 ;+-1 x3816 +1 x902 >= 0 ;+-1 x3816 -1 x895 >= -1 ;++1 x3816 -1 x902 +1 x895 >= 0 ;+-1 x3817 +1 x903 >= 0 ;+-1 x3817 -1 x896 >= -1 ;++1 x3817 -1 x903 +1 x896 >= 0 ;+-1 x3818 +1 x904 >= 0 ;+-1 x3818 -1 x897 >= -1 ;++1 x3818 -1 x904 +1 x897 >= 0 ;+-1 x3819 +1 x905 >= 0 ;+-1 x3819 -1 x898 >= -1 ;++1 x3819 -1 x905 +1 x898 >= 0 ;+-1 x3820 +1 x906 >= 0 ;+-1 x3820 -1 x899 >= -1 ;++1 x3820 -1 x906 +1 x899 >= 0 ;+-1 x3821 +1 x907 >= 0 ;+-1 x3821 -1 x900 >= -1 ;++1 x3821 -1 x907 +1 x900 >= 0 ;+-1 x3822 +1 x908 >= 0 ;+-1 x3822 -1 x901 >= -1 ;++1 x3822 -1 x908 +1 x901 >= 0 ;+-1 x3823 +1 x909 >= 0 ;+-1 x3823 -1 x902 >= -1 ;++1 x3823 -1 x909 +1 x902 >= 0 ;+-1 x3824 +1 x910 >= 0 ;+-1 x3824 -1 x903 >= -1 ;++1 x3824 -1 x910 +1 x903 >= 0 ;+-1 x3825 +1 x911 >= 0 ;+-1 x3825 -1 x904 >= -1 ;++1 x3825 -1 x911 +1 x904 >= 0 ;+-1 x3826 +1 x912 >= 0 ;+-1 x3826 -1 x905 >= -1 ;++1 x3826 -1 x912 +1 x905 >= 0 ;+-1 x3827 +1 x913 >= 0 ;+-1 x3827 -1 x906 >= -1 ;++1 x3827 -1 x913 +1 x906 >= 0 ;+-1 x3828 +1 x914 >= 0 ;+-1 x3828 -1 x907 >= -1 ;++1 x3828 -1 x914 +1 x907 >= 0 ;+-1 x3829 +1 x915 >= 0 ;+-1 x3829 -1 x908 >= -1 ;++1 x3829 -1 x915 +1 x908 >= 0 ;+-1 x3830 +1 x916 >= 0 ;+-1 x3830 -1 x909 >= -1 ;++1 x3830 -1 x916 +1 x909 >= 0 ;+-1 x3831 +1 x917 >= 0 ;+-1 x3831 -1 x910 >= -1 ;++1 x3831 -1 x917 +1 x910 >= 0 ;+-1 x3832 +1 x918 >= 0 ;+-1 x3832 -1 x911 >= -1 ;++1 x3832 -1 x918 +1 x911 >= 0 ;+-1 x3833 +1 x919 >= 0 ;+-1 x3833 -1 x912 >= -1 ;++1 x3833 -1 x919 +1 x912 >= 0 ;+-1 x3834 +1 x920 >= 0 ;+-1 x3834 -1 x913 >= -1 ;++1 x3834 -1 x920 +1 x913 >= 0 ;+-1 x3835 +1 x921 >= 0 ;+-1 x3835 -1 x914 >= -1 ;++1 x3835 -1 x921 +1 x914 >= 0 ;+-1 x3836 +1 x922 >= 0 ;+-1 x3836 -1 x915 >= -1 ;++1 x3836 -1 x922 +1 x915 >= 0 ;+-1 x3837 +1 x923 >= 0 ;+-1 x3837 -1 x916 >= -1 ;++1 x3837 -1 x923 +1 x916 >= 0 ;+-1 x3838 +1 x924 >= 0 ;+-1 x3838 -1 x917 >= -1 ;++1 x3838 -1 x924 +1 x917 >= 0 ;+-1 x3839 +1 x925 >= 0 ;+-1 x3839 -1 x918 >= -1 ;++1 x3839 -1 x925 +1 x918 >= 0 ;+-1 x3840 +1 x926 >= 0 ;+-1 x3840 -1 x919 >= -1 ;++1 x3840 -1 x926 +1 x919 >= 0 ;+-1 x3841 +1 x927 >= 0 ;+-1 x3841 -1 x920 >= -1 ;++1 x3841 -1 x927 +1 x920 >= 0 ;+-1 x3842 +1 x928 >= 0 ;+-1 x3842 -1 x921 >= -1 ;++1 x3842 -1 x928 +1 x921 >= 0 ;+-1 x3843 +1 x929 >= 0 ;+-1 x3843 -1 x922 >= -1 ;++1 x3843 -1 x929 +1 x922 >= 0 ;+-1 x3844 +1 x930 >= 0 ;+-1 x3844 -1 x923 >= -1 ;++1 x3844 -1 x930 +1 x923 >= 0 ;+-1 x3845 +1 x931 >= 0 ;+-1 x3845 -1 x924 >= -1 ;++1 x3845 -1 x931 +1 x924 >= 0 ;+-1 x3846 +1 x932 >= 0 ;+-1 x3846 -1 x925 >= -1 ;++1 x3846 -1 x932 +1 x925 >= 0 ;+-1 x3847 +1 x933 >= 0 ;+-1 x3847 -1 x926 >= -1 ;++1 x3847 -1 x933 +1 x926 >= 0 ;+-1 x3848 +1 x934 >= 0 ;+-1 x3848 -1 x927 >= -1 ;++1 x3848 -1 x934 +1 x927 >= 0 ;+-1 x3849 +1 x935 >= 0 ;+-1 x3849 -1 x928 >= -1 ;++1 x3849 -1 x935 +1 x928 >= 0 ;+-1 x3850 +1 x936 >= 0 ;+-1 x3850 -1 x929 >= -1 ;++1 x3850 -1 x936 +1 x929 >= 0 ;+-1 x3851 +1 x937 >= 0 ;+-1 x3851 -1 x930 >= -1 ;++1 x3851 -1 x937 +1 x930 >= 0 ;+-1 x3852 +1 x938 >= 0 ;+-1 x3852 -1 x931 >= -1 ;++1 x3852 -1 x938 +1 x931 >= 0 ;+-1 x3853 +1 x939 >= 0 ;+-1 x3853 -1 x932 >= -1 ;++1 x3853 -1 x939 +1 x932 >= 0 ;+-1 x3854 +1 x940 >= 0 ;+-1 x3854 -1 x933 >= -1 ;++1 x3854 -1 x940 +1 x933 >= 0 ;+-1 x3855 +1 x941 >= 0 ;++1 x3855 -1 x941 >= 0 ;+-1 x3856 +1 x942 >= 0 ;++1 x3856 -1 x942 >= 0 ;+-1 x3857 +1 x943 >= 0 ;++1 x3857 -1 x943 >= 0 ;+-1 x3858 +1 x944 >= 0 ;++1 x3858 -1 x944 >= 0 ;+-1 x3859 +1 x945 >= 0 ;++1 x3859 -1 x945 >= 0 ;+-1 x3860 +1 x946 >= 0 ;++1 x3860 -1 x946 >= 0 ;+-1 x3861 +1 x947 >= 0 ;++1 x3861 -1 x947 >= 0 ;+-1 x3862 +1 x948 >= 0 ;++1 x3862 -1 x948 >= 0 ;+-1 x3863 +1 x949 >= 0 ;+-1 x3863 -1 x941 >= -1 ;++1 x3863 -1 x949 +1 x941 >= 0 ;+-1 x3864 +1 x950 >= 0 ;+-1 x3864 -1 x942 >= -1 ;++1 x3864 -1 x950 +1 x942 >= 0 ;+-1 x3865 +1 x951 >= 0 ;+-1 x3865 -1 x943 >= -1 ;++1 x3865 -1 x951 +1 x943 >= 0 ;+-1 x3866 +1 x952 >= 0 ;+-1 x3866 -1 x944 >= -1 ;++1 x3866 -1 x952 +1 x944 >= 0 ;+-1 x3867 +1 x953 >= 0 ;+-1 x3867 -1 x945 >= -1 ;++1 x3867 -1 x953 +1 x945 >= 0 ;+-1 x3868 +1 x954 >= 0 ;+-1 x3868 -1 x946 >= -1 ;++1 x3868 -1 x954 +1 x946 >= 0 ;+-1 x3869 +1 x955 >= 0 ;+-1 x3869 -1 x947 >= -1 ;++1 x3869 -1 x955 +1 x947 >= 0 ;+-1 x3870 +1 x956 >= 0 ;+-1 x3870 -1 x948 >= -1 ;++1 x3870 -1 x956 +1 x948 >= 0 ;+-1 x3871 +1 x957 >= 0 ;+-1 x3871 -1 x949 >= -1 ;++1 x3871 -1 x957 +1 x949 >= 0 ;+-1 x3872 +1 x958 >= 0 ;+-1 x3872 -1 x950 >= -1 ;++1 x3872 -1 x958 +1 x950 >= 0 ;+-1 x3873 +1 x959 >= 0 ;+-1 x3873 -1 x951 >= -1 ;++1 x3873 -1 x959 +1 x951 >= 0 ;+-1 x3874 +1 x960 >= 0 ;+-1 x3874 -1 x952 >= -1 ;++1 x3874 -1 x960 +1 x952 >= 0 ;+-1 x3875 +1 x961 >= 0 ;+-1 x3875 -1 x953 >= -1 ;++1 x3875 -1 x961 +1 x953 >= 0 ;+-1 x3876 +1 x962 >= 0 ;+-1 x3876 -1 x954 >= -1 ;++1 x3876 -1 x962 +1 x954 >= 0 ;+-1 x3877 +1 x963 >= 0 ;+-1 x3877 -1 x955 >= -1 ;++1 x3877 -1 x963 +1 x955 >= 0 ;+-1 x3878 +1 x964 >= 0 ;+-1 x3878 -1 x956 >= -1 ;++1 x3878 -1 x964 +1 x956 >= 0 ;+-1 x3879 +1 x965 >= 0 ;+-1 x3879 -1 x957 >= -1 ;++1 x3879 -1 x965 +1 x957 >= 0 ;+-1 x3880 +1 x966 >= 0 ;+-1 x3880 -1 x958 >= -1 ;++1 x3880 -1 x966 +1 x958 >= 0 ;+-1 x3881 +1 x967 >= 0 ;+-1 x3881 -1 x959 >= -1 ;++1 x3881 -1 x967 +1 x959 >= 0 ;+-1 x3882 +1 x968 >= 0 ;+-1 x3882 -1 x960 >= -1 ;++1 x3882 -1 x968 +1 x960 >= 0 ;+-1 x3883 +1 x969 >= 0 ;+-1 x3883 -1 x961 >= -1 ;++1 x3883 -1 x969 +1 x961 >= 0 ;+-1 x3884 +1 x970 >= 0 ;+-1 x3884 -1 x962 >= -1 ;++1 x3884 -1 x970 +1 x962 >= 0 ;+-1 x3885 +1 x971 >= 0 ;+-1 x3885 -1 x963 >= -1 ;++1 x3885 -1 x971 +1 x963 >= 0 ;+-1 x3886 +1 x972 >= 0 ;+-1 x3886 -1 x964 >= -1 ;++1 x3886 -1 x972 +1 x964 >= 0 ;+-1 x3887 +1 x973 >= 0 ;+-1 x3887 -1 x965 >= -1 ;++1 x3887 -1 x973 +1 x965 >= 0 ;+-1 x3888 +1 x974 >= 0 ;+-1 x3888 -1 x966 >= -1 ;++1 x3888 -1 x974 +1 x966 >= 0 ;+-1 x3889 +1 x975 >= 0 ;+-1 x3889 -1 x967 >= -1 ;++1 x3889 -1 x975 +1 x967 >= 0 ;+-1 x3890 +1 x976 >= 0 ;+-1 x3890 -1 x968 >= -1 ;++1 x3890 -1 x976 +1 x968 >= 0 ;+-1 x3891 +1 x977 >= 0 ;+-1 x3891 -1 x969 >= -1 ;++1 x3891 -1 x977 +1 x969 >= 0 ;+-1 x3892 +1 x978 >= 0 ;+-1 x3892 -1 x970 >= -1 ;++1 x3892 -1 x978 +1 x970 >= 0 ;+-1 x3893 +1 x979 >= 0 ;+-1 x3893 -1 x971 >= -1 ;++1 x3893 -1 x979 +1 x971 >= 0 ;+-1 x3894 +1 x980 >= 0 ;+-1 x3894 -1 x972 >= -1 ;++1 x3894 -1 x980 +1 x972 >= 0 ;+-1 x3895 +1 x981 >= 0 ;+-1 x3895 -1 x973 >= -1 ;++1 x3895 -1 x981 +1 x973 >= 0 ;+-1 x3896 +1 x982 >= 0 ;+-1 x3896 -1 x974 >= -1 ;++1 x3896 -1 x982 +1 x974 >= 0 ;+-1 x3897 +1 x983 >= 0 ;+-1 x3897 -1 x975 >= -1 ;++1 x3897 -1 x983 +1 x975 >= 0 ;+-1 x3898 +1 x984 >= 0 ;+-1 x3898 -1 x976 >= -1 ;++1 x3898 -1 x984 +1 x976 >= 0 ;+-1 x3899 +1 x985 >= 0 ;+-1 x3899 -1 x977 >= -1 ;++1 x3899 -1 x985 +1 x977 >= 0 ;+-1 x3900 +1 x986 >= 0 ;+-1 x3900 -1 x978 >= -1 ;++1 x3900 -1 x986 +1 x978 >= 0 ;+-1 x3901 +1 x987 >= 0 ;+-1 x3901 -1 x979 >= -1 ;++1 x3901 -1 x987 +1 x979 >= 0 ;+-1 x3902 +1 x988 >= 0 ;+-1 x3902 -1 x980 >= -1 ;++1 x3902 -1 x988 +1 x980 >= 0 ;+-1 x3903 +1 x989 >= 0 ;+-1 x3903 -1 x981 >= -1 ;++1 x3903 -1 x989 +1 x981 >= 0 ;+-1 x3904 +1 x990 >= 0 ;+-1 x3904 -1 x982 >= -1 ;++1 x3904 -1 x990 +1 x982 >= 0 ;+-1 x3905 +1 x991 >= 0 ;+-1 x3905 -1 x983 >= -1 ;++1 x3905 -1 x991 +1 x983 >= 0 ;+-1 x3906 +1 x992 >= 0 ;+-1 x3906 -1 x984 >= -1 ;++1 x3906 -1 x992 +1 x984 >= 0 ;+-1 x3907 +1 x993 >= 0 ;+-1 x3907 -1 x985 >= -1 ;++1 x3907 -1 x993 +1 x985 >= 0 ;+-1 x3908 +1 x994 >= 0 ;+-1 x3908 -1 x986 >= -1 ;++1 x3908 -1 x994 +1 x986 >= 0 ;+-1 x3909 +1 x995 >= 0 ;+-1 x3909 -1 x987 >= -1 ;++1 x3909 -1 x995 +1 x987 >= 0 ;+-1 x3910 +1 x996 >= 0 ;+-1 x3910 -1 x988 >= -1 ;++1 x3910 -1 x996 +1 x988 >= 0 ;+-1 x3911 +1 x997 >= 0 ;+-1 x3911 -1 x989 >= -1 ;++1 x3911 -1 x997 +1 x989 >= 0 ;+-1 x3912 +1 x998 >= 0 ;+-1 x3912 -1 x990 >= -1 ;++1 x3912 -1 x998 +1 x990 >= 0 ;+-1 x3913 +1 x999 >= 0 ;+-1 x3913 -1 x991 >= -1 ;++1 x3913 -1 x999 +1 x991 >= 0 ;+-1 x3914 +1 x1000 >= 0 ;+-1 x3914 -1 x992 >= -1 ;++1 x3914 -1 x1000 +1 x992 >= 0 ;+-1 x3915 +1 x1001 >= 0 ;+-1 x3915 -1 x993 >= -1 ;++1 x3915 -1 x1001 +1 x993 >= 0 ;+-1 x3916 +1 x1002 >= 0 ;+-1 x3916 -1 x994 >= -1 ;++1 x3916 -1 x1002 +1 x994 >= 0 ;+-1 x3917 +1 x1003 >= 0 ;+-1 x3917 -1 x995 >= -1 ;++1 x3917 -1 x1003 +1 x995 >= 0 ;+-1 x3918 +1 x1004 >= 0 ;+-1 x3918 -1 x996 >= -1 ;++1 x3918 -1 x1004 +1 x996 >= 0 ;+-1 x3919 +1 x1005 >= 0 ;+-1 x3919 -1 x997 >= -1 ;++1 x3919 -1 x1005 +1 x997 >= 0 ;+-1 x3920 +1 x1006 >= 0 ;+-1 x3920 -1 x998 >= -1 ;++1 x3920 -1 x1006 +1 x998 >= 0 ;+-1 x3921 +1 x1007 >= 0 ;+-1 x3921 -1 x999 >= -1 ;++1 x3921 -1 x1007 +1 x999 >= 0 ;+-1 x3922 +1 x1008 >= 0 ;+-1 x3922 -1 x1000 >= -1 ;++1 x3922 -1 x1008 +1 x1000 >= 0 ;+-1 x3923 +1 x1009 >= 0 ;+-1 x3923 -1 x1001 >= -1 ;++1 x3923 -1 x1009 +1 x1001 >= 0 ;+-1 x3924 +1 x1010 >= 0 ;+-1 x3924 -1 x1002 >= -1 ;++1 x3924 -1 x1010 +1 x1002 >= 0 ;+-1 x3925 +1 x1011 >= 0 ;+-1 x3925 -1 x1003 >= -1 ;++1 x3925 -1 x1011 +1 x1003 >= 0 ;+-1 x3926 +1 x1012 >= 0 ;+-1 x3926 -1 x1004 >= -1 ;++1 x3926 -1 x1012 +1 x1004 >= 0 ;+-1 x3927 +1 x1013 >= 0 ;+-1 x3927 -1 x1005 >= -1 ;++1 x3927 -1 x1013 +1 x1005 >= 0 ;+-1 x3928 +1 x1014 >= 0 ;+-1 x3928 -1 x1006 >= -1 ;++1 x3928 -1 x1014 +1 x1006 >= 0 ;+-1 x3929 +1 x1015 >= 0 ;+-1 x3929 -1 x1007 >= -1 ;++1 x3929 -1 x1015 +1 x1007 >= 0 ;+-1 x3930 +1 x1016 >= 0 ;+-1 x3930 -1 x1008 >= -1 ;++1 x3930 -1 x1016 +1 x1008 >= 0 ;+-1 x3931 +1 x1017 >= 0 ;+-1 x3931 -1 x1009 >= -1 ;++1 x3931 -1 x1017 +1 x1009 >= 0 ;+-1 x3932 +1 x1018 >= 0 ;+-1 x3932 -1 x1010 >= -1 ;++1 x3932 -1 x1018 +1 x1010 >= 0 ;+-1 x3933 +1 x1019 >= 0 ;+-1 x3933 -1 x1011 >= -1 ;++1 x3933 -1 x1019 +1 x1011 >= 0 ;+-1 x3934 +1 x1020 >= 0 ;+-1 x3934 -1 x1012 >= -1 ;++1 x3934 -1 x1020 +1 x1012 >= 0 ;+-1 x3935 +1 x1021 >= 0 ;+-1 x3935 -1 x1013 >= -1 ;++1 x3935 -1 x1021 +1 x1013 >= 0 ;+-1 x3936 +1 x1022 >= 0 ;+-1 x3936 -1 x1014 >= -1 ;++1 x3936 -1 x1022 +1 x1014 >= 0 ;+-1 x3937 +1 x1023 >= 0 ;+-1 x3937 -1 x1015 >= -1 ;++1 x3937 -1 x1023 +1 x1015 >= 0 ;+-1 x3938 +1 x1024 >= 0 ;+-1 x3938 -1 x1016 >= -1 ;++1 x3938 -1 x1024 +1 x1016 >= 0 ;+-1 x3939 +1 x1025 >= 0 ;+-1 x3939 -1 x1017 >= -1 ;++1 x3939 -1 x1025 +1 x1017 >= 0 ;+-1 x3940 +1 x1026 >= 0 ;+-1 x3940 -1 x1018 >= -1 ;++1 x3940 -1 x1026 +1 x1018 >= 0 ;+-1 x3941 +1 x1027 >= 0 ;+-1 x3941 -1 x1019 >= -1 ;++1 x3941 -1 x1027 +1 x1019 >= 0 ;+-1 x3942 +1 x1028 >= 0 ;+-1 x3942 -1 x1020 >= -1 ;++1 x3942 -1 x1028 +1 x1020 >= 0 ;+-1 x3943 +1 x1029 >= 0 ;+-1 x3943 -1 x1021 >= -1 ;++1 x3943 -1 x1029 +1 x1021 >= 0 ;+-1 x3944 +1 x1030 >= 0 ;+-1 x3944 -1 x1022 >= -1 ;++1 x3944 -1 x1030 +1 x1022 >= 0 ;+-1 x3945 +1 x1031 >= 0 ;+-1 x3945 -1 x1023 >= -1 ;++1 x3945 -1 x1031 +1 x1023 >= 0 ;+-1 x3946 +1 x1032 >= 0 ;+-1 x3946 -1 x1024 >= -1 ;++1 x3946 -1 x1032 +1 x1024 >= 0 ;+-1 x3947 +1 x1033 >= 0 ;+-1 x3947 -1 x1025 >= -1 ;++1 x3947 -1 x1033 +1 x1025 >= 0 ;+-1 x3948 +1 x1034 >= 0 ;+-1 x3948 -1 x1026 >= -1 ;++1 x3948 -1 x1034 +1 x1026 >= 0 ;+-1 x3949 +1 x1035 >= 0 ;++1 x3949 -1 x1035 >= 0 ;+-1 x3950 +1 x1036 >= 0 ;++1 x3950 -1 x1036 >= 0 ;+-1 x3951 +1 x1037 >= 0 ;++1 x3951 -1 x1037 >= 0 ;+-1 x3952 +1 x1038 >= 0 ;++1 x3952 -1 x1038 >= 0 ;+-1 x3953 +1 x1039 >= 0 ;++1 x3953 -1 x1039 >= 0 ;+-1 x3954 +1 x1040 >= 0 ;++1 x3954 -1 x1040 >= 0 ;+-1 x3955 +1 x1041 >= 0 ;+-1 x3955 -1 x1035 >= -1 ;++1 x3955 -1 x1041 +1 x1035 >= 0 ;+-1 x3956 +1 x1042 >= 0 ;+-1 x3956 -1 x1036 >= -1 ;++1 x3956 -1 x1042 +1 x1036 >= 0 ;+-1 x3957 +1 x1043 >= 0 ;+-1 x3957 -1 x1037 >= -1 ;++1 x3957 -1 x1043 +1 x1037 >= 0 ;+-1 x3958 +1 x1044 >= 0 ;+-1 x3958 -1 x1038 >= -1 ;++1 x3958 -1 x1044 +1 x1038 >= 0 ;+-1 x3959 +1 x1045 >= 0 ;+-1 x3959 -1 x1039 >= -1 ;++1 x3959 -1 x1045 +1 x1039 >= 0 ;+-1 x3960 +1 x1046 >= 0 ;+-1 x3960 -1 x1040 >= -1 ;++1 x3960 -1 x1046 +1 x1040 >= 0 ;+-1 x3961 +1 x1047 >= 0 ;+-1 x3961 -1 x1041 >= -1 ;++1 x3961 -1 x1047 +1 x1041 >= 0 ;+-1 x3962 +1 x1048 >= 0 ;+-1 x3962 -1 x1042 >= -1 ;++1 x3962 -1 x1048 +1 x1042 >= 0 ;+-1 x3963 +1 x1049 >= 0 ;+-1 x3963 -1 x1043 >= -1 ;++1 x3963 -1 x1049 +1 x1043 >= 0 ;+-1 x3964 +1 x1050 >= 0 ;+-1 x3964 -1 x1044 >= -1 ;++1 x3964 -1 x1050 +1 x1044 >= 0 ;+-1 x3965 +1 x1051 >= 0 ;+-1 x3965 -1 x1045 >= -1 ;++1 x3965 -1 x1051 +1 x1045 >= 0 ;+-1 x3966 +1 x1052 >= 0 ;+-1 x3966 -1 x1046 >= -1 ;++1 x3966 -1 x1052 +1 x1046 >= 0 ;+-1 x3967 +1 x1053 >= 0 ;+-1 x3967 -1 x1047 >= -1 ;++1 x3967 -1 x1053 +1 x1047 >= 0 ;+-1 x3968 +1 x1054 >= 0 ;+-1 x3968 -1 x1048 >= -1 ;++1 x3968 -1 x1054 +1 x1048 >= 0 ;+-1 x3969 +1 x1055 >= 0 ;+-1 x3969 -1 x1049 >= -1 ;++1 x3969 -1 x1055 +1 x1049 >= 0 ;+-1 x3970 +1 x1056 >= 0 ;+-1 x3970 -1 x1050 >= -1 ;++1 x3970 -1 x1056 +1 x1050 >= 0 ;+-1 x3971 +1 x1057 >= 0 ;+-1 x3971 -1 x1051 >= -1 ;++1 x3971 -1 x1057 +1 x1051 >= 0 ;+-1 x3972 +1 x1058 >= 0 ;+-1 x3972 -1 x1052 >= -1 ;++1 x3972 -1 x1058 +1 x1052 >= 0 ;+-1 x3973 +1 x1059 >= 0 ;+-1 x3973 -1 x1053 >= -1 ;++1 x3973 -1 x1059 +1 x1053 >= 0 ;+-1 x3974 +1 x1060 >= 0 ;+-1 x3974 -1 x1054 >= -1 ;++1 x3974 -1 x1060 +1 x1054 >= 0 ;+-1 x3975 +1 x1061 >= 0 ;+-1 x3975 -1 x1055 >= -1 ;++1 x3975 -1 x1061 +1 x1055 >= 0 ;+-1 x3976 +1 x1062 >= 0 ;+-1 x3976 -1 x1056 >= -1 ;++1 x3976 -1 x1062 +1 x1056 >= 0 ;+-1 x3977 +1 x1063 >= 0 ;+-1 x3977 -1 x1057 >= -1 ;++1 x3977 -1 x1063 +1 x1057 >= 0 ;+-1 x3978 +1 x1064 >= 0 ;+-1 x3978 -1 x1058 >= -1 ;++1 x3978 -1 x1064 +1 x1058 >= 0 ;+-1 x3979 +1 x1065 >= 0 ;+-1 x3979 -1 x1059 >= -1 ;++1 x3979 -1 x1065 +1 x1059 >= 0 ;+-1 x3980 +1 x1066 >= 0 ;+-1 x3980 -1 x1060 >= -1 ;++1 x3980 -1 x1066 +1 x1060 >= 0 ;+-1 x3981 +1 x1067 >= 0 ;+-1 x3981 -1 x1061 >= -1 ;++1 x3981 -1 x1067 +1 x1061 >= 0 ;+-1 x3982 +1 x1068 >= 0 ;+-1 x3982 -1 x1062 >= -1 ;++1 x3982 -1 x1068 +1 x1062 >= 0 ;+-1 x3983 +1 x1069 >= 0 ;+-1 x3983 -1 x1063 >= -1 ;++1 x3983 -1 x1069 +1 x1063 >= 0 ;+-1 x3984 +1 x1070 >= 0 ;+-1 x3984 -1 x1064 >= -1 ;++1 x3984 -1 x1070 +1 x1064 >= 0 ;+-1 x3985 +1 x1071 >= 0 ;+-1 x3985 -1 x1065 >= -1 ;++1 x3985 -1 x1071 +1 x1065 >= 0 ;+-1 x3986 +1 x1072 >= 0 ;+-1 x3986 -1 x1066 >= -1 ;++1 x3986 -1 x1072 +1 x1066 >= 0 ;+-1 x3987 +1 x1073 >= 0 ;+-1 x3987 -1 x1067 >= -1 ;++1 x3987 -1 x1073 +1 x1067 >= 0 ;+-1 x3988 +1 x1074 >= 0 ;+-1 x3988 -1 x1068 >= -1 ;++1 x3988 -1 x1074 +1 x1068 >= 0 ;+-1 x3989 +1 x1075 >= 0 ;+-1 x3989 -1 x1069 >= -1 ;++1 x3989 -1 x1075 +1 x1069 >= 0 ;+-1 x3990 +1 x1076 >= 0 ;+-1 x3990 -1 x1070 >= -1 ;++1 x3990 -1 x1076 +1 x1070 >= 0 ;+-1 x3991 +1 x1077 >= 0 ;+-1 x3991 -1 x1071 >= -1 ;++1 x3991 -1 x1077 +1 x1071 >= 0 ;+-1 x3992 +1 x1078 >= 0 ;+-1 x3992 -1 x1072 >= -1 ;++1 x3992 -1 x1078 +1 x1072 >= 0 ;+-1 x3993 +1 x1079 >= 0 ;+-1 x3993 -1 x1073 >= -1 ;++1 x3993 -1 x1079 +1 x1073 >= 0 ;+-1 x3994 +1 x1080 >= 0 ;+-1 x3994 -1 x1074 >= -1 ;++1 x3994 -1 x1080 +1 x1074 >= 0 ;+-1 x3995 +1 x1081 >= 0 ;+-1 x3995 -1 x1075 >= -1 ;++1 x3995 -1 x1081 +1 x1075 >= 0 ;+-1 x3996 +1 x1082 >= 0 ;+-1 x3996 -1 x1076 >= -1 ;++1 x3996 -1 x1082 +1 x1076 >= 0 ;+-1 x3997 +1 x1083 >= 0 ;+-1 x3997 -1 x1077 >= -1 ;++1 x3997 -1 x1083 +1 x1077 >= 0 ;+-1 x3998 +1 x1084 >= 0 ;+-1 x3998 -1 x1078 >= -1 ;++1 x3998 -1 x1084 +1 x1078 >= 0 ;+-1 x3999 +1 x1085 >= 0 ;+-1 x3999 -1 x1079 >= -1 ;++1 x3999 -1 x1085 +1 x1079 >= 0 ;+-1 x4000 +1 x1086 >= 0 ;+-1 x4000 -1 x1080 >= -1 ;++1 x4000 -1 x1086 +1 x1080 >= 0 ;+-1 x4001 +1 x1087 >= 0 ;+-1 x4001 -1 x1081 >= -1 ;++1 x4001 -1 x1087 +1 x1081 >= 0 ;+-1 x4002 +1 x1088 >= 0 ;+-1 x4002 -1 x1082 >= -1 ;++1 x4002 -1 x1088 +1 x1082 >= 0 ;+-1 x4003 +1 x1089 >= 0 ;+-1 x4003 -1 x1083 >= -1 ;++1 x4003 -1 x1089 +1 x1083 >= 0 ;+-1 x4004 +1 x1090 >= 0 ;+-1 x4004 -1 x1084 >= -1 ;++1 x4004 -1 x1090 +1 x1084 >= 0 ;+-1 x4005 +1 x1091 >= 0 ;+-1 x4005 -1 x1085 >= -1 ;++1 x4005 -1 x1091 +1 x1085 >= 0 ;+-1 x4006 +1 x1092 >= 0 ;+-1 x4006 -1 x1086 >= -1 ;++1 x4006 -1 x1092 +1 x1086 >= 0 ;+-1 x4007 +1 x1093 >= 0 ;+-1 x4007 -1 x1087 >= -1 ;++1 x4007 -1 x1093 +1 x1087 >= 0 ;+-1 x4008 +1 x1094 >= 0 ;+-1 x4008 -1 x1088 >= -1 ;++1 x4008 -1 x1094 +1 x1088 >= 0 ;+-1 x4009 +1 x1095 >= 0 ;+-1 x4009 -1 x1089 >= -1 ;++1 x4009 -1 x1095 +1 x1089 >= 0 ;+-1 x4010 +1 x1096 >= 0 ;+-1 x4010 -1 x1090 >= -1 ;++1 x4010 -1 x1096 +1 x1090 >= 0 ;+-1 x4011 +1 x1097 >= 0 ;+-1 x4011 -1 x1091 >= -1 ;++1 x4011 -1 x1097 +1 x1091 >= 0 ;+-1 x4012 +1 x1098 >= 0 ;+-1 x4012 -1 x1092 >= -1 ;++1 x4012 -1 x1098 +1 x1092 >= 0 ;+-1 x4013 +1 x1099 >= 0 ;+-1 x4013 -1 x1093 >= -1 ;++1 x4013 -1 x1099 +1 x1093 >= 0 ;+-1 x4014 +1 x1100 >= 0 ;+-1 x4014 -1 x1094 >= -1 ;++1 x4014 -1 x1100 +1 x1094 >= 0 ;+-1 x4015 +1 x1101 >= 0 ;+-1 x4015 -1 x1095 >= -1 ;++1 x4015 -1 x1101 +1 x1095 >= 0 ;+-1 x4016 +1 x1102 >= 0 ;+-1 x4016 -1 x1096 >= -1 ;++1 x4016 -1 x1102 +1 x1096 >= 0 ;+-1 x4017 +1 x1103 >= 0 ;+-1 x4017 -1 x1097 >= -1 ;++1 x4017 -1 x1103 +1 x1097 >= 0 ;+-1 x4018 +1 x1104 >= 0 ;+-1 x4018 -1 x1098 >= -1 ;++1 x4018 -1 x1104 +1 x1098 >= 0 ;+-1 x4019 +1 x1105 >= 0 ;+-1 x4019 -1 x1099 >= -1 ;++1 x4019 -1 x1105 +1 x1099 >= 0 ;+-1 x4020 +1 x1106 >= 0 ;+-1 x4020 -1 x1100 >= -1 ;++1 x4020 -1 x1106 +1 x1100 >= 0 ;+-1 x4021 +1 x1107 >= 0 ;+-1 x4021 -1 x1101 >= -1 ;++1 x4021 -1 x1107 +1 x1101 >= 0 ;+-1 x4022 +1 x1108 >= 0 ;+-1 x4022 -1 x1102 >= -1 ;++1 x4022 -1 x1108 +1 x1102 >= 0 ;+-1 x4023 +1 x1109 >= 0 ;+-1 x4023 -1 x1103 >= -1 ;++1 x4023 -1 x1109 +1 x1103 >= 0 ;+-1 x4024 +1 x1110 >= 0 ;+-1 x4024 -1 x1104 >= -1 ;++1 x4024 -1 x1110 +1 x1104 >= 0 ;+-1 x4025 +1 x1111 >= 0 ;+-1 x4025 -1 x1105 >= -1 ;++1 x4025 -1 x1111 +1 x1105 >= 0 ;+-1 x4026 +1 x1112 >= 0 ;+-1 x4026 -1 x1106 >= -1 ;++1 x4026 -1 x1112 +1 x1106 >= 0 ;+-1 x4027 +1 x1113 >= 0 ;+-1 x4027 -1 x1107 >= -1 ;++1 x4027 -1 x1113 +1 x1107 >= 0 ;+-1 x4028 +1 x1114 >= 0 ;+-1 x4028 -1 x1108 >= -1 ;++1 x4028 -1 x1114 +1 x1108 >= 0 ;+-1 x4029 +1 x1115 >= 0 ;+-1 x4029 -1 x1109 >= -1 ;++1 x4029 -1 x1115 +1 x1109 >= 0 ;+-1 x4030 +1 x1116 >= 0 ;+-1 x4030 -1 x1110 >= -1 ;++1 x4030 -1 x1116 +1 x1110 >= 0 ;+-1 x4031 +1 x1117 >= 0 ;+-1 x4031 -1 x1111 >= -1 ;++1 x4031 -1 x1117 +1 x1111 >= 0 ;+-1 x4032 +1 x1118 >= 0 ;+-1 x4032 -1 x1112 >= -1 ;++1 x4032 -1 x1118 +1 x1112 >= 0 ;+-1 x4033 +1 x1119 >= 0 ;+-1 x4033 -1 x1113 >= -1 ;++1 x4033 -1 x1119 +1 x1113 >= 0 ;+-1 x4034 +1 x1120 >= 0 ;+-1 x4034 -1 x1114 >= -1 ;++1 x4034 -1 x1120 +1 x1114 >= 0 ;+-1 x4035 +1 x1121 >= 0 ;+-1 x4035 -1 x1115 >= -1 ;++1 x4035 -1 x1121 +1 x1115 >= 0 ;+-1 x4036 +1 x1122 >= 0 ;+-1 x4036 -1 x1116 >= -1 ;++1 x4036 -1 x1122 +1 x1116 >= 0 ;+-1 x4037 +1 x1123 >= 0 ;+-1 x4037 -1 x1117 >= -1 ;++1 x4037 -1 x1123 +1 x1117 >= 0 ;+-1 x4038 +1 x1124 >= 0 ;+-1 x4038 -1 x1118 >= -1 ;++1 x4038 -1 x1124 +1 x1118 >= 0 ;+-1 x4039 +1 x1125 >= 0 ;+-1 x4039 -1 x1119 >= -1 ;++1 x4039 -1 x1125 +1 x1119 >= 0 ;+-1 x4040 +1 x1126 >= 0 ;+-1 x4040 -1 x1120 >= -1 ;++1 x4040 -1 x1126 +1 x1120 >= 0 ;+-1 x4041 +1 x1127 >= 0 ;+-1 x4041 -1 x1121 >= -1 ;++1 x4041 -1 x1127 +1 x1121 >= 0 ;+-1 x4042 +1 x1128 >= 0 ;+-1 x4042 -1 x1122 >= -1 ;++1 x4042 -1 x1128 +1 x1122 >= 0 ;+-1 x4043 +1 x1129 >= 0 ;++1 x4043 -1 x1129 >= 0 ;+-1 x4044 +1 x1130 >= 0 ;++1 x4044 -1 x1130 >= 0 ;+-1 x4045 +1 x1131 >= 0 ;++1 x4045 -1 x1131 >= 0 ;+-1 x4046 +1 x1132 >= 0 ;++1 x4046 -1 x1132 >= 0 ;+-1 x4047 +1 x1133 >= 0 ;++1 x4047 -1 x1133 >= 0 ;+-1 x4048 +1 x1134 >= 0 ;++1 x4048 -1 x1134 >= 0 ;+-1 x4049 +1 x1135 >= 0 ;+-1 x4049 -1 x1129 >= -1 ;++1 x4049 -1 x1135 +1 x1129 >= 0 ;+-1 x4050 +1 x1136 >= 0 ;+-1 x4050 -1 x1130 >= -1 ;++1 x4050 -1 x1136 +1 x1130 >= 0 ;+-1 x4051 +1 x1137 >= 0 ;+-1 x4051 -1 x1131 >= -1 ;++1 x4051 -1 x1137 +1 x1131 >= 0 ;+-1 x4052 +1 x1138 >= 0 ;+-1 x4052 -1 x1132 >= -1 ;++1 x4052 -1 x1138 +1 x1132 >= 0 ;+-1 x4053 +1 x1139 >= 0 ;+-1 x4053 -1 x1133 >= -1 ;++1 x4053 -1 x1139 +1 x1133 >= 0 ;+-1 x4054 +1 x1140 >= 0 ;+-1 x4054 -1 x1134 >= -1 ;++1 x4054 -1 x1140 +1 x1134 >= 0 ;+-1 x4055 +1 x1141 >= 0 ;+-1 x4055 -1 x1135 >= -1 ;++1 x4055 -1 x1141 +1 x1135 >= 0 ;+-1 x4056 +1 x1142 >= 0 ;+-1 x4056 -1 x1136 >= -1 ;++1 x4056 -1 x1142 +1 x1136 >= 0 ;+-1 x4057 +1 x1143 >= 0 ;+-1 x4057 -1 x1137 >= -1 ;++1 x4057 -1 x1143 +1 x1137 >= 0 ;+-1 x4058 +1 x1144 >= 0 ;+-1 x4058 -1 x1138 >= -1 ;++1 x4058 -1 x1144 +1 x1138 >= 0 ;+-1 x4059 +1 x1145 >= 0 ;+-1 x4059 -1 x1139 >= -1 ;++1 x4059 -1 x1145 +1 x1139 >= 0 ;+-1 x4060 +1 x1146 >= 0 ;+-1 x4060 -1 x1140 >= -1 ;++1 x4060 -1 x1146 +1 x1140 >= 0 ;+-1 x4061 +1 x1147 >= 0 ;+-1 x4061 -1 x1141 >= -1 ;++1 x4061 -1 x1147 +1 x1141 >= 0 ;+-1 x4062 +1 x1148 >= 0 ;+-1 x4062 -1 x1142 >= -1 ;++1 x4062 -1 x1148 +1 x1142 >= 0 ;+-1 x4063 +1 x1149 >= 0 ;+-1 x4063 -1 x1143 >= -1 ;++1 x4063 -1 x1149 +1 x1143 >= 0 ;+-1 x4064 +1 x1150 >= 0 ;+-1 x4064 -1 x1144 >= -1 ;++1 x4064 -1 x1150 +1 x1144 >= 0 ;+-1 x4065 +1 x1151 >= 0 ;+-1 x4065 -1 x1145 >= -1 ;++1 x4065 -1 x1151 +1 x1145 >= 0 ;+-1 x4066 +1 x1152 >= 0 ;+-1 x4066 -1 x1146 >= -1 ;++1 x4066 -1 x1152 +1 x1146 >= 0 ;+-1 x4067 +1 x1153 >= 0 ;+-1 x4067 -1 x1147 >= -1 ;++1 x4067 -1 x1153 +1 x1147 >= 0 ;+-1 x4068 +1 x1154 >= 0 ;+-1 x4068 -1 x1148 >= -1 ;++1 x4068 -1 x1154 +1 x1148 >= 0 ;+-1 x4069 +1 x1155 >= 0 ;+-1 x4069 -1 x1149 >= -1 ;++1 x4069 -1 x1155 +1 x1149 >= 0 ;+-1 x4070 +1 x1156 >= 0 ;+-1 x4070 -1 x1150 >= -1 ;++1 x4070 -1 x1156 +1 x1150 >= 0 ;+-1 x4071 +1 x1157 >= 0 ;+-1 x4071 -1 x1151 >= -1 ;++1 x4071 -1 x1157 +1 x1151 >= 0 ;+-1 x4072 +1 x1158 >= 0 ;+-1 x4072 -1 x1152 >= -1 ;++1 x4072 -1 x1158 +1 x1152 >= 0 ;+-1 x4073 +1 x1159 >= 0 ;+-1 x4073 -1 x1153 >= -1 ;++1 x4073 -1 x1159 +1 x1153 >= 0 ;+-1 x4074 +1 x1160 >= 0 ;+-1 x4074 -1 x1154 >= -1 ;++1 x4074 -1 x1160 +1 x1154 >= 0 ;+-1 x4075 +1 x1161 >= 0 ;+-1 x4075 -1 x1155 >= -1 ;++1 x4075 -1 x1161 +1 x1155 >= 0 ;+-1 x4076 +1 x1162 >= 0 ;+-1 x4076 -1 x1156 >= -1 ;++1 x4076 -1 x1162 +1 x1156 >= 0 ;+-1 x4077 +1 x1163 >= 0 ;+-1 x4077 -1 x1157 >= -1 ;++1 x4077 -1 x1163 +1 x1157 >= 0 ;+-1 x4078 +1 x1164 >= 0 ;+-1 x4078 -1 x1158 >= -1 ;++1 x4078 -1 x1164 +1 x1158 >= 0 ;+-1 x4079 +1 x1165 >= 0 ;+-1 x4079 -1 x1159 >= -1 ;++1 x4079 -1 x1165 +1 x1159 >= 0 ;+-1 x4080 +1 x1166 >= 0 ;+-1 x4080 -1 x1160 >= -1 ;++1 x4080 -1 x1166 +1 x1160 >= 0 ;+-1 x4081 +1 x1167 >= 0 ;+-1 x4081 -1 x1161 >= -1 ;++1 x4081 -1 x1167 +1 x1161 >= 0 ;+-1 x4082 +1 x1168 >= 0 ;+-1 x4082 -1 x1162 >= -1 ;++1 x4082 -1 x1168 +1 x1162 >= 0 ;+-1 x4083 +1 x1169 >= 0 ;+-1 x4083 -1 x1163 >= -1 ;++1 x4083 -1 x1169 +1 x1163 >= 0 ;+-1 x4084 +1 x1170 >= 0 ;+-1 x4084 -1 x1164 >= -1 ;++1 x4084 -1 x1170 +1 x1164 >= 0 ;+-1 x4085 +1 x1171 >= 0 ;+-1 x4085 -1 x1165 >= -1 ;++1 x4085 -1 x1171 +1 x1165 >= 0 ;+-1 x4086 +1 x1172 >= 0 ;+-1 x4086 -1 x1166 >= -1 ;++1 x4086 -1 x1172 +1 x1166 >= 0 ;+-1 x4087 +1 x1173 >= 0 ;+-1 x4087 -1 x1167 >= -1 ;++1 x4087 -1 x1173 +1 x1167 >= 0 ;+-1 x4088 +1 x1174 >= 0 ;+-1 x4088 -1 x1168 >= -1 ;++1 x4088 -1 x1174 +1 x1168 >= 0 ;+-1 x4089 +1 x1175 >= 0 ;+-1 x4089 -1 x1169 >= -1 ;++1 x4089 -1 x1175 +1 x1169 >= 0 ;+-1 x4090 +1 x1176 >= 0 ;+-1 x4090 -1 x1170 >= -1 ;++1 x4090 -1 x1176 +1 x1170 >= 0 ;+-1 x4091 +1 x1177 >= 0 ;+-1 x4091 -1 x1171 >= -1 ;++1 x4091 -1 x1177 +1 x1171 >= 0 ;+-1 x4092 +1 x1178 >= 0 ;+-1 x4092 -1 x1172 >= -1 ;++1 x4092 -1 x1178 +1 x1172 >= 0 ;+-1 x4093 +1 x1179 >= 0 ;+-1 x4093 -1 x1173 >= -1 ;++1 x4093 -1 x1179 +1 x1173 >= 0 ;+-1 x4094 +1 x1180 >= 0 ;+-1 x4094 -1 x1174 >= -1 ;++1 x4094 -1 x1180 +1 x1174 >= 0 ;+-1 x4095 +1 x1181 >= 0 ;+-1 x4095 -1 x1175 >= -1 ;++1 x4095 -1 x1181 +1 x1175 >= 0 ;+-1 x4096 +1 x1182 >= 0 ;+-1 x4096 -1 x1176 >= -1 ;++1 x4096 -1 x1182 +1 x1176 >= 0 ;+-1 x4097 +1 x1183 >= 0 ;+-1 x4097 -1 x1177 >= -1 ;++1 x4097 -1 x1183 +1 x1177 >= 0 ;+-1 x4098 +1 x1184 >= 0 ;+-1 x4098 -1 x1178 >= -1 ;++1 x4098 -1 x1184 +1 x1178 >= 0 ;+-1 x4099 +1 x1185 >= 0 ;+-1 x4099 -1 x1179 >= -1 ;++1 x4099 -1 x1185 +1 x1179 >= 0 ;+-1 x4100 +1 x1186 >= 0 ;+-1 x4100 -1 x1180 >= -1 ;++1 x4100 -1 x1186 +1 x1180 >= 0 ;+-1 x4101 +1 x1187 >= 0 ;+-1 x4101 -1 x1181 >= -1 ;++1 x4101 -1 x1187 +1 x1181 >= 0 ;+-1 x4102 +1 x1188 >= 0 ;+-1 x4102 -1 x1182 >= -1 ;++1 x4102 -1 x1188 +1 x1182 >= 0 ;+-1 x4103 +1 x1189 >= 0 ;+-1 x4103 -1 x1183 >= -1 ;++1 x4103 -1 x1189 +1 x1183 >= 0 ;+-1 x4104 +1 x1190 >= 0 ;+-1 x4104 -1 x1184 >= -1 ;++1 x4104 -1 x1190 +1 x1184 >= 0 ;+-1 x4105 +1 x1191 >= 0 ;+-1 x4105 -1 x1185 >= -1 ;++1 x4105 -1 x1191 +1 x1185 >= 0 ;+-1 x4106 +1 x1192 >= 0 ;+-1 x4106 -1 x1186 >= -1 ;++1 x4106 -1 x1192 +1 x1186 >= 0 ;+-1 x4107 +1 x1193 >= 0 ;+-1 x4107 -1 x1187 >= -1 ;++1 x4107 -1 x1193 +1 x1187 >= 0 ;+-1 x4108 +1 x1194 >= 0 ;+-1 x4108 -1 x1188 >= -1 ;++1 x4108 -1 x1194 +1 x1188 >= 0 ;+-1 x4109 +1 x1195 >= 0 ;+-1 x4109 -1 x1189 >= -1 ;++1 x4109 -1 x1195 +1 x1189 >= 0 ;+-1 x4110 +1 x1196 >= 0 ;+-1 x4110 -1 x1190 >= -1 ;++1 x4110 -1 x1196 +1 x1190 >= 0 ;+-1 x4111 +1 x1197 >= 0 ;+-1 x4111 -1 x1191 >= -1 ;++1 x4111 -1 x1197 +1 x1191 >= 0 ;+-1 x4112 +1 x1198 >= 0 ;+-1 x4112 -1 x1192 >= -1 ;++1 x4112 -1 x1198 +1 x1192 >= 0 ;+-1 x4113 +1 x1199 >= 0 ;+-1 x4113 -1 x1193 >= -1 ;++1 x4113 -1 x1199 +1 x1193 >= 0 ;+-1 x4114 +1 x1200 >= 0 ;+-1 x4114 -1 x1194 >= -1 ;++1 x4114 -1 x1200 +1 x1194 >= 0 ;+-1 x4115 +1 x1201 >= 0 ;+-1 x4115 -1 x1195 >= -1 ;++1 x4115 -1 x1201 +1 x1195 >= 0 ;+-1 x4116 +1 x1202 >= 0 ;+-1 x4116 -1 x1196 >= -1 ;++1 x4116 -1 x1202 +1 x1196 >= 0 ;+-1 x4117 +1 x1203 >= 0 ;+-1 x4117 -1 x1197 >= -1 ;++1 x4117 -1 x1203 +1 x1197 >= 0 ;+-1 x4118 +1 x1204 >= 0 ;+-1 x4118 -1 x1198 >= -1 ;++1 x4118 -1 x1204 +1 x1198 >= 0 ;+-1 x4119 +1 x1205 >= 0 ;+-1 x4119 -1 x1199 >= -1 ;++1 x4119 -1 x1205 +1 x1199 >= 0 ;+-1 x4120 +1 x1206 >= 0 ;+-1 x4120 -1 x1200 >= -1 ;++1 x4120 -1 x1206 +1 x1200 >= 0 ;+-1 x4121 +1 x1207 >= 0 ;+-1 x4121 -1 x1201 >= -1 ;++1 x4121 -1 x1207 +1 x1201 >= 0 ;+-1 x4122 +1 x1208 >= 0 ;+-1 x4122 -1 x1202 >= -1 ;++1 x4122 -1 x1208 +1 x1202 >= 0 ;+-1 x4123 +1 x1209 >= 0 ;+-1 x4123 -1 x1203 >= -1 ;++1 x4123 -1 x1209 +1 x1203 >= 0 ;+-1 x4124 +1 x1210 >= 0 ;+-1 x4124 -1 x1204 >= -1 ;++1 x4124 -1 x1210 +1 x1204 >= 0 ;+-1 x4125 +1 x1211 >= 0 ;+-1 x4125 -1 x1205 >= -1 ;++1 x4125 -1 x1211 +1 x1205 >= 0 ;+-1 x4126 +1 x1212 >= 0 ;+-1 x4126 -1 x1206 >= -1 ;++1 x4126 -1 x1212 +1 x1206 >= 0 ;+-1 x4127 +1 x1213 >= 0 ;+-1 x4127 -1 x1207 >= -1 ;++1 x4127 -1 x1213 +1 x1207 >= 0 ;+-1 x4128 +1 x1214 >= 0 ;+-1 x4128 -1 x1208 >= -1 ;++1 x4128 -1 x1214 +1 x1208 >= 0 ;+-1 x4129 +1 x1215 >= 0 ;+-1 x4129 -1 x1209 >= -1 ;++1 x4129 -1 x1215 +1 x1209 >= 0 ;+-1 x4130 +1 x1216 >= 0 ;+-1 x4130 -1 x1210 >= -1 ;++1 x4130 -1 x1216 +1 x1210 >= 0 ;+-1 x4131 +1 x1217 >= 0 ;+-1 x4131 -1 x1211 >= -1 ;++1 x4131 -1 x1217 +1 x1211 >= 0 ;+-1 x4132 +1 x1218 >= 0 ;+-1 x4132 -1 x1212 >= -1 ;++1 x4132 -1 x1218 +1 x1212 >= 0 ;+-1 x4133 +1 x1219 >= 0 ;+-1 x4133 -1 x1213 >= -1 ;++1 x4133 -1 x1219 +1 x1213 >= 0 ;+-1 x4134 +1 x1220 >= 0 ;+-1 x4134 -1 x1214 >= -1 ;++1 x4134 -1 x1220 +1 x1214 >= 0 ;+-1 x4135 +1 x1221 >= 0 ;+-1 x4135 -1 x1215 >= -1 ;++1 x4135 -1 x1221 +1 x1215 >= 0 ;+-1 x4136 +1 x1222 >= 0 ;+-1 x4136 -1 x1216 >= -1 ;++1 x4136 -1 x1222 +1 x1216 >= 0 ;+-1 x4137 +1 x1223 >= 0 ;++1 x4137 -1 x1223 >= 0 ;+-1 x4138 +1 x1224 >= 0 ;++1 x4138 -1 x1224 >= 0 ;+-1 x4139 +1 x1225 >= 0 ;++1 x4139 -1 x1225 >= 0 ;+-1 x4140 +1 x1226 >= 0 ;++1 x4140 -1 x1226 >= 0 ;+-1 x4141 +1 x1227 >= 0 ;++1 x4141 -1 x1227 >= 0 ;+-1 x4142 +1 x1228 >= 0 ;++1 x4142 -1 x1228 >= 0 ;+-1 x4143 +1 x1229 >= 0 ;++1 x4143 -1 x1229 >= 0 ;+-1 x4144 +1 x1230 >= 0 ;++1 x4144 -1 x1230 >= 0 ;+-1 x4145 +1 x1231 >= 0 ;++1 x4145 -1 x1231 >= 0 ;+-1 x4146 +1 x1232 >= 0 ;++1 x4146 -1 x1232 >= 0 ;+-1 x4147 +1 x1233 >= 0 ;+-1 x4147 -1 x1223 >= -1 ;++1 x4147 -1 x1233 +1 x1223 >= 0 ;+-1 x4148 +1 x1234 >= 0 ;+-1 x4148 -1 x1224 >= -1 ;++1 x4148 -1 x1234 +1 x1224 >= 0 ;+-1 x4149 +1 x1235 >= 0 ;+-1 x4149 -1 x1225 >= -1 ;++1 x4149 -1 x1235 +1 x1225 >= 0 ;+-1 x4150 +1 x1236 >= 0 ;+-1 x4150 -1 x1226 >= -1 ;++1 x4150 -1 x1236 +1 x1226 >= 0 ;+-1 x4151 +1 x1237 >= 0 ;+-1 x4151 -1 x1227 >= -1 ;++1 x4151 -1 x1237 +1 x1227 >= 0 ;+-1 x4152 +1 x1238 >= 0 ;+-1 x4152 -1 x1228 >= -1 ;++1 x4152 -1 x1238 +1 x1228 >= 0 ;+-1 x4153 +1 x1239 >= 0 ;+-1 x4153 -1 x1229 >= -1 ;++1 x4153 -1 x1239 +1 x1229 >= 0 ;+-1 x4154 +1 x1240 >= 0 ;+-1 x4154 -1 x1230 >= -1 ;++1 x4154 -1 x1240 +1 x1230 >= 0 ;+-1 x4155 +1 x1241 >= 0 ;+-1 x4155 -1 x1231 >= -1 ;++1 x4155 -1 x1241 +1 x1231 >= 0 ;+-1 x4156 +1 x1242 >= 0 ;+-1 x4156 -1 x1232 >= -1 ;++1 x4156 -1 x1242 +1 x1232 >= 0 ;+-1 x4157 +1 x1243 >= 0 ;+-1 x4157 -1 x1233 >= -1 ;++1 x4157 -1 x1243 +1 x1233 >= 0 ;+-1 x4158 +1 x1244 >= 0 ;+-1 x4158 -1 x1234 >= -1 ;++1 x4158 -1 x1244 +1 x1234 >= 0 ;+-1 x4159 +1 x1245 >= 0 ;+-1 x4159 -1 x1235 >= -1 ;++1 x4159 -1 x1245 +1 x1235 >= 0 ;+-1 x4160 +1 x1246 >= 0 ;+-1 x4160 -1 x1236 >= -1 ;++1 x4160 -1 x1246 +1 x1236 >= 0 ;+-1 x4161 +1 x1247 >= 0 ;+-1 x4161 -1 x1237 >= -1 ;++1 x4161 -1 x1247 +1 x1237 >= 0 ;+-1 x4162 +1 x1248 >= 0 ;+-1 x4162 -1 x1238 >= -1 ;++1 x4162 -1 x1248 +1 x1238 >= 0 ;+-1 x4163 +1 x1249 >= 0 ;+-1 x4163 -1 x1239 >= -1 ;++1 x4163 -1 x1249 +1 x1239 >= 0 ;+-1 x4164 +1 x1250 >= 0 ;+-1 x4164 -1 x1240 >= -1 ;++1 x4164 -1 x1250 +1 x1240 >= 0 ;+-1 x4165 +1 x1251 >= 0 ;+-1 x4165 -1 x1241 >= -1 ;++1 x4165 -1 x1251 +1 x1241 >= 0 ;+-1 x4166 +1 x1252 >= 0 ;+-1 x4166 -1 x1242 >= -1 ;++1 x4166 -1 x1252 +1 x1242 >= 0 ;+-1 x4167 +1 x1253 >= 0 ;+-1 x4167 -1 x1243 >= -1 ;++1 x4167 -1 x1253 +1 x1243 >= 0 ;+-1 x4168 +1 x1254 >= 0 ;+-1 x4168 -1 x1244 >= -1 ;++1 x4168 -1 x1254 +1 x1244 >= 0 ;+-1 x4169 +1 x1255 >= 0 ;+-1 x4169 -1 x1245 >= -1 ;++1 x4169 -1 x1255 +1 x1245 >= 0 ;+-1 x4170 +1 x1256 >= 0 ;+-1 x4170 -1 x1246 >= -1 ;++1 x4170 -1 x1256 +1 x1246 >= 0 ;+-1 x4171 +1 x1257 >= 0 ;+-1 x4171 -1 x1247 >= -1 ;++1 x4171 -1 x1257 +1 x1247 >= 0 ;+-1 x4172 +1 x1258 >= 0 ;+-1 x4172 -1 x1248 >= -1 ;++1 x4172 -1 x1258 +1 x1248 >= 0 ;+-1 x4173 +1 x1259 >= 0 ;+-1 x4173 -1 x1249 >= -1 ;++1 x4173 -1 x1259 +1 x1249 >= 0 ;+-1 x4174 +1 x1260 >= 0 ;+-1 x4174 -1 x1250 >= -1 ;++1 x4174 -1 x1260 +1 x1250 >= 0 ;+-1 x4175 +1 x1261 >= 0 ;+-1 x4175 -1 x1251 >= -1 ;++1 x4175 -1 x1261 +1 x1251 >= 0 ;+-1 x4176 +1 x1262 >= 0 ;+-1 x4176 -1 x1252 >= -1 ;++1 x4176 -1 x1262 +1 x1252 >= 0 ;+-1 x4177 +1 x1263 >= 0 ;+-1 x4177 -1 x1253 >= -1 ;++1 x4177 -1 x1263 +1 x1253 >= 0 ;+-1 x4178 +1 x1264 >= 0 ;+-1 x4178 -1 x1254 >= -1 ;++1 x4178 -1 x1264 +1 x1254 >= 0 ;+-1 x4179 +1 x1265 >= 0 ;+-1 x4179 -1 x1255 >= -1 ;++1 x4179 -1 x1265 +1 x1255 >= 0 ;+-1 x4180 +1 x1266 >= 0 ;+-1 x4180 -1 x1256 >= -1 ;++1 x4180 -1 x1266 +1 x1256 >= 0 ;+-1 x4181 +1 x1267 >= 0 ;+-1 x4181 -1 x1257 >= -1 ;++1 x4181 -1 x1267 +1 x1257 >= 0 ;+-1 x4182 +1 x1268 >= 0 ;+-1 x4182 -1 x1258 >= -1 ;++1 x4182 -1 x1268 +1 x1258 >= 0 ;+-1 x4183 +1 x1269 >= 0 ;+-1 x4183 -1 x1259 >= -1 ;++1 x4183 -1 x1269 +1 x1259 >= 0 ;+-1 x4184 +1 x1270 >= 0 ;+-1 x4184 -1 x1260 >= -1 ;++1 x4184 -1 x1270 +1 x1260 >= 0 ;+-1 x4185 +1 x1271 >= 0 ;+-1 x4185 -1 x1261 >= -1 ;++1 x4185 -1 x1271 +1 x1261 >= 0 ;+-1 x4186 +1 x1272 >= 0 ;+-1 x4186 -1 x1262 >= -1 ;++1 x4186 -1 x1272 +1 x1262 >= 0 ;+-1 x4187 +1 x1273 >= 0 ;+-1 x4187 -1 x1263 >= -1 ;++1 x4187 -1 x1273 +1 x1263 >= 0 ;+-1 x4188 +1 x1274 >= 0 ;+-1 x4188 -1 x1264 >= -1 ;++1 x4188 -1 x1274 +1 x1264 >= 0 ;+-1 x4189 +1 x1275 >= 0 ;+-1 x4189 -1 x1265 >= -1 ;++1 x4189 -1 x1275 +1 x1265 >= 0 ;+-1 x4190 +1 x1276 >= 0 ;+-1 x4190 -1 x1266 >= -1 ;++1 x4190 -1 x1276 +1 x1266 >= 0 ;+-1 x4191 +1 x1277 >= 0 ;+-1 x4191 -1 x1267 >= -1 ;++1 x4191 -1 x1277 +1 x1267 >= 0 ;+-1 x4192 +1 x1278 >= 0 ;+-1 x4192 -1 x1268 >= -1 ;++1 x4192 -1 x1278 +1 x1268 >= 0 ;+-1 x4193 +1 x1279 >= 0 ;+-1 x4193 -1 x1269 >= -1 ;++1 x4193 -1 x1279 +1 x1269 >= 0 ;+-1 x4194 +1 x1280 >= 0 ;+-1 x4194 -1 x1270 >= -1 ;++1 x4194 -1 x1280 +1 x1270 >= 0 ;+-1 x4195 +1 x1281 >= 0 ;+-1 x4195 -1 x1271 >= -1 ;++1 x4195 -1 x1281 +1 x1271 >= 0 ;+-1 x4196 +1 x1282 >= 0 ;+-1 x4196 -1 x1272 >= -1 ;++1 x4196 -1 x1282 +1 x1272 >= 0 ;+-1 x4197 +1 x1283 >= 0 ;+-1 x4197 -1 x1273 >= -1 ;++1 x4197 -1 x1283 +1 x1273 >= 0 ;+-1 x4198 +1 x1284 >= 0 ;+-1 x4198 -1 x1274 >= -1 ;++1 x4198 -1 x1284 +1 x1274 >= 0 ;+-1 x4199 +1 x1285 >= 0 ;+-1 x4199 -1 x1275 >= -1 ;++1 x4199 -1 x1285 +1 x1275 >= 0 ;+-1 x4200 +1 x1286 >= 0 ;+-1 x4200 -1 x1276 >= -1 ;++1 x4200 -1 x1286 +1 x1276 >= 0 ;+-1 x4201 +1 x1287 >= 0 ;+-1 x4201 -1 x1277 >= -1 ;++1 x4201 -1 x1287 +1 x1277 >= 0 ;+-1 x4202 +1 x1288 >= 0 ;+-1 x4202 -1 x1278 >= -1 ;++1 x4202 -1 x1288 +1 x1278 >= 0 ;+-1 x4203 +1 x1289 >= 0 ;+-1 x4203 -1 x1279 >= -1 ;++1 x4203 -1 x1289 +1 x1279 >= 0 ;+-1 x4204 +1 x1290 >= 0 ;+-1 x4204 -1 x1280 >= -1 ;++1 x4204 -1 x1290 +1 x1280 >= 0 ;+-1 x4205 +1 x1291 >= 0 ;+-1 x4205 -1 x1281 >= -1 ;++1 x4205 -1 x1291 +1 x1281 >= 0 ;+-1 x4206 +1 x1292 >= 0 ;+-1 x4206 -1 x1282 >= -1 ;++1 x4206 -1 x1292 +1 x1282 >= 0 ;+-1 x4207 +1 x1293 >= 0 ;+-1 x4207 -1 x1283 >= -1 ;++1 x4207 -1 x1293 +1 x1283 >= 0 ;+-1 x4208 +1 x1294 >= 0 ;+-1 x4208 -1 x1284 >= -1 ;++1 x4208 -1 x1294 +1 x1284 >= 0 ;+-1 x4209 +1 x1295 >= 0 ;+-1 x4209 -1 x1285 >= -1 ;++1 x4209 -1 x1295 +1 x1285 >= 0 ;+-1 x4210 +1 x1296 >= 0 ;+-1 x4210 -1 x1286 >= -1 ;++1 x4210 -1 x1296 +1 x1286 >= 0 ;+-1 x4211 +1 x1297 >= 0 ;+-1 x4211 -1 x1287 >= -1 ;++1 x4211 -1 x1297 +1 x1287 >= 0 ;+-1 x4212 +1 x1298 >= 0 ;+-1 x4212 -1 x1288 >= -1 ;++1 x4212 -1 x1298 +1 x1288 >= 0 ;+-1 x4213 +1 x1299 >= 0 ;+-1 x4213 -1 x1289 >= -1 ;++1 x4213 -1 x1299 +1 x1289 >= 0 ;+-1 x4214 +1 x1300 >= 0 ;+-1 x4214 -1 x1290 >= -1 ;++1 x4214 -1 x1300 +1 x1290 >= 0 ;+-1 x4215 +1 x1301 >= 0 ;+-1 x4215 -1 x1291 >= -1 ;++1 x4215 -1 x1301 +1 x1291 >= 0 ;+-1 x4216 +1 x1302 >= 0 ;+-1 x4216 -1 x1292 >= -1 ;++1 x4216 -1 x1302 +1 x1292 >= 0 ;+-1 x4217 +1 x1303 >= 0 ;+-1 x4217 -1 x1293 >= -1 ;++1 x4217 -1 x1303 +1 x1293 >= 0 ;+-1 x4218 +1 x1304 >= 0 ;+-1 x4218 -1 x1294 >= -1 ;++1 x4218 -1 x1304 +1 x1294 >= 0 ;+-1 x4219 +1 x1305 >= 0 ;+-1 x4219 -1 x1295 >= -1 ;++1 x4219 -1 x1305 +1 x1295 >= 0 ;+-1 x4220 +1 x1306 >= 0 ;+-1 x4220 -1 x1296 >= -1 ;++1 x4220 -1 x1306 +1 x1296 >= 0 ;+-1 x4221 +1 x1307 >= 0 ;+-1 x4221 -1 x1297 >= -1 ;++1 x4221 -1 x1307 +1 x1297 >= 0 ;+-1 x4222 +1 x1308 >= 0 ;+-1 x4222 -1 x1298 >= -1 ;++1 x4222 -1 x1308 +1 x1298 >= 0 ;+-1 x4223 +1 x1309 >= 0 ;+-1 x4223 -1 x1299 >= -1 ;++1 x4223 -1 x1309 +1 x1299 >= 0 ;+-1 x4224 +1 x1310 >= 0 ;+-1 x4224 -1 x1300 >= -1 ;++1 x4224 -1 x1310 +1 x1300 >= 0 ;+-1 x4225 +1 x1311 >= 0 ;+-1 x4225 -1 x1301 >= -1 ;++1 x4225 -1 x1311 +1 x1301 >= 0 ;+-1 x4226 +1 x1312 >= 0 ;+-1 x4226 -1 x1302 >= -1 ;++1 x4226 -1 x1312 +1 x1302 >= 0 ;+-1 x4227 +1 x1313 >= 0 ;+-1 x4227 -1 x1303 >= -1 ;++1 x4227 -1 x1313 +1 x1303 >= 0 ;+-1 x4228 +1 x1314 >= 0 ;+-1 x4228 -1 x1304 >= -1 ;++1 x4228 -1 x1314 +1 x1304 >= 0 ;+-1 x4229 +1 x1315 >= 0 ;+-1 x4229 -1 x1305 >= -1 ;++1 x4229 -1 x1315 +1 x1305 >= 0 ;+-1 x4230 +1 x1316 >= 0 ;+-1 x4230 -1 x1306 >= -1 ;++1 x4230 -1 x1316 +1 x1306 >= 0 ;+-1 x4231 +1 x1317 >= 0 ;++1 x4231 -1 x1317 >= 0 ;+-1 x4232 +1 x1318 >= 0 ;++1 x4232 -1 x1318 >= 0 ;+-1 x4233 +1 x1319 >= 0 ;++1 x4233 -1 x1319 >= 0 ;+-1 x4234 +1 x1320 >= 0 ;++1 x4234 -1 x1320 >= 0 ;+-1 x4235 +1 x1321 >= 0 ;++1 x4235 -1 x1321 >= 0 ;+-1 x4236 +1 x1322 >= 0 ;++1 x4236 -1 x1322 >= 0 ;+-1 x4237 +1 x1323 >= 0 ;++1 x4237 -1 x1323 >= 0 ;+-1 x4238 +1 x1324 >= 0 ;++1 x4238 -1 x1324 >= 0 ;+-1 x4239 +1 x1325 >= 0 ;++1 x4239 -1 x1325 >= 0 ;+-1 x4240 +1 x1326 >= 0 ;+-1 x4240 -1 x1317 >= -1 ;++1 x4240 -1 x1326 +1 x1317 >= 0 ;+-1 x4241 +1 x1327 >= 0 ;+-1 x4241 -1 x1318 >= -1 ;++1 x4241 -1 x1327 +1 x1318 >= 0 ;+-1 x4242 +1 x1328 >= 0 ;+-1 x4242 -1 x1319 >= -1 ;++1 x4242 -1 x1328 +1 x1319 >= 0 ;+-1 x4243 +1 x1329 >= 0 ;+-1 x4243 -1 x1320 >= -1 ;++1 x4243 -1 x1329 +1 x1320 >= 0 ;+-1 x4244 +1 x1330 >= 0 ;+-1 x4244 -1 x1321 >= -1 ;++1 x4244 -1 x1330 +1 x1321 >= 0 ;+-1 x4245 +1 x1331 >= 0 ;+-1 x4245 -1 x1322 >= -1 ;++1 x4245 -1 x1331 +1 x1322 >= 0 ;+-1 x4246 +1 x1332 >= 0 ;+-1 x4246 -1 x1323 >= -1 ;++1 x4246 -1 x1332 +1 x1323 >= 0 ;+-1 x4247 +1 x1333 >= 0 ;+-1 x4247 -1 x1324 >= -1 ;++1 x4247 -1 x1333 +1 x1324 >= 0 ;+-1 x4248 +1 x1334 >= 0 ;+-1 x4248 -1 x1325 >= -1 ;++1 x4248 -1 x1334 +1 x1325 >= 0 ;+-1 x4249 +1 x1335 >= 0 ;+-1 x4249 -1 x1326 >= -1 ;++1 x4249 -1 x1335 +1 x1326 >= 0 ;+-1 x4250 +1 x1336 >= 0 ;+-1 x4250 -1 x1327 >= -1 ;++1 x4250 -1 x1336 +1 x1327 >= 0 ;+-1 x4251 +1 x1337 >= 0 ;+-1 x4251 -1 x1328 >= -1 ;++1 x4251 -1 x1337 +1 x1328 >= 0 ;+-1 x4252 +1 x1338 >= 0 ;+-1 x4252 -1 x1329 >= -1 ;++1 x4252 -1 x1338 +1 x1329 >= 0 ;+-1 x4253 +1 x1339 >= 0 ;+-1 x4253 -1 x1330 >= -1 ;++1 x4253 -1 x1339 +1 x1330 >= 0 ;+-1 x4254 +1 x1340 >= 0 ;+-1 x4254 -1 x1331 >= -1 ;++1 x4254 -1 x1340 +1 x1331 >= 0 ;+-1 x4255 +1 x1341 >= 0 ;+-1 x4255 -1 x1332 >= -1 ;++1 x4255 -1 x1341 +1 x1332 >= 0 ;+-1 x4256 +1 x1342 >= 0 ;+-1 x4256 -1 x1333 >= -1 ;++1 x4256 -1 x1342 +1 x1333 >= 0 ;+-1 x4257 +1 x1343 >= 0 ;+-1 x4257 -1 x1334 >= -1 ;++1 x4257 -1 x1343 +1 x1334 >= 0 ;+-1 x4258 +1 x1344 >= 0 ;+-1 x4258 -1 x1335 >= -1 ;++1 x4258 -1 x1344 +1 x1335 >= 0 ;+-1 x4259 +1 x1345 >= 0 ;+-1 x4259 -1 x1336 >= -1 ;++1 x4259 -1 x1345 +1 x1336 >= 0 ;+-1 x4260 +1 x1346 >= 0 ;+-1 x4260 -1 x1337 >= -1 ;++1 x4260 -1 x1346 +1 x1337 >= 0 ;+-1 x4261 +1 x1347 >= 0 ;+-1 x4261 -1 x1338 >= -1 ;++1 x4261 -1 x1347 +1 x1338 >= 0 ;+-1 x4262 +1 x1348 >= 0 ;+-1 x4262 -1 x1339 >= -1 ;++1 x4262 -1 x1348 +1 x1339 >= 0 ;+-1 x4263 +1 x1349 >= 0 ;+-1 x4263 -1 x1340 >= -1 ;++1 x4263 -1 x1349 +1 x1340 >= 0 ;+-1 x4264 +1 x1350 >= 0 ;+-1 x4264 -1 x1341 >= -1 ;++1 x4264 -1 x1350 +1 x1341 >= 0 ;+-1 x4265 +1 x1351 >= 0 ;+-1 x4265 -1 x1342 >= -1 ;++1 x4265 -1 x1351 +1 x1342 >= 0 ;+-1 x4266 +1 x1352 >= 0 ;+-1 x4266 -1 x1343 >= -1 ;++1 x4266 -1 x1352 +1 x1343 >= 0 ;+-1 x4267 +1 x1353 >= 0 ;+-1 x4267 -1 x1344 >= -1 ;++1 x4267 -1 x1353 +1 x1344 >= 0 ;+-1 x4268 +1 x1354 >= 0 ;+-1 x4268 -1 x1345 >= -1 ;++1 x4268 -1 x1354 +1 x1345 >= 0 ;+-1 x4269 +1 x1355 >= 0 ;+-1 x4269 -1 x1346 >= -1 ;++1 x4269 -1 x1355 +1 x1346 >= 0 ;+-1 x4270 +1 x1356 >= 0 ;+-1 x4270 -1 x1347 >= -1 ;++1 x4270 -1 x1356 +1 x1347 >= 0 ;+-1 x4271 +1 x1357 >= 0 ;+-1 x4271 -1 x1348 >= -1 ;++1 x4271 -1 x1357 +1 x1348 >= 0 ;+-1 x4272 +1 x1358 >= 0 ;+-1 x4272 -1 x1349 >= -1 ;++1 x4272 -1 x1358 +1 x1349 >= 0 ;+-1 x4273 +1 x1359 >= 0 ;+-1 x4273 -1 x1350 >= -1 ;++1 x4273 -1 x1359 +1 x1350 >= 0 ;+-1 x4274 +1 x1360 >= 0 ;+-1 x4274 -1 x1351 >= -1 ;++1 x4274 -1 x1360 +1 x1351 >= 0 ;+-1 x4275 +1 x1361 >= 0 ;+-1 x4275 -1 x1352 >= -1 ;++1 x4275 -1 x1361 +1 x1352 >= 0 ;+-1 x4276 +1 x1362 >= 0 ;+-1 x4276 -1 x1353 >= -1 ;++1 x4276 -1 x1362 +1 x1353 >= 0 ;+-1 x4277 +1 x1363 >= 0 ;+-1 x4277 -1 x1354 >= -1 ;++1 x4277 -1 x1363 +1 x1354 >= 0 ;+-1 x4278 +1 x1364 >= 0 ;+-1 x4278 -1 x1355 >= -1 ;++1 x4278 -1 x1364 +1 x1355 >= 0 ;+-1 x4279 +1 x1365 >= 0 ;+-1 x4279 -1 x1356 >= -1 ;++1 x4279 -1 x1365 +1 x1356 >= 0 ;+-1 x4280 +1 x1366 >= 0 ;+-1 x4280 -1 x1357 >= -1 ;++1 x4280 -1 x1366 +1 x1357 >= 0 ;+-1 x4281 +1 x1367 >= 0 ;+-1 x4281 -1 x1358 >= -1 ;++1 x4281 -1 x1367 +1 x1358 >= 0 ;+-1 x4282 +1 x1368 >= 0 ;+-1 x4282 -1 x1359 >= -1 ;++1 x4282 -1 x1368 +1 x1359 >= 0 ;+-1 x4283 +1 x1369 >= 0 ;+-1 x4283 -1 x1360 >= -1 ;++1 x4283 -1 x1369 +1 x1360 >= 0 ;+-1 x4284 +1 x1370 >= 0 ;+-1 x4284 -1 x1361 >= -1 ;++1 x4284 -1 x1370 +1 x1361 >= 0 ;+-1 x4285 +1 x1371 >= 0 ;+-1 x4285 -1 x1362 >= -1 ;++1 x4285 -1 x1371 +1 x1362 >= 0 ;+-1 x4286 +1 x1372 >= 0 ;+-1 x4286 -1 x1363 >= -1 ;++1 x4286 -1 x1372 +1 x1363 >= 0 ;+-1 x4287 +1 x1373 >= 0 ;+-1 x4287 -1 x1364 >= -1 ;++1 x4287 -1 x1373 +1 x1364 >= 0 ;+-1 x4288 +1 x1374 >= 0 ;+-1 x4288 -1 x1365 >= -1 ;++1 x4288 -1 x1374 +1 x1365 >= 0 ;+-1 x4289 +1 x1375 >= 0 ;+-1 x4289 -1 x1366 >= -1 ;++1 x4289 -1 x1375 +1 x1366 >= 0 ;+-1 x4290 +1 x1376 >= 0 ;+-1 x4290 -1 x1367 >= -1 ;++1 x4290 -1 x1376 +1 x1367 >= 0 ;+-1 x4291 +1 x1377 >= 0 ;+-1 x4291 -1 x1368 >= -1 ;++1 x4291 -1 x1377 +1 x1368 >= 0 ;+-1 x4292 +1 x1378 >= 0 ;+-1 x4292 -1 x1369 >= -1 ;++1 x4292 -1 x1378 +1 x1369 >= 0 ;+-1 x4293 +1 x1379 >= 0 ;+-1 x4293 -1 x1370 >= -1 ;++1 x4293 -1 x1379 +1 x1370 >= 0 ;+-1 x4294 +1 x1380 >= 0 ;+-1 x4294 -1 x1371 >= -1 ;++1 x4294 -1 x1380 +1 x1371 >= 0 ;+-1 x4295 +1 x1381 >= 0 ;+-1 x4295 -1 x1372 >= -1 ;++1 x4295 -1 x1381 +1 x1372 >= 0 ;+-1 x4296 +1 x1382 >= 0 ;+-1 x4296 -1 x1373 >= -1 ;++1 x4296 -1 x1382 +1 x1373 >= 0 ;+-1 x4297 +1 x1383 >= 0 ;+-1 x4297 -1 x1374 >= -1 ;++1 x4297 -1 x1383 +1 x1374 >= 0 ;+-1 x4298 +1 x1384 >= 0 ;+-1 x4298 -1 x1375 >= -1 ;++1 x4298 -1 x1384 +1 x1375 >= 0 ;+-1 x4299 +1 x1385 >= 0 ;+-1 x4299 -1 x1376 >= -1 ;++1 x4299 -1 x1385 +1 x1376 >= 0 ;+-1 x4300 +1 x1386 >= 0 ;+-1 x4300 -1 x1377 >= -1 ;++1 x4300 -1 x1386 +1 x1377 >= 0 ;+-1 x4301 +1 x1387 >= 0 ;+-1 x4301 -1 x1378 >= -1 ;++1 x4301 -1 x1387 +1 x1378 >= 0 ;+-1 x4302 +1 x1388 >= 0 ;+-1 x4302 -1 x1379 >= -1 ;++1 x4302 -1 x1388 +1 x1379 >= 0 ;+-1 x4303 +1 x1389 >= 0 ;+-1 x4303 -1 x1380 >= -1 ;++1 x4303 -1 x1389 +1 x1380 >= 0 ;+-1 x4304 +1 x1390 >= 0 ;+-1 x4304 -1 x1381 >= -1 ;++1 x4304 -1 x1390 +1 x1381 >= 0 ;+-1 x4305 +1 x1391 >= 0 ;+-1 x4305 -1 x1382 >= -1 ;++1 x4305 -1 x1391 +1 x1382 >= 0 ;+-1 x4306 +1 x1392 >= 0 ;+-1 x4306 -1 x1383 >= -1 ;++1 x4306 -1 x1392 +1 x1383 >= 0 ;+-1 x4307 +1 x1393 >= 0 ;+-1 x4307 -1 x1384 >= -1 ;++1 x4307 -1 x1393 +1 x1384 >= 0 ;+-1 x4308 +1 x1394 >= 0 ;+-1 x4308 -1 x1385 >= -1 ;++1 x4308 -1 x1394 +1 x1385 >= 0 ;+-1 x4309 +1 x1395 >= 0 ;+-1 x4309 -1 x1386 >= -1 ;++1 x4309 -1 x1395 +1 x1386 >= 0 ;+-1 x4310 +1 x1396 >= 0 ;+-1 x4310 -1 x1387 >= -1 ;++1 x4310 -1 x1396 +1 x1387 >= 0 ;+-1 x4311 +1 x1397 >= 0 ;+-1 x4311 -1 x1388 >= -1 ;++1 x4311 -1 x1397 +1 x1388 >= 0 ;+-1 x4312 +1 x1398 >= 0 ;+-1 x4312 -1 x1389 >= -1 ;++1 x4312 -1 x1398 +1 x1389 >= 0 ;+-1 x4313 +1 x1399 >= 0 ;+-1 x4313 -1 x1390 >= -1 ;++1 x4313 -1 x1399 +1 x1390 >= 0 ;+-1 x4314 +1 x1400 >= 0 ;+-1 x4314 -1 x1391 >= -1 ;++1 x4314 -1 x1400 +1 x1391 >= 0 ;+-1 x4315 +1 x1401 >= 0 ;+-1 x4315 -1 x1392 >= -1 ;++1 x4315 -1 x1401 +1 x1392 >= 0 ;+-1 x4316 +1 x1402 >= 0 ;+-1 x4316 -1 x1393 >= -1 ;++1 x4316 -1 x1402 +1 x1393 >= 0 ;+-1 x4317 +1 x1403 >= 0 ;+-1 x4317 -1 x1394 >= -1 ;++1 x4317 -1 x1403 +1 x1394 >= 0 ;+-1 x4318 +1 x1404 >= 0 ;+-1 x4318 -1 x1395 >= -1 ;++1 x4318 -1 x1404 +1 x1395 >= 0 ;+-1 x4319 +1 x1405 >= 0 ;+-1 x4319 -1 x1396 >= -1 ;++1 x4319 -1 x1405 +1 x1396 >= 0 ;+-1 x4320 +1 x1406 >= 0 ;+-1 x4320 -1 x1397 >= -1 ;++1 x4320 -1 x1406 +1 x1397 >= 0 ;+-1 x4321 +1 x1407 >= 0 ;+-1 x4321 -1 x1398 >= -1 ;++1 x4321 -1 x1407 +1 x1398 >= 0 ;+-1 x4322 +1 x1408 >= 0 ;+-1 x4322 -1 x1399 >= -1 ;++1 x4322 -1 x1408 +1 x1399 >= 0 ;+-1 x4323 +1 x1409 >= 0 ;+-1 x4323 -1 x1400 >= -1 ;++1 x4323 -1 x1409 +1 x1400 >= 0 ;+-1 x4324 +1 x1410 >= 0 ;+-1 x4324 -1 x1401 >= -1 ;++1 x4324 -1 x1410 +1 x1401 >= 0 ;+-1 x4325 +1 x1411 >= 0 ;++1 x4325 -1 x1411 >= 0 ;+-1 x4326 +1 x1412 >= 0 ;++1 x4326 -1 x1412 >= 0 ;+-1 x4327 +1 x1413 >= 0 ;++1 x4327 -1 x1413 >= 0 ;+-1 x4328 +1 x1414 >= 0 ;++1 x4328 -1 x1414 >= 0 ;+-1 x4329 +1 x1415 >= 0 ;++1 x4329 -1 x1415 >= 0 ;+-1 x4330 +1 x1416 >= 0 ;++1 x4330 -1 x1416 >= 0 ;+-1 x4331 +1 x1417 >= 0 ;+-1 x4331 -1 x1411 >= -1 ;++1 x4331 -1 x1417 +1 x1411 >= 0 ;+-1 x4332 +1 x1418 >= 0 ;+-1 x4332 -1 x1412 >= -1 ;++1 x4332 -1 x1418 +1 x1412 >= 0 ;+-1 x4333 +1 x1419 >= 0 ;+-1 x4333 -1 x1413 >= -1 ;++1 x4333 -1 x1419 +1 x1413 >= 0 ;+-1 x4334 +1 x1420 >= 0 ;+-1 x4334 -1 x1414 >= -1 ;++1 x4334 -1 x1420 +1 x1414 >= 0 ;+-1 x4335 +1 x1421 >= 0 ;+-1 x4335 -1 x1415 >= -1 ;++1 x4335 -1 x1421 +1 x1415 >= 0 ;+-1 x4336 +1 x1422 >= 0 ;+-1 x4336 -1 x1416 >= -1 ;++1 x4336 -1 x1422 +1 x1416 >= 0 ;+-1 x4337 +1 x1423 >= 0 ;+-1 x4337 -1 x1417 >= -1 ;++1 x4337 -1 x1423 +1 x1417 >= 0 ;+-1 x4338 +1 x1424 >= 0 ;+-1 x4338 -1 x1418 >= -1 ;++1 x4338 -1 x1424 +1 x1418 >= 0 ;+-1 x4339 +1 x1425 >= 0 ;+-1 x4339 -1 x1419 >= -1 ;++1 x4339 -1 x1425 +1 x1419 >= 0 ;+-1 x4340 +1 x1426 >= 0 ;+-1 x4340 -1 x1420 >= -1 ;++1 x4340 -1 x1426 +1 x1420 >= 0 ;+-1 x4341 +1 x1427 >= 0 ;+-1 x4341 -1 x1421 >= -1 ;++1 x4341 -1 x1427 +1 x1421 >= 0 ;+-1 x4342 +1 x1428 >= 0 ;+-1 x4342 -1 x1422 >= -1 ;++1 x4342 -1 x1428 +1 x1422 >= 0 ;+-1 x4343 +1 x1429 >= 0 ;+-1 x4343 -1 x1423 >= -1 ;++1 x4343 -1 x1429 +1 x1423 >= 0 ;+-1 x4344 +1 x1430 >= 0 ;+-1 x4344 -1 x1424 >= -1 ;++1 x4344 -1 x1430 +1 x1424 >= 0 ;+-1 x4345 +1 x1431 >= 0 ;+-1 x4345 -1 x1425 >= -1 ;++1 x4345 -1 x1431 +1 x1425 >= 0 ;+-1 x4346 +1 x1432 >= 0 ;+-1 x4346 -1 x1426 >= -1 ;++1 x4346 -1 x1432 +1 x1426 >= 0 ;+-1 x4347 +1 x1433 >= 0 ;+-1 x4347 -1 x1427 >= -1 ;++1 x4347 -1 x1433 +1 x1427 >= 0 ;+-1 x4348 +1 x1434 >= 0 ;+-1 x4348 -1 x1428 >= -1 ;++1 x4348 -1 x1434 +1 x1428 >= 0 ;+-1 x4349 +1 x1435 >= 0 ;+-1 x4349 -1 x1429 >= -1 ;++1 x4349 -1 x1435 +1 x1429 >= 0 ;+-1 x4350 +1 x1436 >= 0 ;+-1 x4350 -1 x1430 >= -1 ;++1 x4350 -1 x1436 +1 x1430 >= 0 ;+-1 x4351 +1 x1437 >= 0 ;+-1 x4351 -1 x1431 >= -1 ;++1 x4351 -1 x1437 +1 x1431 >= 0 ;+-1 x4352 +1 x1438 >= 0 ;+-1 x4352 -1 x1432 >= -1 ;++1 x4352 -1 x1438 +1 x1432 >= 0 ;+-1 x4353 +1 x1439 >= 0 ;+-1 x4353 -1 x1433 >= -1 ;++1 x4353 -1 x1439 +1 x1433 >= 0 ;+-1 x4354 +1 x1440 >= 0 ;+-1 x4354 -1 x1434 >= -1 ;++1 x4354 -1 x1440 +1 x1434 >= 0 ;+-1 x4355 +1 x1441 >= 0 ;+-1 x4355 -1 x1435 >= -1 ;++1 x4355 -1 x1441 +1 x1435 >= 0 ;+-1 x4356 +1 x1442 >= 0 ;+-1 x4356 -1 x1436 >= -1 ;++1 x4356 -1 x1442 +1 x1436 >= 0 ;+-1 x4357 +1 x1443 >= 0 ;+-1 x4357 -1 x1437 >= -1 ;++1 x4357 -1 x1443 +1 x1437 >= 0 ;+-1 x4358 +1 x1444 >= 0 ;+-1 x4358 -1 x1438 >= -1 ;++1 x4358 -1 x1444 +1 x1438 >= 0 ;+-1 x4359 +1 x1445 >= 0 ;+-1 x4359 -1 x1439 >= -1 ;++1 x4359 -1 x1445 +1 x1439 >= 0 ;+-1 x4360 +1 x1446 >= 0 ;+-1 x4360 -1 x1440 >= -1 ;++1 x4360 -1 x1446 +1 x1440 >= 0 ;+-1 x4361 +1 x1447 >= 0 ;+-1 x4361 -1 x1441 >= -1 ;++1 x4361 -1 x1447 +1 x1441 >= 0 ;+-1 x4362 +1 x1448 >= 0 ;+-1 x4362 -1 x1442 >= -1 ;++1 x4362 -1 x1448 +1 x1442 >= 0 ;+-1 x4363 +1 x1449 >= 0 ;+-1 x4363 -1 x1443 >= -1 ;++1 x4363 -1 x1449 +1 x1443 >= 0 ;+-1 x4364 +1 x1450 >= 0 ;+-1 x4364 -1 x1444 >= -1 ;++1 x4364 -1 x1450 +1 x1444 >= 0 ;+-1 x4365 +1 x1451 >= 0 ;+-1 x4365 -1 x1445 >= -1 ;++1 x4365 -1 x1451 +1 x1445 >= 0 ;+-1 x4366 +1 x1452 >= 0 ;+-1 x4366 -1 x1446 >= -1 ;++1 x4366 -1 x1452 +1 x1446 >= 0 ;+-1 x4367 +1 x1453 >= 0 ;+-1 x4367 -1 x1447 >= -1 ;++1 x4367 -1 x1453 +1 x1447 >= 0 ;+-1 x4368 +1 x1454 >= 0 ;+-1 x4368 -1 x1448 >= -1 ;++1 x4368 -1 x1454 +1 x1448 >= 0 ;+-1 x4369 +1 x1455 >= 0 ;+-1 x4369 -1 x1449 >= -1 ;++1 x4369 -1 x1455 +1 x1449 >= 0 ;+-1 x4370 +1 x1456 >= 0 ;+-1 x4370 -1 x1450 >= -1 ;++1 x4370 -1 x1456 +1 x1450 >= 0 ;+-1 x4371 +1 x1457 >= 0 ;+-1 x4371 -1 x1451 >= -1 ;++1 x4371 -1 x1457 +1 x1451 >= 0 ;+-1 x4372 +1 x1458 >= 0 ;+-1 x4372 -1 x1452 >= -1 ;++1 x4372 -1 x1458 +1 x1452 >= 0 ;+-1 x4373 +1 x1459 >= 0 ;+-1 x4373 -1 x1453 >= -1 ;++1 x4373 -1 x1459 +1 x1453 >= 0 ;+-1 x4374 +1 x1460 >= 0 ;+-1 x4374 -1 x1454 >= -1 ;++1 x4374 -1 x1460 +1 x1454 >= 0 ;+-1 x4375 +1 x1461 >= 0 ;+-1 x4375 -1 x1455 >= -1 ;++1 x4375 -1 x1461 +1 x1455 >= 0 ;+-1 x4376 +1 x1462 >= 0 ;+-1 x4376 -1 x1456 >= -1 ;++1 x4376 -1 x1462 +1 x1456 >= 0 ;+-1 x4377 +1 x1463 >= 0 ;+-1 x4377 -1 x1457 >= -1 ;++1 x4377 -1 x1463 +1 x1457 >= 0 ;+-1 x4378 +1 x1464 >= 0 ;+-1 x4378 -1 x1458 >= -1 ;++1 x4378 -1 x1464 +1 x1458 >= 0 ;+-1 x4379 +1 x1465 >= 0 ;+-1 x4379 -1 x1459 >= -1 ;++1 x4379 -1 x1465 +1 x1459 >= 0 ;+-1 x4380 +1 x1466 >= 0 ;+-1 x4380 -1 x1460 >= -1 ;++1 x4380 -1 x1466 +1 x1460 >= 0 ;+-1 x4381 +1 x1467 >= 0 ;+-1 x4381 -1 x1461 >= -1 ;++1 x4381 -1 x1467 +1 x1461 >= 0 ;+-1 x4382 +1 x1468 >= 0 ;+-1 x4382 -1 x1462 >= -1 ;++1 x4382 -1 x1468 +1 x1462 >= 0 ;+-1 x4383 +1 x1469 >= 0 ;+-1 x4383 -1 x1463 >= -1 ;++1 x4383 -1 x1469 +1 x1463 >= 0 ;+-1 x4384 +1 x1470 >= 0 ;+-1 x4384 -1 x1464 >= -1 ;++1 x4384 -1 x1470 +1 x1464 >= 0 ;+-1 x4385 +1 x1471 >= 0 ;+-1 x4385 -1 x1465 >= -1 ;++1 x4385 -1 x1471 +1 x1465 >= 0 ;+-1 x4386 +1 x1472 >= 0 ;+-1 x4386 -1 x1466 >= -1 ;++1 x4386 -1 x1472 +1 x1466 >= 0 ;+-1 x4387 +1 x1473 >= 0 ;+-1 x4387 -1 x1467 >= -1 ;++1 x4387 -1 x1473 +1 x1467 >= 0 ;+-1 x4388 +1 x1474 >= 0 ;+-1 x4388 -1 x1468 >= -1 ;++1 x4388 -1 x1474 +1 x1468 >= 0 ;+-1 x4389 +1 x1475 >= 0 ;+-1 x4389 -1 x1469 >= -1 ;++1 x4389 -1 x1475 +1 x1469 >= 0 ;+-1 x4390 +1 x1476 >= 0 ;+-1 x4390 -1 x1470 >= -1 ;++1 x4390 -1 x1476 +1 x1470 >= 0 ;+-1 x4391 +1 x1477 >= 0 ;+-1 x4391 -1 x1471 >= -1 ;++1 x4391 -1 x1477 +1 x1471 >= 0 ;+-1 x4392 +1 x1478 >= 0 ;+-1 x4392 -1 x1472 >= -1 ;++1 x4392 -1 x1478 +1 x1472 >= 0 ;+-1 x4393 +1 x1479 >= 0 ;+-1 x4393 -1 x1473 >= -1 ;++1 x4393 -1 x1479 +1 x1473 >= 0 ;+-1 x4394 +1 x1480 >= 0 ;+-1 x4394 -1 x1474 >= -1 ;++1 x4394 -1 x1480 +1 x1474 >= 0 ;+-1 x4395 +1 x1481 >= 0 ;+-1 x4395 -1 x1475 >= -1 ;++1 x4395 -1 x1481 +1 x1475 >= 0 ;+-1 x4396 +1 x1482 >= 0 ;+-1 x4396 -1 x1476 >= -1 ;++1 x4396 -1 x1482 +1 x1476 >= 0 ;+-1 x4397 +1 x1483 >= 0 ;+-1 x4397 -1 x1477 >= -1 ;++1 x4397 -1 x1483 +1 x1477 >= 0 ;+-1 x4398 +1 x1484 >= 0 ;+-1 x4398 -1 x1478 >= -1 ;++1 x4398 -1 x1484 +1 x1478 >= 0 ;+-1 x4399 +1 x1485 >= 0 ;+-1 x4399 -1 x1479 >= -1 ;++1 x4399 -1 x1485 +1 x1479 >= 0 ;+-1 x4400 +1 x1486 >= 0 ;+-1 x4400 -1 x1480 >= -1 ;++1 x4400 -1 x1486 +1 x1480 >= 0 ;+-1 x4401 +1 x1487 >= 0 ;+-1 x4401 -1 x1481 >= -1 ;++1 x4401 -1 x1487 +1 x1481 >= 0 ;+-1 x4402 +1 x1488 >= 0 ;+-1 x4402 -1 x1482 >= -1 ;++1 x4402 -1 x1488 +1 x1482 >= 0 ;+-1 x4403 +1 x1489 >= 0 ;+-1 x4403 -1 x1483 >= -1 ;++1 x4403 -1 x1489 +1 x1483 >= 0 ;+-1 x4404 +1 x1490 >= 0 ;+-1 x4404 -1 x1484 >= -1 ;++1 x4404 -1 x1490 +1 x1484 >= 0 ;+-1 x4405 +1 x1491 >= 0 ;+-1 x4405 -1 x1485 >= -1 ;++1 x4405 -1 x1491 +1 x1485 >= 0 ;+-1 x4406 +1 x1492 >= 0 ;+-1 x4406 -1 x1486 >= -1 ;++1 x4406 -1 x1492 +1 x1486 >= 0 ;+-1 x4407 +1 x1493 >= 0 ;+-1 x4407 -1 x1487 >= -1 ;++1 x4407 -1 x1493 +1 x1487 >= 0 ;+-1 x4408 +1 x1494 >= 0 ;+-1 x4408 -1 x1488 >= -1 ;++1 x4408 -1 x1494 +1 x1488 >= 0 ;+-1 x4409 +1 x1495 >= 0 ;+-1 x4409 -1 x1489 >= -1 ;++1 x4409 -1 x1495 +1 x1489 >= 0 ;+-1 x4410 +1 x1496 >= 0 ;+-1 x4410 -1 x1490 >= -1 ;++1 x4410 -1 x1496 +1 x1490 >= 0 ;+-1 x4411 +1 x1497 >= 0 ;+-1 x4411 -1 x1491 >= -1 ;++1 x4411 -1 x1497 +1 x1491 >= 0 ;+-1 x4412 +1 x1498 >= 0 ;+-1 x4412 -1 x1492 >= -1 ;++1 x4412 -1 x1498 +1 x1492 >= 0 ;+-1 x4413 +1 x1499 >= 0 ;+-1 x4413 -1 x1493 >= -1 ;++1 x4413 -1 x1499 +1 x1493 >= 0 ;+-1 x4414 +1 x1500 >= 0 ;+-1 x4414 -1 x1494 >= -1 ;++1 x4414 -1 x1500 +1 x1494 >= 0 ;+-1 x4415 +1 x1501 >= 0 ;+-1 x4415 -1 x1495 >= -1 ;++1 x4415 -1 x1501 +1 x1495 >= 0 ;+-1 x4416 +1 x1502 >= 0 ;+-1 x4416 -1 x1496 >= -1 ;++1 x4416 -1 x1502 +1 x1496 >= 0 ;+-1 x4417 +1 x1503 >= 0 ;+-1 x4417 -1 x1497 >= -1 ;++1 x4417 -1 x1503 +1 x1497 >= 0 ;+-1 x4418 +1 x1504 >= 0 ;+-1 x4418 -1 x1498 >= -1 ;++1 x4418 -1 x1504 +1 x1498 >= 0 ;+-1 x4419 +1 x1505 >= 0 ;++1 x4419 -1 x1505 >= 0 ;+-1 x4420 +1 x1506 >= 0 ;++1 x4420 -1 x1506 >= 0 ;+-1 x4421 +1 x1507 >= 0 ;++1 x4421 -1 x1507 >= 0 ;+-1 x4422 +1 x1508 >= 0 ;++1 x4422 -1 x1508 >= 0 ;+-1 x4423 +1 x1509 >= 0 ;++1 x4423 -1 x1509 >= 0 ;+-1 x4424 +1 x1510 >= 0 ;++1 x4424 -1 x1510 >= 0 ;+-1 x4425 +1 x1511 >= 0 ;++1 x4425 -1 x1511 >= 0 ;+-1 x4426 +1 x1512 >= 0 ;+-1 x4426 -1 x1505 >= -1 ;++1 x4426 -1 x1512 +1 x1505 >= 0 ;+-1 x4427 +1 x1513 >= 0 ;+-1 x4427 -1 x1506 >= -1 ;++1 x4427 -1 x1513 +1 x1506 >= 0 ;+-1 x4428 +1 x1514 >= 0 ;+-1 x4428 -1 x1507 >= -1 ;++1 x4428 -1 x1514 +1 x1507 >= 0 ;+-1 x4429 +1 x1515 >= 0 ;+-1 x4429 -1 x1508 >= -1 ;++1 x4429 -1 x1515 +1 x1508 >= 0 ;+-1 x4430 +1 x1516 >= 0 ;+-1 x4430 -1 x1509 >= -1 ;++1 x4430 -1 x1516 +1 x1509 >= 0 ;+-1 x4431 +1 x1517 >= 0 ;+-1 x4431 -1 x1510 >= -1 ;++1 x4431 -1 x1517 +1 x1510 >= 0 ;+-1 x4432 +1 x1518 >= 0 ;+-1 x4432 -1 x1511 >= -1 ;++1 x4432 -1 x1518 +1 x1511 >= 0 ;+-1 x4433 +1 x1519 >= 0 ;+-1 x4433 -1 x1512 >= -1 ;++1 x4433 -1 x1519 +1 x1512 >= 0 ;+-1 x4434 +1 x1520 >= 0 ;+-1 x4434 -1 x1513 >= -1 ;++1 x4434 -1 x1520 +1 x1513 >= 0 ;+-1 x4435 +1 x1521 >= 0 ;+-1 x4435 -1 x1514 >= -1 ;++1 x4435 -1 x1521 +1 x1514 >= 0 ;+-1 x4436 +1 x1522 >= 0 ;+-1 x4436 -1 x1515 >= -1 ;++1 x4436 -1 x1522 +1 x1515 >= 0 ;+-1 x4437 +1 x1523 >= 0 ;+-1 x4437 -1 x1516 >= -1 ;++1 x4437 -1 x1523 +1 x1516 >= 0 ;+-1 x4438 +1 x1524 >= 0 ;+-1 x4438 -1 x1517 >= -1 ;++1 x4438 -1 x1524 +1 x1517 >= 0 ;+-1 x4439 +1 x1525 >= 0 ;+-1 x4439 -1 x1518 >= -1 ;++1 x4439 -1 x1525 +1 x1518 >= 0 ;+-1 x4440 +1 x1526 >= 0 ;+-1 x4440 -1 x1519 >= -1 ;++1 x4440 -1 x1526 +1 x1519 >= 0 ;+-1 x4441 +1 x1527 >= 0 ;+-1 x4441 -1 x1520 >= -1 ;++1 x4441 -1 x1527 +1 x1520 >= 0 ;+-1 x4442 +1 x1528 >= 0 ;+-1 x4442 -1 x1521 >= -1 ;++1 x4442 -1 x1528 +1 x1521 >= 0 ;+-1 x4443 +1 x1529 >= 0 ;+-1 x4443 -1 x1522 >= -1 ;++1 x4443 -1 x1529 +1 x1522 >= 0 ;+-1 x4444 +1 x1530 >= 0 ;+-1 x4444 -1 x1523 >= -1 ;++1 x4444 -1 x1530 +1 x1523 >= 0 ;+-1 x4445 +1 x1531 >= 0 ;+-1 x4445 -1 x1524 >= -1 ;++1 x4445 -1 x1531 +1 x1524 >= 0 ;+-1 x4446 +1 x1532 >= 0 ;+-1 x4446 -1 x1525 >= -1 ;++1 x4446 -1 x1532 +1 x1525 >= 0 ;+-1 x4447 +1 x1533 >= 0 ;+-1 x4447 -1 x1526 >= -1 ;++1 x4447 -1 x1533 +1 x1526 >= 0 ;+-1 x4448 +1 x1534 >= 0 ;+-1 x4448 -1 x1527 >= -1 ;++1 x4448 -1 x1534 +1 x1527 >= 0 ;+-1 x4449 +1 x1535 >= 0 ;+-1 x4449 -1 x1528 >= -1 ;++1 x4449 -1 x1535 +1 x1528 >= 0 ;+-1 x4450 +1 x1536 >= 0 ;+-1 x4450 -1 x1529 >= -1 ;++1 x4450 -1 x1536 +1 x1529 >= 0 ;+-1 x4451 +1 x1537 >= 0 ;+-1 x4451 -1 x1530 >= -1 ;++1 x4451 -1 x1537 +1 x1530 >= 0 ;+-1 x4452 +1 x1538 >= 0 ;+-1 x4452 -1 x1531 >= -1 ;++1 x4452 -1 x1538 +1 x1531 >= 0 ;+-1 x4453 +1 x1539 >= 0 ;+-1 x4453 -1 x1532 >= -1 ;++1 x4453 -1 x1539 +1 x1532 >= 0 ;+-1 x4454 +1 x1540 >= 0 ;+-1 x4454 -1 x1533 >= -1 ;++1 x4454 -1 x1540 +1 x1533 >= 0 ;+-1 x4455 +1 x1541 >= 0 ;+-1 x4455 -1 x1534 >= -1 ;++1 x4455 -1 x1541 +1 x1534 >= 0 ;+-1 x4456 +1 x1542 >= 0 ;+-1 x4456 -1 x1535 >= -1 ;++1 x4456 -1 x1542 +1 x1535 >= 0 ;+-1 x4457 +1 x1543 >= 0 ;+-1 x4457 -1 x1536 >= -1 ;++1 x4457 -1 x1543 +1 x1536 >= 0 ;+-1 x4458 +1 x1544 >= 0 ;+-1 x4458 -1 x1537 >= -1 ;++1 x4458 -1 x1544 +1 x1537 >= 0 ;+-1 x4459 +1 x1545 >= 0 ;+-1 x4459 -1 x1538 >= -1 ;++1 x4459 -1 x1545 +1 x1538 >= 0 ;+-1 x4460 +1 x1546 >= 0 ;+-1 x4460 -1 x1539 >= -1 ;++1 x4460 -1 x1546 +1 x1539 >= 0 ;+-1 x4461 +1 x1547 >= 0 ;+-1 x4461 -1 x1540 >= -1 ;++1 x4461 -1 x1547 +1 x1540 >= 0 ;+-1 x4462 +1 x1548 >= 0 ;+-1 x4462 -1 x1541 >= -1 ;++1 x4462 -1 x1548 +1 x1541 >= 0 ;+-1 x4463 +1 x1549 >= 0 ;+-1 x4463 -1 x1542 >= -1 ;++1 x4463 -1 x1549 +1 x1542 >= 0 ;+-1 x4464 +1 x1550 >= 0 ;+-1 x4464 -1 x1543 >= -1 ;++1 x4464 -1 x1550 +1 x1543 >= 0 ;+-1 x4465 +1 x1551 >= 0 ;+-1 x4465 -1 x1544 >= -1 ;++1 x4465 -1 x1551 +1 x1544 >= 0 ;+-1 x4466 +1 x1552 >= 0 ;+-1 x4466 -1 x1545 >= -1 ;++1 x4466 -1 x1552 +1 x1545 >= 0 ;+-1 x4467 +1 x1553 >= 0 ;+-1 x4467 -1 x1546 >= -1 ;++1 x4467 -1 x1553 +1 x1546 >= 0 ;+-1 x4468 +1 x1554 >= 0 ;+-1 x4468 -1 x1547 >= -1 ;++1 x4468 -1 x1554 +1 x1547 >= 0 ;+-1 x4469 +1 x1555 >= 0 ;+-1 x4469 -1 x1548 >= -1 ;++1 x4469 -1 x1555 +1 x1548 >= 0 ;+-1 x4470 +1 x1556 >= 0 ;+-1 x4470 -1 x1549 >= -1 ;++1 x4470 -1 x1556 +1 x1549 >= 0 ;+-1 x4471 +1 x1557 >= 0 ;+-1 x4471 -1 x1550 >= -1 ;++1 x4471 -1 x1557 +1 x1550 >= 0 ;+-1 x4472 +1 x1558 >= 0 ;+-1 x4472 -1 x1551 >= -1 ;++1 x4472 -1 x1558 +1 x1551 >= 0 ;+-1 x4473 +1 x1559 >= 0 ;+-1 x4473 -1 x1552 >= -1 ;++1 x4473 -1 x1559 +1 x1552 >= 0 ;+-1 x4474 +1 x1560 >= 0 ;+-1 x4474 -1 x1553 >= -1 ;++1 x4474 -1 x1560 +1 x1553 >= 0 ;+-1 x4475 +1 x1561 >= 0 ;+-1 x4475 -1 x1554 >= -1 ;++1 x4475 -1 x1561 +1 x1554 >= 0 ;+-1 x4476 +1 x1562 >= 0 ;+-1 x4476 -1 x1555 >= -1 ;++1 x4476 -1 x1562 +1 x1555 >= 0 ;+-1 x4477 +1 x1563 >= 0 ;+-1 x4477 -1 x1556 >= -1 ;++1 x4477 -1 x1563 +1 x1556 >= 0 ;+-1 x4478 +1 x1564 >= 0 ;+-1 x4478 -1 x1557 >= -1 ;++1 x4478 -1 x1564 +1 x1557 >= 0 ;+-1 x4479 +1 x1565 >= 0 ;+-1 x4479 -1 x1558 >= -1 ;++1 x4479 -1 x1565 +1 x1558 >= 0 ;+-1 x4480 +1 x1566 >= 0 ;+-1 x4480 -1 x1559 >= -1 ;++1 x4480 -1 x1566 +1 x1559 >= 0 ;+-1 x4481 +1 x1567 >= 0 ;+-1 x4481 -1 x1560 >= -1 ;++1 x4481 -1 x1567 +1 x1560 >= 0 ;+-1 x4482 +1 x1568 >= 0 ;+-1 x4482 -1 x1561 >= -1 ;++1 x4482 -1 x1568 +1 x1561 >= 0 ;+-1 x4483 +1 x1569 >= 0 ;+-1 x4483 -1 x1562 >= -1 ;++1 x4483 -1 x1569 +1 x1562 >= 0 ;+-1 x4484 +1 x1570 >= 0 ;+-1 x4484 -1 x1563 >= -1 ;++1 x4484 -1 x1570 +1 x1563 >= 0 ;+-1 x4485 +1 x1571 >= 0 ;+-1 x4485 -1 x1564 >= -1 ;++1 x4485 -1 x1571 +1 x1564 >= 0 ;+-1 x4486 +1 x1572 >= 0 ;+-1 x4486 -1 x1565 >= -1 ;++1 x4486 -1 x1572 +1 x1565 >= 0 ;+-1 x4487 +1 x1573 >= 0 ;+-1 x4487 -1 x1566 >= -1 ;++1 x4487 -1 x1573 +1 x1566 >= 0 ;+-1 x4488 +1 x1574 >= 0 ;+-1 x4488 -1 x1567 >= -1 ;++1 x4488 -1 x1574 +1 x1567 >= 0 ;+-1 x4489 +1 x1575 >= 0 ;+-1 x4489 -1 x1568 >= -1 ;++1 x4489 -1 x1575 +1 x1568 >= 0 ;+-1 x4490 +1 x1576 >= 0 ;+-1 x4490 -1 x1569 >= -1 ;++1 x4490 -1 x1576 +1 x1569 >= 0 ;+-1 x4491 +1 x1577 >= 0 ;+-1 x4491 -1 x1570 >= -1 ;++1 x4491 -1 x1577 +1 x1570 >= 0 ;+-1 x4492 +1 x1578 >= 0 ;+-1 x4492 -1 x1571 >= -1 ;++1 x4492 -1 x1578 +1 x1571 >= 0 ;+-1 x4493 +1 x1579 >= 0 ;+-1 x4493 -1 x1572 >= -1 ;++1 x4493 -1 x1579 +1 x1572 >= 0 ;+-1 x4494 +1 x1580 >= 0 ;+-1 x4494 -1 x1573 >= -1 ;++1 x4494 -1 x1580 +1 x1573 >= 0 ;+-1 x4495 +1 x1581 >= 0 ;+-1 x4495 -1 x1574 >= -1 ;++1 x4495 -1 x1581 +1 x1574 >= 0 ;+-1 x4496 +1 x1582 >= 0 ;+-1 x4496 -1 x1575 >= -1 ;++1 x4496 -1 x1582 +1 x1575 >= 0 ;+-1 x4497 +1 x1583 >= 0 ;+-1 x4497 -1 x1576 >= -1 ;++1 x4497 -1 x1583 +1 x1576 >= 0 ;+-1 x4498 +1 x1584 >= 0 ;+-1 x4498 -1 x1577 >= -1 ;++1 x4498 -1 x1584 +1 x1577 >= 0 ;+-1 x4499 +1 x1585 >= 0 ;+-1 x4499 -1 x1578 >= -1 ;++1 x4499 -1 x1585 +1 x1578 >= 0 ;+-1 x4500 +1 x1586 >= 0 ;+-1 x4500 -1 x1579 >= -1 ;++1 x4500 -1 x1586 +1 x1579 >= 0 ;+-1 x4501 +1 x1587 >= 0 ;+-1 x4501 -1 x1580 >= -1 ;++1 x4501 -1 x1587 +1 x1580 >= 0 ;+-1 x4502 +1 x1588 >= 0 ;+-1 x4502 -1 x1581 >= -1 ;++1 x4502 -1 x1588 +1 x1581 >= 0 ;+-1 x4503 +1 x1589 >= 0 ;+-1 x4503 -1 x1582 >= -1 ;++1 x4503 -1 x1589 +1 x1582 >= 0 ;+-1 x4504 +1 x1590 >= 0 ;+-1 x4504 -1 x1583 >= -1 ;++1 x4504 -1 x1590 +1 x1583 >= 0 ;+-1 x4505 +1 x1591 >= 0 ;+-1 x4505 -1 x1584 >= -1 ;++1 x4505 -1 x1591 +1 x1584 >= 0 ;+-1 x4506 +1 x1592 >= 0 ;+-1 x4506 -1 x1585 >= -1 ;++1 x4506 -1 x1592 +1 x1585 >= 0 ;+-1 x4507 +1 x1593 >= 0 ;+-1 x4507 -1 x1586 >= -1 ;++1 x4507 -1 x1593 +1 x1586 >= 0 ;+-1 x4508 +1 x1594 >= 0 ;+-1 x4508 -1 x1587 >= -1 ;++1 x4508 -1 x1594 +1 x1587 >= 0 ;+-1 x4509 +1 x1595 >= 0 ;+-1 x4509 -1 x1588 >= -1 ;++1 x4509 -1 x1595 +1 x1588 >= 0 ;+-1 x4510 +1 x1596 >= 0 ;+-1 x4510 -1 x1589 >= -1 ;++1 x4510 -1 x1596 +1 x1589 >= 0 ;+-1 x4511 +1 x1597 >= 0 ;+-1 x4511 -1 x1590 >= -1 ;++1 x4511 -1 x1597 +1 x1590 >= 0 ;+-1 x4512 +1 x1598 >= 0 ;+-1 x4512 -1 x1591 >= -1 ;++1 x4512 -1 x1598 +1 x1591 >= 0 ;+-1 x4513 +1 x1599 >= 0 ;++1 x4513 -1 x1599 >= 0 ;+-1 x4514 +1 x1600 >= 0 ;++1 x4514 -1 x1600 >= 0 ;+-1 x4515 +1 x1601 >= 0 ;++1 x4515 -1 x1601 >= 0 ;+-1 x4516 +1 x1602 >= 0 ;+-1 x4516 -1 x1599 >= -1 ;++1 x4516 -1 x1602 +1 x1599 >= 0 ;+-1 x4517 +1 x1603 >= 0 ;+-1 x4517 -1 x1600 >= -1 ;++1 x4517 -1 x1603 +1 x1600 >= 0 ;+-1 x4518 +1 x1604 >= 0 ;+-1 x4518 -1 x1601 >= -1 ;++1 x4518 -1 x1604 +1 x1601 >= 0 ;+-1 x4519 +1 x1605 >= 0 ;+-1 x4519 -1 x1602 >= -1 ;++1 x4519 -1 x1605 +1 x1602 >= 0 ;+-1 x4520 +1 x1606 >= 0 ;+-1 x4520 -1 x1603 >= -1 ;++1 x4520 -1 x1606 +1 x1603 >= 0 ;+-1 x4521 +1 x1607 >= 0 ;+-1 x4521 -1 x1604 >= -1 ;++1 x4521 -1 x1607 +1 x1604 >= 0 ;+-1 x4522 +1 x1608 >= 0 ;+-1 x4522 -1 x1605 >= -1 ;++1 x4522 -1 x1608 +1 x1605 >= 0 ;+-1 x4523 +1 x1609 >= 0 ;+-1 x4523 -1 x1606 >= -1 ;++1 x4523 -1 x1609 +1 x1606 >= 0 ;+-1 x4524 +1 x1610 >= 0 ;+-1 x4524 -1 x1607 >= -1 ;++1 x4524 -1 x1610 +1 x1607 >= 0 ;+-1 x4525 +1 x1611 >= 0 ;+-1 x4525 -1 x1608 >= -1 ;++1 x4525 -1 x1611 +1 x1608 >= 0 ;+-1 x4526 +1 x1612 >= 0 ;+-1 x4526 -1 x1609 >= -1 ;++1 x4526 -1 x1612 +1 x1609 >= 0 ;+-1 x4527 +1 x1613 >= 0 ;+-1 x4527 -1 x1610 >= -1 ;++1 x4527 -1 x1613 +1 x1610 >= 0 ;+-1 x4528 +1 x1614 >= 0 ;+-1 x4528 -1 x1611 >= -1 ;++1 x4528 -1 x1614 +1 x1611 >= 0 ;+-1 x4529 +1 x1615 >= 0 ;+-1 x4529 -1 x1612 >= -1 ;++1 x4529 -1 x1615 +1 x1612 >= 0 ;+-1 x4530 +1 x1616 >= 0 ;+-1 x4530 -1 x1613 >= -1 ;++1 x4530 -1 x1616 +1 x1613 >= 0 ;+-1 x4531 +1 x1617 >= 0 ;+-1 x4531 -1 x1614 >= -1 ;++1 x4531 -1 x1617 +1 x1614 >= 0 ;+-1 x4532 +1 x1618 >= 0 ;+-1 x4532 -1 x1615 >= -1 ;++1 x4532 -1 x1618 +1 x1615 >= 0 ;+-1 x4533 +1 x1619 >= 0 ;+-1 x4533 -1 x1616 >= -1 ;++1 x4533 -1 x1619 +1 x1616 >= 0 ;+-1 x4534 +1 x1620 >= 0 ;+-1 x4534 -1 x1617 >= -1 ;++1 x4534 -1 x1620 +1 x1617 >= 0 ;+-1 x4535 +1 x1621 >= 0 ;+-1 x4535 -1 x1618 >= -1 ;++1 x4535 -1 x1621 +1 x1618 >= 0 ;+-1 x4536 +1 x1622 >= 0 ;+-1 x4536 -1 x1619 >= -1 ;++1 x4536 -1 x1622 +1 x1619 >= 0 ;+-1 x4537 +1 x1623 >= 0 ;+-1 x4537 -1 x1620 >= -1 ;++1 x4537 -1 x1623 +1 x1620 >= 0 ;+-1 x4538 +1 x1624 >= 0 ;+-1 x4538 -1 x1621 >= -1 ;++1 x4538 -1 x1624 +1 x1621 >= 0 ;+-1 x4539 +1 x1625 >= 0 ;+-1 x4539 -1 x1622 >= -1 ;++1 x4539 -1 x1625 +1 x1622 >= 0 ;+-1 x4540 +1 x1626 >= 0 ;+-1 x4540 -1 x1623 >= -1 ;++1 x4540 -1 x1626 +1 x1623 >= 0 ;+-1 x4541 +1 x1627 >= 0 ;+-1 x4541 -1 x1624 >= -1 ;++1 x4541 -1 x1627 +1 x1624 >= 0 ;+-1 x4542 +1 x1628 >= 0 ;+-1 x4542 -1 x1625 >= -1 ;++1 x4542 -1 x1628 +1 x1625 >= 0 ;+-1 x4543 +1 x1629 >= 0 ;+-1 x4543 -1 x1626 >= -1 ;++1 x4543 -1 x1629 +1 x1626 >= 0 ;+-1 x4544 +1 x1630 >= 0 ;+-1 x4544 -1 x1627 >= -1 ;++1 x4544 -1 x1630 +1 x1627 >= 0 ;+-1 x4545 +1 x1631 >= 0 ;+-1 x4545 -1 x1628 >= -1 ;++1 x4545 -1 x1631 +1 x1628 >= 0 ;+-1 x4546 +1 x1632 >= 0 ;+-1 x4546 -1 x1629 >= -1 ;++1 x4546 -1 x1632 +1 x1629 >= 0 ;+-1 x4547 +1 x1633 >= 0 ;+-1 x4547 -1 x1630 >= -1 ;++1 x4547 -1 x1633 +1 x1630 >= 0 ;+-1 x4548 +1 x1634 >= 0 ;+-1 x4548 -1 x1631 >= -1 ;++1 x4548 -1 x1634 +1 x1631 >= 0 ;+-1 x4549 +1 x1635 >= 0 ;+-1 x4549 -1 x1632 >= -1 ;++1 x4549 -1 x1635 +1 x1632 >= 0 ;+-1 x4550 +1 x1636 >= 0 ;+-1 x4550 -1 x1633 >= -1 ;++1 x4550 -1 x1636 +1 x1633 >= 0 ;+-1 x4551 +1 x1637 >= 0 ;+-1 x4551 -1 x1634 >= -1 ;++1 x4551 -1 x1637 +1 x1634 >= 0 ;+-1 x4552 +1 x1638 >= 0 ;+-1 x4552 -1 x1635 >= -1 ;++1 x4552 -1 x1638 +1 x1635 >= 0 ;+-1 x4553 +1 x1639 >= 0 ;+-1 x4553 -1 x1636 >= -1 ;++1 x4553 -1 x1639 +1 x1636 >= 0 ;+-1 x4554 +1 x1640 >= 0 ;+-1 x4554 -1 x1637 >= -1 ;++1 x4554 -1 x1640 +1 x1637 >= 0 ;+-1 x4555 +1 x1641 >= 0 ;+-1 x4555 -1 x1638 >= -1 ;++1 x4555 -1 x1641 +1 x1638 >= 0 ;+-1 x4556 +1 x1642 >= 0 ;+-1 x4556 -1 x1639 >= -1 ;++1 x4556 -1 x1642 +1 x1639 >= 0 ;+-1 x4557 +1 x1643 >= 0 ;+-1 x4557 -1 x1640 >= -1 ;++1 x4557 -1 x1643 +1 x1640 >= 0 ;+-1 x4558 +1 x1644 >= 0 ;+-1 x4558 -1 x1641 >= -1 ;++1 x4558 -1 x1644 +1 x1641 >= 0 ;+-1 x4559 +1 x1645 >= 0 ;+-1 x4559 -1 x1642 >= -1 ;++1 x4559 -1 x1645 +1 x1642 >= 0 ;+-1 x4560 +1 x1646 >= 0 ;+-1 x4560 -1 x1643 >= -1 ;++1 x4560 -1 x1646 +1 x1643 >= 0 ;+-1 x4561 +1 x1647 >= 0 ;+-1 x4561 -1 x1644 >= -1 ;++1 x4561 -1 x1647 +1 x1644 >= 0 ;+-1 x4562 +1 x1648 >= 0 ;+-1 x4562 -1 x1645 >= -1 ;++1 x4562 -1 x1648 +1 x1645 >= 0 ;+-1 x4563 +1 x1649 >= 0 ;+-1 x4563 -1 x1646 >= -1 ;++1 x4563 -1 x1649 +1 x1646 >= 0 ;+-1 x4564 +1 x1650 >= 0 ;+-1 x4564 -1 x1647 >= -1 ;++1 x4564 -1 x1650 +1 x1647 >= 0 ;+-1 x4565 +1 x1651 >= 0 ;+-1 x4565 -1 x1648 >= -1 ;++1 x4565 -1 x1651 +1 x1648 >= 0 ;+-1 x4566 +1 x1652 >= 0 ;+-1 x4566 -1 x1649 >= -1 ;++1 x4566 -1 x1652 +1 x1649 >= 0 ;+-1 x4567 +1 x1653 >= 0 ;+-1 x4567 -1 x1650 >= -1 ;++1 x4567 -1 x1653 +1 x1650 >= 0 ;+-1 x4568 +1 x1654 >= 0 ;+-1 x4568 -1 x1651 >= -1 ;++1 x4568 -1 x1654 +1 x1651 >= 0 ;+-1 x4569 +1 x1655 >= 0 ;+-1 x4569 -1 x1652 >= -1 ;++1 x4569 -1 x1655 +1 x1652 >= 0 ;+-1 x4570 +1 x1656 >= 0 ;+-1 x4570 -1 x1653 >= -1 ;++1 x4570 -1 x1656 +1 x1653 >= 0 ;+-1 x4571 +1 x1657 >= 0 ;+-1 x4571 -1 x1654 >= -1 ;++1 x4571 -1 x1657 +1 x1654 >= 0 ;+-1 x4572 +1 x1658 >= 0 ;+-1 x4572 -1 x1655 >= -1 ;++1 x4572 -1 x1658 +1 x1655 >= 0 ;+-1 x4573 +1 x1659 >= 0 ;+-1 x4573 -1 x1656 >= -1 ;++1 x4573 -1 x1659 +1 x1656 >= 0 ;+-1 x4574 +1 x1660 >= 0 ;+-1 x4574 -1 x1657 >= -1 ;++1 x4574 -1 x1660 +1 x1657 >= 0 ;+-1 x4575 +1 x1661 >= 0 ;+-1 x4575 -1 x1658 >= -1 ;++1 x4575 -1 x1661 +1 x1658 >= 0 ;+-1 x4576 +1 x1662 >= 0 ;+-1 x4576 -1 x1659 >= -1 ;++1 x4576 -1 x1662 +1 x1659 >= 0 ;+-1 x4577 +1 x1663 >= 0 ;+-1 x4577 -1 x1660 >= -1 ;++1 x4577 -1 x1663 +1 x1660 >= 0 ;+-1 x4578 +1 x1664 >= 0 ;+-1 x4578 -1 x1661 >= -1 ;++1 x4578 -1 x1664 +1 x1661 >= 0 ;+-1 x4579 +1 x1665 >= 0 ;+-1 x4579 -1 x1662 >= -1 ;++1 x4579 -1 x1665 +1 x1662 >= 0 ;+-1 x4580 +1 x1666 >= 0 ;+-1 x4580 -1 x1663 >= -1 ;++1 x4580 -1 x1666 +1 x1663 >= 0 ;+-1 x4581 +1 x1667 >= 0 ;+-1 x4581 -1 x1664 >= -1 ;++1 x4581 -1 x1667 +1 x1664 >= 0 ;+-1 x4582 +1 x1668 >= 0 ;+-1 x4582 -1 x1665 >= -1 ;++1 x4582 -1 x1668 +1 x1665 >= 0 ;+-1 x4583 +1 x1669 >= 0 ;+-1 x4583 -1 x1666 >= -1 ;++1 x4583 -1 x1669 +1 x1666 >= 0 ;+-1 x4584 +1 x1670 >= 0 ;+-1 x4584 -1 x1667 >= -1 ;++1 x4584 -1 x1670 +1 x1667 >= 0 ;+-1 x4585 +1 x1671 >= 0 ;+-1 x4585 -1 x1668 >= -1 ;++1 x4585 -1 x1671 +1 x1668 >= 0 ;+-1 x4586 +1 x1672 >= 0 ;+-1 x4586 -1 x1669 >= -1 ;++1 x4586 -1 x1672 +1 x1669 >= 0 ;+-1 x4587 +1 x1673 >= 0 ;+-1 x4587 -1 x1670 >= -1 ;++1 x4587 -1 x1673 +1 x1670 >= 0 ;+-1 x4588 +1 x1674 >= 0 ;+-1 x4588 -1 x1671 >= -1 ;++1 x4588 -1 x1674 +1 x1671 >= 0 ;+-1 x4589 +1 x1675 >= 0 ;+-1 x4589 -1 x1672 >= -1 ;++1 x4589 -1 x1675 +1 x1672 >= 0 ;+-1 x4590 +1 x1676 >= 0 ;+-1 x4590 -1 x1673 >= -1 ;++1 x4590 -1 x1676 +1 x1673 >= 0 ;+-1 x4591 +1 x1677 >= 0 ;+-1 x4591 -1 x1674 >= -1 ;++1 x4591 -1 x1677 +1 x1674 >= 0 ;+-1 x4592 +1 x1678 >= 0 ;+-1 x4592 -1 x1675 >= -1 ;++1 x4592 -1 x1678 +1 x1675 >= 0 ;+-1 x4593 +1 x1679 >= 0 ;+-1 x4593 -1 x1676 >= -1 ;++1 x4593 -1 x1679 +1 x1676 >= 0 ;+-1 x4594 +1 x1680 >= 0 ;+-1 x4594 -1 x1677 >= -1 ;++1 x4594 -1 x1680 +1 x1677 >= 0 ;+-1 x4595 +1 x1681 >= 0 ;+-1 x4595 -1 x1678 >= -1 ;++1 x4595 -1 x1681 +1 x1678 >= 0 ;+-1 x4596 +1 x1682 >= 0 ;+-1 x4596 -1 x1679 >= -1 ;++1 x4596 -1 x1682 +1 x1679 >= 0 ;+-1 x4597 +1 x1683 >= 0 ;+-1 x4597 -1 x1680 >= -1 ;++1 x4597 -1 x1683 +1 x1680 >= 0 ;+-1 x4598 +1 x1684 >= 0 ;+-1 x4598 -1 x1681 >= -1 ;++1 x4598 -1 x1684 +1 x1681 >= 0 ;+-1 x4599 +1 x1685 >= 0 ;+-1 x4599 -1 x1682 >= -1 ;++1 x4599 -1 x1685 +1 x1682 >= 0 ;+-1 x4600 +1 x1686 >= 0 ;+-1 x4600 -1 x1683 >= -1 ;++1 x4600 -1 x1686 +1 x1683 >= 0 ;+-1 x4601 +1 x1687 >= 0 ;+-1 x4601 -1 x1684 >= -1 ;++1 x4601 -1 x1687 +1 x1684 >= 0 ;+-1 x4602 +1 x1688 >= 0 ;+-1 x4602 -1 x1685 >= -1 ;++1 x4602 -1 x1688 +1 x1685 >= 0 ;+-1 x4603 +1 x1689 >= 0 ;+-1 x4603 -1 x1686 >= -1 ;++1 x4603 -1 x1689 +1 x1686 >= 0 ;+-1 x4604 +1 x1690 >= 0 ;+-1 x4604 -1 x1687 >= -1 ;++1 x4604 -1 x1690 +1 x1687 >= 0 ;+-1 x4605 +1 x1691 >= 0 ;+-1 x4605 -1 x1688 >= -1 ;++1 x4605 -1 x1691 +1 x1688 >= 0 ;+-1 x4606 +1 x1692 >= 0 ;+-1 x4606 -1 x1689 >= -1 ;++1 x4606 -1 x1692 +1 x1689 >= 0 ;+-1 x4607 +1 x1693 >= 0 ;++1 x4607 -1 x1693 >= 0 ;+-1 x4608 +1 x1694 >= 0 ;++1 x4608 -1 x1694 >= 0 ;+-1 x4609 +1 x1695 >= 0 ;++1 x4609 -1 x1695 >= 0 ;+-1 x4610 +1 x1696 >= 0 ;++1 x4610 -1 x1696 >= 0 ;+-1 x4611 +1 x1697 >= 0 ;++1 x4611 -1 x1697 >= 0 ;+-1 x4612 +1 x1698 >= 0 ;++1 x4612 -1 x1698 >= 0 ;+-1 x4613 +1 x1699 >= 0 ;++1 x4613 -1 x1699 >= 0 ;+-1 x4614 +1 x1700 >= 0 ;+-1 x4614 -1 x1693 >= -1 ;++1 x4614 -1 x1700 +1 x1693 >= 0 ;+-1 x4615 +1 x1701 >= 0 ;+-1 x4615 -1 x1694 >= -1 ;++1 x4615 -1 x1701 +1 x1694 >= 0 ;+-1 x4616 +1 x1702 >= 0 ;+-1 x4616 -1 x1695 >= -1 ;++1 x4616 -1 x1702 +1 x1695 >= 0 ;+-1 x4617 +1 x1703 >= 0 ;+-1 x4617 -1 x1696 >= -1 ;++1 x4617 -1 x1703 +1 x1696 >= 0 ;+-1 x4618 +1 x1704 >= 0 ;+-1 x4618 -1 x1697 >= -1 ;++1 x4618 -1 x1704 +1 x1697 >= 0 ;+-1 x4619 +1 x1705 >= 0 ;+-1 x4619 -1 x1698 >= -1 ;++1 x4619 -1 x1705 +1 x1698 >= 0 ;+-1 x4620 +1 x1706 >= 0 ;+-1 x4620 -1 x1699 >= -1 ;++1 x4620 -1 x1706 +1 x1699 >= 0 ;+-1 x4621 +1 x1707 >= 0 ;+-1 x4621 -1 x1700 >= -1 ;++1 x4621 -1 x1707 +1 x1700 >= 0 ;+-1 x4622 +1 x1708 >= 0 ;+-1 x4622 -1 x1701 >= -1 ;++1 x4622 -1 x1708 +1 x1701 >= 0 ;+-1 x4623 +1 x1709 >= 0 ;+-1 x4623 -1 x1702 >= -1 ;++1 x4623 -1 x1709 +1 x1702 >= 0 ;+-1 x4624 +1 x1710 >= 0 ;+-1 x4624 -1 x1703 >= -1 ;++1 x4624 -1 x1710 +1 x1703 >= 0 ;+-1 x4625 +1 x1711 >= 0 ;+-1 x4625 -1 x1704 >= -1 ;++1 x4625 -1 x1711 +1 x1704 >= 0 ;+-1 x4626 +1 x1712 >= 0 ;+-1 x4626 -1 x1705 >= -1 ;++1 x4626 -1 x1712 +1 x1705 >= 0 ;+-1 x4627 +1 x1713 >= 0 ;+-1 x4627 -1 x1706 >= -1 ;++1 x4627 -1 x1713 +1 x1706 >= 0 ;+-1 x4628 +1 x1714 >= 0 ;+-1 x4628 -1 x1707 >= -1 ;++1 x4628 -1 x1714 +1 x1707 >= 0 ;+-1 x4629 +1 x1715 >= 0 ;+-1 x4629 -1 x1708 >= -1 ;++1 x4629 -1 x1715 +1 x1708 >= 0 ;+-1 x4630 +1 x1716 >= 0 ;+-1 x4630 -1 x1709 >= -1 ;++1 x4630 -1 x1716 +1 x1709 >= 0 ;+-1 x4631 +1 x1717 >= 0 ;+-1 x4631 -1 x1710 >= -1 ;++1 x4631 -1 x1717 +1 x1710 >= 0 ;+-1 x4632 +1 x1718 >= 0 ;+-1 x4632 -1 x1711 >= -1 ;++1 x4632 -1 x1718 +1 x1711 >= 0 ;+-1 x4633 +1 x1719 >= 0 ;+-1 x4633 -1 x1712 >= -1 ;++1 x4633 -1 x1719 +1 x1712 >= 0 ;+-1 x4634 +1 x1720 >= 0 ;+-1 x4634 -1 x1713 >= -1 ;++1 x4634 -1 x1720 +1 x1713 >= 0 ;+-1 x4635 +1 x1721 >= 0 ;+-1 x4635 -1 x1714 >= -1 ;++1 x4635 -1 x1721 +1 x1714 >= 0 ;+-1 x4636 +1 x1722 >= 0 ;+-1 x4636 -1 x1715 >= -1 ;++1 x4636 -1 x1722 +1 x1715 >= 0 ;+-1 x4637 +1 x1723 >= 0 ;+-1 x4637 -1 x1716 >= -1 ;++1 x4637 -1 x1723 +1 x1716 >= 0 ;+-1 x4638 +1 x1724 >= 0 ;+-1 x4638 -1 x1717 >= -1 ;++1 x4638 -1 x1724 +1 x1717 >= 0 ;+-1 x4639 +1 x1725 >= 0 ;+-1 x4639 -1 x1718 >= -1 ;++1 x4639 -1 x1725 +1 x1718 >= 0 ;+-1 x4640 +1 x1726 >= 0 ;+-1 x4640 -1 x1719 >= -1 ;++1 x4640 -1 x1726 +1 x1719 >= 0 ;+-1 x4641 +1 x1727 >= 0 ;+-1 x4641 -1 x1720 >= -1 ;++1 x4641 -1 x1727 +1 x1720 >= 0 ;+-1 x4642 +1 x1728 >= 0 ;+-1 x4642 -1 x1721 >= -1 ;++1 x4642 -1 x1728 +1 x1721 >= 0 ;+-1 x4643 +1 x1729 >= 0 ;+-1 x4643 -1 x1722 >= -1 ;++1 x4643 -1 x1729 +1 x1722 >= 0 ;+-1 x4644 +1 x1730 >= 0 ;+-1 x4644 -1 x1723 >= -1 ;++1 x4644 -1 x1730 +1 x1723 >= 0 ;+-1 x4645 +1 x1731 >= 0 ;+-1 x4645 -1 x1724 >= -1 ;++1 x4645 -1 x1731 +1 x1724 >= 0 ;+-1 x4646 +1 x1732 >= 0 ;+-1 x4646 -1 x1725 >= -1 ;++1 x4646 -1 x1732 +1 x1725 >= 0 ;+-1 x4647 +1 x1733 >= 0 ;+-1 x4647 -1 x1726 >= -1 ;++1 x4647 -1 x1733 +1 x1726 >= 0 ;+-1 x4648 +1 x1734 >= 0 ;+-1 x4648 -1 x1727 >= -1 ;++1 x4648 -1 x1734 +1 x1727 >= 0 ;+-1 x4649 +1 x1735 >= 0 ;+-1 x4649 -1 x1728 >= -1 ;++1 x4649 -1 x1735 +1 x1728 >= 0 ;+-1 x4650 +1 x1736 >= 0 ;+-1 x4650 -1 x1729 >= -1 ;++1 x4650 -1 x1736 +1 x1729 >= 0 ;+-1 x4651 +1 x1737 >= 0 ;+-1 x4651 -1 x1730 >= -1 ;++1 x4651 -1 x1737 +1 x1730 >= 0 ;+-1 x4652 +1 x1738 >= 0 ;+-1 x4652 -1 x1731 >= -1 ;++1 x4652 -1 x1738 +1 x1731 >= 0 ;+-1 x4653 +1 x1739 >= 0 ;+-1 x4653 -1 x1732 >= -1 ;++1 x4653 -1 x1739 +1 x1732 >= 0 ;+-1 x4654 +1 x1740 >= 0 ;+-1 x4654 -1 x1733 >= -1 ;++1 x4654 -1 x1740 +1 x1733 >= 0 ;+-1 x4655 +1 x1741 >= 0 ;+-1 x4655 -1 x1734 >= -1 ;++1 x4655 -1 x1741 +1 x1734 >= 0 ;+-1 x4656 +1 x1742 >= 0 ;+-1 x4656 -1 x1735 >= -1 ;++1 x4656 -1 x1742 +1 x1735 >= 0 ;+-1 x4657 +1 x1743 >= 0 ;+-1 x4657 -1 x1736 >= -1 ;++1 x4657 -1 x1743 +1 x1736 >= 0 ;+-1 x4658 +1 x1744 >= 0 ;+-1 x4658 -1 x1737 >= -1 ;++1 x4658 -1 x1744 +1 x1737 >= 0 ;+-1 x4659 +1 x1745 >= 0 ;+-1 x4659 -1 x1738 >= -1 ;++1 x4659 -1 x1745 +1 x1738 >= 0 ;+-1 x4660 +1 x1746 >= 0 ;+-1 x4660 -1 x1739 >= -1 ;++1 x4660 -1 x1746 +1 x1739 >= 0 ;+-1 x4661 +1 x1747 >= 0 ;+-1 x4661 -1 x1740 >= -1 ;++1 x4661 -1 x1747 +1 x1740 >= 0 ;+-1 x4662 +1 x1748 >= 0 ;+-1 x4662 -1 x1741 >= -1 ;++1 x4662 -1 x1748 +1 x1741 >= 0 ;+-1 x4663 +1 x1749 >= 0 ;+-1 x4663 -1 x1742 >= -1 ;++1 x4663 -1 x1749 +1 x1742 >= 0 ;+-1 x4664 +1 x1750 >= 0 ;+-1 x4664 -1 x1743 >= -1 ;++1 x4664 -1 x1750 +1 x1743 >= 0 ;+-1 x4665 +1 x1751 >= 0 ;+-1 x4665 -1 x1744 >= -1 ;++1 x4665 -1 x1751 +1 x1744 >= 0 ;+-1 x4666 +1 x1752 >= 0 ;+-1 x4666 -1 x1745 >= -1 ;++1 x4666 -1 x1752 +1 x1745 >= 0 ;+-1 x4667 +1 x1753 >= 0 ;+-1 x4667 -1 x1746 >= -1 ;++1 x4667 -1 x1753 +1 x1746 >= 0 ;+-1 x4668 +1 x1754 >= 0 ;+-1 x4668 -1 x1747 >= -1 ;++1 x4668 -1 x1754 +1 x1747 >= 0 ;+-1 x4669 +1 x1755 >= 0 ;+-1 x4669 -1 x1748 >= -1 ;++1 x4669 -1 x1755 +1 x1748 >= 0 ;+-1 x4670 +1 x1756 >= 0 ;+-1 x4670 -1 x1749 >= -1 ;++1 x4670 -1 x1756 +1 x1749 >= 0 ;+-1 x4671 +1 x1757 >= 0 ;+-1 x4671 -1 x1750 >= -1 ;++1 x4671 -1 x1757 +1 x1750 >= 0 ;+-1 x4672 +1 x1758 >= 0 ;+-1 x4672 -1 x1751 >= -1 ;++1 x4672 -1 x1758 +1 x1751 >= 0 ;+-1 x4673 +1 x1759 >= 0 ;+-1 x4673 -1 x1752 >= -1 ;++1 x4673 -1 x1759 +1 x1752 >= 0 ;+-1 x4674 +1 x1760 >= 0 ;+-1 x4674 -1 x1753 >= -1 ;++1 x4674 -1 x1760 +1 x1753 >= 0 ;+-1 x4675 +1 x1761 >= 0 ;+-1 x4675 -1 x1754 >= -1 ;++1 x4675 -1 x1761 +1 x1754 >= 0 ;+-1 x4676 +1 x1762 >= 0 ;+-1 x4676 -1 x1755 >= -1 ;++1 x4676 -1 x1762 +1 x1755 >= 0 ;+-1 x4677 +1 x1763 >= 0 ;+-1 x4677 -1 x1756 >= -1 ;++1 x4677 -1 x1763 +1 x1756 >= 0 ;+-1 x4678 +1 x1764 >= 0 ;+-1 x4678 -1 x1757 >= -1 ;++1 x4678 -1 x1764 +1 x1757 >= 0 ;+-1 x4679 +1 x1765 >= 0 ;+-1 x4679 -1 x1758 >= -1 ;++1 x4679 -1 x1765 +1 x1758 >= 0 ;+-1 x4680 +1 x1766 >= 0 ;+-1 x4680 -1 x1759 >= -1 ;++1 x4680 -1 x1766 +1 x1759 >= 0 ;+-1 x4681 +1 x1767 >= 0 ;+-1 x4681 -1 x1760 >= -1 ;++1 x4681 -1 x1767 +1 x1760 >= 0 ;+-1 x4682 +1 x1768 >= 0 ;+-1 x4682 -1 x1761 >= -1 ;++1 x4682 -1 x1768 +1 x1761 >= 0 ;+-1 x4683 +1 x1769 >= 0 ;+-1 x4683 -1 x1762 >= -1 ;++1 x4683 -1 x1769 +1 x1762 >= 0 ;+-1 x4684 +1 x1770 >= 0 ;+-1 x4684 -1 x1763 >= -1 ;++1 x4684 -1 x1770 +1 x1763 >= 0 ;+-1 x4685 +1 x1771 >= 0 ;+-1 x4685 -1 x1764 >= -1 ;++1 x4685 -1 x1771 +1 x1764 >= 0 ;+-1 x4686 +1 x1772 >= 0 ;+-1 x4686 -1 x1765 >= -1 ;++1 x4686 -1 x1772 +1 x1765 >= 0 ;+-1 x4687 +1 x1773 >= 0 ;+-1 x4687 -1 x1766 >= -1 ;++1 x4687 -1 x1773 +1 x1766 >= 0 ;+-1 x4688 +1 x1774 >= 0 ;+-1 x4688 -1 x1767 >= -1 ;++1 x4688 -1 x1774 +1 x1767 >= 0 ;+-1 x4689 +1 x1775 >= 0 ;+-1 x4689 -1 x1768 >= -1 ;++1 x4689 -1 x1775 +1 x1768 >= 0 ;+-1 x4690 +1 x1776 >= 0 ;+-1 x4690 -1 x1769 >= -1 ;++1 x4690 -1 x1776 +1 x1769 >= 0 ;+-1 x4691 +1 x1777 >= 0 ;+-1 x4691 -1 x1770 >= -1 ;++1 x4691 -1 x1777 +1 x1770 >= 0 ;+-1 x4692 +1 x1778 >= 0 ;+-1 x4692 -1 x1771 >= -1 ;++1 x4692 -1 x1778 +1 x1771 >= 0 ;+-1 x4693 +1 x1779 >= 0 ;+-1 x4693 -1 x1772 >= -1 ;++1 x4693 -1 x1779 +1 x1772 >= 0 ;+-1 x4694 +1 x1780 >= 0 ;+-1 x4694 -1 x1773 >= -1 ;++1 x4694 -1 x1780 +1 x1773 >= 0 ;+-1 x4695 +1 x1781 >= 0 ;+-1 x4695 -1 x1774 >= -1 ;++1 x4695 -1 x1781 +1 x1774 >= 0 ;+-1 x4696 +1 x1782 >= 0 ;+-1 x4696 -1 x1775 >= -1 ;++1 x4696 -1 x1782 +1 x1775 >= 0 ;+-1 x4697 +1 x1783 >= 0 ;+-1 x4697 -1 x1776 >= -1 ;++1 x4697 -1 x1783 +1 x1776 >= 0 ;+-1 x4698 +1 x1784 >= 0 ;+-1 x4698 -1 x1777 >= -1 ;++1 x4698 -1 x1784 +1 x1777 >= 0 ;+-1 x4699 +1 x1785 >= 0 ;+-1 x4699 -1 x1778 >= -1 ;++1 x4699 -1 x1785 +1 x1778 >= 0 ;+-1 x4700 +1 x1786 >= 0 ;+-1 x4700 -1 x1779 >= -1 ;++1 x4700 -1 x1786 +1 x1779 >= 0 ;+-1 x4701 +1 x1787 >= 0 ;++1 x4701 -1 x1787 >= 0 ;+-1 x4702 +1 x1788 >= 0 ;++1 x4702 -1 x1788 >= 0 ;+-1 x4703 +1 x1789 >= 0 ;+-1 x4703 -1 x1787 >= -1 ;++1 x4703 -1 x1789 +1 x1787 >= 0 ;+-1 x4704 +1 x1790 >= 0 ;+-1 x4704 -1 x1788 >= -1 ;++1 x4704 -1 x1790 +1 x1788 >= 0 ;+-1 x4705 +1 x1791 >= 0 ;+-1 x4705 -1 x1789 >= -1 ;++1 x4705 -1 x1791 +1 x1789 >= 0 ;+-1 x4706 +1 x1792 >= 0 ;+-1 x4706 -1 x1790 >= -1 ;++1 x4706 -1 x1792 +1 x1790 >= 0 ;+-1 x4707 +1 x1793 >= 0 ;+-1 x4707 -1 x1791 >= -1 ;++1 x4707 -1 x1793 +1 x1791 >= 0 ;+-1 x4708 +1 x1794 >= 0 ;+-1 x4708 -1 x1792 >= -1 ;++1 x4708 -1 x1794 +1 x1792 >= 0 ;+-1 x4709 +1 x1795 >= 0 ;+-1 x4709 -1 x1793 >= -1 ;++1 x4709 -1 x1795 +1 x1793 >= 0 ;+-1 x4710 +1 x1796 >= 0 ;+-1 x4710 -1 x1794 >= -1 ;++1 x4710 -1 x1796 +1 x1794 >= 0 ;+-1 x4711 +1 x1797 >= 0 ;+-1 x4711 -1 x1795 >= -1 ;++1 x4711 -1 x1797 +1 x1795 >= 0 ;+-1 x4712 +1 x1798 >= 0 ;+-1 x4712 -1 x1796 >= -1 ;++1 x4712 -1 x1798 +1 x1796 >= 0 ;+-1 x4713 +1 x1799 >= 0 ;+-1 x4713 -1 x1797 >= -1 ;++1 x4713 -1 x1799 +1 x1797 >= 0 ;+-1 x4714 +1 x1800 >= 0 ;+-1 x4714 -1 x1798 >= -1 ;++1 x4714 -1 x1800 +1 x1798 >= 0 ;+-1 x4715 +1 x1801 >= 0 ;+-1 x4715 -1 x1799 >= -1 ;++1 x4715 -1 x1801 +1 x1799 >= 0 ;+-1 x4716 +1 x1802 >= 0 ;+-1 x4716 -1 x1800 >= -1 ;++1 x4716 -1 x1802 +1 x1800 >= 0 ;+-1 x4717 +1 x1803 >= 0 ;+-1 x4717 -1 x1801 >= -1 ;++1 x4717 -1 x1803 +1 x1801 >= 0 ;+-1 x4718 +1 x1804 >= 0 ;+-1 x4718 -1 x1802 >= -1 ;++1 x4718 -1 x1804 +1 x1802 >= 0 ;+-1 x4719 +1 x1805 >= 0 ;+-1 x4719 -1 x1803 >= -1 ;++1 x4719 -1 x1805 +1 x1803 >= 0 ;+-1 x4720 +1 x1806 >= 0 ;+-1 x4720 -1 x1804 >= -1 ;++1 x4720 -1 x1806 +1 x1804 >= 0 ;+-1 x4721 +1 x1807 >= 0 ;+-1 x4721 -1 x1805 >= -1 ;++1 x4721 -1 x1807 +1 x1805 >= 0 ;+-1 x4722 +1 x1808 >= 0 ;+-1 x4722 -1 x1806 >= -1 ;++1 x4722 -1 x1808 +1 x1806 >= 0 ;+-1 x4723 +1 x1809 >= 0 ;+-1 x4723 -1 x1807 >= -1 ;++1 x4723 -1 x1809 +1 x1807 >= 0 ;+-1 x4724 +1 x1810 >= 0 ;+-1 x4724 -1 x1808 >= -1 ;++1 x4724 -1 x1810 +1 x1808 >= 0 ;+-1 x4725 +1 x1811 >= 0 ;+-1 x4725 -1 x1809 >= -1 ;++1 x4725 -1 x1811 +1 x1809 >= 0 ;+-1 x4726 +1 x1812 >= 0 ;+-1 x4726 -1 x1810 >= -1 ;++1 x4726 -1 x1812 +1 x1810 >= 0 ;+-1 x4727 +1 x1813 >= 0 ;+-1 x4727 -1 x1811 >= -1 ;++1 x4727 -1 x1813 +1 x1811 >= 0 ;+-1 x4728 +1 x1814 >= 0 ;+-1 x4728 -1 x1812 >= -1 ;++1 x4728 -1 x1814 +1 x1812 >= 0 ;+-1 x4729 +1 x1815 >= 0 ;+-1 x4729 -1 x1813 >= -1 ;++1 x4729 -1 x1815 +1 x1813 >= 0 ;+-1 x4730 +1 x1816 >= 0 ;+-1 x4730 -1 x1814 >= -1 ;++1 x4730 -1 x1816 +1 x1814 >= 0 ;+-1 x4731 +1 x1817 >= 0 ;+-1 x4731 -1 x1815 >= -1 ;++1 x4731 -1 x1817 +1 x1815 >= 0 ;+-1 x4732 +1 x1818 >= 0 ;+-1 x4732 -1 x1816 >= -1 ;++1 x4732 -1 x1818 +1 x1816 >= 0 ;+-1 x4733 +1 x1819 >= 0 ;+-1 x4733 -1 x1817 >= -1 ;++1 x4733 -1 x1819 +1 x1817 >= 0 ;+-1 x4734 +1 x1820 >= 0 ;+-1 x4734 -1 x1818 >= -1 ;++1 x4734 -1 x1820 +1 x1818 >= 0 ;+-1 x4735 +1 x1821 >= 0 ;+-1 x4735 -1 x1819 >= -1 ;++1 x4735 -1 x1821 +1 x1819 >= 0 ;+-1 x4736 +1 x1822 >= 0 ;+-1 x4736 -1 x1820 >= -1 ;++1 x4736 -1 x1822 +1 x1820 >= 0 ;+-1 x4737 +1 x1823 >= 0 ;+-1 x4737 -1 x1821 >= -1 ;++1 x4737 -1 x1823 +1 x1821 >= 0 ;+-1 x4738 +1 x1824 >= 0 ;+-1 x4738 -1 x1822 >= -1 ;++1 x4738 -1 x1824 +1 x1822 >= 0 ;+-1 x4739 +1 x1825 >= 0 ;+-1 x4739 -1 x1823 >= -1 ;++1 x4739 -1 x1825 +1 x1823 >= 0 ;+-1 x4740 +1 x1826 >= 0 ;+-1 x4740 -1 x1824 >= -1 ;++1 x4740 -1 x1826 +1 x1824 >= 0 ;+-1 x4741 +1 x1827 >= 0 ;+-1 x4741 -1 x1825 >= -1 ;++1 x4741 -1 x1827 +1 x1825 >= 0 ;+-1 x4742 +1 x1828 >= 0 ;+-1 x4742 -1 x1826 >= -1 ;++1 x4742 -1 x1828 +1 x1826 >= 0 ;+-1 x4743 +1 x1829 >= 0 ;+-1 x4743 -1 x1827 >= -1 ;++1 x4743 -1 x1829 +1 x1827 >= 0 ;+-1 x4744 +1 x1830 >= 0 ;+-1 x4744 -1 x1828 >= -1 ;++1 x4744 -1 x1830 +1 x1828 >= 0 ;+-1 x4745 +1 x1831 >= 0 ;+-1 x4745 -1 x1829 >= -1 ;++1 x4745 -1 x1831 +1 x1829 >= 0 ;+-1 x4746 +1 x1832 >= 0 ;+-1 x4746 -1 x1830 >= -1 ;++1 x4746 -1 x1832 +1 x1830 >= 0 ;+-1 x4747 +1 x1833 >= 0 ;+-1 x4747 -1 x1831 >= -1 ;++1 x4747 -1 x1833 +1 x1831 >= 0 ;+-1 x4748 +1 x1834 >= 0 ;+-1 x4748 -1 x1832 >= -1 ;++1 x4748 -1 x1834 +1 x1832 >= 0 ;+-1 x4749 +1 x1835 >= 0 ;+-1 x4749 -1 x1833 >= -1 ;++1 x4749 -1 x1835 +1 x1833 >= 0 ;+-1 x4750 +1 x1836 >= 0 ;+-1 x4750 -1 x1834 >= -1 ;++1 x4750 -1 x1836 +1 x1834 >= 0 ;+-1 x4751 +1 x1837 >= 0 ;+-1 x4751 -1 x1835 >= -1 ;++1 x4751 -1 x1837 +1 x1835 >= 0 ;+-1 x4752 +1 x1838 >= 0 ;+-1 x4752 -1 x1836 >= -1 ;++1 x4752 -1 x1838 +1 x1836 >= 0 ;+-1 x4753 +1 x1839 >= 0 ;+-1 x4753 -1 x1837 >= -1 ;++1 x4753 -1 x1839 +1 x1837 >= 0 ;+-1 x4754 +1 x1840 >= 0 ;+-1 x4754 -1 x1838 >= -1 ;++1 x4754 -1 x1840 +1 x1838 >= 0 ;+-1 x4755 +1 x1841 >= 0 ;+-1 x4755 -1 x1839 >= -1 ;++1 x4755 -1 x1841 +1 x1839 >= 0 ;+-1 x4756 +1 x1842 >= 0 ;+-1 x4756 -1 x1840 >= -1 ;++1 x4756 -1 x1842 +1 x1840 >= 0 ;+-1 x4757 +1 x1843 >= 0 ;+-1 x4757 -1 x1841 >= -1 ;++1 x4757 -1 x1843 +1 x1841 >= 0 ;+-1 x4758 +1 x1844 >= 0 ;+-1 x4758 -1 x1842 >= -1 ;++1 x4758 -1 x1844 +1 x1842 >= 0 ;+-1 x4759 +1 x1845 >= 0 ;+-1 x4759 -1 x1843 >= -1 ;++1 x4759 -1 x1845 +1 x1843 >= 0 ;+-1 x4760 +1 x1846 >= 0 ;+-1 x4760 -1 x1844 >= -1 ;++1 x4760 -1 x1846 +1 x1844 >= 0 ;+-1 x4761 +1 x1847 >= 0 ;+-1 x4761 -1 x1845 >= -1 ;++1 x4761 -1 x1847 +1 x1845 >= 0 ;+-1 x4762 +1 x1848 >= 0 ;+-1 x4762 -1 x1846 >= -1 ;++1 x4762 -1 x1848 +1 x1846 >= 0 ;+-1 x4763 +1 x1849 >= 0 ;+-1 x4763 -1 x1847 >= -1 ;++1 x4763 -1 x1849 +1 x1847 >= 0 ;+-1 x4764 +1 x1850 >= 0 ;+-1 x4764 -1 x1848 >= -1 ;++1 x4764 -1 x1850 +1 x1848 >= 0 ;+-1 x4765 +1 x1851 >= 0 ;+-1 x4765 -1 x1849 >= -1 ;++1 x4765 -1 x1851 +1 x1849 >= 0 ;+-1 x4766 +1 x1852 >= 0 ;+-1 x4766 -1 x1850 >= -1 ;++1 x4766 -1 x1852 +1 x1850 >= 0 ;+-1 x4767 +1 x1853 >= 0 ;+-1 x4767 -1 x1851 >= -1 ;++1 x4767 -1 x1853 +1 x1851 >= 0 ;+-1 x4768 +1 x1854 >= 0 ;+-1 x4768 -1 x1852 >= -1 ;++1 x4768 -1 x1854 +1 x1852 >= 0 ;+-1 x4769 +1 x1855 >= 0 ;+-1 x4769 -1 x1853 >= -1 ;++1 x4769 -1 x1855 +1 x1853 >= 0 ;+-1 x4770 +1 x1856 >= 0 ;+-1 x4770 -1 x1854 >= -1 ;++1 x4770 -1 x1856 +1 x1854 >= 0 ;+-1 x4771 +1 x1857 >= 0 ;+-1 x4771 -1 x1855 >= -1 ;++1 x4771 -1 x1857 +1 x1855 >= 0 ;+-1 x4772 +1 x1858 >= 0 ;+-1 x4772 -1 x1856 >= -1 ;++1 x4772 -1 x1858 +1 x1856 >= 0 ;+-1 x4773 +1 x1859 >= 0 ;+-1 x4773 -1 x1857 >= -1 ;++1 x4773 -1 x1859 +1 x1857 >= 0 ;+-1 x4774 +1 x1860 >= 0 ;+-1 x4774 -1 x1858 >= -1 ;++1 x4774 -1 x1860 +1 x1858 >= 0 ;+-1 x4775 +1 x1861 >= 0 ;+-1 x4775 -1 x1859 >= -1 ;++1 x4775 -1 x1861 +1 x1859 >= 0 ;+-1 x4776 +1 x1862 >= 0 ;+-1 x4776 -1 x1860 >= -1 ;++1 x4776 -1 x1862 +1 x1860 >= 0 ;+-1 x4777 +1 x1863 >= 0 ;+-1 x4777 -1 x1861 >= -1 ;++1 x4777 -1 x1863 +1 x1861 >= 0 ;+-1 x4778 +1 x1864 >= 0 ;+-1 x4778 -1 x1862 >= -1 ;++1 x4778 -1 x1864 +1 x1862 >= 0 ;+-1 x4779 +1 x1865 >= 0 ;+-1 x4779 -1 x1863 >= -1 ;++1 x4779 -1 x1865 +1 x1863 >= 0 ;+-1 x4780 +1 x1866 >= 0 ;+-1 x4780 -1 x1864 >= -1 ;++1 x4780 -1 x1866 +1 x1864 >= 0 ;+-1 x4781 +1 x1867 >= 0 ;+-1 x4781 -1 x1865 >= -1 ;++1 x4781 -1 x1867 +1 x1865 >= 0 ;+-1 x4782 +1 x1868 >= 0 ;+-1 x4782 -1 x1866 >= -1 ;++1 x4782 -1 x1868 +1 x1866 >= 0 ;+-1 x4783 +1 x1869 >= 0 ;+-1 x4783 -1 x1867 >= -1 ;++1 x4783 -1 x1869 +1 x1867 >= 0 ;+-1 x4784 +1 x1870 >= 0 ;+-1 x4784 -1 x1868 >= -1 ;++1 x4784 -1 x1870 +1 x1868 >= 0 ;+-1 x4785 +1 x1871 >= 0 ;+-1 x4785 -1 x1869 >= -1 ;++1 x4785 -1 x1871 +1 x1869 >= 0 ;+-1 x4786 +1 x1872 >= 0 ;+-1 x4786 -1 x1870 >= -1 ;++1 x4786 -1 x1872 +1 x1870 >= 0 ;+-1 x4787 +1 x1873 >= 0 ;+-1 x4787 -1 x1871 >= -1 ;++1 x4787 -1 x1873 +1 x1871 >= 0 ;+-1 x4788 +1 x1874 >= 0 ;+-1 x4788 -1 x1872 >= -1 ;++1 x4788 -1 x1874 +1 x1872 >= 0 ;+-1 x4789 +1 x1875 >= 0 ;+-1 x4789 -1 x1873 >= -1 ;++1 x4789 -1 x1875 +1 x1873 >= 0 ;+-1 x4790 +1 x1876 >= 0 ;+-1 x4790 -1 x1874 >= -1 ;++1 x4790 -1 x1876 +1 x1874 >= 0 ;+-1 x4791 +1 x1877 >= 0 ;+-1 x4791 -1 x1875 >= -1 ;++1 x4791 -1 x1877 +1 x1875 >= 0 ;+-1 x4792 +1 x1878 >= 0 ;+-1 x4792 -1 x1876 >= -1 ;++1 x4792 -1 x1878 +1 x1876 >= 0 ;+-1 x4793 +1 x1879 >= 0 ;+-1 x4793 -1 x1877 >= -1 ;++1 x4793 -1 x1879 +1 x1877 >= 0 ;+-1 x4794 +1 x1880 >= 0 ;+-1 x4794 -1 x1878 >= -1 ;++1 x4794 -1 x1880 +1 x1878 >= 0 ;+-1 x4795 +1 x1881 >= 0 ;++1 x4795 -1 x1881 >= 0 ;+-1 x4796 +1 x1882 >= 0 ;++1 x4796 -1 x1882 >= 0 ;+-1 x4797 +1 x1883 >= 0 ;++1 x4797 -1 x1883 >= 0 ;+-1 x4798 +1 x1884 >= 0 ;++1 x4798 -1 x1884 >= 0 ;+-1 x4799 +1 x1885 >= 0 ;+-1 x4799 -1 x1881 >= -1 ;++1 x4799 -1 x1885 +1 x1881 >= 0 ;+-1 x4800 +1 x1886 >= 0 ;+-1 x4800 -1 x1882 >= -1 ;++1 x4800 -1 x1886 +1 x1882 >= 0 ;+-1 x4801 +1 x1887 >= 0 ;+-1 x4801 -1 x1883 >= -1 ;++1 x4801 -1 x1887 +1 x1883 >= 0 ;+-1 x4802 +1 x1888 >= 0 ;+-1 x4802 -1 x1884 >= -1 ;++1 x4802 -1 x1888 +1 x1884 >= 0 ;+-1 x4803 +1 x1889 >= 0 ;+-1 x4803 -1 x1885 >= -1 ;++1 x4803 -1 x1889 +1 x1885 >= 0 ;+-1 x4804 +1 x1890 >= 0 ;+-1 x4804 -1 x1886 >= -1 ;++1 x4804 -1 x1890 +1 x1886 >= 0 ;+-1 x4805 +1 x1891 >= 0 ;+-1 x4805 -1 x1887 >= -1 ;++1 x4805 -1 x1891 +1 x1887 >= 0 ;+-1 x4806 +1 x1892 >= 0 ;+-1 x4806 -1 x1888 >= -1 ;++1 x4806 -1 x1892 +1 x1888 >= 0 ;+-1 x4807 +1 x1893 >= 0 ;+-1 x4807 -1 x1889 >= -1 ;++1 x4807 -1 x1893 +1 x1889 >= 0 ;+-1 x4808 +1 x1894 >= 0 ;+-1 x4808 -1 x1890 >= -1 ;++1 x4808 -1 x1894 +1 x1890 >= 0 ;+-1 x4809 +1 x1895 >= 0 ;+-1 x4809 -1 x1891 >= -1 ;++1 x4809 -1 x1895 +1 x1891 >= 0 ;+-1 x4810 +1 x1896 >= 0 ;+-1 x4810 -1 x1892 >= -1 ;++1 x4810 -1 x1896 +1 x1892 >= 0 ;+-1 x4811 +1 x1897 >= 0 ;+-1 x4811 -1 x1893 >= -1 ;++1 x4811 -1 x1897 +1 x1893 >= 0 ;+-1 x4812 +1 x1898 >= 0 ;+-1 x4812 -1 x1894 >= -1 ;++1 x4812 -1 x1898 +1 x1894 >= 0 ;+-1 x4813 +1 x1899 >= 0 ;+-1 x4813 -1 x1895 >= -1 ;++1 x4813 -1 x1899 +1 x1895 >= 0 ;+-1 x4814 +1 x1900 >= 0 ;+-1 x4814 -1 x1896 >= -1 ;++1 x4814 -1 x1900 +1 x1896 >= 0 ;+-1 x4815 +1 x1901 >= 0 ;+-1 x4815 -1 x1897 >= -1 ;++1 x4815 -1 x1901 +1 x1897 >= 0 ;+-1 x4816 +1 x1902 >= 0 ;+-1 x4816 -1 x1898 >= -1 ;++1 x4816 -1 x1902 +1 x1898 >= 0 ;+-1 x4817 +1 x1903 >= 0 ;+-1 x4817 -1 x1899 >= -1 ;++1 x4817 -1 x1903 +1 x1899 >= 0 ;+-1 x4818 +1 x1904 >= 0 ;+-1 x4818 -1 x1900 >= -1 ;++1 x4818 -1 x1904 +1 x1900 >= 0 ;+-1 x4819 +1 x1905 >= 0 ;+-1 x4819 -1 x1901 >= -1 ;++1 x4819 -1 x1905 +1 x1901 >= 0 ;+-1 x4820 +1 x1906 >= 0 ;+-1 x4820 -1 x1902 >= -1 ;++1 x4820 -1 x1906 +1 x1902 >= 0 ;+-1 x4821 +1 x1907 >= 0 ;+-1 x4821 -1 x1903 >= -1 ;++1 x4821 -1 x1907 +1 x1903 >= 0 ;+-1 x4822 +1 x1908 >= 0 ;+-1 x4822 -1 x1904 >= -1 ;++1 x4822 -1 x1908 +1 x1904 >= 0 ;+-1 x4823 +1 x1909 >= 0 ;+-1 x4823 -1 x1905 >= -1 ;++1 x4823 -1 x1909 +1 x1905 >= 0 ;+-1 x4824 +1 x1910 >= 0 ;+-1 x4824 -1 x1906 >= -1 ;++1 x4824 -1 x1910 +1 x1906 >= 0 ;+-1 x4825 +1 x1911 >= 0 ;+-1 x4825 -1 x1907 >= -1 ;++1 x4825 -1 x1911 +1 x1907 >= 0 ;+-1 x4826 +1 x1912 >= 0 ;+-1 x4826 -1 x1908 >= -1 ;++1 x4826 -1 x1912 +1 x1908 >= 0 ;+-1 x4827 +1 x1913 >= 0 ;+-1 x4827 -1 x1909 >= -1 ;++1 x4827 -1 x1913 +1 x1909 >= 0 ;+-1 x4828 +1 x1914 >= 0 ;+-1 x4828 -1 x1910 >= -1 ;++1 x4828 -1 x1914 +1 x1910 >= 0 ;+-1 x4829 +1 x1915 >= 0 ;+-1 x4829 -1 x1911 >= -1 ;++1 x4829 -1 x1915 +1 x1911 >= 0 ;+-1 x4830 +1 x1916 >= 0 ;+-1 x4830 -1 x1912 >= -1 ;++1 x4830 -1 x1916 +1 x1912 >= 0 ;+-1 x4831 +1 x1917 >= 0 ;+-1 x4831 -1 x1913 >= -1 ;++1 x4831 -1 x1917 +1 x1913 >= 0 ;+-1 x4832 +1 x1918 >= 0 ;+-1 x4832 -1 x1914 >= -1 ;++1 x4832 -1 x1918 +1 x1914 >= 0 ;+-1 x4833 +1 x1919 >= 0 ;+-1 x4833 -1 x1915 >= -1 ;++1 x4833 -1 x1919 +1 x1915 >= 0 ;+-1 x4834 +1 x1920 >= 0 ;+-1 x4834 -1 x1916 >= -1 ;++1 x4834 -1 x1920 +1 x1916 >= 0 ;+-1 x4835 +1 x1921 >= 0 ;+-1 x4835 -1 x1917 >= -1 ;++1 x4835 -1 x1921 +1 x1917 >= 0 ;+-1 x4836 +1 x1922 >= 0 ;+-1 x4836 -1 x1918 >= -1 ;++1 x4836 -1 x1922 +1 x1918 >= 0 ;+-1 x4837 +1 x1923 >= 0 ;+-1 x4837 -1 x1919 >= -1 ;++1 x4837 -1 x1923 +1 x1919 >= 0 ;+-1 x4838 +1 x1924 >= 0 ;+-1 x4838 -1 x1920 >= -1 ;++1 x4838 -1 x1924 +1 x1920 >= 0 ;+-1 x4839 +1 x1925 >= 0 ;+-1 x4839 -1 x1921 >= -1 ;++1 x4839 -1 x1925 +1 x1921 >= 0 ;+-1 x4840 +1 x1926 >= 0 ;+-1 x4840 -1 x1922 >= -1 ;++1 x4840 -1 x1926 +1 x1922 >= 0 ;+-1 x4841 +1 x1927 >= 0 ;+-1 x4841 -1 x1923 >= -1 ;++1 x4841 -1 x1927 +1 x1923 >= 0 ;+-1 x4842 +1 x1928 >= 0 ;+-1 x4842 -1 x1924 >= -1 ;++1 x4842 -1 x1928 +1 x1924 >= 0 ;+-1 x4843 +1 x1929 >= 0 ;+-1 x4843 -1 x1925 >= -1 ;++1 x4843 -1 x1929 +1 x1925 >= 0 ;+-1 x4844 +1 x1930 >= 0 ;+-1 x4844 -1 x1926 >= -1 ;++1 x4844 -1 x1930 +1 x1926 >= 0 ;+-1 x4845 +1 x1931 >= 0 ;+-1 x4845 -1 x1927 >= -1 ;++1 x4845 -1 x1931 +1 x1927 >= 0 ;+-1 x4846 +1 x1932 >= 0 ;+-1 x4846 -1 x1928 >= -1 ;++1 x4846 -1 x1932 +1 x1928 >= 0 ;+-1 x4847 +1 x1933 >= 0 ;+-1 x4847 -1 x1929 >= -1 ;++1 x4847 -1 x1933 +1 x1929 >= 0 ;+-1 x4848 +1 x1934 >= 0 ;+-1 x4848 -1 x1930 >= -1 ;++1 x4848 -1 x1934 +1 x1930 >= 0 ;+-1 x4849 +1 x1935 >= 0 ;+-1 x4849 -1 x1931 >= -1 ;++1 x4849 -1 x1935 +1 x1931 >= 0 ;+-1 x4850 +1 x1936 >= 0 ;+-1 x4850 -1 x1932 >= -1 ;++1 x4850 -1 x1936 +1 x1932 >= 0 ;+-1 x4851 +1 x1937 >= 0 ;+-1 x4851 -1 x1933 >= -1 ;++1 x4851 -1 x1937 +1 x1933 >= 0 ;+-1 x4852 +1 x1938 >= 0 ;+-1 x4852 -1 x1934 >= -1 ;++1 x4852 -1 x1938 +1 x1934 >= 0 ;+-1 x4853 +1 x1939 >= 0 ;+-1 x4853 -1 x1935 >= -1 ;++1 x4853 -1 x1939 +1 x1935 >= 0 ;+-1 x4854 +1 x1940 >= 0 ;+-1 x4854 -1 x1936 >= -1 ;++1 x4854 -1 x1940 +1 x1936 >= 0 ;+-1 x4855 +1 x1941 >= 0 ;+-1 x4855 -1 x1937 >= -1 ;++1 x4855 -1 x1941 +1 x1937 >= 0 ;+-1 x4856 +1 x1942 >= 0 ;+-1 x4856 -1 x1938 >= -1 ;++1 x4856 -1 x1942 +1 x1938 >= 0 ;+-1 x4857 +1 x1943 >= 0 ;+-1 x4857 -1 x1939 >= -1 ;++1 x4857 -1 x1943 +1 x1939 >= 0 ;+-1 x4858 +1 x1944 >= 0 ;+-1 x4858 -1 x1940 >= -1 ;++1 x4858 -1 x1944 +1 x1940 >= 0 ;+-1 x4859 +1 x1945 >= 0 ;+-1 x4859 -1 x1941 >= -1 ;++1 x4859 -1 x1945 +1 x1941 >= 0 ;+-1 x4860 +1 x1946 >= 0 ;+-1 x4860 -1 x1942 >= -1 ;++1 x4860 -1 x1946 +1 x1942 >= 0 ;+-1 x4861 +1 x1947 >= 0 ;+-1 x4861 -1 x1943 >= -1 ;++1 x4861 -1 x1947 +1 x1943 >= 0 ;+-1 x4862 +1 x1948 >= 0 ;+-1 x4862 -1 x1944 >= -1 ;++1 x4862 -1 x1948 +1 x1944 >= 0 ;+-1 x4863 +1 x1949 >= 0 ;+-1 x4863 -1 x1945 >= -1 ;++1 x4863 -1 x1949 +1 x1945 >= 0 ;+-1 x4864 +1 x1950 >= 0 ;+-1 x4864 -1 x1946 >= -1 ;++1 x4864 -1 x1950 +1 x1946 >= 0 ;+-1 x4865 +1 x1951 >= 0 ;+-1 x4865 -1 x1947 >= -1 ;++1 x4865 -1 x1951 +1 x1947 >= 0 ;+-1 x4866 +1 x1952 >= 0 ;+-1 x4866 -1 x1948 >= -1 ;++1 x4866 -1 x1952 +1 x1948 >= 0 ;+-1 x4867 +1 x1953 >= 0 ;+-1 x4867 -1 x1949 >= -1 ;++1 x4867 -1 x1953 +1 x1949 >= 0 ;+-1 x4868 +1 x1954 >= 0 ;+-1 x4868 -1 x1950 >= -1 ;++1 x4868 -1 x1954 +1 x1950 >= 0 ;+-1 x4869 +1 x1955 >= 0 ;+-1 x4869 -1 x1951 >= -1 ;++1 x4869 -1 x1955 +1 x1951 >= 0 ;+-1 x4870 +1 x1956 >= 0 ;+-1 x4870 -1 x1952 >= -1 ;++1 x4870 -1 x1956 +1 x1952 >= 0 ;+-1 x4871 +1 x1957 >= 0 ;+-1 x4871 -1 x1953 >= -1 ;++1 x4871 -1 x1957 +1 x1953 >= 0 ;+-1 x4872 +1 x1958 >= 0 ;+-1 x4872 -1 x1954 >= -1 ;++1 x4872 -1 x1958 +1 x1954 >= 0 ;+-1 x4873 +1 x1959 >= 0 ;+-1 x4873 -1 x1955 >= -1 ;++1 x4873 -1 x1959 +1 x1955 >= 0 ;+-1 x4874 +1 x1960 >= 0 ;+-1 x4874 -1 x1956 >= -1 ;++1 x4874 -1 x1960 +1 x1956 >= 0 ;+-1 x4875 +1 x1961 >= 0 ;+-1 x4875 -1 x1957 >= -1 ;++1 x4875 -1 x1961 +1 x1957 >= 0 ;+-1 x4876 +1 x1962 >= 0 ;+-1 x4876 -1 x1958 >= -1 ;++1 x4876 -1 x1962 +1 x1958 >= 0 ;+-1 x4877 +1 x1963 >= 0 ;+-1 x4877 -1 x1959 >= -1 ;++1 x4877 -1 x1963 +1 x1959 >= 0 ;+-1 x4878 +1 x1964 >= 0 ;+-1 x4878 -1 x1960 >= -1 ;++1 x4878 -1 x1964 +1 x1960 >= 0 ;+-1 x4879 +1 x1965 >= 0 ;+-1 x4879 -1 x1961 >= -1 ;++1 x4879 -1 x1965 +1 x1961 >= 0 ;+-1 x4880 +1 x1966 >= 0 ;+-1 x4880 -1 x1962 >= -1 ;++1 x4880 -1 x1966 +1 x1962 >= 0 ;+-1 x4881 +1 x1967 >= 0 ;+-1 x4881 -1 x1963 >= -1 ;++1 x4881 -1 x1967 +1 x1963 >= 0 ;+-1 x4882 +1 x1968 >= 0 ;+-1 x4882 -1 x1964 >= -1 ;++1 x4882 -1 x1968 +1 x1964 >= 0 ;+-1 x4883 +1 x1969 >= 0 ;+-1 x4883 -1 x1965 >= -1 ;++1 x4883 -1 x1969 +1 x1965 >= 0 ;+-1 x4884 +1 x1970 >= 0 ;+-1 x4884 -1 x1966 >= -1 ;++1 x4884 -1 x1970 +1 x1966 >= 0 ;+-1 x4885 +1 x1971 >= 0 ;+-1 x4885 -1 x1967 >= -1 ;++1 x4885 -1 x1971 +1 x1967 >= 0 ;+-1 x4886 +1 x1972 >= 0 ;+-1 x4886 -1 x1968 >= -1 ;++1 x4886 -1 x1972 +1 x1968 >= 0 ;+-1 x4887 +1 x1973 >= 0 ;+-1 x4887 -1 x1969 >= -1 ;++1 x4887 -1 x1973 +1 x1969 >= 0 ;+-1 x4888 +1 x1974 >= 0 ;+-1 x4888 -1 x1970 >= -1 ;++1 x4888 -1 x1974 +1 x1970 >= 0 ;+-1 x4889 +1 x1975 >= 0 ;++1 x4889 -1 x1975 >= 0 ;+-1 x4890 +1 x1976 >= 0 ;++1 x4890 -1 x1976 >= 0 ;+-1 x4891 +1 x1977 >= 0 ;++1 x4891 -1 x1977 >= 0 ;+-1 x4892 +1 x1978 >= 0 ;++1 x4892 -1 x1978 >= 0 ;+-1 x4893 +1 x1979 >= 0 ;+-1 x4893 -1 x1975 >= -1 ;++1 x4893 -1 x1979 +1 x1975 >= 0 ;+-1 x4894 +1 x1980 >= 0 ;+-1 x4894 -1 x1976 >= -1 ;++1 x4894 -1 x1980 +1 x1976 >= 0 ;+-1 x4895 +1 x1981 >= 0 ;+-1 x4895 -1 x1977 >= -1 ;++1 x4895 -1 x1981 +1 x1977 >= 0 ;+-1 x4896 +1 x1982 >= 0 ;+-1 x4896 -1 x1978 >= -1 ;++1 x4896 -1 x1982 +1 x1978 >= 0 ;+-1 x4897 +1 x1983 >= 0 ;+-1 x4897 -1 x1979 >= -1 ;++1 x4897 -1 x1983 +1 x1979 >= 0 ;+-1 x4898 +1 x1984 >= 0 ;+-1 x4898 -1 x1980 >= -1 ;++1 x4898 -1 x1984 +1 x1980 >= 0 ;+-1 x4899 +1 x1985 >= 0 ;+-1 x4899 -1 x1981 >= -1 ;++1 x4899 -1 x1985 +1 x1981 >= 0 ;+-1 x4900 +1 x1986 >= 0 ;+-1 x4900 -1 x1982 >= -1 ;++1 x4900 -1 x1986 +1 x1982 >= 0 ;+-1 x4901 +1 x1987 >= 0 ;+-1 x4901 -1 x1983 >= -1 ;++1 x4901 -1 x1987 +1 x1983 >= 0 ;+-1 x4902 +1 x1988 >= 0 ;+-1 x4902 -1 x1984 >= -1 ;++1 x4902 -1 x1988 +1 x1984 >= 0 ;+-1 x4903 +1 x1989 >= 0 ;+-1 x4903 -1 x1985 >= -1 ;++1 x4903 -1 x1989 +1 x1985 >= 0 ;+-1 x4904 +1 x1990 >= 0 ;+-1 x4904 -1 x1986 >= -1 ;++1 x4904 -1 x1990 +1 x1986 >= 0 ;+-1 x4905 +1 x1991 >= 0 ;+-1 x4905 -1 x1987 >= -1 ;++1 x4905 -1 x1991 +1 x1987 >= 0 ;+-1 x4906 +1 x1992 >= 0 ;+-1 x4906 -1 x1988 >= -1 ;++1 x4906 -1 x1992 +1 x1988 >= 0 ;+-1 x4907 +1 x1993 >= 0 ;+-1 x4907 -1 x1989 >= -1 ;++1 x4907 -1 x1993 +1 x1989 >= 0 ;+-1 x4908 +1 x1994 >= 0 ;+-1 x4908 -1 x1990 >= -1 ;++1 x4908 -1 x1994 +1 x1990 >= 0 ;+-1 x4909 +1 x1995 >= 0 ;+-1 x4909 -1 x1991 >= -1 ;++1 x4909 -1 x1995 +1 x1991 >= 0 ;+-1 x4910 +1 x1996 >= 0 ;+-1 x4910 -1 x1992 >= -1 ;++1 x4910 -1 x1996 +1 x1992 >= 0 ;+-1 x4911 +1 x1997 >= 0 ;+-1 x4911 -1 x1993 >= -1 ;++1 x4911 -1 x1997 +1 x1993 >= 0 ;+-1 x4912 +1 x1998 >= 0 ;+-1 x4912 -1 x1994 >= -1 ;++1 x4912 -1 x1998 +1 x1994 >= 0 ;+-1 x4913 +1 x1999 >= 0 ;+-1 x4913 -1 x1995 >= -1 ;++1 x4913 -1 x1999 +1 x1995 >= 0 ;+-1 x4914 +1 x2000 >= 0 ;+-1 x4914 -1 x1996 >= -1 ;++1 x4914 -1 x2000 +1 x1996 >= 0 ;+-1 x4915 +1 x2001 >= 0 ;+-1 x4915 -1 x1997 >= -1 ;++1 x4915 -1 x2001 +1 x1997 >= 0 ;+-1 x4916 +1 x2002 >= 0 ;+-1 x4916 -1 x1998 >= -1 ;++1 x4916 -1 x2002 +1 x1998 >= 0 ;+-1 x4917 +1 x2003 >= 0 ;+-1 x4917 -1 x1999 >= -1 ;++1 x4917 -1 x2003 +1 x1999 >= 0 ;+-1 x4918 +1 x2004 >= 0 ;+-1 x4918 -1 x2000 >= -1 ;++1 x4918 -1 x2004 +1 x2000 >= 0 ;+-1 x4919 +1 x2005 >= 0 ;+-1 x4919 -1 x2001 >= -1 ;++1 x4919 -1 x2005 +1 x2001 >= 0 ;+-1 x4920 +1 x2006 >= 0 ;+-1 x4920 -1 x2002 >= -1 ;++1 x4920 -1 x2006 +1 x2002 >= 0 ;+-1 x4921 +1 x2007 >= 0 ;+-1 x4921 -1 x2003 >= -1 ;++1 x4921 -1 x2007 +1 x2003 >= 0 ;+-1 x4922 +1 x2008 >= 0 ;+-1 x4922 -1 x2004 >= -1 ;++1 x4922 -1 x2008 +1 x2004 >= 0 ;+-1 x4923 +1 x2009 >= 0 ;+-1 x4923 -1 x2005 >= -1 ;++1 x4923 -1 x2009 +1 x2005 >= 0 ;+-1 x4924 +1 x2010 >= 0 ;+-1 x4924 -1 x2006 >= -1 ;++1 x4924 -1 x2010 +1 x2006 >= 0 ;+-1 x4925 +1 x2011 >= 0 ;+-1 x4925 -1 x2007 >= -1 ;++1 x4925 -1 x2011 +1 x2007 >= 0 ;+-1 x4926 +1 x2012 >= 0 ;+-1 x4926 -1 x2008 >= -1 ;++1 x4926 -1 x2012 +1 x2008 >= 0 ;+-1 x4927 +1 x2013 >= 0 ;+-1 x4927 -1 x2009 >= -1 ;++1 x4927 -1 x2013 +1 x2009 >= 0 ;+-1 x4928 +1 x2014 >= 0 ;+-1 x4928 -1 x2010 >= -1 ;++1 x4928 -1 x2014 +1 x2010 >= 0 ;+-1 x4929 +1 x2015 >= 0 ;+-1 x4929 -1 x2011 >= -1 ;++1 x4929 -1 x2015 +1 x2011 >= 0 ;+-1 x4930 +1 x2016 >= 0 ;+-1 x4930 -1 x2012 >= -1 ;++1 x4930 -1 x2016 +1 x2012 >= 0 ;+-1 x4931 +1 x2017 >= 0 ;+-1 x4931 -1 x2013 >= -1 ;++1 x4931 -1 x2017 +1 x2013 >= 0 ;+-1 x4932 +1 x2018 >= 0 ;+-1 x4932 -1 x2014 >= -1 ;++1 x4932 -1 x2018 +1 x2014 >= 0 ;+-1 x4933 +1 x2019 >= 0 ;+-1 x4933 -1 x2015 >= -1 ;++1 x4933 -1 x2019 +1 x2015 >= 0 ;+-1 x4934 +1 x2020 >= 0 ;+-1 x4934 -1 x2016 >= -1 ;++1 x4934 -1 x2020 +1 x2016 >= 0 ;+-1 x4935 +1 x2021 >= 0 ;+-1 x4935 -1 x2017 >= -1 ;++1 x4935 -1 x2021 +1 x2017 >= 0 ;+-1 x4936 +1 x2022 >= 0 ;+-1 x4936 -1 x2018 >= -1 ;++1 x4936 -1 x2022 +1 x2018 >= 0 ;+-1 x4937 +1 x2023 >= 0 ;+-1 x4937 -1 x2019 >= -1 ;++1 x4937 -1 x2023 +1 x2019 >= 0 ;+-1 x4938 +1 x2024 >= 0 ;+-1 x4938 -1 x2020 >= -1 ;++1 x4938 -1 x2024 +1 x2020 >= 0 ;+-1 x4939 +1 x2025 >= 0 ;+-1 x4939 -1 x2021 >= -1 ;++1 x4939 -1 x2025 +1 x2021 >= 0 ;+-1 x4940 +1 x2026 >= 0 ;+-1 x4940 -1 x2022 >= -1 ;++1 x4940 -1 x2026 +1 x2022 >= 0 ;+-1 x4941 +1 x2027 >= 0 ;+-1 x4941 -1 x2023 >= -1 ;++1 x4941 -1 x2027 +1 x2023 >= 0 ;+-1 x4942 +1 x2028 >= 0 ;+-1 x4942 -1 x2024 >= -1 ;++1 x4942 -1 x2028 +1 x2024 >= 0 ;+-1 x4943 +1 x2029 >= 0 ;+-1 x4943 -1 x2025 >= -1 ;++1 x4943 -1 x2029 +1 x2025 >= 0 ;+-1 x4944 +1 x2030 >= 0 ;+-1 x4944 -1 x2026 >= -1 ;++1 x4944 -1 x2030 +1 x2026 >= 0 ;+-1 x4945 +1 x2031 >= 0 ;+-1 x4945 -1 x2027 >= -1 ;++1 x4945 -1 x2031 +1 x2027 >= 0 ;+-1 x4946 +1 x2032 >= 0 ;+-1 x4946 -1 x2028 >= -1 ;++1 x4946 -1 x2032 +1 x2028 >= 0 ;+-1 x4947 +1 x2033 >= 0 ;+-1 x4947 -1 x2029 >= -1 ;++1 x4947 -1 x2033 +1 x2029 >= 0 ;+-1 x4948 +1 x2034 >= 0 ;+-1 x4948 -1 x2030 >= -1 ;++1 x4948 -1 x2034 +1 x2030 >= 0 ;+-1 x4949 +1 x2035 >= 0 ;+-1 x4949 -1 x2031 >= -1 ;++1 x4949 -1 x2035 +1 x2031 >= 0 ;+-1 x4950 +1 x2036 >= 0 ;+-1 x4950 -1 x2032 >= -1 ;++1 x4950 -1 x2036 +1 x2032 >= 0 ;+-1 x4951 +1 x2037 >= 0 ;+-1 x4951 -1 x2033 >= -1 ;++1 x4951 -1 x2037 +1 x2033 >= 0 ;+-1 x4952 +1 x2038 >= 0 ;+-1 x4952 -1 x2034 >= -1 ;++1 x4952 -1 x2038 +1 x2034 >= 0 ;+-1 x4953 +1 x2039 >= 0 ;+-1 x4953 -1 x2035 >= -1 ;++1 x4953 -1 x2039 +1 x2035 >= 0 ;+-1 x4954 +1 x2040 >= 0 ;+-1 x4954 -1 x2036 >= -1 ;++1 x4954 -1 x2040 +1 x2036 >= 0 ;+-1 x4955 +1 x2041 >= 0 ;+-1 x4955 -1 x2037 >= -1 ;++1 x4955 -1 x2041 +1 x2037 >= 0 ;+-1 x4956 +1 x2042 >= 0 ;+-1 x4956 -1 x2038 >= -1 ;++1 x4956 -1 x2042 +1 x2038 >= 0 ;+-1 x4957 +1 x2043 >= 0 ;+-1 x4957 -1 x2039 >= -1 ;++1 x4957 -1 x2043 +1 x2039 >= 0 ;+-1 x4958 +1 x2044 >= 0 ;+-1 x4958 -1 x2040 >= -1 ;++1 x4958 -1 x2044 +1 x2040 >= 0 ;+-1 x4959 +1 x2045 >= 0 ;+-1 x4959 -1 x2041 >= -1 ;++1 x4959 -1 x2045 +1 x2041 >= 0 ;+-1 x4960 +1 x2046 >= 0 ;+-1 x4960 -1 x2042 >= -1 ;++1 x4960 -1 x2046 +1 x2042 >= 0 ;+-1 x4961 +1 x2047 >= 0 ;+-1 x4961 -1 x2043 >= -1 ;++1 x4961 -1 x2047 +1 x2043 >= 0 ;+-1 x4962 +1 x2048 >= 0 ;+-1 x4962 -1 x2044 >= -1 ;++1 x4962 -1 x2048 +1 x2044 >= 0 ;+-1 x4963 +1 x2049 >= 0 ;+-1 x4963 -1 x2045 >= -1 ;++1 x4963 -1 x2049 +1 x2045 >= 0 ;+-1 x4964 +1 x2050 >= 0 ;+-1 x4964 -1 x2046 >= -1 ;++1 x4964 -1 x2050 +1 x2046 >= 0 ;+-1 x4965 +1 x2051 >= 0 ;+-1 x4965 -1 x2047 >= -1 ;++1 x4965 -1 x2051 +1 x2047 >= 0 ;+-1 x4966 +1 x2052 >= 0 ;+-1 x4966 -1 x2048 >= -1 ;++1 x4966 -1 x2052 +1 x2048 >= 0 ;+-1 x4967 +1 x2053 >= 0 ;+-1 x4967 -1 x2049 >= -1 ;++1 x4967 -1 x2053 +1 x2049 >= 0 ;+-1 x4968 +1 x2054 >= 0 ;+-1 x4968 -1 x2050 >= -1 ;++1 x4968 -1 x2054 +1 x2050 >= 0 ;+-1 x4969 +1 x2055 >= 0 ;+-1 x4969 -1 x2051 >= -1 ;++1 x4969 -1 x2055 +1 x2051 >= 0 ;+-1 x4970 +1 x2056 >= 0 ;+-1 x4970 -1 x2052 >= -1 ;++1 x4970 -1 x2056 +1 x2052 >= 0 ;+-1 x4971 +1 x2057 >= 0 ;+-1 x4971 -1 x2053 >= -1 ;++1 x4971 -1 x2057 +1 x2053 >= 0 ;+-1 x4972 +1 x2058 >= 0 ;+-1 x4972 -1 x2054 >= -1 ;++1 x4972 -1 x2058 +1 x2054 >= 0 ;+-1 x4973 +1 x2059 >= 0 ;+-1 x4973 -1 x2055 >= -1 ;++1 x4973 -1 x2059 +1 x2055 >= 0 ;+-1 x4974 +1 x2060 >= 0 ;+-1 x4974 -1 x2056 >= -1 ;++1 x4974 -1 x2060 +1 x2056 >= 0 ;+-1 x4975 +1 x2061 >= 0 ;+-1 x4975 -1 x2057 >= -1 ;++1 x4975 -1 x2061 +1 x2057 >= 0 ;+-1 x4976 +1 x2062 >= 0 ;+-1 x4976 -1 x2058 >= -1 ;++1 x4976 -1 x2062 +1 x2058 >= 0 ;+-1 x4977 +1 x2063 >= 0 ;+-1 x4977 -1 x2059 >= -1 ;++1 x4977 -1 x2063 +1 x2059 >= 0 ;+-1 x4978 +1 x2064 >= 0 ;+-1 x4978 -1 x2060 >= -1 ;++1 x4978 -1 x2064 +1 x2060 >= 0 ;+-1 x4979 +1 x2065 >= 0 ;+-1 x4979 -1 x2061 >= -1 ;++1 x4979 -1 x2065 +1 x2061 >= 0 ;+-1 x4980 +1 x2066 >= 0 ;+-1 x4980 -1 x2062 >= -1 ;++1 x4980 -1 x2066 +1 x2062 >= 0 ;+-1 x4981 +1 x2067 >= 0 ;+-1 x4981 -1 x2063 >= -1 ;++1 x4981 -1 x2067 +1 x2063 >= 0 ;+-1 x4982 +1 x2068 >= 0 ;+-1 x4982 -1 x2064 >= -1 ;++1 x4982 -1 x2068 +1 x2064 >= 0 ;+-1 x4983 +1 x2069 >= 0 ;++1 x4983 -1 x2069 >= 0 ;+-1 x4984 +1 x2070 >= 0 ;++1 x4984 -1 x2070 >= 0 ;+-1 x4985 +1 x2071 >= 0 ;++1 x4985 -1 x2071 >= 0 ;+-1 x4986 +1 x2072 >= 0 ;++1 x4986 -1 x2072 >= 0 ;+-1 x4987 +1 x2073 >= 0 ;++1 x4987 -1 x2073 >= 0 ;+-1 x4988 +1 x2074 >= 0 ;++1 x4988 -1 x2074 >= 0 ;+-1 x4989 +1 x2075 >= 0 ;++1 x4989 -1 x2075 >= 0 ;+-1 x4990 +1 x2076 >= 0 ;+-1 x4990 -1 x2069 >= -1 ;++1 x4990 -1 x2076 +1 x2069 >= 0 ;+-1 x4991 +1 x2077 >= 0 ;+-1 x4991 -1 x2070 >= -1 ;++1 x4991 -1 x2077 +1 x2070 >= 0 ;+-1 x4992 +1 x2078 >= 0 ;+-1 x4992 -1 x2071 >= -1 ;++1 x4992 -1 x2078 +1 x2071 >= 0 ;+-1 x4993 +1 x2079 >= 0 ;+-1 x4993 -1 x2072 >= -1 ;++1 x4993 -1 x2079 +1 x2072 >= 0 ;+-1 x4994 +1 x2080 >= 0 ;+-1 x4994 -1 x2073 >= -1 ;++1 x4994 -1 x2080 +1 x2073 >= 0 ;+-1 x4995 +1 x2081 >= 0 ;+-1 x4995 -1 x2074 >= -1 ;++1 x4995 -1 x2081 +1 x2074 >= 0 ;+-1 x4996 +1 x2082 >= 0 ;+-1 x4996 -1 x2075 >= -1 ;++1 x4996 -1 x2082 +1 x2075 >= 0 ;+-1 x4997 +1 x2083 >= 0 ;+-1 x4997 -1 x2076 >= -1 ;++1 x4997 -1 x2083 +1 x2076 >= 0 ;+-1 x4998 +1 x2084 >= 0 ;+-1 x4998 -1 x2077 >= -1 ;++1 x4998 -1 x2084 +1 x2077 >= 0 ;+-1 x4999 +1 x2085 >= 0 ;+-1 x4999 -1 x2078 >= -1 ;++1 x4999 -1 x2085 +1 x2078 >= 0 ;+-1 x5000 +1 x2086 >= 0 ;+-1 x5000 -1 x2079 >= -1 ;++1 x5000 -1 x2086 +1 x2079 >= 0 ;+-1 x5001 +1 x2087 >= 0 ;+-1 x5001 -1 x2080 >= -1 ;++1 x5001 -1 x2087 +1 x2080 >= 0 ;+-1 x5002 +1 x2088 >= 0 ;+-1 x5002 -1 x2081 >= -1 ;++1 x5002 -1 x2088 +1 x2081 >= 0 ;+-1 x5003 +1 x2089 >= 0 ;+-1 x5003 -1 x2082 >= -1 ;++1 x5003 -1 x2089 +1 x2082 >= 0 ;+-1 x5004 +1 x2090 >= 0 ;+-1 x5004 -1 x2083 >= -1 ;++1 x5004 -1 x2090 +1 x2083 >= 0 ;+-1 x5005 +1 x2091 >= 0 ;+-1 x5005 -1 x2084 >= -1 ;++1 x5005 -1 x2091 +1 x2084 >= 0 ;+-1 x5006 +1 x2092 >= 0 ;+-1 x5006 -1 x2085 >= -1 ;++1 x5006 -1 x2092 +1 x2085 >= 0 ;+-1 x5007 +1 x2093 >= 0 ;+-1 x5007 -1 x2086 >= -1 ;++1 x5007 -1 x2093 +1 x2086 >= 0 ;+-1 x5008 +1 x2094 >= 0 ;+-1 x5008 -1 x2087 >= -1 ;++1 x5008 -1 x2094 +1 x2087 >= 0 ;+-1 x5009 +1 x2095 >= 0 ;+-1 x5009 -1 x2088 >= -1 ;++1 x5009 -1 x2095 +1 x2088 >= 0 ;+-1 x5010 +1 x2096 >= 0 ;+-1 x5010 -1 x2089 >= -1 ;++1 x5010 -1 x2096 +1 x2089 >= 0 ;+-1 x5011 +1 x2097 >= 0 ;+-1 x5011 -1 x2090 >= -1 ;++1 x5011 -1 x2097 +1 x2090 >= 0 ;+-1 x5012 +1 x2098 >= 0 ;+-1 x5012 -1 x2091 >= -1 ;++1 x5012 -1 x2098 +1 x2091 >= 0 ;+-1 x5013 +1 x2099 >= 0 ;+-1 x5013 -1 x2092 >= -1 ;++1 x5013 -1 x2099 +1 x2092 >= 0 ;+-1 x5014 +1 x2100 >= 0 ;+-1 x5014 -1 x2093 >= -1 ;++1 x5014 -1 x2100 +1 x2093 >= 0 ;+-1 x5015 +1 x2101 >= 0 ;+-1 x5015 -1 x2094 >= -1 ;++1 x5015 -1 x2101 +1 x2094 >= 0 ;+-1 x5016 +1 x2102 >= 0 ;+-1 x5016 -1 x2095 >= -1 ;++1 x5016 -1 x2102 +1 x2095 >= 0 ;+-1 x5017 +1 x2103 >= 0 ;+-1 x5017 -1 x2096 >= -1 ;++1 x5017 -1 x2103 +1 x2096 >= 0 ;+-1 x5018 +1 x2104 >= 0 ;+-1 x5018 -1 x2097 >= -1 ;++1 x5018 -1 x2104 +1 x2097 >= 0 ;+-1 x5019 +1 x2105 >= 0 ;+-1 x5019 -1 x2098 >= -1 ;++1 x5019 -1 x2105 +1 x2098 >= 0 ;+-1 x5020 +1 x2106 >= 0 ;+-1 x5020 -1 x2099 >= -1 ;++1 x5020 -1 x2106 +1 x2099 >= 0 ;+-1 x5021 +1 x2107 >= 0 ;+-1 x5021 -1 x2100 >= -1 ;++1 x5021 -1 x2107 +1 x2100 >= 0 ;+-1 x5022 +1 x2108 >= 0 ;+-1 x5022 -1 x2101 >= -1 ;++1 x5022 -1 x2108 +1 x2101 >= 0 ;+-1 x5023 +1 x2109 >= 0 ;+-1 x5023 -1 x2102 >= -1 ;++1 x5023 -1 x2109 +1 x2102 >= 0 ;+-1 x5024 +1 x2110 >= 0 ;+-1 x5024 -1 x2103 >= -1 ;++1 x5024 -1 x2110 +1 x2103 >= 0 ;+-1 x5025 +1 x2111 >= 0 ;+-1 x5025 -1 x2104 >= -1 ;++1 x5025 -1 x2111 +1 x2104 >= 0 ;+-1 x5026 +1 x2112 >= 0 ;+-1 x5026 -1 x2105 >= -1 ;++1 x5026 -1 x2112 +1 x2105 >= 0 ;+-1 x5027 +1 x2113 >= 0 ;+-1 x5027 -1 x2106 >= -1 ;++1 x5027 -1 x2113 +1 x2106 >= 0 ;+-1 x5028 +1 x2114 >= 0 ;+-1 x5028 -1 x2107 >= -1 ;++1 x5028 -1 x2114 +1 x2107 >= 0 ;+-1 x5029 +1 x2115 >= 0 ;+-1 x5029 -1 x2108 >= -1 ;++1 x5029 -1 x2115 +1 x2108 >= 0 ;+-1 x5030 +1 x2116 >= 0 ;+-1 x5030 -1 x2109 >= -1 ;++1 x5030 -1 x2116 +1 x2109 >= 0 ;+-1 x5031 +1 x2117 >= 0 ;+-1 x5031 -1 x2110 >= -1 ;++1 x5031 -1 x2117 +1 x2110 >= 0 ;+-1 x5032 +1 x2118 >= 0 ;+-1 x5032 -1 x2111 >= -1 ;++1 x5032 -1 x2118 +1 x2111 >= 0 ;+-1 x5033 +1 x2119 >= 0 ;+-1 x5033 -1 x2112 >= -1 ;++1 x5033 -1 x2119 +1 x2112 >= 0 ;+-1 x5034 +1 x2120 >= 0 ;+-1 x5034 -1 x2113 >= -1 ;++1 x5034 -1 x2120 +1 x2113 >= 0 ;+-1 x5035 +1 x2121 >= 0 ;+-1 x5035 -1 x2114 >= -1 ;++1 x5035 -1 x2121 +1 x2114 >= 0 ;+-1 x5036 +1 x2122 >= 0 ;+-1 x5036 -1 x2115 >= -1 ;++1 x5036 -1 x2122 +1 x2115 >= 0 ;+-1 x5037 +1 x2123 >= 0 ;+-1 x5037 -1 x2116 >= -1 ;++1 x5037 -1 x2123 +1 x2116 >= 0 ;+-1 x5038 +1 x2124 >= 0 ;+-1 x5038 -1 x2117 >= -1 ;++1 x5038 -1 x2124 +1 x2117 >= 0 ;+-1 x5039 +1 x2125 >= 0 ;+-1 x5039 -1 x2118 >= -1 ;++1 x5039 -1 x2125 +1 x2118 >= 0 ;+-1 x5040 +1 x2126 >= 0 ;+-1 x5040 -1 x2119 >= -1 ;++1 x5040 -1 x2126 +1 x2119 >= 0 ;+-1 x5041 +1 x2127 >= 0 ;+-1 x5041 -1 x2120 >= -1 ;++1 x5041 -1 x2127 +1 x2120 >= 0 ;+-1 x5042 +1 x2128 >= 0 ;+-1 x5042 -1 x2121 >= -1 ;++1 x5042 -1 x2128 +1 x2121 >= 0 ;+-1 x5043 +1 x2129 >= 0 ;+-1 x5043 -1 x2122 >= -1 ;++1 x5043 -1 x2129 +1 x2122 >= 0 ;+-1 x5044 +1 x2130 >= 0 ;+-1 x5044 -1 x2123 >= -1 ;++1 x5044 -1 x2130 +1 x2123 >= 0 ;+-1 x5045 +1 x2131 >= 0 ;+-1 x5045 -1 x2124 >= -1 ;++1 x5045 -1 x2131 +1 x2124 >= 0 ;+-1 x5046 +1 x2132 >= 0 ;+-1 x5046 -1 x2125 >= -1 ;++1 x5046 -1 x2132 +1 x2125 >= 0 ;+-1 x5047 +1 x2133 >= 0 ;+-1 x5047 -1 x2126 >= -1 ;++1 x5047 -1 x2133 +1 x2126 >= 0 ;+-1 x5048 +1 x2134 >= 0 ;+-1 x5048 -1 x2127 >= -1 ;++1 x5048 -1 x2134 +1 x2127 >= 0 ;+-1 x5049 +1 x2135 >= 0 ;+-1 x5049 -1 x2128 >= -1 ;++1 x5049 -1 x2135 +1 x2128 >= 0 ;+-1 x5050 +1 x2136 >= 0 ;+-1 x5050 -1 x2129 >= -1 ;++1 x5050 -1 x2136 +1 x2129 >= 0 ;+-1 x5051 +1 x2137 >= 0 ;+-1 x5051 -1 x2130 >= -1 ;++1 x5051 -1 x2137 +1 x2130 >= 0 ;+-1 x5052 +1 x2138 >= 0 ;+-1 x5052 -1 x2131 >= -1 ;++1 x5052 -1 x2138 +1 x2131 >= 0 ;+-1 x5053 +1 x2139 >= 0 ;+-1 x5053 -1 x2132 >= -1 ;++1 x5053 -1 x2139 +1 x2132 >= 0 ;+-1 x5054 +1 x2140 >= 0 ;+-1 x5054 -1 x2133 >= -1 ;++1 x5054 -1 x2140 +1 x2133 >= 0 ;+-1 x5055 +1 x2141 >= 0 ;+-1 x5055 -1 x2134 >= -1 ;++1 x5055 -1 x2141 +1 x2134 >= 0 ;+-1 x5056 +1 x2142 >= 0 ;+-1 x5056 -1 x2135 >= -1 ;++1 x5056 -1 x2142 +1 x2135 >= 0 ;+-1 x5057 +1 x2143 >= 0 ;+-1 x5057 -1 x2136 >= -1 ;++1 x5057 -1 x2143 +1 x2136 >= 0 ;+-1 x5058 +1 x2144 >= 0 ;+-1 x5058 -1 x2137 >= -1 ;++1 x5058 -1 x2144 +1 x2137 >= 0 ;+-1 x5059 +1 x2145 >= 0 ;+-1 x5059 -1 x2138 >= -1 ;++1 x5059 -1 x2145 +1 x2138 >= 0 ;+-1 x5060 +1 x2146 >= 0 ;+-1 x5060 -1 x2139 >= -1 ;++1 x5060 -1 x2146 +1 x2139 >= 0 ;+-1 x5061 +1 x2147 >= 0 ;+-1 x5061 -1 x2140 >= -1 ;++1 x5061 -1 x2147 +1 x2140 >= 0 ;+-1 x5062 +1 x2148 >= 0 ;+-1 x5062 -1 x2141 >= -1 ;++1 x5062 -1 x2148 +1 x2141 >= 0 ;+-1 x5063 +1 x2149 >= 0 ;+-1 x5063 -1 x2142 >= -1 ;++1 x5063 -1 x2149 +1 x2142 >= 0 ;+-1 x5064 +1 x2150 >= 0 ;+-1 x5064 -1 x2143 >= -1 ;++1 x5064 -1 x2150 +1 x2143 >= 0 ;+-1 x5065 +1 x2151 >= 0 ;+-1 x5065 -1 x2144 >= -1 ;++1 x5065 -1 x2151 +1 x2144 >= 0 ;+-1 x5066 +1 x2152 >= 0 ;+-1 x5066 -1 x2145 >= -1 ;++1 x5066 -1 x2152 +1 x2145 >= 0 ;+-1 x5067 +1 x2153 >= 0 ;+-1 x5067 -1 x2146 >= -1 ;++1 x5067 -1 x2153 +1 x2146 >= 0 ;+-1 x5068 +1 x2154 >= 0 ;+-1 x5068 -1 x2147 >= -1 ;++1 x5068 -1 x2154 +1 x2147 >= 0 ;+-1 x5069 +1 x2155 >= 0 ;+-1 x5069 -1 x2148 >= -1 ;++1 x5069 -1 x2155 +1 x2148 >= 0 ;+-1 x5070 +1 x2156 >= 0 ;+-1 x5070 -1 x2149 >= -1 ;++1 x5070 -1 x2156 +1 x2149 >= 0 ;+-1 x5071 +1 x2157 >= 0 ;+-1 x5071 -1 x2150 >= -1 ;++1 x5071 -1 x2157 +1 x2150 >= 0 ;+-1 x5072 +1 x2158 >= 0 ;+-1 x5072 -1 x2151 >= -1 ;++1 x5072 -1 x2158 +1 x2151 >= 0 ;+-1 x5073 +1 x2159 >= 0 ;+-1 x5073 -1 x2152 >= -1 ;++1 x5073 -1 x2159 +1 x2152 >= 0 ;+-1 x5074 +1 x2160 >= 0 ;+-1 x5074 -1 x2153 >= -1 ;++1 x5074 -1 x2160 +1 x2153 >= 0 ;+-1 x5075 +1 x2161 >= 0 ;+-1 x5075 -1 x2154 >= -1 ;++1 x5075 -1 x2161 +1 x2154 >= 0 ;+-1 x5076 +1 x2162 >= 0 ;+-1 x5076 -1 x2155 >= -1 ;++1 x5076 -1 x2162 +1 x2155 >= 0 ;+-1 x5077 +1 x2163 >= 0 ;++1 x5077 -1 x2163 >= 0 ;+-1 x5078 +1 x2164 >= 0 ;++1 x5078 -1 x2164 >= 0 ;+-1 x5079 +1 x2165 >= 0 ;++1 x5079 -1 x2165 >= 0 ;+-1 x5080 +1 x2166 >= 0 ;+-1 x5080 -1 x2163 >= -1 ;++1 x5080 -1 x2166 +1 x2163 >= 0 ;+-1 x5081 +1 x2167 >= 0 ;+-1 x5081 -1 x2164 >= -1 ;++1 x5081 -1 x2167 +1 x2164 >= 0 ;+-1 x5082 +1 x2168 >= 0 ;+-1 x5082 -1 x2165 >= -1 ;++1 x5082 -1 x2168 +1 x2165 >= 0 ;+-1 x5083 +1 x2169 >= 0 ;+-1 x5083 -1 x2166 >= -1 ;++1 x5083 -1 x2169 +1 x2166 >= 0 ;+-1 x5084 +1 x2170 >= 0 ;+-1 x5084 -1 x2167 >= -1 ;++1 x5084 -1 x2170 +1 x2167 >= 0 ;+-1 x5085 +1 x2171 >= 0 ;+-1 x5085 -1 x2168 >= -1 ;++1 x5085 -1 x2171 +1 x2168 >= 0 ;+-1 x5086 +1 x2172 >= 0 ;+-1 x5086 -1 x2169 >= -1 ;++1 x5086 -1 x2172 +1 x2169 >= 0 ;+-1 x5087 +1 x2173 >= 0 ;+-1 x5087 -1 x2170 >= -1 ;++1 x5087 -1 x2173 +1 x2170 >= 0 ;+-1 x5088 +1 x2174 >= 0 ;+-1 x5088 -1 x2171 >= -1 ;++1 x5088 -1 x2174 +1 x2171 >= 0 ;+-1 x5089 +1 x2175 >= 0 ;+-1 x5089 -1 x2172 >= -1 ;++1 x5089 -1 x2175 +1 x2172 >= 0 ;+-1 x5090 +1 x2176 >= 0 ;+-1 x5090 -1 x2173 >= -1 ;++1 x5090 -1 x2176 +1 x2173 >= 0 ;+-1 x5091 +1 x2177 >= 0 ;+-1 x5091 -1 x2174 >= -1 ;++1 x5091 -1 x2177 +1 x2174 >= 0 ;+-1 x5092 +1 x2178 >= 0 ;+-1 x5092 -1 x2175 >= -1 ;++1 x5092 -1 x2178 +1 x2175 >= 0 ;+-1 x5093 +1 x2179 >= 0 ;+-1 x5093 -1 x2176 >= -1 ;++1 x5093 -1 x2179 +1 x2176 >= 0 ;+-1 x5094 +1 x2180 >= 0 ;+-1 x5094 -1 x2177 >= -1 ;++1 x5094 -1 x2180 +1 x2177 >= 0 ;+-1 x5095 +1 x2181 >= 0 ;+-1 x5095 -1 x2178 >= -1 ;++1 x5095 -1 x2181 +1 x2178 >= 0 ;+-1 x5096 +1 x2182 >= 0 ;+-1 x5096 -1 x2179 >= -1 ;++1 x5096 -1 x2182 +1 x2179 >= 0 ;+-1 x5097 +1 x2183 >= 0 ;+-1 x5097 -1 x2180 >= -1 ;++1 x5097 -1 x2183 +1 x2180 >= 0 ;+-1 x5098 +1 x2184 >= 0 ;+-1 x5098 -1 x2181 >= -1 ;++1 x5098 -1 x2184 +1 x2181 >= 0 ;+-1 x5099 +1 x2185 >= 0 ;+-1 x5099 -1 x2182 >= -1 ;++1 x5099 -1 x2185 +1 x2182 >= 0 ;+-1 x5100 +1 x2186 >= 0 ;+-1 x5100 -1 x2183 >= -1 ;++1 x5100 -1 x2186 +1 x2183 >= 0 ;+-1 x5101 +1 x2187 >= 0 ;+-1 x5101 -1 x2184 >= -1 ;++1 x5101 -1 x2187 +1 x2184 >= 0 ;+-1 x5102 +1 x2188 >= 0 ;+-1 x5102 -1 x2185 >= -1 ;++1 x5102 -1 x2188 +1 x2185 >= 0 ;+-1 x5103 +1 x2189 >= 0 ;+-1 x5103 -1 x2186 >= -1 ;++1 x5103 -1 x2189 +1 x2186 >= 0 ;+-1 x5104 +1 x2190 >= 0 ;+-1 x5104 -1 x2187 >= -1 ;++1 x5104 -1 x2190 +1 x2187 >= 0 ;+-1 x5105 +1 x2191 >= 0 ;+-1 x5105 -1 x2188 >= -1 ;++1 x5105 -1 x2191 +1 x2188 >= 0 ;+-1 x5106 +1 x2192 >= 0 ;+-1 x5106 -1 x2189 >= -1 ;++1 x5106 -1 x2192 +1 x2189 >= 0 ;+-1 x5107 +1 x2193 >= 0 ;+-1 x5107 -1 x2190 >= -1 ;++1 x5107 -1 x2193 +1 x2190 >= 0 ;+-1 x5108 +1 x2194 >= 0 ;+-1 x5108 -1 x2191 >= -1 ;++1 x5108 -1 x2194 +1 x2191 >= 0 ;+-1 x5109 +1 x2195 >= 0 ;+-1 x5109 -1 x2192 >= -1 ;++1 x5109 -1 x2195 +1 x2192 >= 0 ;+-1 x5110 +1 x2196 >= 0 ;+-1 x5110 -1 x2193 >= -1 ;++1 x5110 -1 x2196 +1 x2193 >= 0 ;+-1 x5111 +1 x2197 >= 0 ;+-1 x5111 -1 x2194 >= -1 ;++1 x5111 -1 x2197 +1 x2194 >= 0 ;+-1 x5112 +1 x2198 >= 0 ;+-1 x5112 -1 x2195 >= -1 ;++1 x5112 -1 x2198 +1 x2195 >= 0 ;+-1 x5113 +1 x2199 >= 0 ;+-1 x5113 -1 x2196 >= -1 ;++1 x5113 -1 x2199 +1 x2196 >= 0 ;+-1 x5114 +1 x2200 >= 0 ;+-1 x5114 -1 x2197 >= -1 ;++1 x5114 -1 x2200 +1 x2197 >= 0 ;+-1 x5115 +1 x2201 >= 0 ;+-1 x5115 -1 x2198 >= -1 ;++1 x5115 -1 x2201 +1 x2198 >= 0 ;+-1 x5116 +1 x2202 >= 0 ;+-1 x5116 -1 x2199 >= -1 ;++1 x5116 -1 x2202 +1 x2199 >= 0 ;+-1 x5117 +1 x2203 >= 0 ;+-1 x5117 -1 x2200 >= -1 ;++1 x5117 -1 x2203 +1 x2200 >= 0 ;+-1 x5118 +1 x2204 >= 0 ;+-1 x5118 -1 x2201 >= -1 ;++1 x5118 -1 x2204 +1 x2201 >= 0 ;+-1 x5119 +1 x2205 >= 0 ;+-1 x5119 -1 x2202 >= -1 ;++1 x5119 -1 x2205 +1 x2202 >= 0 ;+-1 x5120 +1 x2206 >= 0 ;+-1 x5120 -1 x2203 >= -1 ;++1 x5120 -1 x2206 +1 x2203 >= 0 ;+-1 x5121 +1 x2207 >= 0 ;+-1 x5121 -1 x2204 >= -1 ;++1 x5121 -1 x2207 +1 x2204 >= 0 ;+-1 x5122 +1 x2208 >= 0 ;+-1 x5122 -1 x2205 >= -1 ;++1 x5122 -1 x2208 +1 x2205 >= 0 ;+-1 x5123 +1 x2209 >= 0 ;+-1 x5123 -1 x2206 >= -1 ;++1 x5123 -1 x2209 +1 x2206 >= 0 ;+-1 x5124 +1 x2210 >= 0 ;+-1 x5124 -1 x2207 >= -1 ;++1 x5124 -1 x2210 +1 x2207 >= 0 ;+-1 x5125 +1 x2211 >= 0 ;+-1 x5125 -1 x2208 >= -1 ;++1 x5125 -1 x2211 +1 x2208 >= 0 ;+-1 x5126 +1 x2212 >= 0 ;+-1 x5126 -1 x2209 >= -1 ;++1 x5126 -1 x2212 +1 x2209 >= 0 ;+-1 x5127 +1 x2213 >= 0 ;+-1 x5127 -1 x2210 >= -1 ;++1 x5127 -1 x2213 +1 x2210 >= 0 ;+-1 x5128 +1 x2214 >= 0 ;+-1 x5128 -1 x2211 >= -1 ;++1 x5128 -1 x2214 +1 x2211 >= 0 ;+-1 x5129 +1 x2215 >= 0 ;+-1 x5129 -1 x2212 >= -1 ;++1 x5129 -1 x2215 +1 x2212 >= 0 ;+-1 x5130 +1 x2216 >= 0 ;+-1 x5130 -1 x2213 >= -1 ;++1 x5130 -1 x2216 +1 x2213 >= 0 ;+-1 x5131 +1 x2217 >= 0 ;+-1 x5131 -1 x2214 >= -1 ;++1 x5131 -1 x2217 +1 x2214 >= 0 ;+-1 x5132 +1 x2218 >= 0 ;+-1 x5132 -1 x2215 >= -1 ;++1 x5132 -1 x2218 +1 x2215 >= 0 ;+-1 x5133 +1 x2219 >= 0 ;+-1 x5133 -1 x2216 >= -1 ;++1 x5133 -1 x2219 +1 x2216 >= 0 ;+-1 x5134 +1 x2220 >= 0 ;+-1 x5134 -1 x2217 >= -1 ;++1 x5134 -1 x2220 +1 x2217 >= 0 ;+-1 x5135 +1 x2221 >= 0 ;+-1 x5135 -1 x2218 >= -1 ;++1 x5135 -1 x2221 +1 x2218 >= 0 ;+-1 x5136 +1 x2222 >= 0 ;+-1 x5136 -1 x2219 >= -1 ;++1 x5136 -1 x2222 +1 x2219 >= 0 ;+-1 x5137 +1 x2223 >= 0 ;+-1 x5137 -1 x2220 >= -1 ;++1 x5137 -1 x2223 +1 x2220 >= 0 ;+-1 x5138 +1 x2224 >= 0 ;+-1 x5138 -1 x2221 >= -1 ;++1 x5138 -1 x2224 +1 x2221 >= 0 ;+-1 x5139 +1 x2225 >= 0 ;+-1 x5139 -1 x2222 >= -1 ;++1 x5139 -1 x2225 +1 x2222 >= 0 ;+-1 x5140 +1 x2226 >= 0 ;+-1 x5140 -1 x2223 >= -1 ;++1 x5140 -1 x2226 +1 x2223 >= 0 ;+-1 x5141 +1 x2227 >= 0 ;+-1 x5141 -1 x2224 >= -1 ;++1 x5141 -1 x2227 +1 x2224 >= 0 ;+-1 x5142 +1 x2228 >= 0 ;+-1 x5142 -1 x2225 >= -1 ;++1 x5142 -1 x2228 +1 x2225 >= 0 ;+-1 x5143 +1 x2229 >= 0 ;+-1 x5143 -1 x2226 >= -1 ;++1 x5143 -1 x2229 +1 x2226 >= 0 ;+-1 x5144 +1 x2230 >= 0 ;+-1 x5144 -1 x2227 >= -1 ;++1 x5144 -1 x2230 +1 x2227 >= 0 ;+-1 x5145 +1 x2231 >= 0 ;+-1 x5145 -1 x2228 >= -1 ;++1 x5145 -1 x2231 +1 x2228 >= 0 ;+-1 x5146 +1 x2232 >= 0 ;+-1 x5146 -1 x2229 >= -1 ;++1 x5146 -1 x2232 +1 x2229 >= 0 ;+-1 x5147 +1 x2233 >= 0 ;+-1 x5147 -1 x2230 >= -1 ;++1 x5147 -1 x2233 +1 x2230 >= 0 ;+-1 x5148 +1 x2234 >= 0 ;+-1 x5148 -1 x2231 >= -1 ;++1 x5148 -1 x2234 +1 x2231 >= 0 ;+-1 x5149 +1 x2235 >= 0 ;+-1 x5149 -1 x2232 >= -1 ;++1 x5149 -1 x2235 +1 x2232 >= 0 ;+-1 x5150 +1 x2236 >= 0 ;+-1 x5150 -1 x2233 >= -1 ;++1 x5150 -1 x2236 +1 x2233 >= 0 ;+-1 x5151 +1 x2237 >= 0 ;+-1 x5151 -1 x2234 >= -1 ;++1 x5151 -1 x2237 +1 x2234 >= 0 ;+-1 x5152 +1 x2238 >= 0 ;+-1 x5152 -1 x2235 >= -1 ;++1 x5152 -1 x2238 +1 x2235 >= 0 ;+-1 x5153 +1 x2239 >= 0 ;+-1 x5153 -1 x2236 >= -1 ;++1 x5153 -1 x2239 +1 x2236 >= 0 ;+-1 x5154 +1 x2240 >= 0 ;+-1 x5154 -1 x2237 >= -1 ;++1 x5154 -1 x2240 +1 x2237 >= 0 ;+-1 x5155 +1 x2241 >= 0 ;+-1 x5155 -1 x2238 >= -1 ;++1 x5155 -1 x2241 +1 x2238 >= 0 ;+-1 x5156 +1 x2242 >= 0 ;+-1 x5156 -1 x2239 >= -1 ;++1 x5156 -1 x2242 +1 x2239 >= 0 ;+-1 x5157 +1 x2243 >= 0 ;+-1 x5157 -1 x2240 >= -1 ;++1 x5157 -1 x2243 +1 x2240 >= 0 ;+-1 x5158 +1 x2244 >= 0 ;+-1 x5158 -1 x2241 >= -1 ;++1 x5158 -1 x2244 +1 x2241 >= 0 ;+-1 x5159 +1 x2245 >= 0 ;+-1 x5159 -1 x2242 >= -1 ;++1 x5159 -1 x2245 +1 x2242 >= 0 ;+-1 x5160 +1 x2246 >= 0 ;+-1 x5160 -1 x2243 >= -1 ;++1 x5160 -1 x2246 +1 x2243 >= 0 ;+-1 x5161 +1 x2247 >= 0 ;+-1 x5161 -1 x2244 >= -1 ;++1 x5161 -1 x2247 +1 x2244 >= 0 ;+-1 x5162 +1 x2248 >= 0 ;+-1 x5162 -1 x2245 >= -1 ;++1 x5162 -1 x2248 +1 x2245 >= 0 ;+-1 x5163 +1 x2249 >= 0 ;+-1 x5163 -1 x2246 >= -1 ;++1 x5163 -1 x2249 +1 x2246 >= 0 ;+-1 x5164 +1 x2250 >= 0 ;+-1 x5164 -1 x2247 >= -1 ;++1 x5164 -1 x2250 +1 x2247 >= 0 ;+-1 x5165 +1 x2251 >= 0 ;+-1 x5165 -1 x2248 >= -1 ;++1 x5165 -1 x2251 +1 x2248 >= 0 ;+-1 x5166 +1 x2252 >= 0 ;+-1 x5166 -1 x2249 >= -1 ;++1 x5166 -1 x2252 +1 x2249 >= 0 ;+-1 x5167 +1 x2253 >= 0 ;+-1 x5167 -1 x2250 >= -1 ;++1 x5167 -1 x2253 +1 x2250 >= 0 ;+-1 x5168 +1 x2254 >= 0 ;+-1 x5168 -1 x2251 >= -1 ;++1 x5168 -1 x2254 +1 x2251 >= 0 ;+-1 x5169 +1 x2255 >= 0 ;+-1 x5169 -1 x2252 >= -1 ;++1 x5169 -1 x2255 +1 x2252 >= 0 ;+-1 x5170 +1 x2256 >= 0 ;+-1 x5170 -1 x2253 >= -1 ;++1 x5170 -1 x2256 +1 x2253 >= 0 ;+-1 x5171 +1 x2257 >= 0 ;++1 x5171 -1 x2257 >= 0 ;+-1 x5172 +1 x2258 >= 0 ;++1 x5172 -1 x2258 >= 0 ;+-1 x5173 +1 x2259 >= 0 ;++1 x5173 -1 x2259 >= 0 ;+-1 x5174 +1 x2260 >= 0 ;++1 x5174 -1 x2260 >= 0 ;+-1 x5175 +1 x2261 >= 0 ;++1 x5175 -1 x2261 >= 0 ;+-1 x5176 +1 x2262 >= 0 ;++1 x5176 -1 x2262 >= 0 ;+-1 x5177 +1 x2263 >= 0 ;++1 x5177 -1 x2263 >= 0 ;+-1 x5178 +1 x2264 >= 0 ;++1 x5178 -1 x2264 >= 0 ;+-1 x5179 +1 x2265 >= 0 ;++1 x5179 -1 x2265 >= 0 ;+-1 x5180 +1 x2266 >= 0 ;+-1 x5180 -1 x2257 >= -1 ;++1 x5180 -1 x2266 +1 x2257 >= 0 ;+-1 x5181 +1 x2267 >= 0 ;+-1 x5181 -1 x2258 >= -1 ;++1 x5181 -1 x2267 +1 x2258 >= 0 ;+-1 x5182 +1 x2268 >= 0 ;+-1 x5182 -1 x2259 >= -1 ;++1 x5182 -1 x2268 +1 x2259 >= 0 ;+-1 x5183 +1 x2269 >= 0 ;+-1 x5183 -1 x2260 >= -1 ;++1 x5183 -1 x2269 +1 x2260 >= 0 ;+-1 x5184 +1 x2270 >= 0 ;+-1 x5184 -1 x2261 >= -1 ;++1 x5184 -1 x2270 +1 x2261 >= 0 ;+-1 x5185 +1 x2271 >= 0 ;+-1 x5185 -1 x2262 >= -1 ;++1 x5185 -1 x2271 +1 x2262 >= 0 ;+-1 x5186 +1 x2272 >= 0 ;+-1 x5186 -1 x2263 >= -1 ;++1 x5186 -1 x2272 +1 x2263 >= 0 ;+-1 x5187 +1 x2273 >= 0 ;+-1 x5187 -1 x2264 >= -1 ;++1 x5187 -1 x2273 +1 x2264 >= 0 ;+-1 x5188 +1 x2274 >= 0 ;+-1 x5188 -1 x2265 >= -1 ;++1 x5188 -1 x2274 +1 x2265 >= 0 ;+-1 x5189 +1 x2275 >= 0 ;+-1 x5189 -1 x2266 >= -1 ;++1 x5189 -1 x2275 +1 x2266 >= 0 ;+-1 x5190 +1 x2276 >= 0 ;+-1 x5190 -1 x2267 >= -1 ;++1 x5190 -1 x2276 +1 x2267 >= 0 ;+-1 x5191 +1 x2277 >= 0 ;+-1 x5191 -1 x2268 >= -1 ;++1 x5191 -1 x2277 +1 x2268 >= 0 ;+-1 x5192 +1 x2278 >= 0 ;+-1 x5192 -1 x2269 >= -1 ;++1 x5192 -1 x2278 +1 x2269 >= 0 ;+-1 x5193 +1 x2279 >= 0 ;+-1 x5193 -1 x2270 >= -1 ;++1 x5193 -1 x2279 +1 x2270 >= 0 ;+-1 x5194 +1 x2280 >= 0 ;+-1 x5194 -1 x2271 >= -1 ;++1 x5194 -1 x2280 +1 x2271 >= 0 ;+-1 x5195 +1 x2281 >= 0 ;+-1 x5195 -1 x2272 >= -1 ;++1 x5195 -1 x2281 +1 x2272 >= 0 ;+-1 x5196 +1 x2282 >= 0 ;+-1 x5196 -1 x2273 >= -1 ;++1 x5196 -1 x2282 +1 x2273 >= 0 ;+-1 x5197 +1 x2283 >= 0 ;+-1 x5197 -1 x2274 >= -1 ;++1 x5197 -1 x2283 +1 x2274 >= 0 ;+-1 x5198 +1 x2284 >= 0 ;+-1 x5198 -1 x2275 >= -1 ;++1 x5198 -1 x2284 +1 x2275 >= 0 ;+-1 x5199 +1 x2285 >= 0 ;+-1 x5199 -1 x2276 >= -1 ;++1 x5199 -1 x2285 +1 x2276 >= 0 ;+-1 x5200 +1 x2286 >= 0 ;+-1 x5200 -1 x2277 >= -1 ;++1 x5200 -1 x2286 +1 x2277 >= 0 ;+-1 x5201 +1 x2287 >= 0 ;+-1 x5201 -1 x2278 >= -1 ;++1 x5201 -1 x2287 +1 x2278 >= 0 ;+-1 x5202 +1 x2288 >= 0 ;+-1 x5202 -1 x2279 >= -1 ;++1 x5202 -1 x2288 +1 x2279 >= 0 ;+-1 x5203 +1 x2289 >= 0 ;+-1 x5203 -1 x2280 >= -1 ;++1 x5203 -1 x2289 +1 x2280 >= 0 ;+-1 x5204 +1 x2290 >= 0 ;+-1 x5204 -1 x2281 >= -1 ;++1 x5204 -1 x2290 +1 x2281 >= 0 ;+-1 x5205 +1 x2291 >= 0 ;+-1 x5205 -1 x2282 >= -1 ;++1 x5205 -1 x2291 +1 x2282 >= 0 ;+-1 x5206 +1 x2292 >= 0 ;+-1 x5206 -1 x2283 >= -1 ;++1 x5206 -1 x2292 +1 x2283 >= 0 ;+-1 x5207 +1 x2293 >= 0 ;+-1 x5207 -1 x2284 >= -1 ;++1 x5207 -1 x2293 +1 x2284 >= 0 ;+-1 x5208 +1 x2294 >= 0 ;+-1 x5208 -1 x2285 >= -1 ;++1 x5208 -1 x2294 +1 x2285 >= 0 ;+-1 x5209 +1 x2295 >= 0 ;+-1 x5209 -1 x2286 >= -1 ;++1 x5209 -1 x2295 +1 x2286 >= 0 ;+-1 x5210 +1 x2296 >= 0 ;+-1 x5210 -1 x2287 >= -1 ;++1 x5210 -1 x2296 +1 x2287 >= 0 ;+-1 x5211 +1 x2297 >= 0 ;+-1 x5211 -1 x2288 >= -1 ;++1 x5211 -1 x2297 +1 x2288 >= 0 ;+-1 x5212 +1 x2298 >= 0 ;+-1 x5212 -1 x2289 >= -1 ;++1 x5212 -1 x2298 +1 x2289 >= 0 ;+-1 x5213 +1 x2299 >= 0 ;+-1 x5213 -1 x2290 >= -1 ;++1 x5213 -1 x2299 +1 x2290 >= 0 ;+-1 x5214 +1 x2300 >= 0 ;+-1 x5214 -1 x2291 >= -1 ;++1 x5214 -1 x2300 +1 x2291 >= 0 ;+-1 x5215 +1 x2301 >= 0 ;+-1 x5215 -1 x2292 >= -1 ;++1 x5215 -1 x2301 +1 x2292 >= 0 ;+-1 x5216 +1 x2302 >= 0 ;+-1 x5216 -1 x2293 >= -1 ;++1 x5216 -1 x2302 +1 x2293 >= 0 ;+-1 x5217 +1 x2303 >= 0 ;+-1 x5217 -1 x2294 >= -1 ;++1 x5217 -1 x2303 +1 x2294 >= 0 ;+-1 x5218 +1 x2304 >= 0 ;+-1 x5218 -1 x2295 >= -1 ;++1 x5218 -1 x2304 +1 x2295 >= 0 ;+-1 x5219 +1 x2305 >= 0 ;+-1 x5219 -1 x2296 >= -1 ;++1 x5219 -1 x2305 +1 x2296 >= 0 ;+-1 x5220 +1 x2306 >= 0 ;+-1 x5220 -1 x2297 >= -1 ;++1 x5220 -1 x2306 +1 x2297 >= 0 ;+-1 x5221 +1 x2307 >= 0 ;+-1 x5221 -1 x2298 >= -1 ;++1 x5221 -1 x2307 +1 x2298 >= 0 ;+-1 x5222 +1 x2308 >= 0 ;+-1 x5222 -1 x2299 >= -1 ;++1 x5222 -1 x2308 +1 x2299 >= 0 ;+-1 x5223 +1 x2309 >= 0 ;+-1 x5223 -1 x2300 >= -1 ;++1 x5223 -1 x2309 +1 x2300 >= 0 ;+-1 x5224 +1 x2310 >= 0 ;+-1 x5224 -1 x2301 >= -1 ;++1 x5224 -1 x2310 +1 x2301 >= 0 ;+-1 x5225 +1 x2311 >= 0 ;+-1 x5225 -1 x2302 >= -1 ;++1 x5225 -1 x2311 +1 x2302 >= 0 ;+-1 x5226 +1 x2312 >= 0 ;+-1 x5226 -1 x2303 >= -1 ;++1 x5226 -1 x2312 +1 x2303 >= 0 ;+-1 x5227 +1 x2313 >= 0 ;+-1 x5227 -1 x2304 >= -1 ;++1 x5227 -1 x2313 +1 x2304 >= 0 ;+-1 x5228 +1 x2314 >= 0 ;+-1 x5228 -1 x2305 >= -1 ;++1 x5228 -1 x2314 +1 x2305 >= 0 ;+-1 x5229 +1 x2315 >= 0 ;+-1 x5229 -1 x2306 >= -1 ;++1 x5229 -1 x2315 +1 x2306 >= 0 ;+-1 x5230 +1 x2316 >= 0 ;+-1 x5230 -1 x2307 >= -1 ;++1 x5230 -1 x2316 +1 x2307 >= 0 ;+-1 x5231 +1 x2317 >= 0 ;+-1 x5231 -1 x2308 >= -1 ;++1 x5231 -1 x2317 +1 x2308 >= 0 ;+-1 x5232 +1 x2318 >= 0 ;+-1 x5232 -1 x2309 >= -1 ;++1 x5232 -1 x2318 +1 x2309 >= 0 ;+-1 x5233 +1 x2319 >= 0 ;+-1 x5233 -1 x2310 >= -1 ;++1 x5233 -1 x2319 +1 x2310 >= 0 ;+-1 x5234 +1 x2320 >= 0 ;+-1 x5234 -1 x2311 >= -1 ;++1 x5234 -1 x2320 +1 x2311 >= 0 ;+-1 x5235 +1 x2321 >= 0 ;+-1 x5235 -1 x2312 >= -1 ;++1 x5235 -1 x2321 +1 x2312 >= 0 ;+-1 x5236 +1 x2322 >= 0 ;+-1 x5236 -1 x2313 >= -1 ;++1 x5236 -1 x2322 +1 x2313 >= 0 ;+-1 x5237 +1 x2323 >= 0 ;+-1 x5237 -1 x2314 >= -1 ;++1 x5237 -1 x2323 +1 x2314 >= 0 ;+-1 x5238 +1 x2324 >= 0 ;+-1 x5238 -1 x2315 >= -1 ;++1 x5238 -1 x2324 +1 x2315 >= 0 ;+-1 x5239 +1 x2325 >= 0 ;+-1 x5239 -1 x2316 >= -1 ;++1 x5239 -1 x2325 +1 x2316 >= 0 ;+-1 x5240 +1 x2326 >= 0 ;+-1 x5240 -1 x2317 >= -1 ;++1 x5240 -1 x2326 +1 x2317 >= 0 ;+-1 x5241 +1 x2327 >= 0 ;+-1 x5241 -1 x2318 >= -1 ;++1 x5241 -1 x2327 +1 x2318 >= 0 ;+-1 x5242 +1 x2328 >= 0 ;+-1 x5242 -1 x2319 >= -1 ;++1 x5242 -1 x2328 +1 x2319 >= 0 ;+-1 x5243 +1 x2329 >= 0 ;+-1 x5243 -1 x2320 >= -1 ;++1 x5243 -1 x2329 +1 x2320 >= 0 ;+-1 x5244 +1 x2330 >= 0 ;+-1 x5244 -1 x2321 >= -1 ;++1 x5244 -1 x2330 +1 x2321 >= 0 ;+-1 x5245 +1 x2331 >= 0 ;+-1 x5245 -1 x2322 >= -1 ;++1 x5245 -1 x2331 +1 x2322 >= 0 ;+-1 x5246 +1 x2332 >= 0 ;+-1 x5246 -1 x2323 >= -1 ;++1 x5246 -1 x2332 +1 x2323 >= 0 ;+-1 x5247 +1 x2333 >= 0 ;+-1 x5247 -1 x2324 >= -1 ;++1 x5247 -1 x2333 +1 x2324 >= 0 ;+-1 x5248 +1 x2334 >= 0 ;+-1 x5248 -1 x2325 >= -1 ;++1 x5248 -1 x2334 +1 x2325 >= 0 ;+-1 x5249 +1 x2335 >= 0 ;+-1 x5249 -1 x2326 >= -1 ;++1 x5249 -1 x2335 +1 x2326 >= 0 ;+-1 x5250 +1 x2336 >= 0 ;+-1 x5250 -1 x2327 >= -1 ;++1 x5250 -1 x2336 +1 x2327 >= 0 ;+-1 x5251 +1 x2337 >= 0 ;+-1 x5251 -1 x2328 >= -1 ;++1 x5251 -1 x2337 +1 x2328 >= 0 ;+-1 x5252 +1 x2338 >= 0 ;+-1 x5252 -1 x2329 >= -1 ;++1 x5252 -1 x2338 +1 x2329 >= 0 ;+-1 x5253 +1 x2339 >= 0 ;+-1 x5253 -1 x2330 >= -1 ;++1 x5253 -1 x2339 +1 x2330 >= 0 ;+-1 x5254 +1 x2340 >= 0 ;+-1 x5254 -1 x2331 >= -1 ;++1 x5254 -1 x2340 +1 x2331 >= 0 ;+-1 x5255 +1 x2341 >= 0 ;+-1 x5255 -1 x2332 >= -1 ;++1 x5255 -1 x2341 +1 x2332 >= 0 ;+-1 x5256 +1 x2342 >= 0 ;+-1 x5256 -1 x2333 >= -1 ;++1 x5256 -1 x2342 +1 x2333 >= 0 ;+-1 x5257 +1 x2343 >= 0 ;+-1 x5257 -1 x2334 >= -1 ;++1 x5257 -1 x2343 +1 x2334 >= 0 ;+-1 x5258 +1 x2344 >= 0 ;+-1 x5258 -1 x2335 >= -1 ;++1 x5258 -1 x2344 +1 x2335 >= 0 ;+-1 x5259 +1 x2345 >= 0 ;+-1 x5259 -1 x2336 >= -1 ;++1 x5259 -1 x2345 +1 x2336 >= 0 ;+-1 x5260 +1 x2346 >= 0 ;+-1 x5260 -1 x2337 >= -1 ;++1 x5260 -1 x2346 +1 x2337 >= 0 ;+-1 x5261 +1 x2347 >= 0 ;+-1 x5261 -1 x2338 >= -1 ;++1 x5261 -1 x2347 +1 x2338 >= 0 ;+-1 x5262 +1 x2348 >= 0 ;+-1 x5262 -1 x2339 >= -1 ;++1 x5262 -1 x2348 +1 x2339 >= 0 ;+-1 x5263 +1 x2349 >= 0 ;+-1 x5263 -1 x2340 >= -1 ;++1 x5263 -1 x2349 +1 x2340 >= 0 ;+-1 x5264 +1 x2350 >= 0 ;+-1 x5264 -1 x2341 >= -1 ;++1 x5264 -1 x2350 +1 x2341 >= 0 ;+-1 x5265 +1 x2351 >= 0 ;++1 x5265 -1 x2351 >= 0 ;+-1 x5266 +1 x2352 >= 0 ;++1 x5266 -1 x2352 >= 0 ;+-1 x5267 +1 x2353 >= 0 ;++1 x5267 -1 x2353 >= 0 ;+-1 x5268 +1 x2354 >= 0 ;++1 x5268 -1 x2354 >= 0 ;+-1 x5269 +1 x2355 >= 0 ;+-1 x5269 -1 x2351 >= -1 ;++1 x5269 -1 x2355 +1 x2351 >= 0 ;+-1 x5270 +1 x2356 >= 0 ;+-1 x5270 -1 x2352 >= -1 ;++1 x5270 -1 x2356 +1 x2352 >= 0 ;+-1 x5271 +1 x2357 >= 0 ;+-1 x5271 -1 x2353 >= -1 ;++1 x5271 -1 x2357 +1 x2353 >= 0 ;+-1 x5272 +1 x2358 >= 0 ;+-1 x5272 -1 x2354 >= -1 ;++1 x5272 -1 x2358 +1 x2354 >= 0 ;+-1 x5273 +1 x2359 >= 0 ;+-1 x5273 -1 x2355 >= -1 ;++1 x5273 -1 x2359 +1 x2355 >= 0 ;+-1 x5274 +1 x2360 >= 0 ;+-1 x5274 -1 x2356 >= -1 ;++1 x5274 -1 x2360 +1 x2356 >= 0 ;+-1 x5275 +1 x2361 >= 0 ;+-1 x5275 -1 x2357 >= -1 ;++1 x5275 -1 x2361 +1 x2357 >= 0 ;+-1 x5276 +1 x2362 >= 0 ;+-1 x5276 -1 x2358 >= -1 ;++1 x5276 -1 x2362 +1 x2358 >= 0 ;+-1 x5277 +1 x2363 >= 0 ;+-1 x5277 -1 x2359 >= -1 ;++1 x5277 -1 x2363 +1 x2359 >= 0 ;+-1 x5278 +1 x2364 >= 0 ;+-1 x5278 -1 x2360 >= -1 ;++1 x5278 -1 x2364 +1 x2360 >= 0 ;+-1 x5279 +1 x2365 >= 0 ;+-1 x5279 -1 x2361 >= -1 ;++1 x5279 -1 x2365 +1 x2361 >= 0 ;+-1 x5280 +1 x2366 >= 0 ;+-1 x5280 -1 x2362 >= -1 ;++1 x5280 -1 x2366 +1 x2362 >= 0 ;+-1 x5281 +1 x2367 >= 0 ;+-1 x5281 -1 x2363 >= -1 ;++1 x5281 -1 x2367 +1 x2363 >= 0 ;+-1 x5282 +1 x2368 >= 0 ;+-1 x5282 -1 x2364 >= -1 ;++1 x5282 -1 x2368 +1 x2364 >= 0 ;+-1 x5283 +1 x2369 >= 0 ;+-1 x5283 -1 x2365 >= -1 ;++1 x5283 -1 x2369 +1 x2365 >= 0 ;+-1 x5284 +1 x2370 >= 0 ;+-1 x5284 -1 x2366 >= -1 ;++1 x5284 -1 x2370 +1 x2366 >= 0 ;+-1 x5285 +1 x2371 >= 0 ;+-1 x5285 -1 x2367 >= -1 ;++1 x5285 -1 x2371 +1 x2367 >= 0 ;+-1 x5286 +1 x2372 >= 0 ;+-1 x5286 -1 x2368 >= -1 ;++1 x5286 -1 x2372 +1 x2368 >= 0 ;+-1 x5287 +1 x2373 >= 0 ;+-1 x5287 -1 x2369 >= -1 ;++1 x5287 -1 x2373 +1 x2369 >= 0 ;+-1 x5288 +1 x2374 >= 0 ;+-1 x5288 -1 x2370 >= -1 ;++1 x5288 -1 x2374 +1 x2370 >= 0 ;+-1 x5289 +1 x2375 >= 0 ;+-1 x5289 -1 x2371 >= -1 ;++1 x5289 -1 x2375 +1 x2371 >= 0 ;+-1 x5290 +1 x2376 >= 0 ;+-1 x5290 -1 x2372 >= -1 ;++1 x5290 -1 x2376 +1 x2372 >= 0 ;+-1 x5291 +1 x2377 >= 0 ;+-1 x5291 -1 x2373 >= -1 ;++1 x5291 -1 x2377 +1 x2373 >= 0 ;+-1 x5292 +1 x2378 >= 0 ;+-1 x5292 -1 x2374 >= -1 ;++1 x5292 -1 x2378 +1 x2374 >= 0 ;+-1 x5293 +1 x2379 >= 0 ;+-1 x5293 -1 x2375 >= -1 ;++1 x5293 -1 x2379 +1 x2375 >= 0 ;+-1 x5294 +1 x2380 >= 0 ;+-1 x5294 -1 x2376 >= -1 ;++1 x5294 -1 x2380 +1 x2376 >= 0 ;+-1 x5295 +1 x2381 >= 0 ;+-1 x5295 -1 x2377 >= -1 ;++1 x5295 -1 x2381 +1 x2377 >= 0 ;+-1 x5296 +1 x2382 >= 0 ;+-1 x5296 -1 x2378 >= -1 ;++1 x5296 -1 x2382 +1 x2378 >= 0 ;+-1 x5297 +1 x2383 >= 0 ;+-1 x5297 -1 x2379 >= -1 ;++1 x5297 -1 x2383 +1 x2379 >= 0 ;+-1 x5298 +1 x2384 >= 0 ;+-1 x5298 -1 x2380 >= -1 ;++1 x5298 -1 x2384 +1 x2380 >= 0 ;+-1 x5299 +1 x2385 >= 0 ;+-1 x5299 -1 x2381 >= -1 ;++1 x5299 -1 x2385 +1 x2381 >= 0 ;+-1 x5300 +1 x2386 >= 0 ;+-1 x5300 -1 x2382 >= -1 ;++1 x5300 -1 x2386 +1 x2382 >= 0 ;+-1 x5301 +1 x2387 >= 0 ;+-1 x5301 -1 x2383 >= -1 ;++1 x5301 -1 x2387 +1 x2383 >= 0 ;+-1 x5302 +1 x2388 >= 0 ;+-1 x5302 -1 x2384 >= -1 ;++1 x5302 -1 x2388 +1 x2384 >= 0 ;+-1 x5303 +1 x2389 >= 0 ;+-1 x5303 -1 x2385 >= -1 ;++1 x5303 -1 x2389 +1 x2385 >= 0 ;+-1 x5304 +1 x2390 >= 0 ;+-1 x5304 -1 x2386 >= -1 ;++1 x5304 -1 x2390 +1 x2386 >= 0 ;+-1 x5305 +1 x2391 >= 0 ;+-1 x5305 -1 x2387 >= -1 ;++1 x5305 -1 x2391 +1 x2387 >= 0 ;+-1 x5306 +1 x2392 >= 0 ;+-1 x5306 -1 x2388 >= -1 ;++1 x5306 -1 x2392 +1 x2388 >= 0 ;+-1 x5307 +1 x2393 >= 0 ;+-1 x5307 -1 x2389 >= -1 ;++1 x5307 -1 x2393 +1 x2389 >= 0 ;+-1 x5308 +1 x2394 >= 0 ;+-1 x5308 -1 x2390 >= -1 ;++1 x5308 -1 x2394 +1 x2390 >= 0 ;+-1 x5309 +1 x2395 >= 0 ;+-1 x5309 -1 x2391 >= -1 ;++1 x5309 -1 x2395 +1 x2391 >= 0 ;+-1 x5310 +1 x2396 >= 0 ;+-1 x5310 -1 x2392 >= -1 ;++1 x5310 -1 x2396 +1 x2392 >= 0 ;+-1 x5311 +1 x2397 >= 0 ;+-1 x5311 -1 x2393 >= -1 ;++1 x5311 -1 x2397 +1 x2393 >= 0 ;+-1 x5312 +1 x2398 >= 0 ;+-1 x5312 -1 x2394 >= -1 ;++1 x5312 -1 x2398 +1 x2394 >= 0 ;+-1 x5313 +1 x2399 >= 0 ;+-1 x5313 -1 x2395 >= -1 ;++1 x5313 -1 x2399 +1 x2395 >= 0 ;+-1 x5314 +1 x2400 >= 0 ;+-1 x5314 -1 x2396 >= -1 ;++1 x5314 -1 x2400 +1 x2396 >= 0 ;+-1 x5315 +1 x2401 >= 0 ;+-1 x5315 -1 x2397 >= -1 ;++1 x5315 -1 x2401 +1 x2397 >= 0 ;+-1 x5316 +1 x2402 >= 0 ;+-1 x5316 -1 x2398 >= -1 ;++1 x5316 -1 x2402 +1 x2398 >= 0 ;+-1 x5317 +1 x2403 >= 0 ;+-1 x5317 -1 x2399 >= -1 ;++1 x5317 -1 x2403 +1 x2399 >= 0 ;+-1 x5318 +1 x2404 >= 0 ;+-1 x5318 -1 x2400 >= -1 ;++1 x5318 -1 x2404 +1 x2400 >= 0 ;+-1 x5319 +1 x2405 >= 0 ;+-1 x5319 -1 x2401 >= -1 ;++1 x5319 -1 x2405 +1 x2401 >= 0 ;+-1 x5320 +1 x2406 >= 0 ;+-1 x5320 -1 x2402 >= -1 ;++1 x5320 -1 x2406 +1 x2402 >= 0 ;+-1 x5321 +1 x2407 >= 0 ;+-1 x5321 -1 x2403 >= -1 ;++1 x5321 -1 x2407 +1 x2403 >= 0 ;+-1 x5322 +1 x2408 >= 0 ;+-1 x5322 -1 x2404 >= -1 ;++1 x5322 -1 x2408 +1 x2404 >= 0 ;+-1 x5323 +1 x2409 >= 0 ;+-1 x5323 -1 x2405 >= -1 ;++1 x5323 -1 x2409 +1 x2405 >= 0 ;+-1 x5324 +1 x2410 >= 0 ;+-1 x5324 -1 x2406 >= -1 ;++1 x5324 -1 x2410 +1 x2406 >= 0 ;+-1 x5325 +1 x2411 >= 0 ;+-1 x5325 -1 x2407 >= -1 ;++1 x5325 -1 x2411 +1 x2407 >= 0 ;+-1 x5326 +1 x2412 >= 0 ;+-1 x5326 -1 x2408 >= -1 ;++1 x5326 -1 x2412 +1 x2408 >= 0 ;+-1 x5327 +1 x2413 >= 0 ;+-1 x5327 -1 x2409 >= -1 ;++1 x5327 -1 x2413 +1 x2409 >= 0 ;+-1 x5328 +1 x2414 >= 0 ;+-1 x5328 -1 x2410 >= -1 ;++1 x5328 -1 x2414 +1 x2410 >= 0 ;+-1 x5329 +1 x2415 >= 0 ;+-1 x5329 -1 x2411 >= -1 ;++1 x5329 -1 x2415 +1 x2411 >= 0 ;+-1 x5330 +1 x2416 >= 0 ;+-1 x5330 -1 x2412 >= -1 ;++1 x5330 -1 x2416 +1 x2412 >= 0 ;+-1 x5331 +1 x2417 >= 0 ;+-1 x5331 -1 x2413 >= -1 ;++1 x5331 -1 x2417 +1 x2413 >= 0 ;+-1 x5332 +1 x2418 >= 0 ;+-1 x5332 -1 x2414 >= -1 ;++1 x5332 -1 x2418 +1 x2414 >= 0 ;+-1 x5333 +1 x2419 >= 0 ;+-1 x5333 -1 x2415 >= -1 ;++1 x5333 -1 x2419 +1 x2415 >= 0 ;+-1 x5334 +1 x2420 >= 0 ;+-1 x5334 -1 x2416 >= -1 ;++1 x5334 -1 x2420 +1 x2416 >= 0 ;+-1 x5335 +1 x2421 >= 0 ;+-1 x5335 -1 x2417 >= -1 ;++1 x5335 -1 x2421 +1 x2417 >= 0 ;+-1 x5336 +1 x2422 >= 0 ;+-1 x5336 -1 x2418 >= -1 ;++1 x5336 -1 x2422 +1 x2418 >= 0 ;+-1 x5337 +1 x2423 >= 0 ;+-1 x5337 -1 x2419 >= -1 ;++1 x5337 -1 x2423 +1 x2419 >= 0 ;+-1 x5338 +1 x2424 >= 0 ;+-1 x5338 -1 x2420 >= -1 ;++1 x5338 -1 x2424 +1 x2420 >= 0 ;+-1 x5339 +1 x2425 >= 0 ;+-1 x5339 -1 x2421 >= -1 ;++1 x5339 -1 x2425 +1 x2421 >= 0 ;+-1 x5340 +1 x2426 >= 0 ;+-1 x5340 -1 x2422 >= -1 ;++1 x5340 -1 x2426 +1 x2422 >= 0 ;+-1 x5341 +1 x2427 >= 0 ;+-1 x5341 -1 x2423 >= -1 ;++1 x5341 -1 x2427 +1 x2423 >= 0 ;+-1 x5342 +1 x2428 >= 0 ;+-1 x5342 -1 x2424 >= -1 ;++1 x5342 -1 x2428 +1 x2424 >= 0 ;+-1 x5343 +1 x2429 >= 0 ;+-1 x5343 -1 x2425 >= -1 ;++1 x5343 -1 x2429 +1 x2425 >= 0 ;+-1 x5344 +1 x2430 >= 0 ;+-1 x5344 -1 x2426 >= -1 ;++1 x5344 -1 x2430 +1 x2426 >= 0 ;+-1 x5345 +1 x2431 >= 0 ;+-1 x5345 -1 x2427 >= -1 ;++1 x5345 -1 x2431 +1 x2427 >= 0 ;+-1 x5346 +1 x2432 >= 0 ;+-1 x5346 -1 x2428 >= -1 ;++1 x5346 -1 x2432 +1 x2428 >= 0 ;+-1 x5347 +1 x2433 >= 0 ;+-1 x5347 -1 x2429 >= -1 ;++1 x5347 -1 x2433 +1 x2429 >= 0 ;+-1 x5348 +1 x2434 >= 0 ;+-1 x5348 -1 x2430 >= -1 ;++1 x5348 -1 x2434 +1 x2430 >= 0 ;+-1 x5349 +1 x2435 >= 0 ;+-1 x5349 -1 x2431 >= -1 ;++1 x5349 -1 x2435 +1 x2431 >= 0 ;+-1 x5350 +1 x2436 >= 0 ;+-1 x5350 -1 x2432 >= -1 ;++1 x5350 -1 x2436 +1 x2432 >= 0 ;+-1 x5351 +1 x2437 >= 0 ;+-1 x5351 -1 x2433 >= -1 ;++1 x5351 -1 x2437 +1 x2433 >= 0 ;+-1 x5352 +1 x2438 >= 0 ;+-1 x5352 -1 x2434 >= -1 ;++1 x5352 -1 x2438 +1 x2434 >= 0 ;+-1 x5353 +1 x2439 >= 0 ;+-1 x5353 -1 x2435 >= -1 ;++1 x5353 -1 x2439 +1 x2435 >= 0 ;+-1 x5354 +1 x2440 >= 0 ;+-1 x5354 -1 x2436 >= -1 ;++1 x5354 -1 x2440 +1 x2436 >= 0 ;+-1 x5355 +1 x2441 >= 0 ;+-1 x5355 -1 x2437 >= -1 ;++1 x5355 -1 x2441 +1 x2437 >= 0 ;+-1 x5356 +1 x2442 >= 0 ;+-1 x5356 -1 x2438 >= -1 ;++1 x5356 -1 x2442 +1 x2438 >= 0 ;+-1 x5357 +1 x2443 >= 0 ;+-1 x5357 -1 x2439 >= -1 ;++1 x5357 -1 x2443 +1 x2439 >= 0 ;+-1 x5358 +1 x2444 >= 0 ;+-1 x5358 -1 x2440 >= -1 ;++1 x5358 -1 x2444 +1 x2440 >= 0 ;+-1 x5359 +1 x2445 >= 0 ;++1 x5359 -1 x2445 >= 0 ;+-1 x5360 +1 x2446 >= 0 ;++1 x5360 -1 x2446 >= 0 ;+-1 x5361 +1 x2447 >= 0 ;++1 x5361 -1 x2447 >= 0 ;+-1 x5362 +1 x2448 >= 0 ;+-1 x5362 -1 x2445 >= -1 ;++1 x5362 -1 x2448 +1 x2445 >= 0 ;+-1 x5363 +1 x2449 >= 0 ;+-1 x5363 -1 x2446 >= -1 ;++1 x5363 -1 x2449 +1 x2446 >= 0 ;+-1 x5364 +1 x2450 >= 0 ;+-1 x5364 -1 x2447 >= -1 ;++1 x5364 -1 x2450 +1 x2447 >= 0 ;+-1 x5365 +1 x2451 >= 0 ;+-1 x5365 -1 x2448 >= -1 ;++1 x5365 -1 x2451 +1 x2448 >= 0 ;+-1 x5366 +1 x2452 >= 0 ;+-1 x5366 -1 x2449 >= -1 ;++1 x5366 -1 x2452 +1 x2449 >= 0 ;+-1 x5367 +1 x2453 >= 0 ;+-1 x5367 -1 x2450 >= -1 ;++1 x5367 -1 x2453 +1 x2450 >= 0 ;+-1 x5368 +1 x2454 >= 0 ;+-1 x5368 -1 x2451 >= -1 ;++1 x5368 -1 x2454 +1 x2451 >= 0 ;+-1 x5369 +1 x2455 >= 0 ;+-1 x5369 -1 x2452 >= -1 ;++1 x5369 -1 x2455 +1 x2452 >= 0 ;+-1 x5370 +1 x2456 >= 0 ;+-1 x5370 -1 x2453 >= -1 ;++1 x5370 -1 x2456 +1 x2453 >= 0 ;+-1 x5371 +1 x2457 >= 0 ;+-1 x5371 -1 x2454 >= -1 ;++1 x5371 -1 x2457 +1 x2454 >= 0 ;+-1 x5372 +1 x2458 >= 0 ;+-1 x5372 -1 x2455 >= -1 ;++1 x5372 -1 x2458 +1 x2455 >= 0 ;+-1 x5373 +1 x2459 >= 0 ;+-1 x5373 -1 x2456 >= -1 ;++1 x5373 -1 x2459 +1 x2456 >= 0 ;+-1 x5374 +1 x2460 >= 0 ;+-1 x5374 -1 x2457 >= -1 ;++1 x5374 -1 x2460 +1 x2457 >= 0 ;+-1 x5375 +1 x2461 >= 0 ;+-1 x5375 -1 x2458 >= -1 ;++1 x5375 -1 x2461 +1 x2458 >= 0 ;+-1 x5376 +1 x2462 >= 0 ;+-1 x5376 -1 x2459 >= -1 ;++1 x5376 -1 x2462 +1 x2459 >= 0 ;+-1 x5377 +1 x2463 >= 0 ;+-1 x5377 -1 x2460 >= -1 ;++1 x5377 -1 x2463 +1 x2460 >= 0 ;+-1 x5378 +1 x2464 >= 0 ;+-1 x5378 -1 x2461 >= -1 ;++1 x5378 -1 x2464 +1 x2461 >= 0 ;+-1 x5379 +1 x2465 >= 0 ;+-1 x5379 -1 x2462 >= -1 ;++1 x5379 -1 x2465 +1 x2462 >= 0 ;+-1 x5380 +1 x2466 >= 0 ;+-1 x5380 -1 x2463 >= -1 ;++1 x5380 -1 x2466 +1 x2463 >= 0 ;+-1 x5381 +1 x2467 >= 0 ;+-1 x5381 -1 x2464 >= -1 ;++1 x5381 -1 x2467 +1 x2464 >= 0 ;+-1 x5382 +1 x2468 >= 0 ;+-1 x5382 -1 x2465 >= -1 ;++1 x5382 -1 x2468 +1 x2465 >= 0 ;+-1 x5383 +1 x2469 >= 0 ;+-1 x5383 -1 x2466 >= -1 ;++1 x5383 -1 x2469 +1 x2466 >= 0 ;+-1 x5384 +1 x2470 >= 0 ;+-1 x5384 -1 x2467 >= -1 ;++1 x5384 -1 x2470 +1 x2467 >= 0 ;+-1 x5385 +1 x2471 >= 0 ;+-1 x5385 -1 x2468 >= -1 ;++1 x5385 -1 x2471 +1 x2468 >= 0 ;+-1 x5386 +1 x2472 >= 0 ;+-1 x5386 -1 x2469 >= -1 ;++1 x5386 -1 x2472 +1 x2469 >= 0 ;+-1 x5387 +1 x2473 >= 0 ;+-1 x5387 -1 x2470 >= -1 ;++1 x5387 -1 x2473 +1 x2470 >= 0 ;+-1 x5388 +1 x2474 >= 0 ;+-1 x5388 -1 x2471 >= -1 ;++1 x5388 -1 x2474 +1 x2471 >= 0 ;+-1 x5389 +1 x2475 >= 0 ;+-1 x5389 -1 x2472 >= -1 ;++1 x5389 -1 x2475 +1 x2472 >= 0 ;+-1 x5390 +1 x2476 >= 0 ;+-1 x5390 -1 x2473 >= -1 ;++1 x5390 -1 x2476 +1 x2473 >= 0 ;+-1 x5391 +1 x2477 >= 0 ;+-1 x5391 -1 x2474 >= -1 ;++1 x5391 -1 x2477 +1 x2474 >= 0 ;+-1 x5392 +1 x2478 >= 0 ;+-1 x5392 -1 x2475 >= -1 ;++1 x5392 -1 x2478 +1 x2475 >= 0 ;+-1 x5393 +1 x2479 >= 0 ;+-1 x5393 -1 x2476 >= -1 ;++1 x5393 -1 x2479 +1 x2476 >= 0 ;+-1 x5394 +1 x2480 >= 0 ;+-1 x5394 -1 x2477 >= -1 ;++1 x5394 -1 x2480 +1 x2477 >= 0 ;+-1 x5395 +1 x2481 >= 0 ;+-1 x5395 -1 x2478 >= -1 ;++1 x5395 -1 x2481 +1 x2478 >= 0 ;+-1 x5396 +1 x2482 >= 0 ;+-1 x5396 -1 x2479 >= -1 ;++1 x5396 -1 x2482 +1 x2479 >= 0 ;+-1 x5397 +1 x2483 >= 0 ;+-1 x5397 -1 x2480 >= -1 ;++1 x5397 -1 x2483 +1 x2480 >= 0 ;+-1 x5398 +1 x2484 >= 0 ;+-1 x5398 -1 x2481 >= -1 ;++1 x5398 -1 x2484 +1 x2481 >= 0 ;+-1 x5399 +1 x2485 >= 0 ;+-1 x5399 -1 x2482 >= -1 ;++1 x5399 -1 x2485 +1 x2482 >= 0 ;+-1 x5400 +1 x2486 >= 0 ;+-1 x5400 -1 x2483 >= -1 ;++1 x5400 -1 x2486 +1 x2483 >= 0 ;+-1 x5401 +1 x2487 >= 0 ;+-1 x5401 -1 x2484 >= -1 ;++1 x5401 -1 x2487 +1 x2484 >= 0 ;+-1 x5402 +1 x2488 >= 0 ;+-1 x5402 -1 x2485 >= -1 ;++1 x5402 -1 x2488 +1 x2485 >= 0 ;+-1 x5403 +1 x2489 >= 0 ;+-1 x5403 -1 x2486 >= -1 ;++1 x5403 -1 x2489 +1 x2486 >= 0 ;+-1 x5404 +1 x2490 >= 0 ;+-1 x5404 -1 x2487 >= -1 ;++1 x5404 -1 x2490 +1 x2487 >= 0 ;+-1 x5405 +1 x2491 >= 0 ;+-1 x5405 -1 x2488 >= -1 ;++1 x5405 -1 x2491 +1 x2488 >= 0 ;+-1 x5406 +1 x2492 >= 0 ;+-1 x5406 -1 x2489 >= -1 ;++1 x5406 -1 x2492 +1 x2489 >= 0 ;+-1 x5407 +1 x2493 >= 0 ;+-1 x5407 -1 x2490 >= -1 ;++1 x5407 -1 x2493 +1 x2490 >= 0 ;+-1 x5408 +1 x2494 >= 0 ;+-1 x5408 -1 x2491 >= -1 ;++1 x5408 -1 x2494 +1 x2491 >= 0 ;+-1 x5409 +1 x2495 >= 0 ;+-1 x5409 -1 x2492 >= -1 ;++1 x5409 -1 x2495 +1 x2492 >= 0 ;+-1 x5410 +1 x2496 >= 0 ;+-1 x5410 -1 x2493 >= -1 ;++1 x5410 -1 x2496 +1 x2493 >= 0 ;+-1 x5411 +1 x2497 >= 0 ;+-1 x5411 -1 x2494 >= -1 ;++1 x5411 -1 x2497 +1 x2494 >= 0 ;+-1 x5412 +1 x2498 >= 0 ;+-1 x5412 -1 x2495 >= -1 ;++1 x5412 -1 x2498 +1 x2495 >= 0 ;+-1 x5413 +1 x2499 >= 0 ;+-1 x5413 -1 x2496 >= -1 ;++1 x5413 -1 x2499 +1 x2496 >= 0 ;+-1 x5414 +1 x2500 >= 0 ;+-1 x5414 -1 x2497 >= -1 ;++1 x5414 -1 x2500 +1 x2497 >= 0 ;+-1 x5415 +1 x2501 >= 0 ;+-1 x5415 -1 x2498 >= -1 ;++1 x5415 -1 x2501 +1 x2498 >= 0 ;+-1 x5416 +1 x2502 >= 0 ;+-1 x5416 -1 x2499 >= -1 ;++1 x5416 -1 x2502 +1 x2499 >= 0 ;+-1 x5417 +1 x2503 >= 0 ;+-1 x5417 -1 x2500 >= -1 ;++1 x5417 -1 x2503 +1 x2500 >= 0 ;+-1 x5418 +1 x2504 >= 0 ;+-1 x5418 -1 x2501 >= -1 ;++1 x5418 -1 x2504 +1 x2501 >= 0 ;+-1 x5419 +1 x2505 >= 0 ;+-1 x5419 -1 x2502 >= -1 ;++1 x5419 -1 x2505 +1 x2502 >= 0 ;+-1 x5420 +1 x2506 >= 0 ;+-1 x5420 -1 x2503 >= -1 ;++1 x5420 -1 x2506 +1 x2503 >= 0 ;+-1 x5421 +1 x2507 >= 0 ;+-1 x5421 -1 x2504 >= -1 ;++1 x5421 -1 x2507 +1 x2504 >= 0 ;+-1 x5422 +1 x2508 >= 0 ;+-1 x5422 -1 x2505 >= -1 ;++1 x5422 -1 x2508 +1 x2505 >= 0 ;+-1 x5423 +1 x2509 >= 0 ;+-1 x5423 -1 x2506 >= -1 ;++1 x5423 -1 x2509 +1 x2506 >= 0 ;+-1 x5424 +1 x2510 >= 0 ;+-1 x5424 -1 x2507 >= -1 ;++1 x5424 -1 x2510 +1 x2507 >= 0 ;+-1 x5425 +1 x2511 >= 0 ;+-1 x5425 -1 x2508 >= -1 ;++1 x5425 -1 x2511 +1 x2508 >= 0 ;+-1 x5426 +1 x2512 >= 0 ;+-1 x5426 -1 x2509 >= -1 ;++1 x5426 -1 x2512 +1 x2509 >= 0 ;+-1 x5427 +1 x2513 >= 0 ;+-1 x5427 -1 x2510 >= -1 ;++1 x5427 -1 x2513 +1 x2510 >= 0 ;+-1 x5428 +1 x2514 >= 0 ;+-1 x5428 -1 x2511 >= -1 ;++1 x5428 -1 x2514 +1 x2511 >= 0 ;+-1 x5429 +1 x2515 >= 0 ;+-1 x5429 -1 x2512 >= -1 ;++1 x5429 -1 x2515 +1 x2512 >= 0 ;+-1 x5430 +1 x2516 >= 0 ;+-1 x5430 -1 x2513 >= -1 ;++1 x5430 -1 x2516 +1 x2513 >= 0 ;+-1 x5431 +1 x2517 >= 0 ;+-1 x5431 -1 x2514 >= -1 ;++1 x5431 -1 x2517 +1 x2514 >= 0 ;+-1 x5432 +1 x2518 >= 0 ;+-1 x5432 -1 x2515 >= -1 ;++1 x5432 -1 x2518 +1 x2515 >= 0 ;+-1 x5433 +1 x2519 >= 0 ;+-1 x5433 -1 x2516 >= -1 ;++1 x5433 -1 x2519 +1 x2516 >= 0 ;+-1 x5434 +1 x2520 >= 0 ;+-1 x5434 -1 x2517 >= -1 ;++1 x5434 -1 x2520 +1 x2517 >= 0 ;+-1 x5435 +1 x2521 >= 0 ;+-1 x5435 -1 x2518 >= -1 ;++1 x5435 -1 x2521 +1 x2518 >= 0 ;+-1 x5436 +1 x2522 >= 0 ;+-1 x5436 -1 x2519 >= -1 ;++1 x5436 -1 x2522 +1 x2519 >= 0 ;+-1 x5437 +1 x2523 >= 0 ;+-1 x5437 -1 x2520 >= -1 ;++1 x5437 -1 x2523 +1 x2520 >= 0 ;+-1 x5438 +1 x2524 >= 0 ;+-1 x5438 -1 x2521 >= -1 ;++1 x5438 -1 x2524 +1 x2521 >= 0 ;+-1 x5439 +1 x2525 >= 0 ;+-1 x5439 -1 x2522 >= -1 ;++1 x5439 -1 x2525 +1 x2522 >= 0 ;+-1 x5440 +1 x2526 >= 0 ;+-1 x5440 -1 x2523 >= -1 ;++1 x5440 -1 x2526 +1 x2523 >= 0 ;+-1 x5441 +1 x2527 >= 0 ;+-1 x5441 -1 x2524 >= -1 ;++1 x5441 -1 x2527 +1 x2524 >= 0 ;+-1 x5442 +1 x2528 >= 0 ;+-1 x5442 -1 x2525 >= -1 ;++1 x5442 -1 x2528 +1 x2525 >= 0 ;+-1 x5443 +1 x2529 >= 0 ;+-1 x5443 -1 x2526 >= -1 ;++1 x5443 -1 x2529 +1 x2526 >= 0 ;+-1 x5444 +1 x2530 >= 0 ;+-1 x5444 -1 x2527 >= -1 ;++1 x5444 -1 x2530 +1 x2527 >= 0 ;+-1 x5445 +1 x2531 >= 0 ;+-1 x5445 -1 x2528 >= -1 ;++1 x5445 -1 x2531 +1 x2528 >= 0 ;+-1 x5446 +1 x2532 >= 0 ;+-1 x5446 -1 x2529 >= -1 ;++1 x5446 -1 x2532 +1 x2529 >= 0 ;+-1 x5447 +1 x2533 >= 0 ;+-1 x5447 -1 x2530 >= -1 ;++1 x5447 -1 x2533 +1 x2530 >= 0 ;+-1 x5448 +1 x2534 >= 0 ;+-1 x5448 -1 x2531 >= -1 ;++1 x5448 -1 x2534 +1 x2531 >= 0 ;+-1 x5449 +1 x2535 >= 0 ;+-1 x5449 -1 x2532 >= -1 ;++1 x5449 -1 x2535 +1 x2532 >= 0 ;+-1 x5450 +1 x2536 >= 0 ;+-1 x5450 -1 x2533 >= -1 ;++1 x5450 -1 x2536 +1 x2533 >= 0 ;+-1 x5451 +1 x2537 >= 0 ;+-1 x5451 -1 x2534 >= -1 ;++1 x5451 -1 x2537 +1 x2534 >= 0 ;+-1 x5452 +1 x2538 >= 0 ;+-1 x5452 -1 x2535 >= -1 ;++1 x5452 -1 x2538 +1 x2535 >= 0 ;+-1 x5453 +1 x2539 >= 0 ;++1 x5453 -1 x2539 >= 0 ;+-1 x5454 +1 x2540 >= 0 ;++1 x5454 -1 x2540 >= 0 ;+-1 x5455 +1 x2541 >= 0 ;+-1 x5455 -1 x2539 >= -1 ;++1 x5455 -1 x2541 +1 x2539 >= 0 ;+-1 x5456 +1 x2542 >= 0 ;+-1 x5456 -1 x2540 >= -1 ;++1 x5456 -1 x2542 +1 x2540 >= 0 ;+-1 x5457 +1 x2543 >= 0 ;+-1 x5457 -1 x2541 >= -1 ;++1 x5457 -1 x2543 +1 x2541 >= 0 ;+-1 x5458 +1 x2544 >= 0 ;+-1 x5458 -1 x2542 >= -1 ;++1 x5458 -1 x2544 +1 x2542 >= 0 ;+-1 x5459 +1 x2545 >= 0 ;+-1 x5459 -1 x2543 >= -1 ;++1 x5459 -1 x2545 +1 x2543 >= 0 ;+-1 x5460 +1 x2546 >= 0 ;+-1 x5460 -1 x2544 >= -1 ;++1 x5460 -1 x2546 +1 x2544 >= 0 ;+-1 x5461 +1 x2547 >= 0 ;+-1 x5461 -1 x2545 >= -1 ;++1 x5461 -1 x2547 +1 x2545 >= 0 ;+-1 x5462 +1 x2548 >= 0 ;+-1 x5462 -1 x2546 >= -1 ;++1 x5462 -1 x2548 +1 x2546 >= 0 ;+-1 x5463 +1 x2549 >= 0 ;+-1 x5463 -1 x2547 >= -1 ;++1 x5463 -1 x2549 +1 x2547 >= 0 ;+-1 x5464 +1 x2550 >= 0 ;+-1 x5464 -1 x2548 >= -1 ;++1 x5464 -1 x2550 +1 x2548 >= 0 ;+-1 x5465 +1 x2551 >= 0 ;+-1 x5465 -1 x2549 >= -1 ;++1 x5465 -1 x2551 +1 x2549 >= 0 ;+-1 x5466 +1 x2552 >= 0 ;+-1 x5466 -1 x2550 >= -1 ;++1 x5466 -1 x2552 +1 x2550 >= 0 ;+-1 x5467 +1 x2553 >= 0 ;+-1 x5467 -1 x2551 >= -1 ;++1 x5467 -1 x2553 +1 x2551 >= 0 ;+-1 x5468 +1 x2554 >= 0 ;+-1 x5468 -1 x2552 >= -1 ;++1 x5468 -1 x2554 +1 x2552 >= 0 ;+-1 x5469 +1 x2555 >= 0 ;+-1 x5469 -1 x2553 >= -1 ;++1 x5469 -1 x2555 +1 x2553 >= 0 ;+-1 x5470 +1 x2556 >= 0 ;+-1 x5470 -1 x2554 >= -1 ;++1 x5470 -1 x2556 +1 x2554 >= 0 ;+-1 x5471 +1 x2557 >= 0 ;+-1 x5471 -1 x2555 >= -1 ;++1 x5471 -1 x2557 +1 x2555 >= 0 ;+-1 x5472 +1 x2558 >= 0 ;+-1 x5472 -1 x2556 >= -1 ;++1 x5472 -1 x2558 +1 x2556 >= 0 ;+-1 x5473 +1 x2559 >= 0 ;+-1 x5473 -1 x2557 >= -1 ;++1 x5473 -1 x2559 +1 x2557 >= 0 ;+-1 x5474 +1 x2560 >= 0 ;+-1 x5474 -1 x2558 >= -1 ;++1 x5474 -1 x2560 +1 x2558 >= 0 ;+-1 x5475 +1 x2561 >= 0 ;+-1 x5475 -1 x2559 >= -1 ;++1 x5475 -1 x2561 +1 x2559 >= 0 ;+-1 x5476 +1 x2562 >= 0 ;+-1 x5476 -1 x2560 >= -1 ;++1 x5476 -1 x2562 +1 x2560 >= 0 ;+-1 x5477 +1 x2563 >= 0 ;+-1 x5477 -1 x2561 >= -1 ;++1 x5477 -1 x2563 +1 x2561 >= 0 ;+-1 x5478 +1 x2564 >= 0 ;+-1 x5478 -1 x2562 >= -1 ;++1 x5478 -1 x2564 +1 x2562 >= 0 ;+-1 x5479 +1 x2565 >= 0 ;+-1 x5479 -1 x2563 >= -1 ;++1 x5479 -1 x2565 +1 x2563 >= 0 ;+-1 x5480 +1 x2566 >= 0 ;+-1 x5480 -1 x2564 >= -1 ;++1 x5480 -1 x2566 +1 x2564 >= 0 ;+-1 x5481 +1 x2567 >= 0 ;+-1 x5481 -1 x2565 >= -1 ;++1 x5481 -1 x2567 +1 x2565 >= 0 ;+-1 x5482 +1 x2568 >= 0 ;+-1 x5482 -1 x2566 >= -1 ;++1 x5482 -1 x2568 +1 x2566 >= 0 ;+-1 x5483 +1 x2569 >= 0 ;+-1 x5483 -1 x2567 >= -1 ;++1 x5483 -1 x2569 +1 x2567 >= 0 ;+-1 x5484 +1 x2570 >= 0 ;+-1 x5484 -1 x2568 >= -1 ;++1 x5484 -1 x2570 +1 x2568 >= 0 ;+-1 x5485 +1 x2571 >= 0 ;+-1 x5485 -1 x2569 >= -1 ;++1 x5485 -1 x2571 +1 x2569 >= 0 ;+-1 x5486 +1 x2572 >= 0 ;+-1 x5486 -1 x2570 >= -1 ;++1 x5486 -1 x2572 +1 x2570 >= 0 ;+-1 x5487 +1 x2573 >= 0 ;+-1 x5487 -1 x2571 >= -1 ;++1 x5487 -1 x2573 +1 x2571 >= 0 ;+-1 x5488 +1 x2574 >= 0 ;+-1 x5488 -1 x2572 >= -1 ;++1 x5488 -1 x2574 +1 x2572 >= 0 ;+-1 x5489 +1 x2575 >= 0 ;+-1 x5489 -1 x2573 >= -1 ;++1 x5489 -1 x2575 +1 x2573 >= 0 ;+-1 x5490 +1 x2576 >= 0 ;+-1 x5490 -1 x2574 >= -1 ;++1 x5490 -1 x2576 +1 x2574 >= 0 ;+-1 x5491 +1 x2577 >= 0 ;+-1 x5491 -1 x2575 >= -1 ;++1 x5491 -1 x2577 +1 x2575 >= 0 ;+-1 x5492 +1 x2578 >= 0 ;+-1 x5492 -1 x2576 >= -1 ;++1 x5492 -1 x2578 +1 x2576 >= 0 ;+-1 x5493 +1 x2579 >= 0 ;+-1 x5493 -1 x2577 >= -1 ;++1 x5493 -1 x2579 +1 x2577 >= 0 ;+-1 x5494 +1 x2580 >= 0 ;+-1 x5494 -1 x2578 >= -1 ;++1 x5494 -1 x2580 +1 x2578 >= 0 ;+-1 x5495 +1 x2581 >= 0 ;+-1 x5495 -1 x2579 >= -1 ;++1 x5495 -1 x2581 +1 x2579 >= 0 ;+-1 x5496 +1 x2582 >= 0 ;+-1 x5496 -1 x2580 >= -1 ;++1 x5496 -1 x2582 +1 x2580 >= 0 ;+-1 x5497 +1 x2583 >= 0 ;+-1 x5497 -1 x2581 >= -1 ;++1 x5497 -1 x2583 +1 x2581 >= 0 ;+-1 x5498 +1 x2584 >= 0 ;+-1 x5498 -1 x2582 >= -1 ;++1 x5498 -1 x2584 +1 x2582 >= 0 ;+-1 x5499 +1 x2585 >= 0 ;+-1 x5499 -1 x2583 >= -1 ;++1 x5499 -1 x2585 +1 x2583 >= 0 ;+-1 x5500 +1 x2586 >= 0 ;+-1 x5500 -1 x2584 >= -1 ;++1 x5500 -1 x2586 +1 x2584 >= 0 ;+-1 x5501 +1 x2587 >= 0 ;+-1 x5501 -1 x2585 >= -1 ;++1 x5501 -1 x2587 +1 x2585 >= 0 ;+-1 x5502 +1 x2588 >= 0 ;+-1 x5502 -1 x2586 >= -1 ;++1 x5502 -1 x2588 +1 x2586 >= 0 ;+-1 x5503 +1 x2589 >= 0 ;+-1 x5503 -1 x2587 >= -1 ;++1 x5503 -1 x2589 +1 x2587 >= 0 ;+-1 x5504 +1 x2590 >= 0 ;+-1 x5504 -1 x2588 >= -1 ;++1 x5504 -1 x2590 +1 x2588 >= 0 ;+-1 x5505 +1 x2591 >= 0 ;+-1 x5505 -1 x2589 >= -1 ;++1 x5505 -1 x2591 +1 x2589 >= 0 ;+-1 x5506 +1 x2592 >= 0 ;+-1 x5506 -1 x2590 >= -1 ;++1 x5506 -1 x2592 +1 x2590 >= 0 ;+-1 x5507 +1 x2593 >= 0 ;+-1 x5507 -1 x2591 >= -1 ;++1 x5507 -1 x2593 +1 x2591 >= 0 ;+-1 x5508 +1 x2594 >= 0 ;+-1 x5508 -1 x2592 >= -1 ;++1 x5508 -1 x2594 +1 x2592 >= 0 ;+-1 x5509 +1 x2595 >= 0 ;+-1 x5509 -1 x2593 >= -1 ;++1 x5509 -1 x2595 +1 x2593 >= 0 ;+-1 x5510 +1 x2596 >= 0 ;+-1 x5510 -1 x2594 >= -1 ;++1 x5510 -1 x2596 +1 x2594 >= 0 ;+-1 x5511 +1 x2597 >= 0 ;+-1 x5511 -1 x2595 >= -1 ;++1 x5511 -1 x2597 +1 x2595 >= 0 ;+-1 x5512 +1 x2598 >= 0 ;+-1 x5512 -1 x2596 >= -1 ;++1 x5512 -1 x2598 +1 x2596 >= 0 ;+-1 x5513 +1 x2599 >= 0 ;+-1 x5513 -1 x2597 >= -1 ;++1 x5513 -1 x2599 +1 x2597 >= 0 ;+-1 x5514 +1 x2600 >= 0 ;+-1 x5514 -1 x2598 >= -1 ;++1 x5514 -1 x2600 +1 x2598 >= 0 ;+-1 x5515 +1 x2601 >= 0 ;+-1 x5515 -1 x2599 >= -1 ;++1 x5515 -1 x2601 +1 x2599 >= 0 ;+-1 x5516 +1 x2602 >= 0 ;+-1 x5516 -1 x2600 >= -1 ;++1 x5516 -1 x2602 +1 x2600 >= 0 ;+-1 x5517 +1 x2603 >= 0 ;+-1 x5517 -1 x2601 >= -1 ;++1 x5517 -1 x2603 +1 x2601 >= 0 ;+-1 x5518 +1 x2604 >= 0 ;+-1 x5518 -1 x2602 >= -1 ;++1 x5518 -1 x2604 +1 x2602 >= 0 ;+-1 x5519 +1 x2605 >= 0 ;+-1 x5519 -1 x2603 >= -1 ;++1 x5519 -1 x2605 +1 x2603 >= 0 ;+-1 x5520 +1 x2606 >= 0 ;+-1 x5520 -1 x2604 >= -1 ;++1 x5520 -1 x2606 +1 x2604 >= 0 ;+-1 x5521 +1 x2607 >= 0 ;+-1 x5521 -1 x2605 >= -1 ;++1 x5521 -1 x2607 +1 x2605 >= 0 ;+-1 x5522 +1 x2608 >= 0 ;+-1 x5522 -1 x2606 >= -1 ;++1 x5522 -1 x2608 +1 x2606 >= 0 ;+-1 x5523 +1 x2609 >= 0 ;+-1 x5523 -1 x2607 >= -1 ;++1 x5523 -1 x2609 +1 x2607 >= 0 ;+-1 x5524 +1 x2610 >= 0 ;+-1 x5524 -1 x2608 >= -1 ;++1 x5524 -1 x2610 +1 x2608 >= 0 ;+-1 x5525 +1 x2611 >= 0 ;+-1 x5525 -1 x2609 >= -1 ;++1 x5525 -1 x2611 +1 x2609 >= 0 ;+-1 x5526 +1 x2612 >= 0 ;+-1 x5526 -1 x2610 >= -1 ;++1 x5526 -1 x2612 +1 x2610 >= 0 ;+-1 x5527 +1 x2613 >= 0 ;+-1 x5527 -1 x2611 >= -1 ;++1 x5527 -1 x2613 +1 x2611 >= 0 ;+-1 x5528 +1 x2614 >= 0 ;+-1 x5528 -1 x2612 >= -1 ;++1 x5528 -1 x2614 +1 x2612 >= 0 ;+-1 x5529 +1 x2615 >= 0 ;+-1 x5529 -1 x2613 >= -1 ;++1 x5529 -1 x2615 +1 x2613 >= 0 ;+-1 x5530 +1 x2616 >= 0 ;+-1 x5530 -1 x2614 >= -1 ;++1 x5530 -1 x2616 +1 x2614 >= 0 ;+-1 x5531 +1 x2617 >= 0 ;+-1 x5531 -1 x2615 >= -1 ;++1 x5531 -1 x2617 +1 x2615 >= 0 ;+-1 x5532 +1 x2618 >= 0 ;+-1 x5532 -1 x2616 >= -1 ;++1 x5532 -1 x2618 +1 x2616 >= 0 ;+-1 x5533 +1 x2619 >= 0 ;+-1 x5533 -1 x2617 >= -1 ;++1 x5533 -1 x2619 +1 x2617 >= 0 ;+-1 x5534 +1 x2620 >= 0 ;+-1 x5534 -1 x2618 >= -1 ;++1 x5534 -1 x2620 +1 x2618 >= 0 ;+-1 x5535 +1 x2621 >= 0 ;+-1 x5535 -1 x2619 >= -1 ;++1 x5535 -1 x2621 +1 x2619 >= 0 ;+-1 x5536 +1 x2622 >= 0 ;+-1 x5536 -1 x2620 >= -1 ;++1 x5536 -1 x2622 +1 x2620 >= 0 ;+-1 x5537 +1 x2623 >= 0 ;+-1 x5537 -1 x2621 >= -1 ;++1 x5537 -1 x2623 +1 x2621 >= 0 ;+-1 x5538 +1 x2624 >= 0 ;+-1 x5538 -1 x2622 >= -1 ;++1 x5538 -1 x2624 +1 x2622 >= 0 ;+-1 x5539 +1 x2625 >= 0 ;+-1 x5539 -1 x2623 >= -1 ;++1 x5539 -1 x2625 +1 x2623 >= 0 ;+-1 x5540 +1 x2626 >= 0 ;+-1 x5540 -1 x2624 >= -1 ;++1 x5540 -1 x2626 +1 x2624 >= 0 ;+-1 x5541 +1 x2627 >= 0 ;+-1 x5541 -1 x2625 >= -1 ;++1 x5541 -1 x2627 +1 x2625 >= 0 ;+-1 x5542 +1 x2628 >= 0 ;+-1 x5542 -1 x2626 >= -1 ;++1 x5542 -1 x2628 +1 x2626 >= 0 ;+-1 x5543 +1 x2629 >= 0 ;+-1 x5543 -1 x2627 >= -1 ;++1 x5543 -1 x2629 +1 x2627 >= 0 ;+-1 x5544 +1 x2630 >= 0 ;+-1 x5544 -1 x2628 >= -1 ;++1 x5544 -1 x2630 +1 x2628 >= 0 ;+-1 x5545 +1 x2631 >= 0 ;+-1 x5545 -1 x2629 >= -1 ;++1 x5545 -1 x2631 +1 x2629 >= 0 ;+-1 x5546 +1 x2632 >= 0 ;+-1 x5546 -1 x2630 >= -1 ;++1 x5546 -1 x2632 +1 x2630 >= 0 ;+-1 x5547 +1 x2633 >= 0 ;++1 x5547 -1 x2633 >= 0 ;+-1 x5548 +1 x2634 >= 0 ;+-1 x5548 -1 x2633 >= -1 ;++1 x5548 -1 x2634 +1 x2633 >= 0 ;+-1 x5549 +1 x2635 >= 0 ;+-1 x5549 -1 x2634 >= -1 ;++1 x5549 -1 x2635 +1 x2634 >= 0 ;+-1 x5550 +1 x2636 >= 0 ;+-1 x5550 -1 x2635 >= -1 ;++1 x5550 -1 x2636 +1 x2635 >= 0 ;+-1 x5551 +1 x2637 >= 0 ;+-1 x5551 -1 x2636 >= -1 ;++1 x5551 -1 x2637 +1 x2636 >= 0 ;+-1 x5552 +1 x2638 >= 0 ;+-1 x5552 -1 x2637 >= -1 ;++1 x5552 -1 x2638 +1 x2637 >= 0 ;+-1 x5553 +1 x2639 >= 0 ;+-1 x5553 -1 x2638 >= -1 ;++1 x5553 -1 x2639 +1 x2638 >= 0 ;+-1 x5554 +1 x2640 >= 0 ;+-1 x5554 -1 x2639 >= -1 ;++1 x5554 -1 x2640 +1 x2639 >= 0 ;+-1 x5555 +1 x2641 >= 0 ;+-1 x5555 -1 x2640 >= -1 ;++1 x5555 -1 x2641 +1 x2640 >= 0 ;+-1 x5556 +1 x2642 >= 0 ;+-1 x5556 -1 x2641 >= -1 ;++1 x5556 -1 x2642 +1 x2641 >= 0 ;+-1 x5557 +1 x2643 >= 0 ;+-1 x5557 -1 x2642 >= -1 ;++1 x5557 -1 x2643 +1 x2642 >= 0 ;+-1 x5558 +1 x2644 >= 0 ;+-1 x5558 -1 x2643 >= -1 ;++1 x5558 -1 x2644 +1 x2643 >= 0 ;+-1 x5559 +1 x2645 >= 0 ;+-1 x5559 -1 x2644 >= -1 ;++1 x5559 -1 x2645 +1 x2644 >= 0 ;+-1 x5560 +1 x2646 >= 0 ;+-1 x5560 -1 x2645 >= -1 ;++1 x5560 -1 x2646 +1 x2645 >= 0 ;+-1 x5561 +1 x2647 >= 0 ;+-1 x5561 -1 x2646 >= -1 ;++1 x5561 -1 x2647 +1 x2646 >= 0 ;+-1 x5562 +1 x2648 >= 0 ;+-1 x5562 -1 x2647 >= -1 ;++1 x5562 -1 x2648 +1 x2647 >= 0 ;+-1 x5563 +1 x2649 >= 0 ;+-1 x5563 -1 x2648 >= -1 ;++1 x5563 -1 x2649 +1 x2648 >= 0 ;+-1 x5564 +1 x2650 >= 0 ;+-1 x5564 -1 x2649 >= -1 ;++1 x5564 -1 x2650 +1 x2649 >= 0 ;+-1 x5565 +1 x2651 >= 0 ;+-1 x5565 -1 x2650 >= -1 ;++1 x5565 -1 x2651 +1 x2650 >= 0 ;+-1 x5566 +1 x2652 >= 0 ;+-1 x5566 -1 x2651 >= -1 ;++1 x5566 -1 x2652 +1 x2651 >= 0 ;+-1 x5567 +1 x2653 >= 0 ;+-1 x5567 -1 x2652 >= -1 ;++1 x5567 -1 x2653 +1 x2652 >= 0 ;+-1 x5568 +1 x2654 >= 0 ;+-1 x5568 -1 x2653 >= -1 ;++1 x5568 -1 x2654 +1 x2653 >= 0 ;+-1 x5569 +1 x2655 >= 0 ;+-1 x5569 -1 x2654 >= -1 ;++1 x5569 -1 x2655 +1 x2654 >= 0 ;+-1 x5570 +1 x2656 >= 0 ;+-1 x5570 -1 x2655 >= -1 ;++1 x5570 -1 x2656 +1 x2655 >= 0 ;+-1 x5571 +1 x2657 >= 0 ;+-1 x5571 -1 x2656 >= -1 ;++1 x5571 -1 x2657 +1 x2656 >= 0 ;+-1 x5572 +1 x2658 >= 0 ;+-1 x5572 -1 x2657 >= -1 ;++1 x5572 -1 x2658 +1 x2657 >= 0 ;+-1 x5573 +1 x2659 >= 0 ;+-1 x5573 -1 x2658 >= -1 ;++1 x5573 -1 x2659 +1 x2658 >= 0 ;+-1 x5574 +1 x2660 >= 0 ;+-1 x5574 -1 x2659 >= -1 ;++1 x5574 -1 x2660 +1 x2659 >= 0 ;+-1 x5575 +1 x2661 >= 0 ;+-1 x5575 -1 x2660 >= -1 ;++1 x5575 -1 x2661 +1 x2660 >= 0 ;+-1 x5576 +1 x2662 >= 0 ;+-1 x5576 -1 x2661 >= -1 ;++1 x5576 -1 x2662 +1 x2661 >= 0 ;+-1 x5577 +1 x2663 >= 0 ;+-1 x5577 -1 x2662 >= -1 ;++1 x5577 -1 x2663 +1 x2662 >= 0 ;+-1 x5578 +1 x2664 >= 0 ;+-1 x5578 -1 x2663 >= -1 ;++1 x5578 -1 x2664 +1 x2663 >= 0 ;+-1 x5579 +1 x2665 >= 0 ;+-1 x5579 -1 x2664 >= -1 ;++1 x5579 -1 x2665 +1 x2664 >= 0 ;+-1 x5580 +1 x2666 >= 0 ;+-1 x5580 -1 x2665 >= -1 ;++1 x5580 -1 x2666 +1 x2665 >= 0 ;+-1 x5581 +1 x2667 >= 0 ;+-1 x5581 -1 x2666 >= -1 ;++1 x5581 -1 x2667 +1 x2666 >= 0 ;+-1 x5582 +1 x2668 >= 0 ;+-1 x5582 -1 x2667 >= -1 ;++1 x5582 -1 x2668 +1 x2667 >= 0 ;+-1 x5583 +1 x2669 >= 0 ;+-1 x5583 -1 x2668 >= -1 ;++1 x5583 -1 x2669 +1 x2668 >= 0 ;+-1 x5584 +1 x2670 >= 0 ;+-1 x5584 -1 x2669 >= -1 ;++1 x5584 -1 x2670 +1 x2669 >= 0 ;+-1 x5585 +1 x2671 >= 0 ;+-1 x5585 -1 x2670 >= -1 ;++1 x5585 -1 x2671 +1 x2670 >= 0 ;+-1 x5586 +1 x2672 >= 0 ;+-1 x5586 -1 x2671 >= -1 ;++1 x5586 -1 x2672 +1 x2671 >= 0 ;+-1 x5587 +1 x2673 >= 0 ;+-1 x5587 -1 x2672 >= -1 ;++1 x5587 -1 x2673 +1 x2672 >= 0 ;+-1 x5588 +1 x2674 >= 0 ;+-1 x5588 -1 x2673 >= -1 ;++1 x5588 -1 x2674 +1 x2673 >= 0 ;+-1 x5589 +1 x2675 >= 0 ;+-1 x5589 -1 x2674 >= -1 ;++1 x5589 -1 x2675 +1 x2674 >= 0 ;+-1 x5590 +1 x2676 >= 0 ;+-1 x5590 -1 x2675 >= -1 ;++1 x5590 -1 x2676 +1 x2675 >= 0 ;+-1 x5591 +1 x2677 >= 0 ;+-1 x5591 -1 x2676 >= -1 ;++1 x5591 -1 x2677 +1 x2676 >= 0 ;+-1 x5592 +1 x2678 >= 0 ;+-1 x5592 -1 x2677 >= -1 ;++1 x5592 -1 x2678 +1 x2677 >= 0 ;+-1 x5593 +1 x2679 >= 0 ;+-1 x5593 -1 x2678 >= -1 ;++1 x5593 -1 x2679 +1 x2678 >= 0 ;+-1 x5594 +1 x2680 >= 0 ;+-1 x5594 -1 x2679 >= -1 ;++1 x5594 -1 x2680 +1 x2679 >= 0 ;+-1 x5595 +1 x2681 >= 0 ;+-1 x5595 -1 x2680 >= -1 ;++1 x5595 -1 x2681 +1 x2680 >= 0 ;+-1 x5596 +1 x2682 >= 0 ;+-1 x5596 -1 x2681 >= -1 ;++1 x5596 -1 x2682 +1 x2681 >= 0 ;+-1 x5597 +1 x2683 >= 0 ;+-1 x5597 -1 x2682 >= -1 ;++1 x5597 -1 x2683 +1 x2682 >= 0 ;+-1 x5598 +1 x2684 >= 0 ;+-1 x5598 -1 x2683 >= -1 ;++1 x5598 -1 x2684 +1 x2683 >= 0 ;+-1 x5599 +1 x2685 >= 0 ;+-1 x5599 -1 x2684 >= -1 ;++1 x5599 -1 x2685 +1 x2684 >= 0 ;+-1 x5600 +1 x2686 >= 0 ;+-1 x5600 -1 x2685 >= -1 ;++1 x5600 -1 x2686 +1 x2685 >= 0 ;+-1 x5601 +1 x2687 >= 0 ;+-1 x5601 -1 x2686 >= -1 ;++1 x5601 -1 x2687 +1 x2686 >= 0 ;+-1 x5602 +1 x2688 >= 0 ;+-1 x5602 -1 x2687 >= -1 ;++1 x5602 -1 x2688 +1 x2687 >= 0 ;+-1 x5603 +1 x2689 >= 0 ;+-1 x5603 -1 x2688 >= -1 ;++1 x5603 -1 x2689 +1 x2688 >= 0 ;+-1 x5604 +1 x2690 >= 0 ;+-1 x5604 -1 x2689 >= -1 ;++1 x5604 -1 x2690 +1 x2689 >= 0 ;+-1 x5605 +1 x2691 >= 0 ;+-1 x5605 -1 x2690 >= -1 ;++1 x5605 -1 x2691 +1 x2690 >= 0 ;+-1 x5606 +1 x2692 >= 0 ;+-1 x5606 -1 x2691 >= -1 ;++1 x5606 -1 x2692 +1 x2691 >= 0 ;+-1 x5607 +1 x2693 >= 0 ;+-1 x5607 -1 x2692 >= -1 ;++1 x5607 -1 x2693 +1 x2692 >= 0 ;+-1 x5608 +1 x2694 >= 0 ;+-1 x5608 -1 x2693 >= -1 ;++1 x5608 -1 x2694 +1 x2693 >= 0 ;+-1 x5609 +1 x2695 >= 0 ;+-1 x5609 -1 x2694 >= -1 ;++1 x5609 -1 x2695 +1 x2694 >= 0 ;+-1 x5610 +1 x2696 >= 0 ;+-1 x5610 -1 x2695 >= -1 ;++1 x5610 -1 x2696 +1 x2695 >= 0 ;+-1 x5611 +1 x2697 >= 0 ;+-1 x5611 -1 x2696 >= -1 ;++1 x5611 -1 x2697 +1 x2696 >= 0 ;+-1 x5612 +1 x2698 >= 0 ;+-1 x5612 -1 x2697 >= -1 ;++1 x5612 -1 x2698 +1 x2697 >= 0 ;+-1 x5613 +1 x2699 >= 0 ;+-1 x5613 -1 x2698 >= -1 ;++1 x5613 -1 x2699 +1 x2698 >= 0 ;+-1 x5614 +1 x2700 >= 0 ;+-1 x5614 -1 x2699 >= -1 ;++1 x5614 -1 x2700 +1 x2699 >= 0 ;+-1 x5615 +1 x2701 >= 0 ;+-1 x5615 -1 x2700 >= -1 ;++1 x5615 -1 x2701 +1 x2700 >= 0 ;+-1 x5616 +1 x2702 >= 0 ;+-1 x5616 -1 x2701 >= -1 ;++1 x5616 -1 x2702 +1 x2701 >= 0 ;+-1 x5617 +1 x2703 >= 0 ;+-1 x5617 -1 x2702 >= -1 ;++1 x5617 -1 x2703 +1 x2702 >= 0 ;+-1 x5618 +1 x2704 >= 0 ;+-1 x5618 -1 x2703 >= -1 ;++1 x5618 -1 x2704 +1 x2703 >= 0 ;+-1 x5619 +1 x2705 >= 0 ;+-1 x5619 -1 x2704 >= -1 ;++1 x5619 -1 x2705 +1 x2704 >= 0 ;+-1 x5620 +1 x2706 >= 0 ;+-1 x5620 -1 x2705 >= -1 ;++1 x5620 -1 x2706 +1 x2705 >= 0 ;+-1 x5621 +1 x2707 >= 0 ;+-1 x5621 -1 x2706 >= -1 ;++1 x5621 -1 x2707 +1 x2706 >= 0 ;+-1 x5622 +1 x2708 >= 0 ;+-1 x5622 -1 x2707 >= -1 ;++1 x5622 -1 x2708 +1 x2707 >= 0 ;+-1 x5623 +1 x2709 >= 0 ;+-1 x5623 -1 x2708 >= -1 ;++1 x5623 -1 x2709 +1 x2708 >= 0 ;+-1 x5624 +1 x2710 >= 0 ;+-1 x5624 -1 x2709 >= -1 ;++1 x5624 -1 x2710 +1 x2709 >= 0 ;+-1 x5625 +1 x2711 >= 0 ;+-1 x5625 -1 x2710 >= -1 ;++1 x5625 -1 x2711 +1 x2710 >= 0 ;+-1 x5626 +1 x2712 >= 0 ;+-1 x5626 -1 x2711 >= -1 ;++1 x5626 -1 x2712 +1 x2711 >= 0 ;+-1 x5627 +1 x2713 >= 0 ;+-1 x5627 -1 x2712 >= -1 ;++1 x5627 -1 x2713 +1 x2712 >= 0 ;+-1 x5628 +1 x2714 >= 0 ;+-1 x5628 -1 x2713 >= -1 ;++1 x5628 -1 x2714 +1 x2713 >= 0 ;+-1 x5629 +1 x2715 >= 0 ;+-1 x5629 -1 x2714 >= -1 ;++1 x5629 -1 x2715 +1 x2714 >= 0 ;+-1 x5630 +1 x2716 >= 0 ;+-1 x5630 -1 x2715 >= -1 ;++1 x5630 -1 x2716 +1 x2715 >= 0 ;+-1 x5631 +1 x2717 >= 0 ;+-1 x5631 -1 x2716 >= -1 ;++1 x5631 -1 x2717 +1 x2716 >= 0 ;+-1 x5632 +1 x2718 >= 0 ;+-1 x5632 -1 x2717 >= -1 ;++1 x5632 -1 x2718 +1 x2717 >= 0 ;+-1 x5633 +1 x2719 >= 0 ;+-1 x5633 -1 x2718 >= -1 ;++1 x5633 -1 x2719 +1 x2718 >= 0 ;+-1 x5634 +1 x2720 >= 0 ;+-1 x5634 -1 x2719 >= -1 ;++1 x5634 -1 x2720 +1 x2719 >= 0 ;+-1 x5635 +1 x2721 >= 0 ;+-1 x5635 -1 x2720 >= -1 ;++1 x5635 -1 x2721 +1 x2720 >= 0 ;+-1 x5636 +1 x2722 >= 0 ;+-1 x5636 -1 x2721 >= -1 ;++1 x5636 -1 x2722 +1 x2721 >= 0 ;+-1 x5637 +1 x2723 >= 0 ;+-1 x5637 -1 x2722 >= -1 ;++1 x5637 -1 x2723 +1 x2722 >= 0 ;+-1 x5638 +1 x2724 >= 0 ;+-1 x5638 -1 x2723 >= -1 ;++1 x5638 -1 x2724 +1 x2723 >= 0 ;+-1 x5639 +1 x2725 >= 0 ;+-1 x5639 -1 x2724 >= -1 ;++1 x5639 -1 x2725 +1 x2724 >= 0 ;+-1 x5640 +1 x2726 >= 0 ;+-1 x5640 -1 x2725 >= -1 ;++1 x5640 -1 x2726 +1 x2725 >= 0 ;+-1 x5641 +1 x2727 >= 0 ;++1 x5641 -1 x2727 >= 0 ;+-1 x5642 +1 x2728 >= 0 ;++1 x5642 -1 x2728 >= 0 ;+-1 x5643 +1 x2729 >= 0 ;++1 x5643 -1 x2729 >= 0 ;+-1 x5644 +1 x2730 >= 0 ;++1 x5644 -1 x2730 >= 0 ;+-1 x5645 +1 x2731 >= 0 ;++1 x5645 -1 x2731 >= 0 ;+-1 x5646 +1 x2732 >= 0 ;++1 x5646 -1 x2732 >= 0 ;+-1 x5647 +1 x2733 >= 0 ;++1 x5647 -1 x2733 >= 0 ;+-1 x5648 +1 x2734 >= 0 ;++1 x5648 -1 x2734 >= 0 ;+-1 x5649 +1 x2735 >= 0 ;++1 x5649 -1 x2735 >= 0 ;+-1 x5650 +1 x2736 >= 0 ;+-1 x5650 -1 x2727 >= -1 ;++1 x5650 -1 x2736 +1 x2727 >= 0 ;+-1 x5651 +1 x2737 >= 0 ;+-1 x5651 -1 x2728 >= -1 ;++1 x5651 -1 x2737 +1 x2728 >= 0 ;+-1 x5652 +1 x2738 >= 0 ;+-1 x5652 -1 x2729 >= -1 ;++1 x5652 -1 x2738 +1 x2729 >= 0 ;+-1 x5653 +1 x2739 >= 0 ;+-1 x5653 -1 x2730 >= -1 ;++1 x5653 -1 x2739 +1 x2730 >= 0 ;+-1 x5654 +1 x2740 >= 0 ;+-1 x5654 -1 x2731 >= -1 ;++1 x5654 -1 x2740 +1 x2731 >= 0 ;+-1 x5655 +1 x2741 >= 0 ;+-1 x5655 -1 x2732 >= -1 ;++1 x5655 -1 x2741 +1 x2732 >= 0 ;+-1 x5656 +1 x2742 >= 0 ;+-1 x5656 -1 x2733 >= -1 ;++1 x5656 -1 x2742 +1 x2733 >= 0 ;+-1 x5657 +1 x2743 >= 0 ;+-1 x5657 -1 x2734 >= -1 ;++1 x5657 -1 x2743 +1 x2734 >= 0 ;+-1 x5658 +1 x2744 >= 0 ;+-1 x5658 -1 x2735 >= -1 ;++1 x5658 -1 x2744 +1 x2735 >= 0 ;+-1 x5659 +1 x2745 >= 0 ;+-1 x5659 -1 x2736 >= -1 ;++1 x5659 -1 x2745 +1 x2736 >= 0 ;+-1 x5660 +1 x2746 >= 0 ;+-1 x5660 -1 x2737 >= -1 ;++1 x5660 -1 x2746 +1 x2737 >= 0 ;+-1 x5661 +1 x2747 >= 0 ;+-1 x5661 -1 x2738 >= -1 ;++1 x5661 -1 x2747 +1 x2738 >= 0 ;+-1 x5662 +1 x2748 >= 0 ;+-1 x5662 -1 x2739 >= -1 ;++1 x5662 -1 x2748 +1 x2739 >= 0 ;+-1 x5663 +1 x2749 >= 0 ;+-1 x5663 -1 x2740 >= -1 ;++1 x5663 -1 x2749 +1 x2740 >= 0 ;+-1 x5664 +1 x2750 >= 0 ;+-1 x5664 -1 x2741 >= -1 ;++1 x5664 -1 x2750 +1 x2741 >= 0 ;+-1 x5665 +1 x2751 >= 0 ;+-1 x5665 -1 x2742 >= -1 ;++1 x5665 -1 x2751 +1 x2742 >= 0 ;+-1 x5666 +1 x2752 >= 0 ;+-1 x5666 -1 x2743 >= -1 ;++1 x5666 -1 x2752 +1 x2743 >= 0 ;+-1 x5667 +1 x2753 >= 0 ;+-1 x5667 -1 x2744 >= -1 ;++1 x5667 -1 x2753 +1 x2744 >= 0 ;+-1 x5668 +1 x2754 >= 0 ;+-1 x5668 -1 x2745 >= -1 ;++1 x5668 -1 x2754 +1 x2745 >= 0 ;+-1 x5669 +1 x2755 >= 0 ;+-1 x5669 -1 x2746 >= -1 ;++1 x5669 -1 x2755 +1 x2746 >= 0 ;+-1 x5670 +1 x2756 >= 0 ;+-1 x5670 -1 x2747 >= -1 ;++1 x5670 -1 x2756 +1 x2747 >= 0 ;+-1 x5671 +1 x2757 >= 0 ;+-1 x5671 -1 x2748 >= -1 ;++1 x5671 -1 x2757 +1 x2748 >= 0 ;+-1 x5672 +1 x2758 >= 0 ;+-1 x5672 -1 x2749 >= -1 ;++1 x5672 -1 x2758 +1 x2749 >= 0 ;+-1 x5673 +1 x2759 >= 0 ;+-1 x5673 -1 x2750 >= -1 ;++1 x5673 -1 x2759 +1 x2750 >= 0 ;+-1 x5674 +1 x2760 >= 0 ;+-1 x5674 -1 x2751 >= -1 ;++1 x5674 -1 x2760 +1 x2751 >= 0 ;+-1 x5675 +1 x2761 >= 0 ;+-1 x5675 -1 x2752 >= -1 ;++1 x5675 -1 x2761 +1 x2752 >= 0 ;+-1 x5676 +1 x2762 >= 0 ;+-1 x5676 -1 x2753 >= -1 ;++1 x5676 -1 x2762 +1 x2753 >= 0 ;+-1 x5677 +1 x2763 >= 0 ;+-1 x5677 -1 x2754 >= -1 ;++1 x5677 -1 x2763 +1 x2754 >= 0 ;+-1 x5678 +1 x2764 >= 0 ;+-1 x5678 -1 x2755 >= -1 ;++1 x5678 -1 x2764 +1 x2755 >= 0 ;+-1 x5679 +1 x2765 >= 0 ;+-1 x5679 -1 x2756 >= -1 ;++1 x5679 -1 x2765 +1 x2756 >= 0 ;+-1 x5680 +1 x2766 >= 0 ;+-1 x5680 -1 x2757 >= -1 ;++1 x5680 -1 x2766 +1 x2757 >= 0 ;+-1 x5681 +1 x2767 >= 0 ;+-1 x5681 -1 x2758 >= -1 ;++1 x5681 -1 x2767 +1 x2758 >= 0 ;+-1 x5682 +1 x2768 >= 0 ;+-1 x5682 -1 x2759 >= -1 ;++1 x5682 -1 x2768 +1 x2759 >= 0 ;+-1 x5683 +1 x2769 >= 0 ;+-1 x5683 -1 x2760 >= -1 ;++1 x5683 -1 x2769 +1 x2760 >= 0 ;+-1 x5684 +1 x2770 >= 0 ;+-1 x5684 -1 x2761 >= -1 ;++1 x5684 -1 x2770 +1 x2761 >= 0 ;+-1 x5685 +1 x2771 >= 0 ;+-1 x5685 -1 x2762 >= -1 ;++1 x5685 -1 x2771 +1 x2762 >= 0 ;+-1 x5686 +1 x2772 >= 0 ;+-1 x5686 -1 x2763 >= -1 ;++1 x5686 -1 x2772 +1 x2763 >= 0 ;+-1 x5687 +1 x2773 >= 0 ;+-1 x5687 -1 x2764 >= -1 ;++1 x5687 -1 x2773 +1 x2764 >= 0 ;+-1 x5688 +1 x2774 >= 0 ;+-1 x5688 -1 x2765 >= -1 ;++1 x5688 -1 x2774 +1 x2765 >= 0 ;+-1 x5689 +1 x2775 >= 0 ;+-1 x5689 -1 x2766 >= -1 ;++1 x5689 -1 x2775 +1 x2766 >= 0 ;+-1 x5690 +1 x2776 >= 0 ;+-1 x5690 -1 x2767 >= -1 ;++1 x5690 -1 x2776 +1 x2767 >= 0 ;+-1 x5691 +1 x2777 >= 0 ;+-1 x5691 -1 x2768 >= -1 ;++1 x5691 -1 x2777 +1 x2768 >= 0 ;+-1 x5692 +1 x2778 >= 0 ;+-1 x5692 -1 x2769 >= -1 ;++1 x5692 -1 x2778 +1 x2769 >= 0 ;+-1 x5693 +1 x2779 >= 0 ;+-1 x5693 -1 x2770 >= -1 ;++1 x5693 -1 x2779 +1 x2770 >= 0 ;+-1 x5694 +1 x2780 >= 0 ;+-1 x5694 -1 x2771 >= -1 ;++1 x5694 -1 x2780 +1 x2771 >= 0 ;+-1 x5695 +1 x2781 >= 0 ;+-1 x5695 -1 x2772 >= -1 ;++1 x5695 -1 x2781 +1 x2772 >= 0 ;+-1 x5696 +1 x2782 >= 0 ;+-1 x5696 -1 x2773 >= -1 ;++1 x5696 -1 x2782 +1 x2773 >= 0 ;+-1 x5697 +1 x2783 >= 0 ;+-1 x5697 -1 x2774 >= -1 ;++1 x5697 -1 x2783 +1 x2774 >= 0 ;+-1 x5698 +1 x2784 >= 0 ;+-1 x5698 -1 x2775 >= -1 ;++1 x5698 -1 x2784 +1 x2775 >= 0 ;+-1 x5699 +1 x2785 >= 0 ;+-1 x5699 -1 x2776 >= -1 ;++1 x5699 -1 x2785 +1 x2776 >= 0 ;+-1 x5700 +1 x2786 >= 0 ;+-1 x5700 -1 x2777 >= -1 ;++1 x5700 -1 x2786 +1 x2777 >= 0 ;+-1 x5701 +1 x2787 >= 0 ;+-1 x5701 -1 x2778 >= -1 ;++1 x5701 -1 x2787 +1 x2778 >= 0 ;+-1 x5702 +1 x2788 >= 0 ;+-1 x5702 -1 x2779 >= -1 ;++1 x5702 -1 x2788 +1 x2779 >= 0 ;+-1 x5703 +1 x2789 >= 0 ;+-1 x5703 -1 x2780 >= -1 ;++1 x5703 -1 x2789 +1 x2780 >= 0 ;+-1 x5704 +1 x2790 >= 0 ;+-1 x5704 -1 x2781 >= -1 ;++1 x5704 -1 x2790 +1 x2781 >= 0 ;+-1 x5705 +1 x2791 >= 0 ;+-1 x5705 -1 x2782 >= -1 ;++1 x5705 -1 x2791 +1 x2782 >= 0 ;+-1 x5706 +1 x2792 >= 0 ;+-1 x5706 -1 x2783 >= -1 ;++1 x5706 -1 x2792 +1 x2783 >= 0 ;+-1 x5707 +1 x2793 >= 0 ;+-1 x5707 -1 x2784 >= -1 ;++1 x5707 -1 x2793 +1 x2784 >= 0 ;+-1 x5708 +1 x2794 >= 0 ;+-1 x5708 -1 x2785 >= -1 ;++1 x5708 -1 x2794 +1 x2785 >= 0 ;+-1 x5709 +1 x2795 >= 0 ;+-1 x5709 -1 x2786 >= -1 ;++1 x5709 -1 x2795 +1 x2786 >= 0 ;+-1 x5710 +1 x2796 >= 0 ;+-1 x5710 -1 x2787 >= -1 ;++1 x5710 -1 x2796 +1 x2787 >= 0 ;+-1 x5711 +1 x2797 >= 0 ;+-1 x5711 -1 x2788 >= -1 ;++1 x5711 -1 x2797 +1 x2788 >= 0 ;+-1 x5712 +1 x2798 >= 0 ;+-1 x5712 -1 x2789 >= -1 ;++1 x5712 -1 x2798 +1 x2789 >= 0 ;+-1 x5713 +1 x2799 >= 0 ;+-1 x5713 -1 x2790 >= -1 ;++1 x5713 -1 x2799 +1 x2790 >= 0 ;+-1 x5714 +1 x2800 >= 0 ;+-1 x5714 -1 x2791 >= -1 ;++1 x5714 -1 x2800 +1 x2791 >= 0 ;+-1 x5715 +1 x2801 >= 0 ;+-1 x5715 -1 x2792 >= -1 ;++1 x5715 -1 x2801 +1 x2792 >= 0 ;+-1 x5716 +1 x2802 >= 0 ;+-1 x5716 -1 x2793 >= -1 ;++1 x5716 -1 x2802 +1 x2793 >= 0 ;+-1 x5717 +1 x2803 >= 0 ;+-1 x5717 -1 x2794 >= -1 ;++1 x5717 -1 x2803 +1 x2794 >= 0 ;+-1 x5718 +1 x2804 >= 0 ;+-1 x5718 -1 x2795 >= -1 ;++1 x5718 -1 x2804 +1 x2795 >= 0 ;+-1 x5719 +1 x2805 >= 0 ;+-1 x5719 -1 x2796 >= -1 ;++1 x5719 -1 x2805 +1 x2796 >= 0 ;+-1 x5720 +1 x2806 >= 0 ;+-1 x5720 -1 x2797 >= -1 ;++1 x5720 -1 x2806 +1 x2797 >= 0 ;+-1 x5721 +1 x2807 >= 0 ;+-1 x5721 -1 x2798 >= -1 ;++1 x5721 -1 x2807 +1 x2798 >= 0 ;+-1 x5722 +1 x2808 >= 0 ;+-1 x5722 -1 x2799 >= -1 ;++1 x5722 -1 x2808 +1 x2799 >= 0 ;+-1 x5723 +1 x2809 >= 0 ;+-1 x5723 -1 x2800 >= -1 ;++1 x5723 -1 x2809 +1 x2800 >= 0 ;+-1 x5724 +1 x2810 >= 0 ;+-1 x5724 -1 x2801 >= -1 ;++1 x5724 -1 x2810 +1 x2801 >= 0 ;+-1 x5725 +1 x2811 >= 0 ;+-1 x5725 -1 x2802 >= -1 ;++1 x5725 -1 x2811 +1 x2802 >= 0 ;+-1 x5726 +1 x2812 >= 0 ;+-1 x5726 -1 x2803 >= -1 ;++1 x5726 -1 x2812 +1 x2803 >= 0 ;+-1 x5727 +1 x2813 >= 0 ;+-1 x5727 -1 x2804 >= -1 ;++1 x5727 -1 x2813 +1 x2804 >= 0 ;+-1 x5728 +1 x2814 >= 0 ;+-1 x5728 -1 x2805 >= -1 ;++1 x5728 -1 x2814 +1 x2805 >= 0 ;+-1 x5729 +1 x2815 >= 0 ;+-1 x5729 -1 x2806 >= -1 ;++1 x5729 -1 x2815 +1 x2806 >= 0 ;+-1 x5730 +1 x2816 >= 0 ;+-1 x5730 -1 x2807 >= -1 ;++1 x5730 -1 x2816 +1 x2807 >= 0 ;+-1 x5731 +1 x2817 >= 0 ;+-1 x5731 -1 x2808 >= -1 ;++1 x5731 -1 x2817 +1 x2808 >= 0 ;+-1 x5732 +1 x2818 >= 0 ;+-1 x5732 -1 x2809 >= -1 ;++1 x5732 -1 x2818 +1 x2809 >= 0 ;+-1 x5733 +1 x2819 >= 0 ;+-1 x5733 -1 x2810 >= -1 ;++1 x5733 -1 x2819 +1 x2810 >= 0 ;+-1 x5734 +1 x2820 >= 0 ;+-1 x5734 -1 x2811 >= -1 ;++1 x5734 -1 x2820 +1 x2811 >= 0 ;+-1 x5735 +1 x2821 >= 0 ;++1 x5735 -1 x2821 >= 0 ;+-1 x5736 +1 x2822 >= 0 ;+-1 x5736 -1 x2821 >= -1 ;++1 x5736 -1 x2822 +1 x2821 >= 0 ;+-1 x5737 +1 x2823 >= 0 ;+-1 x5737 -1 x2822 >= -1 ;++1 x5737 -1 x2823 +1 x2822 >= 0 ;+-1 x5738 +1 x2824 >= 0 ;+-1 x5738 -1 x2823 >= -1 ;++1 x5738 -1 x2824 +1 x2823 >= 0 ;+-1 x5739 +1 x2825 >= 0 ;+-1 x5739 -1 x2824 >= -1 ;++1 x5739 -1 x2825 +1 x2824 >= 0 ;+-1 x5740 +1 x2826 >= 0 ;+-1 x5740 -1 x2825 >= -1 ;++1 x5740 -1 x2826 +1 x2825 >= 0 ;+-1 x5741 +1 x2827 >= 0 ;+-1 x5741 -1 x2826 >= -1 ;++1 x5741 -1 x2827 +1 x2826 >= 0 ;+-1 x5742 +1 x2828 >= 0 ;+-1 x5742 -1 x2827 >= -1 ;++1 x5742 -1 x2828 +1 x2827 >= 0 ;+-1 x5743 +1 x2829 >= 0 ;+-1 x5743 -1 x2828 >= -1 ;++1 x5743 -1 x2829 +1 x2828 >= 0 ;+-1 x5744 +1 x2830 >= 0 ;+-1 x5744 -1 x2829 >= -1 ;++1 x5744 -1 x2830 +1 x2829 >= 0 ;+-1 x5745 +1 x2831 >= 0 ;+-1 x5745 -1 x2830 >= -1 ;++1 x5745 -1 x2831 +1 x2830 >= 0 ;+-1 x5746 +1 x2832 >= 0 ;+-1 x5746 -1 x2831 >= -1 ;++1 x5746 -1 x2832 +1 x2831 >= 0 ;+-1 x5747 +1 x2833 >= 0 ;+-1 x5747 -1 x2832 >= -1 ;++1 x5747 -1 x2833 +1 x2832 >= 0 ;+-1 x5748 +1 x2834 >= 0 ;+-1 x5748 -1 x2833 >= -1 ;++1 x5748 -1 x2834 +1 x2833 >= 0 ;+-1 x5749 +1 x2835 >= 0 ;+-1 x5749 -1 x2834 >= -1 ;++1 x5749 -1 x2835 +1 x2834 >= 0 ;+-1 x5750 +1 x2836 >= 0 ;+-1 x5750 -1 x2835 >= -1 ;++1 x5750 -1 x2836 +1 x2835 >= 0 ;+-1 x5751 +1 x2837 >= 0 ;+-1 x5751 -1 x2836 >= -1 ;++1 x5751 -1 x2837 +1 x2836 >= 0 ;+-1 x5752 +1 x2838 >= 0 ;+-1 x5752 -1 x2837 >= -1 ;++1 x5752 -1 x2838 +1 x2837 >= 0 ;+-1 x5753 +1 x2839 >= 0 ;+-1 x5753 -1 x2838 >= -1 ;++1 x5753 -1 x2839 +1 x2838 >= 0 ;+-1 x5754 +1 x2840 >= 0 ;+-1 x5754 -1 x2839 >= -1 ;++1 x5754 -1 x2840 +1 x2839 >= 0 ;+-1 x5755 +1 x2841 >= 0 ;+-1 x5755 -1 x2840 >= -1 ;++1 x5755 -1 x2841 +1 x2840 >= 0 ;+-1 x5756 +1 x2842 >= 0 ;+-1 x5756 -1 x2841 >= -1 ;++1 x5756 -1 x2842 +1 x2841 >= 0 ;+-1 x5757 +1 x2843 >= 0 ;+-1 x5757 -1 x2842 >= -1 ;++1 x5757 -1 x2843 +1 x2842 >= 0 ;+-1 x5758 +1 x2844 >= 0 ;+-1 x5758 -1 x2843 >= -1 ;++1 x5758 -1 x2844 +1 x2843 >= 0 ;+-1 x5759 +1 x2845 >= 0 ;+-1 x5759 -1 x2844 >= -1 ;++1 x5759 -1 x2845 +1 x2844 >= 0 ;+-1 x5760 +1 x2846 >= 0 ;+-1 x5760 -1 x2845 >= -1 ;++1 x5760 -1 x2846 +1 x2845 >= 0 ;+-1 x5761 +1 x2847 >= 0 ;+-1 x5761 -1 x2846 >= -1 ;++1 x5761 -1 x2847 +1 x2846 >= 0 ;+-1 x5762 +1 x2848 >= 0 ;+-1 x5762 -1 x2847 >= -1 ;++1 x5762 -1 x2848 +1 x2847 >= 0 ;+-1 x5763 +1 x2849 >= 0 ;+-1 x5763 -1 x2848 >= -1 ;++1 x5763 -1 x2849 +1 x2848 >= 0 ;+-1 x5764 +1 x2850 >= 0 ;+-1 x5764 -1 x2849 >= -1 ;++1 x5764 -1 x2850 +1 x2849 >= 0 ;+-1 x5765 +1 x2851 >= 0 ;+-1 x5765 -1 x2850 >= -1 ;++1 x5765 -1 x2851 +1 x2850 >= 0 ;+-1 x5766 +1 x2852 >= 0 ;+-1 x5766 -1 x2851 >= -1 ;++1 x5766 -1 x2852 +1 x2851 >= 0 ;+-1 x5767 +1 x2853 >= 0 ;+-1 x5767 -1 x2852 >= -1 ;++1 x5767 -1 x2853 +1 x2852 >= 0 ;+-1 x5768 +1 x2854 >= 0 ;+-1 x5768 -1 x2853 >= -1 ;++1 x5768 -1 x2854 +1 x2853 >= 0 ;+-1 x5769 +1 x2855 >= 0 ;+-1 x5769 -1 x2854 >= -1 ;++1 x5769 -1 x2855 +1 x2854 >= 0 ;+-1 x5770 +1 x2856 >= 0 ;+-1 x5770 -1 x2855 >= -1 ;++1 x5770 -1 x2856 +1 x2855 >= 0 ;+-1 x5771 +1 x2857 >= 0 ;+-1 x5771 -1 x2856 >= -1 ;++1 x5771 -1 x2857 +1 x2856 >= 0 ;+-1 x5772 +1 x2858 >= 0 ;+-1 x5772 -1 x2857 >= -1 ;++1 x5772 -1 x2858 +1 x2857 >= 0 ;+-1 x5773 +1 x2859 >= 0 ;+-1 x5773 -1 x2858 >= -1 ;++1 x5773 -1 x2859 +1 x2858 >= 0 ;+-1 x5774 +1 x2860 >= 0 ;+-1 x5774 -1 x2859 >= -1 ;++1 x5774 -1 x2860 +1 x2859 >= 0 ;+-1 x5775 +1 x2861 >= 0 ;+-1 x5775 -1 x2860 >= -1 ;++1 x5775 -1 x2861 +1 x2860 >= 0 ;+-1 x5776 +1 x2862 >= 0 ;+-1 x5776 -1 x2861 >= -1 ;++1 x5776 -1 x2862 +1 x2861 >= 0 ;+-1 x5777 +1 x2863 >= 0 ;+-1 x5777 -1 x2862 >= -1 ;++1 x5777 -1 x2863 +1 x2862 >= 0 ;+-1 x5778 +1 x2864 >= 0 ;+-1 x5778 -1 x2863 >= -1 ;++1 x5778 -1 x2864 +1 x2863 >= 0 ;+-1 x5779 +1 x2865 >= 0 ;+-1 x5779 -1 x2864 >= -1 ;++1 x5779 -1 x2865 +1 x2864 >= 0 ;+-1 x5780 +1 x2866 >= 0 ;+-1 x5780 -1 x2865 >= -1 ;++1 x5780 -1 x2866 +1 x2865 >= 0 ;+-1 x5781 +1 x2867 >= 0 ;+-1 x5781 -1 x2866 >= -1 ;++1 x5781 -1 x2867 +1 x2866 >= 0 ;+-1 x5782 +1 x2868 >= 0 ;+-1 x5782 -1 x2867 >= -1 ;++1 x5782 -1 x2868 +1 x2867 >= 0 ;+-1 x5783 +1 x2869 >= 0 ;+-1 x5783 -1 x2868 >= -1 ;++1 x5783 -1 x2869 +1 x2868 >= 0 ;+-1 x5784 +1 x2870 >= 0 ;+-1 x5784 -1 x2869 >= -1 ;++1 x5784 -1 x2870 +1 x2869 >= 0 ;+-1 x5785 +1 x2871 >= 0 ;+-1 x5785 -1 x2870 >= -1 ;++1 x5785 -1 x2871 +1 x2870 >= 0 ;+-1 x5786 +1 x2872 >= 0 ;+-1 x5786 -1 x2871 >= -1 ;++1 x5786 -1 x2872 +1 x2871 >= 0 ;+-1 x5787 +1 x2873 >= 0 ;+-1 x5787 -1 x2872 >= -1 ;++1 x5787 -1 x2873 +1 x2872 >= 0 ;+-1 x5788 +1 x2874 >= 0 ;+-1 x5788 -1 x2873 >= -1 ;++1 x5788 -1 x2874 +1 x2873 >= 0 ;+-1 x5789 +1 x2875 >= 0 ;+-1 x5789 -1 x2874 >= -1 ;++1 x5789 -1 x2875 +1 x2874 >= 0 ;+-1 x5790 +1 x2876 >= 0 ;+-1 x5790 -1 x2875 >= -1 ;++1 x5790 -1 x2876 +1 x2875 >= 0 ;+-1 x5791 +1 x2877 >= 0 ;+-1 x5791 -1 x2876 >= -1 ;++1 x5791 -1 x2877 +1 x2876 >= 0 ;+-1 x5792 +1 x2878 >= 0 ;+-1 x5792 -1 x2877 >= -1 ;++1 x5792 -1 x2878 +1 x2877 >= 0 ;+-1 x5793 +1 x2879 >= 0 ;+-1 x5793 -1 x2878 >= -1 ;++1 x5793 -1 x2879 +1 x2878 >= 0 ;+-1 x5794 +1 x2880 >= 0 ;+-1 x5794 -1 x2879 >= -1 ;++1 x5794 -1 x2880 +1 x2879 >= 0 ;+-1 x5795 +1 x2881 >= 0 ;+-1 x5795 -1 x2880 >= -1 ;++1 x5795 -1 x2881 +1 x2880 >= 0 ;+-1 x5796 +1 x2882 >= 0 ;+-1 x5796 -1 x2881 >= -1 ;++1 x5796 -1 x2882 +1 x2881 >= 0 ;+-1 x5797 +1 x2883 >= 0 ;+-1 x5797 -1 x2882 >= -1 ;++1 x5797 -1 x2883 +1 x2882 >= 0 ;+-1 x5798 +1 x2884 >= 0 ;+-1 x5798 -1 x2883 >= -1 ;++1 x5798 -1 x2884 +1 x2883 >= 0 ;+-1 x5799 +1 x2885 >= 0 ;+-1 x5799 -1 x2884 >= -1 ;++1 x5799 -1 x2885 +1 x2884 >= 0 ;+-1 x5800 +1 x2886 >= 0 ;+-1 x5800 -1 x2885 >= -1 ;++1 x5800 -1 x2886 +1 x2885 >= 0 ;+-1 x5801 +1 x2887 >= 0 ;+-1 x5801 -1 x2886 >= -1 ;++1 x5801 -1 x2887 +1 x2886 >= 0 ;+-1 x5802 +1 x2888 >= 0 ;+-1 x5802 -1 x2887 >= -1 ;++1 x5802 -1 x2888 +1 x2887 >= 0 ;+-1 x5803 +1 x2889 >= 0 ;+-1 x5803 -1 x2888 >= -1 ;++1 x5803 -1 x2889 +1 x2888 >= 0 ;+-1 x5804 +1 x2890 >= 0 ;+-1 x5804 -1 x2889 >= -1 ;++1 x5804 -1 x2890 +1 x2889 >= 0 ;+-1 x5805 +1 x2891 >= 0 ;+-1 x5805 -1 x2890 >= -1 ;++1 x5805 -1 x2891 +1 x2890 >= 0 ;+-1 x5806 +1 x2892 >= 0 ;+-1 x5806 -1 x2891 >= -1 ;++1 x5806 -1 x2892 +1 x2891 >= 0 ;+-1 x5807 +1 x2893 >= 0 ;+-1 x5807 -1 x2892 >= -1 ;++1 x5807 -1 x2893 +1 x2892 >= 0 ;+-1 x5808 +1 x2894 >= 0 ;+-1 x5808 -1 x2893 >= -1 ;++1 x5808 -1 x2894 +1 x2893 >= 0 ;+-1 x5809 +1 x2895 >= 0 ;+-1 x5809 -1 x2894 >= -1 ;++1 x5809 -1 x2895 +1 x2894 >= 0 ;+-1 x5810 +1 x2896 >= 0 ;+-1 x5810 -1 x2895 >= -1 ;++1 x5810 -1 x2896 +1 x2895 >= 0 ;+-1 x5811 +1 x2897 >= 0 ;+-1 x5811 -1 x2896 >= -1 ;++1 x5811 -1 x2897 +1 x2896 >= 0 ;+-1 x5812 +1 x2898 >= 0 ;+-1 x5812 -1 x2897 >= -1 ;++1 x5812 -1 x2898 +1 x2897 >= 0 ;+-1 x5813 +1 x2899 >= 0 ;+-1 x5813 -1 x2898 >= -1 ;++1 x5813 -1 x2899 +1 x2898 >= 0 ;+-1 x5814 +1 x2900 >= 0 ;+-1 x5814 -1 x2899 >= -1 ;++1 x5814 -1 x2900 +1 x2899 >= 0 ;+-1 x5815 +1 x2901 >= 0 ;+-1 x5815 -1 x2900 >= -1 ;++1 x5815 -1 x2901 +1 x2900 >= 0 ;+-1 x5816 +1 x2902 >= 0 ;+-1 x5816 -1 x2901 >= -1 ;++1 x5816 -1 x2902 +1 x2901 >= 0 ;+-1 x5817 +1 x2903 >= 0 ;+-1 x5817 -1 x2902 >= -1 ;++1 x5817 -1 x2903 +1 x2902 >= 0 ;+-1 x5818 +1 x2904 >= 0 ;+-1 x5818 -1 x2903 >= -1 ;++1 x5818 -1 x2904 +1 x2903 >= 0 ;+-1 x5819 +1 x2905 >= 0 ;+-1 x5819 -1 x2904 >= -1 ;++1 x5819 -1 x2905 +1 x2904 >= 0 ;+-1 x5820 +1 x2906 >= 0 ;+-1 x5820 -1 x2905 >= -1 ;++1 x5820 -1 x2906 +1 x2905 >= 0 ;+-1 x5821 +1 x2907 >= 0 ;+-1 x5821 -1 x2906 >= -1 ;++1 x5821 -1 x2907 +1 x2906 >= 0 ;+-1 x5822 +1 x2908 >= 0 ;+-1 x5822 -1 x2907 >= -1 ;++1 x5822 -1 x2908 +1 x2907 >= 0 ;+-1 x5823 +1 x2909 >= 0 ;+-1 x5823 -1 x2908 >= -1 ;++1 x5823 -1 x2909 +1 x2908 >= 0 ;+-1 x5824 +1 x2910 >= 0 ;+-1 x5824 -1 x2909 >= -1 ;++1 x5824 -1 x2910 +1 x2909 >= 0 ;+-1 x5825 +1 x2911 >= 0 ;+-1 x5825 -1 x2910 >= -1 ;++1 x5825 -1 x2911 +1 x2910 >= 0 ;+-1 x5826 +1 x2912 >= 0 ;+-1 x5826 -1 x2911 >= -1 ;++1 x5826 -1 x2912 +1 x2911 >= 0 ;+-1 x5827 +1 x2913 >= 0 ;+-1 x5827 -1 x2912 >= -1 ;++1 x5827 -1 x2913 +1 x2912 >= 0 ;+-1 x5828 +1 x2914 >= 0 ;+-1 x5828 -1 x2913 >= -1 ;++1 x5828 -1 x2914 +1 x2913 >= 0 ;+-6 x2915 -5 x3009 -9 x3103 -6 x3291 -4 x3385 -7 x3479 -6 x3573 -6 x3667 -3 x3855 -4 x3949 -1 x4043 -4 x4137 -2 x4231 -9 x4325 -4 x4419 -10 x4607 -10 x4701 -5 x4795 -7 x4889 -7 x4983 -9 x5077 -10 x5171 -1 x5265 -9 x5359 -7 x5453 -9 x5547 -5 x5641 >= -13 ;+-6 x2916 -5 x3010 -9 x3104 -6 x3292 -4 x3386 -7 x3480 -6 x3574 -6 x3668 -3 x3856 -4 x3950 -1 x4044 -4 x4138 -2 x4232 -9 x4326 -4 x4420 -10 x4608 -10 x4702 -5 x4796 -7 x4890 -7 x4984 -9 x5078 -10 x5172 -1 x5266 -9 x5360 -7 x5454 -9 x5548 -5 x5642 >= -13 ;+-6 x2917 -5 x3011 -9 x3105 -6 x3293 -4 x3387 -7 x3481 -6 x3575 -6 x3669 -3 x3857 -4 x3951 -1 x4045 -4 x4139 -2 x4233 -9 x4327 -4 x4421 -10 x4609 -10 x4703 -5 x4797 -7 x4891 -7 x4985 -9 x5079 -10 x5173 -1 x5267 -9 x5361 -7 x5455 -9 x5549 -5 x5643 >= -13 ;+-6 x2918 -5 x3012 -9 x3106 -6 x3294 -4 x3388 -7 x3482 -6 x3576 -6 x3670 -3 x3858 -4 x3952 -1 x4046 -4 x4140 -2 x4234 -9 x4328 -4 x4422 -10 x4610 -10 x4704 -5 x4798 -7 x4892 -7 x4986 -9 x5080 -10 x5174 -1 x5268 -9 x5362 -7 x5456 -9 x5550 -5 x5644 >= -13 ;+-6 x2919 -5 x3013 -9 x3107 -6 x3295 -4 x3389 -7 x3483 -6 x3577 -6 x3671 -3 x3859 -4 x3953 -1 x4047 -4 x4141 -2 x4235 -9 x4329 -4 x4423 -10 x4611 -10 x4705 -5 x4799 -7 x4893 -7 x4987 -9 x5081 -10 x5175 -1 x5269 -9 x5363 -7 x5457 -9 x5551 -5 x5645 >= -13 ;+-6 x2920 -5 x3014 -9 x3108 -6 x3296 -4 x3390 -7 x3484 -6 x3578 -6 x3672 -3 x3860 -4 x3954 -1 x4048 -4 x4142 -2 x4236 -9 x4330 -4 x4424 -10 x4612 -10 x4706 -5 x4800 -7 x4894 -7 x4988 -9 x5082 -10 x5176 -1 x5270 -9 x5364 -7 x5458 -9 x5552 -5 x5646 >= -13 ;+-6 x2921 -5 x3015 -9 x3109 -6 x3297 -4 x3391 -7 x3485 -6 x3579 -6 x3673 -3 x3861 -4 x3955 -1 x4049 -4 x4143 -2 x4237 -9 x4331 -4 x4425 -10 x4613 -10 x4707 -5 x4801 -7 x4895 -7 x4989 -9 x5083 -10 x5177 -1 x5271 -9 x5365 -7 x5459 -9 x5553 -5 x5647 >= -13 ;+-6 x2922 -5 x3016 -9 x3110 -6 x3298 -4 x3392 -7 x3486 -6 x3580 -6 x3674 -3 x3862 -4 x3956 -1 x4050 -4 x4144 -2 x4238 -9 x4332 -4 x4426 -10 x4614 -10 x4708 -5 x4802 -7 x4896 -7 x4990 -9 x5084 -10 x5178 -1 x5272 -9 x5366 -7 x5460 -9 x5554 -5 x5648 >= -13 ;+-6 x2923 -5 x3017 -9 x3111 -6 x3299 -4 x3393 -7 x3487 -6 x3581 -6 x3675 -3 x3863 -4 x3957 -1 x4051 -4 x4145 -2 x4239 -9 x4333 -4 x4427 -10 x4615 -10 x4709 -5 x4803 -7 x4897 -7 x4991 -9 x5085 -10 x5179 -1 x5273 -9 x5367 -7 x5461 -9 x5555 -5 x5649 >= -13 ;+-6 x2924 -5 x3018 -9 x3112 -6 x3300 -4 x3394 -7 x3488 -6 x3582 -6 x3676 -3 x3864 -4 x3958 -1 x4052 -4 x4146 -2 x4240 -9 x4334 -4 x4428 -10 x4616 -10 x4710 -5 x4804 -7 x4898 -7 x4992 -9 x5086 -10 x5180 -1 x5274 -9 x5368 -7 x5462 -9 x5556 -5 x5650 >= -13 ;+-6 x2925 -5 x3019 -9 x3113 -6 x3301 -4 x3395 -7 x3489 -6 x3583 -6 x3677 -3 x3865 -4 x3959 -1 x4053 -4 x4147 -2 x4241 -9 x4335 -4 x4429 -10 x4617 -10 x4711 -5 x4805 -7 x4899 -7 x4993 -9 x5087 -10 x5181 -1 x5275 -9 x5369 -7 x5463 -9 x5557 -5 x5651 >= -13 ;+-6 x2926 -5 x3020 -9 x3114 -6 x3302 -4 x3396 -7 x3490 -6 x3584 -6 x3678 -3 x3866 -4 x3960 -1 x4054 -4 x4148 -2 x4242 -9 x4336 -4 x4430 -10 x4618 -10 x4712 -5 x4806 -7 x4900 -7 x4994 -9 x5088 -10 x5182 -1 x5276 -9 x5370 -7 x5464 -9 x5558 -5 x5652 >= -13 ;+-6 x2927 -5 x3021 -9 x3115 -6 x3303 -4 x3397 -7 x3491 -6 x3585 -6 x3679 -3 x3867 -4 x3961 -1 x4055 -4 x4149 -2 x4243 -9 x4337 -4 x4431 -10 x4619 -10 x4713 -5 x4807 -7 x4901 -7 x4995 -9 x5089 -10 x5183 -1 x5277 -9 x5371 -7 x5465 -9 x5559 -5 x5653 >= -13 ;+-6 x2928 -5 x3022 -9 x3116 -6 x3304 -4 x3398 -7 x3492 -6 x3586 -6 x3680 -3 x3868 -4 x3962 -1 x4056 -4 x4150 -2 x4244 -9 x4338 -4 x4432 -10 x4620 -10 x4714 -5 x4808 -7 x4902 -7 x4996 -9 x5090 -10 x5184 -1 x5278 -9 x5372 -7 x5466 -9 x5560 -5 x5654 >= -13 ;+-6 x2929 -5 x3023 -9 x3117 -6 x3305 -4 x3399 -7 x3493 -6 x3587 -6 x3681 -3 x3869 -4 x3963 -1 x4057 -4 x4151 -2 x4245 -9 x4339 -4 x4433 -10 x4621 -10 x4715 -5 x4809 -7 x4903 -7 x4997 -9 x5091 -10 x5185 -1 x5279 -9 x5373 -7 x5467 -9 x5561 -5 x5655 >= -13 ;+-6 x2930 -5 x3024 -9 x3118 -6 x3306 -4 x3400 -7 x3494 -6 x3588 -6 x3682 -3 x3870 -4 x3964 -1 x4058 -4 x4152 -2 x4246 -9 x4340 -4 x4434 -10 x4622 -10 x4716 -5 x4810 -7 x4904 -7 x4998 -9 x5092 -10 x5186 -1 x5280 -9 x5374 -7 x5468 -9 x5562 -5 x5656 >= -13 ;+-6 x2931 -5 x3025 -9 x3119 -6 x3307 -4 x3401 -7 x3495 -6 x3589 -6 x3683 -3 x3871 -4 x3965 -1 x4059 -4 x4153 -2 x4247 -9 x4341 -4 x4435 -10 x4623 -10 x4717 -5 x4811 -7 x4905 -7 x4999 -9 x5093 -10 x5187 -1 x5281 -9 x5375 -7 x5469 -9 x5563 -5 x5657 >= -13 ;+-6 x2932 -5 x3026 -9 x3120 -6 x3308 -4 x3402 -7 x3496 -6 x3590 -6 x3684 -3 x3872 -4 x3966 -1 x4060 -4 x4154 -2 x4248 -9 x4342 -4 x4436 -10 x4624 -10 x4718 -5 x4812 -7 x4906 -7 x5000 -9 x5094 -10 x5188 -1 x5282 -9 x5376 -7 x5470 -9 x5564 -5 x5658 >= -13 ;+-6 x2933 -5 x3027 -9 x3121 -6 x3309 -4 x3403 -7 x3497 -6 x3591 -6 x3685 -3 x3873 -4 x3967 -1 x4061 -4 x4155 -2 x4249 -9 x4343 -4 x4437 -10 x4625 -10 x4719 -5 x4813 -7 x4907 -7 x5001 -9 x5095 -10 x5189 -1 x5283 -9 x5377 -7 x5471 -9 x5565 -5 x5659 >= -13 ;+-6 x2934 -5 x3028 -9 x3122 -6 x3310 -4 x3404 -7 x3498 -6 x3592 -6 x3686 -3 x3874 -4 x3968 -1 x4062 -4 x4156 -2 x4250 -9 x4344 -4 x4438 -10 x4626 -10 x4720 -5 x4814 -7 x4908 -7 x5002 -9 x5096 -10 x5190 -1 x5284 -9 x5378 -7 x5472 -9 x5566 -5 x5660 >= -13 ;+-6 x2935 -5 x3029 -9 x3123 -6 x3311 -4 x3405 -7 x3499 -6 x3593 -6 x3687 -3 x3875 -4 x3969 -1 x4063 -4 x4157 -2 x4251 -9 x4345 -4 x4439 -10 x4627 -10 x4721 -5 x4815 -7 x4909 -7 x5003 -9 x5097 -10 x5191 -1 x5285 -9 x5379 -7 x5473 -9 x5567 -5 x5661 >= -13 ;+-6 x2936 -5 x3030 -9 x3124 -6 x3312 -4 x3406 -7 x3500 -6 x3594 -6 x3688 -3 x3876 -4 x3970 -1 x4064 -4 x4158 -2 x4252 -9 x4346 -4 x4440 -10 x4628 -10 x4722 -5 x4816 -7 x4910 -7 x5004 -9 x5098 -10 x5192 -1 x5286 -9 x5380 -7 x5474 -9 x5568 -5 x5662 >= -13 ;+-6 x2937 -5 x3031 -9 x3125 -6 x3313 -4 x3407 -7 x3501 -6 x3595 -6 x3689 -3 x3877 -4 x3971 -1 x4065 -4 x4159 -2 x4253 -9 x4347 -4 x4441 -10 x4629 -10 x4723 -5 x4817 -7 x4911 -7 x5005 -9 x5099 -10 x5193 -1 x5287 -9 x5381 -7 x5475 -9 x5569 -5 x5663 >= -13 ;+-6 x2938 -5 x3032 -9 x3126 -6 x3314 -4 x3408 -7 x3502 -6 x3596 -6 x3690 -3 x3878 -4 x3972 -1 x4066 -4 x4160 -2 x4254 -9 x4348 -4 x4442 -10 x4630 -10 x4724 -5 x4818 -7 x4912 -7 x5006 -9 x5100 -10 x5194 -1 x5288 -9 x5382 -7 x5476 -9 x5570 -5 x5664 >= -13 ;+-6 x2939 -5 x3033 -9 x3127 -6 x3315 -4 x3409 -7 x3503 -6 x3597 -6 x3691 -3 x3879 -4 x3973 -1 x4067 -4 x4161 -2 x4255 -9 x4349 -4 x4443 -10 x4631 -10 x4725 -5 x4819 -7 x4913 -7 x5007 -9 x5101 -10 x5195 -1 x5289 -9 x5383 -7 x5477 -9 x5571 -5 x5665 >= -13 ;+-6 x2940 -5 x3034 -9 x3128 -6 x3316 -4 x3410 -7 x3504 -6 x3598 -6 x3692 -3 x3880 -4 x3974 -1 x4068 -4 x4162 -2 x4256 -9 x4350 -4 x4444 -10 x4632 -10 x4726 -5 x4820 -7 x4914 -7 x5008 -9 x5102 -10 x5196 -1 x5290 -9 x5384 -7 x5478 -9 x5572 -5 x5666 >= -13 ;+-6 x2941 -5 x3035 -9 x3129 -6 x3317 -4 x3411 -7 x3505 -6 x3599 -6 x3693 -3 x3881 -4 x3975 -1 x4069 -4 x4163 -2 x4257 -9 x4351 -4 x4445 -10 x4633 -10 x4727 -5 x4821 -7 x4915 -7 x5009 -9 x5103 -10 x5197 -1 x5291 -9 x5385 -7 x5479 -9 x5573 -5 x5667 >= -13 ;+-6 x2942 -5 x3036 -9 x3130 -6 x3318 -4 x3412 -7 x3506 -6 x3600 -6 x3694 -3 x3882 -4 x3976 -1 x4070 -4 x4164 -2 x4258 -9 x4352 -4 x4446 -10 x4634 -10 x4728 -5 x4822 -7 x4916 -7 x5010 -9 x5104 -10 x5198 -1 x5292 -9 x5386 -7 x5480 -9 x5574 -5 x5668 >= -13 ;+-6 x2943 -5 x3037 -9 x3131 -6 x3319 -4 x3413 -7 x3507 -6 x3601 -6 x3695 -3 x3883 -4 x3977 -1 x4071 -4 x4165 -2 x4259 -9 x4353 -4 x4447 -10 x4635 -10 x4729 -5 x4823 -7 x4917 -7 x5011 -9 x5105 -10 x5199 -1 x5293 -9 x5387 -7 x5481 -9 x5575 -5 x5669 >= -13 ;+-6 x2944 -5 x3038 -9 x3132 -6 x3320 -4 x3414 -7 x3508 -6 x3602 -6 x3696 -3 x3884 -4 x3978 -1 x4072 -4 x4166 -2 x4260 -9 x4354 -4 x4448 -10 x4636 -10 x4730 -5 x4824 -7 x4918 -7 x5012 -9 x5106 -10 x5200 -1 x5294 -9 x5388 -7 x5482 -9 x5576 -5 x5670 >= -13 ;+-6 x2945 -5 x3039 -9 x3133 -6 x3321 -4 x3415 -7 x3509 -6 x3603 -6 x3697 -3 x3885 -4 x3979 -1 x4073 -4 x4167 -2 x4261 -9 x4355 -4 x4449 -10 x4637 -10 x4731 -5 x4825 -7 x4919 -7 x5013 -9 x5107 -10 x5201 -1 x5295 -9 x5389 -7 x5483 -9 x5577 -5 x5671 >= -13 ;+-6 x2946 -5 x3040 -9 x3134 -6 x3322 -4 x3416 -7 x3510 -6 x3604 -6 x3698 -3 x3886 -4 x3980 -1 x4074 -4 x4168 -2 x4262 -9 x4356 -4 x4450 -10 x4638 -10 x4732 -5 x4826 -7 x4920 -7 x5014 -9 x5108 -10 x5202 -1 x5296 -9 x5390 -7 x5484 -9 x5578 -5 x5672 >= -13 ;+-6 x2947 -5 x3041 -9 x3135 -6 x3323 -4 x3417 -7 x3511 -6 x3605 -6 x3699 -3 x3887 -4 x3981 -1 x4075 -4 x4169 -2 x4263 -9 x4357 -4 x4451 -10 x4639 -10 x4733 -5 x4827 -7 x4921 -7 x5015 -9 x5109 -10 x5203 -1 x5297 -9 x5391 -7 x5485 -9 x5579 -5 x5673 >= -13 ;+-6 x2948 -5 x3042 -9 x3136 -6 x3324 -4 x3418 -7 x3512 -6 x3606 -6 x3700 -3 x3888 -4 x3982 -1 x4076 -4 x4170 -2 x4264 -9 x4358 -4 x4452 -10 x4640 -10 x4734 -5 x4828 -7 x4922 -7 x5016 -9 x5110 -10 x5204 -1 x5298 -9 x5392 -7 x5486 -9 x5580 -5 x5674 >= -13 ;+-6 x2949 -5 x3043 -9 x3137 -6 x3325 -4 x3419 -7 x3513 -6 x3607 -6 x3701 -3 x3889 -4 x3983 -1 x4077 -4 x4171 -2 x4265 -9 x4359 -4 x4453 -10 x4641 -10 x4735 -5 x4829 -7 x4923 -7 x5017 -9 x5111 -10 x5205 -1 x5299 -9 x5393 -7 x5487 -9 x5581 -5 x5675 >= -13 ;+-6 x2950 -5 x3044 -9 x3138 -6 x3326 -4 x3420 -7 x3514 -6 x3608 -6 x3702 -3 x3890 -4 x3984 -1 x4078 -4 x4172 -2 x4266 -9 x4360 -4 x4454 -10 x4642 -10 x4736 -5 x4830 -7 x4924 -7 x5018 -9 x5112 -10 x5206 -1 x5300 -9 x5394 -7 x5488 -9 x5582 -5 x5676 >= -13 ;+-6 x2951 -5 x3045 -9 x3139 -6 x3327 -4 x3421 -7 x3515 -6 x3609 -6 x3703 -3 x3891 -4 x3985 -1 x4079 -4 x4173 -2 x4267 -9 x4361 -4 x4455 -10 x4643 -10 x4737 -5 x4831 -7 x4925 -7 x5019 -9 x5113 -10 x5207 -1 x5301 -9 x5395 -7 x5489 -9 x5583 -5 x5677 >= -13 ;+-6 x2952 -5 x3046 -9 x3140 -6 x3328 -4 x3422 -7 x3516 -6 x3610 -6 x3704 -3 x3892 -4 x3986 -1 x4080 -4 x4174 -2 x4268 -9 x4362 -4 x4456 -10 x4644 -10 x4738 -5 x4832 -7 x4926 -7 x5020 -9 x5114 -10 x5208 -1 x5302 -9 x5396 -7 x5490 -9 x5584 -5 x5678 >= -13 ;+-6 x2953 -5 x3047 -9 x3141 -6 x3329 -4 x3423 -7 x3517 -6 x3611 -6 x3705 -3 x3893 -4 x3987 -1 x4081 -4 x4175 -2 x4269 -9 x4363 -4 x4457 -10 x4645 -10 x4739 -5 x4833 -7 x4927 -7 x5021 -9 x5115 -10 x5209 -1 x5303 -9 x5397 -7 x5491 -9 x5585 -5 x5679 >= -13 ;+-6 x2954 -5 x3048 -9 x3142 -6 x3330 -4 x3424 -7 x3518 -6 x3612 -6 x3706 -3 x3894 -4 x3988 -1 x4082 -4 x4176 -2 x4270 -9 x4364 -4 x4458 -10 x4646 -10 x4740 -5 x4834 -7 x4928 -7 x5022 -9 x5116 -10 x5210 -1 x5304 -9 x5398 -7 x5492 -9 x5586 -5 x5680 >= -13 ;+-6 x2955 -5 x3049 -9 x3143 -6 x3331 -4 x3425 -7 x3519 -6 x3613 -6 x3707 -3 x3895 -4 x3989 -1 x4083 -4 x4177 -2 x4271 -9 x4365 -4 x4459 -10 x4647 -10 x4741 -5 x4835 -7 x4929 -7 x5023 -9 x5117 -10 x5211 -1 x5305 -9 x5399 -7 x5493 -9 x5587 -5 x5681 >= -13 ;+-6 x2956 -5 x3050 -9 x3144 -6 x3332 -4 x3426 -7 x3520 -6 x3614 -6 x3708 -3 x3896 -4 x3990 -1 x4084 -4 x4178 -2 x4272 -9 x4366 -4 x4460 -10 x4648 -10 x4742 -5 x4836 -7 x4930 -7 x5024 -9 x5118 -10 x5212 -1 x5306 -9 x5400 -7 x5494 -9 x5588 -5 x5682 >= -13 ;+-6 x2957 -5 x3051 -9 x3145 -6 x3333 -4 x3427 -7 x3521 -6 x3615 -6 x3709 -3 x3897 -4 x3991 -1 x4085 -4 x4179 -2 x4273 -9 x4367 -4 x4461 -10 x4649 -10 x4743 -5 x4837 -7 x4931 -7 x5025 -9 x5119 -10 x5213 -1 x5307 -9 x5401 -7 x5495 -9 x5589 -5 x5683 >= -13 ;+-6 x2958 -5 x3052 -9 x3146 -6 x3334 -4 x3428 -7 x3522 -6 x3616 -6 x3710 -3 x3898 -4 x3992 -1 x4086 -4 x4180 -2 x4274 -9 x4368 -4 x4462 -10 x4650 -10 x4744 -5 x4838 -7 x4932 -7 x5026 -9 x5120 -10 x5214 -1 x5308 -9 x5402 -7 x5496 -9 x5590 -5 x5684 >= -13 ;+-6 x2959 -5 x3053 -9 x3147 -6 x3335 -4 x3429 -7 x3523 -6 x3617 -6 x3711 -3 x3899 -4 x3993 -1 x4087 -4 x4181 -2 x4275 -9 x4369 -4 x4463 -10 x4651 -10 x4745 -5 x4839 -7 x4933 -7 x5027 -9 x5121 -10 x5215 -1 x5309 -9 x5403 -7 x5497 -9 x5591 -5 x5685 >= -13 ;+-6 x2960 -5 x3054 -9 x3148 -6 x3336 -4 x3430 -7 x3524 -6 x3618 -6 x3712 -3 x3900 -4 x3994 -1 x4088 -4 x4182 -2 x4276 -9 x4370 -4 x4464 -10 x4652 -10 x4746 -5 x4840 -7 x4934 -7 x5028 -9 x5122 -10 x5216 -1 x5310 -9 x5404 -7 x5498 -9 x5592 -5 x5686 >= -13 ;+-6 x2961 -5 x3055 -9 x3149 -6 x3337 -4 x3431 -7 x3525 -6 x3619 -6 x3713 -3 x3901 -4 x3995 -1 x4089 -4 x4183 -2 x4277 -9 x4371 -4 x4465 -10 x4653 -10 x4747 -5 x4841 -7 x4935 -7 x5029 -9 x5123 -10 x5217 -1 x5311 -9 x5405 -7 x5499 -9 x5593 -5 x5687 >= -13 ;+-6 x2962 -5 x3056 -9 x3150 -6 x3338 -4 x3432 -7 x3526 -6 x3620 -6 x3714 -3 x3902 -4 x3996 -1 x4090 -4 x4184 -2 x4278 -9 x4372 -4 x4466 -10 x4654 -10 x4748 -5 x4842 -7 x4936 -7 x5030 -9 x5124 -10 x5218 -1 x5312 -9 x5406 -7 x5500 -9 x5594 -5 x5688 >= -13 ;+-6 x2963 -5 x3057 -9 x3151 -6 x3339 -4 x3433 -7 x3527 -6 x3621 -6 x3715 -3 x3903 -4 x3997 -1 x4091 -4 x4185 -2 x4279 -9 x4373 -4 x4467 -10 x4655 -10 x4749 -5 x4843 -7 x4937 -7 x5031 -9 x5125 -10 x5219 -1 x5313 -9 x5407 -7 x5501 -9 x5595 -5 x5689 >= -13 ;+-6 x2964 -5 x3058 -9 x3152 -6 x3340 -4 x3434 -7 x3528 -6 x3622 -6 x3716 -3 x3904 -4 x3998 -1 x4092 -4 x4186 -2 x4280 -9 x4374 -4 x4468 -10 x4656 -10 x4750 -5 x4844 -7 x4938 -7 x5032 -9 x5126 -10 x5220 -1 x5314 -9 x5408 -7 x5502 -9 x5596 -5 x5690 >= -13 ;+-6 x2965 -5 x3059 -9 x3153 -6 x3341 -4 x3435 -7 x3529 -6 x3623 -6 x3717 -3 x3905 -4 x3999 -1 x4093 -4 x4187 -2 x4281 -9 x4375 -4 x4469 -10 x4657 -10 x4751 -5 x4845 -7 x4939 -7 x5033 -9 x5127 -10 x5221 -1 x5315 -9 x5409 -7 x5503 -9 x5597 -5 x5691 >= -13 ;+-6 x2966 -5 x3060 -9 x3154 -6 x3342 -4 x3436 -7 x3530 -6 x3624 -6 x3718 -3 x3906 -4 x4000 -1 x4094 -4 x4188 -2 x4282 -9 x4376 -4 x4470 -10 x4658 -10 x4752 -5 x4846 -7 x4940 -7 x5034 -9 x5128 -10 x5222 -1 x5316 -9 x5410 -7 x5504 -9 x5598 -5 x5692 >= -13 ;+-6 x2967 -5 x3061 -9 x3155 -6 x3343 -4 x3437 -7 x3531 -6 x3625 -6 x3719 -3 x3907 -4 x4001 -1 x4095 -4 x4189 -2 x4283 -9 x4377 -4 x4471 -10 x4659 -10 x4753 -5 x4847 -7 x4941 -7 x5035 -9 x5129 -10 x5223 -1 x5317 -9 x5411 -7 x5505 -9 x5599 -5 x5693 >= -13 ;+-6 x2968 -5 x3062 -9 x3156 -6 x3344 -4 x3438 -7 x3532 -6 x3626 -6 x3720 -3 x3908 -4 x4002 -1 x4096 -4 x4190 -2 x4284 -9 x4378 -4 x4472 -10 x4660 -10 x4754 -5 x4848 -7 x4942 -7 x5036 -9 x5130 -10 x5224 -1 x5318 -9 x5412 -7 x5506 -9 x5600 -5 x5694 >= -13 ;+-6 x2969 -5 x3063 -9 x3157 -6 x3345 -4 x3439 -7 x3533 -6 x3627 -6 x3721 -3 x3909 -4 x4003 -1 x4097 -4 x4191 -2 x4285 -9 x4379 -4 x4473 -10 x4661 -10 x4755 -5 x4849 -7 x4943 -7 x5037 -9 x5131 -10 x5225 -1 x5319 -9 x5413 -7 x5507 -9 x5601 -5 x5695 >= -13 ;+-6 x2970 -5 x3064 -9 x3158 -6 x3346 -4 x3440 -7 x3534 -6 x3628 -6 x3722 -3 x3910 -4 x4004 -1 x4098 -4 x4192 -2 x4286 -9 x4380 -4 x4474 -10 x4662 -10 x4756 -5 x4850 -7 x4944 -7 x5038 -9 x5132 -10 x5226 -1 x5320 -9 x5414 -7 x5508 -9 x5602 -5 x5696 >= -13 ;+-6 x2971 -5 x3065 -9 x3159 -6 x3347 -4 x3441 -7 x3535 -6 x3629 -6 x3723 -3 x3911 -4 x4005 -1 x4099 -4 x4193 -2 x4287 -9 x4381 -4 x4475 -10 x4663 -10 x4757 -5 x4851 -7 x4945 -7 x5039 -9 x5133 -10 x5227 -1 x5321 -9 x5415 -7 x5509 -9 x5603 -5 x5697 >= -13 ;+-6 x2972 -5 x3066 -9 x3160 -6 x3348 -4 x3442 -7 x3536 -6 x3630 -6 x3724 -3 x3912 -4 x4006 -1 x4100 -4 x4194 -2 x4288 -9 x4382 -4 x4476 -10 x4664 -10 x4758 -5 x4852 -7 x4946 -7 x5040 -9 x5134 -10 x5228 -1 x5322 -9 x5416 -7 x5510 -9 x5604 -5 x5698 >= -13 ;+-6 x2973 -5 x3067 -9 x3161 -6 x3349 -4 x3443 -7 x3537 -6 x3631 -6 x3725 -3 x3913 -4 x4007 -1 x4101 -4 x4195 -2 x4289 -9 x4383 -4 x4477 -10 x4665 -10 x4759 -5 x4853 -7 x4947 -7 x5041 -9 x5135 -10 x5229 -1 x5323 -9 x5417 -7 x5511 -9 x5605 -5 x5699 >= -13 ;+-6 x2974 -5 x3068 -9 x3162 -6 x3350 -4 x3444 -7 x3538 -6 x3632 -6 x3726 -3 x3914 -4 x4008 -1 x4102 -4 x4196 -2 x4290 -9 x4384 -4 x4478 -10 x4666 -10 x4760 -5 x4854 -7 x4948 -7 x5042 -9 x5136 -10 x5230 -1 x5324 -9 x5418 -7 x5512 -9 x5606 -5 x5700 >= -13 ;+-6 x2975 -5 x3069 -9 x3163 -6 x3351 -4 x3445 -7 x3539 -6 x3633 -6 x3727 -3 x3915 -4 x4009 -1 x4103 -4 x4197 -2 x4291 -9 x4385 -4 x4479 -10 x4667 -10 x4761 -5 x4855 -7 x4949 -7 x5043 -9 x5137 -10 x5231 -1 x5325 -9 x5419 -7 x5513 -9 x5607 -5 x5701 >= -13 ;+-6 x2976 -5 x3070 -9 x3164 -6 x3352 -4 x3446 -7 x3540 -6 x3634 -6 x3728 -3 x3916 -4 x4010 -1 x4104 -4 x4198 -2 x4292 -9 x4386 -4 x4480 -10 x4668 -10 x4762 -5 x4856 -7 x4950 -7 x5044 -9 x5138 -10 x5232 -1 x5326 -9 x5420 -7 x5514 -9 x5608 -5 x5702 >= -13 ;+-6 x2977 -5 x3071 -9 x3165 -6 x3353 -4 x3447 -7 x3541 -6 x3635 -6 x3729 -3 x3917 -4 x4011 -1 x4105 -4 x4199 -2 x4293 -9 x4387 -4 x4481 -10 x4669 -10 x4763 -5 x4857 -7 x4951 -7 x5045 -9 x5139 -10 x5233 -1 x5327 -9 x5421 -7 x5515 -9 x5609 -5 x5703 >= -13 ;+-6 x2978 -5 x3072 -9 x3166 -6 x3354 -4 x3448 -7 x3542 -6 x3636 -6 x3730 -3 x3918 -4 x4012 -1 x4106 -4 x4200 -2 x4294 -9 x4388 -4 x4482 -10 x4670 -10 x4764 -5 x4858 -7 x4952 -7 x5046 -9 x5140 -10 x5234 -1 x5328 -9 x5422 -7 x5516 -9 x5610 -5 x5704 >= -13 ;+-6 x2979 -5 x3073 -9 x3167 -6 x3355 -4 x3449 -7 x3543 -6 x3637 -6 x3731 -3 x3919 -4 x4013 -1 x4107 -4 x4201 -2 x4295 -9 x4389 -4 x4483 -10 x4671 -10 x4765 -5 x4859 -7 x4953 -7 x5047 -9 x5141 -10 x5235 -1 x5329 -9 x5423 -7 x5517 -9 x5611 -5 x5705 >= -13 ;+-6 x2980 -5 x3074 -9 x3168 -6 x3356 -4 x3450 -7 x3544 -6 x3638 -6 x3732 -3 x3920 -4 x4014 -1 x4108 -4 x4202 -2 x4296 -9 x4390 -4 x4484 -10 x4672 -10 x4766 -5 x4860 -7 x4954 -7 x5048 -9 x5142 -10 x5236 -1 x5330 -9 x5424 -7 x5518 -9 x5612 -5 x5706 >= -13 ;+-6 x2981 -5 x3075 -9 x3169 -6 x3357 -4 x3451 -7 x3545 -6 x3639 -6 x3733 -3 x3921 -4 x4015 -1 x4109 -4 x4203 -2 x4297 -9 x4391 -4 x4485 -10 x4673 -10 x4767 -5 x4861 -7 x4955 -7 x5049 -9 x5143 -10 x5237 -1 x5331 -9 x5425 -7 x5519 -9 x5613 -5 x5707 >= -13 ;+-6 x2982 -5 x3076 -9 x3170 -6 x3358 -4 x3452 -7 x3546 -6 x3640 -6 x3734 -3 x3922 -4 x4016 -1 x4110 -4 x4204 -2 x4298 -9 x4392 -4 x4486 -10 x4674 -10 x4768 -5 x4862 -7 x4956 -7 x5050 -9 x5144 -10 x5238 -1 x5332 -9 x5426 -7 x5520 -9 x5614 -5 x5708 >= -13 ;+-6 x2983 -5 x3077 -9 x3171 -6 x3359 -4 x3453 -7 x3547 -6 x3641 -6 x3735 -3 x3923 -4 x4017 -1 x4111 -4 x4205 -2 x4299 -9 x4393 -4 x4487 -10 x4675 -10 x4769 -5 x4863 -7 x4957 -7 x5051 -9 x5145 -10 x5239 -1 x5333 -9 x5427 -7 x5521 -9 x5615 -5 x5709 >= -13 ;+-6 x2984 -5 x3078 -9 x3172 -6 x3360 -4 x3454 -7 x3548 -6 x3642 -6 x3736 -3 x3924 -4 x4018 -1 x4112 -4 x4206 -2 x4300 -9 x4394 -4 x4488 -10 x4676 -10 x4770 -5 x4864 -7 x4958 -7 x5052 -9 x5146 -10 x5240 -1 x5334 -9 x5428 -7 x5522 -9 x5616 -5 x5710 >= -13 ;+-6 x2985 -5 x3079 -9 x3173 -6 x3361 -4 x3455 -7 x3549 -6 x3643 -6 x3737 -3 x3925 -4 x4019 -1 x4113 -4 x4207 -2 x4301 -9 x4395 -4 x4489 -10 x4677 -10 x4771 -5 x4865 -7 x4959 -7 x5053 -9 x5147 -10 x5241 -1 x5335 -9 x5429 -7 x5523 -9 x5617 -5 x5711 >= -13 ;+-6 x2986 -5 x3080 -9 x3174 -6 x3362 -4 x3456 -7 x3550 -6 x3644 -6 x3738 -3 x3926 -4 x4020 -1 x4114 -4 x4208 -2 x4302 -9 x4396 -4 x4490 -10 x4678 -10 x4772 -5 x4866 -7 x4960 -7 x5054 -9 x5148 -10 x5242 -1 x5336 -9 x5430 -7 x5524 -9 x5618 -5 x5712 >= -13 ;+-6 x2987 -5 x3081 -9 x3175 -6 x3363 -4 x3457 -7 x3551 -6 x3645 -6 x3739 -3 x3927 -4 x4021 -1 x4115 -4 x4209 -2 x4303 -9 x4397 -4 x4491 -10 x4679 -10 x4773 -5 x4867 -7 x4961 -7 x5055 -9 x5149 -10 x5243 -1 x5337 -9 x5431 -7 x5525 -9 x5619 -5 x5713 >= -13 ;+-6 x2988 -5 x3082 -9 x3176 -6 x3364 -4 x3458 -7 x3552 -6 x3646 -6 x3740 -3 x3928 -4 x4022 -1 x4116 -4 x4210 -2 x4304 -9 x4398 -4 x4492 -10 x4680 -10 x4774 -5 x4868 -7 x4962 -7 x5056 -9 x5150 -10 x5244 -1 x5338 -9 x5432 -7 x5526 -9 x5620 -5 x5714 >= -13 ;+-6 x2989 -5 x3083 -9 x3177 -6 x3365 -4 x3459 -7 x3553 -6 x3647 -6 x3741 -3 x3929 -4 x4023 -1 x4117 -4 x4211 -2 x4305 -9 x4399 -4 x4493 -10 x4681 -10 x4775 -5 x4869 -7 x4963 -7 x5057 -9 x5151 -10 x5245 -1 x5339 -9 x5433 -7 x5527 -9 x5621 -5 x5715 >= -13 ;+-6 x2990 -5 x3084 -9 x3178 -6 x3366 -4 x3460 -7 x3554 -6 x3648 -6 x3742 -3 x3930 -4 x4024 -1 x4118 -4 x4212 -2 x4306 -9 x4400 -4 x4494 -10 x4682 -10 x4776 -5 x4870 -7 x4964 -7 x5058 -9 x5152 -10 x5246 -1 x5340 -9 x5434 -7 x5528 -9 x5622 -5 x5716 >= -13 ;+-6 x2991 -5 x3085 -9 x3179 -6 x3367 -4 x3461 -7 x3555 -6 x3649 -6 x3743 -3 x3931 -4 x4025 -1 x4119 -4 x4213 -2 x4307 -9 x4401 -4 x4495 -10 x4683 -10 x4777 -5 x4871 -7 x4965 -7 x5059 -9 x5153 -10 x5247 -1 x5341 -9 x5435 -7 x5529 -9 x5623 -5 x5717 >= -13 ;+-6 x2992 -5 x3086 -9 x3180 -6 x3368 -4 x3462 -7 x3556 -6 x3650 -6 x3744 -3 x3932 -4 x4026 -1 x4120 -4 x4214 -2 x4308 -9 x4402 -4 x4496 -10 x4684 -10 x4778 -5 x4872 -7 x4966 -7 x5060 -9 x5154 -10 x5248 -1 x5342 -9 x5436 -7 x5530 -9 x5624 -5 x5718 >= -13 ;+-6 x2993 -5 x3087 -9 x3181 -6 x3369 -4 x3463 -7 x3557 -6 x3651 -6 x3745 -3 x3933 -4 x4027 -1 x4121 -4 x4215 -2 x4309 -9 x4403 -4 x4497 -10 x4685 -10 x4779 -5 x4873 -7 x4967 -7 x5061 -9 x5155 -10 x5249 -1 x5343 -9 x5437 -7 x5531 -9 x5625 -5 x5719 >= -13 ;+-6 x2994 -5 x3088 -9 x3182 -6 x3370 -4 x3464 -7 x3558 -6 x3652 -6 x3746 -3 x3934 -4 x4028 -1 x4122 -4 x4216 -2 x4310 -9 x4404 -4 x4498 -10 x4686 -10 x4780 -5 x4874 -7 x4968 -7 x5062 -9 x5156 -10 x5250 -1 x5344 -9 x5438 -7 x5532 -9 x5626 -5 x5720 >= -13 ;+-6 x2995 -5 x3089 -9 x3183 -6 x3371 -4 x3465 -7 x3559 -6 x3653 -6 x3747 -3 x3935 -4 x4029 -1 x4123 -4 x4217 -2 x4311 -9 x4405 -4 x4499 -10 x4687 -10 x4781 -5 x4875 -7 x4969 -7 x5063 -9 x5157 -10 x5251 -1 x5345 -9 x5439 -7 x5533 -9 x5627 -5 x5721 >= -13 ;+-6 x2996 -5 x3090 -9 x3184 -6 x3372 -4 x3466 -7 x3560 -6 x3654 -6 x3748 -3 x3936 -4 x4030 -1 x4124 -4 x4218 -2 x4312 -9 x4406 -4 x4500 -10 x4688 -10 x4782 -5 x4876 -7 x4970 -7 x5064 -9 x5158 -10 x5252 -1 x5346 -9 x5440 -7 x5534 -9 x5628 -5 x5722 >= -13 ;+-6 x2997 -5 x3091 -9 x3185 -6 x3373 -4 x3467 -7 x3561 -6 x3655 -6 x3749 -3 x3937 -4 x4031 -1 x4125 -4 x4219 -2 x4313 -9 x4407 -4 x4501 -10 x4689 -10 x4783 -5 x4877 -7 x4971 -7 x5065 -9 x5159 -10 x5253 -1 x5347 -9 x5441 -7 x5535 -9 x5629 -5 x5723 >= -13 ;+-6 x2998 -5 x3092 -9 x3186 -6 x3374 -4 x3468 -7 x3562 -6 x3656 -6 x3750 -3 x3938 -4 x4032 -1 x4126 -4 x4220 -2 x4314 -9 x4408 -4 x4502 -10 x4690 -10 x4784 -5 x4878 -7 x4972 -7 x5066 -9 x5160 -10 x5254 -1 x5348 -9 x5442 -7 x5536 -9 x5630 -5 x5724 >= -13 ;+-6 x2999 -5 x3093 -9 x3187 -6 x3375 -4 x3469 -7 x3563 -6 x3657 -6 x3751 -3 x3939 -4 x4033 -1 x4127 -4 x4221 -2 x4315 -9 x4409 -4 x4503 -10 x4691 -10 x4785 -5 x4879 -7 x4973 -7 x5067 -9 x5161 -10 x5255 -1 x5349 -9 x5443 -7 x5537 -9 x5631 -5 x5725 >= -13 ;+-6 x3000 -5 x3094 -9 x3188 -6 x3376 -4 x3470 -7 x3564 -6 x3658 -6 x3752 -3 x3940 -4 x4034 -1 x4128 -4 x4222 -2 x4316 -9 x4410 -4 x4504 -10 x4692 -10 x4786 -5 x4880 -7 x4974 -7 x5068 -9 x5162 -10 x5256 -1 x5350 -9 x5444 -7 x5538 -9 x5632 -5 x5726 >= -13 ;+-6 x3001 -5 x3095 -9 x3189 -6 x3377 -4 x3471 -7 x3565 -6 x3659 -6 x3753 -3 x3941 -4 x4035 -1 x4129 -4 x4223 -2 x4317 -9 x4411 -4 x4505 -10 x4693 -10 x4787 -5 x4881 -7 x4975 -7 x5069 -9 x5163 -10 x5257 -1 x5351 -9 x5445 -7 x5539 -9 x5633 -5 x5727 >= -13 ;+-6 x3002 -5 x3096 -9 x3190 -6 x3378 -4 x3472 -7 x3566 -6 x3660 -6 x3754 -3 x3942 -4 x4036 -1 x4130 -4 x4224 -2 x4318 -9 x4412 -4 x4506 -10 x4694 -10 x4788 -5 x4882 -7 x4976 -7 x5070 -9 x5164 -10 x5258 -1 x5352 -9 x5446 -7 x5540 -9 x5634 -5 x5728 >= -13 ;+-6 x3003 -5 x3097 -9 x3191 -6 x3379 -4 x3473 -7 x3567 -6 x3661 -6 x3755 -3 x3943 -4 x4037 -1 x4131 -4 x4225 -2 x4319 -9 x4413 -4 x4507 -10 x4695 -10 x4789 -5 x4883 -7 x4977 -7 x5071 -9 x5165 -10 x5259 -1 x5353 -9 x5447 -7 x5541 -9 x5635 -5 x5729 >= -13 ;+-6 x3004 -5 x3098 -9 x3192 -6 x3380 -4 x3474 -7 x3568 -6 x3662 -6 x3756 -3 x3944 -4 x4038 -1 x4132 -4 x4226 -2 x4320 -9 x4414 -4 x4508 -10 x4696 -10 x4790 -5 x4884 -7 x4978 -7 x5072 -9 x5166 -10 x5260 -1 x5354 -9 x5448 -7 x5542 -9 x5636 -5 x5730 >= -13 ;+-6 x3005 -5 x3099 -9 x3193 -6 x3381 -4 x3475 -7 x3569 -6 x3663 -6 x3757 -3 x3945 -4 x4039 -1 x4133 -4 x4227 -2 x4321 -9 x4415 -4 x4509 -10 x4697 -10 x4791 -5 x4885 -7 x4979 -7 x5073 -9 x5167 -10 x5261 -1 x5355 -9 x5449 -7 x5543 -9 x5637 -5 x5731 >= -13 ;+-6 x3006 -5 x3100 -9 x3194 -6 x3382 -4 x3476 -7 x3570 -6 x3664 -6 x3758 -3 x3946 -4 x4040 -1 x4134 -4 x4228 -2 x4322 -9 x4416 -4 x4510 -10 x4698 -10 x4792 -5 x4886 -7 x4980 -7 x5074 -9 x5168 -10 x5262 -1 x5356 -9 x5450 -7 x5544 -9 x5638 -5 x5732 >= -13 ;+-6 x3007 -5 x3101 -9 x3195 -6 x3383 -4 x3477 -7 x3571 -6 x3665 -6 x3759 -3 x3947 -4 x4041 -1 x4135 -4 x4229 -2 x4323 -9 x4417 -4 x4511 -10 x4699 -10 x4793 -5 x4887 -7 x4981 -7 x5075 -9 x5169 -10 x5263 -1 x5357 -9 x5451 -7 x5545 -9 x5639 -5 x5733 >= -13 ;+-2 x2915 -2 x3197 -5 x3291 -9 x3573 -3 x3667 -3 x3761 -1 x3855 -4 x4043 -5 x4137 -2 x4231 -10 x4325 -9 x4419 -8 x4513 -4 x4607 -3 x4701 -6 x4795 -7 x4983 -7 x5077 -5 x5171 -6 x5265 -9 x5359 -5 x5453 -10 x5547 >= -13 ;+-2 x2916 -2 x3198 -5 x3292 -9 x3574 -3 x3668 -3 x3762 -1 x3856 -4 x4044 -5 x4138 -2 x4232 -10 x4326 -9 x4420 -8 x4514 -4 x4608 -3 x4702 -6 x4796 -7 x4984 -7 x5078 -5 x5172 -6 x5266 -9 x5360 -5 x5454 -10 x5548 >= -13 ;+-2 x2917 -2 x3199 -5 x3293 -9 x3575 -3 x3669 -3 x3763 -1 x3857 -4 x4045 -5 x4139 -2 x4233 -10 x4327 -9 x4421 -8 x4515 -4 x4609 -3 x4703 -6 x4797 -7 x4985 -7 x5079 -5 x5173 -6 x5267 -9 x5361 -5 x5455 -10 x5549 >= -13 ;+-2 x2918 -2 x3200 -5 x3294 -9 x3576 -3 x3670 -3 x3764 -1 x3858 -4 x4046 -5 x4140 -2 x4234 -10 x4328 -9 x4422 -8 x4516 -4 x4610 -3 x4704 -6 x4798 -7 x4986 -7 x5080 -5 x5174 -6 x5268 -9 x5362 -5 x5456 -10 x5550 >= -13 ;+-2 x2919 -2 x3201 -5 x3295 -9 x3577 -3 x3671 -3 x3765 -1 x3859 -4 x4047 -5 x4141 -2 x4235 -10 x4329 -9 x4423 -8 x4517 -4 x4611 -3 x4705 -6 x4799 -7 x4987 -7 x5081 -5 x5175 -6 x5269 -9 x5363 -5 x5457 -10 x5551 >= -13 ;+-2 x2920 -2 x3202 -5 x3296 -9 x3578 -3 x3672 -3 x3766 -1 x3860 -4 x4048 -5 x4142 -2 x4236 -10 x4330 -9 x4424 -8 x4518 -4 x4612 -3 x4706 -6 x4800 -7 x4988 -7 x5082 -5 x5176 -6 x5270 -9 x5364 -5 x5458 -10 x5552 >= -13 ;+-2 x2921 -2 x3203 -5 x3297 -9 x3579 -3 x3673 -3 x3767 -1 x3861 -4 x4049 -5 x4143 -2 x4237 -10 x4331 -9 x4425 -8 x4519 -4 x4613 -3 x4707 -6 x4801 -7 x4989 -7 x5083 -5 x5177 -6 x5271 -9 x5365 -5 x5459 -10 x5553 >= -13 ;+-2 x2922 -2 x3204 -5 x3298 -9 x3580 -3 x3674 -3 x3768 -1 x3862 -4 x4050 -5 x4144 -2 x4238 -10 x4332 -9 x4426 -8 x4520 -4 x4614 -3 x4708 -6 x4802 -7 x4990 -7 x5084 -5 x5178 -6 x5272 -9 x5366 -5 x5460 -10 x5554 >= -13 ;+-2 x2923 -2 x3205 -5 x3299 -9 x3581 -3 x3675 -3 x3769 -1 x3863 -4 x4051 -5 x4145 -2 x4239 -10 x4333 -9 x4427 -8 x4521 -4 x4615 -3 x4709 -6 x4803 -7 x4991 -7 x5085 -5 x5179 -6 x5273 -9 x5367 -5 x5461 -10 x5555 >= -13 ;+-2 x2924 -2 x3206 -5 x3300 -9 x3582 -3 x3676 -3 x3770 -1 x3864 -4 x4052 -5 x4146 -2 x4240 -10 x4334 -9 x4428 -8 x4522 -4 x4616 -3 x4710 -6 x4804 -7 x4992 -7 x5086 -5 x5180 -6 x5274 -9 x5368 -5 x5462 -10 x5556 >= -13 ;+-2 x2925 -2 x3207 -5 x3301 -9 x3583 -3 x3677 -3 x3771 -1 x3865 -4 x4053 -5 x4147 -2 x4241 -10 x4335 -9 x4429 -8 x4523 -4 x4617 -3 x4711 -6 x4805 -7 x4993 -7 x5087 -5 x5181 -6 x5275 -9 x5369 -5 x5463 -10 x5557 >= -13 ;+-2 x2926 -2 x3208 -5 x3302 -9 x3584 -3 x3678 -3 x3772 -1 x3866 -4 x4054 -5 x4148 -2 x4242 -10 x4336 -9 x4430 -8 x4524 -4 x4618 -3 x4712 -6 x4806 -7 x4994 -7 x5088 -5 x5182 -6 x5276 -9 x5370 -5 x5464 -10 x5558 >= -13 ;+-2 x2927 -2 x3209 -5 x3303 -9 x3585 -3 x3679 -3 x3773 -1 x3867 -4 x4055 -5 x4149 -2 x4243 -10 x4337 -9 x4431 -8 x4525 -4 x4619 -3 x4713 -6 x4807 -7 x4995 -7 x5089 -5 x5183 -6 x5277 -9 x5371 -5 x5465 -10 x5559 >= -13 ;+-2 x2928 -2 x3210 -5 x3304 -9 x3586 -3 x3680 -3 x3774 -1 x3868 -4 x4056 -5 x4150 -2 x4244 -10 x4338 -9 x4432 -8 x4526 -4 x4620 -3 x4714 -6 x4808 -7 x4996 -7 x5090 -5 x5184 -6 x5278 -9 x5372 -5 x5466 -10 x5560 >= -13 ;+-2 x2929 -2 x3211 -5 x3305 -9 x3587 -3 x3681 -3 x3775 -1 x3869 -4 x4057 -5 x4151 -2 x4245 -10 x4339 -9 x4433 -8 x4527 -4 x4621 -3 x4715 -6 x4809 -7 x4997 -7 x5091 -5 x5185 -6 x5279 -9 x5373 -5 x5467 -10 x5561 >= -13 ;+-2 x2930 -2 x3212 -5 x3306 -9 x3588 -3 x3682 -3 x3776 -1 x3870 -4 x4058 -5 x4152 -2 x4246 -10 x4340 -9 x4434 -8 x4528 -4 x4622 -3 x4716 -6 x4810 -7 x4998 -7 x5092 -5 x5186 -6 x5280 -9 x5374 -5 x5468 -10 x5562 >= -13 ;+-2 x2931 -2 x3213 -5 x3307 -9 x3589 -3 x3683 -3 x3777 -1 x3871 -4 x4059 -5 x4153 -2 x4247 -10 x4341 -9 x4435 -8 x4529 -4 x4623 -3 x4717 -6 x4811 -7 x4999 -7 x5093 -5 x5187 -6 x5281 -9 x5375 -5 x5469 -10 x5563 >= -13 ;+-2 x2932 -2 x3214 -5 x3308 -9 x3590 -3 x3684 -3 x3778 -1 x3872 -4 x4060 -5 x4154 -2 x4248 -10 x4342 -9 x4436 -8 x4530 -4 x4624 -3 x4718 -6 x4812 -7 x5000 -7 x5094 -5 x5188 -6 x5282 -9 x5376 -5 x5470 -10 x5564 >= -13 ;+-2 x2933 -2 x3215 -5 x3309 -9 x3591 -3 x3685 -3 x3779 -1 x3873 -4 x4061 -5 x4155 -2 x4249 -10 x4343 -9 x4437 -8 x4531 -4 x4625 -3 x4719 -6 x4813 -7 x5001 -7 x5095 -5 x5189 -6 x5283 -9 x5377 -5 x5471 -10 x5565 >= -13 ;+-2 x2934 -2 x3216 -5 x3310 -9 x3592 -3 x3686 -3 x3780 -1 x3874 -4 x4062 -5 x4156 -2 x4250 -10 x4344 -9 x4438 -8 x4532 -4 x4626 -3 x4720 -6 x4814 -7 x5002 -7 x5096 -5 x5190 -6 x5284 -9 x5378 -5 x5472 -10 x5566 >= -13 ;+-2 x2935 -2 x3217 -5 x3311 -9 x3593 -3 x3687 -3 x3781 -1 x3875 -4 x4063 -5 x4157 -2 x4251 -10 x4345 -9 x4439 -8 x4533 -4 x4627 -3 x4721 -6 x4815 -7 x5003 -7 x5097 -5 x5191 -6 x5285 -9 x5379 -5 x5473 -10 x5567 >= -13 ;+-2 x2936 -2 x3218 -5 x3312 -9 x3594 -3 x3688 -3 x3782 -1 x3876 -4 x4064 -5 x4158 -2 x4252 -10 x4346 -9 x4440 -8 x4534 -4 x4628 -3 x4722 -6 x4816 -7 x5004 -7 x5098 -5 x5192 -6 x5286 -9 x5380 -5 x5474 -10 x5568 >= -13 ;+-2 x2937 -2 x3219 -5 x3313 -9 x3595 -3 x3689 -3 x3783 -1 x3877 -4 x4065 -5 x4159 -2 x4253 -10 x4347 -9 x4441 -8 x4535 -4 x4629 -3 x4723 -6 x4817 -7 x5005 -7 x5099 -5 x5193 -6 x5287 -9 x5381 -5 x5475 -10 x5569 >= -13 ;+-2 x2938 -2 x3220 -5 x3314 -9 x3596 -3 x3690 -3 x3784 -1 x3878 -4 x4066 -5 x4160 -2 x4254 -10 x4348 -9 x4442 -8 x4536 -4 x4630 -3 x4724 -6 x4818 -7 x5006 -7 x5100 -5 x5194 -6 x5288 -9 x5382 -5 x5476 -10 x5570 >= -13 ;+-2 x2939 -2 x3221 -5 x3315 -9 x3597 -3 x3691 -3 x3785 -1 x3879 -4 x4067 -5 x4161 -2 x4255 -10 x4349 -9 x4443 -8 x4537 -4 x4631 -3 x4725 -6 x4819 -7 x5007 -7 x5101 -5 x5195 -6 x5289 -9 x5383 -5 x5477 -10 x5571 >= -13 ;+-2 x2940 -2 x3222 -5 x3316 -9 x3598 -3 x3692 -3 x3786 -1 x3880 -4 x4068 -5 x4162 -2 x4256 -10 x4350 -9 x4444 -8 x4538 -4 x4632 -3 x4726 -6 x4820 -7 x5008 -7 x5102 -5 x5196 -6 x5290 -9 x5384 -5 x5478 -10 x5572 >= -13 ;+-2 x2941 -2 x3223 -5 x3317 -9 x3599 -3 x3693 -3 x3787 -1 x3881 -4 x4069 -5 x4163 -2 x4257 -10 x4351 -9 x4445 -8 x4539 -4 x4633 -3 x4727 -6 x4821 -7 x5009 -7 x5103 -5 x5197 -6 x5291 -9 x5385 -5 x5479 -10 x5573 >= -13 ;+-2 x2942 -2 x3224 -5 x3318 -9 x3600 -3 x3694 -3 x3788 -1 x3882 -4 x4070 -5 x4164 -2 x4258 -10 x4352 -9 x4446 -8 x4540 -4 x4634 -3 x4728 -6 x4822 -7 x5010 -7 x5104 -5 x5198 -6 x5292 -9 x5386 -5 x5480 -10 x5574 >= -13 ;+-2 x2943 -2 x3225 -5 x3319 -9 x3601 -3 x3695 -3 x3789 -1 x3883 -4 x4071 -5 x4165 -2 x4259 -10 x4353 -9 x4447 -8 x4541 -4 x4635 -3 x4729 -6 x4823 -7 x5011 -7 x5105 -5 x5199 -6 x5293 -9 x5387 -5 x5481 -10 x5575 >= -13 ;+-2 x2944 -2 x3226 -5 x3320 -9 x3602 -3 x3696 -3 x3790 -1 x3884 -4 x4072 -5 x4166 -2 x4260 -10 x4354 -9 x4448 -8 x4542 -4 x4636 -3 x4730 -6 x4824 -7 x5012 -7 x5106 -5 x5200 -6 x5294 -9 x5388 -5 x5482 -10 x5576 >= -13 ;+-2 x2945 -2 x3227 -5 x3321 -9 x3603 -3 x3697 -3 x3791 -1 x3885 -4 x4073 -5 x4167 -2 x4261 -10 x4355 -9 x4449 -8 x4543 -4 x4637 -3 x4731 -6 x4825 -7 x5013 -7 x5107 -5 x5201 -6 x5295 -9 x5389 -5 x5483 -10 x5577 >= -13 ;+-2 x2946 -2 x3228 -5 x3322 -9 x3604 -3 x3698 -3 x3792 -1 x3886 -4 x4074 -5 x4168 -2 x4262 -10 x4356 -9 x4450 -8 x4544 -4 x4638 -3 x4732 -6 x4826 -7 x5014 -7 x5108 -5 x5202 -6 x5296 -9 x5390 -5 x5484 -10 x5578 >= -13 ;+-2 x2947 -2 x3229 -5 x3323 -9 x3605 -3 x3699 -3 x3793 -1 x3887 -4 x4075 -5 x4169 -2 x4263 -10 x4357 -9 x4451 -8 x4545 -4 x4639 -3 x4733 -6 x4827 -7 x5015 -7 x5109 -5 x5203 -6 x5297 -9 x5391 -5 x5485 -10 x5579 >= -13 ;+-2 x2948 -2 x3230 -5 x3324 -9 x3606 -3 x3700 -3 x3794 -1 x3888 -4 x4076 -5 x4170 -2 x4264 -10 x4358 -9 x4452 -8 x4546 -4 x4640 -3 x4734 -6 x4828 -7 x5016 -7 x5110 -5 x5204 -6 x5298 -9 x5392 -5 x5486 -10 x5580 >= -13 ;+-2 x2949 -2 x3231 -5 x3325 -9 x3607 -3 x3701 -3 x3795 -1 x3889 -4 x4077 -5 x4171 -2 x4265 -10 x4359 -9 x4453 -8 x4547 -4 x4641 -3 x4735 -6 x4829 -7 x5017 -7 x5111 -5 x5205 -6 x5299 -9 x5393 -5 x5487 -10 x5581 >= -13 ;+-2 x2950 -2 x3232 -5 x3326 -9 x3608 -3 x3702 -3 x3796 -1 x3890 -4 x4078 -5 x4172 -2 x4266 -10 x4360 -9 x4454 -8 x4548 -4 x4642 -3 x4736 -6 x4830 -7 x5018 -7 x5112 -5 x5206 -6 x5300 -9 x5394 -5 x5488 -10 x5582 >= -13 ;+-2 x2951 -2 x3233 -5 x3327 -9 x3609 -3 x3703 -3 x3797 -1 x3891 -4 x4079 -5 x4173 -2 x4267 -10 x4361 -9 x4455 -8 x4549 -4 x4643 -3 x4737 -6 x4831 -7 x5019 -7 x5113 -5 x5207 -6 x5301 -9 x5395 -5 x5489 -10 x5583 >= -13 ;+-2 x2952 -2 x3234 -5 x3328 -9 x3610 -3 x3704 -3 x3798 -1 x3892 -4 x4080 -5 x4174 -2 x4268 -10 x4362 -9 x4456 -8 x4550 -4 x4644 -3 x4738 -6 x4832 -7 x5020 -7 x5114 -5 x5208 -6 x5302 -9 x5396 -5 x5490 -10 x5584 >= -13 ;+-2 x2953 -2 x3235 -5 x3329 -9 x3611 -3 x3705 -3 x3799 -1 x3893 -4 x4081 -5 x4175 -2 x4269 -10 x4363 -9 x4457 -8 x4551 -4 x4645 -3 x4739 -6 x4833 -7 x5021 -7 x5115 -5 x5209 -6 x5303 -9 x5397 -5 x5491 -10 x5585 >= -13 ;+-2 x2954 -2 x3236 -5 x3330 -9 x3612 -3 x3706 -3 x3800 -1 x3894 -4 x4082 -5 x4176 -2 x4270 -10 x4364 -9 x4458 -8 x4552 -4 x4646 -3 x4740 -6 x4834 -7 x5022 -7 x5116 -5 x5210 -6 x5304 -9 x5398 -5 x5492 -10 x5586 >= -13 ;+-2 x2955 -2 x3237 -5 x3331 -9 x3613 -3 x3707 -3 x3801 -1 x3895 -4 x4083 -5 x4177 -2 x4271 -10 x4365 -9 x4459 -8 x4553 -4 x4647 -3 x4741 -6 x4835 -7 x5023 -7 x5117 -5 x5211 -6 x5305 -9 x5399 -5 x5493 -10 x5587 >= -13 ;+-2 x2956 -2 x3238 -5 x3332 -9 x3614 -3 x3708 -3 x3802 -1 x3896 -4 x4084 -5 x4178 -2 x4272 -10 x4366 -9 x4460 -8 x4554 -4 x4648 -3 x4742 -6 x4836 -7 x5024 -7 x5118 -5 x5212 -6 x5306 -9 x5400 -5 x5494 -10 x5588 >= -13 ;+-2 x2957 -2 x3239 -5 x3333 -9 x3615 -3 x3709 -3 x3803 -1 x3897 -4 x4085 -5 x4179 -2 x4273 -10 x4367 -9 x4461 -8 x4555 -4 x4649 -3 x4743 -6 x4837 -7 x5025 -7 x5119 -5 x5213 -6 x5307 -9 x5401 -5 x5495 -10 x5589 >= -13 ;+-2 x2958 -2 x3240 -5 x3334 -9 x3616 -3 x3710 -3 x3804 -1 x3898 -4 x4086 -5 x4180 -2 x4274 -10 x4368 -9 x4462 -8 x4556 -4 x4650 -3 x4744 -6 x4838 -7 x5026 -7 x5120 -5 x5214 -6 x5308 -9 x5402 -5 x5496 -10 x5590 >= -13 ;+-2 x2959 -2 x3241 -5 x3335 -9 x3617 -3 x3711 -3 x3805 -1 x3899 -4 x4087 -5 x4181 -2 x4275 -10 x4369 -9 x4463 -8 x4557 -4 x4651 -3 x4745 -6 x4839 -7 x5027 -7 x5121 -5 x5215 -6 x5309 -9 x5403 -5 x5497 -10 x5591 >= -13 ;+-2 x2960 -2 x3242 -5 x3336 -9 x3618 -3 x3712 -3 x3806 -1 x3900 -4 x4088 -5 x4182 -2 x4276 -10 x4370 -9 x4464 -8 x4558 -4 x4652 -3 x4746 -6 x4840 -7 x5028 -7 x5122 -5 x5216 -6 x5310 -9 x5404 -5 x5498 -10 x5592 >= -13 ;+-2 x2961 -2 x3243 -5 x3337 -9 x3619 -3 x3713 -3 x3807 -1 x3901 -4 x4089 -5 x4183 -2 x4277 -10 x4371 -9 x4465 -8 x4559 -4 x4653 -3 x4747 -6 x4841 -7 x5029 -7 x5123 -5 x5217 -6 x5311 -9 x5405 -5 x5499 -10 x5593 >= -13 ;+-2 x2962 -2 x3244 -5 x3338 -9 x3620 -3 x3714 -3 x3808 -1 x3902 -4 x4090 -5 x4184 -2 x4278 -10 x4372 -9 x4466 -8 x4560 -4 x4654 -3 x4748 -6 x4842 -7 x5030 -7 x5124 -5 x5218 -6 x5312 -9 x5406 -5 x5500 -10 x5594 >= -13 ;+-2 x2963 -2 x3245 -5 x3339 -9 x3621 -3 x3715 -3 x3809 -1 x3903 -4 x4091 -5 x4185 -2 x4279 -10 x4373 -9 x4467 -8 x4561 -4 x4655 -3 x4749 -6 x4843 -7 x5031 -7 x5125 -5 x5219 -6 x5313 -9 x5407 -5 x5501 -10 x5595 >= -13 ;+-2 x2964 -2 x3246 -5 x3340 -9 x3622 -3 x3716 -3 x3810 -1 x3904 -4 x4092 -5 x4186 -2 x4280 -10 x4374 -9 x4468 -8 x4562 -4 x4656 -3 x4750 -6 x4844 -7 x5032 -7 x5126 -5 x5220 -6 x5314 -9 x5408 -5 x5502 -10 x5596 >= -13 ;+-2 x2965 -2 x3247 -5 x3341 -9 x3623 -3 x3717 -3 x3811 -1 x3905 -4 x4093 -5 x4187 -2 x4281 -10 x4375 -9 x4469 -8 x4563 -4 x4657 -3 x4751 -6 x4845 -7 x5033 -7 x5127 -5 x5221 -6 x5315 -9 x5409 -5 x5503 -10 x5597 >= -13 ;+-2 x2966 -2 x3248 -5 x3342 -9 x3624 -3 x3718 -3 x3812 -1 x3906 -4 x4094 -5 x4188 -2 x4282 -10 x4376 -9 x4470 -8 x4564 -4 x4658 -3 x4752 -6 x4846 -7 x5034 -7 x5128 -5 x5222 -6 x5316 -9 x5410 -5 x5504 -10 x5598 >= -13 ;+-2 x2967 -2 x3249 -5 x3343 -9 x3625 -3 x3719 -3 x3813 -1 x3907 -4 x4095 -5 x4189 -2 x4283 -10 x4377 -9 x4471 -8 x4565 -4 x4659 -3 x4753 -6 x4847 -7 x5035 -7 x5129 -5 x5223 -6 x5317 -9 x5411 -5 x5505 -10 x5599 >= -13 ;+-2 x2968 -2 x3250 -5 x3344 -9 x3626 -3 x3720 -3 x3814 -1 x3908 -4 x4096 -5 x4190 -2 x4284 -10 x4378 -9 x4472 -8 x4566 -4 x4660 -3 x4754 -6 x4848 -7 x5036 -7 x5130 -5 x5224 -6 x5318 -9 x5412 -5 x5506 -10 x5600 >= -13 ;+-2 x2969 -2 x3251 -5 x3345 -9 x3627 -3 x3721 -3 x3815 -1 x3909 -4 x4097 -5 x4191 -2 x4285 -10 x4379 -9 x4473 -8 x4567 -4 x4661 -3 x4755 -6 x4849 -7 x5037 -7 x5131 -5 x5225 -6 x5319 -9 x5413 -5 x5507 -10 x5601 >= -13 ;+-2 x2970 -2 x3252 -5 x3346 -9 x3628 -3 x3722 -3 x3816 -1 x3910 -4 x4098 -5 x4192 -2 x4286 -10 x4380 -9 x4474 -8 x4568 -4 x4662 -3 x4756 -6 x4850 -7 x5038 -7 x5132 -5 x5226 -6 x5320 -9 x5414 -5 x5508 -10 x5602 >= -13 ;+-2 x2971 -2 x3253 -5 x3347 -9 x3629 -3 x3723 -3 x3817 -1 x3911 -4 x4099 -5 x4193 -2 x4287 -10 x4381 -9 x4475 -8 x4569 -4 x4663 -3 x4757 -6 x4851 -7 x5039 -7 x5133 -5 x5227 -6 x5321 -9 x5415 -5 x5509 -10 x5603 >= -13 ;+-2 x2972 -2 x3254 -5 x3348 -9 x3630 -3 x3724 -3 x3818 -1 x3912 -4 x4100 -5 x4194 -2 x4288 -10 x4382 -9 x4476 -8 x4570 -4 x4664 -3 x4758 -6 x4852 -7 x5040 -7 x5134 -5 x5228 -6 x5322 -9 x5416 -5 x5510 -10 x5604 >= -13 ;+-2 x2973 -2 x3255 -5 x3349 -9 x3631 -3 x3725 -3 x3819 -1 x3913 -4 x4101 -5 x4195 -2 x4289 -10 x4383 -9 x4477 -8 x4571 -4 x4665 -3 x4759 -6 x4853 -7 x5041 -7 x5135 -5 x5229 -6 x5323 -9 x5417 -5 x5511 -10 x5605 >= -13 ;+-2 x2974 -2 x3256 -5 x3350 -9 x3632 -3 x3726 -3 x3820 -1 x3914 -4 x4102 -5 x4196 -2 x4290 -10 x4384 -9 x4478 -8 x4572 -4 x4666 -3 x4760 -6 x4854 -7 x5042 -7 x5136 -5 x5230 -6 x5324 -9 x5418 -5 x5512 -10 x5606 >= -13 ;+-2 x2975 -2 x3257 -5 x3351 -9 x3633 -3 x3727 -3 x3821 -1 x3915 -4 x4103 -5 x4197 -2 x4291 -10 x4385 -9 x4479 -8 x4573 -4 x4667 -3 x4761 -6 x4855 -7 x5043 -7 x5137 -5 x5231 -6 x5325 -9 x5419 -5 x5513 -10 x5607 >= -13 ;+-2 x2976 -2 x3258 -5 x3352 -9 x3634 -3 x3728 -3 x3822 -1 x3916 -4 x4104 -5 x4198 -2 x4292 -10 x4386 -9 x4480 -8 x4574 -4 x4668 -3 x4762 -6 x4856 -7 x5044 -7 x5138 -5 x5232 -6 x5326 -9 x5420 -5 x5514 -10 x5608 >= -13 ;+-2 x2977 -2 x3259 -5 x3353 -9 x3635 -3 x3729 -3 x3823 -1 x3917 -4 x4105 -5 x4199 -2 x4293 -10 x4387 -9 x4481 -8 x4575 -4 x4669 -3 x4763 -6 x4857 -7 x5045 -7 x5139 -5 x5233 -6 x5327 -9 x5421 -5 x5515 -10 x5609 >= -13 ;+-2 x2978 -2 x3260 -5 x3354 -9 x3636 -3 x3730 -3 x3824 -1 x3918 -4 x4106 -5 x4200 -2 x4294 -10 x4388 -9 x4482 -8 x4576 -4 x4670 -3 x4764 -6 x4858 -7 x5046 -7 x5140 -5 x5234 -6 x5328 -9 x5422 -5 x5516 -10 x5610 >= -13 ;+-2 x2979 -2 x3261 -5 x3355 -9 x3637 -3 x3731 -3 x3825 -1 x3919 -4 x4107 -5 x4201 -2 x4295 -10 x4389 -9 x4483 -8 x4577 -4 x4671 -3 x4765 -6 x4859 -7 x5047 -7 x5141 -5 x5235 -6 x5329 -9 x5423 -5 x5517 -10 x5611 >= -13 ;+-2 x2980 -2 x3262 -5 x3356 -9 x3638 -3 x3732 -3 x3826 -1 x3920 -4 x4108 -5 x4202 -2 x4296 -10 x4390 -9 x4484 -8 x4578 -4 x4672 -3 x4766 -6 x4860 -7 x5048 -7 x5142 -5 x5236 -6 x5330 -9 x5424 -5 x5518 -10 x5612 >= -13 ;+-2 x2981 -2 x3263 -5 x3357 -9 x3639 -3 x3733 -3 x3827 -1 x3921 -4 x4109 -5 x4203 -2 x4297 -10 x4391 -9 x4485 -8 x4579 -4 x4673 -3 x4767 -6 x4861 -7 x5049 -7 x5143 -5 x5237 -6 x5331 -9 x5425 -5 x5519 -10 x5613 >= -13 ;+-2 x2982 -2 x3264 -5 x3358 -9 x3640 -3 x3734 -3 x3828 -1 x3922 -4 x4110 -5 x4204 -2 x4298 -10 x4392 -9 x4486 -8 x4580 -4 x4674 -3 x4768 -6 x4862 -7 x5050 -7 x5144 -5 x5238 -6 x5332 -9 x5426 -5 x5520 -10 x5614 >= -13 ;+-2 x2983 -2 x3265 -5 x3359 -9 x3641 -3 x3735 -3 x3829 -1 x3923 -4 x4111 -5 x4205 -2 x4299 -10 x4393 -9 x4487 -8 x4581 -4 x4675 -3 x4769 -6 x4863 -7 x5051 -7 x5145 -5 x5239 -6 x5333 -9 x5427 -5 x5521 -10 x5615 >= -13 ;+-2 x2984 -2 x3266 -5 x3360 -9 x3642 -3 x3736 -3 x3830 -1 x3924 -4 x4112 -5 x4206 -2 x4300 -10 x4394 -9 x4488 -8 x4582 -4 x4676 -3 x4770 -6 x4864 -7 x5052 -7 x5146 -5 x5240 -6 x5334 -9 x5428 -5 x5522 -10 x5616 >= -13 ;+-2 x2985 -2 x3267 -5 x3361 -9 x3643 -3 x3737 -3 x3831 -1 x3925 -4 x4113 -5 x4207 -2 x4301 -10 x4395 -9 x4489 -8 x4583 -4 x4677 -3 x4771 -6 x4865 -7 x5053 -7 x5147 -5 x5241 -6 x5335 -9 x5429 -5 x5523 -10 x5617 >= -13 ;+-2 x2986 -2 x3268 -5 x3362 -9 x3644 -3 x3738 -3 x3832 -1 x3926 -4 x4114 -5 x4208 -2 x4302 -10 x4396 -9 x4490 -8 x4584 -4 x4678 -3 x4772 -6 x4866 -7 x5054 -7 x5148 -5 x5242 -6 x5336 -9 x5430 -5 x5524 -10 x5618 >= -13 ;+-2 x2987 -2 x3269 -5 x3363 -9 x3645 -3 x3739 -3 x3833 -1 x3927 -4 x4115 -5 x4209 -2 x4303 -10 x4397 -9 x4491 -8 x4585 -4 x4679 -3 x4773 -6 x4867 -7 x5055 -7 x5149 -5 x5243 -6 x5337 -9 x5431 -5 x5525 -10 x5619 >= -13 ;+-2 x2988 -2 x3270 -5 x3364 -9 x3646 -3 x3740 -3 x3834 -1 x3928 -4 x4116 -5 x4210 -2 x4304 -10 x4398 -9 x4492 -8 x4586 -4 x4680 -3 x4774 -6 x4868 -7 x5056 -7 x5150 -5 x5244 -6 x5338 -9 x5432 -5 x5526 -10 x5620 >= -13 ;+-2 x2989 -2 x3271 -5 x3365 -9 x3647 -3 x3741 -3 x3835 -1 x3929 -4 x4117 -5 x4211 -2 x4305 -10 x4399 -9 x4493 -8 x4587 -4 x4681 -3 x4775 -6 x4869 -7 x5057 -7 x5151 -5 x5245 -6 x5339 -9 x5433 -5 x5527 -10 x5621 >= -13 ;+-2 x2990 -2 x3272 -5 x3366 -9 x3648 -3 x3742 -3 x3836 -1 x3930 -4 x4118 -5 x4212 -2 x4306 -10 x4400 -9 x4494 -8 x4588 -4 x4682 -3 x4776 -6 x4870 -7 x5058 -7 x5152 -5 x5246 -6 x5340 -9 x5434 -5 x5528 -10 x5622 >= -13 ;+-2 x2991 -2 x3273 -5 x3367 -9 x3649 -3 x3743 -3 x3837 -1 x3931 -4 x4119 -5 x4213 -2 x4307 -10 x4401 -9 x4495 -8 x4589 -4 x4683 -3 x4777 -6 x4871 -7 x5059 -7 x5153 -5 x5247 -6 x5341 -9 x5435 -5 x5529 -10 x5623 >= -13 ;+-2 x2992 -2 x3274 -5 x3368 -9 x3650 -3 x3744 -3 x3838 -1 x3932 -4 x4120 -5 x4214 -2 x4308 -10 x4402 -9 x4496 -8 x4590 -4 x4684 -3 x4778 -6 x4872 -7 x5060 -7 x5154 -5 x5248 -6 x5342 -9 x5436 -5 x5530 -10 x5624 >= -13 ;+-2 x2993 -2 x3275 -5 x3369 -9 x3651 -3 x3745 -3 x3839 -1 x3933 -4 x4121 -5 x4215 -2 x4309 -10 x4403 -9 x4497 -8 x4591 -4 x4685 -3 x4779 -6 x4873 -7 x5061 -7 x5155 -5 x5249 -6 x5343 -9 x5437 -5 x5531 -10 x5625 >= -13 ;+-2 x2994 -2 x3276 -5 x3370 -9 x3652 -3 x3746 -3 x3840 -1 x3934 -4 x4122 -5 x4216 -2 x4310 -10 x4404 -9 x4498 -8 x4592 -4 x4686 -3 x4780 -6 x4874 -7 x5062 -7 x5156 -5 x5250 -6 x5344 -9 x5438 -5 x5532 -10 x5626 >= -13 ;+-2 x2995 -2 x3277 -5 x3371 -9 x3653 -3 x3747 -3 x3841 -1 x3935 -4 x4123 -5 x4217 -2 x4311 -10 x4405 -9 x4499 -8 x4593 -4 x4687 -3 x4781 -6 x4875 -7 x5063 -7 x5157 -5 x5251 -6 x5345 -9 x5439 -5 x5533 -10 x5627 >= -13 ;+-2 x2996 -2 x3278 -5 x3372 -9 x3654 -3 x3748 -3 x3842 -1 x3936 -4 x4124 -5 x4218 -2 x4312 -10 x4406 -9 x4500 -8 x4594 -4 x4688 -3 x4782 -6 x4876 -7 x5064 -7 x5158 -5 x5252 -6 x5346 -9 x5440 -5 x5534 -10 x5628 >= -13 ;+-2 x2997 -2 x3279 -5 x3373 -9 x3655 -3 x3749 -3 x3843 -1 x3937 -4 x4125 -5 x4219 -2 x4313 -10 x4407 -9 x4501 -8 x4595 -4 x4689 -3 x4783 -6 x4877 -7 x5065 -7 x5159 -5 x5253 -6 x5347 -9 x5441 -5 x5535 -10 x5629 >= -13 ;+-2 x2998 -2 x3280 -5 x3374 -9 x3656 -3 x3750 -3 x3844 -1 x3938 -4 x4126 -5 x4220 -2 x4314 -10 x4408 -9 x4502 -8 x4596 -4 x4690 -3 x4784 -6 x4878 -7 x5066 -7 x5160 -5 x5254 -6 x5348 -9 x5442 -5 x5536 -10 x5630 >= -13 ;+-2 x2999 -2 x3281 -5 x3375 -9 x3657 -3 x3751 -3 x3845 -1 x3939 -4 x4127 -5 x4221 -2 x4315 -10 x4409 -9 x4503 -8 x4597 -4 x4691 -3 x4785 -6 x4879 -7 x5067 -7 x5161 -5 x5255 -6 x5349 -9 x5443 -5 x5537 -10 x5631 >= -13 ;+-2 x3000 -2 x3282 -5 x3376 -9 x3658 -3 x3752 -3 x3846 -1 x3940 -4 x4128 -5 x4222 -2 x4316 -10 x4410 -9 x4504 -8 x4598 -4 x4692 -3 x4786 -6 x4880 -7 x5068 -7 x5162 -5 x5256 -6 x5350 -9 x5444 -5 x5538 -10 x5632 >= -13 ;+-2 x3001 -2 x3283 -5 x3377 -9 x3659 -3 x3753 -3 x3847 -1 x3941 -4 x4129 -5 x4223 -2 x4317 -10 x4411 -9 x4505 -8 x4599 -4 x4693 -3 x4787 -6 x4881 -7 x5069 -7 x5163 -5 x5257 -6 x5351 -9 x5445 -5 x5539 -10 x5633 >= -13 ;+-2 x3002 -2 x3284 -5 x3378 -9 x3660 -3 x3754 -3 x3848 -1 x3942 -4 x4130 -5 x4224 -2 x4318 -10 x4412 -9 x4506 -8 x4600 -4 x4694 -3 x4788 -6 x4882 -7 x5070 -7 x5164 -5 x5258 -6 x5352 -9 x5446 -5 x5540 -10 x5634 >= -13 ;+-2 x3003 -2 x3285 -5 x3379 -9 x3661 -3 x3755 -3 x3849 -1 x3943 -4 x4131 -5 x4225 -2 x4319 -10 x4413 -9 x4507 -8 x4601 -4 x4695 -3 x4789 -6 x4883 -7 x5071 -7 x5165 -5 x5259 -6 x5353 -9 x5447 -5 x5541 -10 x5635 >= -13 ;+-2 x3004 -2 x3286 -5 x3380 -9 x3662 -3 x3756 -3 x3850 -1 x3944 -4 x4132 -5 x4226 -2 x4320 -10 x4414 -9 x4508 -8 x4602 -4 x4696 -3 x4790 -6 x4884 -7 x5072 -7 x5166 -5 x5260 -6 x5354 -9 x5448 -5 x5542 -10 x5636 >= -13 ;+-2 x3005 -2 x3287 -5 x3381 -9 x3663 -3 x3757 -3 x3851 -1 x3945 -4 x4133 -5 x4227 -2 x4321 -10 x4415 -9 x4509 -8 x4603 -4 x4697 -3 x4791 -6 x4885 -7 x5073 -7 x5167 -5 x5261 -6 x5355 -9 x5449 -5 x5543 -10 x5637 >= -13 ;+-2 x3006 -2 x3288 -5 x3382 -9 x3664 -3 x3758 -3 x3852 -1 x3946 -4 x4134 -5 x4228 -2 x4322 -10 x4416 -9 x4510 -8 x4604 -4 x4698 -3 x4792 -6 x4886 -7 x5074 -7 x5168 -5 x5262 -6 x5356 -9 x5450 -5 x5544 -10 x5638 >= -13 ;+-2 x3007 -2 x3289 -5 x3383 -9 x3665 -3 x3759 -3 x3853 -1 x3947 -4 x4135 -5 x4229 -2 x4323 -10 x4417 -9 x4511 -8 x4605 -4 x4699 -3 x4793 -6 x4887 -7 x5075 -7 x5169 -5 x5263 -6 x5357 -9 x5451 -5 x5545 -10 x5639 >= -13 ;+-1 x2915 -1 x3009 -10 x3197 -7 x3573 -8 x3761 -2 x3855 -3 x3949 -4 x4043 -7 x4231 -5 x4325 -1 x4419 -7 x4513 -2 x4701 -2 x4889 -4 x4983 -7 x5077 -5 x5171 -3 x5265 -4 x5359 -3 x5453 >= -12 ;+-1 x2916 -1 x3010 -10 x3198 -7 x3574 -8 x3762 -2 x3856 -3 x3950 -4 x4044 -7 x4232 -5 x4326 -1 x4420 -7 x4514 -2 x4702 -2 x4890 -4 x4984 -7 x5078 -5 x5172 -3 x5266 -4 x5360 -3 x5454 >= -12 ;+-1 x2917 -1 x3011 -10 x3199 -7 x3575 -8 x3763 -2 x3857 -3 x3951 -4 x4045 -7 x4233 -5 x4327 -1 x4421 -7 x4515 -2 x4703 -2 x4891 -4 x4985 -7 x5079 -5 x5173 -3 x5267 -4 x5361 -3 x5455 >= -12 ;+-1 x2918 -1 x3012 -10 x3200 -7 x3576 -8 x3764 -2 x3858 -3 x3952 -4 x4046 -7 x4234 -5 x4328 -1 x4422 -7 x4516 -2 x4704 -2 x4892 -4 x4986 -7 x5080 -5 x5174 -3 x5268 -4 x5362 -3 x5456 >= -12 ;+-1 x2919 -1 x3013 -10 x3201 -7 x3577 -8 x3765 -2 x3859 -3 x3953 -4 x4047 -7 x4235 -5 x4329 -1 x4423 -7 x4517 -2 x4705 -2 x4893 -4 x4987 -7 x5081 -5 x5175 -3 x5269 -4 x5363 -3 x5457 >= -12 ;+-1 x2920 -1 x3014 -10 x3202 -7 x3578 -8 x3766 -2 x3860 -3 x3954 -4 x4048 -7 x4236 -5 x4330 -1 x4424 -7 x4518 -2 x4706 -2 x4894 -4 x4988 -7 x5082 -5 x5176 -3 x5270 -4 x5364 -3 x5458 >= -12 ;+-1 x2921 -1 x3015 -10 x3203 -7 x3579 -8 x3767 -2 x3861 -3 x3955 -4 x4049 -7 x4237 -5 x4331 -1 x4425 -7 x4519 -2 x4707 -2 x4895 -4 x4989 -7 x5083 -5 x5177 -3 x5271 -4 x5365 -3 x5459 >= -12 ;+-1 x2922 -1 x3016 -10 x3204 -7 x3580 -8 x3768 -2 x3862 -3 x3956 -4 x4050 -7 x4238 -5 x4332 -1 x4426 -7 x4520 -2 x4708 -2 x4896 -4 x4990 -7 x5084 -5 x5178 -3 x5272 -4 x5366 -3 x5460 >= -12 ;+-1 x2923 -1 x3017 -10 x3205 -7 x3581 -8 x3769 -2 x3863 -3 x3957 -4 x4051 -7 x4239 -5 x4333 -1 x4427 -7 x4521 -2 x4709 -2 x4897 -4 x4991 -7 x5085 -5 x5179 -3 x5273 -4 x5367 -3 x5461 >= -12 ;+-1 x2924 -1 x3018 -10 x3206 -7 x3582 -8 x3770 -2 x3864 -3 x3958 -4 x4052 -7 x4240 -5 x4334 -1 x4428 -7 x4522 -2 x4710 -2 x4898 -4 x4992 -7 x5086 -5 x5180 -3 x5274 -4 x5368 -3 x5462 >= -12 ;+-1 x2925 -1 x3019 -10 x3207 -7 x3583 -8 x3771 -2 x3865 -3 x3959 -4 x4053 -7 x4241 -5 x4335 -1 x4429 -7 x4523 -2 x4711 -2 x4899 -4 x4993 -7 x5087 -5 x5181 -3 x5275 -4 x5369 -3 x5463 >= -12 ;+-1 x2926 -1 x3020 -10 x3208 -7 x3584 -8 x3772 -2 x3866 -3 x3960 -4 x4054 -7 x4242 -5 x4336 -1 x4430 -7 x4524 -2 x4712 -2 x4900 -4 x4994 -7 x5088 -5 x5182 -3 x5276 -4 x5370 -3 x5464 >= -12 ;+-1 x2927 -1 x3021 -10 x3209 -7 x3585 -8 x3773 -2 x3867 -3 x3961 -4 x4055 -7 x4243 -5 x4337 -1 x4431 -7 x4525 -2 x4713 -2 x4901 -4 x4995 -7 x5089 -5 x5183 -3 x5277 -4 x5371 -3 x5465 >= -12 ;+-1 x2928 -1 x3022 -10 x3210 -7 x3586 -8 x3774 -2 x3868 -3 x3962 -4 x4056 -7 x4244 -5 x4338 -1 x4432 -7 x4526 -2 x4714 -2 x4902 -4 x4996 -7 x5090 -5 x5184 -3 x5278 -4 x5372 -3 x5466 >= -12 ;+-1 x2929 -1 x3023 -10 x3211 -7 x3587 -8 x3775 -2 x3869 -3 x3963 -4 x4057 -7 x4245 -5 x4339 -1 x4433 -7 x4527 -2 x4715 -2 x4903 -4 x4997 -7 x5091 -5 x5185 -3 x5279 -4 x5373 -3 x5467 >= -12 ;+-1 x2930 -1 x3024 -10 x3212 -7 x3588 -8 x3776 -2 x3870 -3 x3964 -4 x4058 -7 x4246 -5 x4340 -1 x4434 -7 x4528 -2 x4716 -2 x4904 -4 x4998 -7 x5092 -5 x5186 -3 x5280 -4 x5374 -3 x5468 >= -12 ;+-1 x2931 -1 x3025 -10 x3213 -7 x3589 -8 x3777 -2 x3871 -3 x3965 -4 x4059 -7 x4247 -5 x4341 -1 x4435 -7 x4529 -2 x4717 -2 x4905 -4 x4999 -7 x5093 -5 x5187 -3 x5281 -4 x5375 -3 x5469 >= -12 ;+-1 x2932 -1 x3026 -10 x3214 -7 x3590 -8 x3778 -2 x3872 -3 x3966 -4 x4060 -7 x4248 -5 x4342 -1 x4436 -7 x4530 -2 x4718 -2 x4906 -4 x5000 -7 x5094 -5 x5188 -3 x5282 -4 x5376 -3 x5470 >= -12 ;+-1 x2933 -1 x3027 -10 x3215 -7 x3591 -8 x3779 -2 x3873 -3 x3967 -4 x4061 -7 x4249 -5 x4343 -1 x4437 -7 x4531 -2 x4719 -2 x4907 -4 x5001 -7 x5095 -5 x5189 -3 x5283 -4 x5377 -3 x5471 >= -12 ;+-1 x2934 -1 x3028 -10 x3216 -7 x3592 -8 x3780 -2 x3874 -3 x3968 -4 x4062 -7 x4250 -5 x4344 -1 x4438 -7 x4532 -2 x4720 -2 x4908 -4 x5002 -7 x5096 -5 x5190 -3 x5284 -4 x5378 -3 x5472 >= -12 ;+-1 x2935 -1 x3029 -10 x3217 -7 x3593 -8 x3781 -2 x3875 -3 x3969 -4 x4063 -7 x4251 -5 x4345 -1 x4439 -7 x4533 -2 x4721 -2 x4909 -4 x5003 -7 x5097 -5 x5191 -3 x5285 -4 x5379 -3 x5473 >= -12 ;+-1 x2936 -1 x3030 -10 x3218 -7 x3594 -8 x3782 -2 x3876 -3 x3970 -4 x4064 -7 x4252 -5 x4346 -1 x4440 -7 x4534 -2 x4722 -2 x4910 -4 x5004 -7 x5098 -5 x5192 -3 x5286 -4 x5380 -3 x5474 >= -12 ;+-1 x2937 -1 x3031 -10 x3219 -7 x3595 -8 x3783 -2 x3877 -3 x3971 -4 x4065 -7 x4253 -5 x4347 -1 x4441 -7 x4535 -2 x4723 -2 x4911 -4 x5005 -7 x5099 -5 x5193 -3 x5287 -4 x5381 -3 x5475 >= -12 ;+-1 x2938 -1 x3032 -10 x3220 -7 x3596 -8 x3784 -2 x3878 -3 x3972 -4 x4066 -7 x4254 -5 x4348 -1 x4442 -7 x4536 -2 x4724 -2 x4912 -4 x5006 -7 x5100 -5 x5194 -3 x5288 -4 x5382 -3 x5476 >= -12 ;+-1 x2939 -1 x3033 -10 x3221 -7 x3597 -8 x3785 -2 x3879 -3 x3973 -4 x4067 -7 x4255 -5 x4349 -1 x4443 -7 x4537 -2 x4725 -2 x4913 -4 x5007 -7 x5101 -5 x5195 -3 x5289 -4 x5383 -3 x5477 >= -12 ;+-1 x2940 -1 x3034 -10 x3222 -7 x3598 -8 x3786 -2 x3880 -3 x3974 -4 x4068 -7 x4256 -5 x4350 -1 x4444 -7 x4538 -2 x4726 -2 x4914 -4 x5008 -7 x5102 -5 x5196 -3 x5290 -4 x5384 -3 x5478 >= -12 ;+-1 x2941 -1 x3035 -10 x3223 -7 x3599 -8 x3787 -2 x3881 -3 x3975 -4 x4069 -7 x4257 -5 x4351 -1 x4445 -7 x4539 -2 x4727 -2 x4915 -4 x5009 -7 x5103 -5 x5197 -3 x5291 -4 x5385 -3 x5479 >= -12 ;+-1 x2942 -1 x3036 -10 x3224 -7 x3600 -8 x3788 -2 x3882 -3 x3976 -4 x4070 -7 x4258 -5 x4352 -1 x4446 -7 x4540 -2 x4728 -2 x4916 -4 x5010 -7 x5104 -5 x5198 -3 x5292 -4 x5386 -3 x5480 >= -12 ;+-1 x2943 -1 x3037 -10 x3225 -7 x3601 -8 x3789 -2 x3883 -3 x3977 -4 x4071 -7 x4259 -5 x4353 -1 x4447 -7 x4541 -2 x4729 -2 x4917 -4 x5011 -7 x5105 -5 x5199 -3 x5293 -4 x5387 -3 x5481 >= -12 ;+-1 x2944 -1 x3038 -10 x3226 -7 x3602 -8 x3790 -2 x3884 -3 x3978 -4 x4072 -7 x4260 -5 x4354 -1 x4448 -7 x4542 -2 x4730 -2 x4918 -4 x5012 -7 x5106 -5 x5200 -3 x5294 -4 x5388 -3 x5482 >= -12 ;+-1 x2945 -1 x3039 -10 x3227 -7 x3603 -8 x3791 -2 x3885 -3 x3979 -4 x4073 -7 x4261 -5 x4355 -1 x4449 -7 x4543 -2 x4731 -2 x4919 -4 x5013 -7 x5107 -5 x5201 -3 x5295 -4 x5389 -3 x5483 >= -12 ;+-1 x2946 -1 x3040 -10 x3228 -7 x3604 -8 x3792 -2 x3886 -3 x3980 -4 x4074 -7 x4262 -5 x4356 -1 x4450 -7 x4544 -2 x4732 -2 x4920 -4 x5014 -7 x5108 -5 x5202 -3 x5296 -4 x5390 -3 x5484 >= -12 ;+-1 x2947 -1 x3041 -10 x3229 -7 x3605 -8 x3793 -2 x3887 -3 x3981 -4 x4075 -7 x4263 -5 x4357 -1 x4451 -7 x4545 -2 x4733 -2 x4921 -4 x5015 -7 x5109 -5 x5203 -3 x5297 -4 x5391 -3 x5485 >= -12 ;+-1 x2948 -1 x3042 -10 x3230 -7 x3606 -8 x3794 -2 x3888 -3 x3982 -4 x4076 -7 x4264 -5 x4358 -1 x4452 -7 x4546 -2 x4734 -2 x4922 -4 x5016 -7 x5110 -5 x5204 -3 x5298 -4 x5392 -3 x5486 >= -12 ;+-1 x2949 -1 x3043 -10 x3231 -7 x3607 -8 x3795 -2 x3889 -3 x3983 -4 x4077 -7 x4265 -5 x4359 -1 x4453 -7 x4547 -2 x4735 -2 x4923 -4 x5017 -7 x5111 -5 x5205 -3 x5299 -4 x5393 -3 x5487 >= -12 ;+-1 x2950 -1 x3044 -10 x3232 -7 x3608 -8 x3796 -2 x3890 -3 x3984 -4 x4078 -7 x4266 -5 x4360 -1 x4454 -7 x4548 -2 x4736 -2 x4924 -4 x5018 -7 x5112 -5 x5206 -3 x5300 -4 x5394 -3 x5488 >= -12 ;+-1 x2951 -1 x3045 -10 x3233 -7 x3609 -8 x3797 -2 x3891 -3 x3985 -4 x4079 -7 x4267 -5 x4361 -1 x4455 -7 x4549 -2 x4737 -2 x4925 -4 x5019 -7 x5113 -5 x5207 -3 x5301 -4 x5395 -3 x5489 >= -12 ;+-1 x2952 -1 x3046 -10 x3234 -7 x3610 -8 x3798 -2 x3892 -3 x3986 -4 x4080 -7 x4268 -5 x4362 -1 x4456 -7 x4550 -2 x4738 -2 x4926 -4 x5020 -7 x5114 -5 x5208 -3 x5302 -4 x5396 -3 x5490 >= -12 ;+-1 x2953 -1 x3047 -10 x3235 -7 x3611 -8 x3799 -2 x3893 -3 x3987 -4 x4081 -7 x4269 -5 x4363 -1 x4457 -7 x4551 -2 x4739 -2 x4927 -4 x5021 -7 x5115 -5 x5209 -3 x5303 -4 x5397 -3 x5491 >= -12 ;+-1 x2954 -1 x3048 -10 x3236 -7 x3612 -8 x3800 -2 x3894 -3 x3988 -4 x4082 -7 x4270 -5 x4364 -1 x4458 -7 x4552 -2 x4740 -2 x4928 -4 x5022 -7 x5116 -5 x5210 -3 x5304 -4 x5398 -3 x5492 >= -12 ;+-1 x2955 -1 x3049 -10 x3237 -7 x3613 -8 x3801 -2 x3895 -3 x3989 -4 x4083 -7 x4271 -5 x4365 -1 x4459 -7 x4553 -2 x4741 -2 x4929 -4 x5023 -7 x5117 -5 x5211 -3 x5305 -4 x5399 -3 x5493 >= -12 ;+-1 x2956 -1 x3050 -10 x3238 -7 x3614 -8 x3802 -2 x3896 -3 x3990 -4 x4084 -7 x4272 -5 x4366 -1 x4460 -7 x4554 -2 x4742 -2 x4930 -4 x5024 -7 x5118 -5 x5212 -3 x5306 -4 x5400 -3 x5494 >= -12 ;+-1 x2957 -1 x3051 -10 x3239 -7 x3615 -8 x3803 -2 x3897 -3 x3991 -4 x4085 -7 x4273 -5 x4367 -1 x4461 -7 x4555 -2 x4743 -2 x4931 -4 x5025 -7 x5119 -5 x5213 -3 x5307 -4 x5401 -3 x5495 >= -12 ;+-1 x2958 -1 x3052 -10 x3240 -7 x3616 -8 x3804 -2 x3898 -3 x3992 -4 x4086 -7 x4274 -5 x4368 -1 x4462 -7 x4556 -2 x4744 -2 x4932 -4 x5026 -7 x5120 -5 x5214 -3 x5308 -4 x5402 -3 x5496 >= -12 ;+-1 x2959 -1 x3053 -10 x3241 -7 x3617 -8 x3805 -2 x3899 -3 x3993 -4 x4087 -7 x4275 -5 x4369 -1 x4463 -7 x4557 -2 x4745 -2 x4933 -4 x5027 -7 x5121 -5 x5215 -3 x5309 -4 x5403 -3 x5497 >= -12 ;+-1 x2960 -1 x3054 -10 x3242 -7 x3618 -8 x3806 -2 x3900 -3 x3994 -4 x4088 -7 x4276 -5 x4370 -1 x4464 -7 x4558 -2 x4746 -2 x4934 -4 x5028 -7 x5122 -5 x5216 -3 x5310 -4 x5404 -3 x5498 >= -12 ;+-1 x2961 -1 x3055 -10 x3243 -7 x3619 -8 x3807 -2 x3901 -3 x3995 -4 x4089 -7 x4277 -5 x4371 -1 x4465 -7 x4559 -2 x4747 -2 x4935 -4 x5029 -7 x5123 -5 x5217 -3 x5311 -4 x5405 -3 x5499 >= -12 ;+-1 x2962 -1 x3056 -10 x3244 -7 x3620 -8 x3808 -2 x3902 -3 x3996 -4 x4090 -7 x4278 -5 x4372 -1 x4466 -7 x4560 -2 x4748 -2 x4936 -4 x5030 -7 x5124 -5 x5218 -3 x5312 -4 x5406 -3 x5500 >= -12 ;+-1 x2963 -1 x3057 -10 x3245 -7 x3621 -8 x3809 -2 x3903 -3 x3997 -4 x4091 -7 x4279 -5 x4373 -1 x4467 -7 x4561 -2 x4749 -2 x4937 -4 x5031 -7 x5125 -5 x5219 -3 x5313 -4 x5407 -3 x5501 >= -12 ;+-1 x2964 -1 x3058 -10 x3246 -7 x3622 -8 x3810 -2 x3904 -3 x3998 -4 x4092 -7 x4280 -5 x4374 -1 x4468 -7 x4562 -2 x4750 -2 x4938 -4 x5032 -7 x5126 -5 x5220 -3 x5314 -4 x5408 -3 x5502 >= -12 ;+-1 x2965 -1 x3059 -10 x3247 -7 x3623 -8 x3811 -2 x3905 -3 x3999 -4 x4093 -7 x4281 -5 x4375 -1 x4469 -7 x4563 -2 x4751 -2 x4939 -4 x5033 -7 x5127 -5 x5221 -3 x5315 -4 x5409 -3 x5503 >= -12 ;+-1 x2966 -1 x3060 -10 x3248 -7 x3624 -8 x3812 -2 x3906 -3 x4000 -4 x4094 -7 x4282 -5 x4376 -1 x4470 -7 x4564 -2 x4752 -2 x4940 -4 x5034 -7 x5128 -5 x5222 -3 x5316 -4 x5410 -3 x5504 >= -12 ;+-1 x2967 -1 x3061 -10 x3249 -7 x3625 -8 x3813 -2 x3907 -3 x4001 -4 x4095 -7 x4283 -5 x4377 -1 x4471 -7 x4565 -2 x4753 -2 x4941 -4 x5035 -7 x5129 -5 x5223 -3 x5317 -4 x5411 -3 x5505 >= -12 ;+-1 x2968 -1 x3062 -10 x3250 -7 x3626 -8 x3814 -2 x3908 -3 x4002 -4 x4096 -7 x4284 -5 x4378 -1 x4472 -7 x4566 -2 x4754 -2 x4942 -4 x5036 -7 x5130 -5 x5224 -3 x5318 -4 x5412 -3 x5506 >= -12 ;+-1 x2969 -1 x3063 -10 x3251 -7 x3627 -8 x3815 -2 x3909 -3 x4003 -4 x4097 -7 x4285 -5 x4379 -1 x4473 -7 x4567 -2 x4755 -2 x4943 -4 x5037 -7 x5131 -5 x5225 -3 x5319 -4 x5413 -3 x5507 >= -12 ;+-1 x2970 -1 x3064 -10 x3252 -7 x3628 -8 x3816 -2 x3910 -3 x4004 -4 x4098 -7 x4286 -5 x4380 -1 x4474 -7 x4568 -2 x4756 -2 x4944 -4 x5038 -7 x5132 -5 x5226 -3 x5320 -4 x5414 -3 x5508 >= -12 ;+-1 x2971 -1 x3065 -10 x3253 -7 x3629 -8 x3817 -2 x3911 -3 x4005 -4 x4099 -7 x4287 -5 x4381 -1 x4475 -7 x4569 -2 x4757 -2 x4945 -4 x5039 -7 x5133 -5 x5227 -3 x5321 -4 x5415 -3 x5509 >= -12 ;+-1 x2972 -1 x3066 -10 x3254 -7 x3630 -8 x3818 -2 x3912 -3 x4006 -4 x4100 -7 x4288 -5 x4382 -1 x4476 -7 x4570 -2 x4758 -2 x4946 -4 x5040 -7 x5134 -5 x5228 -3 x5322 -4 x5416 -3 x5510 >= -12 ;+-1 x2973 -1 x3067 -10 x3255 -7 x3631 -8 x3819 -2 x3913 -3 x4007 -4 x4101 -7 x4289 -5 x4383 -1 x4477 -7 x4571 -2 x4759 -2 x4947 -4 x5041 -7 x5135 -5 x5229 -3 x5323 -4 x5417 -3 x5511 >= -12 ;+-1 x2974 -1 x3068 -10 x3256 -7 x3632 -8 x3820 -2 x3914 -3 x4008 -4 x4102 -7 x4290 -5 x4384 -1 x4478 -7 x4572 -2 x4760 -2 x4948 -4 x5042 -7 x5136 -5 x5230 -3 x5324 -4 x5418 -3 x5512 >= -12 ;+-1 x2975 -1 x3069 -10 x3257 -7 x3633 -8 x3821 -2 x3915 -3 x4009 -4 x4103 -7 x4291 -5 x4385 -1 x4479 -7 x4573 -2 x4761 -2 x4949 -4 x5043 -7 x5137 -5 x5231 -3 x5325 -4 x5419 -3 x5513 >= -12 ;+-1 x2976 -1 x3070 -10 x3258 -7 x3634 -8 x3822 -2 x3916 -3 x4010 -4 x4104 -7 x4292 -5 x4386 -1 x4480 -7 x4574 -2 x4762 -2 x4950 -4 x5044 -7 x5138 -5 x5232 -3 x5326 -4 x5420 -3 x5514 >= -12 ;+-1 x2977 -1 x3071 -10 x3259 -7 x3635 -8 x3823 -2 x3917 -3 x4011 -4 x4105 -7 x4293 -5 x4387 -1 x4481 -7 x4575 -2 x4763 -2 x4951 -4 x5045 -7 x5139 -5 x5233 -3 x5327 -4 x5421 -3 x5515 >= -12 ;+-1 x2978 -1 x3072 -10 x3260 -7 x3636 -8 x3824 -2 x3918 -3 x4012 -4 x4106 -7 x4294 -5 x4388 -1 x4482 -7 x4576 -2 x4764 -2 x4952 -4 x5046 -7 x5140 -5 x5234 -3 x5328 -4 x5422 -3 x5516 >= -12 ;+-1 x2979 -1 x3073 -10 x3261 -7 x3637 -8 x3825 -2 x3919 -3 x4013 -4 x4107 -7 x4295 -5 x4389 -1 x4483 -7 x4577 -2 x4765 -2 x4953 -4 x5047 -7 x5141 -5 x5235 -3 x5329 -4 x5423 -3 x5517 >= -12 ;+-1 x2980 -1 x3074 -10 x3262 -7 x3638 -8 x3826 -2 x3920 -3 x4014 -4 x4108 -7 x4296 -5 x4390 -1 x4484 -7 x4578 -2 x4766 -2 x4954 -4 x5048 -7 x5142 -5 x5236 -3 x5330 -4 x5424 -3 x5518 >= -12 ;+-1 x2981 -1 x3075 -10 x3263 -7 x3639 -8 x3827 -2 x3921 -3 x4015 -4 x4109 -7 x4297 -5 x4391 -1 x4485 -7 x4579 -2 x4767 -2 x4955 -4 x5049 -7 x5143 -5 x5237 -3 x5331 -4 x5425 -3 x5519 >= -12 ;+-1 x2982 -1 x3076 -10 x3264 -7 x3640 -8 x3828 -2 x3922 -3 x4016 -4 x4110 -7 x4298 -5 x4392 -1 x4486 -7 x4580 -2 x4768 -2 x4956 -4 x5050 -7 x5144 -5 x5238 -3 x5332 -4 x5426 -3 x5520 >= -12 ;+-1 x2983 -1 x3077 -10 x3265 -7 x3641 -8 x3829 -2 x3923 -3 x4017 -4 x4111 -7 x4299 -5 x4393 -1 x4487 -7 x4581 -2 x4769 -2 x4957 -4 x5051 -7 x5145 -5 x5239 -3 x5333 -4 x5427 -3 x5521 >= -12 ;+-1 x2984 -1 x3078 -10 x3266 -7 x3642 -8 x3830 -2 x3924 -3 x4018 -4 x4112 -7 x4300 -5 x4394 -1 x4488 -7 x4582 -2 x4770 -2 x4958 -4 x5052 -7 x5146 -5 x5240 -3 x5334 -4 x5428 -3 x5522 >= -12 ;+-1 x2985 -1 x3079 -10 x3267 -7 x3643 -8 x3831 -2 x3925 -3 x4019 -4 x4113 -7 x4301 -5 x4395 -1 x4489 -7 x4583 -2 x4771 -2 x4959 -4 x5053 -7 x5147 -5 x5241 -3 x5335 -4 x5429 -3 x5523 >= -12 ;+-1 x2986 -1 x3080 -10 x3268 -7 x3644 -8 x3832 -2 x3926 -3 x4020 -4 x4114 -7 x4302 -5 x4396 -1 x4490 -7 x4584 -2 x4772 -2 x4960 -4 x5054 -7 x5148 -5 x5242 -3 x5336 -4 x5430 -3 x5524 >= -12 ;+-1 x2987 -1 x3081 -10 x3269 -7 x3645 -8 x3833 -2 x3927 -3 x4021 -4 x4115 -7 x4303 -5 x4397 -1 x4491 -7 x4585 -2 x4773 -2 x4961 -4 x5055 -7 x5149 -5 x5243 -3 x5337 -4 x5431 -3 x5525 >= -12 ;+-1 x2988 -1 x3082 -10 x3270 -7 x3646 -8 x3834 -2 x3928 -3 x4022 -4 x4116 -7 x4304 -5 x4398 -1 x4492 -7 x4586 -2 x4774 -2 x4962 -4 x5056 -7 x5150 -5 x5244 -3 x5338 -4 x5432 -3 x5526 >= -12 ;+-1 x2989 -1 x3083 -10 x3271 -7 x3647 -8 x3835 -2 x3929 -3 x4023 -4 x4117 -7 x4305 -5 x4399 -1 x4493 -7 x4587 -2 x4775 -2 x4963 -4 x5057 -7 x5151 -5 x5245 -3 x5339 -4 x5433 -3 x5527 >= -12 ;+-1 x2990 -1 x3084 -10 x3272 -7 x3648 -8 x3836 -2 x3930 -3 x4024 -4 x4118 -7 x4306 -5 x4400 -1 x4494 -7 x4588 -2 x4776 -2 x4964 -4 x5058 -7 x5152 -5 x5246 -3 x5340 -4 x5434 -3 x5528 >= -12 ;+-1 x2991 -1 x3085 -10 x3273 -7 x3649 -8 x3837 -2 x3931 -3 x4025 -4 x4119 -7 x4307 -5 x4401 -1 x4495 -7 x4589 -2 x4777 -2 x4965 -4 x5059 -7 x5153 -5 x5247 -3 x5341 -4 x5435 -3 x5529 >= -12 ;+-1 x2992 -1 x3086 -10 x3274 -7 x3650 -8 x3838 -2 x3932 -3 x4026 -4 x4120 -7 x4308 -5 x4402 -1 x4496 -7 x4590 -2 x4778 -2 x4966 -4 x5060 -7 x5154 -5 x5248 -3 x5342 -4 x5436 -3 x5530 >= -12 ;+-1 x2993 -1 x3087 -10 x3275 -7 x3651 -8 x3839 -2 x3933 -3 x4027 -4 x4121 -7 x4309 -5 x4403 -1 x4497 -7 x4591 -2 x4779 -2 x4967 -4 x5061 -7 x5155 -5 x5249 -3 x5343 -4 x5437 -3 x5531 >= -12 ;+-1 x2994 -1 x3088 -10 x3276 -7 x3652 -8 x3840 -2 x3934 -3 x4028 -4 x4122 -7 x4310 -5 x4404 -1 x4498 -7 x4592 -2 x4780 -2 x4968 -4 x5062 -7 x5156 -5 x5250 -3 x5344 -4 x5438 -3 x5532 >= -12 ;+-1 x2995 -1 x3089 -10 x3277 -7 x3653 -8 x3841 -2 x3935 -3 x4029 -4 x4123 -7 x4311 -5 x4405 -1 x4499 -7 x4593 -2 x4781 -2 x4969 -4 x5063 -7 x5157 -5 x5251 -3 x5345 -4 x5439 -3 x5533 >= -12 ;+-1 x2996 -1 x3090 -10 x3278 -7 x3654 -8 x3842 -2 x3936 -3 x4030 -4 x4124 -7 x4312 -5 x4406 -1 x4500 -7 x4594 -2 x4782 -2 x4970 -4 x5064 -7 x5158 -5 x5252 -3 x5346 -4 x5440 -3 x5534 >= -12 ;+-1 x2997 -1 x3091 -10 x3279 -7 x3655 -8 x3843 -2 x3937 -3 x4031 -4 x4125 -7 x4313 -5 x4407 -1 x4501 -7 x4595 -2 x4783 -2 x4971 -4 x5065 -7 x5159 -5 x5253 -3 x5347 -4 x5441 -3 x5535 >= -12 ;+-1 x2998 -1 x3092 -10 x3280 -7 x3656 -8 x3844 -2 x3938 -3 x4032 -4 x4126 -7 x4314 -5 x4408 -1 x4502 -7 x4596 -2 x4784 -2 x4972 -4 x5066 -7 x5160 -5 x5254 -3 x5348 -4 x5442 -3 x5536 >= -12 ;+-1 x2999 -1 x3093 -10 x3281 -7 x3657 -8 x3845 -2 x3939 -3 x4033 -4 x4127 -7 x4315 -5 x4409 -1 x4503 -7 x4597 -2 x4785 -2 x4973 -4 x5067 -7 x5161 -5 x5255 -3 x5349 -4 x5443 -3 x5537 >= -12 ;+-1 x3000 -1 x3094 -10 x3282 -7 x3658 -8 x3846 -2 x3940 -3 x4034 -4 x4128 -7 x4316 -5 x4410 -1 x4504 -7 x4598 -2 x4786 -2 x4974 -4 x5068 -7 x5162 -5 x5256 -3 x5350 -4 x5444 -3 x5538 >= -12 ;+-1 x3001 -1 x3095 -10 x3283 -7 x3659 -8 x3847 -2 x3941 -3 x4035 -4 x4129 -7 x4317 -5 x4411 -1 x4505 -7 x4599 -2 x4787 -2 x4975 -4 x5069 -7 x5163 -5 x5257 -3 x5351 -4 x5445 -3 x5539 >= -12 ;+-1 x3002 -1 x3096 -10 x3284 -7 x3660 -8 x3848 -2 x3942 -3 x4036 -4 x4130 -7 x4318 -5 x4412 -1 x4506 -7 x4600 -2 x4788 -2 x4976 -4 x5070 -7 x5164 -5 x5258 -3 x5352 -4 x5446 -3 x5540 >= -12 ;+-1 x3003 -1 x3097 -10 x3285 -7 x3661 -8 x3849 -2 x3943 -3 x4037 -4 x4131 -7 x4319 -5 x4413 -1 x4507 -7 x4601 -2 x4789 -2 x4977 -4 x5071 -7 x5165 -5 x5259 -3 x5353 -4 x5447 -3 x5541 >= -12 ;+-1 x3004 -1 x3098 -10 x3286 -7 x3662 -8 x3850 -2 x3944 -3 x4038 -4 x4132 -7 x4320 -5 x4414 -1 x4508 -7 x4602 -2 x4790 -2 x4978 -4 x5072 -7 x5166 -5 x5260 -3 x5354 -4 x5448 -3 x5542 >= -12 ;+-1 x3005 -1 x3099 -10 x3287 -7 x3663 -8 x3851 -2 x3945 -3 x4039 -4 x4133 -7 x4321 -5 x4415 -1 x4509 -7 x4603 -2 x4791 -2 x4979 -4 x5073 -7 x5167 -5 x5261 -3 x5355 -4 x5449 -3 x5543 >= -12 ;+-1 x3006 -1 x3100 -10 x3288 -7 x3664 -8 x3852 -2 x3946 -3 x4040 -4 x4134 -7 x4322 -5 x4416 -1 x4510 -7 x4604 -2 x4792 -2 x4980 -4 x5074 -7 x5168 -5 x5262 -3 x5356 -4 x5450 -3 x5544 >= -12 ;+-1 x3007 -1 x3101 -10 x3289 -7 x3665 -8 x3853 -2 x3947 -3 x4041 -4 x4135 -7 x4323 -5 x4417 -1 x4511 -7 x4605 -2 x4793 -2 x4981 -4 x5075 -7 x5169 -5 x5263 -3 x5357 -4 x5451 -3 x5545 >= -12 ;+-10 x2915 -7 x3009 -3 x3197 -7 x3385 -3 x3479 -1 x3855 -8 x3949 -5 x4043 -3 x4137 -10 x4325 -8 x4419 -8 x4513 -3 x4607 -2 x4701 -7 x4795 -2 x4889 -10 x4983 -4 x5077 -2 x5171 -1 x5453 -10 x5547 >= -14 ;+-10 x2916 -7 x3010 -3 x3198 -7 x3386 -3 x3480 -1 x3856 -8 x3950 -5 x4044 -3 x4138 -10 x4326 -8 x4420 -8 x4514 -3 x4608 -2 x4702 -7 x4796 -2 x4890 -10 x4984 -4 x5078 -2 x5172 -1 x5454 -10 x5548 >= -14 ;+-10 x2917 -7 x3011 -3 x3199 -7 x3387 -3 x3481 -1 x3857 -8 x3951 -5 x4045 -3 x4139 -10 x4327 -8 x4421 -8 x4515 -3 x4609 -2 x4703 -7 x4797 -2 x4891 -10 x4985 -4 x5079 -2 x5173 -1 x5455 -10 x5549 >= -14 ;+-10 x2918 -7 x3012 -3 x3200 -7 x3388 -3 x3482 -1 x3858 -8 x3952 -5 x4046 -3 x4140 -10 x4328 -8 x4422 -8 x4516 -3 x4610 -2 x4704 -7 x4798 -2 x4892 -10 x4986 -4 x5080 -2 x5174 -1 x5456 -10 x5550 >= -14 ;+-10 x2919 -7 x3013 -3 x3201 -7 x3389 -3 x3483 -1 x3859 -8 x3953 -5 x4047 -3 x4141 -10 x4329 -8 x4423 -8 x4517 -3 x4611 -2 x4705 -7 x4799 -2 x4893 -10 x4987 -4 x5081 -2 x5175 -1 x5457 -10 x5551 >= -14 ;+-10 x2920 -7 x3014 -3 x3202 -7 x3390 -3 x3484 -1 x3860 -8 x3954 -5 x4048 -3 x4142 -10 x4330 -8 x4424 -8 x4518 -3 x4612 -2 x4706 -7 x4800 -2 x4894 -10 x4988 -4 x5082 -2 x5176 -1 x5458 -10 x5552 >= -14 ;+-10 x2921 -7 x3015 -3 x3203 -7 x3391 -3 x3485 -1 x3861 -8 x3955 -5 x4049 -3 x4143 -10 x4331 -8 x4425 -8 x4519 -3 x4613 -2 x4707 -7 x4801 -2 x4895 -10 x4989 -4 x5083 -2 x5177 -1 x5459 -10 x5553 >= -14 ;+-10 x2922 -7 x3016 -3 x3204 -7 x3392 -3 x3486 -1 x3862 -8 x3956 -5 x4050 -3 x4144 -10 x4332 -8 x4426 -8 x4520 -3 x4614 -2 x4708 -7 x4802 -2 x4896 -10 x4990 -4 x5084 -2 x5178 -1 x5460 -10 x5554 >= -14 ;+-10 x2923 -7 x3017 -3 x3205 -7 x3393 -3 x3487 -1 x3863 -8 x3957 -5 x4051 -3 x4145 -10 x4333 -8 x4427 -8 x4521 -3 x4615 -2 x4709 -7 x4803 -2 x4897 -10 x4991 -4 x5085 -2 x5179 -1 x5461 -10 x5555 >= -14 ;+-10 x2924 -7 x3018 -3 x3206 -7 x3394 -3 x3488 -1 x3864 -8 x3958 -5 x4052 -3 x4146 -10 x4334 -8 x4428 -8 x4522 -3 x4616 -2 x4710 -7 x4804 -2 x4898 -10 x4992 -4 x5086 -2 x5180 -1 x5462 -10 x5556 >= -14 ;+-10 x2925 -7 x3019 -3 x3207 -7 x3395 -3 x3489 -1 x3865 -8 x3959 -5 x4053 -3 x4147 -10 x4335 -8 x4429 -8 x4523 -3 x4617 -2 x4711 -7 x4805 -2 x4899 -10 x4993 -4 x5087 -2 x5181 -1 x5463 -10 x5557 >= -14 ;+-10 x2926 -7 x3020 -3 x3208 -7 x3396 -3 x3490 -1 x3866 -8 x3960 -5 x4054 -3 x4148 -10 x4336 -8 x4430 -8 x4524 -3 x4618 -2 x4712 -7 x4806 -2 x4900 -10 x4994 -4 x5088 -2 x5182 -1 x5464 -10 x5558 >= -14 ;+-10 x2927 -7 x3021 -3 x3209 -7 x3397 -3 x3491 -1 x3867 -8 x3961 -5 x4055 -3 x4149 -10 x4337 -8 x4431 -8 x4525 -3 x4619 -2 x4713 -7 x4807 -2 x4901 -10 x4995 -4 x5089 -2 x5183 -1 x5465 -10 x5559 >= -14 ;+-10 x2928 -7 x3022 -3 x3210 -7 x3398 -3 x3492 -1 x3868 -8 x3962 -5 x4056 -3 x4150 -10 x4338 -8 x4432 -8 x4526 -3 x4620 -2 x4714 -7 x4808 -2 x4902 -10 x4996 -4 x5090 -2 x5184 -1 x5466 -10 x5560 >= -14 ;+-10 x2929 -7 x3023 -3 x3211 -7 x3399 -3 x3493 -1 x3869 -8 x3963 -5 x4057 -3 x4151 -10 x4339 -8 x4433 -8 x4527 -3 x4621 -2 x4715 -7 x4809 -2 x4903 -10 x4997 -4 x5091 -2 x5185 -1 x5467 -10 x5561 >= -14 ;+-10 x2930 -7 x3024 -3 x3212 -7 x3400 -3 x3494 -1 x3870 -8 x3964 -5 x4058 -3 x4152 -10 x4340 -8 x4434 -8 x4528 -3 x4622 -2 x4716 -7 x4810 -2 x4904 -10 x4998 -4 x5092 -2 x5186 -1 x5468 -10 x5562 >= -14 ;+-10 x2931 -7 x3025 -3 x3213 -7 x3401 -3 x3495 -1 x3871 -8 x3965 -5 x4059 -3 x4153 -10 x4341 -8 x4435 -8 x4529 -3 x4623 -2 x4717 -7 x4811 -2 x4905 -10 x4999 -4 x5093 -2 x5187 -1 x5469 -10 x5563 >= -14 ;+-10 x2932 -7 x3026 -3 x3214 -7 x3402 -3 x3496 -1 x3872 -8 x3966 -5 x4060 -3 x4154 -10 x4342 -8 x4436 -8 x4530 -3 x4624 -2 x4718 -7 x4812 -2 x4906 -10 x5000 -4 x5094 -2 x5188 -1 x5470 -10 x5564 >= -14 ;+-10 x2933 -7 x3027 -3 x3215 -7 x3403 -3 x3497 -1 x3873 -8 x3967 -5 x4061 -3 x4155 -10 x4343 -8 x4437 -8 x4531 -3 x4625 -2 x4719 -7 x4813 -2 x4907 -10 x5001 -4 x5095 -2 x5189 -1 x5471 -10 x5565 >= -14 ;+-10 x2934 -7 x3028 -3 x3216 -7 x3404 -3 x3498 -1 x3874 -8 x3968 -5 x4062 -3 x4156 -10 x4344 -8 x4438 -8 x4532 -3 x4626 -2 x4720 -7 x4814 -2 x4908 -10 x5002 -4 x5096 -2 x5190 -1 x5472 -10 x5566 >= -14 ;+-10 x2935 -7 x3029 -3 x3217 -7 x3405 -3 x3499 -1 x3875 -8 x3969 -5 x4063 -3 x4157 -10 x4345 -8 x4439 -8 x4533 -3 x4627 -2 x4721 -7 x4815 -2 x4909 -10 x5003 -4 x5097 -2 x5191 -1 x5473 -10 x5567 >= -14 ;+-10 x2936 -7 x3030 -3 x3218 -7 x3406 -3 x3500 -1 x3876 -8 x3970 -5 x4064 -3 x4158 -10 x4346 -8 x4440 -8 x4534 -3 x4628 -2 x4722 -7 x4816 -2 x4910 -10 x5004 -4 x5098 -2 x5192 -1 x5474 -10 x5568 >= -14 ;+-10 x2937 -7 x3031 -3 x3219 -7 x3407 -3 x3501 -1 x3877 -8 x3971 -5 x4065 -3 x4159 -10 x4347 -8 x4441 -8 x4535 -3 x4629 -2 x4723 -7 x4817 -2 x4911 -10 x5005 -4 x5099 -2 x5193 -1 x5475 -10 x5569 >= -14 ;+-10 x2938 -7 x3032 -3 x3220 -7 x3408 -3 x3502 -1 x3878 -8 x3972 -5 x4066 -3 x4160 -10 x4348 -8 x4442 -8 x4536 -3 x4630 -2 x4724 -7 x4818 -2 x4912 -10 x5006 -4 x5100 -2 x5194 -1 x5476 -10 x5570 >= -14 ;+-10 x2939 -7 x3033 -3 x3221 -7 x3409 -3 x3503 -1 x3879 -8 x3973 -5 x4067 -3 x4161 -10 x4349 -8 x4443 -8 x4537 -3 x4631 -2 x4725 -7 x4819 -2 x4913 -10 x5007 -4 x5101 -2 x5195 -1 x5477 -10 x5571 >= -14 ;+-10 x2940 -7 x3034 -3 x3222 -7 x3410 -3 x3504 -1 x3880 -8 x3974 -5 x4068 -3 x4162 -10 x4350 -8 x4444 -8 x4538 -3 x4632 -2 x4726 -7 x4820 -2 x4914 -10 x5008 -4 x5102 -2 x5196 -1 x5478 -10 x5572 >= -14 ;+-10 x2941 -7 x3035 -3 x3223 -7 x3411 -3 x3505 -1 x3881 -8 x3975 -5 x4069 -3 x4163 -10 x4351 -8 x4445 -8 x4539 -3 x4633 -2 x4727 -7 x4821 -2 x4915 -10 x5009 -4 x5103 -2 x5197 -1 x5479 -10 x5573 >= -14 ;+-10 x2942 -7 x3036 -3 x3224 -7 x3412 -3 x3506 -1 x3882 -8 x3976 -5 x4070 -3 x4164 -10 x4352 -8 x4446 -8 x4540 -3 x4634 -2 x4728 -7 x4822 -2 x4916 -10 x5010 -4 x5104 -2 x5198 -1 x5480 -10 x5574 >= -14 ;+-10 x2943 -7 x3037 -3 x3225 -7 x3413 -3 x3507 -1 x3883 -8 x3977 -5 x4071 -3 x4165 -10 x4353 -8 x4447 -8 x4541 -3 x4635 -2 x4729 -7 x4823 -2 x4917 -10 x5011 -4 x5105 -2 x5199 -1 x5481 -10 x5575 >= -14 ;+-10 x2944 -7 x3038 -3 x3226 -7 x3414 -3 x3508 -1 x3884 -8 x3978 -5 x4072 -3 x4166 -10 x4354 -8 x4448 -8 x4542 -3 x4636 -2 x4730 -7 x4824 -2 x4918 -10 x5012 -4 x5106 -2 x5200 -1 x5482 -10 x5576 >= -14 ;+-10 x2945 -7 x3039 -3 x3227 -7 x3415 -3 x3509 -1 x3885 -8 x3979 -5 x4073 -3 x4167 -10 x4355 -8 x4449 -8 x4543 -3 x4637 -2 x4731 -7 x4825 -2 x4919 -10 x5013 -4 x5107 -2 x5201 -1 x5483 -10 x5577 >= -14 ;+-10 x2946 -7 x3040 -3 x3228 -7 x3416 -3 x3510 -1 x3886 -8 x3980 -5 x4074 -3 x4168 -10 x4356 -8 x4450 -8 x4544 -3 x4638 -2 x4732 -7 x4826 -2 x4920 -10 x5014 -4 x5108 -2 x5202 -1 x5484 -10 x5578 >= -14 ;+-10 x2947 -7 x3041 -3 x3229 -7 x3417 -3 x3511 -1 x3887 -8 x3981 -5 x4075 -3 x4169 -10 x4357 -8 x4451 -8 x4545 -3 x4639 -2 x4733 -7 x4827 -2 x4921 -10 x5015 -4 x5109 -2 x5203 -1 x5485 -10 x5579 >= -14 ;+-10 x2948 -7 x3042 -3 x3230 -7 x3418 -3 x3512 -1 x3888 -8 x3982 -5 x4076 -3 x4170 -10 x4358 -8 x4452 -8 x4546 -3 x4640 -2 x4734 -7 x4828 -2 x4922 -10 x5016 -4 x5110 -2 x5204 -1 x5486 -10 x5580 >= -14 ;+-10 x2949 -7 x3043 -3 x3231 -7 x3419 -3 x3513 -1 x3889 -8 x3983 -5 x4077 -3 x4171 -10 x4359 -8 x4453 -8 x4547 -3 x4641 -2 x4735 -7 x4829 -2 x4923 -10 x5017 -4 x5111 -2 x5205 -1 x5487 -10 x5581 >= -14 ;+-10 x2950 -7 x3044 -3 x3232 -7 x3420 -3 x3514 -1 x3890 -8 x3984 -5 x4078 -3 x4172 -10 x4360 -8 x4454 -8 x4548 -3 x4642 -2 x4736 -7 x4830 -2 x4924 -10 x5018 -4 x5112 -2 x5206 -1 x5488 -10 x5582 >= -14 ;+-10 x2951 -7 x3045 -3 x3233 -7 x3421 -3 x3515 -1 x3891 -8 x3985 -5 x4079 -3 x4173 -10 x4361 -8 x4455 -8 x4549 -3 x4643 -2 x4737 -7 x4831 -2 x4925 -10 x5019 -4 x5113 -2 x5207 -1 x5489 -10 x5583 >= -14 ;+-10 x2952 -7 x3046 -3 x3234 -7 x3422 -3 x3516 -1 x3892 -8 x3986 -5 x4080 -3 x4174 -10 x4362 -8 x4456 -8 x4550 -3 x4644 -2 x4738 -7 x4832 -2 x4926 -10 x5020 -4 x5114 -2 x5208 -1 x5490 -10 x5584 >= -14 ;+-10 x2953 -7 x3047 -3 x3235 -7 x3423 -3 x3517 -1 x3893 -8 x3987 -5 x4081 -3 x4175 -10 x4363 -8 x4457 -8 x4551 -3 x4645 -2 x4739 -7 x4833 -2 x4927 -10 x5021 -4 x5115 -2 x5209 -1 x5491 -10 x5585 >= -14 ;+-10 x2954 -7 x3048 -3 x3236 -7 x3424 -3 x3518 -1 x3894 -8 x3988 -5 x4082 -3 x4176 -10 x4364 -8 x4458 -8 x4552 -3 x4646 -2 x4740 -7 x4834 -2 x4928 -10 x5022 -4 x5116 -2 x5210 -1 x5492 -10 x5586 >= -14 ;+-10 x2955 -7 x3049 -3 x3237 -7 x3425 -3 x3519 -1 x3895 -8 x3989 -5 x4083 -3 x4177 -10 x4365 -8 x4459 -8 x4553 -3 x4647 -2 x4741 -7 x4835 -2 x4929 -10 x5023 -4 x5117 -2 x5211 -1 x5493 -10 x5587 >= -14 ;+-10 x2956 -7 x3050 -3 x3238 -7 x3426 -3 x3520 -1 x3896 -8 x3990 -5 x4084 -3 x4178 -10 x4366 -8 x4460 -8 x4554 -3 x4648 -2 x4742 -7 x4836 -2 x4930 -10 x5024 -4 x5118 -2 x5212 -1 x5494 -10 x5588 >= -14 ;+-10 x2957 -7 x3051 -3 x3239 -7 x3427 -3 x3521 -1 x3897 -8 x3991 -5 x4085 -3 x4179 -10 x4367 -8 x4461 -8 x4555 -3 x4649 -2 x4743 -7 x4837 -2 x4931 -10 x5025 -4 x5119 -2 x5213 -1 x5495 -10 x5589 >= -14 ;+-10 x2958 -7 x3052 -3 x3240 -7 x3428 -3 x3522 -1 x3898 -8 x3992 -5 x4086 -3 x4180 -10 x4368 -8 x4462 -8 x4556 -3 x4650 -2 x4744 -7 x4838 -2 x4932 -10 x5026 -4 x5120 -2 x5214 -1 x5496 -10 x5590 >= -14 ;+-10 x2959 -7 x3053 -3 x3241 -7 x3429 -3 x3523 -1 x3899 -8 x3993 -5 x4087 -3 x4181 -10 x4369 -8 x4463 -8 x4557 -3 x4651 -2 x4745 -7 x4839 -2 x4933 -10 x5027 -4 x5121 -2 x5215 -1 x5497 -10 x5591 >= -14 ;+-10 x2960 -7 x3054 -3 x3242 -7 x3430 -3 x3524 -1 x3900 -8 x3994 -5 x4088 -3 x4182 -10 x4370 -8 x4464 -8 x4558 -3 x4652 -2 x4746 -7 x4840 -2 x4934 -10 x5028 -4 x5122 -2 x5216 -1 x5498 -10 x5592 >= -14 ;+-10 x2961 -7 x3055 -3 x3243 -7 x3431 -3 x3525 -1 x3901 -8 x3995 -5 x4089 -3 x4183 -10 x4371 -8 x4465 -8 x4559 -3 x4653 -2 x4747 -7 x4841 -2 x4935 -10 x5029 -4 x5123 -2 x5217 -1 x5499 -10 x5593 >= -14 ;+-10 x2962 -7 x3056 -3 x3244 -7 x3432 -3 x3526 -1 x3902 -8 x3996 -5 x4090 -3 x4184 -10 x4372 -8 x4466 -8 x4560 -3 x4654 -2 x4748 -7 x4842 -2 x4936 -10 x5030 -4 x5124 -2 x5218 -1 x5500 -10 x5594 >= -14 ;+-10 x2963 -7 x3057 -3 x3245 -7 x3433 -3 x3527 -1 x3903 -8 x3997 -5 x4091 -3 x4185 -10 x4373 -8 x4467 -8 x4561 -3 x4655 -2 x4749 -7 x4843 -2 x4937 -10 x5031 -4 x5125 -2 x5219 -1 x5501 -10 x5595 >= -14 ;+-10 x2964 -7 x3058 -3 x3246 -7 x3434 -3 x3528 -1 x3904 -8 x3998 -5 x4092 -3 x4186 -10 x4374 -8 x4468 -8 x4562 -3 x4656 -2 x4750 -7 x4844 -2 x4938 -10 x5032 -4 x5126 -2 x5220 -1 x5502 -10 x5596 >= -14 ;+-10 x2965 -7 x3059 -3 x3247 -7 x3435 -3 x3529 -1 x3905 -8 x3999 -5 x4093 -3 x4187 -10 x4375 -8 x4469 -8 x4563 -3 x4657 -2 x4751 -7 x4845 -2 x4939 -10 x5033 -4 x5127 -2 x5221 -1 x5503 -10 x5597 >= -14 ;+-10 x2966 -7 x3060 -3 x3248 -7 x3436 -3 x3530 -1 x3906 -8 x4000 -5 x4094 -3 x4188 -10 x4376 -8 x4470 -8 x4564 -3 x4658 -2 x4752 -7 x4846 -2 x4940 -10 x5034 -4 x5128 -2 x5222 -1 x5504 -10 x5598 >= -14 ;+-10 x2967 -7 x3061 -3 x3249 -7 x3437 -3 x3531 -1 x3907 -8 x4001 -5 x4095 -3 x4189 -10 x4377 -8 x4471 -8 x4565 -3 x4659 -2 x4753 -7 x4847 -2 x4941 -10 x5035 -4 x5129 -2 x5223 -1 x5505 -10 x5599 >= -14 ;+-10 x2968 -7 x3062 -3 x3250 -7 x3438 -3 x3532 -1 x3908 -8 x4002 -5 x4096 -3 x4190 -10 x4378 -8 x4472 -8 x4566 -3 x4660 -2 x4754 -7 x4848 -2 x4942 -10 x5036 -4 x5130 -2 x5224 -1 x5506 -10 x5600 >= -14 ;+-10 x2969 -7 x3063 -3 x3251 -7 x3439 -3 x3533 -1 x3909 -8 x4003 -5 x4097 -3 x4191 -10 x4379 -8 x4473 -8 x4567 -3 x4661 -2 x4755 -7 x4849 -2 x4943 -10 x5037 -4 x5131 -2 x5225 -1 x5507 -10 x5601 >= -14 ;+-10 x2970 -7 x3064 -3 x3252 -7 x3440 -3 x3534 -1 x3910 -8 x4004 -5 x4098 -3 x4192 -10 x4380 -8 x4474 -8 x4568 -3 x4662 -2 x4756 -7 x4850 -2 x4944 -10 x5038 -4 x5132 -2 x5226 -1 x5508 -10 x5602 >= -14 ;+-10 x2971 -7 x3065 -3 x3253 -7 x3441 -3 x3535 -1 x3911 -8 x4005 -5 x4099 -3 x4193 -10 x4381 -8 x4475 -8 x4569 -3 x4663 -2 x4757 -7 x4851 -2 x4945 -10 x5039 -4 x5133 -2 x5227 -1 x5509 -10 x5603 >= -14 ;+-10 x2972 -7 x3066 -3 x3254 -7 x3442 -3 x3536 -1 x3912 -8 x4006 -5 x4100 -3 x4194 -10 x4382 -8 x4476 -8 x4570 -3 x4664 -2 x4758 -7 x4852 -2 x4946 -10 x5040 -4 x5134 -2 x5228 -1 x5510 -10 x5604 >= -14 ;+-10 x2973 -7 x3067 -3 x3255 -7 x3443 -3 x3537 -1 x3913 -8 x4007 -5 x4101 -3 x4195 -10 x4383 -8 x4477 -8 x4571 -3 x4665 -2 x4759 -7 x4853 -2 x4947 -10 x5041 -4 x5135 -2 x5229 -1 x5511 -10 x5605 >= -14 ;+-10 x2974 -7 x3068 -3 x3256 -7 x3444 -3 x3538 -1 x3914 -8 x4008 -5 x4102 -3 x4196 -10 x4384 -8 x4478 -8 x4572 -3 x4666 -2 x4760 -7 x4854 -2 x4948 -10 x5042 -4 x5136 -2 x5230 -1 x5512 -10 x5606 >= -14 ;+-10 x2975 -7 x3069 -3 x3257 -7 x3445 -3 x3539 -1 x3915 -8 x4009 -5 x4103 -3 x4197 -10 x4385 -8 x4479 -8 x4573 -3 x4667 -2 x4761 -7 x4855 -2 x4949 -10 x5043 -4 x5137 -2 x5231 -1 x5513 -10 x5607 >= -14 ;+-10 x2976 -7 x3070 -3 x3258 -7 x3446 -3 x3540 -1 x3916 -8 x4010 -5 x4104 -3 x4198 -10 x4386 -8 x4480 -8 x4574 -3 x4668 -2 x4762 -7 x4856 -2 x4950 -10 x5044 -4 x5138 -2 x5232 -1 x5514 -10 x5608 >= -14 ;+-10 x2977 -7 x3071 -3 x3259 -7 x3447 -3 x3541 -1 x3917 -8 x4011 -5 x4105 -3 x4199 -10 x4387 -8 x4481 -8 x4575 -3 x4669 -2 x4763 -7 x4857 -2 x4951 -10 x5045 -4 x5139 -2 x5233 -1 x5515 -10 x5609 >= -14 ;+-10 x2978 -7 x3072 -3 x3260 -7 x3448 -3 x3542 -1 x3918 -8 x4012 -5 x4106 -3 x4200 -10 x4388 -8 x4482 -8 x4576 -3 x4670 -2 x4764 -7 x4858 -2 x4952 -10 x5046 -4 x5140 -2 x5234 -1 x5516 -10 x5610 >= -14 ;+-10 x2979 -7 x3073 -3 x3261 -7 x3449 -3 x3543 -1 x3919 -8 x4013 -5 x4107 -3 x4201 -10 x4389 -8 x4483 -8 x4577 -3 x4671 -2 x4765 -7 x4859 -2 x4953 -10 x5047 -4 x5141 -2 x5235 -1 x5517 -10 x5611 >= -14 ;+-10 x2980 -7 x3074 -3 x3262 -7 x3450 -3 x3544 -1 x3920 -8 x4014 -5 x4108 -3 x4202 -10 x4390 -8 x4484 -8 x4578 -3 x4672 -2 x4766 -7 x4860 -2 x4954 -10 x5048 -4 x5142 -2 x5236 -1 x5518 -10 x5612 >= -14 ;+-10 x2981 -7 x3075 -3 x3263 -7 x3451 -3 x3545 -1 x3921 -8 x4015 -5 x4109 -3 x4203 -10 x4391 -8 x4485 -8 x4579 -3 x4673 -2 x4767 -7 x4861 -2 x4955 -10 x5049 -4 x5143 -2 x5237 -1 x5519 -10 x5613 >= -14 ;+-10 x2982 -7 x3076 -3 x3264 -7 x3452 -3 x3546 -1 x3922 -8 x4016 -5 x4110 -3 x4204 -10 x4392 -8 x4486 -8 x4580 -3 x4674 -2 x4768 -7 x4862 -2 x4956 -10 x5050 -4 x5144 -2 x5238 -1 x5520 -10 x5614 >= -14 ;+-10 x2983 -7 x3077 -3 x3265 -7 x3453 -3 x3547 -1 x3923 -8 x4017 -5 x4111 -3 x4205 -10 x4393 -8 x4487 -8 x4581 -3 x4675 -2 x4769 -7 x4863 -2 x4957 -10 x5051 -4 x5145 -2 x5239 -1 x5521 -10 x5615 >= -14 ;+-10 x2984 -7 x3078 -3 x3266 -7 x3454 -3 x3548 -1 x3924 -8 x4018 -5 x4112 -3 x4206 -10 x4394 -8 x4488 -8 x4582 -3 x4676 -2 x4770 -7 x4864 -2 x4958 -10 x5052 -4 x5146 -2 x5240 -1 x5522 -10 x5616 >= -14 ;+-10 x2985 -7 x3079 -3 x3267 -7 x3455 -3 x3549 -1 x3925 -8 x4019 -5 x4113 -3 x4207 -10 x4395 -8 x4489 -8 x4583 -3 x4677 -2 x4771 -7 x4865 -2 x4959 -10 x5053 -4 x5147 -2 x5241 -1 x5523 -10 x5617 >= -14 ;+-10 x2986 -7 x3080 -3 x3268 -7 x3456 -3 x3550 -1 x3926 -8 x4020 -5 x4114 -3 x4208 -10 x4396 -8 x4490 -8 x4584 -3 x4678 -2 x4772 -7 x4866 -2 x4960 -10 x5054 -4 x5148 -2 x5242 -1 x5524 -10 x5618 >= -14 ;+-10 x2987 -7 x3081 -3 x3269 -7 x3457 -3 x3551 -1 x3927 -8 x4021 -5 x4115 -3 x4209 -10 x4397 -8 x4491 -8 x4585 -3 x4679 -2 x4773 -7 x4867 -2 x4961 -10 x5055 -4 x5149 -2 x5243 -1 x5525 -10 x5619 >= -14 ;+-10 x2988 -7 x3082 -3 x3270 -7 x3458 -3 x3552 -1 x3928 -8 x4022 -5 x4116 -3 x4210 -10 x4398 -8 x4492 -8 x4586 -3 x4680 -2 x4774 -7 x4868 -2 x4962 -10 x5056 -4 x5150 -2 x5244 -1 x5526 -10 x5620 >= -14 ;+-10 x2989 -7 x3083 -3 x3271 -7 x3459 -3 x3553 -1 x3929 -8 x4023 -5 x4117 -3 x4211 -10 x4399 -8 x4493 -8 x4587 -3 x4681 -2 x4775 -7 x4869 -2 x4963 -10 x5057 -4 x5151 -2 x5245 -1 x5527 -10 x5621 >= -14 ;+-10 x2990 -7 x3084 -3 x3272 -7 x3460 -3 x3554 -1 x3930 -8 x4024 -5 x4118 -3 x4212 -10 x4400 -8 x4494 -8 x4588 -3 x4682 -2 x4776 -7 x4870 -2 x4964 -10 x5058 -4 x5152 -2 x5246 -1 x5528 -10 x5622 >= -14 ;+-10 x2991 -7 x3085 -3 x3273 -7 x3461 -3 x3555 -1 x3931 -8 x4025 -5 x4119 -3 x4213 -10 x4401 -8 x4495 -8 x4589 -3 x4683 -2 x4777 -7 x4871 -2 x4965 -10 x5059 -4 x5153 -2 x5247 -1 x5529 -10 x5623 >= -14 ;+-10 x2992 -7 x3086 -3 x3274 -7 x3462 -3 x3556 -1 x3932 -8 x4026 -5 x4120 -3 x4214 -10 x4402 -8 x4496 -8 x4590 -3 x4684 -2 x4778 -7 x4872 -2 x4966 -10 x5060 -4 x5154 -2 x5248 -1 x5530 -10 x5624 >= -14 ;+-10 x2993 -7 x3087 -3 x3275 -7 x3463 -3 x3557 -1 x3933 -8 x4027 -5 x4121 -3 x4215 -10 x4403 -8 x4497 -8 x4591 -3 x4685 -2 x4779 -7 x4873 -2 x4967 -10 x5061 -4 x5155 -2 x5249 -1 x5531 -10 x5625 >= -14 ;+-10 x2994 -7 x3088 -3 x3276 -7 x3464 -3 x3558 -1 x3934 -8 x4028 -5 x4122 -3 x4216 -10 x4404 -8 x4498 -8 x4592 -3 x4686 -2 x4780 -7 x4874 -2 x4968 -10 x5062 -4 x5156 -2 x5250 -1 x5532 -10 x5626 >= -14 ;+-10 x2995 -7 x3089 -3 x3277 -7 x3465 -3 x3559 -1 x3935 -8 x4029 -5 x4123 -3 x4217 -10 x4405 -8 x4499 -8 x4593 -3 x4687 -2 x4781 -7 x4875 -2 x4969 -10 x5063 -4 x5157 -2 x5251 -1 x5533 -10 x5627 >= -14 ;+-10 x2996 -7 x3090 -3 x3278 -7 x3466 -3 x3560 -1 x3936 -8 x4030 -5 x4124 -3 x4218 -10 x4406 -8 x4500 -8 x4594 -3 x4688 -2 x4782 -7 x4876 -2 x4970 -10 x5064 -4 x5158 -2 x5252 -1 x5534 -10 x5628 >= -14 ;+-10 x2997 -7 x3091 -3 x3279 -7 x3467 -3 x3561 -1 x3937 -8 x4031 -5 x4125 -3 x4219 -10 x4407 -8 x4501 -8 x4595 -3 x4689 -2 x4783 -7 x4877 -2 x4971 -10 x5065 -4 x5159 -2 x5253 -1 x5535 -10 x5629 >= -14 ;+-10 x2998 -7 x3092 -3 x3280 -7 x3468 -3 x3562 -1 x3938 -8 x4032 -5 x4126 -3 x4220 -10 x4408 -8 x4502 -8 x4596 -3 x4690 -2 x4784 -7 x4878 -2 x4972 -10 x5066 -4 x5160 -2 x5254 -1 x5536 -10 x5630 >= -14 ;+-10 x2999 -7 x3093 -3 x3281 -7 x3469 -3 x3563 -1 x3939 -8 x4033 -5 x4127 -3 x4221 -10 x4409 -8 x4503 -8 x4597 -3 x4691 -2 x4785 -7 x4879 -2 x4973 -10 x5067 -4 x5161 -2 x5255 -1 x5537 -10 x5631 >= -14 ;+-10 x3000 -7 x3094 -3 x3282 -7 x3470 -3 x3564 -1 x3940 -8 x4034 -5 x4128 -3 x4222 -10 x4410 -8 x4504 -8 x4598 -3 x4692 -2 x4786 -7 x4880 -2 x4974 -10 x5068 -4 x5162 -2 x5256 -1 x5538 -10 x5632 >= -14 ;+-10 x3001 -7 x3095 -3 x3283 -7 x3471 -3 x3565 -1 x3941 -8 x4035 -5 x4129 -3 x4223 -10 x4411 -8 x4505 -8 x4599 -3 x4693 -2 x4787 -7 x4881 -2 x4975 -10 x5069 -4 x5163 -2 x5257 -1 x5539 -10 x5633 >= -14 ;+-10 x3002 -7 x3096 -3 x3284 -7 x3472 -3 x3566 -1 x3942 -8 x4036 -5 x4130 -3 x4224 -10 x4412 -8 x4506 -8 x4600 -3 x4694 -2 x4788 -7 x4882 -2 x4976 -10 x5070 -4 x5164 -2 x5258 -1 x5540 -10 x5634 >= -14 ;+-10 x3003 -7 x3097 -3 x3285 -7 x3473 -3 x3567 -1 x3943 -8 x4037 -5 x4131 -3 x4225 -10 x4413 -8 x4507 -8 x4601 -3 x4695 -2 x4789 -7 x4883 -2 x4977 -10 x5071 -4 x5165 -2 x5259 -1 x5541 -10 x5635 >= -14 ;+-10 x3004 -7 x3098 -3 x3286 -7 x3474 -3 x3568 -1 x3944 -8 x4038 -5 x4132 -3 x4226 -10 x4414 -8 x4508 -8 x4602 -3 x4696 -2 x4790 -7 x4884 -2 x4978 -10 x5072 -4 x5166 -2 x5260 -1 x5542 -10 x5636 >= -14 ;+-10 x3005 -7 x3099 -3 x3287 -7 x3475 -3 x3569 -1 x3945 -8 x4039 -5 x4133 -3 x4227 -10 x4415 -8 x4509 -8 x4603 -3 x4697 -2 x4791 -7 x4885 -2 x4979 -10 x5073 -4 x5167 -2 x5261 -1 x5543 -10 x5637 >= -14 ;+-10 x3006 -7 x3100 -3 x3288 -7 x3476 -3 x3570 -1 x3946 -8 x4040 -5 x4134 -3 x4228 -10 x4416 -8 x4510 -8 x4604 -3 x4698 -2 x4792 -7 x4886 -2 x4980 -10 x5074 -4 x5168 -2 x5262 -1 x5544 -10 x5638 >= -14 ;+-10 x3007 -7 x3101 -3 x3289 -7 x3477 -3 x3571 -1 x3947 -8 x4041 -5 x4135 -3 x4229 -10 x4417 -8 x4511 -8 x4605 -3 x4699 -2 x4793 -7 x4887 -2 x4981 -10 x5075 -4 x5169 -2 x5263 -1 x5545 -10 x5639 >= -14 ;
+ samples/pbs/pigeonhole_150_149.opb view
@@ -0,0 +1,300 @@+* #variable= 22350 #constraint= 299++1 x1 +1 x2 +1 x3 +1 x4 +1 x5 +1 x6 +1 x7 +1 x8 +1 x9 +1 x10 +1 x11 +1 x12 +1 x13 +1 x14 +1 x15 +1 x16 +1 x17 +1 x18 +1 x19 +1 x20 +1 x21 +1 x22 +1 x23 +1 x24 +1 x25 +1 x26 +1 x27 +1 x28 +1 x29 +1 x30 +1 x31 +1 x32 +1 x33 +1 x34 +1 x35 +1 x36 +1 x37 +1 x38 +1 x39 +1 x40 +1 x41 +1 x42 +1 x43 +1 x44 +1 x45 +1 x46 +1 x47 +1 x48 +1 x49 +1 x50 +1 x51 +1 x52 +1 x53 +1 x54 +1 x55 +1 x56 +1 x57 +1 x58 +1 x59 +1 x60 +1 x61 +1 x62 +1 x63 +1 x64 +1 x65 +1 x66 +1 x67 +1 x68 +1 x69 +1 x70 +1 x71 +1 x72 +1 x73 +1 x74 +1 x75 +1 x76 +1 x77 +1 x78 +1 x79 +1 x80 +1 x81 +1 x82 +1 x83 +1 x84 +1 x85 +1 x86 +1 x87 +1 x88 +1 x89 +1 x90 +1 x91 +1 x92 +1 x93 +1 x94 +1 x95 +1 x96 +1 x97 +1 x98 +1 x99 +1 x100 +1 x101 +1 x102 +1 x103 +1 x104 +1 x105 +1 x106 +1 x107 +1 x108 +1 x109 +1 x110 +1 x111 +1 x112 +1 x113 +1 x114 +1 x115 +1 x116 +1 x117 +1 x118 +1 x119 +1 x120 +1 x121 +1 x122 +1 x123 +1 x124 +1 x125 +1 x126 +1 x127 +1 x128 +1 x129 +1 x130 +1 x131 +1 x132 +1 x133 +1 x134 +1 x135 +1 x136 +1 x137 +1 x138 +1 x139 +1 x140 +1 x141 +1 x142 +1 x143 +1 x144 +1 x145 +1 x146 +1 x147 +1 x148 +1 x149 >= 1;++1 x150 +1 x151 +1 x152 +1 x153 +1 x154 +1 x155 +1 x156 +1 x157 +1 x158 +1 x159 +1 x160 +1 x161 +1 x162 +1 x163 +1 x164 +1 x165 +1 x166 +1 x167 +1 x168 +1 x169 +1 x170 +1 x171 +1 x172 +1 x173 +1 x174 +1 x175 +1 x176 +1 x177 +1 x178 +1 x179 +1 x180 +1 x181 +1 x182 +1 x183 +1 x184 +1 x185 +1 x186 +1 x187 +1 x188 +1 x189 +1 x190 +1 x191 +1 x192 +1 x193 +1 x194 +1 x195 +1 x196 +1 x197 +1 x198 +1 x199 +1 x200 +1 x201 +1 x202 +1 x203 +1 x204 +1 x205 +1 x206 +1 x207 +1 x208 +1 x209 +1 x210 +1 x211 +1 x212 +1 x213 +1 x214 +1 x215 +1 x216 +1 x217 +1 x218 +1 x219 +1 x220 +1 x221 +1 x222 +1 x223 +1 x224 +1 x225 +1 x226 +1 x227 +1 x228 +1 x229 +1 x230 +1 x231 +1 x232 +1 x233 +1 x234 +1 x235 +1 x236 +1 x237 +1 x238 +1 x239 +1 x240 +1 x241 +1 x242 +1 x243 +1 x244 +1 x245 +1 x246 +1 x247 +1 x248 +1 x249 +1 x250 +1 x251 +1 x252 +1 x253 +1 x254 +1 x255 +1 x256 +1 x257 +1 x258 +1 x259 +1 x260 +1 x261 +1 x262 +1 x263 +1 x264 +1 x265 +1 x266 +1 x267 +1 x268 +1 x269 +1 x270 +1 x271 +1 x272 +1 x273 +1 x274 +1 x275 +1 x276 +1 x277 +1 x278 +1 x279 +1 x280 +1 x281 +1 x282 +1 x283 +1 x284 +1 x285 +1 x286 +1 x287 +1 x288 +1 x289 +1 x290 +1 x291 +1 x292 +1 x293 +1 x294 +1 x295 +1 x296 +1 x297 +1 x298 >= 1;++1 x299 +1 x300 +1 x301 +1 x302 +1 x303 +1 x304 +1 x305 +1 x306 +1 x307 +1 x308 +1 x309 +1 x310 +1 x311 +1 x312 +1 x313 +1 x314 +1 x315 +1 x316 +1 x317 +1 x318 +1 x319 +1 x320 +1 x321 +1 x322 +1 x323 +1 x324 +1 x325 +1 x326 +1 x327 +1 x328 +1 x329 +1 x330 +1 x331 +1 x332 +1 x333 +1 x334 +1 x335 +1 x336 +1 x337 +1 x338 +1 x339 +1 x340 +1 x341 +1 x342 +1 x343 +1 x344 +1 x345 +1 x346 +1 x347 +1 x348 +1 x349 +1 x350 +1 x351 +1 x352 +1 x353 +1 x354 +1 x355 +1 x356 +1 x357 +1 x358 +1 x359 +1 x360 +1 x361 +1 x362 +1 x363 +1 x364 +1 x365 +1 x366 +1 x367 +1 x368 +1 x369 +1 x370 +1 x371 +1 x372 +1 x373 +1 x374 +1 x375 +1 x376 +1 x377 +1 x378 +1 x379 +1 x380 +1 x381 +1 x382 +1 x383 +1 x384 +1 x385 +1 x386 +1 x387 +1 x388 +1 x389 +1 x390 +1 x391 +1 x392 +1 x393 +1 x394 +1 x395 +1 x396 +1 x397 +1 x398 +1 x399 +1 x400 +1 x401 +1 x402 +1 x403 +1 x404 +1 x405 +1 x406 +1 x407 +1 x408 +1 x409 +1 x410 +1 x411 +1 x412 +1 x413 +1 x414 +1 x415 +1 x416 +1 x417 +1 x418 +1 x419 +1 x420 +1 x421 +1 x422 +1 x423 +1 x424 +1 x425 +1 x426 +1 x427 +1 x428 +1 x429 +1 x430 +1 x431 +1 x432 +1 x433 +1 x434 +1 x435 +1 x436 +1 x437 +1 x438 +1 x439 +1 x440 +1 x441 +1 x442 +1 x443 +1 x444 +1 x445 +1 x446 +1 x447 >= 1;++1 x448 +1 x449 +1 x450 +1 x451 +1 x452 +1 x453 +1 x454 +1 x455 +1 x456 +1 x457 +1 x458 +1 x459 +1 x460 +1 x461 +1 x462 +1 x463 +1 x464 +1 x465 +1 x466 +1 x467 +1 x468 +1 x469 +1 x470 +1 x471 +1 x472 +1 x473 +1 x474 +1 x475 +1 x476 +1 x477 +1 x478 +1 x479 +1 x480 +1 x481 +1 x482 +1 x483 +1 x484 +1 x485 +1 x486 +1 x487 +1 x488 +1 x489 +1 x490 +1 x491 +1 x492 +1 x493 +1 x494 +1 x495 +1 x496 +1 x497 +1 x498 +1 x499 +1 x500 +1 x501 +1 x502 +1 x503 +1 x504 +1 x505 +1 x506 +1 x507 +1 x508 +1 x509 +1 x510 +1 x511 +1 x512 +1 x513 +1 x514 +1 x515 +1 x516 +1 x517 +1 x518 +1 x519 +1 x520 +1 x521 +1 x522 +1 x523 +1 x524 +1 x525 +1 x526 +1 x527 +1 x528 +1 x529 +1 x530 +1 x531 +1 x532 +1 x533 +1 x534 +1 x535 +1 x536 +1 x537 +1 x538 +1 x539 +1 x540 +1 x541 +1 x542 +1 x543 +1 x544 +1 x545 +1 x546 +1 x547 +1 x548 +1 x549 +1 x550 +1 x551 +1 x552 +1 x553 +1 x554 +1 x555 +1 x556 +1 x557 +1 x558 +1 x559 +1 x560 +1 x561 +1 x562 +1 x563 +1 x564 +1 x565 +1 x566 +1 x567 +1 x568 +1 x569 +1 x570 +1 x571 +1 x572 +1 x573 +1 x574 +1 x575 +1 x576 +1 x577 +1 x578 +1 x579 +1 x580 +1 x581 +1 x582 +1 x583 +1 x584 +1 x585 +1 x586 +1 x587 +1 x588 +1 x589 +1 x590 +1 x591 +1 x592 +1 x593 +1 x594 +1 x595 +1 x596 >= 1;++1 x597 +1 x598 +1 x599 +1 x600 +1 x601 +1 x602 +1 x603 +1 x604 +1 x605 +1 x606 +1 x607 +1 x608 +1 x609 +1 x610 +1 x611 +1 x612 +1 x613 +1 x614 +1 x615 +1 x616 +1 x617 +1 x618 +1 x619 +1 x620 +1 x621 +1 x622 +1 x623 +1 x624 +1 x625 +1 x626 +1 x627 +1 x628 +1 x629 +1 x630 +1 x631 +1 x632 +1 x633 +1 x634 +1 x635 +1 x636 +1 x637 +1 x638 +1 x639 +1 x640 +1 x641 +1 x642 +1 x643 +1 x644 +1 x645 +1 x646 +1 x647 +1 x648 +1 x649 +1 x650 +1 x651 +1 x652 +1 x653 +1 x654 +1 x655 +1 x656 +1 x657 +1 x658 +1 x659 +1 x660 +1 x661 +1 x662 +1 x663 +1 x664 +1 x665 +1 x666 +1 x667 +1 x668 +1 x669 +1 x670 +1 x671 +1 x672 +1 x673 +1 x674 +1 x675 +1 x676 +1 x677 +1 x678 +1 x679 +1 x680 +1 x681 +1 x682 +1 x683 +1 x684 +1 x685 +1 x686 +1 x687 +1 x688 +1 x689 +1 x690 +1 x691 +1 x692 +1 x693 +1 x694 +1 x695 +1 x696 +1 x697 +1 x698 +1 x699 +1 x700 +1 x701 +1 x702 +1 x703 +1 x704 +1 x705 +1 x706 +1 x707 +1 x708 +1 x709 +1 x710 +1 x711 +1 x712 +1 x713 +1 x714 +1 x715 +1 x716 +1 x717 +1 x718 +1 x719 +1 x720 +1 x721 +1 x722 +1 x723 +1 x724 +1 x725 +1 x726 +1 x727 +1 x728 +1 x729 +1 x730 +1 x731 +1 x732 +1 x733 +1 x734 +1 x735 +1 x736 +1 x737 +1 x738 +1 x739 +1 x740 +1 x741 +1 x742 +1 x743 +1 x744 +1 x745 >= 1;++1 x746 +1 x747 +1 x748 +1 x749 +1 x750 +1 x751 +1 x752 +1 x753 +1 x754 +1 x755 +1 x756 +1 x757 +1 x758 +1 x759 +1 x760 +1 x761 +1 x762 +1 x763 +1 x764 +1 x765 +1 x766 +1 x767 +1 x768 +1 x769 +1 x770 +1 x771 +1 x772 +1 x773 +1 x774 +1 x775 +1 x776 +1 x777 +1 x778 +1 x779 +1 x780 +1 x781 +1 x782 +1 x783 +1 x784 +1 x785 +1 x786 +1 x787 +1 x788 +1 x789 +1 x790 +1 x791 +1 x792 +1 x793 +1 x794 +1 x795 +1 x796 +1 x797 +1 x798 +1 x799 +1 x800 +1 x801 +1 x802 +1 x803 +1 x804 +1 x805 +1 x806 +1 x807 +1 x808 +1 x809 +1 x810 +1 x811 +1 x812 +1 x813 +1 x814 +1 x815 +1 x816 +1 x817 +1 x818 +1 x819 +1 x820 +1 x821 +1 x822 +1 x823 +1 x824 +1 x825 +1 x826 +1 x827 +1 x828 +1 x829 +1 x830 +1 x831 +1 x832 +1 x833 +1 x834 +1 x835 +1 x836 +1 x837 +1 x838 +1 x839 +1 x840 +1 x841 +1 x842 +1 x843 +1 x844 +1 x845 +1 x846 +1 x847 +1 x848 +1 x849 +1 x850 +1 x851 +1 x852 +1 x853 +1 x854 +1 x855 +1 x856 +1 x857 +1 x858 +1 x859 +1 x860 +1 x861 +1 x862 +1 x863 +1 x864 +1 x865 +1 x866 +1 x867 +1 x868 +1 x869 +1 x870 +1 x871 +1 x872 +1 x873 +1 x874 +1 x875 +1 x876 +1 x877 +1 x878 +1 x879 +1 x880 +1 x881 +1 x882 +1 x883 +1 x884 +1 x885 +1 x886 +1 x887 +1 x888 +1 x889 +1 x890 +1 x891 +1 x892 +1 x893 +1 x894 >= 1;++1 x895 +1 x896 +1 x897 +1 x898 +1 x899 +1 x900 +1 x901 +1 x902 +1 x903 +1 x904 +1 x905 +1 x906 +1 x907 +1 x908 +1 x909 +1 x910 +1 x911 +1 x912 +1 x913 +1 x914 +1 x915 +1 x916 +1 x917 +1 x918 +1 x919 +1 x920 +1 x921 +1 x922 +1 x923 +1 x924 +1 x925 +1 x926 +1 x927 +1 x928 +1 x929 +1 x930 +1 x931 +1 x932 +1 x933 +1 x934 +1 x935 +1 x936 +1 x937 +1 x938 +1 x939 +1 x940 +1 x941 +1 x942 +1 x943 +1 x944 +1 x945 +1 x946 +1 x947 +1 x948 +1 x949 +1 x950 +1 x951 +1 x952 +1 x953 +1 x954 +1 x955 +1 x956 +1 x957 +1 x958 +1 x959 +1 x960 +1 x961 +1 x962 +1 x963 +1 x964 +1 x965 +1 x966 +1 x967 +1 x968 +1 x969 +1 x970 +1 x971 +1 x972 +1 x973 +1 x974 +1 x975 +1 x976 +1 x977 +1 x978 +1 x979 +1 x980 +1 x981 +1 x982 +1 x983 +1 x984 +1 x985 +1 x986 +1 x987 +1 x988 +1 x989 +1 x990 +1 x991 +1 x992 +1 x993 +1 x994 +1 x995 +1 x996 +1 x997 +1 x998 +1 x999 +1 x1000 +1 x1001 +1 x1002 +1 x1003 +1 x1004 +1 x1005 +1 x1006 +1 x1007 +1 x1008 +1 x1009 +1 x1010 +1 x1011 +1 x1012 +1 x1013 +1 x1014 +1 x1015 +1 x1016 +1 x1017 +1 x1018 +1 x1019 +1 x1020 +1 x1021 +1 x1022 +1 x1023 +1 x1024 +1 x1025 +1 x1026 +1 x1027 +1 x1028 +1 x1029 +1 x1030 +1 x1031 +1 x1032 +1 x1033 +1 x1034 +1 x1035 +1 x1036 +1 x1037 +1 x1038 +1 x1039 +1 x1040 +1 x1041 +1 x1042 +1 x1043 >= 1;++1 x1044 +1 x1045 +1 x1046 +1 x1047 +1 x1048 +1 x1049 +1 x1050 +1 x1051 +1 x1052 +1 x1053 +1 x1054 +1 x1055 +1 x1056 +1 x1057 +1 x1058 +1 x1059 +1 x1060 +1 x1061 +1 x1062 +1 x1063 +1 x1064 +1 x1065 +1 x1066 +1 x1067 +1 x1068 +1 x1069 +1 x1070 +1 x1071 +1 x1072 +1 x1073 +1 x1074 +1 x1075 +1 x1076 +1 x1077 +1 x1078 +1 x1079 +1 x1080 +1 x1081 +1 x1082 +1 x1083 +1 x1084 +1 x1085 +1 x1086 +1 x1087 +1 x1088 +1 x1089 +1 x1090 +1 x1091 +1 x1092 +1 x1093 +1 x1094 +1 x1095 +1 x1096 +1 x1097 +1 x1098 +1 x1099 +1 x1100 +1 x1101 +1 x1102 +1 x1103 +1 x1104 +1 x1105 +1 x1106 +1 x1107 +1 x1108 +1 x1109 +1 x1110 +1 x1111 +1 x1112 +1 x1113 +1 x1114 +1 x1115 +1 x1116 +1 x1117 +1 x1118 +1 x1119 +1 x1120 +1 x1121 +1 x1122 +1 x1123 +1 x1124 +1 x1125 +1 x1126 +1 x1127 +1 x1128 +1 x1129 +1 x1130 +1 x1131 +1 x1132 +1 x1133 +1 x1134 +1 x1135 +1 x1136 +1 x1137 +1 x1138 +1 x1139 +1 x1140 +1 x1141 +1 x1142 +1 x1143 +1 x1144 +1 x1145 +1 x1146 +1 x1147 +1 x1148 +1 x1149 +1 x1150 +1 x1151 +1 x1152 +1 x1153 +1 x1154 +1 x1155 +1 x1156 +1 x1157 +1 x1158 +1 x1159 +1 x1160 +1 x1161 +1 x1162 +1 x1163 +1 x1164 +1 x1165 +1 x1166 +1 x1167 +1 x1168 +1 x1169 +1 x1170 +1 x1171 +1 x1172 +1 x1173 +1 x1174 +1 x1175 +1 x1176 +1 x1177 +1 x1178 +1 x1179 +1 x1180 +1 x1181 +1 x1182 +1 x1183 +1 x1184 +1 x1185 +1 x1186 +1 x1187 +1 x1188 +1 x1189 +1 x1190 +1 x1191 +1 x1192 >= 1;++1 x1193 +1 x1194 +1 x1195 +1 x1196 +1 x1197 +1 x1198 +1 x1199 +1 x1200 +1 x1201 +1 x1202 +1 x1203 +1 x1204 +1 x1205 +1 x1206 +1 x1207 +1 x1208 +1 x1209 +1 x1210 +1 x1211 +1 x1212 +1 x1213 +1 x1214 +1 x1215 +1 x1216 +1 x1217 +1 x1218 +1 x1219 +1 x1220 +1 x1221 +1 x1222 +1 x1223 +1 x1224 +1 x1225 +1 x1226 +1 x1227 +1 x1228 +1 x1229 +1 x1230 +1 x1231 +1 x1232 +1 x1233 +1 x1234 +1 x1235 +1 x1236 +1 x1237 +1 x1238 +1 x1239 +1 x1240 +1 x1241 +1 x1242 +1 x1243 +1 x1244 +1 x1245 +1 x1246 +1 x1247 +1 x1248 +1 x1249 +1 x1250 +1 x1251 +1 x1252 +1 x1253 +1 x1254 +1 x1255 +1 x1256 +1 x1257 +1 x1258 +1 x1259 +1 x1260 +1 x1261 +1 x1262 +1 x1263 +1 x1264 +1 x1265 +1 x1266 +1 x1267 +1 x1268 +1 x1269 +1 x1270 +1 x1271 +1 x1272 +1 x1273 +1 x1274 +1 x1275 +1 x1276 +1 x1277 +1 x1278 +1 x1279 +1 x1280 +1 x1281 +1 x1282 +1 x1283 +1 x1284 +1 x1285 +1 x1286 +1 x1287 +1 x1288 +1 x1289 +1 x1290 +1 x1291 +1 x1292 +1 x1293 +1 x1294 +1 x1295 +1 x1296 +1 x1297 +1 x1298 +1 x1299 +1 x1300 +1 x1301 +1 x1302 +1 x1303 +1 x1304 +1 x1305 +1 x1306 +1 x1307 +1 x1308 +1 x1309 +1 x1310 +1 x1311 +1 x1312 +1 x1313 +1 x1314 +1 x1315 +1 x1316 +1 x1317 +1 x1318 +1 x1319 +1 x1320 +1 x1321 +1 x1322 +1 x1323 +1 x1324 +1 x1325 +1 x1326 +1 x1327 +1 x1328 +1 x1329 +1 x1330 +1 x1331 +1 x1332 +1 x1333 +1 x1334 +1 x1335 +1 x1336 +1 x1337 +1 x1338 +1 x1339 +1 x1340 +1 x1341 >= 1;++1 x1342 +1 x1343 +1 x1344 +1 x1345 +1 x1346 +1 x1347 +1 x1348 +1 x1349 +1 x1350 +1 x1351 +1 x1352 +1 x1353 +1 x1354 +1 x1355 +1 x1356 +1 x1357 +1 x1358 +1 x1359 +1 x1360 +1 x1361 +1 x1362 +1 x1363 +1 x1364 +1 x1365 +1 x1366 +1 x1367 +1 x1368 +1 x1369 +1 x1370 +1 x1371 +1 x1372 +1 x1373 +1 x1374 +1 x1375 +1 x1376 +1 x1377 +1 x1378 +1 x1379 +1 x1380 +1 x1381 +1 x1382 +1 x1383 +1 x1384 +1 x1385 +1 x1386 +1 x1387 +1 x1388 +1 x1389 +1 x1390 +1 x1391 +1 x1392 +1 x1393 +1 x1394 +1 x1395 +1 x1396 +1 x1397 +1 x1398 +1 x1399 +1 x1400 +1 x1401 +1 x1402 +1 x1403 +1 x1404 +1 x1405 +1 x1406 +1 x1407 +1 x1408 +1 x1409 +1 x1410 +1 x1411 +1 x1412 +1 x1413 +1 x1414 +1 x1415 +1 x1416 +1 x1417 +1 x1418 +1 x1419 +1 x1420 +1 x1421 +1 x1422 +1 x1423 +1 x1424 +1 x1425 +1 x1426 +1 x1427 +1 x1428 +1 x1429 +1 x1430 +1 x1431 +1 x1432 +1 x1433 +1 x1434 +1 x1435 +1 x1436 +1 x1437 +1 x1438 +1 x1439 +1 x1440 +1 x1441 +1 x1442 +1 x1443 +1 x1444 +1 x1445 +1 x1446 +1 x1447 +1 x1448 +1 x1449 +1 x1450 +1 x1451 +1 x1452 +1 x1453 +1 x1454 +1 x1455 +1 x1456 +1 x1457 +1 x1458 +1 x1459 +1 x1460 +1 x1461 +1 x1462 +1 x1463 +1 x1464 +1 x1465 +1 x1466 +1 x1467 +1 x1468 +1 x1469 +1 x1470 +1 x1471 +1 x1472 +1 x1473 +1 x1474 +1 x1475 +1 x1476 +1 x1477 +1 x1478 +1 x1479 +1 x1480 +1 x1481 +1 x1482 +1 x1483 +1 x1484 +1 x1485 +1 x1486 +1 x1487 +1 x1488 +1 x1489 +1 x1490 >= 1;++1 x1491 +1 x1492 +1 x1493 +1 x1494 +1 x1495 +1 x1496 +1 x1497 +1 x1498 +1 x1499 +1 x1500 +1 x1501 +1 x1502 +1 x1503 +1 x1504 +1 x1505 +1 x1506 +1 x1507 +1 x1508 +1 x1509 +1 x1510 +1 x1511 +1 x1512 +1 x1513 +1 x1514 +1 x1515 +1 x1516 +1 x1517 +1 x1518 +1 x1519 +1 x1520 +1 x1521 +1 x1522 +1 x1523 +1 x1524 +1 x1525 +1 x1526 +1 x1527 +1 x1528 +1 x1529 +1 x1530 +1 x1531 +1 x1532 +1 x1533 +1 x1534 +1 x1535 +1 x1536 +1 x1537 +1 x1538 +1 x1539 +1 x1540 +1 x1541 +1 x1542 +1 x1543 +1 x1544 +1 x1545 +1 x1546 +1 x1547 +1 x1548 +1 x1549 +1 x1550 +1 x1551 +1 x1552 +1 x1553 +1 x1554 +1 x1555 +1 x1556 +1 x1557 +1 x1558 +1 x1559 +1 x1560 +1 x1561 +1 x1562 +1 x1563 +1 x1564 +1 x1565 +1 x1566 +1 x1567 +1 x1568 +1 x1569 +1 x1570 +1 x1571 +1 x1572 +1 x1573 +1 x1574 +1 x1575 +1 x1576 +1 x1577 +1 x1578 +1 x1579 +1 x1580 +1 x1581 +1 x1582 +1 x1583 +1 x1584 +1 x1585 +1 x1586 +1 x1587 +1 x1588 +1 x1589 +1 x1590 +1 x1591 +1 x1592 +1 x1593 +1 x1594 +1 x1595 +1 x1596 +1 x1597 +1 x1598 +1 x1599 +1 x1600 +1 x1601 +1 x1602 +1 x1603 +1 x1604 +1 x1605 +1 x1606 +1 x1607 +1 x1608 +1 x1609 +1 x1610 +1 x1611 +1 x1612 +1 x1613 +1 x1614 +1 x1615 +1 x1616 +1 x1617 +1 x1618 +1 x1619 +1 x1620 +1 x1621 +1 x1622 +1 x1623 +1 x1624 +1 x1625 +1 x1626 +1 x1627 +1 x1628 +1 x1629 +1 x1630 +1 x1631 +1 x1632 +1 x1633 +1 x1634 +1 x1635 +1 x1636 +1 x1637 +1 x1638 +1 x1639 >= 1;++1 x1640 +1 x1641 +1 x1642 +1 x1643 +1 x1644 +1 x1645 +1 x1646 +1 x1647 +1 x1648 +1 x1649 +1 x1650 +1 x1651 +1 x1652 +1 x1653 +1 x1654 +1 x1655 +1 x1656 +1 x1657 +1 x1658 +1 x1659 +1 x1660 +1 x1661 +1 x1662 +1 x1663 +1 x1664 +1 x1665 +1 x1666 +1 x1667 +1 x1668 +1 x1669 +1 x1670 +1 x1671 +1 x1672 +1 x1673 +1 x1674 +1 x1675 +1 x1676 +1 x1677 +1 x1678 +1 x1679 +1 x1680 +1 x1681 +1 x1682 +1 x1683 +1 x1684 +1 x1685 +1 x1686 +1 x1687 +1 x1688 +1 x1689 +1 x1690 +1 x1691 +1 x1692 +1 x1693 +1 x1694 +1 x1695 +1 x1696 +1 x1697 +1 x1698 +1 x1699 +1 x1700 +1 x1701 +1 x1702 +1 x1703 +1 x1704 +1 x1705 +1 x1706 +1 x1707 +1 x1708 +1 x1709 +1 x1710 +1 x1711 +1 x1712 +1 x1713 +1 x1714 +1 x1715 +1 x1716 +1 x1717 +1 x1718 +1 x1719 +1 x1720 +1 x1721 +1 x1722 +1 x1723 +1 x1724 +1 x1725 +1 x1726 +1 x1727 +1 x1728 +1 x1729 +1 x1730 +1 x1731 +1 x1732 +1 x1733 +1 x1734 +1 x1735 +1 x1736 +1 x1737 +1 x1738 +1 x1739 +1 x1740 +1 x1741 +1 x1742 +1 x1743 +1 x1744 +1 x1745 +1 x1746 +1 x1747 +1 x1748 +1 x1749 +1 x1750 +1 x1751 +1 x1752 +1 x1753 +1 x1754 +1 x1755 +1 x1756 +1 x1757 +1 x1758 +1 x1759 +1 x1760 +1 x1761 +1 x1762 +1 x1763 +1 x1764 +1 x1765 +1 x1766 +1 x1767 +1 x1768 +1 x1769 +1 x1770 +1 x1771 +1 x1772 +1 x1773 +1 x1774 +1 x1775 +1 x1776 +1 x1777 +1 x1778 +1 x1779 +1 x1780 +1 x1781 +1 x1782 +1 x1783 +1 x1784 +1 x1785 +1 x1786 +1 x1787 +1 x1788 >= 1;++1 x1789 +1 x1790 +1 x1791 +1 x1792 +1 x1793 +1 x1794 +1 x1795 +1 x1796 +1 x1797 +1 x1798 +1 x1799 +1 x1800 +1 x1801 +1 x1802 +1 x1803 +1 x1804 +1 x1805 +1 x1806 +1 x1807 +1 x1808 +1 x1809 +1 x1810 +1 x1811 +1 x1812 +1 x1813 +1 x1814 +1 x1815 +1 x1816 +1 x1817 +1 x1818 +1 x1819 +1 x1820 +1 x1821 +1 x1822 +1 x1823 +1 x1824 +1 x1825 +1 x1826 +1 x1827 +1 x1828 +1 x1829 +1 x1830 +1 x1831 +1 x1832 +1 x1833 +1 x1834 +1 x1835 +1 x1836 +1 x1837 +1 x1838 +1 x1839 +1 x1840 +1 x1841 +1 x1842 +1 x1843 +1 x1844 +1 x1845 +1 x1846 +1 x1847 +1 x1848 +1 x1849 +1 x1850 +1 x1851 +1 x1852 +1 x1853 +1 x1854 +1 x1855 +1 x1856 +1 x1857 +1 x1858 +1 x1859 +1 x1860 +1 x1861 +1 x1862 +1 x1863 +1 x1864 +1 x1865 +1 x1866 +1 x1867 +1 x1868 +1 x1869 +1 x1870 +1 x1871 +1 x1872 +1 x1873 +1 x1874 +1 x1875 +1 x1876 +1 x1877 +1 x1878 +1 x1879 +1 x1880 +1 x1881 +1 x1882 +1 x1883 +1 x1884 +1 x1885 +1 x1886 +1 x1887 +1 x1888 +1 x1889 +1 x1890 +1 x1891 +1 x1892 +1 x1893 +1 x1894 +1 x1895 +1 x1896 +1 x1897 +1 x1898 +1 x1899 +1 x1900 +1 x1901 +1 x1902 +1 x1903 +1 x1904 +1 x1905 +1 x1906 +1 x1907 +1 x1908 +1 x1909 +1 x1910 +1 x1911 +1 x1912 +1 x1913 +1 x1914 +1 x1915 +1 x1916 +1 x1917 +1 x1918 +1 x1919 +1 x1920 +1 x1921 +1 x1922 +1 x1923 +1 x1924 +1 x1925 +1 x1926 +1 x1927 +1 x1928 +1 x1929 +1 x1930 +1 x1931 +1 x1932 +1 x1933 +1 x1934 +1 x1935 +1 x1936 +1 x1937 >= 1;++1 x1938 +1 x1939 +1 x1940 +1 x1941 +1 x1942 +1 x1943 +1 x1944 +1 x1945 +1 x1946 +1 x1947 +1 x1948 +1 x1949 +1 x1950 +1 x1951 +1 x1952 +1 x1953 +1 x1954 +1 x1955 +1 x1956 +1 x1957 +1 x1958 +1 x1959 +1 x1960 +1 x1961 +1 x1962 +1 x1963 +1 x1964 +1 x1965 +1 x1966 +1 x1967 +1 x1968 +1 x1969 +1 x1970 +1 x1971 +1 x1972 +1 x1973 +1 x1974 +1 x1975 +1 x1976 +1 x1977 +1 x1978 +1 x1979 +1 x1980 +1 x1981 +1 x1982 +1 x1983 +1 x1984 +1 x1985 +1 x1986 +1 x1987 +1 x1988 +1 x1989 +1 x1990 +1 x1991 +1 x1992 +1 x1993 +1 x1994 +1 x1995 +1 x1996 +1 x1997 +1 x1998 +1 x1999 +1 x2000 +1 x2001 +1 x2002 +1 x2003 +1 x2004 +1 x2005 +1 x2006 +1 x2007 +1 x2008 +1 x2009 +1 x2010 +1 x2011 +1 x2012 +1 x2013 +1 x2014 +1 x2015 +1 x2016 +1 x2017 +1 x2018 +1 x2019 +1 x2020 +1 x2021 +1 x2022 +1 x2023 +1 x2024 +1 x2025 +1 x2026 +1 x2027 +1 x2028 +1 x2029 +1 x2030 +1 x2031 +1 x2032 +1 x2033 +1 x2034 +1 x2035 +1 x2036 +1 x2037 +1 x2038 +1 x2039 +1 x2040 +1 x2041 +1 x2042 +1 x2043 +1 x2044 +1 x2045 +1 x2046 +1 x2047 +1 x2048 +1 x2049 +1 x2050 +1 x2051 +1 x2052 +1 x2053 +1 x2054 +1 x2055 +1 x2056 +1 x2057 +1 x2058 +1 x2059 +1 x2060 +1 x2061 +1 x2062 +1 x2063 +1 x2064 +1 x2065 +1 x2066 +1 x2067 +1 x2068 +1 x2069 +1 x2070 +1 x2071 +1 x2072 +1 x2073 +1 x2074 +1 x2075 +1 x2076 +1 x2077 +1 x2078 +1 x2079 +1 x2080 +1 x2081 +1 x2082 +1 x2083 +1 x2084 +1 x2085 +1 x2086 >= 1;++1 x2087 +1 x2088 +1 x2089 +1 x2090 +1 x2091 +1 x2092 +1 x2093 +1 x2094 +1 x2095 +1 x2096 +1 x2097 +1 x2098 +1 x2099 +1 x2100 +1 x2101 +1 x2102 +1 x2103 +1 x2104 +1 x2105 +1 x2106 +1 x2107 +1 x2108 +1 x2109 +1 x2110 +1 x2111 +1 x2112 +1 x2113 +1 x2114 +1 x2115 +1 x2116 +1 x2117 +1 x2118 +1 x2119 +1 x2120 +1 x2121 +1 x2122 +1 x2123 +1 x2124 +1 x2125 +1 x2126 +1 x2127 +1 x2128 +1 x2129 +1 x2130 +1 x2131 +1 x2132 +1 x2133 +1 x2134 +1 x2135 +1 x2136 +1 x2137 +1 x2138 +1 x2139 +1 x2140 +1 x2141 +1 x2142 +1 x2143 +1 x2144 +1 x2145 +1 x2146 +1 x2147 +1 x2148 +1 x2149 +1 x2150 +1 x2151 +1 x2152 +1 x2153 +1 x2154 +1 x2155 +1 x2156 +1 x2157 +1 x2158 +1 x2159 +1 x2160 +1 x2161 +1 x2162 +1 x2163 +1 x2164 +1 x2165 +1 x2166 +1 x2167 +1 x2168 +1 x2169 +1 x2170 +1 x2171 +1 x2172 +1 x2173 +1 x2174 +1 x2175 +1 x2176 +1 x2177 +1 x2178 +1 x2179 +1 x2180 +1 x2181 +1 x2182 +1 x2183 +1 x2184 +1 x2185 +1 x2186 +1 x2187 +1 x2188 +1 x2189 +1 x2190 +1 x2191 +1 x2192 +1 x2193 +1 x2194 +1 x2195 +1 x2196 +1 x2197 +1 x2198 +1 x2199 +1 x2200 +1 x2201 +1 x2202 +1 x2203 +1 x2204 +1 x2205 +1 x2206 +1 x2207 +1 x2208 +1 x2209 +1 x2210 +1 x2211 +1 x2212 +1 x2213 +1 x2214 +1 x2215 +1 x2216 +1 x2217 +1 x2218 +1 x2219 +1 x2220 +1 x2221 +1 x2222 +1 x2223 +1 x2224 +1 x2225 +1 x2226 +1 x2227 +1 x2228 +1 x2229 +1 x2230 +1 x2231 +1 x2232 +1 x2233 +1 x2234 +1 x2235 >= 1;++1 x2236 +1 x2237 +1 x2238 +1 x2239 +1 x2240 +1 x2241 +1 x2242 +1 x2243 +1 x2244 +1 x2245 +1 x2246 +1 x2247 +1 x2248 +1 x2249 +1 x2250 +1 x2251 +1 x2252 +1 x2253 +1 x2254 +1 x2255 +1 x2256 +1 x2257 +1 x2258 +1 x2259 +1 x2260 +1 x2261 +1 x2262 +1 x2263 +1 x2264 +1 x2265 +1 x2266 +1 x2267 +1 x2268 +1 x2269 +1 x2270 +1 x2271 +1 x2272 +1 x2273 +1 x2274 +1 x2275 +1 x2276 +1 x2277 +1 x2278 +1 x2279 +1 x2280 +1 x2281 +1 x2282 +1 x2283 +1 x2284 +1 x2285 +1 x2286 +1 x2287 +1 x2288 +1 x2289 +1 x2290 +1 x2291 +1 x2292 +1 x2293 +1 x2294 +1 x2295 +1 x2296 +1 x2297 +1 x2298 +1 x2299 +1 x2300 +1 x2301 +1 x2302 +1 x2303 +1 x2304 +1 x2305 +1 x2306 +1 x2307 +1 x2308 +1 x2309 +1 x2310 +1 x2311 +1 x2312 +1 x2313 +1 x2314 +1 x2315 +1 x2316 +1 x2317 +1 x2318 +1 x2319 +1 x2320 +1 x2321 +1 x2322 +1 x2323 +1 x2324 +1 x2325 +1 x2326 +1 x2327 +1 x2328 +1 x2329 +1 x2330 +1 x2331 +1 x2332 +1 x2333 +1 x2334 +1 x2335 +1 x2336 +1 x2337 +1 x2338 +1 x2339 +1 x2340 +1 x2341 +1 x2342 +1 x2343 +1 x2344 +1 x2345 +1 x2346 +1 x2347 +1 x2348 +1 x2349 +1 x2350 +1 x2351 +1 x2352 +1 x2353 +1 x2354 +1 x2355 +1 x2356 +1 x2357 +1 x2358 +1 x2359 +1 x2360 +1 x2361 +1 x2362 +1 x2363 +1 x2364 +1 x2365 +1 x2366 +1 x2367 +1 x2368 +1 x2369 +1 x2370 +1 x2371 +1 x2372 +1 x2373 +1 x2374 +1 x2375 +1 x2376 +1 x2377 +1 x2378 +1 x2379 +1 x2380 +1 x2381 +1 x2382 +1 x2383 +1 x2384 >= 1;++1 x2385 +1 x2386 +1 x2387 +1 x2388 +1 x2389 +1 x2390 +1 x2391 +1 x2392 +1 x2393 +1 x2394 +1 x2395 +1 x2396 +1 x2397 +1 x2398 +1 x2399 +1 x2400 +1 x2401 +1 x2402 +1 x2403 +1 x2404 +1 x2405 +1 x2406 +1 x2407 +1 x2408 +1 x2409 +1 x2410 +1 x2411 +1 x2412 +1 x2413 +1 x2414 +1 x2415 +1 x2416 +1 x2417 +1 x2418 +1 x2419 +1 x2420 +1 x2421 +1 x2422 +1 x2423 +1 x2424 +1 x2425 +1 x2426 +1 x2427 +1 x2428 +1 x2429 +1 x2430 +1 x2431 +1 x2432 +1 x2433 +1 x2434 +1 x2435 +1 x2436 +1 x2437 +1 x2438 +1 x2439 +1 x2440 +1 x2441 +1 x2442 +1 x2443 +1 x2444 +1 x2445 +1 x2446 +1 x2447 +1 x2448 +1 x2449 +1 x2450 +1 x2451 +1 x2452 +1 x2453 +1 x2454 +1 x2455 +1 x2456 +1 x2457 +1 x2458 +1 x2459 +1 x2460 +1 x2461 +1 x2462 +1 x2463 +1 x2464 +1 x2465 +1 x2466 +1 x2467 +1 x2468 +1 x2469 +1 x2470 +1 x2471 +1 x2472 +1 x2473 +1 x2474 +1 x2475 +1 x2476 +1 x2477 +1 x2478 +1 x2479 +1 x2480 +1 x2481 +1 x2482 +1 x2483 +1 x2484 +1 x2485 +1 x2486 +1 x2487 +1 x2488 +1 x2489 +1 x2490 +1 x2491 +1 x2492 +1 x2493 +1 x2494 +1 x2495 +1 x2496 +1 x2497 +1 x2498 +1 x2499 +1 x2500 +1 x2501 +1 x2502 +1 x2503 +1 x2504 +1 x2505 +1 x2506 +1 x2507 +1 x2508 +1 x2509 +1 x2510 +1 x2511 +1 x2512 +1 x2513 +1 x2514 +1 x2515 +1 x2516 +1 x2517 +1 x2518 +1 x2519 +1 x2520 +1 x2521 +1 x2522 +1 x2523 +1 x2524 +1 x2525 +1 x2526 +1 x2527 +1 x2528 +1 x2529 +1 x2530 +1 x2531 +1 x2532 +1 x2533 >= 1;++1 x2534 +1 x2535 +1 x2536 +1 x2537 +1 x2538 +1 x2539 +1 x2540 +1 x2541 +1 x2542 +1 x2543 +1 x2544 +1 x2545 +1 x2546 +1 x2547 +1 x2548 +1 x2549 +1 x2550 +1 x2551 +1 x2552 +1 x2553 +1 x2554 +1 x2555 +1 x2556 +1 x2557 +1 x2558 +1 x2559 +1 x2560 +1 x2561 +1 x2562 +1 x2563 +1 x2564 +1 x2565 +1 x2566 +1 x2567 +1 x2568 +1 x2569 +1 x2570 +1 x2571 +1 x2572 +1 x2573 +1 x2574 +1 x2575 +1 x2576 +1 x2577 +1 x2578 +1 x2579 +1 x2580 +1 x2581 +1 x2582 +1 x2583 +1 x2584 +1 x2585 +1 x2586 +1 x2587 +1 x2588 +1 x2589 +1 x2590 +1 x2591 +1 x2592 +1 x2593 +1 x2594 +1 x2595 +1 x2596 +1 x2597 +1 x2598 +1 x2599 +1 x2600 +1 x2601 +1 x2602 +1 x2603 +1 x2604 +1 x2605 +1 x2606 +1 x2607 +1 x2608 +1 x2609 +1 x2610 +1 x2611 +1 x2612 +1 x2613 +1 x2614 +1 x2615 +1 x2616 +1 x2617 +1 x2618 +1 x2619 +1 x2620 +1 x2621 +1 x2622 +1 x2623 +1 x2624 +1 x2625 +1 x2626 +1 x2627 +1 x2628 +1 x2629 +1 x2630 +1 x2631 +1 x2632 +1 x2633 +1 x2634 +1 x2635 +1 x2636 +1 x2637 +1 x2638 +1 x2639 +1 x2640 +1 x2641 +1 x2642 +1 x2643 +1 x2644 +1 x2645 +1 x2646 +1 x2647 +1 x2648 +1 x2649 +1 x2650 +1 x2651 +1 x2652 +1 x2653 +1 x2654 +1 x2655 +1 x2656 +1 x2657 +1 x2658 +1 x2659 +1 x2660 +1 x2661 +1 x2662 +1 x2663 +1 x2664 +1 x2665 +1 x2666 +1 x2667 +1 x2668 +1 x2669 +1 x2670 +1 x2671 +1 x2672 +1 x2673 +1 x2674 +1 x2675 +1 x2676 +1 x2677 +1 x2678 +1 x2679 +1 x2680 +1 x2681 +1 x2682 >= 1;++1 x2683 +1 x2684 +1 x2685 +1 x2686 +1 x2687 +1 x2688 +1 x2689 +1 x2690 +1 x2691 +1 x2692 +1 x2693 +1 x2694 +1 x2695 +1 x2696 +1 x2697 +1 x2698 +1 x2699 +1 x2700 +1 x2701 +1 x2702 +1 x2703 +1 x2704 +1 x2705 +1 x2706 +1 x2707 +1 x2708 +1 x2709 +1 x2710 +1 x2711 +1 x2712 +1 x2713 +1 x2714 +1 x2715 +1 x2716 +1 x2717 +1 x2718 +1 x2719 +1 x2720 +1 x2721 +1 x2722 +1 x2723 +1 x2724 +1 x2725 +1 x2726 +1 x2727 +1 x2728 +1 x2729 +1 x2730 +1 x2731 +1 x2732 +1 x2733 +1 x2734 +1 x2735 +1 x2736 +1 x2737 +1 x2738 +1 x2739 +1 x2740 +1 x2741 +1 x2742 +1 x2743 +1 x2744 +1 x2745 +1 x2746 +1 x2747 +1 x2748 +1 x2749 +1 x2750 +1 x2751 +1 x2752 +1 x2753 +1 x2754 +1 x2755 +1 x2756 +1 x2757 +1 x2758 +1 x2759 +1 x2760 +1 x2761 +1 x2762 +1 x2763 +1 x2764 +1 x2765 +1 x2766 +1 x2767 +1 x2768 +1 x2769 +1 x2770 +1 x2771 +1 x2772 +1 x2773 +1 x2774 +1 x2775 +1 x2776 +1 x2777 +1 x2778 +1 x2779 +1 x2780 +1 x2781 +1 x2782 +1 x2783 +1 x2784 +1 x2785 +1 x2786 +1 x2787 +1 x2788 +1 x2789 +1 x2790 +1 x2791 +1 x2792 +1 x2793 +1 x2794 +1 x2795 +1 x2796 +1 x2797 +1 x2798 +1 x2799 +1 x2800 +1 x2801 +1 x2802 +1 x2803 +1 x2804 +1 x2805 +1 x2806 +1 x2807 +1 x2808 +1 x2809 +1 x2810 +1 x2811 +1 x2812 +1 x2813 +1 x2814 +1 x2815 +1 x2816 +1 x2817 +1 x2818 +1 x2819 +1 x2820 +1 x2821 +1 x2822 +1 x2823 +1 x2824 +1 x2825 +1 x2826 +1 x2827 +1 x2828 +1 x2829 +1 x2830 +1 x2831 >= 1;++1 x2832 +1 x2833 +1 x2834 +1 x2835 +1 x2836 +1 x2837 +1 x2838 +1 x2839 +1 x2840 +1 x2841 +1 x2842 +1 x2843 +1 x2844 +1 x2845 +1 x2846 +1 x2847 +1 x2848 +1 x2849 +1 x2850 +1 x2851 +1 x2852 +1 x2853 +1 x2854 +1 x2855 +1 x2856 +1 x2857 +1 x2858 +1 x2859 +1 x2860 +1 x2861 +1 x2862 +1 x2863 +1 x2864 +1 x2865 +1 x2866 +1 x2867 +1 x2868 +1 x2869 +1 x2870 +1 x2871 +1 x2872 +1 x2873 +1 x2874 +1 x2875 +1 x2876 +1 x2877 +1 x2878 +1 x2879 +1 x2880 +1 x2881 +1 x2882 +1 x2883 +1 x2884 +1 x2885 +1 x2886 +1 x2887 +1 x2888 +1 x2889 +1 x2890 +1 x2891 +1 x2892 +1 x2893 +1 x2894 +1 x2895 +1 x2896 +1 x2897 +1 x2898 +1 x2899 +1 x2900 +1 x2901 +1 x2902 +1 x2903 +1 x2904 +1 x2905 +1 x2906 +1 x2907 +1 x2908 +1 x2909 +1 x2910 +1 x2911 +1 x2912 +1 x2913 +1 x2914 +1 x2915 +1 x2916 +1 x2917 +1 x2918 +1 x2919 +1 x2920 +1 x2921 +1 x2922 +1 x2923 +1 x2924 +1 x2925 +1 x2926 +1 x2927 +1 x2928 +1 x2929 +1 x2930 +1 x2931 +1 x2932 +1 x2933 +1 x2934 +1 x2935 +1 x2936 +1 x2937 +1 x2938 +1 x2939 +1 x2940 +1 x2941 +1 x2942 +1 x2943 +1 x2944 +1 x2945 +1 x2946 +1 x2947 +1 x2948 +1 x2949 +1 x2950 +1 x2951 +1 x2952 +1 x2953 +1 x2954 +1 x2955 +1 x2956 +1 x2957 +1 x2958 +1 x2959 +1 x2960 +1 x2961 +1 x2962 +1 x2963 +1 x2964 +1 x2965 +1 x2966 +1 x2967 +1 x2968 +1 x2969 +1 x2970 +1 x2971 +1 x2972 +1 x2973 +1 x2974 +1 x2975 +1 x2976 +1 x2977 +1 x2978 +1 x2979 +1 x2980 >= 1;++1 x2981 +1 x2982 +1 x2983 +1 x2984 +1 x2985 +1 x2986 +1 x2987 +1 x2988 +1 x2989 +1 x2990 +1 x2991 +1 x2992 +1 x2993 +1 x2994 +1 x2995 +1 x2996 +1 x2997 +1 x2998 +1 x2999 +1 x3000 +1 x3001 +1 x3002 +1 x3003 +1 x3004 +1 x3005 +1 x3006 +1 x3007 +1 x3008 +1 x3009 +1 x3010 +1 x3011 +1 x3012 +1 x3013 +1 x3014 +1 x3015 +1 x3016 +1 x3017 +1 x3018 +1 x3019 +1 x3020 +1 x3021 +1 x3022 +1 x3023 +1 x3024 +1 x3025 +1 x3026 +1 x3027 +1 x3028 +1 x3029 +1 x3030 +1 x3031 +1 x3032 +1 x3033 +1 x3034 +1 x3035 +1 x3036 +1 x3037 +1 x3038 +1 x3039 +1 x3040 +1 x3041 +1 x3042 +1 x3043 +1 x3044 +1 x3045 +1 x3046 +1 x3047 +1 x3048 +1 x3049 +1 x3050 +1 x3051 +1 x3052 +1 x3053 +1 x3054 +1 x3055 +1 x3056 +1 x3057 +1 x3058 +1 x3059 +1 x3060 +1 x3061 +1 x3062 +1 x3063 +1 x3064 +1 x3065 +1 x3066 +1 x3067 +1 x3068 +1 x3069 +1 x3070 +1 x3071 +1 x3072 +1 x3073 +1 x3074 +1 x3075 +1 x3076 +1 x3077 +1 x3078 +1 x3079 +1 x3080 +1 x3081 +1 x3082 +1 x3083 +1 x3084 +1 x3085 +1 x3086 +1 x3087 +1 x3088 +1 x3089 +1 x3090 +1 x3091 +1 x3092 +1 x3093 +1 x3094 +1 x3095 +1 x3096 +1 x3097 +1 x3098 +1 x3099 +1 x3100 +1 x3101 +1 x3102 +1 x3103 +1 x3104 +1 x3105 +1 x3106 +1 x3107 +1 x3108 +1 x3109 +1 x3110 +1 x3111 +1 x3112 +1 x3113 +1 x3114 +1 x3115 +1 x3116 +1 x3117 +1 x3118 +1 x3119 +1 x3120 +1 x3121 +1 x3122 +1 x3123 +1 x3124 +1 x3125 +1 x3126 +1 x3127 +1 x3128 +1 x3129 >= 1;++1 x3130 +1 x3131 +1 x3132 +1 x3133 +1 x3134 +1 x3135 +1 x3136 +1 x3137 +1 x3138 +1 x3139 +1 x3140 +1 x3141 +1 x3142 +1 x3143 +1 x3144 +1 x3145 +1 x3146 +1 x3147 +1 x3148 +1 x3149 +1 x3150 +1 x3151 +1 x3152 +1 x3153 +1 x3154 +1 x3155 +1 x3156 +1 x3157 +1 x3158 +1 x3159 +1 x3160 +1 x3161 +1 x3162 +1 x3163 +1 x3164 +1 x3165 +1 x3166 +1 x3167 +1 x3168 +1 x3169 +1 x3170 +1 x3171 +1 x3172 +1 x3173 +1 x3174 +1 x3175 +1 x3176 +1 x3177 +1 x3178 +1 x3179 +1 x3180 +1 x3181 +1 x3182 +1 x3183 +1 x3184 +1 x3185 +1 x3186 +1 x3187 +1 x3188 +1 x3189 +1 x3190 +1 x3191 +1 x3192 +1 x3193 +1 x3194 +1 x3195 +1 x3196 +1 x3197 +1 x3198 +1 x3199 +1 x3200 +1 x3201 +1 x3202 +1 x3203 +1 x3204 +1 x3205 +1 x3206 +1 x3207 +1 x3208 +1 x3209 +1 x3210 +1 x3211 +1 x3212 +1 x3213 +1 x3214 +1 x3215 +1 x3216 +1 x3217 +1 x3218 +1 x3219 +1 x3220 +1 x3221 +1 x3222 +1 x3223 +1 x3224 +1 x3225 +1 x3226 +1 x3227 +1 x3228 +1 x3229 +1 x3230 +1 x3231 +1 x3232 +1 x3233 +1 x3234 +1 x3235 +1 x3236 +1 x3237 +1 x3238 +1 x3239 +1 x3240 +1 x3241 +1 x3242 +1 x3243 +1 x3244 +1 x3245 +1 x3246 +1 x3247 +1 x3248 +1 x3249 +1 x3250 +1 x3251 +1 x3252 +1 x3253 +1 x3254 +1 x3255 +1 x3256 +1 x3257 +1 x3258 +1 x3259 +1 x3260 +1 x3261 +1 x3262 +1 x3263 +1 x3264 +1 x3265 +1 x3266 +1 x3267 +1 x3268 +1 x3269 +1 x3270 +1 x3271 +1 x3272 +1 x3273 +1 x3274 +1 x3275 +1 x3276 +1 x3277 +1 x3278 >= 1;++1 x3279 +1 x3280 +1 x3281 +1 x3282 +1 x3283 +1 x3284 +1 x3285 +1 x3286 +1 x3287 +1 x3288 +1 x3289 +1 x3290 +1 x3291 +1 x3292 +1 x3293 +1 x3294 +1 x3295 +1 x3296 +1 x3297 +1 x3298 +1 x3299 +1 x3300 +1 x3301 +1 x3302 +1 x3303 +1 x3304 +1 x3305 +1 x3306 +1 x3307 +1 x3308 +1 x3309 +1 x3310 +1 x3311 +1 x3312 +1 x3313 +1 x3314 +1 x3315 +1 x3316 +1 x3317 +1 x3318 +1 x3319 +1 x3320 +1 x3321 +1 x3322 +1 x3323 +1 x3324 +1 x3325 +1 x3326 +1 x3327 +1 x3328 +1 x3329 +1 x3330 +1 x3331 +1 x3332 +1 x3333 +1 x3334 +1 x3335 +1 x3336 +1 x3337 +1 x3338 +1 x3339 +1 x3340 +1 x3341 +1 x3342 +1 x3343 +1 x3344 +1 x3345 +1 x3346 +1 x3347 +1 x3348 +1 x3349 +1 x3350 +1 x3351 +1 x3352 +1 x3353 +1 x3354 +1 x3355 +1 x3356 +1 x3357 +1 x3358 +1 x3359 +1 x3360 +1 x3361 +1 x3362 +1 x3363 +1 x3364 +1 x3365 +1 x3366 +1 x3367 +1 x3368 +1 x3369 +1 x3370 +1 x3371 +1 x3372 +1 x3373 +1 x3374 +1 x3375 +1 x3376 +1 x3377 +1 x3378 +1 x3379 +1 x3380 +1 x3381 +1 x3382 +1 x3383 +1 x3384 +1 x3385 +1 x3386 +1 x3387 +1 x3388 +1 x3389 +1 x3390 +1 x3391 +1 x3392 +1 x3393 +1 x3394 +1 x3395 +1 x3396 +1 x3397 +1 x3398 +1 x3399 +1 x3400 +1 x3401 +1 x3402 +1 x3403 +1 x3404 +1 x3405 +1 x3406 +1 x3407 +1 x3408 +1 x3409 +1 x3410 +1 x3411 +1 x3412 +1 x3413 +1 x3414 +1 x3415 +1 x3416 +1 x3417 +1 x3418 +1 x3419 +1 x3420 +1 x3421 +1 x3422 +1 x3423 +1 x3424 +1 x3425 +1 x3426 +1 x3427 >= 1;++1 x3428 +1 x3429 +1 x3430 +1 x3431 +1 x3432 +1 x3433 +1 x3434 +1 x3435 +1 x3436 +1 x3437 +1 x3438 +1 x3439 +1 x3440 +1 x3441 +1 x3442 +1 x3443 +1 x3444 +1 x3445 +1 x3446 +1 x3447 +1 x3448 +1 x3449 +1 x3450 +1 x3451 +1 x3452 +1 x3453 +1 x3454 +1 x3455 +1 x3456 +1 x3457 +1 x3458 +1 x3459 +1 x3460 +1 x3461 +1 x3462 +1 x3463 +1 x3464 +1 x3465 +1 x3466 +1 x3467 +1 x3468 +1 x3469 +1 x3470 +1 x3471 +1 x3472 +1 x3473 +1 x3474 +1 x3475 +1 x3476 +1 x3477 +1 x3478 +1 x3479 +1 x3480 +1 x3481 +1 x3482 +1 x3483 +1 x3484 +1 x3485 +1 x3486 +1 x3487 +1 x3488 +1 x3489 +1 x3490 +1 x3491 +1 x3492 +1 x3493 +1 x3494 +1 x3495 +1 x3496 +1 x3497 +1 x3498 +1 x3499 +1 x3500 +1 x3501 +1 x3502 +1 x3503 +1 x3504 +1 x3505 +1 x3506 +1 x3507 +1 x3508 +1 x3509 +1 x3510 +1 x3511 +1 x3512 +1 x3513 +1 x3514 +1 x3515 +1 x3516 +1 x3517 +1 x3518 +1 x3519 +1 x3520 +1 x3521 +1 x3522 +1 x3523 +1 x3524 +1 x3525 +1 x3526 +1 x3527 +1 x3528 +1 x3529 +1 x3530 +1 x3531 +1 x3532 +1 x3533 +1 x3534 +1 x3535 +1 x3536 +1 x3537 +1 x3538 +1 x3539 +1 x3540 +1 x3541 +1 x3542 +1 x3543 +1 x3544 +1 x3545 +1 x3546 +1 x3547 +1 x3548 +1 x3549 +1 x3550 +1 x3551 +1 x3552 +1 x3553 +1 x3554 +1 x3555 +1 x3556 +1 x3557 +1 x3558 +1 x3559 +1 x3560 +1 x3561 +1 x3562 +1 x3563 +1 x3564 +1 x3565 +1 x3566 +1 x3567 +1 x3568 +1 x3569 +1 x3570 +1 x3571 +1 x3572 +1 x3573 +1 x3574 +1 x3575 +1 x3576 >= 1;++1 x3577 +1 x3578 +1 x3579 +1 x3580 +1 x3581 +1 x3582 +1 x3583 +1 x3584 +1 x3585 +1 x3586 +1 x3587 +1 x3588 +1 x3589 +1 x3590 +1 x3591 +1 x3592 +1 x3593 +1 x3594 +1 x3595 +1 x3596 +1 x3597 +1 x3598 +1 x3599 +1 x3600 +1 x3601 +1 x3602 +1 x3603 +1 x3604 +1 x3605 +1 x3606 +1 x3607 +1 x3608 +1 x3609 +1 x3610 +1 x3611 +1 x3612 +1 x3613 +1 x3614 +1 x3615 +1 x3616 +1 x3617 +1 x3618 +1 x3619 +1 x3620 +1 x3621 +1 x3622 +1 x3623 +1 x3624 +1 x3625 +1 x3626 +1 x3627 +1 x3628 +1 x3629 +1 x3630 +1 x3631 +1 x3632 +1 x3633 +1 x3634 +1 x3635 +1 x3636 +1 x3637 +1 x3638 +1 x3639 +1 x3640 +1 x3641 +1 x3642 +1 x3643 +1 x3644 +1 x3645 +1 x3646 +1 x3647 +1 x3648 +1 x3649 +1 x3650 +1 x3651 +1 x3652 +1 x3653 +1 x3654 +1 x3655 +1 x3656 +1 x3657 +1 x3658 +1 x3659 +1 x3660 +1 x3661 +1 x3662 +1 x3663 +1 x3664 +1 x3665 +1 x3666 +1 x3667 +1 x3668 +1 x3669 +1 x3670 +1 x3671 +1 x3672 +1 x3673 +1 x3674 +1 x3675 +1 x3676 +1 x3677 +1 x3678 +1 x3679 +1 x3680 +1 x3681 +1 x3682 +1 x3683 +1 x3684 +1 x3685 +1 x3686 +1 x3687 +1 x3688 +1 x3689 +1 x3690 +1 x3691 +1 x3692 +1 x3693 +1 x3694 +1 x3695 +1 x3696 +1 x3697 +1 x3698 +1 x3699 +1 x3700 +1 x3701 +1 x3702 +1 x3703 +1 x3704 +1 x3705 +1 x3706 +1 x3707 +1 x3708 +1 x3709 +1 x3710 +1 x3711 +1 x3712 +1 x3713 +1 x3714 +1 x3715 +1 x3716 +1 x3717 +1 x3718 +1 x3719 +1 x3720 +1 x3721 +1 x3722 +1 x3723 +1 x3724 +1 x3725 >= 1;++1 x3726 +1 x3727 +1 x3728 +1 x3729 +1 x3730 +1 x3731 +1 x3732 +1 x3733 +1 x3734 +1 x3735 +1 x3736 +1 x3737 +1 x3738 +1 x3739 +1 x3740 +1 x3741 +1 x3742 +1 x3743 +1 x3744 +1 x3745 +1 x3746 +1 x3747 +1 x3748 +1 x3749 +1 x3750 +1 x3751 +1 x3752 +1 x3753 +1 x3754 +1 x3755 +1 x3756 +1 x3757 +1 x3758 +1 x3759 +1 x3760 +1 x3761 +1 x3762 +1 x3763 +1 x3764 +1 x3765 +1 x3766 +1 x3767 +1 x3768 +1 x3769 +1 x3770 +1 x3771 +1 x3772 +1 x3773 +1 x3774 +1 x3775 +1 x3776 +1 x3777 +1 x3778 +1 x3779 +1 x3780 +1 x3781 +1 x3782 +1 x3783 +1 x3784 +1 x3785 +1 x3786 +1 x3787 +1 x3788 +1 x3789 +1 x3790 +1 x3791 +1 x3792 +1 x3793 +1 x3794 +1 x3795 +1 x3796 +1 x3797 +1 x3798 +1 x3799 +1 x3800 +1 x3801 +1 x3802 +1 x3803 +1 x3804 +1 x3805 +1 x3806 +1 x3807 +1 x3808 +1 x3809 +1 x3810 +1 x3811 +1 x3812 +1 x3813 +1 x3814 +1 x3815 +1 x3816 +1 x3817 +1 x3818 +1 x3819 +1 x3820 +1 x3821 +1 x3822 +1 x3823 +1 x3824 +1 x3825 +1 x3826 +1 x3827 +1 x3828 +1 x3829 +1 x3830 +1 x3831 +1 x3832 +1 x3833 +1 x3834 +1 x3835 +1 x3836 +1 x3837 +1 x3838 +1 x3839 +1 x3840 +1 x3841 +1 x3842 +1 x3843 +1 x3844 +1 x3845 +1 x3846 +1 x3847 +1 x3848 +1 x3849 +1 x3850 +1 x3851 +1 x3852 +1 x3853 +1 x3854 +1 x3855 +1 x3856 +1 x3857 +1 x3858 +1 x3859 +1 x3860 +1 x3861 +1 x3862 +1 x3863 +1 x3864 +1 x3865 +1 x3866 +1 x3867 +1 x3868 +1 x3869 +1 x3870 +1 x3871 +1 x3872 +1 x3873 +1 x3874 >= 1;++1 x3875 +1 x3876 +1 x3877 +1 x3878 +1 x3879 +1 x3880 +1 x3881 +1 x3882 +1 x3883 +1 x3884 +1 x3885 +1 x3886 +1 x3887 +1 x3888 +1 x3889 +1 x3890 +1 x3891 +1 x3892 +1 x3893 +1 x3894 +1 x3895 +1 x3896 +1 x3897 +1 x3898 +1 x3899 +1 x3900 +1 x3901 +1 x3902 +1 x3903 +1 x3904 +1 x3905 +1 x3906 +1 x3907 +1 x3908 +1 x3909 +1 x3910 +1 x3911 +1 x3912 +1 x3913 +1 x3914 +1 x3915 +1 x3916 +1 x3917 +1 x3918 +1 x3919 +1 x3920 +1 x3921 +1 x3922 +1 x3923 +1 x3924 +1 x3925 +1 x3926 +1 x3927 +1 x3928 +1 x3929 +1 x3930 +1 x3931 +1 x3932 +1 x3933 +1 x3934 +1 x3935 +1 x3936 +1 x3937 +1 x3938 +1 x3939 +1 x3940 +1 x3941 +1 x3942 +1 x3943 +1 x3944 +1 x3945 +1 x3946 +1 x3947 +1 x3948 +1 x3949 +1 x3950 +1 x3951 +1 x3952 +1 x3953 +1 x3954 +1 x3955 +1 x3956 +1 x3957 +1 x3958 +1 x3959 +1 x3960 +1 x3961 +1 x3962 +1 x3963 +1 x3964 +1 x3965 +1 x3966 +1 x3967 +1 x3968 +1 x3969 +1 x3970 +1 x3971 +1 x3972 +1 x3973 +1 x3974 +1 x3975 +1 x3976 +1 x3977 +1 x3978 +1 x3979 +1 x3980 +1 x3981 +1 x3982 +1 x3983 +1 x3984 +1 x3985 +1 x3986 +1 x3987 +1 x3988 +1 x3989 +1 x3990 +1 x3991 +1 x3992 +1 x3993 +1 x3994 +1 x3995 +1 x3996 +1 x3997 +1 x3998 +1 x3999 +1 x4000 +1 x4001 +1 x4002 +1 x4003 +1 x4004 +1 x4005 +1 x4006 +1 x4007 +1 x4008 +1 x4009 +1 x4010 +1 x4011 +1 x4012 +1 x4013 +1 x4014 +1 x4015 +1 x4016 +1 x4017 +1 x4018 +1 x4019 +1 x4020 +1 x4021 +1 x4022 +1 x4023 >= 1;++1 x4024 +1 x4025 +1 x4026 +1 x4027 +1 x4028 +1 x4029 +1 x4030 +1 x4031 +1 x4032 +1 x4033 +1 x4034 +1 x4035 +1 x4036 +1 x4037 +1 x4038 +1 x4039 +1 x4040 +1 x4041 +1 x4042 +1 x4043 +1 x4044 +1 x4045 +1 x4046 +1 x4047 +1 x4048 +1 x4049 +1 x4050 +1 x4051 +1 x4052 +1 x4053 +1 x4054 +1 x4055 +1 x4056 +1 x4057 +1 x4058 +1 x4059 +1 x4060 +1 x4061 +1 x4062 +1 x4063 +1 x4064 +1 x4065 +1 x4066 +1 x4067 +1 x4068 +1 x4069 +1 x4070 +1 x4071 +1 x4072 +1 x4073 +1 x4074 +1 x4075 +1 x4076 +1 x4077 +1 x4078 +1 x4079 +1 x4080 +1 x4081 +1 x4082 +1 x4083 +1 x4084 +1 x4085 +1 x4086 +1 x4087 +1 x4088 +1 x4089 +1 x4090 +1 x4091 +1 x4092 +1 x4093 +1 x4094 +1 x4095 +1 x4096 +1 x4097 +1 x4098 +1 x4099 +1 x4100 +1 x4101 +1 x4102 +1 x4103 +1 x4104 +1 x4105 +1 x4106 +1 x4107 +1 x4108 +1 x4109 +1 x4110 +1 x4111 +1 x4112 +1 x4113 +1 x4114 +1 x4115 +1 x4116 +1 x4117 +1 x4118 +1 x4119 +1 x4120 +1 x4121 +1 x4122 +1 x4123 +1 x4124 +1 x4125 +1 x4126 +1 x4127 +1 x4128 +1 x4129 +1 x4130 +1 x4131 +1 x4132 +1 x4133 +1 x4134 +1 x4135 +1 x4136 +1 x4137 +1 x4138 +1 x4139 +1 x4140 +1 x4141 +1 x4142 +1 x4143 +1 x4144 +1 x4145 +1 x4146 +1 x4147 +1 x4148 +1 x4149 +1 x4150 +1 x4151 +1 x4152 +1 x4153 +1 x4154 +1 x4155 +1 x4156 +1 x4157 +1 x4158 +1 x4159 +1 x4160 +1 x4161 +1 x4162 +1 x4163 +1 x4164 +1 x4165 +1 x4166 +1 x4167 +1 x4168 +1 x4169 +1 x4170 +1 x4171 +1 x4172 >= 1;++1 x4173 +1 x4174 +1 x4175 +1 x4176 +1 x4177 +1 x4178 +1 x4179 +1 x4180 +1 x4181 +1 x4182 +1 x4183 +1 x4184 +1 x4185 +1 x4186 +1 x4187 +1 x4188 +1 x4189 +1 x4190 +1 x4191 +1 x4192 +1 x4193 +1 x4194 +1 x4195 +1 x4196 +1 x4197 +1 x4198 +1 x4199 +1 x4200 +1 x4201 +1 x4202 +1 x4203 +1 x4204 +1 x4205 +1 x4206 +1 x4207 +1 x4208 +1 x4209 +1 x4210 +1 x4211 +1 x4212 +1 x4213 +1 x4214 +1 x4215 +1 x4216 +1 x4217 +1 x4218 +1 x4219 +1 x4220 +1 x4221 +1 x4222 +1 x4223 +1 x4224 +1 x4225 +1 x4226 +1 x4227 +1 x4228 +1 x4229 +1 x4230 +1 x4231 +1 x4232 +1 x4233 +1 x4234 +1 x4235 +1 x4236 +1 x4237 +1 x4238 +1 x4239 +1 x4240 +1 x4241 +1 x4242 +1 x4243 +1 x4244 +1 x4245 +1 x4246 +1 x4247 +1 x4248 +1 x4249 +1 x4250 +1 x4251 +1 x4252 +1 x4253 +1 x4254 +1 x4255 +1 x4256 +1 x4257 +1 x4258 +1 x4259 +1 x4260 +1 x4261 +1 x4262 +1 x4263 +1 x4264 +1 x4265 +1 x4266 +1 x4267 +1 x4268 +1 x4269 +1 x4270 +1 x4271 +1 x4272 +1 x4273 +1 x4274 +1 x4275 +1 x4276 +1 x4277 +1 x4278 +1 x4279 +1 x4280 +1 x4281 +1 x4282 +1 x4283 +1 x4284 +1 x4285 +1 x4286 +1 x4287 +1 x4288 +1 x4289 +1 x4290 +1 x4291 +1 x4292 +1 x4293 +1 x4294 +1 x4295 +1 x4296 +1 x4297 +1 x4298 +1 x4299 +1 x4300 +1 x4301 +1 x4302 +1 x4303 +1 x4304 +1 x4305 +1 x4306 +1 x4307 +1 x4308 +1 x4309 +1 x4310 +1 x4311 +1 x4312 +1 x4313 +1 x4314 +1 x4315 +1 x4316 +1 x4317 +1 x4318 +1 x4319 +1 x4320 +1 x4321 >= 1;++1 x4322 +1 x4323 +1 x4324 +1 x4325 +1 x4326 +1 x4327 +1 x4328 +1 x4329 +1 x4330 +1 x4331 +1 x4332 +1 x4333 +1 x4334 +1 x4335 +1 x4336 +1 x4337 +1 x4338 +1 x4339 +1 x4340 +1 x4341 +1 x4342 +1 x4343 +1 x4344 +1 x4345 +1 x4346 +1 x4347 +1 x4348 +1 x4349 +1 x4350 +1 x4351 +1 x4352 +1 x4353 +1 x4354 +1 x4355 +1 x4356 +1 x4357 +1 x4358 +1 x4359 +1 x4360 +1 x4361 +1 x4362 +1 x4363 +1 x4364 +1 x4365 +1 x4366 +1 x4367 +1 x4368 +1 x4369 +1 x4370 +1 x4371 +1 x4372 +1 x4373 +1 x4374 +1 x4375 +1 x4376 +1 x4377 +1 x4378 +1 x4379 +1 x4380 +1 x4381 +1 x4382 +1 x4383 +1 x4384 +1 x4385 +1 x4386 +1 x4387 +1 x4388 +1 x4389 +1 x4390 +1 x4391 +1 x4392 +1 x4393 +1 x4394 +1 x4395 +1 x4396 +1 x4397 +1 x4398 +1 x4399 +1 x4400 +1 x4401 +1 x4402 +1 x4403 +1 x4404 +1 x4405 +1 x4406 +1 x4407 +1 x4408 +1 x4409 +1 x4410 +1 x4411 +1 x4412 +1 x4413 +1 x4414 +1 x4415 +1 x4416 +1 x4417 +1 x4418 +1 x4419 +1 x4420 +1 x4421 +1 x4422 +1 x4423 +1 x4424 +1 x4425 +1 x4426 +1 x4427 +1 x4428 +1 x4429 +1 x4430 +1 x4431 +1 x4432 +1 x4433 +1 x4434 +1 x4435 +1 x4436 +1 x4437 +1 x4438 +1 x4439 +1 x4440 +1 x4441 +1 x4442 +1 x4443 +1 x4444 +1 x4445 +1 x4446 +1 x4447 +1 x4448 +1 x4449 +1 x4450 +1 x4451 +1 x4452 +1 x4453 +1 x4454 +1 x4455 +1 x4456 +1 x4457 +1 x4458 +1 x4459 +1 x4460 +1 x4461 +1 x4462 +1 x4463 +1 x4464 +1 x4465 +1 x4466 +1 x4467 +1 x4468 +1 x4469 +1 x4470 >= 1;++1 x4471 +1 x4472 +1 x4473 +1 x4474 +1 x4475 +1 x4476 +1 x4477 +1 x4478 +1 x4479 +1 x4480 +1 x4481 +1 x4482 +1 x4483 +1 x4484 +1 x4485 +1 x4486 +1 x4487 +1 x4488 +1 x4489 +1 x4490 +1 x4491 +1 x4492 +1 x4493 +1 x4494 +1 x4495 +1 x4496 +1 x4497 +1 x4498 +1 x4499 +1 x4500 +1 x4501 +1 x4502 +1 x4503 +1 x4504 +1 x4505 +1 x4506 +1 x4507 +1 x4508 +1 x4509 +1 x4510 +1 x4511 +1 x4512 +1 x4513 +1 x4514 +1 x4515 +1 x4516 +1 x4517 +1 x4518 +1 x4519 +1 x4520 +1 x4521 +1 x4522 +1 x4523 +1 x4524 +1 x4525 +1 x4526 +1 x4527 +1 x4528 +1 x4529 +1 x4530 +1 x4531 +1 x4532 +1 x4533 +1 x4534 +1 x4535 +1 x4536 +1 x4537 +1 x4538 +1 x4539 +1 x4540 +1 x4541 +1 x4542 +1 x4543 +1 x4544 +1 x4545 +1 x4546 +1 x4547 +1 x4548 +1 x4549 +1 x4550 +1 x4551 +1 x4552 +1 x4553 +1 x4554 +1 x4555 +1 x4556 +1 x4557 +1 x4558 +1 x4559 +1 x4560 +1 x4561 +1 x4562 +1 x4563 +1 x4564 +1 x4565 +1 x4566 +1 x4567 +1 x4568 +1 x4569 +1 x4570 +1 x4571 +1 x4572 +1 x4573 +1 x4574 +1 x4575 +1 x4576 +1 x4577 +1 x4578 +1 x4579 +1 x4580 +1 x4581 +1 x4582 +1 x4583 +1 x4584 +1 x4585 +1 x4586 +1 x4587 +1 x4588 +1 x4589 +1 x4590 +1 x4591 +1 x4592 +1 x4593 +1 x4594 +1 x4595 +1 x4596 +1 x4597 +1 x4598 +1 x4599 +1 x4600 +1 x4601 +1 x4602 +1 x4603 +1 x4604 +1 x4605 +1 x4606 +1 x4607 +1 x4608 +1 x4609 +1 x4610 +1 x4611 +1 x4612 +1 x4613 +1 x4614 +1 x4615 +1 x4616 +1 x4617 +1 x4618 +1 x4619 >= 1;++1 x4620 +1 x4621 +1 x4622 +1 x4623 +1 x4624 +1 x4625 +1 x4626 +1 x4627 +1 x4628 +1 x4629 +1 x4630 +1 x4631 +1 x4632 +1 x4633 +1 x4634 +1 x4635 +1 x4636 +1 x4637 +1 x4638 +1 x4639 +1 x4640 +1 x4641 +1 x4642 +1 x4643 +1 x4644 +1 x4645 +1 x4646 +1 x4647 +1 x4648 +1 x4649 +1 x4650 +1 x4651 +1 x4652 +1 x4653 +1 x4654 +1 x4655 +1 x4656 +1 x4657 +1 x4658 +1 x4659 +1 x4660 +1 x4661 +1 x4662 +1 x4663 +1 x4664 +1 x4665 +1 x4666 +1 x4667 +1 x4668 +1 x4669 +1 x4670 +1 x4671 +1 x4672 +1 x4673 +1 x4674 +1 x4675 +1 x4676 +1 x4677 +1 x4678 +1 x4679 +1 x4680 +1 x4681 +1 x4682 +1 x4683 +1 x4684 +1 x4685 +1 x4686 +1 x4687 +1 x4688 +1 x4689 +1 x4690 +1 x4691 +1 x4692 +1 x4693 +1 x4694 +1 x4695 +1 x4696 +1 x4697 +1 x4698 +1 x4699 +1 x4700 +1 x4701 +1 x4702 +1 x4703 +1 x4704 +1 x4705 +1 x4706 +1 x4707 +1 x4708 +1 x4709 +1 x4710 +1 x4711 +1 x4712 +1 x4713 +1 x4714 +1 x4715 +1 x4716 +1 x4717 +1 x4718 +1 x4719 +1 x4720 +1 x4721 +1 x4722 +1 x4723 +1 x4724 +1 x4725 +1 x4726 +1 x4727 +1 x4728 +1 x4729 +1 x4730 +1 x4731 +1 x4732 +1 x4733 +1 x4734 +1 x4735 +1 x4736 +1 x4737 +1 x4738 +1 x4739 +1 x4740 +1 x4741 +1 x4742 +1 x4743 +1 x4744 +1 x4745 +1 x4746 +1 x4747 +1 x4748 +1 x4749 +1 x4750 +1 x4751 +1 x4752 +1 x4753 +1 x4754 +1 x4755 +1 x4756 +1 x4757 +1 x4758 +1 x4759 +1 x4760 +1 x4761 +1 x4762 +1 x4763 +1 x4764 +1 x4765 +1 x4766 +1 x4767 +1 x4768 >= 1;++1 x4769 +1 x4770 +1 x4771 +1 x4772 +1 x4773 +1 x4774 +1 x4775 +1 x4776 +1 x4777 +1 x4778 +1 x4779 +1 x4780 +1 x4781 +1 x4782 +1 x4783 +1 x4784 +1 x4785 +1 x4786 +1 x4787 +1 x4788 +1 x4789 +1 x4790 +1 x4791 +1 x4792 +1 x4793 +1 x4794 +1 x4795 +1 x4796 +1 x4797 +1 x4798 +1 x4799 +1 x4800 +1 x4801 +1 x4802 +1 x4803 +1 x4804 +1 x4805 +1 x4806 +1 x4807 +1 x4808 +1 x4809 +1 x4810 +1 x4811 +1 x4812 +1 x4813 +1 x4814 +1 x4815 +1 x4816 +1 x4817 +1 x4818 +1 x4819 +1 x4820 +1 x4821 +1 x4822 +1 x4823 +1 x4824 +1 x4825 +1 x4826 +1 x4827 +1 x4828 +1 x4829 +1 x4830 +1 x4831 +1 x4832 +1 x4833 +1 x4834 +1 x4835 +1 x4836 +1 x4837 +1 x4838 +1 x4839 +1 x4840 +1 x4841 +1 x4842 +1 x4843 +1 x4844 +1 x4845 +1 x4846 +1 x4847 +1 x4848 +1 x4849 +1 x4850 +1 x4851 +1 x4852 +1 x4853 +1 x4854 +1 x4855 +1 x4856 +1 x4857 +1 x4858 +1 x4859 +1 x4860 +1 x4861 +1 x4862 +1 x4863 +1 x4864 +1 x4865 +1 x4866 +1 x4867 +1 x4868 +1 x4869 +1 x4870 +1 x4871 +1 x4872 +1 x4873 +1 x4874 +1 x4875 +1 x4876 +1 x4877 +1 x4878 +1 x4879 +1 x4880 +1 x4881 +1 x4882 +1 x4883 +1 x4884 +1 x4885 +1 x4886 +1 x4887 +1 x4888 +1 x4889 +1 x4890 +1 x4891 +1 x4892 +1 x4893 +1 x4894 +1 x4895 +1 x4896 +1 x4897 +1 x4898 +1 x4899 +1 x4900 +1 x4901 +1 x4902 +1 x4903 +1 x4904 +1 x4905 +1 x4906 +1 x4907 +1 x4908 +1 x4909 +1 x4910 +1 x4911 +1 x4912 +1 x4913 +1 x4914 +1 x4915 +1 x4916 +1 x4917 >= 1;++1 x4918 +1 x4919 +1 x4920 +1 x4921 +1 x4922 +1 x4923 +1 x4924 +1 x4925 +1 x4926 +1 x4927 +1 x4928 +1 x4929 +1 x4930 +1 x4931 +1 x4932 +1 x4933 +1 x4934 +1 x4935 +1 x4936 +1 x4937 +1 x4938 +1 x4939 +1 x4940 +1 x4941 +1 x4942 +1 x4943 +1 x4944 +1 x4945 +1 x4946 +1 x4947 +1 x4948 +1 x4949 +1 x4950 +1 x4951 +1 x4952 +1 x4953 +1 x4954 +1 x4955 +1 x4956 +1 x4957 +1 x4958 +1 x4959 +1 x4960 +1 x4961 +1 x4962 +1 x4963 +1 x4964 +1 x4965 +1 x4966 +1 x4967 +1 x4968 +1 x4969 +1 x4970 +1 x4971 +1 x4972 +1 x4973 +1 x4974 +1 x4975 +1 x4976 +1 x4977 +1 x4978 +1 x4979 +1 x4980 +1 x4981 +1 x4982 +1 x4983 +1 x4984 +1 x4985 +1 x4986 +1 x4987 +1 x4988 +1 x4989 +1 x4990 +1 x4991 +1 x4992 +1 x4993 +1 x4994 +1 x4995 +1 x4996 +1 x4997 +1 x4998 +1 x4999 +1 x5000 +1 x5001 +1 x5002 +1 x5003 +1 x5004 +1 x5005 +1 x5006 +1 x5007 +1 x5008 +1 x5009 +1 x5010 +1 x5011 +1 x5012 +1 x5013 +1 x5014 +1 x5015 +1 x5016 +1 x5017 +1 x5018 +1 x5019 +1 x5020 +1 x5021 +1 x5022 +1 x5023 +1 x5024 +1 x5025 +1 x5026 +1 x5027 +1 x5028 +1 x5029 +1 x5030 +1 x5031 +1 x5032 +1 x5033 +1 x5034 +1 x5035 +1 x5036 +1 x5037 +1 x5038 +1 x5039 +1 x5040 +1 x5041 +1 x5042 +1 x5043 +1 x5044 +1 x5045 +1 x5046 +1 x5047 +1 x5048 +1 x5049 +1 x5050 +1 x5051 +1 x5052 +1 x5053 +1 x5054 +1 x5055 +1 x5056 +1 x5057 +1 x5058 +1 x5059 +1 x5060 +1 x5061 +1 x5062 +1 x5063 +1 x5064 +1 x5065 +1 x5066 >= 1;++1 x5067 +1 x5068 +1 x5069 +1 x5070 +1 x5071 +1 x5072 +1 x5073 +1 x5074 +1 x5075 +1 x5076 +1 x5077 +1 x5078 +1 x5079 +1 x5080 +1 x5081 +1 x5082 +1 x5083 +1 x5084 +1 x5085 +1 x5086 +1 x5087 +1 x5088 +1 x5089 +1 x5090 +1 x5091 +1 x5092 +1 x5093 +1 x5094 +1 x5095 +1 x5096 +1 x5097 +1 x5098 +1 x5099 +1 x5100 +1 x5101 +1 x5102 +1 x5103 +1 x5104 +1 x5105 +1 x5106 +1 x5107 +1 x5108 +1 x5109 +1 x5110 +1 x5111 +1 x5112 +1 x5113 +1 x5114 +1 x5115 +1 x5116 +1 x5117 +1 x5118 +1 x5119 +1 x5120 +1 x5121 +1 x5122 +1 x5123 +1 x5124 +1 x5125 +1 x5126 +1 x5127 +1 x5128 +1 x5129 +1 x5130 +1 x5131 +1 x5132 +1 x5133 +1 x5134 +1 x5135 +1 x5136 +1 x5137 +1 x5138 +1 x5139 +1 x5140 +1 x5141 +1 x5142 +1 x5143 +1 x5144 +1 x5145 +1 x5146 +1 x5147 +1 x5148 +1 x5149 +1 x5150 +1 x5151 +1 x5152 +1 x5153 +1 x5154 +1 x5155 +1 x5156 +1 x5157 +1 x5158 +1 x5159 +1 x5160 +1 x5161 +1 x5162 +1 x5163 +1 x5164 +1 x5165 +1 x5166 +1 x5167 +1 x5168 +1 x5169 +1 x5170 +1 x5171 +1 x5172 +1 x5173 +1 x5174 +1 x5175 +1 x5176 +1 x5177 +1 x5178 +1 x5179 +1 x5180 +1 x5181 +1 x5182 +1 x5183 +1 x5184 +1 x5185 +1 x5186 +1 x5187 +1 x5188 +1 x5189 +1 x5190 +1 x5191 +1 x5192 +1 x5193 +1 x5194 +1 x5195 +1 x5196 +1 x5197 +1 x5198 +1 x5199 +1 x5200 +1 x5201 +1 x5202 +1 x5203 +1 x5204 +1 x5205 +1 x5206 +1 x5207 +1 x5208 +1 x5209 +1 x5210 +1 x5211 +1 x5212 +1 x5213 +1 x5214 +1 x5215 >= 1;++1 x5216 +1 x5217 +1 x5218 +1 x5219 +1 x5220 +1 x5221 +1 x5222 +1 x5223 +1 x5224 +1 x5225 +1 x5226 +1 x5227 +1 x5228 +1 x5229 +1 x5230 +1 x5231 +1 x5232 +1 x5233 +1 x5234 +1 x5235 +1 x5236 +1 x5237 +1 x5238 +1 x5239 +1 x5240 +1 x5241 +1 x5242 +1 x5243 +1 x5244 +1 x5245 +1 x5246 +1 x5247 +1 x5248 +1 x5249 +1 x5250 +1 x5251 +1 x5252 +1 x5253 +1 x5254 +1 x5255 +1 x5256 +1 x5257 +1 x5258 +1 x5259 +1 x5260 +1 x5261 +1 x5262 +1 x5263 +1 x5264 +1 x5265 +1 x5266 +1 x5267 +1 x5268 +1 x5269 +1 x5270 +1 x5271 +1 x5272 +1 x5273 +1 x5274 +1 x5275 +1 x5276 +1 x5277 +1 x5278 +1 x5279 +1 x5280 +1 x5281 +1 x5282 +1 x5283 +1 x5284 +1 x5285 +1 x5286 +1 x5287 +1 x5288 +1 x5289 +1 x5290 +1 x5291 +1 x5292 +1 x5293 +1 x5294 +1 x5295 +1 x5296 +1 x5297 +1 x5298 +1 x5299 +1 x5300 +1 x5301 +1 x5302 +1 x5303 +1 x5304 +1 x5305 +1 x5306 +1 x5307 +1 x5308 +1 x5309 +1 x5310 +1 x5311 +1 x5312 +1 x5313 +1 x5314 +1 x5315 +1 x5316 +1 x5317 +1 x5318 +1 x5319 +1 x5320 +1 x5321 +1 x5322 +1 x5323 +1 x5324 +1 x5325 +1 x5326 +1 x5327 +1 x5328 +1 x5329 +1 x5330 +1 x5331 +1 x5332 +1 x5333 +1 x5334 +1 x5335 +1 x5336 +1 x5337 +1 x5338 +1 x5339 +1 x5340 +1 x5341 +1 x5342 +1 x5343 +1 x5344 +1 x5345 +1 x5346 +1 x5347 +1 x5348 +1 x5349 +1 x5350 +1 x5351 +1 x5352 +1 x5353 +1 x5354 +1 x5355 +1 x5356 +1 x5357 +1 x5358 +1 x5359 +1 x5360 +1 x5361 +1 x5362 +1 x5363 +1 x5364 >= 1;++1 x5365 +1 x5366 +1 x5367 +1 x5368 +1 x5369 +1 x5370 +1 x5371 +1 x5372 +1 x5373 +1 x5374 +1 x5375 +1 x5376 +1 x5377 +1 x5378 +1 x5379 +1 x5380 +1 x5381 +1 x5382 +1 x5383 +1 x5384 +1 x5385 +1 x5386 +1 x5387 +1 x5388 +1 x5389 +1 x5390 +1 x5391 +1 x5392 +1 x5393 +1 x5394 +1 x5395 +1 x5396 +1 x5397 +1 x5398 +1 x5399 +1 x5400 +1 x5401 +1 x5402 +1 x5403 +1 x5404 +1 x5405 +1 x5406 +1 x5407 +1 x5408 +1 x5409 +1 x5410 +1 x5411 +1 x5412 +1 x5413 +1 x5414 +1 x5415 +1 x5416 +1 x5417 +1 x5418 +1 x5419 +1 x5420 +1 x5421 +1 x5422 +1 x5423 +1 x5424 +1 x5425 +1 x5426 +1 x5427 +1 x5428 +1 x5429 +1 x5430 +1 x5431 +1 x5432 +1 x5433 +1 x5434 +1 x5435 +1 x5436 +1 x5437 +1 x5438 +1 x5439 +1 x5440 +1 x5441 +1 x5442 +1 x5443 +1 x5444 +1 x5445 +1 x5446 +1 x5447 +1 x5448 +1 x5449 +1 x5450 +1 x5451 +1 x5452 +1 x5453 +1 x5454 +1 x5455 +1 x5456 +1 x5457 +1 x5458 +1 x5459 +1 x5460 +1 x5461 +1 x5462 +1 x5463 +1 x5464 +1 x5465 +1 x5466 +1 x5467 +1 x5468 +1 x5469 +1 x5470 +1 x5471 +1 x5472 +1 x5473 +1 x5474 +1 x5475 +1 x5476 +1 x5477 +1 x5478 +1 x5479 +1 x5480 +1 x5481 +1 x5482 +1 x5483 +1 x5484 +1 x5485 +1 x5486 +1 x5487 +1 x5488 +1 x5489 +1 x5490 +1 x5491 +1 x5492 +1 x5493 +1 x5494 +1 x5495 +1 x5496 +1 x5497 +1 x5498 +1 x5499 +1 x5500 +1 x5501 +1 x5502 +1 x5503 +1 x5504 +1 x5505 +1 x5506 +1 x5507 +1 x5508 +1 x5509 +1 x5510 +1 x5511 +1 x5512 +1 x5513 >= 1;++1 x5514 +1 x5515 +1 x5516 +1 x5517 +1 x5518 +1 x5519 +1 x5520 +1 x5521 +1 x5522 +1 x5523 +1 x5524 +1 x5525 +1 x5526 +1 x5527 +1 x5528 +1 x5529 +1 x5530 +1 x5531 +1 x5532 +1 x5533 +1 x5534 +1 x5535 +1 x5536 +1 x5537 +1 x5538 +1 x5539 +1 x5540 +1 x5541 +1 x5542 +1 x5543 +1 x5544 +1 x5545 +1 x5546 +1 x5547 +1 x5548 +1 x5549 +1 x5550 +1 x5551 +1 x5552 +1 x5553 +1 x5554 +1 x5555 +1 x5556 +1 x5557 +1 x5558 +1 x5559 +1 x5560 +1 x5561 +1 x5562 +1 x5563 +1 x5564 +1 x5565 +1 x5566 +1 x5567 +1 x5568 +1 x5569 +1 x5570 +1 x5571 +1 x5572 +1 x5573 +1 x5574 +1 x5575 +1 x5576 +1 x5577 +1 x5578 +1 x5579 +1 x5580 +1 x5581 +1 x5582 +1 x5583 +1 x5584 +1 x5585 +1 x5586 +1 x5587 +1 x5588 +1 x5589 +1 x5590 +1 x5591 +1 x5592 +1 x5593 +1 x5594 +1 x5595 +1 x5596 +1 x5597 +1 x5598 +1 x5599 +1 x5600 +1 x5601 +1 x5602 +1 x5603 +1 x5604 +1 x5605 +1 x5606 +1 x5607 +1 x5608 +1 x5609 +1 x5610 +1 x5611 +1 x5612 +1 x5613 +1 x5614 +1 x5615 +1 x5616 +1 x5617 +1 x5618 +1 x5619 +1 x5620 +1 x5621 +1 x5622 +1 x5623 +1 x5624 +1 x5625 +1 x5626 +1 x5627 +1 x5628 +1 x5629 +1 x5630 +1 x5631 +1 x5632 +1 x5633 +1 x5634 +1 x5635 +1 x5636 +1 x5637 +1 x5638 +1 x5639 +1 x5640 +1 x5641 +1 x5642 +1 x5643 +1 x5644 +1 x5645 +1 x5646 +1 x5647 +1 x5648 +1 x5649 +1 x5650 +1 x5651 +1 x5652 +1 x5653 +1 x5654 +1 x5655 +1 x5656 +1 x5657 +1 x5658 +1 x5659 +1 x5660 +1 x5661 +1 x5662 >= 1;++1 x5663 +1 x5664 +1 x5665 +1 x5666 +1 x5667 +1 x5668 +1 x5669 +1 x5670 +1 x5671 +1 x5672 +1 x5673 +1 x5674 +1 x5675 +1 x5676 +1 x5677 +1 x5678 +1 x5679 +1 x5680 +1 x5681 +1 x5682 +1 x5683 +1 x5684 +1 x5685 +1 x5686 +1 x5687 +1 x5688 +1 x5689 +1 x5690 +1 x5691 +1 x5692 +1 x5693 +1 x5694 +1 x5695 +1 x5696 +1 x5697 +1 x5698 +1 x5699 +1 x5700 +1 x5701 +1 x5702 +1 x5703 +1 x5704 +1 x5705 +1 x5706 +1 x5707 +1 x5708 +1 x5709 +1 x5710 +1 x5711 +1 x5712 +1 x5713 +1 x5714 +1 x5715 +1 x5716 +1 x5717 +1 x5718 +1 x5719 +1 x5720 +1 x5721 +1 x5722 +1 x5723 +1 x5724 +1 x5725 +1 x5726 +1 x5727 +1 x5728 +1 x5729 +1 x5730 +1 x5731 +1 x5732 +1 x5733 +1 x5734 +1 x5735 +1 x5736 +1 x5737 +1 x5738 +1 x5739 +1 x5740 +1 x5741 +1 x5742 +1 x5743 +1 x5744 +1 x5745 +1 x5746 +1 x5747 +1 x5748 +1 x5749 +1 x5750 +1 x5751 +1 x5752 +1 x5753 +1 x5754 +1 x5755 +1 x5756 +1 x5757 +1 x5758 +1 x5759 +1 x5760 +1 x5761 +1 x5762 +1 x5763 +1 x5764 +1 x5765 +1 x5766 +1 x5767 +1 x5768 +1 x5769 +1 x5770 +1 x5771 +1 x5772 +1 x5773 +1 x5774 +1 x5775 +1 x5776 +1 x5777 +1 x5778 +1 x5779 +1 x5780 +1 x5781 +1 x5782 +1 x5783 +1 x5784 +1 x5785 +1 x5786 +1 x5787 +1 x5788 +1 x5789 +1 x5790 +1 x5791 +1 x5792 +1 x5793 +1 x5794 +1 x5795 +1 x5796 +1 x5797 +1 x5798 +1 x5799 +1 x5800 +1 x5801 +1 x5802 +1 x5803 +1 x5804 +1 x5805 +1 x5806 +1 x5807 +1 x5808 +1 x5809 +1 x5810 +1 x5811 >= 1;++1 x5812 +1 x5813 +1 x5814 +1 x5815 +1 x5816 +1 x5817 +1 x5818 +1 x5819 +1 x5820 +1 x5821 +1 x5822 +1 x5823 +1 x5824 +1 x5825 +1 x5826 +1 x5827 +1 x5828 +1 x5829 +1 x5830 +1 x5831 +1 x5832 +1 x5833 +1 x5834 +1 x5835 +1 x5836 +1 x5837 +1 x5838 +1 x5839 +1 x5840 +1 x5841 +1 x5842 +1 x5843 +1 x5844 +1 x5845 +1 x5846 +1 x5847 +1 x5848 +1 x5849 +1 x5850 +1 x5851 +1 x5852 +1 x5853 +1 x5854 +1 x5855 +1 x5856 +1 x5857 +1 x5858 +1 x5859 +1 x5860 +1 x5861 +1 x5862 +1 x5863 +1 x5864 +1 x5865 +1 x5866 +1 x5867 +1 x5868 +1 x5869 +1 x5870 +1 x5871 +1 x5872 +1 x5873 +1 x5874 +1 x5875 +1 x5876 +1 x5877 +1 x5878 +1 x5879 +1 x5880 +1 x5881 +1 x5882 +1 x5883 +1 x5884 +1 x5885 +1 x5886 +1 x5887 +1 x5888 +1 x5889 +1 x5890 +1 x5891 +1 x5892 +1 x5893 +1 x5894 +1 x5895 +1 x5896 +1 x5897 +1 x5898 +1 x5899 +1 x5900 +1 x5901 +1 x5902 +1 x5903 +1 x5904 +1 x5905 +1 x5906 +1 x5907 +1 x5908 +1 x5909 +1 x5910 +1 x5911 +1 x5912 +1 x5913 +1 x5914 +1 x5915 +1 x5916 +1 x5917 +1 x5918 +1 x5919 +1 x5920 +1 x5921 +1 x5922 +1 x5923 +1 x5924 +1 x5925 +1 x5926 +1 x5927 +1 x5928 +1 x5929 +1 x5930 +1 x5931 +1 x5932 +1 x5933 +1 x5934 +1 x5935 +1 x5936 +1 x5937 +1 x5938 +1 x5939 +1 x5940 +1 x5941 +1 x5942 +1 x5943 +1 x5944 +1 x5945 +1 x5946 +1 x5947 +1 x5948 +1 x5949 +1 x5950 +1 x5951 +1 x5952 +1 x5953 +1 x5954 +1 x5955 +1 x5956 +1 x5957 +1 x5958 +1 x5959 +1 x5960 >= 1;++1 x5961 +1 x5962 +1 x5963 +1 x5964 +1 x5965 +1 x5966 +1 x5967 +1 x5968 +1 x5969 +1 x5970 +1 x5971 +1 x5972 +1 x5973 +1 x5974 +1 x5975 +1 x5976 +1 x5977 +1 x5978 +1 x5979 +1 x5980 +1 x5981 +1 x5982 +1 x5983 +1 x5984 +1 x5985 +1 x5986 +1 x5987 +1 x5988 +1 x5989 +1 x5990 +1 x5991 +1 x5992 +1 x5993 +1 x5994 +1 x5995 +1 x5996 +1 x5997 +1 x5998 +1 x5999 +1 x6000 +1 x6001 +1 x6002 +1 x6003 +1 x6004 +1 x6005 +1 x6006 +1 x6007 +1 x6008 +1 x6009 +1 x6010 +1 x6011 +1 x6012 +1 x6013 +1 x6014 +1 x6015 +1 x6016 +1 x6017 +1 x6018 +1 x6019 +1 x6020 +1 x6021 +1 x6022 +1 x6023 +1 x6024 +1 x6025 +1 x6026 +1 x6027 +1 x6028 +1 x6029 +1 x6030 +1 x6031 +1 x6032 +1 x6033 +1 x6034 +1 x6035 +1 x6036 +1 x6037 +1 x6038 +1 x6039 +1 x6040 +1 x6041 +1 x6042 +1 x6043 +1 x6044 +1 x6045 +1 x6046 +1 x6047 +1 x6048 +1 x6049 +1 x6050 +1 x6051 +1 x6052 +1 x6053 +1 x6054 +1 x6055 +1 x6056 +1 x6057 +1 x6058 +1 x6059 +1 x6060 +1 x6061 +1 x6062 +1 x6063 +1 x6064 +1 x6065 +1 x6066 +1 x6067 +1 x6068 +1 x6069 +1 x6070 +1 x6071 +1 x6072 +1 x6073 +1 x6074 +1 x6075 +1 x6076 +1 x6077 +1 x6078 +1 x6079 +1 x6080 +1 x6081 +1 x6082 +1 x6083 +1 x6084 +1 x6085 +1 x6086 +1 x6087 +1 x6088 +1 x6089 +1 x6090 +1 x6091 +1 x6092 +1 x6093 +1 x6094 +1 x6095 +1 x6096 +1 x6097 +1 x6098 +1 x6099 +1 x6100 +1 x6101 +1 x6102 +1 x6103 +1 x6104 +1 x6105 +1 x6106 +1 x6107 +1 x6108 +1 x6109 >= 1;++1 x6110 +1 x6111 +1 x6112 +1 x6113 +1 x6114 +1 x6115 +1 x6116 +1 x6117 +1 x6118 +1 x6119 +1 x6120 +1 x6121 +1 x6122 +1 x6123 +1 x6124 +1 x6125 +1 x6126 +1 x6127 +1 x6128 +1 x6129 +1 x6130 +1 x6131 +1 x6132 +1 x6133 +1 x6134 +1 x6135 +1 x6136 +1 x6137 +1 x6138 +1 x6139 +1 x6140 +1 x6141 +1 x6142 +1 x6143 +1 x6144 +1 x6145 +1 x6146 +1 x6147 +1 x6148 +1 x6149 +1 x6150 +1 x6151 +1 x6152 +1 x6153 +1 x6154 +1 x6155 +1 x6156 +1 x6157 +1 x6158 +1 x6159 +1 x6160 +1 x6161 +1 x6162 +1 x6163 +1 x6164 +1 x6165 +1 x6166 +1 x6167 +1 x6168 +1 x6169 +1 x6170 +1 x6171 +1 x6172 +1 x6173 +1 x6174 +1 x6175 +1 x6176 +1 x6177 +1 x6178 +1 x6179 +1 x6180 +1 x6181 +1 x6182 +1 x6183 +1 x6184 +1 x6185 +1 x6186 +1 x6187 +1 x6188 +1 x6189 +1 x6190 +1 x6191 +1 x6192 +1 x6193 +1 x6194 +1 x6195 +1 x6196 +1 x6197 +1 x6198 +1 x6199 +1 x6200 +1 x6201 +1 x6202 +1 x6203 +1 x6204 +1 x6205 +1 x6206 +1 x6207 +1 x6208 +1 x6209 +1 x6210 +1 x6211 +1 x6212 +1 x6213 +1 x6214 +1 x6215 +1 x6216 +1 x6217 +1 x6218 +1 x6219 +1 x6220 +1 x6221 +1 x6222 +1 x6223 +1 x6224 +1 x6225 +1 x6226 +1 x6227 +1 x6228 +1 x6229 +1 x6230 +1 x6231 +1 x6232 +1 x6233 +1 x6234 +1 x6235 +1 x6236 +1 x6237 +1 x6238 +1 x6239 +1 x6240 +1 x6241 +1 x6242 +1 x6243 +1 x6244 +1 x6245 +1 x6246 +1 x6247 +1 x6248 +1 x6249 +1 x6250 +1 x6251 +1 x6252 +1 x6253 +1 x6254 +1 x6255 +1 x6256 +1 x6257 +1 x6258 >= 1;++1 x6259 +1 x6260 +1 x6261 +1 x6262 +1 x6263 +1 x6264 +1 x6265 +1 x6266 +1 x6267 +1 x6268 +1 x6269 +1 x6270 +1 x6271 +1 x6272 +1 x6273 +1 x6274 +1 x6275 +1 x6276 +1 x6277 +1 x6278 +1 x6279 +1 x6280 +1 x6281 +1 x6282 +1 x6283 +1 x6284 +1 x6285 +1 x6286 +1 x6287 +1 x6288 +1 x6289 +1 x6290 +1 x6291 +1 x6292 +1 x6293 +1 x6294 +1 x6295 +1 x6296 +1 x6297 +1 x6298 +1 x6299 +1 x6300 +1 x6301 +1 x6302 +1 x6303 +1 x6304 +1 x6305 +1 x6306 +1 x6307 +1 x6308 +1 x6309 +1 x6310 +1 x6311 +1 x6312 +1 x6313 +1 x6314 +1 x6315 +1 x6316 +1 x6317 +1 x6318 +1 x6319 +1 x6320 +1 x6321 +1 x6322 +1 x6323 +1 x6324 +1 x6325 +1 x6326 +1 x6327 +1 x6328 +1 x6329 +1 x6330 +1 x6331 +1 x6332 +1 x6333 +1 x6334 +1 x6335 +1 x6336 +1 x6337 +1 x6338 +1 x6339 +1 x6340 +1 x6341 +1 x6342 +1 x6343 +1 x6344 +1 x6345 +1 x6346 +1 x6347 +1 x6348 +1 x6349 +1 x6350 +1 x6351 +1 x6352 +1 x6353 +1 x6354 +1 x6355 +1 x6356 +1 x6357 +1 x6358 +1 x6359 +1 x6360 +1 x6361 +1 x6362 +1 x6363 +1 x6364 +1 x6365 +1 x6366 +1 x6367 +1 x6368 +1 x6369 +1 x6370 +1 x6371 +1 x6372 +1 x6373 +1 x6374 +1 x6375 +1 x6376 +1 x6377 +1 x6378 +1 x6379 +1 x6380 +1 x6381 +1 x6382 +1 x6383 +1 x6384 +1 x6385 +1 x6386 +1 x6387 +1 x6388 +1 x6389 +1 x6390 +1 x6391 +1 x6392 +1 x6393 +1 x6394 +1 x6395 +1 x6396 +1 x6397 +1 x6398 +1 x6399 +1 x6400 +1 x6401 +1 x6402 +1 x6403 +1 x6404 +1 x6405 +1 x6406 +1 x6407 >= 1;++1 x6408 +1 x6409 +1 x6410 +1 x6411 +1 x6412 +1 x6413 +1 x6414 +1 x6415 +1 x6416 +1 x6417 +1 x6418 +1 x6419 +1 x6420 +1 x6421 +1 x6422 +1 x6423 +1 x6424 +1 x6425 +1 x6426 +1 x6427 +1 x6428 +1 x6429 +1 x6430 +1 x6431 +1 x6432 +1 x6433 +1 x6434 +1 x6435 +1 x6436 +1 x6437 +1 x6438 +1 x6439 +1 x6440 +1 x6441 +1 x6442 +1 x6443 +1 x6444 +1 x6445 +1 x6446 +1 x6447 +1 x6448 +1 x6449 +1 x6450 +1 x6451 +1 x6452 +1 x6453 +1 x6454 +1 x6455 +1 x6456 +1 x6457 +1 x6458 +1 x6459 +1 x6460 +1 x6461 +1 x6462 +1 x6463 +1 x6464 +1 x6465 +1 x6466 +1 x6467 +1 x6468 +1 x6469 +1 x6470 +1 x6471 +1 x6472 +1 x6473 +1 x6474 +1 x6475 +1 x6476 +1 x6477 +1 x6478 +1 x6479 +1 x6480 +1 x6481 +1 x6482 +1 x6483 +1 x6484 +1 x6485 +1 x6486 +1 x6487 +1 x6488 +1 x6489 +1 x6490 +1 x6491 +1 x6492 +1 x6493 +1 x6494 +1 x6495 +1 x6496 +1 x6497 +1 x6498 +1 x6499 +1 x6500 +1 x6501 +1 x6502 +1 x6503 +1 x6504 +1 x6505 +1 x6506 +1 x6507 +1 x6508 +1 x6509 +1 x6510 +1 x6511 +1 x6512 +1 x6513 +1 x6514 +1 x6515 +1 x6516 +1 x6517 +1 x6518 +1 x6519 +1 x6520 +1 x6521 +1 x6522 +1 x6523 +1 x6524 +1 x6525 +1 x6526 +1 x6527 +1 x6528 +1 x6529 +1 x6530 +1 x6531 +1 x6532 +1 x6533 +1 x6534 +1 x6535 +1 x6536 +1 x6537 +1 x6538 +1 x6539 +1 x6540 +1 x6541 +1 x6542 +1 x6543 +1 x6544 +1 x6545 +1 x6546 +1 x6547 +1 x6548 +1 x6549 +1 x6550 +1 x6551 +1 x6552 +1 x6553 +1 x6554 +1 x6555 +1 x6556 >= 1;++1 x6557 +1 x6558 +1 x6559 +1 x6560 +1 x6561 +1 x6562 +1 x6563 +1 x6564 +1 x6565 +1 x6566 +1 x6567 +1 x6568 +1 x6569 +1 x6570 +1 x6571 +1 x6572 +1 x6573 +1 x6574 +1 x6575 +1 x6576 +1 x6577 +1 x6578 +1 x6579 +1 x6580 +1 x6581 +1 x6582 +1 x6583 +1 x6584 +1 x6585 +1 x6586 +1 x6587 +1 x6588 +1 x6589 +1 x6590 +1 x6591 +1 x6592 +1 x6593 +1 x6594 +1 x6595 +1 x6596 +1 x6597 +1 x6598 +1 x6599 +1 x6600 +1 x6601 +1 x6602 +1 x6603 +1 x6604 +1 x6605 +1 x6606 +1 x6607 +1 x6608 +1 x6609 +1 x6610 +1 x6611 +1 x6612 +1 x6613 +1 x6614 +1 x6615 +1 x6616 +1 x6617 +1 x6618 +1 x6619 +1 x6620 +1 x6621 +1 x6622 +1 x6623 +1 x6624 +1 x6625 +1 x6626 +1 x6627 +1 x6628 +1 x6629 +1 x6630 +1 x6631 +1 x6632 +1 x6633 +1 x6634 +1 x6635 +1 x6636 +1 x6637 +1 x6638 +1 x6639 +1 x6640 +1 x6641 +1 x6642 +1 x6643 +1 x6644 +1 x6645 +1 x6646 +1 x6647 +1 x6648 +1 x6649 +1 x6650 +1 x6651 +1 x6652 +1 x6653 +1 x6654 +1 x6655 +1 x6656 +1 x6657 +1 x6658 +1 x6659 +1 x6660 +1 x6661 +1 x6662 +1 x6663 +1 x6664 +1 x6665 +1 x6666 +1 x6667 +1 x6668 +1 x6669 +1 x6670 +1 x6671 +1 x6672 +1 x6673 +1 x6674 +1 x6675 +1 x6676 +1 x6677 +1 x6678 +1 x6679 +1 x6680 +1 x6681 +1 x6682 +1 x6683 +1 x6684 +1 x6685 +1 x6686 +1 x6687 +1 x6688 +1 x6689 +1 x6690 +1 x6691 +1 x6692 +1 x6693 +1 x6694 +1 x6695 +1 x6696 +1 x6697 +1 x6698 +1 x6699 +1 x6700 +1 x6701 +1 x6702 +1 x6703 +1 x6704 +1 x6705 >= 1;++1 x6706 +1 x6707 +1 x6708 +1 x6709 +1 x6710 +1 x6711 +1 x6712 +1 x6713 +1 x6714 +1 x6715 +1 x6716 +1 x6717 +1 x6718 +1 x6719 +1 x6720 +1 x6721 +1 x6722 +1 x6723 +1 x6724 +1 x6725 +1 x6726 +1 x6727 +1 x6728 +1 x6729 +1 x6730 +1 x6731 +1 x6732 +1 x6733 +1 x6734 +1 x6735 +1 x6736 +1 x6737 +1 x6738 +1 x6739 +1 x6740 +1 x6741 +1 x6742 +1 x6743 +1 x6744 +1 x6745 +1 x6746 +1 x6747 +1 x6748 +1 x6749 +1 x6750 +1 x6751 +1 x6752 +1 x6753 +1 x6754 +1 x6755 +1 x6756 +1 x6757 +1 x6758 +1 x6759 +1 x6760 +1 x6761 +1 x6762 +1 x6763 +1 x6764 +1 x6765 +1 x6766 +1 x6767 +1 x6768 +1 x6769 +1 x6770 +1 x6771 +1 x6772 +1 x6773 +1 x6774 +1 x6775 +1 x6776 +1 x6777 +1 x6778 +1 x6779 +1 x6780 +1 x6781 +1 x6782 +1 x6783 +1 x6784 +1 x6785 +1 x6786 +1 x6787 +1 x6788 +1 x6789 +1 x6790 +1 x6791 +1 x6792 +1 x6793 +1 x6794 +1 x6795 +1 x6796 +1 x6797 +1 x6798 +1 x6799 +1 x6800 +1 x6801 +1 x6802 +1 x6803 +1 x6804 +1 x6805 +1 x6806 +1 x6807 +1 x6808 +1 x6809 +1 x6810 +1 x6811 +1 x6812 +1 x6813 +1 x6814 +1 x6815 +1 x6816 +1 x6817 +1 x6818 +1 x6819 +1 x6820 +1 x6821 +1 x6822 +1 x6823 +1 x6824 +1 x6825 +1 x6826 +1 x6827 +1 x6828 +1 x6829 +1 x6830 +1 x6831 +1 x6832 +1 x6833 +1 x6834 +1 x6835 +1 x6836 +1 x6837 +1 x6838 +1 x6839 +1 x6840 +1 x6841 +1 x6842 +1 x6843 +1 x6844 +1 x6845 +1 x6846 +1 x6847 +1 x6848 +1 x6849 +1 x6850 +1 x6851 +1 x6852 +1 x6853 +1 x6854 >= 1;++1 x6855 +1 x6856 +1 x6857 +1 x6858 +1 x6859 +1 x6860 +1 x6861 +1 x6862 +1 x6863 +1 x6864 +1 x6865 +1 x6866 +1 x6867 +1 x6868 +1 x6869 +1 x6870 +1 x6871 +1 x6872 +1 x6873 +1 x6874 +1 x6875 +1 x6876 +1 x6877 +1 x6878 +1 x6879 +1 x6880 +1 x6881 +1 x6882 +1 x6883 +1 x6884 +1 x6885 +1 x6886 +1 x6887 +1 x6888 +1 x6889 +1 x6890 +1 x6891 +1 x6892 +1 x6893 +1 x6894 +1 x6895 +1 x6896 +1 x6897 +1 x6898 +1 x6899 +1 x6900 +1 x6901 +1 x6902 +1 x6903 +1 x6904 +1 x6905 +1 x6906 +1 x6907 +1 x6908 +1 x6909 +1 x6910 +1 x6911 +1 x6912 +1 x6913 +1 x6914 +1 x6915 +1 x6916 +1 x6917 +1 x6918 +1 x6919 +1 x6920 +1 x6921 +1 x6922 +1 x6923 +1 x6924 +1 x6925 +1 x6926 +1 x6927 +1 x6928 +1 x6929 +1 x6930 +1 x6931 +1 x6932 +1 x6933 +1 x6934 +1 x6935 +1 x6936 +1 x6937 +1 x6938 +1 x6939 +1 x6940 +1 x6941 +1 x6942 +1 x6943 +1 x6944 +1 x6945 +1 x6946 +1 x6947 +1 x6948 +1 x6949 +1 x6950 +1 x6951 +1 x6952 +1 x6953 +1 x6954 +1 x6955 +1 x6956 +1 x6957 +1 x6958 +1 x6959 +1 x6960 +1 x6961 +1 x6962 +1 x6963 +1 x6964 +1 x6965 +1 x6966 +1 x6967 +1 x6968 +1 x6969 +1 x6970 +1 x6971 +1 x6972 +1 x6973 +1 x6974 +1 x6975 +1 x6976 +1 x6977 +1 x6978 +1 x6979 +1 x6980 +1 x6981 +1 x6982 +1 x6983 +1 x6984 +1 x6985 +1 x6986 +1 x6987 +1 x6988 +1 x6989 +1 x6990 +1 x6991 +1 x6992 +1 x6993 +1 x6994 +1 x6995 +1 x6996 +1 x6997 +1 x6998 +1 x6999 +1 x7000 +1 x7001 +1 x7002 +1 x7003 >= 1;++1 x7004 +1 x7005 +1 x7006 +1 x7007 +1 x7008 +1 x7009 +1 x7010 +1 x7011 +1 x7012 +1 x7013 +1 x7014 +1 x7015 +1 x7016 +1 x7017 +1 x7018 +1 x7019 +1 x7020 +1 x7021 +1 x7022 +1 x7023 +1 x7024 +1 x7025 +1 x7026 +1 x7027 +1 x7028 +1 x7029 +1 x7030 +1 x7031 +1 x7032 +1 x7033 +1 x7034 +1 x7035 +1 x7036 +1 x7037 +1 x7038 +1 x7039 +1 x7040 +1 x7041 +1 x7042 +1 x7043 +1 x7044 +1 x7045 +1 x7046 +1 x7047 +1 x7048 +1 x7049 +1 x7050 +1 x7051 +1 x7052 +1 x7053 +1 x7054 +1 x7055 +1 x7056 +1 x7057 +1 x7058 +1 x7059 +1 x7060 +1 x7061 +1 x7062 +1 x7063 +1 x7064 +1 x7065 +1 x7066 +1 x7067 +1 x7068 +1 x7069 +1 x7070 +1 x7071 +1 x7072 +1 x7073 +1 x7074 +1 x7075 +1 x7076 +1 x7077 +1 x7078 +1 x7079 +1 x7080 +1 x7081 +1 x7082 +1 x7083 +1 x7084 +1 x7085 +1 x7086 +1 x7087 +1 x7088 +1 x7089 +1 x7090 +1 x7091 +1 x7092 +1 x7093 +1 x7094 +1 x7095 +1 x7096 +1 x7097 +1 x7098 +1 x7099 +1 x7100 +1 x7101 +1 x7102 +1 x7103 +1 x7104 +1 x7105 +1 x7106 +1 x7107 +1 x7108 +1 x7109 +1 x7110 +1 x7111 +1 x7112 +1 x7113 +1 x7114 +1 x7115 +1 x7116 +1 x7117 +1 x7118 +1 x7119 +1 x7120 +1 x7121 +1 x7122 +1 x7123 +1 x7124 +1 x7125 +1 x7126 +1 x7127 +1 x7128 +1 x7129 +1 x7130 +1 x7131 +1 x7132 +1 x7133 +1 x7134 +1 x7135 +1 x7136 +1 x7137 +1 x7138 +1 x7139 +1 x7140 +1 x7141 +1 x7142 +1 x7143 +1 x7144 +1 x7145 +1 x7146 +1 x7147 +1 x7148 +1 x7149 +1 x7150 +1 x7151 +1 x7152 >= 1;++1 x7153 +1 x7154 +1 x7155 +1 x7156 +1 x7157 +1 x7158 +1 x7159 +1 x7160 +1 x7161 +1 x7162 +1 x7163 +1 x7164 +1 x7165 +1 x7166 +1 x7167 +1 x7168 +1 x7169 +1 x7170 +1 x7171 +1 x7172 +1 x7173 +1 x7174 +1 x7175 +1 x7176 +1 x7177 +1 x7178 +1 x7179 +1 x7180 +1 x7181 +1 x7182 +1 x7183 +1 x7184 +1 x7185 +1 x7186 +1 x7187 +1 x7188 +1 x7189 +1 x7190 +1 x7191 +1 x7192 +1 x7193 +1 x7194 +1 x7195 +1 x7196 +1 x7197 +1 x7198 +1 x7199 +1 x7200 +1 x7201 +1 x7202 +1 x7203 +1 x7204 +1 x7205 +1 x7206 +1 x7207 +1 x7208 +1 x7209 +1 x7210 +1 x7211 +1 x7212 +1 x7213 +1 x7214 +1 x7215 +1 x7216 +1 x7217 +1 x7218 +1 x7219 +1 x7220 +1 x7221 +1 x7222 +1 x7223 +1 x7224 +1 x7225 +1 x7226 +1 x7227 +1 x7228 +1 x7229 +1 x7230 +1 x7231 +1 x7232 +1 x7233 +1 x7234 +1 x7235 +1 x7236 +1 x7237 +1 x7238 +1 x7239 +1 x7240 +1 x7241 +1 x7242 +1 x7243 +1 x7244 +1 x7245 +1 x7246 +1 x7247 +1 x7248 +1 x7249 +1 x7250 +1 x7251 +1 x7252 +1 x7253 +1 x7254 +1 x7255 +1 x7256 +1 x7257 +1 x7258 +1 x7259 +1 x7260 +1 x7261 +1 x7262 +1 x7263 +1 x7264 +1 x7265 +1 x7266 +1 x7267 +1 x7268 +1 x7269 +1 x7270 +1 x7271 +1 x7272 +1 x7273 +1 x7274 +1 x7275 +1 x7276 +1 x7277 +1 x7278 +1 x7279 +1 x7280 +1 x7281 +1 x7282 +1 x7283 +1 x7284 +1 x7285 +1 x7286 +1 x7287 +1 x7288 +1 x7289 +1 x7290 +1 x7291 +1 x7292 +1 x7293 +1 x7294 +1 x7295 +1 x7296 +1 x7297 +1 x7298 +1 x7299 +1 x7300 +1 x7301 >= 1;++1 x7302 +1 x7303 +1 x7304 +1 x7305 +1 x7306 +1 x7307 +1 x7308 +1 x7309 +1 x7310 +1 x7311 +1 x7312 +1 x7313 +1 x7314 +1 x7315 +1 x7316 +1 x7317 +1 x7318 +1 x7319 +1 x7320 +1 x7321 +1 x7322 +1 x7323 +1 x7324 +1 x7325 +1 x7326 +1 x7327 +1 x7328 +1 x7329 +1 x7330 +1 x7331 +1 x7332 +1 x7333 +1 x7334 +1 x7335 +1 x7336 +1 x7337 +1 x7338 +1 x7339 +1 x7340 +1 x7341 +1 x7342 +1 x7343 +1 x7344 +1 x7345 +1 x7346 +1 x7347 +1 x7348 +1 x7349 +1 x7350 +1 x7351 +1 x7352 +1 x7353 +1 x7354 +1 x7355 +1 x7356 +1 x7357 +1 x7358 +1 x7359 +1 x7360 +1 x7361 +1 x7362 +1 x7363 +1 x7364 +1 x7365 +1 x7366 +1 x7367 +1 x7368 +1 x7369 +1 x7370 +1 x7371 +1 x7372 +1 x7373 +1 x7374 +1 x7375 +1 x7376 +1 x7377 +1 x7378 +1 x7379 +1 x7380 +1 x7381 +1 x7382 +1 x7383 +1 x7384 +1 x7385 +1 x7386 +1 x7387 +1 x7388 +1 x7389 +1 x7390 +1 x7391 +1 x7392 +1 x7393 +1 x7394 +1 x7395 +1 x7396 +1 x7397 +1 x7398 +1 x7399 +1 x7400 +1 x7401 +1 x7402 +1 x7403 +1 x7404 +1 x7405 +1 x7406 +1 x7407 +1 x7408 +1 x7409 +1 x7410 +1 x7411 +1 x7412 +1 x7413 +1 x7414 +1 x7415 +1 x7416 +1 x7417 +1 x7418 +1 x7419 +1 x7420 +1 x7421 +1 x7422 +1 x7423 +1 x7424 +1 x7425 +1 x7426 +1 x7427 +1 x7428 +1 x7429 +1 x7430 +1 x7431 +1 x7432 +1 x7433 +1 x7434 +1 x7435 +1 x7436 +1 x7437 +1 x7438 +1 x7439 +1 x7440 +1 x7441 +1 x7442 +1 x7443 +1 x7444 +1 x7445 +1 x7446 +1 x7447 +1 x7448 +1 x7449 +1 x7450 >= 1;++1 x7451 +1 x7452 +1 x7453 +1 x7454 +1 x7455 +1 x7456 +1 x7457 +1 x7458 +1 x7459 +1 x7460 +1 x7461 +1 x7462 +1 x7463 +1 x7464 +1 x7465 +1 x7466 +1 x7467 +1 x7468 +1 x7469 +1 x7470 +1 x7471 +1 x7472 +1 x7473 +1 x7474 +1 x7475 +1 x7476 +1 x7477 +1 x7478 +1 x7479 +1 x7480 +1 x7481 +1 x7482 +1 x7483 +1 x7484 +1 x7485 +1 x7486 +1 x7487 +1 x7488 +1 x7489 +1 x7490 +1 x7491 +1 x7492 +1 x7493 +1 x7494 +1 x7495 +1 x7496 +1 x7497 +1 x7498 +1 x7499 +1 x7500 +1 x7501 +1 x7502 +1 x7503 +1 x7504 +1 x7505 +1 x7506 +1 x7507 +1 x7508 +1 x7509 +1 x7510 +1 x7511 +1 x7512 +1 x7513 +1 x7514 +1 x7515 +1 x7516 +1 x7517 +1 x7518 +1 x7519 +1 x7520 +1 x7521 +1 x7522 +1 x7523 +1 x7524 +1 x7525 +1 x7526 +1 x7527 +1 x7528 +1 x7529 +1 x7530 +1 x7531 +1 x7532 +1 x7533 +1 x7534 +1 x7535 +1 x7536 +1 x7537 +1 x7538 +1 x7539 +1 x7540 +1 x7541 +1 x7542 +1 x7543 +1 x7544 +1 x7545 +1 x7546 +1 x7547 +1 x7548 +1 x7549 +1 x7550 +1 x7551 +1 x7552 +1 x7553 +1 x7554 +1 x7555 +1 x7556 +1 x7557 +1 x7558 +1 x7559 +1 x7560 +1 x7561 +1 x7562 +1 x7563 +1 x7564 +1 x7565 +1 x7566 +1 x7567 +1 x7568 +1 x7569 +1 x7570 +1 x7571 +1 x7572 +1 x7573 +1 x7574 +1 x7575 +1 x7576 +1 x7577 +1 x7578 +1 x7579 +1 x7580 +1 x7581 +1 x7582 +1 x7583 +1 x7584 +1 x7585 +1 x7586 +1 x7587 +1 x7588 +1 x7589 +1 x7590 +1 x7591 +1 x7592 +1 x7593 +1 x7594 +1 x7595 +1 x7596 +1 x7597 +1 x7598 +1 x7599 >= 1;++1 x7600 +1 x7601 +1 x7602 +1 x7603 +1 x7604 +1 x7605 +1 x7606 +1 x7607 +1 x7608 +1 x7609 +1 x7610 +1 x7611 +1 x7612 +1 x7613 +1 x7614 +1 x7615 +1 x7616 +1 x7617 +1 x7618 +1 x7619 +1 x7620 +1 x7621 +1 x7622 +1 x7623 +1 x7624 +1 x7625 +1 x7626 +1 x7627 +1 x7628 +1 x7629 +1 x7630 +1 x7631 +1 x7632 +1 x7633 +1 x7634 +1 x7635 +1 x7636 +1 x7637 +1 x7638 +1 x7639 +1 x7640 +1 x7641 +1 x7642 +1 x7643 +1 x7644 +1 x7645 +1 x7646 +1 x7647 +1 x7648 +1 x7649 +1 x7650 +1 x7651 +1 x7652 +1 x7653 +1 x7654 +1 x7655 +1 x7656 +1 x7657 +1 x7658 +1 x7659 +1 x7660 +1 x7661 +1 x7662 +1 x7663 +1 x7664 +1 x7665 +1 x7666 +1 x7667 +1 x7668 +1 x7669 +1 x7670 +1 x7671 +1 x7672 +1 x7673 +1 x7674 +1 x7675 +1 x7676 +1 x7677 +1 x7678 +1 x7679 +1 x7680 +1 x7681 +1 x7682 +1 x7683 +1 x7684 +1 x7685 +1 x7686 +1 x7687 +1 x7688 +1 x7689 +1 x7690 +1 x7691 +1 x7692 +1 x7693 +1 x7694 +1 x7695 +1 x7696 +1 x7697 +1 x7698 +1 x7699 +1 x7700 +1 x7701 +1 x7702 +1 x7703 +1 x7704 +1 x7705 +1 x7706 +1 x7707 +1 x7708 +1 x7709 +1 x7710 +1 x7711 +1 x7712 +1 x7713 +1 x7714 +1 x7715 +1 x7716 +1 x7717 +1 x7718 +1 x7719 +1 x7720 +1 x7721 +1 x7722 +1 x7723 +1 x7724 +1 x7725 +1 x7726 +1 x7727 +1 x7728 +1 x7729 +1 x7730 +1 x7731 +1 x7732 +1 x7733 +1 x7734 +1 x7735 +1 x7736 +1 x7737 +1 x7738 +1 x7739 +1 x7740 +1 x7741 +1 x7742 +1 x7743 +1 x7744 +1 x7745 +1 x7746 +1 x7747 +1 x7748 >= 1;++1 x7749 +1 x7750 +1 x7751 +1 x7752 +1 x7753 +1 x7754 +1 x7755 +1 x7756 +1 x7757 +1 x7758 +1 x7759 +1 x7760 +1 x7761 +1 x7762 +1 x7763 +1 x7764 +1 x7765 +1 x7766 +1 x7767 +1 x7768 +1 x7769 +1 x7770 +1 x7771 +1 x7772 +1 x7773 +1 x7774 +1 x7775 +1 x7776 +1 x7777 +1 x7778 +1 x7779 +1 x7780 +1 x7781 +1 x7782 +1 x7783 +1 x7784 +1 x7785 +1 x7786 +1 x7787 +1 x7788 +1 x7789 +1 x7790 +1 x7791 +1 x7792 +1 x7793 +1 x7794 +1 x7795 +1 x7796 +1 x7797 +1 x7798 +1 x7799 +1 x7800 +1 x7801 +1 x7802 +1 x7803 +1 x7804 +1 x7805 +1 x7806 +1 x7807 +1 x7808 +1 x7809 +1 x7810 +1 x7811 +1 x7812 +1 x7813 +1 x7814 +1 x7815 +1 x7816 +1 x7817 +1 x7818 +1 x7819 +1 x7820 +1 x7821 +1 x7822 +1 x7823 +1 x7824 +1 x7825 +1 x7826 +1 x7827 +1 x7828 +1 x7829 +1 x7830 +1 x7831 +1 x7832 +1 x7833 +1 x7834 +1 x7835 +1 x7836 +1 x7837 +1 x7838 +1 x7839 +1 x7840 +1 x7841 +1 x7842 +1 x7843 +1 x7844 +1 x7845 +1 x7846 +1 x7847 +1 x7848 +1 x7849 +1 x7850 +1 x7851 +1 x7852 +1 x7853 +1 x7854 +1 x7855 +1 x7856 +1 x7857 +1 x7858 +1 x7859 +1 x7860 +1 x7861 +1 x7862 +1 x7863 +1 x7864 +1 x7865 +1 x7866 +1 x7867 +1 x7868 +1 x7869 +1 x7870 +1 x7871 +1 x7872 +1 x7873 +1 x7874 +1 x7875 +1 x7876 +1 x7877 +1 x7878 +1 x7879 +1 x7880 +1 x7881 +1 x7882 +1 x7883 +1 x7884 +1 x7885 +1 x7886 +1 x7887 +1 x7888 +1 x7889 +1 x7890 +1 x7891 +1 x7892 +1 x7893 +1 x7894 +1 x7895 +1 x7896 +1 x7897 >= 1;++1 x7898 +1 x7899 +1 x7900 +1 x7901 +1 x7902 +1 x7903 +1 x7904 +1 x7905 +1 x7906 +1 x7907 +1 x7908 +1 x7909 +1 x7910 +1 x7911 +1 x7912 +1 x7913 +1 x7914 +1 x7915 +1 x7916 +1 x7917 +1 x7918 +1 x7919 +1 x7920 +1 x7921 +1 x7922 +1 x7923 +1 x7924 +1 x7925 +1 x7926 +1 x7927 +1 x7928 +1 x7929 +1 x7930 +1 x7931 +1 x7932 +1 x7933 +1 x7934 +1 x7935 +1 x7936 +1 x7937 +1 x7938 +1 x7939 +1 x7940 +1 x7941 +1 x7942 +1 x7943 +1 x7944 +1 x7945 +1 x7946 +1 x7947 +1 x7948 +1 x7949 +1 x7950 +1 x7951 +1 x7952 +1 x7953 +1 x7954 +1 x7955 +1 x7956 +1 x7957 +1 x7958 +1 x7959 +1 x7960 +1 x7961 +1 x7962 +1 x7963 +1 x7964 +1 x7965 +1 x7966 +1 x7967 +1 x7968 +1 x7969 +1 x7970 +1 x7971 +1 x7972 +1 x7973 +1 x7974 +1 x7975 +1 x7976 +1 x7977 +1 x7978 +1 x7979 +1 x7980 +1 x7981 +1 x7982 +1 x7983 +1 x7984 +1 x7985 +1 x7986 +1 x7987 +1 x7988 +1 x7989 +1 x7990 +1 x7991 +1 x7992 +1 x7993 +1 x7994 +1 x7995 +1 x7996 +1 x7997 +1 x7998 +1 x7999 +1 x8000 +1 x8001 +1 x8002 +1 x8003 +1 x8004 +1 x8005 +1 x8006 +1 x8007 +1 x8008 +1 x8009 +1 x8010 +1 x8011 +1 x8012 +1 x8013 +1 x8014 +1 x8015 +1 x8016 +1 x8017 +1 x8018 +1 x8019 +1 x8020 +1 x8021 +1 x8022 +1 x8023 +1 x8024 +1 x8025 +1 x8026 +1 x8027 +1 x8028 +1 x8029 +1 x8030 +1 x8031 +1 x8032 +1 x8033 +1 x8034 +1 x8035 +1 x8036 +1 x8037 +1 x8038 +1 x8039 +1 x8040 +1 x8041 +1 x8042 +1 x8043 +1 x8044 +1 x8045 +1 x8046 >= 1;++1 x8047 +1 x8048 +1 x8049 +1 x8050 +1 x8051 +1 x8052 +1 x8053 +1 x8054 +1 x8055 +1 x8056 +1 x8057 +1 x8058 +1 x8059 +1 x8060 +1 x8061 +1 x8062 +1 x8063 +1 x8064 +1 x8065 +1 x8066 +1 x8067 +1 x8068 +1 x8069 +1 x8070 +1 x8071 +1 x8072 +1 x8073 +1 x8074 +1 x8075 +1 x8076 +1 x8077 +1 x8078 +1 x8079 +1 x8080 +1 x8081 +1 x8082 +1 x8083 +1 x8084 +1 x8085 +1 x8086 +1 x8087 +1 x8088 +1 x8089 +1 x8090 +1 x8091 +1 x8092 +1 x8093 +1 x8094 +1 x8095 +1 x8096 +1 x8097 +1 x8098 +1 x8099 +1 x8100 +1 x8101 +1 x8102 +1 x8103 +1 x8104 +1 x8105 +1 x8106 +1 x8107 +1 x8108 +1 x8109 +1 x8110 +1 x8111 +1 x8112 +1 x8113 +1 x8114 +1 x8115 +1 x8116 +1 x8117 +1 x8118 +1 x8119 +1 x8120 +1 x8121 +1 x8122 +1 x8123 +1 x8124 +1 x8125 +1 x8126 +1 x8127 +1 x8128 +1 x8129 +1 x8130 +1 x8131 +1 x8132 +1 x8133 +1 x8134 +1 x8135 +1 x8136 +1 x8137 +1 x8138 +1 x8139 +1 x8140 +1 x8141 +1 x8142 +1 x8143 +1 x8144 +1 x8145 +1 x8146 +1 x8147 +1 x8148 +1 x8149 +1 x8150 +1 x8151 +1 x8152 +1 x8153 +1 x8154 +1 x8155 +1 x8156 +1 x8157 +1 x8158 +1 x8159 +1 x8160 +1 x8161 +1 x8162 +1 x8163 +1 x8164 +1 x8165 +1 x8166 +1 x8167 +1 x8168 +1 x8169 +1 x8170 +1 x8171 +1 x8172 +1 x8173 +1 x8174 +1 x8175 +1 x8176 +1 x8177 +1 x8178 +1 x8179 +1 x8180 +1 x8181 +1 x8182 +1 x8183 +1 x8184 +1 x8185 +1 x8186 +1 x8187 +1 x8188 +1 x8189 +1 x8190 +1 x8191 +1 x8192 +1 x8193 +1 x8194 +1 x8195 >= 1;++1 x8196 +1 x8197 +1 x8198 +1 x8199 +1 x8200 +1 x8201 +1 x8202 +1 x8203 +1 x8204 +1 x8205 +1 x8206 +1 x8207 +1 x8208 +1 x8209 +1 x8210 +1 x8211 +1 x8212 +1 x8213 +1 x8214 +1 x8215 +1 x8216 +1 x8217 +1 x8218 +1 x8219 +1 x8220 +1 x8221 +1 x8222 +1 x8223 +1 x8224 +1 x8225 +1 x8226 +1 x8227 +1 x8228 +1 x8229 +1 x8230 +1 x8231 +1 x8232 +1 x8233 +1 x8234 +1 x8235 +1 x8236 +1 x8237 +1 x8238 +1 x8239 +1 x8240 +1 x8241 +1 x8242 +1 x8243 +1 x8244 +1 x8245 +1 x8246 +1 x8247 +1 x8248 +1 x8249 +1 x8250 +1 x8251 +1 x8252 +1 x8253 +1 x8254 +1 x8255 +1 x8256 +1 x8257 +1 x8258 +1 x8259 +1 x8260 +1 x8261 +1 x8262 +1 x8263 +1 x8264 +1 x8265 +1 x8266 +1 x8267 +1 x8268 +1 x8269 +1 x8270 +1 x8271 +1 x8272 +1 x8273 +1 x8274 +1 x8275 +1 x8276 +1 x8277 +1 x8278 +1 x8279 +1 x8280 +1 x8281 +1 x8282 +1 x8283 +1 x8284 +1 x8285 +1 x8286 +1 x8287 +1 x8288 +1 x8289 +1 x8290 +1 x8291 +1 x8292 +1 x8293 +1 x8294 +1 x8295 +1 x8296 +1 x8297 +1 x8298 +1 x8299 +1 x8300 +1 x8301 +1 x8302 +1 x8303 +1 x8304 +1 x8305 +1 x8306 +1 x8307 +1 x8308 +1 x8309 +1 x8310 +1 x8311 +1 x8312 +1 x8313 +1 x8314 +1 x8315 +1 x8316 +1 x8317 +1 x8318 +1 x8319 +1 x8320 +1 x8321 +1 x8322 +1 x8323 +1 x8324 +1 x8325 +1 x8326 +1 x8327 +1 x8328 +1 x8329 +1 x8330 +1 x8331 +1 x8332 +1 x8333 +1 x8334 +1 x8335 +1 x8336 +1 x8337 +1 x8338 +1 x8339 +1 x8340 +1 x8341 +1 x8342 +1 x8343 +1 x8344 >= 1;++1 x8345 +1 x8346 +1 x8347 +1 x8348 +1 x8349 +1 x8350 +1 x8351 +1 x8352 +1 x8353 +1 x8354 +1 x8355 +1 x8356 +1 x8357 +1 x8358 +1 x8359 +1 x8360 +1 x8361 +1 x8362 +1 x8363 +1 x8364 +1 x8365 +1 x8366 +1 x8367 +1 x8368 +1 x8369 +1 x8370 +1 x8371 +1 x8372 +1 x8373 +1 x8374 +1 x8375 +1 x8376 +1 x8377 +1 x8378 +1 x8379 +1 x8380 +1 x8381 +1 x8382 +1 x8383 +1 x8384 +1 x8385 +1 x8386 +1 x8387 +1 x8388 +1 x8389 +1 x8390 +1 x8391 +1 x8392 +1 x8393 +1 x8394 +1 x8395 +1 x8396 +1 x8397 +1 x8398 +1 x8399 +1 x8400 +1 x8401 +1 x8402 +1 x8403 +1 x8404 +1 x8405 +1 x8406 +1 x8407 +1 x8408 +1 x8409 +1 x8410 +1 x8411 +1 x8412 +1 x8413 +1 x8414 +1 x8415 +1 x8416 +1 x8417 +1 x8418 +1 x8419 +1 x8420 +1 x8421 +1 x8422 +1 x8423 +1 x8424 +1 x8425 +1 x8426 +1 x8427 +1 x8428 +1 x8429 +1 x8430 +1 x8431 +1 x8432 +1 x8433 +1 x8434 +1 x8435 +1 x8436 +1 x8437 +1 x8438 +1 x8439 +1 x8440 +1 x8441 +1 x8442 +1 x8443 +1 x8444 +1 x8445 +1 x8446 +1 x8447 +1 x8448 +1 x8449 +1 x8450 +1 x8451 +1 x8452 +1 x8453 +1 x8454 +1 x8455 +1 x8456 +1 x8457 +1 x8458 +1 x8459 +1 x8460 +1 x8461 +1 x8462 +1 x8463 +1 x8464 +1 x8465 +1 x8466 +1 x8467 +1 x8468 +1 x8469 +1 x8470 +1 x8471 +1 x8472 +1 x8473 +1 x8474 +1 x8475 +1 x8476 +1 x8477 +1 x8478 +1 x8479 +1 x8480 +1 x8481 +1 x8482 +1 x8483 +1 x8484 +1 x8485 +1 x8486 +1 x8487 +1 x8488 +1 x8489 +1 x8490 +1 x8491 +1 x8492 +1 x8493 >= 1;++1 x8494 +1 x8495 +1 x8496 +1 x8497 +1 x8498 +1 x8499 +1 x8500 +1 x8501 +1 x8502 +1 x8503 +1 x8504 +1 x8505 +1 x8506 +1 x8507 +1 x8508 +1 x8509 +1 x8510 +1 x8511 +1 x8512 +1 x8513 +1 x8514 +1 x8515 +1 x8516 +1 x8517 +1 x8518 +1 x8519 +1 x8520 +1 x8521 +1 x8522 +1 x8523 +1 x8524 +1 x8525 +1 x8526 +1 x8527 +1 x8528 +1 x8529 +1 x8530 +1 x8531 +1 x8532 +1 x8533 +1 x8534 +1 x8535 +1 x8536 +1 x8537 +1 x8538 +1 x8539 +1 x8540 +1 x8541 +1 x8542 +1 x8543 +1 x8544 +1 x8545 +1 x8546 +1 x8547 +1 x8548 +1 x8549 +1 x8550 +1 x8551 +1 x8552 +1 x8553 +1 x8554 +1 x8555 +1 x8556 +1 x8557 +1 x8558 +1 x8559 +1 x8560 +1 x8561 +1 x8562 +1 x8563 +1 x8564 +1 x8565 +1 x8566 +1 x8567 +1 x8568 +1 x8569 +1 x8570 +1 x8571 +1 x8572 +1 x8573 +1 x8574 +1 x8575 +1 x8576 +1 x8577 +1 x8578 +1 x8579 +1 x8580 +1 x8581 +1 x8582 +1 x8583 +1 x8584 +1 x8585 +1 x8586 +1 x8587 +1 x8588 +1 x8589 +1 x8590 +1 x8591 +1 x8592 +1 x8593 +1 x8594 +1 x8595 +1 x8596 +1 x8597 +1 x8598 +1 x8599 +1 x8600 +1 x8601 +1 x8602 +1 x8603 +1 x8604 +1 x8605 +1 x8606 +1 x8607 +1 x8608 +1 x8609 +1 x8610 +1 x8611 +1 x8612 +1 x8613 +1 x8614 +1 x8615 +1 x8616 +1 x8617 +1 x8618 +1 x8619 +1 x8620 +1 x8621 +1 x8622 +1 x8623 +1 x8624 +1 x8625 +1 x8626 +1 x8627 +1 x8628 +1 x8629 +1 x8630 +1 x8631 +1 x8632 +1 x8633 +1 x8634 +1 x8635 +1 x8636 +1 x8637 +1 x8638 +1 x8639 +1 x8640 +1 x8641 +1 x8642 >= 1;++1 x8643 +1 x8644 +1 x8645 +1 x8646 +1 x8647 +1 x8648 +1 x8649 +1 x8650 +1 x8651 +1 x8652 +1 x8653 +1 x8654 +1 x8655 +1 x8656 +1 x8657 +1 x8658 +1 x8659 +1 x8660 +1 x8661 +1 x8662 +1 x8663 +1 x8664 +1 x8665 +1 x8666 +1 x8667 +1 x8668 +1 x8669 +1 x8670 +1 x8671 +1 x8672 +1 x8673 +1 x8674 +1 x8675 +1 x8676 +1 x8677 +1 x8678 +1 x8679 +1 x8680 +1 x8681 +1 x8682 +1 x8683 +1 x8684 +1 x8685 +1 x8686 +1 x8687 +1 x8688 +1 x8689 +1 x8690 +1 x8691 +1 x8692 +1 x8693 +1 x8694 +1 x8695 +1 x8696 +1 x8697 +1 x8698 +1 x8699 +1 x8700 +1 x8701 +1 x8702 +1 x8703 +1 x8704 +1 x8705 +1 x8706 +1 x8707 +1 x8708 +1 x8709 +1 x8710 +1 x8711 +1 x8712 +1 x8713 +1 x8714 +1 x8715 +1 x8716 +1 x8717 +1 x8718 +1 x8719 +1 x8720 +1 x8721 +1 x8722 +1 x8723 +1 x8724 +1 x8725 +1 x8726 +1 x8727 +1 x8728 +1 x8729 +1 x8730 +1 x8731 +1 x8732 +1 x8733 +1 x8734 +1 x8735 +1 x8736 +1 x8737 +1 x8738 +1 x8739 +1 x8740 +1 x8741 +1 x8742 +1 x8743 +1 x8744 +1 x8745 +1 x8746 +1 x8747 +1 x8748 +1 x8749 +1 x8750 +1 x8751 +1 x8752 +1 x8753 +1 x8754 +1 x8755 +1 x8756 +1 x8757 +1 x8758 +1 x8759 +1 x8760 +1 x8761 +1 x8762 +1 x8763 +1 x8764 +1 x8765 +1 x8766 +1 x8767 +1 x8768 +1 x8769 +1 x8770 +1 x8771 +1 x8772 +1 x8773 +1 x8774 +1 x8775 +1 x8776 +1 x8777 +1 x8778 +1 x8779 +1 x8780 +1 x8781 +1 x8782 +1 x8783 +1 x8784 +1 x8785 +1 x8786 +1 x8787 +1 x8788 +1 x8789 +1 x8790 +1 x8791 >= 1;++1 x8792 +1 x8793 +1 x8794 +1 x8795 +1 x8796 +1 x8797 +1 x8798 +1 x8799 +1 x8800 +1 x8801 +1 x8802 +1 x8803 +1 x8804 +1 x8805 +1 x8806 +1 x8807 +1 x8808 +1 x8809 +1 x8810 +1 x8811 +1 x8812 +1 x8813 +1 x8814 +1 x8815 +1 x8816 +1 x8817 +1 x8818 +1 x8819 +1 x8820 +1 x8821 +1 x8822 +1 x8823 +1 x8824 +1 x8825 +1 x8826 +1 x8827 +1 x8828 +1 x8829 +1 x8830 +1 x8831 +1 x8832 +1 x8833 +1 x8834 +1 x8835 +1 x8836 +1 x8837 +1 x8838 +1 x8839 +1 x8840 +1 x8841 +1 x8842 +1 x8843 +1 x8844 +1 x8845 +1 x8846 +1 x8847 +1 x8848 +1 x8849 +1 x8850 +1 x8851 +1 x8852 +1 x8853 +1 x8854 +1 x8855 +1 x8856 +1 x8857 +1 x8858 +1 x8859 +1 x8860 +1 x8861 +1 x8862 +1 x8863 +1 x8864 +1 x8865 +1 x8866 +1 x8867 +1 x8868 +1 x8869 +1 x8870 +1 x8871 +1 x8872 +1 x8873 +1 x8874 +1 x8875 +1 x8876 +1 x8877 +1 x8878 +1 x8879 +1 x8880 +1 x8881 +1 x8882 +1 x8883 +1 x8884 +1 x8885 +1 x8886 +1 x8887 +1 x8888 +1 x8889 +1 x8890 +1 x8891 +1 x8892 +1 x8893 +1 x8894 +1 x8895 +1 x8896 +1 x8897 +1 x8898 +1 x8899 +1 x8900 +1 x8901 +1 x8902 +1 x8903 +1 x8904 +1 x8905 +1 x8906 +1 x8907 +1 x8908 +1 x8909 +1 x8910 +1 x8911 +1 x8912 +1 x8913 +1 x8914 +1 x8915 +1 x8916 +1 x8917 +1 x8918 +1 x8919 +1 x8920 +1 x8921 +1 x8922 +1 x8923 +1 x8924 +1 x8925 +1 x8926 +1 x8927 +1 x8928 +1 x8929 +1 x8930 +1 x8931 +1 x8932 +1 x8933 +1 x8934 +1 x8935 +1 x8936 +1 x8937 +1 x8938 +1 x8939 +1 x8940 >= 1;++1 x8941 +1 x8942 +1 x8943 +1 x8944 +1 x8945 +1 x8946 +1 x8947 +1 x8948 +1 x8949 +1 x8950 +1 x8951 +1 x8952 +1 x8953 +1 x8954 +1 x8955 +1 x8956 +1 x8957 +1 x8958 +1 x8959 +1 x8960 +1 x8961 +1 x8962 +1 x8963 +1 x8964 +1 x8965 +1 x8966 +1 x8967 +1 x8968 +1 x8969 +1 x8970 +1 x8971 +1 x8972 +1 x8973 +1 x8974 +1 x8975 +1 x8976 +1 x8977 +1 x8978 +1 x8979 +1 x8980 +1 x8981 +1 x8982 +1 x8983 +1 x8984 +1 x8985 +1 x8986 +1 x8987 +1 x8988 +1 x8989 +1 x8990 +1 x8991 +1 x8992 +1 x8993 +1 x8994 +1 x8995 +1 x8996 +1 x8997 +1 x8998 +1 x8999 +1 x9000 +1 x9001 +1 x9002 +1 x9003 +1 x9004 +1 x9005 +1 x9006 +1 x9007 +1 x9008 +1 x9009 +1 x9010 +1 x9011 +1 x9012 +1 x9013 +1 x9014 +1 x9015 +1 x9016 +1 x9017 +1 x9018 +1 x9019 +1 x9020 +1 x9021 +1 x9022 +1 x9023 +1 x9024 +1 x9025 +1 x9026 +1 x9027 +1 x9028 +1 x9029 +1 x9030 +1 x9031 +1 x9032 +1 x9033 +1 x9034 +1 x9035 +1 x9036 +1 x9037 +1 x9038 +1 x9039 +1 x9040 +1 x9041 +1 x9042 +1 x9043 +1 x9044 +1 x9045 +1 x9046 +1 x9047 +1 x9048 +1 x9049 +1 x9050 +1 x9051 +1 x9052 +1 x9053 +1 x9054 +1 x9055 +1 x9056 +1 x9057 +1 x9058 +1 x9059 +1 x9060 +1 x9061 +1 x9062 +1 x9063 +1 x9064 +1 x9065 +1 x9066 +1 x9067 +1 x9068 +1 x9069 +1 x9070 +1 x9071 +1 x9072 +1 x9073 +1 x9074 +1 x9075 +1 x9076 +1 x9077 +1 x9078 +1 x9079 +1 x9080 +1 x9081 +1 x9082 +1 x9083 +1 x9084 +1 x9085 +1 x9086 +1 x9087 +1 x9088 +1 x9089 >= 1;++1 x9090 +1 x9091 +1 x9092 +1 x9093 +1 x9094 +1 x9095 +1 x9096 +1 x9097 +1 x9098 +1 x9099 +1 x9100 +1 x9101 +1 x9102 +1 x9103 +1 x9104 +1 x9105 +1 x9106 +1 x9107 +1 x9108 +1 x9109 +1 x9110 +1 x9111 +1 x9112 +1 x9113 +1 x9114 +1 x9115 +1 x9116 +1 x9117 +1 x9118 +1 x9119 +1 x9120 +1 x9121 +1 x9122 +1 x9123 +1 x9124 +1 x9125 +1 x9126 +1 x9127 +1 x9128 +1 x9129 +1 x9130 +1 x9131 +1 x9132 +1 x9133 +1 x9134 +1 x9135 +1 x9136 +1 x9137 +1 x9138 +1 x9139 +1 x9140 +1 x9141 +1 x9142 +1 x9143 +1 x9144 +1 x9145 +1 x9146 +1 x9147 +1 x9148 +1 x9149 +1 x9150 +1 x9151 +1 x9152 +1 x9153 +1 x9154 +1 x9155 +1 x9156 +1 x9157 +1 x9158 +1 x9159 +1 x9160 +1 x9161 +1 x9162 +1 x9163 +1 x9164 +1 x9165 +1 x9166 +1 x9167 +1 x9168 +1 x9169 +1 x9170 +1 x9171 +1 x9172 +1 x9173 +1 x9174 +1 x9175 +1 x9176 +1 x9177 +1 x9178 +1 x9179 +1 x9180 +1 x9181 +1 x9182 +1 x9183 +1 x9184 +1 x9185 +1 x9186 +1 x9187 +1 x9188 +1 x9189 +1 x9190 +1 x9191 +1 x9192 +1 x9193 +1 x9194 +1 x9195 +1 x9196 +1 x9197 +1 x9198 +1 x9199 +1 x9200 +1 x9201 +1 x9202 +1 x9203 +1 x9204 +1 x9205 +1 x9206 +1 x9207 +1 x9208 +1 x9209 +1 x9210 +1 x9211 +1 x9212 +1 x9213 +1 x9214 +1 x9215 +1 x9216 +1 x9217 +1 x9218 +1 x9219 +1 x9220 +1 x9221 +1 x9222 +1 x9223 +1 x9224 +1 x9225 +1 x9226 +1 x9227 +1 x9228 +1 x9229 +1 x9230 +1 x9231 +1 x9232 +1 x9233 +1 x9234 +1 x9235 +1 x9236 +1 x9237 +1 x9238 >= 1;++1 x9239 +1 x9240 +1 x9241 +1 x9242 +1 x9243 +1 x9244 +1 x9245 +1 x9246 +1 x9247 +1 x9248 +1 x9249 +1 x9250 +1 x9251 +1 x9252 +1 x9253 +1 x9254 +1 x9255 +1 x9256 +1 x9257 +1 x9258 +1 x9259 +1 x9260 +1 x9261 +1 x9262 +1 x9263 +1 x9264 +1 x9265 +1 x9266 +1 x9267 +1 x9268 +1 x9269 +1 x9270 +1 x9271 +1 x9272 +1 x9273 +1 x9274 +1 x9275 +1 x9276 +1 x9277 +1 x9278 +1 x9279 +1 x9280 +1 x9281 +1 x9282 +1 x9283 +1 x9284 +1 x9285 +1 x9286 +1 x9287 +1 x9288 +1 x9289 +1 x9290 +1 x9291 +1 x9292 +1 x9293 +1 x9294 +1 x9295 +1 x9296 +1 x9297 +1 x9298 +1 x9299 +1 x9300 +1 x9301 +1 x9302 +1 x9303 +1 x9304 +1 x9305 +1 x9306 +1 x9307 +1 x9308 +1 x9309 +1 x9310 +1 x9311 +1 x9312 +1 x9313 +1 x9314 +1 x9315 +1 x9316 +1 x9317 +1 x9318 +1 x9319 +1 x9320 +1 x9321 +1 x9322 +1 x9323 +1 x9324 +1 x9325 +1 x9326 +1 x9327 +1 x9328 +1 x9329 +1 x9330 +1 x9331 +1 x9332 +1 x9333 +1 x9334 +1 x9335 +1 x9336 +1 x9337 +1 x9338 +1 x9339 +1 x9340 +1 x9341 +1 x9342 +1 x9343 +1 x9344 +1 x9345 +1 x9346 +1 x9347 +1 x9348 +1 x9349 +1 x9350 +1 x9351 +1 x9352 +1 x9353 +1 x9354 +1 x9355 +1 x9356 +1 x9357 +1 x9358 +1 x9359 +1 x9360 +1 x9361 +1 x9362 +1 x9363 +1 x9364 +1 x9365 +1 x9366 +1 x9367 +1 x9368 +1 x9369 +1 x9370 +1 x9371 +1 x9372 +1 x9373 +1 x9374 +1 x9375 +1 x9376 +1 x9377 +1 x9378 +1 x9379 +1 x9380 +1 x9381 +1 x9382 +1 x9383 +1 x9384 +1 x9385 +1 x9386 +1 x9387 >= 1;++1 x9388 +1 x9389 +1 x9390 +1 x9391 +1 x9392 +1 x9393 +1 x9394 +1 x9395 +1 x9396 +1 x9397 +1 x9398 +1 x9399 +1 x9400 +1 x9401 +1 x9402 +1 x9403 +1 x9404 +1 x9405 +1 x9406 +1 x9407 +1 x9408 +1 x9409 +1 x9410 +1 x9411 +1 x9412 +1 x9413 +1 x9414 +1 x9415 +1 x9416 +1 x9417 +1 x9418 +1 x9419 +1 x9420 +1 x9421 +1 x9422 +1 x9423 +1 x9424 +1 x9425 +1 x9426 +1 x9427 +1 x9428 +1 x9429 +1 x9430 +1 x9431 +1 x9432 +1 x9433 +1 x9434 +1 x9435 +1 x9436 +1 x9437 +1 x9438 +1 x9439 +1 x9440 +1 x9441 +1 x9442 +1 x9443 +1 x9444 +1 x9445 +1 x9446 +1 x9447 +1 x9448 +1 x9449 +1 x9450 +1 x9451 +1 x9452 +1 x9453 +1 x9454 +1 x9455 +1 x9456 +1 x9457 +1 x9458 +1 x9459 +1 x9460 +1 x9461 +1 x9462 +1 x9463 +1 x9464 +1 x9465 +1 x9466 +1 x9467 +1 x9468 +1 x9469 +1 x9470 +1 x9471 +1 x9472 +1 x9473 +1 x9474 +1 x9475 +1 x9476 +1 x9477 +1 x9478 +1 x9479 +1 x9480 +1 x9481 +1 x9482 +1 x9483 +1 x9484 +1 x9485 +1 x9486 +1 x9487 +1 x9488 +1 x9489 +1 x9490 +1 x9491 +1 x9492 +1 x9493 +1 x9494 +1 x9495 +1 x9496 +1 x9497 +1 x9498 +1 x9499 +1 x9500 +1 x9501 +1 x9502 +1 x9503 +1 x9504 +1 x9505 +1 x9506 +1 x9507 +1 x9508 +1 x9509 +1 x9510 +1 x9511 +1 x9512 +1 x9513 +1 x9514 +1 x9515 +1 x9516 +1 x9517 +1 x9518 +1 x9519 +1 x9520 +1 x9521 +1 x9522 +1 x9523 +1 x9524 +1 x9525 +1 x9526 +1 x9527 +1 x9528 +1 x9529 +1 x9530 +1 x9531 +1 x9532 +1 x9533 +1 x9534 +1 x9535 +1 x9536 >= 1;++1 x9537 +1 x9538 +1 x9539 +1 x9540 +1 x9541 +1 x9542 +1 x9543 +1 x9544 +1 x9545 +1 x9546 +1 x9547 +1 x9548 +1 x9549 +1 x9550 +1 x9551 +1 x9552 +1 x9553 +1 x9554 +1 x9555 +1 x9556 +1 x9557 +1 x9558 +1 x9559 +1 x9560 +1 x9561 +1 x9562 +1 x9563 +1 x9564 +1 x9565 +1 x9566 +1 x9567 +1 x9568 +1 x9569 +1 x9570 +1 x9571 +1 x9572 +1 x9573 +1 x9574 +1 x9575 +1 x9576 +1 x9577 +1 x9578 +1 x9579 +1 x9580 +1 x9581 +1 x9582 +1 x9583 +1 x9584 +1 x9585 +1 x9586 +1 x9587 +1 x9588 +1 x9589 +1 x9590 +1 x9591 +1 x9592 +1 x9593 +1 x9594 +1 x9595 +1 x9596 +1 x9597 +1 x9598 +1 x9599 +1 x9600 +1 x9601 +1 x9602 +1 x9603 +1 x9604 +1 x9605 +1 x9606 +1 x9607 +1 x9608 +1 x9609 +1 x9610 +1 x9611 +1 x9612 +1 x9613 +1 x9614 +1 x9615 +1 x9616 +1 x9617 +1 x9618 +1 x9619 +1 x9620 +1 x9621 +1 x9622 +1 x9623 +1 x9624 +1 x9625 +1 x9626 +1 x9627 +1 x9628 +1 x9629 +1 x9630 +1 x9631 +1 x9632 +1 x9633 +1 x9634 +1 x9635 +1 x9636 +1 x9637 +1 x9638 +1 x9639 +1 x9640 +1 x9641 +1 x9642 +1 x9643 +1 x9644 +1 x9645 +1 x9646 +1 x9647 +1 x9648 +1 x9649 +1 x9650 +1 x9651 +1 x9652 +1 x9653 +1 x9654 +1 x9655 +1 x9656 +1 x9657 +1 x9658 +1 x9659 +1 x9660 +1 x9661 +1 x9662 +1 x9663 +1 x9664 +1 x9665 +1 x9666 +1 x9667 +1 x9668 +1 x9669 +1 x9670 +1 x9671 +1 x9672 +1 x9673 +1 x9674 +1 x9675 +1 x9676 +1 x9677 +1 x9678 +1 x9679 +1 x9680 +1 x9681 +1 x9682 +1 x9683 +1 x9684 +1 x9685 >= 1;++1 x9686 +1 x9687 +1 x9688 +1 x9689 +1 x9690 +1 x9691 +1 x9692 +1 x9693 +1 x9694 +1 x9695 +1 x9696 +1 x9697 +1 x9698 +1 x9699 +1 x9700 +1 x9701 +1 x9702 +1 x9703 +1 x9704 +1 x9705 +1 x9706 +1 x9707 +1 x9708 +1 x9709 +1 x9710 +1 x9711 +1 x9712 +1 x9713 +1 x9714 +1 x9715 +1 x9716 +1 x9717 +1 x9718 +1 x9719 +1 x9720 +1 x9721 +1 x9722 +1 x9723 +1 x9724 +1 x9725 +1 x9726 +1 x9727 +1 x9728 +1 x9729 +1 x9730 +1 x9731 +1 x9732 +1 x9733 +1 x9734 +1 x9735 +1 x9736 +1 x9737 +1 x9738 +1 x9739 +1 x9740 +1 x9741 +1 x9742 +1 x9743 +1 x9744 +1 x9745 +1 x9746 +1 x9747 +1 x9748 +1 x9749 +1 x9750 +1 x9751 +1 x9752 +1 x9753 +1 x9754 +1 x9755 +1 x9756 +1 x9757 +1 x9758 +1 x9759 +1 x9760 +1 x9761 +1 x9762 +1 x9763 +1 x9764 +1 x9765 +1 x9766 +1 x9767 +1 x9768 +1 x9769 +1 x9770 +1 x9771 +1 x9772 +1 x9773 +1 x9774 +1 x9775 +1 x9776 +1 x9777 +1 x9778 +1 x9779 +1 x9780 +1 x9781 +1 x9782 +1 x9783 +1 x9784 +1 x9785 +1 x9786 +1 x9787 +1 x9788 +1 x9789 +1 x9790 +1 x9791 +1 x9792 +1 x9793 +1 x9794 +1 x9795 +1 x9796 +1 x9797 +1 x9798 +1 x9799 +1 x9800 +1 x9801 +1 x9802 +1 x9803 +1 x9804 +1 x9805 +1 x9806 +1 x9807 +1 x9808 +1 x9809 +1 x9810 +1 x9811 +1 x9812 +1 x9813 +1 x9814 +1 x9815 +1 x9816 +1 x9817 +1 x9818 +1 x9819 +1 x9820 +1 x9821 +1 x9822 +1 x9823 +1 x9824 +1 x9825 +1 x9826 +1 x9827 +1 x9828 +1 x9829 +1 x9830 +1 x9831 +1 x9832 +1 x9833 +1 x9834 >= 1;++1 x9835 +1 x9836 +1 x9837 +1 x9838 +1 x9839 +1 x9840 +1 x9841 +1 x9842 +1 x9843 +1 x9844 +1 x9845 +1 x9846 +1 x9847 +1 x9848 +1 x9849 +1 x9850 +1 x9851 +1 x9852 +1 x9853 +1 x9854 +1 x9855 +1 x9856 +1 x9857 +1 x9858 +1 x9859 +1 x9860 +1 x9861 +1 x9862 +1 x9863 +1 x9864 +1 x9865 +1 x9866 +1 x9867 +1 x9868 +1 x9869 +1 x9870 +1 x9871 +1 x9872 +1 x9873 +1 x9874 +1 x9875 +1 x9876 +1 x9877 +1 x9878 +1 x9879 +1 x9880 +1 x9881 +1 x9882 +1 x9883 +1 x9884 +1 x9885 +1 x9886 +1 x9887 +1 x9888 +1 x9889 +1 x9890 +1 x9891 +1 x9892 +1 x9893 +1 x9894 +1 x9895 +1 x9896 +1 x9897 +1 x9898 +1 x9899 +1 x9900 +1 x9901 +1 x9902 +1 x9903 +1 x9904 +1 x9905 +1 x9906 +1 x9907 +1 x9908 +1 x9909 +1 x9910 +1 x9911 +1 x9912 +1 x9913 +1 x9914 +1 x9915 +1 x9916 +1 x9917 +1 x9918 +1 x9919 +1 x9920 +1 x9921 +1 x9922 +1 x9923 +1 x9924 +1 x9925 +1 x9926 +1 x9927 +1 x9928 +1 x9929 +1 x9930 +1 x9931 +1 x9932 +1 x9933 +1 x9934 +1 x9935 +1 x9936 +1 x9937 +1 x9938 +1 x9939 +1 x9940 +1 x9941 +1 x9942 +1 x9943 +1 x9944 +1 x9945 +1 x9946 +1 x9947 +1 x9948 +1 x9949 +1 x9950 +1 x9951 +1 x9952 +1 x9953 +1 x9954 +1 x9955 +1 x9956 +1 x9957 +1 x9958 +1 x9959 +1 x9960 +1 x9961 +1 x9962 +1 x9963 +1 x9964 +1 x9965 +1 x9966 +1 x9967 +1 x9968 +1 x9969 +1 x9970 +1 x9971 +1 x9972 +1 x9973 +1 x9974 +1 x9975 +1 x9976 +1 x9977 +1 x9978 +1 x9979 +1 x9980 +1 x9981 +1 x9982 +1 x9983 >= 1;++1 x9984 +1 x9985 +1 x9986 +1 x9987 +1 x9988 +1 x9989 +1 x9990 +1 x9991 +1 x9992 +1 x9993 +1 x9994 +1 x9995 +1 x9996 +1 x9997 +1 x9998 +1 x9999 +1 x10000 +1 x10001 +1 x10002 +1 x10003 +1 x10004 +1 x10005 +1 x10006 +1 x10007 +1 x10008 +1 x10009 +1 x10010 +1 x10011 +1 x10012 +1 x10013 +1 x10014 +1 x10015 +1 x10016 +1 x10017 +1 x10018 +1 x10019 +1 x10020 +1 x10021 +1 x10022 +1 x10023 +1 x10024 +1 x10025 +1 x10026 +1 x10027 +1 x10028 +1 x10029 +1 x10030 +1 x10031 +1 x10032 +1 x10033 +1 x10034 +1 x10035 +1 x10036 +1 x10037 +1 x10038 +1 x10039 +1 x10040 +1 x10041 +1 x10042 +1 x10043 +1 x10044 +1 x10045 +1 x10046 +1 x10047 +1 x10048 +1 x10049 +1 x10050 +1 x10051 +1 x10052 +1 x10053 +1 x10054 +1 x10055 +1 x10056 +1 x10057 +1 x10058 +1 x10059 +1 x10060 +1 x10061 +1 x10062 +1 x10063 +1 x10064 +1 x10065 +1 x10066 +1 x10067 +1 x10068 +1 x10069 +1 x10070 +1 x10071 +1 x10072 +1 x10073 +1 x10074 +1 x10075 +1 x10076 +1 x10077 +1 x10078 +1 x10079 +1 x10080 +1 x10081 +1 x10082 +1 x10083 +1 x10084 +1 x10085 +1 x10086 +1 x10087 +1 x10088 +1 x10089 +1 x10090 +1 x10091 +1 x10092 +1 x10093 +1 x10094 +1 x10095 +1 x10096 +1 x10097 +1 x10098 +1 x10099 +1 x10100 +1 x10101 +1 x10102 +1 x10103 +1 x10104 +1 x10105 +1 x10106 +1 x10107 +1 x10108 +1 x10109 +1 x10110 +1 x10111 +1 x10112 +1 x10113 +1 x10114 +1 x10115 +1 x10116 +1 x10117 +1 x10118 +1 x10119 +1 x10120 +1 x10121 +1 x10122 +1 x10123 +1 x10124 +1 x10125 +1 x10126 +1 x10127 +1 x10128 +1 x10129 +1 x10130 +1 x10131 +1 x10132 >= 1;++1 x10133 +1 x10134 +1 x10135 +1 x10136 +1 x10137 +1 x10138 +1 x10139 +1 x10140 +1 x10141 +1 x10142 +1 x10143 +1 x10144 +1 x10145 +1 x10146 +1 x10147 +1 x10148 +1 x10149 +1 x10150 +1 x10151 +1 x10152 +1 x10153 +1 x10154 +1 x10155 +1 x10156 +1 x10157 +1 x10158 +1 x10159 +1 x10160 +1 x10161 +1 x10162 +1 x10163 +1 x10164 +1 x10165 +1 x10166 +1 x10167 +1 x10168 +1 x10169 +1 x10170 +1 x10171 +1 x10172 +1 x10173 +1 x10174 +1 x10175 +1 x10176 +1 x10177 +1 x10178 +1 x10179 +1 x10180 +1 x10181 +1 x10182 +1 x10183 +1 x10184 +1 x10185 +1 x10186 +1 x10187 +1 x10188 +1 x10189 +1 x10190 +1 x10191 +1 x10192 +1 x10193 +1 x10194 +1 x10195 +1 x10196 +1 x10197 +1 x10198 +1 x10199 +1 x10200 +1 x10201 +1 x10202 +1 x10203 +1 x10204 +1 x10205 +1 x10206 +1 x10207 +1 x10208 +1 x10209 +1 x10210 +1 x10211 +1 x10212 +1 x10213 +1 x10214 +1 x10215 +1 x10216 +1 x10217 +1 x10218 +1 x10219 +1 x10220 +1 x10221 +1 x10222 +1 x10223 +1 x10224 +1 x10225 +1 x10226 +1 x10227 +1 x10228 +1 x10229 +1 x10230 +1 x10231 +1 x10232 +1 x10233 +1 x10234 +1 x10235 +1 x10236 +1 x10237 +1 x10238 +1 x10239 +1 x10240 +1 x10241 +1 x10242 +1 x10243 +1 x10244 +1 x10245 +1 x10246 +1 x10247 +1 x10248 +1 x10249 +1 x10250 +1 x10251 +1 x10252 +1 x10253 +1 x10254 +1 x10255 +1 x10256 +1 x10257 +1 x10258 +1 x10259 +1 x10260 +1 x10261 +1 x10262 +1 x10263 +1 x10264 +1 x10265 +1 x10266 +1 x10267 +1 x10268 +1 x10269 +1 x10270 +1 x10271 +1 x10272 +1 x10273 +1 x10274 +1 x10275 +1 x10276 +1 x10277 +1 x10278 +1 x10279 +1 x10280 +1 x10281 >= 1;++1 x10282 +1 x10283 +1 x10284 +1 x10285 +1 x10286 +1 x10287 +1 x10288 +1 x10289 +1 x10290 +1 x10291 +1 x10292 +1 x10293 +1 x10294 +1 x10295 +1 x10296 +1 x10297 +1 x10298 +1 x10299 +1 x10300 +1 x10301 +1 x10302 +1 x10303 +1 x10304 +1 x10305 +1 x10306 +1 x10307 +1 x10308 +1 x10309 +1 x10310 +1 x10311 +1 x10312 +1 x10313 +1 x10314 +1 x10315 +1 x10316 +1 x10317 +1 x10318 +1 x10319 +1 x10320 +1 x10321 +1 x10322 +1 x10323 +1 x10324 +1 x10325 +1 x10326 +1 x10327 +1 x10328 +1 x10329 +1 x10330 +1 x10331 +1 x10332 +1 x10333 +1 x10334 +1 x10335 +1 x10336 +1 x10337 +1 x10338 +1 x10339 +1 x10340 +1 x10341 +1 x10342 +1 x10343 +1 x10344 +1 x10345 +1 x10346 +1 x10347 +1 x10348 +1 x10349 +1 x10350 +1 x10351 +1 x10352 +1 x10353 +1 x10354 +1 x10355 +1 x10356 +1 x10357 +1 x10358 +1 x10359 +1 x10360 +1 x10361 +1 x10362 +1 x10363 +1 x10364 +1 x10365 +1 x10366 +1 x10367 +1 x10368 +1 x10369 +1 x10370 +1 x10371 +1 x10372 +1 x10373 +1 x10374 +1 x10375 +1 x10376 +1 x10377 +1 x10378 +1 x10379 +1 x10380 +1 x10381 +1 x10382 +1 x10383 +1 x10384 +1 x10385 +1 x10386 +1 x10387 +1 x10388 +1 x10389 +1 x10390 +1 x10391 +1 x10392 +1 x10393 +1 x10394 +1 x10395 +1 x10396 +1 x10397 +1 x10398 +1 x10399 +1 x10400 +1 x10401 +1 x10402 +1 x10403 +1 x10404 +1 x10405 +1 x10406 +1 x10407 +1 x10408 +1 x10409 +1 x10410 +1 x10411 +1 x10412 +1 x10413 +1 x10414 +1 x10415 +1 x10416 +1 x10417 +1 x10418 +1 x10419 +1 x10420 +1 x10421 +1 x10422 +1 x10423 +1 x10424 +1 x10425 +1 x10426 +1 x10427 +1 x10428 +1 x10429 +1 x10430 >= 1;++1 x10431 +1 x10432 +1 x10433 +1 x10434 +1 x10435 +1 x10436 +1 x10437 +1 x10438 +1 x10439 +1 x10440 +1 x10441 +1 x10442 +1 x10443 +1 x10444 +1 x10445 +1 x10446 +1 x10447 +1 x10448 +1 x10449 +1 x10450 +1 x10451 +1 x10452 +1 x10453 +1 x10454 +1 x10455 +1 x10456 +1 x10457 +1 x10458 +1 x10459 +1 x10460 +1 x10461 +1 x10462 +1 x10463 +1 x10464 +1 x10465 +1 x10466 +1 x10467 +1 x10468 +1 x10469 +1 x10470 +1 x10471 +1 x10472 +1 x10473 +1 x10474 +1 x10475 +1 x10476 +1 x10477 +1 x10478 +1 x10479 +1 x10480 +1 x10481 +1 x10482 +1 x10483 +1 x10484 +1 x10485 +1 x10486 +1 x10487 +1 x10488 +1 x10489 +1 x10490 +1 x10491 +1 x10492 +1 x10493 +1 x10494 +1 x10495 +1 x10496 +1 x10497 +1 x10498 +1 x10499 +1 x10500 +1 x10501 +1 x10502 +1 x10503 +1 x10504 +1 x10505 +1 x10506 +1 x10507 +1 x10508 +1 x10509 +1 x10510 +1 x10511 +1 x10512 +1 x10513 +1 x10514 +1 x10515 +1 x10516 +1 x10517 +1 x10518 +1 x10519 +1 x10520 +1 x10521 +1 x10522 +1 x10523 +1 x10524 +1 x10525 +1 x10526 +1 x10527 +1 x10528 +1 x10529 +1 x10530 +1 x10531 +1 x10532 +1 x10533 +1 x10534 +1 x10535 +1 x10536 +1 x10537 +1 x10538 +1 x10539 +1 x10540 +1 x10541 +1 x10542 +1 x10543 +1 x10544 +1 x10545 +1 x10546 +1 x10547 +1 x10548 +1 x10549 +1 x10550 +1 x10551 +1 x10552 +1 x10553 +1 x10554 +1 x10555 +1 x10556 +1 x10557 +1 x10558 +1 x10559 +1 x10560 +1 x10561 +1 x10562 +1 x10563 +1 x10564 +1 x10565 +1 x10566 +1 x10567 +1 x10568 +1 x10569 +1 x10570 +1 x10571 +1 x10572 +1 x10573 +1 x10574 +1 x10575 +1 x10576 +1 x10577 +1 x10578 +1 x10579 >= 1;++1 x10580 +1 x10581 +1 x10582 +1 x10583 +1 x10584 +1 x10585 +1 x10586 +1 x10587 +1 x10588 +1 x10589 +1 x10590 +1 x10591 +1 x10592 +1 x10593 +1 x10594 +1 x10595 +1 x10596 +1 x10597 +1 x10598 +1 x10599 +1 x10600 +1 x10601 +1 x10602 +1 x10603 +1 x10604 +1 x10605 +1 x10606 +1 x10607 +1 x10608 +1 x10609 +1 x10610 +1 x10611 +1 x10612 +1 x10613 +1 x10614 +1 x10615 +1 x10616 +1 x10617 +1 x10618 +1 x10619 +1 x10620 +1 x10621 +1 x10622 +1 x10623 +1 x10624 +1 x10625 +1 x10626 +1 x10627 +1 x10628 +1 x10629 +1 x10630 +1 x10631 +1 x10632 +1 x10633 +1 x10634 +1 x10635 +1 x10636 +1 x10637 +1 x10638 +1 x10639 +1 x10640 +1 x10641 +1 x10642 +1 x10643 +1 x10644 +1 x10645 +1 x10646 +1 x10647 +1 x10648 +1 x10649 +1 x10650 +1 x10651 +1 x10652 +1 x10653 +1 x10654 +1 x10655 +1 x10656 +1 x10657 +1 x10658 +1 x10659 +1 x10660 +1 x10661 +1 x10662 +1 x10663 +1 x10664 +1 x10665 +1 x10666 +1 x10667 +1 x10668 +1 x10669 +1 x10670 +1 x10671 +1 x10672 +1 x10673 +1 x10674 +1 x10675 +1 x10676 +1 x10677 +1 x10678 +1 x10679 +1 x10680 +1 x10681 +1 x10682 +1 x10683 +1 x10684 +1 x10685 +1 x10686 +1 x10687 +1 x10688 +1 x10689 +1 x10690 +1 x10691 +1 x10692 +1 x10693 +1 x10694 +1 x10695 +1 x10696 +1 x10697 +1 x10698 +1 x10699 +1 x10700 +1 x10701 +1 x10702 +1 x10703 +1 x10704 +1 x10705 +1 x10706 +1 x10707 +1 x10708 +1 x10709 +1 x10710 +1 x10711 +1 x10712 +1 x10713 +1 x10714 +1 x10715 +1 x10716 +1 x10717 +1 x10718 +1 x10719 +1 x10720 +1 x10721 +1 x10722 +1 x10723 +1 x10724 +1 x10725 +1 x10726 +1 x10727 +1 x10728 >= 1;++1 x10729 +1 x10730 +1 x10731 +1 x10732 +1 x10733 +1 x10734 +1 x10735 +1 x10736 +1 x10737 +1 x10738 +1 x10739 +1 x10740 +1 x10741 +1 x10742 +1 x10743 +1 x10744 +1 x10745 +1 x10746 +1 x10747 +1 x10748 +1 x10749 +1 x10750 +1 x10751 +1 x10752 +1 x10753 +1 x10754 +1 x10755 +1 x10756 +1 x10757 +1 x10758 +1 x10759 +1 x10760 +1 x10761 +1 x10762 +1 x10763 +1 x10764 +1 x10765 +1 x10766 +1 x10767 +1 x10768 +1 x10769 +1 x10770 +1 x10771 +1 x10772 +1 x10773 +1 x10774 +1 x10775 +1 x10776 +1 x10777 +1 x10778 +1 x10779 +1 x10780 +1 x10781 +1 x10782 +1 x10783 +1 x10784 +1 x10785 +1 x10786 +1 x10787 +1 x10788 +1 x10789 +1 x10790 +1 x10791 +1 x10792 +1 x10793 +1 x10794 +1 x10795 +1 x10796 +1 x10797 +1 x10798 +1 x10799 +1 x10800 +1 x10801 +1 x10802 +1 x10803 +1 x10804 +1 x10805 +1 x10806 +1 x10807 +1 x10808 +1 x10809 +1 x10810 +1 x10811 +1 x10812 +1 x10813 +1 x10814 +1 x10815 +1 x10816 +1 x10817 +1 x10818 +1 x10819 +1 x10820 +1 x10821 +1 x10822 +1 x10823 +1 x10824 +1 x10825 +1 x10826 +1 x10827 +1 x10828 +1 x10829 +1 x10830 +1 x10831 +1 x10832 +1 x10833 +1 x10834 +1 x10835 +1 x10836 +1 x10837 +1 x10838 +1 x10839 +1 x10840 +1 x10841 +1 x10842 +1 x10843 +1 x10844 +1 x10845 +1 x10846 +1 x10847 +1 x10848 +1 x10849 +1 x10850 +1 x10851 +1 x10852 +1 x10853 +1 x10854 +1 x10855 +1 x10856 +1 x10857 +1 x10858 +1 x10859 +1 x10860 +1 x10861 +1 x10862 +1 x10863 +1 x10864 +1 x10865 +1 x10866 +1 x10867 +1 x10868 +1 x10869 +1 x10870 +1 x10871 +1 x10872 +1 x10873 +1 x10874 +1 x10875 +1 x10876 +1 x10877 >= 1;++1 x10878 +1 x10879 +1 x10880 +1 x10881 +1 x10882 +1 x10883 +1 x10884 +1 x10885 +1 x10886 +1 x10887 +1 x10888 +1 x10889 +1 x10890 +1 x10891 +1 x10892 +1 x10893 +1 x10894 +1 x10895 +1 x10896 +1 x10897 +1 x10898 +1 x10899 +1 x10900 +1 x10901 +1 x10902 +1 x10903 +1 x10904 +1 x10905 +1 x10906 +1 x10907 +1 x10908 +1 x10909 +1 x10910 +1 x10911 +1 x10912 +1 x10913 +1 x10914 +1 x10915 +1 x10916 +1 x10917 +1 x10918 +1 x10919 +1 x10920 +1 x10921 +1 x10922 +1 x10923 +1 x10924 +1 x10925 +1 x10926 +1 x10927 +1 x10928 +1 x10929 +1 x10930 +1 x10931 +1 x10932 +1 x10933 +1 x10934 +1 x10935 +1 x10936 +1 x10937 +1 x10938 +1 x10939 +1 x10940 +1 x10941 +1 x10942 +1 x10943 +1 x10944 +1 x10945 +1 x10946 +1 x10947 +1 x10948 +1 x10949 +1 x10950 +1 x10951 +1 x10952 +1 x10953 +1 x10954 +1 x10955 +1 x10956 +1 x10957 +1 x10958 +1 x10959 +1 x10960 +1 x10961 +1 x10962 +1 x10963 +1 x10964 +1 x10965 +1 x10966 +1 x10967 +1 x10968 +1 x10969 +1 x10970 +1 x10971 +1 x10972 +1 x10973 +1 x10974 +1 x10975 +1 x10976 +1 x10977 +1 x10978 +1 x10979 +1 x10980 +1 x10981 +1 x10982 +1 x10983 +1 x10984 +1 x10985 +1 x10986 +1 x10987 +1 x10988 +1 x10989 +1 x10990 +1 x10991 +1 x10992 +1 x10993 +1 x10994 +1 x10995 +1 x10996 +1 x10997 +1 x10998 +1 x10999 +1 x11000 +1 x11001 +1 x11002 +1 x11003 +1 x11004 +1 x11005 +1 x11006 +1 x11007 +1 x11008 +1 x11009 +1 x11010 +1 x11011 +1 x11012 +1 x11013 +1 x11014 +1 x11015 +1 x11016 +1 x11017 +1 x11018 +1 x11019 +1 x11020 +1 x11021 +1 x11022 +1 x11023 +1 x11024 +1 x11025 +1 x11026 >= 1;++1 x11027 +1 x11028 +1 x11029 +1 x11030 +1 x11031 +1 x11032 +1 x11033 +1 x11034 +1 x11035 +1 x11036 +1 x11037 +1 x11038 +1 x11039 +1 x11040 +1 x11041 +1 x11042 +1 x11043 +1 x11044 +1 x11045 +1 x11046 +1 x11047 +1 x11048 +1 x11049 +1 x11050 +1 x11051 +1 x11052 +1 x11053 +1 x11054 +1 x11055 +1 x11056 +1 x11057 +1 x11058 +1 x11059 +1 x11060 +1 x11061 +1 x11062 +1 x11063 +1 x11064 +1 x11065 +1 x11066 +1 x11067 +1 x11068 +1 x11069 +1 x11070 +1 x11071 +1 x11072 +1 x11073 +1 x11074 +1 x11075 +1 x11076 +1 x11077 +1 x11078 +1 x11079 +1 x11080 +1 x11081 +1 x11082 +1 x11083 +1 x11084 +1 x11085 +1 x11086 +1 x11087 +1 x11088 +1 x11089 +1 x11090 +1 x11091 +1 x11092 +1 x11093 +1 x11094 +1 x11095 +1 x11096 +1 x11097 +1 x11098 +1 x11099 +1 x11100 +1 x11101 +1 x11102 +1 x11103 +1 x11104 +1 x11105 +1 x11106 +1 x11107 +1 x11108 +1 x11109 +1 x11110 +1 x11111 +1 x11112 +1 x11113 +1 x11114 +1 x11115 +1 x11116 +1 x11117 +1 x11118 +1 x11119 +1 x11120 +1 x11121 +1 x11122 +1 x11123 +1 x11124 +1 x11125 +1 x11126 +1 x11127 +1 x11128 +1 x11129 +1 x11130 +1 x11131 +1 x11132 +1 x11133 +1 x11134 +1 x11135 +1 x11136 +1 x11137 +1 x11138 +1 x11139 +1 x11140 +1 x11141 +1 x11142 +1 x11143 +1 x11144 +1 x11145 +1 x11146 +1 x11147 +1 x11148 +1 x11149 +1 x11150 +1 x11151 +1 x11152 +1 x11153 +1 x11154 +1 x11155 +1 x11156 +1 x11157 +1 x11158 +1 x11159 +1 x11160 +1 x11161 +1 x11162 +1 x11163 +1 x11164 +1 x11165 +1 x11166 +1 x11167 +1 x11168 +1 x11169 +1 x11170 +1 x11171 +1 x11172 +1 x11173 +1 x11174 +1 x11175 >= 1;++1 x11176 +1 x11177 +1 x11178 +1 x11179 +1 x11180 +1 x11181 +1 x11182 +1 x11183 +1 x11184 +1 x11185 +1 x11186 +1 x11187 +1 x11188 +1 x11189 +1 x11190 +1 x11191 +1 x11192 +1 x11193 +1 x11194 +1 x11195 +1 x11196 +1 x11197 +1 x11198 +1 x11199 +1 x11200 +1 x11201 +1 x11202 +1 x11203 +1 x11204 +1 x11205 +1 x11206 +1 x11207 +1 x11208 +1 x11209 +1 x11210 +1 x11211 +1 x11212 +1 x11213 +1 x11214 +1 x11215 +1 x11216 +1 x11217 +1 x11218 +1 x11219 +1 x11220 +1 x11221 +1 x11222 +1 x11223 +1 x11224 +1 x11225 +1 x11226 +1 x11227 +1 x11228 +1 x11229 +1 x11230 +1 x11231 +1 x11232 +1 x11233 +1 x11234 +1 x11235 +1 x11236 +1 x11237 +1 x11238 +1 x11239 +1 x11240 +1 x11241 +1 x11242 +1 x11243 +1 x11244 +1 x11245 +1 x11246 +1 x11247 +1 x11248 +1 x11249 +1 x11250 +1 x11251 +1 x11252 +1 x11253 +1 x11254 +1 x11255 +1 x11256 +1 x11257 +1 x11258 +1 x11259 +1 x11260 +1 x11261 +1 x11262 +1 x11263 +1 x11264 +1 x11265 +1 x11266 +1 x11267 +1 x11268 +1 x11269 +1 x11270 +1 x11271 +1 x11272 +1 x11273 +1 x11274 +1 x11275 +1 x11276 +1 x11277 +1 x11278 +1 x11279 +1 x11280 +1 x11281 +1 x11282 +1 x11283 +1 x11284 +1 x11285 +1 x11286 +1 x11287 +1 x11288 +1 x11289 +1 x11290 +1 x11291 +1 x11292 +1 x11293 +1 x11294 +1 x11295 +1 x11296 +1 x11297 +1 x11298 +1 x11299 +1 x11300 +1 x11301 +1 x11302 +1 x11303 +1 x11304 +1 x11305 +1 x11306 +1 x11307 +1 x11308 +1 x11309 +1 x11310 +1 x11311 +1 x11312 +1 x11313 +1 x11314 +1 x11315 +1 x11316 +1 x11317 +1 x11318 +1 x11319 +1 x11320 +1 x11321 +1 x11322 +1 x11323 +1 x11324 >= 1;++1 x11325 +1 x11326 +1 x11327 +1 x11328 +1 x11329 +1 x11330 +1 x11331 +1 x11332 +1 x11333 +1 x11334 +1 x11335 +1 x11336 +1 x11337 +1 x11338 +1 x11339 +1 x11340 +1 x11341 +1 x11342 +1 x11343 +1 x11344 +1 x11345 +1 x11346 +1 x11347 +1 x11348 +1 x11349 +1 x11350 +1 x11351 +1 x11352 +1 x11353 +1 x11354 +1 x11355 +1 x11356 +1 x11357 +1 x11358 +1 x11359 +1 x11360 +1 x11361 +1 x11362 +1 x11363 +1 x11364 +1 x11365 +1 x11366 +1 x11367 +1 x11368 +1 x11369 +1 x11370 +1 x11371 +1 x11372 +1 x11373 +1 x11374 +1 x11375 +1 x11376 +1 x11377 +1 x11378 +1 x11379 +1 x11380 +1 x11381 +1 x11382 +1 x11383 +1 x11384 +1 x11385 +1 x11386 +1 x11387 +1 x11388 +1 x11389 +1 x11390 +1 x11391 +1 x11392 +1 x11393 +1 x11394 +1 x11395 +1 x11396 +1 x11397 +1 x11398 +1 x11399 +1 x11400 +1 x11401 +1 x11402 +1 x11403 +1 x11404 +1 x11405 +1 x11406 +1 x11407 +1 x11408 +1 x11409 +1 x11410 +1 x11411 +1 x11412 +1 x11413 +1 x11414 +1 x11415 +1 x11416 +1 x11417 +1 x11418 +1 x11419 +1 x11420 +1 x11421 +1 x11422 +1 x11423 +1 x11424 +1 x11425 +1 x11426 +1 x11427 +1 x11428 +1 x11429 +1 x11430 +1 x11431 +1 x11432 +1 x11433 +1 x11434 +1 x11435 +1 x11436 +1 x11437 +1 x11438 +1 x11439 +1 x11440 +1 x11441 +1 x11442 +1 x11443 +1 x11444 +1 x11445 +1 x11446 +1 x11447 +1 x11448 +1 x11449 +1 x11450 +1 x11451 +1 x11452 +1 x11453 +1 x11454 +1 x11455 +1 x11456 +1 x11457 +1 x11458 +1 x11459 +1 x11460 +1 x11461 +1 x11462 +1 x11463 +1 x11464 +1 x11465 +1 x11466 +1 x11467 +1 x11468 +1 x11469 +1 x11470 +1 x11471 +1 x11472 +1 x11473 >= 1;++1 x11474 +1 x11475 +1 x11476 +1 x11477 +1 x11478 +1 x11479 +1 x11480 +1 x11481 +1 x11482 +1 x11483 +1 x11484 +1 x11485 +1 x11486 +1 x11487 +1 x11488 +1 x11489 +1 x11490 +1 x11491 +1 x11492 +1 x11493 +1 x11494 +1 x11495 +1 x11496 +1 x11497 +1 x11498 +1 x11499 +1 x11500 +1 x11501 +1 x11502 +1 x11503 +1 x11504 +1 x11505 +1 x11506 +1 x11507 +1 x11508 +1 x11509 +1 x11510 +1 x11511 +1 x11512 +1 x11513 +1 x11514 +1 x11515 +1 x11516 +1 x11517 +1 x11518 +1 x11519 +1 x11520 +1 x11521 +1 x11522 +1 x11523 +1 x11524 +1 x11525 +1 x11526 +1 x11527 +1 x11528 +1 x11529 +1 x11530 +1 x11531 +1 x11532 +1 x11533 +1 x11534 +1 x11535 +1 x11536 +1 x11537 +1 x11538 +1 x11539 +1 x11540 +1 x11541 +1 x11542 +1 x11543 +1 x11544 +1 x11545 +1 x11546 +1 x11547 +1 x11548 +1 x11549 +1 x11550 +1 x11551 +1 x11552 +1 x11553 +1 x11554 +1 x11555 +1 x11556 +1 x11557 +1 x11558 +1 x11559 +1 x11560 +1 x11561 +1 x11562 +1 x11563 +1 x11564 +1 x11565 +1 x11566 +1 x11567 +1 x11568 +1 x11569 +1 x11570 +1 x11571 +1 x11572 +1 x11573 +1 x11574 +1 x11575 +1 x11576 +1 x11577 +1 x11578 +1 x11579 +1 x11580 +1 x11581 +1 x11582 +1 x11583 +1 x11584 +1 x11585 +1 x11586 +1 x11587 +1 x11588 +1 x11589 +1 x11590 +1 x11591 +1 x11592 +1 x11593 +1 x11594 +1 x11595 +1 x11596 +1 x11597 +1 x11598 +1 x11599 +1 x11600 +1 x11601 +1 x11602 +1 x11603 +1 x11604 +1 x11605 +1 x11606 +1 x11607 +1 x11608 +1 x11609 +1 x11610 +1 x11611 +1 x11612 +1 x11613 +1 x11614 +1 x11615 +1 x11616 +1 x11617 +1 x11618 +1 x11619 +1 x11620 +1 x11621 +1 x11622 >= 1;++1 x11623 +1 x11624 +1 x11625 +1 x11626 +1 x11627 +1 x11628 +1 x11629 +1 x11630 +1 x11631 +1 x11632 +1 x11633 +1 x11634 +1 x11635 +1 x11636 +1 x11637 +1 x11638 +1 x11639 +1 x11640 +1 x11641 +1 x11642 +1 x11643 +1 x11644 +1 x11645 +1 x11646 +1 x11647 +1 x11648 +1 x11649 +1 x11650 +1 x11651 +1 x11652 +1 x11653 +1 x11654 +1 x11655 +1 x11656 +1 x11657 +1 x11658 +1 x11659 +1 x11660 +1 x11661 +1 x11662 +1 x11663 +1 x11664 +1 x11665 +1 x11666 +1 x11667 +1 x11668 +1 x11669 +1 x11670 +1 x11671 +1 x11672 +1 x11673 +1 x11674 +1 x11675 +1 x11676 +1 x11677 +1 x11678 +1 x11679 +1 x11680 +1 x11681 +1 x11682 +1 x11683 +1 x11684 +1 x11685 +1 x11686 +1 x11687 +1 x11688 +1 x11689 +1 x11690 +1 x11691 +1 x11692 +1 x11693 +1 x11694 +1 x11695 +1 x11696 +1 x11697 +1 x11698 +1 x11699 +1 x11700 +1 x11701 +1 x11702 +1 x11703 +1 x11704 +1 x11705 +1 x11706 +1 x11707 +1 x11708 +1 x11709 +1 x11710 +1 x11711 +1 x11712 +1 x11713 +1 x11714 +1 x11715 +1 x11716 +1 x11717 +1 x11718 +1 x11719 +1 x11720 +1 x11721 +1 x11722 +1 x11723 +1 x11724 +1 x11725 +1 x11726 +1 x11727 +1 x11728 +1 x11729 +1 x11730 +1 x11731 +1 x11732 +1 x11733 +1 x11734 +1 x11735 +1 x11736 +1 x11737 +1 x11738 +1 x11739 +1 x11740 +1 x11741 +1 x11742 +1 x11743 +1 x11744 +1 x11745 +1 x11746 +1 x11747 +1 x11748 +1 x11749 +1 x11750 +1 x11751 +1 x11752 +1 x11753 +1 x11754 +1 x11755 +1 x11756 +1 x11757 +1 x11758 +1 x11759 +1 x11760 +1 x11761 +1 x11762 +1 x11763 +1 x11764 +1 x11765 +1 x11766 +1 x11767 +1 x11768 +1 x11769 +1 x11770 +1 x11771 >= 1;++1 x11772 +1 x11773 +1 x11774 +1 x11775 +1 x11776 +1 x11777 +1 x11778 +1 x11779 +1 x11780 +1 x11781 +1 x11782 +1 x11783 +1 x11784 +1 x11785 +1 x11786 +1 x11787 +1 x11788 +1 x11789 +1 x11790 +1 x11791 +1 x11792 +1 x11793 +1 x11794 +1 x11795 +1 x11796 +1 x11797 +1 x11798 +1 x11799 +1 x11800 +1 x11801 +1 x11802 +1 x11803 +1 x11804 +1 x11805 +1 x11806 +1 x11807 +1 x11808 +1 x11809 +1 x11810 +1 x11811 +1 x11812 +1 x11813 +1 x11814 +1 x11815 +1 x11816 +1 x11817 +1 x11818 +1 x11819 +1 x11820 +1 x11821 +1 x11822 +1 x11823 +1 x11824 +1 x11825 +1 x11826 +1 x11827 +1 x11828 +1 x11829 +1 x11830 +1 x11831 +1 x11832 +1 x11833 +1 x11834 +1 x11835 +1 x11836 +1 x11837 +1 x11838 +1 x11839 +1 x11840 +1 x11841 +1 x11842 +1 x11843 +1 x11844 +1 x11845 +1 x11846 +1 x11847 +1 x11848 +1 x11849 +1 x11850 +1 x11851 +1 x11852 +1 x11853 +1 x11854 +1 x11855 +1 x11856 +1 x11857 +1 x11858 +1 x11859 +1 x11860 +1 x11861 +1 x11862 +1 x11863 +1 x11864 +1 x11865 +1 x11866 +1 x11867 +1 x11868 +1 x11869 +1 x11870 +1 x11871 +1 x11872 +1 x11873 +1 x11874 +1 x11875 +1 x11876 +1 x11877 +1 x11878 +1 x11879 +1 x11880 +1 x11881 +1 x11882 +1 x11883 +1 x11884 +1 x11885 +1 x11886 +1 x11887 +1 x11888 +1 x11889 +1 x11890 +1 x11891 +1 x11892 +1 x11893 +1 x11894 +1 x11895 +1 x11896 +1 x11897 +1 x11898 +1 x11899 +1 x11900 +1 x11901 +1 x11902 +1 x11903 +1 x11904 +1 x11905 +1 x11906 +1 x11907 +1 x11908 +1 x11909 +1 x11910 +1 x11911 +1 x11912 +1 x11913 +1 x11914 +1 x11915 +1 x11916 +1 x11917 +1 x11918 +1 x11919 +1 x11920 >= 1;++1 x11921 +1 x11922 +1 x11923 +1 x11924 +1 x11925 +1 x11926 +1 x11927 +1 x11928 +1 x11929 +1 x11930 +1 x11931 +1 x11932 +1 x11933 +1 x11934 +1 x11935 +1 x11936 +1 x11937 +1 x11938 +1 x11939 +1 x11940 +1 x11941 +1 x11942 +1 x11943 +1 x11944 +1 x11945 +1 x11946 +1 x11947 +1 x11948 +1 x11949 +1 x11950 +1 x11951 +1 x11952 +1 x11953 +1 x11954 +1 x11955 +1 x11956 +1 x11957 +1 x11958 +1 x11959 +1 x11960 +1 x11961 +1 x11962 +1 x11963 +1 x11964 +1 x11965 +1 x11966 +1 x11967 +1 x11968 +1 x11969 +1 x11970 +1 x11971 +1 x11972 +1 x11973 +1 x11974 +1 x11975 +1 x11976 +1 x11977 +1 x11978 +1 x11979 +1 x11980 +1 x11981 +1 x11982 +1 x11983 +1 x11984 +1 x11985 +1 x11986 +1 x11987 +1 x11988 +1 x11989 +1 x11990 +1 x11991 +1 x11992 +1 x11993 +1 x11994 +1 x11995 +1 x11996 +1 x11997 +1 x11998 +1 x11999 +1 x12000 +1 x12001 +1 x12002 +1 x12003 +1 x12004 +1 x12005 +1 x12006 +1 x12007 +1 x12008 +1 x12009 +1 x12010 +1 x12011 +1 x12012 +1 x12013 +1 x12014 +1 x12015 +1 x12016 +1 x12017 +1 x12018 +1 x12019 +1 x12020 +1 x12021 +1 x12022 +1 x12023 +1 x12024 +1 x12025 +1 x12026 +1 x12027 +1 x12028 +1 x12029 +1 x12030 +1 x12031 +1 x12032 +1 x12033 +1 x12034 +1 x12035 +1 x12036 +1 x12037 +1 x12038 +1 x12039 +1 x12040 +1 x12041 +1 x12042 +1 x12043 +1 x12044 +1 x12045 +1 x12046 +1 x12047 +1 x12048 +1 x12049 +1 x12050 +1 x12051 +1 x12052 +1 x12053 +1 x12054 +1 x12055 +1 x12056 +1 x12057 +1 x12058 +1 x12059 +1 x12060 +1 x12061 +1 x12062 +1 x12063 +1 x12064 +1 x12065 +1 x12066 +1 x12067 +1 x12068 +1 x12069 >= 1;++1 x12070 +1 x12071 +1 x12072 +1 x12073 +1 x12074 +1 x12075 +1 x12076 +1 x12077 +1 x12078 +1 x12079 +1 x12080 +1 x12081 +1 x12082 +1 x12083 +1 x12084 +1 x12085 +1 x12086 +1 x12087 +1 x12088 +1 x12089 +1 x12090 +1 x12091 +1 x12092 +1 x12093 +1 x12094 +1 x12095 +1 x12096 +1 x12097 +1 x12098 +1 x12099 +1 x12100 +1 x12101 +1 x12102 +1 x12103 +1 x12104 +1 x12105 +1 x12106 +1 x12107 +1 x12108 +1 x12109 +1 x12110 +1 x12111 +1 x12112 +1 x12113 +1 x12114 +1 x12115 +1 x12116 +1 x12117 +1 x12118 +1 x12119 +1 x12120 +1 x12121 +1 x12122 +1 x12123 +1 x12124 +1 x12125 +1 x12126 +1 x12127 +1 x12128 +1 x12129 +1 x12130 +1 x12131 +1 x12132 +1 x12133 +1 x12134 +1 x12135 +1 x12136 +1 x12137 +1 x12138 +1 x12139 +1 x12140 +1 x12141 +1 x12142 +1 x12143 +1 x12144 +1 x12145 +1 x12146 +1 x12147 +1 x12148 +1 x12149 +1 x12150 +1 x12151 +1 x12152 +1 x12153 +1 x12154 +1 x12155 +1 x12156 +1 x12157 +1 x12158 +1 x12159 +1 x12160 +1 x12161 +1 x12162 +1 x12163 +1 x12164 +1 x12165 +1 x12166 +1 x12167 +1 x12168 +1 x12169 +1 x12170 +1 x12171 +1 x12172 +1 x12173 +1 x12174 +1 x12175 +1 x12176 +1 x12177 +1 x12178 +1 x12179 +1 x12180 +1 x12181 +1 x12182 +1 x12183 +1 x12184 +1 x12185 +1 x12186 +1 x12187 +1 x12188 +1 x12189 +1 x12190 +1 x12191 +1 x12192 +1 x12193 +1 x12194 +1 x12195 +1 x12196 +1 x12197 +1 x12198 +1 x12199 +1 x12200 +1 x12201 +1 x12202 +1 x12203 +1 x12204 +1 x12205 +1 x12206 +1 x12207 +1 x12208 +1 x12209 +1 x12210 +1 x12211 +1 x12212 +1 x12213 +1 x12214 +1 x12215 +1 x12216 +1 x12217 +1 x12218 >= 1;++1 x12219 +1 x12220 +1 x12221 +1 x12222 +1 x12223 +1 x12224 +1 x12225 +1 x12226 +1 x12227 +1 x12228 +1 x12229 +1 x12230 +1 x12231 +1 x12232 +1 x12233 +1 x12234 +1 x12235 +1 x12236 +1 x12237 +1 x12238 +1 x12239 +1 x12240 +1 x12241 +1 x12242 +1 x12243 +1 x12244 +1 x12245 +1 x12246 +1 x12247 +1 x12248 +1 x12249 +1 x12250 +1 x12251 +1 x12252 +1 x12253 +1 x12254 +1 x12255 +1 x12256 +1 x12257 +1 x12258 +1 x12259 +1 x12260 +1 x12261 +1 x12262 +1 x12263 +1 x12264 +1 x12265 +1 x12266 +1 x12267 +1 x12268 +1 x12269 +1 x12270 +1 x12271 +1 x12272 +1 x12273 +1 x12274 +1 x12275 +1 x12276 +1 x12277 +1 x12278 +1 x12279 +1 x12280 +1 x12281 +1 x12282 +1 x12283 +1 x12284 +1 x12285 +1 x12286 +1 x12287 +1 x12288 +1 x12289 +1 x12290 +1 x12291 +1 x12292 +1 x12293 +1 x12294 +1 x12295 +1 x12296 +1 x12297 +1 x12298 +1 x12299 +1 x12300 +1 x12301 +1 x12302 +1 x12303 +1 x12304 +1 x12305 +1 x12306 +1 x12307 +1 x12308 +1 x12309 +1 x12310 +1 x12311 +1 x12312 +1 x12313 +1 x12314 +1 x12315 +1 x12316 +1 x12317 +1 x12318 +1 x12319 +1 x12320 +1 x12321 +1 x12322 +1 x12323 +1 x12324 +1 x12325 +1 x12326 +1 x12327 +1 x12328 +1 x12329 +1 x12330 +1 x12331 +1 x12332 +1 x12333 +1 x12334 +1 x12335 +1 x12336 +1 x12337 +1 x12338 +1 x12339 +1 x12340 +1 x12341 +1 x12342 +1 x12343 +1 x12344 +1 x12345 +1 x12346 +1 x12347 +1 x12348 +1 x12349 +1 x12350 +1 x12351 +1 x12352 +1 x12353 +1 x12354 +1 x12355 +1 x12356 +1 x12357 +1 x12358 +1 x12359 +1 x12360 +1 x12361 +1 x12362 +1 x12363 +1 x12364 +1 x12365 +1 x12366 +1 x12367 >= 1;++1 x12368 +1 x12369 +1 x12370 +1 x12371 +1 x12372 +1 x12373 +1 x12374 +1 x12375 +1 x12376 +1 x12377 +1 x12378 +1 x12379 +1 x12380 +1 x12381 +1 x12382 +1 x12383 +1 x12384 +1 x12385 +1 x12386 +1 x12387 +1 x12388 +1 x12389 +1 x12390 +1 x12391 +1 x12392 +1 x12393 +1 x12394 +1 x12395 +1 x12396 +1 x12397 +1 x12398 +1 x12399 +1 x12400 +1 x12401 +1 x12402 +1 x12403 +1 x12404 +1 x12405 +1 x12406 +1 x12407 +1 x12408 +1 x12409 +1 x12410 +1 x12411 +1 x12412 +1 x12413 +1 x12414 +1 x12415 +1 x12416 +1 x12417 +1 x12418 +1 x12419 +1 x12420 +1 x12421 +1 x12422 +1 x12423 +1 x12424 +1 x12425 +1 x12426 +1 x12427 +1 x12428 +1 x12429 +1 x12430 +1 x12431 +1 x12432 +1 x12433 +1 x12434 +1 x12435 +1 x12436 +1 x12437 +1 x12438 +1 x12439 +1 x12440 +1 x12441 +1 x12442 +1 x12443 +1 x12444 +1 x12445 +1 x12446 +1 x12447 +1 x12448 +1 x12449 +1 x12450 +1 x12451 +1 x12452 +1 x12453 +1 x12454 +1 x12455 +1 x12456 +1 x12457 +1 x12458 +1 x12459 +1 x12460 +1 x12461 +1 x12462 +1 x12463 +1 x12464 +1 x12465 +1 x12466 +1 x12467 +1 x12468 +1 x12469 +1 x12470 +1 x12471 +1 x12472 +1 x12473 +1 x12474 +1 x12475 +1 x12476 +1 x12477 +1 x12478 +1 x12479 +1 x12480 +1 x12481 +1 x12482 +1 x12483 +1 x12484 +1 x12485 +1 x12486 +1 x12487 +1 x12488 +1 x12489 +1 x12490 +1 x12491 +1 x12492 +1 x12493 +1 x12494 +1 x12495 +1 x12496 +1 x12497 +1 x12498 +1 x12499 +1 x12500 +1 x12501 +1 x12502 +1 x12503 +1 x12504 +1 x12505 +1 x12506 +1 x12507 +1 x12508 +1 x12509 +1 x12510 +1 x12511 +1 x12512 +1 x12513 +1 x12514 +1 x12515 +1 x12516 >= 1;++1 x12517 +1 x12518 +1 x12519 +1 x12520 +1 x12521 +1 x12522 +1 x12523 +1 x12524 +1 x12525 +1 x12526 +1 x12527 +1 x12528 +1 x12529 +1 x12530 +1 x12531 +1 x12532 +1 x12533 +1 x12534 +1 x12535 +1 x12536 +1 x12537 +1 x12538 +1 x12539 +1 x12540 +1 x12541 +1 x12542 +1 x12543 +1 x12544 +1 x12545 +1 x12546 +1 x12547 +1 x12548 +1 x12549 +1 x12550 +1 x12551 +1 x12552 +1 x12553 +1 x12554 +1 x12555 +1 x12556 +1 x12557 +1 x12558 +1 x12559 +1 x12560 +1 x12561 +1 x12562 +1 x12563 +1 x12564 +1 x12565 +1 x12566 +1 x12567 +1 x12568 +1 x12569 +1 x12570 +1 x12571 +1 x12572 +1 x12573 +1 x12574 +1 x12575 +1 x12576 +1 x12577 +1 x12578 +1 x12579 +1 x12580 +1 x12581 +1 x12582 +1 x12583 +1 x12584 +1 x12585 +1 x12586 +1 x12587 +1 x12588 +1 x12589 +1 x12590 +1 x12591 +1 x12592 +1 x12593 +1 x12594 +1 x12595 +1 x12596 +1 x12597 +1 x12598 +1 x12599 +1 x12600 +1 x12601 +1 x12602 +1 x12603 +1 x12604 +1 x12605 +1 x12606 +1 x12607 +1 x12608 +1 x12609 +1 x12610 +1 x12611 +1 x12612 +1 x12613 +1 x12614 +1 x12615 +1 x12616 +1 x12617 +1 x12618 +1 x12619 +1 x12620 +1 x12621 +1 x12622 +1 x12623 +1 x12624 +1 x12625 +1 x12626 +1 x12627 +1 x12628 +1 x12629 +1 x12630 +1 x12631 +1 x12632 +1 x12633 +1 x12634 +1 x12635 +1 x12636 +1 x12637 +1 x12638 +1 x12639 +1 x12640 +1 x12641 +1 x12642 +1 x12643 +1 x12644 +1 x12645 +1 x12646 +1 x12647 +1 x12648 +1 x12649 +1 x12650 +1 x12651 +1 x12652 +1 x12653 +1 x12654 +1 x12655 +1 x12656 +1 x12657 +1 x12658 +1 x12659 +1 x12660 +1 x12661 +1 x12662 +1 x12663 +1 x12664 +1 x12665 >= 1;++1 x12666 +1 x12667 +1 x12668 +1 x12669 +1 x12670 +1 x12671 +1 x12672 +1 x12673 +1 x12674 +1 x12675 +1 x12676 +1 x12677 +1 x12678 +1 x12679 +1 x12680 +1 x12681 +1 x12682 +1 x12683 +1 x12684 +1 x12685 +1 x12686 +1 x12687 +1 x12688 +1 x12689 +1 x12690 +1 x12691 +1 x12692 +1 x12693 +1 x12694 +1 x12695 +1 x12696 +1 x12697 +1 x12698 +1 x12699 +1 x12700 +1 x12701 +1 x12702 +1 x12703 +1 x12704 +1 x12705 +1 x12706 +1 x12707 +1 x12708 +1 x12709 +1 x12710 +1 x12711 +1 x12712 +1 x12713 +1 x12714 +1 x12715 +1 x12716 +1 x12717 +1 x12718 +1 x12719 +1 x12720 +1 x12721 +1 x12722 +1 x12723 +1 x12724 +1 x12725 +1 x12726 +1 x12727 +1 x12728 +1 x12729 +1 x12730 +1 x12731 +1 x12732 +1 x12733 +1 x12734 +1 x12735 +1 x12736 +1 x12737 +1 x12738 +1 x12739 +1 x12740 +1 x12741 +1 x12742 +1 x12743 +1 x12744 +1 x12745 +1 x12746 +1 x12747 +1 x12748 +1 x12749 +1 x12750 +1 x12751 +1 x12752 +1 x12753 +1 x12754 +1 x12755 +1 x12756 +1 x12757 +1 x12758 +1 x12759 +1 x12760 +1 x12761 +1 x12762 +1 x12763 +1 x12764 +1 x12765 +1 x12766 +1 x12767 +1 x12768 +1 x12769 +1 x12770 +1 x12771 +1 x12772 +1 x12773 +1 x12774 +1 x12775 +1 x12776 +1 x12777 +1 x12778 +1 x12779 +1 x12780 +1 x12781 +1 x12782 +1 x12783 +1 x12784 +1 x12785 +1 x12786 +1 x12787 +1 x12788 +1 x12789 +1 x12790 +1 x12791 +1 x12792 +1 x12793 +1 x12794 +1 x12795 +1 x12796 +1 x12797 +1 x12798 +1 x12799 +1 x12800 +1 x12801 +1 x12802 +1 x12803 +1 x12804 +1 x12805 +1 x12806 +1 x12807 +1 x12808 +1 x12809 +1 x12810 +1 x12811 +1 x12812 +1 x12813 +1 x12814 >= 1;++1 x12815 +1 x12816 +1 x12817 +1 x12818 +1 x12819 +1 x12820 +1 x12821 +1 x12822 +1 x12823 +1 x12824 +1 x12825 +1 x12826 +1 x12827 +1 x12828 +1 x12829 +1 x12830 +1 x12831 +1 x12832 +1 x12833 +1 x12834 +1 x12835 +1 x12836 +1 x12837 +1 x12838 +1 x12839 +1 x12840 +1 x12841 +1 x12842 +1 x12843 +1 x12844 +1 x12845 +1 x12846 +1 x12847 +1 x12848 +1 x12849 +1 x12850 +1 x12851 +1 x12852 +1 x12853 +1 x12854 +1 x12855 +1 x12856 +1 x12857 +1 x12858 +1 x12859 +1 x12860 +1 x12861 +1 x12862 +1 x12863 +1 x12864 +1 x12865 +1 x12866 +1 x12867 +1 x12868 +1 x12869 +1 x12870 +1 x12871 +1 x12872 +1 x12873 +1 x12874 +1 x12875 +1 x12876 +1 x12877 +1 x12878 +1 x12879 +1 x12880 +1 x12881 +1 x12882 +1 x12883 +1 x12884 +1 x12885 +1 x12886 +1 x12887 +1 x12888 +1 x12889 +1 x12890 +1 x12891 +1 x12892 +1 x12893 +1 x12894 +1 x12895 +1 x12896 +1 x12897 +1 x12898 +1 x12899 +1 x12900 +1 x12901 +1 x12902 +1 x12903 +1 x12904 +1 x12905 +1 x12906 +1 x12907 +1 x12908 +1 x12909 +1 x12910 +1 x12911 +1 x12912 +1 x12913 +1 x12914 +1 x12915 +1 x12916 +1 x12917 +1 x12918 +1 x12919 +1 x12920 +1 x12921 +1 x12922 +1 x12923 +1 x12924 +1 x12925 +1 x12926 +1 x12927 +1 x12928 +1 x12929 +1 x12930 +1 x12931 +1 x12932 +1 x12933 +1 x12934 +1 x12935 +1 x12936 +1 x12937 +1 x12938 +1 x12939 +1 x12940 +1 x12941 +1 x12942 +1 x12943 +1 x12944 +1 x12945 +1 x12946 +1 x12947 +1 x12948 +1 x12949 +1 x12950 +1 x12951 +1 x12952 +1 x12953 +1 x12954 +1 x12955 +1 x12956 +1 x12957 +1 x12958 +1 x12959 +1 x12960 +1 x12961 +1 x12962 +1 x12963 >= 1;++1 x12964 +1 x12965 +1 x12966 +1 x12967 +1 x12968 +1 x12969 +1 x12970 +1 x12971 +1 x12972 +1 x12973 +1 x12974 +1 x12975 +1 x12976 +1 x12977 +1 x12978 +1 x12979 +1 x12980 +1 x12981 +1 x12982 +1 x12983 +1 x12984 +1 x12985 +1 x12986 +1 x12987 +1 x12988 +1 x12989 +1 x12990 +1 x12991 +1 x12992 +1 x12993 +1 x12994 +1 x12995 +1 x12996 +1 x12997 +1 x12998 +1 x12999 +1 x13000 +1 x13001 +1 x13002 +1 x13003 +1 x13004 +1 x13005 +1 x13006 +1 x13007 +1 x13008 +1 x13009 +1 x13010 +1 x13011 +1 x13012 +1 x13013 +1 x13014 +1 x13015 +1 x13016 +1 x13017 +1 x13018 +1 x13019 +1 x13020 +1 x13021 +1 x13022 +1 x13023 +1 x13024 +1 x13025 +1 x13026 +1 x13027 +1 x13028 +1 x13029 +1 x13030 +1 x13031 +1 x13032 +1 x13033 +1 x13034 +1 x13035 +1 x13036 +1 x13037 +1 x13038 +1 x13039 +1 x13040 +1 x13041 +1 x13042 +1 x13043 +1 x13044 +1 x13045 +1 x13046 +1 x13047 +1 x13048 +1 x13049 +1 x13050 +1 x13051 +1 x13052 +1 x13053 +1 x13054 +1 x13055 +1 x13056 +1 x13057 +1 x13058 +1 x13059 +1 x13060 +1 x13061 +1 x13062 +1 x13063 +1 x13064 +1 x13065 +1 x13066 +1 x13067 +1 x13068 +1 x13069 +1 x13070 +1 x13071 +1 x13072 +1 x13073 +1 x13074 +1 x13075 +1 x13076 +1 x13077 +1 x13078 +1 x13079 +1 x13080 +1 x13081 +1 x13082 +1 x13083 +1 x13084 +1 x13085 +1 x13086 +1 x13087 +1 x13088 +1 x13089 +1 x13090 +1 x13091 +1 x13092 +1 x13093 +1 x13094 +1 x13095 +1 x13096 +1 x13097 +1 x13098 +1 x13099 +1 x13100 +1 x13101 +1 x13102 +1 x13103 +1 x13104 +1 x13105 +1 x13106 +1 x13107 +1 x13108 +1 x13109 +1 x13110 +1 x13111 +1 x13112 >= 1;++1 x13113 +1 x13114 +1 x13115 +1 x13116 +1 x13117 +1 x13118 +1 x13119 +1 x13120 +1 x13121 +1 x13122 +1 x13123 +1 x13124 +1 x13125 +1 x13126 +1 x13127 +1 x13128 +1 x13129 +1 x13130 +1 x13131 +1 x13132 +1 x13133 +1 x13134 +1 x13135 +1 x13136 +1 x13137 +1 x13138 +1 x13139 +1 x13140 +1 x13141 +1 x13142 +1 x13143 +1 x13144 +1 x13145 +1 x13146 +1 x13147 +1 x13148 +1 x13149 +1 x13150 +1 x13151 +1 x13152 +1 x13153 +1 x13154 +1 x13155 +1 x13156 +1 x13157 +1 x13158 +1 x13159 +1 x13160 +1 x13161 +1 x13162 +1 x13163 +1 x13164 +1 x13165 +1 x13166 +1 x13167 +1 x13168 +1 x13169 +1 x13170 +1 x13171 +1 x13172 +1 x13173 +1 x13174 +1 x13175 +1 x13176 +1 x13177 +1 x13178 +1 x13179 +1 x13180 +1 x13181 +1 x13182 +1 x13183 +1 x13184 +1 x13185 +1 x13186 +1 x13187 +1 x13188 +1 x13189 +1 x13190 +1 x13191 +1 x13192 +1 x13193 +1 x13194 +1 x13195 +1 x13196 +1 x13197 +1 x13198 +1 x13199 +1 x13200 +1 x13201 +1 x13202 +1 x13203 +1 x13204 +1 x13205 +1 x13206 +1 x13207 +1 x13208 +1 x13209 +1 x13210 +1 x13211 +1 x13212 +1 x13213 +1 x13214 +1 x13215 +1 x13216 +1 x13217 +1 x13218 +1 x13219 +1 x13220 +1 x13221 +1 x13222 +1 x13223 +1 x13224 +1 x13225 +1 x13226 +1 x13227 +1 x13228 +1 x13229 +1 x13230 +1 x13231 +1 x13232 +1 x13233 +1 x13234 +1 x13235 +1 x13236 +1 x13237 +1 x13238 +1 x13239 +1 x13240 +1 x13241 +1 x13242 +1 x13243 +1 x13244 +1 x13245 +1 x13246 +1 x13247 +1 x13248 +1 x13249 +1 x13250 +1 x13251 +1 x13252 +1 x13253 +1 x13254 +1 x13255 +1 x13256 +1 x13257 +1 x13258 +1 x13259 +1 x13260 +1 x13261 >= 1;++1 x13262 +1 x13263 +1 x13264 +1 x13265 +1 x13266 +1 x13267 +1 x13268 +1 x13269 +1 x13270 +1 x13271 +1 x13272 +1 x13273 +1 x13274 +1 x13275 +1 x13276 +1 x13277 +1 x13278 +1 x13279 +1 x13280 +1 x13281 +1 x13282 +1 x13283 +1 x13284 +1 x13285 +1 x13286 +1 x13287 +1 x13288 +1 x13289 +1 x13290 +1 x13291 +1 x13292 +1 x13293 +1 x13294 +1 x13295 +1 x13296 +1 x13297 +1 x13298 +1 x13299 +1 x13300 +1 x13301 +1 x13302 +1 x13303 +1 x13304 +1 x13305 +1 x13306 +1 x13307 +1 x13308 +1 x13309 +1 x13310 +1 x13311 +1 x13312 +1 x13313 +1 x13314 +1 x13315 +1 x13316 +1 x13317 +1 x13318 +1 x13319 +1 x13320 +1 x13321 +1 x13322 +1 x13323 +1 x13324 +1 x13325 +1 x13326 +1 x13327 +1 x13328 +1 x13329 +1 x13330 +1 x13331 +1 x13332 +1 x13333 +1 x13334 +1 x13335 +1 x13336 +1 x13337 +1 x13338 +1 x13339 +1 x13340 +1 x13341 +1 x13342 +1 x13343 +1 x13344 +1 x13345 +1 x13346 +1 x13347 +1 x13348 +1 x13349 +1 x13350 +1 x13351 +1 x13352 +1 x13353 +1 x13354 +1 x13355 +1 x13356 +1 x13357 +1 x13358 +1 x13359 +1 x13360 +1 x13361 +1 x13362 +1 x13363 +1 x13364 +1 x13365 +1 x13366 +1 x13367 +1 x13368 +1 x13369 +1 x13370 +1 x13371 +1 x13372 +1 x13373 +1 x13374 +1 x13375 +1 x13376 +1 x13377 +1 x13378 +1 x13379 +1 x13380 +1 x13381 +1 x13382 +1 x13383 +1 x13384 +1 x13385 +1 x13386 +1 x13387 +1 x13388 +1 x13389 +1 x13390 +1 x13391 +1 x13392 +1 x13393 +1 x13394 +1 x13395 +1 x13396 +1 x13397 +1 x13398 +1 x13399 +1 x13400 +1 x13401 +1 x13402 +1 x13403 +1 x13404 +1 x13405 +1 x13406 +1 x13407 +1 x13408 +1 x13409 +1 x13410 >= 1;++1 x13411 +1 x13412 +1 x13413 +1 x13414 +1 x13415 +1 x13416 +1 x13417 +1 x13418 +1 x13419 +1 x13420 +1 x13421 +1 x13422 +1 x13423 +1 x13424 +1 x13425 +1 x13426 +1 x13427 +1 x13428 +1 x13429 +1 x13430 +1 x13431 +1 x13432 +1 x13433 +1 x13434 +1 x13435 +1 x13436 +1 x13437 +1 x13438 +1 x13439 +1 x13440 +1 x13441 +1 x13442 +1 x13443 +1 x13444 +1 x13445 +1 x13446 +1 x13447 +1 x13448 +1 x13449 +1 x13450 +1 x13451 +1 x13452 +1 x13453 +1 x13454 +1 x13455 +1 x13456 +1 x13457 +1 x13458 +1 x13459 +1 x13460 +1 x13461 +1 x13462 +1 x13463 +1 x13464 +1 x13465 +1 x13466 +1 x13467 +1 x13468 +1 x13469 +1 x13470 +1 x13471 +1 x13472 +1 x13473 +1 x13474 +1 x13475 +1 x13476 +1 x13477 +1 x13478 +1 x13479 +1 x13480 +1 x13481 +1 x13482 +1 x13483 +1 x13484 +1 x13485 +1 x13486 +1 x13487 +1 x13488 +1 x13489 +1 x13490 +1 x13491 +1 x13492 +1 x13493 +1 x13494 +1 x13495 +1 x13496 +1 x13497 +1 x13498 +1 x13499 +1 x13500 +1 x13501 +1 x13502 +1 x13503 +1 x13504 +1 x13505 +1 x13506 +1 x13507 +1 x13508 +1 x13509 +1 x13510 +1 x13511 +1 x13512 +1 x13513 +1 x13514 +1 x13515 +1 x13516 +1 x13517 +1 x13518 +1 x13519 +1 x13520 +1 x13521 +1 x13522 +1 x13523 +1 x13524 +1 x13525 +1 x13526 +1 x13527 +1 x13528 +1 x13529 +1 x13530 +1 x13531 +1 x13532 +1 x13533 +1 x13534 +1 x13535 +1 x13536 +1 x13537 +1 x13538 +1 x13539 +1 x13540 +1 x13541 +1 x13542 +1 x13543 +1 x13544 +1 x13545 +1 x13546 +1 x13547 +1 x13548 +1 x13549 +1 x13550 +1 x13551 +1 x13552 +1 x13553 +1 x13554 +1 x13555 +1 x13556 +1 x13557 +1 x13558 +1 x13559 >= 1;++1 x13560 +1 x13561 +1 x13562 +1 x13563 +1 x13564 +1 x13565 +1 x13566 +1 x13567 +1 x13568 +1 x13569 +1 x13570 +1 x13571 +1 x13572 +1 x13573 +1 x13574 +1 x13575 +1 x13576 +1 x13577 +1 x13578 +1 x13579 +1 x13580 +1 x13581 +1 x13582 +1 x13583 +1 x13584 +1 x13585 +1 x13586 +1 x13587 +1 x13588 +1 x13589 +1 x13590 +1 x13591 +1 x13592 +1 x13593 +1 x13594 +1 x13595 +1 x13596 +1 x13597 +1 x13598 +1 x13599 +1 x13600 +1 x13601 +1 x13602 +1 x13603 +1 x13604 +1 x13605 +1 x13606 +1 x13607 +1 x13608 +1 x13609 +1 x13610 +1 x13611 +1 x13612 +1 x13613 +1 x13614 +1 x13615 +1 x13616 +1 x13617 +1 x13618 +1 x13619 +1 x13620 +1 x13621 +1 x13622 +1 x13623 +1 x13624 +1 x13625 +1 x13626 +1 x13627 +1 x13628 +1 x13629 +1 x13630 +1 x13631 +1 x13632 +1 x13633 +1 x13634 +1 x13635 +1 x13636 +1 x13637 +1 x13638 +1 x13639 +1 x13640 +1 x13641 +1 x13642 +1 x13643 +1 x13644 +1 x13645 +1 x13646 +1 x13647 +1 x13648 +1 x13649 +1 x13650 +1 x13651 +1 x13652 +1 x13653 +1 x13654 +1 x13655 +1 x13656 +1 x13657 +1 x13658 +1 x13659 +1 x13660 +1 x13661 +1 x13662 +1 x13663 +1 x13664 +1 x13665 +1 x13666 +1 x13667 +1 x13668 +1 x13669 +1 x13670 +1 x13671 +1 x13672 +1 x13673 +1 x13674 +1 x13675 +1 x13676 +1 x13677 +1 x13678 +1 x13679 +1 x13680 +1 x13681 +1 x13682 +1 x13683 +1 x13684 +1 x13685 +1 x13686 +1 x13687 +1 x13688 +1 x13689 +1 x13690 +1 x13691 +1 x13692 +1 x13693 +1 x13694 +1 x13695 +1 x13696 +1 x13697 +1 x13698 +1 x13699 +1 x13700 +1 x13701 +1 x13702 +1 x13703 +1 x13704 +1 x13705 +1 x13706 +1 x13707 +1 x13708 >= 1;++1 x13709 +1 x13710 +1 x13711 +1 x13712 +1 x13713 +1 x13714 +1 x13715 +1 x13716 +1 x13717 +1 x13718 +1 x13719 +1 x13720 +1 x13721 +1 x13722 +1 x13723 +1 x13724 +1 x13725 +1 x13726 +1 x13727 +1 x13728 +1 x13729 +1 x13730 +1 x13731 +1 x13732 +1 x13733 +1 x13734 +1 x13735 +1 x13736 +1 x13737 +1 x13738 +1 x13739 +1 x13740 +1 x13741 +1 x13742 +1 x13743 +1 x13744 +1 x13745 +1 x13746 +1 x13747 +1 x13748 +1 x13749 +1 x13750 +1 x13751 +1 x13752 +1 x13753 +1 x13754 +1 x13755 +1 x13756 +1 x13757 +1 x13758 +1 x13759 +1 x13760 +1 x13761 +1 x13762 +1 x13763 +1 x13764 +1 x13765 +1 x13766 +1 x13767 +1 x13768 +1 x13769 +1 x13770 +1 x13771 +1 x13772 +1 x13773 +1 x13774 +1 x13775 +1 x13776 +1 x13777 +1 x13778 +1 x13779 +1 x13780 +1 x13781 +1 x13782 +1 x13783 +1 x13784 +1 x13785 +1 x13786 +1 x13787 +1 x13788 +1 x13789 +1 x13790 +1 x13791 +1 x13792 +1 x13793 +1 x13794 +1 x13795 +1 x13796 +1 x13797 +1 x13798 +1 x13799 +1 x13800 +1 x13801 +1 x13802 +1 x13803 +1 x13804 +1 x13805 +1 x13806 +1 x13807 +1 x13808 +1 x13809 +1 x13810 +1 x13811 +1 x13812 +1 x13813 +1 x13814 +1 x13815 +1 x13816 +1 x13817 +1 x13818 +1 x13819 +1 x13820 +1 x13821 +1 x13822 +1 x13823 +1 x13824 +1 x13825 +1 x13826 +1 x13827 +1 x13828 +1 x13829 +1 x13830 +1 x13831 +1 x13832 +1 x13833 +1 x13834 +1 x13835 +1 x13836 +1 x13837 +1 x13838 +1 x13839 +1 x13840 +1 x13841 +1 x13842 +1 x13843 +1 x13844 +1 x13845 +1 x13846 +1 x13847 +1 x13848 +1 x13849 +1 x13850 +1 x13851 +1 x13852 +1 x13853 +1 x13854 +1 x13855 +1 x13856 +1 x13857 >= 1;++1 x13858 +1 x13859 +1 x13860 +1 x13861 +1 x13862 +1 x13863 +1 x13864 +1 x13865 +1 x13866 +1 x13867 +1 x13868 +1 x13869 +1 x13870 +1 x13871 +1 x13872 +1 x13873 +1 x13874 +1 x13875 +1 x13876 +1 x13877 +1 x13878 +1 x13879 +1 x13880 +1 x13881 +1 x13882 +1 x13883 +1 x13884 +1 x13885 +1 x13886 +1 x13887 +1 x13888 +1 x13889 +1 x13890 +1 x13891 +1 x13892 +1 x13893 +1 x13894 +1 x13895 +1 x13896 +1 x13897 +1 x13898 +1 x13899 +1 x13900 +1 x13901 +1 x13902 +1 x13903 +1 x13904 +1 x13905 +1 x13906 +1 x13907 +1 x13908 +1 x13909 +1 x13910 +1 x13911 +1 x13912 +1 x13913 +1 x13914 +1 x13915 +1 x13916 +1 x13917 +1 x13918 +1 x13919 +1 x13920 +1 x13921 +1 x13922 +1 x13923 +1 x13924 +1 x13925 +1 x13926 +1 x13927 +1 x13928 +1 x13929 +1 x13930 +1 x13931 +1 x13932 +1 x13933 +1 x13934 +1 x13935 +1 x13936 +1 x13937 +1 x13938 +1 x13939 +1 x13940 +1 x13941 +1 x13942 +1 x13943 +1 x13944 +1 x13945 +1 x13946 +1 x13947 +1 x13948 +1 x13949 +1 x13950 +1 x13951 +1 x13952 +1 x13953 +1 x13954 +1 x13955 +1 x13956 +1 x13957 +1 x13958 +1 x13959 +1 x13960 +1 x13961 +1 x13962 +1 x13963 +1 x13964 +1 x13965 +1 x13966 +1 x13967 +1 x13968 +1 x13969 +1 x13970 +1 x13971 +1 x13972 +1 x13973 +1 x13974 +1 x13975 +1 x13976 +1 x13977 +1 x13978 +1 x13979 +1 x13980 +1 x13981 +1 x13982 +1 x13983 +1 x13984 +1 x13985 +1 x13986 +1 x13987 +1 x13988 +1 x13989 +1 x13990 +1 x13991 +1 x13992 +1 x13993 +1 x13994 +1 x13995 +1 x13996 +1 x13997 +1 x13998 +1 x13999 +1 x14000 +1 x14001 +1 x14002 +1 x14003 +1 x14004 +1 x14005 +1 x14006 >= 1;++1 x14007 +1 x14008 +1 x14009 +1 x14010 +1 x14011 +1 x14012 +1 x14013 +1 x14014 +1 x14015 +1 x14016 +1 x14017 +1 x14018 +1 x14019 +1 x14020 +1 x14021 +1 x14022 +1 x14023 +1 x14024 +1 x14025 +1 x14026 +1 x14027 +1 x14028 +1 x14029 +1 x14030 +1 x14031 +1 x14032 +1 x14033 +1 x14034 +1 x14035 +1 x14036 +1 x14037 +1 x14038 +1 x14039 +1 x14040 +1 x14041 +1 x14042 +1 x14043 +1 x14044 +1 x14045 +1 x14046 +1 x14047 +1 x14048 +1 x14049 +1 x14050 +1 x14051 +1 x14052 +1 x14053 +1 x14054 +1 x14055 +1 x14056 +1 x14057 +1 x14058 +1 x14059 +1 x14060 +1 x14061 +1 x14062 +1 x14063 +1 x14064 +1 x14065 +1 x14066 +1 x14067 +1 x14068 +1 x14069 +1 x14070 +1 x14071 +1 x14072 +1 x14073 +1 x14074 +1 x14075 +1 x14076 +1 x14077 +1 x14078 +1 x14079 +1 x14080 +1 x14081 +1 x14082 +1 x14083 +1 x14084 +1 x14085 +1 x14086 +1 x14087 +1 x14088 +1 x14089 +1 x14090 +1 x14091 +1 x14092 +1 x14093 +1 x14094 +1 x14095 +1 x14096 +1 x14097 +1 x14098 +1 x14099 +1 x14100 +1 x14101 +1 x14102 +1 x14103 +1 x14104 +1 x14105 +1 x14106 +1 x14107 +1 x14108 +1 x14109 +1 x14110 +1 x14111 +1 x14112 +1 x14113 +1 x14114 +1 x14115 +1 x14116 +1 x14117 +1 x14118 +1 x14119 +1 x14120 +1 x14121 +1 x14122 +1 x14123 +1 x14124 +1 x14125 +1 x14126 +1 x14127 +1 x14128 +1 x14129 +1 x14130 +1 x14131 +1 x14132 +1 x14133 +1 x14134 +1 x14135 +1 x14136 +1 x14137 +1 x14138 +1 x14139 +1 x14140 +1 x14141 +1 x14142 +1 x14143 +1 x14144 +1 x14145 +1 x14146 +1 x14147 +1 x14148 +1 x14149 +1 x14150 +1 x14151 +1 x14152 +1 x14153 +1 x14154 +1 x14155 >= 1;++1 x14156 +1 x14157 +1 x14158 +1 x14159 +1 x14160 +1 x14161 +1 x14162 +1 x14163 +1 x14164 +1 x14165 +1 x14166 +1 x14167 +1 x14168 +1 x14169 +1 x14170 +1 x14171 +1 x14172 +1 x14173 +1 x14174 +1 x14175 +1 x14176 +1 x14177 +1 x14178 +1 x14179 +1 x14180 +1 x14181 +1 x14182 +1 x14183 +1 x14184 +1 x14185 +1 x14186 +1 x14187 +1 x14188 +1 x14189 +1 x14190 +1 x14191 +1 x14192 +1 x14193 +1 x14194 +1 x14195 +1 x14196 +1 x14197 +1 x14198 +1 x14199 +1 x14200 +1 x14201 +1 x14202 +1 x14203 +1 x14204 +1 x14205 +1 x14206 +1 x14207 +1 x14208 +1 x14209 +1 x14210 +1 x14211 +1 x14212 +1 x14213 +1 x14214 +1 x14215 +1 x14216 +1 x14217 +1 x14218 +1 x14219 +1 x14220 +1 x14221 +1 x14222 +1 x14223 +1 x14224 +1 x14225 +1 x14226 +1 x14227 +1 x14228 +1 x14229 +1 x14230 +1 x14231 +1 x14232 +1 x14233 +1 x14234 +1 x14235 +1 x14236 +1 x14237 +1 x14238 +1 x14239 +1 x14240 +1 x14241 +1 x14242 +1 x14243 +1 x14244 +1 x14245 +1 x14246 +1 x14247 +1 x14248 +1 x14249 +1 x14250 +1 x14251 +1 x14252 +1 x14253 +1 x14254 +1 x14255 +1 x14256 +1 x14257 +1 x14258 +1 x14259 +1 x14260 +1 x14261 +1 x14262 +1 x14263 +1 x14264 +1 x14265 +1 x14266 +1 x14267 +1 x14268 +1 x14269 +1 x14270 +1 x14271 +1 x14272 +1 x14273 +1 x14274 +1 x14275 +1 x14276 +1 x14277 +1 x14278 +1 x14279 +1 x14280 +1 x14281 +1 x14282 +1 x14283 +1 x14284 +1 x14285 +1 x14286 +1 x14287 +1 x14288 +1 x14289 +1 x14290 +1 x14291 +1 x14292 +1 x14293 +1 x14294 +1 x14295 +1 x14296 +1 x14297 +1 x14298 +1 x14299 +1 x14300 +1 x14301 +1 x14302 +1 x14303 +1 x14304 >= 1;++1 x14305 +1 x14306 +1 x14307 +1 x14308 +1 x14309 +1 x14310 +1 x14311 +1 x14312 +1 x14313 +1 x14314 +1 x14315 +1 x14316 +1 x14317 +1 x14318 +1 x14319 +1 x14320 +1 x14321 +1 x14322 +1 x14323 +1 x14324 +1 x14325 +1 x14326 +1 x14327 +1 x14328 +1 x14329 +1 x14330 +1 x14331 +1 x14332 +1 x14333 +1 x14334 +1 x14335 +1 x14336 +1 x14337 +1 x14338 +1 x14339 +1 x14340 +1 x14341 +1 x14342 +1 x14343 +1 x14344 +1 x14345 +1 x14346 +1 x14347 +1 x14348 +1 x14349 +1 x14350 +1 x14351 +1 x14352 +1 x14353 +1 x14354 +1 x14355 +1 x14356 +1 x14357 +1 x14358 +1 x14359 +1 x14360 +1 x14361 +1 x14362 +1 x14363 +1 x14364 +1 x14365 +1 x14366 +1 x14367 +1 x14368 +1 x14369 +1 x14370 +1 x14371 +1 x14372 +1 x14373 +1 x14374 +1 x14375 +1 x14376 +1 x14377 +1 x14378 +1 x14379 +1 x14380 +1 x14381 +1 x14382 +1 x14383 +1 x14384 +1 x14385 +1 x14386 +1 x14387 +1 x14388 +1 x14389 +1 x14390 +1 x14391 +1 x14392 +1 x14393 +1 x14394 +1 x14395 +1 x14396 +1 x14397 +1 x14398 +1 x14399 +1 x14400 +1 x14401 +1 x14402 +1 x14403 +1 x14404 +1 x14405 +1 x14406 +1 x14407 +1 x14408 +1 x14409 +1 x14410 +1 x14411 +1 x14412 +1 x14413 +1 x14414 +1 x14415 +1 x14416 +1 x14417 +1 x14418 +1 x14419 +1 x14420 +1 x14421 +1 x14422 +1 x14423 +1 x14424 +1 x14425 +1 x14426 +1 x14427 +1 x14428 +1 x14429 +1 x14430 +1 x14431 +1 x14432 +1 x14433 +1 x14434 +1 x14435 +1 x14436 +1 x14437 +1 x14438 +1 x14439 +1 x14440 +1 x14441 +1 x14442 +1 x14443 +1 x14444 +1 x14445 +1 x14446 +1 x14447 +1 x14448 +1 x14449 +1 x14450 +1 x14451 +1 x14452 +1 x14453 >= 1;++1 x14454 +1 x14455 +1 x14456 +1 x14457 +1 x14458 +1 x14459 +1 x14460 +1 x14461 +1 x14462 +1 x14463 +1 x14464 +1 x14465 +1 x14466 +1 x14467 +1 x14468 +1 x14469 +1 x14470 +1 x14471 +1 x14472 +1 x14473 +1 x14474 +1 x14475 +1 x14476 +1 x14477 +1 x14478 +1 x14479 +1 x14480 +1 x14481 +1 x14482 +1 x14483 +1 x14484 +1 x14485 +1 x14486 +1 x14487 +1 x14488 +1 x14489 +1 x14490 +1 x14491 +1 x14492 +1 x14493 +1 x14494 +1 x14495 +1 x14496 +1 x14497 +1 x14498 +1 x14499 +1 x14500 +1 x14501 +1 x14502 +1 x14503 +1 x14504 +1 x14505 +1 x14506 +1 x14507 +1 x14508 +1 x14509 +1 x14510 +1 x14511 +1 x14512 +1 x14513 +1 x14514 +1 x14515 +1 x14516 +1 x14517 +1 x14518 +1 x14519 +1 x14520 +1 x14521 +1 x14522 +1 x14523 +1 x14524 +1 x14525 +1 x14526 +1 x14527 +1 x14528 +1 x14529 +1 x14530 +1 x14531 +1 x14532 +1 x14533 +1 x14534 +1 x14535 +1 x14536 +1 x14537 +1 x14538 +1 x14539 +1 x14540 +1 x14541 +1 x14542 +1 x14543 +1 x14544 +1 x14545 +1 x14546 +1 x14547 +1 x14548 +1 x14549 +1 x14550 +1 x14551 +1 x14552 +1 x14553 +1 x14554 +1 x14555 +1 x14556 +1 x14557 +1 x14558 +1 x14559 +1 x14560 +1 x14561 +1 x14562 +1 x14563 +1 x14564 +1 x14565 +1 x14566 +1 x14567 +1 x14568 +1 x14569 +1 x14570 +1 x14571 +1 x14572 +1 x14573 +1 x14574 +1 x14575 +1 x14576 +1 x14577 +1 x14578 +1 x14579 +1 x14580 +1 x14581 +1 x14582 +1 x14583 +1 x14584 +1 x14585 +1 x14586 +1 x14587 +1 x14588 +1 x14589 +1 x14590 +1 x14591 +1 x14592 +1 x14593 +1 x14594 +1 x14595 +1 x14596 +1 x14597 +1 x14598 +1 x14599 +1 x14600 +1 x14601 +1 x14602 >= 1;++1 x14603 +1 x14604 +1 x14605 +1 x14606 +1 x14607 +1 x14608 +1 x14609 +1 x14610 +1 x14611 +1 x14612 +1 x14613 +1 x14614 +1 x14615 +1 x14616 +1 x14617 +1 x14618 +1 x14619 +1 x14620 +1 x14621 +1 x14622 +1 x14623 +1 x14624 +1 x14625 +1 x14626 +1 x14627 +1 x14628 +1 x14629 +1 x14630 +1 x14631 +1 x14632 +1 x14633 +1 x14634 +1 x14635 +1 x14636 +1 x14637 +1 x14638 +1 x14639 +1 x14640 +1 x14641 +1 x14642 +1 x14643 +1 x14644 +1 x14645 +1 x14646 +1 x14647 +1 x14648 +1 x14649 +1 x14650 +1 x14651 +1 x14652 +1 x14653 +1 x14654 +1 x14655 +1 x14656 +1 x14657 +1 x14658 +1 x14659 +1 x14660 +1 x14661 +1 x14662 +1 x14663 +1 x14664 +1 x14665 +1 x14666 +1 x14667 +1 x14668 +1 x14669 +1 x14670 +1 x14671 +1 x14672 +1 x14673 +1 x14674 +1 x14675 +1 x14676 +1 x14677 +1 x14678 +1 x14679 +1 x14680 +1 x14681 +1 x14682 +1 x14683 +1 x14684 +1 x14685 +1 x14686 +1 x14687 +1 x14688 +1 x14689 +1 x14690 +1 x14691 +1 x14692 +1 x14693 +1 x14694 +1 x14695 +1 x14696 +1 x14697 +1 x14698 +1 x14699 +1 x14700 +1 x14701 +1 x14702 +1 x14703 +1 x14704 +1 x14705 +1 x14706 +1 x14707 +1 x14708 +1 x14709 +1 x14710 +1 x14711 +1 x14712 +1 x14713 +1 x14714 +1 x14715 +1 x14716 +1 x14717 +1 x14718 +1 x14719 +1 x14720 +1 x14721 +1 x14722 +1 x14723 +1 x14724 +1 x14725 +1 x14726 +1 x14727 +1 x14728 +1 x14729 +1 x14730 +1 x14731 +1 x14732 +1 x14733 +1 x14734 +1 x14735 +1 x14736 +1 x14737 +1 x14738 +1 x14739 +1 x14740 +1 x14741 +1 x14742 +1 x14743 +1 x14744 +1 x14745 +1 x14746 +1 x14747 +1 x14748 +1 x14749 +1 x14750 +1 x14751 >= 1;++1 x14752 +1 x14753 +1 x14754 +1 x14755 +1 x14756 +1 x14757 +1 x14758 +1 x14759 +1 x14760 +1 x14761 +1 x14762 +1 x14763 +1 x14764 +1 x14765 +1 x14766 +1 x14767 +1 x14768 +1 x14769 +1 x14770 +1 x14771 +1 x14772 +1 x14773 +1 x14774 +1 x14775 +1 x14776 +1 x14777 +1 x14778 +1 x14779 +1 x14780 +1 x14781 +1 x14782 +1 x14783 +1 x14784 +1 x14785 +1 x14786 +1 x14787 +1 x14788 +1 x14789 +1 x14790 +1 x14791 +1 x14792 +1 x14793 +1 x14794 +1 x14795 +1 x14796 +1 x14797 +1 x14798 +1 x14799 +1 x14800 +1 x14801 +1 x14802 +1 x14803 +1 x14804 +1 x14805 +1 x14806 +1 x14807 +1 x14808 +1 x14809 +1 x14810 +1 x14811 +1 x14812 +1 x14813 +1 x14814 +1 x14815 +1 x14816 +1 x14817 +1 x14818 +1 x14819 +1 x14820 +1 x14821 +1 x14822 +1 x14823 +1 x14824 +1 x14825 +1 x14826 +1 x14827 +1 x14828 +1 x14829 +1 x14830 +1 x14831 +1 x14832 +1 x14833 +1 x14834 +1 x14835 +1 x14836 +1 x14837 +1 x14838 +1 x14839 +1 x14840 +1 x14841 +1 x14842 +1 x14843 +1 x14844 +1 x14845 +1 x14846 +1 x14847 +1 x14848 +1 x14849 +1 x14850 +1 x14851 +1 x14852 +1 x14853 +1 x14854 +1 x14855 +1 x14856 +1 x14857 +1 x14858 +1 x14859 +1 x14860 +1 x14861 +1 x14862 +1 x14863 +1 x14864 +1 x14865 +1 x14866 +1 x14867 +1 x14868 +1 x14869 +1 x14870 +1 x14871 +1 x14872 +1 x14873 +1 x14874 +1 x14875 +1 x14876 +1 x14877 +1 x14878 +1 x14879 +1 x14880 +1 x14881 +1 x14882 +1 x14883 +1 x14884 +1 x14885 +1 x14886 +1 x14887 +1 x14888 +1 x14889 +1 x14890 +1 x14891 +1 x14892 +1 x14893 +1 x14894 +1 x14895 +1 x14896 +1 x14897 +1 x14898 +1 x14899 +1 x14900 >= 1;++1 x14901 +1 x14902 +1 x14903 +1 x14904 +1 x14905 +1 x14906 +1 x14907 +1 x14908 +1 x14909 +1 x14910 +1 x14911 +1 x14912 +1 x14913 +1 x14914 +1 x14915 +1 x14916 +1 x14917 +1 x14918 +1 x14919 +1 x14920 +1 x14921 +1 x14922 +1 x14923 +1 x14924 +1 x14925 +1 x14926 +1 x14927 +1 x14928 +1 x14929 +1 x14930 +1 x14931 +1 x14932 +1 x14933 +1 x14934 +1 x14935 +1 x14936 +1 x14937 +1 x14938 +1 x14939 +1 x14940 +1 x14941 +1 x14942 +1 x14943 +1 x14944 +1 x14945 +1 x14946 +1 x14947 +1 x14948 +1 x14949 +1 x14950 +1 x14951 +1 x14952 +1 x14953 +1 x14954 +1 x14955 +1 x14956 +1 x14957 +1 x14958 +1 x14959 +1 x14960 +1 x14961 +1 x14962 +1 x14963 +1 x14964 +1 x14965 +1 x14966 +1 x14967 +1 x14968 +1 x14969 +1 x14970 +1 x14971 +1 x14972 +1 x14973 +1 x14974 +1 x14975 +1 x14976 +1 x14977 +1 x14978 +1 x14979 +1 x14980 +1 x14981 +1 x14982 +1 x14983 +1 x14984 +1 x14985 +1 x14986 +1 x14987 +1 x14988 +1 x14989 +1 x14990 +1 x14991 +1 x14992 +1 x14993 +1 x14994 +1 x14995 +1 x14996 +1 x14997 +1 x14998 +1 x14999 +1 x15000 +1 x15001 +1 x15002 +1 x15003 +1 x15004 +1 x15005 +1 x15006 +1 x15007 +1 x15008 +1 x15009 +1 x15010 +1 x15011 +1 x15012 +1 x15013 +1 x15014 +1 x15015 +1 x15016 +1 x15017 +1 x15018 +1 x15019 +1 x15020 +1 x15021 +1 x15022 +1 x15023 +1 x15024 +1 x15025 +1 x15026 +1 x15027 +1 x15028 +1 x15029 +1 x15030 +1 x15031 +1 x15032 +1 x15033 +1 x15034 +1 x15035 +1 x15036 +1 x15037 +1 x15038 +1 x15039 +1 x15040 +1 x15041 +1 x15042 +1 x15043 +1 x15044 +1 x15045 +1 x15046 +1 x15047 +1 x15048 +1 x15049 >= 1;++1 x15050 +1 x15051 +1 x15052 +1 x15053 +1 x15054 +1 x15055 +1 x15056 +1 x15057 +1 x15058 +1 x15059 +1 x15060 +1 x15061 +1 x15062 +1 x15063 +1 x15064 +1 x15065 +1 x15066 +1 x15067 +1 x15068 +1 x15069 +1 x15070 +1 x15071 +1 x15072 +1 x15073 +1 x15074 +1 x15075 +1 x15076 +1 x15077 +1 x15078 +1 x15079 +1 x15080 +1 x15081 +1 x15082 +1 x15083 +1 x15084 +1 x15085 +1 x15086 +1 x15087 +1 x15088 +1 x15089 +1 x15090 +1 x15091 +1 x15092 +1 x15093 +1 x15094 +1 x15095 +1 x15096 +1 x15097 +1 x15098 +1 x15099 +1 x15100 +1 x15101 +1 x15102 +1 x15103 +1 x15104 +1 x15105 +1 x15106 +1 x15107 +1 x15108 +1 x15109 +1 x15110 +1 x15111 +1 x15112 +1 x15113 +1 x15114 +1 x15115 +1 x15116 +1 x15117 +1 x15118 +1 x15119 +1 x15120 +1 x15121 +1 x15122 +1 x15123 +1 x15124 +1 x15125 +1 x15126 +1 x15127 +1 x15128 +1 x15129 +1 x15130 +1 x15131 +1 x15132 +1 x15133 +1 x15134 +1 x15135 +1 x15136 +1 x15137 +1 x15138 +1 x15139 +1 x15140 +1 x15141 +1 x15142 +1 x15143 +1 x15144 +1 x15145 +1 x15146 +1 x15147 +1 x15148 +1 x15149 +1 x15150 +1 x15151 +1 x15152 +1 x15153 +1 x15154 +1 x15155 +1 x15156 +1 x15157 +1 x15158 +1 x15159 +1 x15160 +1 x15161 +1 x15162 +1 x15163 +1 x15164 +1 x15165 +1 x15166 +1 x15167 +1 x15168 +1 x15169 +1 x15170 +1 x15171 +1 x15172 +1 x15173 +1 x15174 +1 x15175 +1 x15176 +1 x15177 +1 x15178 +1 x15179 +1 x15180 +1 x15181 +1 x15182 +1 x15183 +1 x15184 +1 x15185 +1 x15186 +1 x15187 +1 x15188 +1 x15189 +1 x15190 +1 x15191 +1 x15192 +1 x15193 +1 x15194 +1 x15195 +1 x15196 +1 x15197 +1 x15198 >= 1;++1 x15199 +1 x15200 +1 x15201 +1 x15202 +1 x15203 +1 x15204 +1 x15205 +1 x15206 +1 x15207 +1 x15208 +1 x15209 +1 x15210 +1 x15211 +1 x15212 +1 x15213 +1 x15214 +1 x15215 +1 x15216 +1 x15217 +1 x15218 +1 x15219 +1 x15220 +1 x15221 +1 x15222 +1 x15223 +1 x15224 +1 x15225 +1 x15226 +1 x15227 +1 x15228 +1 x15229 +1 x15230 +1 x15231 +1 x15232 +1 x15233 +1 x15234 +1 x15235 +1 x15236 +1 x15237 +1 x15238 +1 x15239 +1 x15240 +1 x15241 +1 x15242 +1 x15243 +1 x15244 +1 x15245 +1 x15246 +1 x15247 +1 x15248 +1 x15249 +1 x15250 +1 x15251 +1 x15252 +1 x15253 +1 x15254 +1 x15255 +1 x15256 +1 x15257 +1 x15258 +1 x15259 +1 x15260 +1 x15261 +1 x15262 +1 x15263 +1 x15264 +1 x15265 +1 x15266 +1 x15267 +1 x15268 +1 x15269 +1 x15270 +1 x15271 +1 x15272 +1 x15273 +1 x15274 +1 x15275 +1 x15276 +1 x15277 +1 x15278 +1 x15279 +1 x15280 +1 x15281 +1 x15282 +1 x15283 +1 x15284 +1 x15285 +1 x15286 +1 x15287 +1 x15288 +1 x15289 +1 x15290 +1 x15291 +1 x15292 +1 x15293 +1 x15294 +1 x15295 +1 x15296 +1 x15297 +1 x15298 +1 x15299 +1 x15300 +1 x15301 +1 x15302 +1 x15303 +1 x15304 +1 x15305 +1 x15306 +1 x15307 +1 x15308 +1 x15309 +1 x15310 +1 x15311 +1 x15312 +1 x15313 +1 x15314 +1 x15315 +1 x15316 +1 x15317 +1 x15318 +1 x15319 +1 x15320 +1 x15321 +1 x15322 +1 x15323 +1 x15324 +1 x15325 +1 x15326 +1 x15327 +1 x15328 +1 x15329 +1 x15330 +1 x15331 +1 x15332 +1 x15333 +1 x15334 +1 x15335 +1 x15336 +1 x15337 +1 x15338 +1 x15339 +1 x15340 +1 x15341 +1 x15342 +1 x15343 +1 x15344 +1 x15345 +1 x15346 +1 x15347 >= 1;++1 x15348 +1 x15349 +1 x15350 +1 x15351 +1 x15352 +1 x15353 +1 x15354 +1 x15355 +1 x15356 +1 x15357 +1 x15358 +1 x15359 +1 x15360 +1 x15361 +1 x15362 +1 x15363 +1 x15364 +1 x15365 +1 x15366 +1 x15367 +1 x15368 +1 x15369 +1 x15370 +1 x15371 +1 x15372 +1 x15373 +1 x15374 +1 x15375 +1 x15376 +1 x15377 +1 x15378 +1 x15379 +1 x15380 +1 x15381 +1 x15382 +1 x15383 +1 x15384 +1 x15385 +1 x15386 +1 x15387 +1 x15388 +1 x15389 +1 x15390 +1 x15391 +1 x15392 +1 x15393 +1 x15394 +1 x15395 +1 x15396 +1 x15397 +1 x15398 +1 x15399 +1 x15400 +1 x15401 +1 x15402 +1 x15403 +1 x15404 +1 x15405 +1 x15406 +1 x15407 +1 x15408 +1 x15409 +1 x15410 +1 x15411 +1 x15412 +1 x15413 +1 x15414 +1 x15415 +1 x15416 +1 x15417 +1 x15418 +1 x15419 +1 x15420 +1 x15421 +1 x15422 +1 x15423 +1 x15424 +1 x15425 +1 x15426 +1 x15427 +1 x15428 +1 x15429 +1 x15430 +1 x15431 +1 x15432 +1 x15433 +1 x15434 +1 x15435 +1 x15436 +1 x15437 +1 x15438 +1 x15439 +1 x15440 +1 x15441 +1 x15442 +1 x15443 +1 x15444 +1 x15445 +1 x15446 +1 x15447 +1 x15448 +1 x15449 +1 x15450 +1 x15451 +1 x15452 +1 x15453 +1 x15454 +1 x15455 +1 x15456 +1 x15457 +1 x15458 +1 x15459 +1 x15460 +1 x15461 +1 x15462 +1 x15463 +1 x15464 +1 x15465 +1 x15466 +1 x15467 +1 x15468 +1 x15469 +1 x15470 +1 x15471 +1 x15472 +1 x15473 +1 x15474 +1 x15475 +1 x15476 +1 x15477 +1 x15478 +1 x15479 +1 x15480 +1 x15481 +1 x15482 +1 x15483 +1 x15484 +1 x15485 +1 x15486 +1 x15487 +1 x15488 +1 x15489 +1 x15490 +1 x15491 +1 x15492 +1 x15493 +1 x15494 +1 x15495 +1 x15496 >= 1;++1 x15497 +1 x15498 +1 x15499 +1 x15500 +1 x15501 +1 x15502 +1 x15503 +1 x15504 +1 x15505 +1 x15506 +1 x15507 +1 x15508 +1 x15509 +1 x15510 +1 x15511 +1 x15512 +1 x15513 +1 x15514 +1 x15515 +1 x15516 +1 x15517 +1 x15518 +1 x15519 +1 x15520 +1 x15521 +1 x15522 +1 x15523 +1 x15524 +1 x15525 +1 x15526 +1 x15527 +1 x15528 +1 x15529 +1 x15530 +1 x15531 +1 x15532 +1 x15533 +1 x15534 +1 x15535 +1 x15536 +1 x15537 +1 x15538 +1 x15539 +1 x15540 +1 x15541 +1 x15542 +1 x15543 +1 x15544 +1 x15545 +1 x15546 +1 x15547 +1 x15548 +1 x15549 +1 x15550 +1 x15551 +1 x15552 +1 x15553 +1 x15554 +1 x15555 +1 x15556 +1 x15557 +1 x15558 +1 x15559 +1 x15560 +1 x15561 +1 x15562 +1 x15563 +1 x15564 +1 x15565 +1 x15566 +1 x15567 +1 x15568 +1 x15569 +1 x15570 +1 x15571 +1 x15572 +1 x15573 +1 x15574 +1 x15575 +1 x15576 +1 x15577 +1 x15578 +1 x15579 +1 x15580 +1 x15581 +1 x15582 +1 x15583 +1 x15584 +1 x15585 +1 x15586 +1 x15587 +1 x15588 +1 x15589 +1 x15590 +1 x15591 +1 x15592 +1 x15593 +1 x15594 +1 x15595 +1 x15596 +1 x15597 +1 x15598 +1 x15599 +1 x15600 +1 x15601 +1 x15602 +1 x15603 +1 x15604 +1 x15605 +1 x15606 +1 x15607 +1 x15608 +1 x15609 +1 x15610 +1 x15611 +1 x15612 +1 x15613 +1 x15614 +1 x15615 +1 x15616 +1 x15617 +1 x15618 +1 x15619 +1 x15620 +1 x15621 +1 x15622 +1 x15623 +1 x15624 +1 x15625 +1 x15626 +1 x15627 +1 x15628 +1 x15629 +1 x15630 +1 x15631 +1 x15632 +1 x15633 +1 x15634 +1 x15635 +1 x15636 +1 x15637 +1 x15638 +1 x15639 +1 x15640 +1 x15641 +1 x15642 +1 x15643 +1 x15644 +1 x15645 >= 1;++1 x15646 +1 x15647 +1 x15648 +1 x15649 +1 x15650 +1 x15651 +1 x15652 +1 x15653 +1 x15654 +1 x15655 +1 x15656 +1 x15657 +1 x15658 +1 x15659 +1 x15660 +1 x15661 +1 x15662 +1 x15663 +1 x15664 +1 x15665 +1 x15666 +1 x15667 +1 x15668 +1 x15669 +1 x15670 +1 x15671 +1 x15672 +1 x15673 +1 x15674 +1 x15675 +1 x15676 +1 x15677 +1 x15678 +1 x15679 +1 x15680 +1 x15681 +1 x15682 +1 x15683 +1 x15684 +1 x15685 +1 x15686 +1 x15687 +1 x15688 +1 x15689 +1 x15690 +1 x15691 +1 x15692 +1 x15693 +1 x15694 +1 x15695 +1 x15696 +1 x15697 +1 x15698 +1 x15699 +1 x15700 +1 x15701 +1 x15702 +1 x15703 +1 x15704 +1 x15705 +1 x15706 +1 x15707 +1 x15708 +1 x15709 +1 x15710 +1 x15711 +1 x15712 +1 x15713 +1 x15714 +1 x15715 +1 x15716 +1 x15717 +1 x15718 +1 x15719 +1 x15720 +1 x15721 +1 x15722 +1 x15723 +1 x15724 +1 x15725 +1 x15726 +1 x15727 +1 x15728 +1 x15729 +1 x15730 +1 x15731 +1 x15732 +1 x15733 +1 x15734 +1 x15735 +1 x15736 +1 x15737 +1 x15738 +1 x15739 +1 x15740 +1 x15741 +1 x15742 +1 x15743 +1 x15744 +1 x15745 +1 x15746 +1 x15747 +1 x15748 +1 x15749 +1 x15750 +1 x15751 +1 x15752 +1 x15753 +1 x15754 +1 x15755 +1 x15756 +1 x15757 +1 x15758 +1 x15759 +1 x15760 +1 x15761 +1 x15762 +1 x15763 +1 x15764 +1 x15765 +1 x15766 +1 x15767 +1 x15768 +1 x15769 +1 x15770 +1 x15771 +1 x15772 +1 x15773 +1 x15774 +1 x15775 +1 x15776 +1 x15777 +1 x15778 +1 x15779 +1 x15780 +1 x15781 +1 x15782 +1 x15783 +1 x15784 +1 x15785 +1 x15786 +1 x15787 +1 x15788 +1 x15789 +1 x15790 +1 x15791 +1 x15792 +1 x15793 +1 x15794 >= 1;++1 x15795 +1 x15796 +1 x15797 +1 x15798 +1 x15799 +1 x15800 +1 x15801 +1 x15802 +1 x15803 +1 x15804 +1 x15805 +1 x15806 +1 x15807 +1 x15808 +1 x15809 +1 x15810 +1 x15811 +1 x15812 +1 x15813 +1 x15814 +1 x15815 +1 x15816 +1 x15817 +1 x15818 +1 x15819 +1 x15820 +1 x15821 +1 x15822 +1 x15823 +1 x15824 +1 x15825 +1 x15826 +1 x15827 +1 x15828 +1 x15829 +1 x15830 +1 x15831 +1 x15832 +1 x15833 +1 x15834 +1 x15835 +1 x15836 +1 x15837 +1 x15838 +1 x15839 +1 x15840 +1 x15841 +1 x15842 +1 x15843 +1 x15844 +1 x15845 +1 x15846 +1 x15847 +1 x15848 +1 x15849 +1 x15850 +1 x15851 +1 x15852 +1 x15853 +1 x15854 +1 x15855 +1 x15856 +1 x15857 +1 x15858 +1 x15859 +1 x15860 +1 x15861 +1 x15862 +1 x15863 +1 x15864 +1 x15865 +1 x15866 +1 x15867 +1 x15868 +1 x15869 +1 x15870 +1 x15871 +1 x15872 +1 x15873 +1 x15874 +1 x15875 +1 x15876 +1 x15877 +1 x15878 +1 x15879 +1 x15880 +1 x15881 +1 x15882 +1 x15883 +1 x15884 +1 x15885 +1 x15886 +1 x15887 +1 x15888 +1 x15889 +1 x15890 +1 x15891 +1 x15892 +1 x15893 +1 x15894 +1 x15895 +1 x15896 +1 x15897 +1 x15898 +1 x15899 +1 x15900 +1 x15901 +1 x15902 +1 x15903 +1 x15904 +1 x15905 +1 x15906 +1 x15907 +1 x15908 +1 x15909 +1 x15910 +1 x15911 +1 x15912 +1 x15913 +1 x15914 +1 x15915 +1 x15916 +1 x15917 +1 x15918 +1 x15919 +1 x15920 +1 x15921 +1 x15922 +1 x15923 +1 x15924 +1 x15925 +1 x15926 +1 x15927 +1 x15928 +1 x15929 +1 x15930 +1 x15931 +1 x15932 +1 x15933 +1 x15934 +1 x15935 +1 x15936 +1 x15937 +1 x15938 +1 x15939 +1 x15940 +1 x15941 +1 x15942 +1 x15943 >= 1;++1 x15944 +1 x15945 +1 x15946 +1 x15947 +1 x15948 +1 x15949 +1 x15950 +1 x15951 +1 x15952 +1 x15953 +1 x15954 +1 x15955 +1 x15956 +1 x15957 +1 x15958 +1 x15959 +1 x15960 +1 x15961 +1 x15962 +1 x15963 +1 x15964 +1 x15965 +1 x15966 +1 x15967 +1 x15968 +1 x15969 +1 x15970 +1 x15971 +1 x15972 +1 x15973 +1 x15974 +1 x15975 +1 x15976 +1 x15977 +1 x15978 +1 x15979 +1 x15980 +1 x15981 +1 x15982 +1 x15983 +1 x15984 +1 x15985 +1 x15986 +1 x15987 +1 x15988 +1 x15989 +1 x15990 +1 x15991 +1 x15992 +1 x15993 +1 x15994 +1 x15995 +1 x15996 +1 x15997 +1 x15998 +1 x15999 +1 x16000 +1 x16001 +1 x16002 +1 x16003 +1 x16004 +1 x16005 +1 x16006 +1 x16007 +1 x16008 +1 x16009 +1 x16010 +1 x16011 +1 x16012 +1 x16013 +1 x16014 +1 x16015 +1 x16016 +1 x16017 +1 x16018 +1 x16019 +1 x16020 +1 x16021 +1 x16022 +1 x16023 +1 x16024 +1 x16025 +1 x16026 +1 x16027 +1 x16028 +1 x16029 +1 x16030 +1 x16031 +1 x16032 +1 x16033 +1 x16034 +1 x16035 +1 x16036 +1 x16037 +1 x16038 +1 x16039 +1 x16040 +1 x16041 +1 x16042 +1 x16043 +1 x16044 +1 x16045 +1 x16046 +1 x16047 +1 x16048 +1 x16049 +1 x16050 +1 x16051 +1 x16052 +1 x16053 +1 x16054 +1 x16055 +1 x16056 +1 x16057 +1 x16058 +1 x16059 +1 x16060 +1 x16061 +1 x16062 +1 x16063 +1 x16064 +1 x16065 +1 x16066 +1 x16067 +1 x16068 +1 x16069 +1 x16070 +1 x16071 +1 x16072 +1 x16073 +1 x16074 +1 x16075 +1 x16076 +1 x16077 +1 x16078 +1 x16079 +1 x16080 +1 x16081 +1 x16082 +1 x16083 +1 x16084 +1 x16085 +1 x16086 +1 x16087 +1 x16088 +1 x16089 +1 x16090 +1 x16091 +1 x16092 >= 1;++1 x16093 +1 x16094 +1 x16095 +1 x16096 +1 x16097 +1 x16098 +1 x16099 +1 x16100 +1 x16101 +1 x16102 +1 x16103 +1 x16104 +1 x16105 +1 x16106 +1 x16107 +1 x16108 +1 x16109 +1 x16110 +1 x16111 +1 x16112 +1 x16113 +1 x16114 +1 x16115 +1 x16116 +1 x16117 +1 x16118 +1 x16119 +1 x16120 +1 x16121 +1 x16122 +1 x16123 +1 x16124 +1 x16125 +1 x16126 +1 x16127 +1 x16128 +1 x16129 +1 x16130 +1 x16131 +1 x16132 +1 x16133 +1 x16134 +1 x16135 +1 x16136 +1 x16137 +1 x16138 +1 x16139 +1 x16140 +1 x16141 +1 x16142 +1 x16143 +1 x16144 +1 x16145 +1 x16146 +1 x16147 +1 x16148 +1 x16149 +1 x16150 +1 x16151 +1 x16152 +1 x16153 +1 x16154 +1 x16155 +1 x16156 +1 x16157 +1 x16158 +1 x16159 +1 x16160 +1 x16161 +1 x16162 +1 x16163 +1 x16164 +1 x16165 +1 x16166 +1 x16167 +1 x16168 +1 x16169 +1 x16170 +1 x16171 +1 x16172 +1 x16173 +1 x16174 +1 x16175 +1 x16176 +1 x16177 +1 x16178 +1 x16179 +1 x16180 +1 x16181 +1 x16182 +1 x16183 +1 x16184 +1 x16185 +1 x16186 +1 x16187 +1 x16188 +1 x16189 +1 x16190 +1 x16191 +1 x16192 +1 x16193 +1 x16194 +1 x16195 +1 x16196 +1 x16197 +1 x16198 +1 x16199 +1 x16200 +1 x16201 +1 x16202 +1 x16203 +1 x16204 +1 x16205 +1 x16206 +1 x16207 +1 x16208 +1 x16209 +1 x16210 +1 x16211 +1 x16212 +1 x16213 +1 x16214 +1 x16215 +1 x16216 +1 x16217 +1 x16218 +1 x16219 +1 x16220 +1 x16221 +1 x16222 +1 x16223 +1 x16224 +1 x16225 +1 x16226 +1 x16227 +1 x16228 +1 x16229 +1 x16230 +1 x16231 +1 x16232 +1 x16233 +1 x16234 +1 x16235 +1 x16236 +1 x16237 +1 x16238 +1 x16239 +1 x16240 +1 x16241 >= 1;++1 x16242 +1 x16243 +1 x16244 +1 x16245 +1 x16246 +1 x16247 +1 x16248 +1 x16249 +1 x16250 +1 x16251 +1 x16252 +1 x16253 +1 x16254 +1 x16255 +1 x16256 +1 x16257 +1 x16258 +1 x16259 +1 x16260 +1 x16261 +1 x16262 +1 x16263 +1 x16264 +1 x16265 +1 x16266 +1 x16267 +1 x16268 +1 x16269 +1 x16270 +1 x16271 +1 x16272 +1 x16273 +1 x16274 +1 x16275 +1 x16276 +1 x16277 +1 x16278 +1 x16279 +1 x16280 +1 x16281 +1 x16282 +1 x16283 +1 x16284 +1 x16285 +1 x16286 +1 x16287 +1 x16288 +1 x16289 +1 x16290 +1 x16291 +1 x16292 +1 x16293 +1 x16294 +1 x16295 +1 x16296 +1 x16297 +1 x16298 +1 x16299 +1 x16300 +1 x16301 +1 x16302 +1 x16303 +1 x16304 +1 x16305 +1 x16306 +1 x16307 +1 x16308 +1 x16309 +1 x16310 +1 x16311 +1 x16312 +1 x16313 +1 x16314 +1 x16315 +1 x16316 +1 x16317 +1 x16318 +1 x16319 +1 x16320 +1 x16321 +1 x16322 +1 x16323 +1 x16324 +1 x16325 +1 x16326 +1 x16327 +1 x16328 +1 x16329 +1 x16330 +1 x16331 +1 x16332 +1 x16333 +1 x16334 +1 x16335 +1 x16336 +1 x16337 +1 x16338 +1 x16339 +1 x16340 +1 x16341 +1 x16342 +1 x16343 +1 x16344 +1 x16345 +1 x16346 +1 x16347 +1 x16348 +1 x16349 +1 x16350 +1 x16351 +1 x16352 +1 x16353 +1 x16354 +1 x16355 +1 x16356 +1 x16357 +1 x16358 +1 x16359 +1 x16360 +1 x16361 +1 x16362 +1 x16363 +1 x16364 +1 x16365 +1 x16366 +1 x16367 +1 x16368 +1 x16369 +1 x16370 +1 x16371 +1 x16372 +1 x16373 +1 x16374 +1 x16375 +1 x16376 +1 x16377 +1 x16378 +1 x16379 +1 x16380 +1 x16381 +1 x16382 +1 x16383 +1 x16384 +1 x16385 +1 x16386 +1 x16387 +1 x16388 +1 x16389 +1 x16390 >= 1;++1 x16391 +1 x16392 +1 x16393 +1 x16394 +1 x16395 +1 x16396 +1 x16397 +1 x16398 +1 x16399 +1 x16400 +1 x16401 +1 x16402 +1 x16403 +1 x16404 +1 x16405 +1 x16406 +1 x16407 +1 x16408 +1 x16409 +1 x16410 +1 x16411 +1 x16412 +1 x16413 +1 x16414 +1 x16415 +1 x16416 +1 x16417 +1 x16418 +1 x16419 +1 x16420 +1 x16421 +1 x16422 +1 x16423 +1 x16424 +1 x16425 +1 x16426 +1 x16427 +1 x16428 +1 x16429 +1 x16430 +1 x16431 +1 x16432 +1 x16433 +1 x16434 +1 x16435 +1 x16436 +1 x16437 +1 x16438 +1 x16439 +1 x16440 +1 x16441 +1 x16442 +1 x16443 +1 x16444 +1 x16445 +1 x16446 +1 x16447 +1 x16448 +1 x16449 +1 x16450 +1 x16451 +1 x16452 +1 x16453 +1 x16454 +1 x16455 +1 x16456 +1 x16457 +1 x16458 +1 x16459 +1 x16460 +1 x16461 +1 x16462 +1 x16463 +1 x16464 +1 x16465 +1 x16466 +1 x16467 +1 x16468 +1 x16469 +1 x16470 +1 x16471 +1 x16472 +1 x16473 +1 x16474 +1 x16475 +1 x16476 +1 x16477 +1 x16478 +1 x16479 +1 x16480 +1 x16481 +1 x16482 +1 x16483 +1 x16484 +1 x16485 +1 x16486 +1 x16487 +1 x16488 +1 x16489 +1 x16490 +1 x16491 +1 x16492 +1 x16493 +1 x16494 +1 x16495 +1 x16496 +1 x16497 +1 x16498 +1 x16499 +1 x16500 +1 x16501 +1 x16502 +1 x16503 +1 x16504 +1 x16505 +1 x16506 +1 x16507 +1 x16508 +1 x16509 +1 x16510 +1 x16511 +1 x16512 +1 x16513 +1 x16514 +1 x16515 +1 x16516 +1 x16517 +1 x16518 +1 x16519 +1 x16520 +1 x16521 +1 x16522 +1 x16523 +1 x16524 +1 x16525 +1 x16526 +1 x16527 +1 x16528 +1 x16529 +1 x16530 +1 x16531 +1 x16532 +1 x16533 +1 x16534 +1 x16535 +1 x16536 +1 x16537 +1 x16538 +1 x16539 >= 1;++1 x16540 +1 x16541 +1 x16542 +1 x16543 +1 x16544 +1 x16545 +1 x16546 +1 x16547 +1 x16548 +1 x16549 +1 x16550 +1 x16551 +1 x16552 +1 x16553 +1 x16554 +1 x16555 +1 x16556 +1 x16557 +1 x16558 +1 x16559 +1 x16560 +1 x16561 +1 x16562 +1 x16563 +1 x16564 +1 x16565 +1 x16566 +1 x16567 +1 x16568 +1 x16569 +1 x16570 +1 x16571 +1 x16572 +1 x16573 +1 x16574 +1 x16575 +1 x16576 +1 x16577 +1 x16578 +1 x16579 +1 x16580 +1 x16581 +1 x16582 +1 x16583 +1 x16584 +1 x16585 +1 x16586 +1 x16587 +1 x16588 +1 x16589 +1 x16590 +1 x16591 +1 x16592 +1 x16593 +1 x16594 +1 x16595 +1 x16596 +1 x16597 +1 x16598 +1 x16599 +1 x16600 +1 x16601 +1 x16602 +1 x16603 +1 x16604 +1 x16605 +1 x16606 +1 x16607 +1 x16608 +1 x16609 +1 x16610 +1 x16611 +1 x16612 +1 x16613 +1 x16614 +1 x16615 +1 x16616 +1 x16617 +1 x16618 +1 x16619 +1 x16620 +1 x16621 +1 x16622 +1 x16623 +1 x16624 +1 x16625 +1 x16626 +1 x16627 +1 x16628 +1 x16629 +1 x16630 +1 x16631 +1 x16632 +1 x16633 +1 x16634 +1 x16635 +1 x16636 +1 x16637 +1 x16638 +1 x16639 +1 x16640 +1 x16641 +1 x16642 +1 x16643 +1 x16644 +1 x16645 +1 x16646 +1 x16647 +1 x16648 +1 x16649 +1 x16650 +1 x16651 +1 x16652 +1 x16653 +1 x16654 +1 x16655 +1 x16656 +1 x16657 +1 x16658 +1 x16659 +1 x16660 +1 x16661 +1 x16662 +1 x16663 +1 x16664 +1 x16665 +1 x16666 +1 x16667 +1 x16668 +1 x16669 +1 x16670 +1 x16671 +1 x16672 +1 x16673 +1 x16674 +1 x16675 +1 x16676 +1 x16677 +1 x16678 +1 x16679 +1 x16680 +1 x16681 +1 x16682 +1 x16683 +1 x16684 +1 x16685 +1 x16686 +1 x16687 +1 x16688 >= 1;++1 x16689 +1 x16690 +1 x16691 +1 x16692 +1 x16693 +1 x16694 +1 x16695 +1 x16696 +1 x16697 +1 x16698 +1 x16699 +1 x16700 +1 x16701 +1 x16702 +1 x16703 +1 x16704 +1 x16705 +1 x16706 +1 x16707 +1 x16708 +1 x16709 +1 x16710 +1 x16711 +1 x16712 +1 x16713 +1 x16714 +1 x16715 +1 x16716 +1 x16717 +1 x16718 +1 x16719 +1 x16720 +1 x16721 +1 x16722 +1 x16723 +1 x16724 +1 x16725 +1 x16726 +1 x16727 +1 x16728 +1 x16729 +1 x16730 +1 x16731 +1 x16732 +1 x16733 +1 x16734 +1 x16735 +1 x16736 +1 x16737 +1 x16738 +1 x16739 +1 x16740 +1 x16741 +1 x16742 +1 x16743 +1 x16744 +1 x16745 +1 x16746 +1 x16747 +1 x16748 +1 x16749 +1 x16750 +1 x16751 +1 x16752 +1 x16753 +1 x16754 +1 x16755 +1 x16756 +1 x16757 +1 x16758 +1 x16759 +1 x16760 +1 x16761 +1 x16762 +1 x16763 +1 x16764 +1 x16765 +1 x16766 +1 x16767 +1 x16768 +1 x16769 +1 x16770 +1 x16771 +1 x16772 +1 x16773 +1 x16774 +1 x16775 +1 x16776 +1 x16777 +1 x16778 +1 x16779 +1 x16780 +1 x16781 +1 x16782 +1 x16783 +1 x16784 +1 x16785 +1 x16786 +1 x16787 +1 x16788 +1 x16789 +1 x16790 +1 x16791 +1 x16792 +1 x16793 +1 x16794 +1 x16795 +1 x16796 +1 x16797 +1 x16798 +1 x16799 +1 x16800 +1 x16801 +1 x16802 +1 x16803 +1 x16804 +1 x16805 +1 x16806 +1 x16807 +1 x16808 +1 x16809 +1 x16810 +1 x16811 +1 x16812 +1 x16813 +1 x16814 +1 x16815 +1 x16816 +1 x16817 +1 x16818 +1 x16819 +1 x16820 +1 x16821 +1 x16822 +1 x16823 +1 x16824 +1 x16825 +1 x16826 +1 x16827 +1 x16828 +1 x16829 +1 x16830 +1 x16831 +1 x16832 +1 x16833 +1 x16834 +1 x16835 +1 x16836 +1 x16837 >= 1;++1 x16838 +1 x16839 +1 x16840 +1 x16841 +1 x16842 +1 x16843 +1 x16844 +1 x16845 +1 x16846 +1 x16847 +1 x16848 +1 x16849 +1 x16850 +1 x16851 +1 x16852 +1 x16853 +1 x16854 +1 x16855 +1 x16856 +1 x16857 +1 x16858 +1 x16859 +1 x16860 +1 x16861 +1 x16862 +1 x16863 +1 x16864 +1 x16865 +1 x16866 +1 x16867 +1 x16868 +1 x16869 +1 x16870 +1 x16871 +1 x16872 +1 x16873 +1 x16874 +1 x16875 +1 x16876 +1 x16877 +1 x16878 +1 x16879 +1 x16880 +1 x16881 +1 x16882 +1 x16883 +1 x16884 +1 x16885 +1 x16886 +1 x16887 +1 x16888 +1 x16889 +1 x16890 +1 x16891 +1 x16892 +1 x16893 +1 x16894 +1 x16895 +1 x16896 +1 x16897 +1 x16898 +1 x16899 +1 x16900 +1 x16901 +1 x16902 +1 x16903 +1 x16904 +1 x16905 +1 x16906 +1 x16907 +1 x16908 +1 x16909 +1 x16910 +1 x16911 +1 x16912 +1 x16913 +1 x16914 +1 x16915 +1 x16916 +1 x16917 +1 x16918 +1 x16919 +1 x16920 +1 x16921 +1 x16922 +1 x16923 +1 x16924 +1 x16925 +1 x16926 +1 x16927 +1 x16928 +1 x16929 +1 x16930 +1 x16931 +1 x16932 +1 x16933 +1 x16934 +1 x16935 +1 x16936 +1 x16937 +1 x16938 +1 x16939 +1 x16940 +1 x16941 +1 x16942 +1 x16943 +1 x16944 +1 x16945 +1 x16946 +1 x16947 +1 x16948 +1 x16949 +1 x16950 +1 x16951 +1 x16952 +1 x16953 +1 x16954 +1 x16955 +1 x16956 +1 x16957 +1 x16958 +1 x16959 +1 x16960 +1 x16961 +1 x16962 +1 x16963 +1 x16964 +1 x16965 +1 x16966 +1 x16967 +1 x16968 +1 x16969 +1 x16970 +1 x16971 +1 x16972 +1 x16973 +1 x16974 +1 x16975 +1 x16976 +1 x16977 +1 x16978 +1 x16979 +1 x16980 +1 x16981 +1 x16982 +1 x16983 +1 x16984 +1 x16985 +1 x16986 >= 1;++1 x16987 +1 x16988 +1 x16989 +1 x16990 +1 x16991 +1 x16992 +1 x16993 +1 x16994 +1 x16995 +1 x16996 +1 x16997 +1 x16998 +1 x16999 +1 x17000 +1 x17001 +1 x17002 +1 x17003 +1 x17004 +1 x17005 +1 x17006 +1 x17007 +1 x17008 +1 x17009 +1 x17010 +1 x17011 +1 x17012 +1 x17013 +1 x17014 +1 x17015 +1 x17016 +1 x17017 +1 x17018 +1 x17019 +1 x17020 +1 x17021 +1 x17022 +1 x17023 +1 x17024 +1 x17025 +1 x17026 +1 x17027 +1 x17028 +1 x17029 +1 x17030 +1 x17031 +1 x17032 +1 x17033 +1 x17034 +1 x17035 +1 x17036 +1 x17037 +1 x17038 +1 x17039 +1 x17040 +1 x17041 +1 x17042 +1 x17043 +1 x17044 +1 x17045 +1 x17046 +1 x17047 +1 x17048 +1 x17049 +1 x17050 +1 x17051 +1 x17052 +1 x17053 +1 x17054 +1 x17055 +1 x17056 +1 x17057 +1 x17058 +1 x17059 +1 x17060 +1 x17061 +1 x17062 +1 x17063 +1 x17064 +1 x17065 +1 x17066 +1 x17067 +1 x17068 +1 x17069 +1 x17070 +1 x17071 +1 x17072 +1 x17073 +1 x17074 +1 x17075 +1 x17076 +1 x17077 +1 x17078 +1 x17079 +1 x17080 +1 x17081 +1 x17082 +1 x17083 +1 x17084 +1 x17085 +1 x17086 +1 x17087 +1 x17088 +1 x17089 +1 x17090 +1 x17091 +1 x17092 +1 x17093 +1 x17094 +1 x17095 +1 x17096 +1 x17097 +1 x17098 +1 x17099 +1 x17100 +1 x17101 +1 x17102 +1 x17103 +1 x17104 +1 x17105 +1 x17106 +1 x17107 +1 x17108 +1 x17109 +1 x17110 +1 x17111 +1 x17112 +1 x17113 +1 x17114 +1 x17115 +1 x17116 +1 x17117 +1 x17118 +1 x17119 +1 x17120 +1 x17121 +1 x17122 +1 x17123 +1 x17124 +1 x17125 +1 x17126 +1 x17127 +1 x17128 +1 x17129 +1 x17130 +1 x17131 +1 x17132 +1 x17133 +1 x17134 +1 x17135 >= 1;++1 x17136 +1 x17137 +1 x17138 +1 x17139 +1 x17140 +1 x17141 +1 x17142 +1 x17143 +1 x17144 +1 x17145 +1 x17146 +1 x17147 +1 x17148 +1 x17149 +1 x17150 +1 x17151 +1 x17152 +1 x17153 +1 x17154 +1 x17155 +1 x17156 +1 x17157 +1 x17158 +1 x17159 +1 x17160 +1 x17161 +1 x17162 +1 x17163 +1 x17164 +1 x17165 +1 x17166 +1 x17167 +1 x17168 +1 x17169 +1 x17170 +1 x17171 +1 x17172 +1 x17173 +1 x17174 +1 x17175 +1 x17176 +1 x17177 +1 x17178 +1 x17179 +1 x17180 +1 x17181 +1 x17182 +1 x17183 +1 x17184 +1 x17185 +1 x17186 +1 x17187 +1 x17188 +1 x17189 +1 x17190 +1 x17191 +1 x17192 +1 x17193 +1 x17194 +1 x17195 +1 x17196 +1 x17197 +1 x17198 +1 x17199 +1 x17200 +1 x17201 +1 x17202 +1 x17203 +1 x17204 +1 x17205 +1 x17206 +1 x17207 +1 x17208 +1 x17209 +1 x17210 +1 x17211 +1 x17212 +1 x17213 +1 x17214 +1 x17215 +1 x17216 +1 x17217 +1 x17218 +1 x17219 +1 x17220 +1 x17221 +1 x17222 +1 x17223 +1 x17224 +1 x17225 +1 x17226 +1 x17227 +1 x17228 +1 x17229 +1 x17230 +1 x17231 +1 x17232 +1 x17233 +1 x17234 +1 x17235 +1 x17236 +1 x17237 +1 x17238 +1 x17239 +1 x17240 +1 x17241 +1 x17242 +1 x17243 +1 x17244 +1 x17245 +1 x17246 +1 x17247 +1 x17248 +1 x17249 +1 x17250 +1 x17251 +1 x17252 +1 x17253 +1 x17254 +1 x17255 +1 x17256 +1 x17257 +1 x17258 +1 x17259 +1 x17260 +1 x17261 +1 x17262 +1 x17263 +1 x17264 +1 x17265 +1 x17266 +1 x17267 +1 x17268 +1 x17269 +1 x17270 +1 x17271 +1 x17272 +1 x17273 +1 x17274 +1 x17275 +1 x17276 +1 x17277 +1 x17278 +1 x17279 +1 x17280 +1 x17281 +1 x17282 +1 x17283 +1 x17284 >= 1;++1 x17285 +1 x17286 +1 x17287 +1 x17288 +1 x17289 +1 x17290 +1 x17291 +1 x17292 +1 x17293 +1 x17294 +1 x17295 +1 x17296 +1 x17297 +1 x17298 +1 x17299 +1 x17300 +1 x17301 +1 x17302 +1 x17303 +1 x17304 +1 x17305 +1 x17306 +1 x17307 +1 x17308 +1 x17309 +1 x17310 +1 x17311 +1 x17312 +1 x17313 +1 x17314 +1 x17315 +1 x17316 +1 x17317 +1 x17318 +1 x17319 +1 x17320 +1 x17321 +1 x17322 +1 x17323 +1 x17324 +1 x17325 +1 x17326 +1 x17327 +1 x17328 +1 x17329 +1 x17330 +1 x17331 +1 x17332 +1 x17333 +1 x17334 +1 x17335 +1 x17336 +1 x17337 +1 x17338 +1 x17339 +1 x17340 +1 x17341 +1 x17342 +1 x17343 +1 x17344 +1 x17345 +1 x17346 +1 x17347 +1 x17348 +1 x17349 +1 x17350 +1 x17351 +1 x17352 +1 x17353 +1 x17354 +1 x17355 +1 x17356 +1 x17357 +1 x17358 +1 x17359 +1 x17360 +1 x17361 +1 x17362 +1 x17363 +1 x17364 +1 x17365 +1 x17366 +1 x17367 +1 x17368 +1 x17369 +1 x17370 +1 x17371 +1 x17372 +1 x17373 +1 x17374 +1 x17375 +1 x17376 +1 x17377 +1 x17378 +1 x17379 +1 x17380 +1 x17381 +1 x17382 +1 x17383 +1 x17384 +1 x17385 +1 x17386 +1 x17387 +1 x17388 +1 x17389 +1 x17390 +1 x17391 +1 x17392 +1 x17393 +1 x17394 +1 x17395 +1 x17396 +1 x17397 +1 x17398 +1 x17399 +1 x17400 +1 x17401 +1 x17402 +1 x17403 +1 x17404 +1 x17405 +1 x17406 +1 x17407 +1 x17408 +1 x17409 +1 x17410 +1 x17411 +1 x17412 +1 x17413 +1 x17414 +1 x17415 +1 x17416 +1 x17417 +1 x17418 +1 x17419 +1 x17420 +1 x17421 +1 x17422 +1 x17423 +1 x17424 +1 x17425 +1 x17426 +1 x17427 +1 x17428 +1 x17429 +1 x17430 +1 x17431 +1 x17432 +1 x17433 >= 1;++1 x17434 +1 x17435 +1 x17436 +1 x17437 +1 x17438 +1 x17439 +1 x17440 +1 x17441 +1 x17442 +1 x17443 +1 x17444 +1 x17445 +1 x17446 +1 x17447 +1 x17448 +1 x17449 +1 x17450 +1 x17451 +1 x17452 +1 x17453 +1 x17454 +1 x17455 +1 x17456 +1 x17457 +1 x17458 +1 x17459 +1 x17460 +1 x17461 +1 x17462 +1 x17463 +1 x17464 +1 x17465 +1 x17466 +1 x17467 +1 x17468 +1 x17469 +1 x17470 +1 x17471 +1 x17472 +1 x17473 +1 x17474 +1 x17475 +1 x17476 +1 x17477 +1 x17478 +1 x17479 +1 x17480 +1 x17481 +1 x17482 +1 x17483 +1 x17484 +1 x17485 +1 x17486 +1 x17487 +1 x17488 +1 x17489 +1 x17490 +1 x17491 +1 x17492 +1 x17493 +1 x17494 +1 x17495 +1 x17496 +1 x17497 +1 x17498 +1 x17499 +1 x17500 +1 x17501 +1 x17502 +1 x17503 +1 x17504 +1 x17505 +1 x17506 +1 x17507 +1 x17508 +1 x17509 +1 x17510 +1 x17511 +1 x17512 +1 x17513 +1 x17514 +1 x17515 +1 x17516 +1 x17517 +1 x17518 +1 x17519 +1 x17520 +1 x17521 +1 x17522 +1 x17523 +1 x17524 +1 x17525 +1 x17526 +1 x17527 +1 x17528 +1 x17529 +1 x17530 +1 x17531 +1 x17532 +1 x17533 +1 x17534 +1 x17535 +1 x17536 +1 x17537 +1 x17538 +1 x17539 +1 x17540 +1 x17541 +1 x17542 +1 x17543 +1 x17544 +1 x17545 +1 x17546 +1 x17547 +1 x17548 +1 x17549 +1 x17550 +1 x17551 +1 x17552 +1 x17553 +1 x17554 +1 x17555 +1 x17556 +1 x17557 +1 x17558 +1 x17559 +1 x17560 +1 x17561 +1 x17562 +1 x17563 +1 x17564 +1 x17565 +1 x17566 +1 x17567 +1 x17568 +1 x17569 +1 x17570 +1 x17571 +1 x17572 +1 x17573 +1 x17574 +1 x17575 +1 x17576 +1 x17577 +1 x17578 +1 x17579 +1 x17580 +1 x17581 +1 x17582 >= 1;++1 x17583 +1 x17584 +1 x17585 +1 x17586 +1 x17587 +1 x17588 +1 x17589 +1 x17590 +1 x17591 +1 x17592 +1 x17593 +1 x17594 +1 x17595 +1 x17596 +1 x17597 +1 x17598 +1 x17599 +1 x17600 +1 x17601 +1 x17602 +1 x17603 +1 x17604 +1 x17605 +1 x17606 +1 x17607 +1 x17608 +1 x17609 +1 x17610 +1 x17611 +1 x17612 +1 x17613 +1 x17614 +1 x17615 +1 x17616 +1 x17617 +1 x17618 +1 x17619 +1 x17620 +1 x17621 +1 x17622 +1 x17623 +1 x17624 +1 x17625 +1 x17626 +1 x17627 +1 x17628 +1 x17629 +1 x17630 +1 x17631 +1 x17632 +1 x17633 +1 x17634 +1 x17635 +1 x17636 +1 x17637 +1 x17638 +1 x17639 +1 x17640 +1 x17641 +1 x17642 +1 x17643 +1 x17644 +1 x17645 +1 x17646 +1 x17647 +1 x17648 +1 x17649 +1 x17650 +1 x17651 +1 x17652 +1 x17653 +1 x17654 +1 x17655 +1 x17656 +1 x17657 +1 x17658 +1 x17659 +1 x17660 +1 x17661 +1 x17662 +1 x17663 +1 x17664 +1 x17665 +1 x17666 +1 x17667 +1 x17668 +1 x17669 +1 x17670 +1 x17671 +1 x17672 +1 x17673 +1 x17674 +1 x17675 +1 x17676 +1 x17677 +1 x17678 +1 x17679 +1 x17680 +1 x17681 +1 x17682 +1 x17683 +1 x17684 +1 x17685 +1 x17686 +1 x17687 +1 x17688 +1 x17689 +1 x17690 +1 x17691 +1 x17692 +1 x17693 +1 x17694 +1 x17695 +1 x17696 +1 x17697 +1 x17698 +1 x17699 +1 x17700 +1 x17701 +1 x17702 +1 x17703 +1 x17704 +1 x17705 +1 x17706 +1 x17707 +1 x17708 +1 x17709 +1 x17710 +1 x17711 +1 x17712 +1 x17713 +1 x17714 +1 x17715 +1 x17716 +1 x17717 +1 x17718 +1 x17719 +1 x17720 +1 x17721 +1 x17722 +1 x17723 +1 x17724 +1 x17725 +1 x17726 +1 x17727 +1 x17728 +1 x17729 +1 x17730 +1 x17731 >= 1;++1 x17732 +1 x17733 +1 x17734 +1 x17735 +1 x17736 +1 x17737 +1 x17738 +1 x17739 +1 x17740 +1 x17741 +1 x17742 +1 x17743 +1 x17744 +1 x17745 +1 x17746 +1 x17747 +1 x17748 +1 x17749 +1 x17750 +1 x17751 +1 x17752 +1 x17753 +1 x17754 +1 x17755 +1 x17756 +1 x17757 +1 x17758 +1 x17759 +1 x17760 +1 x17761 +1 x17762 +1 x17763 +1 x17764 +1 x17765 +1 x17766 +1 x17767 +1 x17768 +1 x17769 +1 x17770 +1 x17771 +1 x17772 +1 x17773 +1 x17774 +1 x17775 +1 x17776 +1 x17777 +1 x17778 +1 x17779 +1 x17780 +1 x17781 +1 x17782 +1 x17783 +1 x17784 +1 x17785 +1 x17786 +1 x17787 +1 x17788 +1 x17789 +1 x17790 +1 x17791 +1 x17792 +1 x17793 +1 x17794 +1 x17795 +1 x17796 +1 x17797 +1 x17798 +1 x17799 +1 x17800 +1 x17801 +1 x17802 +1 x17803 +1 x17804 +1 x17805 +1 x17806 +1 x17807 +1 x17808 +1 x17809 +1 x17810 +1 x17811 +1 x17812 +1 x17813 +1 x17814 +1 x17815 +1 x17816 +1 x17817 +1 x17818 +1 x17819 +1 x17820 +1 x17821 +1 x17822 +1 x17823 +1 x17824 +1 x17825 +1 x17826 +1 x17827 +1 x17828 +1 x17829 +1 x17830 +1 x17831 +1 x17832 +1 x17833 +1 x17834 +1 x17835 +1 x17836 +1 x17837 +1 x17838 +1 x17839 +1 x17840 +1 x17841 +1 x17842 +1 x17843 +1 x17844 +1 x17845 +1 x17846 +1 x17847 +1 x17848 +1 x17849 +1 x17850 +1 x17851 +1 x17852 +1 x17853 +1 x17854 +1 x17855 +1 x17856 +1 x17857 +1 x17858 +1 x17859 +1 x17860 +1 x17861 +1 x17862 +1 x17863 +1 x17864 +1 x17865 +1 x17866 +1 x17867 +1 x17868 +1 x17869 +1 x17870 +1 x17871 +1 x17872 +1 x17873 +1 x17874 +1 x17875 +1 x17876 +1 x17877 +1 x17878 +1 x17879 +1 x17880 >= 1;++1 x17881 +1 x17882 +1 x17883 +1 x17884 +1 x17885 +1 x17886 +1 x17887 +1 x17888 +1 x17889 +1 x17890 +1 x17891 +1 x17892 +1 x17893 +1 x17894 +1 x17895 +1 x17896 +1 x17897 +1 x17898 +1 x17899 +1 x17900 +1 x17901 +1 x17902 +1 x17903 +1 x17904 +1 x17905 +1 x17906 +1 x17907 +1 x17908 +1 x17909 +1 x17910 +1 x17911 +1 x17912 +1 x17913 +1 x17914 +1 x17915 +1 x17916 +1 x17917 +1 x17918 +1 x17919 +1 x17920 +1 x17921 +1 x17922 +1 x17923 +1 x17924 +1 x17925 +1 x17926 +1 x17927 +1 x17928 +1 x17929 +1 x17930 +1 x17931 +1 x17932 +1 x17933 +1 x17934 +1 x17935 +1 x17936 +1 x17937 +1 x17938 +1 x17939 +1 x17940 +1 x17941 +1 x17942 +1 x17943 +1 x17944 +1 x17945 +1 x17946 +1 x17947 +1 x17948 +1 x17949 +1 x17950 +1 x17951 +1 x17952 +1 x17953 +1 x17954 +1 x17955 +1 x17956 +1 x17957 +1 x17958 +1 x17959 +1 x17960 +1 x17961 +1 x17962 +1 x17963 +1 x17964 +1 x17965 +1 x17966 +1 x17967 +1 x17968 +1 x17969 +1 x17970 +1 x17971 +1 x17972 +1 x17973 +1 x17974 +1 x17975 +1 x17976 +1 x17977 +1 x17978 +1 x17979 +1 x17980 +1 x17981 +1 x17982 +1 x17983 +1 x17984 +1 x17985 +1 x17986 +1 x17987 +1 x17988 +1 x17989 +1 x17990 +1 x17991 +1 x17992 +1 x17993 +1 x17994 +1 x17995 +1 x17996 +1 x17997 +1 x17998 +1 x17999 +1 x18000 +1 x18001 +1 x18002 +1 x18003 +1 x18004 +1 x18005 +1 x18006 +1 x18007 +1 x18008 +1 x18009 +1 x18010 +1 x18011 +1 x18012 +1 x18013 +1 x18014 +1 x18015 +1 x18016 +1 x18017 +1 x18018 +1 x18019 +1 x18020 +1 x18021 +1 x18022 +1 x18023 +1 x18024 +1 x18025 +1 x18026 +1 x18027 +1 x18028 +1 x18029 >= 1;++1 x18030 +1 x18031 +1 x18032 +1 x18033 +1 x18034 +1 x18035 +1 x18036 +1 x18037 +1 x18038 +1 x18039 +1 x18040 +1 x18041 +1 x18042 +1 x18043 +1 x18044 +1 x18045 +1 x18046 +1 x18047 +1 x18048 +1 x18049 +1 x18050 +1 x18051 +1 x18052 +1 x18053 +1 x18054 +1 x18055 +1 x18056 +1 x18057 +1 x18058 +1 x18059 +1 x18060 +1 x18061 +1 x18062 +1 x18063 +1 x18064 +1 x18065 +1 x18066 +1 x18067 +1 x18068 +1 x18069 +1 x18070 +1 x18071 +1 x18072 +1 x18073 +1 x18074 +1 x18075 +1 x18076 +1 x18077 +1 x18078 +1 x18079 +1 x18080 +1 x18081 +1 x18082 +1 x18083 +1 x18084 +1 x18085 +1 x18086 +1 x18087 +1 x18088 +1 x18089 +1 x18090 +1 x18091 +1 x18092 +1 x18093 +1 x18094 +1 x18095 +1 x18096 +1 x18097 +1 x18098 +1 x18099 +1 x18100 +1 x18101 +1 x18102 +1 x18103 +1 x18104 +1 x18105 +1 x18106 +1 x18107 +1 x18108 +1 x18109 +1 x18110 +1 x18111 +1 x18112 +1 x18113 +1 x18114 +1 x18115 +1 x18116 +1 x18117 +1 x18118 +1 x18119 +1 x18120 +1 x18121 +1 x18122 +1 x18123 +1 x18124 +1 x18125 +1 x18126 +1 x18127 +1 x18128 +1 x18129 +1 x18130 +1 x18131 +1 x18132 +1 x18133 +1 x18134 +1 x18135 +1 x18136 +1 x18137 +1 x18138 +1 x18139 +1 x18140 +1 x18141 +1 x18142 +1 x18143 +1 x18144 +1 x18145 +1 x18146 +1 x18147 +1 x18148 +1 x18149 +1 x18150 +1 x18151 +1 x18152 +1 x18153 +1 x18154 +1 x18155 +1 x18156 +1 x18157 +1 x18158 +1 x18159 +1 x18160 +1 x18161 +1 x18162 +1 x18163 +1 x18164 +1 x18165 +1 x18166 +1 x18167 +1 x18168 +1 x18169 +1 x18170 +1 x18171 +1 x18172 +1 x18173 +1 x18174 +1 x18175 +1 x18176 +1 x18177 +1 x18178 >= 1;++1 x18179 +1 x18180 +1 x18181 +1 x18182 +1 x18183 +1 x18184 +1 x18185 +1 x18186 +1 x18187 +1 x18188 +1 x18189 +1 x18190 +1 x18191 +1 x18192 +1 x18193 +1 x18194 +1 x18195 +1 x18196 +1 x18197 +1 x18198 +1 x18199 +1 x18200 +1 x18201 +1 x18202 +1 x18203 +1 x18204 +1 x18205 +1 x18206 +1 x18207 +1 x18208 +1 x18209 +1 x18210 +1 x18211 +1 x18212 +1 x18213 +1 x18214 +1 x18215 +1 x18216 +1 x18217 +1 x18218 +1 x18219 +1 x18220 +1 x18221 +1 x18222 +1 x18223 +1 x18224 +1 x18225 +1 x18226 +1 x18227 +1 x18228 +1 x18229 +1 x18230 +1 x18231 +1 x18232 +1 x18233 +1 x18234 +1 x18235 +1 x18236 +1 x18237 +1 x18238 +1 x18239 +1 x18240 +1 x18241 +1 x18242 +1 x18243 +1 x18244 +1 x18245 +1 x18246 +1 x18247 +1 x18248 +1 x18249 +1 x18250 +1 x18251 +1 x18252 +1 x18253 +1 x18254 +1 x18255 +1 x18256 +1 x18257 +1 x18258 +1 x18259 +1 x18260 +1 x18261 +1 x18262 +1 x18263 +1 x18264 +1 x18265 +1 x18266 +1 x18267 +1 x18268 +1 x18269 +1 x18270 +1 x18271 +1 x18272 +1 x18273 +1 x18274 +1 x18275 +1 x18276 +1 x18277 +1 x18278 +1 x18279 +1 x18280 +1 x18281 +1 x18282 +1 x18283 +1 x18284 +1 x18285 +1 x18286 +1 x18287 +1 x18288 +1 x18289 +1 x18290 +1 x18291 +1 x18292 +1 x18293 +1 x18294 +1 x18295 +1 x18296 +1 x18297 +1 x18298 +1 x18299 +1 x18300 +1 x18301 +1 x18302 +1 x18303 +1 x18304 +1 x18305 +1 x18306 +1 x18307 +1 x18308 +1 x18309 +1 x18310 +1 x18311 +1 x18312 +1 x18313 +1 x18314 +1 x18315 +1 x18316 +1 x18317 +1 x18318 +1 x18319 +1 x18320 +1 x18321 +1 x18322 +1 x18323 +1 x18324 +1 x18325 +1 x18326 +1 x18327 >= 1;++1 x18328 +1 x18329 +1 x18330 +1 x18331 +1 x18332 +1 x18333 +1 x18334 +1 x18335 +1 x18336 +1 x18337 +1 x18338 +1 x18339 +1 x18340 +1 x18341 +1 x18342 +1 x18343 +1 x18344 +1 x18345 +1 x18346 +1 x18347 +1 x18348 +1 x18349 +1 x18350 +1 x18351 +1 x18352 +1 x18353 +1 x18354 +1 x18355 +1 x18356 +1 x18357 +1 x18358 +1 x18359 +1 x18360 +1 x18361 +1 x18362 +1 x18363 +1 x18364 +1 x18365 +1 x18366 +1 x18367 +1 x18368 +1 x18369 +1 x18370 +1 x18371 +1 x18372 +1 x18373 +1 x18374 +1 x18375 +1 x18376 +1 x18377 +1 x18378 +1 x18379 +1 x18380 +1 x18381 +1 x18382 +1 x18383 +1 x18384 +1 x18385 +1 x18386 +1 x18387 +1 x18388 +1 x18389 +1 x18390 +1 x18391 +1 x18392 +1 x18393 +1 x18394 +1 x18395 +1 x18396 +1 x18397 +1 x18398 +1 x18399 +1 x18400 +1 x18401 +1 x18402 +1 x18403 +1 x18404 +1 x18405 +1 x18406 +1 x18407 +1 x18408 +1 x18409 +1 x18410 +1 x18411 +1 x18412 +1 x18413 +1 x18414 +1 x18415 +1 x18416 +1 x18417 +1 x18418 +1 x18419 +1 x18420 +1 x18421 +1 x18422 +1 x18423 +1 x18424 +1 x18425 +1 x18426 +1 x18427 +1 x18428 +1 x18429 +1 x18430 +1 x18431 +1 x18432 +1 x18433 +1 x18434 +1 x18435 +1 x18436 +1 x18437 +1 x18438 +1 x18439 +1 x18440 +1 x18441 +1 x18442 +1 x18443 +1 x18444 +1 x18445 +1 x18446 +1 x18447 +1 x18448 +1 x18449 +1 x18450 +1 x18451 +1 x18452 +1 x18453 +1 x18454 +1 x18455 +1 x18456 +1 x18457 +1 x18458 +1 x18459 +1 x18460 +1 x18461 +1 x18462 +1 x18463 +1 x18464 +1 x18465 +1 x18466 +1 x18467 +1 x18468 +1 x18469 +1 x18470 +1 x18471 +1 x18472 +1 x18473 +1 x18474 +1 x18475 +1 x18476 >= 1;++1 x18477 +1 x18478 +1 x18479 +1 x18480 +1 x18481 +1 x18482 +1 x18483 +1 x18484 +1 x18485 +1 x18486 +1 x18487 +1 x18488 +1 x18489 +1 x18490 +1 x18491 +1 x18492 +1 x18493 +1 x18494 +1 x18495 +1 x18496 +1 x18497 +1 x18498 +1 x18499 +1 x18500 +1 x18501 +1 x18502 +1 x18503 +1 x18504 +1 x18505 +1 x18506 +1 x18507 +1 x18508 +1 x18509 +1 x18510 +1 x18511 +1 x18512 +1 x18513 +1 x18514 +1 x18515 +1 x18516 +1 x18517 +1 x18518 +1 x18519 +1 x18520 +1 x18521 +1 x18522 +1 x18523 +1 x18524 +1 x18525 +1 x18526 +1 x18527 +1 x18528 +1 x18529 +1 x18530 +1 x18531 +1 x18532 +1 x18533 +1 x18534 +1 x18535 +1 x18536 +1 x18537 +1 x18538 +1 x18539 +1 x18540 +1 x18541 +1 x18542 +1 x18543 +1 x18544 +1 x18545 +1 x18546 +1 x18547 +1 x18548 +1 x18549 +1 x18550 +1 x18551 +1 x18552 +1 x18553 +1 x18554 +1 x18555 +1 x18556 +1 x18557 +1 x18558 +1 x18559 +1 x18560 +1 x18561 +1 x18562 +1 x18563 +1 x18564 +1 x18565 +1 x18566 +1 x18567 +1 x18568 +1 x18569 +1 x18570 +1 x18571 +1 x18572 +1 x18573 +1 x18574 +1 x18575 +1 x18576 +1 x18577 +1 x18578 +1 x18579 +1 x18580 +1 x18581 +1 x18582 +1 x18583 +1 x18584 +1 x18585 +1 x18586 +1 x18587 +1 x18588 +1 x18589 +1 x18590 +1 x18591 +1 x18592 +1 x18593 +1 x18594 +1 x18595 +1 x18596 +1 x18597 +1 x18598 +1 x18599 +1 x18600 +1 x18601 +1 x18602 +1 x18603 +1 x18604 +1 x18605 +1 x18606 +1 x18607 +1 x18608 +1 x18609 +1 x18610 +1 x18611 +1 x18612 +1 x18613 +1 x18614 +1 x18615 +1 x18616 +1 x18617 +1 x18618 +1 x18619 +1 x18620 +1 x18621 +1 x18622 +1 x18623 +1 x18624 +1 x18625 >= 1;++1 x18626 +1 x18627 +1 x18628 +1 x18629 +1 x18630 +1 x18631 +1 x18632 +1 x18633 +1 x18634 +1 x18635 +1 x18636 +1 x18637 +1 x18638 +1 x18639 +1 x18640 +1 x18641 +1 x18642 +1 x18643 +1 x18644 +1 x18645 +1 x18646 +1 x18647 +1 x18648 +1 x18649 +1 x18650 +1 x18651 +1 x18652 +1 x18653 +1 x18654 +1 x18655 +1 x18656 +1 x18657 +1 x18658 +1 x18659 +1 x18660 +1 x18661 +1 x18662 +1 x18663 +1 x18664 +1 x18665 +1 x18666 +1 x18667 +1 x18668 +1 x18669 +1 x18670 +1 x18671 +1 x18672 +1 x18673 +1 x18674 +1 x18675 +1 x18676 +1 x18677 +1 x18678 +1 x18679 +1 x18680 +1 x18681 +1 x18682 +1 x18683 +1 x18684 +1 x18685 +1 x18686 +1 x18687 +1 x18688 +1 x18689 +1 x18690 +1 x18691 +1 x18692 +1 x18693 +1 x18694 +1 x18695 +1 x18696 +1 x18697 +1 x18698 +1 x18699 +1 x18700 +1 x18701 +1 x18702 +1 x18703 +1 x18704 +1 x18705 +1 x18706 +1 x18707 +1 x18708 +1 x18709 +1 x18710 +1 x18711 +1 x18712 +1 x18713 +1 x18714 +1 x18715 +1 x18716 +1 x18717 +1 x18718 +1 x18719 +1 x18720 +1 x18721 +1 x18722 +1 x18723 +1 x18724 +1 x18725 +1 x18726 +1 x18727 +1 x18728 +1 x18729 +1 x18730 +1 x18731 +1 x18732 +1 x18733 +1 x18734 +1 x18735 +1 x18736 +1 x18737 +1 x18738 +1 x18739 +1 x18740 +1 x18741 +1 x18742 +1 x18743 +1 x18744 +1 x18745 +1 x18746 +1 x18747 +1 x18748 +1 x18749 +1 x18750 +1 x18751 +1 x18752 +1 x18753 +1 x18754 +1 x18755 +1 x18756 +1 x18757 +1 x18758 +1 x18759 +1 x18760 +1 x18761 +1 x18762 +1 x18763 +1 x18764 +1 x18765 +1 x18766 +1 x18767 +1 x18768 +1 x18769 +1 x18770 +1 x18771 +1 x18772 +1 x18773 +1 x18774 >= 1;++1 x18775 +1 x18776 +1 x18777 +1 x18778 +1 x18779 +1 x18780 +1 x18781 +1 x18782 +1 x18783 +1 x18784 +1 x18785 +1 x18786 +1 x18787 +1 x18788 +1 x18789 +1 x18790 +1 x18791 +1 x18792 +1 x18793 +1 x18794 +1 x18795 +1 x18796 +1 x18797 +1 x18798 +1 x18799 +1 x18800 +1 x18801 +1 x18802 +1 x18803 +1 x18804 +1 x18805 +1 x18806 +1 x18807 +1 x18808 +1 x18809 +1 x18810 +1 x18811 +1 x18812 +1 x18813 +1 x18814 +1 x18815 +1 x18816 +1 x18817 +1 x18818 +1 x18819 +1 x18820 +1 x18821 +1 x18822 +1 x18823 +1 x18824 +1 x18825 +1 x18826 +1 x18827 +1 x18828 +1 x18829 +1 x18830 +1 x18831 +1 x18832 +1 x18833 +1 x18834 +1 x18835 +1 x18836 +1 x18837 +1 x18838 +1 x18839 +1 x18840 +1 x18841 +1 x18842 +1 x18843 +1 x18844 +1 x18845 +1 x18846 +1 x18847 +1 x18848 +1 x18849 +1 x18850 +1 x18851 +1 x18852 +1 x18853 +1 x18854 +1 x18855 +1 x18856 +1 x18857 +1 x18858 +1 x18859 +1 x18860 +1 x18861 +1 x18862 +1 x18863 +1 x18864 +1 x18865 +1 x18866 +1 x18867 +1 x18868 +1 x18869 +1 x18870 +1 x18871 +1 x18872 +1 x18873 +1 x18874 +1 x18875 +1 x18876 +1 x18877 +1 x18878 +1 x18879 +1 x18880 +1 x18881 +1 x18882 +1 x18883 +1 x18884 +1 x18885 +1 x18886 +1 x18887 +1 x18888 +1 x18889 +1 x18890 +1 x18891 +1 x18892 +1 x18893 +1 x18894 +1 x18895 +1 x18896 +1 x18897 +1 x18898 +1 x18899 +1 x18900 +1 x18901 +1 x18902 +1 x18903 +1 x18904 +1 x18905 +1 x18906 +1 x18907 +1 x18908 +1 x18909 +1 x18910 +1 x18911 +1 x18912 +1 x18913 +1 x18914 +1 x18915 +1 x18916 +1 x18917 +1 x18918 +1 x18919 +1 x18920 +1 x18921 +1 x18922 +1 x18923 >= 1;++1 x18924 +1 x18925 +1 x18926 +1 x18927 +1 x18928 +1 x18929 +1 x18930 +1 x18931 +1 x18932 +1 x18933 +1 x18934 +1 x18935 +1 x18936 +1 x18937 +1 x18938 +1 x18939 +1 x18940 +1 x18941 +1 x18942 +1 x18943 +1 x18944 +1 x18945 +1 x18946 +1 x18947 +1 x18948 +1 x18949 +1 x18950 +1 x18951 +1 x18952 +1 x18953 +1 x18954 +1 x18955 +1 x18956 +1 x18957 +1 x18958 +1 x18959 +1 x18960 +1 x18961 +1 x18962 +1 x18963 +1 x18964 +1 x18965 +1 x18966 +1 x18967 +1 x18968 +1 x18969 +1 x18970 +1 x18971 +1 x18972 +1 x18973 +1 x18974 +1 x18975 +1 x18976 +1 x18977 +1 x18978 +1 x18979 +1 x18980 +1 x18981 +1 x18982 +1 x18983 +1 x18984 +1 x18985 +1 x18986 +1 x18987 +1 x18988 +1 x18989 +1 x18990 +1 x18991 +1 x18992 +1 x18993 +1 x18994 +1 x18995 +1 x18996 +1 x18997 +1 x18998 +1 x18999 +1 x19000 +1 x19001 +1 x19002 +1 x19003 +1 x19004 +1 x19005 +1 x19006 +1 x19007 +1 x19008 +1 x19009 +1 x19010 +1 x19011 +1 x19012 +1 x19013 +1 x19014 +1 x19015 +1 x19016 +1 x19017 +1 x19018 +1 x19019 +1 x19020 +1 x19021 +1 x19022 +1 x19023 +1 x19024 +1 x19025 +1 x19026 +1 x19027 +1 x19028 +1 x19029 +1 x19030 +1 x19031 +1 x19032 +1 x19033 +1 x19034 +1 x19035 +1 x19036 +1 x19037 +1 x19038 +1 x19039 +1 x19040 +1 x19041 +1 x19042 +1 x19043 +1 x19044 +1 x19045 +1 x19046 +1 x19047 +1 x19048 +1 x19049 +1 x19050 +1 x19051 +1 x19052 +1 x19053 +1 x19054 +1 x19055 +1 x19056 +1 x19057 +1 x19058 +1 x19059 +1 x19060 +1 x19061 +1 x19062 +1 x19063 +1 x19064 +1 x19065 +1 x19066 +1 x19067 +1 x19068 +1 x19069 +1 x19070 +1 x19071 +1 x19072 >= 1;++1 x19073 +1 x19074 +1 x19075 +1 x19076 +1 x19077 +1 x19078 +1 x19079 +1 x19080 +1 x19081 +1 x19082 +1 x19083 +1 x19084 +1 x19085 +1 x19086 +1 x19087 +1 x19088 +1 x19089 +1 x19090 +1 x19091 +1 x19092 +1 x19093 +1 x19094 +1 x19095 +1 x19096 +1 x19097 +1 x19098 +1 x19099 +1 x19100 +1 x19101 +1 x19102 +1 x19103 +1 x19104 +1 x19105 +1 x19106 +1 x19107 +1 x19108 +1 x19109 +1 x19110 +1 x19111 +1 x19112 +1 x19113 +1 x19114 +1 x19115 +1 x19116 +1 x19117 +1 x19118 +1 x19119 +1 x19120 +1 x19121 +1 x19122 +1 x19123 +1 x19124 +1 x19125 +1 x19126 +1 x19127 +1 x19128 +1 x19129 +1 x19130 +1 x19131 +1 x19132 +1 x19133 +1 x19134 +1 x19135 +1 x19136 +1 x19137 +1 x19138 +1 x19139 +1 x19140 +1 x19141 +1 x19142 +1 x19143 +1 x19144 +1 x19145 +1 x19146 +1 x19147 +1 x19148 +1 x19149 +1 x19150 +1 x19151 +1 x19152 +1 x19153 +1 x19154 +1 x19155 +1 x19156 +1 x19157 +1 x19158 +1 x19159 +1 x19160 +1 x19161 +1 x19162 +1 x19163 +1 x19164 +1 x19165 +1 x19166 +1 x19167 +1 x19168 +1 x19169 +1 x19170 +1 x19171 +1 x19172 +1 x19173 +1 x19174 +1 x19175 +1 x19176 +1 x19177 +1 x19178 +1 x19179 +1 x19180 +1 x19181 +1 x19182 +1 x19183 +1 x19184 +1 x19185 +1 x19186 +1 x19187 +1 x19188 +1 x19189 +1 x19190 +1 x19191 +1 x19192 +1 x19193 +1 x19194 +1 x19195 +1 x19196 +1 x19197 +1 x19198 +1 x19199 +1 x19200 +1 x19201 +1 x19202 +1 x19203 +1 x19204 +1 x19205 +1 x19206 +1 x19207 +1 x19208 +1 x19209 +1 x19210 +1 x19211 +1 x19212 +1 x19213 +1 x19214 +1 x19215 +1 x19216 +1 x19217 +1 x19218 +1 x19219 +1 x19220 +1 x19221 >= 1;++1 x19222 +1 x19223 +1 x19224 +1 x19225 +1 x19226 +1 x19227 +1 x19228 +1 x19229 +1 x19230 +1 x19231 +1 x19232 +1 x19233 +1 x19234 +1 x19235 +1 x19236 +1 x19237 +1 x19238 +1 x19239 +1 x19240 +1 x19241 +1 x19242 +1 x19243 +1 x19244 +1 x19245 +1 x19246 +1 x19247 +1 x19248 +1 x19249 +1 x19250 +1 x19251 +1 x19252 +1 x19253 +1 x19254 +1 x19255 +1 x19256 +1 x19257 +1 x19258 +1 x19259 +1 x19260 +1 x19261 +1 x19262 +1 x19263 +1 x19264 +1 x19265 +1 x19266 +1 x19267 +1 x19268 +1 x19269 +1 x19270 +1 x19271 +1 x19272 +1 x19273 +1 x19274 +1 x19275 +1 x19276 +1 x19277 +1 x19278 +1 x19279 +1 x19280 +1 x19281 +1 x19282 +1 x19283 +1 x19284 +1 x19285 +1 x19286 +1 x19287 +1 x19288 +1 x19289 +1 x19290 +1 x19291 +1 x19292 +1 x19293 +1 x19294 +1 x19295 +1 x19296 +1 x19297 +1 x19298 +1 x19299 +1 x19300 +1 x19301 +1 x19302 +1 x19303 +1 x19304 +1 x19305 +1 x19306 +1 x19307 +1 x19308 +1 x19309 +1 x19310 +1 x19311 +1 x19312 +1 x19313 +1 x19314 +1 x19315 +1 x19316 +1 x19317 +1 x19318 +1 x19319 +1 x19320 +1 x19321 +1 x19322 +1 x19323 +1 x19324 +1 x19325 +1 x19326 +1 x19327 +1 x19328 +1 x19329 +1 x19330 +1 x19331 +1 x19332 +1 x19333 +1 x19334 +1 x19335 +1 x19336 +1 x19337 +1 x19338 +1 x19339 +1 x19340 +1 x19341 +1 x19342 +1 x19343 +1 x19344 +1 x19345 +1 x19346 +1 x19347 +1 x19348 +1 x19349 +1 x19350 +1 x19351 +1 x19352 +1 x19353 +1 x19354 +1 x19355 +1 x19356 +1 x19357 +1 x19358 +1 x19359 +1 x19360 +1 x19361 +1 x19362 +1 x19363 +1 x19364 +1 x19365 +1 x19366 +1 x19367 +1 x19368 +1 x19369 +1 x19370 >= 1;++1 x19371 +1 x19372 +1 x19373 +1 x19374 +1 x19375 +1 x19376 +1 x19377 +1 x19378 +1 x19379 +1 x19380 +1 x19381 +1 x19382 +1 x19383 +1 x19384 +1 x19385 +1 x19386 +1 x19387 +1 x19388 +1 x19389 +1 x19390 +1 x19391 +1 x19392 +1 x19393 +1 x19394 +1 x19395 +1 x19396 +1 x19397 +1 x19398 +1 x19399 +1 x19400 +1 x19401 +1 x19402 +1 x19403 +1 x19404 +1 x19405 +1 x19406 +1 x19407 +1 x19408 +1 x19409 +1 x19410 +1 x19411 +1 x19412 +1 x19413 +1 x19414 +1 x19415 +1 x19416 +1 x19417 +1 x19418 +1 x19419 +1 x19420 +1 x19421 +1 x19422 +1 x19423 +1 x19424 +1 x19425 +1 x19426 +1 x19427 +1 x19428 +1 x19429 +1 x19430 +1 x19431 +1 x19432 +1 x19433 +1 x19434 +1 x19435 +1 x19436 +1 x19437 +1 x19438 +1 x19439 +1 x19440 +1 x19441 +1 x19442 +1 x19443 +1 x19444 +1 x19445 +1 x19446 +1 x19447 +1 x19448 +1 x19449 +1 x19450 +1 x19451 +1 x19452 +1 x19453 +1 x19454 +1 x19455 +1 x19456 +1 x19457 +1 x19458 +1 x19459 +1 x19460 +1 x19461 +1 x19462 +1 x19463 +1 x19464 +1 x19465 +1 x19466 +1 x19467 +1 x19468 +1 x19469 +1 x19470 +1 x19471 +1 x19472 +1 x19473 +1 x19474 +1 x19475 +1 x19476 +1 x19477 +1 x19478 +1 x19479 +1 x19480 +1 x19481 +1 x19482 +1 x19483 +1 x19484 +1 x19485 +1 x19486 +1 x19487 +1 x19488 +1 x19489 +1 x19490 +1 x19491 +1 x19492 +1 x19493 +1 x19494 +1 x19495 +1 x19496 +1 x19497 +1 x19498 +1 x19499 +1 x19500 +1 x19501 +1 x19502 +1 x19503 +1 x19504 +1 x19505 +1 x19506 +1 x19507 +1 x19508 +1 x19509 +1 x19510 +1 x19511 +1 x19512 +1 x19513 +1 x19514 +1 x19515 +1 x19516 +1 x19517 +1 x19518 +1 x19519 >= 1;++1 x19520 +1 x19521 +1 x19522 +1 x19523 +1 x19524 +1 x19525 +1 x19526 +1 x19527 +1 x19528 +1 x19529 +1 x19530 +1 x19531 +1 x19532 +1 x19533 +1 x19534 +1 x19535 +1 x19536 +1 x19537 +1 x19538 +1 x19539 +1 x19540 +1 x19541 +1 x19542 +1 x19543 +1 x19544 +1 x19545 +1 x19546 +1 x19547 +1 x19548 +1 x19549 +1 x19550 +1 x19551 +1 x19552 +1 x19553 +1 x19554 +1 x19555 +1 x19556 +1 x19557 +1 x19558 +1 x19559 +1 x19560 +1 x19561 +1 x19562 +1 x19563 +1 x19564 +1 x19565 +1 x19566 +1 x19567 +1 x19568 +1 x19569 +1 x19570 +1 x19571 +1 x19572 +1 x19573 +1 x19574 +1 x19575 +1 x19576 +1 x19577 +1 x19578 +1 x19579 +1 x19580 +1 x19581 +1 x19582 +1 x19583 +1 x19584 +1 x19585 +1 x19586 +1 x19587 +1 x19588 +1 x19589 +1 x19590 +1 x19591 +1 x19592 +1 x19593 +1 x19594 +1 x19595 +1 x19596 +1 x19597 +1 x19598 +1 x19599 +1 x19600 +1 x19601 +1 x19602 +1 x19603 +1 x19604 +1 x19605 +1 x19606 +1 x19607 +1 x19608 +1 x19609 +1 x19610 +1 x19611 +1 x19612 +1 x19613 +1 x19614 +1 x19615 +1 x19616 +1 x19617 +1 x19618 +1 x19619 +1 x19620 +1 x19621 +1 x19622 +1 x19623 +1 x19624 +1 x19625 +1 x19626 +1 x19627 +1 x19628 +1 x19629 +1 x19630 +1 x19631 +1 x19632 +1 x19633 +1 x19634 +1 x19635 +1 x19636 +1 x19637 +1 x19638 +1 x19639 +1 x19640 +1 x19641 +1 x19642 +1 x19643 +1 x19644 +1 x19645 +1 x19646 +1 x19647 +1 x19648 +1 x19649 +1 x19650 +1 x19651 +1 x19652 +1 x19653 +1 x19654 +1 x19655 +1 x19656 +1 x19657 +1 x19658 +1 x19659 +1 x19660 +1 x19661 +1 x19662 +1 x19663 +1 x19664 +1 x19665 +1 x19666 +1 x19667 +1 x19668 >= 1;++1 x19669 +1 x19670 +1 x19671 +1 x19672 +1 x19673 +1 x19674 +1 x19675 +1 x19676 +1 x19677 +1 x19678 +1 x19679 +1 x19680 +1 x19681 +1 x19682 +1 x19683 +1 x19684 +1 x19685 +1 x19686 +1 x19687 +1 x19688 +1 x19689 +1 x19690 +1 x19691 +1 x19692 +1 x19693 +1 x19694 +1 x19695 +1 x19696 +1 x19697 +1 x19698 +1 x19699 +1 x19700 +1 x19701 +1 x19702 +1 x19703 +1 x19704 +1 x19705 +1 x19706 +1 x19707 +1 x19708 +1 x19709 +1 x19710 +1 x19711 +1 x19712 +1 x19713 +1 x19714 +1 x19715 +1 x19716 +1 x19717 +1 x19718 +1 x19719 +1 x19720 +1 x19721 +1 x19722 +1 x19723 +1 x19724 +1 x19725 +1 x19726 +1 x19727 +1 x19728 +1 x19729 +1 x19730 +1 x19731 +1 x19732 +1 x19733 +1 x19734 +1 x19735 +1 x19736 +1 x19737 +1 x19738 +1 x19739 +1 x19740 +1 x19741 +1 x19742 +1 x19743 +1 x19744 +1 x19745 +1 x19746 +1 x19747 +1 x19748 +1 x19749 +1 x19750 +1 x19751 +1 x19752 +1 x19753 +1 x19754 +1 x19755 +1 x19756 +1 x19757 +1 x19758 +1 x19759 +1 x19760 +1 x19761 +1 x19762 +1 x19763 +1 x19764 +1 x19765 +1 x19766 +1 x19767 +1 x19768 +1 x19769 +1 x19770 +1 x19771 +1 x19772 +1 x19773 +1 x19774 +1 x19775 +1 x19776 +1 x19777 +1 x19778 +1 x19779 +1 x19780 +1 x19781 +1 x19782 +1 x19783 +1 x19784 +1 x19785 +1 x19786 +1 x19787 +1 x19788 +1 x19789 +1 x19790 +1 x19791 +1 x19792 +1 x19793 +1 x19794 +1 x19795 +1 x19796 +1 x19797 +1 x19798 +1 x19799 +1 x19800 +1 x19801 +1 x19802 +1 x19803 +1 x19804 +1 x19805 +1 x19806 +1 x19807 +1 x19808 +1 x19809 +1 x19810 +1 x19811 +1 x19812 +1 x19813 +1 x19814 +1 x19815 +1 x19816 +1 x19817 >= 1;++1 x19818 +1 x19819 +1 x19820 +1 x19821 +1 x19822 +1 x19823 +1 x19824 +1 x19825 +1 x19826 +1 x19827 +1 x19828 +1 x19829 +1 x19830 +1 x19831 +1 x19832 +1 x19833 +1 x19834 +1 x19835 +1 x19836 +1 x19837 +1 x19838 +1 x19839 +1 x19840 +1 x19841 +1 x19842 +1 x19843 +1 x19844 +1 x19845 +1 x19846 +1 x19847 +1 x19848 +1 x19849 +1 x19850 +1 x19851 +1 x19852 +1 x19853 +1 x19854 +1 x19855 +1 x19856 +1 x19857 +1 x19858 +1 x19859 +1 x19860 +1 x19861 +1 x19862 +1 x19863 +1 x19864 +1 x19865 +1 x19866 +1 x19867 +1 x19868 +1 x19869 +1 x19870 +1 x19871 +1 x19872 +1 x19873 +1 x19874 +1 x19875 +1 x19876 +1 x19877 +1 x19878 +1 x19879 +1 x19880 +1 x19881 +1 x19882 +1 x19883 +1 x19884 +1 x19885 +1 x19886 +1 x19887 +1 x19888 +1 x19889 +1 x19890 +1 x19891 +1 x19892 +1 x19893 +1 x19894 +1 x19895 +1 x19896 +1 x19897 +1 x19898 +1 x19899 +1 x19900 +1 x19901 +1 x19902 +1 x19903 +1 x19904 +1 x19905 +1 x19906 +1 x19907 +1 x19908 +1 x19909 +1 x19910 +1 x19911 +1 x19912 +1 x19913 +1 x19914 +1 x19915 +1 x19916 +1 x19917 +1 x19918 +1 x19919 +1 x19920 +1 x19921 +1 x19922 +1 x19923 +1 x19924 +1 x19925 +1 x19926 +1 x19927 +1 x19928 +1 x19929 +1 x19930 +1 x19931 +1 x19932 +1 x19933 +1 x19934 +1 x19935 +1 x19936 +1 x19937 +1 x19938 +1 x19939 +1 x19940 +1 x19941 +1 x19942 +1 x19943 +1 x19944 +1 x19945 +1 x19946 +1 x19947 +1 x19948 +1 x19949 +1 x19950 +1 x19951 +1 x19952 +1 x19953 +1 x19954 +1 x19955 +1 x19956 +1 x19957 +1 x19958 +1 x19959 +1 x19960 +1 x19961 +1 x19962 +1 x19963 +1 x19964 +1 x19965 +1 x19966 >= 1;++1 x19967 +1 x19968 +1 x19969 +1 x19970 +1 x19971 +1 x19972 +1 x19973 +1 x19974 +1 x19975 +1 x19976 +1 x19977 +1 x19978 +1 x19979 +1 x19980 +1 x19981 +1 x19982 +1 x19983 +1 x19984 +1 x19985 +1 x19986 +1 x19987 +1 x19988 +1 x19989 +1 x19990 +1 x19991 +1 x19992 +1 x19993 +1 x19994 +1 x19995 +1 x19996 +1 x19997 +1 x19998 +1 x19999 +1 x20000 +1 x20001 +1 x20002 +1 x20003 +1 x20004 +1 x20005 +1 x20006 +1 x20007 +1 x20008 +1 x20009 +1 x20010 +1 x20011 +1 x20012 +1 x20013 +1 x20014 +1 x20015 +1 x20016 +1 x20017 +1 x20018 +1 x20019 +1 x20020 +1 x20021 +1 x20022 +1 x20023 +1 x20024 +1 x20025 +1 x20026 +1 x20027 +1 x20028 +1 x20029 +1 x20030 +1 x20031 +1 x20032 +1 x20033 +1 x20034 +1 x20035 +1 x20036 +1 x20037 +1 x20038 +1 x20039 +1 x20040 +1 x20041 +1 x20042 +1 x20043 +1 x20044 +1 x20045 +1 x20046 +1 x20047 +1 x20048 +1 x20049 +1 x20050 +1 x20051 +1 x20052 +1 x20053 +1 x20054 +1 x20055 +1 x20056 +1 x20057 +1 x20058 +1 x20059 +1 x20060 +1 x20061 +1 x20062 +1 x20063 +1 x20064 +1 x20065 +1 x20066 +1 x20067 +1 x20068 +1 x20069 +1 x20070 +1 x20071 +1 x20072 +1 x20073 +1 x20074 +1 x20075 +1 x20076 +1 x20077 +1 x20078 +1 x20079 +1 x20080 +1 x20081 +1 x20082 +1 x20083 +1 x20084 +1 x20085 +1 x20086 +1 x20087 +1 x20088 +1 x20089 +1 x20090 +1 x20091 +1 x20092 +1 x20093 +1 x20094 +1 x20095 +1 x20096 +1 x20097 +1 x20098 +1 x20099 +1 x20100 +1 x20101 +1 x20102 +1 x20103 +1 x20104 +1 x20105 +1 x20106 +1 x20107 +1 x20108 +1 x20109 +1 x20110 +1 x20111 +1 x20112 +1 x20113 +1 x20114 +1 x20115 >= 1;++1 x20116 +1 x20117 +1 x20118 +1 x20119 +1 x20120 +1 x20121 +1 x20122 +1 x20123 +1 x20124 +1 x20125 +1 x20126 +1 x20127 +1 x20128 +1 x20129 +1 x20130 +1 x20131 +1 x20132 +1 x20133 +1 x20134 +1 x20135 +1 x20136 +1 x20137 +1 x20138 +1 x20139 +1 x20140 +1 x20141 +1 x20142 +1 x20143 +1 x20144 +1 x20145 +1 x20146 +1 x20147 +1 x20148 +1 x20149 +1 x20150 +1 x20151 +1 x20152 +1 x20153 +1 x20154 +1 x20155 +1 x20156 +1 x20157 +1 x20158 +1 x20159 +1 x20160 +1 x20161 +1 x20162 +1 x20163 +1 x20164 +1 x20165 +1 x20166 +1 x20167 +1 x20168 +1 x20169 +1 x20170 +1 x20171 +1 x20172 +1 x20173 +1 x20174 +1 x20175 +1 x20176 +1 x20177 +1 x20178 +1 x20179 +1 x20180 +1 x20181 +1 x20182 +1 x20183 +1 x20184 +1 x20185 +1 x20186 +1 x20187 +1 x20188 +1 x20189 +1 x20190 +1 x20191 +1 x20192 +1 x20193 +1 x20194 +1 x20195 +1 x20196 +1 x20197 +1 x20198 +1 x20199 +1 x20200 +1 x20201 +1 x20202 +1 x20203 +1 x20204 +1 x20205 +1 x20206 +1 x20207 +1 x20208 +1 x20209 +1 x20210 +1 x20211 +1 x20212 +1 x20213 +1 x20214 +1 x20215 +1 x20216 +1 x20217 +1 x20218 +1 x20219 +1 x20220 +1 x20221 +1 x20222 +1 x20223 +1 x20224 +1 x20225 +1 x20226 +1 x20227 +1 x20228 +1 x20229 +1 x20230 +1 x20231 +1 x20232 +1 x20233 +1 x20234 +1 x20235 +1 x20236 +1 x20237 +1 x20238 +1 x20239 +1 x20240 +1 x20241 +1 x20242 +1 x20243 +1 x20244 +1 x20245 +1 x20246 +1 x20247 +1 x20248 +1 x20249 +1 x20250 +1 x20251 +1 x20252 +1 x20253 +1 x20254 +1 x20255 +1 x20256 +1 x20257 +1 x20258 +1 x20259 +1 x20260 +1 x20261 +1 x20262 +1 x20263 +1 x20264 >= 1;++1 x20265 +1 x20266 +1 x20267 +1 x20268 +1 x20269 +1 x20270 +1 x20271 +1 x20272 +1 x20273 +1 x20274 +1 x20275 +1 x20276 +1 x20277 +1 x20278 +1 x20279 +1 x20280 +1 x20281 +1 x20282 +1 x20283 +1 x20284 +1 x20285 +1 x20286 +1 x20287 +1 x20288 +1 x20289 +1 x20290 +1 x20291 +1 x20292 +1 x20293 +1 x20294 +1 x20295 +1 x20296 +1 x20297 +1 x20298 +1 x20299 +1 x20300 +1 x20301 +1 x20302 +1 x20303 +1 x20304 +1 x20305 +1 x20306 +1 x20307 +1 x20308 +1 x20309 +1 x20310 +1 x20311 +1 x20312 +1 x20313 +1 x20314 +1 x20315 +1 x20316 +1 x20317 +1 x20318 +1 x20319 +1 x20320 +1 x20321 +1 x20322 +1 x20323 +1 x20324 +1 x20325 +1 x20326 +1 x20327 +1 x20328 +1 x20329 +1 x20330 +1 x20331 +1 x20332 +1 x20333 +1 x20334 +1 x20335 +1 x20336 +1 x20337 +1 x20338 +1 x20339 +1 x20340 +1 x20341 +1 x20342 +1 x20343 +1 x20344 +1 x20345 +1 x20346 +1 x20347 +1 x20348 +1 x20349 +1 x20350 +1 x20351 +1 x20352 +1 x20353 +1 x20354 +1 x20355 +1 x20356 +1 x20357 +1 x20358 +1 x20359 +1 x20360 +1 x20361 +1 x20362 +1 x20363 +1 x20364 +1 x20365 +1 x20366 +1 x20367 +1 x20368 +1 x20369 +1 x20370 +1 x20371 +1 x20372 +1 x20373 +1 x20374 +1 x20375 +1 x20376 +1 x20377 +1 x20378 +1 x20379 +1 x20380 +1 x20381 +1 x20382 +1 x20383 +1 x20384 +1 x20385 +1 x20386 +1 x20387 +1 x20388 +1 x20389 +1 x20390 +1 x20391 +1 x20392 +1 x20393 +1 x20394 +1 x20395 +1 x20396 +1 x20397 +1 x20398 +1 x20399 +1 x20400 +1 x20401 +1 x20402 +1 x20403 +1 x20404 +1 x20405 +1 x20406 +1 x20407 +1 x20408 +1 x20409 +1 x20410 +1 x20411 +1 x20412 +1 x20413 >= 1;++1 x20414 +1 x20415 +1 x20416 +1 x20417 +1 x20418 +1 x20419 +1 x20420 +1 x20421 +1 x20422 +1 x20423 +1 x20424 +1 x20425 +1 x20426 +1 x20427 +1 x20428 +1 x20429 +1 x20430 +1 x20431 +1 x20432 +1 x20433 +1 x20434 +1 x20435 +1 x20436 +1 x20437 +1 x20438 +1 x20439 +1 x20440 +1 x20441 +1 x20442 +1 x20443 +1 x20444 +1 x20445 +1 x20446 +1 x20447 +1 x20448 +1 x20449 +1 x20450 +1 x20451 +1 x20452 +1 x20453 +1 x20454 +1 x20455 +1 x20456 +1 x20457 +1 x20458 +1 x20459 +1 x20460 +1 x20461 +1 x20462 +1 x20463 +1 x20464 +1 x20465 +1 x20466 +1 x20467 +1 x20468 +1 x20469 +1 x20470 +1 x20471 +1 x20472 +1 x20473 +1 x20474 +1 x20475 +1 x20476 +1 x20477 +1 x20478 +1 x20479 +1 x20480 +1 x20481 +1 x20482 +1 x20483 +1 x20484 +1 x20485 +1 x20486 +1 x20487 +1 x20488 +1 x20489 +1 x20490 +1 x20491 +1 x20492 +1 x20493 +1 x20494 +1 x20495 +1 x20496 +1 x20497 +1 x20498 +1 x20499 +1 x20500 +1 x20501 +1 x20502 +1 x20503 +1 x20504 +1 x20505 +1 x20506 +1 x20507 +1 x20508 +1 x20509 +1 x20510 +1 x20511 +1 x20512 +1 x20513 +1 x20514 +1 x20515 +1 x20516 +1 x20517 +1 x20518 +1 x20519 +1 x20520 +1 x20521 +1 x20522 +1 x20523 +1 x20524 +1 x20525 +1 x20526 +1 x20527 +1 x20528 +1 x20529 +1 x20530 +1 x20531 +1 x20532 +1 x20533 +1 x20534 +1 x20535 +1 x20536 +1 x20537 +1 x20538 +1 x20539 +1 x20540 +1 x20541 +1 x20542 +1 x20543 +1 x20544 +1 x20545 +1 x20546 +1 x20547 +1 x20548 +1 x20549 +1 x20550 +1 x20551 +1 x20552 +1 x20553 +1 x20554 +1 x20555 +1 x20556 +1 x20557 +1 x20558 +1 x20559 +1 x20560 +1 x20561 +1 x20562 >= 1;++1 x20563 +1 x20564 +1 x20565 +1 x20566 +1 x20567 +1 x20568 +1 x20569 +1 x20570 +1 x20571 +1 x20572 +1 x20573 +1 x20574 +1 x20575 +1 x20576 +1 x20577 +1 x20578 +1 x20579 +1 x20580 +1 x20581 +1 x20582 +1 x20583 +1 x20584 +1 x20585 +1 x20586 +1 x20587 +1 x20588 +1 x20589 +1 x20590 +1 x20591 +1 x20592 +1 x20593 +1 x20594 +1 x20595 +1 x20596 +1 x20597 +1 x20598 +1 x20599 +1 x20600 +1 x20601 +1 x20602 +1 x20603 +1 x20604 +1 x20605 +1 x20606 +1 x20607 +1 x20608 +1 x20609 +1 x20610 +1 x20611 +1 x20612 +1 x20613 +1 x20614 +1 x20615 +1 x20616 +1 x20617 +1 x20618 +1 x20619 +1 x20620 +1 x20621 +1 x20622 +1 x20623 +1 x20624 +1 x20625 +1 x20626 +1 x20627 +1 x20628 +1 x20629 +1 x20630 +1 x20631 +1 x20632 +1 x20633 +1 x20634 +1 x20635 +1 x20636 +1 x20637 +1 x20638 +1 x20639 +1 x20640 +1 x20641 +1 x20642 +1 x20643 +1 x20644 +1 x20645 +1 x20646 +1 x20647 +1 x20648 +1 x20649 +1 x20650 +1 x20651 +1 x20652 +1 x20653 +1 x20654 +1 x20655 +1 x20656 +1 x20657 +1 x20658 +1 x20659 +1 x20660 +1 x20661 +1 x20662 +1 x20663 +1 x20664 +1 x20665 +1 x20666 +1 x20667 +1 x20668 +1 x20669 +1 x20670 +1 x20671 +1 x20672 +1 x20673 +1 x20674 +1 x20675 +1 x20676 +1 x20677 +1 x20678 +1 x20679 +1 x20680 +1 x20681 +1 x20682 +1 x20683 +1 x20684 +1 x20685 +1 x20686 +1 x20687 +1 x20688 +1 x20689 +1 x20690 +1 x20691 +1 x20692 +1 x20693 +1 x20694 +1 x20695 +1 x20696 +1 x20697 +1 x20698 +1 x20699 +1 x20700 +1 x20701 +1 x20702 +1 x20703 +1 x20704 +1 x20705 +1 x20706 +1 x20707 +1 x20708 +1 x20709 +1 x20710 +1 x20711 >= 1;++1 x20712 +1 x20713 +1 x20714 +1 x20715 +1 x20716 +1 x20717 +1 x20718 +1 x20719 +1 x20720 +1 x20721 +1 x20722 +1 x20723 +1 x20724 +1 x20725 +1 x20726 +1 x20727 +1 x20728 +1 x20729 +1 x20730 +1 x20731 +1 x20732 +1 x20733 +1 x20734 +1 x20735 +1 x20736 +1 x20737 +1 x20738 +1 x20739 +1 x20740 +1 x20741 +1 x20742 +1 x20743 +1 x20744 +1 x20745 +1 x20746 +1 x20747 +1 x20748 +1 x20749 +1 x20750 +1 x20751 +1 x20752 +1 x20753 +1 x20754 +1 x20755 +1 x20756 +1 x20757 +1 x20758 +1 x20759 +1 x20760 +1 x20761 +1 x20762 +1 x20763 +1 x20764 +1 x20765 +1 x20766 +1 x20767 +1 x20768 +1 x20769 +1 x20770 +1 x20771 +1 x20772 +1 x20773 +1 x20774 +1 x20775 +1 x20776 +1 x20777 +1 x20778 +1 x20779 +1 x20780 +1 x20781 +1 x20782 +1 x20783 +1 x20784 +1 x20785 +1 x20786 +1 x20787 +1 x20788 +1 x20789 +1 x20790 +1 x20791 +1 x20792 +1 x20793 +1 x20794 +1 x20795 +1 x20796 +1 x20797 +1 x20798 +1 x20799 +1 x20800 +1 x20801 +1 x20802 +1 x20803 +1 x20804 +1 x20805 +1 x20806 +1 x20807 +1 x20808 +1 x20809 +1 x20810 +1 x20811 +1 x20812 +1 x20813 +1 x20814 +1 x20815 +1 x20816 +1 x20817 +1 x20818 +1 x20819 +1 x20820 +1 x20821 +1 x20822 +1 x20823 +1 x20824 +1 x20825 +1 x20826 +1 x20827 +1 x20828 +1 x20829 +1 x20830 +1 x20831 +1 x20832 +1 x20833 +1 x20834 +1 x20835 +1 x20836 +1 x20837 +1 x20838 +1 x20839 +1 x20840 +1 x20841 +1 x20842 +1 x20843 +1 x20844 +1 x20845 +1 x20846 +1 x20847 +1 x20848 +1 x20849 +1 x20850 +1 x20851 +1 x20852 +1 x20853 +1 x20854 +1 x20855 +1 x20856 +1 x20857 +1 x20858 +1 x20859 +1 x20860 >= 1;++1 x20861 +1 x20862 +1 x20863 +1 x20864 +1 x20865 +1 x20866 +1 x20867 +1 x20868 +1 x20869 +1 x20870 +1 x20871 +1 x20872 +1 x20873 +1 x20874 +1 x20875 +1 x20876 +1 x20877 +1 x20878 +1 x20879 +1 x20880 +1 x20881 +1 x20882 +1 x20883 +1 x20884 +1 x20885 +1 x20886 +1 x20887 +1 x20888 +1 x20889 +1 x20890 +1 x20891 +1 x20892 +1 x20893 +1 x20894 +1 x20895 +1 x20896 +1 x20897 +1 x20898 +1 x20899 +1 x20900 +1 x20901 +1 x20902 +1 x20903 +1 x20904 +1 x20905 +1 x20906 +1 x20907 +1 x20908 +1 x20909 +1 x20910 +1 x20911 +1 x20912 +1 x20913 +1 x20914 +1 x20915 +1 x20916 +1 x20917 +1 x20918 +1 x20919 +1 x20920 +1 x20921 +1 x20922 +1 x20923 +1 x20924 +1 x20925 +1 x20926 +1 x20927 +1 x20928 +1 x20929 +1 x20930 +1 x20931 +1 x20932 +1 x20933 +1 x20934 +1 x20935 +1 x20936 +1 x20937 +1 x20938 +1 x20939 +1 x20940 +1 x20941 +1 x20942 +1 x20943 +1 x20944 +1 x20945 +1 x20946 +1 x20947 +1 x20948 +1 x20949 +1 x20950 +1 x20951 +1 x20952 +1 x20953 +1 x20954 +1 x20955 +1 x20956 +1 x20957 +1 x20958 +1 x20959 +1 x20960 +1 x20961 +1 x20962 +1 x20963 +1 x20964 +1 x20965 +1 x20966 +1 x20967 +1 x20968 +1 x20969 +1 x20970 +1 x20971 +1 x20972 +1 x20973 +1 x20974 +1 x20975 +1 x20976 +1 x20977 +1 x20978 +1 x20979 +1 x20980 +1 x20981 +1 x20982 +1 x20983 +1 x20984 +1 x20985 +1 x20986 +1 x20987 +1 x20988 +1 x20989 +1 x20990 +1 x20991 +1 x20992 +1 x20993 +1 x20994 +1 x20995 +1 x20996 +1 x20997 +1 x20998 +1 x20999 +1 x21000 +1 x21001 +1 x21002 +1 x21003 +1 x21004 +1 x21005 +1 x21006 +1 x21007 +1 x21008 +1 x21009 >= 1;++1 x21010 +1 x21011 +1 x21012 +1 x21013 +1 x21014 +1 x21015 +1 x21016 +1 x21017 +1 x21018 +1 x21019 +1 x21020 +1 x21021 +1 x21022 +1 x21023 +1 x21024 +1 x21025 +1 x21026 +1 x21027 +1 x21028 +1 x21029 +1 x21030 +1 x21031 +1 x21032 +1 x21033 +1 x21034 +1 x21035 +1 x21036 +1 x21037 +1 x21038 +1 x21039 +1 x21040 +1 x21041 +1 x21042 +1 x21043 +1 x21044 +1 x21045 +1 x21046 +1 x21047 +1 x21048 +1 x21049 +1 x21050 +1 x21051 +1 x21052 +1 x21053 +1 x21054 +1 x21055 +1 x21056 +1 x21057 +1 x21058 +1 x21059 +1 x21060 +1 x21061 +1 x21062 +1 x21063 +1 x21064 +1 x21065 +1 x21066 +1 x21067 +1 x21068 +1 x21069 +1 x21070 +1 x21071 +1 x21072 +1 x21073 +1 x21074 +1 x21075 +1 x21076 +1 x21077 +1 x21078 +1 x21079 +1 x21080 +1 x21081 +1 x21082 +1 x21083 +1 x21084 +1 x21085 +1 x21086 +1 x21087 +1 x21088 +1 x21089 +1 x21090 +1 x21091 +1 x21092 +1 x21093 +1 x21094 +1 x21095 +1 x21096 +1 x21097 +1 x21098 +1 x21099 +1 x21100 +1 x21101 +1 x21102 +1 x21103 +1 x21104 +1 x21105 +1 x21106 +1 x21107 +1 x21108 +1 x21109 +1 x21110 +1 x21111 +1 x21112 +1 x21113 +1 x21114 +1 x21115 +1 x21116 +1 x21117 +1 x21118 +1 x21119 +1 x21120 +1 x21121 +1 x21122 +1 x21123 +1 x21124 +1 x21125 +1 x21126 +1 x21127 +1 x21128 +1 x21129 +1 x21130 +1 x21131 +1 x21132 +1 x21133 +1 x21134 +1 x21135 +1 x21136 +1 x21137 +1 x21138 +1 x21139 +1 x21140 +1 x21141 +1 x21142 +1 x21143 +1 x21144 +1 x21145 +1 x21146 +1 x21147 +1 x21148 +1 x21149 +1 x21150 +1 x21151 +1 x21152 +1 x21153 +1 x21154 +1 x21155 +1 x21156 +1 x21157 +1 x21158 >= 1;++1 x21159 +1 x21160 +1 x21161 +1 x21162 +1 x21163 +1 x21164 +1 x21165 +1 x21166 +1 x21167 +1 x21168 +1 x21169 +1 x21170 +1 x21171 +1 x21172 +1 x21173 +1 x21174 +1 x21175 +1 x21176 +1 x21177 +1 x21178 +1 x21179 +1 x21180 +1 x21181 +1 x21182 +1 x21183 +1 x21184 +1 x21185 +1 x21186 +1 x21187 +1 x21188 +1 x21189 +1 x21190 +1 x21191 +1 x21192 +1 x21193 +1 x21194 +1 x21195 +1 x21196 +1 x21197 +1 x21198 +1 x21199 +1 x21200 +1 x21201 +1 x21202 +1 x21203 +1 x21204 +1 x21205 +1 x21206 +1 x21207 +1 x21208 +1 x21209 +1 x21210 +1 x21211 +1 x21212 +1 x21213 +1 x21214 +1 x21215 +1 x21216 +1 x21217 +1 x21218 +1 x21219 +1 x21220 +1 x21221 +1 x21222 +1 x21223 +1 x21224 +1 x21225 +1 x21226 +1 x21227 +1 x21228 +1 x21229 +1 x21230 +1 x21231 +1 x21232 +1 x21233 +1 x21234 +1 x21235 +1 x21236 +1 x21237 +1 x21238 +1 x21239 +1 x21240 +1 x21241 +1 x21242 +1 x21243 +1 x21244 +1 x21245 +1 x21246 +1 x21247 +1 x21248 +1 x21249 +1 x21250 +1 x21251 +1 x21252 +1 x21253 +1 x21254 +1 x21255 +1 x21256 +1 x21257 +1 x21258 +1 x21259 +1 x21260 +1 x21261 +1 x21262 +1 x21263 +1 x21264 +1 x21265 +1 x21266 +1 x21267 +1 x21268 +1 x21269 +1 x21270 +1 x21271 +1 x21272 +1 x21273 +1 x21274 +1 x21275 +1 x21276 +1 x21277 +1 x21278 +1 x21279 +1 x21280 +1 x21281 +1 x21282 +1 x21283 +1 x21284 +1 x21285 +1 x21286 +1 x21287 +1 x21288 +1 x21289 +1 x21290 +1 x21291 +1 x21292 +1 x21293 +1 x21294 +1 x21295 +1 x21296 +1 x21297 +1 x21298 +1 x21299 +1 x21300 +1 x21301 +1 x21302 +1 x21303 +1 x21304 +1 x21305 +1 x21306 +1 x21307 >= 1;++1 x21308 +1 x21309 +1 x21310 +1 x21311 +1 x21312 +1 x21313 +1 x21314 +1 x21315 +1 x21316 +1 x21317 +1 x21318 +1 x21319 +1 x21320 +1 x21321 +1 x21322 +1 x21323 +1 x21324 +1 x21325 +1 x21326 +1 x21327 +1 x21328 +1 x21329 +1 x21330 +1 x21331 +1 x21332 +1 x21333 +1 x21334 +1 x21335 +1 x21336 +1 x21337 +1 x21338 +1 x21339 +1 x21340 +1 x21341 +1 x21342 +1 x21343 +1 x21344 +1 x21345 +1 x21346 +1 x21347 +1 x21348 +1 x21349 +1 x21350 +1 x21351 +1 x21352 +1 x21353 +1 x21354 +1 x21355 +1 x21356 +1 x21357 +1 x21358 +1 x21359 +1 x21360 +1 x21361 +1 x21362 +1 x21363 +1 x21364 +1 x21365 +1 x21366 +1 x21367 +1 x21368 +1 x21369 +1 x21370 +1 x21371 +1 x21372 +1 x21373 +1 x21374 +1 x21375 +1 x21376 +1 x21377 +1 x21378 +1 x21379 +1 x21380 +1 x21381 +1 x21382 +1 x21383 +1 x21384 +1 x21385 +1 x21386 +1 x21387 +1 x21388 +1 x21389 +1 x21390 +1 x21391 +1 x21392 +1 x21393 +1 x21394 +1 x21395 +1 x21396 +1 x21397 +1 x21398 +1 x21399 +1 x21400 +1 x21401 +1 x21402 +1 x21403 +1 x21404 +1 x21405 +1 x21406 +1 x21407 +1 x21408 +1 x21409 +1 x21410 +1 x21411 +1 x21412 +1 x21413 +1 x21414 +1 x21415 +1 x21416 +1 x21417 +1 x21418 +1 x21419 +1 x21420 +1 x21421 +1 x21422 +1 x21423 +1 x21424 +1 x21425 +1 x21426 +1 x21427 +1 x21428 +1 x21429 +1 x21430 +1 x21431 +1 x21432 +1 x21433 +1 x21434 +1 x21435 +1 x21436 +1 x21437 +1 x21438 +1 x21439 +1 x21440 +1 x21441 +1 x21442 +1 x21443 +1 x21444 +1 x21445 +1 x21446 +1 x21447 +1 x21448 +1 x21449 +1 x21450 +1 x21451 +1 x21452 +1 x21453 +1 x21454 +1 x21455 +1 x21456 >= 1;++1 x21457 +1 x21458 +1 x21459 +1 x21460 +1 x21461 +1 x21462 +1 x21463 +1 x21464 +1 x21465 +1 x21466 +1 x21467 +1 x21468 +1 x21469 +1 x21470 +1 x21471 +1 x21472 +1 x21473 +1 x21474 +1 x21475 +1 x21476 +1 x21477 +1 x21478 +1 x21479 +1 x21480 +1 x21481 +1 x21482 +1 x21483 +1 x21484 +1 x21485 +1 x21486 +1 x21487 +1 x21488 +1 x21489 +1 x21490 +1 x21491 +1 x21492 +1 x21493 +1 x21494 +1 x21495 +1 x21496 +1 x21497 +1 x21498 +1 x21499 +1 x21500 +1 x21501 +1 x21502 +1 x21503 +1 x21504 +1 x21505 +1 x21506 +1 x21507 +1 x21508 +1 x21509 +1 x21510 +1 x21511 +1 x21512 +1 x21513 +1 x21514 +1 x21515 +1 x21516 +1 x21517 +1 x21518 +1 x21519 +1 x21520 +1 x21521 +1 x21522 +1 x21523 +1 x21524 +1 x21525 +1 x21526 +1 x21527 +1 x21528 +1 x21529 +1 x21530 +1 x21531 +1 x21532 +1 x21533 +1 x21534 +1 x21535 +1 x21536 +1 x21537 +1 x21538 +1 x21539 +1 x21540 +1 x21541 +1 x21542 +1 x21543 +1 x21544 +1 x21545 +1 x21546 +1 x21547 +1 x21548 +1 x21549 +1 x21550 +1 x21551 +1 x21552 +1 x21553 +1 x21554 +1 x21555 +1 x21556 +1 x21557 +1 x21558 +1 x21559 +1 x21560 +1 x21561 +1 x21562 +1 x21563 +1 x21564 +1 x21565 +1 x21566 +1 x21567 +1 x21568 +1 x21569 +1 x21570 +1 x21571 +1 x21572 +1 x21573 +1 x21574 +1 x21575 +1 x21576 +1 x21577 +1 x21578 +1 x21579 +1 x21580 +1 x21581 +1 x21582 +1 x21583 +1 x21584 +1 x21585 +1 x21586 +1 x21587 +1 x21588 +1 x21589 +1 x21590 +1 x21591 +1 x21592 +1 x21593 +1 x21594 +1 x21595 +1 x21596 +1 x21597 +1 x21598 +1 x21599 +1 x21600 +1 x21601 +1 x21602 +1 x21603 +1 x21604 +1 x21605 >= 1;++1 x21606 +1 x21607 +1 x21608 +1 x21609 +1 x21610 +1 x21611 +1 x21612 +1 x21613 +1 x21614 +1 x21615 +1 x21616 +1 x21617 +1 x21618 +1 x21619 +1 x21620 +1 x21621 +1 x21622 +1 x21623 +1 x21624 +1 x21625 +1 x21626 +1 x21627 +1 x21628 +1 x21629 +1 x21630 +1 x21631 +1 x21632 +1 x21633 +1 x21634 +1 x21635 +1 x21636 +1 x21637 +1 x21638 +1 x21639 +1 x21640 +1 x21641 +1 x21642 +1 x21643 +1 x21644 +1 x21645 +1 x21646 +1 x21647 +1 x21648 +1 x21649 +1 x21650 +1 x21651 +1 x21652 +1 x21653 +1 x21654 +1 x21655 +1 x21656 +1 x21657 +1 x21658 +1 x21659 +1 x21660 +1 x21661 +1 x21662 +1 x21663 +1 x21664 +1 x21665 +1 x21666 +1 x21667 +1 x21668 +1 x21669 +1 x21670 +1 x21671 +1 x21672 +1 x21673 +1 x21674 +1 x21675 +1 x21676 +1 x21677 +1 x21678 +1 x21679 +1 x21680 +1 x21681 +1 x21682 +1 x21683 +1 x21684 +1 x21685 +1 x21686 +1 x21687 +1 x21688 +1 x21689 +1 x21690 +1 x21691 +1 x21692 +1 x21693 +1 x21694 +1 x21695 +1 x21696 +1 x21697 +1 x21698 +1 x21699 +1 x21700 +1 x21701 +1 x21702 +1 x21703 +1 x21704 +1 x21705 +1 x21706 +1 x21707 +1 x21708 +1 x21709 +1 x21710 +1 x21711 +1 x21712 +1 x21713 +1 x21714 +1 x21715 +1 x21716 +1 x21717 +1 x21718 +1 x21719 +1 x21720 +1 x21721 +1 x21722 +1 x21723 +1 x21724 +1 x21725 +1 x21726 +1 x21727 +1 x21728 +1 x21729 +1 x21730 +1 x21731 +1 x21732 +1 x21733 +1 x21734 +1 x21735 +1 x21736 +1 x21737 +1 x21738 +1 x21739 +1 x21740 +1 x21741 +1 x21742 +1 x21743 +1 x21744 +1 x21745 +1 x21746 +1 x21747 +1 x21748 +1 x21749 +1 x21750 +1 x21751 +1 x21752 +1 x21753 +1 x21754 >= 1;++1 x21755 +1 x21756 +1 x21757 +1 x21758 +1 x21759 +1 x21760 +1 x21761 +1 x21762 +1 x21763 +1 x21764 +1 x21765 +1 x21766 +1 x21767 +1 x21768 +1 x21769 +1 x21770 +1 x21771 +1 x21772 +1 x21773 +1 x21774 +1 x21775 +1 x21776 +1 x21777 +1 x21778 +1 x21779 +1 x21780 +1 x21781 +1 x21782 +1 x21783 +1 x21784 +1 x21785 +1 x21786 +1 x21787 +1 x21788 +1 x21789 +1 x21790 +1 x21791 +1 x21792 +1 x21793 +1 x21794 +1 x21795 +1 x21796 +1 x21797 +1 x21798 +1 x21799 +1 x21800 +1 x21801 +1 x21802 +1 x21803 +1 x21804 +1 x21805 +1 x21806 +1 x21807 +1 x21808 +1 x21809 +1 x21810 +1 x21811 +1 x21812 +1 x21813 +1 x21814 +1 x21815 +1 x21816 +1 x21817 +1 x21818 +1 x21819 +1 x21820 +1 x21821 +1 x21822 +1 x21823 +1 x21824 +1 x21825 +1 x21826 +1 x21827 +1 x21828 +1 x21829 +1 x21830 +1 x21831 +1 x21832 +1 x21833 +1 x21834 +1 x21835 +1 x21836 +1 x21837 +1 x21838 +1 x21839 +1 x21840 +1 x21841 +1 x21842 +1 x21843 +1 x21844 +1 x21845 +1 x21846 +1 x21847 +1 x21848 +1 x21849 +1 x21850 +1 x21851 +1 x21852 +1 x21853 +1 x21854 +1 x21855 +1 x21856 +1 x21857 +1 x21858 +1 x21859 +1 x21860 +1 x21861 +1 x21862 +1 x21863 +1 x21864 +1 x21865 +1 x21866 +1 x21867 +1 x21868 +1 x21869 +1 x21870 +1 x21871 +1 x21872 +1 x21873 +1 x21874 +1 x21875 +1 x21876 +1 x21877 +1 x21878 +1 x21879 +1 x21880 +1 x21881 +1 x21882 +1 x21883 +1 x21884 +1 x21885 +1 x21886 +1 x21887 +1 x21888 +1 x21889 +1 x21890 +1 x21891 +1 x21892 +1 x21893 +1 x21894 +1 x21895 +1 x21896 +1 x21897 +1 x21898 +1 x21899 +1 x21900 +1 x21901 +1 x21902 +1 x21903 >= 1;++1 x21904 +1 x21905 +1 x21906 +1 x21907 +1 x21908 +1 x21909 +1 x21910 +1 x21911 +1 x21912 +1 x21913 +1 x21914 +1 x21915 +1 x21916 +1 x21917 +1 x21918 +1 x21919 +1 x21920 +1 x21921 +1 x21922 +1 x21923 +1 x21924 +1 x21925 +1 x21926 +1 x21927 +1 x21928 +1 x21929 +1 x21930 +1 x21931 +1 x21932 +1 x21933 +1 x21934 +1 x21935 +1 x21936 +1 x21937 +1 x21938 +1 x21939 +1 x21940 +1 x21941 +1 x21942 +1 x21943 +1 x21944 +1 x21945 +1 x21946 +1 x21947 +1 x21948 +1 x21949 +1 x21950 +1 x21951 +1 x21952 +1 x21953 +1 x21954 +1 x21955 +1 x21956 +1 x21957 +1 x21958 +1 x21959 +1 x21960 +1 x21961 +1 x21962 +1 x21963 +1 x21964 +1 x21965 +1 x21966 +1 x21967 +1 x21968 +1 x21969 +1 x21970 +1 x21971 +1 x21972 +1 x21973 +1 x21974 +1 x21975 +1 x21976 +1 x21977 +1 x21978 +1 x21979 +1 x21980 +1 x21981 +1 x21982 +1 x21983 +1 x21984 +1 x21985 +1 x21986 +1 x21987 +1 x21988 +1 x21989 +1 x21990 +1 x21991 +1 x21992 +1 x21993 +1 x21994 +1 x21995 +1 x21996 +1 x21997 +1 x21998 +1 x21999 +1 x22000 +1 x22001 +1 x22002 +1 x22003 +1 x22004 +1 x22005 +1 x22006 +1 x22007 +1 x22008 +1 x22009 +1 x22010 +1 x22011 +1 x22012 +1 x22013 +1 x22014 +1 x22015 +1 x22016 +1 x22017 +1 x22018 +1 x22019 +1 x22020 +1 x22021 +1 x22022 +1 x22023 +1 x22024 +1 x22025 +1 x22026 +1 x22027 +1 x22028 +1 x22029 +1 x22030 +1 x22031 +1 x22032 +1 x22033 +1 x22034 +1 x22035 +1 x22036 +1 x22037 +1 x22038 +1 x22039 +1 x22040 +1 x22041 +1 x22042 +1 x22043 +1 x22044 +1 x22045 +1 x22046 +1 x22047 +1 x22048 +1 x22049 +1 x22050 +1 x22051 +1 x22052 >= 1;++1 x22053 +1 x22054 +1 x22055 +1 x22056 +1 x22057 +1 x22058 +1 x22059 +1 x22060 +1 x22061 +1 x22062 +1 x22063 +1 x22064 +1 x22065 +1 x22066 +1 x22067 +1 x22068 +1 x22069 +1 x22070 +1 x22071 +1 x22072 +1 x22073 +1 x22074 +1 x22075 +1 x22076 +1 x22077 +1 x22078 +1 x22079 +1 x22080 +1 x22081 +1 x22082 +1 x22083 +1 x22084 +1 x22085 +1 x22086 +1 x22087 +1 x22088 +1 x22089 +1 x22090 +1 x22091 +1 x22092 +1 x22093 +1 x22094 +1 x22095 +1 x22096 +1 x22097 +1 x22098 +1 x22099 +1 x22100 +1 x22101 +1 x22102 +1 x22103 +1 x22104 +1 x22105 +1 x22106 +1 x22107 +1 x22108 +1 x22109 +1 x22110 +1 x22111 +1 x22112 +1 x22113 +1 x22114 +1 x22115 +1 x22116 +1 x22117 +1 x22118 +1 x22119 +1 x22120 +1 x22121 +1 x22122 +1 x22123 +1 x22124 +1 x22125 +1 x22126 +1 x22127 +1 x22128 +1 x22129 +1 x22130 +1 x22131 +1 x22132 +1 x22133 +1 x22134 +1 x22135 +1 x22136 +1 x22137 +1 x22138 +1 x22139 +1 x22140 +1 x22141 +1 x22142 +1 x22143 +1 x22144 +1 x22145 +1 x22146 +1 x22147 +1 x22148 +1 x22149 +1 x22150 +1 x22151 +1 x22152 +1 x22153 +1 x22154 +1 x22155 +1 x22156 +1 x22157 +1 x22158 +1 x22159 +1 x22160 +1 x22161 +1 x22162 +1 x22163 +1 x22164 +1 x22165 +1 x22166 +1 x22167 +1 x22168 +1 x22169 +1 x22170 +1 x22171 +1 x22172 +1 x22173 +1 x22174 +1 x22175 +1 x22176 +1 x22177 +1 x22178 +1 x22179 +1 x22180 +1 x22181 +1 x22182 +1 x22183 +1 x22184 +1 x22185 +1 x22186 +1 x22187 +1 x22188 +1 x22189 +1 x22190 +1 x22191 +1 x22192 +1 x22193 +1 x22194 +1 x22195 +1 x22196 +1 x22197 +1 x22198 +1 x22199 +1 x22200 +1 x22201 >= 1;++1 x22202 +1 x22203 +1 x22204 +1 x22205 +1 x22206 +1 x22207 +1 x22208 +1 x22209 +1 x22210 +1 x22211 +1 x22212 +1 x22213 +1 x22214 +1 x22215 +1 x22216 +1 x22217 +1 x22218 +1 x22219 +1 x22220 +1 x22221 +1 x22222 +1 x22223 +1 x22224 +1 x22225 +1 x22226 +1 x22227 +1 x22228 +1 x22229 +1 x22230 +1 x22231 +1 x22232 +1 x22233 +1 x22234 +1 x22235 +1 x22236 +1 x22237 +1 x22238 +1 x22239 +1 x22240 +1 x22241 +1 x22242 +1 x22243 +1 x22244 +1 x22245 +1 x22246 +1 x22247 +1 x22248 +1 x22249 +1 x22250 +1 x22251 +1 x22252 +1 x22253 +1 x22254 +1 x22255 +1 x22256 +1 x22257 +1 x22258 +1 x22259 +1 x22260 +1 x22261 +1 x22262 +1 x22263 +1 x22264 +1 x22265 +1 x22266 +1 x22267 +1 x22268 +1 x22269 +1 x22270 +1 x22271 +1 x22272 +1 x22273 +1 x22274 +1 x22275 +1 x22276 +1 x22277 +1 x22278 +1 x22279 +1 x22280 +1 x22281 +1 x22282 +1 x22283 +1 x22284 +1 x22285 +1 x22286 +1 x22287 +1 x22288 +1 x22289 +1 x22290 +1 x22291 +1 x22292 +1 x22293 +1 x22294 +1 x22295 +1 x22296 +1 x22297 +1 x22298 +1 x22299 +1 x22300 +1 x22301 +1 x22302 +1 x22303 +1 x22304 +1 x22305 +1 x22306 +1 x22307 +1 x22308 +1 x22309 +1 x22310 +1 x22311 +1 x22312 +1 x22313 +1 x22314 +1 x22315 +1 x22316 +1 x22317 +1 x22318 +1 x22319 +1 x22320 +1 x22321 +1 x22322 +1 x22323 +1 x22324 +1 x22325 +1 x22326 +1 x22327 +1 x22328 +1 x22329 +1 x22330 +1 x22331 +1 x22332 +1 x22333 +1 x22334 +1 x22335 +1 x22336 +1 x22337 +1 x22338 +1 x22339 +1 x22340 +1 x22341 +1 x22342 +1 x22343 +1 x22344 +1 x22345 +1 x22346 +1 x22347 +1 x22348 +1 x22349 +1 x22350 >= 1;+-1 x1 -1 x150 -1 x299 -1 x448 -1 x597 -1 x746 -1 x895 -1 x1044 -1 x1193 -1 x1342 -1 x1491 -1 x1640 -1 x1789 -1 x1938 -1 x2087 -1 x2236 -1 x2385 -1 x2534 -1 x2683 -1 x2832 -1 x2981 -1 x3130 -1 x3279 -1 x3428 -1 x3577 -1 x3726 -1 x3875 -1 x4024 -1 x4173 -1 x4322 -1 x4471 -1 x4620 -1 x4769 -1 x4918 -1 x5067 -1 x5216 -1 x5365 -1 x5514 -1 x5663 -1 x5812 -1 x5961 -1 x6110 -1 x6259 -1 x6408 -1 x6557 -1 x6706 -1 x6855 -1 x7004 -1 x7153 -1 x7302 -1 x7451 -1 x7600 -1 x7749 -1 x7898 -1 x8047 -1 x8196 -1 x8345 -1 x8494 -1 x8643 -1 x8792 -1 x8941 -1 x9090 -1 x9239 -1 x9388 -1 x9537 -1 x9686 -1 x9835 -1 x9984 -1 x10133 -1 x10282 -1 x10431 -1 x10580 -1 x10729 -1 x10878 -1 x11027 -1 x11176 -1 x11325 -1 x11474 -1 x11623 -1 x11772 -1 x11921 -1 x12070 -1 x12219 -1 x12368 -1 x12517 -1 x12666 -1 x12815 -1 x12964 -1 x13113 -1 x13262 -1 x13411 -1 x13560 -1 x13709 -1 x13858 -1 x14007 -1 x14156 -1 x14305 -1 x14454 -1 x14603 -1 x14752 -1 x14901 -1 x15050 -1 x15199 -1 x15348 -1 x15497 -1 x15646 -1 x15795 -1 x15944 -1 x16093 -1 x16242 -1 x16391 -1 x16540 -1 x16689 -1 x16838 -1 x16987 -1 x17136 -1 x17285 -1 x17434 -1 x17583 -1 x17732 -1 x17881 -1 x18030 -1 x18179 -1 x18328 -1 x18477 -1 x18626 -1 x18775 -1 x18924 -1 x19073 -1 x19222 -1 x19371 -1 x19520 -1 x19669 -1 x19818 -1 x19967 -1 x20116 -1 x20265 -1 x20414 -1 x20563 -1 x20712 -1 x20861 -1 x21010 -1 x21159 -1 x21308 -1 x21457 -1 x21606 -1 x21755 -1 x21904 -1 x22053 -1 x22202 >= -1;+-1 x2 -1 x151 -1 x300 -1 x449 -1 x598 -1 x747 -1 x896 -1 x1045 -1 x1194 -1 x1343 -1 x1492 -1 x1641 -1 x1790 -1 x1939 -1 x2088 -1 x2237 -1 x2386 -1 x2535 -1 x2684 -1 x2833 -1 x2982 -1 x3131 -1 x3280 -1 x3429 -1 x3578 -1 x3727 -1 x3876 -1 x4025 -1 x4174 -1 x4323 -1 x4472 -1 x4621 -1 x4770 -1 x4919 -1 x5068 -1 x5217 -1 x5366 -1 x5515 -1 x5664 -1 x5813 -1 x5962 -1 x6111 -1 x6260 -1 x6409 -1 x6558 -1 x6707 -1 x6856 -1 x7005 -1 x7154 -1 x7303 -1 x7452 -1 x7601 -1 x7750 -1 x7899 -1 x8048 -1 x8197 -1 x8346 -1 x8495 -1 x8644 -1 x8793 -1 x8942 -1 x9091 -1 x9240 -1 x9389 -1 x9538 -1 x9687 -1 x9836 -1 x9985 -1 x10134 -1 x10283 -1 x10432 -1 x10581 -1 x10730 -1 x10879 -1 x11028 -1 x11177 -1 x11326 -1 x11475 -1 x11624 -1 x11773 -1 x11922 -1 x12071 -1 x12220 -1 x12369 -1 x12518 -1 x12667 -1 x12816 -1 x12965 -1 x13114 -1 x13263 -1 x13412 -1 x13561 -1 x13710 -1 x13859 -1 x14008 -1 x14157 -1 x14306 -1 x14455 -1 x14604 -1 x14753 -1 x14902 -1 x15051 -1 x15200 -1 x15349 -1 x15498 -1 x15647 -1 x15796 -1 x15945 -1 x16094 -1 x16243 -1 x16392 -1 x16541 -1 x16690 -1 x16839 -1 x16988 -1 x17137 -1 x17286 -1 x17435 -1 x17584 -1 x17733 -1 x17882 -1 x18031 -1 x18180 -1 x18329 -1 x18478 -1 x18627 -1 x18776 -1 x18925 -1 x19074 -1 x19223 -1 x19372 -1 x19521 -1 x19670 -1 x19819 -1 x19968 -1 x20117 -1 x20266 -1 x20415 -1 x20564 -1 x20713 -1 x20862 -1 x21011 -1 x21160 -1 x21309 -1 x21458 -1 x21607 -1 x21756 -1 x21905 -1 x22054 -1 x22203 >= -1;+-1 x3 -1 x152 -1 x301 -1 x450 -1 x599 -1 x748 -1 x897 -1 x1046 -1 x1195 -1 x1344 -1 x1493 -1 x1642 -1 x1791 -1 x1940 -1 x2089 -1 x2238 -1 x2387 -1 x2536 -1 x2685 -1 x2834 -1 x2983 -1 x3132 -1 x3281 -1 x3430 -1 x3579 -1 x3728 -1 x3877 -1 x4026 -1 x4175 -1 x4324 -1 x4473 -1 x4622 -1 x4771 -1 x4920 -1 x5069 -1 x5218 -1 x5367 -1 x5516 -1 x5665 -1 x5814 -1 x5963 -1 x6112 -1 x6261 -1 x6410 -1 x6559 -1 x6708 -1 x6857 -1 x7006 -1 x7155 -1 x7304 -1 x7453 -1 x7602 -1 x7751 -1 x7900 -1 x8049 -1 x8198 -1 x8347 -1 x8496 -1 x8645 -1 x8794 -1 x8943 -1 x9092 -1 x9241 -1 x9390 -1 x9539 -1 x9688 -1 x9837 -1 x9986 -1 x10135 -1 x10284 -1 x10433 -1 x10582 -1 x10731 -1 x10880 -1 x11029 -1 x11178 -1 x11327 -1 x11476 -1 x11625 -1 x11774 -1 x11923 -1 x12072 -1 x12221 -1 x12370 -1 x12519 -1 x12668 -1 x12817 -1 x12966 -1 x13115 -1 x13264 -1 x13413 -1 x13562 -1 x13711 -1 x13860 -1 x14009 -1 x14158 -1 x14307 -1 x14456 -1 x14605 -1 x14754 -1 x14903 -1 x15052 -1 x15201 -1 x15350 -1 x15499 -1 x15648 -1 x15797 -1 x15946 -1 x16095 -1 x16244 -1 x16393 -1 x16542 -1 x16691 -1 x16840 -1 x16989 -1 x17138 -1 x17287 -1 x17436 -1 x17585 -1 x17734 -1 x17883 -1 x18032 -1 x18181 -1 x18330 -1 x18479 -1 x18628 -1 x18777 -1 x18926 -1 x19075 -1 x19224 -1 x19373 -1 x19522 -1 x19671 -1 x19820 -1 x19969 -1 x20118 -1 x20267 -1 x20416 -1 x20565 -1 x20714 -1 x20863 -1 x21012 -1 x21161 -1 x21310 -1 x21459 -1 x21608 -1 x21757 -1 x21906 -1 x22055 -1 x22204 >= -1;+-1 x4 -1 x153 -1 x302 -1 x451 -1 x600 -1 x749 -1 x898 -1 x1047 -1 x1196 -1 x1345 -1 x1494 -1 x1643 -1 x1792 -1 x1941 -1 x2090 -1 x2239 -1 x2388 -1 x2537 -1 x2686 -1 x2835 -1 x2984 -1 x3133 -1 x3282 -1 x3431 -1 x3580 -1 x3729 -1 x3878 -1 x4027 -1 x4176 -1 x4325 -1 x4474 -1 x4623 -1 x4772 -1 x4921 -1 x5070 -1 x5219 -1 x5368 -1 x5517 -1 x5666 -1 x5815 -1 x5964 -1 x6113 -1 x6262 -1 x6411 -1 x6560 -1 x6709 -1 x6858 -1 x7007 -1 x7156 -1 x7305 -1 x7454 -1 x7603 -1 x7752 -1 x7901 -1 x8050 -1 x8199 -1 x8348 -1 x8497 -1 x8646 -1 x8795 -1 x8944 -1 x9093 -1 x9242 -1 x9391 -1 x9540 -1 x9689 -1 x9838 -1 x9987 -1 x10136 -1 x10285 -1 x10434 -1 x10583 -1 x10732 -1 x10881 -1 x11030 -1 x11179 -1 x11328 -1 x11477 -1 x11626 -1 x11775 -1 x11924 -1 x12073 -1 x12222 -1 x12371 -1 x12520 -1 x12669 -1 x12818 -1 x12967 -1 x13116 -1 x13265 -1 x13414 -1 x13563 -1 x13712 -1 x13861 -1 x14010 -1 x14159 -1 x14308 -1 x14457 -1 x14606 -1 x14755 -1 x14904 -1 x15053 -1 x15202 -1 x15351 -1 x15500 -1 x15649 -1 x15798 -1 x15947 -1 x16096 -1 x16245 -1 x16394 -1 x16543 -1 x16692 -1 x16841 -1 x16990 -1 x17139 -1 x17288 -1 x17437 -1 x17586 -1 x17735 -1 x17884 -1 x18033 -1 x18182 -1 x18331 -1 x18480 -1 x18629 -1 x18778 -1 x18927 -1 x19076 -1 x19225 -1 x19374 -1 x19523 -1 x19672 -1 x19821 -1 x19970 -1 x20119 -1 x20268 -1 x20417 -1 x20566 -1 x20715 -1 x20864 -1 x21013 -1 x21162 -1 x21311 -1 x21460 -1 x21609 -1 x21758 -1 x21907 -1 x22056 -1 x22205 >= -1;+-1 x5 -1 x154 -1 x303 -1 x452 -1 x601 -1 x750 -1 x899 -1 x1048 -1 x1197 -1 x1346 -1 x1495 -1 x1644 -1 x1793 -1 x1942 -1 x2091 -1 x2240 -1 x2389 -1 x2538 -1 x2687 -1 x2836 -1 x2985 -1 x3134 -1 x3283 -1 x3432 -1 x3581 -1 x3730 -1 x3879 -1 x4028 -1 x4177 -1 x4326 -1 x4475 -1 x4624 -1 x4773 -1 x4922 -1 x5071 -1 x5220 -1 x5369 -1 x5518 -1 x5667 -1 x5816 -1 x5965 -1 x6114 -1 x6263 -1 x6412 -1 x6561 -1 x6710 -1 x6859 -1 x7008 -1 x7157 -1 x7306 -1 x7455 -1 x7604 -1 x7753 -1 x7902 -1 x8051 -1 x8200 -1 x8349 -1 x8498 -1 x8647 -1 x8796 -1 x8945 -1 x9094 -1 x9243 -1 x9392 -1 x9541 -1 x9690 -1 x9839 -1 x9988 -1 x10137 -1 x10286 -1 x10435 -1 x10584 -1 x10733 -1 x10882 -1 x11031 -1 x11180 -1 x11329 -1 x11478 -1 x11627 -1 x11776 -1 x11925 -1 x12074 -1 x12223 -1 x12372 -1 x12521 -1 x12670 -1 x12819 -1 x12968 -1 x13117 -1 x13266 -1 x13415 -1 x13564 -1 x13713 -1 x13862 -1 x14011 -1 x14160 -1 x14309 -1 x14458 -1 x14607 -1 x14756 -1 x14905 -1 x15054 -1 x15203 -1 x15352 -1 x15501 -1 x15650 -1 x15799 -1 x15948 -1 x16097 -1 x16246 -1 x16395 -1 x16544 -1 x16693 -1 x16842 -1 x16991 -1 x17140 -1 x17289 -1 x17438 -1 x17587 -1 x17736 -1 x17885 -1 x18034 -1 x18183 -1 x18332 -1 x18481 -1 x18630 -1 x18779 -1 x18928 -1 x19077 -1 x19226 -1 x19375 -1 x19524 -1 x19673 -1 x19822 -1 x19971 -1 x20120 -1 x20269 -1 x20418 -1 x20567 -1 x20716 -1 x20865 -1 x21014 -1 x21163 -1 x21312 -1 x21461 -1 x21610 -1 x21759 -1 x21908 -1 x22057 -1 x22206 >= -1;+-1 x6 -1 x155 -1 x304 -1 x453 -1 x602 -1 x751 -1 x900 -1 x1049 -1 x1198 -1 x1347 -1 x1496 -1 x1645 -1 x1794 -1 x1943 -1 x2092 -1 x2241 -1 x2390 -1 x2539 -1 x2688 -1 x2837 -1 x2986 -1 x3135 -1 x3284 -1 x3433 -1 x3582 -1 x3731 -1 x3880 -1 x4029 -1 x4178 -1 x4327 -1 x4476 -1 x4625 -1 x4774 -1 x4923 -1 x5072 -1 x5221 -1 x5370 -1 x5519 -1 x5668 -1 x5817 -1 x5966 -1 x6115 -1 x6264 -1 x6413 -1 x6562 -1 x6711 -1 x6860 -1 x7009 -1 x7158 -1 x7307 -1 x7456 -1 x7605 -1 x7754 -1 x7903 -1 x8052 -1 x8201 -1 x8350 -1 x8499 -1 x8648 -1 x8797 -1 x8946 -1 x9095 -1 x9244 -1 x9393 -1 x9542 -1 x9691 -1 x9840 -1 x9989 -1 x10138 -1 x10287 -1 x10436 -1 x10585 -1 x10734 -1 x10883 -1 x11032 -1 x11181 -1 x11330 -1 x11479 -1 x11628 -1 x11777 -1 x11926 -1 x12075 -1 x12224 -1 x12373 -1 x12522 -1 x12671 -1 x12820 -1 x12969 -1 x13118 -1 x13267 -1 x13416 -1 x13565 -1 x13714 -1 x13863 -1 x14012 -1 x14161 -1 x14310 -1 x14459 -1 x14608 -1 x14757 -1 x14906 -1 x15055 -1 x15204 -1 x15353 -1 x15502 -1 x15651 -1 x15800 -1 x15949 -1 x16098 -1 x16247 -1 x16396 -1 x16545 -1 x16694 -1 x16843 -1 x16992 -1 x17141 -1 x17290 -1 x17439 -1 x17588 -1 x17737 -1 x17886 -1 x18035 -1 x18184 -1 x18333 -1 x18482 -1 x18631 -1 x18780 -1 x18929 -1 x19078 -1 x19227 -1 x19376 -1 x19525 -1 x19674 -1 x19823 -1 x19972 -1 x20121 -1 x20270 -1 x20419 -1 x20568 -1 x20717 -1 x20866 -1 x21015 -1 x21164 -1 x21313 -1 x21462 -1 x21611 -1 x21760 -1 x21909 -1 x22058 -1 x22207 >= -1;+-1 x7 -1 x156 -1 x305 -1 x454 -1 x603 -1 x752 -1 x901 -1 x1050 -1 x1199 -1 x1348 -1 x1497 -1 x1646 -1 x1795 -1 x1944 -1 x2093 -1 x2242 -1 x2391 -1 x2540 -1 x2689 -1 x2838 -1 x2987 -1 x3136 -1 x3285 -1 x3434 -1 x3583 -1 x3732 -1 x3881 -1 x4030 -1 x4179 -1 x4328 -1 x4477 -1 x4626 -1 x4775 -1 x4924 -1 x5073 -1 x5222 -1 x5371 -1 x5520 -1 x5669 -1 x5818 -1 x5967 -1 x6116 -1 x6265 -1 x6414 -1 x6563 -1 x6712 -1 x6861 -1 x7010 -1 x7159 -1 x7308 -1 x7457 -1 x7606 -1 x7755 -1 x7904 -1 x8053 -1 x8202 -1 x8351 -1 x8500 -1 x8649 -1 x8798 -1 x8947 -1 x9096 -1 x9245 -1 x9394 -1 x9543 -1 x9692 -1 x9841 -1 x9990 -1 x10139 -1 x10288 -1 x10437 -1 x10586 -1 x10735 -1 x10884 -1 x11033 -1 x11182 -1 x11331 -1 x11480 -1 x11629 -1 x11778 -1 x11927 -1 x12076 -1 x12225 -1 x12374 -1 x12523 -1 x12672 -1 x12821 -1 x12970 -1 x13119 -1 x13268 -1 x13417 -1 x13566 -1 x13715 -1 x13864 -1 x14013 -1 x14162 -1 x14311 -1 x14460 -1 x14609 -1 x14758 -1 x14907 -1 x15056 -1 x15205 -1 x15354 -1 x15503 -1 x15652 -1 x15801 -1 x15950 -1 x16099 -1 x16248 -1 x16397 -1 x16546 -1 x16695 -1 x16844 -1 x16993 -1 x17142 -1 x17291 -1 x17440 -1 x17589 -1 x17738 -1 x17887 -1 x18036 -1 x18185 -1 x18334 -1 x18483 -1 x18632 -1 x18781 -1 x18930 -1 x19079 -1 x19228 -1 x19377 -1 x19526 -1 x19675 -1 x19824 -1 x19973 -1 x20122 -1 x20271 -1 x20420 -1 x20569 -1 x20718 -1 x20867 -1 x21016 -1 x21165 -1 x21314 -1 x21463 -1 x21612 -1 x21761 -1 x21910 -1 x22059 -1 x22208 >= -1;+-1 x8 -1 x157 -1 x306 -1 x455 -1 x604 -1 x753 -1 x902 -1 x1051 -1 x1200 -1 x1349 -1 x1498 -1 x1647 -1 x1796 -1 x1945 -1 x2094 -1 x2243 -1 x2392 -1 x2541 -1 x2690 -1 x2839 -1 x2988 -1 x3137 -1 x3286 -1 x3435 -1 x3584 -1 x3733 -1 x3882 -1 x4031 -1 x4180 -1 x4329 -1 x4478 -1 x4627 -1 x4776 -1 x4925 -1 x5074 -1 x5223 -1 x5372 -1 x5521 -1 x5670 -1 x5819 -1 x5968 -1 x6117 -1 x6266 -1 x6415 -1 x6564 -1 x6713 -1 x6862 -1 x7011 -1 x7160 -1 x7309 -1 x7458 -1 x7607 -1 x7756 -1 x7905 -1 x8054 -1 x8203 -1 x8352 -1 x8501 -1 x8650 -1 x8799 -1 x8948 -1 x9097 -1 x9246 -1 x9395 -1 x9544 -1 x9693 -1 x9842 -1 x9991 -1 x10140 -1 x10289 -1 x10438 -1 x10587 -1 x10736 -1 x10885 -1 x11034 -1 x11183 -1 x11332 -1 x11481 -1 x11630 -1 x11779 -1 x11928 -1 x12077 -1 x12226 -1 x12375 -1 x12524 -1 x12673 -1 x12822 -1 x12971 -1 x13120 -1 x13269 -1 x13418 -1 x13567 -1 x13716 -1 x13865 -1 x14014 -1 x14163 -1 x14312 -1 x14461 -1 x14610 -1 x14759 -1 x14908 -1 x15057 -1 x15206 -1 x15355 -1 x15504 -1 x15653 -1 x15802 -1 x15951 -1 x16100 -1 x16249 -1 x16398 -1 x16547 -1 x16696 -1 x16845 -1 x16994 -1 x17143 -1 x17292 -1 x17441 -1 x17590 -1 x17739 -1 x17888 -1 x18037 -1 x18186 -1 x18335 -1 x18484 -1 x18633 -1 x18782 -1 x18931 -1 x19080 -1 x19229 -1 x19378 -1 x19527 -1 x19676 -1 x19825 -1 x19974 -1 x20123 -1 x20272 -1 x20421 -1 x20570 -1 x20719 -1 x20868 -1 x21017 -1 x21166 -1 x21315 -1 x21464 -1 x21613 -1 x21762 -1 x21911 -1 x22060 -1 x22209 >= -1;+-1 x9 -1 x158 -1 x307 -1 x456 -1 x605 -1 x754 -1 x903 -1 x1052 -1 x1201 -1 x1350 -1 x1499 -1 x1648 -1 x1797 -1 x1946 -1 x2095 -1 x2244 -1 x2393 -1 x2542 -1 x2691 -1 x2840 -1 x2989 -1 x3138 -1 x3287 -1 x3436 -1 x3585 -1 x3734 -1 x3883 -1 x4032 -1 x4181 -1 x4330 -1 x4479 -1 x4628 -1 x4777 -1 x4926 -1 x5075 -1 x5224 -1 x5373 -1 x5522 -1 x5671 -1 x5820 -1 x5969 -1 x6118 -1 x6267 -1 x6416 -1 x6565 -1 x6714 -1 x6863 -1 x7012 -1 x7161 -1 x7310 -1 x7459 -1 x7608 -1 x7757 -1 x7906 -1 x8055 -1 x8204 -1 x8353 -1 x8502 -1 x8651 -1 x8800 -1 x8949 -1 x9098 -1 x9247 -1 x9396 -1 x9545 -1 x9694 -1 x9843 -1 x9992 -1 x10141 -1 x10290 -1 x10439 -1 x10588 -1 x10737 -1 x10886 -1 x11035 -1 x11184 -1 x11333 -1 x11482 -1 x11631 -1 x11780 -1 x11929 -1 x12078 -1 x12227 -1 x12376 -1 x12525 -1 x12674 -1 x12823 -1 x12972 -1 x13121 -1 x13270 -1 x13419 -1 x13568 -1 x13717 -1 x13866 -1 x14015 -1 x14164 -1 x14313 -1 x14462 -1 x14611 -1 x14760 -1 x14909 -1 x15058 -1 x15207 -1 x15356 -1 x15505 -1 x15654 -1 x15803 -1 x15952 -1 x16101 -1 x16250 -1 x16399 -1 x16548 -1 x16697 -1 x16846 -1 x16995 -1 x17144 -1 x17293 -1 x17442 -1 x17591 -1 x17740 -1 x17889 -1 x18038 -1 x18187 -1 x18336 -1 x18485 -1 x18634 -1 x18783 -1 x18932 -1 x19081 -1 x19230 -1 x19379 -1 x19528 -1 x19677 -1 x19826 -1 x19975 -1 x20124 -1 x20273 -1 x20422 -1 x20571 -1 x20720 -1 x20869 -1 x21018 -1 x21167 -1 x21316 -1 x21465 -1 x21614 -1 x21763 -1 x21912 -1 x22061 -1 x22210 >= -1;+-1 x10 -1 x159 -1 x308 -1 x457 -1 x606 -1 x755 -1 x904 -1 x1053 -1 x1202 -1 x1351 -1 x1500 -1 x1649 -1 x1798 -1 x1947 -1 x2096 -1 x2245 -1 x2394 -1 x2543 -1 x2692 -1 x2841 -1 x2990 -1 x3139 -1 x3288 -1 x3437 -1 x3586 -1 x3735 -1 x3884 -1 x4033 -1 x4182 -1 x4331 -1 x4480 -1 x4629 -1 x4778 -1 x4927 -1 x5076 -1 x5225 -1 x5374 -1 x5523 -1 x5672 -1 x5821 -1 x5970 -1 x6119 -1 x6268 -1 x6417 -1 x6566 -1 x6715 -1 x6864 -1 x7013 -1 x7162 -1 x7311 -1 x7460 -1 x7609 -1 x7758 -1 x7907 -1 x8056 -1 x8205 -1 x8354 -1 x8503 -1 x8652 -1 x8801 -1 x8950 -1 x9099 -1 x9248 -1 x9397 -1 x9546 -1 x9695 -1 x9844 -1 x9993 -1 x10142 -1 x10291 -1 x10440 -1 x10589 -1 x10738 -1 x10887 -1 x11036 -1 x11185 -1 x11334 -1 x11483 -1 x11632 -1 x11781 -1 x11930 -1 x12079 -1 x12228 -1 x12377 -1 x12526 -1 x12675 -1 x12824 -1 x12973 -1 x13122 -1 x13271 -1 x13420 -1 x13569 -1 x13718 -1 x13867 -1 x14016 -1 x14165 -1 x14314 -1 x14463 -1 x14612 -1 x14761 -1 x14910 -1 x15059 -1 x15208 -1 x15357 -1 x15506 -1 x15655 -1 x15804 -1 x15953 -1 x16102 -1 x16251 -1 x16400 -1 x16549 -1 x16698 -1 x16847 -1 x16996 -1 x17145 -1 x17294 -1 x17443 -1 x17592 -1 x17741 -1 x17890 -1 x18039 -1 x18188 -1 x18337 -1 x18486 -1 x18635 -1 x18784 -1 x18933 -1 x19082 -1 x19231 -1 x19380 -1 x19529 -1 x19678 -1 x19827 -1 x19976 -1 x20125 -1 x20274 -1 x20423 -1 x20572 -1 x20721 -1 x20870 -1 x21019 -1 x21168 -1 x21317 -1 x21466 -1 x21615 -1 x21764 -1 x21913 -1 x22062 -1 x22211 >= -1;+-1 x11 -1 x160 -1 x309 -1 x458 -1 x607 -1 x756 -1 x905 -1 x1054 -1 x1203 -1 x1352 -1 x1501 -1 x1650 -1 x1799 -1 x1948 -1 x2097 -1 x2246 -1 x2395 -1 x2544 -1 x2693 -1 x2842 -1 x2991 -1 x3140 -1 x3289 -1 x3438 -1 x3587 -1 x3736 -1 x3885 -1 x4034 -1 x4183 -1 x4332 -1 x4481 -1 x4630 -1 x4779 -1 x4928 -1 x5077 -1 x5226 -1 x5375 -1 x5524 -1 x5673 -1 x5822 -1 x5971 -1 x6120 -1 x6269 -1 x6418 -1 x6567 -1 x6716 -1 x6865 -1 x7014 -1 x7163 -1 x7312 -1 x7461 -1 x7610 -1 x7759 -1 x7908 -1 x8057 -1 x8206 -1 x8355 -1 x8504 -1 x8653 -1 x8802 -1 x8951 -1 x9100 -1 x9249 -1 x9398 -1 x9547 -1 x9696 -1 x9845 -1 x9994 -1 x10143 -1 x10292 -1 x10441 -1 x10590 -1 x10739 -1 x10888 -1 x11037 -1 x11186 -1 x11335 -1 x11484 -1 x11633 -1 x11782 -1 x11931 -1 x12080 -1 x12229 -1 x12378 -1 x12527 -1 x12676 -1 x12825 -1 x12974 -1 x13123 -1 x13272 -1 x13421 -1 x13570 -1 x13719 -1 x13868 -1 x14017 -1 x14166 -1 x14315 -1 x14464 -1 x14613 -1 x14762 -1 x14911 -1 x15060 -1 x15209 -1 x15358 -1 x15507 -1 x15656 -1 x15805 -1 x15954 -1 x16103 -1 x16252 -1 x16401 -1 x16550 -1 x16699 -1 x16848 -1 x16997 -1 x17146 -1 x17295 -1 x17444 -1 x17593 -1 x17742 -1 x17891 -1 x18040 -1 x18189 -1 x18338 -1 x18487 -1 x18636 -1 x18785 -1 x18934 -1 x19083 -1 x19232 -1 x19381 -1 x19530 -1 x19679 -1 x19828 -1 x19977 -1 x20126 -1 x20275 -1 x20424 -1 x20573 -1 x20722 -1 x20871 -1 x21020 -1 x21169 -1 x21318 -1 x21467 -1 x21616 -1 x21765 -1 x21914 -1 x22063 -1 x22212 >= -1;+-1 x12 -1 x161 -1 x310 -1 x459 -1 x608 -1 x757 -1 x906 -1 x1055 -1 x1204 -1 x1353 -1 x1502 -1 x1651 -1 x1800 -1 x1949 -1 x2098 -1 x2247 -1 x2396 -1 x2545 -1 x2694 -1 x2843 -1 x2992 -1 x3141 -1 x3290 -1 x3439 -1 x3588 -1 x3737 -1 x3886 -1 x4035 -1 x4184 -1 x4333 -1 x4482 -1 x4631 -1 x4780 -1 x4929 -1 x5078 -1 x5227 -1 x5376 -1 x5525 -1 x5674 -1 x5823 -1 x5972 -1 x6121 -1 x6270 -1 x6419 -1 x6568 -1 x6717 -1 x6866 -1 x7015 -1 x7164 -1 x7313 -1 x7462 -1 x7611 -1 x7760 -1 x7909 -1 x8058 -1 x8207 -1 x8356 -1 x8505 -1 x8654 -1 x8803 -1 x8952 -1 x9101 -1 x9250 -1 x9399 -1 x9548 -1 x9697 -1 x9846 -1 x9995 -1 x10144 -1 x10293 -1 x10442 -1 x10591 -1 x10740 -1 x10889 -1 x11038 -1 x11187 -1 x11336 -1 x11485 -1 x11634 -1 x11783 -1 x11932 -1 x12081 -1 x12230 -1 x12379 -1 x12528 -1 x12677 -1 x12826 -1 x12975 -1 x13124 -1 x13273 -1 x13422 -1 x13571 -1 x13720 -1 x13869 -1 x14018 -1 x14167 -1 x14316 -1 x14465 -1 x14614 -1 x14763 -1 x14912 -1 x15061 -1 x15210 -1 x15359 -1 x15508 -1 x15657 -1 x15806 -1 x15955 -1 x16104 -1 x16253 -1 x16402 -1 x16551 -1 x16700 -1 x16849 -1 x16998 -1 x17147 -1 x17296 -1 x17445 -1 x17594 -1 x17743 -1 x17892 -1 x18041 -1 x18190 -1 x18339 -1 x18488 -1 x18637 -1 x18786 -1 x18935 -1 x19084 -1 x19233 -1 x19382 -1 x19531 -1 x19680 -1 x19829 -1 x19978 -1 x20127 -1 x20276 -1 x20425 -1 x20574 -1 x20723 -1 x20872 -1 x21021 -1 x21170 -1 x21319 -1 x21468 -1 x21617 -1 x21766 -1 x21915 -1 x22064 -1 x22213 >= -1;+-1 x13 -1 x162 -1 x311 -1 x460 -1 x609 -1 x758 -1 x907 -1 x1056 -1 x1205 -1 x1354 -1 x1503 -1 x1652 -1 x1801 -1 x1950 -1 x2099 -1 x2248 -1 x2397 -1 x2546 -1 x2695 -1 x2844 -1 x2993 -1 x3142 -1 x3291 -1 x3440 -1 x3589 -1 x3738 -1 x3887 -1 x4036 -1 x4185 -1 x4334 -1 x4483 -1 x4632 -1 x4781 -1 x4930 -1 x5079 -1 x5228 -1 x5377 -1 x5526 -1 x5675 -1 x5824 -1 x5973 -1 x6122 -1 x6271 -1 x6420 -1 x6569 -1 x6718 -1 x6867 -1 x7016 -1 x7165 -1 x7314 -1 x7463 -1 x7612 -1 x7761 -1 x7910 -1 x8059 -1 x8208 -1 x8357 -1 x8506 -1 x8655 -1 x8804 -1 x8953 -1 x9102 -1 x9251 -1 x9400 -1 x9549 -1 x9698 -1 x9847 -1 x9996 -1 x10145 -1 x10294 -1 x10443 -1 x10592 -1 x10741 -1 x10890 -1 x11039 -1 x11188 -1 x11337 -1 x11486 -1 x11635 -1 x11784 -1 x11933 -1 x12082 -1 x12231 -1 x12380 -1 x12529 -1 x12678 -1 x12827 -1 x12976 -1 x13125 -1 x13274 -1 x13423 -1 x13572 -1 x13721 -1 x13870 -1 x14019 -1 x14168 -1 x14317 -1 x14466 -1 x14615 -1 x14764 -1 x14913 -1 x15062 -1 x15211 -1 x15360 -1 x15509 -1 x15658 -1 x15807 -1 x15956 -1 x16105 -1 x16254 -1 x16403 -1 x16552 -1 x16701 -1 x16850 -1 x16999 -1 x17148 -1 x17297 -1 x17446 -1 x17595 -1 x17744 -1 x17893 -1 x18042 -1 x18191 -1 x18340 -1 x18489 -1 x18638 -1 x18787 -1 x18936 -1 x19085 -1 x19234 -1 x19383 -1 x19532 -1 x19681 -1 x19830 -1 x19979 -1 x20128 -1 x20277 -1 x20426 -1 x20575 -1 x20724 -1 x20873 -1 x21022 -1 x21171 -1 x21320 -1 x21469 -1 x21618 -1 x21767 -1 x21916 -1 x22065 -1 x22214 >= -1;+-1 x14 -1 x163 -1 x312 -1 x461 -1 x610 -1 x759 -1 x908 -1 x1057 -1 x1206 -1 x1355 -1 x1504 -1 x1653 -1 x1802 -1 x1951 -1 x2100 -1 x2249 -1 x2398 -1 x2547 -1 x2696 -1 x2845 -1 x2994 -1 x3143 -1 x3292 -1 x3441 -1 x3590 -1 x3739 -1 x3888 -1 x4037 -1 x4186 -1 x4335 -1 x4484 -1 x4633 -1 x4782 -1 x4931 -1 x5080 -1 x5229 -1 x5378 -1 x5527 -1 x5676 -1 x5825 -1 x5974 -1 x6123 -1 x6272 -1 x6421 -1 x6570 -1 x6719 -1 x6868 -1 x7017 -1 x7166 -1 x7315 -1 x7464 -1 x7613 -1 x7762 -1 x7911 -1 x8060 -1 x8209 -1 x8358 -1 x8507 -1 x8656 -1 x8805 -1 x8954 -1 x9103 -1 x9252 -1 x9401 -1 x9550 -1 x9699 -1 x9848 -1 x9997 -1 x10146 -1 x10295 -1 x10444 -1 x10593 -1 x10742 -1 x10891 -1 x11040 -1 x11189 -1 x11338 -1 x11487 -1 x11636 -1 x11785 -1 x11934 -1 x12083 -1 x12232 -1 x12381 -1 x12530 -1 x12679 -1 x12828 -1 x12977 -1 x13126 -1 x13275 -1 x13424 -1 x13573 -1 x13722 -1 x13871 -1 x14020 -1 x14169 -1 x14318 -1 x14467 -1 x14616 -1 x14765 -1 x14914 -1 x15063 -1 x15212 -1 x15361 -1 x15510 -1 x15659 -1 x15808 -1 x15957 -1 x16106 -1 x16255 -1 x16404 -1 x16553 -1 x16702 -1 x16851 -1 x17000 -1 x17149 -1 x17298 -1 x17447 -1 x17596 -1 x17745 -1 x17894 -1 x18043 -1 x18192 -1 x18341 -1 x18490 -1 x18639 -1 x18788 -1 x18937 -1 x19086 -1 x19235 -1 x19384 -1 x19533 -1 x19682 -1 x19831 -1 x19980 -1 x20129 -1 x20278 -1 x20427 -1 x20576 -1 x20725 -1 x20874 -1 x21023 -1 x21172 -1 x21321 -1 x21470 -1 x21619 -1 x21768 -1 x21917 -1 x22066 -1 x22215 >= -1;+-1 x15 -1 x164 -1 x313 -1 x462 -1 x611 -1 x760 -1 x909 -1 x1058 -1 x1207 -1 x1356 -1 x1505 -1 x1654 -1 x1803 -1 x1952 -1 x2101 -1 x2250 -1 x2399 -1 x2548 -1 x2697 -1 x2846 -1 x2995 -1 x3144 -1 x3293 -1 x3442 -1 x3591 -1 x3740 -1 x3889 -1 x4038 -1 x4187 -1 x4336 -1 x4485 -1 x4634 -1 x4783 -1 x4932 -1 x5081 -1 x5230 -1 x5379 -1 x5528 -1 x5677 -1 x5826 -1 x5975 -1 x6124 -1 x6273 -1 x6422 -1 x6571 -1 x6720 -1 x6869 -1 x7018 -1 x7167 -1 x7316 -1 x7465 -1 x7614 -1 x7763 -1 x7912 -1 x8061 -1 x8210 -1 x8359 -1 x8508 -1 x8657 -1 x8806 -1 x8955 -1 x9104 -1 x9253 -1 x9402 -1 x9551 -1 x9700 -1 x9849 -1 x9998 -1 x10147 -1 x10296 -1 x10445 -1 x10594 -1 x10743 -1 x10892 -1 x11041 -1 x11190 -1 x11339 -1 x11488 -1 x11637 -1 x11786 -1 x11935 -1 x12084 -1 x12233 -1 x12382 -1 x12531 -1 x12680 -1 x12829 -1 x12978 -1 x13127 -1 x13276 -1 x13425 -1 x13574 -1 x13723 -1 x13872 -1 x14021 -1 x14170 -1 x14319 -1 x14468 -1 x14617 -1 x14766 -1 x14915 -1 x15064 -1 x15213 -1 x15362 -1 x15511 -1 x15660 -1 x15809 -1 x15958 -1 x16107 -1 x16256 -1 x16405 -1 x16554 -1 x16703 -1 x16852 -1 x17001 -1 x17150 -1 x17299 -1 x17448 -1 x17597 -1 x17746 -1 x17895 -1 x18044 -1 x18193 -1 x18342 -1 x18491 -1 x18640 -1 x18789 -1 x18938 -1 x19087 -1 x19236 -1 x19385 -1 x19534 -1 x19683 -1 x19832 -1 x19981 -1 x20130 -1 x20279 -1 x20428 -1 x20577 -1 x20726 -1 x20875 -1 x21024 -1 x21173 -1 x21322 -1 x21471 -1 x21620 -1 x21769 -1 x21918 -1 x22067 -1 x22216 >= -1;+-1 x16 -1 x165 -1 x314 -1 x463 -1 x612 -1 x761 -1 x910 -1 x1059 -1 x1208 -1 x1357 -1 x1506 -1 x1655 -1 x1804 -1 x1953 -1 x2102 -1 x2251 -1 x2400 -1 x2549 -1 x2698 -1 x2847 -1 x2996 -1 x3145 -1 x3294 -1 x3443 -1 x3592 -1 x3741 -1 x3890 -1 x4039 -1 x4188 -1 x4337 -1 x4486 -1 x4635 -1 x4784 -1 x4933 -1 x5082 -1 x5231 -1 x5380 -1 x5529 -1 x5678 -1 x5827 -1 x5976 -1 x6125 -1 x6274 -1 x6423 -1 x6572 -1 x6721 -1 x6870 -1 x7019 -1 x7168 -1 x7317 -1 x7466 -1 x7615 -1 x7764 -1 x7913 -1 x8062 -1 x8211 -1 x8360 -1 x8509 -1 x8658 -1 x8807 -1 x8956 -1 x9105 -1 x9254 -1 x9403 -1 x9552 -1 x9701 -1 x9850 -1 x9999 -1 x10148 -1 x10297 -1 x10446 -1 x10595 -1 x10744 -1 x10893 -1 x11042 -1 x11191 -1 x11340 -1 x11489 -1 x11638 -1 x11787 -1 x11936 -1 x12085 -1 x12234 -1 x12383 -1 x12532 -1 x12681 -1 x12830 -1 x12979 -1 x13128 -1 x13277 -1 x13426 -1 x13575 -1 x13724 -1 x13873 -1 x14022 -1 x14171 -1 x14320 -1 x14469 -1 x14618 -1 x14767 -1 x14916 -1 x15065 -1 x15214 -1 x15363 -1 x15512 -1 x15661 -1 x15810 -1 x15959 -1 x16108 -1 x16257 -1 x16406 -1 x16555 -1 x16704 -1 x16853 -1 x17002 -1 x17151 -1 x17300 -1 x17449 -1 x17598 -1 x17747 -1 x17896 -1 x18045 -1 x18194 -1 x18343 -1 x18492 -1 x18641 -1 x18790 -1 x18939 -1 x19088 -1 x19237 -1 x19386 -1 x19535 -1 x19684 -1 x19833 -1 x19982 -1 x20131 -1 x20280 -1 x20429 -1 x20578 -1 x20727 -1 x20876 -1 x21025 -1 x21174 -1 x21323 -1 x21472 -1 x21621 -1 x21770 -1 x21919 -1 x22068 -1 x22217 >= -1;+-1 x17 -1 x166 -1 x315 -1 x464 -1 x613 -1 x762 -1 x911 -1 x1060 -1 x1209 -1 x1358 -1 x1507 -1 x1656 -1 x1805 -1 x1954 -1 x2103 -1 x2252 -1 x2401 -1 x2550 -1 x2699 -1 x2848 -1 x2997 -1 x3146 -1 x3295 -1 x3444 -1 x3593 -1 x3742 -1 x3891 -1 x4040 -1 x4189 -1 x4338 -1 x4487 -1 x4636 -1 x4785 -1 x4934 -1 x5083 -1 x5232 -1 x5381 -1 x5530 -1 x5679 -1 x5828 -1 x5977 -1 x6126 -1 x6275 -1 x6424 -1 x6573 -1 x6722 -1 x6871 -1 x7020 -1 x7169 -1 x7318 -1 x7467 -1 x7616 -1 x7765 -1 x7914 -1 x8063 -1 x8212 -1 x8361 -1 x8510 -1 x8659 -1 x8808 -1 x8957 -1 x9106 -1 x9255 -1 x9404 -1 x9553 -1 x9702 -1 x9851 -1 x10000 -1 x10149 -1 x10298 -1 x10447 -1 x10596 -1 x10745 -1 x10894 -1 x11043 -1 x11192 -1 x11341 -1 x11490 -1 x11639 -1 x11788 -1 x11937 -1 x12086 -1 x12235 -1 x12384 -1 x12533 -1 x12682 -1 x12831 -1 x12980 -1 x13129 -1 x13278 -1 x13427 -1 x13576 -1 x13725 -1 x13874 -1 x14023 -1 x14172 -1 x14321 -1 x14470 -1 x14619 -1 x14768 -1 x14917 -1 x15066 -1 x15215 -1 x15364 -1 x15513 -1 x15662 -1 x15811 -1 x15960 -1 x16109 -1 x16258 -1 x16407 -1 x16556 -1 x16705 -1 x16854 -1 x17003 -1 x17152 -1 x17301 -1 x17450 -1 x17599 -1 x17748 -1 x17897 -1 x18046 -1 x18195 -1 x18344 -1 x18493 -1 x18642 -1 x18791 -1 x18940 -1 x19089 -1 x19238 -1 x19387 -1 x19536 -1 x19685 -1 x19834 -1 x19983 -1 x20132 -1 x20281 -1 x20430 -1 x20579 -1 x20728 -1 x20877 -1 x21026 -1 x21175 -1 x21324 -1 x21473 -1 x21622 -1 x21771 -1 x21920 -1 x22069 -1 x22218 >= -1;+-1 x18 -1 x167 -1 x316 -1 x465 -1 x614 -1 x763 -1 x912 -1 x1061 -1 x1210 -1 x1359 -1 x1508 -1 x1657 -1 x1806 -1 x1955 -1 x2104 -1 x2253 -1 x2402 -1 x2551 -1 x2700 -1 x2849 -1 x2998 -1 x3147 -1 x3296 -1 x3445 -1 x3594 -1 x3743 -1 x3892 -1 x4041 -1 x4190 -1 x4339 -1 x4488 -1 x4637 -1 x4786 -1 x4935 -1 x5084 -1 x5233 -1 x5382 -1 x5531 -1 x5680 -1 x5829 -1 x5978 -1 x6127 -1 x6276 -1 x6425 -1 x6574 -1 x6723 -1 x6872 -1 x7021 -1 x7170 -1 x7319 -1 x7468 -1 x7617 -1 x7766 -1 x7915 -1 x8064 -1 x8213 -1 x8362 -1 x8511 -1 x8660 -1 x8809 -1 x8958 -1 x9107 -1 x9256 -1 x9405 -1 x9554 -1 x9703 -1 x9852 -1 x10001 -1 x10150 -1 x10299 -1 x10448 -1 x10597 -1 x10746 -1 x10895 -1 x11044 -1 x11193 -1 x11342 -1 x11491 -1 x11640 -1 x11789 -1 x11938 -1 x12087 -1 x12236 -1 x12385 -1 x12534 -1 x12683 -1 x12832 -1 x12981 -1 x13130 -1 x13279 -1 x13428 -1 x13577 -1 x13726 -1 x13875 -1 x14024 -1 x14173 -1 x14322 -1 x14471 -1 x14620 -1 x14769 -1 x14918 -1 x15067 -1 x15216 -1 x15365 -1 x15514 -1 x15663 -1 x15812 -1 x15961 -1 x16110 -1 x16259 -1 x16408 -1 x16557 -1 x16706 -1 x16855 -1 x17004 -1 x17153 -1 x17302 -1 x17451 -1 x17600 -1 x17749 -1 x17898 -1 x18047 -1 x18196 -1 x18345 -1 x18494 -1 x18643 -1 x18792 -1 x18941 -1 x19090 -1 x19239 -1 x19388 -1 x19537 -1 x19686 -1 x19835 -1 x19984 -1 x20133 -1 x20282 -1 x20431 -1 x20580 -1 x20729 -1 x20878 -1 x21027 -1 x21176 -1 x21325 -1 x21474 -1 x21623 -1 x21772 -1 x21921 -1 x22070 -1 x22219 >= -1;+-1 x19 -1 x168 -1 x317 -1 x466 -1 x615 -1 x764 -1 x913 -1 x1062 -1 x1211 -1 x1360 -1 x1509 -1 x1658 -1 x1807 -1 x1956 -1 x2105 -1 x2254 -1 x2403 -1 x2552 -1 x2701 -1 x2850 -1 x2999 -1 x3148 -1 x3297 -1 x3446 -1 x3595 -1 x3744 -1 x3893 -1 x4042 -1 x4191 -1 x4340 -1 x4489 -1 x4638 -1 x4787 -1 x4936 -1 x5085 -1 x5234 -1 x5383 -1 x5532 -1 x5681 -1 x5830 -1 x5979 -1 x6128 -1 x6277 -1 x6426 -1 x6575 -1 x6724 -1 x6873 -1 x7022 -1 x7171 -1 x7320 -1 x7469 -1 x7618 -1 x7767 -1 x7916 -1 x8065 -1 x8214 -1 x8363 -1 x8512 -1 x8661 -1 x8810 -1 x8959 -1 x9108 -1 x9257 -1 x9406 -1 x9555 -1 x9704 -1 x9853 -1 x10002 -1 x10151 -1 x10300 -1 x10449 -1 x10598 -1 x10747 -1 x10896 -1 x11045 -1 x11194 -1 x11343 -1 x11492 -1 x11641 -1 x11790 -1 x11939 -1 x12088 -1 x12237 -1 x12386 -1 x12535 -1 x12684 -1 x12833 -1 x12982 -1 x13131 -1 x13280 -1 x13429 -1 x13578 -1 x13727 -1 x13876 -1 x14025 -1 x14174 -1 x14323 -1 x14472 -1 x14621 -1 x14770 -1 x14919 -1 x15068 -1 x15217 -1 x15366 -1 x15515 -1 x15664 -1 x15813 -1 x15962 -1 x16111 -1 x16260 -1 x16409 -1 x16558 -1 x16707 -1 x16856 -1 x17005 -1 x17154 -1 x17303 -1 x17452 -1 x17601 -1 x17750 -1 x17899 -1 x18048 -1 x18197 -1 x18346 -1 x18495 -1 x18644 -1 x18793 -1 x18942 -1 x19091 -1 x19240 -1 x19389 -1 x19538 -1 x19687 -1 x19836 -1 x19985 -1 x20134 -1 x20283 -1 x20432 -1 x20581 -1 x20730 -1 x20879 -1 x21028 -1 x21177 -1 x21326 -1 x21475 -1 x21624 -1 x21773 -1 x21922 -1 x22071 -1 x22220 >= -1;+-1 x20 -1 x169 -1 x318 -1 x467 -1 x616 -1 x765 -1 x914 -1 x1063 -1 x1212 -1 x1361 -1 x1510 -1 x1659 -1 x1808 -1 x1957 -1 x2106 -1 x2255 -1 x2404 -1 x2553 -1 x2702 -1 x2851 -1 x3000 -1 x3149 -1 x3298 -1 x3447 -1 x3596 -1 x3745 -1 x3894 -1 x4043 -1 x4192 -1 x4341 -1 x4490 -1 x4639 -1 x4788 -1 x4937 -1 x5086 -1 x5235 -1 x5384 -1 x5533 -1 x5682 -1 x5831 -1 x5980 -1 x6129 -1 x6278 -1 x6427 -1 x6576 -1 x6725 -1 x6874 -1 x7023 -1 x7172 -1 x7321 -1 x7470 -1 x7619 -1 x7768 -1 x7917 -1 x8066 -1 x8215 -1 x8364 -1 x8513 -1 x8662 -1 x8811 -1 x8960 -1 x9109 -1 x9258 -1 x9407 -1 x9556 -1 x9705 -1 x9854 -1 x10003 -1 x10152 -1 x10301 -1 x10450 -1 x10599 -1 x10748 -1 x10897 -1 x11046 -1 x11195 -1 x11344 -1 x11493 -1 x11642 -1 x11791 -1 x11940 -1 x12089 -1 x12238 -1 x12387 -1 x12536 -1 x12685 -1 x12834 -1 x12983 -1 x13132 -1 x13281 -1 x13430 -1 x13579 -1 x13728 -1 x13877 -1 x14026 -1 x14175 -1 x14324 -1 x14473 -1 x14622 -1 x14771 -1 x14920 -1 x15069 -1 x15218 -1 x15367 -1 x15516 -1 x15665 -1 x15814 -1 x15963 -1 x16112 -1 x16261 -1 x16410 -1 x16559 -1 x16708 -1 x16857 -1 x17006 -1 x17155 -1 x17304 -1 x17453 -1 x17602 -1 x17751 -1 x17900 -1 x18049 -1 x18198 -1 x18347 -1 x18496 -1 x18645 -1 x18794 -1 x18943 -1 x19092 -1 x19241 -1 x19390 -1 x19539 -1 x19688 -1 x19837 -1 x19986 -1 x20135 -1 x20284 -1 x20433 -1 x20582 -1 x20731 -1 x20880 -1 x21029 -1 x21178 -1 x21327 -1 x21476 -1 x21625 -1 x21774 -1 x21923 -1 x22072 -1 x22221 >= -1;+-1 x21 -1 x170 -1 x319 -1 x468 -1 x617 -1 x766 -1 x915 -1 x1064 -1 x1213 -1 x1362 -1 x1511 -1 x1660 -1 x1809 -1 x1958 -1 x2107 -1 x2256 -1 x2405 -1 x2554 -1 x2703 -1 x2852 -1 x3001 -1 x3150 -1 x3299 -1 x3448 -1 x3597 -1 x3746 -1 x3895 -1 x4044 -1 x4193 -1 x4342 -1 x4491 -1 x4640 -1 x4789 -1 x4938 -1 x5087 -1 x5236 -1 x5385 -1 x5534 -1 x5683 -1 x5832 -1 x5981 -1 x6130 -1 x6279 -1 x6428 -1 x6577 -1 x6726 -1 x6875 -1 x7024 -1 x7173 -1 x7322 -1 x7471 -1 x7620 -1 x7769 -1 x7918 -1 x8067 -1 x8216 -1 x8365 -1 x8514 -1 x8663 -1 x8812 -1 x8961 -1 x9110 -1 x9259 -1 x9408 -1 x9557 -1 x9706 -1 x9855 -1 x10004 -1 x10153 -1 x10302 -1 x10451 -1 x10600 -1 x10749 -1 x10898 -1 x11047 -1 x11196 -1 x11345 -1 x11494 -1 x11643 -1 x11792 -1 x11941 -1 x12090 -1 x12239 -1 x12388 -1 x12537 -1 x12686 -1 x12835 -1 x12984 -1 x13133 -1 x13282 -1 x13431 -1 x13580 -1 x13729 -1 x13878 -1 x14027 -1 x14176 -1 x14325 -1 x14474 -1 x14623 -1 x14772 -1 x14921 -1 x15070 -1 x15219 -1 x15368 -1 x15517 -1 x15666 -1 x15815 -1 x15964 -1 x16113 -1 x16262 -1 x16411 -1 x16560 -1 x16709 -1 x16858 -1 x17007 -1 x17156 -1 x17305 -1 x17454 -1 x17603 -1 x17752 -1 x17901 -1 x18050 -1 x18199 -1 x18348 -1 x18497 -1 x18646 -1 x18795 -1 x18944 -1 x19093 -1 x19242 -1 x19391 -1 x19540 -1 x19689 -1 x19838 -1 x19987 -1 x20136 -1 x20285 -1 x20434 -1 x20583 -1 x20732 -1 x20881 -1 x21030 -1 x21179 -1 x21328 -1 x21477 -1 x21626 -1 x21775 -1 x21924 -1 x22073 -1 x22222 >= -1;+-1 x22 -1 x171 -1 x320 -1 x469 -1 x618 -1 x767 -1 x916 -1 x1065 -1 x1214 -1 x1363 -1 x1512 -1 x1661 -1 x1810 -1 x1959 -1 x2108 -1 x2257 -1 x2406 -1 x2555 -1 x2704 -1 x2853 -1 x3002 -1 x3151 -1 x3300 -1 x3449 -1 x3598 -1 x3747 -1 x3896 -1 x4045 -1 x4194 -1 x4343 -1 x4492 -1 x4641 -1 x4790 -1 x4939 -1 x5088 -1 x5237 -1 x5386 -1 x5535 -1 x5684 -1 x5833 -1 x5982 -1 x6131 -1 x6280 -1 x6429 -1 x6578 -1 x6727 -1 x6876 -1 x7025 -1 x7174 -1 x7323 -1 x7472 -1 x7621 -1 x7770 -1 x7919 -1 x8068 -1 x8217 -1 x8366 -1 x8515 -1 x8664 -1 x8813 -1 x8962 -1 x9111 -1 x9260 -1 x9409 -1 x9558 -1 x9707 -1 x9856 -1 x10005 -1 x10154 -1 x10303 -1 x10452 -1 x10601 -1 x10750 -1 x10899 -1 x11048 -1 x11197 -1 x11346 -1 x11495 -1 x11644 -1 x11793 -1 x11942 -1 x12091 -1 x12240 -1 x12389 -1 x12538 -1 x12687 -1 x12836 -1 x12985 -1 x13134 -1 x13283 -1 x13432 -1 x13581 -1 x13730 -1 x13879 -1 x14028 -1 x14177 -1 x14326 -1 x14475 -1 x14624 -1 x14773 -1 x14922 -1 x15071 -1 x15220 -1 x15369 -1 x15518 -1 x15667 -1 x15816 -1 x15965 -1 x16114 -1 x16263 -1 x16412 -1 x16561 -1 x16710 -1 x16859 -1 x17008 -1 x17157 -1 x17306 -1 x17455 -1 x17604 -1 x17753 -1 x17902 -1 x18051 -1 x18200 -1 x18349 -1 x18498 -1 x18647 -1 x18796 -1 x18945 -1 x19094 -1 x19243 -1 x19392 -1 x19541 -1 x19690 -1 x19839 -1 x19988 -1 x20137 -1 x20286 -1 x20435 -1 x20584 -1 x20733 -1 x20882 -1 x21031 -1 x21180 -1 x21329 -1 x21478 -1 x21627 -1 x21776 -1 x21925 -1 x22074 -1 x22223 >= -1;+-1 x23 -1 x172 -1 x321 -1 x470 -1 x619 -1 x768 -1 x917 -1 x1066 -1 x1215 -1 x1364 -1 x1513 -1 x1662 -1 x1811 -1 x1960 -1 x2109 -1 x2258 -1 x2407 -1 x2556 -1 x2705 -1 x2854 -1 x3003 -1 x3152 -1 x3301 -1 x3450 -1 x3599 -1 x3748 -1 x3897 -1 x4046 -1 x4195 -1 x4344 -1 x4493 -1 x4642 -1 x4791 -1 x4940 -1 x5089 -1 x5238 -1 x5387 -1 x5536 -1 x5685 -1 x5834 -1 x5983 -1 x6132 -1 x6281 -1 x6430 -1 x6579 -1 x6728 -1 x6877 -1 x7026 -1 x7175 -1 x7324 -1 x7473 -1 x7622 -1 x7771 -1 x7920 -1 x8069 -1 x8218 -1 x8367 -1 x8516 -1 x8665 -1 x8814 -1 x8963 -1 x9112 -1 x9261 -1 x9410 -1 x9559 -1 x9708 -1 x9857 -1 x10006 -1 x10155 -1 x10304 -1 x10453 -1 x10602 -1 x10751 -1 x10900 -1 x11049 -1 x11198 -1 x11347 -1 x11496 -1 x11645 -1 x11794 -1 x11943 -1 x12092 -1 x12241 -1 x12390 -1 x12539 -1 x12688 -1 x12837 -1 x12986 -1 x13135 -1 x13284 -1 x13433 -1 x13582 -1 x13731 -1 x13880 -1 x14029 -1 x14178 -1 x14327 -1 x14476 -1 x14625 -1 x14774 -1 x14923 -1 x15072 -1 x15221 -1 x15370 -1 x15519 -1 x15668 -1 x15817 -1 x15966 -1 x16115 -1 x16264 -1 x16413 -1 x16562 -1 x16711 -1 x16860 -1 x17009 -1 x17158 -1 x17307 -1 x17456 -1 x17605 -1 x17754 -1 x17903 -1 x18052 -1 x18201 -1 x18350 -1 x18499 -1 x18648 -1 x18797 -1 x18946 -1 x19095 -1 x19244 -1 x19393 -1 x19542 -1 x19691 -1 x19840 -1 x19989 -1 x20138 -1 x20287 -1 x20436 -1 x20585 -1 x20734 -1 x20883 -1 x21032 -1 x21181 -1 x21330 -1 x21479 -1 x21628 -1 x21777 -1 x21926 -1 x22075 -1 x22224 >= -1;+-1 x24 -1 x173 -1 x322 -1 x471 -1 x620 -1 x769 -1 x918 -1 x1067 -1 x1216 -1 x1365 -1 x1514 -1 x1663 -1 x1812 -1 x1961 -1 x2110 -1 x2259 -1 x2408 -1 x2557 -1 x2706 -1 x2855 -1 x3004 -1 x3153 -1 x3302 -1 x3451 -1 x3600 -1 x3749 -1 x3898 -1 x4047 -1 x4196 -1 x4345 -1 x4494 -1 x4643 -1 x4792 -1 x4941 -1 x5090 -1 x5239 -1 x5388 -1 x5537 -1 x5686 -1 x5835 -1 x5984 -1 x6133 -1 x6282 -1 x6431 -1 x6580 -1 x6729 -1 x6878 -1 x7027 -1 x7176 -1 x7325 -1 x7474 -1 x7623 -1 x7772 -1 x7921 -1 x8070 -1 x8219 -1 x8368 -1 x8517 -1 x8666 -1 x8815 -1 x8964 -1 x9113 -1 x9262 -1 x9411 -1 x9560 -1 x9709 -1 x9858 -1 x10007 -1 x10156 -1 x10305 -1 x10454 -1 x10603 -1 x10752 -1 x10901 -1 x11050 -1 x11199 -1 x11348 -1 x11497 -1 x11646 -1 x11795 -1 x11944 -1 x12093 -1 x12242 -1 x12391 -1 x12540 -1 x12689 -1 x12838 -1 x12987 -1 x13136 -1 x13285 -1 x13434 -1 x13583 -1 x13732 -1 x13881 -1 x14030 -1 x14179 -1 x14328 -1 x14477 -1 x14626 -1 x14775 -1 x14924 -1 x15073 -1 x15222 -1 x15371 -1 x15520 -1 x15669 -1 x15818 -1 x15967 -1 x16116 -1 x16265 -1 x16414 -1 x16563 -1 x16712 -1 x16861 -1 x17010 -1 x17159 -1 x17308 -1 x17457 -1 x17606 -1 x17755 -1 x17904 -1 x18053 -1 x18202 -1 x18351 -1 x18500 -1 x18649 -1 x18798 -1 x18947 -1 x19096 -1 x19245 -1 x19394 -1 x19543 -1 x19692 -1 x19841 -1 x19990 -1 x20139 -1 x20288 -1 x20437 -1 x20586 -1 x20735 -1 x20884 -1 x21033 -1 x21182 -1 x21331 -1 x21480 -1 x21629 -1 x21778 -1 x21927 -1 x22076 -1 x22225 >= -1;+-1 x25 -1 x174 -1 x323 -1 x472 -1 x621 -1 x770 -1 x919 -1 x1068 -1 x1217 -1 x1366 -1 x1515 -1 x1664 -1 x1813 -1 x1962 -1 x2111 -1 x2260 -1 x2409 -1 x2558 -1 x2707 -1 x2856 -1 x3005 -1 x3154 -1 x3303 -1 x3452 -1 x3601 -1 x3750 -1 x3899 -1 x4048 -1 x4197 -1 x4346 -1 x4495 -1 x4644 -1 x4793 -1 x4942 -1 x5091 -1 x5240 -1 x5389 -1 x5538 -1 x5687 -1 x5836 -1 x5985 -1 x6134 -1 x6283 -1 x6432 -1 x6581 -1 x6730 -1 x6879 -1 x7028 -1 x7177 -1 x7326 -1 x7475 -1 x7624 -1 x7773 -1 x7922 -1 x8071 -1 x8220 -1 x8369 -1 x8518 -1 x8667 -1 x8816 -1 x8965 -1 x9114 -1 x9263 -1 x9412 -1 x9561 -1 x9710 -1 x9859 -1 x10008 -1 x10157 -1 x10306 -1 x10455 -1 x10604 -1 x10753 -1 x10902 -1 x11051 -1 x11200 -1 x11349 -1 x11498 -1 x11647 -1 x11796 -1 x11945 -1 x12094 -1 x12243 -1 x12392 -1 x12541 -1 x12690 -1 x12839 -1 x12988 -1 x13137 -1 x13286 -1 x13435 -1 x13584 -1 x13733 -1 x13882 -1 x14031 -1 x14180 -1 x14329 -1 x14478 -1 x14627 -1 x14776 -1 x14925 -1 x15074 -1 x15223 -1 x15372 -1 x15521 -1 x15670 -1 x15819 -1 x15968 -1 x16117 -1 x16266 -1 x16415 -1 x16564 -1 x16713 -1 x16862 -1 x17011 -1 x17160 -1 x17309 -1 x17458 -1 x17607 -1 x17756 -1 x17905 -1 x18054 -1 x18203 -1 x18352 -1 x18501 -1 x18650 -1 x18799 -1 x18948 -1 x19097 -1 x19246 -1 x19395 -1 x19544 -1 x19693 -1 x19842 -1 x19991 -1 x20140 -1 x20289 -1 x20438 -1 x20587 -1 x20736 -1 x20885 -1 x21034 -1 x21183 -1 x21332 -1 x21481 -1 x21630 -1 x21779 -1 x21928 -1 x22077 -1 x22226 >= -1;+-1 x26 -1 x175 -1 x324 -1 x473 -1 x622 -1 x771 -1 x920 -1 x1069 -1 x1218 -1 x1367 -1 x1516 -1 x1665 -1 x1814 -1 x1963 -1 x2112 -1 x2261 -1 x2410 -1 x2559 -1 x2708 -1 x2857 -1 x3006 -1 x3155 -1 x3304 -1 x3453 -1 x3602 -1 x3751 -1 x3900 -1 x4049 -1 x4198 -1 x4347 -1 x4496 -1 x4645 -1 x4794 -1 x4943 -1 x5092 -1 x5241 -1 x5390 -1 x5539 -1 x5688 -1 x5837 -1 x5986 -1 x6135 -1 x6284 -1 x6433 -1 x6582 -1 x6731 -1 x6880 -1 x7029 -1 x7178 -1 x7327 -1 x7476 -1 x7625 -1 x7774 -1 x7923 -1 x8072 -1 x8221 -1 x8370 -1 x8519 -1 x8668 -1 x8817 -1 x8966 -1 x9115 -1 x9264 -1 x9413 -1 x9562 -1 x9711 -1 x9860 -1 x10009 -1 x10158 -1 x10307 -1 x10456 -1 x10605 -1 x10754 -1 x10903 -1 x11052 -1 x11201 -1 x11350 -1 x11499 -1 x11648 -1 x11797 -1 x11946 -1 x12095 -1 x12244 -1 x12393 -1 x12542 -1 x12691 -1 x12840 -1 x12989 -1 x13138 -1 x13287 -1 x13436 -1 x13585 -1 x13734 -1 x13883 -1 x14032 -1 x14181 -1 x14330 -1 x14479 -1 x14628 -1 x14777 -1 x14926 -1 x15075 -1 x15224 -1 x15373 -1 x15522 -1 x15671 -1 x15820 -1 x15969 -1 x16118 -1 x16267 -1 x16416 -1 x16565 -1 x16714 -1 x16863 -1 x17012 -1 x17161 -1 x17310 -1 x17459 -1 x17608 -1 x17757 -1 x17906 -1 x18055 -1 x18204 -1 x18353 -1 x18502 -1 x18651 -1 x18800 -1 x18949 -1 x19098 -1 x19247 -1 x19396 -1 x19545 -1 x19694 -1 x19843 -1 x19992 -1 x20141 -1 x20290 -1 x20439 -1 x20588 -1 x20737 -1 x20886 -1 x21035 -1 x21184 -1 x21333 -1 x21482 -1 x21631 -1 x21780 -1 x21929 -1 x22078 -1 x22227 >= -1;+-1 x27 -1 x176 -1 x325 -1 x474 -1 x623 -1 x772 -1 x921 -1 x1070 -1 x1219 -1 x1368 -1 x1517 -1 x1666 -1 x1815 -1 x1964 -1 x2113 -1 x2262 -1 x2411 -1 x2560 -1 x2709 -1 x2858 -1 x3007 -1 x3156 -1 x3305 -1 x3454 -1 x3603 -1 x3752 -1 x3901 -1 x4050 -1 x4199 -1 x4348 -1 x4497 -1 x4646 -1 x4795 -1 x4944 -1 x5093 -1 x5242 -1 x5391 -1 x5540 -1 x5689 -1 x5838 -1 x5987 -1 x6136 -1 x6285 -1 x6434 -1 x6583 -1 x6732 -1 x6881 -1 x7030 -1 x7179 -1 x7328 -1 x7477 -1 x7626 -1 x7775 -1 x7924 -1 x8073 -1 x8222 -1 x8371 -1 x8520 -1 x8669 -1 x8818 -1 x8967 -1 x9116 -1 x9265 -1 x9414 -1 x9563 -1 x9712 -1 x9861 -1 x10010 -1 x10159 -1 x10308 -1 x10457 -1 x10606 -1 x10755 -1 x10904 -1 x11053 -1 x11202 -1 x11351 -1 x11500 -1 x11649 -1 x11798 -1 x11947 -1 x12096 -1 x12245 -1 x12394 -1 x12543 -1 x12692 -1 x12841 -1 x12990 -1 x13139 -1 x13288 -1 x13437 -1 x13586 -1 x13735 -1 x13884 -1 x14033 -1 x14182 -1 x14331 -1 x14480 -1 x14629 -1 x14778 -1 x14927 -1 x15076 -1 x15225 -1 x15374 -1 x15523 -1 x15672 -1 x15821 -1 x15970 -1 x16119 -1 x16268 -1 x16417 -1 x16566 -1 x16715 -1 x16864 -1 x17013 -1 x17162 -1 x17311 -1 x17460 -1 x17609 -1 x17758 -1 x17907 -1 x18056 -1 x18205 -1 x18354 -1 x18503 -1 x18652 -1 x18801 -1 x18950 -1 x19099 -1 x19248 -1 x19397 -1 x19546 -1 x19695 -1 x19844 -1 x19993 -1 x20142 -1 x20291 -1 x20440 -1 x20589 -1 x20738 -1 x20887 -1 x21036 -1 x21185 -1 x21334 -1 x21483 -1 x21632 -1 x21781 -1 x21930 -1 x22079 -1 x22228 >= -1;+-1 x28 -1 x177 -1 x326 -1 x475 -1 x624 -1 x773 -1 x922 -1 x1071 -1 x1220 -1 x1369 -1 x1518 -1 x1667 -1 x1816 -1 x1965 -1 x2114 -1 x2263 -1 x2412 -1 x2561 -1 x2710 -1 x2859 -1 x3008 -1 x3157 -1 x3306 -1 x3455 -1 x3604 -1 x3753 -1 x3902 -1 x4051 -1 x4200 -1 x4349 -1 x4498 -1 x4647 -1 x4796 -1 x4945 -1 x5094 -1 x5243 -1 x5392 -1 x5541 -1 x5690 -1 x5839 -1 x5988 -1 x6137 -1 x6286 -1 x6435 -1 x6584 -1 x6733 -1 x6882 -1 x7031 -1 x7180 -1 x7329 -1 x7478 -1 x7627 -1 x7776 -1 x7925 -1 x8074 -1 x8223 -1 x8372 -1 x8521 -1 x8670 -1 x8819 -1 x8968 -1 x9117 -1 x9266 -1 x9415 -1 x9564 -1 x9713 -1 x9862 -1 x10011 -1 x10160 -1 x10309 -1 x10458 -1 x10607 -1 x10756 -1 x10905 -1 x11054 -1 x11203 -1 x11352 -1 x11501 -1 x11650 -1 x11799 -1 x11948 -1 x12097 -1 x12246 -1 x12395 -1 x12544 -1 x12693 -1 x12842 -1 x12991 -1 x13140 -1 x13289 -1 x13438 -1 x13587 -1 x13736 -1 x13885 -1 x14034 -1 x14183 -1 x14332 -1 x14481 -1 x14630 -1 x14779 -1 x14928 -1 x15077 -1 x15226 -1 x15375 -1 x15524 -1 x15673 -1 x15822 -1 x15971 -1 x16120 -1 x16269 -1 x16418 -1 x16567 -1 x16716 -1 x16865 -1 x17014 -1 x17163 -1 x17312 -1 x17461 -1 x17610 -1 x17759 -1 x17908 -1 x18057 -1 x18206 -1 x18355 -1 x18504 -1 x18653 -1 x18802 -1 x18951 -1 x19100 -1 x19249 -1 x19398 -1 x19547 -1 x19696 -1 x19845 -1 x19994 -1 x20143 -1 x20292 -1 x20441 -1 x20590 -1 x20739 -1 x20888 -1 x21037 -1 x21186 -1 x21335 -1 x21484 -1 x21633 -1 x21782 -1 x21931 -1 x22080 -1 x22229 >= -1;+-1 x29 -1 x178 -1 x327 -1 x476 -1 x625 -1 x774 -1 x923 -1 x1072 -1 x1221 -1 x1370 -1 x1519 -1 x1668 -1 x1817 -1 x1966 -1 x2115 -1 x2264 -1 x2413 -1 x2562 -1 x2711 -1 x2860 -1 x3009 -1 x3158 -1 x3307 -1 x3456 -1 x3605 -1 x3754 -1 x3903 -1 x4052 -1 x4201 -1 x4350 -1 x4499 -1 x4648 -1 x4797 -1 x4946 -1 x5095 -1 x5244 -1 x5393 -1 x5542 -1 x5691 -1 x5840 -1 x5989 -1 x6138 -1 x6287 -1 x6436 -1 x6585 -1 x6734 -1 x6883 -1 x7032 -1 x7181 -1 x7330 -1 x7479 -1 x7628 -1 x7777 -1 x7926 -1 x8075 -1 x8224 -1 x8373 -1 x8522 -1 x8671 -1 x8820 -1 x8969 -1 x9118 -1 x9267 -1 x9416 -1 x9565 -1 x9714 -1 x9863 -1 x10012 -1 x10161 -1 x10310 -1 x10459 -1 x10608 -1 x10757 -1 x10906 -1 x11055 -1 x11204 -1 x11353 -1 x11502 -1 x11651 -1 x11800 -1 x11949 -1 x12098 -1 x12247 -1 x12396 -1 x12545 -1 x12694 -1 x12843 -1 x12992 -1 x13141 -1 x13290 -1 x13439 -1 x13588 -1 x13737 -1 x13886 -1 x14035 -1 x14184 -1 x14333 -1 x14482 -1 x14631 -1 x14780 -1 x14929 -1 x15078 -1 x15227 -1 x15376 -1 x15525 -1 x15674 -1 x15823 -1 x15972 -1 x16121 -1 x16270 -1 x16419 -1 x16568 -1 x16717 -1 x16866 -1 x17015 -1 x17164 -1 x17313 -1 x17462 -1 x17611 -1 x17760 -1 x17909 -1 x18058 -1 x18207 -1 x18356 -1 x18505 -1 x18654 -1 x18803 -1 x18952 -1 x19101 -1 x19250 -1 x19399 -1 x19548 -1 x19697 -1 x19846 -1 x19995 -1 x20144 -1 x20293 -1 x20442 -1 x20591 -1 x20740 -1 x20889 -1 x21038 -1 x21187 -1 x21336 -1 x21485 -1 x21634 -1 x21783 -1 x21932 -1 x22081 -1 x22230 >= -1;+-1 x30 -1 x179 -1 x328 -1 x477 -1 x626 -1 x775 -1 x924 -1 x1073 -1 x1222 -1 x1371 -1 x1520 -1 x1669 -1 x1818 -1 x1967 -1 x2116 -1 x2265 -1 x2414 -1 x2563 -1 x2712 -1 x2861 -1 x3010 -1 x3159 -1 x3308 -1 x3457 -1 x3606 -1 x3755 -1 x3904 -1 x4053 -1 x4202 -1 x4351 -1 x4500 -1 x4649 -1 x4798 -1 x4947 -1 x5096 -1 x5245 -1 x5394 -1 x5543 -1 x5692 -1 x5841 -1 x5990 -1 x6139 -1 x6288 -1 x6437 -1 x6586 -1 x6735 -1 x6884 -1 x7033 -1 x7182 -1 x7331 -1 x7480 -1 x7629 -1 x7778 -1 x7927 -1 x8076 -1 x8225 -1 x8374 -1 x8523 -1 x8672 -1 x8821 -1 x8970 -1 x9119 -1 x9268 -1 x9417 -1 x9566 -1 x9715 -1 x9864 -1 x10013 -1 x10162 -1 x10311 -1 x10460 -1 x10609 -1 x10758 -1 x10907 -1 x11056 -1 x11205 -1 x11354 -1 x11503 -1 x11652 -1 x11801 -1 x11950 -1 x12099 -1 x12248 -1 x12397 -1 x12546 -1 x12695 -1 x12844 -1 x12993 -1 x13142 -1 x13291 -1 x13440 -1 x13589 -1 x13738 -1 x13887 -1 x14036 -1 x14185 -1 x14334 -1 x14483 -1 x14632 -1 x14781 -1 x14930 -1 x15079 -1 x15228 -1 x15377 -1 x15526 -1 x15675 -1 x15824 -1 x15973 -1 x16122 -1 x16271 -1 x16420 -1 x16569 -1 x16718 -1 x16867 -1 x17016 -1 x17165 -1 x17314 -1 x17463 -1 x17612 -1 x17761 -1 x17910 -1 x18059 -1 x18208 -1 x18357 -1 x18506 -1 x18655 -1 x18804 -1 x18953 -1 x19102 -1 x19251 -1 x19400 -1 x19549 -1 x19698 -1 x19847 -1 x19996 -1 x20145 -1 x20294 -1 x20443 -1 x20592 -1 x20741 -1 x20890 -1 x21039 -1 x21188 -1 x21337 -1 x21486 -1 x21635 -1 x21784 -1 x21933 -1 x22082 -1 x22231 >= -1;+-1 x31 -1 x180 -1 x329 -1 x478 -1 x627 -1 x776 -1 x925 -1 x1074 -1 x1223 -1 x1372 -1 x1521 -1 x1670 -1 x1819 -1 x1968 -1 x2117 -1 x2266 -1 x2415 -1 x2564 -1 x2713 -1 x2862 -1 x3011 -1 x3160 -1 x3309 -1 x3458 -1 x3607 -1 x3756 -1 x3905 -1 x4054 -1 x4203 -1 x4352 -1 x4501 -1 x4650 -1 x4799 -1 x4948 -1 x5097 -1 x5246 -1 x5395 -1 x5544 -1 x5693 -1 x5842 -1 x5991 -1 x6140 -1 x6289 -1 x6438 -1 x6587 -1 x6736 -1 x6885 -1 x7034 -1 x7183 -1 x7332 -1 x7481 -1 x7630 -1 x7779 -1 x7928 -1 x8077 -1 x8226 -1 x8375 -1 x8524 -1 x8673 -1 x8822 -1 x8971 -1 x9120 -1 x9269 -1 x9418 -1 x9567 -1 x9716 -1 x9865 -1 x10014 -1 x10163 -1 x10312 -1 x10461 -1 x10610 -1 x10759 -1 x10908 -1 x11057 -1 x11206 -1 x11355 -1 x11504 -1 x11653 -1 x11802 -1 x11951 -1 x12100 -1 x12249 -1 x12398 -1 x12547 -1 x12696 -1 x12845 -1 x12994 -1 x13143 -1 x13292 -1 x13441 -1 x13590 -1 x13739 -1 x13888 -1 x14037 -1 x14186 -1 x14335 -1 x14484 -1 x14633 -1 x14782 -1 x14931 -1 x15080 -1 x15229 -1 x15378 -1 x15527 -1 x15676 -1 x15825 -1 x15974 -1 x16123 -1 x16272 -1 x16421 -1 x16570 -1 x16719 -1 x16868 -1 x17017 -1 x17166 -1 x17315 -1 x17464 -1 x17613 -1 x17762 -1 x17911 -1 x18060 -1 x18209 -1 x18358 -1 x18507 -1 x18656 -1 x18805 -1 x18954 -1 x19103 -1 x19252 -1 x19401 -1 x19550 -1 x19699 -1 x19848 -1 x19997 -1 x20146 -1 x20295 -1 x20444 -1 x20593 -1 x20742 -1 x20891 -1 x21040 -1 x21189 -1 x21338 -1 x21487 -1 x21636 -1 x21785 -1 x21934 -1 x22083 -1 x22232 >= -1;+-1 x32 -1 x181 -1 x330 -1 x479 -1 x628 -1 x777 -1 x926 -1 x1075 -1 x1224 -1 x1373 -1 x1522 -1 x1671 -1 x1820 -1 x1969 -1 x2118 -1 x2267 -1 x2416 -1 x2565 -1 x2714 -1 x2863 -1 x3012 -1 x3161 -1 x3310 -1 x3459 -1 x3608 -1 x3757 -1 x3906 -1 x4055 -1 x4204 -1 x4353 -1 x4502 -1 x4651 -1 x4800 -1 x4949 -1 x5098 -1 x5247 -1 x5396 -1 x5545 -1 x5694 -1 x5843 -1 x5992 -1 x6141 -1 x6290 -1 x6439 -1 x6588 -1 x6737 -1 x6886 -1 x7035 -1 x7184 -1 x7333 -1 x7482 -1 x7631 -1 x7780 -1 x7929 -1 x8078 -1 x8227 -1 x8376 -1 x8525 -1 x8674 -1 x8823 -1 x8972 -1 x9121 -1 x9270 -1 x9419 -1 x9568 -1 x9717 -1 x9866 -1 x10015 -1 x10164 -1 x10313 -1 x10462 -1 x10611 -1 x10760 -1 x10909 -1 x11058 -1 x11207 -1 x11356 -1 x11505 -1 x11654 -1 x11803 -1 x11952 -1 x12101 -1 x12250 -1 x12399 -1 x12548 -1 x12697 -1 x12846 -1 x12995 -1 x13144 -1 x13293 -1 x13442 -1 x13591 -1 x13740 -1 x13889 -1 x14038 -1 x14187 -1 x14336 -1 x14485 -1 x14634 -1 x14783 -1 x14932 -1 x15081 -1 x15230 -1 x15379 -1 x15528 -1 x15677 -1 x15826 -1 x15975 -1 x16124 -1 x16273 -1 x16422 -1 x16571 -1 x16720 -1 x16869 -1 x17018 -1 x17167 -1 x17316 -1 x17465 -1 x17614 -1 x17763 -1 x17912 -1 x18061 -1 x18210 -1 x18359 -1 x18508 -1 x18657 -1 x18806 -1 x18955 -1 x19104 -1 x19253 -1 x19402 -1 x19551 -1 x19700 -1 x19849 -1 x19998 -1 x20147 -1 x20296 -1 x20445 -1 x20594 -1 x20743 -1 x20892 -1 x21041 -1 x21190 -1 x21339 -1 x21488 -1 x21637 -1 x21786 -1 x21935 -1 x22084 -1 x22233 >= -1;+-1 x33 -1 x182 -1 x331 -1 x480 -1 x629 -1 x778 -1 x927 -1 x1076 -1 x1225 -1 x1374 -1 x1523 -1 x1672 -1 x1821 -1 x1970 -1 x2119 -1 x2268 -1 x2417 -1 x2566 -1 x2715 -1 x2864 -1 x3013 -1 x3162 -1 x3311 -1 x3460 -1 x3609 -1 x3758 -1 x3907 -1 x4056 -1 x4205 -1 x4354 -1 x4503 -1 x4652 -1 x4801 -1 x4950 -1 x5099 -1 x5248 -1 x5397 -1 x5546 -1 x5695 -1 x5844 -1 x5993 -1 x6142 -1 x6291 -1 x6440 -1 x6589 -1 x6738 -1 x6887 -1 x7036 -1 x7185 -1 x7334 -1 x7483 -1 x7632 -1 x7781 -1 x7930 -1 x8079 -1 x8228 -1 x8377 -1 x8526 -1 x8675 -1 x8824 -1 x8973 -1 x9122 -1 x9271 -1 x9420 -1 x9569 -1 x9718 -1 x9867 -1 x10016 -1 x10165 -1 x10314 -1 x10463 -1 x10612 -1 x10761 -1 x10910 -1 x11059 -1 x11208 -1 x11357 -1 x11506 -1 x11655 -1 x11804 -1 x11953 -1 x12102 -1 x12251 -1 x12400 -1 x12549 -1 x12698 -1 x12847 -1 x12996 -1 x13145 -1 x13294 -1 x13443 -1 x13592 -1 x13741 -1 x13890 -1 x14039 -1 x14188 -1 x14337 -1 x14486 -1 x14635 -1 x14784 -1 x14933 -1 x15082 -1 x15231 -1 x15380 -1 x15529 -1 x15678 -1 x15827 -1 x15976 -1 x16125 -1 x16274 -1 x16423 -1 x16572 -1 x16721 -1 x16870 -1 x17019 -1 x17168 -1 x17317 -1 x17466 -1 x17615 -1 x17764 -1 x17913 -1 x18062 -1 x18211 -1 x18360 -1 x18509 -1 x18658 -1 x18807 -1 x18956 -1 x19105 -1 x19254 -1 x19403 -1 x19552 -1 x19701 -1 x19850 -1 x19999 -1 x20148 -1 x20297 -1 x20446 -1 x20595 -1 x20744 -1 x20893 -1 x21042 -1 x21191 -1 x21340 -1 x21489 -1 x21638 -1 x21787 -1 x21936 -1 x22085 -1 x22234 >= -1;+-1 x34 -1 x183 -1 x332 -1 x481 -1 x630 -1 x779 -1 x928 -1 x1077 -1 x1226 -1 x1375 -1 x1524 -1 x1673 -1 x1822 -1 x1971 -1 x2120 -1 x2269 -1 x2418 -1 x2567 -1 x2716 -1 x2865 -1 x3014 -1 x3163 -1 x3312 -1 x3461 -1 x3610 -1 x3759 -1 x3908 -1 x4057 -1 x4206 -1 x4355 -1 x4504 -1 x4653 -1 x4802 -1 x4951 -1 x5100 -1 x5249 -1 x5398 -1 x5547 -1 x5696 -1 x5845 -1 x5994 -1 x6143 -1 x6292 -1 x6441 -1 x6590 -1 x6739 -1 x6888 -1 x7037 -1 x7186 -1 x7335 -1 x7484 -1 x7633 -1 x7782 -1 x7931 -1 x8080 -1 x8229 -1 x8378 -1 x8527 -1 x8676 -1 x8825 -1 x8974 -1 x9123 -1 x9272 -1 x9421 -1 x9570 -1 x9719 -1 x9868 -1 x10017 -1 x10166 -1 x10315 -1 x10464 -1 x10613 -1 x10762 -1 x10911 -1 x11060 -1 x11209 -1 x11358 -1 x11507 -1 x11656 -1 x11805 -1 x11954 -1 x12103 -1 x12252 -1 x12401 -1 x12550 -1 x12699 -1 x12848 -1 x12997 -1 x13146 -1 x13295 -1 x13444 -1 x13593 -1 x13742 -1 x13891 -1 x14040 -1 x14189 -1 x14338 -1 x14487 -1 x14636 -1 x14785 -1 x14934 -1 x15083 -1 x15232 -1 x15381 -1 x15530 -1 x15679 -1 x15828 -1 x15977 -1 x16126 -1 x16275 -1 x16424 -1 x16573 -1 x16722 -1 x16871 -1 x17020 -1 x17169 -1 x17318 -1 x17467 -1 x17616 -1 x17765 -1 x17914 -1 x18063 -1 x18212 -1 x18361 -1 x18510 -1 x18659 -1 x18808 -1 x18957 -1 x19106 -1 x19255 -1 x19404 -1 x19553 -1 x19702 -1 x19851 -1 x20000 -1 x20149 -1 x20298 -1 x20447 -1 x20596 -1 x20745 -1 x20894 -1 x21043 -1 x21192 -1 x21341 -1 x21490 -1 x21639 -1 x21788 -1 x21937 -1 x22086 -1 x22235 >= -1;+-1 x35 -1 x184 -1 x333 -1 x482 -1 x631 -1 x780 -1 x929 -1 x1078 -1 x1227 -1 x1376 -1 x1525 -1 x1674 -1 x1823 -1 x1972 -1 x2121 -1 x2270 -1 x2419 -1 x2568 -1 x2717 -1 x2866 -1 x3015 -1 x3164 -1 x3313 -1 x3462 -1 x3611 -1 x3760 -1 x3909 -1 x4058 -1 x4207 -1 x4356 -1 x4505 -1 x4654 -1 x4803 -1 x4952 -1 x5101 -1 x5250 -1 x5399 -1 x5548 -1 x5697 -1 x5846 -1 x5995 -1 x6144 -1 x6293 -1 x6442 -1 x6591 -1 x6740 -1 x6889 -1 x7038 -1 x7187 -1 x7336 -1 x7485 -1 x7634 -1 x7783 -1 x7932 -1 x8081 -1 x8230 -1 x8379 -1 x8528 -1 x8677 -1 x8826 -1 x8975 -1 x9124 -1 x9273 -1 x9422 -1 x9571 -1 x9720 -1 x9869 -1 x10018 -1 x10167 -1 x10316 -1 x10465 -1 x10614 -1 x10763 -1 x10912 -1 x11061 -1 x11210 -1 x11359 -1 x11508 -1 x11657 -1 x11806 -1 x11955 -1 x12104 -1 x12253 -1 x12402 -1 x12551 -1 x12700 -1 x12849 -1 x12998 -1 x13147 -1 x13296 -1 x13445 -1 x13594 -1 x13743 -1 x13892 -1 x14041 -1 x14190 -1 x14339 -1 x14488 -1 x14637 -1 x14786 -1 x14935 -1 x15084 -1 x15233 -1 x15382 -1 x15531 -1 x15680 -1 x15829 -1 x15978 -1 x16127 -1 x16276 -1 x16425 -1 x16574 -1 x16723 -1 x16872 -1 x17021 -1 x17170 -1 x17319 -1 x17468 -1 x17617 -1 x17766 -1 x17915 -1 x18064 -1 x18213 -1 x18362 -1 x18511 -1 x18660 -1 x18809 -1 x18958 -1 x19107 -1 x19256 -1 x19405 -1 x19554 -1 x19703 -1 x19852 -1 x20001 -1 x20150 -1 x20299 -1 x20448 -1 x20597 -1 x20746 -1 x20895 -1 x21044 -1 x21193 -1 x21342 -1 x21491 -1 x21640 -1 x21789 -1 x21938 -1 x22087 -1 x22236 >= -1;+-1 x36 -1 x185 -1 x334 -1 x483 -1 x632 -1 x781 -1 x930 -1 x1079 -1 x1228 -1 x1377 -1 x1526 -1 x1675 -1 x1824 -1 x1973 -1 x2122 -1 x2271 -1 x2420 -1 x2569 -1 x2718 -1 x2867 -1 x3016 -1 x3165 -1 x3314 -1 x3463 -1 x3612 -1 x3761 -1 x3910 -1 x4059 -1 x4208 -1 x4357 -1 x4506 -1 x4655 -1 x4804 -1 x4953 -1 x5102 -1 x5251 -1 x5400 -1 x5549 -1 x5698 -1 x5847 -1 x5996 -1 x6145 -1 x6294 -1 x6443 -1 x6592 -1 x6741 -1 x6890 -1 x7039 -1 x7188 -1 x7337 -1 x7486 -1 x7635 -1 x7784 -1 x7933 -1 x8082 -1 x8231 -1 x8380 -1 x8529 -1 x8678 -1 x8827 -1 x8976 -1 x9125 -1 x9274 -1 x9423 -1 x9572 -1 x9721 -1 x9870 -1 x10019 -1 x10168 -1 x10317 -1 x10466 -1 x10615 -1 x10764 -1 x10913 -1 x11062 -1 x11211 -1 x11360 -1 x11509 -1 x11658 -1 x11807 -1 x11956 -1 x12105 -1 x12254 -1 x12403 -1 x12552 -1 x12701 -1 x12850 -1 x12999 -1 x13148 -1 x13297 -1 x13446 -1 x13595 -1 x13744 -1 x13893 -1 x14042 -1 x14191 -1 x14340 -1 x14489 -1 x14638 -1 x14787 -1 x14936 -1 x15085 -1 x15234 -1 x15383 -1 x15532 -1 x15681 -1 x15830 -1 x15979 -1 x16128 -1 x16277 -1 x16426 -1 x16575 -1 x16724 -1 x16873 -1 x17022 -1 x17171 -1 x17320 -1 x17469 -1 x17618 -1 x17767 -1 x17916 -1 x18065 -1 x18214 -1 x18363 -1 x18512 -1 x18661 -1 x18810 -1 x18959 -1 x19108 -1 x19257 -1 x19406 -1 x19555 -1 x19704 -1 x19853 -1 x20002 -1 x20151 -1 x20300 -1 x20449 -1 x20598 -1 x20747 -1 x20896 -1 x21045 -1 x21194 -1 x21343 -1 x21492 -1 x21641 -1 x21790 -1 x21939 -1 x22088 -1 x22237 >= -1;+-1 x37 -1 x186 -1 x335 -1 x484 -1 x633 -1 x782 -1 x931 -1 x1080 -1 x1229 -1 x1378 -1 x1527 -1 x1676 -1 x1825 -1 x1974 -1 x2123 -1 x2272 -1 x2421 -1 x2570 -1 x2719 -1 x2868 -1 x3017 -1 x3166 -1 x3315 -1 x3464 -1 x3613 -1 x3762 -1 x3911 -1 x4060 -1 x4209 -1 x4358 -1 x4507 -1 x4656 -1 x4805 -1 x4954 -1 x5103 -1 x5252 -1 x5401 -1 x5550 -1 x5699 -1 x5848 -1 x5997 -1 x6146 -1 x6295 -1 x6444 -1 x6593 -1 x6742 -1 x6891 -1 x7040 -1 x7189 -1 x7338 -1 x7487 -1 x7636 -1 x7785 -1 x7934 -1 x8083 -1 x8232 -1 x8381 -1 x8530 -1 x8679 -1 x8828 -1 x8977 -1 x9126 -1 x9275 -1 x9424 -1 x9573 -1 x9722 -1 x9871 -1 x10020 -1 x10169 -1 x10318 -1 x10467 -1 x10616 -1 x10765 -1 x10914 -1 x11063 -1 x11212 -1 x11361 -1 x11510 -1 x11659 -1 x11808 -1 x11957 -1 x12106 -1 x12255 -1 x12404 -1 x12553 -1 x12702 -1 x12851 -1 x13000 -1 x13149 -1 x13298 -1 x13447 -1 x13596 -1 x13745 -1 x13894 -1 x14043 -1 x14192 -1 x14341 -1 x14490 -1 x14639 -1 x14788 -1 x14937 -1 x15086 -1 x15235 -1 x15384 -1 x15533 -1 x15682 -1 x15831 -1 x15980 -1 x16129 -1 x16278 -1 x16427 -1 x16576 -1 x16725 -1 x16874 -1 x17023 -1 x17172 -1 x17321 -1 x17470 -1 x17619 -1 x17768 -1 x17917 -1 x18066 -1 x18215 -1 x18364 -1 x18513 -1 x18662 -1 x18811 -1 x18960 -1 x19109 -1 x19258 -1 x19407 -1 x19556 -1 x19705 -1 x19854 -1 x20003 -1 x20152 -1 x20301 -1 x20450 -1 x20599 -1 x20748 -1 x20897 -1 x21046 -1 x21195 -1 x21344 -1 x21493 -1 x21642 -1 x21791 -1 x21940 -1 x22089 -1 x22238 >= -1;+-1 x38 -1 x187 -1 x336 -1 x485 -1 x634 -1 x783 -1 x932 -1 x1081 -1 x1230 -1 x1379 -1 x1528 -1 x1677 -1 x1826 -1 x1975 -1 x2124 -1 x2273 -1 x2422 -1 x2571 -1 x2720 -1 x2869 -1 x3018 -1 x3167 -1 x3316 -1 x3465 -1 x3614 -1 x3763 -1 x3912 -1 x4061 -1 x4210 -1 x4359 -1 x4508 -1 x4657 -1 x4806 -1 x4955 -1 x5104 -1 x5253 -1 x5402 -1 x5551 -1 x5700 -1 x5849 -1 x5998 -1 x6147 -1 x6296 -1 x6445 -1 x6594 -1 x6743 -1 x6892 -1 x7041 -1 x7190 -1 x7339 -1 x7488 -1 x7637 -1 x7786 -1 x7935 -1 x8084 -1 x8233 -1 x8382 -1 x8531 -1 x8680 -1 x8829 -1 x8978 -1 x9127 -1 x9276 -1 x9425 -1 x9574 -1 x9723 -1 x9872 -1 x10021 -1 x10170 -1 x10319 -1 x10468 -1 x10617 -1 x10766 -1 x10915 -1 x11064 -1 x11213 -1 x11362 -1 x11511 -1 x11660 -1 x11809 -1 x11958 -1 x12107 -1 x12256 -1 x12405 -1 x12554 -1 x12703 -1 x12852 -1 x13001 -1 x13150 -1 x13299 -1 x13448 -1 x13597 -1 x13746 -1 x13895 -1 x14044 -1 x14193 -1 x14342 -1 x14491 -1 x14640 -1 x14789 -1 x14938 -1 x15087 -1 x15236 -1 x15385 -1 x15534 -1 x15683 -1 x15832 -1 x15981 -1 x16130 -1 x16279 -1 x16428 -1 x16577 -1 x16726 -1 x16875 -1 x17024 -1 x17173 -1 x17322 -1 x17471 -1 x17620 -1 x17769 -1 x17918 -1 x18067 -1 x18216 -1 x18365 -1 x18514 -1 x18663 -1 x18812 -1 x18961 -1 x19110 -1 x19259 -1 x19408 -1 x19557 -1 x19706 -1 x19855 -1 x20004 -1 x20153 -1 x20302 -1 x20451 -1 x20600 -1 x20749 -1 x20898 -1 x21047 -1 x21196 -1 x21345 -1 x21494 -1 x21643 -1 x21792 -1 x21941 -1 x22090 -1 x22239 >= -1;+-1 x39 -1 x188 -1 x337 -1 x486 -1 x635 -1 x784 -1 x933 -1 x1082 -1 x1231 -1 x1380 -1 x1529 -1 x1678 -1 x1827 -1 x1976 -1 x2125 -1 x2274 -1 x2423 -1 x2572 -1 x2721 -1 x2870 -1 x3019 -1 x3168 -1 x3317 -1 x3466 -1 x3615 -1 x3764 -1 x3913 -1 x4062 -1 x4211 -1 x4360 -1 x4509 -1 x4658 -1 x4807 -1 x4956 -1 x5105 -1 x5254 -1 x5403 -1 x5552 -1 x5701 -1 x5850 -1 x5999 -1 x6148 -1 x6297 -1 x6446 -1 x6595 -1 x6744 -1 x6893 -1 x7042 -1 x7191 -1 x7340 -1 x7489 -1 x7638 -1 x7787 -1 x7936 -1 x8085 -1 x8234 -1 x8383 -1 x8532 -1 x8681 -1 x8830 -1 x8979 -1 x9128 -1 x9277 -1 x9426 -1 x9575 -1 x9724 -1 x9873 -1 x10022 -1 x10171 -1 x10320 -1 x10469 -1 x10618 -1 x10767 -1 x10916 -1 x11065 -1 x11214 -1 x11363 -1 x11512 -1 x11661 -1 x11810 -1 x11959 -1 x12108 -1 x12257 -1 x12406 -1 x12555 -1 x12704 -1 x12853 -1 x13002 -1 x13151 -1 x13300 -1 x13449 -1 x13598 -1 x13747 -1 x13896 -1 x14045 -1 x14194 -1 x14343 -1 x14492 -1 x14641 -1 x14790 -1 x14939 -1 x15088 -1 x15237 -1 x15386 -1 x15535 -1 x15684 -1 x15833 -1 x15982 -1 x16131 -1 x16280 -1 x16429 -1 x16578 -1 x16727 -1 x16876 -1 x17025 -1 x17174 -1 x17323 -1 x17472 -1 x17621 -1 x17770 -1 x17919 -1 x18068 -1 x18217 -1 x18366 -1 x18515 -1 x18664 -1 x18813 -1 x18962 -1 x19111 -1 x19260 -1 x19409 -1 x19558 -1 x19707 -1 x19856 -1 x20005 -1 x20154 -1 x20303 -1 x20452 -1 x20601 -1 x20750 -1 x20899 -1 x21048 -1 x21197 -1 x21346 -1 x21495 -1 x21644 -1 x21793 -1 x21942 -1 x22091 -1 x22240 >= -1;+-1 x40 -1 x189 -1 x338 -1 x487 -1 x636 -1 x785 -1 x934 -1 x1083 -1 x1232 -1 x1381 -1 x1530 -1 x1679 -1 x1828 -1 x1977 -1 x2126 -1 x2275 -1 x2424 -1 x2573 -1 x2722 -1 x2871 -1 x3020 -1 x3169 -1 x3318 -1 x3467 -1 x3616 -1 x3765 -1 x3914 -1 x4063 -1 x4212 -1 x4361 -1 x4510 -1 x4659 -1 x4808 -1 x4957 -1 x5106 -1 x5255 -1 x5404 -1 x5553 -1 x5702 -1 x5851 -1 x6000 -1 x6149 -1 x6298 -1 x6447 -1 x6596 -1 x6745 -1 x6894 -1 x7043 -1 x7192 -1 x7341 -1 x7490 -1 x7639 -1 x7788 -1 x7937 -1 x8086 -1 x8235 -1 x8384 -1 x8533 -1 x8682 -1 x8831 -1 x8980 -1 x9129 -1 x9278 -1 x9427 -1 x9576 -1 x9725 -1 x9874 -1 x10023 -1 x10172 -1 x10321 -1 x10470 -1 x10619 -1 x10768 -1 x10917 -1 x11066 -1 x11215 -1 x11364 -1 x11513 -1 x11662 -1 x11811 -1 x11960 -1 x12109 -1 x12258 -1 x12407 -1 x12556 -1 x12705 -1 x12854 -1 x13003 -1 x13152 -1 x13301 -1 x13450 -1 x13599 -1 x13748 -1 x13897 -1 x14046 -1 x14195 -1 x14344 -1 x14493 -1 x14642 -1 x14791 -1 x14940 -1 x15089 -1 x15238 -1 x15387 -1 x15536 -1 x15685 -1 x15834 -1 x15983 -1 x16132 -1 x16281 -1 x16430 -1 x16579 -1 x16728 -1 x16877 -1 x17026 -1 x17175 -1 x17324 -1 x17473 -1 x17622 -1 x17771 -1 x17920 -1 x18069 -1 x18218 -1 x18367 -1 x18516 -1 x18665 -1 x18814 -1 x18963 -1 x19112 -1 x19261 -1 x19410 -1 x19559 -1 x19708 -1 x19857 -1 x20006 -1 x20155 -1 x20304 -1 x20453 -1 x20602 -1 x20751 -1 x20900 -1 x21049 -1 x21198 -1 x21347 -1 x21496 -1 x21645 -1 x21794 -1 x21943 -1 x22092 -1 x22241 >= -1;+-1 x41 -1 x190 -1 x339 -1 x488 -1 x637 -1 x786 -1 x935 -1 x1084 -1 x1233 -1 x1382 -1 x1531 -1 x1680 -1 x1829 -1 x1978 -1 x2127 -1 x2276 -1 x2425 -1 x2574 -1 x2723 -1 x2872 -1 x3021 -1 x3170 -1 x3319 -1 x3468 -1 x3617 -1 x3766 -1 x3915 -1 x4064 -1 x4213 -1 x4362 -1 x4511 -1 x4660 -1 x4809 -1 x4958 -1 x5107 -1 x5256 -1 x5405 -1 x5554 -1 x5703 -1 x5852 -1 x6001 -1 x6150 -1 x6299 -1 x6448 -1 x6597 -1 x6746 -1 x6895 -1 x7044 -1 x7193 -1 x7342 -1 x7491 -1 x7640 -1 x7789 -1 x7938 -1 x8087 -1 x8236 -1 x8385 -1 x8534 -1 x8683 -1 x8832 -1 x8981 -1 x9130 -1 x9279 -1 x9428 -1 x9577 -1 x9726 -1 x9875 -1 x10024 -1 x10173 -1 x10322 -1 x10471 -1 x10620 -1 x10769 -1 x10918 -1 x11067 -1 x11216 -1 x11365 -1 x11514 -1 x11663 -1 x11812 -1 x11961 -1 x12110 -1 x12259 -1 x12408 -1 x12557 -1 x12706 -1 x12855 -1 x13004 -1 x13153 -1 x13302 -1 x13451 -1 x13600 -1 x13749 -1 x13898 -1 x14047 -1 x14196 -1 x14345 -1 x14494 -1 x14643 -1 x14792 -1 x14941 -1 x15090 -1 x15239 -1 x15388 -1 x15537 -1 x15686 -1 x15835 -1 x15984 -1 x16133 -1 x16282 -1 x16431 -1 x16580 -1 x16729 -1 x16878 -1 x17027 -1 x17176 -1 x17325 -1 x17474 -1 x17623 -1 x17772 -1 x17921 -1 x18070 -1 x18219 -1 x18368 -1 x18517 -1 x18666 -1 x18815 -1 x18964 -1 x19113 -1 x19262 -1 x19411 -1 x19560 -1 x19709 -1 x19858 -1 x20007 -1 x20156 -1 x20305 -1 x20454 -1 x20603 -1 x20752 -1 x20901 -1 x21050 -1 x21199 -1 x21348 -1 x21497 -1 x21646 -1 x21795 -1 x21944 -1 x22093 -1 x22242 >= -1;+-1 x42 -1 x191 -1 x340 -1 x489 -1 x638 -1 x787 -1 x936 -1 x1085 -1 x1234 -1 x1383 -1 x1532 -1 x1681 -1 x1830 -1 x1979 -1 x2128 -1 x2277 -1 x2426 -1 x2575 -1 x2724 -1 x2873 -1 x3022 -1 x3171 -1 x3320 -1 x3469 -1 x3618 -1 x3767 -1 x3916 -1 x4065 -1 x4214 -1 x4363 -1 x4512 -1 x4661 -1 x4810 -1 x4959 -1 x5108 -1 x5257 -1 x5406 -1 x5555 -1 x5704 -1 x5853 -1 x6002 -1 x6151 -1 x6300 -1 x6449 -1 x6598 -1 x6747 -1 x6896 -1 x7045 -1 x7194 -1 x7343 -1 x7492 -1 x7641 -1 x7790 -1 x7939 -1 x8088 -1 x8237 -1 x8386 -1 x8535 -1 x8684 -1 x8833 -1 x8982 -1 x9131 -1 x9280 -1 x9429 -1 x9578 -1 x9727 -1 x9876 -1 x10025 -1 x10174 -1 x10323 -1 x10472 -1 x10621 -1 x10770 -1 x10919 -1 x11068 -1 x11217 -1 x11366 -1 x11515 -1 x11664 -1 x11813 -1 x11962 -1 x12111 -1 x12260 -1 x12409 -1 x12558 -1 x12707 -1 x12856 -1 x13005 -1 x13154 -1 x13303 -1 x13452 -1 x13601 -1 x13750 -1 x13899 -1 x14048 -1 x14197 -1 x14346 -1 x14495 -1 x14644 -1 x14793 -1 x14942 -1 x15091 -1 x15240 -1 x15389 -1 x15538 -1 x15687 -1 x15836 -1 x15985 -1 x16134 -1 x16283 -1 x16432 -1 x16581 -1 x16730 -1 x16879 -1 x17028 -1 x17177 -1 x17326 -1 x17475 -1 x17624 -1 x17773 -1 x17922 -1 x18071 -1 x18220 -1 x18369 -1 x18518 -1 x18667 -1 x18816 -1 x18965 -1 x19114 -1 x19263 -1 x19412 -1 x19561 -1 x19710 -1 x19859 -1 x20008 -1 x20157 -1 x20306 -1 x20455 -1 x20604 -1 x20753 -1 x20902 -1 x21051 -1 x21200 -1 x21349 -1 x21498 -1 x21647 -1 x21796 -1 x21945 -1 x22094 -1 x22243 >= -1;+-1 x43 -1 x192 -1 x341 -1 x490 -1 x639 -1 x788 -1 x937 -1 x1086 -1 x1235 -1 x1384 -1 x1533 -1 x1682 -1 x1831 -1 x1980 -1 x2129 -1 x2278 -1 x2427 -1 x2576 -1 x2725 -1 x2874 -1 x3023 -1 x3172 -1 x3321 -1 x3470 -1 x3619 -1 x3768 -1 x3917 -1 x4066 -1 x4215 -1 x4364 -1 x4513 -1 x4662 -1 x4811 -1 x4960 -1 x5109 -1 x5258 -1 x5407 -1 x5556 -1 x5705 -1 x5854 -1 x6003 -1 x6152 -1 x6301 -1 x6450 -1 x6599 -1 x6748 -1 x6897 -1 x7046 -1 x7195 -1 x7344 -1 x7493 -1 x7642 -1 x7791 -1 x7940 -1 x8089 -1 x8238 -1 x8387 -1 x8536 -1 x8685 -1 x8834 -1 x8983 -1 x9132 -1 x9281 -1 x9430 -1 x9579 -1 x9728 -1 x9877 -1 x10026 -1 x10175 -1 x10324 -1 x10473 -1 x10622 -1 x10771 -1 x10920 -1 x11069 -1 x11218 -1 x11367 -1 x11516 -1 x11665 -1 x11814 -1 x11963 -1 x12112 -1 x12261 -1 x12410 -1 x12559 -1 x12708 -1 x12857 -1 x13006 -1 x13155 -1 x13304 -1 x13453 -1 x13602 -1 x13751 -1 x13900 -1 x14049 -1 x14198 -1 x14347 -1 x14496 -1 x14645 -1 x14794 -1 x14943 -1 x15092 -1 x15241 -1 x15390 -1 x15539 -1 x15688 -1 x15837 -1 x15986 -1 x16135 -1 x16284 -1 x16433 -1 x16582 -1 x16731 -1 x16880 -1 x17029 -1 x17178 -1 x17327 -1 x17476 -1 x17625 -1 x17774 -1 x17923 -1 x18072 -1 x18221 -1 x18370 -1 x18519 -1 x18668 -1 x18817 -1 x18966 -1 x19115 -1 x19264 -1 x19413 -1 x19562 -1 x19711 -1 x19860 -1 x20009 -1 x20158 -1 x20307 -1 x20456 -1 x20605 -1 x20754 -1 x20903 -1 x21052 -1 x21201 -1 x21350 -1 x21499 -1 x21648 -1 x21797 -1 x21946 -1 x22095 -1 x22244 >= -1;+-1 x44 -1 x193 -1 x342 -1 x491 -1 x640 -1 x789 -1 x938 -1 x1087 -1 x1236 -1 x1385 -1 x1534 -1 x1683 -1 x1832 -1 x1981 -1 x2130 -1 x2279 -1 x2428 -1 x2577 -1 x2726 -1 x2875 -1 x3024 -1 x3173 -1 x3322 -1 x3471 -1 x3620 -1 x3769 -1 x3918 -1 x4067 -1 x4216 -1 x4365 -1 x4514 -1 x4663 -1 x4812 -1 x4961 -1 x5110 -1 x5259 -1 x5408 -1 x5557 -1 x5706 -1 x5855 -1 x6004 -1 x6153 -1 x6302 -1 x6451 -1 x6600 -1 x6749 -1 x6898 -1 x7047 -1 x7196 -1 x7345 -1 x7494 -1 x7643 -1 x7792 -1 x7941 -1 x8090 -1 x8239 -1 x8388 -1 x8537 -1 x8686 -1 x8835 -1 x8984 -1 x9133 -1 x9282 -1 x9431 -1 x9580 -1 x9729 -1 x9878 -1 x10027 -1 x10176 -1 x10325 -1 x10474 -1 x10623 -1 x10772 -1 x10921 -1 x11070 -1 x11219 -1 x11368 -1 x11517 -1 x11666 -1 x11815 -1 x11964 -1 x12113 -1 x12262 -1 x12411 -1 x12560 -1 x12709 -1 x12858 -1 x13007 -1 x13156 -1 x13305 -1 x13454 -1 x13603 -1 x13752 -1 x13901 -1 x14050 -1 x14199 -1 x14348 -1 x14497 -1 x14646 -1 x14795 -1 x14944 -1 x15093 -1 x15242 -1 x15391 -1 x15540 -1 x15689 -1 x15838 -1 x15987 -1 x16136 -1 x16285 -1 x16434 -1 x16583 -1 x16732 -1 x16881 -1 x17030 -1 x17179 -1 x17328 -1 x17477 -1 x17626 -1 x17775 -1 x17924 -1 x18073 -1 x18222 -1 x18371 -1 x18520 -1 x18669 -1 x18818 -1 x18967 -1 x19116 -1 x19265 -1 x19414 -1 x19563 -1 x19712 -1 x19861 -1 x20010 -1 x20159 -1 x20308 -1 x20457 -1 x20606 -1 x20755 -1 x20904 -1 x21053 -1 x21202 -1 x21351 -1 x21500 -1 x21649 -1 x21798 -1 x21947 -1 x22096 -1 x22245 >= -1;+-1 x45 -1 x194 -1 x343 -1 x492 -1 x641 -1 x790 -1 x939 -1 x1088 -1 x1237 -1 x1386 -1 x1535 -1 x1684 -1 x1833 -1 x1982 -1 x2131 -1 x2280 -1 x2429 -1 x2578 -1 x2727 -1 x2876 -1 x3025 -1 x3174 -1 x3323 -1 x3472 -1 x3621 -1 x3770 -1 x3919 -1 x4068 -1 x4217 -1 x4366 -1 x4515 -1 x4664 -1 x4813 -1 x4962 -1 x5111 -1 x5260 -1 x5409 -1 x5558 -1 x5707 -1 x5856 -1 x6005 -1 x6154 -1 x6303 -1 x6452 -1 x6601 -1 x6750 -1 x6899 -1 x7048 -1 x7197 -1 x7346 -1 x7495 -1 x7644 -1 x7793 -1 x7942 -1 x8091 -1 x8240 -1 x8389 -1 x8538 -1 x8687 -1 x8836 -1 x8985 -1 x9134 -1 x9283 -1 x9432 -1 x9581 -1 x9730 -1 x9879 -1 x10028 -1 x10177 -1 x10326 -1 x10475 -1 x10624 -1 x10773 -1 x10922 -1 x11071 -1 x11220 -1 x11369 -1 x11518 -1 x11667 -1 x11816 -1 x11965 -1 x12114 -1 x12263 -1 x12412 -1 x12561 -1 x12710 -1 x12859 -1 x13008 -1 x13157 -1 x13306 -1 x13455 -1 x13604 -1 x13753 -1 x13902 -1 x14051 -1 x14200 -1 x14349 -1 x14498 -1 x14647 -1 x14796 -1 x14945 -1 x15094 -1 x15243 -1 x15392 -1 x15541 -1 x15690 -1 x15839 -1 x15988 -1 x16137 -1 x16286 -1 x16435 -1 x16584 -1 x16733 -1 x16882 -1 x17031 -1 x17180 -1 x17329 -1 x17478 -1 x17627 -1 x17776 -1 x17925 -1 x18074 -1 x18223 -1 x18372 -1 x18521 -1 x18670 -1 x18819 -1 x18968 -1 x19117 -1 x19266 -1 x19415 -1 x19564 -1 x19713 -1 x19862 -1 x20011 -1 x20160 -1 x20309 -1 x20458 -1 x20607 -1 x20756 -1 x20905 -1 x21054 -1 x21203 -1 x21352 -1 x21501 -1 x21650 -1 x21799 -1 x21948 -1 x22097 -1 x22246 >= -1;+-1 x46 -1 x195 -1 x344 -1 x493 -1 x642 -1 x791 -1 x940 -1 x1089 -1 x1238 -1 x1387 -1 x1536 -1 x1685 -1 x1834 -1 x1983 -1 x2132 -1 x2281 -1 x2430 -1 x2579 -1 x2728 -1 x2877 -1 x3026 -1 x3175 -1 x3324 -1 x3473 -1 x3622 -1 x3771 -1 x3920 -1 x4069 -1 x4218 -1 x4367 -1 x4516 -1 x4665 -1 x4814 -1 x4963 -1 x5112 -1 x5261 -1 x5410 -1 x5559 -1 x5708 -1 x5857 -1 x6006 -1 x6155 -1 x6304 -1 x6453 -1 x6602 -1 x6751 -1 x6900 -1 x7049 -1 x7198 -1 x7347 -1 x7496 -1 x7645 -1 x7794 -1 x7943 -1 x8092 -1 x8241 -1 x8390 -1 x8539 -1 x8688 -1 x8837 -1 x8986 -1 x9135 -1 x9284 -1 x9433 -1 x9582 -1 x9731 -1 x9880 -1 x10029 -1 x10178 -1 x10327 -1 x10476 -1 x10625 -1 x10774 -1 x10923 -1 x11072 -1 x11221 -1 x11370 -1 x11519 -1 x11668 -1 x11817 -1 x11966 -1 x12115 -1 x12264 -1 x12413 -1 x12562 -1 x12711 -1 x12860 -1 x13009 -1 x13158 -1 x13307 -1 x13456 -1 x13605 -1 x13754 -1 x13903 -1 x14052 -1 x14201 -1 x14350 -1 x14499 -1 x14648 -1 x14797 -1 x14946 -1 x15095 -1 x15244 -1 x15393 -1 x15542 -1 x15691 -1 x15840 -1 x15989 -1 x16138 -1 x16287 -1 x16436 -1 x16585 -1 x16734 -1 x16883 -1 x17032 -1 x17181 -1 x17330 -1 x17479 -1 x17628 -1 x17777 -1 x17926 -1 x18075 -1 x18224 -1 x18373 -1 x18522 -1 x18671 -1 x18820 -1 x18969 -1 x19118 -1 x19267 -1 x19416 -1 x19565 -1 x19714 -1 x19863 -1 x20012 -1 x20161 -1 x20310 -1 x20459 -1 x20608 -1 x20757 -1 x20906 -1 x21055 -1 x21204 -1 x21353 -1 x21502 -1 x21651 -1 x21800 -1 x21949 -1 x22098 -1 x22247 >= -1;+-1 x47 -1 x196 -1 x345 -1 x494 -1 x643 -1 x792 -1 x941 -1 x1090 -1 x1239 -1 x1388 -1 x1537 -1 x1686 -1 x1835 -1 x1984 -1 x2133 -1 x2282 -1 x2431 -1 x2580 -1 x2729 -1 x2878 -1 x3027 -1 x3176 -1 x3325 -1 x3474 -1 x3623 -1 x3772 -1 x3921 -1 x4070 -1 x4219 -1 x4368 -1 x4517 -1 x4666 -1 x4815 -1 x4964 -1 x5113 -1 x5262 -1 x5411 -1 x5560 -1 x5709 -1 x5858 -1 x6007 -1 x6156 -1 x6305 -1 x6454 -1 x6603 -1 x6752 -1 x6901 -1 x7050 -1 x7199 -1 x7348 -1 x7497 -1 x7646 -1 x7795 -1 x7944 -1 x8093 -1 x8242 -1 x8391 -1 x8540 -1 x8689 -1 x8838 -1 x8987 -1 x9136 -1 x9285 -1 x9434 -1 x9583 -1 x9732 -1 x9881 -1 x10030 -1 x10179 -1 x10328 -1 x10477 -1 x10626 -1 x10775 -1 x10924 -1 x11073 -1 x11222 -1 x11371 -1 x11520 -1 x11669 -1 x11818 -1 x11967 -1 x12116 -1 x12265 -1 x12414 -1 x12563 -1 x12712 -1 x12861 -1 x13010 -1 x13159 -1 x13308 -1 x13457 -1 x13606 -1 x13755 -1 x13904 -1 x14053 -1 x14202 -1 x14351 -1 x14500 -1 x14649 -1 x14798 -1 x14947 -1 x15096 -1 x15245 -1 x15394 -1 x15543 -1 x15692 -1 x15841 -1 x15990 -1 x16139 -1 x16288 -1 x16437 -1 x16586 -1 x16735 -1 x16884 -1 x17033 -1 x17182 -1 x17331 -1 x17480 -1 x17629 -1 x17778 -1 x17927 -1 x18076 -1 x18225 -1 x18374 -1 x18523 -1 x18672 -1 x18821 -1 x18970 -1 x19119 -1 x19268 -1 x19417 -1 x19566 -1 x19715 -1 x19864 -1 x20013 -1 x20162 -1 x20311 -1 x20460 -1 x20609 -1 x20758 -1 x20907 -1 x21056 -1 x21205 -1 x21354 -1 x21503 -1 x21652 -1 x21801 -1 x21950 -1 x22099 -1 x22248 >= -1;+-1 x48 -1 x197 -1 x346 -1 x495 -1 x644 -1 x793 -1 x942 -1 x1091 -1 x1240 -1 x1389 -1 x1538 -1 x1687 -1 x1836 -1 x1985 -1 x2134 -1 x2283 -1 x2432 -1 x2581 -1 x2730 -1 x2879 -1 x3028 -1 x3177 -1 x3326 -1 x3475 -1 x3624 -1 x3773 -1 x3922 -1 x4071 -1 x4220 -1 x4369 -1 x4518 -1 x4667 -1 x4816 -1 x4965 -1 x5114 -1 x5263 -1 x5412 -1 x5561 -1 x5710 -1 x5859 -1 x6008 -1 x6157 -1 x6306 -1 x6455 -1 x6604 -1 x6753 -1 x6902 -1 x7051 -1 x7200 -1 x7349 -1 x7498 -1 x7647 -1 x7796 -1 x7945 -1 x8094 -1 x8243 -1 x8392 -1 x8541 -1 x8690 -1 x8839 -1 x8988 -1 x9137 -1 x9286 -1 x9435 -1 x9584 -1 x9733 -1 x9882 -1 x10031 -1 x10180 -1 x10329 -1 x10478 -1 x10627 -1 x10776 -1 x10925 -1 x11074 -1 x11223 -1 x11372 -1 x11521 -1 x11670 -1 x11819 -1 x11968 -1 x12117 -1 x12266 -1 x12415 -1 x12564 -1 x12713 -1 x12862 -1 x13011 -1 x13160 -1 x13309 -1 x13458 -1 x13607 -1 x13756 -1 x13905 -1 x14054 -1 x14203 -1 x14352 -1 x14501 -1 x14650 -1 x14799 -1 x14948 -1 x15097 -1 x15246 -1 x15395 -1 x15544 -1 x15693 -1 x15842 -1 x15991 -1 x16140 -1 x16289 -1 x16438 -1 x16587 -1 x16736 -1 x16885 -1 x17034 -1 x17183 -1 x17332 -1 x17481 -1 x17630 -1 x17779 -1 x17928 -1 x18077 -1 x18226 -1 x18375 -1 x18524 -1 x18673 -1 x18822 -1 x18971 -1 x19120 -1 x19269 -1 x19418 -1 x19567 -1 x19716 -1 x19865 -1 x20014 -1 x20163 -1 x20312 -1 x20461 -1 x20610 -1 x20759 -1 x20908 -1 x21057 -1 x21206 -1 x21355 -1 x21504 -1 x21653 -1 x21802 -1 x21951 -1 x22100 -1 x22249 >= -1;+-1 x49 -1 x198 -1 x347 -1 x496 -1 x645 -1 x794 -1 x943 -1 x1092 -1 x1241 -1 x1390 -1 x1539 -1 x1688 -1 x1837 -1 x1986 -1 x2135 -1 x2284 -1 x2433 -1 x2582 -1 x2731 -1 x2880 -1 x3029 -1 x3178 -1 x3327 -1 x3476 -1 x3625 -1 x3774 -1 x3923 -1 x4072 -1 x4221 -1 x4370 -1 x4519 -1 x4668 -1 x4817 -1 x4966 -1 x5115 -1 x5264 -1 x5413 -1 x5562 -1 x5711 -1 x5860 -1 x6009 -1 x6158 -1 x6307 -1 x6456 -1 x6605 -1 x6754 -1 x6903 -1 x7052 -1 x7201 -1 x7350 -1 x7499 -1 x7648 -1 x7797 -1 x7946 -1 x8095 -1 x8244 -1 x8393 -1 x8542 -1 x8691 -1 x8840 -1 x8989 -1 x9138 -1 x9287 -1 x9436 -1 x9585 -1 x9734 -1 x9883 -1 x10032 -1 x10181 -1 x10330 -1 x10479 -1 x10628 -1 x10777 -1 x10926 -1 x11075 -1 x11224 -1 x11373 -1 x11522 -1 x11671 -1 x11820 -1 x11969 -1 x12118 -1 x12267 -1 x12416 -1 x12565 -1 x12714 -1 x12863 -1 x13012 -1 x13161 -1 x13310 -1 x13459 -1 x13608 -1 x13757 -1 x13906 -1 x14055 -1 x14204 -1 x14353 -1 x14502 -1 x14651 -1 x14800 -1 x14949 -1 x15098 -1 x15247 -1 x15396 -1 x15545 -1 x15694 -1 x15843 -1 x15992 -1 x16141 -1 x16290 -1 x16439 -1 x16588 -1 x16737 -1 x16886 -1 x17035 -1 x17184 -1 x17333 -1 x17482 -1 x17631 -1 x17780 -1 x17929 -1 x18078 -1 x18227 -1 x18376 -1 x18525 -1 x18674 -1 x18823 -1 x18972 -1 x19121 -1 x19270 -1 x19419 -1 x19568 -1 x19717 -1 x19866 -1 x20015 -1 x20164 -1 x20313 -1 x20462 -1 x20611 -1 x20760 -1 x20909 -1 x21058 -1 x21207 -1 x21356 -1 x21505 -1 x21654 -1 x21803 -1 x21952 -1 x22101 -1 x22250 >= -1;+-1 x50 -1 x199 -1 x348 -1 x497 -1 x646 -1 x795 -1 x944 -1 x1093 -1 x1242 -1 x1391 -1 x1540 -1 x1689 -1 x1838 -1 x1987 -1 x2136 -1 x2285 -1 x2434 -1 x2583 -1 x2732 -1 x2881 -1 x3030 -1 x3179 -1 x3328 -1 x3477 -1 x3626 -1 x3775 -1 x3924 -1 x4073 -1 x4222 -1 x4371 -1 x4520 -1 x4669 -1 x4818 -1 x4967 -1 x5116 -1 x5265 -1 x5414 -1 x5563 -1 x5712 -1 x5861 -1 x6010 -1 x6159 -1 x6308 -1 x6457 -1 x6606 -1 x6755 -1 x6904 -1 x7053 -1 x7202 -1 x7351 -1 x7500 -1 x7649 -1 x7798 -1 x7947 -1 x8096 -1 x8245 -1 x8394 -1 x8543 -1 x8692 -1 x8841 -1 x8990 -1 x9139 -1 x9288 -1 x9437 -1 x9586 -1 x9735 -1 x9884 -1 x10033 -1 x10182 -1 x10331 -1 x10480 -1 x10629 -1 x10778 -1 x10927 -1 x11076 -1 x11225 -1 x11374 -1 x11523 -1 x11672 -1 x11821 -1 x11970 -1 x12119 -1 x12268 -1 x12417 -1 x12566 -1 x12715 -1 x12864 -1 x13013 -1 x13162 -1 x13311 -1 x13460 -1 x13609 -1 x13758 -1 x13907 -1 x14056 -1 x14205 -1 x14354 -1 x14503 -1 x14652 -1 x14801 -1 x14950 -1 x15099 -1 x15248 -1 x15397 -1 x15546 -1 x15695 -1 x15844 -1 x15993 -1 x16142 -1 x16291 -1 x16440 -1 x16589 -1 x16738 -1 x16887 -1 x17036 -1 x17185 -1 x17334 -1 x17483 -1 x17632 -1 x17781 -1 x17930 -1 x18079 -1 x18228 -1 x18377 -1 x18526 -1 x18675 -1 x18824 -1 x18973 -1 x19122 -1 x19271 -1 x19420 -1 x19569 -1 x19718 -1 x19867 -1 x20016 -1 x20165 -1 x20314 -1 x20463 -1 x20612 -1 x20761 -1 x20910 -1 x21059 -1 x21208 -1 x21357 -1 x21506 -1 x21655 -1 x21804 -1 x21953 -1 x22102 -1 x22251 >= -1;+-1 x51 -1 x200 -1 x349 -1 x498 -1 x647 -1 x796 -1 x945 -1 x1094 -1 x1243 -1 x1392 -1 x1541 -1 x1690 -1 x1839 -1 x1988 -1 x2137 -1 x2286 -1 x2435 -1 x2584 -1 x2733 -1 x2882 -1 x3031 -1 x3180 -1 x3329 -1 x3478 -1 x3627 -1 x3776 -1 x3925 -1 x4074 -1 x4223 -1 x4372 -1 x4521 -1 x4670 -1 x4819 -1 x4968 -1 x5117 -1 x5266 -1 x5415 -1 x5564 -1 x5713 -1 x5862 -1 x6011 -1 x6160 -1 x6309 -1 x6458 -1 x6607 -1 x6756 -1 x6905 -1 x7054 -1 x7203 -1 x7352 -1 x7501 -1 x7650 -1 x7799 -1 x7948 -1 x8097 -1 x8246 -1 x8395 -1 x8544 -1 x8693 -1 x8842 -1 x8991 -1 x9140 -1 x9289 -1 x9438 -1 x9587 -1 x9736 -1 x9885 -1 x10034 -1 x10183 -1 x10332 -1 x10481 -1 x10630 -1 x10779 -1 x10928 -1 x11077 -1 x11226 -1 x11375 -1 x11524 -1 x11673 -1 x11822 -1 x11971 -1 x12120 -1 x12269 -1 x12418 -1 x12567 -1 x12716 -1 x12865 -1 x13014 -1 x13163 -1 x13312 -1 x13461 -1 x13610 -1 x13759 -1 x13908 -1 x14057 -1 x14206 -1 x14355 -1 x14504 -1 x14653 -1 x14802 -1 x14951 -1 x15100 -1 x15249 -1 x15398 -1 x15547 -1 x15696 -1 x15845 -1 x15994 -1 x16143 -1 x16292 -1 x16441 -1 x16590 -1 x16739 -1 x16888 -1 x17037 -1 x17186 -1 x17335 -1 x17484 -1 x17633 -1 x17782 -1 x17931 -1 x18080 -1 x18229 -1 x18378 -1 x18527 -1 x18676 -1 x18825 -1 x18974 -1 x19123 -1 x19272 -1 x19421 -1 x19570 -1 x19719 -1 x19868 -1 x20017 -1 x20166 -1 x20315 -1 x20464 -1 x20613 -1 x20762 -1 x20911 -1 x21060 -1 x21209 -1 x21358 -1 x21507 -1 x21656 -1 x21805 -1 x21954 -1 x22103 -1 x22252 >= -1;+-1 x52 -1 x201 -1 x350 -1 x499 -1 x648 -1 x797 -1 x946 -1 x1095 -1 x1244 -1 x1393 -1 x1542 -1 x1691 -1 x1840 -1 x1989 -1 x2138 -1 x2287 -1 x2436 -1 x2585 -1 x2734 -1 x2883 -1 x3032 -1 x3181 -1 x3330 -1 x3479 -1 x3628 -1 x3777 -1 x3926 -1 x4075 -1 x4224 -1 x4373 -1 x4522 -1 x4671 -1 x4820 -1 x4969 -1 x5118 -1 x5267 -1 x5416 -1 x5565 -1 x5714 -1 x5863 -1 x6012 -1 x6161 -1 x6310 -1 x6459 -1 x6608 -1 x6757 -1 x6906 -1 x7055 -1 x7204 -1 x7353 -1 x7502 -1 x7651 -1 x7800 -1 x7949 -1 x8098 -1 x8247 -1 x8396 -1 x8545 -1 x8694 -1 x8843 -1 x8992 -1 x9141 -1 x9290 -1 x9439 -1 x9588 -1 x9737 -1 x9886 -1 x10035 -1 x10184 -1 x10333 -1 x10482 -1 x10631 -1 x10780 -1 x10929 -1 x11078 -1 x11227 -1 x11376 -1 x11525 -1 x11674 -1 x11823 -1 x11972 -1 x12121 -1 x12270 -1 x12419 -1 x12568 -1 x12717 -1 x12866 -1 x13015 -1 x13164 -1 x13313 -1 x13462 -1 x13611 -1 x13760 -1 x13909 -1 x14058 -1 x14207 -1 x14356 -1 x14505 -1 x14654 -1 x14803 -1 x14952 -1 x15101 -1 x15250 -1 x15399 -1 x15548 -1 x15697 -1 x15846 -1 x15995 -1 x16144 -1 x16293 -1 x16442 -1 x16591 -1 x16740 -1 x16889 -1 x17038 -1 x17187 -1 x17336 -1 x17485 -1 x17634 -1 x17783 -1 x17932 -1 x18081 -1 x18230 -1 x18379 -1 x18528 -1 x18677 -1 x18826 -1 x18975 -1 x19124 -1 x19273 -1 x19422 -1 x19571 -1 x19720 -1 x19869 -1 x20018 -1 x20167 -1 x20316 -1 x20465 -1 x20614 -1 x20763 -1 x20912 -1 x21061 -1 x21210 -1 x21359 -1 x21508 -1 x21657 -1 x21806 -1 x21955 -1 x22104 -1 x22253 >= -1;+-1 x53 -1 x202 -1 x351 -1 x500 -1 x649 -1 x798 -1 x947 -1 x1096 -1 x1245 -1 x1394 -1 x1543 -1 x1692 -1 x1841 -1 x1990 -1 x2139 -1 x2288 -1 x2437 -1 x2586 -1 x2735 -1 x2884 -1 x3033 -1 x3182 -1 x3331 -1 x3480 -1 x3629 -1 x3778 -1 x3927 -1 x4076 -1 x4225 -1 x4374 -1 x4523 -1 x4672 -1 x4821 -1 x4970 -1 x5119 -1 x5268 -1 x5417 -1 x5566 -1 x5715 -1 x5864 -1 x6013 -1 x6162 -1 x6311 -1 x6460 -1 x6609 -1 x6758 -1 x6907 -1 x7056 -1 x7205 -1 x7354 -1 x7503 -1 x7652 -1 x7801 -1 x7950 -1 x8099 -1 x8248 -1 x8397 -1 x8546 -1 x8695 -1 x8844 -1 x8993 -1 x9142 -1 x9291 -1 x9440 -1 x9589 -1 x9738 -1 x9887 -1 x10036 -1 x10185 -1 x10334 -1 x10483 -1 x10632 -1 x10781 -1 x10930 -1 x11079 -1 x11228 -1 x11377 -1 x11526 -1 x11675 -1 x11824 -1 x11973 -1 x12122 -1 x12271 -1 x12420 -1 x12569 -1 x12718 -1 x12867 -1 x13016 -1 x13165 -1 x13314 -1 x13463 -1 x13612 -1 x13761 -1 x13910 -1 x14059 -1 x14208 -1 x14357 -1 x14506 -1 x14655 -1 x14804 -1 x14953 -1 x15102 -1 x15251 -1 x15400 -1 x15549 -1 x15698 -1 x15847 -1 x15996 -1 x16145 -1 x16294 -1 x16443 -1 x16592 -1 x16741 -1 x16890 -1 x17039 -1 x17188 -1 x17337 -1 x17486 -1 x17635 -1 x17784 -1 x17933 -1 x18082 -1 x18231 -1 x18380 -1 x18529 -1 x18678 -1 x18827 -1 x18976 -1 x19125 -1 x19274 -1 x19423 -1 x19572 -1 x19721 -1 x19870 -1 x20019 -1 x20168 -1 x20317 -1 x20466 -1 x20615 -1 x20764 -1 x20913 -1 x21062 -1 x21211 -1 x21360 -1 x21509 -1 x21658 -1 x21807 -1 x21956 -1 x22105 -1 x22254 >= -1;+-1 x54 -1 x203 -1 x352 -1 x501 -1 x650 -1 x799 -1 x948 -1 x1097 -1 x1246 -1 x1395 -1 x1544 -1 x1693 -1 x1842 -1 x1991 -1 x2140 -1 x2289 -1 x2438 -1 x2587 -1 x2736 -1 x2885 -1 x3034 -1 x3183 -1 x3332 -1 x3481 -1 x3630 -1 x3779 -1 x3928 -1 x4077 -1 x4226 -1 x4375 -1 x4524 -1 x4673 -1 x4822 -1 x4971 -1 x5120 -1 x5269 -1 x5418 -1 x5567 -1 x5716 -1 x5865 -1 x6014 -1 x6163 -1 x6312 -1 x6461 -1 x6610 -1 x6759 -1 x6908 -1 x7057 -1 x7206 -1 x7355 -1 x7504 -1 x7653 -1 x7802 -1 x7951 -1 x8100 -1 x8249 -1 x8398 -1 x8547 -1 x8696 -1 x8845 -1 x8994 -1 x9143 -1 x9292 -1 x9441 -1 x9590 -1 x9739 -1 x9888 -1 x10037 -1 x10186 -1 x10335 -1 x10484 -1 x10633 -1 x10782 -1 x10931 -1 x11080 -1 x11229 -1 x11378 -1 x11527 -1 x11676 -1 x11825 -1 x11974 -1 x12123 -1 x12272 -1 x12421 -1 x12570 -1 x12719 -1 x12868 -1 x13017 -1 x13166 -1 x13315 -1 x13464 -1 x13613 -1 x13762 -1 x13911 -1 x14060 -1 x14209 -1 x14358 -1 x14507 -1 x14656 -1 x14805 -1 x14954 -1 x15103 -1 x15252 -1 x15401 -1 x15550 -1 x15699 -1 x15848 -1 x15997 -1 x16146 -1 x16295 -1 x16444 -1 x16593 -1 x16742 -1 x16891 -1 x17040 -1 x17189 -1 x17338 -1 x17487 -1 x17636 -1 x17785 -1 x17934 -1 x18083 -1 x18232 -1 x18381 -1 x18530 -1 x18679 -1 x18828 -1 x18977 -1 x19126 -1 x19275 -1 x19424 -1 x19573 -1 x19722 -1 x19871 -1 x20020 -1 x20169 -1 x20318 -1 x20467 -1 x20616 -1 x20765 -1 x20914 -1 x21063 -1 x21212 -1 x21361 -1 x21510 -1 x21659 -1 x21808 -1 x21957 -1 x22106 -1 x22255 >= -1;+-1 x55 -1 x204 -1 x353 -1 x502 -1 x651 -1 x800 -1 x949 -1 x1098 -1 x1247 -1 x1396 -1 x1545 -1 x1694 -1 x1843 -1 x1992 -1 x2141 -1 x2290 -1 x2439 -1 x2588 -1 x2737 -1 x2886 -1 x3035 -1 x3184 -1 x3333 -1 x3482 -1 x3631 -1 x3780 -1 x3929 -1 x4078 -1 x4227 -1 x4376 -1 x4525 -1 x4674 -1 x4823 -1 x4972 -1 x5121 -1 x5270 -1 x5419 -1 x5568 -1 x5717 -1 x5866 -1 x6015 -1 x6164 -1 x6313 -1 x6462 -1 x6611 -1 x6760 -1 x6909 -1 x7058 -1 x7207 -1 x7356 -1 x7505 -1 x7654 -1 x7803 -1 x7952 -1 x8101 -1 x8250 -1 x8399 -1 x8548 -1 x8697 -1 x8846 -1 x8995 -1 x9144 -1 x9293 -1 x9442 -1 x9591 -1 x9740 -1 x9889 -1 x10038 -1 x10187 -1 x10336 -1 x10485 -1 x10634 -1 x10783 -1 x10932 -1 x11081 -1 x11230 -1 x11379 -1 x11528 -1 x11677 -1 x11826 -1 x11975 -1 x12124 -1 x12273 -1 x12422 -1 x12571 -1 x12720 -1 x12869 -1 x13018 -1 x13167 -1 x13316 -1 x13465 -1 x13614 -1 x13763 -1 x13912 -1 x14061 -1 x14210 -1 x14359 -1 x14508 -1 x14657 -1 x14806 -1 x14955 -1 x15104 -1 x15253 -1 x15402 -1 x15551 -1 x15700 -1 x15849 -1 x15998 -1 x16147 -1 x16296 -1 x16445 -1 x16594 -1 x16743 -1 x16892 -1 x17041 -1 x17190 -1 x17339 -1 x17488 -1 x17637 -1 x17786 -1 x17935 -1 x18084 -1 x18233 -1 x18382 -1 x18531 -1 x18680 -1 x18829 -1 x18978 -1 x19127 -1 x19276 -1 x19425 -1 x19574 -1 x19723 -1 x19872 -1 x20021 -1 x20170 -1 x20319 -1 x20468 -1 x20617 -1 x20766 -1 x20915 -1 x21064 -1 x21213 -1 x21362 -1 x21511 -1 x21660 -1 x21809 -1 x21958 -1 x22107 -1 x22256 >= -1;+-1 x56 -1 x205 -1 x354 -1 x503 -1 x652 -1 x801 -1 x950 -1 x1099 -1 x1248 -1 x1397 -1 x1546 -1 x1695 -1 x1844 -1 x1993 -1 x2142 -1 x2291 -1 x2440 -1 x2589 -1 x2738 -1 x2887 -1 x3036 -1 x3185 -1 x3334 -1 x3483 -1 x3632 -1 x3781 -1 x3930 -1 x4079 -1 x4228 -1 x4377 -1 x4526 -1 x4675 -1 x4824 -1 x4973 -1 x5122 -1 x5271 -1 x5420 -1 x5569 -1 x5718 -1 x5867 -1 x6016 -1 x6165 -1 x6314 -1 x6463 -1 x6612 -1 x6761 -1 x6910 -1 x7059 -1 x7208 -1 x7357 -1 x7506 -1 x7655 -1 x7804 -1 x7953 -1 x8102 -1 x8251 -1 x8400 -1 x8549 -1 x8698 -1 x8847 -1 x8996 -1 x9145 -1 x9294 -1 x9443 -1 x9592 -1 x9741 -1 x9890 -1 x10039 -1 x10188 -1 x10337 -1 x10486 -1 x10635 -1 x10784 -1 x10933 -1 x11082 -1 x11231 -1 x11380 -1 x11529 -1 x11678 -1 x11827 -1 x11976 -1 x12125 -1 x12274 -1 x12423 -1 x12572 -1 x12721 -1 x12870 -1 x13019 -1 x13168 -1 x13317 -1 x13466 -1 x13615 -1 x13764 -1 x13913 -1 x14062 -1 x14211 -1 x14360 -1 x14509 -1 x14658 -1 x14807 -1 x14956 -1 x15105 -1 x15254 -1 x15403 -1 x15552 -1 x15701 -1 x15850 -1 x15999 -1 x16148 -1 x16297 -1 x16446 -1 x16595 -1 x16744 -1 x16893 -1 x17042 -1 x17191 -1 x17340 -1 x17489 -1 x17638 -1 x17787 -1 x17936 -1 x18085 -1 x18234 -1 x18383 -1 x18532 -1 x18681 -1 x18830 -1 x18979 -1 x19128 -1 x19277 -1 x19426 -1 x19575 -1 x19724 -1 x19873 -1 x20022 -1 x20171 -1 x20320 -1 x20469 -1 x20618 -1 x20767 -1 x20916 -1 x21065 -1 x21214 -1 x21363 -1 x21512 -1 x21661 -1 x21810 -1 x21959 -1 x22108 -1 x22257 >= -1;+-1 x57 -1 x206 -1 x355 -1 x504 -1 x653 -1 x802 -1 x951 -1 x1100 -1 x1249 -1 x1398 -1 x1547 -1 x1696 -1 x1845 -1 x1994 -1 x2143 -1 x2292 -1 x2441 -1 x2590 -1 x2739 -1 x2888 -1 x3037 -1 x3186 -1 x3335 -1 x3484 -1 x3633 -1 x3782 -1 x3931 -1 x4080 -1 x4229 -1 x4378 -1 x4527 -1 x4676 -1 x4825 -1 x4974 -1 x5123 -1 x5272 -1 x5421 -1 x5570 -1 x5719 -1 x5868 -1 x6017 -1 x6166 -1 x6315 -1 x6464 -1 x6613 -1 x6762 -1 x6911 -1 x7060 -1 x7209 -1 x7358 -1 x7507 -1 x7656 -1 x7805 -1 x7954 -1 x8103 -1 x8252 -1 x8401 -1 x8550 -1 x8699 -1 x8848 -1 x8997 -1 x9146 -1 x9295 -1 x9444 -1 x9593 -1 x9742 -1 x9891 -1 x10040 -1 x10189 -1 x10338 -1 x10487 -1 x10636 -1 x10785 -1 x10934 -1 x11083 -1 x11232 -1 x11381 -1 x11530 -1 x11679 -1 x11828 -1 x11977 -1 x12126 -1 x12275 -1 x12424 -1 x12573 -1 x12722 -1 x12871 -1 x13020 -1 x13169 -1 x13318 -1 x13467 -1 x13616 -1 x13765 -1 x13914 -1 x14063 -1 x14212 -1 x14361 -1 x14510 -1 x14659 -1 x14808 -1 x14957 -1 x15106 -1 x15255 -1 x15404 -1 x15553 -1 x15702 -1 x15851 -1 x16000 -1 x16149 -1 x16298 -1 x16447 -1 x16596 -1 x16745 -1 x16894 -1 x17043 -1 x17192 -1 x17341 -1 x17490 -1 x17639 -1 x17788 -1 x17937 -1 x18086 -1 x18235 -1 x18384 -1 x18533 -1 x18682 -1 x18831 -1 x18980 -1 x19129 -1 x19278 -1 x19427 -1 x19576 -1 x19725 -1 x19874 -1 x20023 -1 x20172 -1 x20321 -1 x20470 -1 x20619 -1 x20768 -1 x20917 -1 x21066 -1 x21215 -1 x21364 -1 x21513 -1 x21662 -1 x21811 -1 x21960 -1 x22109 -1 x22258 >= -1;+-1 x58 -1 x207 -1 x356 -1 x505 -1 x654 -1 x803 -1 x952 -1 x1101 -1 x1250 -1 x1399 -1 x1548 -1 x1697 -1 x1846 -1 x1995 -1 x2144 -1 x2293 -1 x2442 -1 x2591 -1 x2740 -1 x2889 -1 x3038 -1 x3187 -1 x3336 -1 x3485 -1 x3634 -1 x3783 -1 x3932 -1 x4081 -1 x4230 -1 x4379 -1 x4528 -1 x4677 -1 x4826 -1 x4975 -1 x5124 -1 x5273 -1 x5422 -1 x5571 -1 x5720 -1 x5869 -1 x6018 -1 x6167 -1 x6316 -1 x6465 -1 x6614 -1 x6763 -1 x6912 -1 x7061 -1 x7210 -1 x7359 -1 x7508 -1 x7657 -1 x7806 -1 x7955 -1 x8104 -1 x8253 -1 x8402 -1 x8551 -1 x8700 -1 x8849 -1 x8998 -1 x9147 -1 x9296 -1 x9445 -1 x9594 -1 x9743 -1 x9892 -1 x10041 -1 x10190 -1 x10339 -1 x10488 -1 x10637 -1 x10786 -1 x10935 -1 x11084 -1 x11233 -1 x11382 -1 x11531 -1 x11680 -1 x11829 -1 x11978 -1 x12127 -1 x12276 -1 x12425 -1 x12574 -1 x12723 -1 x12872 -1 x13021 -1 x13170 -1 x13319 -1 x13468 -1 x13617 -1 x13766 -1 x13915 -1 x14064 -1 x14213 -1 x14362 -1 x14511 -1 x14660 -1 x14809 -1 x14958 -1 x15107 -1 x15256 -1 x15405 -1 x15554 -1 x15703 -1 x15852 -1 x16001 -1 x16150 -1 x16299 -1 x16448 -1 x16597 -1 x16746 -1 x16895 -1 x17044 -1 x17193 -1 x17342 -1 x17491 -1 x17640 -1 x17789 -1 x17938 -1 x18087 -1 x18236 -1 x18385 -1 x18534 -1 x18683 -1 x18832 -1 x18981 -1 x19130 -1 x19279 -1 x19428 -1 x19577 -1 x19726 -1 x19875 -1 x20024 -1 x20173 -1 x20322 -1 x20471 -1 x20620 -1 x20769 -1 x20918 -1 x21067 -1 x21216 -1 x21365 -1 x21514 -1 x21663 -1 x21812 -1 x21961 -1 x22110 -1 x22259 >= -1;+-1 x59 -1 x208 -1 x357 -1 x506 -1 x655 -1 x804 -1 x953 -1 x1102 -1 x1251 -1 x1400 -1 x1549 -1 x1698 -1 x1847 -1 x1996 -1 x2145 -1 x2294 -1 x2443 -1 x2592 -1 x2741 -1 x2890 -1 x3039 -1 x3188 -1 x3337 -1 x3486 -1 x3635 -1 x3784 -1 x3933 -1 x4082 -1 x4231 -1 x4380 -1 x4529 -1 x4678 -1 x4827 -1 x4976 -1 x5125 -1 x5274 -1 x5423 -1 x5572 -1 x5721 -1 x5870 -1 x6019 -1 x6168 -1 x6317 -1 x6466 -1 x6615 -1 x6764 -1 x6913 -1 x7062 -1 x7211 -1 x7360 -1 x7509 -1 x7658 -1 x7807 -1 x7956 -1 x8105 -1 x8254 -1 x8403 -1 x8552 -1 x8701 -1 x8850 -1 x8999 -1 x9148 -1 x9297 -1 x9446 -1 x9595 -1 x9744 -1 x9893 -1 x10042 -1 x10191 -1 x10340 -1 x10489 -1 x10638 -1 x10787 -1 x10936 -1 x11085 -1 x11234 -1 x11383 -1 x11532 -1 x11681 -1 x11830 -1 x11979 -1 x12128 -1 x12277 -1 x12426 -1 x12575 -1 x12724 -1 x12873 -1 x13022 -1 x13171 -1 x13320 -1 x13469 -1 x13618 -1 x13767 -1 x13916 -1 x14065 -1 x14214 -1 x14363 -1 x14512 -1 x14661 -1 x14810 -1 x14959 -1 x15108 -1 x15257 -1 x15406 -1 x15555 -1 x15704 -1 x15853 -1 x16002 -1 x16151 -1 x16300 -1 x16449 -1 x16598 -1 x16747 -1 x16896 -1 x17045 -1 x17194 -1 x17343 -1 x17492 -1 x17641 -1 x17790 -1 x17939 -1 x18088 -1 x18237 -1 x18386 -1 x18535 -1 x18684 -1 x18833 -1 x18982 -1 x19131 -1 x19280 -1 x19429 -1 x19578 -1 x19727 -1 x19876 -1 x20025 -1 x20174 -1 x20323 -1 x20472 -1 x20621 -1 x20770 -1 x20919 -1 x21068 -1 x21217 -1 x21366 -1 x21515 -1 x21664 -1 x21813 -1 x21962 -1 x22111 -1 x22260 >= -1;+-1 x60 -1 x209 -1 x358 -1 x507 -1 x656 -1 x805 -1 x954 -1 x1103 -1 x1252 -1 x1401 -1 x1550 -1 x1699 -1 x1848 -1 x1997 -1 x2146 -1 x2295 -1 x2444 -1 x2593 -1 x2742 -1 x2891 -1 x3040 -1 x3189 -1 x3338 -1 x3487 -1 x3636 -1 x3785 -1 x3934 -1 x4083 -1 x4232 -1 x4381 -1 x4530 -1 x4679 -1 x4828 -1 x4977 -1 x5126 -1 x5275 -1 x5424 -1 x5573 -1 x5722 -1 x5871 -1 x6020 -1 x6169 -1 x6318 -1 x6467 -1 x6616 -1 x6765 -1 x6914 -1 x7063 -1 x7212 -1 x7361 -1 x7510 -1 x7659 -1 x7808 -1 x7957 -1 x8106 -1 x8255 -1 x8404 -1 x8553 -1 x8702 -1 x8851 -1 x9000 -1 x9149 -1 x9298 -1 x9447 -1 x9596 -1 x9745 -1 x9894 -1 x10043 -1 x10192 -1 x10341 -1 x10490 -1 x10639 -1 x10788 -1 x10937 -1 x11086 -1 x11235 -1 x11384 -1 x11533 -1 x11682 -1 x11831 -1 x11980 -1 x12129 -1 x12278 -1 x12427 -1 x12576 -1 x12725 -1 x12874 -1 x13023 -1 x13172 -1 x13321 -1 x13470 -1 x13619 -1 x13768 -1 x13917 -1 x14066 -1 x14215 -1 x14364 -1 x14513 -1 x14662 -1 x14811 -1 x14960 -1 x15109 -1 x15258 -1 x15407 -1 x15556 -1 x15705 -1 x15854 -1 x16003 -1 x16152 -1 x16301 -1 x16450 -1 x16599 -1 x16748 -1 x16897 -1 x17046 -1 x17195 -1 x17344 -1 x17493 -1 x17642 -1 x17791 -1 x17940 -1 x18089 -1 x18238 -1 x18387 -1 x18536 -1 x18685 -1 x18834 -1 x18983 -1 x19132 -1 x19281 -1 x19430 -1 x19579 -1 x19728 -1 x19877 -1 x20026 -1 x20175 -1 x20324 -1 x20473 -1 x20622 -1 x20771 -1 x20920 -1 x21069 -1 x21218 -1 x21367 -1 x21516 -1 x21665 -1 x21814 -1 x21963 -1 x22112 -1 x22261 >= -1;+-1 x61 -1 x210 -1 x359 -1 x508 -1 x657 -1 x806 -1 x955 -1 x1104 -1 x1253 -1 x1402 -1 x1551 -1 x1700 -1 x1849 -1 x1998 -1 x2147 -1 x2296 -1 x2445 -1 x2594 -1 x2743 -1 x2892 -1 x3041 -1 x3190 -1 x3339 -1 x3488 -1 x3637 -1 x3786 -1 x3935 -1 x4084 -1 x4233 -1 x4382 -1 x4531 -1 x4680 -1 x4829 -1 x4978 -1 x5127 -1 x5276 -1 x5425 -1 x5574 -1 x5723 -1 x5872 -1 x6021 -1 x6170 -1 x6319 -1 x6468 -1 x6617 -1 x6766 -1 x6915 -1 x7064 -1 x7213 -1 x7362 -1 x7511 -1 x7660 -1 x7809 -1 x7958 -1 x8107 -1 x8256 -1 x8405 -1 x8554 -1 x8703 -1 x8852 -1 x9001 -1 x9150 -1 x9299 -1 x9448 -1 x9597 -1 x9746 -1 x9895 -1 x10044 -1 x10193 -1 x10342 -1 x10491 -1 x10640 -1 x10789 -1 x10938 -1 x11087 -1 x11236 -1 x11385 -1 x11534 -1 x11683 -1 x11832 -1 x11981 -1 x12130 -1 x12279 -1 x12428 -1 x12577 -1 x12726 -1 x12875 -1 x13024 -1 x13173 -1 x13322 -1 x13471 -1 x13620 -1 x13769 -1 x13918 -1 x14067 -1 x14216 -1 x14365 -1 x14514 -1 x14663 -1 x14812 -1 x14961 -1 x15110 -1 x15259 -1 x15408 -1 x15557 -1 x15706 -1 x15855 -1 x16004 -1 x16153 -1 x16302 -1 x16451 -1 x16600 -1 x16749 -1 x16898 -1 x17047 -1 x17196 -1 x17345 -1 x17494 -1 x17643 -1 x17792 -1 x17941 -1 x18090 -1 x18239 -1 x18388 -1 x18537 -1 x18686 -1 x18835 -1 x18984 -1 x19133 -1 x19282 -1 x19431 -1 x19580 -1 x19729 -1 x19878 -1 x20027 -1 x20176 -1 x20325 -1 x20474 -1 x20623 -1 x20772 -1 x20921 -1 x21070 -1 x21219 -1 x21368 -1 x21517 -1 x21666 -1 x21815 -1 x21964 -1 x22113 -1 x22262 >= -1;+-1 x62 -1 x211 -1 x360 -1 x509 -1 x658 -1 x807 -1 x956 -1 x1105 -1 x1254 -1 x1403 -1 x1552 -1 x1701 -1 x1850 -1 x1999 -1 x2148 -1 x2297 -1 x2446 -1 x2595 -1 x2744 -1 x2893 -1 x3042 -1 x3191 -1 x3340 -1 x3489 -1 x3638 -1 x3787 -1 x3936 -1 x4085 -1 x4234 -1 x4383 -1 x4532 -1 x4681 -1 x4830 -1 x4979 -1 x5128 -1 x5277 -1 x5426 -1 x5575 -1 x5724 -1 x5873 -1 x6022 -1 x6171 -1 x6320 -1 x6469 -1 x6618 -1 x6767 -1 x6916 -1 x7065 -1 x7214 -1 x7363 -1 x7512 -1 x7661 -1 x7810 -1 x7959 -1 x8108 -1 x8257 -1 x8406 -1 x8555 -1 x8704 -1 x8853 -1 x9002 -1 x9151 -1 x9300 -1 x9449 -1 x9598 -1 x9747 -1 x9896 -1 x10045 -1 x10194 -1 x10343 -1 x10492 -1 x10641 -1 x10790 -1 x10939 -1 x11088 -1 x11237 -1 x11386 -1 x11535 -1 x11684 -1 x11833 -1 x11982 -1 x12131 -1 x12280 -1 x12429 -1 x12578 -1 x12727 -1 x12876 -1 x13025 -1 x13174 -1 x13323 -1 x13472 -1 x13621 -1 x13770 -1 x13919 -1 x14068 -1 x14217 -1 x14366 -1 x14515 -1 x14664 -1 x14813 -1 x14962 -1 x15111 -1 x15260 -1 x15409 -1 x15558 -1 x15707 -1 x15856 -1 x16005 -1 x16154 -1 x16303 -1 x16452 -1 x16601 -1 x16750 -1 x16899 -1 x17048 -1 x17197 -1 x17346 -1 x17495 -1 x17644 -1 x17793 -1 x17942 -1 x18091 -1 x18240 -1 x18389 -1 x18538 -1 x18687 -1 x18836 -1 x18985 -1 x19134 -1 x19283 -1 x19432 -1 x19581 -1 x19730 -1 x19879 -1 x20028 -1 x20177 -1 x20326 -1 x20475 -1 x20624 -1 x20773 -1 x20922 -1 x21071 -1 x21220 -1 x21369 -1 x21518 -1 x21667 -1 x21816 -1 x21965 -1 x22114 -1 x22263 >= -1;+-1 x63 -1 x212 -1 x361 -1 x510 -1 x659 -1 x808 -1 x957 -1 x1106 -1 x1255 -1 x1404 -1 x1553 -1 x1702 -1 x1851 -1 x2000 -1 x2149 -1 x2298 -1 x2447 -1 x2596 -1 x2745 -1 x2894 -1 x3043 -1 x3192 -1 x3341 -1 x3490 -1 x3639 -1 x3788 -1 x3937 -1 x4086 -1 x4235 -1 x4384 -1 x4533 -1 x4682 -1 x4831 -1 x4980 -1 x5129 -1 x5278 -1 x5427 -1 x5576 -1 x5725 -1 x5874 -1 x6023 -1 x6172 -1 x6321 -1 x6470 -1 x6619 -1 x6768 -1 x6917 -1 x7066 -1 x7215 -1 x7364 -1 x7513 -1 x7662 -1 x7811 -1 x7960 -1 x8109 -1 x8258 -1 x8407 -1 x8556 -1 x8705 -1 x8854 -1 x9003 -1 x9152 -1 x9301 -1 x9450 -1 x9599 -1 x9748 -1 x9897 -1 x10046 -1 x10195 -1 x10344 -1 x10493 -1 x10642 -1 x10791 -1 x10940 -1 x11089 -1 x11238 -1 x11387 -1 x11536 -1 x11685 -1 x11834 -1 x11983 -1 x12132 -1 x12281 -1 x12430 -1 x12579 -1 x12728 -1 x12877 -1 x13026 -1 x13175 -1 x13324 -1 x13473 -1 x13622 -1 x13771 -1 x13920 -1 x14069 -1 x14218 -1 x14367 -1 x14516 -1 x14665 -1 x14814 -1 x14963 -1 x15112 -1 x15261 -1 x15410 -1 x15559 -1 x15708 -1 x15857 -1 x16006 -1 x16155 -1 x16304 -1 x16453 -1 x16602 -1 x16751 -1 x16900 -1 x17049 -1 x17198 -1 x17347 -1 x17496 -1 x17645 -1 x17794 -1 x17943 -1 x18092 -1 x18241 -1 x18390 -1 x18539 -1 x18688 -1 x18837 -1 x18986 -1 x19135 -1 x19284 -1 x19433 -1 x19582 -1 x19731 -1 x19880 -1 x20029 -1 x20178 -1 x20327 -1 x20476 -1 x20625 -1 x20774 -1 x20923 -1 x21072 -1 x21221 -1 x21370 -1 x21519 -1 x21668 -1 x21817 -1 x21966 -1 x22115 -1 x22264 >= -1;+-1 x64 -1 x213 -1 x362 -1 x511 -1 x660 -1 x809 -1 x958 -1 x1107 -1 x1256 -1 x1405 -1 x1554 -1 x1703 -1 x1852 -1 x2001 -1 x2150 -1 x2299 -1 x2448 -1 x2597 -1 x2746 -1 x2895 -1 x3044 -1 x3193 -1 x3342 -1 x3491 -1 x3640 -1 x3789 -1 x3938 -1 x4087 -1 x4236 -1 x4385 -1 x4534 -1 x4683 -1 x4832 -1 x4981 -1 x5130 -1 x5279 -1 x5428 -1 x5577 -1 x5726 -1 x5875 -1 x6024 -1 x6173 -1 x6322 -1 x6471 -1 x6620 -1 x6769 -1 x6918 -1 x7067 -1 x7216 -1 x7365 -1 x7514 -1 x7663 -1 x7812 -1 x7961 -1 x8110 -1 x8259 -1 x8408 -1 x8557 -1 x8706 -1 x8855 -1 x9004 -1 x9153 -1 x9302 -1 x9451 -1 x9600 -1 x9749 -1 x9898 -1 x10047 -1 x10196 -1 x10345 -1 x10494 -1 x10643 -1 x10792 -1 x10941 -1 x11090 -1 x11239 -1 x11388 -1 x11537 -1 x11686 -1 x11835 -1 x11984 -1 x12133 -1 x12282 -1 x12431 -1 x12580 -1 x12729 -1 x12878 -1 x13027 -1 x13176 -1 x13325 -1 x13474 -1 x13623 -1 x13772 -1 x13921 -1 x14070 -1 x14219 -1 x14368 -1 x14517 -1 x14666 -1 x14815 -1 x14964 -1 x15113 -1 x15262 -1 x15411 -1 x15560 -1 x15709 -1 x15858 -1 x16007 -1 x16156 -1 x16305 -1 x16454 -1 x16603 -1 x16752 -1 x16901 -1 x17050 -1 x17199 -1 x17348 -1 x17497 -1 x17646 -1 x17795 -1 x17944 -1 x18093 -1 x18242 -1 x18391 -1 x18540 -1 x18689 -1 x18838 -1 x18987 -1 x19136 -1 x19285 -1 x19434 -1 x19583 -1 x19732 -1 x19881 -1 x20030 -1 x20179 -1 x20328 -1 x20477 -1 x20626 -1 x20775 -1 x20924 -1 x21073 -1 x21222 -1 x21371 -1 x21520 -1 x21669 -1 x21818 -1 x21967 -1 x22116 -1 x22265 >= -1;+-1 x65 -1 x214 -1 x363 -1 x512 -1 x661 -1 x810 -1 x959 -1 x1108 -1 x1257 -1 x1406 -1 x1555 -1 x1704 -1 x1853 -1 x2002 -1 x2151 -1 x2300 -1 x2449 -1 x2598 -1 x2747 -1 x2896 -1 x3045 -1 x3194 -1 x3343 -1 x3492 -1 x3641 -1 x3790 -1 x3939 -1 x4088 -1 x4237 -1 x4386 -1 x4535 -1 x4684 -1 x4833 -1 x4982 -1 x5131 -1 x5280 -1 x5429 -1 x5578 -1 x5727 -1 x5876 -1 x6025 -1 x6174 -1 x6323 -1 x6472 -1 x6621 -1 x6770 -1 x6919 -1 x7068 -1 x7217 -1 x7366 -1 x7515 -1 x7664 -1 x7813 -1 x7962 -1 x8111 -1 x8260 -1 x8409 -1 x8558 -1 x8707 -1 x8856 -1 x9005 -1 x9154 -1 x9303 -1 x9452 -1 x9601 -1 x9750 -1 x9899 -1 x10048 -1 x10197 -1 x10346 -1 x10495 -1 x10644 -1 x10793 -1 x10942 -1 x11091 -1 x11240 -1 x11389 -1 x11538 -1 x11687 -1 x11836 -1 x11985 -1 x12134 -1 x12283 -1 x12432 -1 x12581 -1 x12730 -1 x12879 -1 x13028 -1 x13177 -1 x13326 -1 x13475 -1 x13624 -1 x13773 -1 x13922 -1 x14071 -1 x14220 -1 x14369 -1 x14518 -1 x14667 -1 x14816 -1 x14965 -1 x15114 -1 x15263 -1 x15412 -1 x15561 -1 x15710 -1 x15859 -1 x16008 -1 x16157 -1 x16306 -1 x16455 -1 x16604 -1 x16753 -1 x16902 -1 x17051 -1 x17200 -1 x17349 -1 x17498 -1 x17647 -1 x17796 -1 x17945 -1 x18094 -1 x18243 -1 x18392 -1 x18541 -1 x18690 -1 x18839 -1 x18988 -1 x19137 -1 x19286 -1 x19435 -1 x19584 -1 x19733 -1 x19882 -1 x20031 -1 x20180 -1 x20329 -1 x20478 -1 x20627 -1 x20776 -1 x20925 -1 x21074 -1 x21223 -1 x21372 -1 x21521 -1 x21670 -1 x21819 -1 x21968 -1 x22117 -1 x22266 >= -1;+-1 x66 -1 x215 -1 x364 -1 x513 -1 x662 -1 x811 -1 x960 -1 x1109 -1 x1258 -1 x1407 -1 x1556 -1 x1705 -1 x1854 -1 x2003 -1 x2152 -1 x2301 -1 x2450 -1 x2599 -1 x2748 -1 x2897 -1 x3046 -1 x3195 -1 x3344 -1 x3493 -1 x3642 -1 x3791 -1 x3940 -1 x4089 -1 x4238 -1 x4387 -1 x4536 -1 x4685 -1 x4834 -1 x4983 -1 x5132 -1 x5281 -1 x5430 -1 x5579 -1 x5728 -1 x5877 -1 x6026 -1 x6175 -1 x6324 -1 x6473 -1 x6622 -1 x6771 -1 x6920 -1 x7069 -1 x7218 -1 x7367 -1 x7516 -1 x7665 -1 x7814 -1 x7963 -1 x8112 -1 x8261 -1 x8410 -1 x8559 -1 x8708 -1 x8857 -1 x9006 -1 x9155 -1 x9304 -1 x9453 -1 x9602 -1 x9751 -1 x9900 -1 x10049 -1 x10198 -1 x10347 -1 x10496 -1 x10645 -1 x10794 -1 x10943 -1 x11092 -1 x11241 -1 x11390 -1 x11539 -1 x11688 -1 x11837 -1 x11986 -1 x12135 -1 x12284 -1 x12433 -1 x12582 -1 x12731 -1 x12880 -1 x13029 -1 x13178 -1 x13327 -1 x13476 -1 x13625 -1 x13774 -1 x13923 -1 x14072 -1 x14221 -1 x14370 -1 x14519 -1 x14668 -1 x14817 -1 x14966 -1 x15115 -1 x15264 -1 x15413 -1 x15562 -1 x15711 -1 x15860 -1 x16009 -1 x16158 -1 x16307 -1 x16456 -1 x16605 -1 x16754 -1 x16903 -1 x17052 -1 x17201 -1 x17350 -1 x17499 -1 x17648 -1 x17797 -1 x17946 -1 x18095 -1 x18244 -1 x18393 -1 x18542 -1 x18691 -1 x18840 -1 x18989 -1 x19138 -1 x19287 -1 x19436 -1 x19585 -1 x19734 -1 x19883 -1 x20032 -1 x20181 -1 x20330 -1 x20479 -1 x20628 -1 x20777 -1 x20926 -1 x21075 -1 x21224 -1 x21373 -1 x21522 -1 x21671 -1 x21820 -1 x21969 -1 x22118 -1 x22267 >= -1;+-1 x67 -1 x216 -1 x365 -1 x514 -1 x663 -1 x812 -1 x961 -1 x1110 -1 x1259 -1 x1408 -1 x1557 -1 x1706 -1 x1855 -1 x2004 -1 x2153 -1 x2302 -1 x2451 -1 x2600 -1 x2749 -1 x2898 -1 x3047 -1 x3196 -1 x3345 -1 x3494 -1 x3643 -1 x3792 -1 x3941 -1 x4090 -1 x4239 -1 x4388 -1 x4537 -1 x4686 -1 x4835 -1 x4984 -1 x5133 -1 x5282 -1 x5431 -1 x5580 -1 x5729 -1 x5878 -1 x6027 -1 x6176 -1 x6325 -1 x6474 -1 x6623 -1 x6772 -1 x6921 -1 x7070 -1 x7219 -1 x7368 -1 x7517 -1 x7666 -1 x7815 -1 x7964 -1 x8113 -1 x8262 -1 x8411 -1 x8560 -1 x8709 -1 x8858 -1 x9007 -1 x9156 -1 x9305 -1 x9454 -1 x9603 -1 x9752 -1 x9901 -1 x10050 -1 x10199 -1 x10348 -1 x10497 -1 x10646 -1 x10795 -1 x10944 -1 x11093 -1 x11242 -1 x11391 -1 x11540 -1 x11689 -1 x11838 -1 x11987 -1 x12136 -1 x12285 -1 x12434 -1 x12583 -1 x12732 -1 x12881 -1 x13030 -1 x13179 -1 x13328 -1 x13477 -1 x13626 -1 x13775 -1 x13924 -1 x14073 -1 x14222 -1 x14371 -1 x14520 -1 x14669 -1 x14818 -1 x14967 -1 x15116 -1 x15265 -1 x15414 -1 x15563 -1 x15712 -1 x15861 -1 x16010 -1 x16159 -1 x16308 -1 x16457 -1 x16606 -1 x16755 -1 x16904 -1 x17053 -1 x17202 -1 x17351 -1 x17500 -1 x17649 -1 x17798 -1 x17947 -1 x18096 -1 x18245 -1 x18394 -1 x18543 -1 x18692 -1 x18841 -1 x18990 -1 x19139 -1 x19288 -1 x19437 -1 x19586 -1 x19735 -1 x19884 -1 x20033 -1 x20182 -1 x20331 -1 x20480 -1 x20629 -1 x20778 -1 x20927 -1 x21076 -1 x21225 -1 x21374 -1 x21523 -1 x21672 -1 x21821 -1 x21970 -1 x22119 -1 x22268 >= -1;+-1 x68 -1 x217 -1 x366 -1 x515 -1 x664 -1 x813 -1 x962 -1 x1111 -1 x1260 -1 x1409 -1 x1558 -1 x1707 -1 x1856 -1 x2005 -1 x2154 -1 x2303 -1 x2452 -1 x2601 -1 x2750 -1 x2899 -1 x3048 -1 x3197 -1 x3346 -1 x3495 -1 x3644 -1 x3793 -1 x3942 -1 x4091 -1 x4240 -1 x4389 -1 x4538 -1 x4687 -1 x4836 -1 x4985 -1 x5134 -1 x5283 -1 x5432 -1 x5581 -1 x5730 -1 x5879 -1 x6028 -1 x6177 -1 x6326 -1 x6475 -1 x6624 -1 x6773 -1 x6922 -1 x7071 -1 x7220 -1 x7369 -1 x7518 -1 x7667 -1 x7816 -1 x7965 -1 x8114 -1 x8263 -1 x8412 -1 x8561 -1 x8710 -1 x8859 -1 x9008 -1 x9157 -1 x9306 -1 x9455 -1 x9604 -1 x9753 -1 x9902 -1 x10051 -1 x10200 -1 x10349 -1 x10498 -1 x10647 -1 x10796 -1 x10945 -1 x11094 -1 x11243 -1 x11392 -1 x11541 -1 x11690 -1 x11839 -1 x11988 -1 x12137 -1 x12286 -1 x12435 -1 x12584 -1 x12733 -1 x12882 -1 x13031 -1 x13180 -1 x13329 -1 x13478 -1 x13627 -1 x13776 -1 x13925 -1 x14074 -1 x14223 -1 x14372 -1 x14521 -1 x14670 -1 x14819 -1 x14968 -1 x15117 -1 x15266 -1 x15415 -1 x15564 -1 x15713 -1 x15862 -1 x16011 -1 x16160 -1 x16309 -1 x16458 -1 x16607 -1 x16756 -1 x16905 -1 x17054 -1 x17203 -1 x17352 -1 x17501 -1 x17650 -1 x17799 -1 x17948 -1 x18097 -1 x18246 -1 x18395 -1 x18544 -1 x18693 -1 x18842 -1 x18991 -1 x19140 -1 x19289 -1 x19438 -1 x19587 -1 x19736 -1 x19885 -1 x20034 -1 x20183 -1 x20332 -1 x20481 -1 x20630 -1 x20779 -1 x20928 -1 x21077 -1 x21226 -1 x21375 -1 x21524 -1 x21673 -1 x21822 -1 x21971 -1 x22120 -1 x22269 >= -1;+-1 x69 -1 x218 -1 x367 -1 x516 -1 x665 -1 x814 -1 x963 -1 x1112 -1 x1261 -1 x1410 -1 x1559 -1 x1708 -1 x1857 -1 x2006 -1 x2155 -1 x2304 -1 x2453 -1 x2602 -1 x2751 -1 x2900 -1 x3049 -1 x3198 -1 x3347 -1 x3496 -1 x3645 -1 x3794 -1 x3943 -1 x4092 -1 x4241 -1 x4390 -1 x4539 -1 x4688 -1 x4837 -1 x4986 -1 x5135 -1 x5284 -1 x5433 -1 x5582 -1 x5731 -1 x5880 -1 x6029 -1 x6178 -1 x6327 -1 x6476 -1 x6625 -1 x6774 -1 x6923 -1 x7072 -1 x7221 -1 x7370 -1 x7519 -1 x7668 -1 x7817 -1 x7966 -1 x8115 -1 x8264 -1 x8413 -1 x8562 -1 x8711 -1 x8860 -1 x9009 -1 x9158 -1 x9307 -1 x9456 -1 x9605 -1 x9754 -1 x9903 -1 x10052 -1 x10201 -1 x10350 -1 x10499 -1 x10648 -1 x10797 -1 x10946 -1 x11095 -1 x11244 -1 x11393 -1 x11542 -1 x11691 -1 x11840 -1 x11989 -1 x12138 -1 x12287 -1 x12436 -1 x12585 -1 x12734 -1 x12883 -1 x13032 -1 x13181 -1 x13330 -1 x13479 -1 x13628 -1 x13777 -1 x13926 -1 x14075 -1 x14224 -1 x14373 -1 x14522 -1 x14671 -1 x14820 -1 x14969 -1 x15118 -1 x15267 -1 x15416 -1 x15565 -1 x15714 -1 x15863 -1 x16012 -1 x16161 -1 x16310 -1 x16459 -1 x16608 -1 x16757 -1 x16906 -1 x17055 -1 x17204 -1 x17353 -1 x17502 -1 x17651 -1 x17800 -1 x17949 -1 x18098 -1 x18247 -1 x18396 -1 x18545 -1 x18694 -1 x18843 -1 x18992 -1 x19141 -1 x19290 -1 x19439 -1 x19588 -1 x19737 -1 x19886 -1 x20035 -1 x20184 -1 x20333 -1 x20482 -1 x20631 -1 x20780 -1 x20929 -1 x21078 -1 x21227 -1 x21376 -1 x21525 -1 x21674 -1 x21823 -1 x21972 -1 x22121 -1 x22270 >= -1;+-1 x70 -1 x219 -1 x368 -1 x517 -1 x666 -1 x815 -1 x964 -1 x1113 -1 x1262 -1 x1411 -1 x1560 -1 x1709 -1 x1858 -1 x2007 -1 x2156 -1 x2305 -1 x2454 -1 x2603 -1 x2752 -1 x2901 -1 x3050 -1 x3199 -1 x3348 -1 x3497 -1 x3646 -1 x3795 -1 x3944 -1 x4093 -1 x4242 -1 x4391 -1 x4540 -1 x4689 -1 x4838 -1 x4987 -1 x5136 -1 x5285 -1 x5434 -1 x5583 -1 x5732 -1 x5881 -1 x6030 -1 x6179 -1 x6328 -1 x6477 -1 x6626 -1 x6775 -1 x6924 -1 x7073 -1 x7222 -1 x7371 -1 x7520 -1 x7669 -1 x7818 -1 x7967 -1 x8116 -1 x8265 -1 x8414 -1 x8563 -1 x8712 -1 x8861 -1 x9010 -1 x9159 -1 x9308 -1 x9457 -1 x9606 -1 x9755 -1 x9904 -1 x10053 -1 x10202 -1 x10351 -1 x10500 -1 x10649 -1 x10798 -1 x10947 -1 x11096 -1 x11245 -1 x11394 -1 x11543 -1 x11692 -1 x11841 -1 x11990 -1 x12139 -1 x12288 -1 x12437 -1 x12586 -1 x12735 -1 x12884 -1 x13033 -1 x13182 -1 x13331 -1 x13480 -1 x13629 -1 x13778 -1 x13927 -1 x14076 -1 x14225 -1 x14374 -1 x14523 -1 x14672 -1 x14821 -1 x14970 -1 x15119 -1 x15268 -1 x15417 -1 x15566 -1 x15715 -1 x15864 -1 x16013 -1 x16162 -1 x16311 -1 x16460 -1 x16609 -1 x16758 -1 x16907 -1 x17056 -1 x17205 -1 x17354 -1 x17503 -1 x17652 -1 x17801 -1 x17950 -1 x18099 -1 x18248 -1 x18397 -1 x18546 -1 x18695 -1 x18844 -1 x18993 -1 x19142 -1 x19291 -1 x19440 -1 x19589 -1 x19738 -1 x19887 -1 x20036 -1 x20185 -1 x20334 -1 x20483 -1 x20632 -1 x20781 -1 x20930 -1 x21079 -1 x21228 -1 x21377 -1 x21526 -1 x21675 -1 x21824 -1 x21973 -1 x22122 -1 x22271 >= -1;+-1 x71 -1 x220 -1 x369 -1 x518 -1 x667 -1 x816 -1 x965 -1 x1114 -1 x1263 -1 x1412 -1 x1561 -1 x1710 -1 x1859 -1 x2008 -1 x2157 -1 x2306 -1 x2455 -1 x2604 -1 x2753 -1 x2902 -1 x3051 -1 x3200 -1 x3349 -1 x3498 -1 x3647 -1 x3796 -1 x3945 -1 x4094 -1 x4243 -1 x4392 -1 x4541 -1 x4690 -1 x4839 -1 x4988 -1 x5137 -1 x5286 -1 x5435 -1 x5584 -1 x5733 -1 x5882 -1 x6031 -1 x6180 -1 x6329 -1 x6478 -1 x6627 -1 x6776 -1 x6925 -1 x7074 -1 x7223 -1 x7372 -1 x7521 -1 x7670 -1 x7819 -1 x7968 -1 x8117 -1 x8266 -1 x8415 -1 x8564 -1 x8713 -1 x8862 -1 x9011 -1 x9160 -1 x9309 -1 x9458 -1 x9607 -1 x9756 -1 x9905 -1 x10054 -1 x10203 -1 x10352 -1 x10501 -1 x10650 -1 x10799 -1 x10948 -1 x11097 -1 x11246 -1 x11395 -1 x11544 -1 x11693 -1 x11842 -1 x11991 -1 x12140 -1 x12289 -1 x12438 -1 x12587 -1 x12736 -1 x12885 -1 x13034 -1 x13183 -1 x13332 -1 x13481 -1 x13630 -1 x13779 -1 x13928 -1 x14077 -1 x14226 -1 x14375 -1 x14524 -1 x14673 -1 x14822 -1 x14971 -1 x15120 -1 x15269 -1 x15418 -1 x15567 -1 x15716 -1 x15865 -1 x16014 -1 x16163 -1 x16312 -1 x16461 -1 x16610 -1 x16759 -1 x16908 -1 x17057 -1 x17206 -1 x17355 -1 x17504 -1 x17653 -1 x17802 -1 x17951 -1 x18100 -1 x18249 -1 x18398 -1 x18547 -1 x18696 -1 x18845 -1 x18994 -1 x19143 -1 x19292 -1 x19441 -1 x19590 -1 x19739 -1 x19888 -1 x20037 -1 x20186 -1 x20335 -1 x20484 -1 x20633 -1 x20782 -1 x20931 -1 x21080 -1 x21229 -1 x21378 -1 x21527 -1 x21676 -1 x21825 -1 x21974 -1 x22123 -1 x22272 >= -1;+-1 x72 -1 x221 -1 x370 -1 x519 -1 x668 -1 x817 -1 x966 -1 x1115 -1 x1264 -1 x1413 -1 x1562 -1 x1711 -1 x1860 -1 x2009 -1 x2158 -1 x2307 -1 x2456 -1 x2605 -1 x2754 -1 x2903 -1 x3052 -1 x3201 -1 x3350 -1 x3499 -1 x3648 -1 x3797 -1 x3946 -1 x4095 -1 x4244 -1 x4393 -1 x4542 -1 x4691 -1 x4840 -1 x4989 -1 x5138 -1 x5287 -1 x5436 -1 x5585 -1 x5734 -1 x5883 -1 x6032 -1 x6181 -1 x6330 -1 x6479 -1 x6628 -1 x6777 -1 x6926 -1 x7075 -1 x7224 -1 x7373 -1 x7522 -1 x7671 -1 x7820 -1 x7969 -1 x8118 -1 x8267 -1 x8416 -1 x8565 -1 x8714 -1 x8863 -1 x9012 -1 x9161 -1 x9310 -1 x9459 -1 x9608 -1 x9757 -1 x9906 -1 x10055 -1 x10204 -1 x10353 -1 x10502 -1 x10651 -1 x10800 -1 x10949 -1 x11098 -1 x11247 -1 x11396 -1 x11545 -1 x11694 -1 x11843 -1 x11992 -1 x12141 -1 x12290 -1 x12439 -1 x12588 -1 x12737 -1 x12886 -1 x13035 -1 x13184 -1 x13333 -1 x13482 -1 x13631 -1 x13780 -1 x13929 -1 x14078 -1 x14227 -1 x14376 -1 x14525 -1 x14674 -1 x14823 -1 x14972 -1 x15121 -1 x15270 -1 x15419 -1 x15568 -1 x15717 -1 x15866 -1 x16015 -1 x16164 -1 x16313 -1 x16462 -1 x16611 -1 x16760 -1 x16909 -1 x17058 -1 x17207 -1 x17356 -1 x17505 -1 x17654 -1 x17803 -1 x17952 -1 x18101 -1 x18250 -1 x18399 -1 x18548 -1 x18697 -1 x18846 -1 x18995 -1 x19144 -1 x19293 -1 x19442 -1 x19591 -1 x19740 -1 x19889 -1 x20038 -1 x20187 -1 x20336 -1 x20485 -1 x20634 -1 x20783 -1 x20932 -1 x21081 -1 x21230 -1 x21379 -1 x21528 -1 x21677 -1 x21826 -1 x21975 -1 x22124 -1 x22273 >= -1;+-1 x73 -1 x222 -1 x371 -1 x520 -1 x669 -1 x818 -1 x967 -1 x1116 -1 x1265 -1 x1414 -1 x1563 -1 x1712 -1 x1861 -1 x2010 -1 x2159 -1 x2308 -1 x2457 -1 x2606 -1 x2755 -1 x2904 -1 x3053 -1 x3202 -1 x3351 -1 x3500 -1 x3649 -1 x3798 -1 x3947 -1 x4096 -1 x4245 -1 x4394 -1 x4543 -1 x4692 -1 x4841 -1 x4990 -1 x5139 -1 x5288 -1 x5437 -1 x5586 -1 x5735 -1 x5884 -1 x6033 -1 x6182 -1 x6331 -1 x6480 -1 x6629 -1 x6778 -1 x6927 -1 x7076 -1 x7225 -1 x7374 -1 x7523 -1 x7672 -1 x7821 -1 x7970 -1 x8119 -1 x8268 -1 x8417 -1 x8566 -1 x8715 -1 x8864 -1 x9013 -1 x9162 -1 x9311 -1 x9460 -1 x9609 -1 x9758 -1 x9907 -1 x10056 -1 x10205 -1 x10354 -1 x10503 -1 x10652 -1 x10801 -1 x10950 -1 x11099 -1 x11248 -1 x11397 -1 x11546 -1 x11695 -1 x11844 -1 x11993 -1 x12142 -1 x12291 -1 x12440 -1 x12589 -1 x12738 -1 x12887 -1 x13036 -1 x13185 -1 x13334 -1 x13483 -1 x13632 -1 x13781 -1 x13930 -1 x14079 -1 x14228 -1 x14377 -1 x14526 -1 x14675 -1 x14824 -1 x14973 -1 x15122 -1 x15271 -1 x15420 -1 x15569 -1 x15718 -1 x15867 -1 x16016 -1 x16165 -1 x16314 -1 x16463 -1 x16612 -1 x16761 -1 x16910 -1 x17059 -1 x17208 -1 x17357 -1 x17506 -1 x17655 -1 x17804 -1 x17953 -1 x18102 -1 x18251 -1 x18400 -1 x18549 -1 x18698 -1 x18847 -1 x18996 -1 x19145 -1 x19294 -1 x19443 -1 x19592 -1 x19741 -1 x19890 -1 x20039 -1 x20188 -1 x20337 -1 x20486 -1 x20635 -1 x20784 -1 x20933 -1 x21082 -1 x21231 -1 x21380 -1 x21529 -1 x21678 -1 x21827 -1 x21976 -1 x22125 -1 x22274 >= -1;+-1 x74 -1 x223 -1 x372 -1 x521 -1 x670 -1 x819 -1 x968 -1 x1117 -1 x1266 -1 x1415 -1 x1564 -1 x1713 -1 x1862 -1 x2011 -1 x2160 -1 x2309 -1 x2458 -1 x2607 -1 x2756 -1 x2905 -1 x3054 -1 x3203 -1 x3352 -1 x3501 -1 x3650 -1 x3799 -1 x3948 -1 x4097 -1 x4246 -1 x4395 -1 x4544 -1 x4693 -1 x4842 -1 x4991 -1 x5140 -1 x5289 -1 x5438 -1 x5587 -1 x5736 -1 x5885 -1 x6034 -1 x6183 -1 x6332 -1 x6481 -1 x6630 -1 x6779 -1 x6928 -1 x7077 -1 x7226 -1 x7375 -1 x7524 -1 x7673 -1 x7822 -1 x7971 -1 x8120 -1 x8269 -1 x8418 -1 x8567 -1 x8716 -1 x8865 -1 x9014 -1 x9163 -1 x9312 -1 x9461 -1 x9610 -1 x9759 -1 x9908 -1 x10057 -1 x10206 -1 x10355 -1 x10504 -1 x10653 -1 x10802 -1 x10951 -1 x11100 -1 x11249 -1 x11398 -1 x11547 -1 x11696 -1 x11845 -1 x11994 -1 x12143 -1 x12292 -1 x12441 -1 x12590 -1 x12739 -1 x12888 -1 x13037 -1 x13186 -1 x13335 -1 x13484 -1 x13633 -1 x13782 -1 x13931 -1 x14080 -1 x14229 -1 x14378 -1 x14527 -1 x14676 -1 x14825 -1 x14974 -1 x15123 -1 x15272 -1 x15421 -1 x15570 -1 x15719 -1 x15868 -1 x16017 -1 x16166 -1 x16315 -1 x16464 -1 x16613 -1 x16762 -1 x16911 -1 x17060 -1 x17209 -1 x17358 -1 x17507 -1 x17656 -1 x17805 -1 x17954 -1 x18103 -1 x18252 -1 x18401 -1 x18550 -1 x18699 -1 x18848 -1 x18997 -1 x19146 -1 x19295 -1 x19444 -1 x19593 -1 x19742 -1 x19891 -1 x20040 -1 x20189 -1 x20338 -1 x20487 -1 x20636 -1 x20785 -1 x20934 -1 x21083 -1 x21232 -1 x21381 -1 x21530 -1 x21679 -1 x21828 -1 x21977 -1 x22126 -1 x22275 >= -1;+-1 x75 -1 x224 -1 x373 -1 x522 -1 x671 -1 x820 -1 x969 -1 x1118 -1 x1267 -1 x1416 -1 x1565 -1 x1714 -1 x1863 -1 x2012 -1 x2161 -1 x2310 -1 x2459 -1 x2608 -1 x2757 -1 x2906 -1 x3055 -1 x3204 -1 x3353 -1 x3502 -1 x3651 -1 x3800 -1 x3949 -1 x4098 -1 x4247 -1 x4396 -1 x4545 -1 x4694 -1 x4843 -1 x4992 -1 x5141 -1 x5290 -1 x5439 -1 x5588 -1 x5737 -1 x5886 -1 x6035 -1 x6184 -1 x6333 -1 x6482 -1 x6631 -1 x6780 -1 x6929 -1 x7078 -1 x7227 -1 x7376 -1 x7525 -1 x7674 -1 x7823 -1 x7972 -1 x8121 -1 x8270 -1 x8419 -1 x8568 -1 x8717 -1 x8866 -1 x9015 -1 x9164 -1 x9313 -1 x9462 -1 x9611 -1 x9760 -1 x9909 -1 x10058 -1 x10207 -1 x10356 -1 x10505 -1 x10654 -1 x10803 -1 x10952 -1 x11101 -1 x11250 -1 x11399 -1 x11548 -1 x11697 -1 x11846 -1 x11995 -1 x12144 -1 x12293 -1 x12442 -1 x12591 -1 x12740 -1 x12889 -1 x13038 -1 x13187 -1 x13336 -1 x13485 -1 x13634 -1 x13783 -1 x13932 -1 x14081 -1 x14230 -1 x14379 -1 x14528 -1 x14677 -1 x14826 -1 x14975 -1 x15124 -1 x15273 -1 x15422 -1 x15571 -1 x15720 -1 x15869 -1 x16018 -1 x16167 -1 x16316 -1 x16465 -1 x16614 -1 x16763 -1 x16912 -1 x17061 -1 x17210 -1 x17359 -1 x17508 -1 x17657 -1 x17806 -1 x17955 -1 x18104 -1 x18253 -1 x18402 -1 x18551 -1 x18700 -1 x18849 -1 x18998 -1 x19147 -1 x19296 -1 x19445 -1 x19594 -1 x19743 -1 x19892 -1 x20041 -1 x20190 -1 x20339 -1 x20488 -1 x20637 -1 x20786 -1 x20935 -1 x21084 -1 x21233 -1 x21382 -1 x21531 -1 x21680 -1 x21829 -1 x21978 -1 x22127 -1 x22276 >= -1;+-1 x76 -1 x225 -1 x374 -1 x523 -1 x672 -1 x821 -1 x970 -1 x1119 -1 x1268 -1 x1417 -1 x1566 -1 x1715 -1 x1864 -1 x2013 -1 x2162 -1 x2311 -1 x2460 -1 x2609 -1 x2758 -1 x2907 -1 x3056 -1 x3205 -1 x3354 -1 x3503 -1 x3652 -1 x3801 -1 x3950 -1 x4099 -1 x4248 -1 x4397 -1 x4546 -1 x4695 -1 x4844 -1 x4993 -1 x5142 -1 x5291 -1 x5440 -1 x5589 -1 x5738 -1 x5887 -1 x6036 -1 x6185 -1 x6334 -1 x6483 -1 x6632 -1 x6781 -1 x6930 -1 x7079 -1 x7228 -1 x7377 -1 x7526 -1 x7675 -1 x7824 -1 x7973 -1 x8122 -1 x8271 -1 x8420 -1 x8569 -1 x8718 -1 x8867 -1 x9016 -1 x9165 -1 x9314 -1 x9463 -1 x9612 -1 x9761 -1 x9910 -1 x10059 -1 x10208 -1 x10357 -1 x10506 -1 x10655 -1 x10804 -1 x10953 -1 x11102 -1 x11251 -1 x11400 -1 x11549 -1 x11698 -1 x11847 -1 x11996 -1 x12145 -1 x12294 -1 x12443 -1 x12592 -1 x12741 -1 x12890 -1 x13039 -1 x13188 -1 x13337 -1 x13486 -1 x13635 -1 x13784 -1 x13933 -1 x14082 -1 x14231 -1 x14380 -1 x14529 -1 x14678 -1 x14827 -1 x14976 -1 x15125 -1 x15274 -1 x15423 -1 x15572 -1 x15721 -1 x15870 -1 x16019 -1 x16168 -1 x16317 -1 x16466 -1 x16615 -1 x16764 -1 x16913 -1 x17062 -1 x17211 -1 x17360 -1 x17509 -1 x17658 -1 x17807 -1 x17956 -1 x18105 -1 x18254 -1 x18403 -1 x18552 -1 x18701 -1 x18850 -1 x18999 -1 x19148 -1 x19297 -1 x19446 -1 x19595 -1 x19744 -1 x19893 -1 x20042 -1 x20191 -1 x20340 -1 x20489 -1 x20638 -1 x20787 -1 x20936 -1 x21085 -1 x21234 -1 x21383 -1 x21532 -1 x21681 -1 x21830 -1 x21979 -1 x22128 -1 x22277 >= -1;+-1 x77 -1 x226 -1 x375 -1 x524 -1 x673 -1 x822 -1 x971 -1 x1120 -1 x1269 -1 x1418 -1 x1567 -1 x1716 -1 x1865 -1 x2014 -1 x2163 -1 x2312 -1 x2461 -1 x2610 -1 x2759 -1 x2908 -1 x3057 -1 x3206 -1 x3355 -1 x3504 -1 x3653 -1 x3802 -1 x3951 -1 x4100 -1 x4249 -1 x4398 -1 x4547 -1 x4696 -1 x4845 -1 x4994 -1 x5143 -1 x5292 -1 x5441 -1 x5590 -1 x5739 -1 x5888 -1 x6037 -1 x6186 -1 x6335 -1 x6484 -1 x6633 -1 x6782 -1 x6931 -1 x7080 -1 x7229 -1 x7378 -1 x7527 -1 x7676 -1 x7825 -1 x7974 -1 x8123 -1 x8272 -1 x8421 -1 x8570 -1 x8719 -1 x8868 -1 x9017 -1 x9166 -1 x9315 -1 x9464 -1 x9613 -1 x9762 -1 x9911 -1 x10060 -1 x10209 -1 x10358 -1 x10507 -1 x10656 -1 x10805 -1 x10954 -1 x11103 -1 x11252 -1 x11401 -1 x11550 -1 x11699 -1 x11848 -1 x11997 -1 x12146 -1 x12295 -1 x12444 -1 x12593 -1 x12742 -1 x12891 -1 x13040 -1 x13189 -1 x13338 -1 x13487 -1 x13636 -1 x13785 -1 x13934 -1 x14083 -1 x14232 -1 x14381 -1 x14530 -1 x14679 -1 x14828 -1 x14977 -1 x15126 -1 x15275 -1 x15424 -1 x15573 -1 x15722 -1 x15871 -1 x16020 -1 x16169 -1 x16318 -1 x16467 -1 x16616 -1 x16765 -1 x16914 -1 x17063 -1 x17212 -1 x17361 -1 x17510 -1 x17659 -1 x17808 -1 x17957 -1 x18106 -1 x18255 -1 x18404 -1 x18553 -1 x18702 -1 x18851 -1 x19000 -1 x19149 -1 x19298 -1 x19447 -1 x19596 -1 x19745 -1 x19894 -1 x20043 -1 x20192 -1 x20341 -1 x20490 -1 x20639 -1 x20788 -1 x20937 -1 x21086 -1 x21235 -1 x21384 -1 x21533 -1 x21682 -1 x21831 -1 x21980 -1 x22129 -1 x22278 >= -1;+-1 x78 -1 x227 -1 x376 -1 x525 -1 x674 -1 x823 -1 x972 -1 x1121 -1 x1270 -1 x1419 -1 x1568 -1 x1717 -1 x1866 -1 x2015 -1 x2164 -1 x2313 -1 x2462 -1 x2611 -1 x2760 -1 x2909 -1 x3058 -1 x3207 -1 x3356 -1 x3505 -1 x3654 -1 x3803 -1 x3952 -1 x4101 -1 x4250 -1 x4399 -1 x4548 -1 x4697 -1 x4846 -1 x4995 -1 x5144 -1 x5293 -1 x5442 -1 x5591 -1 x5740 -1 x5889 -1 x6038 -1 x6187 -1 x6336 -1 x6485 -1 x6634 -1 x6783 -1 x6932 -1 x7081 -1 x7230 -1 x7379 -1 x7528 -1 x7677 -1 x7826 -1 x7975 -1 x8124 -1 x8273 -1 x8422 -1 x8571 -1 x8720 -1 x8869 -1 x9018 -1 x9167 -1 x9316 -1 x9465 -1 x9614 -1 x9763 -1 x9912 -1 x10061 -1 x10210 -1 x10359 -1 x10508 -1 x10657 -1 x10806 -1 x10955 -1 x11104 -1 x11253 -1 x11402 -1 x11551 -1 x11700 -1 x11849 -1 x11998 -1 x12147 -1 x12296 -1 x12445 -1 x12594 -1 x12743 -1 x12892 -1 x13041 -1 x13190 -1 x13339 -1 x13488 -1 x13637 -1 x13786 -1 x13935 -1 x14084 -1 x14233 -1 x14382 -1 x14531 -1 x14680 -1 x14829 -1 x14978 -1 x15127 -1 x15276 -1 x15425 -1 x15574 -1 x15723 -1 x15872 -1 x16021 -1 x16170 -1 x16319 -1 x16468 -1 x16617 -1 x16766 -1 x16915 -1 x17064 -1 x17213 -1 x17362 -1 x17511 -1 x17660 -1 x17809 -1 x17958 -1 x18107 -1 x18256 -1 x18405 -1 x18554 -1 x18703 -1 x18852 -1 x19001 -1 x19150 -1 x19299 -1 x19448 -1 x19597 -1 x19746 -1 x19895 -1 x20044 -1 x20193 -1 x20342 -1 x20491 -1 x20640 -1 x20789 -1 x20938 -1 x21087 -1 x21236 -1 x21385 -1 x21534 -1 x21683 -1 x21832 -1 x21981 -1 x22130 -1 x22279 >= -1;+-1 x79 -1 x228 -1 x377 -1 x526 -1 x675 -1 x824 -1 x973 -1 x1122 -1 x1271 -1 x1420 -1 x1569 -1 x1718 -1 x1867 -1 x2016 -1 x2165 -1 x2314 -1 x2463 -1 x2612 -1 x2761 -1 x2910 -1 x3059 -1 x3208 -1 x3357 -1 x3506 -1 x3655 -1 x3804 -1 x3953 -1 x4102 -1 x4251 -1 x4400 -1 x4549 -1 x4698 -1 x4847 -1 x4996 -1 x5145 -1 x5294 -1 x5443 -1 x5592 -1 x5741 -1 x5890 -1 x6039 -1 x6188 -1 x6337 -1 x6486 -1 x6635 -1 x6784 -1 x6933 -1 x7082 -1 x7231 -1 x7380 -1 x7529 -1 x7678 -1 x7827 -1 x7976 -1 x8125 -1 x8274 -1 x8423 -1 x8572 -1 x8721 -1 x8870 -1 x9019 -1 x9168 -1 x9317 -1 x9466 -1 x9615 -1 x9764 -1 x9913 -1 x10062 -1 x10211 -1 x10360 -1 x10509 -1 x10658 -1 x10807 -1 x10956 -1 x11105 -1 x11254 -1 x11403 -1 x11552 -1 x11701 -1 x11850 -1 x11999 -1 x12148 -1 x12297 -1 x12446 -1 x12595 -1 x12744 -1 x12893 -1 x13042 -1 x13191 -1 x13340 -1 x13489 -1 x13638 -1 x13787 -1 x13936 -1 x14085 -1 x14234 -1 x14383 -1 x14532 -1 x14681 -1 x14830 -1 x14979 -1 x15128 -1 x15277 -1 x15426 -1 x15575 -1 x15724 -1 x15873 -1 x16022 -1 x16171 -1 x16320 -1 x16469 -1 x16618 -1 x16767 -1 x16916 -1 x17065 -1 x17214 -1 x17363 -1 x17512 -1 x17661 -1 x17810 -1 x17959 -1 x18108 -1 x18257 -1 x18406 -1 x18555 -1 x18704 -1 x18853 -1 x19002 -1 x19151 -1 x19300 -1 x19449 -1 x19598 -1 x19747 -1 x19896 -1 x20045 -1 x20194 -1 x20343 -1 x20492 -1 x20641 -1 x20790 -1 x20939 -1 x21088 -1 x21237 -1 x21386 -1 x21535 -1 x21684 -1 x21833 -1 x21982 -1 x22131 -1 x22280 >= -1;+-1 x80 -1 x229 -1 x378 -1 x527 -1 x676 -1 x825 -1 x974 -1 x1123 -1 x1272 -1 x1421 -1 x1570 -1 x1719 -1 x1868 -1 x2017 -1 x2166 -1 x2315 -1 x2464 -1 x2613 -1 x2762 -1 x2911 -1 x3060 -1 x3209 -1 x3358 -1 x3507 -1 x3656 -1 x3805 -1 x3954 -1 x4103 -1 x4252 -1 x4401 -1 x4550 -1 x4699 -1 x4848 -1 x4997 -1 x5146 -1 x5295 -1 x5444 -1 x5593 -1 x5742 -1 x5891 -1 x6040 -1 x6189 -1 x6338 -1 x6487 -1 x6636 -1 x6785 -1 x6934 -1 x7083 -1 x7232 -1 x7381 -1 x7530 -1 x7679 -1 x7828 -1 x7977 -1 x8126 -1 x8275 -1 x8424 -1 x8573 -1 x8722 -1 x8871 -1 x9020 -1 x9169 -1 x9318 -1 x9467 -1 x9616 -1 x9765 -1 x9914 -1 x10063 -1 x10212 -1 x10361 -1 x10510 -1 x10659 -1 x10808 -1 x10957 -1 x11106 -1 x11255 -1 x11404 -1 x11553 -1 x11702 -1 x11851 -1 x12000 -1 x12149 -1 x12298 -1 x12447 -1 x12596 -1 x12745 -1 x12894 -1 x13043 -1 x13192 -1 x13341 -1 x13490 -1 x13639 -1 x13788 -1 x13937 -1 x14086 -1 x14235 -1 x14384 -1 x14533 -1 x14682 -1 x14831 -1 x14980 -1 x15129 -1 x15278 -1 x15427 -1 x15576 -1 x15725 -1 x15874 -1 x16023 -1 x16172 -1 x16321 -1 x16470 -1 x16619 -1 x16768 -1 x16917 -1 x17066 -1 x17215 -1 x17364 -1 x17513 -1 x17662 -1 x17811 -1 x17960 -1 x18109 -1 x18258 -1 x18407 -1 x18556 -1 x18705 -1 x18854 -1 x19003 -1 x19152 -1 x19301 -1 x19450 -1 x19599 -1 x19748 -1 x19897 -1 x20046 -1 x20195 -1 x20344 -1 x20493 -1 x20642 -1 x20791 -1 x20940 -1 x21089 -1 x21238 -1 x21387 -1 x21536 -1 x21685 -1 x21834 -1 x21983 -1 x22132 -1 x22281 >= -1;+-1 x81 -1 x230 -1 x379 -1 x528 -1 x677 -1 x826 -1 x975 -1 x1124 -1 x1273 -1 x1422 -1 x1571 -1 x1720 -1 x1869 -1 x2018 -1 x2167 -1 x2316 -1 x2465 -1 x2614 -1 x2763 -1 x2912 -1 x3061 -1 x3210 -1 x3359 -1 x3508 -1 x3657 -1 x3806 -1 x3955 -1 x4104 -1 x4253 -1 x4402 -1 x4551 -1 x4700 -1 x4849 -1 x4998 -1 x5147 -1 x5296 -1 x5445 -1 x5594 -1 x5743 -1 x5892 -1 x6041 -1 x6190 -1 x6339 -1 x6488 -1 x6637 -1 x6786 -1 x6935 -1 x7084 -1 x7233 -1 x7382 -1 x7531 -1 x7680 -1 x7829 -1 x7978 -1 x8127 -1 x8276 -1 x8425 -1 x8574 -1 x8723 -1 x8872 -1 x9021 -1 x9170 -1 x9319 -1 x9468 -1 x9617 -1 x9766 -1 x9915 -1 x10064 -1 x10213 -1 x10362 -1 x10511 -1 x10660 -1 x10809 -1 x10958 -1 x11107 -1 x11256 -1 x11405 -1 x11554 -1 x11703 -1 x11852 -1 x12001 -1 x12150 -1 x12299 -1 x12448 -1 x12597 -1 x12746 -1 x12895 -1 x13044 -1 x13193 -1 x13342 -1 x13491 -1 x13640 -1 x13789 -1 x13938 -1 x14087 -1 x14236 -1 x14385 -1 x14534 -1 x14683 -1 x14832 -1 x14981 -1 x15130 -1 x15279 -1 x15428 -1 x15577 -1 x15726 -1 x15875 -1 x16024 -1 x16173 -1 x16322 -1 x16471 -1 x16620 -1 x16769 -1 x16918 -1 x17067 -1 x17216 -1 x17365 -1 x17514 -1 x17663 -1 x17812 -1 x17961 -1 x18110 -1 x18259 -1 x18408 -1 x18557 -1 x18706 -1 x18855 -1 x19004 -1 x19153 -1 x19302 -1 x19451 -1 x19600 -1 x19749 -1 x19898 -1 x20047 -1 x20196 -1 x20345 -1 x20494 -1 x20643 -1 x20792 -1 x20941 -1 x21090 -1 x21239 -1 x21388 -1 x21537 -1 x21686 -1 x21835 -1 x21984 -1 x22133 -1 x22282 >= -1;+-1 x82 -1 x231 -1 x380 -1 x529 -1 x678 -1 x827 -1 x976 -1 x1125 -1 x1274 -1 x1423 -1 x1572 -1 x1721 -1 x1870 -1 x2019 -1 x2168 -1 x2317 -1 x2466 -1 x2615 -1 x2764 -1 x2913 -1 x3062 -1 x3211 -1 x3360 -1 x3509 -1 x3658 -1 x3807 -1 x3956 -1 x4105 -1 x4254 -1 x4403 -1 x4552 -1 x4701 -1 x4850 -1 x4999 -1 x5148 -1 x5297 -1 x5446 -1 x5595 -1 x5744 -1 x5893 -1 x6042 -1 x6191 -1 x6340 -1 x6489 -1 x6638 -1 x6787 -1 x6936 -1 x7085 -1 x7234 -1 x7383 -1 x7532 -1 x7681 -1 x7830 -1 x7979 -1 x8128 -1 x8277 -1 x8426 -1 x8575 -1 x8724 -1 x8873 -1 x9022 -1 x9171 -1 x9320 -1 x9469 -1 x9618 -1 x9767 -1 x9916 -1 x10065 -1 x10214 -1 x10363 -1 x10512 -1 x10661 -1 x10810 -1 x10959 -1 x11108 -1 x11257 -1 x11406 -1 x11555 -1 x11704 -1 x11853 -1 x12002 -1 x12151 -1 x12300 -1 x12449 -1 x12598 -1 x12747 -1 x12896 -1 x13045 -1 x13194 -1 x13343 -1 x13492 -1 x13641 -1 x13790 -1 x13939 -1 x14088 -1 x14237 -1 x14386 -1 x14535 -1 x14684 -1 x14833 -1 x14982 -1 x15131 -1 x15280 -1 x15429 -1 x15578 -1 x15727 -1 x15876 -1 x16025 -1 x16174 -1 x16323 -1 x16472 -1 x16621 -1 x16770 -1 x16919 -1 x17068 -1 x17217 -1 x17366 -1 x17515 -1 x17664 -1 x17813 -1 x17962 -1 x18111 -1 x18260 -1 x18409 -1 x18558 -1 x18707 -1 x18856 -1 x19005 -1 x19154 -1 x19303 -1 x19452 -1 x19601 -1 x19750 -1 x19899 -1 x20048 -1 x20197 -1 x20346 -1 x20495 -1 x20644 -1 x20793 -1 x20942 -1 x21091 -1 x21240 -1 x21389 -1 x21538 -1 x21687 -1 x21836 -1 x21985 -1 x22134 -1 x22283 >= -1;+-1 x83 -1 x232 -1 x381 -1 x530 -1 x679 -1 x828 -1 x977 -1 x1126 -1 x1275 -1 x1424 -1 x1573 -1 x1722 -1 x1871 -1 x2020 -1 x2169 -1 x2318 -1 x2467 -1 x2616 -1 x2765 -1 x2914 -1 x3063 -1 x3212 -1 x3361 -1 x3510 -1 x3659 -1 x3808 -1 x3957 -1 x4106 -1 x4255 -1 x4404 -1 x4553 -1 x4702 -1 x4851 -1 x5000 -1 x5149 -1 x5298 -1 x5447 -1 x5596 -1 x5745 -1 x5894 -1 x6043 -1 x6192 -1 x6341 -1 x6490 -1 x6639 -1 x6788 -1 x6937 -1 x7086 -1 x7235 -1 x7384 -1 x7533 -1 x7682 -1 x7831 -1 x7980 -1 x8129 -1 x8278 -1 x8427 -1 x8576 -1 x8725 -1 x8874 -1 x9023 -1 x9172 -1 x9321 -1 x9470 -1 x9619 -1 x9768 -1 x9917 -1 x10066 -1 x10215 -1 x10364 -1 x10513 -1 x10662 -1 x10811 -1 x10960 -1 x11109 -1 x11258 -1 x11407 -1 x11556 -1 x11705 -1 x11854 -1 x12003 -1 x12152 -1 x12301 -1 x12450 -1 x12599 -1 x12748 -1 x12897 -1 x13046 -1 x13195 -1 x13344 -1 x13493 -1 x13642 -1 x13791 -1 x13940 -1 x14089 -1 x14238 -1 x14387 -1 x14536 -1 x14685 -1 x14834 -1 x14983 -1 x15132 -1 x15281 -1 x15430 -1 x15579 -1 x15728 -1 x15877 -1 x16026 -1 x16175 -1 x16324 -1 x16473 -1 x16622 -1 x16771 -1 x16920 -1 x17069 -1 x17218 -1 x17367 -1 x17516 -1 x17665 -1 x17814 -1 x17963 -1 x18112 -1 x18261 -1 x18410 -1 x18559 -1 x18708 -1 x18857 -1 x19006 -1 x19155 -1 x19304 -1 x19453 -1 x19602 -1 x19751 -1 x19900 -1 x20049 -1 x20198 -1 x20347 -1 x20496 -1 x20645 -1 x20794 -1 x20943 -1 x21092 -1 x21241 -1 x21390 -1 x21539 -1 x21688 -1 x21837 -1 x21986 -1 x22135 -1 x22284 >= -1;+-1 x84 -1 x233 -1 x382 -1 x531 -1 x680 -1 x829 -1 x978 -1 x1127 -1 x1276 -1 x1425 -1 x1574 -1 x1723 -1 x1872 -1 x2021 -1 x2170 -1 x2319 -1 x2468 -1 x2617 -1 x2766 -1 x2915 -1 x3064 -1 x3213 -1 x3362 -1 x3511 -1 x3660 -1 x3809 -1 x3958 -1 x4107 -1 x4256 -1 x4405 -1 x4554 -1 x4703 -1 x4852 -1 x5001 -1 x5150 -1 x5299 -1 x5448 -1 x5597 -1 x5746 -1 x5895 -1 x6044 -1 x6193 -1 x6342 -1 x6491 -1 x6640 -1 x6789 -1 x6938 -1 x7087 -1 x7236 -1 x7385 -1 x7534 -1 x7683 -1 x7832 -1 x7981 -1 x8130 -1 x8279 -1 x8428 -1 x8577 -1 x8726 -1 x8875 -1 x9024 -1 x9173 -1 x9322 -1 x9471 -1 x9620 -1 x9769 -1 x9918 -1 x10067 -1 x10216 -1 x10365 -1 x10514 -1 x10663 -1 x10812 -1 x10961 -1 x11110 -1 x11259 -1 x11408 -1 x11557 -1 x11706 -1 x11855 -1 x12004 -1 x12153 -1 x12302 -1 x12451 -1 x12600 -1 x12749 -1 x12898 -1 x13047 -1 x13196 -1 x13345 -1 x13494 -1 x13643 -1 x13792 -1 x13941 -1 x14090 -1 x14239 -1 x14388 -1 x14537 -1 x14686 -1 x14835 -1 x14984 -1 x15133 -1 x15282 -1 x15431 -1 x15580 -1 x15729 -1 x15878 -1 x16027 -1 x16176 -1 x16325 -1 x16474 -1 x16623 -1 x16772 -1 x16921 -1 x17070 -1 x17219 -1 x17368 -1 x17517 -1 x17666 -1 x17815 -1 x17964 -1 x18113 -1 x18262 -1 x18411 -1 x18560 -1 x18709 -1 x18858 -1 x19007 -1 x19156 -1 x19305 -1 x19454 -1 x19603 -1 x19752 -1 x19901 -1 x20050 -1 x20199 -1 x20348 -1 x20497 -1 x20646 -1 x20795 -1 x20944 -1 x21093 -1 x21242 -1 x21391 -1 x21540 -1 x21689 -1 x21838 -1 x21987 -1 x22136 -1 x22285 >= -1;+-1 x85 -1 x234 -1 x383 -1 x532 -1 x681 -1 x830 -1 x979 -1 x1128 -1 x1277 -1 x1426 -1 x1575 -1 x1724 -1 x1873 -1 x2022 -1 x2171 -1 x2320 -1 x2469 -1 x2618 -1 x2767 -1 x2916 -1 x3065 -1 x3214 -1 x3363 -1 x3512 -1 x3661 -1 x3810 -1 x3959 -1 x4108 -1 x4257 -1 x4406 -1 x4555 -1 x4704 -1 x4853 -1 x5002 -1 x5151 -1 x5300 -1 x5449 -1 x5598 -1 x5747 -1 x5896 -1 x6045 -1 x6194 -1 x6343 -1 x6492 -1 x6641 -1 x6790 -1 x6939 -1 x7088 -1 x7237 -1 x7386 -1 x7535 -1 x7684 -1 x7833 -1 x7982 -1 x8131 -1 x8280 -1 x8429 -1 x8578 -1 x8727 -1 x8876 -1 x9025 -1 x9174 -1 x9323 -1 x9472 -1 x9621 -1 x9770 -1 x9919 -1 x10068 -1 x10217 -1 x10366 -1 x10515 -1 x10664 -1 x10813 -1 x10962 -1 x11111 -1 x11260 -1 x11409 -1 x11558 -1 x11707 -1 x11856 -1 x12005 -1 x12154 -1 x12303 -1 x12452 -1 x12601 -1 x12750 -1 x12899 -1 x13048 -1 x13197 -1 x13346 -1 x13495 -1 x13644 -1 x13793 -1 x13942 -1 x14091 -1 x14240 -1 x14389 -1 x14538 -1 x14687 -1 x14836 -1 x14985 -1 x15134 -1 x15283 -1 x15432 -1 x15581 -1 x15730 -1 x15879 -1 x16028 -1 x16177 -1 x16326 -1 x16475 -1 x16624 -1 x16773 -1 x16922 -1 x17071 -1 x17220 -1 x17369 -1 x17518 -1 x17667 -1 x17816 -1 x17965 -1 x18114 -1 x18263 -1 x18412 -1 x18561 -1 x18710 -1 x18859 -1 x19008 -1 x19157 -1 x19306 -1 x19455 -1 x19604 -1 x19753 -1 x19902 -1 x20051 -1 x20200 -1 x20349 -1 x20498 -1 x20647 -1 x20796 -1 x20945 -1 x21094 -1 x21243 -1 x21392 -1 x21541 -1 x21690 -1 x21839 -1 x21988 -1 x22137 -1 x22286 >= -1;+-1 x86 -1 x235 -1 x384 -1 x533 -1 x682 -1 x831 -1 x980 -1 x1129 -1 x1278 -1 x1427 -1 x1576 -1 x1725 -1 x1874 -1 x2023 -1 x2172 -1 x2321 -1 x2470 -1 x2619 -1 x2768 -1 x2917 -1 x3066 -1 x3215 -1 x3364 -1 x3513 -1 x3662 -1 x3811 -1 x3960 -1 x4109 -1 x4258 -1 x4407 -1 x4556 -1 x4705 -1 x4854 -1 x5003 -1 x5152 -1 x5301 -1 x5450 -1 x5599 -1 x5748 -1 x5897 -1 x6046 -1 x6195 -1 x6344 -1 x6493 -1 x6642 -1 x6791 -1 x6940 -1 x7089 -1 x7238 -1 x7387 -1 x7536 -1 x7685 -1 x7834 -1 x7983 -1 x8132 -1 x8281 -1 x8430 -1 x8579 -1 x8728 -1 x8877 -1 x9026 -1 x9175 -1 x9324 -1 x9473 -1 x9622 -1 x9771 -1 x9920 -1 x10069 -1 x10218 -1 x10367 -1 x10516 -1 x10665 -1 x10814 -1 x10963 -1 x11112 -1 x11261 -1 x11410 -1 x11559 -1 x11708 -1 x11857 -1 x12006 -1 x12155 -1 x12304 -1 x12453 -1 x12602 -1 x12751 -1 x12900 -1 x13049 -1 x13198 -1 x13347 -1 x13496 -1 x13645 -1 x13794 -1 x13943 -1 x14092 -1 x14241 -1 x14390 -1 x14539 -1 x14688 -1 x14837 -1 x14986 -1 x15135 -1 x15284 -1 x15433 -1 x15582 -1 x15731 -1 x15880 -1 x16029 -1 x16178 -1 x16327 -1 x16476 -1 x16625 -1 x16774 -1 x16923 -1 x17072 -1 x17221 -1 x17370 -1 x17519 -1 x17668 -1 x17817 -1 x17966 -1 x18115 -1 x18264 -1 x18413 -1 x18562 -1 x18711 -1 x18860 -1 x19009 -1 x19158 -1 x19307 -1 x19456 -1 x19605 -1 x19754 -1 x19903 -1 x20052 -1 x20201 -1 x20350 -1 x20499 -1 x20648 -1 x20797 -1 x20946 -1 x21095 -1 x21244 -1 x21393 -1 x21542 -1 x21691 -1 x21840 -1 x21989 -1 x22138 -1 x22287 >= -1;+-1 x87 -1 x236 -1 x385 -1 x534 -1 x683 -1 x832 -1 x981 -1 x1130 -1 x1279 -1 x1428 -1 x1577 -1 x1726 -1 x1875 -1 x2024 -1 x2173 -1 x2322 -1 x2471 -1 x2620 -1 x2769 -1 x2918 -1 x3067 -1 x3216 -1 x3365 -1 x3514 -1 x3663 -1 x3812 -1 x3961 -1 x4110 -1 x4259 -1 x4408 -1 x4557 -1 x4706 -1 x4855 -1 x5004 -1 x5153 -1 x5302 -1 x5451 -1 x5600 -1 x5749 -1 x5898 -1 x6047 -1 x6196 -1 x6345 -1 x6494 -1 x6643 -1 x6792 -1 x6941 -1 x7090 -1 x7239 -1 x7388 -1 x7537 -1 x7686 -1 x7835 -1 x7984 -1 x8133 -1 x8282 -1 x8431 -1 x8580 -1 x8729 -1 x8878 -1 x9027 -1 x9176 -1 x9325 -1 x9474 -1 x9623 -1 x9772 -1 x9921 -1 x10070 -1 x10219 -1 x10368 -1 x10517 -1 x10666 -1 x10815 -1 x10964 -1 x11113 -1 x11262 -1 x11411 -1 x11560 -1 x11709 -1 x11858 -1 x12007 -1 x12156 -1 x12305 -1 x12454 -1 x12603 -1 x12752 -1 x12901 -1 x13050 -1 x13199 -1 x13348 -1 x13497 -1 x13646 -1 x13795 -1 x13944 -1 x14093 -1 x14242 -1 x14391 -1 x14540 -1 x14689 -1 x14838 -1 x14987 -1 x15136 -1 x15285 -1 x15434 -1 x15583 -1 x15732 -1 x15881 -1 x16030 -1 x16179 -1 x16328 -1 x16477 -1 x16626 -1 x16775 -1 x16924 -1 x17073 -1 x17222 -1 x17371 -1 x17520 -1 x17669 -1 x17818 -1 x17967 -1 x18116 -1 x18265 -1 x18414 -1 x18563 -1 x18712 -1 x18861 -1 x19010 -1 x19159 -1 x19308 -1 x19457 -1 x19606 -1 x19755 -1 x19904 -1 x20053 -1 x20202 -1 x20351 -1 x20500 -1 x20649 -1 x20798 -1 x20947 -1 x21096 -1 x21245 -1 x21394 -1 x21543 -1 x21692 -1 x21841 -1 x21990 -1 x22139 -1 x22288 >= -1;+-1 x88 -1 x237 -1 x386 -1 x535 -1 x684 -1 x833 -1 x982 -1 x1131 -1 x1280 -1 x1429 -1 x1578 -1 x1727 -1 x1876 -1 x2025 -1 x2174 -1 x2323 -1 x2472 -1 x2621 -1 x2770 -1 x2919 -1 x3068 -1 x3217 -1 x3366 -1 x3515 -1 x3664 -1 x3813 -1 x3962 -1 x4111 -1 x4260 -1 x4409 -1 x4558 -1 x4707 -1 x4856 -1 x5005 -1 x5154 -1 x5303 -1 x5452 -1 x5601 -1 x5750 -1 x5899 -1 x6048 -1 x6197 -1 x6346 -1 x6495 -1 x6644 -1 x6793 -1 x6942 -1 x7091 -1 x7240 -1 x7389 -1 x7538 -1 x7687 -1 x7836 -1 x7985 -1 x8134 -1 x8283 -1 x8432 -1 x8581 -1 x8730 -1 x8879 -1 x9028 -1 x9177 -1 x9326 -1 x9475 -1 x9624 -1 x9773 -1 x9922 -1 x10071 -1 x10220 -1 x10369 -1 x10518 -1 x10667 -1 x10816 -1 x10965 -1 x11114 -1 x11263 -1 x11412 -1 x11561 -1 x11710 -1 x11859 -1 x12008 -1 x12157 -1 x12306 -1 x12455 -1 x12604 -1 x12753 -1 x12902 -1 x13051 -1 x13200 -1 x13349 -1 x13498 -1 x13647 -1 x13796 -1 x13945 -1 x14094 -1 x14243 -1 x14392 -1 x14541 -1 x14690 -1 x14839 -1 x14988 -1 x15137 -1 x15286 -1 x15435 -1 x15584 -1 x15733 -1 x15882 -1 x16031 -1 x16180 -1 x16329 -1 x16478 -1 x16627 -1 x16776 -1 x16925 -1 x17074 -1 x17223 -1 x17372 -1 x17521 -1 x17670 -1 x17819 -1 x17968 -1 x18117 -1 x18266 -1 x18415 -1 x18564 -1 x18713 -1 x18862 -1 x19011 -1 x19160 -1 x19309 -1 x19458 -1 x19607 -1 x19756 -1 x19905 -1 x20054 -1 x20203 -1 x20352 -1 x20501 -1 x20650 -1 x20799 -1 x20948 -1 x21097 -1 x21246 -1 x21395 -1 x21544 -1 x21693 -1 x21842 -1 x21991 -1 x22140 -1 x22289 >= -1;+-1 x89 -1 x238 -1 x387 -1 x536 -1 x685 -1 x834 -1 x983 -1 x1132 -1 x1281 -1 x1430 -1 x1579 -1 x1728 -1 x1877 -1 x2026 -1 x2175 -1 x2324 -1 x2473 -1 x2622 -1 x2771 -1 x2920 -1 x3069 -1 x3218 -1 x3367 -1 x3516 -1 x3665 -1 x3814 -1 x3963 -1 x4112 -1 x4261 -1 x4410 -1 x4559 -1 x4708 -1 x4857 -1 x5006 -1 x5155 -1 x5304 -1 x5453 -1 x5602 -1 x5751 -1 x5900 -1 x6049 -1 x6198 -1 x6347 -1 x6496 -1 x6645 -1 x6794 -1 x6943 -1 x7092 -1 x7241 -1 x7390 -1 x7539 -1 x7688 -1 x7837 -1 x7986 -1 x8135 -1 x8284 -1 x8433 -1 x8582 -1 x8731 -1 x8880 -1 x9029 -1 x9178 -1 x9327 -1 x9476 -1 x9625 -1 x9774 -1 x9923 -1 x10072 -1 x10221 -1 x10370 -1 x10519 -1 x10668 -1 x10817 -1 x10966 -1 x11115 -1 x11264 -1 x11413 -1 x11562 -1 x11711 -1 x11860 -1 x12009 -1 x12158 -1 x12307 -1 x12456 -1 x12605 -1 x12754 -1 x12903 -1 x13052 -1 x13201 -1 x13350 -1 x13499 -1 x13648 -1 x13797 -1 x13946 -1 x14095 -1 x14244 -1 x14393 -1 x14542 -1 x14691 -1 x14840 -1 x14989 -1 x15138 -1 x15287 -1 x15436 -1 x15585 -1 x15734 -1 x15883 -1 x16032 -1 x16181 -1 x16330 -1 x16479 -1 x16628 -1 x16777 -1 x16926 -1 x17075 -1 x17224 -1 x17373 -1 x17522 -1 x17671 -1 x17820 -1 x17969 -1 x18118 -1 x18267 -1 x18416 -1 x18565 -1 x18714 -1 x18863 -1 x19012 -1 x19161 -1 x19310 -1 x19459 -1 x19608 -1 x19757 -1 x19906 -1 x20055 -1 x20204 -1 x20353 -1 x20502 -1 x20651 -1 x20800 -1 x20949 -1 x21098 -1 x21247 -1 x21396 -1 x21545 -1 x21694 -1 x21843 -1 x21992 -1 x22141 -1 x22290 >= -1;+-1 x90 -1 x239 -1 x388 -1 x537 -1 x686 -1 x835 -1 x984 -1 x1133 -1 x1282 -1 x1431 -1 x1580 -1 x1729 -1 x1878 -1 x2027 -1 x2176 -1 x2325 -1 x2474 -1 x2623 -1 x2772 -1 x2921 -1 x3070 -1 x3219 -1 x3368 -1 x3517 -1 x3666 -1 x3815 -1 x3964 -1 x4113 -1 x4262 -1 x4411 -1 x4560 -1 x4709 -1 x4858 -1 x5007 -1 x5156 -1 x5305 -1 x5454 -1 x5603 -1 x5752 -1 x5901 -1 x6050 -1 x6199 -1 x6348 -1 x6497 -1 x6646 -1 x6795 -1 x6944 -1 x7093 -1 x7242 -1 x7391 -1 x7540 -1 x7689 -1 x7838 -1 x7987 -1 x8136 -1 x8285 -1 x8434 -1 x8583 -1 x8732 -1 x8881 -1 x9030 -1 x9179 -1 x9328 -1 x9477 -1 x9626 -1 x9775 -1 x9924 -1 x10073 -1 x10222 -1 x10371 -1 x10520 -1 x10669 -1 x10818 -1 x10967 -1 x11116 -1 x11265 -1 x11414 -1 x11563 -1 x11712 -1 x11861 -1 x12010 -1 x12159 -1 x12308 -1 x12457 -1 x12606 -1 x12755 -1 x12904 -1 x13053 -1 x13202 -1 x13351 -1 x13500 -1 x13649 -1 x13798 -1 x13947 -1 x14096 -1 x14245 -1 x14394 -1 x14543 -1 x14692 -1 x14841 -1 x14990 -1 x15139 -1 x15288 -1 x15437 -1 x15586 -1 x15735 -1 x15884 -1 x16033 -1 x16182 -1 x16331 -1 x16480 -1 x16629 -1 x16778 -1 x16927 -1 x17076 -1 x17225 -1 x17374 -1 x17523 -1 x17672 -1 x17821 -1 x17970 -1 x18119 -1 x18268 -1 x18417 -1 x18566 -1 x18715 -1 x18864 -1 x19013 -1 x19162 -1 x19311 -1 x19460 -1 x19609 -1 x19758 -1 x19907 -1 x20056 -1 x20205 -1 x20354 -1 x20503 -1 x20652 -1 x20801 -1 x20950 -1 x21099 -1 x21248 -1 x21397 -1 x21546 -1 x21695 -1 x21844 -1 x21993 -1 x22142 -1 x22291 >= -1;+-1 x91 -1 x240 -1 x389 -1 x538 -1 x687 -1 x836 -1 x985 -1 x1134 -1 x1283 -1 x1432 -1 x1581 -1 x1730 -1 x1879 -1 x2028 -1 x2177 -1 x2326 -1 x2475 -1 x2624 -1 x2773 -1 x2922 -1 x3071 -1 x3220 -1 x3369 -1 x3518 -1 x3667 -1 x3816 -1 x3965 -1 x4114 -1 x4263 -1 x4412 -1 x4561 -1 x4710 -1 x4859 -1 x5008 -1 x5157 -1 x5306 -1 x5455 -1 x5604 -1 x5753 -1 x5902 -1 x6051 -1 x6200 -1 x6349 -1 x6498 -1 x6647 -1 x6796 -1 x6945 -1 x7094 -1 x7243 -1 x7392 -1 x7541 -1 x7690 -1 x7839 -1 x7988 -1 x8137 -1 x8286 -1 x8435 -1 x8584 -1 x8733 -1 x8882 -1 x9031 -1 x9180 -1 x9329 -1 x9478 -1 x9627 -1 x9776 -1 x9925 -1 x10074 -1 x10223 -1 x10372 -1 x10521 -1 x10670 -1 x10819 -1 x10968 -1 x11117 -1 x11266 -1 x11415 -1 x11564 -1 x11713 -1 x11862 -1 x12011 -1 x12160 -1 x12309 -1 x12458 -1 x12607 -1 x12756 -1 x12905 -1 x13054 -1 x13203 -1 x13352 -1 x13501 -1 x13650 -1 x13799 -1 x13948 -1 x14097 -1 x14246 -1 x14395 -1 x14544 -1 x14693 -1 x14842 -1 x14991 -1 x15140 -1 x15289 -1 x15438 -1 x15587 -1 x15736 -1 x15885 -1 x16034 -1 x16183 -1 x16332 -1 x16481 -1 x16630 -1 x16779 -1 x16928 -1 x17077 -1 x17226 -1 x17375 -1 x17524 -1 x17673 -1 x17822 -1 x17971 -1 x18120 -1 x18269 -1 x18418 -1 x18567 -1 x18716 -1 x18865 -1 x19014 -1 x19163 -1 x19312 -1 x19461 -1 x19610 -1 x19759 -1 x19908 -1 x20057 -1 x20206 -1 x20355 -1 x20504 -1 x20653 -1 x20802 -1 x20951 -1 x21100 -1 x21249 -1 x21398 -1 x21547 -1 x21696 -1 x21845 -1 x21994 -1 x22143 -1 x22292 >= -1;+-1 x92 -1 x241 -1 x390 -1 x539 -1 x688 -1 x837 -1 x986 -1 x1135 -1 x1284 -1 x1433 -1 x1582 -1 x1731 -1 x1880 -1 x2029 -1 x2178 -1 x2327 -1 x2476 -1 x2625 -1 x2774 -1 x2923 -1 x3072 -1 x3221 -1 x3370 -1 x3519 -1 x3668 -1 x3817 -1 x3966 -1 x4115 -1 x4264 -1 x4413 -1 x4562 -1 x4711 -1 x4860 -1 x5009 -1 x5158 -1 x5307 -1 x5456 -1 x5605 -1 x5754 -1 x5903 -1 x6052 -1 x6201 -1 x6350 -1 x6499 -1 x6648 -1 x6797 -1 x6946 -1 x7095 -1 x7244 -1 x7393 -1 x7542 -1 x7691 -1 x7840 -1 x7989 -1 x8138 -1 x8287 -1 x8436 -1 x8585 -1 x8734 -1 x8883 -1 x9032 -1 x9181 -1 x9330 -1 x9479 -1 x9628 -1 x9777 -1 x9926 -1 x10075 -1 x10224 -1 x10373 -1 x10522 -1 x10671 -1 x10820 -1 x10969 -1 x11118 -1 x11267 -1 x11416 -1 x11565 -1 x11714 -1 x11863 -1 x12012 -1 x12161 -1 x12310 -1 x12459 -1 x12608 -1 x12757 -1 x12906 -1 x13055 -1 x13204 -1 x13353 -1 x13502 -1 x13651 -1 x13800 -1 x13949 -1 x14098 -1 x14247 -1 x14396 -1 x14545 -1 x14694 -1 x14843 -1 x14992 -1 x15141 -1 x15290 -1 x15439 -1 x15588 -1 x15737 -1 x15886 -1 x16035 -1 x16184 -1 x16333 -1 x16482 -1 x16631 -1 x16780 -1 x16929 -1 x17078 -1 x17227 -1 x17376 -1 x17525 -1 x17674 -1 x17823 -1 x17972 -1 x18121 -1 x18270 -1 x18419 -1 x18568 -1 x18717 -1 x18866 -1 x19015 -1 x19164 -1 x19313 -1 x19462 -1 x19611 -1 x19760 -1 x19909 -1 x20058 -1 x20207 -1 x20356 -1 x20505 -1 x20654 -1 x20803 -1 x20952 -1 x21101 -1 x21250 -1 x21399 -1 x21548 -1 x21697 -1 x21846 -1 x21995 -1 x22144 -1 x22293 >= -1;+-1 x93 -1 x242 -1 x391 -1 x540 -1 x689 -1 x838 -1 x987 -1 x1136 -1 x1285 -1 x1434 -1 x1583 -1 x1732 -1 x1881 -1 x2030 -1 x2179 -1 x2328 -1 x2477 -1 x2626 -1 x2775 -1 x2924 -1 x3073 -1 x3222 -1 x3371 -1 x3520 -1 x3669 -1 x3818 -1 x3967 -1 x4116 -1 x4265 -1 x4414 -1 x4563 -1 x4712 -1 x4861 -1 x5010 -1 x5159 -1 x5308 -1 x5457 -1 x5606 -1 x5755 -1 x5904 -1 x6053 -1 x6202 -1 x6351 -1 x6500 -1 x6649 -1 x6798 -1 x6947 -1 x7096 -1 x7245 -1 x7394 -1 x7543 -1 x7692 -1 x7841 -1 x7990 -1 x8139 -1 x8288 -1 x8437 -1 x8586 -1 x8735 -1 x8884 -1 x9033 -1 x9182 -1 x9331 -1 x9480 -1 x9629 -1 x9778 -1 x9927 -1 x10076 -1 x10225 -1 x10374 -1 x10523 -1 x10672 -1 x10821 -1 x10970 -1 x11119 -1 x11268 -1 x11417 -1 x11566 -1 x11715 -1 x11864 -1 x12013 -1 x12162 -1 x12311 -1 x12460 -1 x12609 -1 x12758 -1 x12907 -1 x13056 -1 x13205 -1 x13354 -1 x13503 -1 x13652 -1 x13801 -1 x13950 -1 x14099 -1 x14248 -1 x14397 -1 x14546 -1 x14695 -1 x14844 -1 x14993 -1 x15142 -1 x15291 -1 x15440 -1 x15589 -1 x15738 -1 x15887 -1 x16036 -1 x16185 -1 x16334 -1 x16483 -1 x16632 -1 x16781 -1 x16930 -1 x17079 -1 x17228 -1 x17377 -1 x17526 -1 x17675 -1 x17824 -1 x17973 -1 x18122 -1 x18271 -1 x18420 -1 x18569 -1 x18718 -1 x18867 -1 x19016 -1 x19165 -1 x19314 -1 x19463 -1 x19612 -1 x19761 -1 x19910 -1 x20059 -1 x20208 -1 x20357 -1 x20506 -1 x20655 -1 x20804 -1 x20953 -1 x21102 -1 x21251 -1 x21400 -1 x21549 -1 x21698 -1 x21847 -1 x21996 -1 x22145 -1 x22294 >= -1;+-1 x94 -1 x243 -1 x392 -1 x541 -1 x690 -1 x839 -1 x988 -1 x1137 -1 x1286 -1 x1435 -1 x1584 -1 x1733 -1 x1882 -1 x2031 -1 x2180 -1 x2329 -1 x2478 -1 x2627 -1 x2776 -1 x2925 -1 x3074 -1 x3223 -1 x3372 -1 x3521 -1 x3670 -1 x3819 -1 x3968 -1 x4117 -1 x4266 -1 x4415 -1 x4564 -1 x4713 -1 x4862 -1 x5011 -1 x5160 -1 x5309 -1 x5458 -1 x5607 -1 x5756 -1 x5905 -1 x6054 -1 x6203 -1 x6352 -1 x6501 -1 x6650 -1 x6799 -1 x6948 -1 x7097 -1 x7246 -1 x7395 -1 x7544 -1 x7693 -1 x7842 -1 x7991 -1 x8140 -1 x8289 -1 x8438 -1 x8587 -1 x8736 -1 x8885 -1 x9034 -1 x9183 -1 x9332 -1 x9481 -1 x9630 -1 x9779 -1 x9928 -1 x10077 -1 x10226 -1 x10375 -1 x10524 -1 x10673 -1 x10822 -1 x10971 -1 x11120 -1 x11269 -1 x11418 -1 x11567 -1 x11716 -1 x11865 -1 x12014 -1 x12163 -1 x12312 -1 x12461 -1 x12610 -1 x12759 -1 x12908 -1 x13057 -1 x13206 -1 x13355 -1 x13504 -1 x13653 -1 x13802 -1 x13951 -1 x14100 -1 x14249 -1 x14398 -1 x14547 -1 x14696 -1 x14845 -1 x14994 -1 x15143 -1 x15292 -1 x15441 -1 x15590 -1 x15739 -1 x15888 -1 x16037 -1 x16186 -1 x16335 -1 x16484 -1 x16633 -1 x16782 -1 x16931 -1 x17080 -1 x17229 -1 x17378 -1 x17527 -1 x17676 -1 x17825 -1 x17974 -1 x18123 -1 x18272 -1 x18421 -1 x18570 -1 x18719 -1 x18868 -1 x19017 -1 x19166 -1 x19315 -1 x19464 -1 x19613 -1 x19762 -1 x19911 -1 x20060 -1 x20209 -1 x20358 -1 x20507 -1 x20656 -1 x20805 -1 x20954 -1 x21103 -1 x21252 -1 x21401 -1 x21550 -1 x21699 -1 x21848 -1 x21997 -1 x22146 -1 x22295 >= -1;+-1 x95 -1 x244 -1 x393 -1 x542 -1 x691 -1 x840 -1 x989 -1 x1138 -1 x1287 -1 x1436 -1 x1585 -1 x1734 -1 x1883 -1 x2032 -1 x2181 -1 x2330 -1 x2479 -1 x2628 -1 x2777 -1 x2926 -1 x3075 -1 x3224 -1 x3373 -1 x3522 -1 x3671 -1 x3820 -1 x3969 -1 x4118 -1 x4267 -1 x4416 -1 x4565 -1 x4714 -1 x4863 -1 x5012 -1 x5161 -1 x5310 -1 x5459 -1 x5608 -1 x5757 -1 x5906 -1 x6055 -1 x6204 -1 x6353 -1 x6502 -1 x6651 -1 x6800 -1 x6949 -1 x7098 -1 x7247 -1 x7396 -1 x7545 -1 x7694 -1 x7843 -1 x7992 -1 x8141 -1 x8290 -1 x8439 -1 x8588 -1 x8737 -1 x8886 -1 x9035 -1 x9184 -1 x9333 -1 x9482 -1 x9631 -1 x9780 -1 x9929 -1 x10078 -1 x10227 -1 x10376 -1 x10525 -1 x10674 -1 x10823 -1 x10972 -1 x11121 -1 x11270 -1 x11419 -1 x11568 -1 x11717 -1 x11866 -1 x12015 -1 x12164 -1 x12313 -1 x12462 -1 x12611 -1 x12760 -1 x12909 -1 x13058 -1 x13207 -1 x13356 -1 x13505 -1 x13654 -1 x13803 -1 x13952 -1 x14101 -1 x14250 -1 x14399 -1 x14548 -1 x14697 -1 x14846 -1 x14995 -1 x15144 -1 x15293 -1 x15442 -1 x15591 -1 x15740 -1 x15889 -1 x16038 -1 x16187 -1 x16336 -1 x16485 -1 x16634 -1 x16783 -1 x16932 -1 x17081 -1 x17230 -1 x17379 -1 x17528 -1 x17677 -1 x17826 -1 x17975 -1 x18124 -1 x18273 -1 x18422 -1 x18571 -1 x18720 -1 x18869 -1 x19018 -1 x19167 -1 x19316 -1 x19465 -1 x19614 -1 x19763 -1 x19912 -1 x20061 -1 x20210 -1 x20359 -1 x20508 -1 x20657 -1 x20806 -1 x20955 -1 x21104 -1 x21253 -1 x21402 -1 x21551 -1 x21700 -1 x21849 -1 x21998 -1 x22147 -1 x22296 >= -1;+-1 x96 -1 x245 -1 x394 -1 x543 -1 x692 -1 x841 -1 x990 -1 x1139 -1 x1288 -1 x1437 -1 x1586 -1 x1735 -1 x1884 -1 x2033 -1 x2182 -1 x2331 -1 x2480 -1 x2629 -1 x2778 -1 x2927 -1 x3076 -1 x3225 -1 x3374 -1 x3523 -1 x3672 -1 x3821 -1 x3970 -1 x4119 -1 x4268 -1 x4417 -1 x4566 -1 x4715 -1 x4864 -1 x5013 -1 x5162 -1 x5311 -1 x5460 -1 x5609 -1 x5758 -1 x5907 -1 x6056 -1 x6205 -1 x6354 -1 x6503 -1 x6652 -1 x6801 -1 x6950 -1 x7099 -1 x7248 -1 x7397 -1 x7546 -1 x7695 -1 x7844 -1 x7993 -1 x8142 -1 x8291 -1 x8440 -1 x8589 -1 x8738 -1 x8887 -1 x9036 -1 x9185 -1 x9334 -1 x9483 -1 x9632 -1 x9781 -1 x9930 -1 x10079 -1 x10228 -1 x10377 -1 x10526 -1 x10675 -1 x10824 -1 x10973 -1 x11122 -1 x11271 -1 x11420 -1 x11569 -1 x11718 -1 x11867 -1 x12016 -1 x12165 -1 x12314 -1 x12463 -1 x12612 -1 x12761 -1 x12910 -1 x13059 -1 x13208 -1 x13357 -1 x13506 -1 x13655 -1 x13804 -1 x13953 -1 x14102 -1 x14251 -1 x14400 -1 x14549 -1 x14698 -1 x14847 -1 x14996 -1 x15145 -1 x15294 -1 x15443 -1 x15592 -1 x15741 -1 x15890 -1 x16039 -1 x16188 -1 x16337 -1 x16486 -1 x16635 -1 x16784 -1 x16933 -1 x17082 -1 x17231 -1 x17380 -1 x17529 -1 x17678 -1 x17827 -1 x17976 -1 x18125 -1 x18274 -1 x18423 -1 x18572 -1 x18721 -1 x18870 -1 x19019 -1 x19168 -1 x19317 -1 x19466 -1 x19615 -1 x19764 -1 x19913 -1 x20062 -1 x20211 -1 x20360 -1 x20509 -1 x20658 -1 x20807 -1 x20956 -1 x21105 -1 x21254 -1 x21403 -1 x21552 -1 x21701 -1 x21850 -1 x21999 -1 x22148 -1 x22297 >= -1;+-1 x97 -1 x246 -1 x395 -1 x544 -1 x693 -1 x842 -1 x991 -1 x1140 -1 x1289 -1 x1438 -1 x1587 -1 x1736 -1 x1885 -1 x2034 -1 x2183 -1 x2332 -1 x2481 -1 x2630 -1 x2779 -1 x2928 -1 x3077 -1 x3226 -1 x3375 -1 x3524 -1 x3673 -1 x3822 -1 x3971 -1 x4120 -1 x4269 -1 x4418 -1 x4567 -1 x4716 -1 x4865 -1 x5014 -1 x5163 -1 x5312 -1 x5461 -1 x5610 -1 x5759 -1 x5908 -1 x6057 -1 x6206 -1 x6355 -1 x6504 -1 x6653 -1 x6802 -1 x6951 -1 x7100 -1 x7249 -1 x7398 -1 x7547 -1 x7696 -1 x7845 -1 x7994 -1 x8143 -1 x8292 -1 x8441 -1 x8590 -1 x8739 -1 x8888 -1 x9037 -1 x9186 -1 x9335 -1 x9484 -1 x9633 -1 x9782 -1 x9931 -1 x10080 -1 x10229 -1 x10378 -1 x10527 -1 x10676 -1 x10825 -1 x10974 -1 x11123 -1 x11272 -1 x11421 -1 x11570 -1 x11719 -1 x11868 -1 x12017 -1 x12166 -1 x12315 -1 x12464 -1 x12613 -1 x12762 -1 x12911 -1 x13060 -1 x13209 -1 x13358 -1 x13507 -1 x13656 -1 x13805 -1 x13954 -1 x14103 -1 x14252 -1 x14401 -1 x14550 -1 x14699 -1 x14848 -1 x14997 -1 x15146 -1 x15295 -1 x15444 -1 x15593 -1 x15742 -1 x15891 -1 x16040 -1 x16189 -1 x16338 -1 x16487 -1 x16636 -1 x16785 -1 x16934 -1 x17083 -1 x17232 -1 x17381 -1 x17530 -1 x17679 -1 x17828 -1 x17977 -1 x18126 -1 x18275 -1 x18424 -1 x18573 -1 x18722 -1 x18871 -1 x19020 -1 x19169 -1 x19318 -1 x19467 -1 x19616 -1 x19765 -1 x19914 -1 x20063 -1 x20212 -1 x20361 -1 x20510 -1 x20659 -1 x20808 -1 x20957 -1 x21106 -1 x21255 -1 x21404 -1 x21553 -1 x21702 -1 x21851 -1 x22000 -1 x22149 -1 x22298 >= -1;+-1 x98 -1 x247 -1 x396 -1 x545 -1 x694 -1 x843 -1 x992 -1 x1141 -1 x1290 -1 x1439 -1 x1588 -1 x1737 -1 x1886 -1 x2035 -1 x2184 -1 x2333 -1 x2482 -1 x2631 -1 x2780 -1 x2929 -1 x3078 -1 x3227 -1 x3376 -1 x3525 -1 x3674 -1 x3823 -1 x3972 -1 x4121 -1 x4270 -1 x4419 -1 x4568 -1 x4717 -1 x4866 -1 x5015 -1 x5164 -1 x5313 -1 x5462 -1 x5611 -1 x5760 -1 x5909 -1 x6058 -1 x6207 -1 x6356 -1 x6505 -1 x6654 -1 x6803 -1 x6952 -1 x7101 -1 x7250 -1 x7399 -1 x7548 -1 x7697 -1 x7846 -1 x7995 -1 x8144 -1 x8293 -1 x8442 -1 x8591 -1 x8740 -1 x8889 -1 x9038 -1 x9187 -1 x9336 -1 x9485 -1 x9634 -1 x9783 -1 x9932 -1 x10081 -1 x10230 -1 x10379 -1 x10528 -1 x10677 -1 x10826 -1 x10975 -1 x11124 -1 x11273 -1 x11422 -1 x11571 -1 x11720 -1 x11869 -1 x12018 -1 x12167 -1 x12316 -1 x12465 -1 x12614 -1 x12763 -1 x12912 -1 x13061 -1 x13210 -1 x13359 -1 x13508 -1 x13657 -1 x13806 -1 x13955 -1 x14104 -1 x14253 -1 x14402 -1 x14551 -1 x14700 -1 x14849 -1 x14998 -1 x15147 -1 x15296 -1 x15445 -1 x15594 -1 x15743 -1 x15892 -1 x16041 -1 x16190 -1 x16339 -1 x16488 -1 x16637 -1 x16786 -1 x16935 -1 x17084 -1 x17233 -1 x17382 -1 x17531 -1 x17680 -1 x17829 -1 x17978 -1 x18127 -1 x18276 -1 x18425 -1 x18574 -1 x18723 -1 x18872 -1 x19021 -1 x19170 -1 x19319 -1 x19468 -1 x19617 -1 x19766 -1 x19915 -1 x20064 -1 x20213 -1 x20362 -1 x20511 -1 x20660 -1 x20809 -1 x20958 -1 x21107 -1 x21256 -1 x21405 -1 x21554 -1 x21703 -1 x21852 -1 x22001 -1 x22150 -1 x22299 >= -1;+-1 x99 -1 x248 -1 x397 -1 x546 -1 x695 -1 x844 -1 x993 -1 x1142 -1 x1291 -1 x1440 -1 x1589 -1 x1738 -1 x1887 -1 x2036 -1 x2185 -1 x2334 -1 x2483 -1 x2632 -1 x2781 -1 x2930 -1 x3079 -1 x3228 -1 x3377 -1 x3526 -1 x3675 -1 x3824 -1 x3973 -1 x4122 -1 x4271 -1 x4420 -1 x4569 -1 x4718 -1 x4867 -1 x5016 -1 x5165 -1 x5314 -1 x5463 -1 x5612 -1 x5761 -1 x5910 -1 x6059 -1 x6208 -1 x6357 -1 x6506 -1 x6655 -1 x6804 -1 x6953 -1 x7102 -1 x7251 -1 x7400 -1 x7549 -1 x7698 -1 x7847 -1 x7996 -1 x8145 -1 x8294 -1 x8443 -1 x8592 -1 x8741 -1 x8890 -1 x9039 -1 x9188 -1 x9337 -1 x9486 -1 x9635 -1 x9784 -1 x9933 -1 x10082 -1 x10231 -1 x10380 -1 x10529 -1 x10678 -1 x10827 -1 x10976 -1 x11125 -1 x11274 -1 x11423 -1 x11572 -1 x11721 -1 x11870 -1 x12019 -1 x12168 -1 x12317 -1 x12466 -1 x12615 -1 x12764 -1 x12913 -1 x13062 -1 x13211 -1 x13360 -1 x13509 -1 x13658 -1 x13807 -1 x13956 -1 x14105 -1 x14254 -1 x14403 -1 x14552 -1 x14701 -1 x14850 -1 x14999 -1 x15148 -1 x15297 -1 x15446 -1 x15595 -1 x15744 -1 x15893 -1 x16042 -1 x16191 -1 x16340 -1 x16489 -1 x16638 -1 x16787 -1 x16936 -1 x17085 -1 x17234 -1 x17383 -1 x17532 -1 x17681 -1 x17830 -1 x17979 -1 x18128 -1 x18277 -1 x18426 -1 x18575 -1 x18724 -1 x18873 -1 x19022 -1 x19171 -1 x19320 -1 x19469 -1 x19618 -1 x19767 -1 x19916 -1 x20065 -1 x20214 -1 x20363 -1 x20512 -1 x20661 -1 x20810 -1 x20959 -1 x21108 -1 x21257 -1 x21406 -1 x21555 -1 x21704 -1 x21853 -1 x22002 -1 x22151 -1 x22300 >= -1;+-1 x100 -1 x249 -1 x398 -1 x547 -1 x696 -1 x845 -1 x994 -1 x1143 -1 x1292 -1 x1441 -1 x1590 -1 x1739 -1 x1888 -1 x2037 -1 x2186 -1 x2335 -1 x2484 -1 x2633 -1 x2782 -1 x2931 -1 x3080 -1 x3229 -1 x3378 -1 x3527 -1 x3676 -1 x3825 -1 x3974 -1 x4123 -1 x4272 -1 x4421 -1 x4570 -1 x4719 -1 x4868 -1 x5017 -1 x5166 -1 x5315 -1 x5464 -1 x5613 -1 x5762 -1 x5911 -1 x6060 -1 x6209 -1 x6358 -1 x6507 -1 x6656 -1 x6805 -1 x6954 -1 x7103 -1 x7252 -1 x7401 -1 x7550 -1 x7699 -1 x7848 -1 x7997 -1 x8146 -1 x8295 -1 x8444 -1 x8593 -1 x8742 -1 x8891 -1 x9040 -1 x9189 -1 x9338 -1 x9487 -1 x9636 -1 x9785 -1 x9934 -1 x10083 -1 x10232 -1 x10381 -1 x10530 -1 x10679 -1 x10828 -1 x10977 -1 x11126 -1 x11275 -1 x11424 -1 x11573 -1 x11722 -1 x11871 -1 x12020 -1 x12169 -1 x12318 -1 x12467 -1 x12616 -1 x12765 -1 x12914 -1 x13063 -1 x13212 -1 x13361 -1 x13510 -1 x13659 -1 x13808 -1 x13957 -1 x14106 -1 x14255 -1 x14404 -1 x14553 -1 x14702 -1 x14851 -1 x15000 -1 x15149 -1 x15298 -1 x15447 -1 x15596 -1 x15745 -1 x15894 -1 x16043 -1 x16192 -1 x16341 -1 x16490 -1 x16639 -1 x16788 -1 x16937 -1 x17086 -1 x17235 -1 x17384 -1 x17533 -1 x17682 -1 x17831 -1 x17980 -1 x18129 -1 x18278 -1 x18427 -1 x18576 -1 x18725 -1 x18874 -1 x19023 -1 x19172 -1 x19321 -1 x19470 -1 x19619 -1 x19768 -1 x19917 -1 x20066 -1 x20215 -1 x20364 -1 x20513 -1 x20662 -1 x20811 -1 x20960 -1 x21109 -1 x21258 -1 x21407 -1 x21556 -1 x21705 -1 x21854 -1 x22003 -1 x22152 -1 x22301 >= -1;+-1 x101 -1 x250 -1 x399 -1 x548 -1 x697 -1 x846 -1 x995 -1 x1144 -1 x1293 -1 x1442 -1 x1591 -1 x1740 -1 x1889 -1 x2038 -1 x2187 -1 x2336 -1 x2485 -1 x2634 -1 x2783 -1 x2932 -1 x3081 -1 x3230 -1 x3379 -1 x3528 -1 x3677 -1 x3826 -1 x3975 -1 x4124 -1 x4273 -1 x4422 -1 x4571 -1 x4720 -1 x4869 -1 x5018 -1 x5167 -1 x5316 -1 x5465 -1 x5614 -1 x5763 -1 x5912 -1 x6061 -1 x6210 -1 x6359 -1 x6508 -1 x6657 -1 x6806 -1 x6955 -1 x7104 -1 x7253 -1 x7402 -1 x7551 -1 x7700 -1 x7849 -1 x7998 -1 x8147 -1 x8296 -1 x8445 -1 x8594 -1 x8743 -1 x8892 -1 x9041 -1 x9190 -1 x9339 -1 x9488 -1 x9637 -1 x9786 -1 x9935 -1 x10084 -1 x10233 -1 x10382 -1 x10531 -1 x10680 -1 x10829 -1 x10978 -1 x11127 -1 x11276 -1 x11425 -1 x11574 -1 x11723 -1 x11872 -1 x12021 -1 x12170 -1 x12319 -1 x12468 -1 x12617 -1 x12766 -1 x12915 -1 x13064 -1 x13213 -1 x13362 -1 x13511 -1 x13660 -1 x13809 -1 x13958 -1 x14107 -1 x14256 -1 x14405 -1 x14554 -1 x14703 -1 x14852 -1 x15001 -1 x15150 -1 x15299 -1 x15448 -1 x15597 -1 x15746 -1 x15895 -1 x16044 -1 x16193 -1 x16342 -1 x16491 -1 x16640 -1 x16789 -1 x16938 -1 x17087 -1 x17236 -1 x17385 -1 x17534 -1 x17683 -1 x17832 -1 x17981 -1 x18130 -1 x18279 -1 x18428 -1 x18577 -1 x18726 -1 x18875 -1 x19024 -1 x19173 -1 x19322 -1 x19471 -1 x19620 -1 x19769 -1 x19918 -1 x20067 -1 x20216 -1 x20365 -1 x20514 -1 x20663 -1 x20812 -1 x20961 -1 x21110 -1 x21259 -1 x21408 -1 x21557 -1 x21706 -1 x21855 -1 x22004 -1 x22153 -1 x22302 >= -1;+-1 x102 -1 x251 -1 x400 -1 x549 -1 x698 -1 x847 -1 x996 -1 x1145 -1 x1294 -1 x1443 -1 x1592 -1 x1741 -1 x1890 -1 x2039 -1 x2188 -1 x2337 -1 x2486 -1 x2635 -1 x2784 -1 x2933 -1 x3082 -1 x3231 -1 x3380 -1 x3529 -1 x3678 -1 x3827 -1 x3976 -1 x4125 -1 x4274 -1 x4423 -1 x4572 -1 x4721 -1 x4870 -1 x5019 -1 x5168 -1 x5317 -1 x5466 -1 x5615 -1 x5764 -1 x5913 -1 x6062 -1 x6211 -1 x6360 -1 x6509 -1 x6658 -1 x6807 -1 x6956 -1 x7105 -1 x7254 -1 x7403 -1 x7552 -1 x7701 -1 x7850 -1 x7999 -1 x8148 -1 x8297 -1 x8446 -1 x8595 -1 x8744 -1 x8893 -1 x9042 -1 x9191 -1 x9340 -1 x9489 -1 x9638 -1 x9787 -1 x9936 -1 x10085 -1 x10234 -1 x10383 -1 x10532 -1 x10681 -1 x10830 -1 x10979 -1 x11128 -1 x11277 -1 x11426 -1 x11575 -1 x11724 -1 x11873 -1 x12022 -1 x12171 -1 x12320 -1 x12469 -1 x12618 -1 x12767 -1 x12916 -1 x13065 -1 x13214 -1 x13363 -1 x13512 -1 x13661 -1 x13810 -1 x13959 -1 x14108 -1 x14257 -1 x14406 -1 x14555 -1 x14704 -1 x14853 -1 x15002 -1 x15151 -1 x15300 -1 x15449 -1 x15598 -1 x15747 -1 x15896 -1 x16045 -1 x16194 -1 x16343 -1 x16492 -1 x16641 -1 x16790 -1 x16939 -1 x17088 -1 x17237 -1 x17386 -1 x17535 -1 x17684 -1 x17833 -1 x17982 -1 x18131 -1 x18280 -1 x18429 -1 x18578 -1 x18727 -1 x18876 -1 x19025 -1 x19174 -1 x19323 -1 x19472 -1 x19621 -1 x19770 -1 x19919 -1 x20068 -1 x20217 -1 x20366 -1 x20515 -1 x20664 -1 x20813 -1 x20962 -1 x21111 -1 x21260 -1 x21409 -1 x21558 -1 x21707 -1 x21856 -1 x22005 -1 x22154 -1 x22303 >= -1;+-1 x103 -1 x252 -1 x401 -1 x550 -1 x699 -1 x848 -1 x997 -1 x1146 -1 x1295 -1 x1444 -1 x1593 -1 x1742 -1 x1891 -1 x2040 -1 x2189 -1 x2338 -1 x2487 -1 x2636 -1 x2785 -1 x2934 -1 x3083 -1 x3232 -1 x3381 -1 x3530 -1 x3679 -1 x3828 -1 x3977 -1 x4126 -1 x4275 -1 x4424 -1 x4573 -1 x4722 -1 x4871 -1 x5020 -1 x5169 -1 x5318 -1 x5467 -1 x5616 -1 x5765 -1 x5914 -1 x6063 -1 x6212 -1 x6361 -1 x6510 -1 x6659 -1 x6808 -1 x6957 -1 x7106 -1 x7255 -1 x7404 -1 x7553 -1 x7702 -1 x7851 -1 x8000 -1 x8149 -1 x8298 -1 x8447 -1 x8596 -1 x8745 -1 x8894 -1 x9043 -1 x9192 -1 x9341 -1 x9490 -1 x9639 -1 x9788 -1 x9937 -1 x10086 -1 x10235 -1 x10384 -1 x10533 -1 x10682 -1 x10831 -1 x10980 -1 x11129 -1 x11278 -1 x11427 -1 x11576 -1 x11725 -1 x11874 -1 x12023 -1 x12172 -1 x12321 -1 x12470 -1 x12619 -1 x12768 -1 x12917 -1 x13066 -1 x13215 -1 x13364 -1 x13513 -1 x13662 -1 x13811 -1 x13960 -1 x14109 -1 x14258 -1 x14407 -1 x14556 -1 x14705 -1 x14854 -1 x15003 -1 x15152 -1 x15301 -1 x15450 -1 x15599 -1 x15748 -1 x15897 -1 x16046 -1 x16195 -1 x16344 -1 x16493 -1 x16642 -1 x16791 -1 x16940 -1 x17089 -1 x17238 -1 x17387 -1 x17536 -1 x17685 -1 x17834 -1 x17983 -1 x18132 -1 x18281 -1 x18430 -1 x18579 -1 x18728 -1 x18877 -1 x19026 -1 x19175 -1 x19324 -1 x19473 -1 x19622 -1 x19771 -1 x19920 -1 x20069 -1 x20218 -1 x20367 -1 x20516 -1 x20665 -1 x20814 -1 x20963 -1 x21112 -1 x21261 -1 x21410 -1 x21559 -1 x21708 -1 x21857 -1 x22006 -1 x22155 -1 x22304 >= -1;+-1 x104 -1 x253 -1 x402 -1 x551 -1 x700 -1 x849 -1 x998 -1 x1147 -1 x1296 -1 x1445 -1 x1594 -1 x1743 -1 x1892 -1 x2041 -1 x2190 -1 x2339 -1 x2488 -1 x2637 -1 x2786 -1 x2935 -1 x3084 -1 x3233 -1 x3382 -1 x3531 -1 x3680 -1 x3829 -1 x3978 -1 x4127 -1 x4276 -1 x4425 -1 x4574 -1 x4723 -1 x4872 -1 x5021 -1 x5170 -1 x5319 -1 x5468 -1 x5617 -1 x5766 -1 x5915 -1 x6064 -1 x6213 -1 x6362 -1 x6511 -1 x6660 -1 x6809 -1 x6958 -1 x7107 -1 x7256 -1 x7405 -1 x7554 -1 x7703 -1 x7852 -1 x8001 -1 x8150 -1 x8299 -1 x8448 -1 x8597 -1 x8746 -1 x8895 -1 x9044 -1 x9193 -1 x9342 -1 x9491 -1 x9640 -1 x9789 -1 x9938 -1 x10087 -1 x10236 -1 x10385 -1 x10534 -1 x10683 -1 x10832 -1 x10981 -1 x11130 -1 x11279 -1 x11428 -1 x11577 -1 x11726 -1 x11875 -1 x12024 -1 x12173 -1 x12322 -1 x12471 -1 x12620 -1 x12769 -1 x12918 -1 x13067 -1 x13216 -1 x13365 -1 x13514 -1 x13663 -1 x13812 -1 x13961 -1 x14110 -1 x14259 -1 x14408 -1 x14557 -1 x14706 -1 x14855 -1 x15004 -1 x15153 -1 x15302 -1 x15451 -1 x15600 -1 x15749 -1 x15898 -1 x16047 -1 x16196 -1 x16345 -1 x16494 -1 x16643 -1 x16792 -1 x16941 -1 x17090 -1 x17239 -1 x17388 -1 x17537 -1 x17686 -1 x17835 -1 x17984 -1 x18133 -1 x18282 -1 x18431 -1 x18580 -1 x18729 -1 x18878 -1 x19027 -1 x19176 -1 x19325 -1 x19474 -1 x19623 -1 x19772 -1 x19921 -1 x20070 -1 x20219 -1 x20368 -1 x20517 -1 x20666 -1 x20815 -1 x20964 -1 x21113 -1 x21262 -1 x21411 -1 x21560 -1 x21709 -1 x21858 -1 x22007 -1 x22156 -1 x22305 >= -1;+-1 x105 -1 x254 -1 x403 -1 x552 -1 x701 -1 x850 -1 x999 -1 x1148 -1 x1297 -1 x1446 -1 x1595 -1 x1744 -1 x1893 -1 x2042 -1 x2191 -1 x2340 -1 x2489 -1 x2638 -1 x2787 -1 x2936 -1 x3085 -1 x3234 -1 x3383 -1 x3532 -1 x3681 -1 x3830 -1 x3979 -1 x4128 -1 x4277 -1 x4426 -1 x4575 -1 x4724 -1 x4873 -1 x5022 -1 x5171 -1 x5320 -1 x5469 -1 x5618 -1 x5767 -1 x5916 -1 x6065 -1 x6214 -1 x6363 -1 x6512 -1 x6661 -1 x6810 -1 x6959 -1 x7108 -1 x7257 -1 x7406 -1 x7555 -1 x7704 -1 x7853 -1 x8002 -1 x8151 -1 x8300 -1 x8449 -1 x8598 -1 x8747 -1 x8896 -1 x9045 -1 x9194 -1 x9343 -1 x9492 -1 x9641 -1 x9790 -1 x9939 -1 x10088 -1 x10237 -1 x10386 -1 x10535 -1 x10684 -1 x10833 -1 x10982 -1 x11131 -1 x11280 -1 x11429 -1 x11578 -1 x11727 -1 x11876 -1 x12025 -1 x12174 -1 x12323 -1 x12472 -1 x12621 -1 x12770 -1 x12919 -1 x13068 -1 x13217 -1 x13366 -1 x13515 -1 x13664 -1 x13813 -1 x13962 -1 x14111 -1 x14260 -1 x14409 -1 x14558 -1 x14707 -1 x14856 -1 x15005 -1 x15154 -1 x15303 -1 x15452 -1 x15601 -1 x15750 -1 x15899 -1 x16048 -1 x16197 -1 x16346 -1 x16495 -1 x16644 -1 x16793 -1 x16942 -1 x17091 -1 x17240 -1 x17389 -1 x17538 -1 x17687 -1 x17836 -1 x17985 -1 x18134 -1 x18283 -1 x18432 -1 x18581 -1 x18730 -1 x18879 -1 x19028 -1 x19177 -1 x19326 -1 x19475 -1 x19624 -1 x19773 -1 x19922 -1 x20071 -1 x20220 -1 x20369 -1 x20518 -1 x20667 -1 x20816 -1 x20965 -1 x21114 -1 x21263 -1 x21412 -1 x21561 -1 x21710 -1 x21859 -1 x22008 -1 x22157 -1 x22306 >= -1;+-1 x106 -1 x255 -1 x404 -1 x553 -1 x702 -1 x851 -1 x1000 -1 x1149 -1 x1298 -1 x1447 -1 x1596 -1 x1745 -1 x1894 -1 x2043 -1 x2192 -1 x2341 -1 x2490 -1 x2639 -1 x2788 -1 x2937 -1 x3086 -1 x3235 -1 x3384 -1 x3533 -1 x3682 -1 x3831 -1 x3980 -1 x4129 -1 x4278 -1 x4427 -1 x4576 -1 x4725 -1 x4874 -1 x5023 -1 x5172 -1 x5321 -1 x5470 -1 x5619 -1 x5768 -1 x5917 -1 x6066 -1 x6215 -1 x6364 -1 x6513 -1 x6662 -1 x6811 -1 x6960 -1 x7109 -1 x7258 -1 x7407 -1 x7556 -1 x7705 -1 x7854 -1 x8003 -1 x8152 -1 x8301 -1 x8450 -1 x8599 -1 x8748 -1 x8897 -1 x9046 -1 x9195 -1 x9344 -1 x9493 -1 x9642 -1 x9791 -1 x9940 -1 x10089 -1 x10238 -1 x10387 -1 x10536 -1 x10685 -1 x10834 -1 x10983 -1 x11132 -1 x11281 -1 x11430 -1 x11579 -1 x11728 -1 x11877 -1 x12026 -1 x12175 -1 x12324 -1 x12473 -1 x12622 -1 x12771 -1 x12920 -1 x13069 -1 x13218 -1 x13367 -1 x13516 -1 x13665 -1 x13814 -1 x13963 -1 x14112 -1 x14261 -1 x14410 -1 x14559 -1 x14708 -1 x14857 -1 x15006 -1 x15155 -1 x15304 -1 x15453 -1 x15602 -1 x15751 -1 x15900 -1 x16049 -1 x16198 -1 x16347 -1 x16496 -1 x16645 -1 x16794 -1 x16943 -1 x17092 -1 x17241 -1 x17390 -1 x17539 -1 x17688 -1 x17837 -1 x17986 -1 x18135 -1 x18284 -1 x18433 -1 x18582 -1 x18731 -1 x18880 -1 x19029 -1 x19178 -1 x19327 -1 x19476 -1 x19625 -1 x19774 -1 x19923 -1 x20072 -1 x20221 -1 x20370 -1 x20519 -1 x20668 -1 x20817 -1 x20966 -1 x21115 -1 x21264 -1 x21413 -1 x21562 -1 x21711 -1 x21860 -1 x22009 -1 x22158 -1 x22307 >= -1;+-1 x107 -1 x256 -1 x405 -1 x554 -1 x703 -1 x852 -1 x1001 -1 x1150 -1 x1299 -1 x1448 -1 x1597 -1 x1746 -1 x1895 -1 x2044 -1 x2193 -1 x2342 -1 x2491 -1 x2640 -1 x2789 -1 x2938 -1 x3087 -1 x3236 -1 x3385 -1 x3534 -1 x3683 -1 x3832 -1 x3981 -1 x4130 -1 x4279 -1 x4428 -1 x4577 -1 x4726 -1 x4875 -1 x5024 -1 x5173 -1 x5322 -1 x5471 -1 x5620 -1 x5769 -1 x5918 -1 x6067 -1 x6216 -1 x6365 -1 x6514 -1 x6663 -1 x6812 -1 x6961 -1 x7110 -1 x7259 -1 x7408 -1 x7557 -1 x7706 -1 x7855 -1 x8004 -1 x8153 -1 x8302 -1 x8451 -1 x8600 -1 x8749 -1 x8898 -1 x9047 -1 x9196 -1 x9345 -1 x9494 -1 x9643 -1 x9792 -1 x9941 -1 x10090 -1 x10239 -1 x10388 -1 x10537 -1 x10686 -1 x10835 -1 x10984 -1 x11133 -1 x11282 -1 x11431 -1 x11580 -1 x11729 -1 x11878 -1 x12027 -1 x12176 -1 x12325 -1 x12474 -1 x12623 -1 x12772 -1 x12921 -1 x13070 -1 x13219 -1 x13368 -1 x13517 -1 x13666 -1 x13815 -1 x13964 -1 x14113 -1 x14262 -1 x14411 -1 x14560 -1 x14709 -1 x14858 -1 x15007 -1 x15156 -1 x15305 -1 x15454 -1 x15603 -1 x15752 -1 x15901 -1 x16050 -1 x16199 -1 x16348 -1 x16497 -1 x16646 -1 x16795 -1 x16944 -1 x17093 -1 x17242 -1 x17391 -1 x17540 -1 x17689 -1 x17838 -1 x17987 -1 x18136 -1 x18285 -1 x18434 -1 x18583 -1 x18732 -1 x18881 -1 x19030 -1 x19179 -1 x19328 -1 x19477 -1 x19626 -1 x19775 -1 x19924 -1 x20073 -1 x20222 -1 x20371 -1 x20520 -1 x20669 -1 x20818 -1 x20967 -1 x21116 -1 x21265 -1 x21414 -1 x21563 -1 x21712 -1 x21861 -1 x22010 -1 x22159 -1 x22308 >= -1;+-1 x108 -1 x257 -1 x406 -1 x555 -1 x704 -1 x853 -1 x1002 -1 x1151 -1 x1300 -1 x1449 -1 x1598 -1 x1747 -1 x1896 -1 x2045 -1 x2194 -1 x2343 -1 x2492 -1 x2641 -1 x2790 -1 x2939 -1 x3088 -1 x3237 -1 x3386 -1 x3535 -1 x3684 -1 x3833 -1 x3982 -1 x4131 -1 x4280 -1 x4429 -1 x4578 -1 x4727 -1 x4876 -1 x5025 -1 x5174 -1 x5323 -1 x5472 -1 x5621 -1 x5770 -1 x5919 -1 x6068 -1 x6217 -1 x6366 -1 x6515 -1 x6664 -1 x6813 -1 x6962 -1 x7111 -1 x7260 -1 x7409 -1 x7558 -1 x7707 -1 x7856 -1 x8005 -1 x8154 -1 x8303 -1 x8452 -1 x8601 -1 x8750 -1 x8899 -1 x9048 -1 x9197 -1 x9346 -1 x9495 -1 x9644 -1 x9793 -1 x9942 -1 x10091 -1 x10240 -1 x10389 -1 x10538 -1 x10687 -1 x10836 -1 x10985 -1 x11134 -1 x11283 -1 x11432 -1 x11581 -1 x11730 -1 x11879 -1 x12028 -1 x12177 -1 x12326 -1 x12475 -1 x12624 -1 x12773 -1 x12922 -1 x13071 -1 x13220 -1 x13369 -1 x13518 -1 x13667 -1 x13816 -1 x13965 -1 x14114 -1 x14263 -1 x14412 -1 x14561 -1 x14710 -1 x14859 -1 x15008 -1 x15157 -1 x15306 -1 x15455 -1 x15604 -1 x15753 -1 x15902 -1 x16051 -1 x16200 -1 x16349 -1 x16498 -1 x16647 -1 x16796 -1 x16945 -1 x17094 -1 x17243 -1 x17392 -1 x17541 -1 x17690 -1 x17839 -1 x17988 -1 x18137 -1 x18286 -1 x18435 -1 x18584 -1 x18733 -1 x18882 -1 x19031 -1 x19180 -1 x19329 -1 x19478 -1 x19627 -1 x19776 -1 x19925 -1 x20074 -1 x20223 -1 x20372 -1 x20521 -1 x20670 -1 x20819 -1 x20968 -1 x21117 -1 x21266 -1 x21415 -1 x21564 -1 x21713 -1 x21862 -1 x22011 -1 x22160 -1 x22309 >= -1;+-1 x109 -1 x258 -1 x407 -1 x556 -1 x705 -1 x854 -1 x1003 -1 x1152 -1 x1301 -1 x1450 -1 x1599 -1 x1748 -1 x1897 -1 x2046 -1 x2195 -1 x2344 -1 x2493 -1 x2642 -1 x2791 -1 x2940 -1 x3089 -1 x3238 -1 x3387 -1 x3536 -1 x3685 -1 x3834 -1 x3983 -1 x4132 -1 x4281 -1 x4430 -1 x4579 -1 x4728 -1 x4877 -1 x5026 -1 x5175 -1 x5324 -1 x5473 -1 x5622 -1 x5771 -1 x5920 -1 x6069 -1 x6218 -1 x6367 -1 x6516 -1 x6665 -1 x6814 -1 x6963 -1 x7112 -1 x7261 -1 x7410 -1 x7559 -1 x7708 -1 x7857 -1 x8006 -1 x8155 -1 x8304 -1 x8453 -1 x8602 -1 x8751 -1 x8900 -1 x9049 -1 x9198 -1 x9347 -1 x9496 -1 x9645 -1 x9794 -1 x9943 -1 x10092 -1 x10241 -1 x10390 -1 x10539 -1 x10688 -1 x10837 -1 x10986 -1 x11135 -1 x11284 -1 x11433 -1 x11582 -1 x11731 -1 x11880 -1 x12029 -1 x12178 -1 x12327 -1 x12476 -1 x12625 -1 x12774 -1 x12923 -1 x13072 -1 x13221 -1 x13370 -1 x13519 -1 x13668 -1 x13817 -1 x13966 -1 x14115 -1 x14264 -1 x14413 -1 x14562 -1 x14711 -1 x14860 -1 x15009 -1 x15158 -1 x15307 -1 x15456 -1 x15605 -1 x15754 -1 x15903 -1 x16052 -1 x16201 -1 x16350 -1 x16499 -1 x16648 -1 x16797 -1 x16946 -1 x17095 -1 x17244 -1 x17393 -1 x17542 -1 x17691 -1 x17840 -1 x17989 -1 x18138 -1 x18287 -1 x18436 -1 x18585 -1 x18734 -1 x18883 -1 x19032 -1 x19181 -1 x19330 -1 x19479 -1 x19628 -1 x19777 -1 x19926 -1 x20075 -1 x20224 -1 x20373 -1 x20522 -1 x20671 -1 x20820 -1 x20969 -1 x21118 -1 x21267 -1 x21416 -1 x21565 -1 x21714 -1 x21863 -1 x22012 -1 x22161 -1 x22310 >= -1;+-1 x110 -1 x259 -1 x408 -1 x557 -1 x706 -1 x855 -1 x1004 -1 x1153 -1 x1302 -1 x1451 -1 x1600 -1 x1749 -1 x1898 -1 x2047 -1 x2196 -1 x2345 -1 x2494 -1 x2643 -1 x2792 -1 x2941 -1 x3090 -1 x3239 -1 x3388 -1 x3537 -1 x3686 -1 x3835 -1 x3984 -1 x4133 -1 x4282 -1 x4431 -1 x4580 -1 x4729 -1 x4878 -1 x5027 -1 x5176 -1 x5325 -1 x5474 -1 x5623 -1 x5772 -1 x5921 -1 x6070 -1 x6219 -1 x6368 -1 x6517 -1 x6666 -1 x6815 -1 x6964 -1 x7113 -1 x7262 -1 x7411 -1 x7560 -1 x7709 -1 x7858 -1 x8007 -1 x8156 -1 x8305 -1 x8454 -1 x8603 -1 x8752 -1 x8901 -1 x9050 -1 x9199 -1 x9348 -1 x9497 -1 x9646 -1 x9795 -1 x9944 -1 x10093 -1 x10242 -1 x10391 -1 x10540 -1 x10689 -1 x10838 -1 x10987 -1 x11136 -1 x11285 -1 x11434 -1 x11583 -1 x11732 -1 x11881 -1 x12030 -1 x12179 -1 x12328 -1 x12477 -1 x12626 -1 x12775 -1 x12924 -1 x13073 -1 x13222 -1 x13371 -1 x13520 -1 x13669 -1 x13818 -1 x13967 -1 x14116 -1 x14265 -1 x14414 -1 x14563 -1 x14712 -1 x14861 -1 x15010 -1 x15159 -1 x15308 -1 x15457 -1 x15606 -1 x15755 -1 x15904 -1 x16053 -1 x16202 -1 x16351 -1 x16500 -1 x16649 -1 x16798 -1 x16947 -1 x17096 -1 x17245 -1 x17394 -1 x17543 -1 x17692 -1 x17841 -1 x17990 -1 x18139 -1 x18288 -1 x18437 -1 x18586 -1 x18735 -1 x18884 -1 x19033 -1 x19182 -1 x19331 -1 x19480 -1 x19629 -1 x19778 -1 x19927 -1 x20076 -1 x20225 -1 x20374 -1 x20523 -1 x20672 -1 x20821 -1 x20970 -1 x21119 -1 x21268 -1 x21417 -1 x21566 -1 x21715 -1 x21864 -1 x22013 -1 x22162 -1 x22311 >= -1;+-1 x111 -1 x260 -1 x409 -1 x558 -1 x707 -1 x856 -1 x1005 -1 x1154 -1 x1303 -1 x1452 -1 x1601 -1 x1750 -1 x1899 -1 x2048 -1 x2197 -1 x2346 -1 x2495 -1 x2644 -1 x2793 -1 x2942 -1 x3091 -1 x3240 -1 x3389 -1 x3538 -1 x3687 -1 x3836 -1 x3985 -1 x4134 -1 x4283 -1 x4432 -1 x4581 -1 x4730 -1 x4879 -1 x5028 -1 x5177 -1 x5326 -1 x5475 -1 x5624 -1 x5773 -1 x5922 -1 x6071 -1 x6220 -1 x6369 -1 x6518 -1 x6667 -1 x6816 -1 x6965 -1 x7114 -1 x7263 -1 x7412 -1 x7561 -1 x7710 -1 x7859 -1 x8008 -1 x8157 -1 x8306 -1 x8455 -1 x8604 -1 x8753 -1 x8902 -1 x9051 -1 x9200 -1 x9349 -1 x9498 -1 x9647 -1 x9796 -1 x9945 -1 x10094 -1 x10243 -1 x10392 -1 x10541 -1 x10690 -1 x10839 -1 x10988 -1 x11137 -1 x11286 -1 x11435 -1 x11584 -1 x11733 -1 x11882 -1 x12031 -1 x12180 -1 x12329 -1 x12478 -1 x12627 -1 x12776 -1 x12925 -1 x13074 -1 x13223 -1 x13372 -1 x13521 -1 x13670 -1 x13819 -1 x13968 -1 x14117 -1 x14266 -1 x14415 -1 x14564 -1 x14713 -1 x14862 -1 x15011 -1 x15160 -1 x15309 -1 x15458 -1 x15607 -1 x15756 -1 x15905 -1 x16054 -1 x16203 -1 x16352 -1 x16501 -1 x16650 -1 x16799 -1 x16948 -1 x17097 -1 x17246 -1 x17395 -1 x17544 -1 x17693 -1 x17842 -1 x17991 -1 x18140 -1 x18289 -1 x18438 -1 x18587 -1 x18736 -1 x18885 -1 x19034 -1 x19183 -1 x19332 -1 x19481 -1 x19630 -1 x19779 -1 x19928 -1 x20077 -1 x20226 -1 x20375 -1 x20524 -1 x20673 -1 x20822 -1 x20971 -1 x21120 -1 x21269 -1 x21418 -1 x21567 -1 x21716 -1 x21865 -1 x22014 -1 x22163 -1 x22312 >= -1;+-1 x112 -1 x261 -1 x410 -1 x559 -1 x708 -1 x857 -1 x1006 -1 x1155 -1 x1304 -1 x1453 -1 x1602 -1 x1751 -1 x1900 -1 x2049 -1 x2198 -1 x2347 -1 x2496 -1 x2645 -1 x2794 -1 x2943 -1 x3092 -1 x3241 -1 x3390 -1 x3539 -1 x3688 -1 x3837 -1 x3986 -1 x4135 -1 x4284 -1 x4433 -1 x4582 -1 x4731 -1 x4880 -1 x5029 -1 x5178 -1 x5327 -1 x5476 -1 x5625 -1 x5774 -1 x5923 -1 x6072 -1 x6221 -1 x6370 -1 x6519 -1 x6668 -1 x6817 -1 x6966 -1 x7115 -1 x7264 -1 x7413 -1 x7562 -1 x7711 -1 x7860 -1 x8009 -1 x8158 -1 x8307 -1 x8456 -1 x8605 -1 x8754 -1 x8903 -1 x9052 -1 x9201 -1 x9350 -1 x9499 -1 x9648 -1 x9797 -1 x9946 -1 x10095 -1 x10244 -1 x10393 -1 x10542 -1 x10691 -1 x10840 -1 x10989 -1 x11138 -1 x11287 -1 x11436 -1 x11585 -1 x11734 -1 x11883 -1 x12032 -1 x12181 -1 x12330 -1 x12479 -1 x12628 -1 x12777 -1 x12926 -1 x13075 -1 x13224 -1 x13373 -1 x13522 -1 x13671 -1 x13820 -1 x13969 -1 x14118 -1 x14267 -1 x14416 -1 x14565 -1 x14714 -1 x14863 -1 x15012 -1 x15161 -1 x15310 -1 x15459 -1 x15608 -1 x15757 -1 x15906 -1 x16055 -1 x16204 -1 x16353 -1 x16502 -1 x16651 -1 x16800 -1 x16949 -1 x17098 -1 x17247 -1 x17396 -1 x17545 -1 x17694 -1 x17843 -1 x17992 -1 x18141 -1 x18290 -1 x18439 -1 x18588 -1 x18737 -1 x18886 -1 x19035 -1 x19184 -1 x19333 -1 x19482 -1 x19631 -1 x19780 -1 x19929 -1 x20078 -1 x20227 -1 x20376 -1 x20525 -1 x20674 -1 x20823 -1 x20972 -1 x21121 -1 x21270 -1 x21419 -1 x21568 -1 x21717 -1 x21866 -1 x22015 -1 x22164 -1 x22313 >= -1;+-1 x113 -1 x262 -1 x411 -1 x560 -1 x709 -1 x858 -1 x1007 -1 x1156 -1 x1305 -1 x1454 -1 x1603 -1 x1752 -1 x1901 -1 x2050 -1 x2199 -1 x2348 -1 x2497 -1 x2646 -1 x2795 -1 x2944 -1 x3093 -1 x3242 -1 x3391 -1 x3540 -1 x3689 -1 x3838 -1 x3987 -1 x4136 -1 x4285 -1 x4434 -1 x4583 -1 x4732 -1 x4881 -1 x5030 -1 x5179 -1 x5328 -1 x5477 -1 x5626 -1 x5775 -1 x5924 -1 x6073 -1 x6222 -1 x6371 -1 x6520 -1 x6669 -1 x6818 -1 x6967 -1 x7116 -1 x7265 -1 x7414 -1 x7563 -1 x7712 -1 x7861 -1 x8010 -1 x8159 -1 x8308 -1 x8457 -1 x8606 -1 x8755 -1 x8904 -1 x9053 -1 x9202 -1 x9351 -1 x9500 -1 x9649 -1 x9798 -1 x9947 -1 x10096 -1 x10245 -1 x10394 -1 x10543 -1 x10692 -1 x10841 -1 x10990 -1 x11139 -1 x11288 -1 x11437 -1 x11586 -1 x11735 -1 x11884 -1 x12033 -1 x12182 -1 x12331 -1 x12480 -1 x12629 -1 x12778 -1 x12927 -1 x13076 -1 x13225 -1 x13374 -1 x13523 -1 x13672 -1 x13821 -1 x13970 -1 x14119 -1 x14268 -1 x14417 -1 x14566 -1 x14715 -1 x14864 -1 x15013 -1 x15162 -1 x15311 -1 x15460 -1 x15609 -1 x15758 -1 x15907 -1 x16056 -1 x16205 -1 x16354 -1 x16503 -1 x16652 -1 x16801 -1 x16950 -1 x17099 -1 x17248 -1 x17397 -1 x17546 -1 x17695 -1 x17844 -1 x17993 -1 x18142 -1 x18291 -1 x18440 -1 x18589 -1 x18738 -1 x18887 -1 x19036 -1 x19185 -1 x19334 -1 x19483 -1 x19632 -1 x19781 -1 x19930 -1 x20079 -1 x20228 -1 x20377 -1 x20526 -1 x20675 -1 x20824 -1 x20973 -1 x21122 -1 x21271 -1 x21420 -1 x21569 -1 x21718 -1 x21867 -1 x22016 -1 x22165 -1 x22314 >= -1;+-1 x114 -1 x263 -1 x412 -1 x561 -1 x710 -1 x859 -1 x1008 -1 x1157 -1 x1306 -1 x1455 -1 x1604 -1 x1753 -1 x1902 -1 x2051 -1 x2200 -1 x2349 -1 x2498 -1 x2647 -1 x2796 -1 x2945 -1 x3094 -1 x3243 -1 x3392 -1 x3541 -1 x3690 -1 x3839 -1 x3988 -1 x4137 -1 x4286 -1 x4435 -1 x4584 -1 x4733 -1 x4882 -1 x5031 -1 x5180 -1 x5329 -1 x5478 -1 x5627 -1 x5776 -1 x5925 -1 x6074 -1 x6223 -1 x6372 -1 x6521 -1 x6670 -1 x6819 -1 x6968 -1 x7117 -1 x7266 -1 x7415 -1 x7564 -1 x7713 -1 x7862 -1 x8011 -1 x8160 -1 x8309 -1 x8458 -1 x8607 -1 x8756 -1 x8905 -1 x9054 -1 x9203 -1 x9352 -1 x9501 -1 x9650 -1 x9799 -1 x9948 -1 x10097 -1 x10246 -1 x10395 -1 x10544 -1 x10693 -1 x10842 -1 x10991 -1 x11140 -1 x11289 -1 x11438 -1 x11587 -1 x11736 -1 x11885 -1 x12034 -1 x12183 -1 x12332 -1 x12481 -1 x12630 -1 x12779 -1 x12928 -1 x13077 -1 x13226 -1 x13375 -1 x13524 -1 x13673 -1 x13822 -1 x13971 -1 x14120 -1 x14269 -1 x14418 -1 x14567 -1 x14716 -1 x14865 -1 x15014 -1 x15163 -1 x15312 -1 x15461 -1 x15610 -1 x15759 -1 x15908 -1 x16057 -1 x16206 -1 x16355 -1 x16504 -1 x16653 -1 x16802 -1 x16951 -1 x17100 -1 x17249 -1 x17398 -1 x17547 -1 x17696 -1 x17845 -1 x17994 -1 x18143 -1 x18292 -1 x18441 -1 x18590 -1 x18739 -1 x18888 -1 x19037 -1 x19186 -1 x19335 -1 x19484 -1 x19633 -1 x19782 -1 x19931 -1 x20080 -1 x20229 -1 x20378 -1 x20527 -1 x20676 -1 x20825 -1 x20974 -1 x21123 -1 x21272 -1 x21421 -1 x21570 -1 x21719 -1 x21868 -1 x22017 -1 x22166 -1 x22315 >= -1;+-1 x115 -1 x264 -1 x413 -1 x562 -1 x711 -1 x860 -1 x1009 -1 x1158 -1 x1307 -1 x1456 -1 x1605 -1 x1754 -1 x1903 -1 x2052 -1 x2201 -1 x2350 -1 x2499 -1 x2648 -1 x2797 -1 x2946 -1 x3095 -1 x3244 -1 x3393 -1 x3542 -1 x3691 -1 x3840 -1 x3989 -1 x4138 -1 x4287 -1 x4436 -1 x4585 -1 x4734 -1 x4883 -1 x5032 -1 x5181 -1 x5330 -1 x5479 -1 x5628 -1 x5777 -1 x5926 -1 x6075 -1 x6224 -1 x6373 -1 x6522 -1 x6671 -1 x6820 -1 x6969 -1 x7118 -1 x7267 -1 x7416 -1 x7565 -1 x7714 -1 x7863 -1 x8012 -1 x8161 -1 x8310 -1 x8459 -1 x8608 -1 x8757 -1 x8906 -1 x9055 -1 x9204 -1 x9353 -1 x9502 -1 x9651 -1 x9800 -1 x9949 -1 x10098 -1 x10247 -1 x10396 -1 x10545 -1 x10694 -1 x10843 -1 x10992 -1 x11141 -1 x11290 -1 x11439 -1 x11588 -1 x11737 -1 x11886 -1 x12035 -1 x12184 -1 x12333 -1 x12482 -1 x12631 -1 x12780 -1 x12929 -1 x13078 -1 x13227 -1 x13376 -1 x13525 -1 x13674 -1 x13823 -1 x13972 -1 x14121 -1 x14270 -1 x14419 -1 x14568 -1 x14717 -1 x14866 -1 x15015 -1 x15164 -1 x15313 -1 x15462 -1 x15611 -1 x15760 -1 x15909 -1 x16058 -1 x16207 -1 x16356 -1 x16505 -1 x16654 -1 x16803 -1 x16952 -1 x17101 -1 x17250 -1 x17399 -1 x17548 -1 x17697 -1 x17846 -1 x17995 -1 x18144 -1 x18293 -1 x18442 -1 x18591 -1 x18740 -1 x18889 -1 x19038 -1 x19187 -1 x19336 -1 x19485 -1 x19634 -1 x19783 -1 x19932 -1 x20081 -1 x20230 -1 x20379 -1 x20528 -1 x20677 -1 x20826 -1 x20975 -1 x21124 -1 x21273 -1 x21422 -1 x21571 -1 x21720 -1 x21869 -1 x22018 -1 x22167 -1 x22316 >= -1;+-1 x116 -1 x265 -1 x414 -1 x563 -1 x712 -1 x861 -1 x1010 -1 x1159 -1 x1308 -1 x1457 -1 x1606 -1 x1755 -1 x1904 -1 x2053 -1 x2202 -1 x2351 -1 x2500 -1 x2649 -1 x2798 -1 x2947 -1 x3096 -1 x3245 -1 x3394 -1 x3543 -1 x3692 -1 x3841 -1 x3990 -1 x4139 -1 x4288 -1 x4437 -1 x4586 -1 x4735 -1 x4884 -1 x5033 -1 x5182 -1 x5331 -1 x5480 -1 x5629 -1 x5778 -1 x5927 -1 x6076 -1 x6225 -1 x6374 -1 x6523 -1 x6672 -1 x6821 -1 x6970 -1 x7119 -1 x7268 -1 x7417 -1 x7566 -1 x7715 -1 x7864 -1 x8013 -1 x8162 -1 x8311 -1 x8460 -1 x8609 -1 x8758 -1 x8907 -1 x9056 -1 x9205 -1 x9354 -1 x9503 -1 x9652 -1 x9801 -1 x9950 -1 x10099 -1 x10248 -1 x10397 -1 x10546 -1 x10695 -1 x10844 -1 x10993 -1 x11142 -1 x11291 -1 x11440 -1 x11589 -1 x11738 -1 x11887 -1 x12036 -1 x12185 -1 x12334 -1 x12483 -1 x12632 -1 x12781 -1 x12930 -1 x13079 -1 x13228 -1 x13377 -1 x13526 -1 x13675 -1 x13824 -1 x13973 -1 x14122 -1 x14271 -1 x14420 -1 x14569 -1 x14718 -1 x14867 -1 x15016 -1 x15165 -1 x15314 -1 x15463 -1 x15612 -1 x15761 -1 x15910 -1 x16059 -1 x16208 -1 x16357 -1 x16506 -1 x16655 -1 x16804 -1 x16953 -1 x17102 -1 x17251 -1 x17400 -1 x17549 -1 x17698 -1 x17847 -1 x17996 -1 x18145 -1 x18294 -1 x18443 -1 x18592 -1 x18741 -1 x18890 -1 x19039 -1 x19188 -1 x19337 -1 x19486 -1 x19635 -1 x19784 -1 x19933 -1 x20082 -1 x20231 -1 x20380 -1 x20529 -1 x20678 -1 x20827 -1 x20976 -1 x21125 -1 x21274 -1 x21423 -1 x21572 -1 x21721 -1 x21870 -1 x22019 -1 x22168 -1 x22317 >= -1;+-1 x117 -1 x266 -1 x415 -1 x564 -1 x713 -1 x862 -1 x1011 -1 x1160 -1 x1309 -1 x1458 -1 x1607 -1 x1756 -1 x1905 -1 x2054 -1 x2203 -1 x2352 -1 x2501 -1 x2650 -1 x2799 -1 x2948 -1 x3097 -1 x3246 -1 x3395 -1 x3544 -1 x3693 -1 x3842 -1 x3991 -1 x4140 -1 x4289 -1 x4438 -1 x4587 -1 x4736 -1 x4885 -1 x5034 -1 x5183 -1 x5332 -1 x5481 -1 x5630 -1 x5779 -1 x5928 -1 x6077 -1 x6226 -1 x6375 -1 x6524 -1 x6673 -1 x6822 -1 x6971 -1 x7120 -1 x7269 -1 x7418 -1 x7567 -1 x7716 -1 x7865 -1 x8014 -1 x8163 -1 x8312 -1 x8461 -1 x8610 -1 x8759 -1 x8908 -1 x9057 -1 x9206 -1 x9355 -1 x9504 -1 x9653 -1 x9802 -1 x9951 -1 x10100 -1 x10249 -1 x10398 -1 x10547 -1 x10696 -1 x10845 -1 x10994 -1 x11143 -1 x11292 -1 x11441 -1 x11590 -1 x11739 -1 x11888 -1 x12037 -1 x12186 -1 x12335 -1 x12484 -1 x12633 -1 x12782 -1 x12931 -1 x13080 -1 x13229 -1 x13378 -1 x13527 -1 x13676 -1 x13825 -1 x13974 -1 x14123 -1 x14272 -1 x14421 -1 x14570 -1 x14719 -1 x14868 -1 x15017 -1 x15166 -1 x15315 -1 x15464 -1 x15613 -1 x15762 -1 x15911 -1 x16060 -1 x16209 -1 x16358 -1 x16507 -1 x16656 -1 x16805 -1 x16954 -1 x17103 -1 x17252 -1 x17401 -1 x17550 -1 x17699 -1 x17848 -1 x17997 -1 x18146 -1 x18295 -1 x18444 -1 x18593 -1 x18742 -1 x18891 -1 x19040 -1 x19189 -1 x19338 -1 x19487 -1 x19636 -1 x19785 -1 x19934 -1 x20083 -1 x20232 -1 x20381 -1 x20530 -1 x20679 -1 x20828 -1 x20977 -1 x21126 -1 x21275 -1 x21424 -1 x21573 -1 x21722 -1 x21871 -1 x22020 -1 x22169 -1 x22318 >= -1;+-1 x118 -1 x267 -1 x416 -1 x565 -1 x714 -1 x863 -1 x1012 -1 x1161 -1 x1310 -1 x1459 -1 x1608 -1 x1757 -1 x1906 -1 x2055 -1 x2204 -1 x2353 -1 x2502 -1 x2651 -1 x2800 -1 x2949 -1 x3098 -1 x3247 -1 x3396 -1 x3545 -1 x3694 -1 x3843 -1 x3992 -1 x4141 -1 x4290 -1 x4439 -1 x4588 -1 x4737 -1 x4886 -1 x5035 -1 x5184 -1 x5333 -1 x5482 -1 x5631 -1 x5780 -1 x5929 -1 x6078 -1 x6227 -1 x6376 -1 x6525 -1 x6674 -1 x6823 -1 x6972 -1 x7121 -1 x7270 -1 x7419 -1 x7568 -1 x7717 -1 x7866 -1 x8015 -1 x8164 -1 x8313 -1 x8462 -1 x8611 -1 x8760 -1 x8909 -1 x9058 -1 x9207 -1 x9356 -1 x9505 -1 x9654 -1 x9803 -1 x9952 -1 x10101 -1 x10250 -1 x10399 -1 x10548 -1 x10697 -1 x10846 -1 x10995 -1 x11144 -1 x11293 -1 x11442 -1 x11591 -1 x11740 -1 x11889 -1 x12038 -1 x12187 -1 x12336 -1 x12485 -1 x12634 -1 x12783 -1 x12932 -1 x13081 -1 x13230 -1 x13379 -1 x13528 -1 x13677 -1 x13826 -1 x13975 -1 x14124 -1 x14273 -1 x14422 -1 x14571 -1 x14720 -1 x14869 -1 x15018 -1 x15167 -1 x15316 -1 x15465 -1 x15614 -1 x15763 -1 x15912 -1 x16061 -1 x16210 -1 x16359 -1 x16508 -1 x16657 -1 x16806 -1 x16955 -1 x17104 -1 x17253 -1 x17402 -1 x17551 -1 x17700 -1 x17849 -1 x17998 -1 x18147 -1 x18296 -1 x18445 -1 x18594 -1 x18743 -1 x18892 -1 x19041 -1 x19190 -1 x19339 -1 x19488 -1 x19637 -1 x19786 -1 x19935 -1 x20084 -1 x20233 -1 x20382 -1 x20531 -1 x20680 -1 x20829 -1 x20978 -1 x21127 -1 x21276 -1 x21425 -1 x21574 -1 x21723 -1 x21872 -1 x22021 -1 x22170 -1 x22319 >= -1;+-1 x119 -1 x268 -1 x417 -1 x566 -1 x715 -1 x864 -1 x1013 -1 x1162 -1 x1311 -1 x1460 -1 x1609 -1 x1758 -1 x1907 -1 x2056 -1 x2205 -1 x2354 -1 x2503 -1 x2652 -1 x2801 -1 x2950 -1 x3099 -1 x3248 -1 x3397 -1 x3546 -1 x3695 -1 x3844 -1 x3993 -1 x4142 -1 x4291 -1 x4440 -1 x4589 -1 x4738 -1 x4887 -1 x5036 -1 x5185 -1 x5334 -1 x5483 -1 x5632 -1 x5781 -1 x5930 -1 x6079 -1 x6228 -1 x6377 -1 x6526 -1 x6675 -1 x6824 -1 x6973 -1 x7122 -1 x7271 -1 x7420 -1 x7569 -1 x7718 -1 x7867 -1 x8016 -1 x8165 -1 x8314 -1 x8463 -1 x8612 -1 x8761 -1 x8910 -1 x9059 -1 x9208 -1 x9357 -1 x9506 -1 x9655 -1 x9804 -1 x9953 -1 x10102 -1 x10251 -1 x10400 -1 x10549 -1 x10698 -1 x10847 -1 x10996 -1 x11145 -1 x11294 -1 x11443 -1 x11592 -1 x11741 -1 x11890 -1 x12039 -1 x12188 -1 x12337 -1 x12486 -1 x12635 -1 x12784 -1 x12933 -1 x13082 -1 x13231 -1 x13380 -1 x13529 -1 x13678 -1 x13827 -1 x13976 -1 x14125 -1 x14274 -1 x14423 -1 x14572 -1 x14721 -1 x14870 -1 x15019 -1 x15168 -1 x15317 -1 x15466 -1 x15615 -1 x15764 -1 x15913 -1 x16062 -1 x16211 -1 x16360 -1 x16509 -1 x16658 -1 x16807 -1 x16956 -1 x17105 -1 x17254 -1 x17403 -1 x17552 -1 x17701 -1 x17850 -1 x17999 -1 x18148 -1 x18297 -1 x18446 -1 x18595 -1 x18744 -1 x18893 -1 x19042 -1 x19191 -1 x19340 -1 x19489 -1 x19638 -1 x19787 -1 x19936 -1 x20085 -1 x20234 -1 x20383 -1 x20532 -1 x20681 -1 x20830 -1 x20979 -1 x21128 -1 x21277 -1 x21426 -1 x21575 -1 x21724 -1 x21873 -1 x22022 -1 x22171 -1 x22320 >= -1;+-1 x120 -1 x269 -1 x418 -1 x567 -1 x716 -1 x865 -1 x1014 -1 x1163 -1 x1312 -1 x1461 -1 x1610 -1 x1759 -1 x1908 -1 x2057 -1 x2206 -1 x2355 -1 x2504 -1 x2653 -1 x2802 -1 x2951 -1 x3100 -1 x3249 -1 x3398 -1 x3547 -1 x3696 -1 x3845 -1 x3994 -1 x4143 -1 x4292 -1 x4441 -1 x4590 -1 x4739 -1 x4888 -1 x5037 -1 x5186 -1 x5335 -1 x5484 -1 x5633 -1 x5782 -1 x5931 -1 x6080 -1 x6229 -1 x6378 -1 x6527 -1 x6676 -1 x6825 -1 x6974 -1 x7123 -1 x7272 -1 x7421 -1 x7570 -1 x7719 -1 x7868 -1 x8017 -1 x8166 -1 x8315 -1 x8464 -1 x8613 -1 x8762 -1 x8911 -1 x9060 -1 x9209 -1 x9358 -1 x9507 -1 x9656 -1 x9805 -1 x9954 -1 x10103 -1 x10252 -1 x10401 -1 x10550 -1 x10699 -1 x10848 -1 x10997 -1 x11146 -1 x11295 -1 x11444 -1 x11593 -1 x11742 -1 x11891 -1 x12040 -1 x12189 -1 x12338 -1 x12487 -1 x12636 -1 x12785 -1 x12934 -1 x13083 -1 x13232 -1 x13381 -1 x13530 -1 x13679 -1 x13828 -1 x13977 -1 x14126 -1 x14275 -1 x14424 -1 x14573 -1 x14722 -1 x14871 -1 x15020 -1 x15169 -1 x15318 -1 x15467 -1 x15616 -1 x15765 -1 x15914 -1 x16063 -1 x16212 -1 x16361 -1 x16510 -1 x16659 -1 x16808 -1 x16957 -1 x17106 -1 x17255 -1 x17404 -1 x17553 -1 x17702 -1 x17851 -1 x18000 -1 x18149 -1 x18298 -1 x18447 -1 x18596 -1 x18745 -1 x18894 -1 x19043 -1 x19192 -1 x19341 -1 x19490 -1 x19639 -1 x19788 -1 x19937 -1 x20086 -1 x20235 -1 x20384 -1 x20533 -1 x20682 -1 x20831 -1 x20980 -1 x21129 -1 x21278 -1 x21427 -1 x21576 -1 x21725 -1 x21874 -1 x22023 -1 x22172 -1 x22321 >= -1;+-1 x121 -1 x270 -1 x419 -1 x568 -1 x717 -1 x866 -1 x1015 -1 x1164 -1 x1313 -1 x1462 -1 x1611 -1 x1760 -1 x1909 -1 x2058 -1 x2207 -1 x2356 -1 x2505 -1 x2654 -1 x2803 -1 x2952 -1 x3101 -1 x3250 -1 x3399 -1 x3548 -1 x3697 -1 x3846 -1 x3995 -1 x4144 -1 x4293 -1 x4442 -1 x4591 -1 x4740 -1 x4889 -1 x5038 -1 x5187 -1 x5336 -1 x5485 -1 x5634 -1 x5783 -1 x5932 -1 x6081 -1 x6230 -1 x6379 -1 x6528 -1 x6677 -1 x6826 -1 x6975 -1 x7124 -1 x7273 -1 x7422 -1 x7571 -1 x7720 -1 x7869 -1 x8018 -1 x8167 -1 x8316 -1 x8465 -1 x8614 -1 x8763 -1 x8912 -1 x9061 -1 x9210 -1 x9359 -1 x9508 -1 x9657 -1 x9806 -1 x9955 -1 x10104 -1 x10253 -1 x10402 -1 x10551 -1 x10700 -1 x10849 -1 x10998 -1 x11147 -1 x11296 -1 x11445 -1 x11594 -1 x11743 -1 x11892 -1 x12041 -1 x12190 -1 x12339 -1 x12488 -1 x12637 -1 x12786 -1 x12935 -1 x13084 -1 x13233 -1 x13382 -1 x13531 -1 x13680 -1 x13829 -1 x13978 -1 x14127 -1 x14276 -1 x14425 -1 x14574 -1 x14723 -1 x14872 -1 x15021 -1 x15170 -1 x15319 -1 x15468 -1 x15617 -1 x15766 -1 x15915 -1 x16064 -1 x16213 -1 x16362 -1 x16511 -1 x16660 -1 x16809 -1 x16958 -1 x17107 -1 x17256 -1 x17405 -1 x17554 -1 x17703 -1 x17852 -1 x18001 -1 x18150 -1 x18299 -1 x18448 -1 x18597 -1 x18746 -1 x18895 -1 x19044 -1 x19193 -1 x19342 -1 x19491 -1 x19640 -1 x19789 -1 x19938 -1 x20087 -1 x20236 -1 x20385 -1 x20534 -1 x20683 -1 x20832 -1 x20981 -1 x21130 -1 x21279 -1 x21428 -1 x21577 -1 x21726 -1 x21875 -1 x22024 -1 x22173 -1 x22322 >= -1;+-1 x122 -1 x271 -1 x420 -1 x569 -1 x718 -1 x867 -1 x1016 -1 x1165 -1 x1314 -1 x1463 -1 x1612 -1 x1761 -1 x1910 -1 x2059 -1 x2208 -1 x2357 -1 x2506 -1 x2655 -1 x2804 -1 x2953 -1 x3102 -1 x3251 -1 x3400 -1 x3549 -1 x3698 -1 x3847 -1 x3996 -1 x4145 -1 x4294 -1 x4443 -1 x4592 -1 x4741 -1 x4890 -1 x5039 -1 x5188 -1 x5337 -1 x5486 -1 x5635 -1 x5784 -1 x5933 -1 x6082 -1 x6231 -1 x6380 -1 x6529 -1 x6678 -1 x6827 -1 x6976 -1 x7125 -1 x7274 -1 x7423 -1 x7572 -1 x7721 -1 x7870 -1 x8019 -1 x8168 -1 x8317 -1 x8466 -1 x8615 -1 x8764 -1 x8913 -1 x9062 -1 x9211 -1 x9360 -1 x9509 -1 x9658 -1 x9807 -1 x9956 -1 x10105 -1 x10254 -1 x10403 -1 x10552 -1 x10701 -1 x10850 -1 x10999 -1 x11148 -1 x11297 -1 x11446 -1 x11595 -1 x11744 -1 x11893 -1 x12042 -1 x12191 -1 x12340 -1 x12489 -1 x12638 -1 x12787 -1 x12936 -1 x13085 -1 x13234 -1 x13383 -1 x13532 -1 x13681 -1 x13830 -1 x13979 -1 x14128 -1 x14277 -1 x14426 -1 x14575 -1 x14724 -1 x14873 -1 x15022 -1 x15171 -1 x15320 -1 x15469 -1 x15618 -1 x15767 -1 x15916 -1 x16065 -1 x16214 -1 x16363 -1 x16512 -1 x16661 -1 x16810 -1 x16959 -1 x17108 -1 x17257 -1 x17406 -1 x17555 -1 x17704 -1 x17853 -1 x18002 -1 x18151 -1 x18300 -1 x18449 -1 x18598 -1 x18747 -1 x18896 -1 x19045 -1 x19194 -1 x19343 -1 x19492 -1 x19641 -1 x19790 -1 x19939 -1 x20088 -1 x20237 -1 x20386 -1 x20535 -1 x20684 -1 x20833 -1 x20982 -1 x21131 -1 x21280 -1 x21429 -1 x21578 -1 x21727 -1 x21876 -1 x22025 -1 x22174 -1 x22323 >= -1;+-1 x123 -1 x272 -1 x421 -1 x570 -1 x719 -1 x868 -1 x1017 -1 x1166 -1 x1315 -1 x1464 -1 x1613 -1 x1762 -1 x1911 -1 x2060 -1 x2209 -1 x2358 -1 x2507 -1 x2656 -1 x2805 -1 x2954 -1 x3103 -1 x3252 -1 x3401 -1 x3550 -1 x3699 -1 x3848 -1 x3997 -1 x4146 -1 x4295 -1 x4444 -1 x4593 -1 x4742 -1 x4891 -1 x5040 -1 x5189 -1 x5338 -1 x5487 -1 x5636 -1 x5785 -1 x5934 -1 x6083 -1 x6232 -1 x6381 -1 x6530 -1 x6679 -1 x6828 -1 x6977 -1 x7126 -1 x7275 -1 x7424 -1 x7573 -1 x7722 -1 x7871 -1 x8020 -1 x8169 -1 x8318 -1 x8467 -1 x8616 -1 x8765 -1 x8914 -1 x9063 -1 x9212 -1 x9361 -1 x9510 -1 x9659 -1 x9808 -1 x9957 -1 x10106 -1 x10255 -1 x10404 -1 x10553 -1 x10702 -1 x10851 -1 x11000 -1 x11149 -1 x11298 -1 x11447 -1 x11596 -1 x11745 -1 x11894 -1 x12043 -1 x12192 -1 x12341 -1 x12490 -1 x12639 -1 x12788 -1 x12937 -1 x13086 -1 x13235 -1 x13384 -1 x13533 -1 x13682 -1 x13831 -1 x13980 -1 x14129 -1 x14278 -1 x14427 -1 x14576 -1 x14725 -1 x14874 -1 x15023 -1 x15172 -1 x15321 -1 x15470 -1 x15619 -1 x15768 -1 x15917 -1 x16066 -1 x16215 -1 x16364 -1 x16513 -1 x16662 -1 x16811 -1 x16960 -1 x17109 -1 x17258 -1 x17407 -1 x17556 -1 x17705 -1 x17854 -1 x18003 -1 x18152 -1 x18301 -1 x18450 -1 x18599 -1 x18748 -1 x18897 -1 x19046 -1 x19195 -1 x19344 -1 x19493 -1 x19642 -1 x19791 -1 x19940 -1 x20089 -1 x20238 -1 x20387 -1 x20536 -1 x20685 -1 x20834 -1 x20983 -1 x21132 -1 x21281 -1 x21430 -1 x21579 -1 x21728 -1 x21877 -1 x22026 -1 x22175 -1 x22324 >= -1;+-1 x124 -1 x273 -1 x422 -1 x571 -1 x720 -1 x869 -1 x1018 -1 x1167 -1 x1316 -1 x1465 -1 x1614 -1 x1763 -1 x1912 -1 x2061 -1 x2210 -1 x2359 -1 x2508 -1 x2657 -1 x2806 -1 x2955 -1 x3104 -1 x3253 -1 x3402 -1 x3551 -1 x3700 -1 x3849 -1 x3998 -1 x4147 -1 x4296 -1 x4445 -1 x4594 -1 x4743 -1 x4892 -1 x5041 -1 x5190 -1 x5339 -1 x5488 -1 x5637 -1 x5786 -1 x5935 -1 x6084 -1 x6233 -1 x6382 -1 x6531 -1 x6680 -1 x6829 -1 x6978 -1 x7127 -1 x7276 -1 x7425 -1 x7574 -1 x7723 -1 x7872 -1 x8021 -1 x8170 -1 x8319 -1 x8468 -1 x8617 -1 x8766 -1 x8915 -1 x9064 -1 x9213 -1 x9362 -1 x9511 -1 x9660 -1 x9809 -1 x9958 -1 x10107 -1 x10256 -1 x10405 -1 x10554 -1 x10703 -1 x10852 -1 x11001 -1 x11150 -1 x11299 -1 x11448 -1 x11597 -1 x11746 -1 x11895 -1 x12044 -1 x12193 -1 x12342 -1 x12491 -1 x12640 -1 x12789 -1 x12938 -1 x13087 -1 x13236 -1 x13385 -1 x13534 -1 x13683 -1 x13832 -1 x13981 -1 x14130 -1 x14279 -1 x14428 -1 x14577 -1 x14726 -1 x14875 -1 x15024 -1 x15173 -1 x15322 -1 x15471 -1 x15620 -1 x15769 -1 x15918 -1 x16067 -1 x16216 -1 x16365 -1 x16514 -1 x16663 -1 x16812 -1 x16961 -1 x17110 -1 x17259 -1 x17408 -1 x17557 -1 x17706 -1 x17855 -1 x18004 -1 x18153 -1 x18302 -1 x18451 -1 x18600 -1 x18749 -1 x18898 -1 x19047 -1 x19196 -1 x19345 -1 x19494 -1 x19643 -1 x19792 -1 x19941 -1 x20090 -1 x20239 -1 x20388 -1 x20537 -1 x20686 -1 x20835 -1 x20984 -1 x21133 -1 x21282 -1 x21431 -1 x21580 -1 x21729 -1 x21878 -1 x22027 -1 x22176 -1 x22325 >= -1;+-1 x125 -1 x274 -1 x423 -1 x572 -1 x721 -1 x870 -1 x1019 -1 x1168 -1 x1317 -1 x1466 -1 x1615 -1 x1764 -1 x1913 -1 x2062 -1 x2211 -1 x2360 -1 x2509 -1 x2658 -1 x2807 -1 x2956 -1 x3105 -1 x3254 -1 x3403 -1 x3552 -1 x3701 -1 x3850 -1 x3999 -1 x4148 -1 x4297 -1 x4446 -1 x4595 -1 x4744 -1 x4893 -1 x5042 -1 x5191 -1 x5340 -1 x5489 -1 x5638 -1 x5787 -1 x5936 -1 x6085 -1 x6234 -1 x6383 -1 x6532 -1 x6681 -1 x6830 -1 x6979 -1 x7128 -1 x7277 -1 x7426 -1 x7575 -1 x7724 -1 x7873 -1 x8022 -1 x8171 -1 x8320 -1 x8469 -1 x8618 -1 x8767 -1 x8916 -1 x9065 -1 x9214 -1 x9363 -1 x9512 -1 x9661 -1 x9810 -1 x9959 -1 x10108 -1 x10257 -1 x10406 -1 x10555 -1 x10704 -1 x10853 -1 x11002 -1 x11151 -1 x11300 -1 x11449 -1 x11598 -1 x11747 -1 x11896 -1 x12045 -1 x12194 -1 x12343 -1 x12492 -1 x12641 -1 x12790 -1 x12939 -1 x13088 -1 x13237 -1 x13386 -1 x13535 -1 x13684 -1 x13833 -1 x13982 -1 x14131 -1 x14280 -1 x14429 -1 x14578 -1 x14727 -1 x14876 -1 x15025 -1 x15174 -1 x15323 -1 x15472 -1 x15621 -1 x15770 -1 x15919 -1 x16068 -1 x16217 -1 x16366 -1 x16515 -1 x16664 -1 x16813 -1 x16962 -1 x17111 -1 x17260 -1 x17409 -1 x17558 -1 x17707 -1 x17856 -1 x18005 -1 x18154 -1 x18303 -1 x18452 -1 x18601 -1 x18750 -1 x18899 -1 x19048 -1 x19197 -1 x19346 -1 x19495 -1 x19644 -1 x19793 -1 x19942 -1 x20091 -1 x20240 -1 x20389 -1 x20538 -1 x20687 -1 x20836 -1 x20985 -1 x21134 -1 x21283 -1 x21432 -1 x21581 -1 x21730 -1 x21879 -1 x22028 -1 x22177 -1 x22326 >= -1;+-1 x126 -1 x275 -1 x424 -1 x573 -1 x722 -1 x871 -1 x1020 -1 x1169 -1 x1318 -1 x1467 -1 x1616 -1 x1765 -1 x1914 -1 x2063 -1 x2212 -1 x2361 -1 x2510 -1 x2659 -1 x2808 -1 x2957 -1 x3106 -1 x3255 -1 x3404 -1 x3553 -1 x3702 -1 x3851 -1 x4000 -1 x4149 -1 x4298 -1 x4447 -1 x4596 -1 x4745 -1 x4894 -1 x5043 -1 x5192 -1 x5341 -1 x5490 -1 x5639 -1 x5788 -1 x5937 -1 x6086 -1 x6235 -1 x6384 -1 x6533 -1 x6682 -1 x6831 -1 x6980 -1 x7129 -1 x7278 -1 x7427 -1 x7576 -1 x7725 -1 x7874 -1 x8023 -1 x8172 -1 x8321 -1 x8470 -1 x8619 -1 x8768 -1 x8917 -1 x9066 -1 x9215 -1 x9364 -1 x9513 -1 x9662 -1 x9811 -1 x9960 -1 x10109 -1 x10258 -1 x10407 -1 x10556 -1 x10705 -1 x10854 -1 x11003 -1 x11152 -1 x11301 -1 x11450 -1 x11599 -1 x11748 -1 x11897 -1 x12046 -1 x12195 -1 x12344 -1 x12493 -1 x12642 -1 x12791 -1 x12940 -1 x13089 -1 x13238 -1 x13387 -1 x13536 -1 x13685 -1 x13834 -1 x13983 -1 x14132 -1 x14281 -1 x14430 -1 x14579 -1 x14728 -1 x14877 -1 x15026 -1 x15175 -1 x15324 -1 x15473 -1 x15622 -1 x15771 -1 x15920 -1 x16069 -1 x16218 -1 x16367 -1 x16516 -1 x16665 -1 x16814 -1 x16963 -1 x17112 -1 x17261 -1 x17410 -1 x17559 -1 x17708 -1 x17857 -1 x18006 -1 x18155 -1 x18304 -1 x18453 -1 x18602 -1 x18751 -1 x18900 -1 x19049 -1 x19198 -1 x19347 -1 x19496 -1 x19645 -1 x19794 -1 x19943 -1 x20092 -1 x20241 -1 x20390 -1 x20539 -1 x20688 -1 x20837 -1 x20986 -1 x21135 -1 x21284 -1 x21433 -1 x21582 -1 x21731 -1 x21880 -1 x22029 -1 x22178 -1 x22327 >= -1;+-1 x127 -1 x276 -1 x425 -1 x574 -1 x723 -1 x872 -1 x1021 -1 x1170 -1 x1319 -1 x1468 -1 x1617 -1 x1766 -1 x1915 -1 x2064 -1 x2213 -1 x2362 -1 x2511 -1 x2660 -1 x2809 -1 x2958 -1 x3107 -1 x3256 -1 x3405 -1 x3554 -1 x3703 -1 x3852 -1 x4001 -1 x4150 -1 x4299 -1 x4448 -1 x4597 -1 x4746 -1 x4895 -1 x5044 -1 x5193 -1 x5342 -1 x5491 -1 x5640 -1 x5789 -1 x5938 -1 x6087 -1 x6236 -1 x6385 -1 x6534 -1 x6683 -1 x6832 -1 x6981 -1 x7130 -1 x7279 -1 x7428 -1 x7577 -1 x7726 -1 x7875 -1 x8024 -1 x8173 -1 x8322 -1 x8471 -1 x8620 -1 x8769 -1 x8918 -1 x9067 -1 x9216 -1 x9365 -1 x9514 -1 x9663 -1 x9812 -1 x9961 -1 x10110 -1 x10259 -1 x10408 -1 x10557 -1 x10706 -1 x10855 -1 x11004 -1 x11153 -1 x11302 -1 x11451 -1 x11600 -1 x11749 -1 x11898 -1 x12047 -1 x12196 -1 x12345 -1 x12494 -1 x12643 -1 x12792 -1 x12941 -1 x13090 -1 x13239 -1 x13388 -1 x13537 -1 x13686 -1 x13835 -1 x13984 -1 x14133 -1 x14282 -1 x14431 -1 x14580 -1 x14729 -1 x14878 -1 x15027 -1 x15176 -1 x15325 -1 x15474 -1 x15623 -1 x15772 -1 x15921 -1 x16070 -1 x16219 -1 x16368 -1 x16517 -1 x16666 -1 x16815 -1 x16964 -1 x17113 -1 x17262 -1 x17411 -1 x17560 -1 x17709 -1 x17858 -1 x18007 -1 x18156 -1 x18305 -1 x18454 -1 x18603 -1 x18752 -1 x18901 -1 x19050 -1 x19199 -1 x19348 -1 x19497 -1 x19646 -1 x19795 -1 x19944 -1 x20093 -1 x20242 -1 x20391 -1 x20540 -1 x20689 -1 x20838 -1 x20987 -1 x21136 -1 x21285 -1 x21434 -1 x21583 -1 x21732 -1 x21881 -1 x22030 -1 x22179 -1 x22328 >= -1;+-1 x128 -1 x277 -1 x426 -1 x575 -1 x724 -1 x873 -1 x1022 -1 x1171 -1 x1320 -1 x1469 -1 x1618 -1 x1767 -1 x1916 -1 x2065 -1 x2214 -1 x2363 -1 x2512 -1 x2661 -1 x2810 -1 x2959 -1 x3108 -1 x3257 -1 x3406 -1 x3555 -1 x3704 -1 x3853 -1 x4002 -1 x4151 -1 x4300 -1 x4449 -1 x4598 -1 x4747 -1 x4896 -1 x5045 -1 x5194 -1 x5343 -1 x5492 -1 x5641 -1 x5790 -1 x5939 -1 x6088 -1 x6237 -1 x6386 -1 x6535 -1 x6684 -1 x6833 -1 x6982 -1 x7131 -1 x7280 -1 x7429 -1 x7578 -1 x7727 -1 x7876 -1 x8025 -1 x8174 -1 x8323 -1 x8472 -1 x8621 -1 x8770 -1 x8919 -1 x9068 -1 x9217 -1 x9366 -1 x9515 -1 x9664 -1 x9813 -1 x9962 -1 x10111 -1 x10260 -1 x10409 -1 x10558 -1 x10707 -1 x10856 -1 x11005 -1 x11154 -1 x11303 -1 x11452 -1 x11601 -1 x11750 -1 x11899 -1 x12048 -1 x12197 -1 x12346 -1 x12495 -1 x12644 -1 x12793 -1 x12942 -1 x13091 -1 x13240 -1 x13389 -1 x13538 -1 x13687 -1 x13836 -1 x13985 -1 x14134 -1 x14283 -1 x14432 -1 x14581 -1 x14730 -1 x14879 -1 x15028 -1 x15177 -1 x15326 -1 x15475 -1 x15624 -1 x15773 -1 x15922 -1 x16071 -1 x16220 -1 x16369 -1 x16518 -1 x16667 -1 x16816 -1 x16965 -1 x17114 -1 x17263 -1 x17412 -1 x17561 -1 x17710 -1 x17859 -1 x18008 -1 x18157 -1 x18306 -1 x18455 -1 x18604 -1 x18753 -1 x18902 -1 x19051 -1 x19200 -1 x19349 -1 x19498 -1 x19647 -1 x19796 -1 x19945 -1 x20094 -1 x20243 -1 x20392 -1 x20541 -1 x20690 -1 x20839 -1 x20988 -1 x21137 -1 x21286 -1 x21435 -1 x21584 -1 x21733 -1 x21882 -1 x22031 -1 x22180 -1 x22329 >= -1;+-1 x129 -1 x278 -1 x427 -1 x576 -1 x725 -1 x874 -1 x1023 -1 x1172 -1 x1321 -1 x1470 -1 x1619 -1 x1768 -1 x1917 -1 x2066 -1 x2215 -1 x2364 -1 x2513 -1 x2662 -1 x2811 -1 x2960 -1 x3109 -1 x3258 -1 x3407 -1 x3556 -1 x3705 -1 x3854 -1 x4003 -1 x4152 -1 x4301 -1 x4450 -1 x4599 -1 x4748 -1 x4897 -1 x5046 -1 x5195 -1 x5344 -1 x5493 -1 x5642 -1 x5791 -1 x5940 -1 x6089 -1 x6238 -1 x6387 -1 x6536 -1 x6685 -1 x6834 -1 x6983 -1 x7132 -1 x7281 -1 x7430 -1 x7579 -1 x7728 -1 x7877 -1 x8026 -1 x8175 -1 x8324 -1 x8473 -1 x8622 -1 x8771 -1 x8920 -1 x9069 -1 x9218 -1 x9367 -1 x9516 -1 x9665 -1 x9814 -1 x9963 -1 x10112 -1 x10261 -1 x10410 -1 x10559 -1 x10708 -1 x10857 -1 x11006 -1 x11155 -1 x11304 -1 x11453 -1 x11602 -1 x11751 -1 x11900 -1 x12049 -1 x12198 -1 x12347 -1 x12496 -1 x12645 -1 x12794 -1 x12943 -1 x13092 -1 x13241 -1 x13390 -1 x13539 -1 x13688 -1 x13837 -1 x13986 -1 x14135 -1 x14284 -1 x14433 -1 x14582 -1 x14731 -1 x14880 -1 x15029 -1 x15178 -1 x15327 -1 x15476 -1 x15625 -1 x15774 -1 x15923 -1 x16072 -1 x16221 -1 x16370 -1 x16519 -1 x16668 -1 x16817 -1 x16966 -1 x17115 -1 x17264 -1 x17413 -1 x17562 -1 x17711 -1 x17860 -1 x18009 -1 x18158 -1 x18307 -1 x18456 -1 x18605 -1 x18754 -1 x18903 -1 x19052 -1 x19201 -1 x19350 -1 x19499 -1 x19648 -1 x19797 -1 x19946 -1 x20095 -1 x20244 -1 x20393 -1 x20542 -1 x20691 -1 x20840 -1 x20989 -1 x21138 -1 x21287 -1 x21436 -1 x21585 -1 x21734 -1 x21883 -1 x22032 -1 x22181 -1 x22330 >= -1;+-1 x130 -1 x279 -1 x428 -1 x577 -1 x726 -1 x875 -1 x1024 -1 x1173 -1 x1322 -1 x1471 -1 x1620 -1 x1769 -1 x1918 -1 x2067 -1 x2216 -1 x2365 -1 x2514 -1 x2663 -1 x2812 -1 x2961 -1 x3110 -1 x3259 -1 x3408 -1 x3557 -1 x3706 -1 x3855 -1 x4004 -1 x4153 -1 x4302 -1 x4451 -1 x4600 -1 x4749 -1 x4898 -1 x5047 -1 x5196 -1 x5345 -1 x5494 -1 x5643 -1 x5792 -1 x5941 -1 x6090 -1 x6239 -1 x6388 -1 x6537 -1 x6686 -1 x6835 -1 x6984 -1 x7133 -1 x7282 -1 x7431 -1 x7580 -1 x7729 -1 x7878 -1 x8027 -1 x8176 -1 x8325 -1 x8474 -1 x8623 -1 x8772 -1 x8921 -1 x9070 -1 x9219 -1 x9368 -1 x9517 -1 x9666 -1 x9815 -1 x9964 -1 x10113 -1 x10262 -1 x10411 -1 x10560 -1 x10709 -1 x10858 -1 x11007 -1 x11156 -1 x11305 -1 x11454 -1 x11603 -1 x11752 -1 x11901 -1 x12050 -1 x12199 -1 x12348 -1 x12497 -1 x12646 -1 x12795 -1 x12944 -1 x13093 -1 x13242 -1 x13391 -1 x13540 -1 x13689 -1 x13838 -1 x13987 -1 x14136 -1 x14285 -1 x14434 -1 x14583 -1 x14732 -1 x14881 -1 x15030 -1 x15179 -1 x15328 -1 x15477 -1 x15626 -1 x15775 -1 x15924 -1 x16073 -1 x16222 -1 x16371 -1 x16520 -1 x16669 -1 x16818 -1 x16967 -1 x17116 -1 x17265 -1 x17414 -1 x17563 -1 x17712 -1 x17861 -1 x18010 -1 x18159 -1 x18308 -1 x18457 -1 x18606 -1 x18755 -1 x18904 -1 x19053 -1 x19202 -1 x19351 -1 x19500 -1 x19649 -1 x19798 -1 x19947 -1 x20096 -1 x20245 -1 x20394 -1 x20543 -1 x20692 -1 x20841 -1 x20990 -1 x21139 -1 x21288 -1 x21437 -1 x21586 -1 x21735 -1 x21884 -1 x22033 -1 x22182 -1 x22331 >= -1;+-1 x131 -1 x280 -1 x429 -1 x578 -1 x727 -1 x876 -1 x1025 -1 x1174 -1 x1323 -1 x1472 -1 x1621 -1 x1770 -1 x1919 -1 x2068 -1 x2217 -1 x2366 -1 x2515 -1 x2664 -1 x2813 -1 x2962 -1 x3111 -1 x3260 -1 x3409 -1 x3558 -1 x3707 -1 x3856 -1 x4005 -1 x4154 -1 x4303 -1 x4452 -1 x4601 -1 x4750 -1 x4899 -1 x5048 -1 x5197 -1 x5346 -1 x5495 -1 x5644 -1 x5793 -1 x5942 -1 x6091 -1 x6240 -1 x6389 -1 x6538 -1 x6687 -1 x6836 -1 x6985 -1 x7134 -1 x7283 -1 x7432 -1 x7581 -1 x7730 -1 x7879 -1 x8028 -1 x8177 -1 x8326 -1 x8475 -1 x8624 -1 x8773 -1 x8922 -1 x9071 -1 x9220 -1 x9369 -1 x9518 -1 x9667 -1 x9816 -1 x9965 -1 x10114 -1 x10263 -1 x10412 -1 x10561 -1 x10710 -1 x10859 -1 x11008 -1 x11157 -1 x11306 -1 x11455 -1 x11604 -1 x11753 -1 x11902 -1 x12051 -1 x12200 -1 x12349 -1 x12498 -1 x12647 -1 x12796 -1 x12945 -1 x13094 -1 x13243 -1 x13392 -1 x13541 -1 x13690 -1 x13839 -1 x13988 -1 x14137 -1 x14286 -1 x14435 -1 x14584 -1 x14733 -1 x14882 -1 x15031 -1 x15180 -1 x15329 -1 x15478 -1 x15627 -1 x15776 -1 x15925 -1 x16074 -1 x16223 -1 x16372 -1 x16521 -1 x16670 -1 x16819 -1 x16968 -1 x17117 -1 x17266 -1 x17415 -1 x17564 -1 x17713 -1 x17862 -1 x18011 -1 x18160 -1 x18309 -1 x18458 -1 x18607 -1 x18756 -1 x18905 -1 x19054 -1 x19203 -1 x19352 -1 x19501 -1 x19650 -1 x19799 -1 x19948 -1 x20097 -1 x20246 -1 x20395 -1 x20544 -1 x20693 -1 x20842 -1 x20991 -1 x21140 -1 x21289 -1 x21438 -1 x21587 -1 x21736 -1 x21885 -1 x22034 -1 x22183 -1 x22332 >= -1;+-1 x132 -1 x281 -1 x430 -1 x579 -1 x728 -1 x877 -1 x1026 -1 x1175 -1 x1324 -1 x1473 -1 x1622 -1 x1771 -1 x1920 -1 x2069 -1 x2218 -1 x2367 -1 x2516 -1 x2665 -1 x2814 -1 x2963 -1 x3112 -1 x3261 -1 x3410 -1 x3559 -1 x3708 -1 x3857 -1 x4006 -1 x4155 -1 x4304 -1 x4453 -1 x4602 -1 x4751 -1 x4900 -1 x5049 -1 x5198 -1 x5347 -1 x5496 -1 x5645 -1 x5794 -1 x5943 -1 x6092 -1 x6241 -1 x6390 -1 x6539 -1 x6688 -1 x6837 -1 x6986 -1 x7135 -1 x7284 -1 x7433 -1 x7582 -1 x7731 -1 x7880 -1 x8029 -1 x8178 -1 x8327 -1 x8476 -1 x8625 -1 x8774 -1 x8923 -1 x9072 -1 x9221 -1 x9370 -1 x9519 -1 x9668 -1 x9817 -1 x9966 -1 x10115 -1 x10264 -1 x10413 -1 x10562 -1 x10711 -1 x10860 -1 x11009 -1 x11158 -1 x11307 -1 x11456 -1 x11605 -1 x11754 -1 x11903 -1 x12052 -1 x12201 -1 x12350 -1 x12499 -1 x12648 -1 x12797 -1 x12946 -1 x13095 -1 x13244 -1 x13393 -1 x13542 -1 x13691 -1 x13840 -1 x13989 -1 x14138 -1 x14287 -1 x14436 -1 x14585 -1 x14734 -1 x14883 -1 x15032 -1 x15181 -1 x15330 -1 x15479 -1 x15628 -1 x15777 -1 x15926 -1 x16075 -1 x16224 -1 x16373 -1 x16522 -1 x16671 -1 x16820 -1 x16969 -1 x17118 -1 x17267 -1 x17416 -1 x17565 -1 x17714 -1 x17863 -1 x18012 -1 x18161 -1 x18310 -1 x18459 -1 x18608 -1 x18757 -1 x18906 -1 x19055 -1 x19204 -1 x19353 -1 x19502 -1 x19651 -1 x19800 -1 x19949 -1 x20098 -1 x20247 -1 x20396 -1 x20545 -1 x20694 -1 x20843 -1 x20992 -1 x21141 -1 x21290 -1 x21439 -1 x21588 -1 x21737 -1 x21886 -1 x22035 -1 x22184 -1 x22333 >= -1;+-1 x133 -1 x282 -1 x431 -1 x580 -1 x729 -1 x878 -1 x1027 -1 x1176 -1 x1325 -1 x1474 -1 x1623 -1 x1772 -1 x1921 -1 x2070 -1 x2219 -1 x2368 -1 x2517 -1 x2666 -1 x2815 -1 x2964 -1 x3113 -1 x3262 -1 x3411 -1 x3560 -1 x3709 -1 x3858 -1 x4007 -1 x4156 -1 x4305 -1 x4454 -1 x4603 -1 x4752 -1 x4901 -1 x5050 -1 x5199 -1 x5348 -1 x5497 -1 x5646 -1 x5795 -1 x5944 -1 x6093 -1 x6242 -1 x6391 -1 x6540 -1 x6689 -1 x6838 -1 x6987 -1 x7136 -1 x7285 -1 x7434 -1 x7583 -1 x7732 -1 x7881 -1 x8030 -1 x8179 -1 x8328 -1 x8477 -1 x8626 -1 x8775 -1 x8924 -1 x9073 -1 x9222 -1 x9371 -1 x9520 -1 x9669 -1 x9818 -1 x9967 -1 x10116 -1 x10265 -1 x10414 -1 x10563 -1 x10712 -1 x10861 -1 x11010 -1 x11159 -1 x11308 -1 x11457 -1 x11606 -1 x11755 -1 x11904 -1 x12053 -1 x12202 -1 x12351 -1 x12500 -1 x12649 -1 x12798 -1 x12947 -1 x13096 -1 x13245 -1 x13394 -1 x13543 -1 x13692 -1 x13841 -1 x13990 -1 x14139 -1 x14288 -1 x14437 -1 x14586 -1 x14735 -1 x14884 -1 x15033 -1 x15182 -1 x15331 -1 x15480 -1 x15629 -1 x15778 -1 x15927 -1 x16076 -1 x16225 -1 x16374 -1 x16523 -1 x16672 -1 x16821 -1 x16970 -1 x17119 -1 x17268 -1 x17417 -1 x17566 -1 x17715 -1 x17864 -1 x18013 -1 x18162 -1 x18311 -1 x18460 -1 x18609 -1 x18758 -1 x18907 -1 x19056 -1 x19205 -1 x19354 -1 x19503 -1 x19652 -1 x19801 -1 x19950 -1 x20099 -1 x20248 -1 x20397 -1 x20546 -1 x20695 -1 x20844 -1 x20993 -1 x21142 -1 x21291 -1 x21440 -1 x21589 -1 x21738 -1 x21887 -1 x22036 -1 x22185 -1 x22334 >= -1;+-1 x134 -1 x283 -1 x432 -1 x581 -1 x730 -1 x879 -1 x1028 -1 x1177 -1 x1326 -1 x1475 -1 x1624 -1 x1773 -1 x1922 -1 x2071 -1 x2220 -1 x2369 -1 x2518 -1 x2667 -1 x2816 -1 x2965 -1 x3114 -1 x3263 -1 x3412 -1 x3561 -1 x3710 -1 x3859 -1 x4008 -1 x4157 -1 x4306 -1 x4455 -1 x4604 -1 x4753 -1 x4902 -1 x5051 -1 x5200 -1 x5349 -1 x5498 -1 x5647 -1 x5796 -1 x5945 -1 x6094 -1 x6243 -1 x6392 -1 x6541 -1 x6690 -1 x6839 -1 x6988 -1 x7137 -1 x7286 -1 x7435 -1 x7584 -1 x7733 -1 x7882 -1 x8031 -1 x8180 -1 x8329 -1 x8478 -1 x8627 -1 x8776 -1 x8925 -1 x9074 -1 x9223 -1 x9372 -1 x9521 -1 x9670 -1 x9819 -1 x9968 -1 x10117 -1 x10266 -1 x10415 -1 x10564 -1 x10713 -1 x10862 -1 x11011 -1 x11160 -1 x11309 -1 x11458 -1 x11607 -1 x11756 -1 x11905 -1 x12054 -1 x12203 -1 x12352 -1 x12501 -1 x12650 -1 x12799 -1 x12948 -1 x13097 -1 x13246 -1 x13395 -1 x13544 -1 x13693 -1 x13842 -1 x13991 -1 x14140 -1 x14289 -1 x14438 -1 x14587 -1 x14736 -1 x14885 -1 x15034 -1 x15183 -1 x15332 -1 x15481 -1 x15630 -1 x15779 -1 x15928 -1 x16077 -1 x16226 -1 x16375 -1 x16524 -1 x16673 -1 x16822 -1 x16971 -1 x17120 -1 x17269 -1 x17418 -1 x17567 -1 x17716 -1 x17865 -1 x18014 -1 x18163 -1 x18312 -1 x18461 -1 x18610 -1 x18759 -1 x18908 -1 x19057 -1 x19206 -1 x19355 -1 x19504 -1 x19653 -1 x19802 -1 x19951 -1 x20100 -1 x20249 -1 x20398 -1 x20547 -1 x20696 -1 x20845 -1 x20994 -1 x21143 -1 x21292 -1 x21441 -1 x21590 -1 x21739 -1 x21888 -1 x22037 -1 x22186 -1 x22335 >= -1;+-1 x135 -1 x284 -1 x433 -1 x582 -1 x731 -1 x880 -1 x1029 -1 x1178 -1 x1327 -1 x1476 -1 x1625 -1 x1774 -1 x1923 -1 x2072 -1 x2221 -1 x2370 -1 x2519 -1 x2668 -1 x2817 -1 x2966 -1 x3115 -1 x3264 -1 x3413 -1 x3562 -1 x3711 -1 x3860 -1 x4009 -1 x4158 -1 x4307 -1 x4456 -1 x4605 -1 x4754 -1 x4903 -1 x5052 -1 x5201 -1 x5350 -1 x5499 -1 x5648 -1 x5797 -1 x5946 -1 x6095 -1 x6244 -1 x6393 -1 x6542 -1 x6691 -1 x6840 -1 x6989 -1 x7138 -1 x7287 -1 x7436 -1 x7585 -1 x7734 -1 x7883 -1 x8032 -1 x8181 -1 x8330 -1 x8479 -1 x8628 -1 x8777 -1 x8926 -1 x9075 -1 x9224 -1 x9373 -1 x9522 -1 x9671 -1 x9820 -1 x9969 -1 x10118 -1 x10267 -1 x10416 -1 x10565 -1 x10714 -1 x10863 -1 x11012 -1 x11161 -1 x11310 -1 x11459 -1 x11608 -1 x11757 -1 x11906 -1 x12055 -1 x12204 -1 x12353 -1 x12502 -1 x12651 -1 x12800 -1 x12949 -1 x13098 -1 x13247 -1 x13396 -1 x13545 -1 x13694 -1 x13843 -1 x13992 -1 x14141 -1 x14290 -1 x14439 -1 x14588 -1 x14737 -1 x14886 -1 x15035 -1 x15184 -1 x15333 -1 x15482 -1 x15631 -1 x15780 -1 x15929 -1 x16078 -1 x16227 -1 x16376 -1 x16525 -1 x16674 -1 x16823 -1 x16972 -1 x17121 -1 x17270 -1 x17419 -1 x17568 -1 x17717 -1 x17866 -1 x18015 -1 x18164 -1 x18313 -1 x18462 -1 x18611 -1 x18760 -1 x18909 -1 x19058 -1 x19207 -1 x19356 -1 x19505 -1 x19654 -1 x19803 -1 x19952 -1 x20101 -1 x20250 -1 x20399 -1 x20548 -1 x20697 -1 x20846 -1 x20995 -1 x21144 -1 x21293 -1 x21442 -1 x21591 -1 x21740 -1 x21889 -1 x22038 -1 x22187 -1 x22336 >= -1;+-1 x136 -1 x285 -1 x434 -1 x583 -1 x732 -1 x881 -1 x1030 -1 x1179 -1 x1328 -1 x1477 -1 x1626 -1 x1775 -1 x1924 -1 x2073 -1 x2222 -1 x2371 -1 x2520 -1 x2669 -1 x2818 -1 x2967 -1 x3116 -1 x3265 -1 x3414 -1 x3563 -1 x3712 -1 x3861 -1 x4010 -1 x4159 -1 x4308 -1 x4457 -1 x4606 -1 x4755 -1 x4904 -1 x5053 -1 x5202 -1 x5351 -1 x5500 -1 x5649 -1 x5798 -1 x5947 -1 x6096 -1 x6245 -1 x6394 -1 x6543 -1 x6692 -1 x6841 -1 x6990 -1 x7139 -1 x7288 -1 x7437 -1 x7586 -1 x7735 -1 x7884 -1 x8033 -1 x8182 -1 x8331 -1 x8480 -1 x8629 -1 x8778 -1 x8927 -1 x9076 -1 x9225 -1 x9374 -1 x9523 -1 x9672 -1 x9821 -1 x9970 -1 x10119 -1 x10268 -1 x10417 -1 x10566 -1 x10715 -1 x10864 -1 x11013 -1 x11162 -1 x11311 -1 x11460 -1 x11609 -1 x11758 -1 x11907 -1 x12056 -1 x12205 -1 x12354 -1 x12503 -1 x12652 -1 x12801 -1 x12950 -1 x13099 -1 x13248 -1 x13397 -1 x13546 -1 x13695 -1 x13844 -1 x13993 -1 x14142 -1 x14291 -1 x14440 -1 x14589 -1 x14738 -1 x14887 -1 x15036 -1 x15185 -1 x15334 -1 x15483 -1 x15632 -1 x15781 -1 x15930 -1 x16079 -1 x16228 -1 x16377 -1 x16526 -1 x16675 -1 x16824 -1 x16973 -1 x17122 -1 x17271 -1 x17420 -1 x17569 -1 x17718 -1 x17867 -1 x18016 -1 x18165 -1 x18314 -1 x18463 -1 x18612 -1 x18761 -1 x18910 -1 x19059 -1 x19208 -1 x19357 -1 x19506 -1 x19655 -1 x19804 -1 x19953 -1 x20102 -1 x20251 -1 x20400 -1 x20549 -1 x20698 -1 x20847 -1 x20996 -1 x21145 -1 x21294 -1 x21443 -1 x21592 -1 x21741 -1 x21890 -1 x22039 -1 x22188 -1 x22337 >= -1;+-1 x137 -1 x286 -1 x435 -1 x584 -1 x733 -1 x882 -1 x1031 -1 x1180 -1 x1329 -1 x1478 -1 x1627 -1 x1776 -1 x1925 -1 x2074 -1 x2223 -1 x2372 -1 x2521 -1 x2670 -1 x2819 -1 x2968 -1 x3117 -1 x3266 -1 x3415 -1 x3564 -1 x3713 -1 x3862 -1 x4011 -1 x4160 -1 x4309 -1 x4458 -1 x4607 -1 x4756 -1 x4905 -1 x5054 -1 x5203 -1 x5352 -1 x5501 -1 x5650 -1 x5799 -1 x5948 -1 x6097 -1 x6246 -1 x6395 -1 x6544 -1 x6693 -1 x6842 -1 x6991 -1 x7140 -1 x7289 -1 x7438 -1 x7587 -1 x7736 -1 x7885 -1 x8034 -1 x8183 -1 x8332 -1 x8481 -1 x8630 -1 x8779 -1 x8928 -1 x9077 -1 x9226 -1 x9375 -1 x9524 -1 x9673 -1 x9822 -1 x9971 -1 x10120 -1 x10269 -1 x10418 -1 x10567 -1 x10716 -1 x10865 -1 x11014 -1 x11163 -1 x11312 -1 x11461 -1 x11610 -1 x11759 -1 x11908 -1 x12057 -1 x12206 -1 x12355 -1 x12504 -1 x12653 -1 x12802 -1 x12951 -1 x13100 -1 x13249 -1 x13398 -1 x13547 -1 x13696 -1 x13845 -1 x13994 -1 x14143 -1 x14292 -1 x14441 -1 x14590 -1 x14739 -1 x14888 -1 x15037 -1 x15186 -1 x15335 -1 x15484 -1 x15633 -1 x15782 -1 x15931 -1 x16080 -1 x16229 -1 x16378 -1 x16527 -1 x16676 -1 x16825 -1 x16974 -1 x17123 -1 x17272 -1 x17421 -1 x17570 -1 x17719 -1 x17868 -1 x18017 -1 x18166 -1 x18315 -1 x18464 -1 x18613 -1 x18762 -1 x18911 -1 x19060 -1 x19209 -1 x19358 -1 x19507 -1 x19656 -1 x19805 -1 x19954 -1 x20103 -1 x20252 -1 x20401 -1 x20550 -1 x20699 -1 x20848 -1 x20997 -1 x21146 -1 x21295 -1 x21444 -1 x21593 -1 x21742 -1 x21891 -1 x22040 -1 x22189 -1 x22338 >= -1;+-1 x138 -1 x287 -1 x436 -1 x585 -1 x734 -1 x883 -1 x1032 -1 x1181 -1 x1330 -1 x1479 -1 x1628 -1 x1777 -1 x1926 -1 x2075 -1 x2224 -1 x2373 -1 x2522 -1 x2671 -1 x2820 -1 x2969 -1 x3118 -1 x3267 -1 x3416 -1 x3565 -1 x3714 -1 x3863 -1 x4012 -1 x4161 -1 x4310 -1 x4459 -1 x4608 -1 x4757 -1 x4906 -1 x5055 -1 x5204 -1 x5353 -1 x5502 -1 x5651 -1 x5800 -1 x5949 -1 x6098 -1 x6247 -1 x6396 -1 x6545 -1 x6694 -1 x6843 -1 x6992 -1 x7141 -1 x7290 -1 x7439 -1 x7588 -1 x7737 -1 x7886 -1 x8035 -1 x8184 -1 x8333 -1 x8482 -1 x8631 -1 x8780 -1 x8929 -1 x9078 -1 x9227 -1 x9376 -1 x9525 -1 x9674 -1 x9823 -1 x9972 -1 x10121 -1 x10270 -1 x10419 -1 x10568 -1 x10717 -1 x10866 -1 x11015 -1 x11164 -1 x11313 -1 x11462 -1 x11611 -1 x11760 -1 x11909 -1 x12058 -1 x12207 -1 x12356 -1 x12505 -1 x12654 -1 x12803 -1 x12952 -1 x13101 -1 x13250 -1 x13399 -1 x13548 -1 x13697 -1 x13846 -1 x13995 -1 x14144 -1 x14293 -1 x14442 -1 x14591 -1 x14740 -1 x14889 -1 x15038 -1 x15187 -1 x15336 -1 x15485 -1 x15634 -1 x15783 -1 x15932 -1 x16081 -1 x16230 -1 x16379 -1 x16528 -1 x16677 -1 x16826 -1 x16975 -1 x17124 -1 x17273 -1 x17422 -1 x17571 -1 x17720 -1 x17869 -1 x18018 -1 x18167 -1 x18316 -1 x18465 -1 x18614 -1 x18763 -1 x18912 -1 x19061 -1 x19210 -1 x19359 -1 x19508 -1 x19657 -1 x19806 -1 x19955 -1 x20104 -1 x20253 -1 x20402 -1 x20551 -1 x20700 -1 x20849 -1 x20998 -1 x21147 -1 x21296 -1 x21445 -1 x21594 -1 x21743 -1 x21892 -1 x22041 -1 x22190 -1 x22339 >= -1;+-1 x139 -1 x288 -1 x437 -1 x586 -1 x735 -1 x884 -1 x1033 -1 x1182 -1 x1331 -1 x1480 -1 x1629 -1 x1778 -1 x1927 -1 x2076 -1 x2225 -1 x2374 -1 x2523 -1 x2672 -1 x2821 -1 x2970 -1 x3119 -1 x3268 -1 x3417 -1 x3566 -1 x3715 -1 x3864 -1 x4013 -1 x4162 -1 x4311 -1 x4460 -1 x4609 -1 x4758 -1 x4907 -1 x5056 -1 x5205 -1 x5354 -1 x5503 -1 x5652 -1 x5801 -1 x5950 -1 x6099 -1 x6248 -1 x6397 -1 x6546 -1 x6695 -1 x6844 -1 x6993 -1 x7142 -1 x7291 -1 x7440 -1 x7589 -1 x7738 -1 x7887 -1 x8036 -1 x8185 -1 x8334 -1 x8483 -1 x8632 -1 x8781 -1 x8930 -1 x9079 -1 x9228 -1 x9377 -1 x9526 -1 x9675 -1 x9824 -1 x9973 -1 x10122 -1 x10271 -1 x10420 -1 x10569 -1 x10718 -1 x10867 -1 x11016 -1 x11165 -1 x11314 -1 x11463 -1 x11612 -1 x11761 -1 x11910 -1 x12059 -1 x12208 -1 x12357 -1 x12506 -1 x12655 -1 x12804 -1 x12953 -1 x13102 -1 x13251 -1 x13400 -1 x13549 -1 x13698 -1 x13847 -1 x13996 -1 x14145 -1 x14294 -1 x14443 -1 x14592 -1 x14741 -1 x14890 -1 x15039 -1 x15188 -1 x15337 -1 x15486 -1 x15635 -1 x15784 -1 x15933 -1 x16082 -1 x16231 -1 x16380 -1 x16529 -1 x16678 -1 x16827 -1 x16976 -1 x17125 -1 x17274 -1 x17423 -1 x17572 -1 x17721 -1 x17870 -1 x18019 -1 x18168 -1 x18317 -1 x18466 -1 x18615 -1 x18764 -1 x18913 -1 x19062 -1 x19211 -1 x19360 -1 x19509 -1 x19658 -1 x19807 -1 x19956 -1 x20105 -1 x20254 -1 x20403 -1 x20552 -1 x20701 -1 x20850 -1 x20999 -1 x21148 -1 x21297 -1 x21446 -1 x21595 -1 x21744 -1 x21893 -1 x22042 -1 x22191 -1 x22340 >= -1;+-1 x140 -1 x289 -1 x438 -1 x587 -1 x736 -1 x885 -1 x1034 -1 x1183 -1 x1332 -1 x1481 -1 x1630 -1 x1779 -1 x1928 -1 x2077 -1 x2226 -1 x2375 -1 x2524 -1 x2673 -1 x2822 -1 x2971 -1 x3120 -1 x3269 -1 x3418 -1 x3567 -1 x3716 -1 x3865 -1 x4014 -1 x4163 -1 x4312 -1 x4461 -1 x4610 -1 x4759 -1 x4908 -1 x5057 -1 x5206 -1 x5355 -1 x5504 -1 x5653 -1 x5802 -1 x5951 -1 x6100 -1 x6249 -1 x6398 -1 x6547 -1 x6696 -1 x6845 -1 x6994 -1 x7143 -1 x7292 -1 x7441 -1 x7590 -1 x7739 -1 x7888 -1 x8037 -1 x8186 -1 x8335 -1 x8484 -1 x8633 -1 x8782 -1 x8931 -1 x9080 -1 x9229 -1 x9378 -1 x9527 -1 x9676 -1 x9825 -1 x9974 -1 x10123 -1 x10272 -1 x10421 -1 x10570 -1 x10719 -1 x10868 -1 x11017 -1 x11166 -1 x11315 -1 x11464 -1 x11613 -1 x11762 -1 x11911 -1 x12060 -1 x12209 -1 x12358 -1 x12507 -1 x12656 -1 x12805 -1 x12954 -1 x13103 -1 x13252 -1 x13401 -1 x13550 -1 x13699 -1 x13848 -1 x13997 -1 x14146 -1 x14295 -1 x14444 -1 x14593 -1 x14742 -1 x14891 -1 x15040 -1 x15189 -1 x15338 -1 x15487 -1 x15636 -1 x15785 -1 x15934 -1 x16083 -1 x16232 -1 x16381 -1 x16530 -1 x16679 -1 x16828 -1 x16977 -1 x17126 -1 x17275 -1 x17424 -1 x17573 -1 x17722 -1 x17871 -1 x18020 -1 x18169 -1 x18318 -1 x18467 -1 x18616 -1 x18765 -1 x18914 -1 x19063 -1 x19212 -1 x19361 -1 x19510 -1 x19659 -1 x19808 -1 x19957 -1 x20106 -1 x20255 -1 x20404 -1 x20553 -1 x20702 -1 x20851 -1 x21000 -1 x21149 -1 x21298 -1 x21447 -1 x21596 -1 x21745 -1 x21894 -1 x22043 -1 x22192 -1 x22341 >= -1;+-1 x141 -1 x290 -1 x439 -1 x588 -1 x737 -1 x886 -1 x1035 -1 x1184 -1 x1333 -1 x1482 -1 x1631 -1 x1780 -1 x1929 -1 x2078 -1 x2227 -1 x2376 -1 x2525 -1 x2674 -1 x2823 -1 x2972 -1 x3121 -1 x3270 -1 x3419 -1 x3568 -1 x3717 -1 x3866 -1 x4015 -1 x4164 -1 x4313 -1 x4462 -1 x4611 -1 x4760 -1 x4909 -1 x5058 -1 x5207 -1 x5356 -1 x5505 -1 x5654 -1 x5803 -1 x5952 -1 x6101 -1 x6250 -1 x6399 -1 x6548 -1 x6697 -1 x6846 -1 x6995 -1 x7144 -1 x7293 -1 x7442 -1 x7591 -1 x7740 -1 x7889 -1 x8038 -1 x8187 -1 x8336 -1 x8485 -1 x8634 -1 x8783 -1 x8932 -1 x9081 -1 x9230 -1 x9379 -1 x9528 -1 x9677 -1 x9826 -1 x9975 -1 x10124 -1 x10273 -1 x10422 -1 x10571 -1 x10720 -1 x10869 -1 x11018 -1 x11167 -1 x11316 -1 x11465 -1 x11614 -1 x11763 -1 x11912 -1 x12061 -1 x12210 -1 x12359 -1 x12508 -1 x12657 -1 x12806 -1 x12955 -1 x13104 -1 x13253 -1 x13402 -1 x13551 -1 x13700 -1 x13849 -1 x13998 -1 x14147 -1 x14296 -1 x14445 -1 x14594 -1 x14743 -1 x14892 -1 x15041 -1 x15190 -1 x15339 -1 x15488 -1 x15637 -1 x15786 -1 x15935 -1 x16084 -1 x16233 -1 x16382 -1 x16531 -1 x16680 -1 x16829 -1 x16978 -1 x17127 -1 x17276 -1 x17425 -1 x17574 -1 x17723 -1 x17872 -1 x18021 -1 x18170 -1 x18319 -1 x18468 -1 x18617 -1 x18766 -1 x18915 -1 x19064 -1 x19213 -1 x19362 -1 x19511 -1 x19660 -1 x19809 -1 x19958 -1 x20107 -1 x20256 -1 x20405 -1 x20554 -1 x20703 -1 x20852 -1 x21001 -1 x21150 -1 x21299 -1 x21448 -1 x21597 -1 x21746 -1 x21895 -1 x22044 -1 x22193 -1 x22342 >= -1;+-1 x142 -1 x291 -1 x440 -1 x589 -1 x738 -1 x887 -1 x1036 -1 x1185 -1 x1334 -1 x1483 -1 x1632 -1 x1781 -1 x1930 -1 x2079 -1 x2228 -1 x2377 -1 x2526 -1 x2675 -1 x2824 -1 x2973 -1 x3122 -1 x3271 -1 x3420 -1 x3569 -1 x3718 -1 x3867 -1 x4016 -1 x4165 -1 x4314 -1 x4463 -1 x4612 -1 x4761 -1 x4910 -1 x5059 -1 x5208 -1 x5357 -1 x5506 -1 x5655 -1 x5804 -1 x5953 -1 x6102 -1 x6251 -1 x6400 -1 x6549 -1 x6698 -1 x6847 -1 x6996 -1 x7145 -1 x7294 -1 x7443 -1 x7592 -1 x7741 -1 x7890 -1 x8039 -1 x8188 -1 x8337 -1 x8486 -1 x8635 -1 x8784 -1 x8933 -1 x9082 -1 x9231 -1 x9380 -1 x9529 -1 x9678 -1 x9827 -1 x9976 -1 x10125 -1 x10274 -1 x10423 -1 x10572 -1 x10721 -1 x10870 -1 x11019 -1 x11168 -1 x11317 -1 x11466 -1 x11615 -1 x11764 -1 x11913 -1 x12062 -1 x12211 -1 x12360 -1 x12509 -1 x12658 -1 x12807 -1 x12956 -1 x13105 -1 x13254 -1 x13403 -1 x13552 -1 x13701 -1 x13850 -1 x13999 -1 x14148 -1 x14297 -1 x14446 -1 x14595 -1 x14744 -1 x14893 -1 x15042 -1 x15191 -1 x15340 -1 x15489 -1 x15638 -1 x15787 -1 x15936 -1 x16085 -1 x16234 -1 x16383 -1 x16532 -1 x16681 -1 x16830 -1 x16979 -1 x17128 -1 x17277 -1 x17426 -1 x17575 -1 x17724 -1 x17873 -1 x18022 -1 x18171 -1 x18320 -1 x18469 -1 x18618 -1 x18767 -1 x18916 -1 x19065 -1 x19214 -1 x19363 -1 x19512 -1 x19661 -1 x19810 -1 x19959 -1 x20108 -1 x20257 -1 x20406 -1 x20555 -1 x20704 -1 x20853 -1 x21002 -1 x21151 -1 x21300 -1 x21449 -1 x21598 -1 x21747 -1 x21896 -1 x22045 -1 x22194 -1 x22343 >= -1;+-1 x143 -1 x292 -1 x441 -1 x590 -1 x739 -1 x888 -1 x1037 -1 x1186 -1 x1335 -1 x1484 -1 x1633 -1 x1782 -1 x1931 -1 x2080 -1 x2229 -1 x2378 -1 x2527 -1 x2676 -1 x2825 -1 x2974 -1 x3123 -1 x3272 -1 x3421 -1 x3570 -1 x3719 -1 x3868 -1 x4017 -1 x4166 -1 x4315 -1 x4464 -1 x4613 -1 x4762 -1 x4911 -1 x5060 -1 x5209 -1 x5358 -1 x5507 -1 x5656 -1 x5805 -1 x5954 -1 x6103 -1 x6252 -1 x6401 -1 x6550 -1 x6699 -1 x6848 -1 x6997 -1 x7146 -1 x7295 -1 x7444 -1 x7593 -1 x7742 -1 x7891 -1 x8040 -1 x8189 -1 x8338 -1 x8487 -1 x8636 -1 x8785 -1 x8934 -1 x9083 -1 x9232 -1 x9381 -1 x9530 -1 x9679 -1 x9828 -1 x9977 -1 x10126 -1 x10275 -1 x10424 -1 x10573 -1 x10722 -1 x10871 -1 x11020 -1 x11169 -1 x11318 -1 x11467 -1 x11616 -1 x11765 -1 x11914 -1 x12063 -1 x12212 -1 x12361 -1 x12510 -1 x12659 -1 x12808 -1 x12957 -1 x13106 -1 x13255 -1 x13404 -1 x13553 -1 x13702 -1 x13851 -1 x14000 -1 x14149 -1 x14298 -1 x14447 -1 x14596 -1 x14745 -1 x14894 -1 x15043 -1 x15192 -1 x15341 -1 x15490 -1 x15639 -1 x15788 -1 x15937 -1 x16086 -1 x16235 -1 x16384 -1 x16533 -1 x16682 -1 x16831 -1 x16980 -1 x17129 -1 x17278 -1 x17427 -1 x17576 -1 x17725 -1 x17874 -1 x18023 -1 x18172 -1 x18321 -1 x18470 -1 x18619 -1 x18768 -1 x18917 -1 x19066 -1 x19215 -1 x19364 -1 x19513 -1 x19662 -1 x19811 -1 x19960 -1 x20109 -1 x20258 -1 x20407 -1 x20556 -1 x20705 -1 x20854 -1 x21003 -1 x21152 -1 x21301 -1 x21450 -1 x21599 -1 x21748 -1 x21897 -1 x22046 -1 x22195 -1 x22344 >= -1;+-1 x144 -1 x293 -1 x442 -1 x591 -1 x740 -1 x889 -1 x1038 -1 x1187 -1 x1336 -1 x1485 -1 x1634 -1 x1783 -1 x1932 -1 x2081 -1 x2230 -1 x2379 -1 x2528 -1 x2677 -1 x2826 -1 x2975 -1 x3124 -1 x3273 -1 x3422 -1 x3571 -1 x3720 -1 x3869 -1 x4018 -1 x4167 -1 x4316 -1 x4465 -1 x4614 -1 x4763 -1 x4912 -1 x5061 -1 x5210 -1 x5359 -1 x5508 -1 x5657 -1 x5806 -1 x5955 -1 x6104 -1 x6253 -1 x6402 -1 x6551 -1 x6700 -1 x6849 -1 x6998 -1 x7147 -1 x7296 -1 x7445 -1 x7594 -1 x7743 -1 x7892 -1 x8041 -1 x8190 -1 x8339 -1 x8488 -1 x8637 -1 x8786 -1 x8935 -1 x9084 -1 x9233 -1 x9382 -1 x9531 -1 x9680 -1 x9829 -1 x9978 -1 x10127 -1 x10276 -1 x10425 -1 x10574 -1 x10723 -1 x10872 -1 x11021 -1 x11170 -1 x11319 -1 x11468 -1 x11617 -1 x11766 -1 x11915 -1 x12064 -1 x12213 -1 x12362 -1 x12511 -1 x12660 -1 x12809 -1 x12958 -1 x13107 -1 x13256 -1 x13405 -1 x13554 -1 x13703 -1 x13852 -1 x14001 -1 x14150 -1 x14299 -1 x14448 -1 x14597 -1 x14746 -1 x14895 -1 x15044 -1 x15193 -1 x15342 -1 x15491 -1 x15640 -1 x15789 -1 x15938 -1 x16087 -1 x16236 -1 x16385 -1 x16534 -1 x16683 -1 x16832 -1 x16981 -1 x17130 -1 x17279 -1 x17428 -1 x17577 -1 x17726 -1 x17875 -1 x18024 -1 x18173 -1 x18322 -1 x18471 -1 x18620 -1 x18769 -1 x18918 -1 x19067 -1 x19216 -1 x19365 -1 x19514 -1 x19663 -1 x19812 -1 x19961 -1 x20110 -1 x20259 -1 x20408 -1 x20557 -1 x20706 -1 x20855 -1 x21004 -1 x21153 -1 x21302 -1 x21451 -1 x21600 -1 x21749 -1 x21898 -1 x22047 -1 x22196 -1 x22345 >= -1;+-1 x145 -1 x294 -1 x443 -1 x592 -1 x741 -1 x890 -1 x1039 -1 x1188 -1 x1337 -1 x1486 -1 x1635 -1 x1784 -1 x1933 -1 x2082 -1 x2231 -1 x2380 -1 x2529 -1 x2678 -1 x2827 -1 x2976 -1 x3125 -1 x3274 -1 x3423 -1 x3572 -1 x3721 -1 x3870 -1 x4019 -1 x4168 -1 x4317 -1 x4466 -1 x4615 -1 x4764 -1 x4913 -1 x5062 -1 x5211 -1 x5360 -1 x5509 -1 x5658 -1 x5807 -1 x5956 -1 x6105 -1 x6254 -1 x6403 -1 x6552 -1 x6701 -1 x6850 -1 x6999 -1 x7148 -1 x7297 -1 x7446 -1 x7595 -1 x7744 -1 x7893 -1 x8042 -1 x8191 -1 x8340 -1 x8489 -1 x8638 -1 x8787 -1 x8936 -1 x9085 -1 x9234 -1 x9383 -1 x9532 -1 x9681 -1 x9830 -1 x9979 -1 x10128 -1 x10277 -1 x10426 -1 x10575 -1 x10724 -1 x10873 -1 x11022 -1 x11171 -1 x11320 -1 x11469 -1 x11618 -1 x11767 -1 x11916 -1 x12065 -1 x12214 -1 x12363 -1 x12512 -1 x12661 -1 x12810 -1 x12959 -1 x13108 -1 x13257 -1 x13406 -1 x13555 -1 x13704 -1 x13853 -1 x14002 -1 x14151 -1 x14300 -1 x14449 -1 x14598 -1 x14747 -1 x14896 -1 x15045 -1 x15194 -1 x15343 -1 x15492 -1 x15641 -1 x15790 -1 x15939 -1 x16088 -1 x16237 -1 x16386 -1 x16535 -1 x16684 -1 x16833 -1 x16982 -1 x17131 -1 x17280 -1 x17429 -1 x17578 -1 x17727 -1 x17876 -1 x18025 -1 x18174 -1 x18323 -1 x18472 -1 x18621 -1 x18770 -1 x18919 -1 x19068 -1 x19217 -1 x19366 -1 x19515 -1 x19664 -1 x19813 -1 x19962 -1 x20111 -1 x20260 -1 x20409 -1 x20558 -1 x20707 -1 x20856 -1 x21005 -1 x21154 -1 x21303 -1 x21452 -1 x21601 -1 x21750 -1 x21899 -1 x22048 -1 x22197 -1 x22346 >= -1;+-1 x146 -1 x295 -1 x444 -1 x593 -1 x742 -1 x891 -1 x1040 -1 x1189 -1 x1338 -1 x1487 -1 x1636 -1 x1785 -1 x1934 -1 x2083 -1 x2232 -1 x2381 -1 x2530 -1 x2679 -1 x2828 -1 x2977 -1 x3126 -1 x3275 -1 x3424 -1 x3573 -1 x3722 -1 x3871 -1 x4020 -1 x4169 -1 x4318 -1 x4467 -1 x4616 -1 x4765 -1 x4914 -1 x5063 -1 x5212 -1 x5361 -1 x5510 -1 x5659 -1 x5808 -1 x5957 -1 x6106 -1 x6255 -1 x6404 -1 x6553 -1 x6702 -1 x6851 -1 x7000 -1 x7149 -1 x7298 -1 x7447 -1 x7596 -1 x7745 -1 x7894 -1 x8043 -1 x8192 -1 x8341 -1 x8490 -1 x8639 -1 x8788 -1 x8937 -1 x9086 -1 x9235 -1 x9384 -1 x9533 -1 x9682 -1 x9831 -1 x9980 -1 x10129 -1 x10278 -1 x10427 -1 x10576 -1 x10725 -1 x10874 -1 x11023 -1 x11172 -1 x11321 -1 x11470 -1 x11619 -1 x11768 -1 x11917 -1 x12066 -1 x12215 -1 x12364 -1 x12513 -1 x12662 -1 x12811 -1 x12960 -1 x13109 -1 x13258 -1 x13407 -1 x13556 -1 x13705 -1 x13854 -1 x14003 -1 x14152 -1 x14301 -1 x14450 -1 x14599 -1 x14748 -1 x14897 -1 x15046 -1 x15195 -1 x15344 -1 x15493 -1 x15642 -1 x15791 -1 x15940 -1 x16089 -1 x16238 -1 x16387 -1 x16536 -1 x16685 -1 x16834 -1 x16983 -1 x17132 -1 x17281 -1 x17430 -1 x17579 -1 x17728 -1 x17877 -1 x18026 -1 x18175 -1 x18324 -1 x18473 -1 x18622 -1 x18771 -1 x18920 -1 x19069 -1 x19218 -1 x19367 -1 x19516 -1 x19665 -1 x19814 -1 x19963 -1 x20112 -1 x20261 -1 x20410 -1 x20559 -1 x20708 -1 x20857 -1 x21006 -1 x21155 -1 x21304 -1 x21453 -1 x21602 -1 x21751 -1 x21900 -1 x22049 -1 x22198 -1 x22347 >= -1;+-1 x147 -1 x296 -1 x445 -1 x594 -1 x743 -1 x892 -1 x1041 -1 x1190 -1 x1339 -1 x1488 -1 x1637 -1 x1786 -1 x1935 -1 x2084 -1 x2233 -1 x2382 -1 x2531 -1 x2680 -1 x2829 -1 x2978 -1 x3127 -1 x3276 -1 x3425 -1 x3574 -1 x3723 -1 x3872 -1 x4021 -1 x4170 -1 x4319 -1 x4468 -1 x4617 -1 x4766 -1 x4915 -1 x5064 -1 x5213 -1 x5362 -1 x5511 -1 x5660 -1 x5809 -1 x5958 -1 x6107 -1 x6256 -1 x6405 -1 x6554 -1 x6703 -1 x6852 -1 x7001 -1 x7150 -1 x7299 -1 x7448 -1 x7597 -1 x7746 -1 x7895 -1 x8044 -1 x8193 -1 x8342 -1 x8491 -1 x8640 -1 x8789 -1 x8938 -1 x9087 -1 x9236 -1 x9385 -1 x9534 -1 x9683 -1 x9832 -1 x9981 -1 x10130 -1 x10279 -1 x10428 -1 x10577 -1 x10726 -1 x10875 -1 x11024 -1 x11173 -1 x11322 -1 x11471 -1 x11620 -1 x11769 -1 x11918 -1 x12067 -1 x12216 -1 x12365 -1 x12514 -1 x12663 -1 x12812 -1 x12961 -1 x13110 -1 x13259 -1 x13408 -1 x13557 -1 x13706 -1 x13855 -1 x14004 -1 x14153 -1 x14302 -1 x14451 -1 x14600 -1 x14749 -1 x14898 -1 x15047 -1 x15196 -1 x15345 -1 x15494 -1 x15643 -1 x15792 -1 x15941 -1 x16090 -1 x16239 -1 x16388 -1 x16537 -1 x16686 -1 x16835 -1 x16984 -1 x17133 -1 x17282 -1 x17431 -1 x17580 -1 x17729 -1 x17878 -1 x18027 -1 x18176 -1 x18325 -1 x18474 -1 x18623 -1 x18772 -1 x18921 -1 x19070 -1 x19219 -1 x19368 -1 x19517 -1 x19666 -1 x19815 -1 x19964 -1 x20113 -1 x20262 -1 x20411 -1 x20560 -1 x20709 -1 x20858 -1 x21007 -1 x21156 -1 x21305 -1 x21454 -1 x21603 -1 x21752 -1 x21901 -1 x22050 -1 x22199 -1 x22348 >= -1;+-1 x148 -1 x297 -1 x446 -1 x595 -1 x744 -1 x893 -1 x1042 -1 x1191 -1 x1340 -1 x1489 -1 x1638 -1 x1787 -1 x1936 -1 x2085 -1 x2234 -1 x2383 -1 x2532 -1 x2681 -1 x2830 -1 x2979 -1 x3128 -1 x3277 -1 x3426 -1 x3575 -1 x3724 -1 x3873 -1 x4022 -1 x4171 -1 x4320 -1 x4469 -1 x4618 -1 x4767 -1 x4916 -1 x5065 -1 x5214 -1 x5363 -1 x5512 -1 x5661 -1 x5810 -1 x5959 -1 x6108 -1 x6257 -1 x6406 -1 x6555 -1 x6704 -1 x6853 -1 x7002 -1 x7151 -1 x7300 -1 x7449 -1 x7598 -1 x7747 -1 x7896 -1 x8045 -1 x8194 -1 x8343 -1 x8492 -1 x8641 -1 x8790 -1 x8939 -1 x9088 -1 x9237 -1 x9386 -1 x9535 -1 x9684 -1 x9833 -1 x9982 -1 x10131 -1 x10280 -1 x10429 -1 x10578 -1 x10727 -1 x10876 -1 x11025 -1 x11174 -1 x11323 -1 x11472 -1 x11621 -1 x11770 -1 x11919 -1 x12068 -1 x12217 -1 x12366 -1 x12515 -1 x12664 -1 x12813 -1 x12962 -1 x13111 -1 x13260 -1 x13409 -1 x13558 -1 x13707 -1 x13856 -1 x14005 -1 x14154 -1 x14303 -1 x14452 -1 x14601 -1 x14750 -1 x14899 -1 x15048 -1 x15197 -1 x15346 -1 x15495 -1 x15644 -1 x15793 -1 x15942 -1 x16091 -1 x16240 -1 x16389 -1 x16538 -1 x16687 -1 x16836 -1 x16985 -1 x17134 -1 x17283 -1 x17432 -1 x17581 -1 x17730 -1 x17879 -1 x18028 -1 x18177 -1 x18326 -1 x18475 -1 x18624 -1 x18773 -1 x18922 -1 x19071 -1 x19220 -1 x19369 -1 x19518 -1 x19667 -1 x19816 -1 x19965 -1 x20114 -1 x20263 -1 x20412 -1 x20561 -1 x20710 -1 x20859 -1 x21008 -1 x21157 -1 x21306 -1 x21455 -1 x21604 -1 x21753 -1 x21902 -1 x22051 -1 x22200 -1 x22349 >= -1;+-1 x149 -1 x298 -1 x447 -1 x596 -1 x745 -1 x894 -1 x1043 -1 x1192 -1 x1341 -1 x1490 -1 x1639 -1 x1788 -1 x1937 -1 x2086 -1 x2235 -1 x2384 -1 x2533 -1 x2682 -1 x2831 -1 x2980 -1 x3129 -1 x3278 -1 x3427 -1 x3576 -1 x3725 -1 x3874 -1 x4023 -1 x4172 -1 x4321 -1 x4470 -1 x4619 -1 x4768 -1 x4917 -1 x5066 -1 x5215 -1 x5364 -1 x5513 -1 x5662 -1 x5811 -1 x5960 -1 x6109 -1 x6258 -1 x6407 -1 x6556 -1 x6705 -1 x6854 -1 x7003 -1 x7152 -1 x7301 -1 x7450 -1 x7599 -1 x7748 -1 x7897 -1 x8046 -1 x8195 -1 x8344 -1 x8493 -1 x8642 -1 x8791 -1 x8940 -1 x9089 -1 x9238 -1 x9387 -1 x9536 -1 x9685 -1 x9834 -1 x9983 -1 x10132 -1 x10281 -1 x10430 -1 x10579 -1 x10728 -1 x10877 -1 x11026 -1 x11175 -1 x11324 -1 x11473 -1 x11622 -1 x11771 -1 x11920 -1 x12069 -1 x12218 -1 x12367 -1 x12516 -1 x12665 -1 x12814 -1 x12963 -1 x13112 -1 x13261 -1 x13410 -1 x13559 -1 x13708 -1 x13857 -1 x14006 -1 x14155 -1 x14304 -1 x14453 -1 x14602 -1 x14751 -1 x14900 -1 x15049 -1 x15198 -1 x15347 -1 x15496 -1 x15645 -1 x15794 -1 x15943 -1 x16092 -1 x16241 -1 x16390 -1 x16539 -1 x16688 -1 x16837 -1 x16986 -1 x17135 -1 x17284 -1 x17433 -1 x17582 -1 x17731 -1 x17880 -1 x18029 -1 x18178 -1 x18327 -1 x18476 -1 x18625 -1 x18774 -1 x18923 -1 x19072 -1 x19221 -1 x19370 -1 x19519 -1 x19668 -1 x19817 -1 x19966 -1 x20115 -1 x20264 -1 x20413 -1 x20562 -1 x20711 -1 x20860 -1 x21009 -1 x21158 -1 x21307 -1 x21456 -1 x21605 -1 x21754 -1 x21903 -1 x22052 -1 x22201 -1 x22350 >= -1;
+ samples/smt/chain.smt2 view
@@ -0,0 +1,6 @@+(set-logic QF_LIA)+(declare-fun x () Int)+(declare-fun y () Int)+(assert (< 0 x y 2))+;(assert (and (< 0 x) (< x y) (< y 2)))+(check-sat)
+ samples/smt/yices-floating-point.ys view
@@ -0,0 +1,9 @@+; Yices 1 does not accept floating point notation, but Yices 2 accept it.+(define x::int)+(assert (< -0.5 x))+(assert (< x 1.8))+(assert (<= 2e-2 x))+(assert (<= 2.0e-2 x))+(assert (<= x 3e10))+(assert (<= x 3.0e10))+(check)
+ samples/wbo/normalized-satellite01ac_wcsp.wbo view
@@ -0,0 +1,12610 @@+* #variable= 411 #constraint= 12603 #soft= 12524 mincost= 1 maxcost= 80782 sumcost= 990224691+****************************************+* begin normalizer comments+* category= PARTIAL-BIGINT-LIN+* end normalizer comments+****************************************+soft: 80782 ;++1 x1 +1 x2 = 1 ;++1 x3 +1 x4 = 1 ;++1 x5 +1 x6 = 1 ;++1 x7 +1 x8 +1 x9 = 1 ;++1 x10 +1 x11 +1 x12 = 1 ;++1 x13 +1 x14 +1 x15 = 1 ;++1 x16 +1 x17 +1 x18 = 1 ;++1 x19 +1 x20 +1 x21 = 1 ;++1 x22 +1 x23 +1 x24 +1 x25 +1 x26 +1 x27 +1 x28 +1 x29 = 1 ;++1 x30 +1 x31 +1 x32 +1 x33 +1 x34 +1 x35 +1 x36 +1 x37 = 1 ;++1 x38 +1 x39 +1 x40 +1 x41 +1 x42 +1 x43 +1 x44 +1 x45 = 1 ;++1 x46 +1 x47 +1 x48 = 1 ;++1 x49 +1 x50 +1 x51 = 1 ;++1 x52 +1 x53 +1 x54 = 1 ;++1 x55 +1 x56 +1 x57 = 1 ;++1 x58 +1 x59 +1 x60 = 1 ;++1 x61 +1 x62 +1 x63 +1 x64 +1 x65 +1 x66 +1 x67 +1 x68 = 1 ;++1 x69 +1 x70 +1 x71 +1 x72 +1 x73 +1 x74 +1 x75 +1 x76 = 1 ;++1 x77 +1 x78 +1 x79 +1 x80 +1 x81 +1 x82 +1 x83 +1 x84 = 1 ;++1 x85 +1 x86 +1 x87 +1 x88 +1 x89 +1 x90 +1 x91 +1 x92 = 1 ;++1 x93 +1 x94 +1 x95 +1 x96 +1 x97 +1 x98 +1 x99 +1 x100 = 1 ;++1 x101 +1 x102 +1 x103 +1 x104 +1 x105 +1 x106 +1 x107 +1 x108 = 1 ;++1 x109 +1 x110 +1 x111 +1 x112 +1 x113 +1 x114 +1 x115 +1 x116 = 1 ;++1 x117 +1 x118 +1 x119 = 1 ;++1 x120 +1 x121 +1 x122 = 1 ;++1 x123 +1 x124 +1 x125 = 1 ;++1 x126 +1 x127 +1 x128 = 1 ;++1 x129 +1 x130 +1 x131 = 1 ;++1 x132 +1 x133 +1 x134 = 1 ;++1 x135 +1 x136 +1 x137 +1 x138 +1 x139 +1 x140 +1 x141 +1 x142 = 1 ;++1 x143 +1 x144 +1 x145 +1 x146 +1 x147 +1 x148 +1 x149 +1 x150 = 1 ;++1 x151 +1 x152 +1 x153 +1 x154 +1 x155 +1 x156 +1 x157 +1 x158 = 1 ;++1 x159 +1 x160 +1 x161 +1 x162 +1 x163 +1 x164 +1 x165 +1 x166 = 1 ;++1 x167 +1 x168 +1 x169 +1 x170 +1 x171 +1 x172 +1 x173 +1 x174 = 1 ;++1 x175 +1 x176 +1 x177 +1 x178 +1 x179 +1 x180 +1 x181 +1 x182 = 1 ;++1 x183 +1 x184 +1 x185 +1 x186 +1 x187 +1 x188 +1 x189 +1 x190 = 1 ;++1 x191 +1 x192 +1 x193 = 1 ;++1 x194 +1 x195 = 1 ;++1 x196 +1 x197 = 1 ;++1 x198 +1 x199 = 1 ;++1 x200 +1 x201 +1 x202 = 1 ;++1 x203 +1 x204 +1 x205 = 1 ;++1 x206 +1 x207 +1 x208 +1 x209 +1 x210 +1 x211 +1 x212 +1 x213 = 1 ;++1 x214 +1 x215 +1 x216 +1 x217 +1 x218 +1 x219 +1 x220 +1 x221 = 1 ;++1 x222 +1 x223 +1 x224 +1 x225 +1 x226 +1 x227 +1 x228 +1 x229 = 1 ;++1 x230 +1 x231 +1 x232 +1 x233 +1 x234 +1 x235 +1 x236 +1 x237 = 1 ;++1 x238 +1 x239 +1 x240 +1 x241 +1 x242 +1 x243 +1 x244 +1 x245 = 1 ;++1 x246 +1 x247 +1 x248 +1 x249 +1 x250 +1 x251 +1 x252 +1 x253 = 1 ;++1 x254 +1 x255 +1 x256 +1 x257 +1 x258 +1 x259 +1 x260 +1 x261 = 1 ;++1 x262 +1 x263 +1 x264 = 1 ;++1 x265 +1 x266 +1 x267 = 1 ;++1 x268 +1 x269 +1 x270 = 1 ;++1 x271 +1 x272 +1 x273 +1 x274 +1 x275 +1 x276 +1 x277 +1 x278 = 1 ;++1 x279 +1 x280 +1 x281 +1 x282 +1 x283 +1 x284 +1 x285 +1 x286 = 1 ;++1 x287 +1 x288 +1 x289 +1 x290 +1 x291 +1 x292 +1 x293 +1 x294 = 1 ;++1 x295 +1 x296 +1 x297 +1 x298 +1 x299 +1 x300 +1 x301 +1 x302 = 1 ;++1 x303 +1 x304 +1 x305 +1 x306 +1 x307 +1 x308 +1 x309 +1 x310 = 1 ;++1 x311 +1 x312 +1 x313 +1 x314 +1 x315 +1 x316 +1 x317 +1 x318 = 1 ;++1 x319 +1 x320 +1 x321 +1 x322 +1 x323 +1 x324 +1 x325 +1 x326 = 1 ;++1 x327 +1 x328 +1 x329 = 1 ;++1 x330 +1 x331 = 1 ;++1 x332 +1 x333 +1 x334 = 1 ;++1 x335 +1 x336 +1 x337 +1 x338 +1 x339 +1 x340 +1 x341 +1 x342 = 1 ;++1 x343 +1 x344 +1 x345 +1 x346 +1 x347 +1 x348 +1 x349 +1 x350 = 1 ;++1 x351 +1 x352 +1 x353 +1 x354 +1 x355 +1 x356 +1 x357 +1 x358 = 1 ;++1 x359 +1 x360 +1 x361 +1 x362 +1 x363 +1 x364 +1 x365 +1 x366 = 1 ;++1 x367 +1 x368 +1 x369 +1 x370 +1 x371 +1 x372 +1 x373 +1 x374 = 1 ;++1 x375 +1 x376 +1 x377 +1 x378 +1 x379 +1 x380 +1 x381 +1 x382 = 1 ;++1 x383 +1 x384 +1 x385 +1 x386 +1 x387 +1 x388 +1 x389 +1 x390 = 1 ;++1 x391 +1 x392 +1 x393 = 1 ;++1 x394 +1 x395 = 1 ;++1 x396 +1 x397 = 1 ;++1 x398 +1 x399 = 1 ;++1 x400 +1 x401 = 1 ;++1 x402 +1 x403 = 1 ;++1 x404 +1 x405 = 1 ;++1 x406 +1 x407 = 1 ;++1 x408 +1 x409 = 1 ;++1 x410 +1 x411 = 1 ;+[80782] -1 x31 -1 x23 >= -1 ;+[80782] -1 x31 -1 x24 >= -1 ;+[80782] -1 x31 -1 x25 >= -1 ;+[80782] -1 x31 -1 x26 >= -1 ;+[80782] -1 x31 -1 x27 >= -1 ;+[80782] -1 x31 -1 x28 >= -1 ;+[80782] -1 x31 -1 x29 >= -1 ;+[80782] -1 x32 -1 x23 >= -1 ;+[80782] -1 x32 -1 x24 >= -1 ;+[80782] -1 x32 -1 x25 >= -1 ;+[80782] -1 x32 -1 x26 >= -1 ;+[80782] -1 x32 -1 x27 >= -1 ;+[80782] -1 x32 -1 x28 >= -1 ;+[80782] -1 x32 -1 x29 >= -1 ;+[80782] -1 x33 -1 x23 >= -1 ;+[80782] -1 x33 -1 x24 >= -1 ;+[80782] -1 x33 -1 x25 >= -1 ;+[80782] -1 x33 -1 x26 >= -1 ;+[80782] -1 x33 -1 x27 >= -1 ;+[80782] -1 x33 -1 x28 >= -1 ;+[80782] -1 x33 -1 x29 >= -1 ;+[80782] -1 x34 -1 x23 >= -1 ;+[80782] -1 x34 -1 x24 >= -1 ;+[80782] -1 x34 -1 x25 >= -1 ;+[80782] -1 x34 -1 x26 >= -1 ;+[80782] -1 x34 -1 x27 >= -1 ;+[80782] -1 x34 -1 x28 >= -1 ;+[80782] -1 x34 -1 x29 >= -1 ;+[80782] -1 x35 -1 x23 >= -1 ;+[80782] -1 x35 -1 x24 >= -1 ;+[80782] -1 x35 -1 x25 >= -1 ;+[80782] -1 x35 -1 x26 >= -1 ;+[80782] -1 x35 -1 x27 >= -1 ;+[80782] -1 x35 -1 x28 >= -1 ;+[80782] -1 x35 -1 x29 >= -1 ;+[80782] -1 x36 -1 x23 >= -1 ;+[80782] -1 x36 -1 x24 >= -1 ;+[80782] -1 x36 -1 x25 >= -1 ;+[80782] -1 x36 -1 x26 >= -1 ;+[80782] -1 x36 -1 x27 >= -1 ;+[80782] -1 x36 -1 x28 >= -1 ;+[80782] -1 x36 -1 x29 >= -1 ;+[80782] -1 x37 -1 x23 >= -1 ;+[80782] -1 x37 -1 x24 >= -1 ;+[80782] -1 x37 -1 x25 >= -1 ;+[80782] -1 x37 -1 x26 >= -1 ;+[80782] -1 x37 -1 x27 >= -1 ;+[80782] -1 x37 -1 x28 >= -1 ;+[80782] -1 x37 -1 x29 >= -1 ;+[80782] -1 x39 -1 x23 >= -1 ;+[80782] -1 x39 -1 x24 >= -1 ;+[80782] -1 x39 -1 x25 >= -1 ;+[80782] -1 x39 -1 x26 >= -1 ;+[80782] -1 x39 -1 x27 >= -1 ;+[80782] -1 x39 -1 x28 >= -1 ;+[80782] -1 x39 -1 x29 >= -1 ;+[80782] -1 x40 -1 x23 >= -1 ;+[80782] -1 x40 -1 x24 >= -1 ;+[80782] -1 x40 -1 x25 >= -1 ;+[80782] -1 x40 -1 x26 >= -1 ;+[80782] -1 x40 -1 x27 >= -1 ;+[80782] -1 x40 -1 x28 >= -1 ;+[80782] -1 x40 -1 x29 >= -1 ;+[80782] -1 x41 -1 x23 >= -1 ;+[80782] -1 x41 -1 x24 >= -1 ;+[80782] -1 x41 -1 x25 >= -1 ;+[80782] -1 x41 -1 x26 >= -1 ;+[80782] -1 x41 -1 x27 >= -1 ;+[80782] -1 x41 -1 x28 >= -1 ;+[80782] -1 x41 -1 x29 >= -1 ;+[80782] -1 x42 -1 x23 >= -1 ;+[80782] -1 x42 -1 x24 >= -1 ;+[80782] -1 x42 -1 x25 >= -1 ;+[80782] -1 x42 -1 x26 >= -1 ;+[80782] -1 x42 -1 x27 >= -1 ;+[80782] -1 x42 -1 x28 >= -1 ;+[80782] -1 x42 -1 x29 >= -1 ;+[80782] -1 x43 -1 x23 >= -1 ;+[80782] -1 x43 -1 x24 >= -1 ;+[80782] -1 x43 -1 x25 >= -1 ;+[80782] -1 x43 -1 x26 >= -1 ;+[80782] -1 x43 -1 x27 >= -1 ;+[80782] -1 x43 -1 x28 >= -1 ;+[80782] -1 x43 -1 x29 >= -1 ;+[80782] -1 x44 -1 x23 >= -1 ;+[80782] -1 x44 -1 x24 >= -1 ;+[80782] -1 x44 -1 x25 >= -1 ;+[80782] -1 x44 -1 x26 >= -1 ;+[80782] -1 x44 -1 x27 >= -1 ;+[80782] -1 x44 -1 x28 >= -1 ;+[80782] -1 x44 -1 x29 >= -1 ;+[80782] -1 x45 -1 x23 >= -1 ;+[80782] -1 x45 -1 x24 >= -1 ;+[80782] -1 x45 -1 x25 >= -1 ;+[80782] -1 x45 -1 x26 >= -1 ;+[80782] -1 x45 -1 x27 >= -1 ;+[80782] -1 x45 -1 x28 >= -1 ;+[80782] -1 x45 -1 x29 >= -1 ;+[80782] -1 x39 -1 x31 >= -1 ;+[80782] -1 x39 -1 x32 >= -1 ;+[80782] -1 x39 -1 x33 >= -1 ;+[80782] -1 x39 -1 x34 >= -1 ;+[80782] -1 x39 -1 x35 >= -1 ;+[80782] -1 x39 -1 x36 >= -1 ;+[80782] -1 x39 -1 x37 >= -1 ;+[80782] -1 x40 -1 x31 >= -1 ;+[80782] -1 x40 -1 x32 >= -1 ;+[80782] -1 x40 -1 x33 >= -1 ;+[80782] -1 x40 -1 x34 >= -1 ;+[80782] -1 x40 -1 x35 >= -1 ;+[80782] -1 x40 -1 x36 >= -1 ;+[80782] -1 x40 -1 x37 >= -1 ;+[80782] -1 x41 -1 x31 >= -1 ;+[80782] -1 x41 -1 x32 >= -1 ;+[80782] -1 x41 -1 x33 >= -1 ;+[80782] -1 x41 -1 x34 >= -1 ;+[80782] -1 x41 -1 x35 >= -1 ;+[80782] -1 x41 -1 x36 >= -1 ;+[80782] -1 x41 -1 x37 >= -1 ;+[80782] -1 x42 -1 x31 >= -1 ;+[80782] -1 x42 -1 x32 >= -1 ;+[80782] -1 x42 -1 x33 >= -1 ;+[80782] -1 x42 -1 x34 >= -1 ;+[80782] -1 x42 -1 x35 >= -1 ;+[80782] -1 x42 -1 x36 >= -1 ;+[80782] -1 x42 -1 x37 >= -1 ;+[80782] -1 x43 -1 x31 >= -1 ;+[80782] -1 x43 -1 x32 >= -1 ;+[80782] -1 x43 -1 x33 >= -1 ;+[80782] -1 x43 -1 x34 >= -1 ;+[80782] -1 x43 -1 x35 >= -1 ;+[80782] -1 x43 -1 x36 >= -1 ;+[80782] -1 x43 -1 x37 >= -1 ;+[80782] -1 x44 -1 x31 >= -1 ;+[80782] -1 x44 -1 x32 >= -1 ;+[80782] -1 x44 -1 x33 >= -1 ;+[80782] -1 x44 -1 x34 >= -1 ;+[80782] -1 x44 -1 x35 >= -1 ;+[80782] -1 x44 -1 x36 >= -1 ;+[80782] -1 x44 -1 x37 >= -1 ;+[80782] -1 x45 -1 x31 >= -1 ;+[80782] -1 x45 -1 x32 >= -1 ;+[80782] -1 x45 -1 x33 >= -1 ;+[80782] -1 x45 -1 x34 >= -1 ;+[80782] -1 x45 -1 x35 >= -1 ;+[80782] -1 x45 -1 x36 >= -1 ;+[80782] -1 x45 -1 x37 >= -1 ;+[80782] -1 x118 -1 x59 >= -1 ;+[80782] -1 x118 -1 x60 >= -1 ;+[80782] -1 x119 -1 x59 >= -1 ;+[80782] -1 x119 -1 x60 >= -1 ;+[80782] -1 x70 -1 x62 >= -1 ;+[80782] -1 x70 -1 x63 >= -1 ;+[80782] -1 x70 -1 x64 >= -1 ;+[80782] -1 x70 -1 x65 >= -1 ;+[80782] -1 x70 -1 x66 >= -1 ;+[80782] -1 x70 -1 x67 >= -1 ;+[80782] -1 x70 -1 x68 >= -1 ;+[80782] -1 x71 -1 x62 >= -1 ;+[80782] -1 x71 -1 x63 >= -1 ;+[80782] -1 x71 -1 x64 >= -1 ;+[80782] -1 x71 -1 x65 >= -1 ;+[80782] -1 x71 -1 x66 >= -1 ;+[80782] -1 x71 -1 x67 >= -1 ;+[80782] -1 x71 -1 x68 >= -1 ;+[80782] -1 x72 -1 x62 >= -1 ;+[80782] -1 x72 -1 x63 >= -1 ;+[80782] -1 x72 -1 x64 >= -1 ;+[80782] -1 x72 -1 x65 >= -1 ;+[80782] -1 x72 -1 x66 >= -1 ;+[80782] -1 x72 -1 x67 >= -1 ;+[80782] -1 x72 -1 x68 >= -1 ;+[80782] -1 x73 -1 x62 >= -1 ;+[80782] -1 x73 -1 x63 >= -1 ;+[80782] -1 x73 -1 x64 >= -1 ;+[80782] -1 x73 -1 x65 >= -1 ;+[80782] -1 x73 -1 x66 >= -1 ;+[80782] -1 x73 -1 x67 >= -1 ;+[80782] -1 x73 -1 x68 >= -1 ;+[80782] -1 x74 -1 x62 >= -1 ;+[80782] -1 x74 -1 x63 >= -1 ;+[80782] -1 x74 -1 x64 >= -1 ;+[80782] -1 x74 -1 x65 >= -1 ;+[80782] -1 x74 -1 x66 >= -1 ;+[80782] -1 x74 -1 x67 >= -1 ;+[80782] -1 x74 -1 x68 >= -1 ;+[80782] -1 x75 -1 x62 >= -1 ;+[80782] -1 x75 -1 x63 >= -1 ;+[80782] -1 x75 -1 x64 >= -1 ;+[80782] -1 x75 -1 x65 >= -1 ;+[80782] -1 x75 -1 x66 >= -1 ;+[80782] -1 x75 -1 x67 >= -1 ;+[80782] -1 x75 -1 x68 >= -1 ;+[80782] -1 x76 -1 x62 >= -1 ;+[80782] -1 x76 -1 x63 >= -1 ;+[80782] -1 x76 -1 x64 >= -1 ;+[80782] -1 x76 -1 x65 >= -1 ;+[80782] -1 x76 -1 x66 >= -1 ;+[80782] -1 x76 -1 x67 >= -1 ;+[80782] -1 x76 -1 x68 >= -1 ;+[80782] -1 x78 -1 x62 >= -1 ;+[80782] -1 x78 -1 x63 >= -1 ;+[80782] -1 x78 -1 x64 >= -1 ;+[80782] -1 x78 -1 x65 >= -1 ;+[80782] -1 x78 -1 x66 >= -1 ;+[80782] -1 x78 -1 x67 >= -1 ;+[80782] -1 x78 -1 x68 >= -1 ;+[80782] -1 x79 -1 x62 >= -1 ;+[80782] -1 x79 -1 x63 >= -1 ;+[80782] -1 x79 -1 x64 >= -1 ;+[80782] -1 x79 -1 x65 >= -1 ;+[80782] -1 x79 -1 x66 >= -1 ;+[80782] -1 x79 -1 x67 >= -1 ;+[80782] -1 x79 -1 x68 >= -1 ;+[80782] -1 x80 -1 x62 >= -1 ;+[80782] -1 x80 -1 x63 >= -1 ;+[80782] -1 x80 -1 x64 >= -1 ;+[80782] -1 x80 -1 x65 >= -1 ;+[80782] -1 x80 -1 x66 >= -1 ;+[80782] -1 x80 -1 x67 >= -1 ;+[80782] -1 x80 -1 x68 >= -1 ;+[80782] -1 x81 -1 x62 >= -1 ;+[80782] -1 x81 -1 x63 >= -1 ;+[80782] -1 x81 -1 x64 >= -1 ;+[80782] -1 x81 -1 x65 >= -1 ;+[80782] -1 x81 -1 x66 >= -1 ;+[80782] -1 x81 -1 x67 >= -1 ;+[80782] -1 x81 -1 x68 >= -1 ;+[80782] -1 x82 -1 x62 >= -1 ;+[80782] -1 x82 -1 x63 >= -1 ;+[80782] -1 x82 -1 x64 >= -1 ;+[80782] -1 x82 -1 x65 >= -1 ;+[80782] -1 x82 -1 x66 >= -1 ;+[80782] -1 x82 -1 x67 >= -1 ;+[80782] -1 x82 -1 x68 >= -1 ;+[80782] -1 x83 -1 x62 >= -1 ;+[80782] -1 x83 -1 x63 >= -1 ;+[80782] -1 x83 -1 x64 >= -1 ;+[80782] -1 x83 -1 x65 >= -1 ;+[80782] -1 x83 -1 x66 >= -1 ;+[80782] -1 x83 -1 x67 >= -1 ;+[80782] -1 x83 -1 x68 >= -1 ;+[80782] -1 x84 -1 x62 >= -1 ;+[80782] -1 x84 -1 x63 >= -1 ;+[80782] -1 x84 -1 x64 >= -1 ;+[80782] -1 x84 -1 x65 >= -1 ;+[80782] -1 x84 -1 x66 >= -1 ;+[80782] -1 x84 -1 x67 >= -1 ;+[80782] -1 x84 -1 x68 >= -1 ;+[80782] -1 x86 -1 x62 >= -1 ;+[80782] -1 x86 -1 x63 >= -1 ;+[80782] -1 x86 -1 x64 >= -1 ;+[80782] -1 x86 -1 x65 >= -1 ;+[80782] -1 x86 -1 x66 >= -1 ;+[80782] -1 x86 -1 x67 >= -1 ;+[80782] -1 x86 -1 x68 >= -1 ;+[80782] -1 x87 -1 x62 >= -1 ;+[80782] -1 x87 -1 x63 >= -1 ;+[80782] -1 x87 -1 x64 >= -1 ;+[80782] -1 x87 -1 x65 >= -1 ;+[80782] -1 x87 -1 x66 >= -1 ;+[80782] -1 x87 -1 x67 >= -1 ;+[80782] -1 x87 -1 x68 >= -1 ;+[80782] -1 x88 -1 x62 >= -1 ;+[80782] -1 x88 -1 x63 >= -1 ;+[80782] -1 x88 -1 x64 >= -1 ;+[80782] -1 x88 -1 x65 >= -1 ;+[80782] -1 x88 -1 x66 >= -1 ;+[80782] -1 x88 -1 x67 >= -1 ;+[80782] -1 x88 -1 x68 >= -1 ;+[80782] -1 x89 -1 x62 >= -1 ;+[80782] -1 x89 -1 x63 >= -1 ;+[80782] -1 x89 -1 x64 >= -1 ;+[80782] -1 x89 -1 x65 >= -1 ;+[80782] -1 x89 -1 x66 >= -1 ;+[80782] -1 x89 -1 x67 >= -1 ;+[80782] -1 x89 -1 x68 >= -1 ;+[80782] -1 x90 -1 x62 >= -1 ;+[80782] -1 x90 -1 x63 >= -1 ;+[80782] -1 x90 -1 x64 >= -1 ;+[80782] -1 x90 -1 x65 >= -1 ;+[80782] -1 x90 -1 x66 >= -1 ;+[80782] -1 x90 -1 x67 >= -1 ;+[80782] -1 x90 -1 x68 >= -1 ;+[80782] -1 x91 -1 x62 >= -1 ;+[80782] -1 x91 -1 x63 >= -1 ;+[80782] -1 x91 -1 x64 >= -1 ;+[80782] -1 x91 -1 x65 >= -1 ;+[80782] -1 x91 -1 x66 >= -1 ;+[80782] -1 x91 -1 x67 >= -1 ;+[80782] -1 x91 -1 x68 >= -1 ;+[80782] -1 x92 -1 x62 >= -1 ;+[80782] -1 x92 -1 x63 >= -1 ;+[80782] -1 x92 -1 x64 >= -1 ;+[80782] -1 x92 -1 x65 >= -1 ;+[80782] -1 x92 -1 x66 >= -1 ;+[80782] -1 x92 -1 x67 >= -1 ;+[80782] -1 x92 -1 x68 >= -1 ;+[80782] -1 x94 -1 x62 >= -1 ;+[80782] -1 x94 -1 x63 >= -1 ;+[80782] -1 x94 -1 x64 >= -1 ;+[80782] -1 x94 -1 x65 >= -1 ;+[80782] -1 x94 -1 x66 >= -1 ;+[80782] -1 x94 -1 x67 >= -1 ;+[80782] -1 x94 -1 x68 >= -1 ;+[80782] -1 x95 -1 x62 >= -1 ;+[80782] -1 x95 -1 x63 >= -1 ;+[80782] -1 x95 -1 x64 >= -1 ;+[80782] -1 x95 -1 x65 >= -1 ;+[80782] -1 x95 -1 x66 >= -1 ;+[80782] -1 x95 -1 x67 >= -1 ;+[80782] -1 x95 -1 x68 >= -1 ;+[80782] -1 x96 -1 x62 >= -1 ;+[80782] -1 x96 -1 x63 >= -1 ;+[80782] -1 x96 -1 x64 >= -1 ;+[80782] -1 x96 -1 x65 >= -1 ;+[80782] -1 x96 -1 x66 >= -1 ;+[80782] -1 x96 -1 x67 >= -1 ;+[80782] -1 x96 -1 x68 >= -1 ;+[80782] -1 x97 -1 x62 >= -1 ;+[80782] -1 x97 -1 x63 >= -1 ;+[80782] -1 x97 -1 x64 >= -1 ;+[80782] -1 x97 -1 x65 >= -1 ;+[80782] -1 x97 -1 x66 >= -1 ;+[80782] -1 x97 -1 x67 >= -1 ;+[80782] -1 x97 -1 x68 >= -1 ;+[80782] -1 x98 -1 x62 >= -1 ;+[80782] -1 x98 -1 x63 >= -1 ;+[80782] -1 x98 -1 x64 >= -1 ;+[80782] -1 x98 -1 x65 >= -1 ;+[80782] -1 x98 -1 x66 >= -1 ;+[80782] -1 x98 -1 x67 >= -1 ;+[80782] -1 x98 -1 x68 >= -1 ;+[80782] -1 x99 -1 x62 >= -1 ;+[80782] -1 x99 -1 x63 >= -1 ;+[80782] -1 x99 -1 x64 >= -1 ;+[80782] -1 x99 -1 x65 >= -1 ;+[80782] -1 x99 -1 x66 >= -1 ;+[80782] -1 x99 -1 x67 >= -1 ;+[80782] -1 x99 -1 x68 >= -1 ;+[80782] -1 x100 -1 x62 >= -1 ;+[80782] -1 x100 -1 x63 >= -1 ;+[80782] -1 x100 -1 x64 >= -1 ;+[80782] -1 x100 -1 x65 >= -1 ;+[80782] -1 x100 -1 x66 >= -1 ;+[80782] -1 x100 -1 x67 >= -1 ;+[80782] -1 x100 -1 x68 >= -1 ;+[80782] -1 x102 -1 x62 >= -1 ;+[80782] -1 x102 -1 x63 >= -1 ;+[80782] -1 x102 -1 x64 >= -1 ;+[80782] -1 x102 -1 x65 >= -1 ;+[80782] -1 x102 -1 x66 >= -1 ;+[80782] -1 x102 -1 x67 >= -1 ;+[80782] -1 x102 -1 x68 >= -1 ;+[80782] -1 x103 -1 x62 >= -1 ;+[80782] -1 x103 -1 x63 >= -1 ;+[80782] -1 x103 -1 x64 >= -1 ;+[80782] -1 x103 -1 x65 >= -1 ;+[80782] -1 x103 -1 x66 >= -1 ;+[80782] -1 x103 -1 x67 >= -1 ;+[80782] -1 x103 -1 x68 >= -1 ;+[80782] -1 x104 -1 x62 >= -1 ;+[80782] -1 x104 -1 x63 >= -1 ;+[80782] -1 x104 -1 x64 >= -1 ;+[80782] -1 x104 -1 x65 >= -1 ;+[80782] -1 x104 -1 x66 >= -1 ;+[80782] -1 x104 -1 x67 >= -1 ;+[80782] -1 x104 -1 x68 >= -1 ;+[80782] -1 x105 -1 x62 >= -1 ;+[80782] -1 x105 -1 x63 >= -1 ;+[80782] -1 x105 -1 x64 >= -1 ;+[80782] -1 x105 -1 x65 >= -1 ;+[80782] -1 x105 -1 x66 >= -1 ;+[80782] -1 x105 -1 x67 >= -1 ;+[80782] -1 x105 -1 x68 >= -1 ;+[80782] -1 x106 -1 x62 >= -1 ;+[80782] -1 x106 -1 x63 >= -1 ;+[80782] -1 x106 -1 x64 >= -1 ;+[80782] -1 x106 -1 x65 >= -1 ;+[80782] -1 x106 -1 x66 >= -1 ;+[80782] -1 x106 -1 x67 >= -1 ;+[80782] -1 x106 -1 x68 >= -1 ;+[80782] -1 x107 -1 x62 >= -1 ;+[80782] -1 x107 -1 x63 >= -1 ;+[80782] -1 x107 -1 x64 >= -1 ;+[80782] -1 x107 -1 x65 >= -1 ;+[80782] -1 x107 -1 x66 >= -1 ;+[80782] -1 x107 -1 x67 >= -1 ;+[80782] -1 x107 -1 x68 >= -1 ;+[80782] -1 x108 -1 x62 >= -1 ;+[80782] -1 x108 -1 x63 >= -1 ;+[80782] -1 x108 -1 x64 >= -1 ;+[80782] -1 x108 -1 x65 >= -1 ;+[80782] -1 x108 -1 x66 >= -1 ;+[80782] -1 x108 -1 x67 >= -1 ;+[80782] -1 x108 -1 x68 >= -1 ;+[80782] -1 x110 -1 x62 >= -1 ;+[80782] -1 x110 -1 x63 >= -1 ;+[80782] -1 x110 -1 x64 >= -1 ;+[80782] -1 x110 -1 x65 >= -1 ;+[80782] -1 x110 -1 x66 >= -1 ;+[80782] -1 x110 -1 x67 >= -1 ;+[80782] -1 x110 -1 x68 >= -1 ;+[80782] -1 x111 -1 x62 >= -1 ;+[80782] -1 x111 -1 x63 >= -1 ;+[80782] -1 x111 -1 x64 >= -1 ;+[80782] -1 x111 -1 x65 >= -1 ;+[80782] -1 x111 -1 x66 >= -1 ;+[80782] -1 x111 -1 x67 >= -1 ;+[80782] -1 x111 -1 x68 >= -1 ;+[80782] -1 x112 -1 x62 >= -1 ;+[80782] -1 x112 -1 x63 >= -1 ;+[80782] -1 x112 -1 x64 >= -1 ;+[80782] -1 x112 -1 x65 >= -1 ;+[80782] -1 x112 -1 x66 >= -1 ;+[80782] -1 x112 -1 x67 >= -1 ;+[80782] -1 x112 -1 x68 >= -1 ;+[80782] -1 x113 -1 x62 >= -1 ;+[80782] -1 x113 -1 x63 >= -1 ;+[80782] -1 x113 -1 x64 >= -1 ;+[80782] -1 x113 -1 x65 >= -1 ;+[80782] -1 x113 -1 x66 >= -1 ;+[80782] -1 x113 -1 x67 >= -1 ;+[80782] -1 x113 -1 x68 >= -1 ;+[80782] -1 x114 -1 x62 >= -1 ;+[80782] -1 x114 -1 x63 >= -1 ;+[80782] -1 x114 -1 x64 >= -1 ;+[80782] -1 x114 -1 x65 >= -1 ;+[80782] -1 x114 -1 x66 >= -1 ;+[80782] -1 x114 -1 x67 >= -1 ;+[80782] -1 x114 -1 x68 >= -1 ;+[80782] -1 x115 -1 x62 >= -1 ;+[80782] -1 x115 -1 x63 >= -1 ;+[80782] -1 x115 -1 x64 >= -1 ;+[80782] -1 x115 -1 x65 >= -1 ;+[80782] -1 x115 -1 x66 >= -1 ;+[80782] -1 x115 -1 x67 >= -1 ;+[80782] -1 x115 -1 x68 >= -1 ;+[80782] -1 x116 -1 x62 >= -1 ;+[80782] -1 x116 -1 x63 >= -1 ;+[80782] -1 x116 -1 x64 >= -1 ;+[80782] -1 x116 -1 x65 >= -1 ;+[80782] -1 x116 -1 x66 >= -1 ;+[80782] -1 x116 -1 x67 >= -1 ;+[80782] -1 x116 -1 x68 >= -1 ;+[80782] -1 x78 -1 x70 >= -1 ;+[80782] -1 x78 -1 x71 >= -1 ;+[80782] -1 x78 -1 x72 >= -1 ;+[80782] -1 x78 -1 x73 >= -1 ;+[80782] -1 x78 -1 x74 >= -1 ;+[80782] -1 x78 -1 x75 >= -1 ;+[80782] -1 x78 -1 x76 >= -1 ;+[80782] -1 x79 -1 x70 >= -1 ;+[80782] -1 x79 -1 x71 >= -1 ;+[80782] -1 x79 -1 x72 >= -1 ;+[80782] -1 x79 -1 x73 >= -1 ;+[80782] -1 x79 -1 x74 >= -1 ;+[80782] -1 x79 -1 x75 >= -1 ;+[80782] -1 x79 -1 x76 >= -1 ;+[80782] -1 x80 -1 x70 >= -1 ;+[80782] -1 x80 -1 x71 >= -1 ;+[80782] -1 x80 -1 x72 >= -1 ;+[80782] -1 x80 -1 x73 >= -1 ;+[80782] -1 x80 -1 x74 >= -1 ;+[80782] -1 x80 -1 x75 >= -1 ;+[80782] -1 x80 -1 x76 >= -1 ;+[80782] -1 x81 -1 x70 >= -1 ;+[80782] -1 x81 -1 x71 >= -1 ;+[80782] -1 x81 -1 x72 >= -1 ;+[80782] -1 x81 -1 x73 >= -1 ;+[80782] -1 x81 -1 x74 >= -1 ;+[80782] -1 x81 -1 x75 >= -1 ;+[80782] -1 x81 -1 x76 >= -1 ;+[80782] -1 x82 -1 x70 >= -1 ;+[80782] -1 x82 -1 x71 >= -1 ;+[80782] -1 x82 -1 x72 >= -1 ;+[80782] -1 x82 -1 x73 >= -1 ;+[80782] -1 x82 -1 x74 >= -1 ;+[80782] -1 x82 -1 x75 >= -1 ;+[80782] -1 x82 -1 x76 >= -1 ;+[80782] -1 x83 -1 x70 >= -1 ;+[80782] -1 x83 -1 x71 >= -1 ;+[80782] -1 x83 -1 x72 >= -1 ;+[80782] -1 x83 -1 x73 >= -1 ;+[80782] -1 x83 -1 x74 >= -1 ;+[80782] -1 x83 -1 x75 >= -1 ;+[80782] -1 x83 -1 x76 >= -1 ;+[80782] -1 x84 -1 x70 >= -1 ;+[80782] -1 x84 -1 x71 >= -1 ;+[80782] -1 x84 -1 x72 >= -1 ;+[80782] -1 x84 -1 x73 >= -1 ;+[80782] -1 x84 -1 x74 >= -1 ;+[80782] -1 x84 -1 x75 >= -1 ;+[80782] -1 x84 -1 x76 >= -1 ;+[80782] -1 x86 -1 x70 >= -1 ;+[80782] -1 x86 -1 x71 >= -1 ;+[80782] -1 x86 -1 x72 >= -1 ;+[80782] -1 x86 -1 x73 >= -1 ;+[80782] -1 x86 -1 x74 >= -1 ;+[80782] -1 x86 -1 x75 >= -1 ;+[80782] -1 x86 -1 x76 >= -1 ;+[80782] -1 x87 -1 x70 >= -1 ;+[80782] -1 x87 -1 x71 >= -1 ;+[80782] -1 x87 -1 x72 >= -1 ;+[80782] -1 x87 -1 x73 >= -1 ;+[80782] -1 x87 -1 x74 >= -1 ;+[80782] -1 x87 -1 x75 >= -1 ;+[80782] -1 x87 -1 x76 >= -1 ;+[80782] -1 x88 -1 x70 >= -1 ;+[80782] -1 x88 -1 x71 >= -1 ;+[80782] -1 x88 -1 x72 >= -1 ;+[80782] -1 x88 -1 x73 >= -1 ;+[80782] -1 x88 -1 x74 >= -1 ;+[80782] -1 x88 -1 x75 >= -1 ;+[80782] -1 x88 -1 x76 >= -1 ;+[80782] -1 x89 -1 x70 >= -1 ;+[80782] -1 x89 -1 x71 >= -1 ;+[80782] -1 x89 -1 x72 >= -1 ;+[80782] -1 x89 -1 x73 >= -1 ;+[80782] -1 x89 -1 x74 >= -1 ;+[80782] -1 x89 -1 x75 >= -1 ;+[80782] -1 x89 -1 x76 >= -1 ;+[80782] -1 x90 -1 x70 >= -1 ;+[80782] -1 x90 -1 x71 >= -1 ;+[80782] -1 x90 -1 x72 >= -1 ;+[80782] -1 x90 -1 x73 >= -1 ;+[80782] -1 x90 -1 x74 >= -1 ;+[80782] -1 x90 -1 x75 >= -1 ;+[80782] -1 x90 -1 x76 >= -1 ;+[80782] -1 x91 -1 x70 >= -1 ;+[80782] -1 x91 -1 x71 >= -1 ;+[80782] -1 x91 -1 x72 >= -1 ;+[80782] -1 x91 -1 x73 >= -1 ;+[80782] -1 x91 -1 x74 >= -1 ;+[80782] -1 x91 -1 x75 >= -1 ;+[80782] -1 x91 -1 x76 >= -1 ;+[80782] -1 x92 -1 x70 >= -1 ;+[80782] -1 x92 -1 x71 >= -1 ;+[80782] -1 x92 -1 x72 >= -1 ;+[80782] -1 x92 -1 x73 >= -1 ;+[80782] -1 x92 -1 x74 >= -1 ;+[80782] -1 x92 -1 x75 >= -1 ;+[80782] -1 x92 -1 x76 >= -1 ;+[80782] -1 x94 -1 x70 >= -1 ;+[80782] -1 x94 -1 x71 >= -1 ;+[80782] -1 x94 -1 x72 >= -1 ;+[80782] -1 x94 -1 x73 >= -1 ;+[80782] -1 x94 -1 x74 >= -1 ;+[80782] -1 x94 -1 x75 >= -1 ;+[80782] -1 x94 -1 x76 >= -1 ;+[80782] -1 x95 -1 x70 >= -1 ;+[80782] -1 x95 -1 x71 >= -1 ;+[80782] -1 x95 -1 x72 >= -1 ;+[80782] -1 x95 -1 x73 >= -1 ;+[80782] -1 x95 -1 x74 >= -1 ;+[80782] -1 x95 -1 x75 >= -1 ;+[80782] -1 x95 -1 x76 >= -1 ;+[80782] -1 x96 -1 x70 >= -1 ;+[80782] -1 x96 -1 x71 >= -1 ;+[80782] -1 x96 -1 x72 >= -1 ;+[80782] -1 x96 -1 x73 >= -1 ;+[80782] -1 x96 -1 x74 >= -1 ;+[80782] -1 x96 -1 x75 >= -1 ;+[80782] -1 x96 -1 x76 >= -1 ;+[80782] -1 x97 -1 x70 >= -1 ;+[80782] -1 x97 -1 x71 >= -1 ;+[80782] -1 x97 -1 x72 >= -1 ;+[80782] -1 x97 -1 x73 >= -1 ;+[80782] -1 x97 -1 x74 >= -1 ;+[80782] -1 x97 -1 x75 >= -1 ;+[80782] -1 x97 -1 x76 >= -1 ;+[80782] -1 x98 -1 x70 >= -1 ;+[80782] -1 x98 -1 x71 >= -1 ;+[80782] -1 x98 -1 x72 >= -1 ;+[80782] -1 x98 -1 x73 >= -1 ;+[80782] -1 x98 -1 x74 >= -1 ;+[80782] -1 x98 -1 x75 >= -1 ;+[80782] -1 x98 -1 x76 >= -1 ;+[80782] -1 x99 -1 x70 >= -1 ;+[80782] -1 x99 -1 x71 >= -1 ;+[80782] -1 x99 -1 x72 >= -1 ;+[80782] -1 x99 -1 x73 >= -1 ;+[80782] -1 x99 -1 x74 >= -1 ;+[80782] -1 x99 -1 x75 >= -1 ;+[80782] -1 x99 -1 x76 >= -1 ;+[80782] -1 x100 -1 x70 >= -1 ;+[80782] -1 x100 -1 x71 >= -1 ;+[80782] -1 x100 -1 x72 >= -1 ;+[80782] -1 x100 -1 x73 >= -1 ;+[80782] -1 x100 -1 x74 >= -1 ;+[80782] -1 x100 -1 x75 >= -1 ;+[80782] -1 x100 -1 x76 >= -1 ;+[80782] -1 x102 -1 x70 >= -1 ;+[80782] -1 x102 -1 x71 >= -1 ;+[80782] -1 x102 -1 x72 >= -1 ;+[80782] -1 x102 -1 x73 >= -1 ;+[80782] -1 x102 -1 x74 >= -1 ;+[80782] -1 x102 -1 x75 >= -1 ;+[80782] -1 x102 -1 x76 >= -1 ;+[80782] -1 x103 -1 x70 >= -1 ;+[80782] -1 x103 -1 x71 >= -1 ;+[80782] -1 x103 -1 x72 >= -1 ;+[80782] -1 x103 -1 x73 >= -1 ;+[80782] -1 x103 -1 x74 >= -1 ;+[80782] -1 x103 -1 x75 >= -1 ;+[80782] -1 x103 -1 x76 >= -1 ;+[80782] -1 x104 -1 x70 >= -1 ;+[80782] -1 x104 -1 x71 >= -1 ;+[80782] -1 x104 -1 x72 >= -1 ;+[80782] -1 x104 -1 x73 >= -1 ;+[80782] -1 x104 -1 x74 >= -1 ;+[80782] -1 x104 -1 x75 >= -1 ;+[80782] -1 x104 -1 x76 >= -1 ;+[80782] -1 x105 -1 x70 >= -1 ;+[80782] -1 x105 -1 x71 >= -1 ;+[80782] -1 x105 -1 x72 >= -1 ;+[80782] -1 x105 -1 x73 >= -1 ;+[80782] -1 x105 -1 x74 >= -1 ;+[80782] -1 x105 -1 x75 >= -1 ;+[80782] -1 x105 -1 x76 >= -1 ;+[80782] -1 x106 -1 x70 >= -1 ;+[80782] -1 x106 -1 x71 >= -1 ;+[80782] -1 x106 -1 x72 >= -1 ;+[80782] -1 x106 -1 x73 >= -1 ;+[80782] -1 x106 -1 x74 >= -1 ;+[80782] -1 x106 -1 x75 >= -1 ;+[80782] -1 x106 -1 x76 >= -1 ;+[80782] -1 x107 -1 x70 >= -1 ;+[80782] -1 x107 -1 x71 >= -1 ;+[80782] -1 x107 -1 x72 >= -1 ;+[80782] -1 x107 -1 x73 >= -1 ;+[80782] -1 x107 -1 x74 >= -1 ;+[80782] -1 x107 -1 x75 >= -1 ;+[80782] -1 x107 -1 x76 >= -1 ;+[80782] -1 x108 -1 x70 >= -1 ;+[80782] -1 x108 -1 x71 >= -1 ;+[80782] -1 x108 -1 x72 >= -1 ;+[80782] -1 x108 -1 x73 >= -1 ;+[80782] -1 x108 -1 x74 >= -1 ;+[80782] -1 x108 -1 x75 >= -1 ;+[80782] -1 x108 -1 x76 >= -1 ;+[80782] -1 x110 -1 x70 >= -1 ;+[80782] -1 x110 -1 x71 >= -1 ;+[80782] -1 x110 -1 x72 >= -1 ;+[80782] -1 x110 -1 x73 >= -1 ;+[80782] -1 x110 -1 x74 >= -1 ;+[80782] -1 x110 -1 x75 >= -1 ;+[80782] -1 x110 -1 x76 >= -1 ;+[80782] -1 x111 -1 x70 >= -1 ;+[80782] -1 x111 -1 x71 >= -1 ;+[80782] -1 x111 -1 x72 >= -1 ;+[80782] -1 x111 -1 x73 >= -1 ;+[80782] -1 x111 -1 x74 >= -1 ;+[80782] -1 x111 -1 x75 >= -1 ;+[80782] -1 x111 -1 x76 >= -1 ;+[80782] -1 x112 -1 x70 >= -1 ;+[80782] -1 x112 -1 x71 >= -1 ;+[80782] -1 x112 -1 x72 >= -1 ;+[80782] -1 x112 -1 x73 >= -1 ;+[80782] -1 x112 -1 x74 >= -1 ;+[80782] -1 x112 -1 x75 >= -1 ;+[80782] -1 x112 -1 x76 >= -1 ;+[80782] -1 x113 -1 x70 >= -1 ;+[80782] -1 x113 -1 x71 >= -1 ;+[80782] -1 x113 -1 x72 >= -1 ;+[80782] -1 x113 -1 x73 >= -1 ;+[80782] -1 x113 -1 x74 >= -1 ;+[80782] -1 x113 -1 x75 >= -1 ;+[80782] -1 x113 -1 x76 >= -1 ;+[80782] -1 x114 -1 x70 >= -1 ;+[80782] -1 x114 -1 x71 >= -1 ;+[80782] -1 x114 -1 x72 >= -1 ;+[80782] -1 x114 -1 x73 >= -1 ;+[80782] -1 x114 -1 x74 >= -1 ;+[80782] -1 x114 -1 x75 >= -1 ;+[80782] -1 x114 -1 x76 >= -1 ;+[80782] -1 x115 -1 x70 >= -1 ;+[80782] -1 x115 -1 x71 >= -1 ;+[80782] -1 x115 -1 x72 >= -1 ;+[80782] -1 x115 -1 x73 >= -1 ;+[80782] -1 x115 -1 x74 >= -1 ;+[80782] -1 x115 -1 x75 >= -1 ;+[80782] -1 x115 -1 x76 >= -1 ;+[80782] -1 x116 -1 x70 >= -1 ;+[80782] -1 x116 -1 x71 >= -1 ;+[80782] -1 x116 -1 x72 >= -1 ;+[80782] -1 x116 -1 x73 >= -1 ;+[80782] -1 x116 -1 x74 >= -1 ;+[80782] -1 x116 -1 x75 >= -1 ;+[80782] -1 x116 -1 x76 >= -1 ;+[80782] -1 x86 -1 x78 >= -1 ;+[80782] -1 x86 -1 x79 >= -1 ;+[80782] -1 x86 -1 x80 >= -1 ;+[80782] -1 x86 -1 x81 >= -1 ;+[80782] -1 x86 -1 x82 >= -1 ;+[80782] -1 x86 -1 x83 >= -1 ;+[80782] -1 x86 -1 x84 >= -1 ;+[80782] -1 x87 -1 x78 >= -1 ;+[80782] -1 x87 -1 x79 >= -1 ;+[80782] -1 x87 -1 x80 >= -1 ;+[80782] -1 x87 -1 x81 >= -1 ;+[80782] -1 x87 -1 x82 >= -1 ;+[80782] -1 x87 -1 x83 >= -1 ;+[80782] -1 x87 -1 x84 >= -1 ;+[80782] -1 x88 -1 x78 >= -1 ;+[80782] -1 x88 -1 x79 >= -1 ;+[80782] -1 x88 -1 x80 >= -1 ;+[80782] -1 x88 -1 x81 >= -1 ;+[80782] -1 x88 -1 x82 >= -1 ;+[80782] -1 x88 -1 x83 >= -1 ;+[80782] -1 x88 -1 x84 >= -1 ;+[80782] -1 x89 -1 x78 >= -1 ;+[80782] -1 x89 -1 x79 >= -1 ;+[80782] -1 x89 -1 x80 >= -1 ;+[80782] -1 x89 -1 x81 >= -1 ;+[80782] -1 x89 -1 x82 >= -1 ;+[80782] -1 x89 -1 x83 >= -1 ;+[80782] -1 x89 -1 x84 >= -1 ;+[80782] -1 x90 -1 x78 >= -1 ;+[80782] -1 x90 -1 x79 >= -1 ;+[80782] -1 x90 -1 x80 >= -1 ;+[80782] -1 x90 -1 x81 >= -1 ;+[80782] -1 x90 -1 x82 >= -1 ;+[80782] -1 x90 -1 x83 >= -1 ;+[80782] -1 x90 -1 x84 >= -1 ;+[80782] -1 x91 -1 x78 >= -1 ;+[80782] -1 x91 -1 x79 >= -1 ;+[80782] -1 x91 -1 x80 >= -1 ;+[80782] -1 x91 -1 x81 >= -1 ;+[80782] -1 x91 -1 x82 >= -1 ;+[80782] -1 x91 -1 x83 >= -1 ;+[80782] -1 x91 -1 x84 >= -1 ;+[80782] -1 x92 -1 x78 >= -1 ;+[80782] -1 x92 -1 x79 >= -1 ;+[80782] -1 x92 -1 x80 >= -1 ;+[80782] -1 x92 -1 x81 >= -1 ;+[80782] -1 x92 -1 x82 >= -1 ;+[80782] -1 x92 -1 x83 >= -1 ;+[80782] -1 x92 -1 x84 >= -1 ;+[80782] -1 x94 -1 x78 >= -1 ;+[80782] -1 x94 -1 x79 >= -1 ;+[80782] -1 x94 -1 x80 >= -1 ;+[80782] -1 x94 -1 x81 >= -1 ;+[80782] -1 x94 -1 x82 >= -1 ;+[80782] -1 x94 -1 x83 >= -1 ;+[80782] -1 x94 -1 x84 >= -1 ;+[80782] -1 x95 -1 x78 >= -1 ;+[80782] -1 x95 -1 x79 >= -1 ;+[80782] -1 x95 -1 x80 >= -1 ;+[80782] -1 x95 -1 x81 >= -1 ;+[80782] -1 x95 -1 x82 >= -1 ;+[80782] -1 x95 -1 x83 >= -1 ;+[80782] -1 x95 -1 x84 >= -1 ;+[80782] -1 x96 -1 x78 >= -1 ;+[80782] -1 x96 -1 x79 >= -1 ;+[80782] -1 x96 -1 x80 >= -1 ;+[80782] -1 x96 -1 x81 >= -1 ;+[80782] -1 x96 -1 x82 >= -1 ;+[80782] -1 x96 -1 x83 >= -1 ;+[80782] -1 x96 -1 x84 >= -1 ;+[80782] -1 x97 -1 x78 >= -1 ;+[80782] -1 x97 -1 x79 >= -1 ;+[80782] -1 x97 -1 x80 >= -1 ;+[80782] -1 x97 -1 x81 >= -1 ;+[80782] -1 x97 -1 x82 >= -1 ;+[80782] -1 x97 -1 x83 >= -1 ;+[80782] -1 x97 -1 x84 >= -1 ;+[80782] -1 x98 -1 x78 >= -1 ;+[80782] -1 x98 -1 x79 >= -1 ;+[80782] -1 x98 -1 x80 >= -1 ;+[80782] -1 x98 -1 x81 >= -1 ;+[80782] -1 x98 -1 x82 >= -1 ;+[80782] -1 x98 -1 x83 >= -1 ;+[80782] -1 x98 -1 x84 >= -1 ;+[80782] -1 x99 -1 x78 >= -1 ;+[80782] -1 x99 -1 x79 >= -1 ;+[80782] -1 x99 -1 x80 >= -1 ;+[80782] -1 x99 -1 x81 >= -1 ;+[80782] -1 x99 -1 x82 >= -1 ;+[80782] -1 x99 -1 x83 >= -1 ;+[80782] -1 x99 -1 x84 >= -1 ;+[80782] -1 x100 -1 x78 >= -1 ;+[80782] -1 x100 -1 x79 >= -1 ;+[80782] -1 x100 -1 x80 >= -1 ;+[80782] -1 x100 -1 x81 >= -1 ;+[80782] -1 x100 -1 x82 >= -1 ;+[80782] -1 x100 -1 x83 >= -1 ;+[80782] -1 x100 -1 x84 >= -1 ;+[80782] -1 x102 -1 x78 >= -1 ;+[80782] -1 x102 -1 x79 >= -1 ;+[80782] -1 x102 -1 x80 >= -1 ;+[80782] -1 x102 -1 x81 >= -1 ;+[80782] -1 x102 -1 x82 >= -1 ;+[80782] -1 x102 -1 x83 >= -1 ;+[80782] -1 x102 -1 x84 >= -1 ;+[80782] -1 x103 -1 x78 >= -1 ;+[80782] -1 x103 -1 x79 >= -1 ;+[80782] -1 x103 -1 x80 >= -1 ;+[80782] -1 x103 -1 x81 >= -1 ;+[80782] -1 x103 -1 x82 >= -1 ;+[80782] -1 x103 -1 x83 >= -1 ;+[80782] -1 x103 -1 x84 >= -1 ;+[80782] -1 x104 -1 x78 >= -1 ;+[80782] -1 x104 -1 x79 >= -1 ;+[80782] -1 x104 -1 x80 >= -1 ;+[80782] -1 x104 -1 x81 >= -1 ;+[80782] -1 x104 -1 x82 >= -1 ;+[80782] -1 x104 -1 x83 >= -1 ;+[80782] -1 x104 -1 x84 >= -1 ;+[80782] -1 x105 -1 x78 >= -1 ;+[80782] -1 x105 -1 x79 >= -1 ;+[80782] -1 x105 -1 x80 >= -1 ;+[80782] -1 x105 -1 x81 >= -1 ;+[80782] -1 x105 -1 x82 >= -1 ;+[80782] -1 x105 -1 x83 >= -1 ;+[80782] -1 x105 -1 x84 >= -1 ;+[80782] -1 x106 -1 x78 >= -1 ;+[80782] -1 x106 -1 x79 >= -1 ;+[80782] -1 x106 -1 x80 >= -1 ;+[80782] -1 x106 -1 x81 >= -1 ;+[80782] -1 x106 -1 x82 >= -1 ;+[80782] -1 x106 -1 x83 >= -1 ;+[80782] -1 x106 -1 x84 >= -1 ;+[80782] -1 x107 -1 x78 >= -1 ;+[80782] -1 x107 -1 x79 >= -1 ;+[80782] -1 x107 -1 x80 >= -1 ;+[80782] -1 x107 -1 x81 >= -1 ;+[80782] -1 x107 -1 x82 >= -1 ;+[80782] -1 x107 -1 x83 >= -1 ;+[80782] -1 x107 -1 x84 >= -1 ;+[80782] -1 x108 -1 x78 >= -1 ;+[80782] -1 x108 -1 x79 >= -1 ;+[80782] -1 x108 -1 x80 >= -1 ;+[80782] -1 x108 -1 x81 >= -1 ;+[80782] -1 x108 -1 x82 >= -1 ;+[80782] -1 x108 -1 x83 >= -1 ;+[80782] -1 x108 -1 x84 >= -1 ;+[80782] -1 x110 -1 x78 >= -1 ;+[80782] -1 x110 -1 x79 >= -1 ;+[80782] -1 x110 -1 x80 >= -1 ;+[80782] -1 x110 -1 x81 >= -1 ;+[80782] -1 x110 -1 x82 >= -1 ;+[80782] -1 x110 -1 x83 >= -1 ;+[80782] -1 x110 -1 x84 >= -1 ;+[80782] -1 x111 -1 x78 >= -1 ;+[80782] -1 x111 -1 x79 >= -1 ;+[80782] -1 x111 -1 x80 >= -1 ;+[80782] -1 x111 -1 x81 >= -1 ;+[80782] -1 x111 -1 x82 >= -1 ;+[80782] -1 x111 -1 x83 >= -1 ;+[80782] -1 x111 -1 x84 >= -1 ;+[80782] -1 x112 -1 x78 >= -1 ;+[80782] -1 x112 -1 x79 >= -1 ;+[80782] -1 x112 -1 x80 >= -1 ;+[80782] -1 x112 -1 x81 >= -1 ;+[80782] -1 x112 -1 x82 >= -1 ;+[80782] -1 x112 -1 x83 >= -1 ;+[80782] -1 x112 -1 x84 >= -1 ;+[80782] -1 x113 -1 x78 >= -1 ;+[80782] -1 x113 -1 x79 >= -1 ;+[80782] -1 x113 -1 x80 >= -1 ;+[80782] -1 x113 -1 x81 >= -1 ;+[80782] -1 x113 -1 x82 >= -1 ;+[80782] -1 x113 -1 x83 >= -1 ;+[80782] -1 x113 -1 x84 >= -1 ;+[80782] -1 x114 -1 x78 >= -1 ;+[80782] -1 x114 -1 x79 >= -1 ;+[80782] -1 x114 -1 x80 >= -1 ;+[80782] -1 x114 -1 x81 >= -1 ;+[80782] -1 x114 -1 x82 >= -1 ;+[80782] -1 x114 -1 x83 >= -1 ;+[80782] -1 x114 -1 x84 >= -1 ;+[80782] -1 x115 -1 x78 >= -1 ;+[80782] -1 x115 -1 x79 >= -1 ;+[80782] -1 x115 -1 x80 >= -1 ;+[80782] -1 x115 -1 x81 >= -1 ;+[80782] -1 x115 -1 x82 >= -1 ;+[80782] -1 x115 -1 x83 >= -1 ;+[80782] -1 x115 -1 x84 >= -1 ;+[80782] -1 x116 -1 x78 >= -1 ;+[80782] -1 x116 -1 x79 >= -1 ;+[80782] -1 x116 -1 x80 >= -1 ;+[80782] -1 x116 -1 x81 >= -1 ;+[80782] -1 x116 -1 x82 >= -1 ;+[80782] -1 x116 -1 x83 >= -1 ;+[80782] -1 x116 -1 x84 >= -1 ;+[80782] -1 x94 -1 x86 >= -1 ;+[80782] -1 x94 -1 x87 >= -1 ;+[80782] -1 x94 -1 x88 >= -1 ;+[80782] -1 x94 -1 x89 >= -1 ;+[80782] -1 x94 -1 x90 >= -1 ;+[80782] -1 x94 -1 x91 >= -1 ;+[80782] -1 x94 -1 x92 >= -1 ;+[80782] -1 x95 -1 x86 >= -1 ;+[80782] -1 x95 -1 x87 >= -1 ;+[80782] -1 x95 -1 x88 >= -1 ;+[80782] -1 x95 -1 x89 >= -1 ;+[80782] -1 x95 -1 x90 >= -1 ;+[80782] -1 x95 -1 x91 >= -1 ;+[80782] -1 x95 -1 x92 >= -1 ;+[80782] -1 x96 -1 x86 >= -1 ;+[80782] -1 x96 -1 x87 >= -1 ;+[80782] -1 x96 -1 x88 >= -1 ;+[80782] -1 x96 -1 x89 >= -1 ;+[80782] -1 x96 -1 x90 >= -1 ;+[80782] -1 x96 -1 x91 >= -1 ;+[80782] -1 x96 -1 x92 >= -1 ;+[80782] -1 x97 -1 x86 >= -1 ;+[80782] -1 x97 -1 x87 >= -1 ;+[80782] -1 x97 -1 x88 >= -1 ;+[80782] -1 x97 -1 x89 >= -1 ;+[80782] -1 x97 -1 x90 >= -1 ;+[80782] -1 x97 -1 x91 >= -1 ;+[80782] -1 x97 -1 x92 >= -1 ;+[80782] -1 x98 -1 x86 >= -1 ;+[80782] -1 x98 -1 x87 >= -1 ;+[80782] -1 x98 -1 x88 >= -1 ;+[80782] -1 x98 -1 x89 >= -1 ;+[80782] -1 x98 -1 x90 >= -1 ;+[80782] -1 x98 -1 x91 >= -1 ;+[80782] -1 x98 -1 x92 >= -1 ;+[80782] -1 x99 -1 x86 >= -1 ;+[80782] -1 x99 -1 x87 >= -1 ;+[80782] -1 x99 -1 x88 >= -1 ;+[80782] -1 x99 -1 x89 >= -1 ;+[80782] -1 x99 -1 x90 >= -1 ;+[80782] -1 x99 -1 x91 >= -1 ;+[80782] -1 x99 -1 x92 >= -1 ;+[80782] -1 x100 -1 x86 >= -1 ;+[80782] -1 x100 -1 x87 >= -1 ;+[80782] -1 x100 -1 x88 >= -1 ;+[80782] -1 x100 -1 x89 >= -1 ;+[80782] -1 x100 -1 x90 >= -1 ;+[80782] -1 x100 -1 x91 >= -1 ;+[80782] -1 x100 -1 x92 >= -1 ;+[80782] -1 x102 -1 x86 >= -1 ;+[80782] -1 x102 -1 x87 >= -1 ;+[80782] -1 x102 -1 x88 >= -1 ;+[80782] -1 x102 -1 x89 >= -1 ;+[80782] -1 x102 -1 x90 >= -1 ;+[80782] -1 x102 -1 x91 >= -1 ;+[80782] -1 x102 -1 x92 >= -1 ;+[80782] -1 x103 -1 x86 >= -1 ;+[80782] -1 x103 -1 x87 >= -1 ;+[80782] -1 x103 -1 x88 >= -1 ;+[80782] -1 x103 -1 x89 >= -1 ;+[80782] -1 x103 -1 x90 >= -1 ;+[80782] -1 x103 -1 x91 >= -1 ;+[80782] -1 x103 -1 x92 >= -1 ;+[80782] -1 x104 -1 x86 >= -1 ;+[80782] -1 x104 -1 x87 >= -1 ;+[80782] -1 x104 -1 x88 >= -1 ;+[80782] -1 x104 -1 x89 >= -1 ;+[80782] -1 x104 -1 x90 >= -1 ;+[80782] -1 x104 -1 x91 >= -1 ;+[80782] -1 x104 -1 x92 >= -1 ;+[80782] -1 x105 -1 x86 >= -1 ;+[80782] -1 x105 -1 x87 >= -1 ;+[80782] -1 x105 -1 x88 >= -1 ;+[80782] -1 x105 -1 x89 >= -1 ;+[80782] -1 x105 -1 x90 >= -1 ;+[80782] -1 x105 -1 x91 >= -1 ;+[80782] -1 x105 -1 x92 >= -1 ;+[80782] -1 x106 -1 x86 >= -1 ;+[80782] -1 x106 -1 x87 >= -1 ;+[80782] -1 x106 -1 x88 >= -1 ;+[80782] -1 x106 -1 x89 >= -1 ;+[80782] -1 x106 -1 x90 >= -1 ;+[80782] -1 x106 -1 x91 >= -1 ;+[80782] -1 x106 -1 x92 >= -1 ;+[80782] -1 x107 -1 x86 >= -1 ;+[80782] -1 x107 -1 x87 >= -1 ;+[80782] -1 x107 -1 x88 >= -1 ;+[80782] -1 x107 -1 x89 >= -1 ;+[80782] -1 x107 -1 x90 >= -1 ;+[80782] -1 x107 -1 x91 >= -1 ;+[80782] -1 x107 -1 x92 >= -1 ;+[80782] -1 x108 -1 x86 >= -1 ;+[80782] -1 x108 -1 x87 >= -1 ;+[80782] -1 x108 -1 x88 >= -1 ;+[80782] -1 x108 -1 x89 >= -1 ;+[80782] -1 x108 -1 x90 >= -1 ;+[80782] -1 x108 -1 x91 >= -1 ;+[80782] -1 x108 -1 x92 >= -1 ;+[80782] -1 x110 -1 x86 >= -1 ;+[80782] -1 x110 -1 x87 >= -1 ;+[80782] -1 x110 -1 x88 >= -1 ;+[80782] -1 x110 -1 x89 >= -1 ;+[80782] -1 x110 -1 x90 >= -1 ;+[80782] -1 x110 -1 x91 >= -1 ;+[80782] -1 x110 -1 x92 >= -1 ;+[80782] -1 x111 -1 x86 >= -1 ;+[80782] -1 x111 -1 x87 >= -1 ;+[80782] -1 x111 -1 x88 >= -1 ;+[80782] -1 x111 -1 x89 >= -1 ;+[80782] -1 x111 -1 x90 >= -1 ;+[80782] -1 x111 -1 x91 >= -1 ;+[80782] -1 x111 -1 x92 >= -1 ;+[80782] -1 x112 -1 x86 >= -1 ;+[80782] -1 x112 -1 x87 >= -1 ;+[80782] -1 x112 -1 x88 >= -1 ;+[80782] -1 x112 -1 x89 >= -1 ;+[80782] -1 x112 -1 x90 >= -1 ;+[80782] -1 x112 -1 x91 >= -1 ;+[80782] -1 x112 -1 x92 >= -1 ;+[80782] -1 x113 -1 x86 >= -1 ;+[80782] -1 x113 -1 x87 >= -1 ;+[80782] -1 x113 -1 x88 >= -1 ;+[80782] -1 x113 -1 x89 >= -1 ;+[80782] -1 x113 -1 x90 >= -1 ;+[80782] -1 x113 -1 x91 >= -1 ;+[80782] -1 x113 -1 x92 >= -1 ;+[80782] -1 x114 -1 x86 >= -1 ;+[80782] -1 x114 -1 x87 >= -1 ;+[80782] -1 x114 -1 x88 >= -1 ;+[80782] -1 x114 -1 x89 >= -1 ;+[80782] -1 x114 -1 x90 >= -1 ;+[80782] -1 x114 -1 x91 >= -1 ;+[80782] -1 x114 -1 x92 >= -1 ;+[80782] -1 x115 -1 x86 >= -1 ;+[80782] -1 x115 -1 x87 >= -1 ;+[80782] -1 x115 -1 x88 >= -1 ;+[80782] -1 x115 -1 x89 >= -1 ;+[80782] -1 x115 -1 x90 >= -1 ;+[80782] -1 x115 -1 x91 >= -1 ;+[80782] -1 x115 -1 x92 >= -1 ;+[80782] -1 x116 -1 x86 >= -1 ;+[80782] -1 x116 -1 x87 >= -1 ;+[80782] -1 x116 -1 x88 >= -1 ;+[80782] -1 x116 -1 x89 >= -1 ;+[80782] -1 x116 -1 x90 >= -1 ;+[80782] -1 x116 -1 x91 >= -1 ;+[80782] -1 x116 -1 x92 >= -1 ;+[80782] -1 x102 -1 x94 >= -1 ;+[80782] -1 x102 -1 x95 >= -1 ;+[80782] -1 x102 -1 x96 >= -1 ;+[80782] -1 x102 -1 x97 >= -1 ;+[80782] -1 x102 -1 x98 >= -1 ;+[80782] -1 x102 -1 x99 >= -1 ;+[80782] -1 x102 -1 x100 >= -1 ;+[80782] -1 x103 -1 x94 >= -1 ;+[80782] -1 x103 -1 x95 >= -1 ;+[80782] -1 x103 -1 x96 >= -1 ;+[80782] -1 x103 -1 x97 >= -1 ;+[80782] -1 x103 -1 x98 >= -1 ;+[80782] -1 x103 -1 x99 >= -1 ;+[80782] -1 x103 -1 x100 >= -1 ;+[80782] -1 x104 -1 x94 >= -1 ;+[80782] -1 x104 -1 x95 >= -1 ;+[80782] -1 x104 -1 x96 >= -1 ;+[80782] -1 x104 -1 x97 >= -1 ;+[80782] -1 x104 -1 x98 >= -1 ;+[80782] -1 x104 -1 x99 >= -1 ;+[80782] -1 x104 -1 x100 >= -1 ;+[80782] -1 x105 -1 x94 >= -1 ;+[80782] -1 x105 -1 x95 >= -1 ;+[80782] -1 x105 -1 x96 >= -1 ;+[80782] -1 x105 -1 x97 >= -1 ;+[80782] -1 x105 -1 x98 >= -1 ;+[80782] -1 x105 -1 x99 >= -1 ;+[80782] -1 x105 -1 x100 >= -1 ;+[80782] -1 x106 -1 x94 >= -1 ;+[80782] -1 x106 -1 x95 >= -1 ;+[80782] -1 x106 -1 x96 >= -1 ;+[80782] -1 x106 -1 x97 >= -1 ;+[80782] -1 x106 -1 x98 >= -1 ;+[80782] -1 x106 -1 x99 >= -1 ;+[80782] -1 x106 -1 x100 >= -1 ;+[80782] -1 x107 -1 x94 >= -1 ;+[80782] -1 x107 -1 x95 >= -1 ;+[80782] -1 x107 -1 x96 >= -1 ;+[80782] -1 x107 -1 x97 >= -1 ;+[80782] -1 x107 -1 x98 >= -1 ;+[80782] -1 x107 -1 x99 >= -1 ;+[80782] -1 x107 -1 x100 >= -1 ;+[80782] -1 x108 -1 x94 >= -1 ;+[80782] -1 x108 -1 x95 >= -1 ;+[80782] -1 x108 -1 x96 >= -1 ;+[80782] -1 x108 -1 x97 >= -1 ;+[80782] -1 x108 -1 x98 >= -1 ;+[80782] -1 x108 -1 x99 >= -1 ;+[80782] -1 x108 -1 x100 >= -1 ;+[80782] -1 x110 -1 x94 >= -1 ;+[80782] -1 x110 -1 x95 >= -1 ;+[80782] -1 x110 -1 x96 >= -1 ;+[80782] -1 x110 -1 x97 >= -1 ;+[80782] -1 x110 -1 x98 >= -1 ;+[80782] -1 x110 -1 x99 >= -1 ;+[80782] -1 x110 -1 x100 >= -1 ;+[80782] -1 x111 -1 x94 >= -1 ;+[80782] -1 x111 -1 x95 >= -1 ;+[80782] -1 x111 -1 x96 >= -1 ;+[80782] -1 x111 -1 x97 >= -1 ;+[80782] -1 x111 -1 x98 >= -1 ;+[80782] -1 x111 -1 x99 >= -1 ;+[80782] -1 x111 -1 x100 >= -1 ;+[80782] -1 x112 -1 x94 >= -1 ;+[80782] -1 x112 -1 x95 >= -1 ;+[80782] -1 x112 -1 x96 >= -1 ;+[80782] -1 x112 -1 x97 >= -1 ;+[80782] -1 x112 -1 x98 >= -1 ;+[80782] -1 x112 -1 x99 >= -1 ;+[80782] -1 x112 -1 x100 >= -1 ;+[80782] -1 x113 -1 x94 >= -1 ;+[80782] -1 x113 -1 x95 >= -1 ;+[80782] -1 x113 -1 x96 >= -1 ;+[80782] -1 x113 -1 x97 >= -1 ;+[80782] -1 x113 -1 x98 >= -1 ;+[80782] -1 x113 -1 x99 >= -1 ;+[80782] -1 x113 -1 x100 >= -1 ;+[80782] -1 x114 -1 x94 >= -1 ;+[80782] -1 x114 -1 x95 >= -1 ;+[80782] -1 x114 -1 x96 >= -1 ;+[80782] -1 x114 -1 x97 >= -1 ;+[80782] -1 x114 -1 x98 >= -1 ;+[80782] -1 x114 -1 x99 >= -1 ;+[80782] -1 x114 -1 x100 >= -1 ;+[80782] -1 x115 -1 x94 >= -1 ;+[80782] -1 x115 -1 x95 >= -1 ;+[80782] -1 x115 -1 x96 >= -1 ;+[80782] -1 x115 -1 x97 >= -1 ;+[80782] -1 x115 -1 x98 >= -1 ;+[80782] -1 x115 -1 x99 >= -1 ;+[80782] -1 x115 -1 x100 >= -1 ;+[80782] -1 x116 -1 x94 >= -1 ;+[80782] -1 x116 -1 x95 >= -1 ;+[80782] -1 x116 -1 x96 >= -1 ;+[80782] -1 x116 -1 x97 >= -1 ;+[80782] -1 x116 -1 x98 >= -1 ;+[80782] -1 x116 -1 x99 >= -1 ;+[80782] -1 x116 -1 x100 >= -1 ;+[80782] -1 x110 -1 x102 >= -1 ;+[80782] -1 x110 -1 x103 >= -1 ;+[80782] -1 x110 -1 x104 >= -1 ;+[80782] -1 x110 -1 x105 >= -1 ;+[80782] -1 x110 -1 x106 >= -1 ;+[80782] -1 x110 -1 x107 >= -1 ;+[80782] -1 x110 -1 x108 >= -1 ;+[80782] -1 x111 -1 x102 >= -1 ;+[80782] -1 x111 -1 x103 >= -1 ;+[80782] -1 x111 -1 x104 >= -1 ;+[80782] -1 x111 -1 x105 >= -1 ;+[80782] -1 x111 -1 x106 >= -1 ;+[80782] -1 x111 -1 x107 >= -1 ;+[80782] -1 x111 -1 x108 >= -1 ;+[80782] -1 x112 -1 x102 >= -1 ;+[80782] -1 x112 -1 x103 >= -1 ;+[80782] -1 x112 -1 x104 >= -1 ;+[80782] -1 x112 -1 x105 >= -1 ;+[80782] -1 x112 -1 x106 >= -1 ;+[80782] -1 x112 -1 x107 >= -1 ;+[80782] -1 x112 -1 x108 >= -1 ;+[80782] -1 x113 -1 x102 >= -1 ;+[80782] -1 x113 -1 x103 >= -1 ;+[80782] -1 x113 -1 x104 >= -1 ;+[80782] -1 x113 -1 x105 >= -1 ;+[80782] -1 x113 -1 x106 >= -1 ;+[80782] -1 x113 -1 x107 >= -1 ;+[80782] -1 x113 -1 x108 >= -1 ;+[80782] -1 x114 -1 x102 >= -1 ;+[80782] -1 x114 -1 x103 >= -1 ;+[80782] -1 x114 -1 x104 >= -1 ;+[80782] -1 x114 -1 x105 >= -1 ;+[80782] -1 x114 -1 x106 >= -1 ;+[80782] -1 x114 -1 x107 >= -1 ;+[80782] -1 x114 -1 x108 >= -1 ;+[80782] -1 x115 -1 x102 >= -1 ;+[80782] -1 x115 -1 x103 >= -1 ;+[80782] -1 x115 -1 x104 >= -1 ;+[80782] -1 x115 -1 x105 >= -1 ;+[80782] -1 x115 -1 x106 >= -1 ;+[80782] -1 x115 -1 x107 >= -1 ;+[80782] -1 x115 -1 x108 >= -1 ;+[80782] -1 x116 -1 x102 >= -1 ;+[80782] -1 x116 -1 x103 >= -1 ;+[80782] -1 x116 -1 x104 >= -1 ;+[80782] -1 x116 -1 x105 >= -1 ;+[80782] -1 x116 -1 x106 >= -1 ;+[80782] -1 x116 -1 x107 >= -1 ;+[80782] -1 x116 -1 x108 >= -1 ;+[80782] -1 x124 -1 x121 >= -1 ;+[80782] -1 x124 -1 x122 >= -1 ;+[80782] -1 x125 -1 x121 >= -1 ;+[80782] -1 x125 -1 x122 >= -1 ;+[80782] -1 x127 -1 x121 >= -1 ;+[80782] -1 x127 -1 x122 >= -1 ;+[80782] -1 x128 -1 x121 >= -1 ;+[80782] -1 x128 -1 x122 >= -1 ;+[80782] -1 x127 -1 x124 >= -1 ;+[80782] -1 x127 -1 x125 >= -1 ;+[80782] -1 x128 -1 x124 >= -1 ;+[80782] -1 x128 -1 x125 >= -1 ;+[80782] -1 x192 -1 x133 >= -1 ;+[80782] -1 x192 -1 x134 >= -1 ;+[80782] -1 x193 -1 x133 >= -1 ;+[80782] -1 x193 -1 x134 >= -1 ;+[80782] -1 x144 -1 x136 >= -1 ;+[80782] -1 x144 -1 x137 >= -1 ;+[80782] -1 x144 -1 x138 >= -1 ;+[80782] -1 x144 -1 x139 >= -1 ;+[80782] -1 x144 -1 x140 >= -1 ;+[80782] -1 x144 -1 x141 >= -1 ;+[80782] -1 x144 -1 x142 >= -1 ;+[80782] -1 x145 -1 x136 >= -1 ;+[80782] -1 x145 -1 x137 >= -1 ;+[80782] -1 x145 -1 x138 >= -1 ;+[80782] -1 x145 -1 x139 >= -1 ;+[80782] -1 x145 -1 x140 >= -1 ;+[80782] -1 x145 -1 x141 >= -1 ;+[80782] -1 x145 -1 x142 >= -1 ;+[80782] -1 x146 -1 x136 >= -1 ;+[80782] -1 x146 -1 x137 >= -1 ;+[80782] -1 x146 -1 x138 >= -1 ;+[80782] -1 x146 -1 x139 >= -1 ;+[80782] -1 x146 -1 x140 >= -1 ;+[80782] -1 x146 -1 x141 >= -1 ;+[80782] -1 x146 -1 x142 >= -1 ;+[80782] -1 x147 -1 x136 >= -1 ;+[80782] -1 x147 -1 x137 >= -1 ;+[80782] -1 x147 -1 x138 >= -1 ;+[80782] -1 x147 -1 x139 >= -1 ;+[80782] -1 x147 -1 x140 >= -1 ;+[80782] -1 x147 -1 x141 >= -1 ;+[80782] -1 x147 -1 x142 >= -1 ;+[80782] -1 x148 -1 x136 >= -1 ;+[80782] -1 x148 -1 x137 >= -1 ;+[80782] -1 x148 -1 x138 >= -1 ;+[80782] -1 x148 -1 x139 >= -1 ;+[80782] -1 x148 -1 x140 >= -1 ;+[80782] -1 x148 -1 x141 >= -1 ;+[80782] -1 x148 -1 x142 >= -1 ;+[80782] -1 x149 -1 x136 >= -1 ;+[80782] -1 x149 -1 x137 >= -1 ;+[80782] -1 x149 -1 x138 >= -1 ;+[80782] -1 x149 -1 x139 >= -1 ;+[80782] -1 x149 -1 x140 >= -1 ;+[80782] -1 x149 -1 x141 >= -1 ;+[80782] -1 x149 -1 x142 >= -1 ;+[80782] -1 x150 -1 x136 >= -1 ;+[80782] -1 x150 -1 x137 >= -1 ;+[80782] -1 x150 -1 x138 >= -1 ;+[80782] -1 x150 -1 x139 >= -1 ;+[80782] -1 x150 -1 x140 >= -1 ;+[80782] -1 x150 -1 x141 >= -1 ;+[80782] -1 x150 -1 x142 >= -1 ;+[80782] -1 x152 -1 x136 >= -1 ;+[80782] -1 x152 -1 x137 >= -1 ;+[80782] -1 x152 -1 x138 >= -1 ;+[80782] -1 x152 -1 x139 >= -1 ;+[80782] -1 x152 -1 x140 >= -1 ;+[80782] -1 x152 -1 x141 >= -1 ;+[80782] -1 x152 -1 x142 >= -1 ;+[80782] -1 x153 -1 x136 >= -1 ;+[80782] -1 x153 -1 x137 >= -1 ;+[80782] -1 x153 -1 x138 >= -1 ;+[80782] -1 x153 -1 x139 >= -1 ;+[80782] -1 x153 -1 x140 >= -1 ;+[80782] -1 x153 -1 x141 >= -1 ;+[80782] -1 x153 -1 x142 >= -1 ;+[80782] -1 x154 -1 x136 >= -1 ;+[80782] -1 x154 -1 x137 >= -1 ;+[80782] -1 x154 -1 x138 >= -1 ;+[80782] -1 x154 -1 x139 >= -1 ;+[80782] -1 x154 -1 x140 >= -1 ;+[80782] -1 x154 -1 x141 >= -1 ;+[80782] -1 x154 -1 x142 >= -1 ;+[80782] -1 x155 -1 x136 >= -1 ;+[80782] -1 x155 -1 x137 >= -1 ;+[80782] -1 x155 -1 x138 >= -1 ;+[80782] -1 x155 -1 x139 >= -1 ;+[80782] -1 x155 -1 x140 >= -1 ;+[80782] -1 x155 -1 x141 >= -1 ;+[80782] -1 x155 -1 x142 >= -1 ;+[80782] -1 x156 -1 x136 >= -1 ;+[80782] -1 x156 -1 x137 >= -1 ;+[80782] -1 x156 -1 x138 >= -1 ;+[80782] -1 x156 -1 x139 >= -1 ;+[80782] -1 x156 -1 x140 >= -1 ;+[80782] -1 x156 -1 x141 >= -1 ;+[80782] -1 x156 -1 x142 >= -1 ;+[80782] -1 x157 -1 x136 >= -1 ;+[80782] -1 x157 -1 x137 >= -1 ;+[80782] -1 x157 -1 x138 >= -1 ;+[80782] -1 x157 -1 x139 >= -1 ;+[80782] -1 x157 -1 x140 >= -1 ;+[80782] -1 x157 -1 x141 >= -1 ;+[80782] -1 x157 -1 x142 >= -1 ;+[80782] -1 x158 -1 x136 >= -1 ;+[80782] -1 x158 -1 x137 >= -1 ;+[80782] -1 x158 -1 x138 >= -1 ;+[80782] -1 x158 -1 x139 >= -1 ;+[80782] -1 x158 -1 x140 >= -1 ;+[80782] -1 x158 -1 x141 >= -1 ;+[80782] -1 x158 -1 x142 >= -1 ;+[80782] -1 x160 -1 x136 >= -1 ;+[80782] -1 x160 -1 x137 >= -1 ;+[80782] -1 x160 -1 x138 >= -1 ;+[80782] -1 x160 -1 x139 >= -1 ;+[80782] -1 x160 -1 x140 >= -1 ;+[80782] -1 x160 -1 x141 >= -1 ;+[80782] -1 x160 -1 x142 >= -1 ;+[80782] -1 x161 -1 x136 >= -1 ;+[80782] -1 x161 -1 x137 >= -1 ;+[80782] -1 x161 -1 x138 >= -1 ;+[80782] -1 x161 -1 x139 >= -1 ;+[80782] -1 x161 -1 x140 >= -1 ;+[80782] -1 x161 -1 x141 >= -1 ;+[80782] -1 x161 -1 x142 >= -1 ;+[80782] -1 x162 -1 x136 >= -1 ;+[80782] -1 x162 -1 x137 >= -1 ;+[80782] -1 x162 -1 x138 >= -1 ;+[80782] -1 x162 -1 x139 >= -1 ;+[80782] -1 x162 -1 x140 >= -1 ;+[80782] -1 x162 -1 x141 >= -1 ;+[80782] -1 x162 -1 x142 >= -1 ;+[80782] -1 x163 -1 x136 >= -1 ;+[80782] -1 x163 -1 x137 >= -1 ;+[80782] -1 x163 -1 x138 >= -1 ;+[80782] -1 x163 -1 x139 >= -1 ;+[80782] -1 x163 -1 x140 >= -1 ;+[80782] -1 x163 -1 x141 >= -1 ;+[80782] -1 x163 -1 x142 >= -1 ;+[80782] -1 x164 -1 x136 >= -1 ;+[80782] -1 x164 -1 x137 >= -1 ;+[80782] -1 x164 -1 x138 >= -1 ;+[80782] -1 x164 -1 x139 >= -1 ;+[80782] -1 x164 -1 x140 >= -1 ;+[80782] -1 x164 -1 x141 >= -1 ;+[80782] -1 x164 -1 x142 >= -1 ;+[80782] -1 x165 -1 x136 >= -1 ;+[80782] -1 x165 -1 x137 >= -1 ;+[80782] -1 x165 -1 x138 >= -1 ;+[80782] -1 x165 -1 x139 >= -1 ;+[80782] -1 x165 -1 x140 >= -1 ;+[80782] -1 x165 -1 x141 >= -1 ;+[80782] -1 x165 -1 x142 >= -1 ;+[80782] -1 x166 -1 x136 >= -1 ;+[80782] -1 x166 -1 x137 >= -1 ;+[80782] -1 x166 -1 x138 >= -1 ;+[80782] -1 x166 -1 x139 >= -1 ;+[80782] -1 x166 -1 x140 >= -1 ;+[80782] -1 x166 -1 x141 >= -1 ;+[80782] -1 x166 -1 x142 >= -1 ;+[80782] -1 x168 -1 x136 >= -1 ;+[80782] -1 x168 -1 x137 >= -1 ;+[80782] -1 x168 -1 x138 >= -1 ;+[80782] -1 x168 -1 x139 >= -1 ;+[80782] -1 x168 -1 x140 >= -1 ;+[80782] -1 x168 -1 x141 >= -1 ;+[80782] -1 x168 -1 x142 >= -1 ;+[80782] -1 x169 -1 x136 >= -1 ;+[80782] -1 x169 -1 x137 >= -1 ;+[80782] -1 x169 -1 x138 >= -1 ;+[80782] -1 x169 -1 x139 >= -1 ;+[80782] -1 x169 -1 x140 >= -1 ;+[80782] -1 x169 -1 x141 >= -1 ;+[80782] -1 x169 -1 x142 >= -1 ;+[80782] -1 x170 -1 x136 >= -1 ;+[80782] -1 x170 -1 x137 >= -1 ;+[80782] -1 x170 -1 x138 >= -1 ;+[80782] -1 x170 -1 x139 >= -1 ;+[80782] -1 x170 -1 x140 >= -1 ;+[80782] -1 x170 -1 x141 >= -1 ;+[80782] -1 x170 -1 x142 >= -1 ;+[80782] -1 x171 -1 x136 >= -1 ;+[80782] -1 x171 -1 x137 >= -1 ;+[80782] -1 x171 -1 x138 >= -1 ;+[80782] -1 x171 -1 x139 >= -1 ;+[80782] -1 x171 -1 x140 >= -1 ;+[80782] -1 x171 -1 x141 >= -1 ;+[80782] -1 x171 -1 x142 >= -1 ;+[80782] -1 x172 -1 x136 >= -1 ;+[80782] -1 x172 -1 x137 >= -1 ;+[80782] -1 x172 -1 x138 >= -1 ;+[80782] -1 x172 -1 x139 >= -1 ;+[80782] -1 x172 -1 x140 >= -1 ;+[80782] -1 x172 -1 x141 >= -1 ;+[80782] -1 x172 -1 x142 >= -1 ;+[80782] -1 x173 -1 x136 >= -1 ;+[80782] -1 x173 -1 x137 >= -1 ;+[80782] -1 x173 -1 x138 >= -1 ;+[80782] -1 x173 -1 x139 >= -1 ;+[80782] -1 x173 -1 x140 >= -1 ;+[80782] -1 x173 -1 x141 >= -1 ;+[80782] -1 x173 -1 x142 >= -1 ;+[80782] -1 x174 -1 x136 >= -1 ;+[80782] -1 x174 -1 x137 >= -1 ;+[80782] -1 x174 -1 x138 >= -1 ;+[80782] -1 x174 -1 x139 >= -1 ;+[80782] -1 x174 -1 x140 >= -1 ;+[80782] -1 x174 -1 x141 >= -1 ;+[80782] -1 x174 -1 x142 >= -1 ;+[80782] -1 x176 -1 x136 >= -1 ;+[80782] -1 x176 -1 x137 >= -1 ;+[80782] -1 x176 -1 x138 >= -1 ;+[80782] -1 x176 -1 x139 >= -1 ;+[80782] -1 x176 -1 x140 >= -1 ;+[80782] -1 x176 -1 x141 >= -1 ;+[80782] -1 x176 -1 x142 >= -1 ;+[80782] -1 x177 -1 x136 >= -1 ;+[80782] -1 x177 -1 x137 >= -1 ;+[80782] -1 x177 -1 x138 >= -1 ;+[80782] -1 x177 -1 x139 >= -1 ;+[80782] -1 x177 -1 x140 >= -1 ;+[80782] -1 x177 -1 x141 >= -1 ;+[80782] -1 x177 -1 x142 >= -1 ;+[80782] -1 x178 -1 x136 >= -1 ;+[80782] -1 x178 -1 x137 >= -1 ;+[80782] -1 x178 -1 x138 >= -1 ;+[80782] -1 x178 -1 x139 >= -1 ;+[80782] -1 x178 -1 x140 >= -1 ;+[80782] -1 x178 -1 x141 >= -1 ;+[80782] -1 x178 -1 x142 >= -1 ;+[80782] -1 x179 -1 x136 >= -1 ;+[80782] -1 x179 -1 x137 >= -1 ;+[80782] -1 x179 -1 x138 >= -1 ;+[80782] -1 x179 -1 x139 >= -1 ;+[80782] -1 x179 -1 x140 >= -1 ;+[80782] -1 x179 -1 x141 >= -1 ;+[80782] -1 x179 -1 x142 >= -1 ;+[80782] -1 x180 -1 x136 >= -1 ;+[80782] -1 x180 -1 x137 >= -1 ;+[80782] -1 x180 -1 x138 >= -1 ;+[80782] -1 x180 -1 x139 >= -1 ;+[80782] -1 x180 -1 x140 >= -1 ;+[80782] -1 x180 -1 x141 >= -1 ;+[80782] -1 x180 -1 x142 >= -1 ;+[80782] -1 x181 -1 x136 >= -1 ;+[80782] -1 x181 -1 x137 >= -1 ;+[80782] -1 x181 -1 x138 >= -1 ;+[80782] -1 x181 -1 x139 >= -1 ;+[80782] -1 x181 -1 x140 >= -1 ;+[80782] -1 x181 -1 x141 >= -1 ;+[80782] -1 x181 -1 x142 >= -1 ;+[80782] -1 x182 -1 x136 >= -1 ;+[80782] -1 x182 -1 x137 >= -1 ;+[80782] -1 x182 -1 x138 >= -1 ;+[80782] -1 x182 -1 x139 >= -1 ;+[80782] -1 x182 -1 x140 >= -1 ;+[80782] -1 x182 -1 x141 >= -1 ;+[80782] -1 x182 -1 x142 >= -1 ;+[80782] -1 x184 -1 x136 >= -1 ;+[80782] -1 x184 -1 x137 >= -1 ;+[80782] -1 x184 -1 x138 >= -1 ;+[80782] -1 x184 -1 x139 >= -1 ;+[80782] -1 x184 -1 x140 >= -1 ;+[80782] -1 x184 -1 x141 >= -1 ;+[80782] -1 x184 -1 x142 >= -1 ;+[80782] -1 x185 -1 x136 >= -1 ;+[80782] -1 x185 -1 x137 >= -1 ;+[80782] -1 x185 -1 x138 >= -1 ;+[80782] -1 x185 -1 x139 >= -1 ;+[80782] -1 x185 -1 x140 >= -1 ;+[80782] -1 x185 -1 x141 >= -1 ;+[80782] -1 x185 -1 x142 >= -1 ;+[80782] -1 x186 -1 x136 >= -1 ;+[80782] -1 x186 -1 x137 >= -1 ;+[80782] -1 x186 -1 x138 >= -1 ;+[80782] -1 x186 -1 x139 >= -1 ;+[80782] -1 x186 -1 x140 >= -1 ;+[80782] -1 x186 -1 x141 >= -1 ;+[80782] -1 x186 -1 x142 >= -1 ;+[80782] -1 x187 -1 x136 >= -1 ;+[80782] -1 x187 -1 x137 >= -1 ;+[80782] -1 x187 -1 x138 >= -1 ;+[80782] -1 x187 -1 x139 >= -1 ;+[80782] -1 x187 -1 x140 >= -1 ;+[80782] -1 x187 -1 x141 >= -1 ;+[80782] -1 x187 -1 x142 >= -1 ;+[80782] -1 x188 -1 x136 >= -1 ;+[80782] -1 x188 -1 x137 >= -1 ;+[80782] -1 x188 -1 x138 >= -1 ;+[80782] -1 x188 -1 x139 >= -1 ;+[80782] -1 x188 -1 x140 >= -1 ;+[80782] -1 x188 -1 x141 >= -1 ;+[80782] -1 x188 -1 x142 >= -1 ;+[80782] -1 x189 -1 x136 >= -1 ;+[80782] -1 x189 -1 x137 >= -1 ;+[80782] -1 x189 -1 x138 >= -1 ;+[80782] -1 x189 -1 x139 >= -1 ;+[80782] -1 x189 -1 x140 >= -1 ;+[80782] -1 x189 -1 x141 >= -1 ;+[80782] -1 x189 -1 x142 >= -1 ;+[80782] -1 x190 -1 x136 >= -1 ;+[80782] -1 x190 -1 x137 >= -1 ;+[80782] -1 x190 -1 x138 >= -1 ;+[80782] -1 x190 -1 x139 >= -1 ;+[80782] -1 x190 -1 x140 >= -1 ;+[80782] -1 x190 -1 x141 >= -1 ;+[80782] -1 x190 -1 x142 >= -1 ;+[80782] -1 x152 -1 x144 >= -1 ;+[80782] -1 x152 -1 x145 >= -1 ;+[80782] -1 x152 -1 x146 >= -1 ;+[80782] -1 x152 -1 x147 >= -1 ;+[80782] -1 x152 -1 x148 >= -1 ;+[80782] -1 x152 -1 x149 >= -1 ;+[80782] -1 x152 -1 x150 >= -1 ;+[80782] -1 x153 -1 x144 >= -1 ;+[80782] -1 x153 -1 x145 >= -1 ;+[80782] -1 x153 -1 x146 >= -1 ;+[80782] -1 x153 -1 x147 >= -1 ;+[80782] -1 x153 -1 x148 >= -1 ;+[80782] -1 x153 -1 x149 >= -1 ;+[80782] -1 x153 -1 x150 >= -1 ;+[80782] -1 x154 -1 x144 >= -1 ;+[80782] -1 x154 -1 x145 >= -1 ;+[80782] -1 x154 -1 x146 >= -1 ;+[80782] -1 x154 -1 x147 >= -1 ;+[80782] -1 x154 -1 x148 >= -1 ;+[80782] -1 x154 -1 x149 >= -1 ;+[80782] -1 x154 -1 x150 >= -1 ;+[80782] -1 x155 -1 x144 >= -1 ;+[80782] -1 x155 -1 x145 >= -1 ;+[80782] -1 x155 -1 x146 >= -1 ;+[80782] -1 x155 -1 x147 >= -1 ;+[80782] -1 x155 -1 x148 >= -1 ;+[80782] -1 x155 -1 x149 >= -1 ;+[80782] -1 x155 -1 x150 >= -1 ;+[80782] -1 x156 -1 x144 >= -1 ;+[80782] -1 x156 -1 x145 >= -1 ;+[80782] -1 x156 -1 x146 >= -1 ;+[80782] -1 x156 -1 x147 >= -1 ;+[80782] -1 x156 -1 x148 >= -1 ;+[80782] -1 x156 -1 x149 >= -1 ;+[80782] -1 x156 -1 x150 >= -1 ;+[80782] -1 x157 -1 x144 >= -1 ;+[80782] -1 x157 -1 x145 >= -1 ;+[80782] -1 x157 -1 x146 >= -1 ;+[80782] -1 x157 -1 x147 >= -1 ;+[80782] -1 x157 -1 x148 >= -1 ;+[80782] -1 x157 -1 x149 >= -1 ;+[80782] -1 x157 -1 x150 >= -1 ;+[80782] -1 x158 -1 x144 >= -1 ;+[80782] -1 x158 -1 x145 >= -1 ;+[80782] -1 x158 -1 x146 >= -1 ;+[80782] -1 x158 -1 x147 >= -1 ;+[80782] -1 x158 -1 x148 >= -1 ;+[80782] -1 x158 -1 x149 >= -1 ;+[80782] -1 x158 -1 x150 >= -1 ;+[80782] -1 x160 -1 x144 >= -1 ;+[80782] -1 x160 -1 x145 >= -1 ;+[80782] -1 x160 -1 x146 >= -1 ;+[80782] -1 x160 -1 x147 >= -1 ;+[80782] -1 x160 -1 x148 >= -1 ;+[80782] -1 x160 -1 x149 >= -1 ;+[80782] -1 x160 -1 x150 >= -1 ;+[80782] -1 x161 -1 x144 >= -1 ;+[80782] -1 x161 -1 x145 >= -1 ;+[80782] -1 x161 -1 x146 >= -1 ;+[80782] -1 x161 -1 x147 >= -1 ;+[80782] -1 x161 -1 x148 >= -1 ;+[80782] -1 x161 -1 x149 >= -1 ;+[80782] -1 x161 -1 x150 >= -1 ;+[80782] -1 x162 -1 x144 >= -1 ;+[80782] -1 x162 -1 x145 >= -1 ;+[80782] -1 x162 -1 x146 >= -1 ;+[80782] -1 x162 -1 x147 >= -1 ;+[80782] -1 x162 -1 x148 >= -1 ;+[80782] -1 x162 -1 x149 >= -1 ;+[80782] -1 x162 -1 x150 >= -1 ;+[80782] -1 x163 -1 x144 >= -1 ;+[80782] -1 x163 -1 x145 >= -1 ;+[80782] -1 x163 -1 x146 >= -1 ;+[80782] -1 x163 -1 x147 >= -1 ;+[80782] -1 x163 -1 x148 >= -1 ;+[80782] -1 x163 -1 x149 >= -1 ;+[80782] -1 x163 -1 x150 >= -1 ;+[80782] -1 x164 -1 x144 >= -1 ;+[80782] -1 x164 -1 x145 >= -1 ;+[80782] -1 x164 -1 x146 >= -1 ;+[80782] -1 x164 -1 x147 >= -1 ;+[80782] -1 x164 -1 x148 >= -1 ;+[80782] -1 x164 -1 x149 >= -1 ;+[80782] -1 x164 -1 x150 >= -1 ;+[80782] -1 x165 -1 x144 >= -1 ;+[80782] -1 x165 -1 x145 >= -1 ;+[80782] -1 x165 -1 x146 >= -1 ;+[80782] -1 x165 -1 x147 >= -1 ;+[80782] -1 x165 -1 x148 >= -1 ;+[80782] -1 x165 -1 x149 >= -1 ;+[80782] -1 x165 -1 x150 >= -1 ;+[80782] -1 x166 -1 x144 >= -1 ;+[80782] -1 x166 -1 x145 >= -1 ;+[80782] -1 x166 -1 x146 >= -1 ;+[80782] -1 x166 -1 x147 >= -1 ;+[80782] -1 x166 -1 x148 >= -1 ;+[80782] -1 x166 -1 x149 >= -1 ;+[80782] -1 x166 -1 x150 >= -1 ;+[80782] -1 x168 -1 x144 >= -1 ;+[80782] -1 x168 -1 x145 >= -1 ;+[80782] -1 x168 -1 x146 >= -1 ;+[80782] -1 x168 -1 x147 >= -1 ;+[80782] -1 x168 -1 x148 >= -1 ;+[80782] -1 x168 -1 x149 >= -1 ;+[80782] -1 x168 -1 x150 >= -1 ;+[80782] -1 x169 -1 x144 >= -1 ;+[80782] -1 x169 -1 x145 >= -1 ;+[80782] -1 x169 -1 x146 >= -1 ;+[80782] -1 x169 -1 x147 >= -1 ;+[80782] -1 x169 -1 x148 >= -1 ;+[80782] -1 x169 -1 x149 >= -1 ;+[80782] -1 x169 -1 x150 >= -1 ;+[80782] -1 x170 -1 x144 >= -1 ;+[80782] -1 x170 -1 x145 >= -1 ;+[80782] -1 x170 -1 x146 >= -1 ;+[80782] -1 x170 -1 x147 >= -1 ;+[80782] -1 x170 -1 x148 >= -1 ;+[80782] -1 x170 -1 x149 >= -1 ;+[80782] -1 x170 -1 x150 >= -1 ;+[80782] -1 x171 -1 x144 >= -1 ;+[80782] -1 x171 -1 x145 >= -1 ;+[80782] -1 x171 -1 x146 >= -1 ;+[80782] -1 x171 -1 x147 >= -1 ;+[80782] -1 x171 -1 x148 >= -1 ;+[80782] -1 x171 -1 x149 >= -1 ;+[80782] -1 x171 -1 x150 >= -1 ;+[80782] -1 x172 -1 x144 >= -1 ;+[80782] -1 x172 -1 x145 >= -1 ;+[80782] -1 x172 -1 x146 >= -1 ;+[80782] -1 x172 -1 x147 >= -1 ;+[80782] -1 x172 -1 x148 >= -1 ;+[80782] -1 x172 -1 x149 >= -1 ;+[80782] -1 x172 -1 x150 >= -1 ;+[80782] -1 x173 -1 x144 >= -1 ;+[80782] -1 x173 -1 x145 >= -1 ;+[80782] -1 x173 -1 x146 >= -1 ;+[80782] -1 x173 -1 x147 >= -1 ;+[80782] -1 x173 -1 x148 >= -1 ;+[80782] -1 x173 -1 x149 >= -1 ;+[80782] -1 x173 -1 x150 >= -1 ;+[80782] -1 x174 -1 x144 >= -1 ;+[80782] -1 x174 -1 x145 >= -1 ;+[80782] -1 x174 -1 x146 >= -1 ;+[80782] -1 x174 -1 x147 >= -1 ;+[80782] -1 x174 -1 x148 >= -1 ;+[80782] -1 x174 -1 x149 >= -1 ;+[80782] -1 x174 -1 x150 >= -1 ;+[80782] -1 x176 -1 x144 >= -1 ;+[80782] -1 x176 -1 x145 >= -1 ;+[80782] -1 x176 -1 x146 >= -1 ;+[80782] -1 x176 -1 x147 >= -1 ;+[80782] -1 x176 -1 x148 >= -1 ;+[80782] -1 x176 -1 x149 >= -1 ;+[80782] -1 x176 -1 x150 >= -1 ;+[80782] -1 x177 -1 x144 >= -1 ;+[80782] -1 x177 -1 x145 >= -1 ;+[80782] -1 x177 -1 x146 >= -1 ;+[80782] -1 x177 -1 x147 >= -1 ;+[80782] -1 x177 -1 x148 >= -1 ;+[80782] -1 x177 -1 x149 >= -1 ;+[80782] -1 x177 -1 x150 >= -1 ;+[80782] -1 x178 -1 x144 >= -1 ;+[80782] -1 x178 -1 x145 >= -1 ;+[80782] -1 x178 -1 x146 >= -1 ;+[80782] -1 x178 -1 x147 >= -1 ;+[80782] -1 x178 -1 x148 >= -1 ;+[80782] -1 x178 -1 x149 >= -1 ;+[80782] -1 x178 -1 x150 >= -1 ;+[80782] -1 x179 -1 x144 >= -1 ;+[80782] -1 x179 -1 x145 >= -1 ;+[80782] -1 x179 -1 x146 >= -1 ;+[80782] -1 x179 -1 x147 >= -1 ;+[80782] -1 x179 -1 x148 >= -1 ;+[80782] -1 x179 -1 x149 >= -1 ;+[80782] -1 x179 -1 x150 >= -1 ;+[80782] -1 x180 -1 x144 >= -1 ;+[80782] -1 x180 -1 x145 >= -1 ;+[80782] -1 x180 -1 x146 >= -1 ;+[80782] -1 x180 -1 x147 >= -1 ;+[80782] -1 x180 -1 x148 >= -1 ;+[80782] -1 x180 -1 x149 >= -1 ;+[80782] -1 x180 -1 x150 >= -1 ;+[80782] -1 x181 -1 x144 >= -1 ;+[80782] -1 x181 -1 x145 >= -1 ;+[80782] -1 x181 -1 x146 >= -1 ;+[80782] -1 x181 -1 x147 >= -1 ;+[80782] -1 x181 -1 x148 >= -1 ;+[80782] -1 x181 -1 x149 >= -1 ;+[80782] -1 x181 -1 x150 >= -1 ;+[80782] -1 x182 -1 x144 >= -1 ;+[80782] -1 x182 -1 x145 >= -1 ;+[80782] -1 x182 -1 x146 >= -1 ;+[80782] -1 x182 -1 x147 >= -1 ;+[80782] -1 x182 -1 x148 >= -1 ;+[80782] -1 x182 -1 x149 >= -1 ;+[80782] -1 x182 -1 x150 >= -1 ;+[80782] -1 x184 -1 x144 >= -1 ;+[80782] -1 x184 -1 x145 >= -1 ;+[80782] -1 x184 -1 x146 >= -1 ;+[80782] -1 x184 -1 x147 >= -1 ;+[80782] -1 x184 -1 x148 >= -1 ;+[80782] -1 x184 -1 x149 >= -1 ;+[80782] -1 x184 -1 x150 >= -1 ;+[80782] -1 x185 -1 x144 >= -1 ;+[80782] -1 x185 -1 x145 >= -1 ;+[80782] -1 x185 -1 x146 >= -1 ;+[80782] -1 x185 -1 x147 >= -1 ;+[80782] -1 x185 -1 x148 >= -1 ;+[80782] -1 x185 -1 x149 >= -1 ;+[80782] -1 x185 -1 x150 >= -1 ;+[80782] -1 x186 -1 x144 >= -1 ;+[80782] -1 x186 -1 x145 >= -1 ;+[80782] -1 x186 -1 x146 >= -1 ;+[80782] -1 x186 -1 x147 >= -1 ;+[80782] -1 x186 -1 x148 >= -1 ;+[80782] -1 x186 -1 x149 >= -1 ;+[80782] -1 x186 -1 x150 >= -1 ;+[80782] -1 x187 -1 x144 >= -1 ;+[80782] -1 x187 -1 x145 >= -1 ;+[80782] -1 x187 -1 x146 >= -1 ;+[80782] -1 x187 -1 x147 >= -1 ;+[80782] -1 x187 -1 x148 >= -1 ;+[80782] -1 x187 -1 x149 >= -1 ;+[80782] -1 x187 -1 x150 >= -1 ;+[80782] -1 x188 -1 x144 >= -1 ;+[80782] -1 x188 -1 x145 >= -1 ;+[80782] -1 x188 -1 x146 >= -1 ;+[80782] -1 x188 -1 x147 >= -1 ;+[80782] -1 x188 -1 x148 >= -1 ;+[80782] -1 x188 -1 x149 >= -1 ;+[80782] -1 x188 -1 x150 >= -1 ;+[80782] -1 x189 -1 x144 >= -1 ;+[80782] -1 x189 -1 x145 >= -1 ;+[80782] -1 x189 -1 x146 >= -1 ;+[80782] -1 x189 -1 x147 >= -1 ;+[80782] -1 x189 -1 x148 >= -1 ;+[80782] -1 x189 -1 x149 >= -1 ;+[80782] -1 x189 -1 x150 >= -1 ;+[80782] -1 x190 -1 x144 >= -1 ;+[80782] -1 x190 -1 x145 >= -1 ;+[80782] -1 x190 -1 x146 >= -1 ;+[80782] -1 x190 -1 x147 >= -1 ;+[80782] -1 x190 -1 x148 >= -1 ;+[80782] -1 x190 -1 x149 >= -1 ;+[80782] -1 x190 -1 x150 >= -1 ;+[80782] -1 x160 -1 x152 >= -1 ;+[80782] -1 x160 -1 x153 >= -1 ;+[80782] -1 x160 -1 x154 >= -1 ;+[80782] -1 x160 -1 x155 >= -1 ;+[80782] -1 x160 -1 x156 >= -1 ;+[80782] -1 x160 -1 x157 >= -1 ;+[80782] -1 x160 -1 x158 >= -1 ;+[80782] -1 x161 -1 x152 >= -1 ;+[80782] -1 x161 -1 x153 >= -1 ;+[80782] -1 x161 -1 x154 >= -1 ;+[80782] -1 x161 -1 x155 >= -1 ;+[80782] -1 x161 -1 x156 >= -1 ;+[80782] -1 x161 -1 x157 >= -1 ;+[80782] -1 x161 -1 x158 >= -1 ;+[80782] -1 x162 -1 x152 >= -1 ;+[80782] -1 x162 -1 x153 >= -1 ;+[80782] -1 x162 -1 x154 >= -1 ;+[80782] -1 x162 -1 x155 >= -1 ;+[80782] -1 x162 -1 x156 >= -1 ;+[80782] -1 x162 -1 x157 >= -1 ;+[80782] -1 x162 -1 x158 >= -1 ;+[80782] -1 x163 -1 x152 >= -1 ;+[80782] -1 x163 -1 x153 >= -1 ;+[80782] -1 x163 -1 x154 >= -1 ;+[80782] -1 x163 -1 x155 >= -1 ;+[80782] -1 x163 -1 x156 >= -1 ;+[80782] -1 x163 -1 x157 >= -1 ;+[80782] -1 x163 -1 x158 >= -1 ;+[80782] -1 x164 -1 x152 >= -1 ;+[80782] -1 x164 -1 x153 >= -1 ;+[80782] -1 x164 -1 x154 >= -1 ;+[80782] -1 x164 -1 x155 >= -1 ;+[80782] -1 x164 -1 x156 >= -1 ;+[80782] -1 x164 -1 x157 >= -1 ;+[80782] -1 x164 -1 x158 >= -1 ;+[80782] -1 x165 -1 x152 >= -1 ;+[80782] -1 x165 -1 x153 >= -1 ;+[80782] -1 x165 -1 x154 >= -1 ;+[80782] -1 x165 -1 x155 >= -1 ;+[80782] -1 x165 -1 x156 >= -1 ;+[80782] -1 x165 -1 x157 >= -1 ;+[80782] -1 x165 -1 x158 >= -1 ;+[80782] -1 x166 -1 x152 >= -1 ;+[80782] -1 x166 -1 x153 >= -1 ;+[80782] -1 x166 -1 x154 >= -1 ;+[80782] -1 x166 -1 x155 >= -1 ;+[80782] -1 x166 -1 x156 >= -1 ;+[80782] -1 x166 -1 x157 >= -1 ;+[80782] -1 x166 -1 x158 >= -1 ;+[80782] -1 x168 -1 x152 >= -1 ;+[80782] -1 x168 -1 x153 >= -1 ;+[80782] -1 x168 -1 x154 >= -1 ;+[80782] -1 x168 -1 x155 >= -1 ;+[80782] -1 x168 -1 x156 >= -1 ;+[80782] -1 x168 -1 x157 >= -1 ;+[80782] -1 x168 -1 x158 >= -1 ;+[80782] -1 x169 -1 x152 >= -1 ;+[80782] -1 x169 -1 x153 >= -1 ;+[80782] -1 x169 -1 x154 >= -1 ;+[80782] -1 x169 -1 x155 >= -1 ;+[80782] -1 x169 -1 x156 >= -1 ;+[80782] -1 x169 -1 x157 >= -1 ;+[80782] -1 x169 -1 x158 >= -1 ;+[80782] -1 x170 -1 x152 >= -1 ;+[80782] -1 x170 -1 x153 >= -1 ;+[80782] -1 x170 -1 x154 >= -1 ;+[80782] -1 x170 -1 x155 >= -1 ;+[80782] -1 x170 -1 x156 >= -1 ;+[80782] -1 x170 -1 x157 >= -1 ;+[80782] -1 x170 -1 x158 >= -1 ;+[80782] -1 x171 -1 x152 >= -1 ;+[80782] -1 x171 -1 x153 >= -1 ;+[80782] -1 x171 -1 x154 >= -1 ;+[80782] -1 x171 -1 x155 >= -1 ;+[80782] -1 x171 -1 x156 >= -1 ;+[80782] -1 x171 -1 x157 >= -1 ;+[80782] -1 x171 -1 x158 >= -1 ;+[80782] -1 x172 -1 x152 >= -1 ;+[80782] -1 x172 -1 x153 >= -1 ;+[80782] -1 x172 -1 x154 >= -1 ;+[80782] -1 x172 -1 x155 >= -1 ;+[80782] -1 x172 -1 x156 >= -1 ;+[80782] -1 x172 -1 x157 >= -1 ;+[80782] -1 x172 -1 x158 >= -1 ;+[80782] -1 x173 -1 x152 >= -1 ;+[80782] -1 x173 -1 x153 >= -1 ;+[80782] -1 x173 -1 x154 >= -1 ;+[80782] -1 x173 -1 x155 >= -1 ;+[80782] -1 x173 -1 x156 >= -1 ;+[80782] -1 x173 -1 x157 >= -1 ;+[80782] -1 x173 -1 x158 >= -1 ;+[80782] -1 x174 -1 x152 >= -1 ;+[80782] -1 x174 -1 x153 >= -1 ;+[80782] -1 x174 -1 x154 >= -1 ;+[80782] -1 x174 -1 x155 >= -1 ;+[80782] -1 x174 -1 x156 >= -1 ;+[80782] -1 x174 -1 x157 >= -1 ;+[80782] -1 x174 -1 x158 >= -1 ;+[80782] -1 x176 -1 x152 >= -1 ;+[80782] -1 x176 -1 x153 >= -1 ;+[80782] -1 x176 -1 x154 >= -1 ;+[80782] -1 x176 -1 x155 >= -1 ;+[80782] -1 x176 -1 x156 >= -1 ;+[80782] -1 x176 -1 x157 >= -1 ;+[80782] -1 x176 -1 x158 >= -1 ;+[80782] -1 x177 -1 x152 >= -1 ;+[80782] -1 x177 -1 x153 >= -1 ;+[80782] -1 x177 -1 x154 >= -1 ;+[80782] -1 x177 -1 x155 >= -1 ;+[80782] -1 x177 -1 x156 >= -1 ;+[80782] -1 x177 -1 x157 >= -1 ;+[80782] -1 x177 -1 x158 >= -1 ;+[80782] -1 x178 -1 x152 >= -1 ;+[80782] -1 x178 -1 x153 >= -1 ;+[80782] -1 x178 -1 x154 >= -1 ;+[80782] -1 x178 -1 x155 >= -1 ;+[80782] -1 x178 -1 x156 >= -1 ;+[80782] -1 x178 -1 x157 >= -1 ;+[80782] -1 x178 -1 x158 >= -1 ;+[80782] -1 x179 -1 x152 >= -1 ;+[80782] -1 x179 -1 x153 >= -1 ;+[80782] -1 x179 -1 x154 >= -1 ;+[80782] -1 x179 -1 x155 >= -1 ;+[80782] -1 x179 -1 x156 >= -1 ;+[80782] -1 x179 -1 x157 >= -1 ;+[80782] -1 x179 -1 x158 >= -1 ;+[80782] -1 x180 -1 x152 >= -1 ;+[80782] -1 x180 -1 x153 >= -1 ;+[80782] -1 x180 -1 x154 >= -1 ;+[80782] -1 x180 -1 x155 >= -1 ;+[80782] -1 x180 -1 x156 >= -1 ;+[80782] -1 x180 -1 x157 >= -1 ;+[80782] -1 x180 -1 x158 >= -1 ;+[80782] -1 x181 -1 x152 >= -1 ;+[80782] -1 x181 -1 x153 >= -1 ;+[80782] -1 x181 -1 x154 >= -1 ;+[80782] -1 x181 -1 x155 >= -1 ;+[80782] -1 x181 -1 x156 >= -1 ;+[80782] -1 x181 -1 x157 >= -1 ;+[80782] -1 x181 -1 x158 >= -1 ;+[80782] -1 x182 -1 x152 >= -1 ;+[80782] -1 x182 -1 x153 >= -1 ;+[80782] -1 x182 -1 x154 >= -1 ;+[80782] -1 x182 -1 x155 >= -1 ;+[80782] -1 x182 -1 x156 >= -1 ;+[80782] -1 x182 -1 x157 >= -1 ;+[80782] -1 x182 -1 x158 >= -1 ;+[80782] -1 x184 -1 x152 >= -1 ;+[80782] -1 x184 -1 x153 >= -1 ;+[80782] -1 x184 -1 x154 >= -1 ;+[80782] -1 x184 -1 x155 >= -1 ;+[80782] -1 x184 -1 x156 >= -1 ;+[80782] -1 x184 -1 x157 >= -1 ;+[80782] -1 x184 -1 x158 >= -1 ;+[80782] -1 x185 -1 x152 >= -1 ;+[80782] -1 x185 -1 x153 >= -1 ;+[80782] -1 x185 -1 x154 >= -1 ;+[80782] -1 x185 -1 x155 >= -1 ;+[80782] -1 x185 -1 x156 >= -1 ;+[80782] -1 x185 -1 x157 >= -1 ;+[80782] -1 x185 -1 x158 >= -1 ;+[80782] -1 x186 -1 x152 >= -1 ;+[80782] -1 x186 -1 x153 >= -1 ;+[80782] -1 x186 -1 x154 >= -1 ;+[80782] -1 x186 -1 x155 >= -1 ;+[80782] -1 x186 -1 x156 >= -1 ;+[80782] -1 x186 -1 x157 >= -1 ;+[80782] -1 x186 -1 x158 >= -1 ;+[80782] -1 x187 -1 x152 >= -1 ;+[80782] -1 x187 -1 x153 >= -1 ;+[80782] -1 x187 -1 x154 >= -1 ;+[80782] -1 x187 -1 x155 >= -1 ;+[80782] -1 x187 -1 x156 >= -1 ;+[80782] -1 x187 -1 x157 >= -1 ;+[80782] -1 x187 -1 x158 >= -1 ;+[80782] -1 x188 -1 x152 >= -1 ;+[80782] -1 x188 -1 x153 >= -1 ;+[80782] -1 x188 -1 x154 >= -1 ;+[80782] -1 x188 -1 x155 >= -1 ;+[80782] -1 x188 -1 x156 >= -1 ;+[80782] -1 x188 -1 x157 >= -1 ;+[80782] -1 x188 -1 x158 >= -1 ;+[80782] -1 x189 -1 x152 >= -1 ;+[80782] -1 x189 -1 x153 >= -1 ;+[80782] -1 x189 -1 x154 >= -1 ;+[80782] -1 x189 -1 x155 >= -1 ;+[80782] -1 x189 -1 x156 >= -1 ;+[80782] -1 x189 -1 x157 >= -1 ;+[80782] -1 x189 -1 x158 >= -1 ;+[80782] -1 x190 -1 x152 >= -1 ;+[80782] -1 x190 -1 x153 >= -1 ;+[80782] -1 x190 -1 x154 >= -1 ;+[80782] -1 x190 -1 x155 >= -1 ;+[80782] -1 x190 -1 x156 >= -1 ;+[80782] -1 x190 -1 x157 >= -1 ;+[80782] -1 x190 -1 x158 >= -1 ;+[80782] -1 x168 -1 x160 >= -1 ;+[80782] -1 x168 -1 x161 >= -1 ;+[80782] -1 x168 -1 x162 >= -1 ;+[80782] -1 x168 -1 x163 >= -1 ;+[80782] -1 x168 -1 x164 >= -1 ;+[80782] -1 x168 -1 x165 >= -1 ;+[80782] -1 x168 -1 x166 >= -1 ;+[80782] -1 x169 -1 x160 >= -1 ;+[80782] -1 x169 -1 x161 >= -1 ;+[80782] -1 x169 -1 x162 >= -1 ;+[80782] -1 x169 -1 x163 >= -1 ;+[80782] -1 x169 -1 x164 >= -1 ;+[80782] -1 x169 -1 x165 >= -1 ;+[80782] -1 x169 -1 x166 >= -1 ;+[80782] -1 x170 -1 x160 >= -1 ;+[80782] -1 x170 -1 x161 >= -1 ;+[80782] -1 x170 -1 x162 >= -1 ;+[80782] -1 x170 -1 x163 >= -1 ;+[80782] -1 x170 -1 x164 >= -1 ;+[80782] -1 x170 -1 x165 >= -1 ;+[80782] -1 x170 -1 x166 >= -1 ;+[80782] -1 x171 -1 x160 >= -1 ;+[80782] -1 x171 -1 x161 >= -1 ;+[80782] -1 x171 -1 x162 >= -1 ;+[80782] -1 x171 -1 x163 >= -1 ;+[80782] -1 x171 -1 x164 >= -1 ;+[80782] -1 x171 -1 x165 >= -1 ;+[80782] -1 x171 -1 x166 >= -1 ;+[80782] -1 x172 -1 x160 >= -1 ;+[80782] -1 x172 -1 x161 >= -1 ;+[80782] -1 x172 -1 x162 >= -1 ;+[80782] -1 x172 -1 x163 >= -1 ;+[80782] -1 x172 -1 x164 >= -1 ;+[80782] -1 x172 -1 x165 >= -1 ;+[80782] -1 x172 -1 x166 >= -1 ;+[80782] -1 x173 -1 x160 >= -1 ;+[80782] -1 x173 -1 x161 >= -1 ;+[80782] -1 x173 -1 x162 >= -1 ;+[80782] -1 x173 -1 x163 >= -1 ;+[80782] -1 x173 -1 x164 >= -1 ;+[80782] -1 x173 -1 x165 >= -1 ;+[80782] -1 x173 -1 x166 >= -1 ;+[80782] -1 x174 -1 x160 >= -1 ;+[80782] -1 x174 -1 x161 >= -1 ;+[80782] -1 x174 -1 x162 >= -1 ;+[80782] -1 x174 -1 x163 >= -1 ;+[80782] -1 x174 -1 x164 >= -1 ;+[80782] -1 x174 -1 x165 >= -1 ;+[80782] -1 x174 -1 x166 >= -1 ;+[80782] -1 x176 -1 x160 >= -1 ;+[80782] -1 x176 -1 x161 >= -1 ;+[80782] -1 x176 -1 x162 >= -1 ;+[80782] -1 x176 -1 x163 >= -1 ;+[80782] -1 x176 -1 x164 >= -1 ;+[80782] -1 x176 -1 x165 >= -1 ;+[80782] -1 x176 -1 x166 >= -1 ;+[80782] -1 x177 -1 x160 >= -1 ;+[80782] -1 x177 -1 x161 >= -1 ;+[80782] -1 x177 -1 x162 >= -1 ;+[80782] -1 x177 -1 x163 >= -1 ;+[80782] -1 x177 -1 x164 >= -1 ;+[80782] -1 x177 -1 x165 >= -1 ;+[80782] -1 x177 -1 x166 >= -1 ;+[80782] -1 x178 -1 x160 >= -1 ;+[80782] -1 x178 -1 x161 >= -1 ;+[80782] -1 x178 -1 x162 >= -1 ;+[80782] -1 x178 -1 x163 >= -1 ;+[80782] -1 x178 -1 x164 >= -1 ;+[80782] -1 x178 -1 x165 >= -1 ;+[80782] -1 x178 -1 x166 >= -1 ;+[80782] -1 x179 -1 x160 >= -1 ;+[80782] -1 x179 -1 x161 >= -1 ;+[80782] -1 x179 -1 x162 >= -1 ;+[80782] -1 x179 -1 x163 >= -1 ;+[80782] -1 x179 -1 x164 >= -1 ;+[80782] -1 x179 -1 x165 >= -1 ;+[80782] -1 x179 -1 x166 >= -1 ;+[80782] -1 x180 -1 x160 >= -1 ;+[80782] -1 x180 -1 x161 >= -1 ;+[80782] -1 x180 -1 x162 >= -1 ;+[80782] -1 x180 -1 x163 >= -1 ;+[80782] -1 x180 -1 x164 >= -1 ;+[80782] -1 x180 -1 x165 >= -1 ;+[80782] -1 x180 -1 x166 >= -1 ;+[80782] -1 x181 -1 x160 >= -1 ;+[80782] -1 x181 -1 x161 >= -1 ;+[80782] -1 x181 -1 x162 >= -1 ;+[80782] -1 x181 -1 x163 >= -1 ;+[80782] -1 x181 -1 x164 >= -1 ;+[80782] -1 x181 -1 x165 >= -1 ;+[80782] -1 x181 -1 x166 >= -1 ;+[80782] -1 x182 -1 x160 >= -1 ;+[80782] -1 x182 -1 x161 >= -1 ;+[80782] -1 x182 -1 x162 >= -1 ;+[80782] -1 x182 -1 x163 >= -1 ;+[80782] -1 x182 -1 x164 >= -1 ;+[80782] -1 x182 -1 x165 >= -1 ;+[80782] -1 x182 -1 x166 >= -1 ;+[80782] -1 x184 -1 x160 >= -1 ;+[80782] -1 x184 -1 x161 >= -1 ;+[80782] -1 x184 -1 x162 >= -1 ;+[80782] -1 x184 -1 x163 >= -1 ;+[80782] -1 x184 -1 x164 >= -1 ;+[80782] -1 x184 -1 x165 >= -1 ;+[80782] -1 x184 -1 x166 >= -1 ;+[80782] -1 x185 -1 x160 >= -1 ;+[80782] -1 x185 -1 x161 >= -1 ;+[80782] -1 x185 -1 x162 >= -1 ;+[80782] -1 x185 -1 x163 >= -1 ;+[80782] -1 x185 -1 x164 >= -1 ;+[80782] -1 x185 -1 x165 >= -1 ;+[80782] -1 x185 -1 x166 >= -1 ;+[80782] -1 x186 -1 x160 >= -1 ;+[80782] -1 x186 -1 x161 >= -1 ;+[80782] -1 x186 -1 x162 >= -1 ;+[80782] -1 x186 -1 x163 >= -1 ;+[80782] -1 x186 -1 x164 >= -1 ;+[80782] -1 x186 -1 x165 >= -1 ;+[80782] -1 x186 -1 x166 >= -1 ;+[80782] -1 x187 -1 x160 >= -1 ;+[80782] -1 x187 -1 x161 >= -1 ;+[80782] -1 x187 -1 x162 >= -1 ;+[80782] -1 x187 -1 x163 >= -1 ;+[80782] -1 x187 -1 x164 >= -1 ;+[80782] -1 x187 -1 x165 >= -1 ;+[80782] -1 x187 -1 x166 >= -1 ;+[80782] -1 x188 -1 x160 >= -1 ;+[80782] -1 x188 -1 x161 >= -1 ;+[80782] -1 x188 -1 x162 >= -1 ;+[80782] -1 x188 -1 x163 >= -1 ;+[80782] -1 x188 -1 x164 >= -1 ;+[80782] -1 x188 -1 x165 >= -1 ;+[80782] -1 x188 -1 x166 >= -1 ;+[80782] -1 x189 -1 x160 >= -1 ;+[80782] -1 x189 -1 x161 >= -1 ;+[80782] -1 x189 -1 x162 >= -1 ;+[80782] -1 x189 -1 x163 >= -1 ;+[80782] -1 x189 -1 x164 >= -1 ;+[80782] -1 x189 -1 x165 >= -1 ;+[80782] -1 x189 -1 x166 >= -1 ;+[80782] -1 x190 -1 x160 >= -1 ;+[80782] -1 x190 -1 x161 >= -1 ;+[80782] -1 x190 -1 x162 >= -1 ;+[80782] -1 x190 -1 x163 >= -1 ;+[80782] -1 x190 -1 x164 >= -1 ;+[80782] -1 x190 -1 x165 >= -1 ;+[80782] -1 x190 -1 x166 >= -1 ;+[80782] -1 x176 -1 x168 >= -1 ;+[80782] -1 x176 -1 x169 >= -1 ;+[80782] -1 x176 -1 x170 >= -1 ;+[80782] -1 x176 -1 x171 >= -1 ;+[80782] -1 x176 -1 x172 >= -1 ;+[80782] -1 x176 -1 x173 >= -1 ;+[80782] -1 x176 -1 x174 >= -1 ;+[80782] -1 x177 -1 x168 >= -1 ;+[80782] -1 x177 -1 x169 >= -1 ;+[80782] -1 x177 -1 x170 >= -1 ;+[80782] -1 x177 -1 x171 >= -1 ;+[80782] -1 x177 -1 x172 >= -1 ;+[80782] -1 x177 -1 x173 >= -1 ;+[80782] -1 x177 -1 x174 >= -1 ;+[80782] -1 x178 -1 x168 >= -1 ;+[80782] -1 x178 -1 x169 >= -1 ;+[80782] -1 x178 -1 x170 >= -1 ;+[80782] -1 x178 -1 x171 >= -1 ;+[80782] -1 x178 -1 x172 >= -1 ;+[80782] -1 x178 -1 x173 >= -1 ;+[80782] -1 x178 -1 x174 >= -1 ;+[80782] -1 x179 -1 x168 >= -1 ;+[80782] -1 x179 -1 x169 >= -1 ;+[80782] -1 x179 -1 x170 >= -1 ;+[80782] -1 x179 -1 x171 >= -1 ;+[80782] -1 x179 -1 x172 >= -1 ;+[80782] -1 x179 -1 x173 >= -1 ;+[80782] -1 x179 -1 x174 >= -1 ;+[80782] -1 x180 -1 x168 >= -1 ;+[80782] -1 x180 -1 x169 >= -1 ;+[80782] -1 x180 -1 x170 >= -1 ;+[80782] -1 x180 -1 x171 >= -1 ;+[80782] -1 x180 -1 x172 >= -1 ;+[80782] -1 x180 -1 x173 >= -1 ;+[80782] -1 x180 -1 x174 >= -1 ;+[80782] -1 x181 -1 x168 >= -1 ;+[80782] -1 x181 -1 x169 >= -1 ;+[80782] -1 x181 -1 x170 >= -1 ;+[80782] -1 x181 -1 x171 >= -1 ;+[80782] -1 x181 -1 x172 >= -1 ;+[80782] -1 x181 -1 x173 >= -1 ;+[80782] -1 x181 -1 x174 >= -1 ;+[80782] -1 x182 -1 x168 >= -1 ;+[80782] -1 x182 -1 x169 >= -1 ;+[80782] -1 x182 -1 x170 >= -1 ;+[80782] -1 x182 -1 x171 >= -1 ;+[80782] -1 x182 -1 x172 >= -1 ;+[80782] -1 x182 -1 x173 >= -1 ;+[80782] -1 x182 -1 x174 >= -1 ;+[80782] -1 x184 -1 x168 >= -1 ;+[80782] -1 x184 -1 x169 >= -1 ;+[80782] -1 x184 -1 x170 >= -1 ;+[80782] -1 x184 -1 x171 >= -1 ;+[80782] -1 x184 -1 x172 >= -1 ;+[80782] -1 x184 -1 x173 >= -1 ;+[80782] -1 x184 -1 x174 >= -1 ;+[80782] -1 x185 -1 x168 >= -1 ;+[80782] -1 x185 -1 x169 >= -1 ;+[80782] -1 x185 -1 x170 >= -1 ;+[80782] -1 x185 -1 x171 >= -1 ;+[80782] -1 x185 -1 x172 >= -1 ;+[80782] -1 x185 -1 x173 >= -1 ;+[80782] -1 x185 -1 x174 >= -1 ;+[80782] -1 x186 -1 x168 >= -1 ;+[80782] -1 x186 -1 x169 >= -1 ;+[80782] -1 x186 -1 x170 >= -1 ;+[80782] -1 x186 -1 x171 >= -1 ;+[80782] -1 x186 -1 x172 >= -1 ;+[80782] -1 x186 -1 x173 >= -1 ;+[80782] -1 x186 -1 x174 >= -1 ;+[80782] -1 x187 -1 x168 >= -1 ;+[80782] -1 x187 -1 x169 >= -1 ;+[80782] -1 x187 -1 x170 >= -1 ;+[80782] -1 x187 -1 x171 >= -1 ;+[80782] -1 x187 -1 x172 >= -1 ;+[80782] -1 x187 -1 x173 >= -1 ;+[80782] -1 x187 -1 x174 >= -1 ;+[80782] -1 x188 -1 x168 >= -1 ;+[80782] -1 x188 -1 x169 >= -1 ;+[80782] -1 x188 -1 x170 >= -1 ;+[80782] -1 x188 -1 x171 >= -1 ;+[80782] -1 x188 -1 x172 >= -1 ;+[80782] -1 x188 -1 x173 >= -1 ;+[80782] -1 x188 -1 x174 >= -1 ;+[80782] -1 x189 -1 x168 >= -1 ;+[80782] -1 x189 -1 x169 >= -1 ;+[80782] -1 x189 -1 x170 >= -1 ;+[80782] -1 x189 -1 x171 >= -1 ;+[80782] -1 x189 -1 x172 >= -1 ;+[80782] -1 x189 -1 x173 >= -1 ;+[80782] -1 x189 -1 x174 >= -1 ;+[80782] -1 x190 -1 x168 >= -1 ;+[80782] -1 x190 -1 x169 >= -1 ;+[80782] -1 x190 -1 x170 >= -1 ;+[80782] -1 x190 -1 x171 >= -1 ;+[80782] -1 x190 -1 x172 >= -1 ;+[80782] -1 x190 -1 x173 >= -1 ;+[80782] -1 x190 -1 x174 >= -1 ;+[80782] -1 x184 -1 x176 >= -1 ;+[80782] -1 x184 -1 x177 >= -1 ;+[80782] -1 x184 -1 x178 >= -1 ;+[80782] -1 x184 -1 x179 >= -1 ;+[80782] -1 x184 -1 x180 >= -1 ;+[80782] -1 x184 -1 x181 >= -1 ;+[80782] -1 x184 -1 x182 >= -1 ;+[80782] -1 x185 -1 x176 >= -1 ;+[80782] -1 x185 -1 x177 >= -1 ;+[80782] -1 x185 -1 x178 >= -1 ;+[80782] -1 x185 -1 x179 >= -1 ;+[80782] -1 x185 -1 x180 >= -1 ;+[80782] -1 x185 -1 x181 >= -1 ;+[80782] -1 x185 -1 x182 >= -1 ;+[80782] -1 x186 -1 x176 >= -1 ;+[80782] -1 x186 -1 x177 >= -1 ;+[80782] -1 x186 -1 x178 >= -1 ;+[80782] -1 x186 -1 x179 >= -1 ;+[80782] -1 x186 -1 x180 >= -1 ;+[80782] -1 x186 -1 x181 >= -1 ;+[80782] -1 x186 -1 x182 >= -1 ;+[80782] -1 x187 -1 x176 >= -1 ;+[80782] -1 x187 -1 x177 >= -1 ;+[80782] -1 x187 -1 x178 >= -1 ;+[80782] -1 x187 -1 x179 >= -1 ;+[80782] -1 x187 -1 x180 >= -1 ;+[80782] -1 x187 -1 x181 >= -1 ;+[80782] -1 x187 -1 x182 >= -1 ;+[80782] -1 x188 -1 x176 >= -1 ;+[80782] -1 x188 -1 x177 >= -1 ;+[80782] -1 x188 -1 x178 >= -1 ;+[80782] -1 x188 -1 x179 >= -1 ;+[80782] -1 x188 -1 x180 >= -1 ;+[80782] -1 x188 -1 x181 >= -1 ;+[80782] -1 x188 -1 x182 >= -1 ;+[80782] -1 x189 -1 x176 >= -1 ;+[80782] -1 x189 -1 x177 >= -1 ;+[80782] -1 x189 -1 x178 >= -1 ;+[80782] -1 x189 -1 x179 >= -1 ;+[80782] -1 x189 -1 x180 >= -1 ;+[80782] -1 x189 -1 x181 >= -1 ;+[80782] -1 x189 -1 x182 >= -1 ;+[80782] -1 x190 -1 x176 >= -1 ;+[80782] -1 x190 -1 x177 >= -1 ;+[80782] -1 x190 -1 x178 >= -1 ;+[80782] -1 x190 -1 x179 >= -1 ;+[80782] -1 x190 -1 x180 >= -1 ;+[80782] -1 x190 -1 x181 >= -1 ;+[80782] -1 x190 -1 x182 >= -1 ;+[80782] -1 x197 -1 x195 >= -1 ;+[80782] -1 x199 -1 x195 >= -1 ;+[80782] -1 x207 -1 x195 >= -1 ;+[80782] -1 x208 -1 x195 >= -1 ;+[80782] -1 x209 -1 x195 >= -1 ;+[80782] -1 x210 -1 x195 >= -1 ;+[80782] -1 x211 -1 x195 >= -1 ;+[80782] -1 x212 -1 x195 >= -1 ;+[80782] -1 x213 -1 x195 >= -1 ;+[80782] -1 x215 -1 x195 >= -1 ;+[80782] -1 x216 -1 x195 >= -1 ;+[80782] -1 x217 -1 x195 >= -1 ;+[80782] -1 x218 -1 x195 >= -1 ;+[80782] -1 x219 -1 x195 >= -1 ;+[80782] -1 x220 -1 x195 >= -1 ;+[80782] -1 x221 -1 x195 >= -1 ;+[80782] -1 x223 -1 x195 >= -1 ;+[80782] -1 x224 -1 x195 >= -1 ;+[80782] -1 x225 -1 x195 >= -1 ;+[80782] -1 x226 -1 x195 >= -1 ;+[80782] -1 x227 -1 x195 >= -1 ;+[80782] -1 x228 -1 x195 >= -1 ;+[80782] -1 x229 -1 x195 >= -1 ;+[80782] -1 x231 -1 x195 >= -1 ;+[80782] -1 x232 -1 x195 >= -1 ;+[80782] -1 x233 -1 x195 >= -1 ;+[80782] -1 x234 -1 x195 >= -1 ;+[80782] -1 x235 -1 x195 >= -1 ;+[80782] -1 x236 -1 x195 >= -1 ;+[80782] -1 x237 -1 x195 >= -1 ;+[80782] -1 x239 -1 x195 >= -1 ;+[80782] -1 x240 -1 x195 >= -1 ;+[80782] -1 x241 -1 x195 >= -1 ;+[80782] -1 x242 -1 x195 >= -1 ;+[80782] -1 x243 -1 x195 >= -1 ;+[80782] -1 x244 -1 x195 >= -1 ;+[80782] -1 x245 -1 x195 >= -1 ;+[80782] -1 x247 -1 x195 >= -1 ;+[80782] -1 x248 -1 x195 >= -1 ;+[80782] -1 x249 -1 x195 >= -1 ;+[80782] -1 x250 -1 x195 >= -1 ;+[80782] -1 x251 -1 x195 >= -1 ;+[80782] -1 x252 -1 x195 >= -1 ;+[80782] -1 x253 -1 x195 >= -1 ;+[80782] -1 x263 -1 x195 >= -1 ;+[80782] -1 x264 -1 x195 >= -1 ;+[80782] -1 x199 -1 x197 >= -1 ;+[80782] -1 x207 -1 x197 >= -1 ;+[80782] -1 x208 -1 x197 >= -1 ;+[80782] -1 x209 -1 x197 >= -1 ;+[80782] -1 x210 -1 x197 >= -1 ;+[80782] -1 x211 -1 x197 >= -1 ;+[80782] -1 x212 -1 x197 >= -1 ;+[80782] -1 x213 -1 x197 >= -1 ;+[80782] -1 x215 -1 x197 >= -1 ;+[80782] -1 x216 -1 x197 >= -1 ;+[80782] -1 x217 -1 x197 >= -1 ;+[80782] -1 x218 -1 x197 >= -1 ;+[80782] -1 x219 -1 x197 >= -1 ;+[80782] -1 x220 -1 x197 >= -1 ;+[80782] -1 x221 -1 x197 >= -1 ;+[80782] -1 x223 -1 x197 >= -1 ;+[80782] -1 x224 -1 x197 >= -1 ;+[80782] -1 x225 -1 x197 >= -1 ;+[80782] -1 x226 -1 x197 >= -1 ;+[80782] -1 x227 -1 x197 >= -1 ;+[80782] -1 x228 -1 x197 >= -1 ;+[80782] -1 x229 -1 x197 >= -1 ;+[80782] -1 x231 -1 x197 >= -1 ;+[80782] -1 x232 -1 x197 >= -1 ;+[80782] -1 x233 -1 x197 >= -1 ;+[80782] -1 x234 -1 x197 >= -1 ;+[80782] -1 x235 -1 x197 >= -1 ;+[80782] -1 x236 -1 x197 >= -1 ;+[80782] -1 x237 -1 x197 >= -1 ;+[80782] -1 x247 -1 x197 >= -1 ;+[80782] -1 x248 -1 x197 >= -1 ;+[80782] -1 x249 -1 x197 >= -1 ;+[80782] -1 x250 -1 x197 >= -1 ;+[80782] -1 x251 -1 x197 >= -1 ;+[80782] -1 x252 -1 x197 >= -1 ;+[80782] -1 x253 -1 x197 >= -1 ;+[80782] -1 x255 -1 x197 >= -1 ;+[80782] -1 x256 -1 x197 >= -1 ;+[80782] -1 x257 -1 x197 >= -1 ;+[80782] -1 x258 -1 x197 >= -1 ;+[80782] -1 x259 -1 x197 >= -1 ;+[80782] -1 x260 -1 x197 >= -1 ;+[80782] -1 x261 -1 x197 >= -1 ;+[80782] -1 x263 -1 x197 >= -1 ;+[80782] -1 x264 -1 x197 >= -1 ;+[80782] -1 x207 -1 x199 >= -1 ;+[80782] -1 x208 -1 x199 >= -1 ;+[80782] -1 x209 -1 x199 >= -1 ;+[80782] -1 x210 -1 x199 >= -1 ;+[80782] -1 x211 -1 x199 >= -1 ;+[80782] -1 x212 -1 x199 >= -1 ;+[80782] -1 x213 -1 x199 >= -1 ;+[80782] -1 x215 -1 x199 >= -1 ;+[80782] -1 x216 -1 x199 >= -1 ;+[80782] -1 x217 -1 x199 >= -1 ;+[80782] -1 x218 -1 x199 >= -1 ;+[80782] -1 x219 -1 x199 >= -1 ;+[80782] -1 x220 -1 x199 >= -1 ;+[80782] -1 x221 -1 x199 >= -1 ;+[80782] -1 x223 -1 x199 >= -1 ;+[80782] -1 x224 -1 x199 >= -1 ;+[80782] -1 x225 -1 x199 >= -1 ;+[80782] -1 x226 -1 x199 >= -1 ;+[80782] -1 x227 -1 x199 >= -1 ;+[80782] -1 x228 -1 x199 >= -1 ;+[80782] -1 x229 -1 x199 >= -1 ;+[80782] -1 x239 -1 x199 >= -1 ;+[80782] -1 x240 -1 x199 >= -1 ;+[80782] -1 x241 -1 x199 >= -1 ;+[80782] -1 x242 -1 x199 >= -1 ;+[80782] -1 x243 -1 x199 >= -1 ;+[80782] -1 x244 -1 x199 >= -1 ;+[80782] -1 x245 -1 x199 >= -1 ;+[80782] -1 x247 -1 x199 >= -1 ;+[80782] -1 x248 -1 x199 >= -1 ;+[80782] -1 x249 -1 x199 >= -1 ;+[80782] -1 x250 -1 x199 >= -1 ;+[80782] -1 x251 -1 x199 >= -1 ;+[80782] -1 x252 -1 x199 >= -1 ;+[80782] -1 x253 -1 x199 >= -1 ;+[80782] -1 x255 -1 x199 >= -1 ;+[80782] -1 x256 -1 x199 >= -1 ;+[80782] -1 x257 -1 x199 >= -1 ;+[80782] -1 x258 -1 x199 >= -1 ;+[80782] -1 x259 -1 x199 >= -1 ;+[80782] -1 x260 -1 x199 >= -1 ;+[80782] -1 x261 -1 x199 >= -1 ;+[80782] -1 x263 -1 x199 >= -1 ;+[80782] -1 x264 -1 x199 >= -1 ;+[80782] -1 x263 -1 x204 >= -1 ;+[80782] -1 x263 -1 x205 >= -1 ;+[80782] -1 x264 -1 x204 >= -1 ;+[80782] -1 x264 -1 x205 >= -1 ;+[80782] -1 x215 -1 x207 >= -1 ;+[80782] -1 x215 -1 x208 >= -1 ;+[80782] -1 x215 -1 x209 >= -1 ;+[80782] -1 x215 -1 x210 >= -1 ;+[80782] -1 x215 -1 x211 >= -1 ;+[80782] -1 x215 -1 x212 >= -1 ;+[80782] -1 x215 -1 x213 >= -1 ;+[80782] -1 x216 -1 x207 >= -1 ;+[80782] -1 x216 -1 x208 >= -1 ;+[80782] -1 x216 -1 x209 >= -1 ;+[80782] -1 x216 -1 x210 >= -1 ;+[80782] -1 x216 -1 x211 >= -1 ;+[80782] -1 x216 -1 x212 >= -1 ;+[80782] -1 x216 -1 x213 >= -1 ;+[80782] -1 x217 -1 x207 >= -1 ;+[80782] -1 x217 -1 x208 >= -1 ;+[80782] -1 x217 -1 x209 >= -1 ;+[80782] -1 x217 -1 x210 >= -1 ;+[80782] -1 x217 -1 x211 >= -1 ;+[80782] -1 x217 -1 x212 >= -1 ;+[80782] -1 x217 -1 x213 >= -1 ;+[80782] -1 x218 -1 x207 >= -1 ;+[80782] -1 x218 -1 x208 >= -1 ;+[80782] -1 x218 -1 x209 >= -1 ;+[80782] -1 x218 -1 x210 >= -1 ;+[80782] -1 x218 -1 x211 >= -1 ;+[80782] -1 x218 -1 x212 >= -1 ;+[80782] -1 x218 -1 x213 >= -1 ;+[80782] -1 x219 -1 x207 >= -1 ;+[80782] -1 x219 -1 x208 >= -1 ;+[80782] -1 x219 -1 x209 >= -1 ;+[80782] -1 x219 -1 x210 >= -1 ;+[80782] -1 x219 -1 x211 >= -1 ;+[80782] -1 x219 -1 x212 >= -1 ;+[80782] -1 x219 -1 x213 >= -1 ;+[80782] -1 x220 -1 x207 >= -1 ;+[80782] -1 x220 -1 x208 >= -1 ;+[80782] -1 x220 -1 x209 >= -1 ;+[80782] -1 x220 -1 x210 >= -1 ;+[80782] -1 x220 -1 x211 >= -1 ;+[80782] -1 x220 -1 x212 >= -1 ;+[80782] -1 x220 -1 x213 >= -1 ;+[80782] -1 x221 -1 x207 >= -1 ;+[80782] -1 x221 -1 x208 >= -1 ;+[80782] -1 x221 -1 x209 >= -1 ;+[80782] -1 x221 -1 x210 >= -1 ;+[80782] -1 x221 -1 x211 >= -1 ;+[80782] -1 x221 -1 x212 >= -1 ;+[80782] -1 x221 -1 x213 >= -1 ;+[80782] -1 x223 -1 x207 >= -1 ;+[80782] -1 x223 -1 x208 >= -1 ;+[80782] -1 x223 -1 x209 >= -1 ;+[80782] -1 x223 -1 x210 >= -1 ;+[80782] -1 x223 -1 x211 >= -1 ;+[80782] -1 x223 -1 x212 >= -1 ;+[80782] -1 x223 -1 x213 >= -1 ;+[80782] -1 x224 -1 x207 >= -1 ;+[80782] -1 x224 -1 x208 >= -1 ;+[80782] -1 x224 -1 x209 >= -1 ;+[80782] -1 x224 -1 x210 >= -1 ;+[80782] -1 x224 -1 x211 >= -1 ;+[80782] -1 x224 -1 x212 >= -1 ;+[80782] -1 x224 -1 x213 >= -1 ;+[80782] -1 x225 -1 x207 >= -1 ;+[80782] -1 x225 -1 x208 >= -1 ;+[80782] -1 x225 -1 x209 >= -1 ;+[80782] -1 x225 -1 x210 >= -1 ;+[80782] -1 x225 -1 x211 >= -1 ;+[80782] -1 x225 -1 x212 >= -1 ;+[80782] -1 x225 -1 x213 >= -1 ;+[80782] -1 x226 -1 x207 >= -1 ;+[80782] -1 x226 -1 x208 >= -1 ;+[80782] -1 x226 -1 x209 >= -1 ;+[80782] -1 x226 -1 x210 >= -1 ;+[80782] -1 x226 -1 x211 >= -1 ;+[80782] -1 x226 -1 x212 >= -1 ;+[80782] -1 x226 -1 x213 >= -1 ;+[80782] -1 x227 -1 x207 >= -1 ;+[80782] -1 x227 -1 x208 >= -1 ;+[80782] -1 x227 -1 x209 >= -1 ;+[80782] -1 x227 -1 x210 >= -1 ;+[80782] -1 x227 -1 x211 >= -1 ;+[80782] -1 x227 -1 x212 >= -1 ;+[80782] -1 x227 -1 x213 >= -1 ;+[80782] -1 x228 -1 x207 >= -1 ;+[80782] -1 x228 -1 x208 >= -1 ;+[80782] -1 x228 -1 x209 >= -1 ;+[80782] -1 x228 -1 x210 >= -1 ;+[80782] -1 x228 -1 x211 >= -1 ;+[80782] -1 x228 -1 x212 >= -1 ;+[80782] -1 x228 -1 x213 >= -1 ;+[80782] -1 x229 -1 x207 >= -1 ;+[80782] -1 x229 -1 x208 >= -1 ;+[80782] -1 x229 -1 x209 >= -1 ;+[80782] -1 x229 -1 x210 >= -1 ;+[80782] -1 x229 -1 x211 >= -1 ;+[80782] -1 x229 -1 x212 >= -1 ;+[80782] -1 x229 -1 x213 >= -1 ;+[80782] -1 x231 -1 x207 >= -1 ;+[80782] -1 x231 -1 x208 >= -1 ;+[80782] -1 x231 -1 x209 >= -1 ;+[80782] -1 x231 -1 x210 >= -1 ;+[80782] -1 x231 -1 x211 >= -1 ;+[80782] -1 x231 -1 x212 >= -1 ;+[80782] -1 x231 -1 x213 >= -1 ;+[80782] -1 x232 -1 x207 >= -1 ;+[80782] -1 x232 -1 x208 >= -1 ;+[80782] -1 x232 -1 x209 >= -1 ;+[80782] -1 x232 -1 x210 >= -1 ;+[80782] -1 x232 -1 x211 >= -1 ;+[80782] -1 x232 -1 x212 >= -1 ;+[80782] -1 x232 -1 x213 >= -1 ;+[80782] -1 x233 -1 x207 >= -1 ;+[80782] -1 x233 -1 x208 >= -1 ;+[80782] -1 x233 -1 x209 >= -1 ;+[80782] -1 x233 -1 x210 >= -1 ;+[80782] -1 x233 -1 x211 >= -1 ;+[80782] -1 x233 -1 x212 >= -1 ;+[80782] -1 x233 -1 x213 >= -1 ;+[80782] -1 x234 -1 x207 >= -1 ;+[80782] -1 x234 -1 x208 >= -1 ;+[80782] -1 x234 -1 x209 >= -1 ;+[80782] -1 x234 -1 x210 >= -1 ;+[80782] -1 x234 -1 x211 >= -1 ;+[80782] -1 x234 -1 x212 >= -1 ;+[80782] -1 x234 -1 x213 >= -1 ;+[80782] -1 x235 -1 x207 >= -1 ;+[80782] -1 x235 -1 x208 >= -1 ;+[80782] -1 x235 -1 x209 >= -1 ;+[80782] -1 x235 -1 x210 >= -1 ;+[80782] -1 x235 -1 x211 >= -1 ;+[80782] -1 x235 -1 x212 >= -1 ;+[80782] -1 x235 -1 x213 >= -1 ;+[80782] -1 x236 -1 x207 >= -1 ;+[80782] -1 x236 -1 x208 >= -1 ;+[80782] -1 x236 -1 x209 >= -1 ;+[80782] -1 x236 -1 x210 >= -1 ;+[80782] -1 x236 -1 x211 >= -1 ;+[80782] -1 x236 -1 x212 >= -1 ;+[80782] -1 x236 -1 x213 >= -1 ;+[80782] -1 x237 -1 x207 >= -1 ;+[80782] -1 x237 -1 x208 >= -1 ;+[80782] -1 x237 -1 x209 >= -1 ;+[80782] -1 x237 -1 x210 >= -1 ;+[80782] -1 x237 -1 x211 >= -1 ;+[80782] -1 x237 -1 x212 >= -1 ;+[80782] -1 x237 -1 x213 >= -1 ;+[80782] -1 x239 -1 x207 >= -1 ;+[80782] -1 x239 -1 x208 >= -1 ;+[80782] -1 x239 -1 x209 >= -1 ;+[80782] -1 x239 -1 x210 >= -1 ;+[80782] -1 x239 -1 x211 >= -1 ;+[80782] -1 x239 -1 x212 >= -1 ;+[80782] -1 x239 -1 x213 >= -1 ;+[80782] -1 x240 -1 x207 >= -1 ;+[80782] -1 x240 -1 x208 >= -1 ;+[80782] -1 x240 -1 x209 >= -1 ;+[80782] -1 x240 -1 x210 >= -1 ;+[80782] -1 x240 -1 x211 >= -1 ;+[80782] -1 x240 -1 x212 >= -1 ;+[80782] -1 x240 -1 x213 >= -1 ;+[80782] -1 x241 -1 x207 >= -1 ;+[80782] -1 x241 -1 x208 >= -1 ;+[80782] -1 x241 -1 x209 >= -1 ;+[80782] -1 x241 -1 x210 >= -1 ;+[80782] -1 x241 -1 x211 >= -1 ;+[80782] -1 x241 -1 x212 >= -1 ;+[80782] -1 x241 -1 x213 >= -1 ;+[80782] -1 x242 -1 x207 >= -1 ;+[80782] -1 x242 -1 x208 >= -1 ;+[80782] -1 x242 -1 x209 >= -1 ;+[80782] -1 x242 -1 x210 >= -1 ;+[80782] -1 x242 -1 x211 >= -1 ;+[80782] -1 x242 -1 x212 >= -1 ;+[80782] -1 x242 -1 x213 >= -1 ;+[80782] -1 x243 -1 x207 >= -1 ;+[80782] -1 x243 -1 x208 >= -1 ;+[80782] -1 x243 -1 x209 >= -1 ;+[80782] -1 x243 -1 x210 >= -1 ;+[80782] -1 x243 -1 x211 >= -1 ;+[80782] -1 x243 -1 x212 >= -1 ;+[80782] -1 x243 -1 x213 >= -1 ;+[80782] -1 x244 -1 x207 >= -1 ;+[80782] -1 x244 -1 x208 >= -1 ;+[80782] -1 x244 -1 x209 >= -1 ;+[80782] -1 x244 -1 x210 >= -1 ;+[80782] -1 x244 -1 x211 >= -1 ;+[80782] -1 x244 -1 x212 >= -1 ;+[80782] -1 x244 -1 x213 >= -1 ;+[80782] -1 x245 -1 x207 >= -1 ;+[80782] -1 x245 -1 x208 >= -1 ;+[80782] -1 x245 -1 x209 >= -1 ;+[80782] -1 x245 -1 x210 >= -1 ;+[80782] -1 x245 -1 x211 >= -1 ;+[80782] -1 x245 -1 x212 >= -1 ;+[80782] -1 x245 -1 x213 >= -1 ;+[80782] -1 x247 -1 x207 >= -1 ;+[80782] -1 x247 -1 x208 >= -1 ;+[80782] -1 x247 -1 x209 >= -1 ;+[80782] -1 x247 -1 x210 >= -1 ;+[80782] -1 x247 -1 x211 >= -1 ;+[80782] -1 x247 -1 x212 >= -1 ;+[80782] -1 x247 -1 x213 >= -1 ;+[80782] -1 x248 -1 x207 >= -1 ;+[80782] -1 x248 -1 x208 >= -1 ;+[80782] -1 x248 -1 x209 >= -1 ;+[80782] -1 x248 -1 x210 >= -1 ;+[80782] -1 x248 -1 x211 >= -1 ;+[80782] -1 x248 -1 x212 >= -1 ;+[80782] -1 x248 -1 x213 >= -1 ;+[80782] -1 x249 -1 x207 >= -1 ;+[80782] -1 x249 -1 x208 >= -1 ;+[80782] -1 x249 -1 x209 >= -1 ;+[80782] -1 x249 -1 x210 >= -1 ;+[80782] -1 x249 -1 x211 >= -1 ;+[80782] -1 x249 -1 x212 >= -1 ;+[80782] -1 x249 -1 x213 >= -1 ;+[80782] -1 x250 -1 x207 >= -1 ;+[80782] -1 x250 -1 x208 >= -1 ;+[80782] -1 x250 -1 x209 >= -1 ;+[80782] -1 x250 -1 x210 >= -1 ;+[80782] -1 x250 -1 x211 >= -1 ;+[80782] -1 x250 -1 x212 >= -1 ;+[80782] -1 x250 -1 x213 >= -1 ;+[80782] -1 x251 -1 x207 >= -1 ;+[80782] -1 x251 -1 x208 >= -1 ;+[80782] -1 x251 -1 x209 >= -1 ;+[80782] -1 x251 -1 x210 >= -1 ;+[80782] -1 x251 -1 x211 >= -1 ;+[80782] -1 x251 -1 x212 >= -1 ;+[80782] -1 x251 -1 x213 >= -1 ;+[80782] -1 x252 -1 x207 >= -1 ;+[80782] -1 x252 -1 x208 >= -1 ;+[80782] -1 x252 -1 x209 >= -1 ;+[80782] -1 x252 -1 x210 >= -1 ;+[80782] -1 x252 -1 x211 >= -1 ;+[80782] -1 x252 -1 x212 >= -1 ;+[80782] -1 x252 -1 x213 >= -1 ;+[80782] -1 x253 -1 x207 >= -1 ;+[80782] -1 x253 -1 x208 >= -1 ;+[80782] -1 x253 -1 x209 >= -1 ;+[80782] -1 x253 -1 x210 >= -1 ;+[80782] -1 x253 -1 x211 >= -1 ;+[80782] -1 x253 -1 x212 >= -1 ;+[80782] -1 x253 -1 x213 >= -1 ;+[80782] -1 x255 -1 x207 >= -1 ;+[80782] -1 x255 -1 x208 >= -1 ;+[80782] -1 x255 -1 x209 >= -1 ;+[80782] -1 x255 -1 x210 >= -1 ;+[80782] -1 x255 -1 x211 >= -1 ;+[80782] -1 x255 -1 x212 >= -1 ;+[80782] -1 x255 -1 x213 >= -1 ;+[80782] -1 x256 -1 x207 >= -1 ;+[80782] -1 x256 -1 x208 >= -1 ;+[80782] -1 x256 -1 x209 >= -1 ;+[80782] -1 x256 -1 x210 >= -1 ;+[80782] -1 x256 -1 x211 >= -1 ;+[80782] -1 x256 -1 x212 >= -1 ;+[80782] -1 x256 -1 x213 >= -1 ;+[80782] -1 x257 -1 x207 >= -1 ;+[80782] -1 x257 -1 x208 >= -1 ;+[80782] -1 x257 -1 x209 >= -1 ;+[80782] -1 x257 -1 x210 >= -1 ;+[80782] -1 x257 -1 x211 >= -1 ;+[80782] -1 x257 -1 x212 >= -1 ;+[80782] -1 x257 -1 x213 >= -1 ;+[80782] -1 x258 -1 x207 >= -1 ;+[80782] -1 x258 -1 x208 >= -1 ;+[80782] -1 x258 -1 x209 >= -1 ;+[80782] -1 x258 -1 x210 >= -1 ;+[80782] -1 x258 -1 x211 >= -1 ;+[80782] -1 x258 -1 x212 >= -1 ;+[80782] -1 x258 -1 x213 >= -1 ;+[80782] -1 x259 -1 x207 >= -1 ;+[80782] -1 x259 -1 x208 >= -1 ;+[80782] -1 x259 -1 x209 >= -1 ;+[80782] -1 x259 -1 x210 >= -1 ;+[80782] -1 x259 -1 x211 >= -1 ;+[80782] -1 x259 -1 x212 >= -1 ;+[80782] -1 x259 -1 x213 >= -1 ;+[80782] -1 x260 -1 x207 >= -1 ;+[80782] -1 x260 -1 x208 >= -1 ;+[80782] -1 x260 -1 x209 >= -1 ;+[80782] -1 x260 -1 x210 >= -1 ;+[80782] -1 x260 -1 x211 >= -1 ;+[80782] -1 x260 -1 x212 >= -1 ;+[80782] -1 x260 -1 x213 >= -1 ;+[80782] -1 x261 -1 x207 >= -1 ;+[80782] -1 x261 -1 x208 >= -1 ;+[80782] -1 x261 -1 x209 >= -1 ;+[80782] -1 x261 -1 x210 >= -1 ;+[80782] -1 x261 -1 x211 >= -1 ;+[80782] -1 x261 -1 x212 >= -1 ;+[80782] -1 x261 -1 x213 >= -1 ;+[80782] -1 x223 -1 x215 >= -1 ;+[80782] -1 x223 -1 x216 >= -1 ;+[80782] -1 x223 -1 x217 >= -1 ;+[80782] -1 x223 -1 x218 >= -1 ;+[80782] -1 x223 -1 x219 >= -1 ;+[80782] -1 x223 -1 x220 >= -1 ;+[80782] -1 x223 -1 x221 >= -1 ;+[80782] -1 x224 -1 x215 >= -1 ;+[80782] -1 x224 -1 x216 >= -1 ;+[80782] -1 x224 -1 x217 >= -1 ;+[80782] -1 x224 -1 x218 >= -1 ;+[80782] -1 x224 -1 x219 >= -1 ;+[80782] -1 x224 -1 x220 >= -1 ;+[80782] -1 x224 -1 x221 >= -1 ;+[80782] -1 x225 -1 x215 >= -1 ;+[80782] -1 x225 -1 x216 >= -1 ;+[80782] -1 x225 -1 x217 >= -1 ;+[80782] -1 x225 -1 x218 >= -1 ;+[80782] -1 x225 -1 x219 >= -1 ;+[80782] -1 x225 -1 x220 >= -1 ;+[80782] -1 x225 -1 x221 >= -1 ;+[80782] -1 x226 -1 x215 >= -1 ;+[80782] -1 x226 -1 x216 >= -1 ;+[80782] -1 x226 -1 x217 >= -1 ;+[80782] -1 x226 -1 x218 >= -1 ;+[80782] -1 x226 -1 x219 >= -1 ;+[80782] -1 x226 -1 x220 >= -1 ;+[80782] -1 x226 -1 x221 >= -1 ;+[80782] -1 x227 -1 x215 >= -1 ;+[80782] -1 x227 -1 x216 >= -1 ;+[80782] -1 x227 -1 x217 >= -1 ;+[80782] -1 x227 -1 x218 >= -1 ;+[80782] -1 x227 -1 x219 >= -1 ;+[80782] -1 x227 -1 x220 >= -1 ;+[80782] -1 x227 -1 x221 >= -1 ;+[80782] -1 x228 -1 x215 >= -1 ;+[80782] -1 x228 -1 x216 >= -1 ;+[80782] -1 x228 -1 x217 >= -1 ;+[80782] -1 x228 -1 x218 >= -1 ;+[80782] -1 x228 -1 x219 >= -1 ;+[80782] -1 x228 -1 x220 >= -1 ;+[80782] -1 x228 -1 x221 >= -1 ;+[80782] -1 x229 -1 x215 >= -1 ;+[80782] -1 x229 -1 x216 >= -1 ;+[80782] -1 x229 -1 x217 >= -1 ;+[80782] -1 x229 -1 x218 >= -1 ;+[80782] -1 x229 -1 x219 >= -1 ;+[80782] -1 x229 -1 x220 >= -1 ;+[80782] -1 x229 -1 x221 >= -1 ;+[80782] -1 x231 -1 x215 >= -1 ;+[80782] -1 x231 -1 x216 >= -1 ;+[80782] -1 x231 -1 x217 >= -1 ;+[80782] -1 x231 -1 x218 >= -1 ;+[80782] -1 x231 -1 x219 >= -1 ;+[80782] -1 x231 -1 x220 >= -1 ;+[80782] -1 x231 -1 x221 >= -1 ;+[80782] -1 x232 -1 x215 >= -1 ;+[80782] -1 x232 -1 x216 >= -1 ;+[80782] -1 x232 -1 x217 >= -1 ;+[80782] -1 x232 -1 x218 >= -1 ;+[80782] -1 x232 -1 x219 >= -1 ;+[80782] -1 x232 -1 x220 >= -1 ;+[80782] -1 x232 -1 x221 >= -1 ;+[80782] -1 x233 -1 x215 >= -1 ;+[80782] -1 x233 -1 x216 >= -1 ;+[80782] -1 x233 -1 x217 >= -1 ;+[80782] -1 x233 -1 x218 >= -1 ;+[80782] -1 x233 -1 x219 >= -1 ;+[80782] -1 x233 -1 x220 >= -1 ;+[80782] -1 x233 -1 x221 >= -1 ;+[80782] -1 x234 -1 x215 >= -1 ;+[80782] -1 x234 -1 x216 >= -1 ;+[80782] -1 x234 -1 x217 >= -1 ;+[80782] -1 x234 -1 x218 >= -1 ;+[80782] -1 x234 -1 x219 >= -1 ;+[80782] -1 x234 -1 x220 >= -1 ;+[80782] -1 x234 -1 x221 >= -1 ;+[80782] -1 x235 -1 x215 >= -1 ;+[80782] -1 x235 -1 x216 >= -1 ;+[80782] -1 x235 -1 x217 >= -1 ;+[80782] -1 x235 -1 x218 >= -1 ;+[80782] -1 x235 -1 x219 >= -1 ;+[80782] -1 x235 -1 x220 >= -1 ;+[80782] -1 x235 -1 x221 >= -1 ;+[80782] -1 x236 -1 x215 >= -1 ;+[80782] -1 x236 -1 x216 >= -1 ;+[80782] -1 x236 -1 x217 >= -1 ;+[80782] -1 x236 -1 x218 >= -1 ;+[80782] -1 x236 -1 x219 >= -1 ;+[80782] -1 x236 -1 x220 >= -1 ;+[80782] -1 x236 -1 x221 >= -1 ;+[80782] -1 x237 -1 x215 >= -1 ;+[80782] -1 x237 -1 x216 >= -1 ;+[80782] -1 x237 -1 x217 >= -1 ;+[80782] -1 x237 -1 x218 >= -1 ;+[80782] -1 x237 -1 x219 >= -1 ;+[80782] -1 x237 -1 x220 >= -1 ;+[80782] -1 x237 -1 x221 >= -1 ;+[80782] -1 x239 -1 x215 >= -1 ;+[80782] -1 x239 -1 x216 >= -1 ;+[80782] -1 x239 -1 x217 >= -1 ;+[80782] -1 x239 -1 x218 >= -1 ;+[80782] -1 x239 -1 x219 >= -1 ;+[80782] -1 x239 -1 x220 >= -1 ;+[80782] -1 x239 -1 x221 >= -1 ;+[80782] -1 x240 -1 x215 >= -1 ;+[80782] -1 x240 -1 x216 >= -1 ;+[80782] -1 x240 -1 x217 >= -1 ;+[80782] -1 x240 -1 x218 >= -1 ;+[80782] -1 x240 -1 x219 >= -1 ;+[80782] -1 x240 -1 x220 >= -1 ;+[80782] -1 x240 -1 x221 >= -1 ;+[80782] -1 x241 -1 x215 >= -1 ;+[80782] -1 x241 -1 x216 >= -1 ;+[80782] -1 x241 -1 x217 >= -1 ;+[80782] -1 x241 -1 x218 >= -1 ;+[80782] -1 x241 -1 x219 >= -1 ;+[80782] -1 x241 -1 x220 >= -1 ;+[80782] -1 x241 -1 x221 >= -1 ;+[80782] -1 x242 -1 x215 >= -1 ;+[80782] -1 x242 -1 x216 >= -1 ;+[80782] -1 x242 -1 x217 >= -1 ;+[80782] -1 x242 -1 x218 >= -1 ;+[80782] -1 x242 -1 x219 >= -1 ;+[80782] -1 x242 -1 x220 >= -1 ;+[80782] -1 x242 -1 x221 >= -1 ;+[80782] -1 x243 -1 x215 >= -1 ;+[80782] -1 x243 -1 x216 >= -1 ;+[80782] -1 x243 -1 x217 >= -1 ;+[80782] -1 x243 -1 x218 >= -1 ;+[80782] -1 x243 -1 x219 >= -1 ;+[80782] -1 x243 -1 x220 >= -1 ;+[80782] -1 x243 -1 x221 >= -1 ;+[80782] -1 x244 -1 x215 >= -1 ;+[80782] -1 x244 -1 x216 >= -1 ;+[80782] -1 x244 -1 x217 >= -1 ;+[80782] -1 x244 -1 x218 >= -1 ;+[80782] -1 x244 -1 x219 >= -1 ;+[80782] -1 x244 -1 x220 >= -1 ;+[80782] -1 x244 -1 x221 >= -1 ;+[80782] -1 x245 -1 x215 >= -1 ;+[80782] -1 x245 -1 x216 >= -1 ;+[80782] -1 x245 -1 x217 >= -1 ;+[80782] -1 x245 -1 x218 >= -1 ;+[80782] -1 x245 -1 x219 >= -1 ;+[80782] -1 x245 -1 x220 >= -1 ;+[80782] -1 x245 -1 x221 >= -1 ;+[80782] -1 x247 -1 x215 >= -1 ;+[80782] -1 x247 -1 x216 >= -1 ;+[80782] -1 x247 -1 x217 >= -1 ;+[80782] -1 x247 -1 x218 >= -1 ;+[80782] -1 x247 -1 x219 >= -1 ;+[80782] -1 x247 -1 x220 >= -1 ;+[80782] -1 x247 -1 x221 >= -1 ;+[80782] -1 x248 -1 x215 >= -1 ;+[80782] -1 x248 -1 x216 >= -1 ;+[80782] -1 x248 -1 x217 >= -1 ;+[80782] -1 x248 -1 x218 >= -1 ;+[80782] -1 x248 -1 x219 >= -1 ;+[80782] -1 x248 -1 x220 >= -1 ;+[80782] -1 x248 -1 x221 >= -1 ;+[80782] -1 x249 -1 x215 >= -1 ;+[80782] -1 x249 -1 x216 >= -1 ;+[80782] -1 x249 -1 x217 >= -1 ;+[80782] -1 x249 -1 x218 >= -1 ;+[80782] -1 x249 -1 x219 >= -1 ;+[80782] -1 x249 -1 x220 >= -1 ;+[80782] -1 x249 -1 x221 >= -1 ;+[80782] -1 x250 -1 x215 >= -1 ;+[80782] -1 x250 -1 x216 >= -1 ;+[80782] -1 x250 -1 x217 >= -1 ;+[80782] -1 x250 -1 x218 >= -1 ;+[80782] -1 x250 -1 x219 >= -1 ;+[80782] -1 x250 -1 x220 >= -1 ;+[80782] -1 x250 -1 x221 >= -1 ;+[80782] -1 x251 -1 x215 >= -1 ;+[80782] -1 x251 -1 x216 >= -1 ;+[80782] -1 x251 -1 x217 >= -1 ;+[80782] -1 x251 -1 x218 >= -1 ;+[80782] -1 x251 -1 x219 >= -1 ;+[80782] -1 x251 -1 x220 >= -1 ;+[80782] -1 x251 -1 x221 >= -1 ;+[80782] -1 x252 -1 x215 >= -1 ;+[80782] -1 x252 -1 x216 >= -1 ;+[80782] -1 x252 -1 x217 >= -1 ;+[80782] -1 x252 -1 x218 >= -1 ;+[80782] -1 x252 -1 x219 >= -1 ;+[80782] -1 x252 -1 x220 >= -1 ;+[80782] -1 x252 -1 x221 >= -1 ;+[80782] -1 x253 -1 x215 >= -1 ;+[80782] -1 x253 -1 x216 >= -1 ;+[80782] -1 x253 -1 x217 >= -1 ;+[80782] -1 x253 -1 x218 >= -1 ;+[80782] -1 x253 -1 x219 >= -1 ;+[80782] -1 x253 -1 x220 >= -1 ;+[80782] -1 x253 -1 x221 >= -1 ;+[80782] -1 x255 -1 x215 >= -1 ;+[80782] -1 x255 -1 x216 >= -1 ;+[80782] -1 x255 -1 x217 >= -1 ;+[80782] -1 x255 -1 x218 >= -1 ;+[80782] -1 x255 -1 x219 >= -1 ;+[80782] -1 x255 -1 x220 >= -1 ;+[80782] -1 x255 -1 x221 >= -1 ;+[80782] -1 x256 -1 x215 >= -1 ;+[80782] -1 x256 -1 x216 >= -1 ;+[80782] -1 x256 -1 x217 >= -1 ;+[80782] -1 x256 -1 x218 >= -1 ;+[80782] -1 x256 -1 x219 >= -1 ;+[80782] -1 x256 -1 x220 >= -1 ;+[80782] -1 x256 -1 x221 >= -1 ;+[80782] -1 x257 -1 x215 >= -1 ;+[80782] -1 x257 -1 x216 >= -1 ;+[80782] -1 x257 -1 x217 >= -1 ;+[80782] -1 x257 -1 x218 >= -1 ;+[80782] -1 x257 -1 x219 >= -1 ;+[80782] -1 x257 -1 x220 >= -1 ;+[80782] -1 x257 -1 x221 >= -1 ;+[80782] -1 x258 -1 x215 >= -1 ;+[80782] -1 x258 -1 x216 >= -1 ;+[80782] -1 x258 -1 x217 >= -1 ;+[80782] -1 x258 -1 x218 >= -1 ;+[80782] -1 x258 -1 x219 >= -1 ;+[80782] -1 x258 -1 x220 >= -1 ;+[80782] -1 x258 -1 x221 >= -1 ;+[80782] -1 x259 -1 x215 >= -1 ;+[80782] -1 x259 -1 x216 >= -1 ;+[80782] -1 x259 -1 x217 >= -1 ;+[80782] -1 x259 -1 x218 >= -1 ;+[80782] -1 x259 -1 x219 >= -1 ;+[80782] -1 x259 -1 x220 >= -1 ;+[80782] -1 x259 -1 x221 >= -1 ;+[80782] -1 x260 -1 x215 >= -1 ;+[80782] -1 x260 -1 x216 >= -1 ;+[80782] -1 x260 -1 x217 >= -1 ;+[80782] -1 x260 -1 x218 >= -1 ;+[80782] -1 x260 -1 x219 >= -1 ;+[80782] -1 x260 -1 x220 >= -1 ;+[80782] -1 x260 -1 x221 >= -1 ;+[80782] -1 x261 -1 x215 >= -1 ;+[80782] -1 x261 -1 x216 >= -1 ;+[80782] -1 x261 -1 x217 >= -1 ;+[80782] -1 x261 -1 x218 >= -1 ;+[80782] -1 x261 -1 x219 >= -1 ;+[80782] -1 x261 -1 x220 >= -1 ;+[80782] -1 x261 -1 x221 >= -1 ;+[80782] -1 x231 -1 x223 >= -1 ;+[80782] -1 x231 -1 x224 >= -1 ;+[80782] -1 x231 -1 x225 >= -1 ;+[80782] -1 x231 -1 x226 >= -1 ;+[80782] -1 x231 -1 x227 >= -1 ;+[80782] -1 x231 -1 x228 >= -1 ;+[80782] -1 x231 -1 x229 >= -1 ;+[80782] -1 x232 -1 x223 >= -1 ;+[80782] -1 x232 -1 x224 >= -1 ;+[80782] -1 x232 -1 x225 >= -1 ;+[80782] -1 x232 -1 x226 >= -1 ;+[80782] -1 x232 -1 x227 >= -1 ;+[80782] -1 x232 -1 x228 >= -1 ;+[80782] -1 x232 -1 x229 >= -1 ;+[80782] -1 x233 -1 x223 >= -1 ;+[80782] -1 x233 -1 x224 >= -1 ;+[80782] -1 x233 -1 x225 >= -1 ;+[80782] -1 x233 -1 x226 >= -1 ;+[80782] -1 x233 -1 x227 >= -1 ;+[80782] -1 x233 -1 x228 >= -1 ;+[80782] -1 x233 -1 x229 >= -1 ;+[80782] -1 x234 -1 x223 >= -1 ;+[80782] -1 x234 -1 x224 >= -1 ;+[80782] -1 x234 -1 x225 >= -1 ;+[80782] -1 x234 -1 x226 >= -1 ;+[80782] -1 x234 -1 x227 >= -1 ;+[80782] -1 x234 -1 x228 >= -1 ;+[80782] -1 x234 -1 x229 >= -1 ;+[80782] -1 x235 -1 x223 >= -1 ;+[80782] -1 x235 -1 x224 >= -1 ;+[80782] -1 x235 -1 x225 >= -1 ;+[80782] -1 x235 -1 x226 >= -1 ;+[80782] -1 x235 -1 x227 >= -1 ;+[80782] -1 x235 -1 x228 >= -1 ;+[80782] -1 x235 -1 x229 >= -1 ;+[80782] -1 x236 -1 x223 >= -1 ;+[80782] -1 x236 -1 x224 >= -1 ;+[80782] -1 x236 -1 x225 >= -1 ;+[80782] -1 x236 -1 x226 >= -1 ;+[80782] -1 x236 -1 x227 >= -1 ;+[80782] -1 x236 -1 x228 >= -1 ;+[80782] -1 x236 -1 x229 >= -1 ;+[80782] -1 x237 -1 x223 >= -1 ;+[80782] -1 x237 -1 x224 >= -1 ;+[80782] -1 x237 -1 x225 >= -1 ;+[80782] -1 x237 -1 x226 >= -1 ;+[80782] -1 x237 -1 x227 >= -1 ;+[80782] -1 x237 -1 x228 >= -1 ;+[80782] -1 x237 -1 x229 >= -1 ;+[80782] -1 x239 -1 x223 >= -1 ;+[80782] -1 x239 -1 x224 >= -1 ;+[80782] -1 x239 -1 x225 >= -1 ;+[80782] -1 x239 -1 x226 >= -1 ;+[80782] -1 x239 -1 x227 >= -1 ;+[80782] -1 x239 -1 x228 >= -1 ;+[80782] -1 x239 -1 x229 >= -1 ;+[80782] -1 x240 -1 x223 >= -1 ;+[80782] -1 x240 -1 x224 >= -1 ;+[80782] -1 x240 -1 x225 >= -1 ;+[80782] -1 x240 -1 x226 >= -1 ;+[80782] -1 x240 -1 x227 >= -1 ;+[80782] -1 x240 -1 x228 >= -1 ;+[80782] -1 x240 -1 x229 >= -1 ;+[80782] -1 x241 -1 x223 >= -1 ;+[80782] -1 x241 -1 x224 >= -1 ;+[80782] -1 x241 -1 x225 >= -1 ;+[80782] -1 x241 -1 x226 >= -1 ;+[80782] -1 x241 -1 x227 >= -1 ;+[80782] -1 x241 -1 x228 >= -1 ;+[80782] -1 x241 -1 x229 >= -1 ;+[80782] -1 x242 -1 x223 >= -1 ;+[80782] -1 x242 -1 x224 >= -1 ;+[80782] -1 x242 -1 x225 >= -1 ;+[80782] -1 x242 -1 x226 >= -1 ;+[80782] -1 x242 -1 x227 >= -1 ;+[80782] -1 x242 -1 x228 >= -1 ;+[80782] -1 x242 -1 x229 >= -1 ;+[80782] -1 x243 -1 x223 >= -1 ;+[80782] -1 x243 -1 x224 >= -1 ;+[80782] -1 x243 -1 x225 >= -1 ;+[80782] -1 x243 -1 x226 >= -1 ;+[80782] -1 x243 -1 x227 >= -1 ;+[80782] -1 x243 -1 x228 >= -1 ;+[80782] -1 x243 -1 x229 >= -1 ;+[80782] -1 x244 -1 x223 >= -1 ;+[80782] -1 x244 -1 x224 >= -1 ;+[80782] -1 x244 -1 x225 >= -1 ;+[80782] -1 x244 -1 x226 >= -1 ;+[80782] -1 x244 -1 x227 >= -1 ;+[80782] -1 x244 -1 x228 >= -1 ;+[80782] -1 x244 -1 x229 >= -1 ;+[80782] -1 x245 -1 x223 >= -1 ;+[80782] -1 x245 -1 x224 >= -1 ;+[80782] -1 x245 -1 x225 >= -1 ;+[80782] -1 x245 -1 x226 >= -1 ;+[80782] -1 x245 -1 x227 >= -1 ;+[80782] -1 x245 -1 x228 >= -1 ;+[80782] -1 x245 -1 x229 >= -1 ;+[80782] -1 x247 -1 x223 >= -1 ;+[80782] -1 x247 -1 x224 >= -1 ;+[80782] -1 x247 -1 x225 >= -1 ;+[80782] -1 x247 -1 x226 >= -1 ;+[80782] -1 x247 -1 x227 >= -1 ;+[80782] -1 x247 -1 x228 >= -1 ;+[80782] -1 x247 -1 x229 >= -1 ;+[80782] -1 x248 -1 x223 >= -1 ;+[80782] -1 x248 -1 x224 >= -1 ;+[80782] -1 x248 -1 x225 >= -1 ;+[80782] -1 x248 -1 x226 >= -1 ;+[80782] -1 x248 -1 x227 >= -1 ;+[80782] -1 x248 -1 x228 >= -1 ;+[80782] -1 x248 -1 x229 >= -1 ;+[80782] -1 x249 -1 x223 >= -1 ;+[80782] -1 x249 -1 x224 >= -1 ;+[80782] -1 x249 -1 x225 >= -1 ;+[80782] -1 x249 -1 x226 >= -1 ;+[80782] -1 x249 -1 x227 >= -1 ;+[80782] -1 x249 -1 x228 >= -1 ;+[80782] -1 x249 -1 x229 >= -1 ;+[80782] -1 x250 -1 x223 >= -1 ;+[80782] -1 x250 -1 x224 >= -1 ;+[80782] -1 x250 -1 x225 >= -1 ;+[80782] -1 x250 -1 x226 >= -1 ;+[80782] -1 x250 -1 x227 >= -1 ;+[80782] -1 x250 -1 x228 >= -1 ;+[80782] -1 x250 -1 x229 >= -1 ;+[80782] -1 x251 -1 x223 >= -1 ;+[80782] -1 x251 -1 x224 >= -1 ;+[80782] -1 x251 -1 x225 >= -1 ;+[80782] -1 x251 -1 x226 >= -1 ;+[80782] -1 x251 -1 x227 >= -1 ;+[80782] -1 x251 -1 x228 >= -1 ;+[80782] -1 x251 -1 x229 >= -1 ;+[80782] -1 x252 -1 x223 >= -1 ;+[80782] -1 x252 -1 x224 >= -1 ;+[80782] -1 x252 -1 x225 >= -1 ;+[80782] -1 x252 -1 x226 >= -1 ;+[80782] -1 x252 -1 x227 >= -1 ;+[80782] -1 x252 -1 x228 >= -1 ;+[80782] -1 x252 -1 x229 >= -1 ;+[80782] -1 x253 -1 x223 >= -1 ;+[80782] -1 x253 -1 x224 >= -1 ;+[80782] -1 x253 -1 x225 >= -1 ;+[80782] -1 x253 -1 x226 >= -1 ;+[80782] -1 x253 -1 x227 >= -1 ;+[80782] -1 x253 -1 x228 >= -1 ;+[80782] -1 x253 -1 x229 >= -1 ;+[80782] -1 x255 -1 x223 >= -1 ;+[80782] -1 x255 -1 x224 >= -1 ;+[80782] -1 x255 -1 x225 >= -1 ;+[80782] -1 x255 -1 x226 >= -1 ;+[80782] -1 x255 -1 x227 >= -1 ;+[80782] -1 x255 -1 x228 >= -1 ;+[80782] -1 x255 -1 x229 >= -1 ;+[80782] -1 x256 -1 x223 >= -1 ;+[80782] -1 x256 -1 x224 >= -1 ;+[80782] -1 x256 -1 x225 >= -1 ;+[80782] -1 x256 -1 x226 >= -1 ;+[80782] -1 x256 -1 x227 >= -1 ;+[80782] -1 x256 -1 x228 >= -1 ;+[80782] -1 x256 -1 x229 >= -1 ;+[80782] -1 x257 -1 x223 >= -1 ;+[80782] -1 x257 -1 x224 >= -1 ;+[80782] -1 x257 -1 x225 >= -1 ;+[80782] -1 x257 -1 x226 >= -1 ;+[80782] -1 x257 -1 x227 >= -1 ;+[80782] -1 x257 -1 x228 >= -1 ;+[80782] -1 x257 -1 x229 >= -1 ;+[80782] -1 x258 -1 x223 >= -1 ;+[80782] -1 x258 -1 x224 >= -1 ;+[80782] -1 x258 -1 x225 >= -1 ;+[80782] -1 x258 -1 x226 >= -1 ;+[80782] -1 x258 -1 x227 >= -1 ;+[80782] -1 x258 -1 x228 >= -1 ;+[80782] -1 x258 -1 x229 >= -1 ;+[80782] -1 x259 -1 x223 >= -1 ;+[80782] -1 x259 -1 x224 >= -1 ;+[80782] -1 x259 -1 x225 >= -1 ;+[80782] -1 x259 -1 x226 >= -1 ;+[80782] -1 x259 -1 x227 >= -1 ;+[80782] -1 x259 -1 x228 >= -1 ;+[80782] -1 x259 -1 x229 >= -1 ;+[80782] -1 x260 -1 x223 >= -1 ;+[80782] -1 x260 -1 x224 >= -1 ;+[80782] -1 x260 -1 x225 >= -1 ;+[80782] -1 x260 -1 x226 >= -1 ;+[80782] -1 x260 -1 x227 >= -1 ;+[80782] -1 x260 -1 x228 >= -1 ;+[80782] -1 x260 -1 x229 >= -1 ;+[80782] -1 x261 -1 x223 >= -1 ;+[80782] -1 x261 -1 x224 >= -1 ;+[80782] -1 x261 -1 x225 >= -1 ;+[80782] -1 x261 -1 x226 >= -1 ;+[80782] -1 x261 -1 x227 >= -1 ;+[80782] -1 x261 -1 x228 >= -1 ;+[80782] -1 x261 -1 x229 >= -1 ;+[80782] -1 x239 -1 x231 >= -1 ;+[80782] -1 x239 -1 x232 >= -1 ;+[80782] -1 x239 -1 x233 >= -1 ;+[80782] -1 x239 -1 x234 >= -1 ;+[80782] -1 x239 -1 x235 >= -1 ;+[80782] -1 x239 -1 x236 >= -1 ;+[80782] -1 x239 -1 x237 >= -1 ;+[80782] -1 x240 -1 x231 >= -1 ;+[80782] -1 x240 -1 x232 >= -1 ;+[80782] -1 x240 -1 x233 >= -1 ;+[80782] -1 x240 -1 x234 >= -1 ;+[80782] -1 x240 -1 x235 >= -1 ;+[80782] -1 x240 -1 x236 >= -1 ;+[80782] -1 x240 -1 x237 >= -1 ;+[80782] -1 x241 -1 x231 >= -1 ;+[80782] -1 x241 -1 x232 >= -1 ;+[80782] -1 x241 -1 x233 >= -1 ;+[80782] -1 x241 -1 x234 >= -1 ;+[80782] -1 x241 -1 x235 >= -1 ;+[80782] -1 x241 -1 x236 >= -1 ;+[80782] -1 x241 -1 x237 >= -1 ;+[80782] -1 x242 -1 x231 >= -1 ;+[80782] -1 x242 -1 x232 >= -1 ;+[80782] -1 x242 -1 x233 >= -1 ;+[80782] -1 x242 -1 x234 >= -1 ;+[80782] -1 x242 -1 x235 >= -1 ;+[80782] -1 x242 -1 x236 >= -1 ;+[80782] -1 x242 -1 x237 >= -1 ;+[80782] -1 x243 -1 x231 >= -1 ;+[80782] -1 x243 -1 x232 >= -1 ;+[80782] -1 x243 -1 x233 >= -1 ;+[80782] -1 x243 -1 x234 >= -1 ;+[80782] -1 x243 -1 x235 >= -1 ;+[80782] -1 x243 -1 x236 >= -1 ;+[80782] -1 x243 -1 x237 >= -1 ;+[80782] -1 x244 -1 x231 >= -1 ;+[80782] -1 x244 -1 x232 >= -1 ;+[80782] -1 x244 -1 x233 >= -1 ;+[80782] -1 x244 -1 x234 >= -1 ;+[80782] -1 x244 -1 x235 >= -1 ;+[80782] -1 x244 -1 x236 >= -1 ;+[80782] -1 x244 -1 x237 >= -1 ;+[80782] -1 x245 -1 x231 >= -1 ;+[80782] -1 x245 -1 x232 >= -1 ;+[80782] -1 x245 -1 x233 >= -1 ;+[80782] -1 x245 -1 x234 >= -1 ;+[80782] -1 x245 -1 x235 >= -1 ;+[80782] -1 x245 -1 x236 >= -1 ;+[80782] -1 x245 -1 x237 >= -1 ;+[80782] -1 x247 -1 x231 >= -1 ;+[80782] -1 x247 -1 x232 >= -1 ;+[80782] -1 x247 -1 x233 >= -1 ;+[80782] -1 x247 -1 x234 >= -1 ;+[80782] -1 x247 -1 x235 >= -1 ;+[80782] -1 x247 -1 x236 >= -1 ;+[80782] -1 x247 -1 x237 >= -1 ;+[80782] -1 x248 -1 x231 >= -1 ;+[80782] -1 x248 -1 x232 >= -1 ;+[80782] -1 x248 -1 x233 >= -1 ;+[80782] -1 x248 -1 x234 >= -1 ;+[80782] -1 x248 -1 x235 >= -1 ;+[80782] -1 x248 -1 x236 >= -1 ;+[80782] -1 x248 -1 x237 >= -1 ;+[80782] -1 x249 -1 x231 >= -1 ;+[80782] -1 x249 -1 x232 >= -1 ;+[80782] -1 x249 -1 x233 >= -1 ;+[80782] -1 x249 -1 x234 >= -1 ;+[80782] -1 x249 -1 x235 >= -1 ;+[80782] -1 x249 -1 x236 >= -1 ;+[80782] -1 x249 -1 x237 >= -1 ;+[80782] -1 x250 -1 x231 >= -1 ;+[80782] -1 x250 -1 x232 >= -1 ;+[80782] -1 x250 -1 x233 >= -1 ;+[80782] -1 x250 -1 x234 >= -1 ;+[80782] -1 x250 -1 x235 >= -1 ;+[80782] -1 x250 -1 x236 >= -1 ;+[80782] -1 x250 -1 x237 >= -1 ;+[80782] -1 x251 -1 x231 >= -1 ;+[80782] -1 x251 -1 x232 >= -1 ;+[80782] -1 x251 -1 x233 >= -1 ;+[80782] -1 x251 -1 x234 >= -1 ;+[80782] -1 x251 -1 x235 >= -1 ;+[80782] -1 x251 -1 x236 >= -1 ;+[80782] -1 x251 -1 x237 >= -1 ;+[80782] -1 x252 -1 x231 >= -1 ;+[80782] -1 x252 -1 x232 >= -1 ;+[80782] -1 x252 -1 x233 >= -1 ;+[80782] -1 x252 -1 x234 >= -1 ;+[80782] -1 x252 -1 x235 >= -1 ;+[80782] -1 x252 -1 x236 >= -1 ;+[80782] -1 x252 -1 x237 >= -1 ;+[80782] -1 x253 -1 x231 >= -1 ;+[80782] -1 x253 -1 x232 >= -1 ;+[80782] -1 x253 -1 x233 >= -1 ;+[80782] -1 x253 -1 x234 >= -1 ;+[80782] -1 x253 -1 x235 >= -1 ;+[80782] -1 x253 -1 x236 >= -1 ;+[80782] -1 x253 -1 x237 >= -1 ;+[80782] -1 x255 -1 x231 >= -1 ;+[80782] -1 x255 -1 x232 >= -1 ;+[80782] -1 x255 -1 x233 >= -1 ;+[80782] -1 x255 -1 x234 >= -1 ;+[80782] -1 x255 -1 x235 >= -1 ;+[80782] -1 x255 -1 x236 >= -1 ;+[80782] -1 x255 -1 x237 >= -1 ;+[80782] -1 x256 -1 x231 >= -1 ;+[80782] -1 x256 -1 x232 >= -1 ;+[80782] -1 x256 -1 x233 >= -1 ;+[80782] -1 x256 -1 x234 >= -1 ;+[80782] -1 x256 -1 x235 >= -1 ;+[80782] -1 x256 -1 x236 >= -1 ;+[80782] -1 x256 -1 x237 >= -1 ;+[80782] -1 x257 -1 x231 >= -1 ;+[80782] -1 x257 -1 x232 >= -1 ;+[80782] -1 x257 -1 x233 >= -1 ;+[80782] -1 x257 -1 x234 >= -1 ;+[80782] -1 x257 -1 x235 >= -1 ;+[80782] -1 x257 -1 x236 >= -1 ;+[80782] -1 x257 -1 x237 >= -1 ;+[80782] -1 x258 -1 x231 >= -1 ;+[80782] -1 x258 -1 x232 >= -1 ;+[80782] -1 x258 -1 x233 >= -1 ;+[80782] -1 x258 -1 x234 >= -1 ;+[80782] -1 x258 -1 x235 >= -1 ;+[80782] -1 x258 -1 x236 >= -1 ;+[80782] -1 x258 -1 x237 >= -1 ;+[80782] -1 x259 -1 x231 >= -1 ;+[80782] -1 x259 -1 x232 >= -1 ;+[80782] -1 x259 -1 x233 >= -1 ;+[80782] -1 x259 -1 x234 >= -1 ;+[80782] -1 x259 -1 x235 >= -1 ;+[80782] -1 x259 -1 x236 >= -1 ;+[80782] -1 x259 -1 x237 >= -1 ;+[80782] -1 x260 -1 x231 >= -1 ;+[80782] -1 x260 -1 x232 >= -1 ;+[80782] -1 x260 -1 x233 >= -1 ;+[80782] -1 x260 -1 x234 >= -1 ;+[80782] -1 x260 -1 x235 >= -1 ;+[80782] -1 x260 -1 x236 >= -1 ;+[80782] -1 x260 -1 x237 >= -1 ;+[80782] -1 x261 -1 x231 >= -1 ;+[80782] -1 x261 -1 x232 >= -1 ;+[80782] -1 x261 -1 x233 >= -1 ;+[80782] -1 x261 -1 x234 >= -1 ;+[80782] -1 x261 -1 x235 >= -1 ;+[80782] -1 x261 -1 x236 >= -1 ;+[80782] -1 x261 -1 x237 >= -1 ;+[80782] -1 x247 -1 x239 >= -1 ;+[80782] -1 x247 -1 x240 >= -1 ;+[80782] -1 x247 -1 x241 >= -1 ;+[80782] -1 x247 -1 x242 >= -1 ;+[80782] -1 x247 -1 x243 >= -1 ;+[80782] -1 x247 -1 x244 >= -1 ;+[80782] -1 x247 -1 x245 >= -1 ;+[80782] -1 x248 -1 x239 >= -1 ;+[80782] -1 x248 -1 x240 >= -1 ;+[80782] -1 x248 -1 x241 >= -1 ;+[80782] -1 x248 -1 x242 >= -1 ;+[80782] -1 x248 -1 x243 >= -1 ;+[80782] -1 x248 -1 x244 >= -1 ;+[80782] -1 x248 -1 x245 >= -1 ;+[80782] -1 x249 -1 x239 >= -1 ;+[80782] -1 x249 -1 x240 >= -1 ;+[80782] -1 x249 -1 x241 >= -1 ;+[80782] -1 x249 -1 x242 >= -1 ;+[80782] -1 x249 -1 x243 >= -1 ;+[80782] -1 x249 -1 x244 >= -1 ;+[80782] -1 x249 -1 x245 >= -1 ;+[80782] -1 x250 -1 x239 >= -1 ;+[80782] -1 x250 -1 x240 >= -1 ;+[80782] -1 x250 -1 x241 >= -1 ;+[80782] -1 x250 -1 x242 >= -1 ;+[80782] -1 x250 -1 x243 >= -1 ;+[80782] -1 x250 -1 x244 >= -1 ;+[80782] -1 x250 -1 x245 >= -1 ;+[80782] -1 x251 -1 x239 >= -1 ;+[80782] -1 x251 -1 x240 >= -1 ;+[80782] -1 x251 -1 x241 >= -1 ;+[80782] -1 x251 -1 x242 >= -1 ;+[80782] -1 x251 -1 x243 >= -1 ;+[80782] -1 x251 -1 x244 >= -1 ;+[80782] -1 x251 -1 x245 >= -1 ;+[80782] -1 x252 -1 x239 >= -1 ;+[80782] -1 x252 -1 x240 >= -1 ;+[80782] -1 x252 -1 x241 >= -1 ;+[80782] -1 x252 -1 x242 >= -1 ;+[80782] -1 x252 -1 x243 >= -1 ;+[80782] -1 x252 -1 x244 >= -1 ;+[80782] -1 x252 -1 x245 >= -1 ;+[80782] -1 x253 -1 x239 >= -1 ;+[80782] -1 x253 -1 x240 >= -1 ;+[80782] -1 x253 -1 x241 >= -1 ;+[80782] -1 x253 -1 x242 >= -1 ;+[80782] -1 x253 -1 x243 >= -1 ;+[80782] -1 x253 -1 x244 >= -1 ;+[80782] -1 x253 -1 x245 >= -1 ;+[80782] -1 x255 -1 x239 >= -1 ;+[80782] -1 x255 -1 x240 >= -1 ;+[80782] -1 x255 -1 x241 >= -1 ;+[80782] -1 x255 -1 x242 >= -1 ;+[80782] -1 x255 -1 x243 >= -1 ;+[80782] -1 x255 -1 x244 >= -1 ;+[80782] -1 x255 -1 x245 >= -1 ;+[80782] -1 x256 -1 x239 >= -1 ;+[80782] -1 x256 -1 x240 >= -1 ;+[80782] -1 x256 -1 x241 >= -1 ;+[80782] -1 x256 -1 x242 >= -1 ;+[80782] -1 x256 -1 x243 >= -1 ;+[80782] -1 x256 -1 x244 >= -1 ;+[80782] -1 x256 -1 x245 >= -1 ;+[80782] -1 x257 -1 x239 >= -1 ;+[80782] -1 x257 -1 x240 >= -1 ;+[80782] -1 x257 -1 x241 >= -1 ;+[80782] -1 x257 -1 x242 >= -1 ;+[80782] -1 x257 -1 x243 >= -1 ;+[80782] -1 x257 -1 x244 >= -1 ;+[80782] -1 x257 -1 x245 >= -1 ;+[80782] -1 x258 -1 x239 >= -1 ;+[80782] -1 x258 -1 x240 >= -1 ;+[80782] -1 x258 -1 x241 >= -1 ;+[80782] -1 x258 -1 x242 >= -1 ;+[80782] -1 x258 -1 x243 >= -1 ;+[80782] -1 x258 -1 x244 >= -1 ;+[80782] -1 x258 -1 x245 >= -1 ;+[80782] -1 x259 -1 x239 >= -1 ;+[80782] -1 x259 -1 x240 >= -1 ;+[80782] -1 x259 -1 x241 >= -1 ;+[80782] -1 x259 -1 x242 >= -1 ;+[80782] -1 x259 -1 x243 >= -1 ;+[80782] -1 x259 -1 x244 >= -1 ;+[80782] -1 x259 -1 x245 >= -1 ;+[80782] -1 x260 -1 x239 >= -1 ;+[80782] -1 x260 -1 x240 >= -1 ;+[80782] -1 x260 -1 x241 >= -1 ;+[80782] -1 x260 -1 x242 >= -1 ;+[80782] -1 x260 -1 x243 >= -1 ;+[80782] -1 x260 -1 x244 >= -1 ;+[80782] -1 x260 -1 x245 >= -1 ;+[80782] -1 x261 -1 x239 >= -1 ;+[80782] -1 x261 -1 x240 >= -1 ;+[80782] -1 x261 -1 x241 >= -1 ;+[80782] -1 x261 -1 x242 >= -1 ;+[80782] -1 x261 -1 x243 >= -1 ;+[80782] -1 x261 -1 x244 >= -1 ;+[80782] -1 x261 -1 x245 >= -1 ;+[80782] -1 x255 -1 x247 >= -1 ;+[80782] -1 x255 -1 x248 >= -1 ;+[80782] -1 x255 -1 x249 >= -1 ;+[80782] -1 x255 -1 x250 >= -1 ;+[80782] -1 x255 -1 x251 >= -1 ;+[80782] -1 x255 -1 x252 >= -1 ;+[80782] -1 x255 -1 x253 >= -1 ;+[80782] -1 x256 -1 x247 >= -1 ;+[80782] -1 x256 -1 x248 >= -1 ;+[80782] -1 x256 -1 x249 >= -1 ;+[80782] -1 x256 -1 x250 >= -1 ;+[80782] -1 x256 -1 x251 >= -1 ;+[80782] -1 x256 -1 x252 >= -1 ;+[80782] -1 x256 -1 x253 >= -1 ;+[80782] -1 x257 -1 x247 >= -1 ;+[80782] -1 x257 -1 x248 >= -1 ;+[80782] -1 x257 -1 x249 >= -1 ;+[80782] -1 x257 -1 x250 >= -1 ;+[80782] -1 x257 -1 x251 >= -1 ;+[80782] -1 x257 -1 x252 >= -1 ;+[80782] -1 x257 -1 x253 >= -1 ;+[80782] -1 x258 -1 x247 >= -1 ;+[80782] -1 x258 -1 x248 >= -1 ;+[80782] -1 x258 -1 x249 >= -1 ;+[80782] -1 x258 -1 x250 >= -1 ;+[80782] -1 x258 -1 x251 >= -1 ;+[80782] -1 x258 -1 x252 >= -1 ;+[80782] -1 x258 -1 x253 >= -1 ;+[80782] -1 x259 -1 x247 >= -1 ;+[80782] -1 x259 -1 x248 >= -1 ;+[80782] -1 x259 -1 x249 >= -1 ;+[80782] -1 x259 -1 x250 >= -1 ;+[80782] -1 x259 -1 x251 >= -1 ;+[80782] -1 x259 -1 x252 >= -1 ;+[80782] -1 x259 -1 x253 >= -1 ;+[80782] -1 x260 -1 x247 >= -1 ;+[80782] -1 x260 -1 x248 >= -1 ;+[80782] -1 x260 -1 x249 >= -1 ;+[80782] -1 x260 -1 x250 >= -1 ;+[80782] -1 x260 -1 x251 >= -1 ;+[80782] -1 x260 -1 x252 >= -1 ;+[80782] -1 x260 -1 x253 >= -1 ;+[80782] -1 x261 -1 x247 >= -1 ;+[80782] -1 x261 -1 x248 >= -1 ;+[80782] -1 x261 -1 x249 >= -1 ;+[80782] -1 x261 -1 x250 >= -1 ;+[80782] -1 x261 -1 x251 >= -1 ;+[80782] -1 x261 -1 x252 >= -1 ;+[80782] -1 x261 -1 x253 >= -1 ;+[80782] -1 x328 -1 x269 >= -1 ;+[80782] -1 x328 -1 x270 >= -1 ;+[80782] -1 x329 -1 x269 >= -1 ;+[80782] -1 x329 -1 x270 >= -1 ;+[80782] -1 x280 -1 x272 >= -1 ;+[80782] -1 x280 -1 x273 >= -1 ;+[80782] -1 x280 -1 x274 >= -1 ;+[80782] -1 x280 -1 x275 >= -1 ;+[80782] -1 x280 -1 x276 >= -1 ;+[80782] -1 x280 -1 x277 >= -1 ;+[80782] -1 x280 -1 x278 >= -1 ;+[80782] -1 x281 -1 x272 >= -1 ;+[80782] -1 x281 -1 x273 >= -1 ;+[80782] -1 x281 -1 x274 >= -1 ;+[80782] -1 x281 -1 x275 >= -1 ;+[80782] -1 x281 -1 x276 >= -1 ;+[80782] -1 x281 -1 x277 >= -1 ;+[80782] -1 x281 -1 x278 >= -1 ;+[80782] -1 x282 -1 x272 >= -1 ;+[80782] -1 x282 -1 x273 >= -1 ;+[80782] -1 x282 -1 x274 >= -1 ;+[80782] -1 x282 -1 x275 >= -1 ;+[80782] -1 x282 -1 x276 >= -1 ;+[80782] -1 x282 -1 x277 >= -1 ;+[80782] -1 x282 -1 x278 >= -1 ;+[80782] -1 x283 -1 x272 >= -1 ;+[80782] -1 x283 -1 x273 >= -1 ;+[80782] -1 x283 -1 x274 >= -1 ;+[80782] -1 x283 -1 x275 >= -1 ;+[80782] -1 x283 -1 x276 >= -1 ;+[80782] -1 x283 -1 x277 >= -1 ;+[80782] -1 x283 -1 x278 >= -1 ;+[80782] -1 x284 -1 x272 >= -1 ;+[80782] -1 x284 -1 x273 >= -1 ;+[80782] -1 x284 -1 x274 >= -1 ;+[80782] -1 x284 -1 x275 >= -1 ;+[80782] -1 x284 -1 x276 >= -1 ;+[80782] -1 x284 -1 x277 >= -1 ;+[80782] -1 x284 -1 x278 >= -1 ;+[80782] -1 x285 -1 x272 >= -1 ;+[80782] -1 x285 -1 x273 >= -1 ;+[80782] -1 x285 -1 x274 >= -1 ;+[80782] -1 x285 -1 x275 >= -1 ;+[80782] -1 x285 -1 x276 >= -1 ;+[80782] -1 x285 -1 x277 >= -1 ;+[80782] -1 x285 -1 x278 >= -1 ;+[80782] -1 x286 -1 x272 >= -1 ;+[80782] -1 x286 -1 x273 >= -1 ;+[80782] -1 x286 -1 x274 >= -1 ;+[80782] -1 x286 -1 x275 >= -1 ;+[80782] -1 x286 -1 x276 >= -1 ;+[80782] -1 x286 -1 x277 >= -1 ;+[80782] -1 x286 -1 x278 >= -1 ;+[80782] -1 x288 -1 x272 >= -1 ;+[80782] -1 x288 -1 x273 >= -1 ;+[80782] -1 x288 -1 x274 >= -1 ;+[80782] -1 x288 -1 x275 >= -1 ;+[80782] -1 x288 -1 x276 >= -1 ;+[80782] -1 x288 -1 x277 >= -1 ;+[80782] -1 x288 -1 x278 >= -1 ;+[80782] -1 x289 -1 x272 >= -1 ;+[80782] -1 x289 -1 x273 >= -1 ;+[80782] -1 x289 -1 x274 >= -1 ;+[80782] -1 x289 -1 x275 >= -1 ;+[80782] -1 x289 -1 x276 >= -1 ;+[80782] -1 x289 -1 x277 >= -1 ;+[80782] -1 x289 -1 x278 >= -1 ;+[80782] -1 x290 -1 x272 >= -1 ;+[80782] -1 x290 -1 x273 >= -1 ;+[80782] -1 x290 -1 x274 >= -1 ;+[80782] -1 x290 -1 x275 >= -1 ;+[80782] -1 x290 -1 x276 >= -1 ;+[80782] -1 x290 -1 x277 >= -1 ;+[80782] -1 x290 -1 x278 >= -1 ;+[80782] -1 x291 -1 x272 >= -1 ;+[80782] -1 x291 -1 x273 >= -1 ;+[80782] -1 x291 -1 x274 >= -1 ;+[80782] -1 x291 -1 x275 >= -1 ;+[80782] -1 x291 -1 x276 >= -1 ;+[80782] -1 x291 -1 x277 >= -1 ;+[80782] -1 x291 -1 x278 >= -1 ;+[80782] -1 x292 -1 x272 >= -1 ;+[80782] -1 x292 -1 x273 >= -1 ;+[80782] -1 x292 -1 x274 >= -1 ;+[80782] -1 x292 -1 x275 >= -1 ;+[80782] -1 x292 -1 x276 >= -1 ;+[80782] -1 x292 -1 x277 >= -1 ;+[80782] -1 x292 -1 x278 >= -1 ;+[80782] -1 x293 -1 x272 >= -1 ;+[80782] -1 x293 -1 x273 >= -1 ;+[80782] -1 x293 -1 x274 >= -1 ;+[80782] -1 x293 -1 x275 >= -1 ;+[80782] -1 x293 -1 x276 >= -1 ;+[80782] -1 x293 -1 x277 >= -1 ;+[80782] -1 x293 -1 x278 >= -1 ;+[80782] -1 x294 -1 x272 >= -1 ;+[80782] -1 x294 -1 x273 >= -1 ;+[80782] -1 x294 -1 x274 >= -1 ;+[80782] -1 x294 -1 x275 >= -1 ;+[80782] -1 x294 -1 x276 >= -1 ;+[80782] -1 x294 -1 x277 >= -1 ;+[80782] -1 x294 -1 x278 >= -1 ;+[80782] -1 x296 -1 x272 >= -1 ;+[80782] -1 x296 -1 x273 >= -1 ;+[80782] -1 x296 -1 x274 >= -1 ;+[80782] -1 x296 -1 x275 >= -1 ;+[80782] -1 x296 -1 x276 >= -1 ;+[80782] -1 x296 -1 x277 >= -1 ;+[80782] -1 x296 -1 x278 >= -1 ;+[80782] -1 x297 -1 x272 >= -1 ;+[80782] -1 x297 -1 x273 >= -1 ;+[80782] -1 x297 -1 x274 >= -1 ;+[80782] -1 x297 -1 x275 >= -1 ;+[80782] -1 x297 -1 x276 >= -1 ;+[80782] -1 x297 -1 x277 >= -1 ;+[80782] -1 x297 -1 x278 >= -1 ;+[80782] -1 x298 -1 x272 >= -1 ;+[80782] -1 x298 -1 x273 >= -1 ;+[80782] -1 x298 -1 x274 >= -1 ;+[80782] -1 x298 -1 x275 >= -1 ;+[80782] -1 x298 -1 x276 >= -1 ;+[80782] -1 x298 -1 x277 >= -1 ;+[80782] -1 x298 -1 x278 >= -1 ;+[80782] -1 x299 -1 x272 >= -1 ;+[80782] -1 x299 -1 x273 >= -1 ;+[80782] -1 x299 -1 x274 >= -1 ;+[80782] -1 x299 -1 x275 >= -1 ;+[80782] -1 x299 -1 x276 >= -1 ;+[80782] -1 x299 -1 x277 >= -1 ;+[80782] -1 x299 -1 x278 >= -1 ;+[80782] -1 x300 -1 x272 >= -1 ;+[80782] -1 x300 -1 x273 >= -1 ;+[80782] -1 x300 -1 x274 >= -1 ;+[80782] -1 x300 -1 x275 >= -1 ;+[80782] -1 x300 -1 x276 >= -1 ;+[80782] -1 x300 -1 x277 >= -1 ;+[80782] -1 x300 -1 x278 >= -1 ;+[80782] -1 x301 -1 x272 >= -1 ;+[80782] -1 x301 -1 x273 >= -1 ;+[80782] -1 x301 -1 x274 >= -1 ;+[80782] -1 x301 -1 x275 >= -1 ;+[80782] -1 x301 -1 x276 >= -1 ;+[80782] -1 x301 -1 x277 >= -1 ;+[80782] -1 x301 -1 x278 >= -1 ;+[80782] -1 x302 -1 x272 >= -1 ;+[80782] -1 x302 -1 x273 >= -1 ;+[80782] -1 x302 -1 x274 >= -1 ;+[80782] -1 x302 -1 x275 >= -1 ;+[80782] -1 x302 -1 x276 >= -1 ;+[80782] -1 x302 -1 x277 >= -1 ;+[80782] -1 x302 -1 x278 >= -1 ;+[80782] -1 x304 -1 x272 >= -1 ;+[80782] -1 x304 -1 x273 >= -1 ;+[80782] -1 x304 -1 x274 >= -1 ;+[80782] -1 x304 -1 x275 >= -1 ;+[80782] -1 x304 -1 x276 >= -1 ;+[80782] -1 x304 -1 x277 >= -1 ;+[80782] -1 x304 -1 x278 >= -1 ;+[80782] -1 x305 -1 x272 >= -1 ;+[80782] -1 x305 -1 x273 >= -1 ;+[80782] -1 x305 -1 x274 >= -1 ;+[80782] -1 x305 -1 x275 >= -1 ;+[80782] -1 x305 -1 x276 >= -1 ;+[80782] -1 x305 -1 x277 >= -1 ;+[80782] -1 x305 -1 x278 >= -1 ;+[80782] -1 x306 -1 x272 >= -1 ;+[80782] -1 x306 -1 x273 >= -1 ;+[80782] -1 x306 -1 x274 >= -1 ;+[80782] -1 x306 -1 x275 >= -1 ;+[80782] -1 x306 -1 x276 >= -1 ;+[80782] -1 x306 -1 x277 >= -1 ;+[80782] -1 x306 -1 x278 >= -1 ;+[80782] -1 x307 -1 x272 >= -1 ;+[80782] -1 x307 -1 x273 >= -1 ;+[80782] -1 x307 -1 x274 >= -1 ;+[80782] -1 x307 -1 x275 >= -1 ;+[80782] -1 x307 -1 x276 >= -1 ;+[80782] -1 x307 -1 x277 >= -1 ;+[80782] -1 x307 -1 x278 >= -1 ;+[80782] -1 x308 -1 x272 >= -1 ;+[80782] -1 x308 -1 x273 >= -1 ;+[80782] -1 x308 -1 x274 >= -1 ;+[80782] -1 x308 -1 x275 >= -1 ;+[80782] -1 x308 -1 x276 >= -1 ;+[80782] -1 x308 -1 x277 >= -1 ;+[80782] -1 x308 -1 x278 >= -1 ;+[80782] -1 x309 -1 x272 >= -1 ;+[80782] -1 x309 -1 x273 >= -1 ;+[80782] -1 x309 -1 x274 >= -1 ;+[80782] -1 x309 -1 x275 >= -1 ;+[80782] -1 x309 -1 x276 >= -1 ;+[80782] -1 x309 -1 x277 >= -1 ;+[80782] -1 x309 -1 x278 >= -1 ;+[80782] -1 x310 -1 x272 >= -1 ;+[80782] -1 x310 -1 x273 >= -1 ;+[80782] -1 x310 -1 x274 >= -1 ;+[80782] -1 x310 -1 x275 >= -1 ;+[80782] -1 x310 -1 x276 >= -1 ;+[80782] -1 x310 -1 x277 >= -1 ;+[80782] -1 x310 -1 x278 >= -1 ;+[80782] -1 x312 -1 x272 >= -1 ;+[80782] -1 x312 -1 x273 >= -1 ;+[80782] -1 x312 -1 x274 >= -1 ;+[80782] -1 x312 -1 x275 >= -1 ;+[80782] -1 x312 -1 x276 >= -1 ;+[80782] -1 x312 -1 x277 >= -1 ;+[80782] -1 x312 -1 x278 >= -1 ;+[80782] -1 x313 -1 x272 >= -1 ;+[80782] -1 x313 -1 x273 >= -1 ;+[80782] -1 x313 -1 x274 >= -1 ;+[80782] -1 x313 -1 x275 >= -1 ;+[80782] -1 x313 -1 x276 >= -1 ;+[80782] -1 x313 -1 x277 >= -1 ;+[80782] -1 x313 -1 x278 >= -1 ;+[80782] -1 x314 -1 x272 >= -1 ;+[80782] -1 x314 -1 x273 >= -1 ;+[80782] -1 x314 -1 x274 >= -1 ;+[80782] -1 x314 -1 x275 >= -1 ;+[80782] -1 x314 -1 x276 >= -1 ;+[80782] -1 x314 -1 x277 >= -1 ;+[80782] -1 x314 -1 x278 >= -1 ;+[80782] -1 x315 -1 x272 >= -1 ;+[80782] -1 x315 -1 x273 >= -1 ;+[80782] -1 x315 -1 x274 >= -1 ;+[80782] -1 x315 -1 x275 >= -1 ;+[80782] -1 x315 -1 x276 >= -1 ;+[80782] -1 x315 -1 x277 >= -1 ;+[80782] -1 x315 -1 x278 >= -1 ;+[80782] -1 x316 -1 x272 >= -1 ;+[80782] -1 x316 -1 x273 >= -1 ;+[80782] -1 x316 -1 x274 >= -1 ;+[80782] -1 x316 -1 x275 >= -1 ;+[80782] -1 x316 -1 x276 >= -1 ;+[80782] -1 x316 -1 x277 >= -1 ;+[80782] -1 x316 -1 x278 >= -1 ;+[80782] -1 x317 -1 x272 >= -1 ;+[80782] -1 x317 -1 x273 >= -1 ;+[80782] -1 x317 -1 x274 >= -1 ;+[80782] -1 x317 -1 x275 >= -1 ;+[80782] -1 x317 -1 x276 >= -1 ;+[80782] -1 x317 -1 x277 >= -1 ;+[80782] -1 x317 -1 x278 >= -1 ;+[80782] -1 x318 -1 x272 >= -1 ;+[80782] -1 x318 -1 x273 >= -1 ;+[80782] -1 x318 -1 x274 >= -1 ;+[80782] -1 x318 -1 x275 >= -1 ;+[80782] -1 x318 -1 x276 >= -1 ;+[80782] -1 x318 -1 x277 >= -1 ;+[80782] -1 x318 -1 x278 >= -1 ;+[80782] -1 x320 -1 x272 >= -1 ;+[80782] -1 x320 -1 x273 >= -1 ;+[80782] -1 x320 -1 x274 >= -1 ;+[80782] -1 x320 -1 x275 >= -1 ;+[80782] -1 x320 -1 x276 >= -1 ;+[80782] -1 x320 -1 x277 >= -1 ;+[80782] -1 x320 -1 x278 >= -1 ;+[80782] -1 x321 -1 x272 >= -1 ;+[80782] -1 x321 -1 x273 >= -1 ;+[80782] -1 x321 -1 x274 >= -1 ;+[80782] -1 x321 -1 x275 >= -1 ;+[80782] -1 x321 -1 x276 >= -1 ;+[80782] -1 x321 -1 x277 >= -1 ;+[80782] -1 x321 -1 x278 >= -1 ;+[80782] -1 x322 -1 x272 >= -1 ;+[80782] -1 x322 -1 x273 >= -1 ;+[80782] -1 x322 -1 x274 >= -1 ;+[80782] -1 x322 -1 x275 >= -1 ;+[80782] -1 x322 -1 x276 >= -1 ;+[80782] -1 x322 -1 x277 >= -1 ;+[80782] -1 x322 -1 x278 >= -1 ;+[80782] -1 x323 -1 x272 >= -1 ;+[80782] -1 x323 -1 x273 >= -1 ;+[80782] -1 x323 -1 x274 >= -1 ;+[80782] -1 x323 -1 x275 >= -1 ;+[80782] -1 x323 -1 x276 >= -1 ;+[80782] -1 x323 -1 x277 >= -1 ;+[80782] -1 x323 -1 x278 >= -1 ;+[80782] -1 x324 -1 x272 >= -1 ;+[80782] -1 x324 -1 x273 >= -1 ;+[80782] -1 x324 -1 x274 >= -1 ;+[80782] -1 x324 -1 x275 >= -1 ;+[80782] -1 x324 -1 x276 >= -1 ;+[80782] -1 x324 -1 x277 >= -1 ;+[80782] -1 x324 -1 x278 >= -1 ;+[80782] -1 x325 -1 x272 >= -1 ;+[80782] -1 x325 -1 x273 >= -1 ;+[80782] -1 x325 -1 x274 >= -1 ;+[80782] -1 x325 -1 x275 >= -1 ;+[80782] -1 x325 -1 x276 >= -1 ;+[80782] -1 x325 -1 x277 >= -1 ;+[80782] -1 x325 -1 x278 >= -1 ;+[80782] -1 x326 -1 x272 >= -1 ;+[80782] -1 x326 -1 x273 >= -1 ;+[80782] -1 x326 -1 x274 >= -1 ;+[80782] -1 x326 -1 x275 >= -1 ;+[80782] -1 x326 -1 x276 >= -1 ;+[80782] -1 x326 -1 x277 >= -1 ;+[80782] -1 x326 -1 x278 >= -1 ;+[80782] -1 x288 -1 x280 >= -1 ;+[80782] -1 x288 -1 x281 >= -1 ;+[80782] -1 x288 -1 x282 >= -1 ;+[80782] -1 x288 -1 x283 >= -1 ;+[80782] -1 x288 -1 x284 >= -1 ;+[80782] -1 x288 -1 x285 >= -1 ;+[80782] -1 x288 -1 x286 >= -1 ;+[80782] -1 x289 -1 x280 >= -1 ;+[80782] -1 x289 -1 x281 >= -1 ;+[80782] -1 x289 -1 x282 >= -1 ;+[80782] -1 x289 -1 x283 >= -1 ;+[80782] -1 x289 -1 x284 >= -1 ;+[80782] -1 x289 -1 x285 >= -1 ;+[80782] -1 x289 -1 x286 >= -1 ;+[80782] -1 x290 -1 x280 >= -1 ;+[80782] -1 x290 -1 x281 >= -1 ;+[80782] -1 x290 -1 x282 >= -1 ;+[80782] -1 x290 -1 x283 >= -1 ;+[80782] -1 x290 -1 x284 >= -1 ;+[80782] -1 x290 -1 x285 >= -1 ;+[80782] -1 x290 -1 x286 >= -1 ;+[80782] -1 x291 -1 x280 >= -1 ;+[80782] -1 x291 -1 x281 >= -1 ;+[80782] -1 x291 -1 x282 >= -1 ;+[80782] -1 x291 -1 x283 >= -1 ;+[80782] -1 x291 -1 x284 >= -1 ;+[80782] -1 x291 -1 x285 >= -1 ;+[80782] -1 x291 -1 x286 >= -1 ;+[80782] -1 x292 -1 x280 >= -1 ;+[80782] -1 x292 -1 x281 >= -1 ;+[80782] -1 x292 -1 x282 >= -1 ;+[80782] -1 x292 -1 x283 >= -1 ;+[80782] -1 x292 -1 x284 >= -1 ;+[80782] -1 x292 -1 x285 >= -1 ;+[80782] -1 x292 -1 x286 >= -1 ;+[80782] -1 x293 -1 x280 >= -1 ;+[80782] -1 x293 -1 x281 >= -1 ;+[80782] -1 x293 -1 x282 >= -1 ;+[80782] -1 x293 -1 x283 >= -1 ;+[80782] -1 x293 -1 x284 >= -1 ;+[80782] -1 x293 -1 x285 >= -1 ;+[80782] -1 x293 -1 x286 >= -1 ;+[80782] -1 x294 -1 x280 >= -1 ;+[80782] -1 x294 -1 x281 >= -1 ;+[80782] -1 x294 -1 x282 >= -1 ;+[80782] -1 x294 -1 x283 >= -1 ;+[80782] -1 x294 -1 x284 >= -1 ;+[80782] -1 x294 -1 x285 >= -1 ;+[80782] -1 x294 -1 x286 >= -1 ;+[80782] -1 x296 -1 x280 >= -1 ;+[80782] -1 x296 -1 x281 >= -1 ;+[80782] -1 x296 -1 x282 >= -1 ;+[80782] -1 x296 -1 x283 >= -1 ;+[80782] -1 x296 -1 x284 >= -1 ;+[80782] -1 x296 -1 x285 >= -1 ;+[80782] -1 x296 -1 x286 >= -1 ;+[80782] -1 x297 -1 x280 >= -1 ;+[80782] -1 x297 -1 x281 >= -1 ;+[80782] -1 x297 -1 x282 >= -1 ;+[80782] -1 x297 -1 x283 >= -1 ;+[80782] -1 x297 -1 x284 >= -1 ;+[80782] -1 x297 -1 x285 >= -1 ;+[80782] -1 x297 -1 x286 >= -1 ;+[80782] -1 x298 -1 x280 >= -1 ;+[80782] -1 x298 -1 x281 >= -1 ;+[80782] -1 x298 -1 x282 >= -1 ;+[80782] -1 x298 -1 x283 >= -1 ;+[80782] -1 x298 -1 x284 >= -1 ;+[80782] -1 x298 -1 x285 >= -1 ;+[80782] -1 x298 -1 x286 >= -1 ;+[80782] -1 x299 -1 x280 >= -1 ;+[80782] -1 x299 -1 x281 >= -1 ;+[80782] -1 x299 -1 x282 >= -1 ;+[80782] -1 x299 -1 x283 >= -1 ;+[80782] -1 x299 -1 x284 >= -1 ;+[80782] -1 x299 -1 x285 >= -1 ;+[80782] -1 x299 -1 x286 >= -1 ;+[80782] -1 x300 -1 x280 >= -1 ;+[80782] -1 x300 -1 x281 >= -1 ;+[80782] -1 x300 -1 x282 >= -1 ;+[80782] -1 x300 -1 x283 >= -1 ;+[80782] -1 x300 -1 x284 >= -1 ;+[80782] -1 x300 -1 x285 >= -1 ;+[80782] -1 x300 -1 x286 >= -1 ;+[80782] -1 x301 -1 x280 >= -1 ;+[80782] -1 x301 -1 x281 >= -1 ;+[80782] -1 x301 -1 x282 >= -1 ;+[80782] -1 x301 -1 x283 >= -1 ;+[80782] -1 x301 -1 x284 >= -1 ;+[80782] -1 x301 -1 x285 >= -1 ;+[80782] -1 x301 -1 x286 >= -1 ;+[80782] -1 x302 -1 x280 >= -1 ;+[80782] -1 x302 -1 x281 >= -1 ;+[80782] -1 x302 -1 x282 >= -1 ;+[80782] -1 x302 -1 x283 >= -1 ;+[80782] -1 x302 -1 x284 >= -1 ;+[80782] -1 x302 -1 x285 >= -1 ;+[80782] -1 x302 -1 x286 >= -1 ;+[80782] -1 x304 -1 x280 >= -1 ;+[80782] -1 x304 -1 x281 >= -1 ;+[80782] -1 x304 -1 x282 >= -1 ;+[80782] -1 x304 -1 x283 >= -1 ;+[80782] -1 x304 -1 x284 >= -1 ;+[80782] -1 x304 -1 x285 >= -1 ;+[80782] -1 x304 -1 x286 >= -1 ;+[80782] -1 x305 -1 x280 >= -1 ;+[80782] -1 x305 -1 x281 >= -1 ;+[80782] -1 x305 -1 x282 >= -1 ;+[80782] -1 x305 -1 x283 >= -1 ;+[80782] -1 x305 -1 x284 >= -1 ;+[80782] -1 x305 -1 x285 >= -1 ;+[80782] -1 x305 -1 x286 >= -1 ;+[80782] -1 x306 -1 x280 >= -1 ;+[80782] -1 x306 -1 x281 >= -1 ;+[80782] -1 x306 -1 x282 >= -1 ;+[80782] -1 x306 -1 x283 >= -1 ;+[80782] -1 x306 -1 x284 >= -1 ;+[80782] -1 x306 -1 x285 >= -1 ;+[80782] -1 x306 -1 x286 >= -1 ;+[80782] -1 x307 -1 x280 >= -1 ;+[80782] -1 x307 -1 x281 >= -1 ;+[80782] -1 x307 -1 x282 >= -1 ;+[80782] -1 x307 -1 x283 >= -1 ;+[80782] -1 x307 -1 x284 >= -1 ;+[80782] -1 x307 -1 x285 >= -1 ;+[80782] -1 x307 -1 x286 >= -1 ;+[80782] -1 x308 -1 x280 >= -1 ;+[80782] -1 x308 -1 x281 >= -1 ;+[80782] -1 x308 -1 x282 >= -1 ;+[80782] -1 x308 -1 x283 >= -1 ;+[80782] -1 x308 -1 x284 >= -1 ;+[80782] -1 x308 -1 x285 >= -1 ;+[80782] -1 x308 -1 x286 >= -1 ;+[80782] -1 x309 -1 x280 >= -1 ;+[80782] -1 x309 -1 x281 >= -1 ;+[80782] -1 x309 -1 x282 >= -1 ;+[80782] -1 x309 -1 x283 >= -1 ;+[80782] -1 x309 -1 x284 >= -1 ;+[80782] -1 x309 -1 x285 >= -1 ;+[80782] -1 x309 -1 x286 >= -1 ;+[80782] -1 x310 -1 x280 >= -1 ;+[80782] -1 x310 -1 x281 >= -1 ;+[80782] -1 x310 -1 x282 >= -1 ;+[80782] -1 x310 -1 x283 >= -1 ;+[80782] -1 x310 -1 x284 >= -1 ;+[80782] -1 x310 -1 x285 >= -1 ;+[80782] -1 x310 -1 x286 >= -1 ;+[80782] -1 x312 -1 x280 >= -1 ;+[80782] -1 x312 -1 x281 >= -1 ;+[80782] -1 x312 -1 x282 >= -1 ;+[80782] -1 x312 -1 x283 >= -1 ;+[80782] -1 x312 -1 x284 >= -1 ;+[80782] -1 x312 -1 x285 >= -1 ;+[80782] -1 x312 -1 x286 >= -1 ;+[80782] -1 x313 -1 x280 >= -1 ;+[80782] -1 x313 -1 x281 >= -1 ;+[80782] -1 x313 -1 x282 >= -1 ;+[80782] -1 x313 -1 x283 >= -1 ;+[80782] -1 x313 -1 x284 >= -1 ;+[80782] -1 x313 -1 x285 >= -1 ;+[80782] -1 x313 -1 x286 >= -1 ;+[80782] -1 x314 -1 x280 >= -1 ;+[80782] -1 x314 -1 x281 >= -1 ;+[80782] -1 x314 -1 x282 >= -1 ;+[80782] -1 x314 -1 x283 >= -1 ;+[80782] -1 x314 -1 x284 >= -1 ;+[80782] -1 x314 -1 x285 >= -1 ;+[80782] -1 x314 -1 x286 >= -1 ;+[80782] -1 x315 -1 x280 >= -1 ;+[80782] -1 x315 -1 x281 >= -1 ;+[80782] -1 x315 -1 x282 >= -1 ;+[80782] -1 x315 -1 x283 >= -1 ;+[80782] -1 x315 -1 x284 >= -1 ;+[80782] -1 x315 -1 x285 >= -1 ;+[80782] -1 x315 -1 x286 >= -1 ;+[80782] -1 x316 -1 x280 >= -1 ;+[80782] -1 x316 -1 x281 >= -1 ;+[80782] -1 x316 -1 x282 >= -1 ;+[80782] -1 x316 -1 x283 >= -1 ;+[80782] -1 x316 -1 x284 >= -1 ;+[80782] -1 x316 -1 x285 >= -1 ;+[80782] -1 x316 -1 x286 >= -1 ;+[80782] -1 x317 -1 x280 >= -1 ;+[80782] -1 x317 -1 x281 >= -1 ;+[80782] -1 x317 -1 x282 >= -1 ;+[80782] -1 x317 -1 x283 >= -1 ;+[80782] -1 x317 -1 x284 >= -1 ;+[80782] -1 x317 -1 x285 >= -1 ;+[80782] -1 x317 -1 x286 >= -1 ;+[80782] -1 x318 -1 x280 >= -1 ;+[80782] -1 x318 -1 x281 >= -1 ;+[80782] -1 x318 -1 x282 >= -1 ;+[80782] -1 x318 -1 x283 >= -1 ;+[80782] -1 x318 -1 x284 >= -1 ;+[80782] -1 x318 -1 x285 >= -1 ;+[80782] -1 x318 -1 x286 >= -1 ;+[80782] -1 x320 -1 x280 >= -1 ;+[80782] -1 x320 -1 x281 >= -1 ;+[80782] -1 x320 -1 x282 >= -1 ;+[80782] -1 x320 -1 x283 >= -1 ;+[80782] -1 x320 -1 x284 >= -1 ;+[80782] -1 x320 -1 x285 >= -1 ;+[80782] -1 x320 -1 x286 >= -1 ;+[80782] -1 x321 -1 x280 >= -1 ;+[80782] -1 x321 -1 x281 >= -1 ;+[80782] -1 x321 -1 x282 >= -1 ;+[80782] -1 x321 -1 x283 >= -1 ;+[80782] -1 x321 -1 x284 >= -1 ;+[80782] -1 x321 -1 x285 >= -1 ;+[80782] -1 x321 -1 x286 >= -1 ;+[80782] -1 x322 -1 x280 >= -1 ;+[80782] -1 x322 -1 x281 >= -1 ;+[80782] -1 x322 -1 x282 >= -1 ;+[80782] -1 x322 -1 x283 >= -1 ;+[80782] -1 x322 -1 x284 >= -1 ;+[80782] -1 x322 -1 x285 >= -1 ;+[80782] -1 x322 -1 x286 >= -1 ;+[80782] -1 x323 -1 x280 >= -1 ;+[80782] -1 x323 -1 x281 >= -1 ;+[80782] -1 x323 -1 x282 >= -1 ;+[80782] -1 x323 -1 x283 >= -1 ;+[80782] -1 x323 -1 x284 >= -1 ;+[80782] -1 x323 -1 x285 >= -1 ;+[80782] -1 x323 -1 x286 >= -1 ;+[80782] -1 x324 -1 x280 >= -1 ;+[80782] -1 x324 -1 x281 >= -1 ;+[80782] -1 x324 -1 x282 >= -1 ;+[80782] -1 x324 -1 x283 >= -1 ;+[80782] -1 x324 -1 x284 >= -1 ;+[80782] -1 x324 -1 x285 >= -1 ;+[80782] -1 x324 -1 x286 >= -1 ;+[80782] -1 x325 -1 x280 >= -1 ;+[80782] -1 x325 -1 x281 >= -1 ;+[80782] -1 x325 -1 x282 >= -1 ;+[80782] -1 x325 -1 x283 >= -1 ;+[80782] -1 x325 -1 x284 >= -1 ;+[80782] -1 x325 -1 x285 >= -1 ;+[80782] -1 x325 -1 x286 >= -1 ;+[80782] -1 x326 -1 x280 >= -1 ;+[80782] -1 x326 -1 x281 >= -1 ;+[80782] -1 x326 -1 x282 >= -1 ;+[80782] -1 x326 -1 x283 >= -1 ;+[80782] -1 x326 -1 x284 >= -1 ;+[80782] -1 x326 -1 x285 >= -1 ;+[80782] -1 x326 -1 x286 >= -1 ;+[80782] -1 x296 -1 x288 >= -1 ;+[80782] -1 x296 -1 x289 >= -1 ;+[80782] -1 x296 -1 x290 >= -1 ;+[80782] -1 x296 -1 x291 >= -1 ;+[80782] -1 x296 -1 x292 >= -1 ;+[80782] -1 x296 -1 x293 >= -1 ;+[80782] -1 x296 -1 x294 >= -1 ;+[80782] -1 x297 -1 x288 >= -1 ;+[80782] -1 x297 -1 x289 >= -1 ;+[80782] -1 x297 -1 x290 >= -1 ;+[80782] -1 x297 -1 x291 >= -1 ;+[80782] -1 x297 -1 x292 >= -1 ;+[80782] -1 x297 -1 x293 >= -1 ;+[80782] -1 x297 -1 x294 >= -1 ;+[80782] -1 x298 -1 x288 >= -1 ;+[80782] -1 x298 -1 x289 >= -1 ;+[80782] -1 x298 -1 x290 >= -1 ;+[80782] -1 x298 -1 x291 >= -1 ;+[80782] -1 x298 -1 x292 >= -1 ;+[80782] -1 x298 -1 x293 >= -1 ;+[80782] -1 x298 -1 x294 >= -1 ;+[80782] -1 x299 -1 x288 >= -1 ;+[80782] -1 x299 -1 x289 >= -1 ;+[80782] -1 x299 -1 x290 >= -1 ;+[80782] -1 x299 -1 x291 >= -1 ;+[80782] -1 x299 -1 x292 >= -1 ;+[80782] -1 x299 -1 x293 >= -1 ;+[80782] -1 x299 -1 x294 >= -1 ;+[80782] -1 x300 -1 x288 >= -1 ;+[80782] -1 x300 -1 x289 >= -1 ;+[80782] -1 x300 -1 x290 >= -1 ;+[80782] -1 x300 -1 x291 >= -1 ;+[80782] -1 x300 -1 x292 >= -1 ;+[80782] -1 x300 -1 x293 >= -1 ;+[80782] -1 x300 -1 x294 >= -1 ;+[80782] -1 x301 -1 x288 >= -1 ;+[80782] -1 x301 -1 x289 >= -1 ;+[80782] -1 x301 -1 x290 >= -1 ;+[80782] -1 x301 -1 x291 >= -1 ;+[80782] -1 x301 -1 x292 >= -1 ;+[80782] -1 x301 -1 x293 >= -1 ;+[80782] -1 x301 -1 x294 >= -1 ;+[80782] -1 x302 -1 x288 >= -1 ;+[80782] -1 x302 -1 x289 >= -1 ;+[80782] -1 x302 -1 x290 >= -1 ;+[80782] -1 x302 -1 x291 >= -1 ;+[80782] -1 x302 -1 x292 >= -1 ;+[80782] -1 x302 -1 x293 >= -1 ;+[80782] -1 x302 -1 x294 >= -1 ;+[80782] -1 x304 -1 x288 >= -1 ;+[80782] -1 x304 -1 x289 >= -1 ;+[80782] -1 x304 -1 x290 >= -1 ;+[80782] -1 x304 -1 x291 >= -1 ;+[80782] -1 x304 -1 x292 >= -1 ;+[80782] -1 x304 -1 x293 >= -1 ;+[80782] -1 x304 -1 x294 >= -1 ;+[80782] -1 x305 -1 x288 >= -1 ;+[80782] -1 x305 -1 x289 >= -1 ;+[80782] -1 x305 -1 x290 >= -1 ;+[80782] -1 x305 -1 x291 >= -1 ;+[80782] -1 x305 -1 x292 >= -1 ;+[80782] -1 x305 -1 x293 >= -1 ;+[80782] -1 x305 -1 x294 >= -1 ;+[80782] -1 x306 -1 x288 >= -1 ;+[80782] -1 x306 -1 x289 >= -1 ;+[80782] -1 x306 -1 x290 >= -1 ;+[80782] -1 x306 -1 x291 >= -1 ;+[80782] -1 x306 -1 x292 >= -1 ;+[80782] -1 x306 -1 x293 >= -1 ;+[80782] -1 x306 -1 x294 >= -1 ;+[80782] -1 x307 -1 x288 >= -1 ;+[80782] -1 x307 -1 x289 >= -1 ;+[80782] -1 x307 -1 x290 >= -1 ;+[80782] -1 x307 -1 x291 >= -1 ;+[80782] -1 x307 -1 x292 >= -1 ;+[80782] -1 x307 -1 x293 >= -1 ;+[80782] -1 x307 -1 x294 >= -1 ;+[80782] -1 x308 -1 x288 >= -1 ;+[80782] -1 x308 -1 x289 >= -1 ;+[80782] -1 x308 -1 x290 >= -1 ;+[80782] -1 x308 -1 x291 >= -1 ;+[80782] -1 x308 -1 x292 >= -1 ;+[80782] -1 x308 -1 x293 >= -1 ;+[80782] -1 x308 -1 x294 >= -1 ;+[80782] -1 x309 -1 x288 >= -1 ;+[80782] -1 x309 -1 x289 >= -1 ;+[80782] -1 x309 -1 x290 >= -1 ;+[80782] -1 x309 -1 x291 >= -1 ;+[80782] -1 x309 -1 x292 >= -1 ;+[80782] -1 x309 -1 x293 >= -1 ;+[80782] -1 x309 -1 x294 >= -1 ;+[80782] -1 x310 -1 x288 >= -1 ;+[80782] -1 x310 -1 x289 >= -1 ;+[80782] -1 x310 -1 x290 >= -1 ;+[80782] -1 x310 -1 x291 >= -1 ;+[80782] -1 x310 -1 x292 >= -1 ;+[80782] -1 x310 -1 x293 >= -1 ;+[80782] -1 x310 -1 x294 >= -1 ;+[80782] -1 x312 -1 x288 >= -1 ;+[80782] -1 x312 -1 x289 >= -1 ;+[80782] -1 x312 -1 x290 >= -1 ;+[80782] -1 x312 -1 x291 >= -1 ;+[80782] -1 x312 -1 x292 >= -1 ;+[80782] -1 x312 -1 x293 >= -1 ;+[80782] -1 x312 -1 x294 >= -1 ;+[80782] -1 x313 -1 x288 >= -1 ;+[80782] -1 x313 -1 x289 >= -1 ;+[80782] -1 x313 -1 x290 >= -1 ;+[80782] -1 x313 -1 x291 >= -1 ;+[80782] -1 x313 -1 x292 >= -1 ;+[80782] -1 x313 -1 x293 >= -1 ;+[80782] -1 x313 -1 x294 >= -1 ;+[80782] -1 x314 -1 x288 >= -1 ;+[80782] -1 x314 -1 x289 >= -1 ;+[80782] -1 x314 -1 x290 >= -1 ;+[80782] -1 x314 -1 x291 >= -1 ;+[80782] -1 x314 -1 x292 >= -1 ;+[80782] -1 x314 -1 x293 >= -1 ;+[80782] -1 x314 -1 x294 >= -1 ;+[80782] -1 x315 -1 x288 >= -1 ;+[80782] -1 x315 -1 x289 >= -1 ;+[80782] -1 x315 -1 x290 >= -1 ;+[80782] -1 x315 -1 x291 >= -1 ;+[80782] -1 x315 -1 x292 >= -1 ;+[80782] -1 x315 -1 x293 >= -1 ;+[80782] -1 x315 -1 x294 >= -1 ;+[80782] -1 x316 -1 x288 >= -1 ;+[80782] -1 x316 -1 x289 >= -1 ;+[80782] -1 x316 -1 x290 >= -1 ;+[80782] -1 x316 -1 x291 >= -1 ;+[80782] -1 x316 -1 x292 >= -1 ;+[80782] -1 x316 -1 x293 >= -1 ;+[80782] -1 x316 -1 x294 >= -1 ;+[80782] -1 x317 -1 x288 >= -1 ;+[80782] -1 x317 -1 x289 >= -1 ;+[80782] -1 x317 -1 x290 >= -1 ;+[80782] -1 x317 -1 x291 >= -1 ;+[80782] -1 x317 -1 x292 >= -1 ;+[80782] -1 x317 -1 x293 >= -1 ;+[80782] -1 x317 -1 x294 >= -1 ;+[80782] -1 x318 -1 x288 >= -1 ;+[80782] -1 x318 -1 x289 >= -1 ;+[80782] -1 x318 -1 x290 >= -1 ;+[80782] -1 x318 -1 x291 >= -1 ;+[80782] -1 x318 -1 x292 >= -1 ;+[80782] -1 x318 -1 x293 >= -1 ;+[80782] -1 x318 -1 x294 >= -1 ;+[80782] -1 x320 -1 x288 >= -1 ;+[80782] -1 x320 -1 x289 >= -1 ;+[80782] -1 x320 -1 x290 >= -1 ;+[80782] -1 x320 -1 x291 >= -1 ;+[80782] -1 x320 -1 x292 >= -1 ;+[80782] -1 x320 -1 x293 >= -1 ;+[80782] -1 x320 -1 x294 >= -1 ;+[80782] -1 x321 -1 x288 >= -1 ;+[80782] -1 x321 -1 x289 >= -1 ;+[80782] -1 x321 -1 x290 >= -1 ;+[80782] -1 x321 -1 x291 >= -1 ;+[80782] -1 x321 -1 x292 >= -1 ;+[80782] -1 x321 -1 x293 >= -1 ;+[80782] -1 x321 -1 x294 >= -1 ;+[80782] -1 x322 -1 x288 >= -1 ;+[80782] -1 x322 -1 x289 >= -1 ;+[80782] -1 x322 -1 x290 >= -1 ;+[80782] -1 x322 -1 x291 >= -1 ;+[80782] -1 x322 -1 x292 >= -1 ;+[80782] -1 x322 -1 x293 >= -1 ;+[80782] -1 x322 -1 x294 >= -1 ;+[80782] -1 x323 -1 x288 >= -1 ;+[80782] -1 x323 -1 x289 >= -1 ;+[80782] -1 x323 -1 x290 >= -1 ;+[80782] -1 x323 -1 x291 >= -1 ;+[80782] -1 x323 -1 x292 >= -1 ;+[80782] -1 x323 -1 x293 >= -1 ;+[80782] -1 x323 -1 x294 >= -1 ;+[80782] -1 x324 -1 x288 >= -1 ;+[80782] -1 x324 -1 x289 >= -1 ;+[80782] -1 x324 -1 x290 >= -1 ;+[80782] -1 x324 -1 x291 >= -1 ;+[80782] -1 x324 -1 x292 >= -1 ;+[80782] -1 x324 -1 x293 >= -1 ;+[80782] -1 x324 -1 x294 >= -1 ;+[80782] -1 x325 -1 x288 >= -1 ;+[80782] -1 x325 -1 x289 >= -1 ;+[80782] -1 x325 -1 x290 >= -1 ;+[80782] -1 x325 -1 x291 >= -1 ;+[80782] -1 x325 -1 x292 >= -1 ;+[80782] -1 x325 -1 x293 >= -1 ;+[80782] -1 x325 -1 x294 >= -1 ;+[80782] -1 x326 -1 x288 >= -1 ;+[80782] -1 x326 -1 x289 >= -1 ;+[80782] -1 x326 -1 x290 >= -1 ;+[80782] -1 x326 -1 x291 >= -1 ;+[80782] -1 x326 -1 x292 >= -1 ;+[80782] -1 x326 -1 x293 >= -1 ;+[80782] -1 x326 -1 x294 >= -1 ;+[80782] -1 x304 -1 x296 >= -1 ;+[80782] -1 x304 -1 x297 >= -1 ;+[80782] -1 x304 -1 x298 >= -1 ;+[80782] -1 x304 -1 x299 >= -1 ;+[80782] -1 x304 -1 x300 >= -1 ;+[80782] -1 x304 -1 x301 >= -1 ;+[80782] -1 x304 -1 x302 >= -1 ;+[80782] -1 x305 -1 x296 >= -1 ;+[80782] -1 x305 -1 x297 >= -1 ;+[80782] -1 x305 -1 x298 >= -1 ;+[80782] -1 x305 -1 x299 >= -1 ;+[80782] -1 x305 -1 x300 >= -1 ;+[80782] -1 x305 -1 x301 >= -1 ;+[80782] -1 x305 -1 x302 >= -1 ;+[80782] -1 x306 -1 x296 >= -1 ;+[80782] -1 x306 -1 x297 >= -1 ;+[80782] -1 x306 -1 x298 >= -1 ;+[80782] -1 x306 -1 x299 >= -1 ;+[80782] -1 x306 -1 x300 >= -1 ;+[80782] -1 x306 -1 x301 >= -1 ;+[80782] -1 x306 -1 x302 >= -1 ;+[80782] -1 x307 -1 x296 >= -1 ;+[80782] -1 x307 -1 x297 >= -1 ;+[80782] -1 x307 -1 x298 >= -1 ;+[80782] -1 x307 -1 x299 >= -1 ;+[80782] -1 x307 -1 x300 >= -1 ;+[80782] -1 x307 -1 x301 >= -1 ;+[80782] -1 x307 -1 x302 >= -1 ;+[80782] -1 x308 -1 x296 >= -1 ;+[80782] -1 x308 -1 x297 >= -1 ;+[80782] -1 x308 -1 x298 >= -1 ;+[80782] -1 x308 -1 x299 >= -1 ;+[80782] -1 x308 -1 x300 >= -1 ;+[80782] -1 x308 -1 x301 >= -1 ;+[80782] -1 x308 -1 x302 >= -1 ;+[80782] -1 x309 -1 x296 >= -1 ;+[80782] -1 x309 -1 x297 >= -1 ;+[80782] -1 x309 -1 x298 >= -1 ;+[80782] -1 x309 -1 x299 >= -1 ;+[80782] -1 x309 -1 x300 >= -1 ;+[80782] -1 x309 -1 x301 >= -1 ;+[80782] -1 x309 -1 x302 >= -1 ;+[80782] -1 x310 -1 x296 >= -1 ;+[80782] -1 x310 -1 x297 >= -1 ;+[80782] -1 x310 -1 x298 >= -1 ;+[80782] -1 x310 -1 x299 >= -1 ;+[80782] -1 x310 -1 x300 >= -1 ;+[80782] -1 x310 -1 x301 >= -1 ;+[80782] -1 x310 -1 x302 >= -1 ;+[80782] -1 x312 -1 x296 >= -1 ;+[80782] -1 x312 -1 x297 >= -1 ;+[80782] -1 x312 -1 x298 >= -1 ;+[80782] -1 x312 -1 x299 >= -1 ;+[80782] -1 x312 -1 x300 >= -1 ;+[80782] -1 x312 -1 x301 >= -1 ;+[80782] -1 x312 -1 x302 >= -1 ;+[80782] -1 x313 -1 x296 >= -1 ;+[80782] -1 x313 -1 x297 >= -1 ;+[80782] -1 x313 -1 x298 >= -1 ;+[80782] -1 x313 -1 x299 >= -1 ;+[80782] -1 x313 -1 x300 >= -1 ;+[80782] -1 x313 -1 x301 >= -1 ;+[80782] -1 x313 -1 x302 >= -1 ;+[80782] -1 x314 -1 x296 >= -1 ;+[80782] -1 x314 -1 x297 >= -1 ;+[80782] -1 x314 -1 x298 >= -1 ;+[80782] -1 x314 -1 x299 >= -1 ;+[80782] -1 x314 -1 x300 >= -1 ;+[80782] -1 x314 -1 x301 >= -1 ;+[80782] -1 x314 -1 x302 >= -1 ;+[80782] -1 x315 -1 x296 >= -1 ;+[80782] -1 x315 -1 x297 >= -1 ;+[80782] -1 x315 -1 x298 >= -1 ;+[80782] -1 x315 -1 x299 >= -1 ;+[80782] -1 x315 -1 x300 >= -1 ;+[80782] -1 x315 -1 x301 >= -1 ;+[80782] -1 x315 -1 x302 >= -1 ;+[80782] -1 x316 -1 x296 >= -1 ;+[80782] -1 x316 -1 x297 >= -1 ;+[80782] -1 x316 -1 x298 >= -1 ;+[80782] -1 x316 -1 x299 >= -1 ;+[80782] -1 x316 -1 x300 >= -1 ;+[80782] -1 x316 -1 x301 >= -1 ;+[80782] -1 x316 -1 x302 >= -1 ;+[80782] -1 x317 -1 x296 >= -1 ;+[80782] -1 x317 -1 x297 >= -1 ;+[80782] -1 x317 -1 x298 >= -1 ;+[80782] -1 x317 -1 x299 >= -1 ;+[80782] -1 x317 -1 x300 >= -1 ;+[80782] -1 x317 -1 x301 >= -1 ;+[80782] -1 x317 -1 x302 >= -1 ;+[80782] -1 x318 -1 x296 >= -1 ;+[80782] -1 x318 -1 x297 >= -1 ;+[80782] -1 x318 -1 x298 >= -1 ;+[80782] -1 x318 -1 x299 >= -1 ;+[80782] -1 x318 -1 x300 >= -1 ;+[80782] -1 x318 -1 x301 >= -1 ;+[80782] -1 x318 -1 x302 >= -1 ;+[80782] -1 x320 -1 x296 >= -1 ;+[80782] -1 x320 -1 x297 >= -1 ;+[80782] -1 x320 -1 x298 >= -1 ;+[80782] -1 x320 -1 x299 >= -1 ;+[80782] -1 x320 -1 x300 >= -1 ;+[80782] -1 x320 -1 x301 >= -1 ;+[80782] -1 x320 -1 x302 >= -1 ;+[80782] -1 x321 -1 x296 >= -1 ;+[80782] -1 x321 -1 x297 >= -1 ;+[80782] -1 x321 -1 x298 >= -1 ;+[80782] -1 x321 -1 x299 >= -1 ;+[80782] -1 x321 -1 x300 >= -1 ;+[80782] -1 x321 -1 x301 >= -1 ;+[80782] -1 x321 -1 x302 >= -1 ;+[80782] -1 x322 -1 x296 >= -1 ;+[80782] -1 x322 -1 x297 >= -1 ;+[80782] -1 x322 -1 x298 >= -1 ;+[80782] -1 x322 -1 x299 >= -1 ;+[80782] -1 x322 -1 x300 >= -1 ;+[80782] -1 x322 -1 x301 >= -1 ;+[80782] -1 x322 -1 x302 >= -1 ;+[80782] -1 x323 -1 x296 >= -1 ;+[80782] -1 x323 -1 x297 >= -1 ;+[80782] -1 x323 -1 x298 >= -1 ;+[80782] -1 x323 -1 x299 >= -1 ;+[80782] -1 x323 -1 x300 >= -1 ;+[80782] -1 x323 -1 x301 >= -1 ;+[80782] -1 x323 -1 x302 >= -1 ;+[80782] -1 x324 -1 x296 >= -1 ;+[80782] -1 x324 -1 x297 >= -1 ;+[80782] -1 x324 -1 x298 >= -1 ;+[80782] -1 x324 -1 x299 >= -1 ;+[80782] -1 x324 -1 x300 >= -1 ;+[80782] -1 x324 -1 x301 >= -1 ;+[80782] -1 x324 -1 x302 >= -1 ;+[80782] -1 x325 -1 x296 >= -1 ;+[80782] -1 x325 -1 x297 >= -1 ;+[80782] -1 x325 -1 x298 >= -1 ;+[80782] -1 x325 -1 x299 >= -1 ;+[80782] -1 x325 -1 x300 >= -1 ;+[80782] -1 x325 -1 x301 >= -1 ;+[80782] -1 x325 -1 x302 >= -1 ;+[80782] -1 x326 -1 x296 >= -1 ;+[80782] -1 x326 -1 x297 >= -1 ;+[80782] -1 x326 -1 x298 >= -1 ;+[80782] -1 x326 -1 x299 >= -1 ;+[80782] -1 x326 -1 x300 >= -1 ;+[80782] -1 x326 -1 x301 >= -1 ;+[80782] -1 x326 -1 x302 >= -1 ;+[80782] -1 x312 -1 x304 >= -1 ;+[80782] -1 x312 -1 x305 >= -1 ;+[80782] -1 x312 -1 x306 >= -1 ;+[80782] -1 x312 -1 x307 >= -1 ;+[80782] -1 x312 -1 x308 >= -1 ;+[80782] -1 x312 -1 x309 >= -1 ;+[80782] -1 x312 -1 x310 >= -1 ;+[80782] -1 x313 -1 x304 >= -1 ;+[80782] -1 x313 -1 x305 >= -1 ;+[80782] -1 x313 -1 x306 >= -1 ;+[80782] -1 x313 -1 x307 >= -1 ;+[80782] -1 x313 -1 x308 >= -1 ;+[80782] -1 x313 -1 x309 >= -1 ;+[80782] -1 x313 -1 x310 >= -1 ;+[80782] -1 x314 -1 x304 >= -1 ;+[80782] -1 x314 -1 x305 >= -1 ;+[80782] -1 x314 -1 x306 >= -1 ;+[80782] -1 x314 -1 x307 >= -1 ;+[80782] -1 x314 -1 x308 >= -1 ;+[80782] -1 x314 -1 x309 >= -1 ;+[80782] -1 x314 -1 x310 >= -1 ;+[80782] -1 x315 -1 x304 >= -1 ;+[80782] -1 x315 -1 x305 >= -1 ;+[80782] -1 x315 -1 x306 >= -1 ;+[80782] -1 x315 -1 x307 >= -1 ;+[80782] -1 x315 -1 x308 >= -1 ;+[80782] -1 x315 -1 x309 >= -1 ;+[80782] -1 x315 -1 x310 >= -1 ;+[80782] -1 x316 -1 x304 >= -1 ;+[80782] -1 x316 -1 x305 >= -1 ;+[80782] -1 x316 -1 x306 >= -1 ;+[80782] -1 x316 -1 x307 >= -1 ;+[80782] -1 x316 -1 x308 >= -1 ;+[80782] -1 x316 -1 x309 >= -1 ;+[80782] -1 x316 -1 x310 >= -1 ;+[80782] -1 x317 -1 x304 >= -1 ;+[80782] -1 x317 -1 x305 >= -1 ;+[80782] -1 x317 -1 x306 >= -1 ;+[80782] -1 x317 -1 x307 >= -1 ;+[80782] -1 x317 -1 x308 >= -1 ;+[80782] -1 x317 -1 x309 >= -1 ;+[80782] -1 x317 -1 x310 >= -1 ;+[80782] -1 x318 -1 x304 >= -1 ;+[80782] -1 x318 -1 x305 >= -1 ;+[80782] -1 x318 -1 x306 >= -1 ;+[80782] -1 x318 -1 x307 >= -1 ;+[80782] -1 x318 -1 x308 >= -1 ;+[80782] -1 x318 -1 x309 >= -1 ;+[80782] -1 x318 -1 x310 >= -1 ;+[80782] -1 x320 -1 x304 >= -1 ;+[80782] -1 x320 -1 x305 >= -1 ;+[80782] -1 x320 -1 x306 >= -1 ;+[80782] -1 x320 -1 x307 >= -1 ;+[80782] -1 x320 -1 x308 >= -1 ;+[80782] -1 x320 -1 x309 >= -1 ;+[80782] -1 x320 -1 x310 >= -1 ;+[80782] -1 x321 -1 x304 >= -1 ;+[80782] -1 x321 -1 x305 >= -1 ;+[80782] -1 x321 -1 x306 >= -1 ;+[80782] -1 x321 -1 x307 >= -1 ;+[80782] -1 x321 -1 x308 >= -1 ;+[80782] -1 x321 -1 x309 >= -1 ;+[80782] -1 x321 -1 x310 >= -1 ;+[80782] -1 x322 -1 x304 >= -1 ;+[80782] -1 x322 -1 x305 >= -1 ;+[80782] -1 x322 -1 x306 >= -1 ;+[80782] -1 x322 -1 x307 >= -1 ;+[80782] -1 x322 -1 x308 >= -1 ;+[80782] -1 x322 -1 x309 >= -1 ;+[80782] -1 x322 -1 x310 >= -1 ;+[80782] -1 x323 -1 x304 >= -1 ;+[80782] -1 x323 -1 x305 >= -1 ;+[80782] -1 x323 -1 x306 >= -1 ;+[80782] -1 x323 -1 x307 >= -1 ;+[80782] -1 x323 -1 x308 >= -1 ;+[80782] -1 x323 -1 x309 >= -1 ;+[80782] -1 x323 -1 x310 >= -1 ;+[80782] -1 x324 -1 x304 >= -1 ;+[80782] -1 x324 -1 x305 >= -1 ;+[80782] -1 x324 -1 x306 >= -1 ;+[80782] -1 x324 -1 x307 >= -1 ;+[80782] -1 x324 -1 x308 >= -1 ;+[80782] -1 x324 -1 x309 >= -1 ;+[80782] -1 x324 -1 x310 >= -1 ;+[80782] -1 x325 -1 x304 >= -1 ;+[80782] -1 x325 -1 x305 >= -1 ;+[80782] -1 x325 -1 x306 >= -1 ;+[80782] -1 x325 -1 x307 >= -1 ;+[80782] -1 x325 -1 x308 >= -1 ;+[80782] -1 x325 -1 x309 >= -1 ;+[80782] -1 x325 -1 x310 >= -1 ;+[80782] -1 x326 -1 x304 >= -1 ;+[80782] -1 x326 -1 x305 >= -1 ;+[80782] -1 x326 -1 x306 >= -1 ;+[80782] -1 x326 -1 x307 >= -1 ;+[80782] -1 x326 -1 x308 >= -1 ;+[80782] -1 x326 -1 x309 >= -1 ;+[80782] -1 x326 -1 x310 >= -1 ;+[80782] -1 x320 -1 x312 >= -1 ;+[80782] -1 x320 -1 x313 >= -1 ;+[80782] -1 x320 -1 x314 >= -1 ;+[80782] -1 x320 -1 x315 >= -1 ;+[80782] -1 x320 -1 x316 >= -1 ;+[80782] -1 x320 -1 x317 >= -1 ;+[80782] -1 x320 -1 x318 >= -1 ;+[80782] -1 x321 -1 x312 >= -1 ;+[80782] -1 x321 -1 x313 >= -1 ;+[80782] -1 x321 -1 x314 >= -1 ;+[80782] -1 x321 -1 x315 >= -1 ;+[80782] -1 x321 -1 x316 >= -1 ;+[80782] -1 x321 -1 x317 >= -1 ;+[80782] -1 x321 -1 x318 >= -1 ;+[80782] -1 x322 -1 x312 >= -1 ;+[80782] -1 x322 -1 x313 >= -1 ;+[80782] -1 x322 -1 x314 >= -1 ;+[80782] -1 x322 -1 x315 >= -1 ;+[80782] -1 x322 -1 x316 >= -1 ;+[80782] -1 x322 -1 x317 >= -1 ;+[80782] -1 x322 -1 x318 >= -1 ;+[80782] -1 x323 -1 x312 >= -1 ;+[80782] -1 x323 -1 x313 >= -1 ;+[80782] -1 x323 -1 x314 >= -1 ;+[80782] -1 x323 -1 x315 >= -1 ;+[80782] -1 x323 -1 x316 >= -1 ;+[80782] -1 x323 -1 x317 >= -1 ;+[80782] -1 x323 -1 x318 >= -1 ;+[80782] -1 x324 -1 x312 >= -1 ;+[80782] -1 x324 -1 x313 >= -1 ;+[80782] -1 x324 -1 x314 >= -1 ;+[80782] -1 x324 -1 x315 >= -1 ;+[80782] -1 x324 -1 x316 >= -1 ;+[80782] -1 x324 -1 x317 >= -1 ;+[80782] -1 x324 -1 x318 >= -1 ;+[80782] -1 x325 -1 x312 >= -1 ;+[80782] -1 x325 -1 x313 >= -1 ;+[80782] -1 x325 -1 x314 >= -1 ;+[80782] -1 x325 -1 x315 >= -1 ;+[80782] -1 x325 -1 x316 >= -1 ;+[80782] -1 x325 -1 x317 >= -1 ;+[80782] -1 x325 -1 x318 >= -1 ;+[80782] -1 x326 -1 x312 >= -1 ;+[80782] -1 x326 -1 x313 >= -1 ;+[80782] -1 x326 -1 x314 >= -1 ;+[80782] -1 x326 -1 x315 >= -1 ;+[80782] -1 x326 -1 x316 >= -1 ;+[80782] -1 x326 -1 x317 >= -1 ;+[80782] -1 x326 -1 x318 >= -1 ;+[80782] -1 x336 -1 x331 >= -1 ;+[80782] -1 x337 -1 x331 >= -1 ;+[80782] -1 x338 -1 x331 >= -1 ;+[80782] -1 x339 -1 x331 >= -1 ;+[80782] -1 x340 -1 x331 >= -1 ;+[80782] -1 x341 -1 x331 >= -1 ;+[80782] -1 x342 -1 x331 >= -1 ;+[80782] -1 x344 -1 x331 >= -1 ;+[80782] -1 x345 -1 x331 >= -1 ;+[80782] -1 x346 -1 x331 >= -1 ;+[80782] -1 x347 -1 x331 >= -1 ;+[80782] -1 x348 -1 x331 >= -1 ;+[80782] -1 x349 -1 x331 >= -1 ;+[80782] -1 x350 -1 x331 >= -1 ;+[80782] -1 x352 -1 x331 >= -1 ;+[80782] -1 x353 -1 x331 >= -1 ;+[80782] -1 x354 -1 x331 >= -1 ;+[80782] -1 x355 -1 x331 >= -1 ;+[80782] -1 x356 -1 x331 >= -1 ;+[80782] -1 x357 -1 x331 >= -1 ;+[80782] -1 x358 -1 x331 >= -1 ;+[80782] -1 x360 -1 x331 >= -1 ;+[80782] -1 x361 -1 x331 >= -1 ;+[80782] -1 x362 -1 x331 >= -1 ;+[80782] -1 x363 -1 x331 >= -1 ;+[80782] -1 x364 -1 x331 >= -1 ;+[80782] -1 x365 -1 x331 >= -1 ;+[80782] -1 x366 -1 x331 >= -1 ;+[80782] -1 x368 -1 x331 >= -1 ;+[80782] -1 x369 -1 x331 >= -1 ;+[80782] -1 x370 -1 x331 >= -1 ;+[80782] -1 x371 -1 x331 >= -1 ;+[80782] -1 x372 -1 x331 >= -1 ;+[80782] -1 x373 -1 x331 >= -1 ;+[80782] -1 x374 -1 x331 >= -1 ;+[80782] -1 x384 -1 x331 >= -1 ;+[80782] -1 x385 -1 x331 >= -1 ;+[80782] -1 x386 -1 x331 >= -1 ;+[80782] -1 x387 -1 x331 >= -1 ;+[80782] -1 x388 -1 x331 >= -1 ;+[80782] -1 x389 -1 x331 >= -1 ;+[80782] -1 x390 -1 x331 >= -1 ;+[80782] -1 x392 -1 x331 >= -1 ;+[80782] -1 x393 -1 x331 >= -1 ;+[80782] -1 x392 -1 x333 >= -1 ;+[80782] -1 x392 -1 x334 >= -1 ;+[80782] -1 x393 -1 x333 >= -1 ;+[80782] -1 x393 -1 x334 >= -1 ;+[80782] -1 x344 -1 x336 >= -1 ;+[80782] -1 x344 -1 x337 >= -1 ;+[80782] -1 x344 -1 x338 >= -1 ;+[80782] -1 x344 -1 x339 >= -1 ;+[80782] -1 x344 -1 x340 >= -1 ;+[80782] -1 x344 -1 x341 >= -1 ;+[80782] -1 x344 -1 x342 >= -1 ;+[80782] -1 x345 -1 x336 >= -1 ;+[80782] -1 x345 -1 x337 >= -1 ;+[80782] -1 x345 -1 x338 >= -1 ;+[80782] -1 x345 -1 x339 >= -1 ;+[80782] -1 x345 -1 x340 >= -1 ;+[80782] -1 x345 -1 x341 >= -1 ;+[80782] -1 x345 -1 x342 >= -1 ;+[80782] -1 x346 -1 x336 >= -1 ;+[80782] -1 x346 -1 x337 >= -1 ;+[80782] -1 x346 -1 x338 >= -1 ;+[80782] -1 x346 -1 x339 >= -1 ;+[80782] -1 x346 -1 x340 >= -1 ;+[80782] -1 x346 -1 x341 >= -1 ;+[80782] -1 x346 -1 x342 >= -1 ;+[80782] -1 x347 -1 x336 >= -1 ;+[80782] -1 x347 -1 x337 >= -1 ;+[80782] -1 x347 -1 x338 >= -1 ;+[80782] -1 x347 -1 x339 >= -1 ;+[80782] -1 x347 -1 x340 >= -1 ;+[80782] -1 x347 -1 x341 >= -1 ;+[80782] -1 x347 -1 x342 >= -1 ;+[80782] -1 x348 -1 x336 >= -1 ;+[80782] -1 x348 -1 x337 >= -1 ;+[80782] -1 x348 -1 x338 >= -1 ;+[80782] -1 x348 -1 x339 >= -1 ;+[80782] -1 x348 -1 x340 >= -1 ;+[80782] -1 x348 -1 x341 >= -1 ;+[80782] -1 x348 -1 x342 >= -1 ;+[80782] -1 x349 -1 x336 >= -1 ;+[80782] -1 x349 -1 x337 >= -1 ;+[80782] -1 x349 -1 x338 >= -1 ;+[80782] -1 x349 -1 x339 >= -1 ;+[80782] -1 x349 -1 x340 >= -1 ;+[80782] -1 x349 -1 x341 >= -1 ;+[80782] -1 x349 -1 x342 >= -1 ;+[80782] -1 x350 -1 x336 >= -1 ;+[80782] -1 x350 -1 x337 >= -1 ;+[80782] -1 x350 -1 x338 >= -1 ;+[80782] -1 x350 -1 x339 >= -1 ;+[80782] -1 x350 -1 x340 >= -1 ;+[80782] -1 x350 -1 x341 >= -1 ;+[80782] -1 x350 -1 x342 >= -1 ;+[80782] -1 x352 -1 x336 >= -1 ;+[80782] -1 x352 -1 x337 >= -1 ;+[80782] -1 x352 -1 x338 >= -1 ;+[80782] -1 x352 -1 x339 >= -1 ;+[80782] -1 x352 -1 x340 >= -1 ;+[80782] -1 x352 -1 x341 >= -1 ;+[80782] -1 x352 -1 x342 >= -1 ;+[80782] -1 x353 -1 x336 >= -1 ;+[80782] -1 x353 -1 x337 >= -1 ;+[80782] -1 x353 -1 x338 >= -1 ;+[80782] -1 x353 -1 x339 >= -1 ;+[80782] -1 x353 -1 x340 >= -1 ;+[80782] -1 x353 -1 x341 >= -1 ;+[80782] -1 x353 -1 x342 >= -1 ;+[80782] -1 x354 -1 x336 >= -1 ;+[80782] -1 x354 -1 x337 >= -1 ;+[80782] -1 x354 -1 x338 >= -1 ;+[80782] -1 x354 -1 x339 >= -1 ;+[80782] -1 x354 -1 x340 >= -1 ;+[80782] -1 x354 -1 x341 >= -1 ;+[80782] -1 x354 -1 x342 >= -1 ;+[80782] -1 x355 -1 x336 >= -1 ;+[80782] -1 x355 -1 x337 >= -1 ;+[80782] -1 x355 -1 x338 >= -1 ;+[80782] -1 x355 -1 x339 >= -1 ;+[80782] -1 x355 -1 x340 >= -1 ;+[80782] -1 x355 -1 x341 >= -1 ;+[80782] -1 x355 -1 x342 >= -1 ;+[80782] -1 x356 -1 x336 >= -1 ;+[80782] -1 x356 -1 x337 >= -1 ;+[80782] -1 x356 -1 x338 >= -1 ;+[80782] -1 x356 -1 x339 >= -1 ;+[80782] -1 x356 -1 x340 >= -1 ;+[80782] -1 x356 -1 x341 >= -1 ;+[80782] -1 x356 -1 x342 >= -1 ;+[80782] -1 x357 -1 x336 >= -1 ;+[80782] -1 x357 -1 x337 >= -1 ;+[80782] -1 x357 -1 x338 >= -1 ;+[80782] -1 x357 -1 x339 >= -1 ;+[80782] -1 x357 -1 x340 >= -1 ;+[80782] -1 x357 -1 x341 >= -1 ;+[80782] -1 x357 -1 x342 >= -1 ;+[80782] -1 x358 -1 x336 >= -1 ;+[80782] -1 x358 -1 x337 >= -1 ;+[80782] -1 x358 -1 x338 >= -1 ;+[80782] -1 x358 -1 x339 >= -1 ;+[80782] -1 x358 -1 x340 >= -1 ;+[80782] -1 x358 -1 x341 >= -1 ;+[80782] -1 x358 -1 x342 >= -1 ;+[80782] -1 x360 -1 x336 >= -1 ;+[80782] -1 x360 -1 x337 >= -1 ;+[80782] -1 x360 -1 x338 >= -1 ;+[80782] -1 x360 -1 x339 >= -1 ;+[80782] -1 x360 -1 x340 >= -1 ;+[80782] -1 x360 -1 x341 >= -1 ;+[80782] -1 x360 -1 x342 >= -1 ;+[80782] -1 x361 -1 x336 >= -1 ;+[80782] -1 x361 -1 x337 >= -1 ;+[80782] -1 x361 -1 x338 >= -1 ;+[80782] -1 x361 -1 x339 >= -1 ;+[80782] -1 x361 -1 x340 >= -1 ;+[80782] -1 x361 -1 x341 >= -1 ;+[80782] -1 x361 -1 x342 >= -1 ;+[80782] -1 x362 -1 x336 >= -1 ;+[80782] -1 x362 -1 x337 >= -1 ;+[80782] -1 x362 -1 x338 >= -1 ;+[80782] -1 x362 -1 x339 >= -1 ;+[80782] -1 x362 -1 x340 >= -1 ;+[80782] -1 x362 -1 x341 >= -1 ;+[80782] -1 x362 -1 x342 >= -1 ;+[80782] -1 x363 -1 x336 >= -1 ;+[80782] -1 x363 -1 x337 >= -1 ;+[80782] -1 x363 -1 x338 >= -1 ;+[80782] -1 x363 -1 x339 >= -1 ;+[80782] -1 x363 -1 x340 >= -1 ;+[80782] -1 x363 -1 x341 >= -1 ;+[80782] -1 x363 -1 x342 >= -1 ;+[80782] -1 x364 -1 x336 >= -1 ;+[80782] -1 x364 -1 x337 >= -1 ;+[80782] -1 x364 -1 x338 >= -1 ;+[80782] -1 x364 -1 x339 >= -1 ;+[80782] -1 x364 -1 x340 >= -1 ;+[80782] -1 x364 -1 x341 >= -1 ;+[80782] -1 x364 -1 x342 >= -1 ;+[80782] -1 x365 -1 x336 >= -1 ;+[80782] -1 x365 -1 x337 >= -1 ;+[80782] -1 x365 -1 x338 >= -1 ;+[80782] -1 x365 -1 x339 >= -1 ;+[80782] -1 x365 -1 x340 >= -1 ;+[80782] -1 x365 -1 x341 >= -1 ;+[80782] -1 x365 -1 x342 >= -1 ;+[80782] -1 x366 -1 x336 >= -1 ;+[80782] -1 x366 -1 x337 >= -1 ;+[80782] -1 x366 -1 x338 >= -1 ;+[80782] -1 x366 -1 x339 >= -1 ;+[80782] -1 x366 -1 x340 >= -1 ;+[80782] -1 x366 -1 x341 >= -1 ;+[80782] -1 x366 -1 x342 >= -1 ;+[80782] -1 x368 -1 x336 >= -1 ;+[80782] -1 x368 -1 x337 >= -1 ;+[80782] -1 x368 -1 x338 >= -1 ;+[80782] -1 x368 -1 x339 >= -1 ;+[80782] -1 x368 -1 x340 >= -1 ;+[80782] -1 x368 -1 x341 >= -1 ;+[80782] -1 x368 -1 x342 >= -1 ;+[80782] -1 x369 -1 x336 >= -1 ;+[80782] -1 x369 -1 x337 >= -1 ;+[80782] -1 x369 -1 x338 >= -1 ;+[80782] -1 x369 -1 x339 >= -1 ;+[80782] -1 x369 -1 x340 >= -1 ;+[80782] -1 x369 -1 x341 >= -1 ;+[80782] -1 x369 -1 x342 >= -1 ;+[80782] -1 x370 -1 x336 >= -1 ;+[80782] -1 x370 -1 x337 >= -1 ;+[80782] -1 x370 -1 x338 >= -1 ;+[80782] -1 x370 -1 x339 >= -1 ;+[80782] -1 x370 -1 x340 >= -1 ;+[80782] -1 x370 -1 x341 >= -1 ;+[80782] -1 x370 -1 x342 >= -1 ;+[80782] -1 x371 -1 x336 >= -1 ;+[80782] -1 x371 -1 x337 >= -1 ;+[80782] -1 x371 -1 x338 >= -1 ;+[80782] -1 x371 -1 x339 >= -1 ;+[80782] -1 x371 -1 x340 >= -1 ;+[80782] -1 x371 -1 x341 >= -1 ;+[80782] -1 x371 -1 x342 >= -1 ;+[80782] -1 x372 -1 x336 >= -1 ;+[80782] -1 x372 -1 x337 >= -1 ;+[80782] -1 x372 -1 x338 >= -1 ;+[80782] -1 x372 -1 x339 >= -1 ;+[80782] -1 x372 -1 x340 >= -1 ;+[80782] -1 x372 -1 x341 >= -1 ;+[80782] -1 x372 -1 x342 >= -1 ;+[80782] -1 x373 -1 x336 >= -1 ;+[80782] -1 x373 -1 x337 >= -1 ;+[80782] -1 x373 -1 x338 >= -1 ;+[80782] -1 x373 -1 x339 >= -1 ;+[80782] -1 x373 -1 x340 >= -1 ;+[80782] -1 x373 -1 x341 >= -1 ;+[80782] -1 x373 -1 x342 >= -1 ;+[80782] -1 x374 -1 x336 >= -1 ;+[80782] -1 x374 -1 x337 >= -1 ;+[80782] -1 x374 -1 x338 >= -1 ;+[80782] -1 x374 -1 x339 >= -1 ;+[80782] -1 x374 -1 x340 >= -1 ;+[80782] -1 x374 -1 x341 >= -1 ;+[80782] -1 x374 -1 x342 >= -1 ;+[80782] -1 x376 -1 x336 >= -1 ;+[80782] -1 x376 -1 x337 >= -1 ;+[80782] -1 x376 -1 x338 >= -1 ;+[80782] -1 x376 -1 x339 >= -1 ;+[80782] -1 x376 -1 x340 >= -1 ;+[80782] -1 x376 -1 x341 >= -1 ;+[80782] -1 x376 -1 x342 >= -1 ;+[80782] -1 x377 -1 x336 >= -1 ;+[80782] -1 x377 -1 x337 >= -1 ;+[80782] -1 x377 -1 x338 >= -1 ;+[80782] -1 x377 -1 x339 >= -1 ;+[80782] -1 x377 -1 x340 >= -1 ;+[80782] -1 x377 -1 x341 >= -1 ;+[80782] -1 x377 -1 x342 >= -1 ;+[80782] -1 x378 -1 x336 >= -1 ;+[80782] -1 x378 -1 x337 >= -1 ;+[80782] -1 x378 -1 x338 >= -1 ;+[80782] -1 x378 -1 x339 >= -1 ;+[80782] -1 x378 -1 x340 >= -1 ;+[80782] -1 x378 -1 x341 >= -1 ;+[80782] -1 x378 -1 x342 >= -1 ;+[80782] -1 x379 -1 x336 >= -1 ;+[80782] -1 x379 -1 x337 >= -1 ;+[80782] -1 x379 -1 x338 >= -1 ;+[80782] -1 x379 -1 x339 >= -1 ;+[80782] -1 x379 -1 x340 >= -1 ;+[80782] -1 x379 -1 x341 >= -1 ;+[80782] -1 x379 -1 x342 >= -1 ;+[80782] -1 x380 -1 x336 >= -1 ;+[80782] -1 x380 -1 x337 >= -1 ;+[80782] -1 x380 -1 x338 >= -1 ;+[80782] -1 x380 -1 x339 >= -1 ;+[80782] -1 x380 -1 x340 >= -1 ;+[80782] -1 x380 -1 x341 >= -1 ;+[80782] -1 x380 -1 x342 >= -1 ;+[80782] -1 x381 -1 x336 >= -1 ;+[80782] -1 x381 -1 x337 >= -1 ;+[80782] -1 x381 -1 x338 >= -1 ;+[80782] -1 x381 -1 x339 >= -1 ;+[80782] -1 x381 -1 x340 >= -1 ;+[80782] -1 x381 -1 x341 >= -1 ;+[80782] -1 x381 -1 x342 >= -1 ;+[80782] -1 x382 -1 x336 >= -1 ;+[80782] -1 x382 -1 x337 >= -1 ;+[80782] -1 x382 -1 x338 >= -1 ;+[80782] -1 x382 -1 x339 >= -1 ;+[80782] -1 x382 -1 x340 >= -1 ;+[80782] -1 x382 -1 x341 >= -1 ;+[80782] -1 x382 -1 x342 >= -1 ;+[80782] -1 x384 -1 x336 >= -1 ;+[80782] -1 x384 -1 x337 >= -1 ;+[80782] -1 x384 -1 x338 >= -1 ;+[80782] -1 x384 -1 x339 >= -1 ;+[80782] -1 x384 -1 x340 >= -1 ;+[80782] -1 x384 -1 x341 >= -1 ;+[80782] -1 x384 -1 x342 >= -1 ;+[80782] -1 x385 -1 x336 >= -1 ;+[80782] -1 x385 -1 x337 >= -1 ;+[80782] -1 x385 -1 x338 >= -1 ;+[80782] -1 x385 -1 x339 >= -1 ;+[80782] -1 x385 -1 x340 >= -1 ;+[80782] -1 x385 -1 x341 >= -1 ;+[80782] -1 x385 -1 x342 >= -1 ;+[80782] -1 x386 -1 x336 >= -1 ;+[80782] -1 x386 -1 x337 >= -1 ;+[80782] -1 x386 -1 x338 >= -1 ;+[80782] -1 x386 -1 x339 >= -1 ;+[80782] -1 x386 -1 x340 >= -1 ;+[80782] -1 x386 -1 x341 >= -1 ;+[80782] -1 x386 -1 x342 >= -1 ;+[80782] -1 x387 -1 x336 >= -1 ;+[80782] -1 x387 -1 x337 >= -1 ;+[80782] -1 x387 -1 x338 >= -1 ;+[80782] -1 x387 -1 x339 >= -1 ;+[80782] -1 x387 -1 x340 >= -1 ;+[80782] -1 x387 -1 x341 >= -1 ;+[80782] -1 x387 -1 x342 >= -1 ;+[80782] -1 x388 -1 x336 >= -1 ;+[80782] -1 x388 -1 x337 >= -1 ;+[80782] -1 x388 -1 x338 >= -1 ;+[80782] -1 x388 -1 x339 >= -1 ;+[80782] -1 x388 -1 x340 >= -1 ;+[80782] -1 x388 -1 x341 >= -1 ;+[80782] -1 x388 -1 x342 >= -1 ;+[80782] -1 x389 -1 x336 >= -1 ;+[80782] -1 x389 -1 x337 >= -1 ;+[80782] -1 x389 -1 x338 >= -1 ;+[80782] -1 x389 -1 x339 >= -1 ;+[80782] -1 x389 -1 x340 >= -1 ;+[80782] -1 x389 -1 x341 >= -1 ;+[80782] -1 x389 -1 x342 >= -1 ;+[80782] -1 x390 -1 x336 >= -1 ;+[80782] -1 x390 -1 x337 >= -1 ;+[80782] -1 x390 -1 x338 >= -1 ;+[80782] -1 x390 -1 x339 >= -1 ;+[80782] -1 x390 -1 x340 >= -1 ;+[80782] -1 x390 -1 x341 >= -1 ;+[80782] -1 x390 -1 x342 >= -1 ;+[80782] -1 x352 -1 x344 >= -1 ;+[80782] -1 x352 -1 x345 >= -1 ;+[80782] -1 x352 -1 x346 >= -1 ;+[80782] -1 x352 -1 x347 >= -1 ;+[80782] -1 x352 -1 x348 >= -1 ;+[80782] -1 x352 -1 x349 >= -1 ;+[80782] -1 x352 -1 x350 >= -1 ;+[80782] -1 x353 -1 x344 >= -1 ;+[80782] -1 x353 -1 x345 >= -1 ;+[80782] -1 x353 -1 x346 >= -1 ;+[80782] -1 x353 -1 x347 >= -1 ;+[80782] -1 x353 -1 x348 >= -1 ;+[80782] -1 x353 -1 x349 >= -1 ;+[80782] -1 x353 -1 x350 >= -1 ;+[80782] -1 x354 -1 x344 >= -1 ;+[80782] -1 x354 -1 x345 >= -1 ;+[80782] -1 x354 -1 x346 >= -1 ;+[80782] -1 x354 -1 x347 >= -1 ;+[80782] -1 x354 -1 x348 >= -1 ;+[80782] -1 x354 -1 x349 >= -1 ;+[80782] -1 x354 -1 x350 >= -1 ;+[80782] -1 x355 -1 x344 >= -1 ;+[80782] -1 x355 -1 x345 >= -1 ;+[80782] -1 x355 -1 x346 >= -1 ;+[80782] -1 x355 -1 x347 >= -1 ;+[80782] -1 x355 -1 x348 >= -1 ;+[80782] -1 x355 -1 x349 >= -1 ;+[80782] -1 x355 -1 x350 >= -1 ;+[80782] -1 x356 -1 x344 >= -1 ;+[80782] -1 x356 -1 x345 >= -1 ;+[80782] -1 x356 -1 x346 >= -1 ;+[80782] -1 x356 -1 x347 >= -1 ;+[80782] -1 x356 -1 x348 >= -1 ;+[80782] -1 x356 -1 x349 >= -1 ;+[80782] -1 x356 -1 x350 >= -1 ;+[80782] -1 x357 -1 x344 >= -1 ;+[80782] -1 x357 -1 x345 >= -1 ;+[80782] -1 x357 -1 x346 >= -1 ;+[80782] -1 x357 -1 x347 >= -1 ;+[80782] -1 x357 -1 x348 >= -1 ;+[80782] -1 x357 -1 x349 >= -1 ;+[80782] -1 x357 -1 x350 >= -1 ;+[80782] -1 x358 -1 x344 >= -1 ;+[80782] -1 x358 -1 x345 >= -1 ;+[80782] -1 x358 -1 x346 >= -1 ;+[80782] -1 x358 -1 x347 >= -1 ;+[80782] -1 x358 -1 x348 >= -1 ;+[80782] -1 x358 -1 x349 >= -1 ;+[80782] -1 x358 -1 x350 >= -1 ;+[80782] -1 x360 -1 x344 >= -1 ;+[80782] -1 x360 -1 x345 >= -1 ;+[80782] -1 x360 -1 x346 >= -1 ;+[80782] -1 x360 -1 x347 >= -1 ;+[80782] -1 x360 -1 x348 >= -1 ;+[80782] -1 x360 -1 x349 >= -1 ;+[80782] -1 x360 -1 x350 >= -1 ;+[80782] -1 x361 -1 x344 >= -1 ;+[80782] -1 x361 -1 x345 >= -1 ;+[80782] -1 x361 -1 x346 >= -1 ;+[80782] -1 x361 -1 x347 >= -1 ;+[80782] -1 x361 -1 x348 >= -1 ;+[80782] -1 x361 -1 x349 >= -1 ;+[80782] -1 x361 -1 x350 >= -1 ;+[80782] -1 x362 -1 x344 >= -1 ;+[80782] -1 x362 -1 x345 >= -1 ;+[80782] -1 x362 -1 x346 >= -1 ;+[80782] -1 x362 -1 x347 >= -1 ;+[80782] -1 x362 -1 x348 >= -1 ;+[80782] -1 x362 -1 x349 >= -1 ;+[80782] -1 x362 -1 x350 >= -1 ;+[80782] -1 x363 -1 x344 >= -1 ;+[80782] -1 x363 -1 x345 >= -1 ;+[80782] -1 x363 -1 x346 >= -1 ;+[80782] -1 x363 -1 x347 >= -1 ;+[80782] -1 x363 -1 x348 >= -1 ;+[80782] -1 x363 -1 x349 >= -1 ;+[80782] -1 x363 -1 x350 >= -1 ;+[80782] -1 x364 -1 x344 >= -1 ;+[80782] -1 x364 -1 x345 >= -1 ;+[80782] -1 x364 -1 x346 >= -1 ;+[80782] -1 x364 -1 x347 >= -1 ;+[80782] -1 x364 -1 x348 >= -1 ;+[80782] -1 x364 -1 x349 >= -1 ;+[80782] -1 x364 -1 x350 >= -1 ;+[80782] -1 x365 -1 x344 >= -1 ;+[80782] -1 x365 -1 x345 >= -1 ;+[80782] -1 x365 -1 x346 >= -1 ;+[80782] -1 x365 -1 x347 >= -1 ;+[80782] -1 x365 -1 x348 >= -1 ;+[80782] -1 x365 -1 x349 >= -1 ;+[80782] -1 x365 -1 x350 >= -1 ;+[80782] -1 x366 -1 x344 >= -1 ;+[80782] -1 x366 -1 x345 >= -1 ;+[80782] -1 x366 -1 x346 >= -1 ;+[80782] -1 x366 -1 x347 >= -1 ;+[80782] -1 x366 -1 x348 >= -1 ;+[80782] -1 x366 -1 x349 >= -1 ;+[80782] -1 x366 -1 x350 >= -1 ;+[80782] -1 x368 -1 x344 >= -1 ;+[80782] -1 x368 -1 x345 >= -1 ;+[80782] -1 x368 -1 x346 >= -1 ;+[80782] -1 x368 -1 x347 >= -1 ;+[80782] -1 x368 -1 x348 >= -1 ;+[80782] -1 x368 -1 x349 >= -1 ;+[80782] -1 x368 -1 x350 >= -1 ;+[80782] -1 x369 -1 x344 >= -1 ;+[80782] -1 x369 -1 x345 >= -1 ;+[80782] -1 x369 -1 x346 >= -1 ;+[80782] -1 x369 -1 x347 >= -1 ;+[80782] -1 x369 -1 x348 >= -1 ;+[80782] -1 x369 -1 x349 >= -1 ;+[80782] -1 x369 -1 x350 >= -1 ;+[80782] -1 x370 -1 x344 >= -1 ;+[80782] -1 x370 -1 x345 >= -1 ;+[80782] -1 x370 -1 x346 >= -1 ;+[80782] -1 x370 -1 x347 >= -1 ;+[80782] -1 x370 -1 x348 >= -1 ;+[80782] -1 x370 -1 x349 >= -1 ;+[80782] -1 x370 -1 x350 >= -1 ;+[80782] -1 x371 -1 x344 >= -1 ;+[80782] -1 x371 -1 x345 >= -1 ;+[80782] -1 x371 -1 x346 >= -1 ;+[80782] -1 x371 -1 x347 >= -1 ;+[80782] -1 x371 -1 x348 >= -1 ;+[80782] -1 x371 -1 x349 >= -1 ;+[80782] -1 x371 -1 x350 >= -1 ;+[80782] -1 x372 -1 x344 >= -1 ;+[80782] -1 x372 -1 x345 >= -1 ;+[80782] -1 x372 -1 x346 >= -1 ;+[80782] -1 x372 -1 x347 >= -1 ;+[80782] -1 x372 -1 x348 >= -1 ;+[80782] -1 x372 -1 x349 >= -1 ;+[80782] -1 x372 -1 x350 >= -1 ;+[80782] -1 x373 -1 x344 >= -1 ;+[80782] -1 x373 -1 x345 >= -1 ;+[80782] -1 x373 -1 x346 >= -1 ;+[80782] -1 x373 -1 x347 >= -1 ;+[80782] -1 x373 -1 x348 >= -1 ;+[80782] -1 x373 -1 x349 >= -1 ;+[80782] -1 x373 -1 x350 >= -1 ;+[80782] -1 x374 -1 x344 >= -1 ;+[80782] -1 x374 -1 x345 >= -1 ;+[80782] -1 x374 -1 x346 >= -1 ;+[80782] -1 x374 -1 x347 >= -1 ;+[80782] -1 x374 -1 x348 >= -1 ;+[80782] -1 x374 -1 x349 >= -1 ;+[80782] -1 x374 -1 x350 >= -1 ;+[80782] -1 x376 -1 x344 >= -1 ;+[80782] -1 x376 -1 x345 >= -1 ;+[80782] -1 x376 -1 x346 >= -1 ;+[80782] -1 x376 -1 x347 >= -1 ;+[80782] -1 x376 -1 x348 >= -1 ;+[80782] -1 x376 -1 x349 >= -1 ;+[80782] -1 x376 -1 x350 >= -1 ;+[80782] -1 x377 -1 x344 >= -1 ;+[80782] -1 x377 -1 x345 >= -1 ;+[80782] -1 x377 -1 x346 >= -1 ;+[80782] -1 x377 -1 x347 >= -1 ;+[80782] -1 x377 -1 x348 >= -1 ;+[80782] -1 x377 -1 x349 >= -1 ;+[80782] -1 x377 -1 x350 >= -1 ;+[80782] -1 x378 -1 x344 >= -1 ;+[80782] -1 x378 -1 x345 >= -1 ;+[80782] -1 x378 -1 x346 >= -1 ;+[80782] -1 x378 -1 x347 >= -1 ;+[80782] -1 x378 -1 x348 >= -1 ;+[80782] -1 x378 -1 x349 >= -1 ;+[80782] -1 x378 -1 x350 >= -1 ;+[80782] -1 x379 -1 x344 >= -1 ;+[80782] -1 x379 -1 x345 >= -1 ;+[80782] -1 x379 -1 x346 >= -1 ;+[80782] -1 x379 -1 x347 >= -1 ;+[80782] -1 x379 -1 x348 >= -1 ;+[80782] -1 x379 -1 x349 >= -1 ;+[80782] -1 x379 -1 x350 >= -1 ;+[80782] -1 x380 -1 x344 >= -1 ;+[80782] -1 x380 -1 x345 >= -1 ;+[80782] -1 x380 -1 x346 >= -1 ;+[80782] -1 x380 -1 x347 >= -1 ;+[80782] -1 x380 -1 x348 >= -1 ;+[80782] -1 x380 -1 x349 >= -1 ;+[80782] -1 x380 -1 x350 >= -1 ;+[80782] -1 x381 -1 x344 >= -1 ;+[80782] -1 x381 -1 x345 >= -1 ;+[80782] -1 x381 -1 x346 >= -1 ;+[80782] -1 x381 -1 x347 >= -1 ;+[80782] -1 x381 -1 x348 >= -1 ;+[80782] -1 x381 -1 x349 >= -1 ;+[80782] -1 x381 -1 x350 >= -1 ;+[80782] -1 x382 -1 x344 >= -1 ;+[80782] -1 x382 -1 x345 >= -1 ;+[80782] -1 x382 -1 x346 >= -1 ;+[80782] -1 x382 -1 x347 >= -1 ;+[80782] -1 x382 -1 x348 >= -1 ;+[80782] -1 x382 -1 x349 >= -1 ;+[80782] -1 x382 -1 x350 >= -1 ;+[80782] -1 x384 -1 x344 >= -1 ;+[80782] -1 x384 -1 x345 >= -1 ;+[80782] -1 x384 -1 x346 >= -1 ;+[80782] -1 x384 -1 x347 >= -1 ;+[80782] -1 x384 -1 x348 >= -1 ;+[80782] -1 x384 -1 x349 >= -1 ;+[80782] -1 x384 -1 x350 >= -1 ;+[80782] -1 x385 -1 x344 >= -1 ;+[80782] -1 x385 -1 x345 >= -1 ;+[80782] -1 x385 -1 x346 >= -1 ;+[80782] -1 x385 -1 x347 >= -1 ;+[80782] -1 x385 -1 x348 >= -1 ;+[80782] -1 x385 -1 x349 >= -1 ;+[80782] -1 x385 -1 x350 >= -1 ;+[80782] -1 x386 -1 x344 >= -1 ;+[80782] -1 x386 -1 x345 >= -1 ;+[80782] -1 x386 -1 x346 >= -1 ;+[80782] -1 x386 -1 x347 >= -1 ;+[80782] -1 x386 -1 x348 >= -1 ;+[80782] -1 x386 -1 x349 >= -1 ;+[80782] -1 x386 -1 x350 >= -1 ;+[80782] -1 x387 -1 x344 >= -1 ;+[80782] -1 x387 -1 x345 >= -1 ;+[80782] -1 x387 -1 x346 >= -1 ;+[80782] -1 x387 -1 x347 >= -1 ;+[80782] -1 x387 -1 x348 >= -1 ;+[80782] -1 x387 -1 x349 >= -1 ;+[80782] -1 x387 -1 x350 >= -1 ;+[80782] -1 x388 -1 x344 >= -1 ;+[80782] -1 x388 -1 x345 >= -1 ;+[80782] -1 x388 -1 x346 >= -1 ;+[80782] -1 x388 -1 x347 >= -1 ;+[80782] -1 x388 -1 x348 >= -1 ;+[80782] -1 x388 -1 x349 >= -1 ;+[80782] -1 x388 -1 x350 >= -1 ;+[80782] -1 x389 -1 x344 >= -1 ;+[80782] -1 x389 -1 x345 >= -1 ;+[80782] -1 x389 -1 x346 >= -1 ;+[80782] -1 x389 -1 x347 >= -1 ;+[80782] -1 x389 -1 x348 >= -1 ;+[80782] -1 x389 -1 x349 >= -1 ;+[80782] -1 x389 -1 x350 >= -1 ;+[80782] -1 x390 -1 x344 >= -1 ;+[80782] -1 x390 -1 x345 >= -1 ;+[80782] -1 x390 -1 x346 >= -1 ;+[80782] -1 x390 -1 x347 >= -1 ;+[80782] -1 x390 -1 x348 >= -1 ;+[80782] -1 x390 -1 x349 >= -1 ;+[80782] -1 x390 -1 x350 >= -1 ;+[80782] -1 x360 -1 x352 >= -1 ;+[80782] -1 x360 -1 x353 >= -1 ;+[80782] -1 x360 -1 x354 >= -1 ;+[80782] -1 x360 -1 x355 >= -1 ;+[80782] -1 x360 -1 x356 >= -1 ;+[80782] -1 x360 -1 x357 >= -1 ;+[80782] -1 x360 -1 x358 >= -1 ;+[80782] -1 x361 -1 x352 >= -1 ;+[80782] -1 x361 -1 x353 >= -1 ;+[80782] -1 x361 -1 x354 >= -1 ;+[80782] -1 x361 -1 x355 >= -1 ;+[80782] -1 x361 -1 x356 >= -1 ;+[80782] -1 x361 -1 x357 >= -1 ;+[80782] -1 x361 -1 x358 >= -1 ;+[80782] -1 x362 -1 x352 >= -1 ;+[80782] -1 x362 -1 x353 >= -1 ;+[80782] -1 x362 -1 x354 >= -1 ;+[80782] -1 x362 -1 x355 >= -1 ;+[80782] -1 x362 -1 x356 >= -1 ;+[80782] -1 x362 -1 x357 >= -1 ;+[80782] -1 x362 -1 x358 >= -1 ;+[80782] -1 x363 -1 x352 >= -1 ;+[80782] -1 x363 -1 x353 >= -1 ;+[80782] -1 x363 -1 x354 >= -1 ;+[80782] -1 x363 -1 x355 >= -1 ;+[80782] -1 x363 -1 x356 >= -1 ;+[80782] -1 x363 -1 x357 >= -1 ;+[80782] -1 x363 -1 x358 >= -1 ;+[80782] -1 x364 -1 x352 >= -1 ;+[80782] -1 x364 -1 x353 >= -1 ;+[80782] -1 x364 -1 x354 >= -1 ;+[80782] -1 x364 -1 x355 >= -1 ;+[80782] -1 x364 -1 x356 >= -1 ;+[80782] -1 x364 -1 x357 >= -1 ;+[80782] -1 x364 -1 x358 >= -1 ;+[80782] -1 x365 -1 x352 >= -1 ;+[80782] -1 x365 -1 x353 >= -1 ;+[80782] -1 x365 -1 x354 >= -1 ;+[80782] -1 x365 -1 x355 >= -1 ;+[80782] -1 x365 -1 x356 >= -1 ;+[80782] -1 x365 -1 x357 >= -1 ;+[80782] -1 x365 -1 x358 >= -1 ;+[80782] -1 x366 -1 x352 >= -1 ;+[80782] -1 x366 -1 x353 >= -1 ;+[80782] -1 x366 -1 x354 >= -1 ;+[80782] -1 x366 -1 x355 >= -1 ;+[80782] -1 x366 -1 x356 >= -1 ;+[80782] -1 x366 -1 x357 >= -1 ;+[80782] -1 x366 -1 x358 >= -1 ;+[80782] -1 x368 -1 x352 >= -1 ;+[80782] -1 x368 -1 x353 >= -1 ;+[80782] -1 x368 -1 x354 >= -1 ;+[80782] -1 x368 -1 x355 >= -1 ;+[80782] -1 x368 -1 x356 >= -1 ;+[80782] -1 x368 -1 x357 >= -1 ;+[80782] -1 x368 -1 x358 >= -1 ;+[80782] -1 x369 -1 x352 >= -1 ;+[80782] -1 x369 -1 x353 >= -1 ;+[80782] -1 x369 -1 x354 >= -1 ;+[80782] -1 x369 -1 x355 >= -1 ;+[80782] -1 x369 -1 x356 >= -1 ;+[80782] -1 x369 -1 x357 >= -1 ;+[80782] -1 x369 -1 x358 >= -1 ;+[80782] -1 x370 -1 x352 >= -1 ;+[80782] -1 x370 -1 x353 >= -1 ;+[80782] -1 x370 -1 x354 >= -1 ;+[80782] -1 x370 -1 x355 >= -1 ;+[80782] -1 x370 -1 x356 >= -1 ;+[80782] -1 x370 -1 x357 >= -1 ;+[80782] -1 x370 -1 x358 >= -1 ;+[80782] -1 x371 -1 x352 >= -1 ;+[80782] -1 x371 -1 x353 >= -1 ;+[80782] -1 x371 -1 x354 >= -1 ;+[80782] -1 x371 -1 x355 >= -1 ;+[80782] -1 x371 -1 x356 >= -1 ;+[80782] -1 x371 -1 x357 >= -1 ;+[80782] -1 x371 -1 x358 >= -1 ;+[80782] -1 x372 -1 x352 >= -1 ;+[80782] -1 x372 -1 x353 >= -1 ;+[80782] -1 x372 -1 x354 >= -1 ;+[80782] -1 x372 -1 x355 >= -1 ;+[80782] -1 x372 -1 x356 >= -1 ;+[80782] -1 x372 -1 x357 >= -1 ;+[80782] -1 x372 -1 x358 >= -1 ;+[80782] -1 x373 -1 x352 >= -1 ;+[80782] -1 x373 -1 x353 >= -1 ;+[80782] -1 x373 -1 x354 >= -1 ;+[80782] -1 x373 -1 x355 >= -1 ;+[80782] -1 x373 -1 x356 >= -1 ;+[80782] -1 x373 -1 x357 >= -1 ;+[80782] -1 x373 -1 x358 >= -1 ;+[80782] -1 x374 -1 x352 >= -1 ;+[80782] -1 x374 -1 x353 >= -1 ;+[80782] -1 x374 -1 x354 >= -1 ;+[80782] -1 x374 -1 x355 >= -1 ;+[80782] -1 x374 -1 x356 >= -1 ;+[80782] -1 x374 -1 x357 >= -1 ;+[80782] -1 x374 -1 x358 >= -1 ;+[80782] -1 x376 -1 x352 >= -1 ;+[80782] -1 x376 -1 x353 >= -1 ;+[80782] -1 x376 -1 x354 >= -1 ;+[80782] -1 x376 -1 x355 >= -1 ;+[80782] -1 x376 -1 x356 >= -1 ;+[80782] -1 x376 -1 x357 >= -1 ;+[80782] -1 x376 -1 x358 >= -1 ;+[80782] -1 x377 -1 x352 >= -1 ;+[80782] -1 x377 -1 x353 >= -1 ;+[80782] -1 x377 -1 x354 >= -1 ;+[80782] -1 x377 -1 x355 >= -1 ;+[80782] -1 x377 -1 x356 >= -1 ;+[80782] -1 x377 -1 x357 >= -1 ;+[80782] -1 x377 -1 x358 >= -1 ;+[80782] -1 x378 -1 x352 >= -1 ;+[80782] -1 x378 -1 x353 >= -1 ;+[80782] -1 x378 -1 x354 >= -1 ;+[80782] -1 x378 -1 x355 >= -1 ;+[80782] -1 x378 -1 x356 >= -1 ;+[80782] -1 x378 -1 x357 >= -1 ;+[80782] -1 x378 -1 x358 >= -1 ;+[80782] -1 x379 -1 x352 >= -1 ;+[80782] -1 x379 -1 x353 >= -1 ;+[80782] -1 x379 -1 x354 >= -1 ;+[80782] -1 x379 -1 x355 >= -1 ;+[80782] -1 x379 -1 x356 >= -1 ;+[80782] -1 x379 -1 x357 >= -1 ;+[80782] -1 x379 -1 x358 >= -1 ;+[80782] -1 x380 -1 x352 >= -1 ;+[80782] -1 x380 -1 x353 >= -1 ;+[80782] -1 x380 -1 x354 >= -1 ;+[80782] -1 x380 -1 x355 >= -1 ;+[80782] -1 x380 -1 x356 >= -1 ;+[80782] -1 x380 -1 x357 >= -1 ;+[80782] -1 x380 -1 x358 >= -1 ;+[80782] -1 x381 -1 x352 >= -1 ;+[80782] -1 x381 -1 x353 >= -1 ;+[80782] -1 x381 -1 x354 >= -1 ;+[80782] -1 x381 -1 x355 >= -1 ;+[80782] -1 x381 -1 x356 >= -1 ;+[80782] -1 x381 -1 x357 >= -1 ;+[80782] -1 x381 -1 x358 >= -1 ;+[80782] -1 x382 -1 x352 >= -1 ;+[80782] -1 x382 -1 x353 >= -1 ;+[80782] -1 x382 -1 x354 >= -1 ;+[80782] -1 x382 -1 x355 >= -1 ;+[80782] -1 x382 -1 x356 >= -1 ;+[80782] -1 x382 -1 x357 >= -1 ;+[80782] -1 x382 -1 x358 >= -1 ;+[80782] -1 x384 -1 x352 >= -1 ;+[80782] -1 x384 -1 x353 >= -1 ;+[80782] -1 x384 -1 x354 >= -1 ;+[80782] -1 x384 -1 x355 >= -1 ;+[80782] -1 x384 -1 x356 >= -1 ;+[80782] -1 x384 -1 x357 >= -1 ;+[80782] -1 x384 -1 x358 >= -1 ;+[80782] -1 x385 -1 x352 >= -1 ;+[80782] -1 x385 -1 x353 >= -1 ;+[80782] -1 x385 -1 x354 >= -1 ;+[80782] -1 x385 -1 x355 >= -1 ;+[80782] -1 x385 -1 x356 >= -1 ;+[80782] -1 x385 -1 x357 >= -1 ;+[80782] -1 x385 -1 x358 >= -1 ;+[80782] -1 x386 -1 x352 >= -1 ;+[80782] -1 x386 -1 x353 >= -1 ;+[80782] -1 x386 -1 x354 >= -1 ;+[80782] -1 x386 -1 x355 >= -1 ;+[80782] -1 x386 -1 x356 >= -1 ;+[80782] -1 x386 -1 x357 >= -1 ;+[80782] -1 x386 -1 x358 >= -1 ;+[80782] -1 x387 -1 x352 >= -1 ;+[80782] -1 x387 -1 x353 >= -1 ;+[80782] -1 x387 -1 x354 >= -1 ;+[80782] -1 x387 -1 x355 >= -1 ;+[80782] -1 x387 -1 x356 >= -1 ;+[80782] -1 x387 -1 x357 >= -1 ;+[80782] -1 x387 -1 x358 >= -1 ;+[80782] -1 x388 -1 x352 >= -1 ;+[80782] -1 x388 -1 x353 >= -1 ;+[80782] -1 x388 -1 x354 >= -1 ;+[80782] -1 x388 -1 x355 >= -1 ;+[80782] -1 x388 -1 x356 >= -1 ;+[80782] -1 x388 -1 x357 >= -1 ;+[80782] -1 x388 -1 x358 >= -1 ;+[80782] -1 x389 -1 x352 >= -1 ;+[80782] -1 x389 -1 x353 >= -1 ;+[80782] -1 x389 -1 x354 >= -1 ;+[80782] -1 x389 -1 x355 >= -1 ;+[80782] -1 x389 -1 x356 >= -1 ;+[80782] -1 x389 -1 x357 >= -1 ;+[80782] -1 x389 -1 x358 >= -1 ;+[80782] -1 x390 -1 x352 >= -1 ;+[80782] -1 x390 -1 x353 >= -1 ;+[80782] -1 x390 -1 x354 >= -1 ;+[80782] -1 x390 -1 x355 >= -1 ;+[80782] -1 x390 -1 x356 >= -1 ;+[80782] -1 x390 -1 x357 >= -1 ;+[80782] -1 x390 -1 x358 >= -1 ;+[80782] -1 x368 -1 x360 >= -1 ;+[80782] -1 x368 -1 x361 >= -1 ;+[80782] -1 x368 -1 x362 >= -1 ;+[80782] -1 x368 -1 x363 >= -1 ;+[80782] -1 x368 -1 x364 >= -1 ;+[80782] -1 x368 -1 x365 >= -1 ;+[80782] -1 x368 -1 x366 >= -1 ;+[80782] -1 x369 -1 x360 >= -1 ;+[80782] -1 x369 -1 x361 >= -1 ;+[80782] -1 x369 -1 x362 >= -1 ;+[80782] -1 x369 -1 x363 >= -1 ;+[80782] -1 x369 -1 x364 >= -1 ;+[80782] -1 x369 -1 x365 >= -1 ;+[80782] -1 x369 -1 x366 >= -1 ;+[80782] -1 x370 -1 x360 >= -1 ;+[80782] -1 x370 -1 x361 >= -1 ;+[80782] -1 x370 -1 x362 >= -1 ;+[80782] -1 x370 -1 x363 >= -1 ;+[80782] -1 x370 -1 x364 >= -1 ;+[80782] -1 x370 -1 x365 >= -1 ;+[80782] -1 x370 -1 x366 >= -1 ;+[80782] -1 x371 -1 x360 >= -1 ;+[80782] -1 x371 -1 x361 >= -1 ;+[80782] -1 x371 -1 x362 >= -1 ;+[80782] -1 x371 -1 x363 >= -1 ;+[80782] -1 x371 -1 x364 >= -1 ;+[80782] -1 x371 -1 x365 >= -1 ;+[80782] -1 x371 -1 x366 >= -1 ;+[80782] -1 x372 -1 x360 >= -1 ;+[80782] -1 x372 -1 x361 >= -1 ;+[80782] -1 x372 -1 x362 >= -1 ;+[80782] -1 x372 -1 x363 >= -1 ;+[80782] -1 x372 -1 x364 >= -1 ;+[80782] -1 x372 -1 x365 >= -1 ;+[80782] -1 x372 -1 x366 >= -1 ;+[80782] -1 x373 -1 x360 >= -1 ;+[80782] -1 x373 -1 x361 >= -1 ;+[80782] -1 x373 -1 x362 >= -1 ;+[80782] -1 x373 -1 x363 >= -1 ;+[80782] -1 x373 -1 x364 >= -1 ;+[80782] -1 x373 -1 x365 >= -1 ;+[80782] -1 x373 -1 x366 >= -1 ;+[80782] -1 x374 -1 x360 >= -1 ;+[80782] -1 x374 -1 x361 >= -1 ;+[80782] -1 x374 -1 x362 >= -1 ;+[80782] -1 x374 -1 x363 >= -1 ;+[80782] -1 x374 -1 x364 >= -1 ;+[80782] -1 x374 -1 x365 >= -1 ;+[80782] -1 x374 -1 x366 >= -1 ;+[80782] -1 x376 -1 x360 >= -1 ;+[80782] -1 x376 -1 x361 >= -1 ;+[80782] -1 x376 -1 x362 >= -1 ;+[80782] -1 x376 -1 x363 >= -1 ;+[80782] -1 x376 -1 x364 >= -1 ;+[80782] -1 x376 -1 x365 >= -1 ;+[80782] -1 x376 -1 x366 >= -1 ;+[80782] -1 x377 -1 x360 >= -1 ;+[80782] -1 x377 -1 x361 >= -1 ;+[80782] -1 x377 -1 x362 >= -1 ;+[80782] -1 x377 -1 x363 >= -1 ;+[80782] -1 x377 -1 x364 >= -1 ;+[80782] -1 x377 -1 x365 >= -1 ;+[80782] -1 x377 -1 x366 >= -1 ;+[80782] -1 x378 -1 x360 >= -1 ;+[80782] -1 x378 -1 x361 >= -1 ;+[80782] -1 x378 -1 x362 >= -1 ;+[80782] -1 x378 -1 x363 >= -1 ;+[80782] -1 x378 -1 x364 >= -1 ;+[80782] -1 x378 -1 x365 >= -1 ;+[80782] -1 x378 -1 x366 >= -1 ;+[80782] -1 x379 -1 x360 >= -1 ;+[80782] -1 x379 -1 x361 >= -1 ;+[80782] -1 x379 -1 x362 >= -1 ;+[80782] -1 x379 -1 x363 >= -1 ;+[80782] -1 x379 -1 x364 >= -1 ;+[80782] -1 x379 -1 x365 >= -1 ;+[80782] -1 x379 -1 x366 >= -1 ;+[80782] -1 x380 -1 x360 >= -1 ;+[80782] -1 x380 -1 x361 >= -1 ;+[80782] -1 x380 -1 x362 >= -1 ;+[80782] -1 x380 -1 x363 >= -1 ;+[80782] -1 x380 -1 x364 >= -1 ;+[80782] -1 x380 -1 x365 >= -1 ;+[80782] -1 x380 -1 x366 >= -1 ;+[80782] -1 x381 -1 x360 >= -1 ;+[80782] -1 x381 -1 x361 >= -1 ;+[80782] -1 x381 -1 x362 >= -1 ;+[80782] -1 x381 -1 x363 >= -1 ;+[80782] -1 x381 -1 x364 >= -1 ;+[80782] -1 x381 -1 x365 >= -1 ;+[80782] -1 x381 -1 x366 >= -1 ;+[80782] -1 x382 -1 x360 >= -1 ;+[80782] -1 x382 -1 x361 >= -1 ;+[80782] -1 x382 -1 x362 >= -1 ;+[80782] -1 x382 -1 x363 >= -1 ;+[80782] -1 x382 -1 x364 >= -1 ;+[80782] -1 x382 -1 x365 >= -1 ;+[80782] -1 x382 -1 x366 >= -1 ;+[80782] -1 x384 -1 x360 >= -1 ;+[80782] -1 x384 -1 x361 >= -1 ;+[80782] -1 x384 -1 x362 >= -1 ;+[80782] -1 x384 -1 x363 >= -1 ;+[80782] -1 x384 -1 x364 >= -1 ;+[80782] -1 x384 -1 x365 >= -1 ;+[80782] -1 x384 -1 x366 >= -1 ;+[80782] -1 x385 -1 x360 >= -1 ;+[80782] -1 x385 -1 x361 >= -1 ;+[80782] -1 x385 -1 x362 >= -1 ;+[80782] -1 x385 -1 x363 >= -1 ;+[80782] -1 x385 -1 x364 >= -1 ;+[80782] -1 x385 -1 x365 >= -1 ;+[80782] -1 x385 -1 x366 >= -1 ;+[80782] -1 x386 -1 x360 >= -1 ;+[80782] -1 x386 -1 x361 >= -1 ;+[80782] -1 x386 -1 x362 >= -1 ;+[80782] -1 x386 -1 x363 >= -1 ;+[80782] -1 x386 -1 x364 >= -1 ;+[80782] -1 x386 -1 x365 >= -1 ;+[80782] -1 x386 -1 x366 >= -1 ;+[80782] -1 x387 -1 x360 >= -1 ;+[80782] -1 x387 -1 x361 >= -1 ;+[80782] -1 x387 -1 x362 >= -1 ;+[80782] -1 x387 -1 x363 >= -1 ;+[80782] -1 x387 -1 x364 >= -1 ;+[80782] -1 x387 -1 x365 >= -1 ;+[80782] -1 x387 -1 x366 >= -1 ;+[80782] -1 x388 -1 x360 >= -1 ;+[80782] -1 x388 -1 x361 >= -1 ;+[80782] -1 x388 -1 x362 >= -1 ;+[80782] -1 x388 -1 x363 >= -1 ;+[80782] -1 x388 -1 x364 >= -1 ;+[80782] -1 x388 -1 x365 >= -1 ;+[80782] -1 x388 -1 x366 >= -1 ;+[80782] -1 x389 -1 x360 >= -1 ;+[80782] -1 x389 -1 x361 >= -1 ;+[80782] -1 x389 -1 x362 >= -1 ;+[80782] -1 x389 -1 x363 >= -1 ;+[80782] -1 x389 -1 x364 >= -1 ;+[80782] -1 x389 -1 x365 >= -1 ;+[80782] -1 x389 -1 x366 >= -1 ;+[80782] -1 x390 -1 x360 >= -1 ;+[80782] -1 x390 -1 x361 >= -1 ;+[80782] -1 x390 -1 x362 >= -1 ;+[80782] -1 x390 -1 x363 >= -1 ;+[80782] -1 x390 -1 x364 >= -1 ;+[80782] -1 x390 -1 x365 >= -1 ;+[80782] -1 x390 -1 x366 >= -1 ;+[80782] -1 x376 -1 x368 >= -1 ;+[80782] -1 x376 -1 x369 >= -1 ;+[80782] -1 x376 -1 x370 >= -1 ;+[80782] -1 x376 -1 x371 >= -1 ;+[80782] -1 x376 -1 x372 >= -1 ;+[80782] -1 x376 -1 x373 >= -1 ;+[80782] -1 x376 -1 x374 >= -1 ;+[80782] -1 x377 -1 x368 >= -1 ;+[80782] -1 x377 -1 x369 >= -1 ;+[80782] -1 x377 -1 x370 >= -1 ;+[80782] -1 x377 -1 x371 >= -1 ;+[80782] -1 x377 -1 x372 >= -1 ;+[80782] -1 x377 -1 x373 >= -1 ;+[80782] -1 x377 -1 x374 >= -1 ;+[80782] -1 x378 -1 x368 >= -1 ;+[80782] -1 x378 -1 x369 >= -1 ;+[80782] -1 x378 -1 x370 >= -1 ;+[80782] -1 x378 -1 x371 >= -1 ;+[80782] -1 x378 -1 x372 >= -1 ;+[80782] -1 x378 -1 x373 >= -1 ;+[80782] -1 x378 -1 x374 >= -1 ;+[80782] -1 x379 -1 x368 >= -1 ;+[80782] -1 x379 -1 x369 >= -1 ;+[80782] -1 x379 -1 x370 >= -1 ;+[80782] -1 x379 -1 x371 >= -1 ;+[80782] -1 x379 -1 x372 >= -1 ;+[80782] -1 x379 -1 x373 >= -1 ;+[80782] -1 x379 -1 x374 >= -1 ;+[80782] -1 x380 -1 x368 >= -1 ;+[80782] -1 x380 -1 x369 >= -1 ;+[80782] -1 x380 -1 x370 >= -1 ;+[80782] -1 x380 -1 x371 >= -1 ;+[80782] -1 x380 -1 x372 >= -1 ;+[80782] -1 x380 -1 x373 >= -1 ;+[80782] -1 x380 -1 x374 >= -1 ;+[80782] -1 x381 -1 x368 >= -1 ;+[80782] -1 x381 -1 x369 >= -1 ;+[80782] -1 x381 -1 x370 >= -1 ;+[80782] -1 x381 -1 x371 >= -1 ;+[80782] -1 x381 -1 x372 >= -1 ;+[80782] -1 x381 -1 x373 >= -1 ;+[80782] -1 x381 -1 x374 >= -1 ;+[80782] -1 x382 -1 x368 >= -1 ;+[80782] -1 x382 -1 x369 >= -1 ;+[80782] -1 x382 -1 x370 >= -1 ;+[80782] -1 x382 -1 x371 >= -1 ;+[80782] -1 x382 -1 x372 >= -1 ;+[80782] -1 x382 -1 x373 >= -1 ;+[80782] -1 x382 -1 x374 >= -1 ;+[80782] -1 x384 -1 x368 >= -1 ;+[80782] -1 x384 -1 x369 >= -1 ;+[80782] -1 x384 -1 x370 >= -1 ;+[80782] -1 x384 -1 x371 >= -1 ;+[80782] -1 x384 -1 x372 >= -1 ;+[80782] -1 x384 -1 x373 >= -1 ;+[80782] -1 x384 -1 x374 >= -1 ;+[80782] -1 x385 -1 x368 >= -1 ;+[80782] -1 x385 -1 x369 >= -1 ;+[80782] -1 x385 -1 x370 >= -1 ;+[80782] -1 x385 -1 x371 >= -1 ;+[80782] -1 x385 -1 x372 >= -1 ;+[80782] -1 x385 -1 x373 >= -1 ;+[80782] -1 x385 -1 x374 >= -1 ;+[80782] -1 x386 -1 x368 >= -1 ;+[80782] -1 x386 -1 x369 >= -1 ;+[80782] -1 x386 -1 x370 >= -1 ;+[80782] -1 x386 -1 x371 >= -1 ;+[80782] -1 x386 -1 x372 >= -1 ;+[80782] -1 x386 -1 x373 >= -1 ;+[80782] -1 x386 -1 x374 >= -1 ;+[80782] -1 x387 -1 x368 >= -1 ;+[80782] -1 x387 -1 x369 >= -1 ;+[80782] -1 x387 -1 x370 >= -1 ;+[80782] -1 x387 -1 x371 >= -1 ;+[80782] -1 x387 -1 x372 >= -1 ;+[80782] -1 x387 -1 x373 >= -1 ;+[80782] -1 x387 -1 x374 >= -1 ;+[80782] -1 x388 -1 x368 >= -1 ;+[80782] -1 x388 -1 x369 >= -1 ;+[80782] -1 x388 -1 x370 >= -1 ;+[80782] -1 x388 -1 x371 >= -1 ;+[80782] -1 x388 -1 x372 >= -1 ;+[80782] -1 x388 -1 x373 >= -1 ;+[80782] -1 x388 -1 x374 >= -1 ;+[80782] -1 x389 -1 x368 >= -1 ;+[80782] -1 x389 -1 x369 >= -1 ;+[80782] -1 x389 -1 x370 >= -1 ;+[80782] -1 x389 -1 x371 >= -1 ;+[80782] -1 x389 -1 x372 >= -1 ;+[80782] -1 x389 -1 x373 >= -1 ;+[80782] -1 x389 -1 x374 >= -1 ;+[80782] -1 x390 -1 x368 >= -1 ;+[80782] -1 x390 -1 x369 >= -1 ;+[80782] -1 x390 -1 x370 >= -1 ;+[80782] -1 x390 -1 x371 >= -1 ;+[80782] -1 x390 -1 x372 >= -1 ;+[80782] -1 x390 -1 x373 >= -1 ;+[80782] -1 x390 -1 x374 >= -1 ;+[80782] -1 x384 -1 x376 >= -1 ;+[80782] -1 x384 -1 x377 >= -1 ;+[80782] -1 x384 -1 x378 >= -1 ;+[80782] -1 x384 -1 x379 >= -1 ;+[80782] -1 x384 -1 x380 >= -1 ;+[80782] -1 x384 -1 x381 >= -1 ;+[80782] -1 x384 -1 x382 >= -1 ;+[80782] -1 x385 -1 x376 >= -1 ;+[80782] -1 x385 -1 x377 >= -1 ;+[80782] -1 x385 -1 x378 >= -1 ;+[80782] -1 x385 -1 x379 >= -1 ;+[80782] -1 x385 -1 x380 >= -1 ;+[80782] -1 x385 -1 x381 >= -1 ;+[80782] -1 x385 -1 x382 >= -1 ;+[80782] -1 x386 -1 x376 >= -1 ;+[80782] -1 x386 -1 x377 >= -1 ;+[80782] -1 x386 -1 x378 >= -1 ;+[80782] -1 x386 -1 x379 >= -1 ;+[80782] -1 x386 -1 x380 >= -1 ;+[80782] -1 x386 -1 x381 >= -1 ;+[80782] -1 x386 -1 x382 >= -1 ;+[80782] -1 x387 -1 x376 >= -1 ;+[80782] -1 x387 -1 x377 >= -1 ;+[80782] -1 x387 -1 x378 >= -1 ;+[80782] -1 x387 -1 x379 >= -1 ;+[80782] -1 x387 -1 x380 >= -1 ;+[80782] -1 x387 -1 x381 >= -1 ;+[80782] -1 x387 -1 x382 >= -1 ;+[80782] -1 x388 -1 x376 >= -1 ;+[80782] -1 x388 -1 x377 >= -1 ;+[80782] -1 x388 -1 x378 >= -1 ;+[80782] -1 x388 -1 x379 >= -1 ;+[80782] -1 x388 -1 x380 >= -1 ;+[80782] -1 x388 -1 x381 >= -1 ;+[80782] -1 x388 -1 x382 >= -1 ;+[80782] -1 x389 -1 x376 >= -1 ;+[80782] -1 x389 -1 x377 >= -1 ;+[80782] -1 x389 -1 x378 >= -1 ;+[80782] -1 x389 -1 x379 >= -1 ;+[80782] -1 x389 -1 x380 >= -1 ;+[80782] -1 x389 -1 x381 >= -1 ;+[80782] -1 x389 -1 x382 >= -1 ;+[80782] -1 x390 -1 x376 >= -1 ;+[80782] -1 x390 -1 x377 >= -1 ;+[80782] -1 x390 -1 x378 >= -1 ;+[80782] -1 x390 -1 x379 >= -1 ;+[80782] -1 x390 -1 x380 >= -1 ;+[80782] -1 x390 -1 x381 >= -1 ;+[80782] -1 x390 -1 x382 >= -1 ;+[80782] -1 x411 -1 x395 >= -1 ;+[80782] -1 x399 -1 x397 >= -1 ;+[80782] -1 x401 -1 x397 >= -1 ;+[80782] -1 x403 -1 x397 >= -1 ;+[80782] -1 x405 -1 x397 >= -1 ;+[80782] -1 x407 -1 x397 >= -1 ;+[80782] -1 x409 -1 x397 >= -1 ;+[80782] -1 x401 -1 x399 >= -1 ;+[80782] -1 x403 -1 x399 >= -1 ;+[80782] -1 x405 -1 x399 >= -1 ;+[80782] -1 x407 -1 x399 >= -1 ;+[80782] -1 x409 -1 x399 >= -1 ;+[80782] -1 x403 -1 x401 >= -1 ;+[80782] -1 x405 -1 x401 >= -1 ;+[80782] -1 x407 -1 x401 >= -1 ;+[80782] -1 x409 -1 x401 >= -1 ;+[80782] -1 x405 -1 x403 >= -1 ;+[80782] -1 x407 -1 x403 >= -1 ;+[80782] -1 x409 -1 x403 >= -1 ;+[80782] -1 x407 -1 x405 >= -1 ;+[80782] -1 x409 -1 x405 >= -1 ;+[80782] -1 x409 -1 x407 >= -1 ;+[80782] -1 x6 -1 x4 >= -1 ;+[80782] -1 x6 -1 x2 >= -1 ;+[80782] -1 x4 -1 x2 >= -1 ;+[80782] -1 x12 -1 x9 >= -1 ;+[80782] -1 x15 -1 x9 >= -1 ;+[80782] -1 x18 -1 x9 >= -1 ;+[80782] -1 x25 -1 x9 >= -1 ;+[80782] -1 x33 -1 x9 >= -1 ;+[80782] -1 x40 -1 x9 >= -1 ;+[80782] -1 x26 -1 x9 >= -1 ;+[80782] -1 x41 -1 x9 >= -1 ;+[80782] -1 x31 -1 x9 >= -1 ;+[80782] -1 x42 -1 x9 >= -1 ;+[80782] -1 x34 -1 x9 >= -1 ;+[80782] -1 x23 -1 x9 >= -1 ;+[80782] -1 x43 -1 x9 >= -1 ;+[80782] -1 x35 -1 x9 >= -1 ;+[80782] -1 x27 -1 x9 >= -1 ;+[80782] -1 x44 -1 x9 >= -1 ;+[80782] -1 x36 -1 x9 >= -1 ;+[80782] -1 x28 -1 x9 >= -1 ;+[80782] -1 x45 -1 x9 >= -1 ;+[80782] -1 x37 -1 x9 >= -1 ;+[80782] -1 x29 -1 x9 >= -1 ;+[80782] -1 x21 -1 x9 >= -1 ;+[80782] -1 x24 -1 x9 >= -1 ;+[80782] -1 x32 -1 x9 >= -1 ;+[80782] -1 x15 -1 x12 >= -1 ;+[80782] -1 x18 -1 x12 >= -1 ;+[80782] -1 x25 -1 x12 >= -1 ;+[80782] -1 x33 -1 x12 >= -1 ;+[80782] -1 x40 -1 x12 >= -1 ;+[80782] -1 x26 -1 x12 >= -1 ;+[80782] -1 x41 -1 x12 >= -1 ;+[80782] -1 x42 -1 x12 >= -1 ;+[80782] -1 x34 -1 x12 >= -1 ;+[80782] -1 x23 -1 x12 >= -1 ;+[80782] -1 x43 -1 x12 >= -1 ;+[80782] -1 x35 -1 x12 >= -1 ;+[80782] -1 x27 -1 x12 >= -1 ;+[80782] -1 x44 -1 x12 >= -1 ;+[80782] -1 x36 -1 x12 >= -1 ;+[80782] -1 x28 -1 x12 >= -1 ;+[80782] -1 x45 -1 x12 >= -1 ;+[80782] -1 x37 -1 x12 >= -1 ;+[80782] -1 x29 -1 x12 >= -1 ;+[80782] -1 x21 -1 x12 >= -1 ;+[80782] -1 x24 -1 x12 >= -1 ;+[80782] -1 x32 -1 x12 >= -1 ;+[80782] -1 x39 -1 x12 >= -1 ;+[80782] -1 x18 -1 x15 >= -1 ;+[80782] -1 x25 -1 x15 >= -1 ;+[80782] -1 x33 -1 x15 >= -1 ;+[80782] -1 x40 -1 x15 >= -1 ;+[80782] -1 x26 -1 x15 >= -1 ;+[80782] -1 x41 -1 x15 >= -1 ;+[80782] -1 x31 -1 x15 >= -1 ;+[80782] -1 x42 -1 x15 >= -1 ;+[80782] -1 x34 -1 x15 >= -1 ;+[80782] -1 x43 -1 x15 >= -1 ;+[80782] -1 x35 -1 x15 >= -1 ;+[80782] -1 x27 -1 x15 >= -1 ;+[80782] -1 x44 -1 x15 >= -1 ;+[80782] -1 x36 -1 x15 >= -1 ;+[80782] -1 x28 -1 x15 >= -1 ;+[80782] -1 x45 -1 x15 >= -1 ;+[80782] -1 x37 -1 x15 >= -1 ;+[80782] -1 x29 -1 x15 >= -1 ;+[80782] -1 x21 -1 x15 >= -1 ;+[80782] -1 x24 -1 x15 >= -1 ;+[80782] -1 x32 -1 x15 >= -1 ;+[80782] -1 x39 -1 x15 >= -1 ;+[80782] -1 x21 -1 x17 >= -1 ;+[80782] -1 x25 -1 x18 >= -1 ;+[80782] -1 x33 -1 x18 >= -1 ;+[80782] -1 x40 -1 x18 >= -1 ;+[80782] -1 x26 -1 x18 >= -1 ;+[80782] -1 x41 -1 x18 >= -1 ;+[80782] -1 x31 -1 x18 >= -1 ;+[80782] -1 x42 -1 x18 >= -1 ;+[80782] -1 x34 -1 x18 >= -1 ;+[80782] -1 x23 -1 x18 >= -1 ;+[80782] -1 x43 -1 x18 >= -1 ;+[80782] -1 x35 -1 x18 >= -1 ;+[80782] -1 x27 -1 x18 >= -1 ;+[80782] -1 x44 -1 x18 >= -1 ;+[80782] -1 x36 -1 x18 >= -1 ;+[80782] -1 x28 -1 x18 >= -1 ;+[80782] -1 x45 -1 x18 >= -1 ;+[80782] -1 x37 -1 x18 >= -1 ;+[80782] -1 x29 -1 x18 >= -1 ;+[80782] -1 x21 -1 x18 >= -1 ;+[80782] -1 x24 -1 x18 >= -1 ;+[80782] -1 x32 -1 x18 >= -1 ;+[80782] -1 x39 -1 x18 >= -1 ;+[80782] -1 x33 -1 x25 >= -1 ;+[80782] -1 x40 -1 x25 >= -1 ;+[80782] -1 x41 -1 x25 >= -1 ;+[80782] -1 x31 -1 x25 >= -1 ;+[80782] -1 x42 -1 x25 >= -1 ;+[80782] -1 x34 -1 x25 >= -1 ;+[80782] -1 x43 -1 x25 >= -1 ;+[80782] -1 x35 -1 x25 >= -1 ;+[80782] -1 x44 -1 x25 >= -1 ;+[80782] -1 x36 -1 x25 >= -1 ;+[80782] -1 x45 -1 x25 >= -1 ;+[80782] -1 x37 -1 x25 >= -1 ;+[80782] -1 x32 -1 x25 >= -1 ;+[80782] -1 x39 -1 x25 >= -1 ;+[80782] -1 x40 -1 x33 >= -1 ;+[80782] -1 x26 -1 x33 >= -1 ;+[80782] -1 x41 -1 x33 >= -1 ;+[80782] -1 x42 -1 x33 >= -1 ;+[80782] -1 x23 -1 x33 >= -1 ;+[80782] -1 x43 -1 x33 >= -1 ;+[80782] -1 x27 -1 x33 >= -1 ;+[80782] -1 x44 -1 x33 >= -1 ;+[80782] -1 x28 -1 x33 >= -1 ;+[80782] -1 x45 -1 x33 >= -1 ;+[80782] -1 x29 -1 x33 >= -1 ;+[80782] -1 x24 -1 x33 >= -1 ;+[80782] -1 x39 -1 x33 >= -1 ;+[80782] -1 x26 -1 x40 >= -1 ;+[80782] -1 x31 -1 x40 >= -1 ;+[80782] -1 x34 -1 x40 >= -1 ;+[80782] -1 x23 -1 x40 >= -1 ;+[80782] -1 x35 -1 x40 >= -1 ;+[80782] -1 x27 -1 x40 >= -1 ;+[80782] -1 x36 -1 x40 >= -1 ;+[80782] -1 x28 -1 x40 >= -1 ;+[80782] -1 x37 -1 x40 >= -1 ;+[80782] -1 x29 -1 x40 >= -1 ;+[80782] -1 x24 -1 x40 >= -1 ;+[80782] -1 x32 -1 x40 >= -1 ;+[80782] -1 x41 -1 x26 >= -1 ;+[80782] -1 x31 -1 x26 >= -1 ;+[80782] -1 x42 -1 x26 >= -1 ;+[80782] -1 x34 -1 x26 >= -1 ;+[80782] -1 x43 -1 x26 >= -1 ;+[80782] -1 x35 -1 x26 >= -1 ;+[80782] -1 x44 -1 x26 >= -1 ;+[80782] -1 x36 -1 x26 >= -1 ;+[80782] -1 x45 -1 x26 >= -1 ;+[80782] -1 x37 -1 x26 >= -1 ;+[80782] -1 x32 -1 x26 >= -1 ;+[80782] -1 x39 -1 x26 >= -1 ;+[80782] -1 x31 -1 x41 >= -1 ;+[80782] -1 x34 -1 x41 >= -1 ;+[80782] -1 x23 -1 x41 >= -1 ;+[80782] -1 x35 -1 x41 >= -1 ;+[80782] -1 x27 -1 x41 >= -1 ;+[80782] -1 x36 -1 x41 >= -1 ;+[80782] -1 x28 -1 x41 >= -1 ;+[80782] -1 x37 -1 x41 >= -1 ;+[80782] -1 x29 -1 x41 >= -1 ;+[80782] -1 x24 -1 x41 >= -1 ;+[80782] -1 x32 -1 x41 >= -1 ;+[80782] -1 x42 -1 x31 >= -1 ;+[80782] -1 x23 -1 x31 >= -1 ;+[80782] -1 x43 -1 x31 >= -1 ;+[80782] -1 x27 -1 x31 >= -1 ;+[80782] -1 x44 -1 x31 >= -1 ;+[80782] -1 x28 -1 x31 >= -1 ;+[80782] -1 x45 -1 x31 >= -1 ;+[80782] -1 x29 -1 x31 >= -1 ;+[80782] -1 x24 -1 x31 >= -1 ;+[80782] -1 x39 -1 x31 >= -1 ;+[80782] -1 x34 -1 x42 >= -1 ;+[80782] -1 x23 -1 x42 >= -1 ;+[80782] -1 x35 -1 x42 >= -1 ;+[80782] -1 x27 -1 x42 >= -1 ;+[80782] -1 x36 -1 x42 >= -1 ;+[80782] -1 x28 -1 x42 >= -1 ;+[80782] -1 x37 -1 x42 >= -1 ;+[80782] -1 x29 -1 x42 >= -1 ;+[80782] -1 x24 -1 x42 >= -1 ;+[80782] -1 x32 -1 x42 >= -1 ;+[80782] -1 x23 -1 x34 >= -1 ;+[80782] -1 x43 -1 x34 >= -1 ;+[80782] -1 x27 -1 x34 >= -1 ;+[80782] -1 x44 -1 x34 >= -1 ;+[80782] -1 x28 -1 x34 >= -1 ;+[80782] -1 x45 -1 x34 >= -1 ;+[80782] -1 x29 -1 x34 >= -1 ;+[80782] -1 x24 -1 x34 >= -1 ;+[80782] -1 x39 -1 x34 >= -1 ;+[80782] -1 x43 -1 x23 >= -1 ;+[80782] -1 x35 -1 x23 >= -1 ;+[80782] -1 x44 -1 x23 >= -1 ;+[80782] -1 x36 -1 x23 >= -1 ;+[80782] -1 x45 -1 x23 >= -1 ;+[80782] -1 x37 -1 x23 >= -1 ;+[80782] -1 x32 -1 x23 >= -1 ;+[80782] -1 x39 -1 x23 >= -1 ;+[80782] -1 x35 -1 x43 >= -1 ;+[80782] -1 x27 -1 x43 >= -1 ;+[80782] -1 x36 -1 x43 >= -1 ;+[80782] -1 x28 -1 x43 >= -1 ;+[80782] -1 x37 -1 x43 >= -1 ;+[80782] -1 x29 -1 x43 >= -1 ;+[80782] -1 x24 -1 x43 >= -1 ;+[80782] -1 x32 -1 x43 >= -1 ;+[80782] -1 x27 -1 x35 >= -1 ;+[80782] -1 x44 -1 x35 >= -1 ;+[80782] -1 x28 -1 x35 >= -1 ;+[80782] -1 x45 -1 x35 >= -1 ;+[80782] -1 x29 -1 x35 >= -1 ;+[80782] -1 x24 -1 x35 >= -1 ;+[80782] -1 x39 -1 x35 >= -1 ;+[80782] -1 x44 -1 x27 >= -1 ;+[80782] -1 x36 -1 x27 >= -1 ;+[80782] -1 x45 -1 x27 >= -1 ;+[80782] -1 x37 -1 x27 >= -1 ;+[80782] -1 x32 -1 x27 >= -1 ;+[80782] -1 x39 -1 x27 >= -1 ;+[80782] -1 x36 -1 x44 >= -1 ;+[80782] -1 x28 -1 x44 >= -1 ;+[80782] -1 x37 -1 x44 >= -1 ;+[80782] -1 x29 -1 x44 >= -1 ;+[80782] -1 x24 -1 x44 >= -1 ;+[80782] -1 x32 -1 x44 >= -1 ;+[80782] -1 x28 -1 x36 >= -1 ;+[80782] -1 x45 -1 x36 >= -1 ;+[80782] -1 x29 -1 x36 >= -1 ;+[80782] -1 x24 -1 x36 >= -1 ;+[80782] -1 x39 -1 x36 >= -1 ;+[80782] -1 x45 -1 x28 >= -1 ;+[80782] -1 x37 -1 x28 >= -1 ;+[80782] -1 x32 -1 x28 >= -1 ;+[80782] -1 x39 -1 x28 >= -1 ;+[80782] -1 x37 -1 x45 >= -1 ;+[80782] -1 x29 -1 x45 >= -1 ;+[80782] -1 x24 -1 x45 >= -1 ;+[80782] -1 x32 -1 x45 >= -1 ;+[80782] -1 x29 -1 x37 >= -1 ;+[80782] -1 x24 -1 x37 >= -1 ;+[80782] -1 x39 -1 x37 >= -1 ;+[80782] -1 x32 -1 x29 >= -1 ;+[80782] -1 x39 -1 x29 >= -1 ;+[80782] -1 x32 -1 x24 >= -1 ;+[80782] -1 x39 -1 x24 >= -1 ;+[80782] -1 x39 -1 x32 >= -1 ;+[80782] -1 x50 -1 x53 >= -1 ;+[80782] -1 x47 -1 x53 >= -1 ;+[80782] -1 x47 -1 x50 >= -1 ;+[80782] -1 x51 -1 x48 >= -1 ;+[80782] -1 x54 -1 x48 >= -1 ;+[80782] -1 x57 -1 x48 >= -1 ;+[80782] -1 x64 -1 x48 >= -1 ;+[80782] -1 x72 -1 x48 >= -1 ;+[80782] -1 x80 -1 x48 >= -1 ;+[80782] -1 x88 -1 x48 >= -1 ;+[80782] -1 x96 -1 x48 >= -1 ;+[80782] -1 x111 -1 x48 >= -1 ;+[80782] -1 x102 -1 x48 >= -1 ;+[80782] -1 x65 -1 x48 >= -1 ;+[80782] -1 x73 -1 x48 >= -1 ;+[80782] -1 x81 -1 x48 >= -1 ;+[80782] -1 x89 -1 x48 >= -1 ;+[80782] -1 x104 -1 x48 >= -1 ;+[80782] -1 x112 -1 x48 >= -1 ;+[80782] -1 x94 -1 x48 >= -1 ;+[80782] -1 x66 -1 x48 >= -1 ;+[80782] -1 x74 -1 x48 >= -1 ;+[80782] -1 x82 -1 x48 >= -1 ;+[80782] -1 x105 -1 x48 >= -1 ;+[80782] -1 x113 -1 x48 >= -1 ;+[80782] -1 x97 -1 x48 >= -1 ;+[80782] -1 x86 -1 x48 >= -1 ;+[80782] -1 x67 -1 x48 >= -1 ;+[80782] -1 x75 -1 x48 >= -1 ;+[80782] -1 x106 -1 x48 >= -1 ;+[80782] -1 x114 -1 x48 >= -1 ;+[80782] -1 x98 -1 x48 >= -1 ;+[80782] -1 x90 -1 x48 >= -1 ;+[80782] -1 x78 -1 x48 >= -1 ;+[80782] -1 x68 -1 x48 >= -1 ;+[80782] -1 x107 -1 x48 >= -1 ;+[80782] -1 x115 -1 x48 >= -1 ;+[80782] -1 x99 -1 x48 >= -1 ;+[80782] -1 x91 -1 x48 >= -1 ;+[80782] -1 x83 -1 x48 >= -1 ;+[80782] -1 x70 -1 x48 >= -1 ;+[80782] -1 x108 -1 x48 >= -1 ;+[80782] -1 x116 -1 x48 >= -1 ;+[80782] -1 x100 -1 x48 >= -1 ;+[80782] -1 x92 -1 x48 >= -1 ;+[80782] -1 x84 -1 x48 >= -1 ;+[80782] -1 x76 -1 x48 >= -1 ;+[80782] -1 x62 -1 x48 >= -1 ;+[80782] -1 x119 -1 x48 >= -1 ;+[80782] -1 x60 -1 x48 >= -1 ;+[80782] -1 x118 -1 x48 >= -1 ;+[80782] -1 x63 -1 x48 >= -1 ;+[80782] -1 x71 -1 x48 >= -1 ;+[80782] -1 x79 -1 x48 >= -1 ;+[80782] -1 x87 -1 x48 >= -1 ;+[80782] -1 x95 -1 x48 >= -1 ;+[80782] -1 x103 -1 x48 >= -1 ;+[80782] -1 x54 -1 x51 >= -1 ;+[80782] -1 x57 -1 x51 >= -1 ;+[80782] -1 x64 -1 x51 >= -1 ;+[80782] -1 x72 -1 x51 >= -1 ;+[80782] -1 x80 -1 x51 >= -1 ;+[80782] -1 x88 -1 x51 >= -1 ;+[80782] -1 x96 -1 x51 >= -1 ;+[80782] -1 x111 -1 x51 >= -1 ;+[80782] -1 x102 -1 x51 >= -1 ;+[80782] -1 x65 -1 x51 >= -1 ;+[80782] -1 x73 -1 x51 >= -1 ;+[80782] -1 x81 -1 x51 >= -1 ;+[80782] -1 x89 -1 x51 >= -1 ;+[80782] -1 x104 -1 x51 >= -1 ;+[80782] -1 x112 -1 x51 >= -1 ;+[80782] -1 x66 -1 x51 >= -1 ;+[80782] -1 x74 -1 x51 >= -1 ;+[80782] -1 x82 -1 x51 >= -1 ;+[80782] -1 x105 -1 x51 >= -1 ;+[80782] -1 x113 -1 x51 >= -1 ;+[80782] -1 x97 -1 x51 >= -1 ;+[80782] -1 x86 -1 x51 >= -1 ;+[80782] -1 x67 -1 x51 >= -1 ;+[80782] -1 x75 -1 x51 >= -1 ;+[80782] -1 x106 -1 x51 >= -1 ;+[80782] -1 x114 -1 x51 >= -1 ;+[80782] -1 x98 -1 x51 >= -1 ;+[80782] -1 x90 -1 x51 >= -1 ;+[80782] -1 x78 -1 x51 >= -1 ;+[80782] -1 x68 -1 x51 >= -1 ;+[80782] -1 x107 -1 x51 >= -1 ;+[80782] -1 x115 -1 x51 >= -1 ;+[80782] -1 x99 -1 x51 >= -1 ;+[80782] -1 x91 -1 x51 >= -1 ;+[80782] -1 x83 -1 x51 >= -1 ;+[80782] -1 x70 -1 x51 >= -1 ;+[80782] -1 x108 -1 x51 >= -1 ;+[80782] -1 x116 -1 x51 >= -1 ;+[80782] -1 x100 -1 x51 >= -1 ;+[80782] -1 x92 -1 x51 >= -1 ;+[80782] -1 x84 -1 x51 >= -1 ;+[80782] -1 x76 -1 x51 >= -1 ;+[80782] -1 x62 -1 x51 >= -1 ;+[80782] -1 x119 -1 x51 >= -1 ;+[80782] -1 x60 -1 x51 >= -1 ;+[80782] -1 x118 -1 x51 >= -1 ;+[80782] -1 x63 -1 x51 >= -1 ;+[80782] -1 x71 -1 x51 >= -1 ;+[80782] -1 x79 -1 x51 >= -1 ;+[80782] -1 x87 -1 x51 >= -1 ;+[80782] -1 x95 -1 x51 >= -1 ;+[80782] -1 x103 -1 x51 >= -1 ;+[80782] -1 x110 -1 x51 >= -1 ;+[80782] -1 x57 -1 x54 >= -1 ;+[80782] -1 x64 -1 x54 >= -1 ;+[80782] -1 x72 -1 x54 >= -1 ;+[80782] -1 x80 -1 x54 >= -1 ;+[80782] -1 x88 -1 x54 >= -1 ;+[80782] -1 x96 -1 x54 >= -1 ;+[80782] -1 x111 -1 x54 >= -1 ;+[80782] -1 x102 -1 x54 >= -1 ;+[80782] -1 x65 -1 x54 >= -1 ;+[80782] -1 x73 -1 x54 >= -1 ;+[80782] -1 x81 -1 x54 >= -1 ;+[80782] -1 x89 -1 x54 >= -1 ;+[80782] -1 x104 -1 x54 >= -1 ;+[80782] -1 x112 -1 x54 >= -1 ;+[80782] -1 x94 -1 x54 >= -1 ;+[80782] -1 x66 -1 x54 >= -1 ;+[80782] -1 x74 -1 x54 >= -1 ;+[80782] -1 x82 -1 x54 >= -1 ;+[80782] -1 x105 -1 x54 >= -1 ;+[80782] -1 x113 -1 x54 >= -1 ;+[80782] -1 x97 -1 x54 >= -1 ;+[80782] -1 x67 -1 x54 >= -1 ;+[80782] -1 x75 -1 x54 >= -1 ;+[80782] -1 x106 -1 x54 >= -1 ;+[80782] -1 x114 -1 x54 >= -1 ;+[80782] -1 x98 -1 x54 >= -1 ;+[80782] -1 x90 -1 x54 >= -1 ;+[80782] -1 x78 -1 x54 >= -1 ;+[80782] -1 x68 -1 x54 >= -1 ;+[80782] -1 x107 -1 x54 >= -1 ;+[80782] -1 x115 -1 x54 >= -1 ;+[80782] -1 x99 -1 x54 >= -1 ;+[80782] -1 x91 -1 x54 >= -1 ;+[80782] -1 x83 -1 x54 >= -1 ;+[80782] -1 x70 -1 x54 >= -1 ;+[80782] -1 x108 -1 x54 >= -1 ;+[80782] -1 x116 -1 x54 >= -1 ;+[80782] -1 x100 -1 x54 >= -1 ;+[80782] -1 x92 -1 x54 >= -1 ;+[80782] -1 x84 -1 x54 >= -1 ;+[80782] -1 x76 -1 x54 >= -1 ;+[80782] -1 x62 -1 x54 >= -1 ;+[80782] -1 x119 -1 x54 >= -1 ;+[80782] -1 x60 -1 x54 >= -1 ;+[80782] -1 x118 -1 x54 >= -1 ;+[80782] -1 x63 -1 x54 >= -1 ;+[80782] -1 x71 -1 x54 >= -1 ;+[80782] -1 x79 -1 x54 >= -1 ;+[80782] -1 x87 -1 x54 >= -1 ;+[80782] -1 x95 -1 x54 >= -1 ;+[80782] -1 x103 -1 x54 >= -1 ;+[80782] -1 x110 -1 x54 >= -1 ;+[80782] -1 x60 -1 x56 >= -1 ;+[80782] -1 x64 -1 x57 >= -1 ;+[80782] -1 x72 -1 x57 >= -1 ;+[80782] -1 x80 -1 x57 >= -1 ;+[80782] -1 x88 -1 x57 >= -1 ;+[80782] -1 x96 -1 x57 >= -1 ;+[80782] -1 x111 -1 x57 >= -1 ;+[80782] -1 x65 -1 x57 >= -1 ;+[80782] -1 x73 -1 x57 >= -1 ;+[80782] -1 x81 -1 x57 >= -1 ;+[80782] -1 x89 -1 x57 >= -1 ;+[80782] -1 x104 -1 x57 >= -1 ;+[80782] -1 x112 -1 x57 >= -1 ;+[80782] -1 x94 -1 x57 >= -1 ;+[80782] -1 x66 -1 x57 >= -1 ;+[80782] -1 x74 -1 x57 >= -1 ;+[80782] -1 x82 -1 x57 >= -1 ;+[80782] -1 x105 -1 x57 >= -1 ;+[80782] -1 x113 -1 x57 >= -1 ;+[80782] -1 x97 -1 x57 >= -1 ;+[80782] -1 x86 -1 x57 >= -1 ;+[80782] -1 x67 -1 x57 >= -1 ;+[80782] -1 x75 -1 x57 >= -1 ;+[80782] -1 x106 -1 x57 >= -1 ;+[80782] -1 x114 -1 x57 >= -1 ;+[80782] -1 x98 -1 x57 >= -1 ;+[80782] -1 x90 -1 x57 >= -1 ;+[80782] -1 x78 -1 x57 >= -1 ;+[80782] -1 x68 -1 x57 >= -1 ;+[80782] -1 x107 -1 x57 >= -1 ;+[80782] -1 x115 -1 x57 >= -1 ;+[80782] -1 x99 -1 x57 >= -1 ;+[80782] -1 x91 -1 x57 >= -1 ;+[80782] -1 x83 -1 x57 >= -1 ;+[80782] -1 x70 -1 x57 >= -1 ;+[80782] -1 x108 -1 x57 >= -1 ;+[80782] -1 x116 -1 x57 >= -1 ;+[80782] -1 x100 -1 x57 >= -1 ;+[80782] -1 x92 -1 x57 >= -1 ;+[80782] -1 x84 -1 x57 >= -1 ;+[80782] -1 x76 -1 x57 >= -1 ;+[80782] -1 x62 -1 x57 >= -1 ;+[80782] -1 x119 -1 x57 >= -1 ;+[80782] -1 x60 -1 x57 >= -1 ;+[80782] -1 x118 -1 x57 >= -1 ;+[80782] -1 x63 -1 x57 >= -1 ;+[80782] -1 x71 -1 x57 >= -1 ;+[80782] -1 x79 -1 x57 >= -1 ;+[80782] -1 x87 -1 x57 >= -1 ;+[80782] -1 x95 -1 x57 >= -1 ;+[80782] -1 x103 -1 x57 >= -1 ;+[80782] -1 x110 -1 x57 >= -1 ;+[80782] -1 x72 -1 x64 >= -1 ;+[80782] -1 x80 -1 x64 >= -1 ;+[80782] -1 x88 -1 x64 >= -1 ;+[80782] -1 x96 -1 x64 >= -1 ;+[80782] -1 x111 -1 x64 >= -1 ;+[80782] -1 x102 -1 x64 >= -1 ;+[80782] -1 x73 -1 x64 >= -1 ;+[80782] -1 x81 -1 x64 >= -1 ;+[80782] -1 x89 -1 x64 >= -1 ;+[80782] -1 x104 -1 x64 >= -1 ;+[80782] -1 x112 -1 x64 >= -1 ;+[80782] -1 x94 -1 x64 >= -1 ;+[80782] -1 x74 -1 x64 >= -1 ;+[80782] -1 x82 -1 x64 >= -1 ;+[80782] -1 x105 -1 x64 >= -1 ;+[80782] -1 x113 -1 x64 >= -1 ;+[80782] -1 x97 -1 x64 >= -1 ;+[80782] -1 x86 -1 x64 >= -1 ;+[80782] -1 x75 -1 x64 >= -1 ;+[80782] -1 x106 -1 x64 >= -1 ;+[80782] -1 x114 -1 x64 >= -1 ;+[80782] -1 x98 -1 x64 >= -1 ;+[80782] -1 x90 -1 x64 >= -1 ;+[80782] -1 x78 -1 x64 >= -1 ;+[80782] -1 x107 -1 x64 >= -1 ;+[80782] -1 x115 -1 x64 >= -1 ;+[80782] -1 x99 -1 x64 >= -1 ;+[80782] -1 x91 -1 x64 >= -1 ;+[80782] -1 x83 -1 x64 >= -1 ;+[80782] -1 x70 -1 x64 >= -1 ;+[80782] -1 x108 -1 x64 >= -1 ;+[80782] -1 x116 -1 x64 >= -1 ;+[80782] -1 x100 -1 x64 >= -1 ;+[80782] -1 x92 -1 x64 >= -1 ;+[80782] -1 x84 -1 x64 >= -1 ;+[80782] -1 x76 -1 x64 >= -1 ;+[80782] -1 x71 -1 x64 >= -1 ;+[80782] -1 x79 -1 x64 >= -1 ;+[80782] -1 x87 -1 x64 >= -1 ;+[80782] -1 x95 -1 x64 >= -1 ;+[80782] -1 x103 -1 x64 >= -1 ;+[80782] -1 x110 -1 x64 >= -1 ;+[80782] -1 x80 -1 x72 >= -1 ;+[80782] -1 x88 -1 x72 >= -1 ;+[80782] -1 x96 -1 x72 >= -1 ;+[80782] -1 x111 -1 x72 >= -1 ;+[80782] -1 x102 -1 x72 >= -1 ;+[80782] -1 x65 -1 x72 >= -1 ;+[80782] -1 x81 -1 x72 >= -1 ;+[80782] -1 x89 -1 x72 >= -1 ;+[80782] -1 x104 -1 x72 >= -1 ;+[80782] -1 x112 -1 x72 >= -1 ;+[80782] -1 x94 -1 x72 >= -1 ;+[80782] -1 x66 -1 x72 >= -1 ;+[80782] -1 x82 -1 x72 >= -1 ;+[80782] -1 x105 -1 x72 >= -1 ;+[80782] -1 x113 -1 x72 >= -1 ;+[80782] -1 x97 -1 x72 >= -1 ;+[80782] -1 x86 -1 x72 >= -1 ;+[80782] -1 x67 -1 x72 >= -1 ;+[80782] -1 x106 -1 x72 >= -1 ;+[80782] -1 x114 -1 x72 >= -1 ;+[80782] -1 x98 -1 x72 >= -1 ;+[80782] -1 x90 -1 x72 >= -1 ;+[80782] -1 x78 -1 x72 >= -1 ;+[80782] -1 x68 -1 x72 >= -1 ;+[80782] -1 x107 -1 x72 >= -1 ;+[80782] -1 x115 -1 x72 >= -1 ;+[80782] -1 x99 -1 x72 >= -1 ;+[80782] -1 x91 -1 x72 >= -1 ;+[80782] -1 x83 -1 x72 >= -1 ;+[80782] -1 x108 -1 x72 >= -1 ;+[80782] -1 x116 -1 x72 >= -1 ;+[80782] -1 x100 -1 x72 >= -1 ;+[80782] -1 x92 -1 x72 >= -1 ;+[80782] -1 x84 -1 x72 >= -1 ;+[80782] -1 x62 -1 x72 >= -1 ;+[80782] -1 x63 -1 x72 >= -1 ;+[80782] -1 x79 -1 x72 >= -1 ;+[80782] -1 x87 -1 x72 >= -1 ;+[80782] -1 x95 -1 x72 >= -1 ;+[80782] -1 x103 -1 x72 >= -1 ;+[80782] -1 x110 -1 x72 >= -1 ;+[80782] -1 x88 -1 x80 >= -1 ;+[80782] -1 x96 -1 x80 >= -1 ;+[80782] -1 x111 -1 x80 >= -1 ;+[80782] -1 x102 -1 x80 >= -1 ;+[80782] -1 x65 -1 x80 >= -1 ;+[80782] -1 x73 -1 x80 >= -1 ;+[80782] -1 x89 -1 x80 >= -1 ;+[80782] -1 x104 -1 x80 >= -1 ;+[80782] -1 x112 -1 x80 >= -1 ;+[80782] -1 x94 -1 x80 >= -1 ;+[80782] -1 x66 -1 x80 >= -1 ;+[80782] -1 x74 -1 x80 >= -1 ;+[80782] -1 x105 -1 x80 >= -1 ;+[80782] -1 x113 -1 x80 >= -1 ;+[80782] -1 x97 -1 x80 >= -1 ;+[80782] -1 x86 -1 x80 >= -1 ;+[80782] -1 x67 -1 x80 >= -1 ;+[80782] -1 x75 -1 x80 >= -1 ;+[80782] -1 x106 -1 x80 >= -1 ;+[80782] -1 x114 -1 x80 >= -1 ;+[80782] -1 x98 -1 x80 >= -1 ;+[80782] -1 x90 -1 x80 >= -1 ;+[80782] -1 x68 -1 x80 >= -1 ;+[80782] -1 x107 -1 x80 >= -1 ;+[80782] -1 x115 -1 x80 >= -1 ;+[80782] -1 x99 -1 x80 >= -1 ;+[80782] -1 x91 -1 x80 >= -1 ;+[80782] -1 x70 -1 x80 >= -1 ;+[80782] -1 x108 -1 x80 >= -1 ;+[80782] -1 x116 -1 x80 >= -1 ;+[80782] -1 x100 -1 x80 >= -1 ;+[80782] -1 x92 -1 x80 >= -1 ;+[80782] -1 x76 -1 x80 >= -1 ;+[80782] -1 x62 -1 x80 >= -1 ;+[80782] -1 x63 -1 x80 >= -1 ;+[80782] -1 x71 -1 x80 >= -1 ;+[80782] -1 x87 -1 x80 >= -1 ;+[80782] -1 x95 -1 x80 >= -1 ;+[80782] -1 x103 -1 x80 >= -1 ;+[80782] -1 x110 -1 x80 >= -1 ;+[80782] -1 x96 -1 x88 >= -1 ;+[80782] -1 x111 -1 x88 >= -1 ;+[80782] -1 x102 -1 x88 >= -1 ;+[80782] -1 x65 -1 x88 >= -1 ;+[80782] -1 x73 -1 x88 >= -1 ;+[80782] -1 x81 -1 x88 >= -1 ;+[80782] -1 x104 -1 x88 >= -1 ;+[80782] -1 x112 -1 x88 >= -1 ;+[80782] -1 x94 -1 x88 >= -1 ;+[80782] -1 x66 -1 x88 >= -1 ;+[80782] -1 x74 -1 x88 >= -1 ;+[80782] -1 x82 -1 x88 >= -1 ;+[80782] -1 x105 -1 x88 >= -1 ;+[80782] -1 x113 -1 x88 >= -1 ;+[80782] -1 x97 -1 x88 >= -1 ;+[80782] -1 x67 -1 x88 >= -1 ;+[80782] -1 x75 -1 x88 >= -1 ;+[80782] -1 x106 -1 x88 >= -1 ;+[80782] -1 x114 -1 x88 >= -1 ;+[80782] -1 x98 -1 x88 >= -1 ;+[80782] -1 x78 -1 x88 >= -1 ;+[80782] -1 x68 -1 x88 >= -1 ;+[80782] -1 x107 -1 x88 >= -1 ;+[80782] -1 x115 -1 x88 >= -1 ;+[80782] -1 x99 -1 x88 >= -1 ;+[80782] -1 x83 -1 x88 >= -1 ;+[80782] -1 x70 -1 x88 >= -1 ;+[80782] -1 x108 -1 x88 >= -1 ;+[80782] -1 x116 -1 x88 >= -1 ;+[80782] -1 x100 -1 x88 >= -1 ;+[80782] -1 x84 -1 x88 >= -1 ;+[80782] -1 x76 -1 x88 >= -1 ;+[80782] -1 x62 -1 x88 >= -1 ;+[80782] -1 x63 -1 x88 >= -1 ;+[80782] -1 x71 -1 x88 >= -1 ;+[80782] -1 x79 -1 x88 >= -1 ;+[80782] -1 x95 -1 x88 >= -1 ;+[80782] -1 x103 -1 x88 >= -1 ;+[80782] -1 x110 -1 x88 >= -1 ;+[80782] -1 x111 -1 x96 >= -1 ;+[80782] -1 x102 -1 x96 >= -1 ;+[80782] -1 x65 -1 x96 >= -1 ;+[80782] -1 x73 -1 x96 >= -1 ;+[80782] -1 x81 -1 x96 >= -1 ;+[80782] -1 x89 -1 x96 >= -1 ;+[80782] -1 x104 -1 x96 >= -1 ;+[80782] -1 x112 -1 x96 >= -1 ;+[80782] -1 x66 -1 x96 >= -1 ;+[80782] -1 x74 -1 x96 >= -1 ;+[80782] -1 x82 -1 x96 >= -1 ;+[80782] -1 x105 -1 x96 >= -1 ;+[80782] -1 x113 -1 x96 >= -1 ;+[80782] -1 x86 -1 x96 >= -1 ;+[80782] -1 x67 -1 x96 >= -1 ;+[80782] -1 x75 -1 x96 >= -1 ;+[80782] -1 x106 -1 x96 >= -1 ;+[80782] -1 x114 -1 x96 >= -1 ;+[80782] -1 x90 -1 x96 >= -1 ;+[80782] -1 x78 -1 x96 >= -1 ;+[80782] -1 x68 -1 x96 >= -1 ;+[80782] -1 x107 -1 x96 >= -1 ;+[80782] -1 x115 -1 x96 >= -1 ;+[80782] -1 x91 -1 x96 >= -1 ;+[80782] -1 x83 -1 x96 >= -1 ;+[80782] -1 x70 -1 x96 >= -1 ;+[80782] -1 x108 -1 x96 >= -1 ;+[80782] -1 x116 -1 x96 >= -1 ;+[80782] -1 x92 -1 x96 >= -1 ;+[80782] -1 x84 -1 x96 >= -1 ;+[80782] -1 x76 -1 x96 >= -1 ;+[80782] -1 x62 -1 x96 >= -1 ;+[80782] -1 x63 -1 x96 >= -1 ;+[80782] -1 x71 -1 x96 >= -1 ;+[80782] -1 x79 -1 x96 >= -1 ;+[80782] -1 x87 -1 x96 >= -1 ;+[80782] -1 x103 -1 x96 >= -1 ;+[80782] -1 x110 -1 x96 >= -1 ;+[80782] -1 x102 -1 x111 >= -1 ;+[80782] -1 x65 -1 x111 >= -1 ;+[80782] -1 x73 -1 x111 >= -1 ;+[80782] -1 x81 -1 x111 >= -1 ;+[80782] -1 x89 -1 x111 >= -1 ;+[80782] -1 x104 -1 x111 >= -1 ;+[80782] -1 x94 -1 x111 >= -1 ;+[80782] -1 x66 -1 x111 >= -1 ;+[80782] -1 x74 -1 x111 >= -1 ;+[80782] -1 x82 -1 x111 >= -1 ;+[80782] -1 x105 -1 x111 >= -1 ;+[80782] -1 x97 -1 x111 >= -1 ;+[80782] -1 x86 -1 x111 >= -1 ;+[80782] -1 x67 -1 x111 >= -1 ;+[80782] -1 x75 -1 x111 >= -1 ;+[80782] -1 x106 -1 x111 >= -1 ;+[80782] -1 x98 -1 x111 >= -1 ;+[80782] -1 x90 -1 x111 >= -1 ;+[80782] -1 x78 -1 x111 >= -1 ;+[80782] -1 x68 -1 x111 >= -1 ;+[80782] -1 x107 -1 x111 >= -1 ;+[80782] -1 x99 -1 x111 >= -1 ;+[80782] -1 x91 -1 x111 >= -1 ;+[80782] -1 x83 -1 x111 >= -1 ;+[80782] -1 x70 -1 x111 >= -1 ;+[80782] -1 x108 -1 x111 >= -1 ;+[80782] -1 x100 -1 x111 >= -1 ;+[80782] -1 x92 -1 x111 >= -1 ;+[80782] -1 x84 -1 x111 >= -1 ;+[80782] -1 x76 -1 x111 >= -1 ;+[80782] -1 x62 -1 x111 >= -1 ;+[80782] -1 x63 -1 x111 >= -1 ;+[80782] -1 x71 -1 x111 >= -1 ;+[80782] -1 x79 -1 x111 >= -1 ;+[80782] -1 x87 -1 x111 >= -1 ;+[80782] -1 x95 -1 x111 >= -1 ;+[80782] -1 x103 -1 x111 >= -1 ;+[80782] -1 x65 -1 x102 >= -1 ;+[80782] -1 x73 -1 x102 >= -1 ;+[80782] -1 x81 -1 x102 >= -1 ;+[80782] -1 x89 -1 x102 >= -1 ;+[80782] -1 x112 -1 x102 >= -1 ;+[80782] -1 x94 -1 x102 >= -1 ;+[80782] -1 x66 -1 x102 >= -1 ;+[80782] -1 x74 -1 x102 >= -1 ;+[80782] -1 x82 -1 x102 >= -1 ;+[80782] -1 x113 -1 x102 >= -1 ;+[80782] -1 x97 -1 x102 >= -1 ;+[80782] -1 x86 -1 x102 >= -1 ;+[80782] -1 x67 -1 x102 >= -1 ;+[80782] -1 x75 -1 x102 >= -1 ;+[80782] -1 x114 -1 x102 >= -1 ;+[80782] -1 x98 -1 x102 >= -1 ;+[80782] -1 x90 -1 x102 >= -1 ;+[80782] -1 x78 -1 x102 >= -1 ;+[80782] -1 x68 -1 x102 >= -1 ;+[80782] -1 x115 -1 x102 >= -1 ;+[80782] -1 x99 -1 x102 >= -1 ;+[80782] -1 x91 -1 x102 >= -1 ;+[80782] -1 x83 -1 x102 >= -1 ;+[80782] -1 x70 -1 x102 >= -1 ;+[80782] -1 x116 -1 x102 >= -1 ;+[80782] -1 x100 -1 x102 >= -1 ;+[80782] -1 x92 -1 x102 >= -1 ;+[80782] -1 x84 -1 x102 >= -1 ;+[80782] -1 x76 -1 x102 >= -1 ;+[80782] -1 x62 -1 x102 >= -1 ;+[80782] -1 x63 -1 x102 >= -1 ;+[80782] -1 x71 -1 x102 >= -1 ;+[80782] -1 x79 -1 x102 >= -1 ;+[80782] -1 x87 -1 x102 >= -1 ;+[80782] -1 x95 -1 x102 >= -1 ;+[80782] -1 x110 -1 x102 >= -1 ;+[80782] -1 x73 -1 x65 >= -1 ;+[80782] -1 x81 -1 x65 >= -1 ;+[80782] -1 x89 -1 x65 >= -1 ;+[80782] -1 x104 -1 x65 >= -1 ;+[80782] -1 x112 -1 x65 >= -1 ;+[80782] -1 x94 -1 x65 >= -1 ;+[80782] -1 x74 -1 x65 >= -1 ;+[80782] -1 x82 -1 x65 >= -1 ;+[80782] -1 x105 -1 x65 >= -1 ;+[80782] -1 x113 -1 x65 >= -1 ;+[80782] -1 x97 -1 x65 >= -1 ;+[80782] -1 x86 -1 x65 >= -1 ;+[80782] -1 x75 -1 x65 >= -1 ;+[80782] -1 x106 -1 x65 >= -1 ;+[80782] -1 x114 -1 x65 >= -1 ;+[80782] -1 x98 -1 x65 >= -1 ;+[80782] -1 x90 -1 x65 >= -1 ;+[80782] -1 x78 -1 x65 >= -1 ;+[80782] -1 x107 -1 x65 >= -1 ;+[80782] -1 x115 -1 x65 >= -1 ;+[80782] -1 x99 -1 x65 >= -1 ;+[80782] -1 x91 -1 x65 >= -1 ;+[80782] -1 x83 -1 x65 >= -1 ;+[80782] -1 x70 -1 x65 >= -1 ;+[80782] -1 x108 -1 x65 >= -1 ;+[80782] -1 x116 -1 x65 >= -1 ;+[80782] -1 x100 -1 x65 >= -1 ;+[80782] -1 x92 -1 x65 >= -1 ;+[80782] -1 x84 -1 x65 >= -1 ;+[80782] -1 x76 -1 x65 >= -1 ;+[80782] -1 x71 -1 x65 >= -1 ;+[80782] -1 x79 -1 x65 >= -1 ;+[80782] -1 x87 -1 x65 >= -1 ;+[80782] -1 x95 -1 x65 >= -1 ;+[80782] -1 x103 -1 x65 >= -1 ;+[80782] -1 x110 -1 x65 >= -1 ;+[80782] -1 x81 -1 x73 >= -1 ;+[80782] -1 x89 -1 x73 >= -1 ;+[80782] -1 x104 -1 x73 >= -1 ;+[80782] -1 x112 -1 x73 >= -1 ;+[80782] -1 x94 -1 x73 >= -1 ;+[80782] -1 x66 -1 x73 >= -1 ;+[80782] -1 x82 -1 x73 >= -1 ;+[80782] -1 x105 -1 x73 >= -1 ;+[80782] -1 x113 -1 x73 >= -1 ;+[80782] -1 x97 -1 x73 >= -1 ;+[80782] -1 x86 -1 x73 >= -1 ;+[80782] -1 x67 -1 x73 >= -1 ;+[80782] -1 x106 -1 x73 >= -1 ;+[80782] -1 x114 -1 x73 >= -1 ;+[80782] -1 x98 -1 x73 >= -1 ;+[80782] -1 x90 -1 x73 >= -1 ;+[80782] -1 x78 -1 x73 >= -1 ;+[80782] -1 x68 -1 x73 >= -1 ;+[80782] -1 x107 -1 x73 >= -1 ;+[80782] -1 x115 -1 x73 >= -1 ;+[80782] -1 x99 -1 x73 >= -1 ;+[80782] -1 x91 -1 x73 >= -1 ;+[80782] -1 x83 -1 x73 >= -1 ;+[80782] -1 x108 -1 x73 >= -1 ;+[80782] -1 x116 -1 x73 >= -1 ;+[80782] -1 x100 -1 x73 >= -1 ;+[80782] -1 x92 -1 x73 >= -1 ;+[80782] -1 x84 -1 x73 >= -1 ;+[80782] -1 x62 -1 x73 >= -1 ;+[80782] -1 x63 -1 x73 >= -1 ;+[80782] -1 x79 -1 x73 >= -1 ;+[80782] -1 x87 -1 x73 >= -1 ;+[80782] -1 x95 -1 x73 >= -1 ;+[80782] -1 x103 -1 x73 >= -1 ;+[80782] -1 x110 -1 x73 >= -1 ;+[80782] -1 x89 -1 x81 >= -1 ;+[80782] -1 x104 -1 x81 >= -1 ;+[80782] -1 x112 -1 x81 >= -1 ;+[80782] -1 x94 -1 x81 >= -1 ;+[80782] -1 x66 -1 x81 >= -1 ;+[80782] -1 x74 -1 x81 >= -1 ;+[80782] -1 x105 -1 x81 >= -1 ;+[80782] -1 x113 -1 x81 >= -1 ;+[80782] -1 x97 -1 x81 >= -1 ;+[80782] -1 x86 -1 x81 >= -1 ;+[80782] -1 x67 -1 x81 >= -1 ;+[80782] -1 x75 -1 x81 >= -1 ;+[80782] -1 x106 -1 x81 >= -1 ;+[80782] -1 x114 -1 x81 >= -1 ;+[80782] -1 x98 -1 x81 >= -1 ;+[80782] -1 x90 -1 x81 >= -1 ;+[80782] -1 x68 -1 x81 >= -1 ;+[80782] -1 x107 -1 x81 >= -1 ;+[80782] -1 x115 -1 x81 >= -1 ;+[80782] -1 x99 -1 x81 >= -1 ;+[80782] -1 x91 -1 x81 >= -1 ;+[80782] -1 x70 -1 x81 >= -1 ;+[80782] -1 x108 -1 x81 >= -1 ;+[80782] -1 x116 -1 x81 >= -1 ;+[80782] -1 x100 -1 x81 >= -1 ;+[80782] -1 x92 -1 x81 >= -1 ;+[80782] -1 x76 -1 x81 >= -1 ;+[80782] -1 x62 -1 x81 >= -1 ;+[80782] -1 x63 -1 x81 >= -1 ;+[80782] -1 x71 -1 x81 >= -1 ;+[80782] -1 x87 -1 x81 >= -1 ;+[80782] -1 x95 -1 x81 >= -1 ;+[80782] -1 x103 -1 x81 >= -1 ;+[80782] -1 x110 -1 x81 >= -1 ;+[80782] -1 x104 -1 x89 >= -1 ;+[80782] -1 x112 -1 x89 >= -1 ;+[80782] -1 x94 -1 x89 >= -1 ;+[80782] -1 x66 -1 x89 >= -1 ;+[80782] -1 x74 -1 x89 >= -1 ;+[80782] -1 x82 -1 x89 >= -1 ;+[80782] -1 x105 -1 x89 >= -1 ;+[80782] -1 x113 -1 x89 >= -1 ;+[80782] -1 x97 -1 x89 >= -1 ;+[80782] -1 x67 -1 x89 >= -1 ;+[80782] -1 x75 -1 x89 >= -1 ;+[80782] -1 x106 -1 x89 >= -1 ;+[80782] -1 x114 -1 x89 >= -1 ;+[80782] -1 x98 -1 x89 >= -1 ;+[80782] -1 x78 -1 x89 >= -1 ;+[80782] -1 x68 -1 x89 >= -1 ;+[80782] -1 x107 -1 x89 >= -1 ;+[80782] -1 x115 -1 x89 >= -1 ;+[80782] -1 x99 -1 x89 >= -1 ;+[80782] -1 x83 -1 x89 >= -1 ;+[80782] -1 x70 -1 x89 >= -1 ;+[80782] -1 x108 -1 x89 >= -1 ;+[80782] -1 x116 -1 x89 >= -1 ;+[80782] -1 x100 -1 x89 >= -1 ;+[80782] -1 x84 -1 x89 >= -1 ;+[80782] -1 x76 -1 x89 >= -1 ;+[80782] -1 x62 -1 x89 >= -1 ;+[80782] -1 x63 -1 x89 >= -1 ;+[80782] -1 x71 -1 x89 >= -1 ;+[80782] -1 x79 -1 x89 >= -1 ;+[80782] -1 x95 -1 x89 >= -1 ;+[80782] -1 x103 -1 x89 >= -1 ;+[80782] -1 x110 -1 x89 >= -1 ;+[80782] -1 x112 -1 x104 >= -1 ;+[80782] -1 x94 -1 x104 >= -1 ;+[80782] -1 x66 -1 x104 >= -1 ;+[80782] -1 x74 -1 x104 >= -1 ;+[80782] -1 x82 -1 x104 >= -1 ;+[80782] -1 x113 -1 x104 >= -1 ;+[80782] -1 x97 -1 x104 >= -1 ;+[80782] -1 x86 -1 x104 >= -1 ;+[80782] -1 x67 -1 x104 >= -1 ;+[80782] -1 x75 -1 x104 >= -1 ;+[80782] -1 x114 -1 x104 >= -1 ;+[80782] -1 x98 -1 x104 >= -1 ;+[80782] -1 x90 -1 x104 >= -1 ;+[80782] -1 x78 -1 x104 >= -1 ;+[80782] -1 x68 -1 x104 >= -1 ;+[80782] -1 x115 -1 x104 >= -1 ;+[80782] -1 x99 -1 x104 >= -1 ;+[80782] -1 x91 -1 x104 >= -1 ;+[80782] -1 x83 -1 x104 >= -1 ;+[80782] -1 x70 -1 x104 >= -1 ;+[80782] -1 x116 -1 x104 >= -1 ;+[80782] -1 x100 -1 x104 >= -1 ;+[80782] -1 x92 -1 x104 >= -1 ;+[80782] -1 x84 -1 x104 >= -1 ;+[80782] -1 x76 -1 x104 >= -1 ;+[80782] -1 x62 -1 x104 >= -1 ;+[80782] -1 x63 -1 x104 >= -1 ;+[80782] -1 x71 -1 x104 >= -1 ;+[80782] -1 x79 -1 x104 >= -1 ;+[80782] -1 x87 -1 x104 >= -1 ;+[80782] -1 x95 -1 x104 >= -1 ;+[80782] -1 x110 -1 x104 >= -1 ;+[80782] -1 x94 -1 x112 >= -1 ;+[80782] -1 x66 -1 x112 >= -1 ;+[80782] -1 x74 -1 x112 >= -1 ;+[80782] -1 x82 -1 x112 >= -1 ;+[80782] -1 x105 -1 x112 >= -1 ;+[80782] -1 x97 -1 x112 >= -1 ;+[80782] -1 x86 -1 x112 >= -1 ;+[80782] -1 x67 -1 x112 >= -1 ;+[80782] -1 x75 -1 x112 >= -1 ;+[80782] -1 x106 -1 x112 >= -1 ;+[80782] -1 x98 -1 x112 >= -1 ;+[80782] -1 x90 -1 x112 >= -1 ;+[80782] -1 x78 -1 x112 >= -1 ;+[80782] -1 x68 -1 x112 >= -1 ;+[80782] -1 x107 -1 x112 >= -1 ;+[80782] -1 x99 -1 x112 >= -1 ;+[80782] -1 x91 -1 x112 >= -1 ;+[80782] -1 x83 -1 x112 >= -1 ;+[80782] -1 x70 -1 x112 >= -1 ;+[80782] -1 x108 -1 x112 >= -1 ;+[80782] -1 x100 -1 x112 >= -1 ;+[80782] -1 x92 -1 x112 >= -1 ;+[80782] -1 x84 -1 x112 >= -1 ;+[80782] -1 x76 -1 x112 >= -1 ;+[80782] -1 x62 -1 x112 >= -1 ;+[80782] -1 x63 -1 x112 >= -1 ;+[80782] -1 x71 -1 x112 >= -1 ;+[80782] -1 x79 -1 x112 >= -1 ;+[80782] -1 x87 -1 x112 >= -1 ;+[80782] -1 x95 -1 x112 >= -1 ;+[80782] -1 x103 -1 x112 >= -1 ;+[80782] -1 x66 -1 x94 >= -1 ;+[80782] -1 x74 -1 x94 >= -1 ;+[80782] -1 x82 -1 x94 >= -1 ;+[80782] -1 x105 -1 x94 >= -1 ;+[80782] -1 x113 -1 x94 >= -1 ;+[80782] -1 x86 -1 x94 >= -1 ;+[80782] -1 x67 -1 x94 >= -1 ;+[80782] -1 x75 -1 x94 >= -1 ;+[80782] -1 x106 -1 x94 >= -1 ;+[80782] -1 x114 -1 x94 >= -1 ;+[80782] -1 x90 -1 x94 >= -1 ;+[80782] -1 x78 -1 x94 >= -1 ;+[80782] -1 x68 -1 x94 >= -1 ;+[80782] -1 x107 -1 x94 >= -1 ;+[80782] -1 x115 -1 x94 >= -1 ;+[80782] -1 x91 -1 x94 >= -1 ;+[80782] -1 x83 -1 x94 >= -1 ;+[80782] -1 x70 -1 x94 >= -1 ;+[80782] -1 x108 -1 x94 >= -1 ;+[80782] -1 x116 -1 x94 >= -1 ;+[80782] -1 x92 -1 x94 >= -1 ;+[80782] -1 x84 -1 x94 >= -1 ;+[80782] -1 x76 -1 x94 >= -1 ;+[80782] -1 x62 -1 x94 >= -1 ;+[80782] -1 x63 -1 x94 >= -1 ;+[80782] -1 x71 -1 x94 >= -1 ;+[80782] -1 x79 -1 x94 >= -1 ;+[80782] -1 x87 -1 x94 >= -1 ;+[80782] -1 x103 -1 x94 >= -1 ;+[80782] -1 x110 -1 x94 >= -1 ;+[80782] -1 x74 -1 x66 >= -1 ;+[80782] -1 x82 -1 x66 >= -1 ;+[80782] -1 x105 -1 x66 >= -1 ;+[80782] -1 x113 -1 x66 >= -1 ;+[80782] -1 x97 -1 x66 >= -1 ;+[80782] -1 x86 -1 x66 >= -1 ;+[80782] -1 x75 -1 x66 >= -1 ;+[80782] -1 x106 -1 x66 >= -1 ;+[80782] -1 x114 -1 x66 >= -1 ;+[80782] -1 x98 -1 x66 >= -1 ;+[80782] -1 x90 -1 x66 >= -1 ;+[80782] -1 x78 -1 x66 >= -1 ;+[80782] -1 x107 -1 x66 >= -1 ;+[80782] -1 x115 -1 x66 >= -1 ;+[80782] -1 x99 -1 x66 >= -1 ;+[80782] -1 x91 -1 x66 >= -1 ;+[80782] -1 x83 -1 x66 >= -1 ;+[80782] -1 x70 -1 x66 >= -1 ;+[80782] -1 x108 -1 x66 >= -1 ;+[80782] -1 x116 -1 x66 >= -1 ;+[80782] -1 x100 -1 x66 >= -1 ;+[80782] -1 x92 -1 x66 >= -1 ;+[80782] -1 x84 -1 x66 >= -1 ;+[80782] -1 x76 -1 x66 >= -1 ;+[80782] -1 x71 -1 x66 >= -1 ;+[80782] -1 x79 -1 x66 >= -1 ;+[80782] -1 x87 -1 x66 >= -1 ;+[80782] -1 x95 -1 x66 >= -1 ;+[80782] -1 x103 -1 x66 >= -1 ;+[80782] -1 x110 -1 x66 >= -1 ;+[80782] -1 x82 -1 x74 >= -1 ;+[80782] -1 x105 -1 x74 >= -1 ;+[80782] -1 x113 -1 x74 >= -1 ;+[80782] -1 x97 -1 x74 >= -1 ;+[80782] -1 x86 -1 x74 >= -1 ;+[80782] -1 x67 -1 x74 >= -1 ;+[80782] -1 x106 -1 x74 >= -1 ;+[80782] -1 x114 -1 x74 >= -1 ;+[80782] -1 x98 -1 x74 >= -1 ;+[80782] -1 x90 -1 x74 >= -1 ;+[80782] -1 x78 -1 x74 >= -1 ;+[80782] -1 x68 -1 x74 >= -1 ;+[80782] -1 x107 -1 x74 >= -1 ;+[80782] -1 x115 -1 x74 >= -1 ;+[80782] -1 x99 -1 x74 >= -1 ;+[80782] -1 x91 -1 x74 >= -1 ;+[80782] -1 x83 -1 x74 >= -1 ;+[80782] -1 x108 -1 x74 >= -1 ;+[80782] -1 x116 -1 x74 >= -1 ;+[80782] -1 x100 -1 x74 >= -1 ;+[80782] -1 x92 -1 x74 >= -1 ;+[80782] -1 x84 -1 x74 >= -1 ;+[80782] -1 x62 -1 x74 >= -1 ;+[80782] -1 x63 -1 x74 >= -1 ;+[80782] -1 x79 -1 x74 >= -1 ;+[80782] -1 x87 -1 x74 >= -1 ;+[80782] -1 x95 -1 x74 >= -1 ;+[80782] -1 x103 -1 x74 >= -1 ;+[80782] -1 x110 -1 x74 >= -1 ;+[80782] -1 x105 -1 x82 >= -1 ;+[80782] -1 x113 -1 x82 >= -1 ;+[80782] -1 x97 -1 x82 >= -1 ;+[80782] -1 x86 -1 x82 >= -1 ;+[80782] -1 x67 -1 x82 >= -1 ;+[80782] -1 x75 -1 x82 >= -1 ;+[80782] -1 x106 -1 x82 >= -1 ;+[80782] -1 x114 -1 x82 >= -1 ;+[80782] -1 x98 -1 x82 >= -1 ;+[80782] -1 x90 -1 x82 >= -1 ;+[80782] -1 x68 -1 x82 >= -1 ;+[80782] -1 x107 -1 x82 >= -1 ;+[80782] -1 x115 -1 x82 >= -1 ;+[80782] -1 x99 -1 x82 >= -1 ;+[80782] -1 x91 -1 x82 >= -1 ;+[80782] -1 x70 -1 x82 >= -1 ;+[80782] -1 x108 -1 x82 >= -1 ;+[80782] -1 x116 -1 x82 >= -1 ;+[80782] -1 x100 -1 x82 >= -1 ;+[80782] -1 x92 -1 x82 >= -1 ;+[80782] -1 x76 -1 x82 >= -1 ;+[80782] -1 x62 -1 x82 >= -1 ;+[80782] -1 x63 -1 x82 >= -1 ;+[80782] -1 x71 -1 x82 >= -1 ;+[80782] -1 x87 -1 x82 >= -1 ;+[80782] -1 x95 -1 x82 >= -1 ;+[80782] -1 x103 -1 x82 >= -1 ;+[80782] -1 x110 -1 x82 >= -1 ;+[80782] -1 x113 -1 x105 >= -1 ;+[80782] -1 x97 -1 x105 >= -1 ;+[80782] -1 x86 -1 x105 >= -1 ;+[80782] -1 x67 -1 x105 >= -1 ;+[80782] -1 x75 -1 x105 >= -1 ;+[80782] -1 x114 -1 x105 >= -1 ;+[80782] -1 x98 -1 x105 >= -1 ;+[80782] -1 x90 -1 x105 >= -1 ;+[80782] -1 x78 -1 x105 >= -1 ;+[80782] -1 x68 -1 x105 >= -1 ;+[80782] -1 x115 -1 x105 >= -1 ;+[80782] -1 x99 -1 x105 >= -1 ;+[80782] -1 x91 -1 x105 >= -1 ;+[80782] -1 x83 -1 x105 >= -1 ;+[80782] -1 x70 -1 x105 >= -1 ;+[80782] -1 x116 -1 x105 >= -1 ;+[80782] -1 x100 -1 x105 >= -1 ;+[80782] -1 x92 -1 x105 >= -1 ;+[80782] -1 x84 -1 x105 >= -1 ;+[80782] -1 x76 -1 x105 >= -1 ;+[80782] -1 x62 -1 x105 >= -1 ;+[80782] -1 x63 -1 x105 >= -1 ;+[80782] -1 x71 -1 x105 >= -1 ;+[80782] -1 x79 -1 x105 >= -1 ;+[80782] -1 x87 -1 x105 >= -1 ;+[80782] -1 x95 -1 x105 >= -1 ;+[80782] -1 x110 -1 x105 >= -1 ;+[80782] -1 x97 -1 x113 >= -1 ;+[80782] -1 x86 -1 x113 >= -1 ;+[80782] -1 x67 -1 x113 >= -1 ;+[80782] -1 x75 -1 x113 >= -1 ;+[80782] -1 x106 -1 x113 >= -1 ;+[80782] -1 x98 -1 x113 >= -1 ;+[80782] -1 x90 -1 x113 >= -1 ;+[80782] -1 x78 -1 x113 >= -1 ;+[80782] -1 x68 -1 x113 >= -1 ;+[80782] -1 x107 -1 x113 >= -1 ;+[80782] -1 x99 -1 x113 >= -1 ;+[80782] -1 x91 -1 x113 >= -1 ;+[80782] -1 x83 -1 x113 >= -1 ;+[80782] -1 x70 -1 x113 >= -1 ;+[80782] -1 x108 -1 x113 >= -1 ;+[80782] -1 x100 -1 x113 >= -1 ;+[80782] -1 x92 -1 x113 >= -1 ;+[80782] -1 x84 -1 x113 >= -1 ;+[80782] -1 x76 -1 x113 >= -1 ;+[80782] -1 x62 -1 x113 >= -1 ;+[80782] -1 x63 -1 x113 >= -1 ;+[80782] -1 x71 -1 x113 >= -1 ;+[80782] -1 x79 -1 x113 >= -1 ;+[80782] -1 x87 -1 x113 >= -1 ;+[80782] -1 x95 -1 x113 >= -1 ;+[80782] -1 x103 -1 x113 >= -1 ;+[80782] -1 x86 -1 x97 >= -1 ;+[80782] -1 x67 -1 x97 >= -1 ;+[80782] -1 x75 -1 x97 >= -1 ;+[80782] -1 x106 -1 x97 >= -1 ;+[80782] -1 x114 -1 x97 >= -1 ;+[80782] -1 x90 -1 x97 >= -1 ;+[80782] -1 x78 -1 x97 >= -1 ;+[80782] -1 x68 -1 x97 >= -1 ;+[80782] -1 x107 -1 x97 >= -1 ;+[80782] -1 x115 -1 x97 >= -1 ;+[80782] -1 x91 -1 x97 >= -1 ;+[80782] -1 x83 -1 x97 >= -1 ;+[80782] -1 x70 -1 x97 >= -1 ;+[80782] -1 x108 -1 x97 >= -1 ;+[80782] -1 x116 -1 x97 >= -1 ;+[80782] -1 x92 -1 x97 >= -1 ;+[80782] -1 x84 -1 x97 >= -1 ;+[80782] -1 x76 -1 x97 >= -1 ;+[80782] -1 x62 -1 x97 >= -1 ;+[80782] -1 x63 -1 x97 >= -1 ;+[80782] -1 x71 -1 x97 >= -1 ;+[80782] -1 x79 -1 x97 >= -1 ;+[80782] -1 x87 -1 x97 >= -1 ;+[80782] -1 x103 -1 x97 >= -1 ;+[80782] -1 x110 -1 x97 >= -1 ;+[80782] -1 x67 -1 x86 >= -1 ;+[80782] -1 x75 -1 x86 >= -1 ;+[80782] -1 x106 -1 x86 >= -1 ;+[80782] -1 x114 -1 x86 >= -1 ;+[80782] -1 x98 -1 x86 >= -1 ;+[80782] -1 x78 -1 x86 >= -1 ;+[80782] -1 x68 -1 x86 >= -1 ;+[80782] -1 x107 -1 x86 >= -1 ;+[80782] -1 x115 -1 x86 >= -1 ;+[80782] -1 x99 -1 x86 >= -1 ;+[80782] -1 x83 -1 x86 >= -1 ;+[80782] -1 x70 -1 x86 >= -1 ;+[80782] -1 x108 -1 x86 >= -1 ;+[80782] -1 x116 -1 x86 >= -1 ;+[80782] -1 x100 -1 x86 >= -1 ;+[80782] -1 x84 -1 x86 >= -1 ;+[80782] -1 x76 -1 x86 >= -1 ;+[80782] -1 x62 -1 x86 >= -1 ;+[80782] -1 x63 -1 x86 >= -1 ;+[80782] -1 x71 -1 x86 >= -1 ;+[80782] -1 x79 -1 x86 >= -1 ;+[80782] -1 x95 -1 x86 >= -1 ;+[80782] -1 x103 -1 x86 >= -1 ;+[80782] -1 x110 -1 x86 >= -1 ;+[80782] -1 x75 -1 x67 >= -1 ;+[80782] -1 x106 -1 x67 >= -1 ;+[80782] -1 x114 -1 x67 >= -1 ;+[80782] -1 x98 -1 x67 >= -1 ;+[80782] -1 x90 -1 x67 >= -1 ;+[80782] -1 x78 -1 x67 >= -1 ;+[80782] -1 x107 -1 x67 >= -1 ;+[80782] -1 x115 -1 x67 >= -1 ;+[80782] -1 x99 -1 x67 >= -1 ;+[80782] -1 x91 -1 x67 >= -1 ;+[80782] -1 x83 -1 x67 >= -1 ;+[80782] -1 x70 -1 x67 >= -1 ;+[80782] -1 x108 -1 x67 >= -1 ;+[80782] -1 x116 -1 x67 >= -1 ;+[80782] -1 x100 -1 x67 >= -1 ;+[80782] -1 x92 -1 x67 >= -1 ;+[80782] -1 x84 -1 x67 >= -1 ;+[80782] -1 x76 -1 x67 >= -1 ;+[80782] -1 x71 -1 x67 >= -1 ;+[80782] -1 x79 -1 x67 >= -1 ;+[80782] -1 x87 -1 x67 >= -1 ;+[80782] -1 x95 -1 x67 >= -1 ;+[80782] -1 x103 -1 x67 >= -1 ;+[80782] -1 x110 -1 x67 >= -1 ;+[80782] -1 x106 -1 x75 >= -1 ;+[80782] -1 x114 -1 x75 >= -1 ;+[80782] -1 x98 -1 x75 >= -1 ;+[80782] -1 x90 -1 x75 >= -1 ;+[80782] -1 x78 -1 x75 >= -1 ;+[80782] -1 x68 -1 x75 >= -1 ;+[80782] -1 x107 -1 x75 >= -1 ;+[80782] -1 x115 -1 x75 >= -1 ;+[80782] -1 x99 -1 x75 >= -1 ;+[80782] -1 x91 -1 x75 >= -1 ;+[80782] -1 x83 -1 x75 >= -1 ;+[80782] -1 x108 -1 x75 >= -1 ;+[80782] -1 x116 -1 x75 >= -1 ;+[80782] -1 x100 -1 x75 >= -1 ;+[80782] -1 x92 -1 x75 >= -1 ;+[80782] -1 x84 -1 x75 >= -1 ;+[80782] -1 x62 -1 x75 >= -1 ;+[80782] -1 x63 -1 x75 >= -1 ;+[80782] -1 x79 -1 x75 >= -1 ;+[80782] -1 x87 -1 x75 >= -1 ;+[80782] -1 x95 -1 x75 >= -1 ;+[80782] -1 x103 -1 x75 >= -1 ;+[80782] -1 x110 -1 x75 >= -1 ;+[80782] -1 x114 -1 x106 >= -1 ;+[80782] -1 x98 -1 x106 >= -1 ;+[80782] -1 x90 -1 x106 >= -1 ;+[80782] -1 x78 -1 x106 >= -1 ;+[80782] -1 x68 -1 x106 >= -1 ;+[80782] -1 x115 -1 x106 >= -1 ;+[80782] -1 x99 -1 x106 >= -1 ;+[80782] -1 x91 -1 x106 >= -1 ;+[80782] -1 x83 -1 x106 >= -1 ;+[80782] -1 x70 -1 x106 >= -1 ;+[80782] -1 x116 -1 x106 >= -1 ;+[80782] -1 x100 -1 x106 >= -1 ;+[80782] -1 x92 -1 x106 >= -1 ;+[80782] -1 x84 -1 x106 >= -1 ;+[80782] -1 x76 -1 x106 >= -1 ;+[80782] -1 x62 -1 x106 >= -1 ;+[80782] -1 x63 -1 x106 >= -1 ;+[80782] -1 x71 -1 x106 >= -1 ;+[80782] -1 x79 -1 x106 >= -1 ;+[80782] -1 x87 -1 x106 >= -1 ;+[80782] -1 x95 -1 x106 >= -1 ;+[80782] -1 x110 -1 x106 >= -1 ;+[80782] -1 x98 -1 x114 >= -1 ;+[80782] -1 x90 -1 x114 >= -1 ;+[80782] -1 x78 -1 x114 >= -1 ;+[80782] -1 x68 -1 x114 >= -1 ;+[80782] -1 x107 -1 x114 >= -1 ;+[80782] -1 x99 -1 x114 >= -1 ;+[80782] -1 x91 -1 x114 >= -1 ;+[80782] -1 x83 -1 x114 >= -1 ;+[80782] -1 x70 -1 x114 >= -1 ;+[80782] -1 x108 -1 x114 >= -1 ;+[80782] -1 x100 -1 x114 >= -1 ;+[80782] -1 x92 -1 x114 >= -1 ;+[80782] -1 x84 -1 x114 >= -1 ;+[80782] -1 x76 -1 x114 >= -1 ;+[80782] -1 x62 -1 x114 >= -1 ;+[80782] -1 x63 -1 x114 >= -1 ;+[80782] -1 x71 -1 x114 >= -1 ;+[80782] -1 x79 -1 x114 >= -1 ;+[80782] -1 x87 -1 x114 >= -1 ;+[80782] -1 x95 -1 x114 >= -1 ;+[80782] -1 x103 -1 x114 >= -1 ;+[80782] -1 x90 -1 x98 >= -1 ;+[80782] -1 x78 -1 x98 >= -1 ;+[80782] -1 x68 -1 x98 >= -1 ;+[80782] -1 x107 -1 x98 >= -1 ;+[80782] -1 x115 -1 x98 >= -1 ;+[80782] -1 x91 -1 x98 >= -1 ;+[80782] -1 x83 -1 x98 >= -1 ;+[80782] -1 x70 -1 x98 >= -1 ;+[80782] -1 x108 -1 x98 >= -1 ;+[80782] -1 x116 -1 x98 >= -1 ;+[80782] -1 x92 -1 x98 >= -1 ;+[80782] -1 x84 -1 x98 >= -1 ;+[80782] -1 x76 -1 x98 >= -1 ;+[80782] -1 x62 -1 x98 >= -1 ;+[80782] -1 x63 -1 x98 >= -1 ;+[80782] -1 x71 -1 x98 >= -1 ;+[80782] -1 x79 -1 x98 >= -1 ;+[80782] -1 x87 -1 x98 >= -1 ;+[80782] -1 x103 -1 x98 >= -1 ;+[80782] -1 x110 -1 x98 >= -1 ;+[80782] -1 x78 -1 x90 >= -1 ;+[80782] -1 x68 -1 x90 >= -1 ;+[80782] -1 x107 -1 x90 >= -1 ;+[80782] -1 x115 -1 x90 >= -1 ;+[80782] -1 x99 -1 x90 >= -1 ;+[80782] -1 x83 -1 x90 >= -1 ;+[80782] -1 x70 -1 x90 >= -1 ;+[80782] -1 x108 -1 x90 >= -1 ;+[80782] -1 x116 -1 x90 >= -1 ;+[80782] -1 x100 -1 x90 >= -1 ;+[80782] -1 x84 -1 x90 >= -1 ;+[80782] -1 x76 -1 x90 >= -1 ;+[80782] -1 x62 -1 x90 >= -1 ;+[80782] -1 x63 -1 x90 >= -1 ;+[80782] -1 x71 -1 x90 >= -1 ;+[80782] -1 x79 -1 x90 >= -1 ;+[80782] -1 x95 -1 x90 >= -1 ;+[80782] -1 x103 -1 x90 >= -1 ;+[80782] -1 x110 -1 x90 >= -1 ;+[80782] -1 x68 -1 x78 >= -1 ;+[80782] -1 x107 -1 x78 >= -1 ;+[80782] -1 x115 -1 x78 >= -1 ;+[80782] -1 x99 -1 x78 >= -1 ;+[80782] -1 x91 -1 x78 >= -1 ;+[80782] -1 x70 -1 x78 >= -1 ;+[80782] -1 x108 -1 x78 >= -1 ;+[80782] -1 x116 -1 x78 >= -1 ;+[80782] -1 x100 -1 x78 >= -1 ;+[80782] -1 x92 -1 x78 >= -1 ;+[80782] -1 x76 -1 x78 >= -1 ;+[80782] -1 x62 -1 x78 >= -1 ;+[80782] -1 x63 -1 x78 >= -1 ;+[80782] -1 x71 -1 x78 >= -1 ;+[80782] -1 x87 -1 x78 >= -1 ;+[80782] -1 x95 -1 x78 >= -1 ;+[80782] -1 x103 -1 x78 >= -1 ;+[80782] -1 x110 -1 x78 >= -1 ;+[80782] -1 x107 -1 x68 >= -1 ;+[80782] -1 x115 -1 x68 >= -1 ;+[80782] -1 x99 -1 x68 >= -1 ;+[80782] -1 x91 -1 x68 >= -1 ;+[80782] -1 x83 -1 x68 >= -1 ;+[80782] -1 x70 -1 x68 >= -1 ;+[80782] -1 x108 -1 x68 >= -1 ;+[80782] -1 x116 -1 x68 >= -1 ;+[80782] -1 x100 -1 x68 >= -1 ;+[80782] -1 x92 -1 x68 >= -1 ;+[80782] -1 x84 -1 x68 >= -1 ;+[80782] -1 x76 -1 x68 >= -1 ;+[80782] -1 x71 -1 x68 >= -1 ;+[80782] -1 x79 -1 x68 >= -1 ;+[80782] -1 x87 -1 x68 >= -1 ;+[80782] -1 x95 -1 x68 >= -1 ;+[80782] -1 x103 -1 x68 >= -1 ;+[80782] -1 x110 -1 x68 >= -1 ;+[80782] -1 x115 -1 x107 >= -1 ;+[80782] -1 x99 -1 x107 >= -1 ;+[80782] -1 x91 -1 x107 >= -1 ;+[80782] -1 x83 -1 x107 >= -1 ;+[80782] -1 x70 -1 x107 >= -1 ;+[80782] -1 x116 -1 x107 >= -1 ;+[80782] -1 x100 -1 x107 >= -1 ;+[80782] -1 x92 -1 x107 >= -1 ;+[80782] -1 x84 -1 x107 >= -1 ;+[80782] -1 x76 -1 x107 >= -1 ;+[80782] -1 x62 -1 x107 >= -1 ;+[80782] -1 x63 -1 x107 >= -1 ;+[80782] -1 x71 -1 x107 >= -1 ;+[80782] -1 x79 -1 x107 >= -1 ;+[80782] -1 x87 -1 x107 >= -1 ;+[80782] -1 x95 -1 x107 >= -1 ;+[80782] -1 x110 -1 x107 >= -1 ;+[80782] -1 x99 -1 x115 >= -1 ;+[80782] -1 x91 -1 x115 >= -1 ;+[80782] -1 x83 -1 x115 >= -1 ;+[80782] -1 x70 -1 x115 >= -1 ;+[80782] -1 x108 -1 x115 >= -1 ;+[80782] -1 x100 -1 x115 >= -1 ;+[80782] -1 x92 -1 x115 >= -1 ;+[80782] -1 x84 -1 x115 >= -1 ;+[80782] -1 x76 -1 x115 >= -1 ;+[80782] -1 x62 -1 x115 >= -1 ;+[80782] -1 x63 -1 x115 >= -1 ;+[80782] -1 x71 -1 x115 >= -1 ;+[80782] -1 x79 -1 x115 >= -1 ;+[80782] -1 x87 -1 x115 >= -1 ;+[80782] -1 x95 -1 x115 >= -1 ;+[80782] -1 x103 -1 x115 >= -1 ;+[80782] -1 x91 -1 x99 >= -1 ;+[80782] -1 x83 -1 x99 >= -1 ;+[80782] -1 x70 -1 x99 >= -1 ;+[80782] -1 x108 -1 x99 >= -1 ;+[80782] -1 x116 -1 x99 >= -1 ;+[80782] -1 x92 -1 x99 >= -1 ;+[80782] -1 x84 -1 x99 >= -1 ;+[80782] -1 x76 -1 x99 >= -1 ;+[80782] -1 x62 -1 x99 >= -1 ;+[80782] -1 x63 -1 x99 >= -1 ;+[80782] -1 x71 -1 x99 >= -1 ;+[80782] -1 x79 -1 x99 >= -1 ;+[80782] -1 x87 -1 x99 >= -1 ;+[80782] -1 x103 -1 x99 >= -1 ;+[80782] -1 x110 -1 x99 >= -1 ;+[80782] -1 x83 -1 x91 >= -1 ;+[80782] -1 x70 -1 x91 >= -1 ;+[80782] -1 x108 -1 x91 >= -1 ;+[80782] -1 x116 -1 x91 >= -1 ;+[80782] -1 x100 -1 x91 >= -1 ;+[80782] -1 x84 -1 x91 >= -1 ;+[80782] -1 x76 -1 x91 >= -1 ;+[80782] -1 x62 -1 x91 >= -1 ;+[80782] -1 x63 -1 x91 >= -1 ;+[80782] -1 x71 -1 x91 >= -1 ;+[80782] -1 x79 -1 x91 >= -1 ;+[80782] -1 x95 -1 x91 >= -1 ;+[80782] -1 x103 -1 x91 >= -1 ;+[80782] -1 x110 -1 x91 >= -1 ;+[80782] -1 x70 -1 x83 >= -1 ;+[80782] -1 x108 -1 x83 >= -1 ;+[80782] -1 x116 -1 x83 >= -1 ;+[80782] -1 x100 -1 x83 >= -1 ;+[80782] -1 x92 -1 x83 >= -1 ;+[80782] -1 x76 -1 x83 >= -1 ;+[80782] -1 x62 -1 x83 >= -1 ;+[80782] -1 x63 -1 x83 >= -1 ;+[80782] -1 x71 -1 x83 >= -1 ;+[80782] -1 x87 -1 x83 >= -1 ;+[80782] -1 x95 -1 x83 >= -1 ;+[80782] -1 x103 -1 x83 >= -1 ;+[80782] -1 x110 -1 x83 >= -1 ;+[80782] -1 x108 -1 x70 >= -1 ;+[80782] -1 x116 -1 x70 >= -1 ;+[80782] -1 x100 -1 x70 >= -1 ;+[80782] -1 x92 -1 x70 >= -1 ;+[80782] -1 x84 -1 x70 >= -1 ;+[80782] -1 x62 -1 x70 >= -1 ;+[80782] -1 x63 -1 x70 >= -1 ;+[80782] -1 x79 -1 x70 >= -1 ;+[80782] -1 x87 -1 x70 >= -1 ;+[80782] -1 x95 -1 x70 >= -1 ;+[80782] -1 x103 -1 x70 >= -1 ;+[80782] -1 x110 -1 x70 >= -1 ;+[80782] -1 x116 -1 x108 >= -1 ;+[80782] -1 x100 -1 x108 >= -1 ;+[80782] -1 x92 -1 x108 >= -1 ;+[80782] -1 x84 -1 x108 >= -1 ;+[80782] -1 x76 -1 x108 >= -1 ;+[80782] -1 x62 -1 x108 >= -1 ;+[80782] -1 x63 -1 x108 >= -1 ;+[80782] -1 x71 -1 x108 >= -1 ;+[80782] -1 x79 -1 x108 >= -1 ;+[80782] -1 x87 -1 x108 >= -1 ;+[80782] -1 x95 -1 x108 >= -1 ;+[80782] -1 x110 -1 x108 >= -1 ;+[80782] -1 x100 -1 x116 >= -1 ;+[80782] -1 x92 -1 x116 >= -1 ;+[80782] -1 x84 -1 x116 >= -1 ;+[80782] -1 x76 -1 x116 >= -1 ;+[80782] -1 x62 -1 x116 >= -1 ;+[80782] -1 x63 -1 x116 >= -1 ;+[80782] -1 x71 -1 x116 >= -1 ;+[80782] -1 x79 -1 x116 >= -1 ;+[80782] -1 x87 -1 x116 >= -1 ;+[80782] -1 x95 -1 x116 >= -1 ;+[80782] -1 x103 -1 x116 >= -1 ;+[80782] -1 x92 -1 x100 >= -1 ;+[80782] -1 x84 -1 x100 >= -1 ;+[80782] -1 x76 -1 x100 >= -1 ;+[80782] -1 x62 -1 x100 >= -1 ;+[80782] -1 x63 -1 x100 >= -1 ;+[80782] -1 x71 -1 x100 >= -1 ;+[80782] -1 x79 -1 x100 >= -1 ;+[80782] -1 x87 -1 x100 >= -1 ;+[80782] -1 x103 -1 x100 >= -1 ;+[80782] -1 x110 -1 x100 >= -1 ;+[80782] -1 x84 -1 x92 >= -1 ;+[80782] -1 x76 -1 x92 >= -1 ;+[80782] -1 x62 -1 x92 >= -1 ;+[80782] -1 x63 -1 x92 >= -1 ;+[80782] -1 x71 -1 x92 >= -1 ;+[80782] -1 x79 -1 x92 >= -1 ;+[80782] -1 x95 -1 x92 >= -1 ;+[80782] -1 x103 -1 x92 >= -1 ;+[80782] -1 x110 -1 x92 >= -1 ;+[80782] -1 x76 -1 x84 >= -1 ;+[80782] -1 x62 -1 x84 >= -1 ;+[80782] -1 x63 -1 x84 >= -1 ;+[80782] -1 x71 -1 x84 >= -1 ;+[80782] -1 x87 -1 x84 >= -1 ;+[80782] -1 x95 -1 x84 >= -1 ;+[80782] -1 x103 -1 x84 >= -1 ;+[80782] -1 x110 -1 x84 >= -1 ;+[80782] -1 x62 -1 x76 >= -1 ;+[80782] -1 x63 -1 x76 >= -1 ;+[80782] -1 x79 -1 x76 >= -1 ;+[80782] -1 x87 -1 x76 >= -1 ;+[80782] -1 x95 -1 x76 >= -1 ;+[80782] -1 x103 -1 x76 >= -1 ;+[80782] -1 x110 -1 x76 >= -1 ;+[80782] -1 x71 -1 x62 >= -1 ;+[80782] -1 x79 -1 x62 >= -1 ;+[80782] -1 x87 -1 x62 >= -1 ;+[80782] -1 x95 -1 x62 >= -1 ;+[80782] -1 x103 -1 x62 >= -1 ;+[80782] -1 x110 -1 x62 >= -1 ;+[80782] -1 x59 -1 x119 >= -1 ;+[80782] -1 x60 -1 x119 >= -1 ;+[80782] -1 x118 -1 x59 >= -1 ;+[80782] -1 x118 -1 x60 >= -1 ;+[80782] -1 x71 -1 x63 >= -1 ;+[80782] -1 x79 -1 x63 >= -1 ;+[80782] -1 x87 -1 x63 >= -1 ;+[80782] -1 x95 -1 x63 >= -1 ;+[80782] -1 x103 -1 x63 >= -1 ;+[80782] -1 x110 -1 x63 >= -1 ;+[80782] -1 x79 -1 x71 >= -1 ;+[80782] -1 x87 -1 x71 >= -1 ;+[80782] -1 x95 -1 x71 >= -1 ;+[80782] -1 x103 -1 x71 >= -1 ;+[80782] -1 x110 -1 x71 >= -1 ;+[80782] -1 x87 -1 x79 >= -1 ;+[80782] -1 x95 -1 x79 >= -1 ;+[80782] -1 x103 -1 x79 >= -1 ;+[80782] -1 x110 -1 x79 >= -1 ;+[80782] -1 x95 -1 x87 >= -1 ;+[80782] -1 x103 -1 x87 >= -1 ;+[80782] -1 x110 -1 x87 >= -1 ;+[80782] -1 x103 -1 x95 >= -1 ;+[80782] -1 x110 -1 x95 >= -1 ;+[80782] -1 x110 -1 x103 >= -1 ;+[80782] -1 x124 -1 x127 >= -1 ;+[80782] -1 x121 -1 x127 >= -1 ;+[80782] -1 x122 -1 x127 >= -1 ;+[80782] -1 x125 -1 x127 >= -1 ;+[80782] -1 x131 -1 x127 >= -1 ;+[80782] -1 x138 -1 x127 >= -1 ;+[80782] -1 x146 -1 x127 >= -1 ;+[80782] -1 x154 -1 x127 >= -1 ;+[80782] -1 x162 -1 x127 >= -1 ;+[80782] -1 x170 -1 x127 >= -1 ;+[80782] -1 x185 -1 x127 >= -1 ;+[80782] -1 x176 -1 x127 >= -1 ;+[80782] -1 x139 -1 x127 >= -1 ;+[80782] -1 x147 -1 x127 >= -1 ;+[80782] -1 x155 -1 x127 >= -1 ;+[80782] -1 x163 -1 x127 >= -1 ;+[80782] -1 x178 -1 x127 >= -1 ;+[80782] -1 x186 -1 x127 >= -1 ;+[80782] -1 x168 -1 x127 >= -1 ;+[80782] -1 x141 -1 x127 >= -1 ;+[80782] -1 x149 -1 x127 >= -1 ;+[80782] -1 x180 -1 x127 >= -1 ;+[80782] -1 x188 -1 x127 >= -1 ;+[80782] -1 x172 -1 x127 >= -1 ;+[80782] -1 x164 -1 x127 >= -1 ;+[80782] -1 x152 -1 x127 >= -1 ;+[80782] -1 x142 -1 x127 >= -1 ;+[80782] -1 x181 -1 x127 >= -1 ;+[80782] -1 x189 -1 x127 >= -1 ;+[80782] -1 x173 -1 x127 >= -1 ;+[80782] -1 x165 -1 x127 >= -1 ;+[80782] -1 x157 -1 x127 >= -1 ;+[80782] -1 x144 -1 x127 >= -1 ;+[80782] -1 x182 -1 x127 >= -1 ;+[80782] -1 x190 -1 x127 >= -1 ;+[80782] -1 x174 -1 x127 >= -1 ;+[80782] -1 x166 -1 x127 >= -1 ;+[80782] -1 x158 -1 x127 >= -1 ;+[80782] -1 x150 -1 x127 >= -1 ;+[80782] -1 x136 -1 x127 >= -1 ;+[80782] -1 x134 -1 x127 >= -1 ;+[80782] -1 x192 -1 x127 >= -1 ;+[80782] -1 x137 -1 x127 >= -1 ;+[80782] -1 x145 -1 x127 >= -1 ;+[80782] -1 x153 -1 x127 >= -1 ;+[80782] -1 x161 -1 x127 >= -1 ;+[80782] -1 x169 -1 x127 >= -1 ;+[80782] -1 x177 -1 x127 >= -1 ;+[80782] -1 x184 -1 x127 >= -1 ;+[80782] -1 x121 -1 x124 >= -1 ;+[80782] -1 x122 -1 x124 >= -1 ;+[80782] -1 x128 -1 x124 >= -1 ;+[80782] -1 x131 -1 x124 >= -1 ;+[80782] -1 x138 -1 x124 >= -1 ;+[80782] -1 x146 -1 x124 >= -1 ;+[80782] -1 x154 -1 x124 >= -1 ;+[80782] -1 x162 -1 x124 >= -1 ;+[80782] -1 x170 -1 x124 >= -1 ;+[80782] -1 x185 -1 x124 >= -1 ;+[80782] -1 x176 -1 x124 >= -1 ;+[80782] -1 x140 -1 x124 >= -1 ;+[80782] -1 x148 -1 x124 >= -1 ;+[80782] -1 x156 -1 x124 >= -1 ;+[80782] -1 x179 -1 x124 >= -1 ;+[80782] -1 x187 -1 x124 >= -1 ;+[80782] -1 x171 -1 x124 >= -1 ;+[80782] -1 x160 -1 x124 >= -1 ;+[80782] -1 x141 -1 x124 >= -1 ;+[80782] -1 x149 -1 x124 >= -1 ;+[80782] -1 x180 -1 x124 >= -1 ;+[80782] -1 x188 -1 x124 >= -1 ;+[80782] -1 x172 -1 x124 >= -1 ;+[80782] -1 x164 -1 x124 >= -1 ;+[80782] -1 x152 -1 x124 >= -1 ;+[80782] -1 x142 -1 x124 >= -1 ;+[80782] -1 x181 -1 x124 >= -1 ;+[80782] -1 x189 -1 x124 >= -1 ;+[80782] -1 x173 -1 x124 >= -1 ;+[80782] -1 x165 -1 x124 >= -1 ;+[80782] -1 x157 -1 x124 >= -1 ;+[80782] -1 x144 -1 x124 >= -1 ;+[80782] -1 x182 -1 x124 >= -1 ;+[80782] -1 x190 -1 x124 >= -1 ;+[80782] -1 x174 -1 x124 >= -1 ;+[80782] -1 x166 -1 x124 >= -1 ;+[80782] -1 x158 -1 x124 >= -1 ;+[80782] -1 x150 -1 x124 >= -1 ;+[80782] -1 x136 -1 x124 >= -1 ;+[80782] -1 x134 -1 x124 >= -1 ;+[80782] -1 x192 -1 x124 >= -1 ;+[80782] -1 x137 -1 x124 >= -1 ;+[80782] -1 x145 -1 x124 >= -1 ;+[80782] -1 x153 -1 x124 >= -1 ;+[80782] -1 x161 -1 x124 >= -1 ;+[80782] -1 x169 -1 x124 >= -1 ;+[80782] -1 x177 -1 x124 >= -1 ;+[80782] -1 x184 -1 x124 >= -1 ;+[80782] -1 x125 -1 x121 >= -1 ;+[80782] -1 x128 -1 x121 >= -1 ;+[80782] -1 x131 -1 x121 >= -1 ;+[80782] -1 x138 -1 x121 >= -1 ;+[80782] -1 x146 -1 x121 >= -1 ;+[80782] -1 x154 -1 x121 >= -1 ;+[80782] -1 x162 -1 x121 >= -1 ;+[80782] -1 x170 -1 x121 >= -1 ;+[80782] -1 x185 -1 x121 >= -1 ;+[80782] -1 x176 -1 x121 >= -1 ;+[80782] -1 x139 -1 x121 >= -1 ;+[80782] -1 x147 -1 x121 >= -1 ;+[80782] -1 x155 -1 x121 >= -1 ;+[80782] -1 x163 -1 x121 >= -1 ;+[80782] -1 x178 -1 x121 >= -1 ;+[80782] -1 x186 -1 x121 >= -1 ;+[80782] -1 x168 -1 x121 >= -1 ;+[80782] -1 x140 -1 x121 >= -1 ;+[80782] -1 x148 -1 x121 >= -1 ;+[80782] -1 x156 -1 x121 >= -1 ;+[80782] -1 x179 -1 x121 >= -1 ;+[80782] -1 x187 -1 x121 >= -1 ;+[80782] -1 x171 -1 x121 >= -1 ;+[80782] -1 x160 -1 x121 >= -1 ;+[80782] -1 x141 -1 x121 >= -1 ;+[80782] -1 x149 -1 x121 >= -1 ;+[80782] -1 x180 -1 x121 >= -1 ;+[80782] -1 x188 -1 x121 >= -1 ;+[80782] -1 x172 -1 x121 >= -1 ;+[80782] -1 x164 -1 x121 >= -1 ;+[80782] -1 x152 -1 x121 >= -1 ;+[80782] -1 x142 -1 x121 >= -1 ;+[80782] -1 x181 -1 x121 >= -1 ;+[80782] -1 x189 -1 x121 >= -1 ;+[80782] -1 x173 -1 x121 >= -1 ;+[80782] -1 x165 -1 x121 >= -1 ;+[80782] -1 x157 -1 x121 >= -1 ;+[80782] -1 x144 -1 x121 >= -1 ;+[80782] -1 x182 -1 x121 >= -1 ;+[80782] -1 x190 -1 x121 >= -1 ;+[80782] -1 x174 -1 x121 >= -1 ;+[80782] -1 x166 -1 x121 >= -1 ;+[80782] -1 x158 -1 x121 >= -1 ;+[80782] -1 x150 -1 x121 >= -1 ;+[80782] -1 x136 -1 x121 >= -1 ;+[80782] -1 x134 -1 x121 >= -1 ;+[80782] -1 x192 -1 x121 >= -1 ;+[80782] -1 x125 -1 x122 >= -1 ;+[80782] -1 x128 -1 x122 >= -1 ;+[80782] -1 x131 -1 x122 >= -1 ;+[80782] -1 x138 -1 x122 >= -1 ;+[80782] -1 x146 -1 x122 >= -1 ;+[80782] -1 x154 -1 x122 >= -1 ;+[80782] -1 x162 -1 x122 >= -1 ;+[80782] -1 x170 -1 x122 >= -1 ;+[80782] -1 x185 -1 x122 >= -1 ;+[80782] -1 x176 -1 x122 >= -1 ;+[80782] -1 x139 -1 x122 >= -1 ;+[80782] -1 x147 -1 x122 >= -1 ;+[80782] -1 x155 -1 x122 >= -1 ;+[80782] -1 x163 -1 x122 >= -1 ;+[80782] -1 x178 -1 x122 >= -1 ;+[80782] -1 x186 -1 x122 >= -1 ;+[80782] -1 x168 -1 x122 >= -1 ;+[80782] -1 x140 -1 x122 >= -1 ;+[80782] -1 x148 -1 x122 >= -1 ;+[80782] -1 x156 -1 x122 >= -1 ;+[80782] -1 x179 -1 x122 >= -1 ;+[80782] -1 x187 -1 x122 >= -1 ;+[80782] -1 x171 -1 x122 >= -1 ;+[80782] -1 x160 -1 x122 >= -1 ;+[80782] -1 x141 -1 x122 >= -1 ;+[80782] -1 x149 -1 x122 >= -1 ;+[80782] -1 x180 -1 x122 >= -1 ;+[80782] -1 x188 -1 x122 >= -1 ;+[80782] -1 x172 -1 x122 >= -1 ;+[80782] -1 x164 -1 x122 >= -1 ;+[80782] -1 x152 -1 x122 >= -1 ;+[80782] -1 x142 -1 x122 >= -1 ;+[80782] -1 x181 -1 x122 >= -1 ;+[80782] -1 x189 -1 x122 >= -1 ;+[80782] -1 x173 -1 x122 >= -1 ;+[80782] -1 x165 -1 x122 >= -1 ;+[80782] -1 x157 -1 x122 >= -1 ;+[80782] -1 x144 -1 x122 >= -1 ;+[80782] -1 x182 -1 x122 >= -1 ;+[80782] -1 x190 -1 x122 >= -1 ;+[80782] -1 x174 -1 x122 >= -1 ;+[80782] -1 x166 -1 x122 >= -1 ;+[80782] -1 x158 -1 x122 >= -1 ;+[80782] -1 x150 -1 x122 >= -1 ;+[80782] -1 x136 -1 x122 >= -1 ;+[80782] -1 x193 -1 x122 >= -1 ;+[80782] -1 x134 -1 x122 >= -1 ;+[80782] -1 x192 -1 x122 >= -1 ;+[80782] -1 x137 -1 x122 >= -1 ;+[80782] -1 x145 -1 x122 >= -1 ;+[80782] -1 x153 -1 x122 >= -1 ;+[80782] -1 x161 -1 x122 >= -1 ;+[80782] -1 x169 -1 x122 >= -1 ;+[80782] -1 x177 -1 x122 >= -1 ;+[80782] -1 x128 -1 x125 >= -1 ;+[80782] -1 x131 -1 x125 >= -1 ;+[80782] -1 x138 -1 x125 >= -1 ;+[80782] -1 x146 -1 x125 >= -1 ;+[80782] -1 x154 -1 x125 >= -1 ;+[80782] -1 x162 -1 x125 >= -1 ;+[80782] -1 x170 -1 x125 >= -1 ;+[80782] -1 x185 -1 x125 >= -1 ;+[80782] -1 x176 -1 x125 >= -1 ;+[80782] -1 x139 -1 x125 >= -1 ;+[80782] -1 x147 -1 x125 >= -1 ;+[80782] -1 x155 -1 x125 >= -1 ;+[80782] -1 x163 -1 x125 >= -1 ;+[80782] -1 x178 -1 x125 >= -1 ;+[80782] -1 x186 -1 x125 >= -1 ;+[80782] -1 x140 -1 x125 >= -1 ;+[80782] -1 x148 -1 x125 >= -1 ;+[80782] -1 x156 -1 x125 >= -1 ;+[80782] -1 x179 -1 x125 >= -1 ;+[80782] -1 x187 -1 x125 >= -1 ;+[80782] -1 x171 -1 x125 >= -1 ;+[80782] -1 x160 -1 x125 >= -1 ;+[80782] -1 x141 -1 x125 >= -1 ;+[80782] -1 x149 -1 x125 >= -1 ;+[80782] -1 x180 -1 x125 >= -1 ;+[80782] -1 x188 -1 x125 >= -1 ;+[80782] -1 x172 -1 x125 >= -1 ;+[80782] -1 x164 -1 x125 >= -1 ;+[80782] -1 x152 -1 x125 >= -1 ;+[80782] -1 x142 -1 x125 >= -1 ;+[80782] -1 x181 -1 x125 >= -1 ;+[80782] -1 x189 -1 x125 >= -1 ;+[80782] -1 x173 -1 x125 >= -1 ;+[80782] -1 x165 -1 x125 >= -1 ;+[80782] -1 x157 -1 x125 >= -1 ;+[80782] -1 x144 -1 x125 >= -1 ;+[80782] -1 x182 -1 x125 >= -1 ;+[80782] -1 x190 -1 x125 >= -1 ;+[80782] -1 x174 -1 x125 >= -1 ;+[80782] -1 x166 -1 x125 >= -1 ;+[80782] -1 x158 -1 x125 >= -1 ;+[80782] -1 x150 -1 x125 >= -1 ;+[80782] -1 x136 -1 x125 >= -1 ;+[80782] -1 x193 -1 x125 >= -1 ;+[80782] -1 x134 -1 x125 >= -1 ;+[80782] -1 x192 -1 x125 >= -1 ;+[80782] -1 x137 -1 x125 >= -1 ;+[80782] -1 x145 -1 x125 >= -1 ;+[80782] -1 x153 -1 x125 >= -1 ;+[80782] -1 x161 -1 x125 >= -1 ;+[80782] -1 x169 -1 x125 >= -1 ;+[80782] -1 x177 -1 x125 >= -1 ;+[80782] -1 x184 -1 x125 >= -1 ;+[80782] -1 x131 -1 x128 >= -1 ;+[80782] -1 x138 -1 x128 >= -1 ;+[80782] -1 x146 -1 x128 >= -1 ;+[80782] -1 x154 -1 x128 >= -1 ;+[80782] -1 x162 -1 x128 >= -1 ;+[80782] -1 x170 -1 x128 >= -1 ;+[80782] -1 x185 -1 x128 >= -1 ;+[80782] -1 x176 -1 x128 >= -1 ;+[80782] -1 x139 -1 x128 >= -1 ;+[80782] -1 x147 -1 x128 >= -1 ;+[80782] -1 x155 -1 x128 >= -1 ;+[80782] -1 x163 -1 x128 >= -1 ;+[80782] -1 x178 -1 x128 >= -1 ;+[80782] -1 x186 -1 x128 >= -1 ;+[80782] -1 x168 -1 x128 >= -1 ;+[80782] -1 x140 -1 x128 >= -1 ;+[80782] -1 x148 -1 x128 >= -1 ;+[80782] -1 x156 -1 x128 >= -1 ;+[80782] -1 x179 -1 x128 >= -1 ;+[80782] -1 x187 -1 x128 >= -1 ;+[80782] -1 x171 -1 x128 >= -1 ;+[80782] -1 x141 -1 x128 >= -1 ;+[80782] -1 x149 -1 x128 >= -1 ;+[80782] -1 x180 -1 x128 >= -1 ;+[80782] -1 x188 -1 x128 >= -1 ;+[80782] -1 x172 -1 x128 >= -1 ;+[80782] -1 x164 -1 x128 >= -1 ;+[80782] -1 x152 -1 x128 >= -1 ;+[80782] -1 x142 -1 x128 >= -1 ;+[80782] -1 x181 -1 x128 >= -1 ;+[80782] -1 x189 -1 x128 >= -1 ;+[80782] -1 x173 -1 x128 >= -1 ;+[80782] -1 x165 -1 x128 >= -1 ;+[80782] -1 x157 -1 x128 >= -1 ;+[80782] -1 x144 -1 x128 >= -1 ;+[80782] -1 x182 -1 x128 >= -1 ;+[80782] -1 x190 -1 x128 >= -1 ;+[80782] -1 x174 -1 x128 >= -1 ;+[80782] -1 x166 -1 x128 >= -1 ;+[80782] -1 x158 -1 x128 >= -1 ;+[80782] -1 x150 -1 x128 >= -1 ;+[80782] -1 x136 -1 x128 >= -1 ;+[80782] -1 x193 -1 x128 >= -1 ;+[80782] -1 x134 -1 x128 >= -1 ;+[80782] -1 x192 -1 x128 >= -1 ;+[80782] -1 x137 -1 x128 >= -1 ;+[80782] -1 x145 -1 x128 >= -1 ;+[80782] -1 x153 -1 x128 >= -1 ;+[80782] -1 x161 -1 x128 >= -1 ;+[80782] -1 x169 -1 x128 >= -1 ;+[80782] -1 x177 -1 x128 >= -1 ;+[80782] -1 x184 -1 x128 >= -1 ;+[80782] -1 x134 -1 x130 >= -1 ;+[80782] -1 x138 -1 x131 >= -1 ;+[80782] -1 x146 -1 x131 >= -1 ;+[80782] -1 x154 -1 x131 >= -1 ;+[80782] -1 x162 -1 x131 >= -1 ;+[80782] -1 x170 -1 x131 >= -1 ;+[80782] -1 x185 -1 x131 >= -1 ;+[80782] -1 x139 -1 x131 >= -1 ;+[80782] -1 x147 -1 x131 >= -1 ;+[80782] -1 x155 -1 x131 >= -1 ;+[80782] -1 x163 -1 x131 >= -1 ;+[80782] -1 x178 -1 x131 >= -1 ;+[80782] -1 x186 -1 x131 >= -1 ;+[80782] -1 x168 -1 x131 >= -1 ;+[80782] -1 x140 -1 x131 >= -1 ;+[80782] -1 x148 -1 x131 >= -1 ;+[80782] -1 x156 -1 x131 >= -1 ;+[80782] -1 x179 -1 x131 >= -1 ;+[80782] -1 x187 -1 x131 >= -1 ;+[80782] -1 x171 -1 x131 >= -1 ;+[80782] -1 x160 -1 x131 >= -1 ;+[80782] -1 x141 -1 x131 >= -1 ;+[80782] -1 x149 -1 x131 >= -1 ;+[80782] -1 x180 -1 x131 >= -1 ;+[80782] -1 x188 -1 x131 >= -1 ;+[80782] -1 x172 -1 x131 >= -1 ;+[80782] -1 x164 -1 x131 >= -1 ;+[80782] -1 x152 -1 x131 >= -1 ;+[80782] -1 x142 -1 x131 >= -1 ;+[80782] -1 x181 -1 x131 >= -1 ;+[80782] -1 x189 -1 x131 >= -1 ;+[80782] -1 x173 -1 x131 >= -1 ;+[80782] -1 x165 -1 x131 >= -1 ;+[80782] -1 x157 -1 x131 >= -1 ;+[80782] -1 x144 -1 x131 >= -1 ;+[80782] -1 x182 -1 x131 >= -1 ;+[80782] -1 x190 -1 x131 >= -1 ;+[80782] -1 x174 -1 x131 >= -1 ;+[80782] -1 x166 -1 x131 >= -1 ;+[80782] -1 x158 -1 x131 >= -1 ;+[80782] -1 x150 -1 x131 >= -1 ;+[80782] -1 x136 -1 x131 >= -1 ;+[80782] -1 x193 -1 x131 >= -1 ;+[80782] -1 x134 -1 x131 >= -1 ;+[80782] -1 x192 -1 x131 >= -1 ;+[80782] -1 x137 -1 x131 >= -1 ;+[80782] -1 x145 -1 x131 >= -1 ;+[80782] -1 x153 -1 x131 >= -1 ;+[80782] -1 x161 -1 x131 >= -1 ;+[80782] -1 x169 -1 x131 >= -1 ;+[80782] -1 x177 -1 x131 >= -1 ;+[80782] -1 x184 -1 x131 >= -1 ;+[80782] -1 x146 -1 x138 >= -1 ;+[80782] -1 x154 -1 x138 >= -1 ;+[80782] -1 x162 -1 x138 >= -1 ;+[80782] -1 x170 -1 x138 >= -1 ;+[80782] -1 x185 -1 x138 >= -1 ;+[80782] -1 x176 -1 x138 >= -1 ;+[80782] -1 x147 -1 x138 >= -1 ;+[80782] -1 x155 -1 x138 >= -1 ;+[80782] -1 x163 -1 x138 >= -1 ;+[80782] -1 x178 -1 x138 >= -1 ;+[80782] -1 x186 -1 x138 >= -1 ;+[80782] -1 x168 -1 x138 >= -1 ;+[80782] -1 x148 -1 x138 >= -1 ;+[80782] -1 x156 -1 x138 >= -1 ;+[80782] -1 x179 -1 x138 >= -1 ;+[80782] -1 x187 -1 x138 >= -1 ;+[80782] -1 x171 -1 x138 >= -1 ;+[80782] -1 x160 -1 x138 >= -1 ;+[80782] -1 x149 -1 x138 >= -1 ;+[80782] -1 x180 -1 x138 >= -1 ;+[80782] -1 x188 -1 x138 >= -1 ;+[80782] -1 x172 -1 x138 >= -1 ;+[80782] -1 x164 -1 x138 >= -1 ;+[80782] -1 x152 -1 x138 >= -1 ;+[80782] -1 x181 -1 x138 >= -1 ;+[80782] -1 x189 -1 x138 >= -1 ;+[80782] -1 x173 -1 x138 >= -1 ;+[80782] -1 x165 -1 x138 >= -1 ;+[80782] -1 x157 -1 x138 >= -1 ;+[80782] -1 x144 -1 x138 >= -1 ;+[80782] -1 x182 -1 x138 >= -1 ;+[80782] -1 x190 -1 x138 >= -1 ;+[80782] -1 x174 -1 x138 >= -1 ;+[80782] -1 x166 -1 x138 >= -1 ;+[80782] -1 x158 -1 x138 >= -1 ;+[80782] -1 x150 -1 x138 >= -1 ;+[80782] -1 x145 -1 x138 >= -1 ;+[80782] -1 x153 -1 x138 >= -1 ;+[80782] -1 x161 -1 x138 >= -1 ;+[80782] -1 x169 -1 x138 >= -1 ;+[80782] -1 x177 -1 x138 >= -1 ;+[80782] -1 x184 -1 x138 >= -1 ;+[80782] -1 x154 -1 x146 >= -1 ;+[80782] -1 x162 -1 x146 >= -1 ;+[80782] -1 x170 -1 x146 >= -1 ;+[80782] -1 x185 -1 x146 >= -1 ;+[80782] -1 x176 -1 x146 >= -1 ;+[80782] -1 x139 -1 x146 >= -1 ;+[80782] -1 x155 -1 x146 >= -1 ;+[80782] -1 x163 -1 x146 >= -1 ;+[80782] -1 x178 -1 x146 >= -1 ;+[80782] -1 x186 -1 x146 >= -1 ;+[80782] -1 x168 -1 x146 >= -1 ;+[80782] -1 x140 -1 x146 >= -1 ;+[80782] -1 x156 -1 x146 >= -1 ;+[80782] -1 x179 -1 x146 >= -1 ;+[80782] -1 x187 -1 x146 >= -1 ;+[80782] -1 x171 -1 x146 >= -1 ;+[80782] -1 x160 -1 x146 >= -1 ;+[80782] -1 x141 -1 x146 >= -1 ;+[80782] -1 x180 -1 x146 >= -1 ;+[80782] -1 x188 -1 x146 >= -1 ;+[80782] -1 x172 -1 x146 >= -1 ;+[80782] -1 x164 -1 x146 >= -1 ;+[80782] -1 x152 -1 x146 >= -1 ;+[80782] -1 x142 -1 x146 >= -1 ;+[80782] -1 x181 -1 x146 >= -1 ;+[80782] -1 x189 -1 x146 >= -1 ;+[80782] -1 x173 -1 x146 >= -1 ;+[80782] -1 x165 -1 x146 >= -1 ;+[80782] -1 x157 -1 x146 >= -1 ;+[80782] -1 x182 -1 x146 >= -1 ;+[80782] -1 x190 -1 x146 >= -1 ;+[80782] -1 x174 -1 x146 >= -1 ;+[80782] -1 x166 -1 x146 >= -1 ;+[80782] -1 x158 -1 x146 >= -1 ;+[80782] -1 x136 -1 x146 >= -1 ;+[80782] -1 x137 -1 x146 >= -1 ;+[80782] -1 x153 -1 x146 >= -1 ;+[80782] -1 x161 -1 x146 >= -1 ;+[80782] -1 x169 -1 x146 >= -1 ;+[80782] -1 x177 -1 x146 >= -1 ;+[80782] -1 x184 -1 x146 >= -1 ;+[80782] -1 x162 -1 x154 >= -1 ;+[80782] -1 x170 -1 x154 >= -1 ;+[80782] -1 x185 -1 x154 >= -1 ;+[80782] -1 x176 -1 x154 >= -1 ;+[80782] -1 x139 -1 x154 >= -1 ;+[80782] -1 x147 -1 x154 >= -1 ;+[80782] -1 x163 -1 x154 >= -1 ;+[80782] -1 x178 -1 x154 >= -1 ;+[80782] -1 x186 -1 x154 >= -1 ;+[80782] -1 x168 -1 x154 >= -1 ;+[80782] -1 x140 -1 x154 >= -1 ;+[80782] -1 x148 -1 x154 >= -1 ;+[80782] -1 x179 -1 x154 >= -1 ;+[80782] -1 x187 -1 x154 >= -1 ;+[80782] -1 x171 -1 x154 >= -1 ;+[80782] -1 x160 -1 x154 >= -1 ;+[80782] -1 x141 -1 x154 >= -1 ;+[80782] -1 x149 -1 x154 >= -1 ;+[80782] -1 x180 -1 x154 >= -1 ;+[80782] -1 x188 -1 x154 >= -1 ;+[80782] -1 x172 -1 x154 >= -1 ;+[80782] -1 x164 -1 x154 >= -1 ;+[80782] -1 x142 -1 x154 >= -1 ;+[80782] -1 x181 -1 x154 >= -1 ;+[80782] -1 x189 -1 x154 >= -1 ;+[80782] -1 x173 -1 x154 >= -1 ;+[80782] -1 x165 -1 x154 >= -1 ;+[80782] -1 x144 -1 x154 >= -1 ;+[80782] -1 x182 -1 x154 >= -1 ;+[80782] -1 x190 -1 x154 >= -1 ;+[80782] -1 x174 -1 x154 >= -1 ;+[80782] -1 x166 -1 x154 >= -1 ;+[80782] -1 x150 -1 x154 >= -1 ;+[80782] -1 x136 -1 x154 >= -1 ;+[80782] -1 x137 -1 x154 >= -1 ;+[80782] -1 x145 -1 x154 >= -1 ;+[80782] -1 x161 -1 x154 >= -1 ;+[80782] -1 x169 -1 x154 >= -1 ;+[80782] -1 x177 -1 x154 >= -1 ;+[80782] -1 x184 -1 x154 >= -1 ;+[80782] -1 x170 -1 x162 >= -1 ;+[80782] -1 x185 -1 x162 >= -1 ;+[80782] -1 x176 -1 x162 >= -1 ;+[80782] -1 x139 -1 x162 >= -1 ;+[80782] -1 x147 -1 x162 >= -1 ;+[80782] -1 x155 -1 x162 >= -1 ;+[80782] -1 x178 -1 x162 >= -1 ;+[80782] -1 x186 -1 x162 >= -1 ;+[80782] -1 x168 -1 x162 >= -1 ;+[80782] -1 x140 -1 x162 >= -1 ;+[80782] -1 x148 -1 x162 >= -1 ;+[80782] -1 x156 -1 x162 >= -1 ;+[80782] -1 x179 -1 x162 >= -1 ;+[80782] -1 x187 -1 x162 >= -1 ;+[80782] -1 x171 -1 x162 >= -1 ;+[80782] -1 x141 -1 x162 >= -1 ;+[80782] -1 x149 -1 x162 >= -1 ;+[80782] -1 x180 -1 x162 >= -1 ;+[80782] -1 x188 -1 x162 >= -1 ;+[80782] -1 x172 -1 x162 >= -1 ;+[80782] -1 x152 -1 x162 >= -1 ;+[80782] -1 x142 -1 x162 >= -1 ;+[80782] -1 x181 -1 x162 >= -1 ;+[80782] -1 x189 -1 x162 >= -1 ;+[80782] -1 x173 -1 x162 >= -1 ;+[80782] -1 x157 -1 x162 >= -1 ;+[80782] -1 x144 -1 x162 >= -1 ;+[80782] -1 x182 -1 x162 >= -1 ;+[80782] -1 x190 -1 x162 >= -1 ;+[80782] -1 x174 -1 x162 >= -1 ;+[80782] -1 x158 -1 x162 >= -1 ;+[80782] -1 x150 -1 x162 >= -1 ;+[80782] -1 x136 -1 x162 >= -1 ;+[80782] -1 x137 -1 x162 >= -1 ;+[80782] -1 x145 -1 x162 >= -1 ;+[80782] -1 x153 -1 x162 >= -1 ;+[80782] -1 x169 -1 x162 >= -1 ;+[80782] -1 x177 -1 x162 >= -1 ;+[80782] -1 x184 -1 x162 >= -1 ;+[80782] -1 x185 -1 x170 >= -1 ;+[80782] -1 x176 -1 x170 >= -1 ;+[80782] -1 x139 -1 x170 >= -1 ;+[80782] -1 x147 -1 x170 >= -1 ;+[80782] -1 x155 -1 x170 >= -1 ;+[80782] -1 x163 -1 x170 >= -1 ;+[80782] -1 x178 -1 x170 >= -1 ;+[80782] -1 x186 -1 x170 >= -1 ;+[80782] -1 x140 -1 x170 >= -1 ;+[80782] -1 x148 -1 x170 >= -1 ;+[80782] -1 x156 -1 x170 >= -1 ;+[80782] -1 x179 -1 x170 >= -1 ;+[80782] -1 x187 -1 x170 >= -1 ;+[80782] -1 x160 -1 x170 >= -1 ;+[80782] -1 x141 -1 x170 >= -1 ;+[80782] -1 x149 -1 x170 >= -1 ;+[80782] -1 x180 -1 x170 >= -1 ;+[80782] -1 x188 -1 x170 >= -1 ;+[80782] -1 x164 -1 x170 >= -1 ;+[80782] -1 x152 -1 x170 >= -1 ;+[80782] -1 x142 -1 x170 >= -1 ;+[80782] -1 x181 -1 x170 >= -1 ;+[80782] -1 x189 -1 x170 >= -1 ;+[80782] -1 x165 -1 x170 >= -1 ;+[80782] -1 x157 -1 x170 >= -1 ;+[80782] -1 x144 -1 x170 >= -1 ;+[80782] -1 x182 -1 x170 >= -1 ;+[80782] -1 x190 -1 x170 >= -1 ;+[80782] -1 x166 -1 x170 >= -1 ;+[80782] -1 x158 -1 x170 >= -1 ;+[80782] -1 x150 -1 x170 >= -1 ;+[80782] -1 x136 -1 x170 >= -1 ;+[80782] -1 x137 -1 x170 >= -1 ;+[80782] -1 x145 -1 x170 >= -1 ;+[80782] -1 x153 -1 x170 >= -1 ;+[80782] -1 x161 -1 x170 >= -1 ;+[80782] -1 x177 -1 x170 >= -1 ;+[80782] -1 x184 -1 x170 >= -1 ;+[80782] -1 x176 -1 x185 >= -1 ;+[80782] -1 x139 -1 x185 >= -1 ;+[80782] -1 x147 -1 x185 >= -1 ;+[80782] -1 x155 -1 x185 >= -1 ;+[80782] -1 x163 -1 x185 >= -1 ;+[80782] -1 x178 -1 x185 >= -1 ;+[80782] -1 x168 -1 x185 >= -1 ;+[80782] -1 x140 -1 x185 >= -1 ;+[80782] -1 x148 -1 x185 >= -1 ;+[80782] -1 x156 -1 x185 >= -1 ;+[80782] -1 x179 -1 x185 >= -1 ;+[80782] -1 x171 -1 x185 >= -1 ;+[80782] -1 x160 -1 x185 >= -1 ;+[80782] -1 x141 -1 x185 >= -1 ;+[80782] -1 x149 -1 x185 >= -1 ;+[80782] -1 x180 -1 x185 >= -1 ;+[80782] -1 x172 -1 x185 >= -1 ;+[80782] -1 x164 -1 x185 >= -1 ;+[80782] -1 x152 -1 x185 >= -1 ;+[80782] -1 x142 -1 x185 >= -1 ;+[80782] -1 x181 -1 x185 >= -1 ;+[80782] -1 x173 -1 x185 >= -1 ;+[80782] -1 x165 -1 x185 >= -1 ;+[80782] -1 x157 -1 x185 >= -1 ;+[80782] -1 x144 -1 x185 >= -1 ;+[80782] -1 x182 -1 x185 >= -1 ;+[80782] -1 x174 -1 x185 >= -1 ;+[80782] -1 x166 -1 x185 >= -1 ;+[80782] -1 x158 -1 x185 >= -1 ;+[80782] -1 x150 -1 x185 >= -1 ;+[80782] -1 x136 -1 x185 >= -1 ;+[80782] -1 x137 -1 x185 >= -1 ;+[80782] -1 x145 -1 x185 >= -1 ;+[80782] -1 x153 -1 x185 >= -1 ;+[80782] -1 x161 -1 x185 >= -1 ;+[80782] -1 x169 -1 x185 >= -1 ;+[80782] -1 x177 -1 x185 >= -1 ;+[80782] -1 x139 -1 x176 >= -1 ;+[80782] -1 x147 -1 x176 >= -1 ;+[80782] -1 x155 -1 x176 >= -1 ;+[80782] -1 x163 -1 x176 >= -1 ;+[80782] -1 x186 -1 x176 >= -1 ;+[80782] -1 x168 -1 x176 >= -1 ;+[80782] -1 x140 -1 x176 >= -1 ;+[80782] -1 x148 -1 x176 >= -1 ;+[80782] -1 x156 -1 x176 >= -1 ;+[80782] -1 x187 -1 x176 >= -1 ;+[80782] -1 x171 -1 x176 >= -1 ;+[80782] -1 x160 -1 x176 >= -1 ;+[80782] -1 x141 -1 x176 >= -1 ;+[80782] -1 x149 -1 x176 >= -1 ;+[80782] -1 x188 -1 x176 >= -1 ;+[80782] -1 x172 -1 x176 >= -1 ;+[80782] -1 x164 -1 x176 >= -1 ;+[80782] -1 x152 -1 x176 >= -1 ;+[80782] -1 x142 -1 x176 >= -1 ;+[80782] -1 x189 -1 x176 >= -1 ;+[80782] -1 x173 -1 x176 >= -1 ;+[80782] -1 x165 -1 x176 >= -1 ;+[80782] -1 x157 -1 x176 >= -1 ;+[80782] -1 x144 -1 x176 >= -1 ;+[80782] -1 x190 -1 x176 >= -1 ;+[80782] -1 x174 -1 x176 >= -1 ;+[80782] -1 x166 -1 x176 >= -1 ;+[80782] -1 x158 -1 x176 >= -1 ;+[80782] -1 x150 -1 x176 >= -1 ;+[80782] -1 x136 -1 x176 >= -1 ;+[80782] -1 x137 -1 x176 >= -1 ;+[80782] -1 x145 -1 x176 >= -1 ;+[80782] -1 x153 -1 x176 >= -1 ;+[80782] -1 x161 -1 x176 >= -1 ;+[80782] -1 x169 -1 x176 >= -1 ;+[80782] -1 x184 -1 x176 >= -1 ;+[80782] -1 x147 -1 x139 >= -1 ;+[80782] -1 x155 -1 x139 >= -1 ;+[80782] -1 x163 -1 x139 >= -1 ;+[80782] -1 x178 -1 x139 >= -1 ;+[80782] -1 x186 -1 x139 >= -1 ;+[80782] -1 x168 -1 x139 >= -1 ;+[80782] -1 x148 -1 x139 >= -1 ;+[80782] -1 x156 -1 x139 >= -1 ;+[80782] -1 x179 -1 x139 >= -1 ;+[80782] -1 x187 -1 x139 >= -1 ;+[80782] -1 x171 -1 x139 >= -1 ;+[80782] -1 x160 -1 x139 >= -1 ;+[80782] -1 x149 -1 x139 >= -1 ;+[80782] -1 x180 -1 x139 >= -1 ;+[80782] -1 x188 -1 x139 >= -1 ;+[80782] -1 x172 -1 x139 >= -1 ;+[80782] -1 x164 -1 x139 >= -1 ;+[80782] -1 x152 -1 x139 >= -1 ;+[80782] -1 x181 -1 x139 >= -1 ;+[80782] -1 x189 -1 x139 >= -1 ;+[80782] -1 x173 -1 x139 >= -1 ;+[80782] -1 x165 -1 x139 >= -1 ;+[80782] -1 x157 -1 x139 >= -1 ;+[80782] -1 x144 -1 x139 >= -1 ;+[80782] -1 x182 -1 x139 >= -1 ;+[80782] -1 x190 -1 x139 >= -1 ;+[80782] -1 x174 -1 x139 >= -1 ;+[80782] -1 x166 -1 x139 >= -1 ;+[80782] -1 x158 -1 x139 >= -1 ;+[80782] -1 x150 -1 x139 >= -1 ;+[80782] -1 x145 -1 x139 >= -1 ;+[80782] -1 x153 -1 x139 >= -1 ;+[80782] -1 x161 -1 x139 >= -1 ;+[80782] -1 x169 -1 x139 >= -1 ;+[80782] -1 x177 -1 x139 >= -1 ;+[80782] -1 x184 -1 x139 >= -1 ;+[80782] -1 x155 -1 x147 >= -1 ;+[80782] -1 x163 -1 x147 >= -1 ;+[80782] -1 x178 -1 x147 >= -1 ;+[80782] -1 x186 -1 x147 >= -1 ;+[80782] -1 x168 -1 x147 >= -1 ;+[80782] -1 x140 -1 x147 >= -1 ;+[80782] -1 x156 -1 x147 >= -1 ;+[80782] -1 x179 -1 x147 >= -1 ;+[80782] -1 x187 -1 x147 >= -1 ;+[80782] -1 x171 -1 x147 >= -1 ;+[80782] -1 x160 -1 x147 >= -1 ;+[80782] -1 x141 -1 x147 >= -1 ;+[80782] -1 x180 -1 x147 >= -1 ;+[80782] -1 x188 -1 x147 >= -1 ;+[80782] -1 x172 -1 x147 >= -1 ;+[80782] -1 x164 -1 x147 >= -1 ;+[80782] -1 x152 -1 x147 >= -1 ;+[80782] -1 x142 -1 x147 >= -1 ;+[80782] -1 x181 -1 x147 >= -1 ;+[80782] -1 x189 -1 x147 >= -1 ;+[80782] -1 x173 -1 x147 >= -1 ;+[80782] -1 x165 -1 x147 >= -1 ;+[80782] -1 x157 -1 x147 >= -1 ;+[80782] -1 x182 -1 x147 >= -1 ;+[80782] -1 x190 -1 x147 >= -1 ;+[80782] -1 x174 -1 x147 >= -1 ;+[80782] -1 x166 -1 x147 >= -1 ;+[80782] -1 x158 -1 x147 >= -1 ;+[80782] -1 x136 -1 x147 >= -1 ;+[80782] -1 x137 -1 x147 >= -1 ;+[80782] -1 x153 -1 x147 >= -1 ;+[80782] -1 x161 -1 x147 >= -1 ;+[80782] -1 x169 -1 x147 >= -1 ;+[80782] -1 x177 -1 x147 >= -1 ;+[80782] -1 x184 -1 x147 >= -1 ;+[80782] -1 x163 -1 x155 >= -1 ;+[80782] -1 x178 -1 x155 >= -1 ;+[80782] -1 x186 -1 x155 >= -1 ;+[80782] -1 x168 -1 x155 >= -1 ;+[80782] -1 x140 -1 x155 >= -1 ;+[80782] -1 x148 -1 x155 >= -1 ;+[80782] -1 x179 -1 x155 >= -1 ;+[80782] -1 x187 -1 x155 >= -1 ;+[80782] -1 x171 -1 x155 >= -1 ;+[80782] -1 x160 -1 x155 >= -1 ;+[80782] -1 x141 -1 x155 >= -1 ;+[80782] -1 x149 -1 x155 >= -1 ;+[80782] -1 x180 -1 x155 >= -1 ;+[80782] -1 x188 -1 x155 >= -1 ;+[80782] -1 x172 -1 x155 >= -1 ;+[80782] -1 x164 -1 x155 >= -1 ;+[80782] -1 x142 -1 x155 >= -1 ;+[80782] -1 x181 -1 x155 >= -1 ;+[80782] -1 x189 -1 x155 >= -1 ;+[80782] -1 x173 -1 x155 >= -1 ;+[80782] -1 x165 -1 x155 >= -1 ;+[80782] -1 x144 -1 x155 >= -1 ;+[80782] -1 x182 -1 x155 >= -1 ;+[80782] -1 x190 -1 x155 >= -1 ;+[80782] -1 x174 -1 x155 >= -1 ;+[80782] -1 x166 -1 x155 >= -1 ;+[80782] -1 x150 -1 x155 >= -1 ;+[80782] -1 x136 -1 x155 >= -1 ;+[80782] -1 x137 -1 x155 >= -1 ;+[80782] -1 x145 -1 x155 >= -1 ;+[80782] -1 x161 -1 x155 >= -1 ;+[80782] -1 x169 -1 x155 >= -1 ;+[80782] -1 x177 -1 x155 >= -1 ;+[80782] -1 x184 -1 x155 >= -1 ;+[80782] -1 x178 -1 x163 >= -1 ;+[80782] -1 x186 -1 x163 >= -1 ;+[80782] -1 x168 -1 x163 >= -1 ;+[80782] -1 x140 -1 x163 >= -1 ;+[80782] -1 x148 -1 x163 >= -1 ;+[80782] -1 x156 -1 x163 >= -1 ;+[80782] -1 x179 -1 x163 >= -1 ;+[80782] -1 x187 -1 x163 >= -1 ;+[80782] -1 x171 -1 x163 >= -1 ;+[80782] -1 x141 -1 x163 >= -1 ;+[80782] -1 x149 -1 x163 >= -1 ;+[80782] -1 x180 -1 x163 >= -1 ;+[80782] -1 x188 -1 x163 >= -1 ;+[80782] -1 x172 -1 x163 >= -1 ;+[80782] -1 x152 -1 x163 >= -1 ;+[80782] -1 x142 -1 x163 >= -1 ;+[80782] -1 x181 -1 x163 >= -1 ;+[80782] -1 x189 -1 x163 >= -1 ;+[80782] -1 x173 -1 x163 >= -1 ;+[80782] -1 x157 -1 x163 >= -1 ;+[80782] -1 x144 -1 x163 >= -1 ;+[80782] -1 x182 -1 x163 >= -1 ;+[80782] -1 x190 -1 x163 >= -1 ;+[80782] -1 x174 -1 x163 >= -1 ;+[80782] -1 x158 -1 x163 >= -1 ;+[80782] -1 x150 -1 x163 >= -1 ;+[80782] -1 x136 -1 x163 >= -1 ;+[80782] -1 x137 -1 x163 >= -1 ;+[80782] -1 x145 -1 x163 >= -1 ;+[80782] -1 x153 -1 x163 >= -1 ;+[80782] -1 x169 -1 x163 >= -1 ;+[80782] -1 x177 -1 x163 >= -1 ;+[80782] -1 x184 -1 x163 >= -1 ;+[80782] -1 x186 -1 x178 >= -1 ;+[80782] -1 x168 -1 x178 >= -1 ;+[80782] -1 x140 -1 x178 >= -1 ;+[80782] -1 x148 -1 x178 >= -1 ;+[80782] -1 x156 -1 x178 >= -1 ;+[80782] -1 x187 -1 x178 >= -1 ;+[80782] -1 x171 -1 x178 >= -1 ;+[80782] -1 x160 -1 x178 >= -1 ;+[80782] -1 x141 -1 x178 >= -1 ;+[80782] -1 x149 -1 x178 >= -1 ;+[80782] -1 x188 -1 x178 >= -1 ;+[80782] -1 x172 -1 x178 >= -1 ;+[80782] -1 x164 -1 x178 >= -1 ;+[80782] -1 x152 -1 x178 >= -1 ;+[80782] -1 x142 -1 x178 >= -1 ;+[80782] -1 x189 -1 x178 >= -1 ;+[80782] -1 x173 -1 x178 >= -1 ;+[80782] -1 x165 -1 x178 >= -1 ;+[80782] -1 x157 -1 x178 >= -1 ;+[80782] -1 x144 -1 x178 >= -1 ;+[80782] -1 x190 -1 x178 >= -1 ;+[80782] -1 x174 -1 x178 >= -1 ;+[80782] -1 x166 -1 x178 >= -1 ;+[80782] -1 x158 -1 x178 >= -1 ;+[80782] -1 x150 -1 x178 >= -1 ;+[80782] -1 x136 -1 x178 >= -1 ;+[80782] -1 x137 -1 x178 >= -1 ;+[80782] -1 x145 -1 x178 >= -1 ;+[80782] -1 x153 -1 x178 >= -1 ;+[80782] -1 x161 -1 x178 >= -1 ;+[80782] -1 x169 -1 x178 >= -1 ;+[80782] -1 x184 -1 x178 >= -1 ;+[80782] -1 x168 -1 x186 >= -1 ;+[80782] -1 x140 -1 x186 >= -1 ;+[80782] -1 x148 -1 x186 >= -1 ;+[80782] -1 x156 -1 x186 >= -1 ;+[80782] -1 x179 -1 x186 >= -1 ;+[80782] -1 x171 -1 x186 >= -1 ;+[80782] -1 x160 -1 x186 >= -1 ;+[80782] -1 x141 -1 x186 >= -1 ;+[80782] -1 x149 -1 x186 >= -1 ;+[80782] -1 x180 -1 x186 >= -1 ;+[80782] -1 x172 -1 x186 >= -1 ;+[80782] -1 x164 -1 x186 >= -1 ;+[80782] -1 x152 -1 x186 >= -1 ;+[80782] -1 x142 -1 x186 >= -1 ;+[80782] -1 x181 -1 x186 >= -1 ;+[80782] -1 x173 -1 x186 >= -1 ;+[80782] -1 x165 -1 x186 >= -1 ;+[80782] -1 x157 -1 x186 >= -1 ;+[80782] -1 x144 -1 x186 >= -1 ;+[80782] -1 x182 -1 x186 >= -1 ;+[80782] -1 x174 -1 x186 >= -1 ;+[80782] -1 x166 -1 x186 >= -1 ;+[80782] -1 x158 -1 x186 >= -1 ;+[80782] -1 x150 -1 x186 >= -1 ;+[80782] -1 x136 -1 x186 >= -1 ;+[80782] -1 x137 -1 x186 >= -1 ;+[80782] -1 x145 -1 x186 >= -1 ;+[80782] -1 x153 -1 x186 >= -1 ;+[80782] -1 x161 -1 x186 >= -1 ;+[80782] -1 x169 -1 x186 >= -1 ;+[80782] -1 x177 -1 x186 >= -1 ;+[80782] -1 x140 -1 x168 >= -1 ;+[80782] -1 x148 -1 x168 >= -1 ;+[80782] -1 x156 -1 x168 >= -1 ;+[80782] -1 x179 -1 x168 >= -1 ;+[80782] -1 x187 -1 x168 >= -1 ;+[80782] -1 x160 -1 x168 >= -1 ;+[80782] -1 x141 -1 x168 >= -1 ;+[80782] -1 x149 -1 x168 >= -1 ;+[80782] -1 x180 -1 x168 >= -1 ;+[80782] -1 x188 -1 x168 >= -1 ;+[80782] -1 x164 -1 x168 >= -1 ;+[80782] -1 x152 -1 x168 >= -1 ;+[80782] -1 x142 -1 x168 >= -1 ;+[80782] -1 x181 -1 x168 >= -1 ;+[80782] -1 x189 -1 x168 >= -1 ;+[80782] -1 x165 -1 x168 >= -1 ;+[80782] -1 x157 -1 x168 >= -1 ;+[80782] -1 x144 -1 x168 >= -1 ;+[80782] -1 x182 -1 x168 >= -1 ;+[80782] -1 x190 -1 x168 >= -1 ;+[80782] -1 x166 -1 x168 >= -1 ;+[80782] -1 x158 -1 x168 >= -1 ;+[80782] -1 x150 -1 x168 >= -1 ;+[80782] -1 x136 -1 x168 >= -1 ;+[80782] -1 x137 -1 x168 >= -1 ;+[80782] -1 x145 -1 x168 >= -1 ;+[80782] -1 x153 -1 x168 >= -1 ;+[80782] -1 x161 -1 x168 >= -1 ;+[80782] -1 x177 -1 x168 >= -1 ;+[80782] -1 x184 -1 x168 >= -1 ;+[80782] -1 x148 -1 x140 >= -1 ;+[80782] -1 x156 -1 x140 >= -1 ;+[80782] -1 x179 -1 x140 >= -1 ;+[80782] -1 x187 -1 x140 >= -1 ;+[80782] -1 x171 -1 x140 >= -1 ;+[80782] -1 x160 -1 x140 >= -1 ;+[80782] -1 x149 -1 x140 >= -1 ;+[80782] -1 x180 -1 x140 >= -1 ;+[80782] -1 x188 -1 x140 >= -1 ;+[80782] -1 x172 -1 x140 >= -1 ;+[80782] -1 x164 -1 x140 >= -1 ;+[80782] -1 x152 -1 x140 >= -1 ;+[80782] -1 x181 -1 x140 >= -1 ;+[80782] -1 x189 -1 x140 >= -1 ;+[80782] -1 x173 -1 x140 >= -1 ;+[80782] -1 x165 -1 x140 >= -1 ;+[80782] -1 x157 -1 x140 >= -1 ;+[80782] -1 x144 -1 x140 >= -1 ;+[80782] -1 x182 -1 x140 >= -1 ;+[80782] -1 x190 -1 x140 >= -1 ;+[80782] -1 x174 -1 x140 >= -1 ;+[80782] -1 x166 -1 x140 >= -1 ;+[80782] -1 x158 -1 x140 >= -1 ;+[80782] -1 x150 -1 x140 >= -1 ;+[80782] -1 x145 -1 x140 >= -1 ;+[80782] -1 x153 -1 x140 >= -1 ;+[80782] -1 x161 -1 x140 >= -1 ;+[80782] -1 x169 -1 x140 >= -1 ;+[80782] -1 x177 -1 x140 >= -1 ;+[80782] -1 x184 -1 x140 >= -1 ;+[80782] -1 x156 -1 x148 >= -1 ;+[80782] -1 x179 -1 x148 >= -1 ;+[80782] -1 x187 -1 x148 >= -1 ;+[80782] -1 x171 -1 x148 >= -1 ;+[80782] -1 x160 -1 x148 >= -1 ;+[80782] -1 x141 -1 x148 >= -1 ;+[80782] -1 x180 -1 x148 >= -1 ;+[80782] -1 x188 -1 x148 >= -1 ;+[80782] -1 x172 -1 x148 >= -1 ;+[80782] -1 x164 -1 x148 >= -1 ;+[80782] -1 x152 -1 x148 >= -1 ;+[80782] -1 x142 -1 x148 >= -1 ;+[80782] -1 x181 -1 x148 >= -1 ;+[80782] -1 x189 -1 x148 >= -1 ;+[80782] -1 x173 -1 x148 >= -1 ;+[80782] -1 x165 -1 x148 >= -1 ;+[80782] -1 x157 -1 x148 >= -1 ;+[80782] -1 x182 -1 x148 >= -1 ;+[80782] -1 x190 -1 x148 >= -1 ;+[80782] -1 x174 -1 x148 >= -1 ;+[80782] -1 x166 -1 x148 >= -1 ;+[80782] -1 x158 -1 x148 >= -1 ;+[80782] -1 x136 -1 x148 >= -1 ;+[80782] -1 x137 -1 x148 >= -1 ;+[80782] -1 x153 -1 x148 >= -1 ;+[80782] -1 x161 -1 x148 >= -1 ;+[80782] -1 x169 -1 x148 >= -1 ;+[80782] -1 x177 -1 x148 >= -1 ;+[80782] -1 x184 -1 x148 >= -1 ;+[80782] -1 x179 -1 x156 >= -1 ;+[80782] -1 x187 -1 x156 >= -1 ;+[80782] -1 x171 -1 x156 >= -1 ;+[80782] -1 x160 -1 x156 >= -1 ;+[80782] -1 x141 -1 x156 >= -1 ;+[80782] -1 x149 -1 x156 >= -1 ;+[80782] -1 x180 -1 x156 >= -1 ;+[80782] -1 x188 -1 x156 >= -1 ;+[80782] -1 x172 -1 x156 >= -1 ;+[80782] -1 x164 -1 x156 >= -1 ;+[80782] -1 x142 -1 x156 >= -1 ;+[80782] -1 x181 -1 x156 >= -1 ;+[80782] -1 x189 -1 x156 >= -1 ;+[80782] -1 x173 -1 x156 >= -1 ;+[80782] -1 x165 -1 x156 >= -1 ;+[80782] -1 x144 -1 x156 >= -1 ;+[80782] -1 x182 -1 x156 >= -1 ;+[80782] -1 x190 -1 x156 >= -1 ;+[80782] -1 x174 -1 x156 >= -1 ;+[80782] -1 x166 -1 x156 >= -1 ;+[80782] -1 x150 -1 x156 >= -1 ;+[80782] -1 x136 -1 x156 >= -1 ;+[80782] -1 x137 -1 x156 >= -1 ;+[80782] -1 x145 -1 x156 >= -1 ;+[80782] -1 x161 -1 x156 >= -1 ;+[80782] -1 x169 -1 x156 >= -1 ;+[80782] -1 x177 -1 x156 >= -1 ;+[80782] -1 x184 -1 x156 >= -1 ;+[80782] -1 x187 -1 x179 >= -1 ;+[80782] -1 x171 -1 x179 >= -1 ;+[80782] -1 x160 -1 x179 >= -1 ;+[80782] -1 x141 -1 x179 >= -1 ;+[80782] -1 x149 -1 x179 >= -1 ;+[80782] -1 x188 -1 x179 >= -1 ;+[80782] -1 x172 -1 x179 >= -1 ;+[80782] -1 x164 -1 x179 >= -1 ;+[80782] -1 x152 -1 x179 >= -1 ;+[80782] -1 x142 -1 x179 >= -1 ;+[80782] -1 x189 -1 x179 >= -1 ;+[80782] -1 x173 -1 x179 >= -1 ;+[80782] -1 x165 -1 x179 >= -1 ;+[80782] -1 x157 -1 x179 >= -1 ;+[80782] -1 x144 -1 x179 >= -1 ;+[80782] -1 x190 -1 x179 >= -1 ;+[80782] -1 x174 -1 x179 >= -1 ;+[80782] -1 x166 -1 x179 >= -1 ;+[80782] -1 x158 -1 x179 >= -1 ;+[80782] -1 x150 -1 x179 >= -1 ;+[80782] -1 x136 -1 x179 >= -1 ;+[80782] -1 x137 -1 x179 >= -1 ;+[80782] -1 x145 -1 x179 >= -1 ;+[80782] -1 x153 -1 x179 >= -1 ;+[80782] -1 x161 -1 x179 >= -1 ;+[80782] -1 x169 -1 x179 >= -1 ;+[80782] -1 x184 -1 x179 >= -1 ;+[80782] -1 x171 -1 x187 >= -1 ;+[80782] -1 x160 -1 x187 >= -1 ;+[80782] -1 x141 -1 x187 >= -1 ;+[80782] -1 x149 -1 x187 >= -1 ;+[80782] -1 x180 -1 x187 >= -1 ;+[80782] -1 x172 -1 x187 >= -1 ;+[80782] -1 x164 -1 x187 >= -1 ;+[80782] -1 x152 -1 x187 >= -1 ;+[80782] -1 x142 -1 x187 >= -1 ;+[80782] -1 x181 -1 x187 >= -1 ;+[80782] -1 x173 -1 x187 >= -1 ;+[80782] -1 x165 -1 x187 >= -1 ;+[80782] -1 x157 -1 x187 >= -1 ;+[80782] -1 x144 -1 x187 >= -1 ;+[80782] -1 x182 -1 x187 >= -1 ;+[80782] -1 x174 -1 x187 >= -1 ;+[80782] -1 x166 -1 x187 >= -1 ;+[80782] -1 x158 -1 x187 >= -1 ;+[80782] -1 x150 -1 x187 >= -1 ;+[80782] -1 x136 -1 x187 >= -1 ;+[80782] -1 x137 -1 x187 >= -1 ;+[80782] -1 x145 -1 x187 >= -1 ;+[80782] -1 x153 -1 x187 >= -1 ;+[80782] -1 x161 -1 x187 >= -1 ;+[80782] -1 x169 -1 x187 >= -1 ;+[80782] -1 x177 -1 x187 >= -1 ;+[80782] -1 x160 -1 x171 >= -1 ;+[80782] -1 x141 -1 x171 >= -1 ;+[80782] -1 x149 -1 x171 >= -1 ;+[80782] -1 x180 -1 x171 >= -1 ;+[80782] -1 x188 -1 x171 >= -1 ;+[80782] -1 x164 -1 x171 >= -1 ;+[80782] -1 x152 -1 x171 >= -1 ;+[80782] -1 x142 -1 x171 >= -1 ;+[80782] -1 x181 -1 x171 >= -1 ;+[80782] -1 x189 -1 x171 >= -1 ;+[80782] -1 x165 -1 x171 >= -1 ;+[80782] -1 x157 -1 x171 >= -1 ;+[80782] -1 x144 -1 x171 >= -1 ;+[80782] -1 x182 -1 x171 >= -1 ;+[80782] -1 x190 -1 x171 >= -1 ;+[80782] -1 x166 -1 x171 >= -1 ;+[80782] -1 x158 -1 x171 >= -1 ;+[80782] -1 x150 -1 x171 >= -1 ;+[80782] -1 x136 -1 x171 >= -1 ;+[80782] -1 x137 -1 x171 >= -1 ;+[80782] -1 x145 -1 x171 >= -1 ;+[80782] -1 x153 -1 x171 >= -1 ;+[80782] -1 x161 -1 x171 >= -1 ;+[80782] -1 x177 -1 x171 >= -1 ;+[80782] -1 x184 -1 x171 >= -1 ;+[80782] -1 x141 -1 x160 >= -1 ;+[80782] -1 x149 -1 x160 >= -1 ;+[80782] -1 x180 -1 x160 >= -1 ;+[80782] -1 x188 -1 x160 >= -1 ;+[80782] -1 x172 -1 x160 >= -1 ;+[80782] -1 x152 -1 x160 >= -1 ;+[80782] -1 x142 -1 x160 >= -1 ;+[80782] -1 x181 -1 x160 >= -1 ;+[80782] -1 x189 -1 x160 >= -1 ;+[80782] -1 x173 -1 x160 >= -1 ;+[80782] -1 x157 -1 x160 >= -1 ;+[80782] -1 x144 -1 x160 >= -1 ;+[80782] -1 x182 -1 x160 >= -1 ;+[80782] -1 x190 -1 x160 >= -1 ;+[80782] -1 x174 -1 x160 >= -1 ;+[80782] -1 x158 -1 x160 >= -1 ;+[80782] -1 x150 -1 x160 >= -1 ;+[80782] -1 x136 -1 x160 >= -1 ;+[80782] -1 x137 -1 x160 >= -1 ;+[80782] -1 x145 -1 x160 >= -1 ;+[80782] -1 x153 -1 x160 >= -1 ;+[80782] -1 x169 -1 x160 >= -1 ;+[80782] -1 x177 -1 x160 >= -1 ;+[80782] -1 x184 -1 x160 >= -1 ;+[80782] -1 x149 -1 x141 >= -1 ;+[80782] -1 x180 -1 x141 >= -1 ;+[80782] -1 x188 -1 x141 >= -1 ;+[80782] -1 x172 -1 x141 >= -1 ;+[80782] -1 x164 -1 x141 >= -1 ;+[80782] -1 x152 -1 x141 >= -1 ;+[80782] -1 x181 -1 x141 >= -1 ;+[80782] -1 x189 -1 x141 >= -1 ;+[80782] -1 x173 -1 x141 >= -1 ;+[80782] -1 x165 -1 x141 >= -1 ;+[80782] -1 x157 -1 x141 >= -1 ;+[80782] -1 x144 -1 x141 >= -1 ;+[80782] -1 x182 -1 x141 >= -1 ;+[80782] -1 x190 -1 x141 >= -1 ;+[80782] -1 x174 -1 x141 >= -1 ;+[80782] -1 x166 -1 x141 >= -1 ;+[80782] -1 x158 -1 x141 >= -1 ;+[80782] -1 x150 -1 x141 >= -1 ;+[80782] -1 x145 -1 x141 >= -1 ;+[80782] -1 x153 -1 x141 >= -1 ;+[80782] -1 x161 -1 x141 >= -1 ;+[80782] -1 x169 -1 x141 >= -1 ;+[80782] -1 x177 -1 x141 >= -1 ;+[80782] -1 x184 -1 x141 >= -1 ;+[80782] -1 x180 -1 x149 >= -1 ;+[80782] -1 x188 -1 x149 >= -1 ;+[80782] -1 x172 -1 x149 >= -1 ;+[80782] -1 x164 -1 x149 >= -1 ;+[80782] -1 x152 -1 x149 >= -1 ;+[80782] -1 x142 -1 x149 >= -1 ;+[80782] -1 x181 -1 x149 >= -1 ;+[80782] -1 x189 -1 x149 >= -1 ;+[80782] -1 x173 -1 x149 >= -1 ;+[80782] -1 x165 -1 x149 >= -1 ;+[80782] -1 x157 -1 x149 >= -1 ;+[80782] -1 x182 -1 x149 >= -1 ;+[80782] -1 x190 -1 x149 >= -1 ;+[80782] -1 x174 -1 x149 >= -1 ;+[80782] -1 x166 -1 x149 >= -1 ;+[80782] -1 x158 -1 x149 >= -1 ;+[80782] -1 x136 -1 x149 >= -1 ;+[80782] -1 x137 -1 x149 >= -1 ;+[80782] -1 x153 -1 x149 >= -1 ;+[80782] -1 x161 -1 x149 >= -1 ;+[80782] -1 x169 -1 x149 >= -1 ;+[80782] -1 x177 -1 x149 >= -1 ;+[80782] -1 x184 -1 x149 >= -1 ;+[80782] -1 x188 -1 x180 >= -1 ;+[80782] -1 x172 -1 x180 >= -1 ;+[80782] -1 x164 -1 x180 >= -1 ;+[80782] -1 x152 -1 x180 >= -1 ;+[80782] -1 x142 -1 x180 >= -1 ;+[80782] -1 x189 -1 x180 >= -1 ;+[80782] -1 x173 -1 x180 >= -1 ;+[80782] -1 x165 -1 x180 >= -1 ;+[80782] -1 x157 -1 x180 >= -1 ;+[80782] -1 x144 -1 x180 >= -1 ;+[80782] -1 x190 -1 x180 >= -1 ;+[80782] -1 x174 -1 x180 >= -1 ;+[80782] -1 x166 -1 x180 >= -1 ;+[80782] -1 x158 -1 x180 >= -1 ;+[80782] -1 x150 -1 x180 >= -1 ;+[80782] -1 x136 -1 x180 >= -1 ;+[80782] -1 x137 -1 x180 >= -1 ;+[80782] -1 x145 -1 x180 >= -1 ;+[80782] -1 x153 -1 x180 >= -1 ;+[80782] -1 x161 -1 x180 >= -1 ;+[80782] -1 x169 -1 x180 >= -1 ;+[80782] -1 x184 -1 x180 >= -1 ;+[80782] -1 x172 -1 x188 >= -1 ;+[80782] -1 x164 -1 x188 >= -1 ;+[80782] -1 x152 -1 x188 >= -1 ;+[80782] -1 x142 -1 x188 >= -1 ;+[80782] -1 x181 -1 x188 >= -1 ;+[80782] -1 x173 -1 x188 >= -1 ;+[80782] -1 x165 -1 x188 >= -1 ;+[80782] -1 x157 -1 x188 >= -1 ;+[80782] -1 x144 -1 x188 >= -1 ;+[80782] -1 x182 -1 x188 >= -1 ;+[80782] -1 x174 -1 x188 >= -1 ;+[80782] -1 x166 -1 x188 >= -1 ;+[80782] -1 x158 -1 x188 >= -1 ;+[80782] -1 x150 -1 x188 >= -1 ;+[80782] -1 x136 -1 x188 >= -1 ;+[80782] -1 x137 -1 x188 >= -1 ;+[80782] -1 x145 -1 x188 >= -1 ;+[80782] -1 x153 -1 x188 >= -1 ;+[80782] -1 x161 -1 x188 >= -1 ;+[80782] -1 x169 -1 x188 >= -1 ;+[80782] -1 x177 -1 x188 >= -1 ;+[80782] -1 x164 -1 x172 >= -1 ;+[80782] -1 x152 -1 x172 >= -1 ;+[80782] -1 x142 -1 x172 >= -1 ;+[80782] -1 x181 -1 x172 >= -1 ;+[80782] -1 x189 -1 x172 >= -1 ;+[80782] -1 x165 -1 x172 >= -1 ;+[80782] -1 x157 -1 x172 >= -1 ;+[80782] -1 x144 -1 x172 >= -1 ;+[80782] -1 x182 -1 x172 >= -1 ;+[80782] -1 x190 -1 x172 >= -1 ;+[80782] -1 x166 -1 x172 >= -1 ;+[80782] -1 x158 -1 x172 >= -1 ;+[80782] -1 x150 -1 x172 >= -1 ;+[80782] -1 x136 -1 x172 >= -1 ;+[80782] -1 x137 -1 x172 >= -1 ;+[80782] -1 x145 -1 x172 >= -1 ;+[80782] -1 x153 -1 x172 >= -1 ;+[80782] -1 x161 -1 x172 >= -1 ;+[80782] -1 x177 -1 x172 >= -1 ;+[80782] -1 x184 -1 x172 >= -1 ;+[80782] -1 x152 -1 x164 >= -1 ;+[80782] -1 x142 -1 x164 >= -1 ;+[80782] -1 x181 -1 x164 >= -1 ;+[80782] -1 x189 -1 x164 >= -1 ;+[80782] -1 x173 -1 x164 >= -1 ;+[80782] -1 x157 -1 x164 >= -1 ;+[80782] -1 x144 -1 x164 >= -1 ;+[80782] -1 x182 -1 x164 >= -1 ;+[80782] -1 x190 -1 x164 >= -1 ;+[80782] -1 x174 -1 x164 >= -1 ;+[80782] -1 x158 -1 x164 >= -1 ;+[80782] -1 x150 -1 x164 >= -1 ;+[80782] -1 x136 -1 x164 >= -1 ;+[80782] -1 x137 -1 x164 >= -1 ;+[80782] -1 x145 -1 x164 >= -1 ;+[80782] -1 x153 -1 x164 >= -1 ;+[80782] -1 x169 -1 x164 >= -1 ;+[80782] -1 x177 -1 x164 >= -1 ;+[80782] -1 x184 -1 x164 >= -1 ;+[80782] -1 x142 -1 x152 >= -1 ;+[80782] -1 x181 -1 x152 >= -1 ;+[80782] -1 x189 -1 x152 >= -1 ;+[80782] -1 x173 -1 x152 >= -1 ;+[80782] -1 x165 -1 x152 >= -1 ;+[80782] -1 x144 -1 x152 >= -1 ;+[80782] -1 x182 -1 x152 >= -1 ;+[80782] -1 x190 -1 x152 >= -1 ;+[80782] -1 x174 -1 x152 >= -1 ;+[80782] -1 x166 -1 x152 >= -1 ;+[80782] -1 x150 -1 x152 >= -1 ;+[80782] -1 x136 -1 x152 >= -1 ;+[80782] -1 x137 -1 x152 >= -1 ;+[80782] -1 x145 -1 x152 >= -1 ;+[80782] -1 x161 -1 x152 >= -1 ;+[80782] -1 x169 -1 x152 >= -1 ;+[80782] -1 x177 -1 x152 >= -1 ;+[80782] -1 x184 -1 x152 >= -1 ;+[80782] -1 x181 -1 x142 >= -1 ;+[80782] -1 x189 -1 x142 >= -1 ;+[80782] -1 x173 -1 x142 >= -1 ;+[80782] -1 x165 -1 x142 >= -1 ;+[80782] -1 x157 -1 x142 >= -1 ;+[80782] -1 x144 -1 x142 >= -1 ;+[80782] -1 x182 -1 x142 >= -1 ;+[80782] -1 x190 -1 x142 >= -1 ;+[80782] -1 x174 -1 x142 >= -1 ;+[80782] -1 x166 -1 x142 >= -1 ;+[80782] -1 x158 -1 x142 >= -1 ;+[80782] -1 x150 -1 x142 >= -1 ;+[80782] -1 x145 -1 x142 >= -1 ;+[80782] -1 x153 -1 x142 >= -1 ;+[80782] -1 x161 -1 x142 >= -1 ;+[80782] -1 x169 -1 x142 >= -1 ;+[80782] -1 x177 -1 x142 >= -1 ;+[80782] -1 x184 -1 x142 >= -1 ;+[80782] -1 x189 -1 x181 >= -1 ;+[80782] -1 x173 -1 x181 >= -1 ;+[80782] -1 x165 -1 x181 >= -1 ;+[80782] -1 x157 -1 x181 >= -1 ;+[80782] -1 x144 -1 x181 >= -1 ;+[80782] -1 x190 -1 x181 >= -1 ;+[80782] -1 x174 -1 x181 >= -1 ;+[80782] -1 x166 -1 x181 >= -1 ;+[80782] -1 x158 -1 x181 >= -1 ;+[80782] -1 x150 -1 x181 >= -1 ;+[80782] -1 x136 -1 x181 >= -1 ;+[80782] -1 x137 -1 x181 >= -1 ;+[80782] -1 x145 -1 x181 >= -1 ;+[80782] -1 x153 -1 x181 >= -1 ;+[80782] -1 x161 -1 x181 >= -1 ;+[80782] -1 x169 -1 x181 >= -1 ;+[80782] -1 x184 -1 x181 >= -1 ;+[80782] -1 x173 -1 x189 >= -1 ;+[80782] -1 x165 -1 x189 >= -1 ;+[80782] -1 x157 -1 x189 >= -1 ;+[80782] -1 x144 -1 x189 >= -1 ;+[80782] -1 x182 -1 x189 >= -1 ;+[80782] -1 x174 -1 x189 >= -1 ;+[80782] -1 x166 -1 x189 >= -1 ;+[80782] -1 x158 -1 x189 >= -1 ;+[80782] -1 x150 -1 x189 >= -1 ;+[80782] -1 x136 -1 x189 >= -1 ;+[80782] -1 x137 -1 x189 >= -1 ;+[80782] -1 x145 -1 x189 >= -1 ;+[80782] -1 x153 -1 x189 >= -1 ;+[80782] -1 x161 -1 x189 >= -1 ;+[80782] -1 x169 -1 x189 >= -1 ;+[80782] -1 x177 -1 x189 >= -1 ;+[80782] -1 x165 -1 x173 >= -1 ;+[80782] -1 x157 -1 x173 >= -1 ;+[80782] -1 x144 -1 x173 >= -1 ;+[80782] -1 x182 -1 x173 >= -1 ;+[80782] -1 x190 -1 x173 >= -1 ;+[80782] -1 x166 -1 x173 >= -1 ;+[80782] -1 x158 -1 x173 >= -1 ;+[80782] -1 x150 -1 x173 >= -1 ;+[80782] -1 x136 -1 x173 >= -1 ;+[80782] -1 x137 -1 x173 >= -1 ;+[80782] -1 x145 -1 x173 >= -1 ;+[80782] -1 x153 -1 x173 >= -1 ;+[80782] -1 x161 -1 x173 >= -1 ;+[80782] -1 x177 -1 x173 >= -1 ;+[80782] -1 x184 -1 x173 >= -1 ;+[80782] -1 x157 -1 x165 >= -1 ;+[80782] -1 x144 -1 x165 >= -1 ;+[80782] -1 x182 -1 x165 >= -1 ;+[80782] -1 x190 -1 x165 >= -1 ;+[80782] -1 x174 -1 x165 >= -1 ;+[80782] -1 x158 -1 x165 >= -1 ;+[80782] -1 x150 -1 x165 >= -1 ;+[80782] -1 x136 -1 x165 >= -1 ;+[80782] -1 x137 -1 x165 >= -1 ;+[80782] -1 x145 -1 x165 >= -1 ;+[80782] -1 x153 -1 x165 >= -1 ;+[80782] -1 x169 -1 x165 >= -1 ;+[80782] -1 x177 -1 x165 >= -1 ;+[80782] -1 x184 -1 x165 >= -1 ;+[80782] -1 x144 -1 x157 >= -1 ;+[80782] -1 x182 -1 x157 >= -1 ;+[80782] -1 x190 -1 x157 >= -1 ;+[80782] -1 x174 -1 x157 >= -1 ;+[80782] -1 x166 -1 x157 >= -1 ;+[80782] -1 x150 -1 x157 >= -1 ;+[80782] -1 x136 -1 x157 >= -1 ;+[80782] -1 x137 -1 x157 >= -1 ;+[80782] -1 x145 -1 x157 >= -1 ;+[80782] -1 x161 -1 x157 >= -1 ;+[80782] -1 x169 -1 x157 >= -1 ;+[80782] -1 x177 -1 x157 >= -1 ;+[80782] -1 x184 -1 x157 >= -1 ;+[80782] -1 x182 -1 x144 >= -1 ;+[80782] -1 x190 -1 x144 >= -1 ;+[80782] -1 x174 -1 x144 >= -1 ;+[80782] -1 x166 -1 x144 >= -1 ;+[80782] -1 x158 -1 x144 >= -1 ;+[80782] -1 x136 -1 x144 >= -1 ;+[80782] -1 x137 -1 x144 >= -1 ;+[80782] -1 x153 -1 x144 >= -1 ;+[80782] -1 x161 -1 x144 >= -1 ;+[80782] -1 x169 -1 x144 >= -1 ;+[80782] -1 x177 -1 x144 >= -1 ;+[80782] -1 x184 -1 x144 >= -1 ;+[80782] -1 x190 -1 x182 >= -1 ;+[80782] -1 x174 -1 x182 >= -1 ;+[80782] -1 x166 -1 x182 >= -1 ;+[80782] -1 x158 -1 x182 >= -1 ;+[80782] -1 x150 -1 x182 >= -1 ;+[80782] -1 x136 -1 x182 >= -1 ;+[80782] -1 x137 -1 x182 >= -1 ;+[80782] -1 x145 -1 x182 >= -1 ;+[80782] -1 x153 -1 x182 >= -1 ;+[80782] -1 x161 -1 x182 >= -1 ;+[80782] -1 x169 -1 x182 >= -1 ;+[80782] -1 x184 -1 x182 >= -1 ;+[80782] -1 x174 -1 x190 >= -1 ;+[80782] -1 x166 -1 x190 >= -1 ;+[80782] -1 x158 -1 x190 >= -1 ;+[80782] -1 x150 -1 x190 >= -1 ;+[80782] -1 x136 -1 x190 >= -1 ;+[80782] -1 x137 -1 x190 >= -1 ;+[80782] -1 x145 -1 x190 >= -1 ;+[80782] -1 x153 -1 x190 >= -1 ;+[80782] -1 x161 -1 x190 >= -1 ;+[80782] -1 x169 -1 x190 >= -1 ;+[80782] -1 x177 -1 x190 >= -1 ;+[80782] -1 x166 -1 x174 >= -1 ;+[80782] -1 x158 -1 x174 >= -1 ;+[80782] -1 x150 -1 x174 >= -1 ;+[80782] -1 x136 -1 x174 >= -1 ;+[80782] -1 x137 -1 x174 >= -1 ;+[80782] -1 x145 -1 x174 >= -1 ;+[80782] -1 x153 -1 x174 >= -1 ;+[80782] -1 x161 -1 x174 >= -1 ;+[80782] -1 x177 -1 x174 >= -1 ;+[80782] -1 x184 -1 x174 >= -1 ;+[80782] -1 x158 -1 x166 >= -1 ;+[80782] -1 x150 -1 x166 >= -1 ;+[80782] -1 x136 -1 x166 >= -1 ;+[80782] -1 x137 -1 x166 >= -1 ;+[80782] -1 x145 -1 x166 >= -1 ;+[80782] -1 x153 -1 x166 >= -1 ;+[80782] -1 x169 -1 x166 >= -1 ;+[80782] -1 x177 -1 x166 >= -1 ;+[80782] -1 x184 -1 x166 >= -1 ;+[80782] -1 x150 -1 x158 >= -1 ;+[80782] -1 x136 -1 x158 >= -1 ;+[80782] -1 x137 -1 x158 >= -1 ;+[80782] -1 x145 -1 x158 >= -1 ;+[80782] -1 x161 -1 x158 >= -1 ;+[80782] -1 x169 -1 x158 >= -1 ;+[80782] -1 x177 -1 x158 >= -1 ;+[80782] -1 x184 -1 x158 >= -1 ;+[80782] -1 x136 -1 x150 >= -1 ;+[80782] -1 x137 -1 x150 >= -1 ;+[80782] -1 x153 -1 x150 >= -1 ;+[80782] -1 x161 -1 x150 >= -1 ;+[80782] -1 x169 -1 x150 >= -1 ;+[80782] -1 x177 -1 x150 >= -1 ;+[80782] -1 x184 -1 x150 >= -1 ;+[80782] -1 x145 -1 x136 >= -1 ;+[80782] -1 x153 -1 x136 >= -1 ;+[80782] -1 x161 -1 x136 >= -1 ;+[80782] -1 x169 -1 x136 >= -1 ;+[80782] -1 x177 -1 x136 >= -1 ;+[80782] -1 x184 -1 x136 >= -1 ;+[80782] -1 x133 -1 x193 >= -1 ;+[80782] -1 x134 -1 x193 >= -1 ;+[80782] -1 x192 -1 x133 >= -1 ;+[80782] -1 x192 -1 x134 >= -1 ;+[80782] -1 x145 -1 x137 >= -1 ;+[80782] -1 x153 -1 x137 >= -1 ;+[80782] -1 x161 -1 x137 >= -1 ;+[80782] -1 x169 -1 x137 >= -1 ;+[80782] -1 x177 -1 x137 >= -1 ;+[80782] -1 x184 -1 x137 >= -1 ;+[80782] -1 x153 -1 x145 >= -1 ;+[80782] -1 x161 -1 x145 >= -1 ;+[80782] -1 x169 -1 x145 >= -1 ;+[80782] -1 x177 -1 x145 >= -1 ;+[80782] -1 x184 -1 x145 >= -1 ;+[80782] -1 x161 -1 x153 >= -1 ;+[80782] -1 x169 -1 x153 >= -1 ;+[80782] -1 x177 -1 x153 >= -1 ;+[80782] -1 x184 -1 x153 >= -1 ;+[80782] -1 x169 -1 x161 >= -1 ;+[80782] -1 x177 -1 x161 >= -1 ;+[80782] -1 x184 -1 x161 >= -1 ;+[80782] -1 x177 -1 x169 >= -1 ;+[80782] -1 x184 -1 x169 >= -1 ;+[80782] -1 x184 -1 x177 >= -1 ;+[80782] -1 x255 -1 x248 >= -1 ;+[80782] -1 x255 -1 x240 >= -1 ;+[80782] -1 x248 -1 x240 >= -1 ;+[80782] -1 x255 -1 x232 >= -1 ;+[80782] -1 x248 -1 x232 >= -1 ;+[80782] -1 x240 -1 x232 >= -1 ;+[80782] -1 x255 -1 x224 >= -1 ;+[80782] -1 x248 -1 x224 >= -1 ;+[80782] -1 x240 -1 x224 >= -1 ;+[80782] -1 x232 -1 x224 >= -1 ;+[80782] -1 x255 -1 x216 >= -1 ;+[80782] -1 x248 -1 x216 >= -1 ;+[80782] -1 x240 -1 x216 >= -1 ;+[80782] -1 x232 -1 x216 >= -1 ;+[80782] -1 x224 -1 x216 >= -1 ;+[80782] -1 x255 -1 x208 >= -1 ;+[80782] -1 x248 -1 x208 >= -1 ;+[80782] -1 x240 -1 x208 >= -1 ;+[80782] -1 x232 -1 x208 >= -1 ;+[80782] -1 x224 -1 x208 >= -1 ;+[80782] -1 x216 -1 x208 >= -1 ;+[80782] -1 x263 -1 x205 >= -1 ;+[80782] -1 x263 -1 x204 >= -1 ;+[80782] -1 x205 -1 x264 >= -1 ;+[80782] -1 x204 -1 x264 >= -1 ;+[80782] -1 x255 -1 x207 >= -1 ;+[80782] -1 x248 -1 x207 >= -1 ;+[80782] -1 x240 -1 x207 >= -1 ;+[80782] -1 x232 -1 x207 >= -1 ;+[80782] -1 x224 -1 x207 >= -1 ;+[80782] -1 x216 -1 x207 >= -1 ;+[80782] -1 x255 -1 x221 >= -1 ;+[80782] -1 x248 -1 x221 >= -1 ;+[80782] -1 x240 -1 x221 >= -1 ;+[80782] -1 x232 -1 x221 >= -1 ;+[80782] -1 x224 -1 x221 >= -1 ;+[80782] -1 x208 -1 x221 >= -1 ;+[80782] -1 x207 -1 x221 >= -1 ;+[80782] -1 x255 -1 x229 >= -1 ;+[80782] -1 x248 -1 x229 >= -1 ;+[80782] -1 x240 -1 x229 >= -1 ;+[80782] -1 x232 -1 x229 >= -1 ;+[80782] -1 x216 -1 x229 >= -1 ;+[80782] -1 x208 -1 x229 >= -1 ;+[80782] -1 x207 -1 x229 >= -1 ;+[80782] -1 x221 -1 x229 >= -1 ;+[80782] -1 x255 -1 x237 >= -1 ;+[80782] -1 x248 -1 x237 >= -1 ;+[80782] -1 x240 -1 x237 >= -1 ;+[80782] -1 x224 -1 x237 >= -1 ;+[80782] -1 x216 -1 x237 >= -1 ;+[80782] -1 x208 -1 x237 >= -1 ;+[80782] -1 x207 -1 x237 >= -1 ;+[80782] -1 x221 -1 x237 >= -1 ;+[80782] -1 x229 -1 x237 >= -1 ;+[80782] -1 x255 -1 x245 >= -1 ;+[80782] -1 x248 -1 x245 >= -1 ;+[80782] -1 x232 -1 x245 >= -1 ;+[80782] -1 x224 -1 x245 >= -1 ;+[80782] -1 x216 -1 x245 >= -1 ;+[80782] -1 x208 -1 x245 >= -1 ;+[80782] -1 x207 -1 x245 >= -1 ;+[80782] -1 x221 -1 x245 >= -1 ;+[80782] -1 x229 -1 x245 >= -1 ;+[80782] -1 x237 -1 x245 >= -1 ;+[80782] -1 x248 -1 x261 >= -1 ;+[80782] -1 x240 -1 x261 >= -1 ;+[80782] -1 x232 -1 x261 >= -1 ;+[80782] -1 x224 -1 x261 >= -1 ;+[80782] -1 x216 -1 x261 >= -1 ;+[80782] -1 x208 -1 x261 >= -1 ;+[80782] -1 x207 -1 x261 >= -1 ;+[80782] -1 x221 -1 x261 >= -1 ;+[80782] -1 x229 -1 x261 >= -1 ;+[80782] -1 x237 -1 x261 >= -1 ;+[80782] -1 x245 -1 x261 >= -1 ;+[80782] -1 x255 -1 x253 >= -1 ;+[80782] -1 x240 -1 x253 >= -1 ;+[80782] -1 x232 -1 x253 >= -1 ;+[80782] -1 x224 -1 x253 >= -1 ;+[80782] -1 x216 -1 x253 >= -1 ;+[80782] -1 x208 -1 x253 >= -1 ;+[80782] -1 x207 -1 x253 >= -1 ;+[80782] -1 x221 -1 x253 >= -1 ;+[80782] -1 x229 -1 x253 >= -1 ;+[80782] -1 x237 -1 x253 >= -1 ;+[80782] -1 x245 -1 x253 >= -1 ;+[80782] -1 x261 -1 x253 >= -1 ;+[80782] -1 x255 -1 x215 >= -1 ;+[80782] -1 x248 -1 x215 >= -1 ;+[80782] -1 x240 -1 x215 >= -1 ;+[80782] -1 x232 -1 x215 >= -1 ;+[80782] -1 x224 -1 x215 >= -1 ;+[80782] -1 x208 -1 x215 >= -1 ;+[80782] -1 x207 -1 x215 >= -1 ;+[80782] -1 x229 -1 x215 >= -1 ;+[80782] -1 x237 -1 x215 >= -1 ;+[80782] -1 x245 -1 x215 >= -1 ;+[80782] -1 x261 -1 x215 >= -1 ;+[80782] -1 x253 -1 x215 >= -1 ;+[80782] -1 x255 -1 x228 >= -1 ;+[80782] -1 x248 -1 x228 >= -1 ;+[80782] -1 x240 -1 x228 >= -1 ;+[80782] -1 x232 -1 x228 >= -1 ;+[80782] -1 x216 -1 x228 >= -1 ;+[80782] -1 x208 -1 x228 >= -1 ;+[80782] -1 x207 -1 x228 >= -1 ;+[80782] -1 x221 -1 x228 >= -1 ;+[80782] -1 x237 -1 x228 >= -1 ;+[80782] -1 x245 -1 x228 >= -1 ;+[80782] -1 x261 -1 x228 >= -1 ;+[80782] -1 x253 -1 x228 >= -1 ;+[80782] -1 x215 -1 x228 >= -1 ;+[80782] -1 x255 -1 x236 >= -1 ;+[80782] -1 x248 -1 x236 >= -1 ;+[80782] -1 x240 -1 x236 >= -1 ;+[80782] -1 x224 -1 x236 >= -1 ;+[80782] -1 x216 -1 x236 >= -1 ;+[80782] -1 x208 -1 x236 >= -1 ;+[80782] -1 x207 -1 x236 >= -1 ;+[80782] -1 x221 -1 x236 >= -1 ;+[80782] -1 x229 -1 x236 >= -1 ;+[80782] -1 x245 -1 x236 >= -1 ;+[80782] -1 x261 -1 x236 >= -1 ;+[80782] -1 x253 -1 x236 >= -1 ;+[80782] -1 x215 -1 x236 >= -1 ;+[80782] -1 x228 -1 x236 >= -1 ;+[80782] -1 x255 -1 x244 >= -1 ;+[80782] -1 x248 -1 x244 >= -1 ;+[80782] -1 x232 -1 x244 >= -1 ;+[80782] -1 x224 -1 x244 >= -1 ;+[80782] -1 x216 -1 x244 >= -1 ;+[80782] -1 x208 -1 x244 >= -1 ;+[80782] -1 x207 -1 x244 >= -1 ;+[80782] -1 x221 -1 x244 >= -1 ;+[80782] -1 x229 -1 x244 >= -1 ;+[80782] -1 x237 -1 x244 >= -1 ;+[80782] -1 x261 -1 x244 >= -1 ;+[80782] -1 x253 -1 x244 >= -1 ;+[80782] -1 x215 -1 x244 >= -1 ;+[80782] -1 x228 -1 x244 >= -1 ;+[80782] -1 x236 -1 x244 >= -1 ;+[80782] -1 x248 -1 x260 >= -1 ;+[80782] -1 x240 -1 x260 >= -1 ;+[80782] -1 x232 -1 x260 >= -1 ;+[80782] -1 x224 -1 x260 >= -1 ;+[80782] -1 x216 -1 x260 >= -1 ;+[80782] -1 x208 -1 x260 >= -1 ;+[80782] -1 x207 -1 x260 >= -1 ;+[80782] -1 x221 -1 x260 >= -1 ;+[80782] -1 x229 -1 x260 >= -1 ;+[80782] -1 x237 -1 x260 >= -1 ;+[80782] -1 x245 -1 x260 >= -1 ;+[80782] -1 x253 -1 x260 >= -1 ;+[80782] -1 x215 -1 x260 >= -1 ;+[80782] -1 x228 -1 x260 >= -1 ;+[80782] -1 x236 -1 x260 >= -1 ;+[80782] -1 x244 -1 x260 >= -1 ;+[80782] -1 x255 -1 x252 >= -1 ;+[80782] -1 x240 -1 x252 >= -1 ;+[80782] -1 x232 -1 x252 >= -1 ;+[80782] -1 x224 -1 x252 >= -1 ;+[80782] -1 x216 -1 x252 >= -1 ;+[80782] -1 x208 -1 x252 >= -1 ;+[80782] -1 x207 -1 x252 >= -1 ;+[80782] -1 x221 -1 x252 >= -1 ;+[80782] -1 x229 -1 x252 >= -1 ;+[80782] -1 x237 -1 x252 >= -1 ;+[80782] -1 x245 -1 x252 >= -1 ;+[80782] -1 x261 -1 x252 >= -1 ;+[80782] -1 x215 -1 x252 >= -1 ;+[80782] -1 x228 -1 x252 >= -1 ;+[80782] -1 x236 -1 x252 >= -1 ;+[80782] -1 x244 -1 x252 >= -1 ;+[80782] -1 x260 -1 x252 >= -1 ;+[80782] -1 x255 -1 x213 >= -1 ;+[80782] -1 x248 -1 x213 >= -1 ;+[80782] -1 x240 -1 x213 >= -1 ;+[80782] -1 x232 -1 x213 >= -1 ;+[80782] -1 x224 -1 x213 >= -1 ;+[80782] -1 x216 -1 x213 >= -1 ;+[80782] -1 x221 -1 x213 >= -1 ;+[80782] -1 x229 -1 x213 >= -1 ;+[80782] -1 x237 -1 x213 >= -1 ;+[80782] -1 x245 -1 x213 >= -1 ;+[80782] -1 x261 -1 x213 >= -1 ;+[80782] -1 x253 -1 x213 >= -1 ;+[80782] -1 x215 -1 x213 >= -1 ;+[80782] -1 x228 -1 x213 >= -1 ;+[80782] -1 x236 -1 x213 >= -1 ;+[80782] -1 x244 -1 x213 >= -1 ;+[80782] -1 x260 -1 x213 >= -1 ;+[80782] -1 x252 -1 x213 >= -1 ;+[80782] -1 x255 -1 x223 >= -1 ;+[80782] -1 x248 -1 x223 >= -1 ;+[80782] -1 x240 -1 x223 >= -1 ;+[80782] -1 x232 -1 x223 >= -1 ;+[80782] -1 x216 -1 x223 >= -1 ;+[80782] -1 x208 -1 x223 >= -1 ;+[80782] -1 x207 -1 x223 >= -1 ;+[80782] -1 x221 -1 x223 >= -1 ;+[80782] -1 x237 -1 x223 >= -1 ;+[80782] -1 x245 -1 x223 >= -1 ;+[80782] -1 x261 -1 x223 >= -1 ;+[80782] -1 x253 -1 x223 >= -1 ;+[80782] -1 x215 -1 x223 >= -1 ;+[80782] -1 x236 -1 x223 >= -1 ;+[80782] -1 x244 -1 x223 >= -1 ;+[80782] -1 x260 -1 x223 >= -1 ;+[80782] -1 x252 -1 x223 >= -1 ;+[80782] -1 x213 -1 x223 >= -1 ;+[80782] -1 x255 -1 x235 >= -1 ;+[80782] -1 x248 -1 x235 >= -1 ;+[80782] -1 x240 -1 x235 >= -1 ;+[80782] -1 x224 -1 x235 >= -1 ;+[80782] -1 x216 -1 x235 >= -1 ;+[80782] -1 x208 -1 x235 >= -1 ;+[80782] -1 x207 -1 x235 >= -1 ;+[80782] -1 x221 -1 x235 >= -1 ;+[80782] -1 x229 -1 x235 >= -1 ;+[80782] -1 x245 -1 x235 >= -1 ;+[80782] -1 x261 -1 x235 >= -1 ;+[80782] -1 x253 -1 x235 >= -1 ;+[80782] -1 x215 -1 x235 >= -1 ;+[80782] -1 x228 -1 x235 >= -1 ;+[80782] -1 x244 -1 x235 >= -1 ;+[80782] -1 x260 -1 x235 >= -1 ;+[80782] -1 x252 -1 x235 >= -1 ;+[80782] -1 x213 -1 x235 >= -1 ;+[80782] -1 x223 -1 x235 >= -1 ;+[80782] -1 x255 -1 x243 >= -1 ;+[80782] -1 x248 -1 x243 >= -1 ;+[80782] -1 x232 -1 x243 >= -1 ;+[80782] -1 x224 -1 x243 >= -1 ;+[80782] -1 x216 -1 x243 >= -1 ;+[80782] -1 x208 -1 x243 >= -1 ;+[80782] -1 x207 -1 x243 >= -1 ;+[80782] -1 x221 -1 x243 >= -1 ;+[80782] -1 x229 -1 x243 >= -1 ;+[80782] -1 x237 -1 x243 >= -1 ;+[80782] -1 x261 -1 x243 >= -1 ;+[80782] -1 x253 -1 x243 >= -1 ;+[80782] -1 x215 -1 x243 >= -1 ;+[80782] -1 x228 -1 x243 >= -1 ;+[80782] -1 x236 -1 x243 >= -1 ;+[80782] -1 x260 -1 x243 >= -1 ;+[80782] -1 x252 -1 x243 >= -1 ;+[80782] -1 x213 -1 x243 >= -1 ;+[80782] -1 x223 -1 x243 >= -1 ;+[80782] -1 x235 -1 x243 >= -1 ;+[80782] -1 x248 -1 x259 >= -1 ;+[80782] -1 x240 -1 x259 >= -1 ;+[80782] -1 x232 -1 x259 >= -1 ;+[80782] -1 x224 -1 x259 >= -1 ;+[80782] -1 x216 -1 x259 >= -1 ;+[80782] -1 x208 -1 x259 >= -1 ;+[80782] -1 x207 -1 x259 >= -1 ;+[80782] -1 x221 -1 x259 >= -1 ;+[80782] -1 x229 -1 x259 >= -1 ;+[80782] -1 x237 -1 x259 >= -1 ;+[80782] -1 x245 -1 x259 >= -1 ;+[80782] -1 x253 -1 x259 >= -1 ;+[80782] -1 x215 -1 x259 >= -1 ;+[80782] -1 x228 -1 x259 >= -1 ;+[80782] -1 x236 -1 x259 >= -1 ;+[80782] -1 x244 -1 x259 >= -1 ;+[80782] -1 x252 -1 x259 >= -1 ;+[80782] -1 x213 -1 x259 >= -1 ;+[80782] -1 x223 -1 x259 >= -1 ;+[80782] -1 x235 -1 x259 >= -1 ;+[80782] -1 x243 -1 x259 >= -1 ;+[80782] -1 x255 -1 x251 >= -1 ;+[80782] -1 x240 -1 x251 >= -1 ;+[80782] -1 x232 -1 x251 >= -1 ;+[80782] -1 x224 -1 x251 >= -1 ;+[80782] -1 x216 -1 x251 >= -1 ;+[80782] -1 x208 -1 x251 >= -1 ;+[80782] -1 x207 -1 x251 >= -1 ;+[80782] -1 x221 -1 x251 >= -1 ;+[80782] -1 x229 -1 x251 >= -1 ;+[80782] -1 x237 -1 x251 >= -1 ;+[80782] -1 x245 -1 x251 >= -1 ;+[80782] -1 x261 -1 x251 >= -1 ;+[80782] -1 x215 -1 x251 >= -1 ;+[80782] -1 x228 -1 x251 >= -1 ;+[80782] -1 x236 -1 x251 >= -1 ;+[80782] -1 x244 -1 x251 >= -1 ;+[80782] -1 x260 -1 x251 >= -1 ;+[80782] -1 x213 -1 x251 >= -1 ;+[80782] -1 x223 -1 x251 >= -1 ;+[80782] -1 x235 -1 x251 >= -1 ;+[80782] -1 x243 -1 x251 >= -1 ;+[80782] -1 x259 -1 x251 >= -1 ;+[80782] -1 x255 -1 x220 >= -1 ;+[80782] -1 x248 -1 x220 >= -1 ;+[80782] -1 x240 -1 x220 >= -1 ;+[80782] -1 x232 -1 x220 >= -1 ;+[80782] -1 x224 -1 x220 >= -1 ;+[80782] -1 x208 -1 x220 >= -1 ;+[80782] -1 x207 -1 x220 >= -1 ;+[80782] -1 x229 -1 x220 >= -1 ;+[80782] -1 x237 -1 x220 >= -1 ;+[80782] -1 x245 -1 x220 >= -1 ;+[80782] -1 x261 -1 x220 >= -1 ;+[80782] -1 x253 -1 x220 >= -1 ;+[80782] -1 x228 -1 x220 >= -1 ;+[80782] -1 x236 -1 x220 >= -1 ;+[80782] -1 x244 -1 x220 >= -1 ;+[80782] -1 x260 -1 x220 >= -1 ;+[80782] -1 x252 -1 x220 >= -1 ;+[80782] -1 x213 -1 x220 >= -1 ;+[80782] -1 x223 -1 x220 >= -1 ;+[80782] -1 x235 -1 x220 >= -1 ;+[80782] -1 x243 -1 x220 >= -1 ;+[80782] -1 x259 -1 x220 >= -1 ;+[80782] -1 x251 -1 x220 >= -1 ;+[80782] -1 x255 -1 x212 >= -1 ;+[80782] -1 x248 -1 x212 >= -1 ;+[80782] -1 x240 -1 x212 >= -1 ;+[80782] -1 x232 -1 x212 >= -1 ;+[80782] -1 x224 -1 x212 >= -1 ;+[80782] -1 x216 -1 x212 >= -1 ;+[80782] -1 x221 -1 x212 >= -1 ;+[80782] -1 x229 -1 x212 >= -1 ;+[80782] -1 x237 -1 x212 >= -1 ;+[80782] -1 x245 -1 x212 >= -1 ;+[80782] -1 x261 -1 x212 >= -1 ;+[80782] -1 x253 -1 x212 >= -1 ;+[80782] -1 x215 -1 x212 >= -1 ;+[80782] -1 x228 -1 x212 >= -1 ;+[80782] -1 x236 -1 x212 >= -1 ;+[80782] -1 x244 -1 x212 >= -1 ;+[80782] -1 x260 -1 x212 >= -1 ;+[80782] -1 x252 -1 x212 >= -1 ;+[80782] -1 x223 -1 x212 >= -1 ;+[80782] -1 x235 -1 x212 >= -1 ;+[80782] -1 x243 -1 x212 >= -1 ;+[80782] -1 x259 -1 x212 >= -1 ;+[80782] -1 x251 -1 x212 >= -1 ;+[80782] -1 x220 -1 x212 >= -1 ;+[80782] -1 x255 -1 x231 >= -1 ;+[80782] -1 x248 -1 x231 >= -1 ;+[80782] -1 x240 -1 x231 >= -1 ;+[80782] -1 x224 -1 x231 >= -1 ;+[80782] -1 x216 -1 x231 >= -1 ;+[80782] -1 x208 -1 x231 >= -1 ;+[80782] -1 x207 -1 x231 >= -1 ;+[80782] -1 x221 -1 x231 >= -1 ;+[80782] -1 x229 -1 x231 >= -1 ;+[80782] -1 x245 -1 x231 >= -1 ;+[80782] -1 x261 -1 x231 >= -1 ;+[80782] -1 x253 -1 x231 >= -1 ;+[80782] -1 x215 -1 x231 >= -1 ;+[80782] -1 x228 -1 x231 >= -1 ;+[80782] -1 x244 -1 x231 >= -1 ;+[80782] -1 x260 -1 x231 >= -1 ;+[80782] -1 x252 -1 x231 >= -1 ;+[80782] -1 x213 -1 x231 >= -1 ;+[80782] -1 x223 -1 x231 >= -1 ;+[80782] -1 x243 -1 x231 >= -1 ;+[80782] -1 x259 -1 x231 >= -1 ;+[80782] -1 x251 -1 x231 >= -1 ;+[80782] -1 x220 -1 x231 >= -1 ;+[80782] -1 x212 -1 x231 >= -1 ;+[80782] -1 x255 -1 x242 >= -1 ;+[80782] -1 x248 -1 x242 >= -1 ;+[80782] -1 x232 -1 x242 >= -1 ;+[80782] -1 x224 -1 x242 >= -1 ;+[80782] -1 x216 -1 x242 >= -1 ;+[80782] -1 x208 -1 x242 >= -1 ;+[80782] -1 x207 -1 x242 >= -1 ;+[80782] -1 x221 -1 x242 >= -1 ;+[80782] -1 x229 -1 x242 >= -1 ;+[80782] -1 x237 -1 x242 >= -1 ;+[80782] -1 x261 -1 x242 >= -1 ;+[80782] -1 x253 -1 x242 >= -1 ;+[80782] -1 x215 -1 x242 >= -1 ;+[80782] -1 x228 -1 x242 >= -1 ;+[80782] -1 x236 -1 x242 >= -1 ;+[80782] -1 x260 -1 x242 >= -1 ;+[80782] -1 x252 -1 x242 >= -1 ;+[80782] -1 x213 -1 x242 >= -1 ;+[80782] -1 x223 -1 x242 >= -1 ;+[80782] -1 x235 -1 x242 >= -1 ;+[80782] -1 x259 -1 x242 >= -1 ;+[80782] -1 x251 -1 x242 >= -1 ;+[80782] -1 x220 -1 x242 >= -1 ;+[80782] -1 x212 -1 x242 >= -1 ;+[80782] -1 x231 -1 x242 >= -1 ;+[80782] -1 x248 -1 x258 >= -1 ;+[80782] -1 x240 -1 x258 >= -1 ;+[80782] -1 x232 -1 x258 >= -1 ;+[80782] -1 x224 -1 x258 >= -1 ;+[80782] -1 x216 -1 x258 >= -1 ;+[80782] -1 x208 -1 x258 >= -1 ;+[80782] -1 x207 -1 x258 >= -1 ;+[80782] -1 x221 -1 x258 >= -1 ;+[80782] -1 x229 -1 x258 >= -1 ;+[80782] -1 x237 -1 x258 >= -1 ;+[80782] -1 x245 -1 x258 >= -1 ;+[80782] -1 x253 -1 x258 >= -1 ;+[80782] -1 x215 -1 x258 >= -1 ;+[80782] -1 x228 -1 x258 >= -1 ;+[80782] -1 x236 -1 x258 >= -1 ;+[80782] -1 x244 -1 x258 >= -1 ;+[80782] -1 x252 -1 x258 >= -1 ;+[80782] -1 x213 -1 x258 >= -1 ;+[80782] -1 x223 -1 x258 >= -1 ;+[80782] -1 x235 -1 x258 >= -1 ;+[80782] -1 x243 -1 x258 >= -1 ;+[80782] -1 x251 -1 x258 >= -1 ;+[80782] -1 x220 -1 x258 >= -1 ;+[80782] -1 x212 -1 x258 >= -1 ;+[80782] -1 x231 -1 x258 >= -1 ;+[80782] -1 x242 -1 x258 >= -1 ;+[80782] -1 x255 -1 x250 >= -1 ;+[80782] -1 x240 -1 x250 >= -1 ;+[80782] -1 x232 -1 x250 >= -1 ;+[80782] -1 x224 -1 x250 >= -1 ;+[80782] -1 x216 -1 x250 >= -1 ;+[80782] -1 x208 -1 x250 >= -1 ;+[80782] -1 x207 -1 x250 >= -1 ;+[80782] -1 x221 -1 x250 >= -1 ;+[80782] -1 x229 -1 x250 >= -1 ;+[80782] -1 x237 -1 x250 >= -1 ;+[80782] -1 x245 -1 x250 >= -1 ;+[80782] -1 x261 -1 x250 >= -1 ;+[80782] -1 x215 -1 x250 >= -1 ;+[80782] -1 x228 -1 x250 >= -1 ;+[80782] -1 x236 -1 x250 >= -1 ;+[80782] -1 x244 -1 x250 >= -1 ;+[80782] -1 x260 -1 x250 >= -1 ;+[80782] -1 x213 -1 x250 >= -1 ;+[80782] -1 x223 -1 x250 >= -1 ;+[80782] -1 x235 -1 x250 >= -1 ;+[80782] -1 x243 -1 x250 >= -1 ;+[80782] -1 x259 -1 x250 >= -1 ;+[80782] -1 x220 -1 x250 >= -1 ;+[80782] -1 x212 -1 x250 >= -1 ;+[80782] -1 x231 -1 x250 >= -1 ;+[80782] -1 x242 -1 x250 >= -1 ;+[80782] -1 x258 -1 x250 >= -1 ;+[80782] -1 x255 -1 x227 >= -1 ;+[80782] -1 x248 -1 x227 >= -1 ;+[80782] -1 x240 -1 x227 >= -1 ;+[80782] -1 x232 -1 x227 >= -1 ;+[80782] -1 x216 -1 x227 >= -1 ;+[80782] -1 x208 -1 x227 >= -1 ;+[80782] -1 x207 -1 x227 >= -1 ;+[80782] -1 x221 -1 x227 >= -1 ;+[80782] -1 x237 -1 x227 >= -1 ;+[80782] -1 x245 -1 x227 >= -1 ;+[80782] -1 x261 -1 x227 >= -1 ;+[80782] -1 x253 -1 x227 >= -1 ;+[80782] -1 x215 -1 x227 >= -1 ;+[80782] -1 x236 -1 x227 >= -1 ;+[80782] -1 x244 -1 x227 >= -1 ;+[80782] -1 x260 -1 x227 >= -1 ;+[80782] -1 x252 -1 x227 >= -1 ;+[80782] -1 x213 -1 x227 >= -1 ;+[80782] -1 x235 -1 x227 >= -1 ;+[80782] -1 x243 -1 x227 >= -1 ;+[80782] -1 x259 -1 x227 >= -1 ;+[80782] -1 x251 -1 x227 >= -1 ;+[80782] -1 x220 -1 x227 >= -1 ;+[80782] -1 x212 -1 x227 >= -1 ;+[80782] -1 x231 -1 x227 >= -1 ;+[80782] -1 x242 -1 x227 >= -1 ;+[80782] -1 x258 -1 x227 >= -1 ;+[80782] -1 x250 -1 x227 >= -1 ;+[80782] -1 x255 -1 x219 >= -1 ;+[80782] -1 x248 -1 x219 >= -1 ;+[80782] -1 x240 -1 x219 >= -1 ;+[80782] -1 x232 -1 x219 >= -1 ;+[80782] -1 x224 -1 x219 >= -1 ;+[80782] -1 x208 -1 x219 >= -1 ;+[80782] -1 x207 -1 x219 >= -1 ;+[80782] -1 x229 -1 x219 >= -1 ;+[80782] -1 x237 -1 x219 >= -1 ;+[80782] -1 x245 -1 x219 >= -1 ;+[80782] -1 x261 -1 x219 >= -1 ;+[80782] -1 x253 -1 x219 >= -1 ;+[80782] -1 x228 -1 x219 >= -1 ;+[80782] -1 x236 -1 x219 >= -1 ;+[80782] -1 x244 -1 x219 >= -1 ;+[80782] -1 x260 -1 x219 >= -1 ;+[80782] -1 x252 -1 x219 >= -1 ;+[80782] -1 x213 -1 x219 >= -1 ;+[80782] -1 x223 -1 x219 >= -1 ;+[80782] -1 x235 -1 x219 >= -1 ;+[80782] -1 x243 -1 x219 >= -1 ;+[80782] -1 x259 -1 x219 >= -1 ;+[80782] -1 x251 -1 x219 >= -1 ;+[80782] -1 x212 -1 x219 >= -1 ;+[80782] -1 x231 -1 x219 >= -1 ;+[80782] -1 x242 -1 x219 >= -1 ;+[80782] -1 x258 -1 x219 >= -1 ;+[80782] -1 x250 -1 x219 >= -1 ;+[80782] -1 x227 -1 x219 >= -1 ;+[80782] -1 x255 -1 x211 >= -1 ;+[80782] -1 x248 -1 x211 >= -1 ;+[80782] -1 x240 -1 x211 >= -1 ;+[80782] -1 x232 -1 x211 >= -1 ;+[80782] -1 x224 -1 x211 >= -1 ;+[80782] -1 x216 -1 x211 >= -1 ;+[80782] -1 x221 -1 x211 >= -1 ;+[80782] -1 x229 -1 x211 >= -1 ;+[80782] -1 x237 -1 x211 >= -1 ;+[80782] -1 x245 -1 x211 >= -1 ;+[80782] -1 x261 -1 x211 >= -1 ;+[80782] -1 x253 -1 x211 >= -1 ;+[80782] -1 x215 -1 x211 >= -1 ;+[80782] -1 x228 -1 x211 >= -1 ;+[80782] -1 x236 -1 x211 >= -1 ;+[80782] -1 x244 -1 x211 >= -1 ;+[80782] -1 x260 -1 x211 >= -1 ;+[80782] -1 x252 -1 x211 >= -1 ;+[80782] -1 x223 -1 x211 >= -1 ;+[80782] -1 x235 -1 x211 >= -1 ;+[80782] -1 x243 -1 x211 >= -1 ;+[80782] -1 x259 -1 x211 >= -1 ;+[80782] -1 x251 -1 x211 >= -1 ;+[80782] -1 x220 -1 x211 >= -1 ;+[80782] -1 x231 -1 x211 >= -1 ;+[80782] -1 x242 -1 x211 >= -1 ;+[80782] -1 x258 -1 x211 >= -1 ;+[80782] -1 x250 -1 x211 >= -1 ;+[80782] -1 x227 -1 x211 >= -1 ;+[80782] -1 x219 -1 x211 >= -1 ;+[80782] -1 x255 -1 x239 >= -1 ;+[80782] -1 x248 -1 x239 >= -1 ;+[80782] -1 x232 -1 x239 >= -1 ;+[80782] -1 x224 -1 x239 >= -1 ;+[80782] -1 x216 -1 x239 >= -1 ;+[80782] -1 x208 -1 x239 >= -1 ;+[80782] -1 x207 -1 x239 >= -1 ;+[80782] -1 x221 -1 x239 >= -1 ;+[80782] -1 x229 -1 x239 >= -1 ;+[80782] -1 x237 -1 x239 >= -1 ;+[80782] -1 x261 -1 x239 >= -1 ;+[80782] -1 x253 -1 x239 >= -1 ;+[80782] -1 x215 -1 x239 >= -1 ;+[80782] -1 x228 -1 x239 >= -1 ;+[80782] -1 x236 -1 x239 >= -1 ;+[80782] -1 x260 -1 x239 >= -1 ;+[80782] -1 x252 -1 x239 >= -1 ;+[80782] -1 x213 -1 x239 >= -1 ;+[80782] -1 x223 -1 x239 >= -1 ;+[80782] -1 x235 -1 x239 >= -1 ;+[80782] -1 x259 -1 x239 >= -1 ;+[80782] -1 x251 -1 x239 >= -1 ;+[80782] -1 x220 -1 x239 >= -1 ;+[80782] -1 x212 -1 x239 >= -1 ;+[80782] -1 x231 -1 x239 >= -1 ;+[80782] -1 x258 -1 x239 >= -1 ;+[80782] -1 x250 -1 x239 >= -1 ;+[80782] -1 x227 -1 x239 >= -1 ;+[80782] -1 x219 -1 x239 >= -1 ;+[80782] -1 x211 -1 x239 >= -1 ;+[80782] -1 x248 -1 x257 >= -1 ;+[80782] -1 x240 -1 x257 >= -1 ;+[80782] -1 x232 -1 x257 >= -1 ;+[80782] -1 x224 -1 x257 >= -1 ;+[80782] -1 x216 -1 x257 >= -1 ;+[80782] -1 x208 -1 x257 >= -1 ;+[80782] -1 x207 -1 x257 >= -1 ;+[80782] -1 x221 -1 x257 >= -1 ;+[80782] -1 x229 -1 x257 >= -1 ;+[80782] -1 x237 -1 x257 >= -1 ;+[80782] -1 x245 -1 x257 >= -1 ;+[80782] -1 x253 -1 x257 >= -1 ;+[80782] -1 x215 -1 x257 >= -1 ;+[80782] -1 x228 -1 x257 >= -1 ;+[80782] -1 x236 -1 x257 >= -1 ;+[80782] -1 x244 -1 x257 >= -1 ;+[80782] -1 x252 -1 x257 >= -1 ;+[80782] -1 x213 -1 x257 >= -1 ;+[80782] -1 x223 -1 x257 >= -1 ;+[80782] -1 x235 -1 x257 >= -1 ;+[80782] -1 x243 -1 x257 >= -1 ;+[80782] -1 x251 -1 x257 >= -1 ;+[80782] -1 x220 -1 x257 >= -1 ;+[80782] -1 x212 -1 x257 >= -1 ;+[80782] -1 x231 -1 x257 >= -1 ;+[80782] -1 x242 -1 x257 >= -1 ;+[80782] -1 x250 -1 x257 >= -1 ;+[80782] -1 x227 -1 x257 >= -1 ;+[80782] -1 x219 -1 x257 >= -1 ;+[80782] -1 x211 -1 x257 >= -1 ;+[80782] -1 x239 -1 x257 >= -1 ;+[80782] -1 x255 -1 x249 >= -1 ;+[80782] -1 x240 -1 x249 >= -1 ;+[80782] -1 x232 -1 x249 >= -1 ;+[80782] -1 x224 -1 x249 >= -1 ;+[80782] -1 x216 -1 x249 >= -1 ;+[80782] -1 x208 -1 x249 >= -1 ;+[80782] -1 x207 -1 x249 >= -1 ;+[80782] -1 x221 -1 x249 >= -1 ;+[80782] -1 x229 -1 x249 >= -1 ;+[80782] -1 x237 -1 x249 >= -1 ;+[80782] -1 x245 -1 x249 >= -1 ;+[80782] -1 x261 -1 x249 >= -1 ;+[80782] -1 x215 -1 x249 >= -1 ;+[80782] -1 x228 -1 x249 >= -1 ;+[80782] -1 x236 -1 x249 >= -1 ;+[80782] -1 x244 -1 x249 >= -1 ;+[80782] -1 x260 -1 x249 >= -1 ;+[80782] -1 x213 -1 x249 >= -1 ;+[80782] -1 x223 -1 x249 >= -1 ;+[80782] -1 x235 -1 x249 >= -1 ;+[80782] -1 x243 -1 x249 >= -1 ;+[80782] -1 x259 -1 x249 >= -1 ;+[80782] -1 x220 -1 x249 >= -1 ;+[80782] -1 x212 -1 x249 >= -1 ;+[80782] -1 x231 -1 x249 >= -1 ;+[80782] -1 x242 -1 x249 >= -1 ;+[80782] -1 x258 -1 x249 >= -1 ;+[80782] -1 x227 -1 x249 >= -1 ;+[80782] -1 x219 -1 x249 >= -1 ;+[80782] -1 x211 -1 x249 >= -1 ;+[80782] -1 x239 -1 x249 >= -1 ;+[80782] -1 x257 -1 x249 >= -1 ;+[80782] -1 x255 -1 x234 >= -1 ;+[80782] -1 x248 -1 x234 >= -1 ;+[80782] -1 x240 -1 x234 >= -1 ;+[80782] -1 x224 -1 x234 >= -1 ;+[80782] -1 x216 -1 x234 >= -1 ;+[80782] -1 x208 -1 x234 >= -1 ;+[80782] -1 x207 -1 x234 >= -1 ;+[80782] -1 x221 -1 x234 >= -1 ;+[80782] -1 x229 -1 x234 >= -1 ;+[80782] -1 x245 -1 x234 >= -1 ;+[80782] -1 x261 -1 x234 >= -1 ;+[80782] -1 x253 -1 x234 >= -1 ;+[80782] -1 x215 -1 x234 >= -1 ;+[80782] -1 x228 -1 x234 >= -1 ;+[80782] -1 x244 -1 x234 >= -1 ;+[80782] -1 x260 -1 x234 >= -1 ;+[80782] -1 x252 -1 x234 >= -1 ;+[80782] -1 x213 -1 x234 >= -1 ;+[80782] -1 x223 -1 x234 >= -1 ;+[80782] -1 x243 -1 x234 >= -1 ;+[80782] -1 x259 -1 x234 >= -1 ;+[80782] -1 x251 -1 x234 >= -1 ;+[80782] -1 x220 -1 x234 >= -1 ;+[80782] -1 x212 -1 x234 >= -1 ;+[80782] -1 x242 -1 x234 >= -1 ;+[80782] -1 x258 -1 x234 >= -1 ;+[80782] -1 x250 -1 x234 >= -1 ;+[80782] -1 x227 -1 x234 >= -1 ;+[80782] -1 x219 -1 x234 >= -1 ;+[80782] -1 x211 -1 x234 >= -1 ;+[80782] -1 x239 -1 x234 >= -1 ;+[80782] -1 x257 -1 x234 >= -1 ;+[80782] -1 x249 -1 x234 >= -1 ;+[80782] -1 x255 -1 x226 >= -1 ;+[80782] -1 x248 -1 x226 >= -1 ;+[80782] -1 x240 -1 x226 >= -1 ;+[80782] -1 x232 -1 x226 >= -1 ;+[80782] -1 x216 -1 x226 >= -1 ;+[80782] -1 x208 -1 x226 >= -1 ;+[80782] -1 x207 -1 x226 >= -1 ;+[80782] -1 x221 -1 x226 >= -1 ;+[80782] -1 x237 -1 x226 >= -1 ;+[80782] -1 x245 -1 x226 >= -1 ;+[80782] -1 x261 -1 x226 >= -1 ;+[80782] -1 x253 -1 x226 >= -1 ;+[80782] -1 x215 -1 x226 >= -1 ;+[80782] -1 x236 -1 x226 >= -1 ;+[80782] -1 x244 -1 x226 >= -1 ;+[80782] -1 x260 -1 x226 >= -1 ;+[80782] -1 x252 -1 x226 >= -1 ;+[80782] -1 x213 -1 x226 >= -1 ;+[80782] -1 x235 -1 x226 >= -1 ;+[80782] -1 x243 -1 x226 >= -1 ;+[80782] -1 x259 -1 x226 >= -1 ;+[80782] -1 x251 -1 x226 >= -1 ;+[80782] -1 x220 -1 x226 >= -1 ;+[80782] -1 x212 -1 x226 >= -1 ;+[80782] -1 x231 -1 x226 >= -1 ;+[80782] -1 x242 -1 x226 >= -1 ;+[80782] -1 x258 -1 x226 >= -1 ;+[80782] -1 x250 -1 x226 >= -1 ;+[80782] -1 x219 -1 x226 >= -1 ;+[80782] -1 x211 -1 x226 >= -1 ;+[80782] -1 x239 -1 x226 >= -1 ;+[80782] -1 x257 -1 x226 >= -1 ;+[80782] -1 x249 -1 x226 >= -1 ;+[80782] -1 x234 -1 x226 >= -1 ;+[80782] -1 x255 -1 x218 >= -1 ;+[80782] -1 x248 -1 x218 >= -1 ;+[80782] -1 x240 -1 x218 >= -1 ;+[80782] -1 x232 -1 x218 >= -1 ;+[80782] -1 x224 -1 x218 >= -1 ;+[80782] -1 x208 -1 x218 >= -1 ;+[80782] -1 x207 -1 x218 >= -1 ;+[80782] -1 x229 -1 x218 >= -1 ;+[80782] -1 x237 -1 x218 >= -1 ;+[80782] -1 x245 -1 x218 >= -1 ;+[80782] -1 x261 -1 x218 >= -1 ;+[80782] -1 x253 -1 x218 >= -1 ;+[80782] -1 x228 -1 x218 >= -1 ;+[80782] -1 x236 -1 x218 >= -1 ;+[80782] -1 x244 -1 x218 >= -1 ;+[80782] -1 x260 -1 x218 >= -1 ;+[80782] -1 x252 -1 x218 >= -1 ;+[80782] -1 x213 -1 x218 >= -1 ;+[80782] -1 x223 -1 x218 >= -1 ;+[80782] -1 x235 -1 x218 >= -1 ;+[80782] -1 x243 -1 x218 >= -1 ;+[80782] -1 x259 -1 x218 >= -1 ;+[80782] -1 x251 -1 x218 >= -1 ;+[80782] -1 x212 -1 x218 >= -1 ;+[80782] -1 x231 -1 x218 >= -1 ;+[80782] -1 x242 -1 x218 >= -1 ;+[80782] -1 x258 -1 x218 >= -1 ;+[80782] -1 x250 -1 x218 >= -1 ;+[80782] -1 x227 -1 x218 >= -1 ;+[80782] -1 x211 -1 x218 >= -1 ;+[80782] -1 x239 -1 x218 >= -1 ;+[80782] -1 x257 -1 x218 >= -1 ;+[80782] -1 x249 -1 x218 >= -1 ;+[80782] -1 x234 -1 x218 >= -1 ;+[80782] -1 x226 -1 x218 >= -1 ;+[80782] -1 x255 -1 x210 >= -1 ;+[80782] -1 x248 -1 x210 >= -1 ;+[80782] -1 x240 -1 x210 >= -1 ;+[80782] -1 x232 -1 x210 >= -1 ;+[80782] -1 x224 -1 x210 >= -1 ;+[80782] -1 x216 -1 x210 >= -1 ;+[80782] -1 x221 -1 x210 >= -1 ;+[80782] -1 x229 -1 x210 >= -1 ;+[80782] -1 x237 -1 x210 >= -1 ;+[80782] -1 x245 -1 x210 >= -1 ;+[80782] -1 x261 -1 x210 >= -1 ;+[80782] -1 x253 -1 x210 >= -1 ;+[80782] -1 x215 -1 x210 >= -1 ;+[80782] -1 x228 -1 x210 >= -1 ;+[80782] -1 x236 -1 x210 >= -1 ;+[80782] -1 x244 -1 x210 >= -1 ;+[80782] -1 x260 -1 x210 >= -1 ;+[80782] -1 x252 -1 x210 >= -1 ;+[80782] -1 x223 -1 x210 >= -1 ;+[80782] -1 x235 -1 x210 >= -1 ;+[80782] -1 x243 -1 x210 >= -1 ;+[80782] -1 x259 -1 x210 >= -1 ;+[80782] -1 x251 -1 x210 >= -1 ;+[80782] -1 x220 -1 x210 >= -1 ;+[80782] -1 x231 -1 x210 >= -1 ;+[80782] -1 x242 -1 x210 >= -1 ;+[80782] -1 x258 -1 x210 >= -1 ;+[80782] -1 x250 -1 x210 >= -1 ;+[80782] -1 x227 -1 x210 >= -1 ;+[80782] -1 x219 -1 x210 >= -1 ;+[80782] -1 x239 -1 x210 >= -1 ;+[80782] -1 x257 -1 x210 >= -1 ;+[80782] -1 x249 -1 x210 >= -1 ;+[80782] -1 x234 -1 x210 >= -1 ;+[80782] -1 x226 -1 x210 >= -1 ;+[80782] -1 x218 -1 x210 >= -1 ;+[80782] -1 x255 -1 x247 >= -1 ;+[80782] -1 x240 -1 x247 >= -1 ;+[80782] -1 x232 -1 x247 >= -1 ;+[80782] -1 x224 -1 x247 >= -1 ;+[80782] -1 x216 -1 x247 >= -1 ;+[80782] -1 x208 -1 x247 >= -1 ;+[80782] -1 x207 -1 x247 >= -1 ;+[80782] -1 x221 -1 x247 >= -1 ;+[80782] -1 x229 -1 x247 >= -1 ;+[80782] -1 x237 -1 x247 >= -1 ;+[80782] -1 x245 -1 x247 >= -1 ;+[80782] -1 x261 -1 x247 >= -1 ;+[80782] -1 x215 -1 x247 >= -1 ;+[80782] -1 x228 -1 x247 >= -1 ;+[80782] -1 x236 -1 x247 >= -1 ;+[80782] -1 x244 -1 x247 >= -1 ;+[80782] -1 x260 -1 x247 >= -1 ;+[80782] -1 x213 -1 x247 >= -1 ;+[80782] -1 x223 -1 x247 >= -1 ;+[80782] -1 x235 -1 x247 >= -1 ;+[80782] -1 x243 -1 x247 >= -1 ;+[80782] -1 x259 -1 x247 >= -1 ;+[80782] -1 x220 -1 x247 >= -1 ;+[80782] -1 x212 -1 x247 >= -1 ;+[80782] -1 x231 -1 x247 >= -1 ;+[80782] -1 x242 -1 x247 >= -1 ;+[80782] -1 x258 -1 x247 >= -1 ;+[80782] -1 x227 -1 x247 >= -1 ;+[80782] -1 x219 -1 x247 >= -1 ;+[80782] -1 x211 -1 x247 >= -1 ;+[80782] -1 x239 -1 x247 >= -1 ;+[80782] -1 x257 -1 x247 >= -1 ;+[80782] -1 x234 -1 x247 >= -1 ;+[80782] -1 x226 -1 x247 >= -1 ;+[80782] -1 x218 -1 x247 >= -1 ;+[80782] -1 x210 -1 x247 >= -1 ;+[80782] -1 x248 -1 x256 >= -1 ;+[80782] -1 x240 -1 x256 >= -1 ;+[80782] -1 x232 -1 x256 >= -1 ;+[80782] -1 x224 -1 x256 >= -1 ;+[80782] -1 x216 -1 x256 >= -1 ;+[80782] -1 x208 -1 x256 >= -1 ;+[80782] -1 x207 -1 x256 >= -1 ;+[80782] -1 x221 -1 x256 >= -1 ;+[80782] -1 x229 -1 x256 >= -1 ;+[80782] -1 x237 -1 x256 >= -1 ;+[80782] -1 x245 -1 x256 >= -1 ;+[80782] -1 x253 -1 x256 >= -1 ;+[80782] -1 x215 -1 x256 >= -1 ;+[80782] -1 x228 -1 x256 >= -1 ;+[80782] -1 x236 -1 x256 >= -1 ;+[80782] -1 x244 -1 x256 >= -1 ;+[80782] -1 x252 -1 x256 >= -1 ;+[80782] -1 x213 -1 x256 >= -1 ;+[80782] -1 x223 -1 x256 >= -1 ;+[80782] -1 x235 -1 x256 >= -1 ;+[80782] -1 x243 -1 x256 >= -1 ;+[80782] -1 x251 -1 x256 >= -1 ;+[80782] -1 x220 -1 x256 >= -1 ;+[80782] -1 x212 -1 x256 >= -1 ;+[80782] -1 x231 -1 x256 >= -1 ;+[80782] -1 x242 -1 x256 >= -1 ;+[80782] -1 x250 -1 x256 >= -1 ;+[80782] -1 x227 -1 x256 >= -1 ;+[80782] -1 x219 -1 x256 >= -1 ;+[80782] -1 x211 -1 x256 >= -1 ;+[80782] -1 x239 -1 x256 >= -1 ;+[80782] -1 x249 -1 x256 >= -1 ;+[80782] -1 x234 -1 x256 >= -1 ;+[80782] -1 x226 -1 x256 >= -1 ;+[80782] -1 x218 -1 x256 >= -1 ;+[80782] -1 x210 -1 x256 >= -1 ;+[80782] -1 x247 -1 x256 >= -1 ;+[80782] -1 x255 -1 x241 >= -1 ;+[80782] -1 x248 -1 x241 >= -1 ;+[80782] -1 x232 -1 x241 >= -1 ;+[80782] -1 x224 -1 x241 >= -1 ;+[80782] -1 x216 -1 x241 >= -1 ;+[80782] -1 x208 -1 x241 >= -1 ;+[80782] -1 x207 -1 x241 >= -1 ;+[80782] -1 x221 -1 x241 >= -1 ;+[80782] -1 x229 -1 x241 >= -1 ;+[80782] -1 x237 -1 x241 >= -1 ;+[80782] -1 x261 -1 x241 >= -1 ;+[80782] -1 x253 -1 x241 >= -1 ;+[80782] -1 x215 -1 x241 >= -1 ;+[80782] -1 x228 -1 x241 >= -1 ;+[80782] -1 x236 -1 x241 >= -1 ;+[80782] -1 x260 -1 x241 >= -1 ;+[80782] -1 x252 -1 x241 >= -1 ;+[80782] -1 x213 -1 x241 >= -1 ;+[80782] -1 x223 -1 x241 >= -1 ;+[80782] -1 x235 -1 x241 >= -1 ;+[80782] -1 x259 -1 x241 >= -1 ;+[80782] -1 x251 -1 x241 >= -1 ;+[80782] -1 x220 -1 x241 >= -1 ;+[80782] -1 x212 -1 x241 >= -1 ;+[80782] -1 x231 -1 x241 >= -1 ;+[80782] -1 x258 -1 x241 >= -1 ;+[80782] -1 x250 -1 x241 >= -1 ;+[80782] -1 x227 -1 x241 >= -1 ;+[80782] -1 x219 -1 x241 >= -1 ;+[80782] -1 x211 -1 x241 >= -1 ;+[80782] -1 x257 -1 x241 >= -1 ;+[80782] -1 x249 -1 x241 >= -1 ;+[80782] -1 x234 -1 x241 >= -1 ;+[80782] -1 x226 -1 x241 >= -1 ;+[80782] -1 x218 -1 x241 >= -1 ;+[80782] -1 x210 -1 x241 >= -1 ;+[80782] -1 x247 -1 x241 >= -1 ;+[80782] -1 x256 -1 x241 >= -1 ;+[80782] -1 x255 -1 x233 >= -1 ;+[80782] -1 x248 -1 x233 >= -1 ;+[80782] -1 x240 -1 x233 >= -1 ;+[80782] -1 x224 -1 x233 >= -1 ;+[80782] -1 x216 -1 x233 >= -1 ;+[80782] -1 x208 -1 x233 >= -1 ;+[80782] -1 x207 -1 x233 >= -1 ;+[80782] -1 x221 -1 x233 >= -1 ;+[80782] -1 x229 -1 x233 >= -1 ;+[80782] -1 x245 -1 x233 >= -1 ;+[80782] -1 x261 -1 x233 >= -1 ;+[80782] -1 x253 -1 x233 >= -1 ;+[80782] -1 x215 -1 x233 >= -1 ;+[80782] -1 x228 -1 x233 >= -1 ;+[80782] -1 x244 -1 x233 >= -1 ;+[80782] -1 x260 -1 x233 >= -1 ;+[80782] -1 x252 -1 x233 >= -1 ;+[80782] -1 x213 -1 x233 >= -1 ;+[80782] -1 x223 -1 x233 >= -1 ;+[80782] -1 x243 -1 x233 >= -1 ;+[80782] -1 x259 -1 x233 >= -1 ;+[80782] -1 x251 -1 x233 >= -1 ;+[80782] -1 x220 -1 x233 >= -1 ;+[80782] -1 x212 -1 x233 >= -1 ;+[80782] -1 x242 -1 x233 >= -1 ;+[80782] -1 x258 -1 x233 >= -1 ;+[80782] -1 x250 -1 x233 >= -1 ;+[80782] -1 x227 -1 x233 >= -1 ;+[80782] -1 x219 -1 x233 >= -1 ;+[80782] -1 x211 -1 x233 >= -1 ;+[80782] -1 x239 -1 x233 >= -1 ;+[80782] -1 x257 -1 x233 >= -1 ;+[80782] -1 x249 -1 x233 >= -1 ;+[80782] -1 x226 -1 x233 >= -1 ;+[80782] -1 x218 -1 x233 >= -1 ;+[80782] -1 x210 -1 x233 >= -1 ;+[80782] -1 x247 -1 x233 >= -1 ;+[80782] -1 x256 -1 x233 >= -1 ;+[80782] -1 x241 -1 x233 >= -1 ;+[80782] -1 x255 -1 x225 >= -1 ;+[80782] -1 x248 -1 x225 >= -1 ;+[80782] -1 x240 -1 x225 >= -1 ;+[80782] -1 x232 -1 x225 >= -1 ;+[80782] -1 x216 -1 x225 >= -1 ;+[80782] -1 x208 -1 x225 >= -1 ;+[80782] -1 x207 -1 x225 >= -1 ;+[80782] -1 x221 -1 x225 >= -1 ;+[80782] -1 x237 -1 x225 >= -1 ;+[80782] -1 x245 -1 x225 >= -1 ;+[80782] -1 x261 -1 x225 >= -1 ;+[80782] -1 x253 -1 x225 >= -1 ;+[80782] -1 x215 -1 x225 >= -1 ;+[80782] -1 x236 -1 x225 >= -1 ;+[80782] -1 x244 -1 x225 >= -1 ;+[80782] -1 x260 -1 x225 >= -1 ;+[80782] -1 x252 -1 x225 >= -1 ;+[80782] -1 x213 -1 x225 >= -1 ;+[80782] -1 x235 -1 x225 >= -1 ;+[80782] -1 x243 -1 x225 >= -1 ;+[80782] -1 x259 -1 x225 >= -1 ;+[80782] -1 x251 -1 x225 >= -1 ;+[80782] -1 x220 -1 x225 >= -1 ;+[80782] -1 x212 -1 x225 >= -1 ;+[80782] -1 x231 -1 x225 >= -1 ;+[80782] -1 x242 -1 x225 >= -1 ;+[80782] -1 x258 -1 x225 >= -1 ;+[80782] -1 x250 -1 x225 >= -1 ;+[80782] -1 x219 -1 x225 >= -1 ;+[80782] -1 x211 -1 x225 >= -1 ;+[80782] -1 x239 -1 x225 >= -1 ;+[80782] -1 x257 -1 x225 >= -1 ;+[80782] -1 x249 -1 x225 >= -1 ;+[80782] -1 x234 -1 x225 >= -1 ;+[80782] -1 x218 -1 x225 >= -1 ;+[80782] -1 x210 -1 x225 >= -1 ;+[80782] -1 x247 -1 x225 >= -1 ;+[80782] -1 x256 -1 x225 >= -1 ;+[80782] -1 x241 -1 x225 >= -1 ;+[80782] -1 x233 -1 x225 >= -1 ;+[80782] -1 x255 -1 x217 >= -1 ;+[80782] -1 x248 -1 x217 >= -1 ;+[80782] -1 x240 -1 x217 >= -1 ;+[80782] -1 x232 -1 x217 >= -1 ;+[80782] -1 x224 -1 x217 >= -1 ;+[80782] -1 x208 -1 x217 >= -1 ;+[80782] -1 x207 -1 x217 >= -1 ;+[80782] -1 x229 -1 x217 >= -1 ;+[80782] -1 x237 -1 x217 >= -1 ;+[80782] -1 x245 -1 x217 >= -1 ;+[80782] -1 x261 -1 x217 >= -1 ;+[80782] -1 x253 -1 x217 >= -1 ;+[80782] -1 x228 -1 x217 >= -1 ;+[80782] -1 x236 -1 x217 >= -1 ;+[80782] -1 x244 -1 x217 >= -1 ;+[80782] -1 x260 -1 x217 >= -1 ;+[80782] -1 x252 -1 x217 >= -1 ;+[80782] -1 x213 -1 x217 >= -1 ;+[80782] -1 x223 -1 x217 >= -1 ;+[80782] -1 x235 -1 x217 >= -1 ;+[80782] -1 x243 -1 x217 >= -1 ;+[80782] -1 x259 -1 x217 >= -1 ;+[80782] -1 x251 -1 x217 >= -1 ;+[80782] -1 x212 -1 x217 >= -1 ;+[80782] -1 x231 -1 x217 >= -1 ;+[80782] -1 x242 -1 x217 >= -1 ;+[80782] -1 x258 -1 x217 >= -1 ;+[80782] -1 x250 -1 x217 >= -1 ;+[80782] -1 x227 -1 x217 >= -1 ;+[80782] -1 x211 -1 x217 >= -1 ;+[80782] -1 x239 -1 x217 >= -1 ;+[80782] -1 x257 -1 x217 >= -1 ;+[80782] -1 x249 -1 x217 >= -1 ;+[80782] -1 x234 -1 x217 >= -1 ;+[80782] -1 x226 -1 x217 >= -1 ;+[80782] -1 x210 -1 x217 >= -1 ;+[80782] -1 x247 -1 x217 >= -1 ;+[80782] -1 x256 -1 x217 >= -1 ;+[80782] -1 x241 -1 x217 >= -1 ;+[80782] -1 x233 -1 x217 >= -1 ;+[80782] -1 x225 -1 x217 >= -1 ;+[80782] -1 x255 -1 x209 >= -1 ;+[80782] -1 x248 -1 x209 >= -1 ;+[80782] -1 x240 -1 x209 >= -1 ;+[80782] -1 x232 -1 x209 >= -1 ;+[80782] -1 x224 -1 x209 >= -1 ;+[80782] -1 x216 -1 x209 >= -1 ;+[80782] -1 x221 -1 x209 >= -1 ;+[80782] -1 x229 -1 x209 >= -1 ;+[80782] -1 x237 -1 x209 >= -1 ;+[80782] -1 x245 -1 x209 >= -1 ;+[80782] -1 x261 -1 x209 >= -1 ;+[80782] -1 x253 -1 x209 >= -1 ;+[80782] -1 x215 -1 x209 >= -1 ;+[80782] -1 x228 -1 x209 >= -1 ;+[80782] -1 x236 -1 x209 >= -1 ;+[80782] -1 x244 -1 x209 >= -1 ;+[80782] -1 x260 -1 x209 >= -1 ;+[80782] -1 x252 -1 x209 >= -1 ;+[80782] -1 x223 -1 x209 >= -1 ;+[80782] -1 x235 -1 x209 >= -1 ;+[80782] -1 x243 -1 x209 >= -1 ;+[80782] -1 x259 -1 x209 >= -1 ;+[80782] -1 x251 -1 x209 >= -1 ;+[80782] -1 x220 -1 x209 >= -1 ;+[80782] -1 x231 -1 x209 >= -1 ;+[80782] -1 x242 -1 x209 >= -1 ;+[80782] -1 x258 -1 x209 >= -1 ;+[80782] -1 x250 -1 x209 >= -1 ;+[80782] -1 x227 -1 x209 >= -1 ;+[80782] -1 x219 -1 x209 >= -1 ;+[80782] -1 x239 -1 x209 >= -1 ;+[80782] -1 x257 -1 x209 >= -1 ;+[80782] -1 x249 -1 x209 >= -1 ;+[80782] -1 x234 -1 x209 >= -1 ;+[80782] -1 x226 -1 x209 >= -1 ;+[80782] -1 x218 -1 x209 >= -1 ;+[80782] -1 x247 -1 x209 >= -1 ;+[80782] -1 x256 -1 x209 >= -1 ;+[80782] -1 x241 -1 x209 >= -1 ;+[80782] -1 x233 -1 x209 >= -1 ;+[80782] -1 x225 -1 x209 >= -1 ;+[80782] -1 x217 -1 x209 >= -1 ;+[80782] -1 x255 -1 x202 >= -1 ;+[80782] -1 x248 -1 x202 >= -1 ;+[80782] -1 x240 -1 x202 >= -1 ;+[80782] -1 x232 -1 x202 >= -1 ;+[80782] -1 x224 -1 x202 >= -1 ;+[80782] -1 x216 -1 x202 >= -1 ;+[80782] -1 x208 -1 x202 >= -1 ;+[80782] -1 x263 -1 x202 >= -1 ;+[80782] -1 x205 -1 x202 >= -1 ;+[80782] -1 x264 -1 x202 >= -1 ;+[80782] -1 x207 -1 x202 >= -1 ;+[80782] -1 x221 -1 x202 >= -1 ;+[80782] -1 x229 -1 x202 >= -1 ;+[80782] -1 x237 -1 x202 >= -1 ;+[80782] -1 x245 -1 x202 >= -1 ;+[80782] -1 x261 -1 x202 >= -1 ;+[80782] -1 x253 -1 x202 >= -1 ;+[80782] -1 x215 -1 x202 >= -1 ;+[80782] -1 x228 -1 x202 >= -1 ;+[80782] -1 x236 -1 x202 >= -1 ;+[80782] -1 x244 -1 x202 >= -1 ;+[80782] -1 x260 -1 x202 >= -1 ;+[80782] -1 x252 -1 x202 >= -1 ;+[80782] -1 x213 -1 x202 >= -1 ;+[80782] -1 x223 -1 x202 >= -1 ;+[80782] -1 x235 -1 x202 >= -1 ;+[80782] -1 x243 -1 x202 >= -1 ;+[80782] -1 x259 -1 x202 >= -1 ;+[80782] -1 x251 -1 x202 >= -1 ;+[80782] -1 x220 -1 x202 >= -1 ;+[80782] -1 x212 -1 x202 >= -1 ;+[80782] -1 x231 -1 x202 >= -1 ;+[80782] -1 x242 -1 x202 >= -1 ;+[80782] -1 x258 -1 x202 >= -1 ;+[80782] -1 x250 -1 x202 >= -1 ;+[80782] -1 x227 -1 x202 >= -1 ;+[80782] -1 x219 -1 x202 >= -1 ;+[80782] -1 x211 -1 x202 >= -1 ;+[80782] -1 x239 -1 x202 >= -1 ;+[80782] -1 x257 -1 x202 >= -1 ;+[80782] -1 x249 -1 x202 >= -1 ;+[80782] -1 x234 -1 x202 >= -1 ;+[80782] -1 x226 -1 x202 >= -1 ;+[80782] -1 x218 -1 x202 >= -1 ;+[80782] -1 x210 -1 x202 >= -1 ;+[80782] -1 x256 -1 x202 >= -1 ;+[80782] -1 x241 -1 x202 >= -1 ;+[80782] -1 x233 -1 x202 >= -1 ;+[80782] -1 x225 -1 x202 >= -1 ;+[80782] -1 x217 -1 x202 >= -1 ;+[80782] -1 x209 -1 x202 >= -1 ;+[80782] -1 x205 -1 x201 >= -1 ;+[80782] -1 x255 -1 x199 >= -1 ;+[80782] -1 x248 -1 x199 >= -1 ;+[80782] -1 x240 -1 x199 >= -1 ;+[80782] -1 x232 -1 x199 >= -1 ;+[80782] -1 x224 -1 x199 >= -1 ;+[80782] -1 x216 -1 x199 >= -1 ;+[80782] -1 x208 -1 x199 >= -1 ;+[80782] -1 x263 -1 x199 >= -1 ;+[80782] -1 x205 -1 x199 >= -1 ;+[80782] -1 x264 -1 x199 >= -1 ;+[80782] -1 x207 -1 x199 >= -1 ;+[80782] -1 x221 -1 x199 >= -1 ;+[80782] -1 x229 -1 x199 >= -1 ;+[80782] -1 x237 -1 x199 >= -1 ;+[80782] -1 x245 -1 x199 >= -1 ;+[80782] -1 x261 -1 x199 >= -1 ;+[80782] -1 x253 -1 x199 >= -1 ;+[80782] -1 x215 -1 x199 >= -1 ;+[80782] -1 x228 -1 x199 >= -1 ;+[80782] -1 x236 -1 x199 >= -1 ;+[80782] -1 x244 -1 x199 >= -1 ;+[80782] -1 x260 -1 x199 >= -1 ;+[80782] -1 x252 -1 x199 >= -1 ;+[80782] -1 x213 -1 x199 >= -1 ;+[80782] -1 x223 -1 x199 >= -1 ;+[80782] -1 x235 -1 x199 >= -1 ;+[80782] -1 x243 -1 x199 >= -1 ;+[80782] -1 x259 -1 x199 >= -1 ;+[80782] -1 x251 -1 x199 >= -1 ;+[80782] -1 x220 -1 x199 >= -1 ;+[80782] -1 x212 -1 x199 >= -1 ;+[80782] -1 x242 -1 x199 >= -1 ;+[80782] -1 x258 -1 x199 >= -1 ;+[80782] -1 x250 -1 x199 >= -1 ;+[80782] -1 x227 -1 x199 >= -1 ;+[80782] -1 x219 -1 x199 >= -1 ;+[80782] -1 x211 -1 x199 >= -1 ;+[80782] -1 x239 -1 x199 >= -1 ;+[80782] -1 x257 -1 x199 >= -1 ;+[80782] -1 x249 -1 x199 >= -1 ;+[80782] -1 x234 -1 x199 >= -1 ;+[80782] -1 x226 -1 x199 >= -1 ;+[80782] -1 x218 -1 x199 >= -1 ;+[80782] -1 x210 -1 x199 >= -1 ;+[80782] -1 x247 -1 x199 >= -1 ;+[80782] -1 x256 -1 x199 >= -1 ;+[80782] -1 x241 -1 x199 >= -1 ;+[80782] -1 x233 -1 x199 >= -1 ;+[80782] -1 x225 -1 x199 >= -1 ;+[80782] -1 x217 -1 x199 >= -1 ;+[80782] -1 x209 -1 x199 >= -1 ;+[80782] -1 x202 -1 x199 >= -1 ;+[80782] -1 x255 -1 x197 >= -1 ;+[80782] -1 x248 -1 x197 >= -1 ;+[80782] -1 x240 -1 x197 >= -1 ;+[80782] -1 x232 -1 x197 >= -1 ;+[80782] -1 x224 -1 x197 >= -1 ;+[80782] -1 x216 -1 x197 >= -1 ;+[80782] -1 x208 -1 x197 >= -1 ;+[80782] -1 x263 -1 x197 >= -1 ;+[80782] -1 x205 -1 x197 >= -1 ;+[80782] -1 x264 -1 x197 >= -1 ;+[80782] -1 x207 -1 x197 >= -1 ;+[80782] -1 x221 -1 x197 >= -1 ;+[80782] -1 x229 -1 x197 >= -1 ;+[80782] -1 x237 -1 x197 >= -1 ;+[80782] -1 x245 -1 x197 >= -1 ;+[80782] -1 x261 -1 x197 >= -1 ;+[80782] -1 x253 -1 x197 >= -1 ;+[80782] -1 x215 -1 x197 >= -1 ;+[80782] -1 x228 -1 x197 >= -1 ;+[80782] -1 x236 -1 x197 >= -1 ;+[80782] -1 x244 -1 x197 >= -1 ;+[80782] -1 x260 -1 x197 >= -1 ;+[80782] -1 x252 -1 x197 >= -1 ;+[80782] -1 x213 -1 x197 >= -1 ;+[80782] -1 x223 -1 x197 >= -1 ;+[80782] -1 x235 -1 x197 >= -1 ;+[80782] -1 x243 -1 x197 >= -1 ;+[80782] -1 x259 -1 x197 >= -1 ;+[80782] -1 x251 -1 x197 >= -1 ;+[80782] -1 x220 -1 x197 >= -1 ;+[80782] -1 x212 -1 x197 >= -1 ;+[80782] -1 x231 -1 x197 >= -1 ;+[80782] -1 x242 -1 x197 >= -1 ;+[80782] -1 x258 -1 x197 >= -1 ;+[80782] -1 x250 -1 x197 >= -1 ;+[80782] -1 x227 -1 x197 >= -1 ;+[80782] -1 x219 -1 x197 >= -1 ;+[80782] -1 x211 -1 x197 >= -1 ;+[80782] -1 x257 -1 x197 >= -1 ;+[80782] -1 x249 -1 x197 >= -1 ;+[80782] -1 x234 -1 x197 >= -1 ;+[80782] -1 x226 -1 x197 >= -1 ;+[80782] -1 x218 -1 x197 >= -1 ;+[80782] -1 x210 -1 x197 >= -1 ;+[80782] -1 x247 -1 x197 >= -1 ;+[80782] -1 x256 -1 x197 >= -1 ;+[80782] -1 x241 -1 x197 >= -1 ;+[80782] -1 x233 -1 x197 >= -1 ;+[80782] -1 x225 -1 x197 >= -1 ;+[80782] -1 x217 -1 x197 >= -1 ;+[80782] -1 x209 -1 x197 >= -1 ;+[80782] -1 x202 -1 x197 >= -1 ;+[80782] -1 x199 -1 x197 >= -1 ;+[80782] -1 x248 -1 x195 >= -1 ;+[80782] -1 x240 -1 x195 >= -1 ;+[80782] -1 x232 -1 x195 >= -1 ;+[80782] -1 x224 -1 x195 >= -1 ;+[80782] -1 x216 -1 x195 >= -1 ;+[80782] -1 x208 -1 x195 >= -1 ;+[80782] -1 x263 -1 x195 >= -1 ;+[80782] -1 x205 -1 x195 >= -1 ;+[80782] -1 x264 -1 x195 >= -1 ;+[80782] -1 x207 -1 x195 >= -1 ;+[80782] -1 x221 -1 x195 >= -1 ;+[80782] -1 x229 -1 x195 >= -1 ;+[80782] -1 x237 -1 x195 >= -1 ;+[80782] -1 x245 -1 x195 >= -1 ;+[80782] -1 x261 -1 x195 >= -1 ;+[80782] -1 x253 -1 x195 >= -1 ;+[80782] -1 x215 -1 x195 >= -1 ;+[80782] -1 x228 -1 x195 >= -1 ;+[80782] -1 x236 -1 x195 >= -1 ;+[80782] -1 x244 -1 x195 >= -1 ;+[80782] -1 x260 -1 x195 >= -1 ;+[80782] -1 x252 -1 x195 >= -1 ;+[80782] -1 x213 -1 x195 >= -1 ;+[80782] -1 x223 -1 x195 >= -1 ;+[80782] -1 x235 -1 x195 >= -1 ;+[80782] -1 x243 -1 x195 >= -1 ;+[80782] -1 x259 -1 x195 >= -1 ;+[80782] -1 x251 -1 x195 >= -1 ;+[80782] -1 x220 -1 x195 >= -1 ;+[80782] -1 x212 -1 x195 >= -1 ;+[80782] -1 x231 -1 x195 >= -1 ;+[80782] -1 x242 -1 x195 >= -1 ;+[80782] -1 x258 -1 x195 >= -1 ;+[80782] -1 x250 -1 x195 >= -1 ;+[80782] -1 x227 -1 x195 >= -1 ;+[80782] -1 x219 -1 x195 >= -1 ;+[80782] -1 x211 -1 x195 >= -1 ;+[80782] -1 x239 -1 x195 >= -1 ;+[80782] -1 x257 -1 x195 >= -1 ;+[80782] -1 x249 -1 x195 >= -1 ;+[80782] -1 x234 -1 x195 >= -1 ;+[80782] -1 x226 -1 x195 >= -1 ;+[80782] -1 x218 -1 x195 >= -1 ;+[80782] -1 x210 -1 x195 >= -1 ;+[80782] -1 x247 -1 x195 >= -1 ;+[80782] -1 x256 -1 x195 >= -1 ;+[80782] -1 x241 -1 x195 >= -1 ;+[80782] -1 x233 -1 x195 >= -1 ;+[80782] -1 x225 -1 x195 >= -1 ;+[80782] -1 x217 -1 x195 >= -1 ;+[80782] -1 x209 -1 x195 >= -1 ;+[80782] -1 x202 -1 x195 >= -1 ;+[80782] -1 x199 -1 x195 >= -1 ;+[80782] -1 x197 -1 x195 >= -1 ;+[80782] -1 x320 -1 x313 >= -1 ;+[80782] -1 x320 -1 x305 >= -1 ;+[80782] -1 x313 -1 x305 >= -1 ;+[80782] -1 x320 -1 x297 >= -1 ;+[80782] -1 x313 -1 x297 >= -1 ;+[80782] -1 x305 -1 x297 >= -1 ;+[80782] -1 x320 -1 x289 >= -1 ;+[80782] -1 x313 -1 x289 >= -1 ;+[80782] -1 x305 -1 x289 >= -1 ;+[80782] -1 x297 -1 x289 >= -1 ;+[80782] -1 x320 -1 x281 >= -1 ;+[80782] -1 x313 -1 x281 >= -1 ;+[80782] -1 x305 -1 x281 >= -1 ;+[80782] -1 x297 -1 x281 >= -1 ;+[80782] -1 x289 -1 x281 >= -1 ;+[80782] -1 x320 -1 x273 >= -1 ;+[80782] -1 x313 -1 x273 >= -1 ;+[80782] -1 x305 -1 x273 >= -1 ;+[80782] -1 x297 -1 x273 >= -1 ;+[80782] -1 x289 -1 x273 >= -1 ;+[80782] -1 x281 -1 x273 >= -1 ;+[80782] -1 x328 -1 x270 >= -1 ;+[80782] -1 x328 -1 x269 >= -1 ;+[80782] -1 x270 -1 x329 >= -1 ;+[80782] -1 x269 -1 x329 >= -1 ;+[80782] -1 x320 -1 x272 >= -1 ;+[80782] -1 x313 -1 x272 >= -1 ;+[80782] -1 x305 -1 x272 >= -1 ;+[80782] -1 x297 -1 x272 >= -1 ;+[80782] -1 x289 -1 x272 >= -1 ;+[80782] -1 x281 -1 x272 >= -1 ;+[80782] -1 x320 -1 x286 >= -1 ;+[80782] -1 x313 -1 x286 >= -1 ;+[80782] -1 x305 -1 x286 >= -1 ;+[80782] -1 x297 -1 x286 >= -1 ;+[80782] -1 x289 -1 x286 >= -1 ;+[80782] -1 x273 -1 x286 >= -1 ;+[80782] -1 x272 -1 x286 >= -1 ;+[80782] -1 x320 -1 x294 >= -1 ;+[80782] -1 x313 -1 x294 >= -1 ;+[80782] -1 x305 -1 x294 >= -1 ;+[80782] -1 x297 -1 x294 >= -1 ;+[80782] -1 x281 -1 x294 >= -1 ;+[80782] -1 x273 -1 x294 >= -1 ;+[80782] -1 x272 -1 x294 >= -1 ;+[80782] -1 x286 -1 x294 >= -1 ;+[80782] -1 x320 -1 x302 >= -1 ;+[80782] -1 x313 -1 x302 >= -1 ;+[80782] -1 x305 -1 x302 >= -1 ;+[80782] -1 x289 -1 x302 >= -1 ;+[80782] -1 x281 -1 x302 >= -1 ;+[80782] -1 x273 -1 x302 >= -1 ;+[80782] -1 x272 -1 x302 >= -1 ;+[80782] -1 x286 -1 x302 >= -1 ;+[80782] -1 x294 -1 x302 >= -1 ;+[80782] -1 x320 -1 x310 >= -1 ;+[80782] -1 x313 -1 x310 >= -1 ;+[80782] -1 x297 -1 x310 >= -1 ;+[80782] -1 x289 -1 x310 >= -1 ;+[80782] -1 x281 -1 x310 >= -1 ;+[80782] -1 x273 -1 x310 >= -1 ;+[80782] -1 x272 -1 x310 >= -1 ;+[80782] -1 x286 -1 x310 >= -1 ;+[80782] -1 x294 -1 x310 >= -1 ;+[80782] -1 x302 -1 x310 >= -1 ;+[80782] -1 x313 -1 x326 >= -1 ;+[80782] -1 x305 -1 x326 >= -1 ;+[80782] -1 x297 -1 x326 >= -1 ;+[80782] -1 x289 -1 x326 >= -1 ;+[80782] -1 x281 -1 x326 >= -1 ;+[80782] -1 x273 -1 x326 >= -1 ;+[80782] -1 x272 -1 x326 >= -1 ;+[80782] -1 x286 -1 x326 >= -1 ;+[80782] -1 x294 -1 x326 >= -1 ;+[80782] -1 x302 -1 x326 >= -1 ;+[80782] -1 x310 -1 x326 >= -1 ;+[80782] -1 x320 -1 x318 >= -1 ;+[80782] -1 x305 -1 x318 >= -1 ;+[80782] -1 x297 -1 x318 >= -1 ;+[80782] -1 x289 -1 x318 >= -1 ;+[80782] -1 x281 -1 x318 >= -1 ;+[80782] -1 x273 -1 x318 >= -1 ;+[80782] -1 x272 -1 x318 >= -1 ;+[80782] -1 x286 -1 x318 >= -1 ;+[80782] -1 x294 -1 x318 >= -1 ;+[80782] -1 x302 -1 x318 >= -1 ;+[80782] -1 x310 -1 x318 >= -1 ;+[80782] -1 x326 -1 x318 >= -1 ;+[80782] -1 x320 -1 x280 >= -1 ;+[80782] -1 x313 -1 x280 >= -1 ;+[80782] -1 x305 -1 x280 >= -1 ;+[80782] -1 x297 -1 x280 >= -1 ;+[80782] -1 x289 -1 x280 >= -1 ;+[80782] -1 x273 -1 x280 >= -1 ;+[80782] -1 x272 -1 x280 >= -1 ;+[80782] -1 x294 -1 x280 >= -1 ;+[80782] -1 x302 -1 x280 >= -1 ;+[80782] -1 x310 -1 x280 >= -1 ;+[80782] -1 x326 -1 x280 >= -1 ;+[80782] -1 x318 -1 x280 >= -1 ;+[80782] -1 x320 -1 x293 >= -1 ;+[80782] -1 x313 -1 x293 >= -1 ;+[80782] -1 x305 -1 x293 >= -1 ;+[80782] -1 x297 -1 x293 >= -1 ;+[80782] -1 x281 -1 x293 >= -1 ;+[80782] -1 x273 -1 x293 >= -1 ;+[80782] -1 x272 -1 x293 >= -1 ;+[80782] -1 x286 -1 x293 >= -1 ;+[80782] -1 x302 -1 x293 >= -1 ;+[80782] -1 x310 -1 x293 >= -1 ;+[80782] -1 x326 -1 x293 >= -1 ;+[80782] -1 x318 -1 x293 >= -1 ;+[80782] -1 x280 -1 x293 >= -1 ;+[80782] -1 x320 -1 x301 >= -1 ;+[80782] -1 x313 -1 x301 >= -1 ;+[80782] -1 x305 -1 x301 >= -1 ;+[80782] -1 x289 -1 x301 >= -1 ;+[80782] -1 x281 -1 x301 >= -1 ;+[80782] -1 x273 -1 x301 >= -1 ;+[80782] -1 x272 -1 x301 >= -1 ;+[80782] -1 x286 -1 x301 >= -1 ;+[80782] -1 x294 -1 x301 >= -1 ;+[80782] -1 x310 -1 x301 >= -1 ;+[80782] -1 x326 -1 x301 >= -1 ;+[80782] -1 x318 -1 x301 >= -1 ;+[80782] -1 x280 -1 x301 >= -1 ;+[80782] -1 x293 -1 x301 >= -1 ;+[80782] -1 x320 -1 x309 >= -1 ;+[80782] -1 x313 -1 x309 >= -1 ;+[80782] -1 x297 -1 x309 >= -1 ;+[80782] -1 x289 -1 x309 >= -1 ;+[80782] -1 x281 -1 x309 >= -1 ;+[80782] -1 x273 -1 x309 >= -1 ;+[80782] -1 x272 -1 x309 >= -1 ;+[80782] -1 x286 -1 x309 >= -1 ;+[80782] -1 x294 -1 x309 >= -1 ;+[80782] -1 x302 -1 x309 >= -1 ;+[80782] -1 x326 -1 x309 >= -1 ;+[80782] -1 x318 -1 x309 >= -1 ;+[80782] -1 x280 -1 x309 >= -1 ;+[80782] -1 x293 -1 x309 >= -1 ;+[80782] -1 x301 -1 x309 >= -1 ;+[80782] -1 x313 -1 x325 >= -1 ;+[80782] -1 x305 -1 x325 >= -1 ;+[80782] -1 x297 -1 x325 >= -1 ;+[80782] -1 x289 -1 x325 >= -1 ;+[80782] -1 x281 -1 x325 >= -1 ;+[80782] -1 x273 -1 x325 >= -1 ;+[80782] -1 x272 -1 x325 >= -1 ;+[80782] -1 x286 -1 x325 >= -1 ;+[80782] -1 x294 -1 x325 >= -1 ;+[80782] -1 x302 -1 x325 >= -1 ;+[80782] -1 x310 -1 x325 >= -1 ;+[80782] -1 x318 -1 x325 >= -1 ;+[80782] -1 x280 -1 x325 >= -1 ;+[80782] -1 x293 -1 x325 >= -1 ;+[80782] -1 x301 -1 x325 >= -1 ;+[80782] -1 x309 -1 x325 >= -1 ;+[80782] -1 x320 -1 x317 >= -1 ;+[80782] -1 x305 -1 x317 >= -1 ;+[80782] -1 x297 -1 x317 >= -1 ;+[80782] -1 x289 -1 x317 >= -1 ;+[80782] -1 x281 -1 x317 >= -1 ;+[80782] -1 x273 -1 x317 >= -1 ;+[80782] -1 x272 -1 x317 >= -1 ;+[80782] -1 x286 -1 x317 >= -1 ;+[80782] -1 x294 -1 x317 >= -1 ;+[80782] -1 x302 -1 x317 >= -1 ;+[80782] -1 x310 -1 x317 >= -1 ;+[80782] -1 x326 -1 x317 >= -1 ;+[80782] -1 x280 -1 x317 >= -1 ;+[80782] -1 x293 -1 x317 >= -1 ;+[80782] -1 x301 -1 x317 >= -1 ;+[80782] -1 x309 -1 x317 >= -1 ;+[80782] -1 x325 -1 x317 >= -1 ;+[80782] -1 x320 -1 x278 >= -1 ;+[80782] -1 x313 -1 x278 >= -1 ;+[80782] -1 x305 -1 x278 >= -1 ;+[80782] -1 x297 -1 x278 >= -1 ;+[80782] -1 x289 -1 x278 >= -1 ;+[80782] -1 x281 -1 x278 >= -1 ;+[80782] -1 x286 -1 x278 >= -1 ;+[80782] -1 x294 -1 x278 >= -1 ;+[80782] -1 x302 -1 x278 >= -1 ;+[80782] -1 x310 -1 x278 >= -1 ;+[80782] -1 x326 -1 x278 >= -1 ;+[80782] -1 x318 -1 x278 >= -1 ;+[80782] -1 x280 -1 x278 >= -1 ;+[80782] -1 x293 -1 x278 >= -1 ;+[80782] -1 x301 -1 x278 >= -1 ;+[80782] -1 x309 -1 x278 >= -1 ;+[80782] -1 x325 -1 x278 >= -1 ;+[80782] -1 x317 -1 x278 >= -1 ;+[80782] -1 x320 -1 x288 >= -1 ;+[80782] -1 x313 -1 x288 >= -1 ;+[80782] -1 x305 -1 x288 >= -1 ;+[80782] -1 x297 -1 x288 >= -1 ;+[80782] -1 x281 -1 x288 >= -1 ;+[80782] -1 x273 -1 x288 >= -1 ;+[80782] -1 x272 -1 x288 >= -1 ;+[80782] -1 x286 -1 x288 >= -1 ;+[80782] -1 x302 -1 x288 >= -1 ;+[80782] -1 x310 -1 x288 >= -1 ;+[80782] -1 x326 -1 x288 >= -1 ;+[80782] -1 x318 -1 x288 >= -1 ;+[80782] -1 x280 -1 x288 >= -1 ;+[80782] -1 x301 -1 x288 >= -1 ;+[80782] -1 x309 -1 x288 >= -1 ;+[80782] -1 x325 -1 x288 >= -1 ;+[80782] -1 x317 -1 x288 >= -1 ;+[80782] -1 x278 -1 x288 >= -1 ;+[80782] -1 x320 -1 x300 >= -1 ;+[80782] -1 x313 -1 x300 >= -1 ;+[80782] -1 x305 -1 x300 >= -1 ;+[80782] -1 x289 -1 x300 >= -1 ;+[80782] -1 x281 -1 x300 >= -1 ;+[80782] -1 x273 -1 x300 >= -1 ;+[80782] -1 x272 -1 x300 >= -1 ;+[80782] -1 x286 -1 x300 >= -1 ;+[80782] -1 x294 -1 x300 >= -1 ;+[80782] -1 x310 -1 x300 >= -1 ;+[80782] -1 x326 -1 x300 >= -1 ;+[80782] -1 x318 -1 x300 >= -1 ;+[80782] -1 x280 -1 x300 >= -1 ;+[80782] -1 x293 -1 x300 >= -1 ;+[80782] -1 x309 -1 x300 >= -1 ;+[80782] -1 x325 -1 x300 >= -1 ;+[80782] -1 x317 -1 x300 >= -1 ;+[80782] -1 x278 -1 x300 >= -1 ;+[80782] -1 x288 -1 x300 >= -1 ;+[80782] -1 x320 -1 x308 >= -1 ;+[80782] -1 x313 -1 x308 >= -1 ;+[80782] -1 x297 -1 x308 >= -1 ;+[80782] -1 x289 -1 x308 >= -1 ;+[80782] -1 x281 -1 x308 >= -1 ;+[80782] -1 x273 -1 x308 >= -1 ;+[80782] -1 x272 -1 x308 >= -1 ;+[80782] -1 x286 -1 x308 >= -1 ;+[80782] -1 x294 -1 x308 >= -1 ;+[80782] -1 x302 -1 x308 >= -1 ;+[80782] -1 x326 -1 x308 >= -1 ;+[80782] -1 x318 -1 x308 >= -1 ;+[80782] -1 x280 -1 x308 >= -1 ;+[80782] -1 x293 -1 x308 >= -1 ;+[80782] -1 x301 -1 x308 >= -1 ;+[80782] -1 x325 -1 x308 >= -1 ;+[80782] -1 x317 -1 x308 >= -1 ;+[80782] -1 x278 -1 x308 >= -1 ;+[80782] -1 x288 -1 x308 >= -1 ;+[80782] -1 x300 -1 x308 >= -1 ;+[80782] -1 x313 -1 x324 >= -1 ;+[80782] -1 x305 -1 x324 >= -1 ;+[80782] -1 x297 -1 x324 >= -1 ;+[80782] -1 x289 -1 x324 >= -1 ;+[80782] -1 x281 -1 x324 >= -1 ;+[80782] -1 x273 -1 x324 >= -1 ;+[80782] -1 x272 -1 x324 >= -1 ;+[80782] -1 x286 -1 x324 >= -1 ;+[80782] -1 x294 -1 x324 >= -1 ;+[80782] -1 x302 -1 x324 >= -1 ;+[80782] -1 x310 -1 x324 >= -1 ;+[80782] -1 x318 -1 x324 >= -1 ;+[80782] -1 x280 -1 x324 >= -1 ;+[80782] -1 x293 -1 x324 >= -1 ;+[80782] -1 x301 -1 x324 >= -1 ;+[80782] -1 x309 -1 x324 >= -1 ;+[80782] -1 x317 -1 x324 >= -1 ;+[80782] -1 x278 -1 x324 >= -1 ;+[80782] -1 x288 -1 x324 >= -1 ;+[80782] -1 x300 -1 x324 >= -1 ;+[80782] -1 x308 -1 x324 >= -1 ;+[80782] -1 x320 -1 x316 >= -1 ;+[80782] -1 x305 -1 x316 >= -1 ;+[80782] -1 x297 -1 x316 >= -1 ;+[80782] -1 x289 -1 x316 >= -1 ;+[80782] -1 x281 -1 x316 >= -1 ;+[80782] -1 x273 -1 x316 >= -1 ;+[80782] -1 x272 -1 x316 >= -1 ;+[80782] -1 x286 -1 x316 >= -1 ;+[80782] -1 x294 -1 x316 >= -1 ;+[80782] -1 x302 -1 x316 >= -1 ;+[80782] -1 x310 -1 x316 >= -1 ;+[80782] -1 x326 -1 x316 >= -1 ;+[80782] -1 x280 -1 x316 >= -1 ;+[80782] -1 x293 -1 x316 >= -1 ;+[80782] -1 x301 -1 x316 >= -1 ;+[80782] -1 x309 -1 x316 >= -1 ;+[80782] -1 x325 -1 x316 >= -1 ;+[80782] -1 x278 -1 x316 >= -1 ;+[80782] -1 x288 -1 x316 >= -1 ;+[80782] -1 x300 -1 x316 >= -1 ;+[80782] -1 x308 -1 x316 >= -1 ;+[80782] -1 x324 -1 x316 >= -1 ;+[80782] -1 x320 -1 x285 >= -1 ;+[80782] -1 x313 -1 x285 >= -1 ;+[80782] -1 x305 -1 x285 >= -1 ;+[80782] -1 x297 -1 x285 >= -1 ;+[80782] -1 x289 -1 x285 >= -1 ;+[80782] -1 x273 -1 x285 >= -1 ;+[80782] -1 x272 -1 x285 >= -1 ;+[80782] -1 x294 -1 x285 >= -1 ;+[80782] -1 x302 -1 x285 >= -1 ;+[80782] -1 x310 -1 x285 >= -1 ;+[80782] -1 x326 -1 x285 >= -1 ;+[80782] -1 x318 -1 x285 >= -1 ;+[80782] -1 x293 -1 x285 >= -1 ;+[80782] -1 x301 -1 x285 >= -1 ;+[80782] -1 x309 -1 x285 >= -1 ;+[80782] -1 x325 -1 x285 >= -1 ;+[80782] -1 x317 -1 x285 >= -1 ;+[80782] -1 x278 -1 x285 >= -1 ;+[80782] -1 x288 -1 x285 >= -1 ;+[80782] -1 x300 -1 x285 >= -1 ;+[80782] -1 x308 -1 x285 >= -1 ;+[80782] -1 x324 -1 x285 >= -1 ;+[80782] -1 x316 -1 x285 >= -1 ;+[80782] -1 x320 -1 x277 >= -1 ;+[80782] -1 x313 -1 x277 >= -1 ;+[80782] -1 x305 -1 x277 >= -1 ;+[80782] -1 x297 -1 x277 >= -1 ;+[80782] -1 x289 -1 x277 >= -1 ;+[80782] -1 x281 -1 x277 >= -1 ;+[80782] -1 x286 -1 x277 >= -1 ;+[80782] -1 x294 -1 x277 >= -1 ;+[80782] -1 x302 -1 x277 >= -1 ;+[80782] -1 x310 -1 x277 >= -1 ;+[80782] -1 x326 -1 x277 >= -1 ;+[80782] -1 x318 -1 x277 >= -1 ;+[80782] -1 x280 -1 x277 >= -1 ;+[80782] -1 x293 -1 x277 >= -1 ;+[80782] -1 x301 -1 x277 >= -1 ;+[80782] -1 x309 -1 x277 >= -1 ;+[80782] -1 x325 -1 x277 >= -1 ;+[80782] -1 x317 -1 x277 >= -1 ;+[80782] -1 x288 -1 x277 >= -1 ;+[80782] -1 x300 -1 x277 >= -1 ;+[80782] -1 x308 -1 x277 >= -1 ;+[80782] -1 x324 -1 x277 >= -1 ;+[80782] -1 x316 -1 x277 >= -1 ;+[80782] -1 x285 -1 x277 >= -1 ;+[80782] -1 x320 -1 x296 >= -1 ;+[80782] -1 x313 -1 x296 >= -1 ;+[80782] -1 x305 -1 x296 >= -1 ;+[80782] -1 x289 -1 x296 >= -1 ;+[80782] -1 x281 -1 x296 >= -1 ;+[80782] -1 x273 -1 x296 >= -1 ;+[80782] -1 x272 -1 x296 >= -1 ;+[80782] -1 x286 -1 x296 >= -1 ;+[80782] -1 x294 -1 x296 >= -1 ;+[80782] -1 x310 -1 x296 >= -1 ;+[80782] -1 x326 -1 x296 >= -1 ;+[80782] -1 x318 -1 x296 >= -1 ;+[80782] -1 x280 -1 x296 >= -1 ;+[80782] -1 x293 -1 x296 >= -1 ;+[80782] -1 x309 -1 x296 >= -1 ;+[80782] -1 x325 -1 x296 >= -1 ;+[80782] -1 x317 -1 x296 >= -1 ;+[80782] -1 x278 -1 x296 >= -1 ;+[80782] -1 x288 -1 x296 >= -1 ;+[80782] -1 x308 -1 x296 >= -1 ;+[80782] -1 x324 -1 x296 >= -1 ;+[80782] -1 x316 -1 x296 >= -1 ;+[80782] -1 x285 -1 x296 >= -1 ;+[80782] -1 x277 -1 x296 >= -1 ;+[80782] -1 x320 -1 x307 >= -1 ;+[80782] -1 x313 -1 x307 >= -1 ;+[80782] -1 x297 -1 x307 >= -1 ;+[80782] -1 x289 -1 x307 >= -1 ;+[80782] -1 x281 -1 x307 >= -1 ;+[80782] -1 x273 -1 x307 >= -1 ;+[80782] -1 x272 -1 x307 >= -1 ;+[80782] -1 x286 -1 x307 >= -1 ;+[80782] -1 x294 -1 x307 >= -1 ;+[80782] -1 x302 -1 x307 >= -1 ;+[80782] -1 x326 -1 x307 >= -1 ;+[80782] -1 x318 -1 x307 >= -1 ;+[80782] -1 x280 -1 x307 >= -1 ;+[80782] -1 x293 -1 x307 >= -1 ;+[80782] -1 x301 -1 x307 >= -1 ;+[80782] -1 x325 -1 x307 >= -1 ;+[80782] -1 x317 -1 x307 >= -1 ;+[80782] -1 x278 -1 x307 >= -1 ;+[80782] -1 x288 -1 x307 >= -1 ;+[80782] -1 x300 -1 x307 >= -1 ;+[80782] -1 x324 -1 x307 >= -1 ;+[80782] -1 x316 -1 x307 >= -1 ;+[80782] -1 x285 -1 x307 >= -1 ;+[80782] -1 x277 -1 x307 >= -1 ;+[80782] -1 x296 -1 x307 >= -1 ;+[80782] -1 x313 -1 x323 >= -1 ;+[80782] -1 x305 -1 x323 >= -1 ;+[80782] -1 x297 -1 x323 >= -1 ;+[80782] -1 x289 -1 x323 >= -1 ;+[80782] -1 x281 -1 x323 >= -1 ;+[80782] -1 x273 -1 x323 >= -1 ;+[80782] -1 x272 -1 x323 >= -1 ;+[80782] -1 x286 -1 x323 >= -1 ;+[80782] -1 x294 -1 x323 >= -1 ;+[80782] -1 x302 -1 x323 >= -1 ;+[80782] -1 x310 -1 x323 >= -1 ;+[80782] -1 x318 -1 x323 >= -1 ;+[80782] -1 x280 -1 x323 >= -1 ;+[80782] -1 x293 -1 x323 >= -1 ;+[80782] -1 x301 -1 x323 >= -1 ;+[80782] -1 x309 -1 x323 >= -1 ;+[80782] -1 x317 -1 x323 >= -1 ;+[80782] -1 x278 -1 x323 >= -1 ;+[80782] -1 x288 -1 x323 >= -1 ;+[80782] -1 x300 -1 x323 >= -1 ;+[80782] -1 x308 -1 x323 >= -1 ;+[80782] -1 x316 -1 x323 >= -1 ;+[80782] -1 x285 -1 x323 >= -1 ;+[80782] -1 x277 -1 x323 >= -1 ;+[80782] -1 x296 -1 x323 >= -1 ;+[80782] -1 x307 -1 x323 >= -1 ;+[80782] -1 x320 -1 x315 >= -1 ;+[80782] -1 x305 -1 x315 >= -1 ;+[80782] -1 x297 -1 x315 >= -1 ;+[80782] -1 x289 -1 x315 >= -1 ;+[80782] -1 x281 -1 x315 >= -1 ;+[80782] -1 x273 -1 x315 >= -1 ;+[80782] -1 x272 -1 x315 >= -1 ;+[80782] -1 x286 -1 x315 >= -1 ;+[80782] -1 x294 -1 x315 >= -1 ;+[80782] -1 x302 -1 x315 >= -1 ;+[80782] -1 x310 -1 x315 >= -1 ;+[80782] -1 x326 -1 x315 >= -1 ;+[80782] -1 x280 -1 x315 >= -1 ;+[80782] -1 x293 -1 x315 >= -1 ;+[80782] -1 x301 -1 x315 >= -1 ;+[80782] -1 x309 -1 x315 >= -1 ;+[80782] -1 x325 -1 x315 >= -1 ;+[80782] -1 x278 -1 x315 >= -1 ;+[80782] -1 x288 -1 x315 >= -1 ;+[80782] -1 x300 -1 x315 >= -1 ;+[80782] -1 x308 -1 x315 >= -1 ;+[80782] -1 x324 -1 x315 >= -1 ;+[80782] -1 x285 -1 x315 >= -1 ;+[80782] -1 x277 -1 x315 >= -1 ;+[80782] -1 x296 -1 x315 >= -1 ;+[80782] -1 x307 -1 x315 >= -1 ;+[80782] -1 x323 -1 x315 >= -1 ;+[80782] -1 x320 -1 x292 >= -1 ;+[80782] -1 x313 -1 x292 >= -1 ;+[80782] -1 x305 -1 x292 >= -1 ;+[80782] -1 x297 -1 x292 >= -1 ;+[80782] -1 x281 -1 x292 >= -1 ;+[80782] -1 x273 -1 x292 >= -1 ;+[80782] -1 x272 -1 x292 >= -1 ;+[80782] -1 x286 -1 x292 >= -1 ;+[80782] -1 x302 -1 x292 >= -1 ;+[80782] -1 x310 -1 x292 >= -1 ;+[80782] -1 x326 -1 x292 >= -1 ;+[80782] -1 x318 -1 x292 >= -1 ;+[80782] -1 x280 -1 x292 >= -1 ;+[80782] -1 x301 -1 x292 >= -1 ;+[80782] -1 x309 -1 x292 >= -1 ;+[80782] -1 x325 -1 x292 >= -1 ;+[80782] -1 x317 -1 x292 >= -1 ;+[80782] -1 x278 -1 x292 >= -1 ;+[80782] -1 x300 -1 x292 >= -1 ;+[80782] -1 x308 -1 x292 >= -1 ;+[80782] -1 x324 -1 x292 >= -1 ;+[80782] -1 x316 -1 x292 >= -1 ;+[80782] -1 x285 -1 x292 >= -1 ;+[80782] -1 x277 -1 x292 >= -1 ;+[80782] -1 x296 -1 x292 >= -1 ;+[80782] -1 x307 -1 x292 >= -1 ;+[80782] -1 x323 -1 x292 >= -1 ;+[80782] -1 x315 -1 x292 >= -1 ;+[80782] -1 x320 -1 x284 >= -1 ;+[80782] -1 x313 -1 x284 >= -1 ;+[80782] -1 x305 -1 x284 >= -1 ;+[80782] -1 x297 -1 x284 >= -1 ;+[80782] -1 x289 -1 x284 >= -1 ;+[80782] -1 x273 -1 x284 >= -1 ;+[80782] -1 x272 -1 x284 >= -1 ;+[80782] -1 x294 -1 x284 >= -1 ;+[80782] -1 x302 -1 x284 >= -1 ;+[80782] -1 x310 -1 x284 >= -1 ;+[80782] -1 x326 -1 x284 >= -1 ;+[80782] -1 x318 -1 x284 >= -1 ;+[80782] -1 x293 -1 x284 >= -1 ;+[80782] -1 x301 -1 x284 >= -1 ;+[80782] -1 x309 -1 x284 >= -1 ;+[80782] -1 x325 -1 x284 >= -1 ;+[80782] -1 x317 -1 x284 >= -1 ;+[80782] -1 x278 -1 x284 >= -1 ;+[80782] -1 x288 -1 x284 >= -1 ;+[80782] -1 x300 -1 x284 >= -1 ;+[80782] -1 x308 -1 x284 >= -1 ;+[80782] -1 x324 -1 x284 >= -1 ;+[80782] -1 x316 -1 x284 >= -1 ;+[80782] -1 x277 -1 x284 >= -1 ;+[80782] -1 x296 -1 x284 >= -1 ;+[80782] -1 x307 -1 x284 >= -1 ;+[80782] -1 x323 -1 x284 >= -1 ;+[80782] -1 x315 -1 x284 >= -1 ;+[80782] -1 x292 -1 x284 >= -1 ;+[80782] -1 x320 -1 x276 >= -1 ;+[80782] -1 x313 -1 x276 >= -1 ;+[80782] -1 x305 -1 x276 >= -1 ;+[80782] -1 x297 -1 x276 >= -1 ;+[80782] -1 x289 -1 x276 >= -1 ;+[80782] -1 x281 -1 x276 >= -1 ;+[80782] -1 x286 -1 x276 >= -1 ;+[80782] -1 x294 -1 x276 >= -1 ;+[80782] -1 x302 -1 x276 >= -1 ;+[80782] -1 x310 -1 x276 >= -1 ;+[80782] -1 x326 -1 x276 >= -1 ;+[80782] -1 x318 -1 x276 >= -1 ;+[80782] -1 x280 -1 x276 >= -1 ;+[80782] -1 x293 -1 x276 >= -1 ;+[80782] -1 x301 -1 x276 >= -1 ;+[80782] -1 x309 -1 x276 >= -1 ;+[80782] -1 x325 -1 x276 >= -1 ;+[80782] -1 x317 -1 x276 >= -1 ;+[80782] -1 x288 -1 x276 >= -1 ;+[80782] -1 x300 -1 x276 >= -1 ;+[80782] -1 x308 -1 x276 >= -1 ;+[80782] -1 x324 -1 x276 >= -1 ;+[80782] -1 x316 -1 x276 >= -1 ;+[80782] -1 x285 -1 x276 >= -1 ;+[80782] -1 x296 -1 x276 >= -1 ;+[80782] -1 x307 -1 x276 >= -1 ;+[80782] -1 x323 -1 x276 >= -1 ;+[80782] -1 x315 -1 x276 >= -1 ;+[80782] -1 x292 -1 x276 >= -1 ;+[80782] -1 x284 -1 x276 >= -1 ;+[80782] -1 x320 -1 x304 >= -1 ;+[80782] -1 x313 -1 x304 >= -1 ;+[80782] -1 x297 -1 x304 >= -1 ;+[80782] -1 x289 -1 x304 >= -1 ;+[80782] -1 x281 -1 x304 >= -1 ;+[80782] -1 x273 -1 x304 >= -1 ;+[80782] -1 x272 -1 x304 >= -1 ;+[80782] -1 x286 -1 x304 >= -1 ;+[80782] -1 x294 -1 x304 >= -1 ;+[80782] -1 x302 -1 x304 >= -1 ;+[80782] -1 x326 -1 x304 >= -1 ;+[80782] -1 x318 -1 x304 >= -1 ;+[80782] -1 x280 -1 x304 >= -1 ;+[80782] -1 x293 -1 x304 >= -1 ;+[80782] -1 x301 -1 x304 >= -1 ;+[80782] -1 x325 -1 x304 >= -1 ;+[80782] -1 x317 -1 x304 >= -1 ;+[80782] -1 x278 -1 x304 >= -1 ;+[80782] -1 x288 -1 x304 >= -1 ;+[80782] -1 x300 -1 x304 >= -1 ;+[80782] -1 x324 -1 x304 >= -1 ;+[80782] -1 x316 -1 x304 >= -1 ;+[80782] -1 x285 -1 x304 >= -1 ;+[80782] -1 x277 -1 x304 >= -1 ;+[80782] -1 x296 -1 x304 >= -1 ;+[80782] -1 x323 -1 x304 >= -1 ;+[80782] -1 x315 -1 x304 >= -1 ;+[80782] -1 x292 -1 x304 >= -1 ;+[80782] -1 x284 -1 x304 >= -1 ;+[80782] -1 x276 -1 x304 >= -1 ;+[80782] -1 x313 -1 x322 >= -1 ;+[80782] -1 x305 -1 x322 >= -1 ;+[80782] -1 x297 -1 x322 >= -1 ;+[80782] -1 x289 -1 x322 >= -1 ;+[80782] -1 x281 -1 x322 >= -1 ;+[80782] -1 x273 -1 x322 >= -1 ;+[80782] -1 x272 -1 x322 >= -1 ;+[80782] -1 x286 -1 x322 >= -1 ;+[80782] -1 x294 -1 x322 >= -1 ;+[80782] -1 x302 -1 x322 >= -1 ;+[80782] -1 x310 -1 x322 >= -1 ;+[80782] -1 x318 -1 x322 >= -1 ;+[80782] -1 x280 -1 x322 >= -1 ;+[80782] -1 x293 -1 x322 >= -1 ;+[80782] -1 x301 -1 x322 >= -1 ;+[80782] -1 x309 -1 x322 >= -1 ;+[80782] -1 x317 -1 x322 >= -1 ;+[80782] -1 x278 -1 x322 >= -1 ;+[80782] -1 x288 -1 x322 >= -1 ;+[80782] -1 x300 -1 x322 >= -1 ;+[80782] -1 x308 -1 x322 >= -1 ;+[80782] -1 x316 -1 x322 >= -1 ;+[80782] -1 x285 -1 x322 >= -1 ;+[80782] -1 x277 -1 x322 >= -1 ;+[80782] -1 x296 -1 x322 >= -1 ;+[80782] -1 x307 -1 x322 >= -1 ;+[80782] -1 x315 -1 x322 >= -1 ;+[80782] -1 x292 -1 x322 >= -1 ;+[80782] -1 x284 -1 x322 >= -1 ;+[80782] -1 x276 -1 x322 >= -1 ;+[80782] -1 x304 -1 x322 >= -1 ;+[80782] -1 x320 -1 x314 >= -1 ;+[80782] -1 x305 -1 x314 >= -1 ;+[80782] -1 x297 -1 x314 >= -1 ;+[80782] -1 x289 -1 x314 >= -1 ;+[80782] -1 x281 -1 x314 >= -1 ;+[80782] -1 x273 -1 x314 >= -1 ;+[80782] -1 x272 -1 x314 >= -1 ;+[80782] -1 x286 -1 x314 >= -1 ;+[80782] -1 x294 -1 x314 >= -1 ;+[80782] -1 x302 -1 x314 >= -1 ;+[80782] -1 x310 -1 x314 >= -1 ;+[80782] -1 x326 -1 x314 >= -1 ;+[80782] -1 x280 -1 x314 >= -1 ;+[80782] -1 x293 -1 x314 >= -1 ;+[80782] -1 x301 -1 x314 >= -1 ;+[80782] -1 x309 -1 x314 >= -1 ;+[80782] -1 x325 -1 x314 >= -1 ;+[80782] -1 x278 -1 x314 >= -1 ;+[80782] -1 x288 -1 x314 >= -1 ;+[80782] -1 x300 -1 x314 >= -1 ;+[80782] -1 x308 -1 x314 >= -1 ;+[80782] -1 x324 -1 x314 >= -1 ;+[80782] -1 x285 -1 x314 >= -1 ;+[80782] -1 x277 -1 x314 >= -1 ;+[80782] -1 x296 -1 x314 >= -1 ;+[80782] -1 x307 -1 x314 >= -1 ;+[80782] -1 x323 -1 x314 >= -1 ;+[80782] -1 x292 -1 x314 >= -1 ;+[80782] -1 x284 -1 x314 >= -1 ;+[80782] -1 x276 -1 x314 >= -1 ;+[80782] -1 x304 -1 x314 >= -1 ;+[80782] -1 x322 -1 x314 >= -1 ;+[80782] -1 x320 -1 x299 >= -1 ;+[80782] -1 x313 -1 x299 >= -1 ;+[80782] -1 x305 -1 x299 >= -1 ;+[80782] -1 x289 -1 x299 >= -1 ;+[80782] -1 x281 -1 x299 >= -1 ;+[80782] -1 x273 -1 x299 >= -1 ;+[80782] -1 x272 -1 x299 >= -1 ;+[80782] -1 x286 -1 x299 >= -1 ;+[80782] -1 x294 -1 x299 >= -1 ;+[80782] -1 x310 -1 x299 >= -1 ;+[80782] -1 x326 -1 x299 >= -1 ;+[80782] -1 x318 -1 x299 >= -1 ;+[80782] -1 x280 -1 x299 >= -1 ;+[80782] -1 x293 -1 x299 >= -1 ;+[80782] -1 x309 -1 x299 >= -1 ;+[80782] -1 x325 -1 x299 >= -1 ;+[80782] -1 x317 -1 x299 >= -1 ;+[80782] -1 x278 -1 x299 >= -1 ;+[80782] -1 x288 -1 x299 >= -1 ;+[80782] -1 x308 -1 x299 >= -1 ;+[80782] -1 x324 -1 x299 >= -1 ;+[80782] -1 x316 -1 x299 >= -1 ;+[80782] -1 x285 -1 x299 >= -1 ;+[80782] -1 x277 -1 x299 >= -1 ;+[80782] -1 x307 -1 x299 >= -1 ;+[80782] -1 x323 -1 x299 >= -1 ;+[80782] -1 x315 -1 x299 >= -1 ;+[80782] -1 x292 -1 x299 >= -1 ;+[80782] -1 x284 -1 x299 >= -1 ;+[80782] -1 x276 -1 x299 >= -1 ;+[80782] -1 x304 -1 x299 >= -1 ;+[80782] -1 x322 -1 x299 >= -1 ;+[80782] -1 x314 -1 x299 >= -1 ;+[80782] -1 x320 -1 x291 >= -1 ;+[80782] -1 x313 -1 x291 >= -1 ;+[80782] -1 x305 -1 x291 >= -1 ;+[80782] -1 x297 -1 x291 >= -1 ;+[80782] -1 x281 -1 x291 >= -1 ;+[80782] -1 x273 -1 x291 >= -1 ;+[80782] -1 x272 -1 x291 >= -1 ;+[80782] -1 x286 -1 x291 >= -1 ;+[80782] -1 x302 -1 x291 >= -1 ;+[80782] -1 x310 -1 x291 >= -1 ;+[80782] -1 x326 -1 x291 >= -1 ;+[80782] -1 x318 -1 x291 >= -1 ;+[80782] -1 x280 -1 x291 >= -1 ;+[80782] -1 x301 -1 x291 >= -1 ;+[80782] -1 x309 -1 x291 >= -1 ;+[80782] -1 x325 -1 x291 >= -1 ;+[80782] -1 x317 -1 x291 >= -1 ;+[80782] -1 x278 -1 x291 >= -1 ;+[80782] -1 x300 -1 x291 >= -1 ;+[80782] -1 x308 -1 x291 >= -1 ;+[80782] -1 x324 -1 x291 >= -1 ;+[80782] -1 x316 -1 x291 >= -1 ;+[80782] -1 x285 -1 x291 >= -1 ;+[80782] -1 x277 -1 x291 >= -1 ;+[80782] -1 x296 -1 x291 >= -1 ;+[80782] -1 x307 -1 x291 >= -1 ;+[80782] -1 x323 -1 x291 >= -1 ;+[80782] -1 x315 -1 x291 >= -1 ;+[80782] -1 x284 -1 x291 >= -1 ;+[80782] -1 x276 -1 x291 >= -1 ;+[80782] -1 x304 -1 x291 >= -1 ;+[80782] -1 x322 -1 x291 >= -1 ;+[80782] -1 x314 -1 x291 >= -1 ;+[80782] -1 x299 -1 x291 >= -1 ;+[80782] -1 x320 -1 x283 >= -1 ;+[80782] -1 x313 -1 x283 >= -1 ;+[80782] -1 x305 -1 x283 >= -1 ;+[80782] -1 x297 -1 x283 >= -1 ;+[80782] -1 x289 -1 x283 >= -1 ;+[80782] -1 x273 -1 x283 >= -1 ;+[80782] -1 x272 -1 x283 >= -1 ;+[80782] -1 x294 -1 x283 >= -1 ;+[80782] -1 x302 -1 x283 >= -1 ;+[80782] -1 x310 -1 x283 >= -1 ;+[80782] -1 x326 -1 x283 >= -1 ;+[80782] -1 x318 -1 x283 >= -1 ;+[80782] -1 x293 -1 x283 >= -1 ;+[80782] -1 x301 -1 x283 >= -1 ;+[80782] -1 x309 -1 x283 >= -1 ;+[80782] -1 x325 -1 x283 >= -1 ;+[80782] -1 x317 -1 x283 >= -1 ;+[80782] -1 x278 -1 x283 >= -1 ;+[80782] -1 x288 -1 x283 >= -1 ;+[80782] -1 x300 -1 x283 >= -1 ;+[80782] -1 x308 -1 x283 >= -1 ;+[80782] -1 x324 -1 x283 >= -1 ;+[80782] -1 x316 -1 x283 >= -1 ;+[80782] -1 x277 -1 x283 >= -1 ;+[80782] -1 x296 -1 x283 >= -1 ;+[80782] -1 x307 -1 x283 >= -1 ;+[80782] -1 x323 -1 x283 >= -1 ;+[80782] -1 x315 -1 x283 >= -1 ;+[80782] -1 x292 -1 x283 >= -1 ;+[80782] -1 x276 -1 x283 >= -1 ;+[80782] -1 x304 -1 x283 >= -1 ;+[80782] -1 x322 -1 x283 >= -1 ;+[80782] -1 x314 -1 x283 >= -1 ;+[80782] -1 x299 -1 x283 >= -1 ;+[80782] -1 x291 -1 x283 >= -1 ;+[80782] -1 x320 -1 x275 >= -1 ;+[80782] -1 x313 -1 x275 >= -1 ;+[80782] -1 x305 -1 x275 >= -1 ;+[80782] -1 x297 -1 x275 >= -1 ;+[80782] -1 x289 -1 x275 >= -1 ;+[80782] -1 x281 -1 x275 >= -1 ;+[80782] -1 x286 -1 x275 >= -1 ;+[80782] -1 x294 -1 x275 >= -1 ;+[80782] -1 x302 -1 x275 >= -1 ;+[80782] -1 x310 -1 x275 >= -1 ;+[80782] -1 x326 -1 x275 >= -1 ;+[80782] -1 x318 -1 x275 >= -1 ;+[80782] -1 x280 -1 x275 >= -1 ;+[80782] -1 x293 -1 x275 >= -1 ;+[80782] -1 x301 -1 x275 >= -1 ;+[80782] -1 x309 -1 x275 >= -1 ;+[80782] -1 x325 -1 x275 >= -1 ;+[80782] -1 x317 -1 x275 >= -1 ;+[80782] -1 x288 -1 x275 >= -1 ;+[80782] -1 x300 -1 x275 >= -1 ;+[80782] -1 x308 -1 x275 >= -1 ;+[80782] -1 x324 -1 x275 >= -1 ;+[80782] -1 x316 -1 x275 >= -1 ;+[80782] -1 x285 -1 x275 >= -1 ;+[80782] -1 x296 -1 x275 >= -1 ;+[80782] -1 x307 -1 x275 >= -1 ;+[80782] -1 x323 -1 x275 >= -1 ;+[80782] -1 x315 -1 x275 >= -1 ;+[80782] -1 x292 -1 x275 >= -1 ;+[80782] -1 x284 -1 x275 >= -1 ;+[80782] -1 x304 -1 x275 >= -1 ;+[80782] -1 x322 -1 x275 >= -1 ;+[80782] -1 x314 -1 x275 >= -1 ;+[80782] -1 x299 -1 x275 >= -1 ;+[80782] -1 x291 -1 x275 >= -1 ;+[80782] -1 x283 -1 x275 >= -1 ;+[80782] -1 x320 -1 x312 >= -1 ;+[80782] -1 x305 -1 x312 >= -1 ;+[80782] -1 x297 -1 x312 >= -1 ;+[80782] -1 x289 -1 x312 >= -1 ;+[80782] -1 x281 -1 x312 >= -1 ;+[80782] -1 x273 -1 x312 >= -1 ;+[80782] -1 x272 -1 x312 >= -1 ;+[80782] -1 x286 -1 x312 >= -1 ;+[80782] -1 x294 -1 x312 >= -1 ;+[80782] -1 x302 -1 x312 >= -1 ;+[80782] -1 x310 -1 x312 >= -1 ;+[80782] -1 x326 -1 x312 >= -1 ;+[80782] -1 x280 -1 x312 >= -1 ;+[80782] -1 x293 -1 x312 >= -1 ;+[80782] -1 x301 -1 x312 >= -1 ;+[80782] -1 x309 -1 x312 >= -1 ;+[80782] -1 x325 -1 x312 >= -1 ;+[80782] -1 x278 -1 x312 >= -1 ;+[80782] -1 x288 -1 x312 >= -1 ;+[80782] -1 x300 -1 x312 >= -1 ;+[80782] -1 x308 -1 x312 >= -1 ;+[80782] -1 x324 -1 x312 >= -1 ;+[80782] -1 x285 -1 x312 >= -1 ;+[80782] -1 x277 -1 x312 >= -1 ;+[80782] -1 x296 -1 x312 >= -1 ;+[80782] -1 x307 -1 x312 >= -1 ;+[80782] -1 x323 -1 x312 >= -1 ;+[80782] -1 x292 -1 x312 >= -1 ;+[80782] -1 x284 -1 x312 >= -1 ;+[80782] -1 x276 -1 x312 >= -1 ;+[80782] -1 x304 -1 x312 >= -1 ;+[80782] -1 x322 -1 x312 >= -1 ;+[80782] -1 x299 -1 x312 >= -1 ;+[80782] -1 x291 -1 x312 >= -1 ;+[80782] -1 x283 -1 x312 >= -1 ;+[80782] -1 x275 -1 x312 >= -1 ;+[80782] -1 x313 -1 x321 >= -1 ;+[80782] -1 x305 -1 x321 >= -1 ;+[80782] -1 x297 -1 x321 >= -1 ;+[80782] -1 x289 -1 x321 >= -1 ;+[80782] -1 x281 -1 x321 >= -1 ;+[80782] -1 x273 -1 x321 >= -1 ;+[80782] -1 x272 -1 x321 >= -1 ;+[80782] -1 x286 -1 x321 >= -1 ;+[80782] -1 x294 -1 x321 >= -1 ;+[80782] -1 x302 -1 x321 >= -1 ;+[80782] -1 x310 -1 x321 >= -1 ;+[80782] -1 x318 -1 x321 >= -1 ;+[80782] -1 x280 -1 x321 >= -1 ;+[80782] -1 x293 -1 x321 >= -1 ;+[80782] -1 x301 -1 x321 >= -1 ;+[80782] -1 x309 -1 x321 >= -1 ;+[80782] -1 x317 -1 x321 >= -1 ;+[80782] -1 x278 -1 x321 >= -1 ;+[80782] -1 x288 -1 x321 >= -1 ;+[80782] -1 x300 -1 x321 >= -1 ;+[80782] -1 x308 -1 x321 >= -1 ;+[80782] -1 x316 -1 x321 >= -1 ;+[80782] -1 x285 -1 x321 >= -1 ;+[80782] -1 x277 -1 x321 >= -1 ;+[80782] -1 x296 -1 x321 >= -1 ;+[80782] -1 x307 -1 x321 >= -1 ;+[80782] -1 x315 -1 x321 >= -1 ;+[80782] -1 x292 -1 x321 >= -1 ;+[80782] -1 x284 -1 x321 >= -1 ;+[80782] -1 x276 -1 x321 >= -1 ;+[80782] -1 x304 -1 x321 >= -1 ;+[80782] -1 x314 -1 x321 >= -1 ;+[80782] -1 x299 -1 x321 >= -1 ;+[80782] -1 x291 -1 x321 >= -1 ;+[80782] -1 x283 -1 x321 >= -1 ;+[80782] -1 x275 -1 x321 >= -1 ;+[80782] -1 x312 -1 x321 >= -1 ;+[80782] -1 x320 -1 x306 >= -1 ;+[80782] -1 x313 -1 x306 >= -1 ;+[80782] -1 x297 -1 x306 >= -1 ;+[80782] -1 x289 -1 x306 >= -1 ;+[80782] -1 x281 -1 x306 >= -1 ;+[80782] -1 x273 -1 x306 >= -1 ;+[80782] -1 x272 -1 x306 >= -1 ;+[80782] -1 x286 -1 x306 >= -1 ;+[80782] -1 x294 -1 x306 >= -1 ;+[80782] -1 x302 -1 x306 >= -1 ;+[80782] -1 x326 -1 x306 >= -1 ;+[80782] -1 x318 -1 x306 >= -1 ;+[80782] -1 x280 -1 x306 >= -1 ;+[80782] -1 x293 -1 x306 >= -1 ;+[80782] -1 x301 -1 x306 >= -1 ;+[80782] -1 x325 -1 x306 >= -1 ;+[80782] -1 x317 -1 x306 >= -1 ;+[80782] -1 x278 -1 x306 >= -1 ;+[80782] -1 x288 -1 x306 >= -1 ;+[80782] -1 x300 -1 x306 >= -1 ;+[80782] -1 x324 -1 x306 >= -1 ;+[80782] -1 x316 -1 x306 >= -1 ;+[80782] -1 x285 -1 x306 >= -1 ;+[80782] -1 x277 -1 x306 >= -1 ;+[80782] -1 x296 -1 x306 >= -1 ;+[80782] -1 x323 -1 x306 >= -1 ;+[80782] -1 x315 -1 x306 >= -1 ;+[80782] -1 x292 -1 x306 >= -1 ;+[80782] -1 x284 -1 x306 >= -1 ;+[80782] -1 x276 -1 x306 >= -1 ;+[80782] -1 x322 -1 x306 >= -1 ;+[80782] -1 x314 -1 x306 >= -1 ;+[80782] -1 x299 -1 x306 >= -1 ;+[80782] -1 x291 -1 x306 >= -1 ;+[80782] -1 x283 -1 x306 >= -1 ;+[80782] -1 x275 -1 x306 >= -1 ;+[80782] -1 x312 -1 x306 >= -1 ;+[80782] -1 x321 -1 x306 >= -1 ;+[80782] -1 x320 -1 x298 >= -1 ;+[80782] -1 x313 -1 x298 >= -1 ;+[80782] -1 x305 -1 x298 >= -1 ;+[80782] -1 x289 -1 x298 >= -1 ;+[80782] -1 x281 -1 x298 >= -1 ;+[80782] -1 x273 -1 x298 >= -1 ;+[80782] -1 x272 -1 x298 >= -1 ;+[80782] -1 x286 -1 x298 >= -1 ;+[80782] -1 x294 -1 x298 >= -1 ;+[80782] -1 x310 -1 x298 >= -1 ;+[80782] -1 x326 -1 x298 >= -1 ;+[80782] -1 x318 -1 x298 >= -1 ;+[80782] -1 x280 -1 x298 >= -1 ;+[80782] -1 x293 -1 x298 >= -1 ;+[80782] -1 x309 -1 x298 >= -1 ;+[80782] -1 x325 -1 x298 >= -1 ;+[80782] -1 x317 -1 x298 >= -1 ;+[80782] -1 x278 -1 x298 >= -1 ;+[80782] -1 x288 -1 x298 >= -1 ;+[80782] -1 x308 -1 x298 >= -1 ;+[80782] -1 x324 -1 x298 >= -1 ;+[80782] -1 x316 -1 x298 >= -1 ;+[80782] -1 x285 -1 x298 >= -1 ;+[80782] -1 x277 -1 x298 >= -1 ;+[80782] -1 x307 -1 x298 >= -1 ;+[80782] -1 x323 -1 x298 >= -1 ;+[80782] -1 x315 -1 x298 >= -1 ;+[80782] -1 x292 -1 x298 >= -1 ;+[80782] -1 x284 -1 x298 >= -1 ;+[80782] -1 x276 -1 x298 >= -1 ;+[80782] -1 x304 -1 x298 >= -1 ;+[80782] -1 x322 -1 x298 >= -1 ;+[80782] -1 x314 -1 x298 >= -1 ;+[80782] -1 x291 -1 x298 >= -1 ;+[80782] -1 x283 -1 x298 >= -1 ;+[80782] -1 x275 -1 x298 >= -1 ;+[80782] -1 x312 -1 x298 >= -1 ;+[80782] -1 x321 -1 x298 >= -1 ;+[80782] -1 x306 -1 x298 >= -1 ;+[80782] -1 x320 -1 x290 >= -1 ;+[80782] -1 x313 -1 x290 >= -1 ;+[80782] -1 x305 -1 x290 >= -1 ;+[80782] -1 x297 -1 x290 >= -1 ;+[80782] -1 x281 -1 x290 >= -1 ;+[80782] -1 x273 -1 x290 >= -1 ;+[80782] -1 x272 -1 x290 >= -1 ;+[80782] -1 x286 -1 x290 >= -1 ;+[80782] -1 x302 -1 x290 >= -1 ;+[80782] -1 x310 -1 x290 >= -1 ;+[80782] -1 x326 -1 x290 >= -1 ;+[80782] -1 x318 -1 x290 >= -1 ;+[80782] -1 x280 -1 x290 >= -1 ;+[80782] -1 x301 -1 x290 >= -1 ;+[80782] -1 x309 -1 x290 >= -1 ;+[80782] -1 x325 -1 x290 >= -1 ;+[80782] -1 x317 -1 x290 >= -1 ;+[80782] -1 x278 -1 x290 >= -1 ;+[80782] -1 x300 -1 x290 >= -1 ;+[80782] -1 x308 -1 x290 >= -1 ;+[80782] -1 x324 -1 x290 >= -1 ;+[80782] -1 x316 -1 x290 >= -1 ;+[80782] -1 x285 -1 x290 >= -1 ;+[80782] -1 x277 -1 x290 >= -1 ;+[80782] -1 x296 -1 x290 >= -1 ;+[80782] -1 x307 -1 x290 >= -1 ;+[80782] -1 x323 -1 x290 >= -1 ;+[80782] -1 x315 -1 x290 >= -1 ;+[80782] -1 x284 -1 x290 >= -1 ;+[80782] -1 x276 -1 x290 >= -1 ;+[80782] -1 x304 -1 x290 >= -1 ;+[80782] -1 x322 -1 x290 >= -1 ;+[80782] -1 x314 -1 x290 >= -1 ;+[80782] -1 x299 -1 x290 >= -1 ;+[80782] -1 x283 -1 x290 >= -1 ;+[80782] -1 x275 -1 x290 >= -1 ;+[80782] -1 x312 -1 x290 >= -1 ;+[80782] -1 x321 -1 x290 >= -1 ;+[80782] -1 x306 -1 x290 >= -1 ;+[80782] -1 x298 -1 x290 >= -1 ;+[80782] -1 x320 -1 x282 >= -1 ;+[80782] -1 x313 -1 x282 >= -1 ;+[80782] -1 x305 -1 x282 >= -1 ;+[80782] -1 x297 -1 x282 >= -1 ;+[80782] -1 x289 -1 x282 >= -1 ;+[80782] -1 x273 -1 x282 >= -1 ;+[80782] -1 x272 -1 x282 >= -1 ;+[80782] -1 x294 -1 x282 >= -1 ;+[80782] -1 x302 -1 x282 >= -1 ;+[80782] -1 x310 -1 x282 >= -1 ;+[80782] -1 x326 -1 x282 >= -1 ;+[80782] -1 x318 -1 x282 >= -1 ;+[80782] -1 x293 -1 x282 >= -1 ;+[80782] -1 x301 -1 x282 >= -1 ;+[80782] -1 x309 -1 x282 >= -1 ;+[80782] -1 x325 -1 x282 >= -1 ;+[80782] -1 x317 -1 x282 >= -1 ;+[80782] -1 x278 -1 x282 >= -1 ;+[80782] -1 x288 -1 x282 >= -1 ;+[80782] -1 x300 -1 x282 >= -1 ;+[80782] -1 x308 -1 x282 >= -1 ;+[80782] -1 x324 -1 x282 >= -1 ;+[80782] -1 x316 -1 x282 >= -1 ;+[80782] -1 x277 -1 x282 >= -1 ;+[80782] -1 x296 -1 x282 >= -1 ;+[80782] -1 x307 -1 x282 >= -1 ;+[80782] -1 x323 -1 x282 >= -1 ;+[80782] -1 x315 -1 x282 >= -1 ;+[80782] -1 x292 -1 x282 >= -1 ;+[80782] -1 x276 -1 x282 >= -1 ;+[80782] -1 x304 -1 x282 >= -1 ;+[80782] -1 x322 -1 x282 >= -1 ;+[80782] -1 x314 -1 x282 >= -1 ;+[80782] -1 x299 -1 x282 >= -1 ;+[80782] -1 x291 -1 x282 >= -1 ;+[80782] -1 x275 -1 x282 >= -1 ;+[80782] -1 x312 -1 x282 >= -1 ;+[80782] -1 x321 -1 x282 >= -1 ;+[80782] -1 x306 -1 x282 >= -1 ;+[80782] -1 x298 -1 x282 >= -1 ;+[80782] -1 x290 -1 x282 >= -1 ;+[80782] -1 x320 -1 x274 >= -1 ;+[80782] -1 x313 -1 x274 >= -1 ;+[80782] -1 x305 -1 x274 >= -1 ;+[80782] -1 x297 -1 x274 >= -1 ;+[80782] -1 x289 -1 x274 >= -1 ;+[80782] -1 x281 -1 x274 >= -1 ;+[80782] -1 x286 -1 x274 >= -1 ;+[80782] -1 x294 -1 x274 >= -1 ;+[80782] -1 x302 -1 x274 >= -1 ;+[80782] -1 x310 -1 x274 >= -1 ;+[80782] -1 x326 -1 x274 >= -1 ;+[80782] -1 x318 -1 x274 >= -1 ;+[80782] -1 x280 -1 x274 >= -1 ;+[80782] -1 x293 -1 x274 >= -1 ;+[80782] -1 x301 -1 x274 >= -1 ;+[80782] -1 x309 -1 x274 >= -1 ;+[80782] -1 x325 -1 x274 >= -1 ;+[80782] -1 x317 -1 x274 >= -1 ;+[80782] -1 x288 -1 x274 >= -1 ;+[80782] -1 x300 -1 x274 >= -1 ;+[80782] -1 x308 -1 x274 >= -1 ;+[80782] -1 x324 -1 x274 >= -1 ;+[80782] -1 x316 -1 x274 >= -1 ;+[80782] -1 x285 -1 x274 >= -1 ;+[80782] -1 x296 -1 x274 >= -1 ;+[80782] -1 x307 -1 x274 >= -1 ;+[80782] -1 x323 -1 x274 >= -1 ;+[80782] -1 x315 -1 x274 >= -1 ;+[80782] -1 x292 -1 x274 >= -1 ;+[80782] -1 x284 -1 x274 >= -1 ;+[80782] -1 x304 -1 x274 >= -1 ;+[80782] -1 x322 -1 x274 >= -1 ;+[80782] -1 x314 -1 x274 >= -1 ;+[80782] -1 x299 -1 x274 >= -1 ;+[80782] -1 x291 -1 x274 >= -1 ;+[80782] -1 x283 -1 x274 >= -1 ;+[80782] -1 x312 -1 x274 >= -1 ;+[80782] -1 x321 -1 x274 >= -1 ;+[80782] -1 x306 -1 x274 >= -1 ;+[80782] -1 x298 -1 x274 >= -1 ;+[80782] -1 x290 -1 x274 >= -1 ;+[80782] -1 x282 -1 x274 >= -1 ;+[80782] -1 x320 -1 x267 >= -1 ;+[80782] -1 x313 -1 x267 >= -1 ;+[80782] -1 x305 -1 x267 >= -1 ;+[80782] -1 x297 -1 x267 >= -1 ;+[80782] -1 x289 -1 x267 >= -1 ;+[80782] -1 x281 -1 x267 >= -1 ;+[80782] -1 x273 -1 x267 >= -1 ;+[80782] -1 x328 -1 x267 >= -1 ;+[80782] -1 x270 -1 x267 >= -1 ;+[80782] -1 x329 -1 x267 >= -1 ;+[80782] -1 x272 -1 x267 >= -1 ;+[80782] -1 x286 -1 x267 >= -1 ;+[80782] -1 x294 -1 x267 >= -1 ;+[80782] -1 x302 -1 x267 >= -1 ;+[80782] -1 x310 -1 x267 >= -1 ;+[80782] -1 x326 -1 x267 >= -1 ;+[80782] -1 x318 -1 x267 >= -1 ;+[80782] -1 x280 -1 x267 >= -1 ;+[80782] -1 x293 -1 x267 >= -1 ;+[80782] -1 x301 -1 x267 >= -1 ;+[80782] -1 x309 -1 x267 >= -1 ;+[80782] -1 x325 -1 x267 >= -1 ;+[80782] -1 x317 -1 x267 >= -1 ;+[80782] -1 x278 -1 x267 >= -1 ;+[80782] -1 x288 -1 x267 >= -1 ;+[80782] -1 x300 -1 x267 >= -1 ;+[80782] -1 x308 -1 x267 >= -1 ;+[80782] -1 x324 -1 x267 >= -1 ;+[80782] -1 x316 -1 x267 >= -1 ;+[80782] -1 x285 -1 x267 >= -1 ;+[80782] -1 x277 -1 x267 >= -1 ;+[80782] -1 x296 -1 x267 >= -1 ;+[80782] -1 x307 -1 x267 >= -1 ;+[80782] -1 x323 -1 x267 >= -1 ;+[80782] -1 x315 -1 x267 >= -1 ;+[80782] -1 x292 -1 x267 >= -1 ;+[80782] -1 x284 -1 x267 >= -1 ;+[80782] -1 x276 -1 x267 >= -1 ;+[80782] -1 x304 -1 x267 >= -1 ;+[80782] -1 x322 -1 x267 >= -1 ;+[80782] -1 x314 -1 x267 >= -1 ;+[80782] -1 x299 -1 x267 >= -1 ;+[80782] -1 x291 -1 x267 >= -1 ;+[80782] -1 x283 -1 x267 >= -1 ;+[80782] -1 x275 -1 x267 >= -1 ;+[80782] -1 x321 -1 x267 >= -1 ;+[80782] -1 x306 -1 x267 >= -1 ;+[80782] -1 x298 -1 x267 >= -1 ;+[80782] -1 x290 -1 x267 >= -1 ;+[80782] -1 x282 -1 x267 >= -1 ;+[80782] -1 x274 -1 x267 >= -1 ;+[80782] -1 x320 -1 x266 >= -1 ;+[80782] -1 x313 -1 x266 >= -1 ;+[80782] -1 x305 -1 x266 >= -1 ;+[80782] -1 x297 -1 x266 >= -1 ;+[80782] -1 x289 -1 x266 >= -1 ;+[80782] -1 x281 -1 x266 >= -1 ;+[80782] -1 x273 -1 x266 >= -1 ;+[80782] -1 x328 -1 x266 >= -1 ;+[80782] -1 x270 -1 x266 >= -1 ;+[80782] -1 x272 -1 x266 >= -1 ;+[80782] -1 x286 -1 x266 >= -1 ;+[80782] -1 x294 -1 x266 >= -1 ;+[80782] -1 x302 -1 x266 >= -1 ;+[80782] -1 x310 -1 x266 >= -1 ;+[80782] -1 x326 -1 x266 >= -1 ;+[80782] -1 x318 -1 x266 >= -1 ;+[80782] -1 x280 -1 x266 >= -1 ;+[80782] -1 x293 -1 x266 >= -1 ;+[80782] -1 x301 -1 x266 >= -1 ;+[80782] -1 x309 -1 x266 >= -1 ;+[80782] -1 x325 -1 x266 >= -1 ;+[80782] -1 x317 -1 x266 >= -1 ;+[80782] -1 x278 -1 x266 >= -1 ;+[80782] -1 x288 -1 x266 >= -1 ;+[80782] -1 x300 -1 x266 >= -1 ;+[80782] -1 x308 -1 x266 >= -1 ;+[80782] -1 x324 -1 x266 >= -1 ;+[80782] -1 x316 -1 x266 >= -1 ;+[80782] -1 x285 -1 x266 >= -1 ;+[80782] -1 x277 -1 x266 >= -1 ;+[80782] -1 x296 -1 x266 >= -1 ;+[80782] -1 x307 -1 x266 >= -1 ;+[80782] -1 x323 -1 x266 >= -1 ;+[80782] -1 x315 -1 x266 >= -1 ;+[80782] -1 x292 -1 x266 >= -1 ;+[80782] -1 x284 -1 x266 >= -1 ;+[80782] -1 x276 -1 x266 >= -1 ;+[80782] -1 x304 -1 x266 >= -1 ;+[80782] -1 x322 -1 x266 >= -1 ;+[80782] -1 x314 -1 x266 >= -1 ;+[80782] -1 x299 -1 x266 >= -1 ;+[80782] -1 x291 -1 x266 >= -1 ;+[80782] -1 x283 -1 x266 >= -1 ;+[80782] -1 x275 -1 x266 >= -1 ;+[80782] -1 x338 -1 x331 >= -1 ;+[80782] -1 x346 -1 x331 >= -1 ;+[80782] -1 x354 -1 x331 >= -1 ;+[80782] -1 x362 -1 x331 >= -1 ;+[80782] -1 x370 -1 x331 >= -1 ;+[80782] -1 x385 -1 x331 >= -1 ;+[80782] -1 x339 -1 x331 >= -1 ;+[80782] -1 x347 -1 x331 >= -1 ;+[80782] -1 x355 -1 x331 >= -1 ;+[80782] -1 x363 -1 x331 >= -1 ;+[80782] -1 x378 -1 x331 >= -1 ;+[80782] -1 x386 -1 x331 >= -1 ;+[80782] -1 x368 -1 x331 >= -1 ;+[80782] -1 x340 -1 x331 >= -1 ;+[80782] -1 x348 -1 x331 >= -1 ;+[80782] -1 x356 -1 x331 >= -1 ;+[80782] -1 x379 -1 x331 >= -1 ;+[80782] -1 x387 -1 x331 >= -1 ;+[80782] -1 x371 -1 x331 >= -1 ;+[80782] -1 x360 -1 x331 >= -1 ;+[80782] -1 x341 -1 x331 >= -1 ;+[80782] -1 x349 -1 x331 >= -1 ;+[80782] -1 x380 -1 x331 >= -1 ;+[80782] -1 x388 -1 x331 >= -1 ;+[80782] -1 x372 -1 x331 >= -1 ;+[80782] -1 x364 -1 x331 >= -1 ;+[80782] -1 x352 -1 x331 >= -1 ;+[80782] -1 x342 -1 x331 >= -1 ;+[80782] -1 x381 -1 x331 >= -1 ;+[80782] -1 x389 -1 x331 >= -1 ;+[80782] -1 x373 -1 x331 >= -1 ;+[80782] -1 x365 -1 x331 >= -1 ;+[80782] -1 x357 -1 x331 >= -1 ;+[80782] -1 x344 -1 x331 >= -1 ;+[80782] -1 x382 -1 x331 >= -1 ;+[80782] -1 x390 -1 x331 >= -1 ;+[80782] -1 x374 -1 x331 >= -1 ;+[80782] -1 x366 -1 x331 >= -1 ;+[80782] -1 x358 -1 x331 >= -1 ;+[80782] -1 x350 -1 x331 >= -1 ;+[80782] -1 x336 -1 x331 >= -1 ;+[80782] -1 x393 -1 x331 >= -1 ;+[80782] -1 x334 -1 x331 >= -1 ;+[80782] -1 x392 -1 x331 >= -1 ;+[80782] -1 x337 -1 x331 >= -1 ;+[80782] -1 x345 -1 x331 >= -1 ;+[80782] -1 x353 -1 x331 >= -1 ;+[80782] -1 x361 -1 x331 >= -1 ;+[80782] -1 x369 -1 x331 >= -1 ;+[80782] -1 x377 -1 x331 >= -1 ;+[80782] -1 x384 -1 x331 >= -1 ;+[80782] -1 x346 -1 x338 >= -1 ;+[80782] -1 x354 -1 x338 >= -1 ;+[80782] -1 x362 -1 x338 >= -1 ;+[80782] -1 x370 -1 x338 >= -1 ;+[80782] -1 x385 -1 x338 >= -1 ;+[80782] -1 x376 -1 x338 >= -1 ;+[80782] -1 x347 -1 x338 >= -1 ;+[80782] -1 x355 -1 x338 >= -1 ;+[80782] -1 x363 -1 x338 >= -1 ;+[80782] -1 x378 -1 x338 >= -1 ;+[80782] -1 x386 -1 x338 >= -1 ;+[80782] -1 x368 -1 x338 >= -1 ;+[80782] -1 x348 -1 x338 >= -1 ;+[80782] -1 x356 -1 x338 >= -1 ;+[80782] -1 x379 -1 x338 >= -1 ;+[80782] -1 x387 -1 x338 >= -1 ;+[80782] -1 x371 -1 x338 >= -1 ;+[80782] -1 x360 -1 x338 >= -1 ;+[80782] -1 x349 -1 x338 >= -1 ;+[80782] -1 x380 -1 x338 >= -1 ;+[80782] -1 x388 -1 x338 >= -1 ;+[80782] -1 x372 -1 x338 >= -1 ;+[80782] -1 x364 -1 x338 >= -1 ;+[80782] -1 x352 -1 x338 >= -1 ;+[80782] -1 x381 -1 x338 >= -1 ;+[80782] -1 x389 -1 x338 >= -1 ;+[80782] -1 x373 -1 x338 >= -1 ;+[80782] -1 x365 -1 x338 >= -1 ;+[80782] -1 x357 -1 x338 >= -1 ;+[80782] -1 x344 -1 x338 >= -1 ;+[80782] -1 x382 -1 x338 >= -1 ;+[80782] -1 x390 -1 x338 >= -1 ;+[80782] -1 x374 -1 x338 >= -1 ;+[80782] -1 x366 -1 x338 >= -1 ;+[80782] -1 x358 -1 x338 >= -1 ;+[80782] -1 x350 -1 x338 >= -1 ;+[80782] -1 x345 -1 x338 >= -1 ;+[80782] -1 x353 -1 x338 >= -1 ;+[80782] -1 x361 -1 x338 >= -1 ;+[80782] -1 x369 -1 x338 >= -1 ;+[80782] -1 x377 -1 x338 >= -1 ;+[80782] -1 x384 -1 x338 >= -1 ;+[80782] -1 x354 -1 x346 >= -1 ;+[80782] -1 x362 -1 x346 >= -1 ;+[80782] -1 x370 -1 x346 >= -1 ;+[80782] -1 x385 -1 x346 >= -1 ;+[80782] -1 x376 -1 x346 >= -1 ;+[80782] -1 x339 -1 x346 >= -1 ;+[80782] -1 x355 -1 x346 >= -1 ;+[80782] -1 x363 -1 x346 >= -1 ;+[80782] -1 x378 -1 x346 >= -1 ;+[80782] -1 x386 -1 x346 >= -1 ;+[80782] -1 x368 -1 x346 >= -1 ;+[80782] -1 x340 -1 x346 >= -1 ;+[80782] -1 x356 -1 x346 >= -1 ;+[80782] -1 x379 -1 x346 >= -1 ;+[80782] -1 x387 -1 x346 >= -1 ;+[80782] -1 x371 -1 x346 >= -1 ;+[80782] -1 x360 -1 x346 >= -1 ;+[80782] -1 x341 -1 x346 >= -1 ;+[80782] -1 x380 -1 x346 >= -1 ;+[80782] -1 x388 -1 x346 >= -1 ;+[80782] -1 x372 -1 x346 >= -1 ;+[80782] -1 x364 -1 x346 >= -1 ;+[80782] -1 x352 -1 x346 >= -1 ;+[80782] -1 x342 -1 x346 >= -1 ;+[80782] -1 x381 -1 x346 >= -1 ;+[80782] -1 x389 -1 x346 >= -1 ;+[80782] -1 x373 -1 x346 >= -1 ;+[80782] -1 x365 -1 x346 >= -1 ;+[80782] -1 x357 -1 x346 >= -1 ;+[80782] -1 x382 -1 x346 >= -1 ;+[80782] -1 x390 -1 x346 >= -1 ;+[80782] -1 x374 -1 x346 >= -1 ;+[80782] -1 x366 -1 x346 >= -1 ;+[80782] -1 x358 -1 x346 >= -1 ;+[80782] -1 x336 -1 x346 >= -1 ;+[80782] -1 x337 -1 x346 >= -1 ;+[80782] -1 x353 -1 x346 >= -1 ;+[80782] -1 x361 -1 x346 >= -1 ;+[80782] -1 x369 -1 x346 >= -1 ;+[80782] -1 x377 -1 x346 >= -1 ;+[80782] -1 x384 -1 x346 >= -1 ;+[80782] -1 x362 -1 x354 >= -1 ;+[80782] -1 x370 -1 x354 >= -1 ;+[80782] -1 x385 -1 x354 >= -1 ;+[80782] -1 x376 -1 x354 >= -1 ;+[80782] -1 x339 -1 x354 >= -1 ;+[80782] -1 x347 -1 x354 >= -1 ;+[80782] -1 x363 -1 x354 >= -1 ;+[80782] -1 x378 -1 x354 >= -1 ;+[80782] -1 x386 -1 x354 >= -1 ;+[80782] -1 x368 -1 x354 >= -1 ;+[80782] -1 x340 -1 x354 >= -1 ;+[80782] -1 x348 -1 x354 >= -1 ;+[80782] -1 x379 -1 x354 >= -1 ;+[80782] -1 x387 -1 x354 >= -1 ;+[80782] -1 x371 -1 x354 >= -1 ;+[80782] -1 x360 -1 x354 >= -1 ;+[80782] -1 x341 -1 x354 >= -1 ;+[80782] -1 x349 -1 x354 >= -1 ;+[80782] -1 x380 -1 x354 >= -1 ;+[80782] -1 x388 -1 x354 >= -1 ;+[80782] -1 x372 -1 x354 >= -1 ;+[80782] -1 x364 -1 x354 >= -1 ;+[80782] -1 x342 -1 x354 >= -1 ;+[80782] -1 x381 -1 x354 >= -1 ;+[80782] -1 x389 -1 x354 >= -1 ;+[80782] -1 x373 -1 x354 >= -1 ;+[80782] -1 x365 -1 x354 >= -1 ;+[80782] -1 x344 -1 x354 >= -1 ;+[80782] -1 x382 -1 x354 >= -1 ;+[80782] -1 x390 -1 x354 >= -1 ;+[80782] -1 x374 -1 x354 >= -1 ;+[80782] -1 x366 -1 x354 >= -1 ;+[80782] -1 x350 -1 x354 >= -1 ;+[80782] -1 x336 -1 x354 >= -1 ;+[80782] -1 x337 -1 x354 >= -1 ;+[80782] -1 x345 -1 x354 >= -1 ;+[80782] -1 x361 -1 x354 >= -1 ;+[80782] -1 x369 -1 x354 >= -1 ;+[80782] -1 x377 -1 x354 >= -1 ;+[80782] -1 x384 -1 x354 >= -1 ;+[80782] -1 x370 -1 x362 >= -1 ;+[80782] -1 x385 -1 x362 >= -1 ;+[80782] -1 x376 -1 x362 >= -1 ;+[80782] -1 x339 -1 x362 >= -1 ;+[80782] -1 x347 -1 x362 >= -1 ;+[80782] -1 x355 -1 x362 >= -1 ;+[80782] -1 x378 -1 x362 >= -1 ;+[80782] -1 x386 -1 x362 >= -1 ;+[80782] -1 x368 -1 x362 >= -1 ;+[80782] -1 x340 -1 x362 >= -1 ;+[80782] -1 x348 -1 x362 >= -1 ;+[80782] -1 x356 -1 x362 >= -1 ;+[80782] -1 x379 -1 x362 >= -1 ;+[80782] -1 x387 -1 x362 >= -1 ;+[80782] -1 x371 -1 x362 >= -1 ;+[80782] -1 x341 -1 x362 >= -1 ;+[80782] -1 x349 -1 x362 >= -1 ;+[80782] -1 x380 -1 x362 >= -1 ;+[80782] -1 x388 -1 x362 >= -1 ;+[80782] -1 x372 -1 x362 >= -1 ;+[80782] -1 x352 -1 x362 >= -1 ;+[80782] -1 x342 -1 x362 >= -1 ;+[80782] -1 x381 -1 x362 >= -1 ;+[80782] -1 x389 -1 x362 >= -1 ;+[80782] -1 x373 -1 x362 >= -1 ;+[80782] -1 x357 -1 x362 >= -1 ;+[80782] -1 x344 -1 x362 >= -1 ;+[80782] -1 x382 -1 x362 >= -1 ;+[80782] -1 x390 -1 x362 >= -1 ;+[80782] -1 x374 -1 x362 >= -1 ;+[80782] -1 x358 -1 x362 >= -1 ;+[80782] -1 x350 -1 x362 >= -1 ;+[80782] -1 x336 -1 x362 >= -1 ;+[80782] -1 x337 -1 x362 >= -1 ;+[80782] -1 x345 -1 x362 >= -1 ;+[80782] -1 x353 -1 x362 >= -1 ;+[80782] -1 x369 -1 x362 >= -1 ;+[80782] -1 x377 -1 x362 >= -1 ;+[80782] -1 x384 -1 x362 >= -1 ;+[80782] -1 x385 -1 x370 >= -1 ;+[80782] -1 x376 -1 x370 >= -1 ;+[80782] -1 x339 -1 x370 >= -1 ;+[80782] -1 x347 -1 x370 >= -1 ;+[80782] -1 x355 -1 x370 >= -1 ;+[80782] -1 x363 -1 x370 >= -1 ;+[80782] -1 x378 -1 x370 >= -1 ;+[80782] -1 x386 -1 x370 >= -1 ;+[80782] -1 x340 -1 x370 >= -1 ;+[80782] -1 x348 -1 x370 >= -1 ;+[80782] -1 x356 -1 x370 >= -1 ;+[80782] -1 x379 -1 x370 >= -1 ;+[80782] -1 x387 -1 x370 >= -1 ;+[80782] -1 x360 -1 x370 >= -1 ;+[80782] -1 x341 -1 x370 >= -1 ;+[80782] -1 x349 -1 x370 >= -1 ;+[80782] -1 x380 -1 x370 >= -1 ;+[80782] -1 x388 -1 x370 >= -1 ;+[80782] -1 x364 -1 x370 >= -1 ;+[80782] -1 x352 -1 x370 >= -1 ;+[80782] -1 x342 -1 x370 >= -1 ;+[80782] -1 x381 -1 x370 >= -1 ;+[80782] -1 x389 -1 x370 >= -1 ;+[80782] -1 x365 -1 x370 >= -1 ;+[80782] -1 x357 -1 x370 >= -1 ;+[80782] -1 x344 -1 x370 >= -1 ;+[80782] -1 x382 -1 x370 >= -1 ;+[80782] -1 x390 -1 x370 >= -1 ;+[80782] -1 x366 -1 x370 >= -1 ;+[80782] -1 x358 -1 x370 >= -1 ;+[80782] -1 x350 -1 x370 >= -1 ;+[80782] -1 x336 -1 x370 >= -1 ;+[80782] -1 x337 -1 x370 >= -1 ;+[80782] -1 x345 -1 x370 >= -1 ;+[80782] -1 x353 -1 x370 >= -1 ;+[80782] -1 x361 -1 x370 >= -1 ;+[80782] -1 x377 -1 x370 >= -1 ;+[80782] -1 x384 -1 x370 >= -1 ;+[80782] -1 x376 -1 x385 >= -1 ;+[80782] -1 x339 -1 x385 >= -1 ;+[80782] -1 x347 -1 x385 >= -1 ;+[80782] -1 x355 -1 x385 >= -1 ;+[80782] -1 x363 -1 x385 >= -1 ;+[80782] -1 x378 -1 x385 >= -1 ;+[80782] -1 x368 -1 x385 >= -1 ;+[80782] -1 x340 -1 x385 >= -1 ;+[80782] -1 x348 -1 x385 >= -1 ;+[80782] -1 x356 -1 x385 >= -1 ;+[80782] -1 x379 -1 x385 >= -1 ;+[80782] -1 x371 -1 x385 >= -1 ;+[80782] -1 x360 -1 x385 >= -1 ;+[80782] -1 x341 -1 x385 >= -1 ;+[80782] -1 x349 -1 x385 >= -1 ;+[80782] -1 x380 -1 x385 >= -1 ;+[80782] -1 x372 -1 x385 >= -1 ;+[80782] -1 x364 -1 x385 >= -1 ;+[80782] -1 x352 -1 x385 >= -1 ;+[80782] -1 x342 -1 x385 >= -1 ;+[80782] -1 x381 -1 x385 >= -1 ;+[80782] -1 x373 -1 x385 >= -1 ;+[80782] -1 x365 -1 x385 >= -1 ;+[80782] -1 x357 -1 x385 >= -1 ;+[80782] -1 x344 -1 x385 >= -1 ;+[80782] -1 x382 -1 x385 >= -1 ;+[80782] -1 x374 -1 x385 >= -1 ;+[80782] -1 x366 -1 x385 >= -1 ;+[80782] -1 x358 -1 x385 >= -1 ;+[80782] -1 x350 -1 x385 >= -1 ;+[80782] -1 x336 -1 x385 >= -1 ;+[80782] -1 x337 -1 x385 >= -1 ;+[80782] -1 x345 -1 x385 >= -1 ;+[80782] -1 x353 -1 x385 >= -1 ;+[80782] -1 x361 -1 x385 >= -1 ;+[80782] -1 x369 -1 x385 >= -1 ;+[80782] -1 x377 -1 x385 >= -1 ;+[80782] -1 x339 -1 x376 >= -1 ;+[80782] -1 x347 -1 x376 >= -1 ;+[80782] -1 x355 -1 x376 >= -1 ;+[80782] -1 x363 -1 x376 >= -1 ;+[80782] -1 x386 -1 x376 >= -1 ;+[80782] -1 x368 -1 x376 >= -1 ;+[80782] -1 x340 -1 x376 >= -1 ;+[80782] -1 x348 -1 x376 >= -1 ;+[80782] -1 x356 -1 x376 >= -1 ;+[80782] -1 x387 -1 x376 >= -1 ;+[80782] -1 x371 -1 x376 >= -1 ;+[80782] -1 x360 -1 x376 >= -1 ;+[80782] -1 x341 -1 x376 >= -1 ;+[80782] -1 x349 -1 x376 >= -1 ;+[80782] -1 x388 -1 x376 >= -1 ;+[80782] -1 x372 -1 x376 >= -1 ;+[80782] -1 x364 -1 x376 >= -1 ;+[80782] -1 x352 -1 x376 >= -1 ;+[80782] -1 x342 -1 x376 >= -1 ;+[80782] -1 x389 -1 x376 >= -1 ;+[80782] -1 x373 -1 x376 >= -1 ;+[80782] -1 x365 -1 x376 >= -1 ;+[80782] -1 x357 -1 x376 >= -1 ;+[80782] -1 x344 -1 x376 >= -1 ;+[80782] -1 x390 -1 x376 >= -1 ;+[80782] -1 x374 -1 x376 >= -1 ;+[80782] -1 x366 -1 x376 >= -1 ;+[80782] -1 x358 -1 x376 >= -1 ;+[80782] -1 x350 -1 x376 >= -1 ;+[80782] -1 x336 -1 x376 >= -1 ;+[80782] -1 x337 -1 x376 >= -1 ;+[80782] -1 x345 -1 x376 >= -1 ;+[80782] -1 x353 -1 x376 >= -1 ;+[80782] -1 x361 -1 x376 >= -1 ;+[80782] -1 x369 -1 x376 >= -1 ;+[80782] -1 x384 -1 x376 >= -1 ;+[80782] -1 x347 -1 x339 >= -1 ;+[80782] -1 x355 -1 x339 >= -1 ;+[80782] -1 x363 -1 x339 >= -1 ;+[80782] -1 x378 -1 x339 >= -1 ;+[80782] -1 x386 -1 x339 >= -1 ;+[80782] -1 x368 -1 x339 >= -1 ;+[80782] -1 x348 -1 x339 >= -1 ;+[80782] -1 x356 -1 x339 >= -1 ;+[80782] -1 x379 -1 x339 >= -1 ;+[80782] -1 x387 -1 x339 >= -1 ;+[80782] -1 x371 -1 x339 >= -1 ;+[80782] -1 x360 -1 x339 >= -1 ;+[80782] -1 x349 -1 x339 >= -1 ;+[80782] -1 x380 -1 x339 >= -1 ;+[80782] -1 x388 -1 x339 >= -1 ;+[80782] -1 x372 -1 x339 >= -1 ;+[80782] -1 x364 -1 x339 >= -1 ;+[80782] -1 x352 -1 x339 >= -1 ;+[80782] -1 x381 -1 x339 >= -1 ;+[80782] -1 x389 -1 x339 >= -1 ;+[80782] -1 x373 -1 x339 >= -1 ;+[80782] -1 x365 -1 x339 >= -1 ;+[80782] -1 x357 -1 x339 >= -1 ;+[80782] -1 x344 -1 x339 >= -1 ;+[80782] -1 x382 -1 x339 >= -1 ;+[80782] -1 x390 -1 x339 >= -1 ;+[80782] -1 x374 -1 x339 >= -1 ;+[80782] -1 x366 -1 x339 >= -1 ;+[80782] -1 x358 -1 x339 >= -1 ;+[80782] -1 x350 -1 x339 >= -1 ;+[80782] -1 x345 -1 x339 >= -1 ;+[80782] -1 x353 -1 x339 >= -1 ;+[80782] -1 x361 -1 x339 >= -1 ;+[80782] -1 x369 -1 x339 >= -1 ;+[80782] -1 x377 -1 x339 >= -1 ;+[80782] -1 x384 -1 x339 >= -1 ;+[80782] -1 x355 -1 x347 >= -1 ;+[80782] -1 x363 -1 x347 >= -1 ;+[80782] -1 x378 -1 x347 >= -1 ;+[80782] -1 x386 -1 x347 >= -1 ;+[80782] -1 x368 -1 x347 >= -1 ;+[80782] -1 x340 -1 x347 >= -1 ;+[80782] -1 x356 -1 x347 >= -1 ;+[80782] -1 x379 -1 x347 >= -1 ;+[80782] -1 x387 -1 x347 >= -1 ;+[80782] -1 x371 -1 x347 >= -1 ;+[80782] -1 x360 -1 x347 >= -1 ;+[80782] -1 x341 -1 x347 >= -1 ;+[80782] -1 x380 -1 x347 >= -1 ;+[80782] -1 x388 -1 x347 >= -1 ;+[80782] -1 x372 -1 x347 >= -1 ;+[80782] -1 x364 -1 x347 >= -1 ;+[80782] -1 x352 -1 x347 >= -1 ;+[80782] -1 x342 -1 x347 >= -1 ;+[80782] -1 x381 -1 x347 >= -1 ;+[80782] -1 x389 -1 x347 >= -1 ;+[80782] -1 x373 -1 x347 >= -1 ;+[80782] -1 x365 -1 x347 >= -1 ;+[80782] -1 x357 -1 x347 >= -1 ;+[80782] -1 x382 -1 x347 >= -1 ;+[80782] -1 x390 -1 x347 >= -1 ;+[80782] -1 x374 -1 x347 >= -1 ;+[80782] -1 x366 -1 x347 >= -1 ;+[80782] -1 x358 -1 x347 >= -1 ;+[80782] -1 x336 -1 x347 >= -1 ;+[80782] -1 x337 -1 x347 >= -1 ;+[80782] -1 x353 -1 x347 >= -1 ;+[80782] -1 x361 -1 x347 >= -1 ;+[80782] -1 x369 -1 x347 >= -1 ;+[80782] -1 x377 -1 x347 >= -1 ;+[80782] -1 x384 -1 x347 >= -1 ;+[80782] -1 x363 -1 x355 >= -1 ;+[80782] -1 x378 -1 x355 >= -1 ;+[80782] -1 x386 -1 x355 >= -1 ;+[80782] -1 x368 -1 x355 >= -1 ;+[80782] -1 x340 -1 x355 >= -1 ;+[80782] -1 x348 -1 x355 >= -1 ;+[80782] -1 x379 -1 x355 >= -1 ;+[80782] -1 x387 -1 x355 >= -1 ;+[80782] -1 x371 -1 x355 >= -1 ;+[80782] -1 x360 -1 x355 >= -1 ;+[80782] -1 x341 -1 x355 >= -1 ;+[80782] -1 x349 -1 x355 >= -1 ;+[80782] -1 x380 -1 x355 >= -1 ;+[80782] -1 x388 -1 x355 >= -1 ;+[80782] -1 x372 -1 x355 >= -1 ;+[80782] -1 x364 -1 x355 >= -1 ;+[80782] -1 x342 -1 x355 >= -1 ;+[80782] -1 x381 -1 x355 >= -1 ;+[80782] -1 x389 -1 x355 >= -1 ;+[80782] -1 x373 -1 x355 >= -1 ;+[80782] -1 x365 -1 x355 >= -1 ;+[80782] -1 x344 -1 x355 >= -1 ;+[80782] -1 x382 -1 x355 >= -1 ;+[80782] -1 x390 -1 x355 >= -1 ;+[80782] -1 x374 -1 x355 >= -1 ;+[80782] -1 x366 -1 x355 >= -1 ;+[80782] -1 x350 -1 x355 >= -1 ;+[80782] -1 x336 -1 x355 >= -1 ;+[80782] -1 x337 -1 x355 >= -1 ;+[80782] -1 x345 -1 x355 >= -1 ;+[80782] -1 x361 -1 x355 >= -1 ;+[80782] -1 x369 -1 x355 >= -1 ;+[80782] -1 x377 -1 x355 >= -1 ;+[80782] -1 x384 -1 x355 >= -1 ;+[80782] -1 x378 -1 x363 >= -1 ;+[80782] -1 x386 -1 x363 >= -1 ;+[80782] -1 x368 -1 x363 >= -1 ;+[80782] -1 x340 -1 x363 >= -1 ;+[80782] -1 x348 -1 x363 >= -1 ;+[80782] -1 x356 -1 x363 >= -1 ;+[80782] -1 x379 -1 x363 >= -1 ;+[80782] -1 x387 -1 x363 >= -1 ;+[80782] -1 x371 -1 x363 >= -1 ;+[80782] -1 x341 -1 x363 >= -1 ;+[80782] -1 x349 -1 x363 >= -1 ;+[80782] -1 x380 -1 x363 >= -1 ;+[80782] -1 x388 -1 x363 >= -1 ;+[80782] -1 x372 -1 x363 >= -1 ;+[80782] -1 x352 -1 x363 >= -1 ;+[80782] -1 x342 -1 x363 >= -1 ;+[80782] -1 x381 -1 x363 >= -1 ;+[80782] -1 x389 -1 x363 >= -1 ;+[80782] -1 x373 -1 x363 >= -1 ;+[80782] -1 x357 -1 x363 >= -1 ;+[80782] -1 x344 -1 x363 >= -1 ;+[80782] -1 x382 -1 x363 >= -1 ;+[80782] -1 x390 -1 x363 >= -1 ;+[80782] -1 x374 -1 x363 >= -1 ;+[80782] -1 x358 -1 x363 >= -1 ;+[80782] -1 x350 -1 x363 >= -1 ;+[80782] -1 x336 -1 x363 >= -1 ;+[80782] -1 x337 -1 x363 >= -1 ;+[80782] -1 x345 -1 x363 >= -1 ;+[80782] -1 x353 -1 x363 >= -1 ;+[80782] -1 x369 -1 x363 >= -1 ;+[80782] -1 x377 -1 x363 >= -1 ;+[80782] -1 x384 -1 x363 >= -1 ;+[80782] -1 x386 -1 x378 >= -1 ;+[80782] -1 x368 -1 x378 >= -1 ;+[80782] -1 x340 -1 x378 >= -1 ;+[80782] -1 x348 -1 x378 >= -1 ;+[80782] -1 x356 -1 x378 >= -1 ;+[80782] -1 x387 -1 x378 >= -1 ;+[80782] -1 x371 -1 x378 >= -1 ;+[80782] -1 x360 -1 x378 >= -1 ;+[80782] -1 x341 -1 x378 >= -1 ;+[80782] -1 x349 -1 x378 >= -1 ;+[80782] -1 x388 -1 x378 >= -1 ;+[80782] -1 x372 -1 x378 >= -1 ;+[80782] -1 x364 -1 x378 >= -1 ;+[80782] -1 x352 -1 x378 >= -1 ;+[80782] -1 x342 -1 x378 >= -1 ;+[80782] -1 x389 -1 x378 >= -1 ;+[80782] -1 x373 -1 x378 >= -1 ;+[80782] -1 x365 -1 x378 >= -1 ;+[80782] -1 x357 -1 x378 >= -1 ;+[80782] -1 x344 -1 x378 >= -1 ;+[80782] -1 x390 -1 x378 >= -1 ;+[80782] -1 x374 -1 x378 >= -1 ;+[80782] -1 x366 -1 x378 >= -1 ;+[80782] -1 x358 -1 x378 >= -1 ;+[80782] -1 x350 -1 x378 >= -1 ;+[80782] -1 x336 -1 x378 >= -1 ;+[80782] -1 x337 -1 x378 >= -1 ;+[80782] -1 x345 -1 x378 >= -1 ;+[80782] -1 x353 -1 x378 >= -1 ;+[80782] -1 x361 -1 x378 >= -1 ;+[80782] -1 x369 -1 x378 >= -1 ;+[80782] -1 x384 -1 x378 >= -1 ;+[80782] -1 x368 -1 x386 >= -1 ;+[80782] -1 x340 -1 x386 >= -1 ;+[80782] -1 x348 -1 x386 >= -1 ;+[80782] -1 x356 -1 x386 >= -1 ;+[80782] -1 x379 -1 x386 >= -1 ;+[80782] -1 x371 -1 x386 >= -1 ;+[80782] -1 x360 -1 x386 >= -1 ;+[80782] -1 x341 -1 x386 >= -1 ;+[80782] -1 x349 -1 x386 >= -1 ;+[80782] -1 x380 -1 x386 >= -1 ;+[80782] -1 x372 -1 x386 >= -1 ;+[80782] -1 x364 -1 x386 >= -1 ;+[80782] -1 x352 -1 x386 >= -1 ;+[80782] -1 x342 -1 x386 >= -1 ;+[80782] -1 x381 -1 x386 >= -1 ;+[80782] -1 x373 -1 x386 >= -1 ;+[80782] -1 x365 -1 x386 >= -1 ;+[80782] -1 x357 -1 x386 >= -1 ;+[80782] -1 x344 -1 x386 >= -1 ;+[80782] -1 x382 -1 x386 >= -1 ;+[80782] -1 x374 -1 x386 >= -1 ;+[80782] -1 x366 -1 x386 >= -1 ;+[80782] -1 x358 -1 x386 >= -1 ;+[80782] -1 x350 -1 x386 >= -1 ;+[80782] -1 x336 -1 x386 >= -1 ;+[80782] -1 x337 -1 x386 >= -1 ;+[80782] -1 x345 -1 x386 >= -1 ;+[80782] -1 x353 -1 x386 >= -1 ;+[80782] -1 x361 -1 x386 >= -1 ;+[80782] -1 x369 -1 x386 >= -1 ;+[80782] -1 x377 -1 x386 >= -1 ;+[80782] -1 x340 -1 x368 >= -1 ;+[80782] -1 x348 -1 x368 >= -1 ;+[80782] -1 x356 -1 x368 >= -1 ;+[80782] -1 x379 -1 x368 >= -1 ;+[80782] -1 x387 -1 x368 >= -1 ;+[80782] -1 x360 -1 x368 >= -1 ;+[80782] -1 x341 -1 x368 >= -1 ;+[80782] -1 x349 -1 x368 >= -1 ;+[80782] -1 x380 -1 x368 >= -1 ;+[80782] -1 x388 -1 x368 >= -1 ;+[80782] -1 x364 -1 x368 >= -1 ;+[80782] -1 x352 -1 x368 >= -1 ;+[80782] -1 x342 -1 x368 >= -1 ;+[80782] -1 x381 -1 x368 >= -1 ;+[80782] -1 x389 -1 x368 >= -1 ;+[80782] -1 x365 -1 x368 >= -1 ;+[80782] -1 x357 -1 x368 >= -1 ;+[80782] -1 x344 -1 x368 >= -1 ;+[80782] -1 x382 -1 x368 >= -1 ;+[80782] -1 x390 -1 x368 >= -1 ;+[80782] -1 x366 -1 x368 >= -1 ;+[80782] -1 x358 -1 x368 >= -1 ;+[80782] -1 x350 -1 x368 >= -1 ;+[80782] -1 x336 -1 x368 >= -1 ;+[80782] -1 x337 -1 x368 >= -1 ;+[80782] -1 x345 -1 x368 >= -1 ;+[80782] -1 x353 -1 x368 >= -1 ;+[80782] -1 x361 -1 x368 >= -1 ;+[80782] -1 x377 -1 x368 >= -1 ;+[80782] -1 x384 -1 x368 >= -1 ;+[80782] -1 x348 -1 x340 >= -1 ;+[80782] -1 x356 -1 x340 >= -1 ;+[80782] -1 x379 -1 x340 >= -1 ;+[80782] -1 x387 -1 x340 >= -1 ;+[80782] -1 x371 -1 x340 >= -1 ;+[80782] -1 x360 -1 x340 >= -1 ;+[80782] -1 x349 -1 x340 >= -1 ;+[80782] -1 x380 -1 x340 >= -1 ;+[80782] -1 x388 -1 x340 >= -1 ;+[80782] -1 x372 -1 x340 >= -1 ;+[80782] -1 x364 -1 x340 >= -1 ;+[80782] -1 x352 -1 x340 >= -1 ;+[80782] -1 x381 -1 x340 >= -1 ;+[80782] -1 x389 -1 x340 >= -1 ;+[80782] -1 x373 -1 x340 >= -1 ;+[80782] -1 x365 -1 x340 >= -1 ;+[80782] -1 x357 -1 x340 >= -1 ;+[80782] -1 x344 -1 x340 >= -1 ;+[80782] -1 x382 -1 x340 >= -1 ;+[80782] -1 x390 -1 x340 >= -1 ;+[80782] -1 x374 -1 x340 >= -1 ;+[80782] -1 x366 -1 x340 >= -1 ;+[80782] -1 x358 -1 x340 >= -1 ;+[80782] -1 x350 -1 x340 >= -1 ;+[80782] -1 x345 -1 x340 >= -1 ;+[80782] -1 x353 -1 x340 >= -1 ;+[80782] -1 x361 -1 x340 >= -1 ;+[80782] -1 x369 -1 x340 >= -1 ;+[80782] -1 x377 -1 x340 >= -1 ;+[80782] -1 x384 -1 x340 >= -1 ;+[80782] -1 x356 -1 x348 >= -1 ;+[80782] -1 x379 -1 x348 >= -1 ;+[80782] -1 x387 -1 x348 >= -1 ;+[80782] -1 x371 -1 x348 >= -1 ;+[80782] -1 x360 -1 x348 >= -1 ;+[80782] -1 x341 -1 x348 >= -1 ;+[80782] -1 x380 -1 x348 >= -1 ;+[80782] -1 x388 -1 x348 >= -1 ;+[80782] -1 x372 -1 x348 >= -1 ;+[80782] -1 x364 -1 x348 >= -1 ;+[80782] -1 x352 -1 x348 >= -1 ;+[80782] -1 x342 -1 x348 >= -1 ;+[80782] -1 x381 -1 x348 >= -1 ;+[80782] -1 x389 -1 x348 >= -1 ;+[80782] -1 x373 -1 x348 >= -1 ;+[80782] -1 x365 -1 x348 >= -1 ;+[80782] -1 x357 -1 x348 >= -1 ;+[80782] -1 x382 -1 x348 >= -1 ;+[80782] -1 x390 -1 x348 >= -1 ;+[80782] -1 x374 -1 x348 >= -1 ;+[80782] -1 x366 -1 x348 >= -1 ;+[80782] -1 x358 -1 x348 >= -1 ;+[80782] -1 x336 -1 x348 >= -1 ;+[80782] -1 x337 -1 x348 >= -1 ;+[80782] -1 x353 -1 x348 >= -1 ;+[80782] -1 x361 -1 x348 >= -1 ;+[80782] -1 x369 -1 x348 >= -1 ;+[80782] -1 x377 -1 x348 >= -1 ;+[80782] -1 x384 -1 x348 >= -1 ;+[80782] -1 x379 -1 x356 >= -1 ;+[80782] -1 x387 -1 x356 >= -1 ;+[80782] -1 x371 -1 x356 >= -1 ;+[80782] -1 x360 -1 x356 >= -1 ;+[80782] -1 x341 -1 x356 >= -1 ;+[80782] -1 x349 -1 x356 >= -1 ;+[80782] -1 x380 -1 x356 >= -1 ;+[80782] -1 x388 -1 x356 >= -1 ;+[80782] -1 x372 -1 x356 >= -1 ;+[80782] -1 x364 -1 x356 >= -1 ;+[80782] -1 x342 -1 x356 >= -1 ;+[80782] -1 x381 -1 x356 >= -1 ;+[80782] -1 x389 -1 x356 >= -1 ;+[80782] -1 x373 -1 x356 >= -1 ;+[80782] -1 x365 -1 x356 >= -1 ;+[80782] -1 x344 -1 x356 >= -1 ;+[80782] -1 x382 -1 x356 >= -1 ;+[80782] -1 x390 -1 x356 >= -1 ;+[80782] -1 x374 -1 x356 >= -1 ;+[80782] -1 x366 -1 x356 >= -1 ;+[80782] -1 x350 -1 x356 >= -1 ;+[80782] -1 x336 -1 x356 >= -1 ;+[80782] -1 x337 -1 x356 >= -1 ;+[80782] -1 x345 -1 x356 >= -1 ;+[80782] -1 x361 -1 x356 >= -1 ;+[80782] -1 x369 -1 x356 >= -1 ;+[80782] -1 x377 -1 x356 >= -1 ;+[80782] -1 x384 -1 x356 >= -1 ;+[80782] -1 x387 -1 x379 >= -1 ;+[80782] -1 x371 -1 x379 >= -1 ;+[80782] -1 x360 -1 x379 >= -1 ;+[80782] -1 x341 -1 x379 >= -1 ;+[80782] -1 x349 -1 x379 >= -1 ;+[80782] -1 x388 -1 x379 >= -1 ;+[80782] -1 x372 -1 x379 >= -1 ;+[80782] -1 x364 -1 x379 >= -1 ;+[80782] -1 x352 -1 x379 >= -1 ;+[80782] -1 x342 -1 x379 >= -1 ;+[80782] -1 x389 -1 x379 >= -1 ;+[80782] -1 x373 -1 x379 >= -1 ;+[80782] -1 x365 -1 x379 >= -1 ;+[80782] -1 x357 -1 x379 >= -1 ;+[80782] -1 x344 -1 x379 >= -1 ;+[80782] -1 x390 -1 x379 >= -1 ;+[80782] -1 x374 -1 x379 >= -1 ;+[80782] -1 x366 -1 x379 >= -1 ;+[80782] -1 x358 -1 x379 >= -1 ;+[80782] -1 x350 -1 x379 >= -1 ;+[80782] -1 x336 -1 x379 >= -1 ;+[80782] -1 x337 -1 x379 >= -1 ;+[80782] -1 x345 -1 x379 >= -1 ;+[80782] -1 x353 -1 x379 >= -1 ;+[80782] -1 x361 -1 x379 >= -1 ;+[80782] -1 x369 -1 x379 >= -1 ;+[80782] -1 x384 -1 x379 >= -1 ;+[80782] -1 x371 -1 x387 >= -1 ;+[80782] -1 x360 -1 x387 >= -1 ;+[80782] -1 x341 -1 x387 >= -1 ;+[80782] -1 x349 -1 x387 >= -1 ;+[80782] -1 x380 -1 x387 >= -1 ;+[80782] -1 x372 -1 x387 >= -1 ;+[80782] -1 x364 -1 x387 >= -1 ;+[80782] -1 x352 -1 x387 >= -1 ;+[80782] -1 x342 -1 x387 >= -1 ;+[80782] -1 x381 -1 x387 >= -1 ;+[80782] -1 x373 -1 x387 >= -1 ;+[80782] -1 x365 -1 x387 >= -1 ;+[80782] -1 x357 -1 x387 >= -1 ;+[80782] -1 x344 -1 x387 >= -1 ;+[80782] -1 x382 -1 x387 >= -1 ;+[80782] -1 x374 -1 x387 >= -1 ;+[80782] -1 x366 -1 x387 >= -1 ;+[80782] -1 x358 -1 x387 >= -1 ;+[80782] -1 x350 -1 x387 >= -1 ;+[80782] -1 x336 -1 x387 >= -1 ;+[80782] -1 x337 -1 x387 >= -1 ;+[80782] -1 x345 -1 x387 >= -1 ;+[80782] -1 x353 -1 x387 >= -1 ;+[80782] -1 x361 -1 x387 >= -1 ;+[80782] -1 x369 -1 x387 >= -1 ;+[80782] -1 x377 -1 x387 >= -1 ;+[80782] -1 x360 -1 x371 >= -1 ;+[80782] -1 x341 -1 x371 >= -1 ;+[80782] -1 x349 -1 x371 >= -1 ;+[80782] -1 x380 -1 x371 >= -1 ;+[80782] -1 x388 -1 x371 >= -1 ;+[80782] -1 x364 -1 x371 >= -1 ;+[80782] -1 x352 -1 x371 >= -1 ;+[80782] -1 x342 -1 x371 >= -1 ;+[80782] -1 x381 -1 x371 >= -1 ;+[80782] -1 x389 -1 x371 >= -1 ;+[80782] -1 x365 -1 x371 >= -1 ;+[80782] -1 x357 -1 x371 >= -1 ;+[80782] -1 x344 -1 x371 >= -1 ;+[80782] -1 x382 -1 x371 >= -1 ;+[80782] -1 x390 -1 x371 >= -1 ;+[80782] -1 x366 -1 x371 >= -1 ;+[80782] -1 x358 -1 x371 >= -1 ;+[80782] -1 x350 -1 x371 >= -1 ;+[80782] -1 x336 -1 x371 >= -1 ;+[80782] -1 x337 -1 x371 >= -1 ;+[80782] -1 x345 -1 x371 >= -1 ;+[80782] -1 x353 -1 x371 >= -1 ;+[80782] -1 x361 -1 x371 >= -1 ;+[80782] -1 x377 -1 x371 >= -1 ;+[80782] -1 x384 -1 x371 >= -1 ;+[80782] -1 x341 -1 x360 >= -1 ;+[80782] -1 x349 -1 x360 >= -1 ;+[80782] -1 x380 -1 x360 >= -1 ;+[80782] -1 x388 -1 x360 >= -1 ;+[80782] -1 x372 -1 x360 >= -1 ;+[80782] -1 x352 -1 x360 >= -1 ;+[80782] -1 x342 -1 x360 >= -1 ;+[80782] -1 x381 -1 x360 >= -1 ;+[80782] -1 x389 -1 x360 >= -1 ;+[80782] -1 x373 -1 x360 >= -1 ;+[80782] -1 x357 -1 x360 >= -1 ;+[80782] -1 x344 -1 x360 >= -1 ;+[80782] -1 x382 -1 x360 >= -1 ;+[80782] -1 x390 -1 x360 >= -1 ;+[80782] -1 x374 -1 x360 >= -1 ;+[80782] -1 x358 -1 x360 >= -1 ;+[80782] -1 x350 -1 x360 >= -1 ;+[80782] -1 x336 -1 x360 >= -1 ;+[80782] -1 x337 -1 x360 >= -1 ;+[80782] -1 x345 -1 x360 >= -1 ;+[80782] -1 x353 -1 x360 >= -1 ;+[80782] -1 x369 -1 x360 >= -1 ;+[80782] -1 x377 -1 x360 >= -1 ;+[80782] -1 x384 -1 x360 >= -1 ;+[80782] -1 x349 -1 x341 >= -1 ;+[80782] -1 x380 -1 x341 >= -1 ;+[80782] -1 x388 -1 x341 >= -1 ;+[80782] -1 x372 -1 x341 >= -1 ;+[80782] -1 x364 -1 x341 >= -1 ;+[80782] -1 x352 -1 x341 >= -1 ;+[80782] -1 x381 -1 x341 >= -1 ;+[80782] -1 x389 -1 x341 >= -1 ;+[80782] -1 x373 -1 x341 >= -1 ;+[80782] -1 x365 -1 x341 >= -1 ;+[80782] -1 x357 -1 x341 >= -1 ;+[80782] -1 x344 -1 x341 >= -1 ;+[80782] -1 x382 -1 x341 >= -1 ;+[80782] -1 x390 -1 x341 >= -1 ;+[80782] -1 x374 -1 x341 >= -1 ;+[80782] -1 x366 -1 x341 >= -1 ;+[80782] -1 x358 -1 x341 >= -1 ;+[80782] -1 x350 -1 x341 >= -1 ;+[80782] -1 x345 -1 x341 >= -1 ;+[80782] -1 x353 -1 x341 >= -1 ;+[80782] -1 x361 -1 x341 >= -1 ;+[80782] -1 x369 -1 x341 >= -1 ;+[80782] -1 x377 -1 x341 >= -1 ;+[80782] -1 x384 -1 x341 >= -1 ;+[80782] -1 x380 -1 x349 >= -1 ;+[80782] -1 x388 -1 x349 >= -1 ;+[80782] -1 x372 -1 x349 >= -1 ;+[80782] -1 x364 -1 x349 >= -1 ;+[80782] -1 x352 -1 x349 >= -1 ;+[80782] -1 x342 -1 x349 >= -1 ;+[80782] -1 x381 -1 x349 >= -1 ;+[80782] -1 x389 -1 x349 >= -1 ;+[80782] -1 x373 -1 x349 >= -1 ;+[80782] -1 x365 -1 x349 >= -1 ;+[80782] -1 x357 -1 x349 >= -1 ;+[80782] -1 x382 -1 x349 >= -1 ;+[80782] -1 x390 -1 x349 >= -1 ;+[80782] -1 x374 -1 x349 >= -1 ;+[80782] -1 x366 -1 x349 >= -1 ;+[80782] -1 x358 -1 x349 >= -1 ;+[80782] -1 x336 -1 x349 >= -1 ;+[80782] -1 x337 -1 x349 >= -1 ;+[80782] -1 x353 -1 x349 >= -1 ;+[80782] -1 x361 -1 x349 >= -1 ;+[80782] -1 x369 -1 x349 >= -1 ;+[80782] -1 x377 -1 x349 >= -1 ;+[80782] -1 x384 -1 x349 >= -1 ;+[80782] -1 x388 -1 x380 >= -1 ;+[80782] -1 x372 -1 x380 >= -1 ;+[80782] -1 x364 -1 x380 >= -1 ;+[80782] -1 x352 -1 x380 >= -1 ;+[80782] -1 x342 -1 x380 >= -1 ;+[80782] -1 x389 -1 x380 >= -1 ;+[80782] -1 x373 -1 x380 >= -1 ;+[80782] -1 x365 -1 x380 >= -1 ;+[80782] -1 x357 -1 x380 >= -1 ;+[80782] -1 x344 -1 x380 >= -1 ;+[80782] -1 x390 -1 x380 >= -1 ;+[80782] -1 x374 -1 x380 >= -1 ;+[80782] -1 x366 -1 x380 >= -1 ;+[80782] -1 x358 -1 x380 >= -1 ;+[80782] -1 x350 -1 x380 >= -1 ;+[80782] -1 x336 -1 x380 >= -1 ;+[80782] -1 x337 -1 x380 >= -1 ;+[80782] -1 x345 -1 x380 >= -1 ;+[80782] -1 x353 -1 x380 >= -1 ;+[80782] -1 x361 -1 x380 >= -1 ;+[80782] -1 x369 -1 x380 >= -1 ;+[80782] -1 x384 -1 x380 >= -1 ;+[80782] -1 x372 -1 x388 >= -1 ;+[80782] -1 x364 -1 x388 >= -1 ;+[80782] -1 x352 -1 x388 >= -1 ;+[80782] -1 x342 -1 x388 >= -1 ;+[80782] -1 x381 -1 x388 >= -1 ;+[80782] -1 x373 -1 x388 >= -1 ;+[80782] -1 x365 -1 x388 >= -1 ;+[80782] -1 x357 -1 x388 >= -1 ;+[80782] -1 x344 -1 x388 >= -1 ;+[80782] -1 x382 -1 x388 >= -1 ;+[80782] -1 x374 -1 x388 >= -1 ;+[80782] -1 x366 -1 x388 >= -1 ;+[80782] -1 x358 -1 x388 >= -1 ;+[80782] -1 x350 -1 x388 >= -1 ;+[80782] -1 x336 -1 x388 >= -1 ;+[80782] -1 x337 -1 x388 >= -1 ;+[80782] -1 x345 -1 x388 >= -1 ;+[80782] -1 x353 -1 x388 >= -1 ;+[80782] -1 x361 -1 x388 >= -1 ;+[80782] -1 x369 -1 x388 >= -1 ;+[80782] -1 x377 -1 x388 >= -1 ;+[80782] -1 x364 -1 x372 >= -1 ;+[80782] -1 x352 -1 x372 >= -1 ;+[80782] -1 x342 -1 x372 >= -1 ;+[80782] -1 x381 -1 x372 >= -1 ;+[80782] -1 x389 -1 x372 >= -1 ;+[80782] -1 x365 -1 x372 >= -1 ;+[80782] -1 x357 -1 x372 >= -1 ;+[80782] -1 x344 -1 x372 >= -1 ;+[80782] -1 x382 -1 x372 >= -1 ;+[80782] -1 x390 -1 x372 >= -1 ;+[80782] -1 x366 -1 x372 >= -1 ;+[80782] -1 x358 -1 x372 >= -1 ;+[80782] -1 x350 -1 x372 >= -1 ;+[80782] -1 x336 -1 x372 >= -1 ;+[80782] -1 x337 -1 x372 >= -1 ;+[80782] -1 x345 -1 x372 >= -1 ;+[80782] -1 x353 -1 x372 >= -1 ;+[80782] -1 x361 -1 x372 >= -1 ;+[80782] -1 x377 -1 x372 >= -1 ;+[80782] -1 x384 -1 x372 >= -1 ;+[80782] -1 x352 -1 x364 >= -1 ;+[80782] -1 x342 -1 x364 >= -1 ;+[80782] -1 x381 -1 x364 >= -1 ;+[80782] -1 x389 -1 x364 >= -1 ;+[80782] -1 x373 -1 x364 >= -1 ;+[80782] -1 x357 -1 x364 >= -1 ;+[80782] -1 x344 -1 x364 >= -1 ;+[80782] -1 x382 -1 x364 >= -1 ;+[80782] -1 x390 -1 x364 >= -1 ;+[80782] -1 x374 -1 x364 >= -1 ;+[80782] -1 x358 -1 x364 >= -1 ;+[80782] -1 x350 -1 x364 >= -1 ;+[80782] -1 x336 -1 x364 >= -1 ;+[80782] -1 x337 -1 x364 >= -1 ;+[80782] -1 x345 -1 x364 >= -1 ;+[80782] -1 x353 -1 x364 >= -1 ;+[80782] -1 x369 -1 x364 >= -1 ;+[80782] -1 x377 -1 x364 >= -1 ;+[80782] -1 x384 -1 x364 >= -1 ;+[80782] -1 x342 -1 x352 >= -1 ;+[80782] -1 x381 -1 x352 >= -1 ;+[80782] -1 x389 -1 x352 >= -1 ;+[80782] -1 x373 -1 x352 >= -1 ;+[80782] -1 x365 -1 x352 >= -1 ;+[80782] -1 x344 -1 x352 >= -1 ;+[80782] -1 x382 -1 x352 >= -1 ;+[80782] -1 x390 -1 x352 >= -1 ;+[80782] -1 x374 -1 x352 >= -1 ;+[80782] -1 x366 -1 x352 >= -1 ;+[80782] -1 x350 -1 x352 >= -1 ;+[80782] -1 x336 -1 x352 >= -1 ;+[80782] -1 x337 -1 x352 >= -1 ;+[80782] -1 x345 -1 x352 >= -1 ;+[80782] -1 x361 -1 x352 >= -1 ;+[80782] -1 x369 -1 x352 >= -1 ;+[80782] -1 x377 -1 x352 >= -1 ;+[80782] -1 x384 -1 x352 >= -1 ;+[80782] -1 x381 -1 x342 >= -1 ;+[80782] -1 x389 -1 x342 >= -1 ;+[80782] -1 x373 -1 x342 >= -1 ;+[80782] -1 x365 -1 x342 >= -1 ;+[80782] -1 x357 -1 x342 >= -1 ;+[80782] -1 x344 -1 x342 >= -1 ;+[80782] -1 x382 -1 x342 >= -1 ;+[80782] -1 x390 -1 x342 >= -1 ;+[80782] -1 x374 -1 x342 >= -1 ;+[80782] -1 x366 -1 x342 >= -1 ;+[80782] -1 x358 -1 x342 >= -1 ;+[80782] -1 x350 -1 x342 >= -1 ;+[80782] -1 x345 -1 x342 >= -1 ;+[80782] -1 x353 -1 x342 >= -1 ;+[80782] -1 x361 -1 x342 >= -1 ;+[80782] -1 x369 -1 x342 >= -1 ;+[80782] -1 x377 -1 x342 >= -1 ;+[80782] -1 x384 -1 x342 >= -1 ;+[80782] -1 x389 -1 x381 >= -1 ;+[80782] -1 x373 -1 x381 >= -1 ;+[80782] -1 x365 -1 x381 >= -1 ;+[80782] -1 x357 -1 x381 >= -1 ;+[80782] -1 x344 -1 x381 >= -1 ;+[80782] -1 x390 -1 x381 >= -1 ;+[80782] -1 x374 -1 x381 >= -1 ;+[80782] -1 x366 -1 x381 >= -1 ;+[80782] -1 x358 -1 x381 >= -1 ;+[80782] -1 x350 -1 x381 >= -1 ;+[80782] -1 x336 -1 x381 >= -1 ;+[80782] -1 x337 -1 x381 >= -1 ;+[80782] -1 x345 -1 x381 >= -1 ;+[80782] -1 x353 -1 x381 >= -1 ;+[80782] -1 x361 -1 x381 >= -1 ;+[80782] -1 x369 -1 x381 >= -1 ;+[80782] -1 x384 -1 x381 >= -1 ;+[80782] -1 x373 -1 x389 >= -1 ;+[80782] -1 x365 -1 x389 >= -1 ;+[80782] -1 x357 -1 x389 >= -1 ;+[80782] -1 x344 -1 x389 >= -1 ;+[80782] -1 x382 -1 x389 >= -1 ;+[80782] -1 x374 -1 x389 >= -1 ;+[80782] -1 x366 -1 x389 >= -1 ;+[80782] -1 x358 -1 x389 >= -1 ;+[80782] -1 x350 -1 x389 >= -1 ;+[80782] -1 x336 -1 x389 >= -1 ;+[80782] -1 x337 -1 x389 >= -1 ;+[80782] -1 x345 -1 x389 >= -1 ;+[80782] -1 x353 -1 x389 >= -1 ;+[80782] -1 x361 -1 x389 >= -1 ;+[80782] -1 x369 -1 x389 >= -1 ;+[80782] -1 x377 -1 x389 >= -1 ;+[80782] -1 x365 -1 x373 >= -1 ;+[80782] -1 x357 -1 x373 >= -1 ;+[80782] -1 x344 -1 x373 >= -1 ;+[80782] -1 x382 -1 x373 >= -1 ;+[80782] -1 x390 -1 x373 >= -1 ;+[80782] -1 x366 -1 x373 >= -1 ;+[80782] -1 x358 -1 x373 >= -1 ;+[80782] -1 x350 -1 x373 >= -1 ;+[80782] -1 x336 -1 x373 >= -1 ;+[80782] -1 x337 -1 x373 >= -1 ;+[80782] -1 x345 -1 x373 >= -1 ;+[80782] -1 x353 -1 x373 >= -1 ;+[80782] -1 x361 -1 x373 >= -1 ;+[80782] -1 x377 -1 x373 >= -1 ;+[80782] -1 x384 -1 x373 >= -1 ;+[80782] -1 x357 -1 x365 >= -1 ;+[80782] -1 x344 -1 x365 >= -1 ;+[80782] -1 x382 -1 x365 >= -1 ;+[80782] -1 x390 -1 x365 >= -1 ;+[80782] -1 x374 -1 x365 >= -1 ;+[80782] -1 x358 -1 x365 >= -1 ;+[80782] -1 x350 -1 x365 >= -1 ;+[80782] -1 x336 -1 x365 >= -1 ;+[80782] -1 x337 -1 x365 >= -1 ;+[80782] -1 x345 -1 x365 >= -1 ;+[80782] -1 x353 -1 x365 >= -1 ;+[80782] -1 x369 -1 x365 >= -1 ;+[80782] -1 x377 -1 x365 >= -1 ;+[80782] -1 x384 -1 x365 >= -1 ;+[80782] -1 x344 -1 x357 >= -1 ;+[80782] -1 x382 -1 x357 >= -1 ;+[80782] -1 x390 -1 x357 >= -1 ;+[80782] -1 x374 -1 x357 >= -1 ;+[80782] -1 x366 -1 x357 >= -1 ;+[80782] -1 x350 -1 x357 >= -1 ;+[80782] -1 x336 -1 x357 >= -1 ;+[80782] -1 x337 -1 x357 >= -1 ;+[80782] -1 x345 -1 x357 >= -1 ;+[80782] -1 x361 -1 x357 >= -1 ;+[80782] -1 x369 -1 x357 >= -1 ;+[80782] -1 x377 -1 x357 >= -1 ;+[80782] -1 x384 -1 x357 >= -1 ;+[80782] -1 x382 -1 x344 >= -1 ;+[80782] -1 x390 -1 x344 >= -1 ;+[80782] -1 x374 -1 x344 >= -1 ;+[80782] -1 x366 -1 x344 >= -1 ;+[80782] -1 x358 -1 x344 >= -1 ;+[80782] -1 x336 -1 x344 >= -1 ;+[80782] -1 x337 -1 x344 >= -1 ;+[80782] -1 x353 -1 x344 >= -1 ;+[80782] -1 x361 -1 x344 >= -1 ;+[80782] -1 x369 -1 x344 >= -1 ;+[80782] -1 x377 -1 x344 >= -1 ;+[80782] -1 x384 -1 x344 >= -1 ;+[80782] -1 x390 -1 x382 >= -1 ;+[80782] -1 x374 -1 x382 >= -1 ;+[80782] -1 x366 -1 x382 >= -1 ;+[80782] -1 x358 -1 x382 >= -1 ;+[80782] -1 x350 -1 x382 >= -1 ;+[80782] -1 x336 -1 x382 >= -1 ;+[80782] -1 x337 -1 x382 >= -1 ;+[80782] -1 x345 -1 x382 >= -1 ;+[80782] -1 x353 -1 x382 >= -1 ;+[80782] -1 x361 -1 x382 >= -1 ;+[80782] -1 x369 -1 x382 >= -1 ;+[80782] -1 x384 -1 x382 >= -1 ;+[80782] -1 x374 -1 x390 >= -1 ;+[80782] -1 x366 -1 x390 >= -1 ;+[80782] -1 x358 -1 x390 >= -1 ;+[80782] -1 x350 -1 x390 >= -1 ;+[80782] -1 x336 -1 x390 >= -1 ;+[80782] -1 x337 -1 x390 >= -1 ;+[80782] -1 x345 -1 x390 >= -1 ;+[80782] -1 x353 -1 x390 >= -1 ;+[80782] -1 x361 -1 x390 >= -1 ;+[80782] -1 x369 -1 x390 >= -1 ;+[80782] -1 x377 -1 x390 >= -1 ;+[80782] -1 x366 -1 x374 >= -1 ;+[80782] -1 x358 -1 x374 >= -1 ;+[80782] -1 x350 -1 x374 >= -1 ;+[80782] -1 x336 -1 x374 >= -1 ;+[80782] -1 x337 -1 x374 >= -1 ;+[80782] -1 x345 -1 x374 >= -1 ;+[80782] -1 x353 -1 x374 >= -1 ;+[80782] -1 x361 -1 x374 >= -1 ;+[80782] -1 x377 -1 x374 >= -1 ;+[80782] -1 x384 -1 x374 >= -1 ;+[80782] -1 x358 -1 x366 >= -1 ;+[80782] -1 x350 -1 x366 >= -1 ;+[80782] -1 x336 -1 x366 >= -1 ;+[80782] -1 x337 -1 x366 >= -1 ;+[80782] -1 x345 -1 x366 >= -1 ;+[80782] -1 x353 -1 x366 >= -1 ;+[80782] -1 x369 -1 x366 >= -1 ;+[80782] -1 x377 -1 x366 >= -1 ;+[80782] -1 x384 -1 x366 >= -1 ;+[80782] -1 x350 -1 x358 >= -1 ;+[80782] -1 x336 -1 x358 >= -1 ;+[80782] -1 x337 -1 x358 >= -1 ;+[80782] -1 x345 -1 x358 >= -1 ;+[80782] -1 x361 -1 x358 >= -1 ;+[80782] -1 x369 -1 x358 >= -1 ;+[80782] -1 x377 -1 x358 >= -1 ;+[80782] -1 x384 -1 x358 >= -1 ;+[80782] -1 x336 -1 x350 >= -1 ;+[80782] -1 x337 -1 x350 >= -1 ;+[80782] -1 x353 -1 x350 >= -1 ;+[80782] -1 x361 -1 x350 >= -1 ;+[80782] -1 x369 -1 x350 >= -1 ;+[80782] -1 x377 -1 x350 >= -1 ;+[80782] -1 x384 -1 x350 >= -1 ;+[80782] -1 x345 -1 x336 >= -1 ;+[80782] -1 x353 -1 x336 >= -1 ;+[80782] -1 x361 -1 x336 >= -1 ;+[80782] -1 x369 -1 x336 >= -1 ;+[80782] -1 x377 -1 x336 >= -1 ;+[80782] -1 x384 -1 x336 >= -1 ;+[80782] -1 x333 -1 x393 >= -1 ;+[80782] -1 x334 -1 x393 >= -1 ;+[80782] -1 x392 -1 x333 >= -1 ;+[80782] -1 x392 -1 x334 >= -1 ;+[80782] -1 x345 -1 x337 >= -1 ;+[80782] -1 x353 -1 x337 >= -1 ;+[80782] -1 x361 -1 x337 >= -1 ;+[80782] -1 x369 -1 x337 >= -1 ;+[80782] -1 x377 -1 x337 >= -1 ;+[80782] -1 x384 -1 x337 >= -1 ;+[80782] -1 x353 -1 x345 >= -1 ;+[80782] -1 x361 -1 x345 >= -1 ;+[80782] -1 x369 -1 x345 >= -1 ;+[80782] -1 x377 -1 x345 >= -1 ;+[80782] -1 x384 -1 x345 >= -1 ;+[80782] -1 x361 -1 x353 >= -1 ;+[80782] -1 x369 -1 x353 >= -1 ;+[80782] -1 x377 -1 x353 >= -1 ;+[80782] -1 x384 -1 x353 >= -1 ;+[80782] -1 x369 -1 x361 >= -1 ;+[80782] -1 x377 -1 x361 >= -1 ;+[80782] -1 x384 -1 x361 >= -1 ;+[80782] -1 x377 -1 x369 >= -1 ;+[80782] -1 x384 -1 x369 >= -1 ;+[80782] -1 x384 -1 x377 >= -1 ;+[80782] -1 x411 -1 x395 >= -1 ;+[80782] -1 x399 -1 x397 >= -1 ;+[80782] -1 x401 -1 x397 >= -1 ;+[80782] -1 x403 -1 x397 >= -1 ;+[80782] -1 x405 -1 x397 >= -1 ;+[80782] -1 x407 -1 x397 >= -1 ;+[80782] -1 x409 -1 x397 >= -1 ;+[80782] -1 x401 -1 x399 >= -1 ;+[80782] -1 x403 -1 x399 >= -1 ;+[80782] -1 x405 -1 x399 >= -1 ;+[80782] -1 x407 -1 x399 >= -1 ;+[80782] -1 x409 -1 x399 >= -1 ;+[80782] -1 x403 -1 x401 >= -1 ;+[80782] -1 x405 -1 x401 >= -1 ;+[80782] -1 x407 -1 x401 >= -1 ;+[80782] -1 x409 -1 x401 >= -1 ;+[80782] -1 x405 -1 x403 >= -1 ;+[80782] -1 x407 -1 x403 >= -1 ;+[80782] -1 x409 -1 x403 >= -1 ;+[80782] -1 x407 -1 x405 >= -1 ;+[80782] -1 x409 -1 x405 >= -1 ;+[80782] -1 x409 -1 x407 >= -1 ;+[80782] -1 x1 -1 x7 >= -1 ;+[80782] -1 x2 -1 x16 >= -1 ;+[80782] -1 x2 -1 x19 >= -1 ;+[80782] -1 x2 -1 x19 >= -1 ;+[80782] -1 x2 -1 x38 >= -1 ;+[80782] -1 x3 -1 x10 >= -1 ;+[80782] -1 x4 -1 x16 >= -1 ;+[80782] -1 x4 -1 x19 >= -1 ;+[80782] -1 x4 -1 x19 >= -1 ;+[80782] -1 x4 -1 x30 >= -1 ;+[80782] -1 x5 -1 x13 >= -1 ;+[80782] -1 x6 -1 x16 >= -1 ;+[80782] -1 x6 -1 x19 >= -1 ;+[80782] -1 x6 -1 x19 >= -1 ;+[80782] -1 x6 -1 x22 >= -1 ;+[80782] -1 x8 -1 x46 >= -1 ;+[80782] -1 x9 -1 x55 >= -1 ;+[80782] -1 x9 -1 x58 >= -1 ;+[80782] -1 x9 -1 x58 >= -1 ;+[80782] -1 x9 -1 x109 >= -1 ;+[80782] -1 x11 -1 x49 >= -1 ;+[80782] -1 x12 -1 x55 >= -1 ;+[80782] -1 x12 -1 x58 >= -1 ;+[80782] -1 x12 -1 x58 >= -1 ;+[80782] -1 x12 -1 x93 >= -1 ;+[80782] -1 x14 -1 x52 >= -1 ;+[80782] -1 x15 -1 x55 >= -1 ;+[80782] -1 x15 -1 x58 >= -1 ;+[80782] -1 x15 -1 x58 >= -1 ;+[80782] -1 x15 -1 x85 >= -1 ;+[80782] -1 x17 -1 x55 >= -1 ;+[80782] -1 x18 -1 x58 >= -1 ;+[80782] -1 x18 -1 x101 >= -1 ;+[80782] -1 x20 -1 x58 >= -1 ;+[80782] -1 x21 -1 x117 >= -1 ;+[80782] -1 x23 -1 x85 >= -1 ;+[80782] -1 x24 -1 x109 >= -1 ;+[80782] -1 x25 -1 x101 >= -1 ;+[80782] -1 x26 -1 x93 >= -1 ;+[80782] -1 x27 -1 x77 >= -1 ;+[80782] -1 x28 -1 x69 >= -1 ;+[80782] -1 x29 -1 x61 >= -1 ;+[80782] -1 x31 -1 x93 >= -1 ;+[80782] -1 x32 -1 x109 >= -1 ;+[80782] -1 x33 -1 x101 >= -1 ;+[80782] -1 x34 -1 x85 >= -1 ;+[80782] -1 x35 -1 x77 >= -1 ;+[80782] -1 x36 -1 x69 >= -1 ;+[80782] -1 x37 -1 x61 >= -1 ;+[80782] -1 x39 -1 x109 >= -1 ;+[80782] -1 x40 -1 x101 >= -1 ;+[80782] -1 x41 -1 x93 >= -1 ;+[80782] -1 x42 -1 x85 >= -1 ;+[80782] -1 x43 -1 x77 >= -1 ;+[80782] -1 x44 -1 x69 >= -1 ;+[80782] -1 x45 -1 x61 >= -1 ;+[80782] -1 x47 -1 x120 >= -1 ;+[80782] -1 x48 -1 x129 >= -1 ;+[80782] -1 x48 -1 x132 >= -1 ;+[80782] -1 x48 -1 x132 >= -1 ;+[80782] -1 x48 -1 x183 >= -1 ;+[80782] -1 x50 -1 x123 >= -1 ;+[80782] -1 x51 -1 x129 >= -1 ;+[80782] -1 x51 -1 x132 >= -1 ;+[80782] -1 x51 -1 x132 >= -1 ;+[80782] -1 x51 -1 x167 >= -1 ;+[80782] -1 x53 -1 x126 >= -1 ;+[80782] -1 x54 -1 x129 >= -1 ;+[80782] -1 x54 -1 x132 >= -1 ;+[80782] -1 x54 -1 x132 >= -1 ;+[80782] -1 x54 -1 x159 >= -1 ;+[80782] -1 x56 -1 x129 >= -1 ;+[80782] -1 x57 -1 x132 >= -1 ;+[80782] -1 x57 -1 x175 >= -1 ;+[80782] -1 x59 -1 x132 >= -1 ;+[80782] -1 x60 -1 x191 >= -1 ;+[80782] -1 x62 -1 x135 >= -1 ;+[80782] -1 x63 -1 x183 >= -1 ;+[80782] -1 x64 -1 x175 >= -1 ;+[80782] -1 x65 -1 x167 >= -1 ;+[80782] -1 x66 -1 x159 >= -1 ;+[80782] -1 x67 -1 x151 >= -1 ;+[80782] -1 x68 -1 x143 >= -1 ;+[80782] -1 x70 -1 x143 >= -1 ;+[80782] -1 x71 -1 x183 >= -1 ;+[80782] -1 x72 -1 x175 >= -1 ;+[80782] -1 x73 -1 x167 >= -1 ;+[80782] -1 x74 -1 x159 >= -1 ;+[80782] -1 x75 -1 x151 >= -1 ;+[80782] -1 x76 -1 x135 >= -1 ;+[80782] -1 x78 -1 x151 >= -1 ;+[80782] -1 x79 -1 x183 >= -1 ;+[80782] -1 x80 -1 x175 >= -1 ;+[80782] -1 x81 -1 x167 >= -1 ;+[80782] -1 x82 -1 x159 >= -1 ;+[80782] -1 x83 -1 x143 >= -1 ;+[80782] -1 x84 -1 x135 >= -1 ;+[80782] -1 x86 -1 x159 >= -1 ;+[80782] -1 x87 -1 x183 >= -1 ;+[80782] -1 x88 -1 x175 >= -1 ;+[80782] -1 x89 -1 x167 >= -1 ;+[80782] -1 x90 -1 x151 >= -1 ;+[80782] -1 x91 -1 x143 >= -1 ;+[80782] -1 x92 -1 x135 >= -1 ;+[80782] -1 x94 -1 x167 >= -1 ;+[80782] -1 x95 -1 x183 >= -1 ;+[80782] -1 x96 -1 x175 >= -1 ;+[80782] -1 x97 -1 x159 >= -1 ;+[80782] -1 x98 -1 x151 >= -1 ;+[80782] -1 x99 -1 x143 >= -1 ;+[80782] -1 x100 -1 x135 >= -1 ;+[80782] -1 x102 -1 x175 >= -1 ;+[80782] -1 x103 -1 x183 >= -1 ;+[80782] -1 x104 -1 x167 >= -1 ;+[80782] -1 x105 -1 x159 >= -1 ;+[80782] -1 x106 -1 x151 >= -1 ;+[80782] -1 x107 -1 x143 >= -1 ;+[80782] -1 x108 -1 x135 >= -1 ;+[80782] -1 x110 -1 x183 >= -1 ;+[80782] -1 x111 -1 x175 >= -1 ;+[80782] -1 x112 -1 x167 >= -1 ;+[80782] -1 x113 -1 x159 >= -1 ;+[80782] -1 x114 -1 x151 >= -1 ;+[80782] -1 x115 -1 x143 >= -1 ;+[80782] -1 x116 -1 x135 >= -1 ;+[80782] -1 x118 -1 x191 >= -1 ;+[80782] -1 x119 -1 x132 >= -1 ;+[80782] -1 x121 -1 x194 >= -1 ;+[80782] -1 x122 -1 x200 >= -1 ;+[80782] -1 x122 -1 x203 >= -1 ;+[80782] -1 x122 -1 x203 >= -1 ;+[80782] -1 x122 -1 x254 >= -1 ;+[80782] -1 x124 -1 x196 >= -1 ;+[80782] -1 x125 -1 x200 >= -1 ;+[80782] -1 x125 -1 x203 >= -1 ;+[80782] -1 x125 -1 x203 >= -1 ;+[80782] -1 x125 -1 x238 >= -1 ;+[80782] -1 x127 -1 x198 >= -1 ;+[80782] -1 x128 -1 x200 >= -1 ;+[80782] -1 x128 -1 x203 >= -1 ;+[80782] -1 x128 -1 x203 >= -1 ;+[80782] -1 x128 -1 x230 >= -1 ;+[80782] -1 x130 -1 x200 >= -1 ;+[80782] -1 x131 -1 x203 >= -1 ;+[80782] -1 x131 -1 x246 >= -1 ;+[80782] -1 x133 -1 x203 >= -1 ;+[80782] -1 x134 -1 x262 >= -1 ;+[80782] -1 x136 -1 x206 >= -1 ;+[80782] -1 x137 -1 x254 >= -1 ;+[80782] -1 x138 -1 x246 >= -1 ;+[80782] -1 x139 -1 x238 >= -1 ;+[80782] -1 x140 -1 x230 >= -1 ;+[80782] -1 x141 -1 x222 >= -1 ;+[80782] -1 x142 -1 x214 >= -1 ;+[80782] -1 x144 -1 x214 >= -1 ;+[80782] -1 x145 -1 x254 >= -1 ;+[80782] -1 x146 -1 x246 >= -1 ;+[80782] -1 x147 -1 x238 >= -1 ;+[80782] -1 x148 -1 x230 >= -1 ;+[80782] -1 x149 -1 x222 >= -1 ;+[80782] -1 x150 -1 x206 >= -1 ;+[80782] -1 x152 -1 x222 >= -1 ;+[80782] -1 x153 -1 x254 >= -1 ;+[80782] -1 x154 -1 x246 >= -1 ;+[80782] -1 x155 -1 x238 >= -1 ;+[80782] -1 x156 -1 x230 >= -1 ;+[80782] -1 x157 -1 x214 >= -1 ;+[80782] -1 x158 -1 x206 >= -1 ;+[80782] -1 x160 -1 x230 >= -1 ;+[80782] -1 x161 -1 x254 >= -1 ;+[80782] -1 x162 -1 x246 >= -1 ;+[80782] -1 x163 -1 x238 >= -1 ;+[80782] -1 x164 -1 x222 >= -1 ;+[80782] -1 x165 -1 x214 >= -1 ;+[80782] -1 x166 -1 x206 >= -1 ;+[80782] -1 x168 -1 x238 >= -1 ;+[80782] -1 x169 -1 x254 >= -1 ;+[80782] -1 x170 -1 x246 >= -1 ;+[80782] -1 x171 -1 x230 >= -1 ;+[80782] -1 x172 -1 x222 >= -1 ;+[80782] -1 x173 -1 x214 >= -1 ;+[80782] -1 x174 -1 x206 >= -1 ;+[80782] -1 x176 -1 x246 >= -1 ;+[80782] -1 x177 -1 x254 >= -1 ;+[80782] -1 x178 -1 x238 >= -1 ;+[80782] -1 x179 -1 x230 >= -1 ;+[80782] -1 x180 -1 x222 >= -1 ;+[80782] -1 x181 -1 x214 >= -1 ;+[80782] -1 x182 -1 x206 >= -1 ;+[80782] -1 x184 -1 x254 >= -1 ;+[80782] -1 x185 -1 x246 >= -1 ;+[80782] -1 x186 -1 x238 >= -1 ;+[80782] -1 x187 -1 x230 >= -1 ;+[80782] -1 x188 -1 x222 >= -1 ;+[80782] -1 x189 -1 x214 >= -1 ;+[80782] -1 x190 -1 x206 >= -1 ;+[80782] -1 x192 -1 x262 >= -1 ;+[80782] -1 x193 -1 x203 >= -1 ;+[80782] -1 x195 -1 x265 >= -1 ;+[80782] -1 x195 -1 x268 >= -1 ;+[80782] -1 x195 -1 x268 >= -1 ;+[80782] -1 x195 -1 x319 >= -1 ;+[80782] -1 x197 -1 x265 >= -1 ;+[80782] -1 x197 -1 x268 >= -1 ;+[80782] -1 x197 -1 x268 >= -1 ;+[80782] -1 x197 -1 x303 >= -1 ;+[80782] -1 x199 -1 x265 >= -1 ;+[80782] -1 x199 -1 x268 >= -1 ;+[80782] -1 x199 -1 x268 >= -1 ;+[80782] -1 x199 -1 x295 >= -1 ;+[80782] -1 x201 -1 x265 >= -1 ;+[80782] -1 x202 -1 x268 >= -1 ;+[80782] -1 x202 -1 x311 >= -1 ;+[80782] -1 x204 -1 x268 >= -1 ;+[80782] -1 x205 -1 x327 >= -1 ;+[80782] -1 x207 -1 x271 >= -1 ;+[80782] -1 x208 -1 x319 >= -1 ;+[80782] -1 x209 -1 x311 >= -1 ;+[80782] -1 x210 -1 x303 >= -1 ;+[80782] -1 x211 -1 x295 >= -1 ;+[80782] -1 x212 -1 x287 >= -1 ;+[80782] -1 x213 -1 x279 >= -1 ;+[80782] -1 x215 -1 x279 >= -1 ;+[80782] -1 x216 -1 x319 >= -1 ;+[80782] -1 x217 -1 x311 >= -1 ;+[80782] -1 x218 -1 x303 >= -1 ;+[80782] -1 x219 -1 x295 >= -1 ;+[80782] -1 x220 -1 x287 >= -1 ;+[80782] -1 x221 -1 x271 >= -1 ;+[80782] -1 x223 -1 x287 >= -1 ;+[80782] -1 x224 -1 x319 >= -1 ;+[80782] -1 x225 -1 x311 >= -1 ;+[80782] -1 x226 -1 x303 >= -1 ;+[80782] -1 x227 -1 x295 >= -1 ;+[80782] -1 x228 -1 x279 >= -1 ;+[80782] -1 x229 -1 x271 >= -1 ;+[80782] -1 x231 -1 x295 >= -1 ;+[80782] -1 x232 -1 x319 >= -1 ;+[80782] -1 x233 -1 x311 >= -1 ;+[80782] -1 x234 -1 x303 >= -1 ;+[80782] -1 x235 -1 x287 >= -1 ;+[80782] -1 x236 -1 x279 >= -1 ;+[80782] -1 x237 -1 x271 >= -1 ;+[80782] -1 x239 -1 x303 >= -1 ;+[80782] -1 x240 -1 x319 >= -1 ;+[80782] -1 x241 -1 x311 >= -1 ;+[80782] -1 x242 -1 x295 >= -1 ;+[80782] -1 x243 -1 x287 >= -1 ;+[80782] -1 x244 -1 x279 >= -1 ;+[80782] -1 x245 -1 x271 >= -1 ;+[80782] -1 x247 -1 x311 >= -1 ;+[80782] -1 x248 -1 x319 >= -1 ;+[80782] -1 x249 -1 x303 >= -1 ;+[80782] -1 x250 -1 x295 >= -1 ;+[80782] -1 x251 -1 x287 >= -1 ;+[80782] -1 x252 -1 x279 >= -1 ;+[80782] -1 x253 -1 x271 >= -1 ;+[80782] -1 x255 -1 x319 >= -1 ;+[80782] -1 x256 -1 x311 >= -1 ;+[80782] -1 x257 -1 x303 >= -1 ;+[80782] -1 x258 -1 x295 >= -1 ;+[80782] -1 x259 -1 x287 >= -1 ;+[80782] -1 x260 -1 x279 >= -1 ;+[80782] -1 x261 -1 x271 >= -1 ;+[80782] -1 x263 -1 x327 >= -1 ;+[80782] -1 x264 -1 x268 >= -1 ;+[80782] -1 x266 -1 x330 >= -1 ;+[80782] -1 x267 -1 x332 >= -1 ;+[80782] -1 x267 -1 x375 >= -1 ;+[80782] -1 x269 -1 x332 >= -1 ;+[80782] -1 x270 -1 x391 >= -1 ;+[80782] -1 x272 -1 x335 >= -1 ;+[80782] -1 x273 -1 x383 >= -1 ;+[80782] -1 x274 -1 x375 >= -1 ;+[80782] -1 x275 -1 x367 >= -1 ;+[80782] -1 x276 -1 x359 >= -1 ;+[80782] -1 x277 -1 x351 >= -1 ;+[80782] -1 x278 -1 x343 >= -1 ;+[80782] -1 x280 -1 x343 >= -1 ;+[80782] -1 x281 -1 x383 >= -1 ;+[80782] -1 x282 -1 x375 >= -1 ;+[80782] -1 x283 -1 x367 >= -1 ;+[80782] -1 x284 -1 x359 >= -1 ;+[80782] -1 x285 -1 x351 >= -1 ;+[80782] -1 x286 -1 x335 >= -1 ;+[80782] -1 x288 -1 x351 >= -1 ;+[80782] -1 x289 -1 x383 >= -1 ;+[80782] -1 x290 -1 x375 >= -1 ;+[80782] -1 x291 -1 x367 >= -1 ;+[80782] -1 x292 -1 x359 >= -1 ;+[80782] -1 x293 -1 x343 >= -1 ;+[80782] -1 x294 -1 x335 >= -1 ;+[80782] -1 x296 -1 x359 >= -1 ;+[80782] -1 x297 -1 x383 >= -1 ;+[80782] -1 x298 -1 x375 >= -1 ;+[80782] -1 x299 -1 x367 >= -1 ;+[80782] -1 x300 -1 x351 >= -1 ;+[80782] -1 x301 -1 x343 >= -1 ;+[80782] -1 x302 -1 x335 >= -1 ;+[80782] -1 x304 -1 x367 >= -1 ;+[80782] -1 x305 -1 x383 >= -1 ;+[80782] -1 x306 -1 x375 >= -1 ;+[80782] -1 x307 -1 x359 >= -1 ;+[80782] -1 x308 -1 x351 >= -1 ;+[80782] -1 x309 -1 x343 >= -1 ;+[80782] -1 x310 -1 x335 >= -1 ;+[80782] -1 x312 -1 x375 >= -1 ;+[80782] -1 x313 -1 x383 >= -1 ;+[80782] -1 x314 -1 x367 >= -1 ;+[80782] -1 x315 -1 x359 >= -1 ;+[80782] -1 x316 -1 x351 >= -1 ;+[80782] -1 x317 -1 x343 >= -1 ;+[80782] -1 x318 -1 x335 >= -1 ;+[80782] -1 x320 -1 x383 >= -1 ;+[80782] -1 x321 -1 x375 >= -1 ;+[80782] -1 x322 -1 x367 >= -1 ;+[80782] -1 x323 -1 x359 >= -1 ;+[80782] -1 x324 -1 x351 >= -1 ;+[80782] -1 x325 -1 x343 >= -1 ;+[80782] -1 x326 -1 x335 >= -1 ;+[80782] -1 x328 -1 x391 >= -1 ;+[80782] -1 x329 -1 x332 >= -1 ;+[80782] -1 x331 -1 x394 >= -1 ;+[80782] -1 x331 -1 x406 >= -1 ;+[80782] -1 x333 -1 x394 >= -1 ;+[80782] -1 x334 -1 x410 >= -1 ;+[80782] -1 x336 -1 x396 >= -1 ;+[80782] -1 x337 -1 x408 >= -1 ;+[80782] -1 x338 -1 x406 >= -1 ;+[80782] -1 x339 -1 x404 >= -1 ;+[80782] -1 x340 -1 x402 >= -1 ;+[80782] -1 x341 -1 x400 >= -1 ;+[80782] -1 x342 -1 x398 >= -1 ;+[80782] -1 x344 -1 x398 >= -1 ;+[80782] -1 x345 -1 x408 >= -1 ;+[80782] -1 x346 -1 x406 >= -1 ;+[80782] -1 x347 -1 x404 >= -1 ;+[80782] -1 x348 -1 x402 >= -1 ;+[80782] -1 x349 -1 x400 >= -1 ;+[80782] -1 x350 -1 x396 >= -1 ;+[80782] -1 x352 -1 x400 >= -1 ;+[80782] -1 x353 -1 x408 >= -1 ;+[80782] -1 x354 -1 x406 >= -1 ;+[80782] -1 x355 -1 x404 >= -1 ;+[80782] -1 x356 -1 x402 >= -1 ;+[80782] -1 x357 -1 x398 >= -1 ;+[80782] -1 x358 -1 x396 >= -1 ;+[80782] -1 x360 -1 x402 >= -1 ;+[80782] -1 x361 -1 x408 >= -1 ;+[80782] -1 x362 -1 x406 >= -1 ;+[80782] -1 x363 -1 x404 >= -1 ;+[80782] -1 x364 -1 x400 >= -1 ;+[80782] -1 x365 -1 x398 >= -1 ;+[80782] -1 x366 -1 x396 >= -1 ;+[80782] -1 x368 -1 x404 >= -1 ;+[80782] -1 x369 -1 x408 >= -1 ;+[80782] -1 x370 -1 x406 >= -1 ;+[80782] -1 x371 -1 x402 >= -1 ;+[80782] -1 x372 -1 x400 >= -1 ;+[80782] -1 x373 -1 x398 >= -1 ;+[80782] -1 x374 -1 x396 >= -1 ;+[80782] -1 x376 -1 x406 >= -1 ;+[80782] -1 x377 -1 x408 >= -1 ;+[80782] -1 x378 -1 x404 >= -1 ;+[80782] -1 x379 -1 x402 >= -1 ;+[80782] -1 x380 -1 x400 >= -1 ;+[80782] -1 x381 -1 x398 >= -1 ;+[80782] -1 x382 -1 x396 >= -1 ;+[80782] -1 x384 -1 x408 >= -1 ;+[80782] -1 x385 -1 x406 >= -1 ;+[80782] -1 x386 -1 x404 >= -1 ;+[80782] -1 x387 -1 x402 >= -1 ;+[80782] -1 x388 -1 x400 >= -1 ;+[80782] -1 x389 -1 x398 >= -1 ;+[80782] -1 x390 -1 x396 >= -1 ;+[80782] -1 x392 -1 x410 >= -1 ;+[80782] -1 x393 -1 x394 >= -1 ;+[96] -1 x122 >= 0 ;+[1] -1 x264 >= 0 ;+[296] -1 x261 >= 0 ;+[496] -1 x260 >= 0 ;+[196] -1 x259 >= 0 ;+[221] -1 x258 >= 0 ;+[321] -1 x257 >= 0 ;+[521] -1 x256 >= 0 ;+[346] -1 x253 >= 0 ;+[296] -1 x252 >= 0 ;+[146] -1 x251 >= 0 ;+[421] -1 x250 >= 0 ;+[396] -1 x249 >= 0 ;+[296] -1 x248 >= 0 ;+[96] -1 x6 >= 0 ;+[396] -1 x245 >= 0 ;+[396] -1 x244 >= 0 ;+[321] -1 x243 >= 0 ;+[346] -1 x242 >= 0 ;+[396] -1 x241 >= 0 ;+[321] -1 x240 >= 0 ;+[96] -1 x4 >= 0 ;+[271] -1 x237 >= 0 ;+[296] -1 x236 >= 0 ;+[446] -1 x235 >= 0 ;+[346] -1 x234 >= 0 ;+[321] -1 x233 >= 0 ;+[296] -1 x232 >= 0 ;+[96] -1 x2 >= 0 ;+[246] -1 x229 >= 0 ;+[296] -1 x228 >= 0 ;+[321] -1 x227 >= 0 ;+[321] -1 x226 >= 0 ;+[271] -1 x225 >= 0 ;+[421] -1 x224 >= 0 ;+[346] -1 x221 >= 0 ;+[321] -1 x220 >= 0 ;+[346] -1 x219 >= 0 ;+[396] -1 x218 >= 0 ;+[296] -1 x217 >= 0 ;+[371] -1 x216 >= 0 ;+[346] -1 x213 >= 0 ;+[246] -1 x212 >= 0 ;+[271] -1 x211 >= 0 ;+[396] -1 x210 >= 0 ;+[346] -1 x209 >= 0 ;+[296] -1 x208 >= 0 ;+[1] -1 x205 >= 0 ;+[296] -1 x407 >= 0 ;+[321] -1 x405 >= 0 ;+[296] -1 x403 >= 0 ;+[421] -1 x401 >= 0 ;+[371] -1 x399 >= 0 ;+[296] -1 x397 >= 0 ;+[1] -1 x395 >= 0 ;+[46] -1 x202 >= 0 ;+[96] -1 x199 >= 0 ;+[96] -1 x197 >= 0 ;+[296] -1 x45 >= 0 ;+[496] -1 x44 >= 0 ;+[196] -1 x43 >= 0 ;+[221] -1 x42 >= 0 ;+[321] -1 x41 >= 0 ;+[521] -1 x40 >= 0 ;+[96] -1 x195 >= 0 ;+[396] -1 x37 >= 0 ;+[396] -1 x36 >= 0 ;+[321] -1 x35 >= 0 ;+[346] -1 x34 >= 0 ;+[396] -1 x33 >= 0 ;+[321] -1 x32 >= 0 ;+[1] -1 x329 >= 0 ;+[271] -1 x29 >= 0 ;+[296] -1 x28 >= 0 ;+[446] -1 x27 >= 0 ;+[346] -1 x26 >= 0 ;+[321] -1 x25 >= 0 ;+[296] -1 x24 >= 0 ;+[296] -1 x326 >= 0 ;+[496] -1 x325 >= 0 ;+[196] -1 x324 >= 0 ;+[221] -1 x323 >= 0 ;+[321] -1 x322 >= 0 ;+[521] -1 x321 >= 0 ;+[1] -1 x21 >= 0 ;+[46] -1 x18 >= 0 ;+[346] -1 x318 >= 0 ;+[296] -1 x317 >= 0 ;+[146] -1 x316 >= 0 ;+[421] -1 x315 >= 0 ;+[396] -1 x314 >= 0 ;+[296] -1 x313 >= 0 ;+[396] -1 x310 >= 0 ;+[396] -1 x309 >= 0 ;+[321] -1 x308 >= 0 ;+[346] -1 x307 >= 0 ;+[396] -1 x306 >= 0 ;+[321] -1 x305 >= 0 ;+[271] -1 x302 >= 0 ;+[296] -1 x301 >= 0 ;+[446] -1 x300 >= 0 ;+[346] -1 x299 >= 0 ;+[321] -1 x298 >= 0 ;+[296] -1 x297 >= 0 ;+[246] -1 x294 >= 0 ;+[296] -1 x293 >= 0 ;+[321] -1 x292 >= 0 ;+[321] -1 x291 >= 0 ;+[271] -1 x290 >= 0 ;+[421] -1 x289 >= 0 ;+[346] -1 x286 >= 0 ;+[321] -1 x285 >= 0 ;+[346] -1 x284 >= 0 ;+[396] -1 x283 >= 0 ;+[296] -1 x282 >= 0 ;+[371] -1 x281 >= 0 ;+[346] -1 x278 >= 0 ;+[246] -1 x277 >= 0 ;+[271] -1 x276 >= 0 ;+[396] -1 x275 >= 0 ;+[346] -1 x274 >= 0 ;+[296] -1 x273 >= 0 ;+[1] -1 x270 >= 0 ;+[46] -1 x267 >= 0 ;+[96] -1 x15 >= 0 ;+[1] -1 x393 >= 0 ;+[96] -1 x12 >= 0 ;+[96] -1 x9 >= 0 ;+[1] -1 x119 >= 0 ;+[296] -1 x116 >= 0 ;+[496] -1 x115 >= 0 ;+[196] -1 x114 >= 0 ;+[221] -1 x113 >= 0 ;+[321] -1 x112 >= 0 ;+[521] -1 x111 >= 0 ;+[346] -1 x108 >= 0 ;+[296] -1 x107 >= 0 ;+[146] -1 x106 >= 0 ;+[421] -1 x105 >= 0 ;+[396] -1 x104 >= 0 ;+[296] -1 x103 >= 0 ;+[296] -1 x390 >= 0 ;+[496] -1 x389 >= 0 ;+[196] -1 x388 >= 0 ;+[221] -1 x387 >= 0 ;+[321] -1 x386 >= 0 ;+[521] -1 x385 >= 0 ;+[346] -1 x382 >= 0 ;+[296] -1 x381 >= 0 ;+[146] -1 x380 >= 0 ;+[421] -1 x379 >= 0 ;+[396] -1 x378 >= 0 ;+[296] -1 x377 >= 0 ;+[396] -1 x374 >= 0 ;+[396] -1 x373 >= 0 ;+[321] -1 x372 >= 0 ;+[346] -1 x371 >= 0 ;+[396] -1 x370 >= 0 ;+[321] -1 x369 >= 0 ;+[271] -1 x366 >= 0 ;+[296] -1 x365 >= 0 ;+[446] -1 x364 >= 0 ;+[346] -1 x363 >= 0 ;+[321] -1 x362 >= 0 ;+[296] -1 x361 >= 0 ;+[246] -1 x358 >= 0 ;+[296] -1 x357 >= 0 ;+[321] -1 x356 >= 0 ;+[321] -1 x355 >= 0 ;+[271] -1 x354 >= 0 ;+[421] -1 x353 >= 0 ;+[396] -1 x100 >= 0 ;+[396] -1 x99 >= 0 ;+[321] -1 x98 >= 0 ;+[346] -1 x97 >= 0 ;+[396] -1 x96 >= 0 ;+[321] -1 x95 >= 0 ;+[346] -1 x350 >= 0 ;+[321] -1 x349 >= 0 ;+[346] -1 x348 >= 0 ;+[396] -1 x347 >= 0 ;+[296] -1 x346 >= 0 ;+[371] -1 x345 >= 0 ;+[271] -1 x92 >= 0 ;+[296] -1 x91 >= 0 ;+[446] -1 x90 >= 0 ;+[346] -1 x89 >= 0 ;+[321] -1 x88 >= 0 ;+[296] -1 x87 >= 0 ;+[346] -1 x342 >= 0 ;+[246] -1 x341 >= 0 ;+[271] -1 x340 >= 0 ;+[396] -1 x339 >= 0 ;+[346] -1 x338 >= 0 ;+[296] -1 x337 >= 0 ;+[246] -1 x84 >= 0 ;+[296] -1 x83 >= 0 ;+[321] -1 x82 >= 0 ;+[321] -1 x81 >= 0 ;+[271] -1 x80 >= 0 ;+[421] -1 x79 >= 0 ;+[1] -1 x334 >= 0 ;+[346] -1 x76 >= 0 ;+[321] -1 x75 >= 0 ;+[346] -1 x74 >= 0 ;+[396] -1 x73 >= 0 ;+[296] -1 x72 >= 0 ;+[371] -1 x71 >= 0 ;+[46] -1 x331 >= 0 ;+[346] -1 x68 >= 0 ;+[246] -1 x67 >= 0 ;+[271] -1 x66 >= 0 ;+[396] -1 x65 >= 0 ;+[346] -1 x64 >= 0 ;+[296] -1 x63 >= 0 ;+[1] -1 x60 >= 0 ;+[46] -1 x57 >= 0 ;+[96] -1 x54 >= 0 ;+[96] -1 x51 >= 0 ;+[96] -1 x48 >= 0 ;+[1] -1 x193 >= 0 ;+[296] -1 x190 >= 0 ;+[496] -1 x189 >= 0 ;+[196] -1 x188 >= 0 ;+[221] -1 x187 >= 0 ;+[321] -1 x186 >= 0 ;+[521] -1 x185 >= 0 ;+[346] -1 x182 >= 0 ;+[296] -1 x181 >= 0 ;+[146] -1 x180 >= 0 ;+[421] -1 x179 >= 0 ;+[396] -1 x178 >= 0 ;+[296] -1 x177 >= 0 ;+[396] -1 x174 >= 0 ;+[396] -1 x173 >= 0 ;+[321] -1 x172 >= 0 ;+[346] -1 x171 >= 0 ;+[396] -1 x170 >= 0 ;+[321] -1 x169 >= 0 ;+[271] -1 x166 >= 0 ;+[296] -1 x165 >= 0 ;+[446] -1 x164 >= 0 ;+[346] -1 x163 >= 0 ;+[321] -1 x162 >= 0 ;+[296] -1 x161 >= 0 ;+[246] -1 x158 >= 0 ;+[296] -1 x157 >= 0 ;+[321] -1 x156 >= 0 ;+[321] -1 x155 >= 0 ;+[271] -1 x154 >= 0 ;+[421] -1 x153 >= 0 ;+[346] -1 x150 >= 0 ;+[321] -1 x149 >= 0 ;+[346] -1 x148 >= 0 ;+[396] -1 x147 >= 0 ;+[296] -1 x146 >= 0 ;+[371] -1 x145 >= 0 ;+[346] -1 x142 >= 0 ;+[246] -1 x141 >= 0 ;+[271] -1 x140 >= 0 ;+[396] -1 x139 >= 0 ;+[346] -1 x138 >= 0 ;+[296] -1 x137 >= 0 ;+[1] -1 x134 >= 0 ;+[46] -1 x131 >= 0 ;+[96] -1 x128 >= 0 ;+[96] -1 x125 >= 0 ;
− src/Algebra/Lattice/Boolean.hs
@@ -1,66 +0,0 @@-{-# OPTIONS_GHC -Wall #-}--------------------------------------------------------------------------------- |--- Module : Algebra.Lattice.Boolean--- Copyright : (c) Masahiro Sakai 2012-2013--- License : BSD-style--- --- Maintainer : masahiro.sakai@gmail.com--- Stability : provisional--- Portability : portable------ Type classes for lattices and boolean algebras.--- -------------------------------------------------------------------------------module Algebra.Lattice.Boolean- (- -- * Boolean algebra- Complement (..)- , Boolean (..)- , true- , false- , (.&&.)- , (.||.)- , andB- , orB- ) where--import Algebra.Lattice--infixr 3 .&&.-infixr 2 .||.-infix 1 .=>., .<=>.---- | types that can be negated.-class Complement a where- notB :: a -> a---- | types that can be combined with boolean operations.-class (BoundedLattice a, Complement a) => Boolean a where- (.=>.), (.<=>.) :: a -> a -> a- x .=>. y = notB x .||. y- x .<=>. y = (x .=>. y) .&&. (y .=>. x)---- | alias of 'top'-true :: Boolean a => a-true = top---- | alias of 'bottom'-false :: Boolean a => a-false = bottom---- | alias of 'meet'-(.&&.) :: Boolean a => a -> a -> a-(.&&.) = meet---- | alias of 'join'-(.||.) :: Boolean a => a -> a -> a-(.||.) = join---- | alias of 'meets'-andB :: Boolean a => [a] -> a-andB = meets---- | alias of 'joins'-orB :: Boolean a => [a] -> a-orB = joins
− src/Algorithm/BoundsInference.hs
@@ -1,109 +0,0 @@-{-# LANGUAGE ScopedTypeVariables, BangPatterns #-}--------------------------------------------------------------------------------- |--- Module : Algorithm.BoundsInference--- Copyright : (c) Masahiro Sakai 2011--- License : BSD-style--- --- Maintainer : masahiro.sakai@gmail.com--- Stability : provisional--- Portability : non-portable (ScopedTypeVariables, BangPatterns)------ Tightening variable bounds by constraint propagation.--- -------------------------------------------------------------------------------module Algorithm.BoundsInference- ( BoundsEnv- , inferBounds- , LA.computeInterval- ) where--import Control.Monad-import qualified Data.IntMap as IM-import qualified Data.IntSet as IS-import Data.VectorSpace--import Data.ArithRel-import Data.Interval-import Data.LA (BoundsEnv)-import qualified Data.LA as LA-import Data.Var-import Util (isInteger)--type C r = (RelOp, LA.Expr r)---- | tightening variable bounds by constraint propagation.-inferBounds :: forall r. (RealFrac r)- => LA.BoundsEnv r -- ^ initial bounds- -> [LA.Atom r] -- ^ constraints- -> VarSet -- ^ integral variables- -> Int -- ^ limit of iterations- -> LA.BoundsEnv r-inferBounds bounds constraints ivs limit = loop 0 bounds- where- cs :: VarMap [C r]- cs = IM.fromListWith (++) $ do- Rel lhs op rhs <- constraints- let m = LA.coeffMap (lhs ^-^ rhs)- (v,c) <- IM.toList m- guard $ v /= LA.unitVar- let op' = if c < 0 then flipOp op else op- rhs' = (-1/c) *^ LA.fromCoeffMap (IM.delete v m)- return (v, [(op', rhs')])-- loop :: Int -> LA.BoundsEnv r -> LA.BoundsEnv r- loop !i b = if (limit>=0 && i>=limit) || b==b' then b else loop (i+1) b'- where- b' = refine b-- refine :: LA.BoundsEnv r -> LA.BoundsEnv r- refine b = IM.mapWithKey (\v i -> tighten v $ f b (IM.findWithDefault [] v cs) i) b-- -- tighten bounds of integer variables- tighten :: Var -> Interval r -> Interval r- tighten v x =- if v `IS.notMember` ivs- then x- else tightenToInteger x--f :: (Real r, Fractional r) => LA.BoundsEnv r -> [C r] -> Interval r -> Interval r-f b cs i = foldr intersection i $ do- (op, rhs) <- cs- let i' = LA.computeInterval b rhs- lb = lowerBound' i'- ub = upperBound' i'- case op of- Eql -> return i'- Le -> return $ interval (NegInf, False) ub- Ge -> return $ interval lb (PosInf, False)- Lt -> return $ interval (NegInf, False) (strict ub)- Gt -> return $ interval (strict ub) (PosInf, False)- NEq -> []--strict :: (EndPoint r, Bool) -> (EndPoint r, Bool)-strict (x, _) = (x, False)---- | tightening intervals by ceiling lower bounds and flooring upper bounds.-tightenToInteger :: forall r. (RealFrac r) => Interval r -> Interval r-tightenToInteger ival = interval lb2 ub2- where- lb@(x1, in1) = lowerBound' ival- ub@(x2, in2) = upperBound' ival- lb2 =- case x1 of- Finite x ->- ( if isInteger x && not in1- then Finite (x + 1)- else Finite (fromInteger (ceiling x))- , True- )- _ -> lb- ub2 =- case x2 of- Finite x ->- ( if isInteger x && not in2- then Finite (x - 1)- else Finite (fromInteger (floor x))- , True- )- _ -> ub
− src/Algorithm/CAD.hs
@@ -1,593 +0,0 @@-{-# LANGUAGE ScopedTypeVariables, BangPatterns #-}--------------------------------------------------------------------------------- |--- Module : Algorithm.CAD--- Copyright : (c) Masahiro Sakai 2012--- License : BSD-style--- --- Maintainer : masahiro.sakai@gmail.com--- Stability : provisional--- Portability : non-portable (ScopedTypeVariables, BangPatterns)------ References:------ * Christian Michaux and Adem Ozturk.--- Quantifier Elimination following Muchnik--- <https://math.umons.ac.be/preprints/src/Ozturk020411.pdf>------ * Arnab Bhattacharyya.--- Something you should know about: Quantifier Elimination (Part I)--- <http://cstheory.blogoverflow.com/2011/11/something-you-should-know-about-quantifier-elimination-part-i/>--- --- * Arnab Bhattacharyya.--- Something you should know about: Quantifier Elimination (Part II)--- <http://cstheory.blogoverflow.com/2012/02/something-you-should-know-about-quantifier-elimination-part-ii/>----------------------------------------------------------------------------------module Algorithm.CAD- (- -- * Basic data structures- Point (..)- , Cell (..)-- -- * Projection- , project-- -- * Solving- , solve- , solve'-- -- * Model- , Model- , findSample- , evalCell- , evalPoint- ) where--import Control.Exception-import Control.Monad.State-import Data.List-import Data.Maybe-import Data.Ord-import Data.Map (Map)-import qualified Data.Map as Map-import Data.Set (Set)-import qualified Data.Set as Set-import Text.Printf-import Text.PrettyPrint.HughesPJClass--import Data.ArithRel-import qualified Data.AlgebraicNumber.Real as AReal-import Data.DNF-import Data.Polynomial (Polynomial, UPolynomial, X (..), PrettyVar, PrettyCoeff)-import qualified Data.Polynomial as P-import Data.Sign (Sign (..))-import qualified Data.Sign as Sign---import Debug.Trace---- -----------------------------------------------------------------------------data Point c = NegInf | RootOf (UPolynomial c) Int | PosInf- deriving (Eq, Ord, Show)--data Cell c- = Point (Point c)- | Interval (Point c) (Point c)- deriving (Eq, Ord, Show)--showCell :: (Num c, Ord c, PrettyCoeff c) => Cell c -> String-showCell (Point pt) = showPoint pt-showCell (Interval lb ub) = printf "(%s, %s)" (showPoint lb) (showPoint ub)--showPoint :: (Num c, Ord c, PrettyCoeff c) => Point c -> String-showPoint NegInf = "-inf"-showPoint PosInf = "+inf"-showPoint (RootOf p n) = "rootOf(" ++ prettyShow p ++ ", " ++ show n ++ ")"---- -----------------------------------------------------------------------------type SignConf c = [(Cell c, Map (UPolynomial c) Sign)]--emptySignConf :: SignConf c-emptySignConf =- [ (Point NegInf, Map.empty)- , (Interval NegInf PosInf, Map.empty)- , (Point PosInf, Map.empty)- ]--showSignConf :: forall c. (Num c, Ord c, PrettyCoeff c) => SignConf c -> [String]-showSignConf = f- where- f :: SignConf c -> [String]- f = concatMap $ \(cell, m) -> showCell cell : g m-- g :: Map (UPolynomial c) Sign -> [String]- g m =- [printf " %s: %s" (prettyShow p) (Sign.symbol s) | (p, s) <- Map.toList m]---- ------------------------------------------------------------------------------- modified reminder-mr- :: forall k. (Ord k, Show k, Num k, PrettyCoeff k)- => UPolynomial k- -> UPolynomial k- -> (k, Integer, UPolynomial k)-mr p q- | n >= m = assert (P.constant (bm^(n-m+1)) * p == q * l + r && m > P.deg r) $ (bm, n-m+1, r)- | otherwise = error "mr p q: not (deg p >= deg q)"- where- x = P.var X- n = P.deg p- m = P.deg q- bm = P.lc P.grlex q- (l,r) = f p n-- f :: UPolynomial k -> Integer -> (UPolynomial k, UPolynomial k)- f p n- | n==m =- let l = P.constant an- r = P.constant bm * p - P.constant an * q- in assert (P.constant (bm^(n-m+1)) * p == q*l + r && m > P.deg r) $ (l, r)- | otherwise =- let p' = (P.constant bm * p - P.constant an * x^(n-m) * q)- (l',r) = f p' (n-1)- l = l' + P.constant (an*bm^(n-m)) * x^(n-m)- in assert (n > P.deg p') $- assert (P.constant (bm^(n-m+1)) * p == q*l + r && m > P.deg r) $ (l, r)- where- an = P.coeff (P.var X `P.mpow` n) p--test_mr_1 :: (Coeff Int, Integer, UPolynomial (Coeff Int))-test_mr_1 = mr (P.toUPolynomialOf p 3) (P.toUPolynomialOf q 3)- where- a = P.var 0- b = P.var 1- c = P.var 2- x = P.var 3- p = a*x^(2::Int) + b*x + c- q = 2*a*x + b--test_mr_2 :: (Coeff Int, Integer, UPolynomial (Coeff Int))-test_mr_2 = mr (P.toUPolynomialOf p 3) (P.toUPolynomialOf p 3)- where- a = P.var 0- b = P.var 1- c = P.var 2- x = P.var 3- p = a*x^(2::Int) + b*x + c---- -----------------------------------------------------------------------------type Coeff v = Polynomial Rational v--type M v = StateT (Map (Polynomial Rational v) (Set Sign)) []--runM :: M v a -> [(a, Map (Polynomial Rational v) (Set Sign))]-runM m = runStateT m Map.empty--assume :: (Ord v, Show v, PrettyVar v) => Polynomial Rational v -> [Sign] -> M v ()-assume p ss =- if P.deg p <= 0- then do- let c = P.coeff P.mone p- guard $ Sign.signOf c `elem` ss- else do- let c = P.lc P.grlex p- p' = P.mapCoeff (/c) p- m <- get- let ss1 = Map.findWithDefault (Set.fromList [Neg, Zero, Pos]) p' m- ss2 = Set.intersection ss1 $ Set.fromList $ [s `Sign.div` Sign.signOf c | s <- ss]- guard $ not $ Set.null ss2- put $ Map.insert p' ss2 m--project- :: forall v. (Ord v, Show v, PrettyVar v)- => [(UPolynomial (Polynomial Rational v), [Sign])]- -> [([(Polynomial Rational v, [Sign])], [Cell (Polynomial Rational v)])]-project cs = [ (guess2cond gs, cells) | (cells, gs) <- result ]- where- result :: [([Cell (Polynomial Rational v)], Map (Polynomial Rational v) (Set Sign))]- result = runM $ do- forM_ cs $ \(p,ss) -> do- when (1 > P.deg p) $ assume (P.coeff P.mone p) ss- conf <- buildSignConf (map fst cs)- let satCells = [cell | (cell, m) <- conf, cell /= Point NegInf, cell /= Point PosInf, ok m]- guard $ not $ null satCells- return satCells-- ok :: Map (UPolynomial (Polynomial Rational v)) Sign -> Bool- ok m = and [checkSign m p ss | (p,ss) <- cs]- where- checkSign m p ss =- if 1 > P.deg p - then True -- already assumed- else (m Map.! p) `elem` ss-- guess2cond :: Map (Polynomial Rational v) (Set Sign) -> [(Polynomial Rational v, [Sign])]- guess2cond gs = [(p, Set.toList ss) | (p, ss) <- Map.toList gs]--buildSignConf- :: (Ord v, Show v, PrettyVar v)- => [UPolynomial (Polynomial Rational v)]- -> M v (SignConf (Polynomial Rational v))-buildSignConf ps = do- ps2 <- collectPolynomials (Set.fromList ps)- let ts = sortBy (comparing P.deg) (Set.toList ps2)- foldM (flip refineSignConf) emptySignConf ts--collectPolynomials- :: (Ord v, Show v, PrettyVar v)- => Set (UPolynomial (Polynomial Rational v))- -> M v (Set (UPolynomial (Polynomial Rational v)))-collectPolynomials ps = go Set.empty (f ps)- where- f = Set.filter (\p -> P.deg p > 0) - go result ps | Set.null ps = return result- go result ps = do- let rs1 = filter (\p -> P.deg p > 0) [P.deriv p X | p <- Set.toList ps]- rs2 <- liftM (filter (\p -> P.deg p > 0) . map (\(_,_,r) -> r) . concat) $- forM [(p1,p2) | p1 <- Set.toList ps, p2 <- Set.toList ps ++ Set.toList result, p1 /= p2] $ \(p1,p2) -> do- ret1 <- zmod p1 p2- ret2 <- zmod p2 p1- return $ catMaybes [ret1,ret2]- let ps' = Set.unions [Set.fromList rs | rs <- [rs1,rs2]] `Set.difference` result- go (result `Set.union` ps) ps'--getHighestNonzeroTerm- :: forall v. (Ord v, Show v, PrettyVar v)- => UPolynomial (Polynomial Rational v)- -> M v (Polynomial Rational v, Integer)-getHighestNonzeroTerm p = go $ sortBy (flip (comparing snd)) cs- where- cs = [(c, P.deg mm) | (c,mm) <- P.terms p]-- go :: [(Polynomial Rational v, Integer)] -> M v (Polynomial Rational v, Integer)- go [] = return (0, -1)- go ((c,d):xs) =- mplus- (assume c [Pos, Neg] >> return (c,d))- (assume c [Zero] >> go xs)--zmod- :: forall v. (Ord v, Show v, PrettyVar v)- => UPolynomial (Polynomial Rational v)- -> UPolynomial (Polynomial Rational v)- -> M v (Maybe (Polynomial Rational v, Integer, UPolynomial (Polynomial Rational v)))-zmod p q = do- (_, d) <- getHighestNonzeroTerm p- (_, e) <- getHighestNonzeroTerm q- if not (d >= e) || 0 >= e- then return Nothing- else do- let p' = P.fromTerms [(pi, mm) | (pi, mm) <- P.terms p, P.deg mm <= d]- q' = P.fromTerms [(qi, mm) | (qi, mm) <- P.terms q, P.deg mm <= e]- return $ Just $ mr p' q'--refineSignConf- :: forall v. (Show v, Ord v, PrettyVar v)- => UPolynomial (Polynomial Rational v)- -> SignConf (Polynomial Rational v) - -> M v (SignConf (Polynomial Rational v))-refineSignConf p conf = liftM (extendIntervals 0) $ mapM extendPoint conf- where - extendPoint- :: (Cell (Polynomial Rational v), Map (UPolynomial (Polynomial Rational v)) Sign)- -> M v (Cell (Polynomial Rational v), Map (UPolynomial (Polynomial Rational v)) Sign)- extendPoint (Point pt, m) = do- s <- signAt pt m- return (Point pt, Map.insert p s m)- extendPoint x = return x- - extendIntervals- :: Int- -> [(Cell (Polynomial Rational v), Map (UPolynomial (Polynomial Rational v)) Sign)]- -> [(Cell (Polynomial Rational v), Map (UPolynomial (Polynomial Rational v)) Sign)]- extendIntervals !n (pt1@(Point _, m1) : (Interval lb ub, m) : pt2@(Point _, m2) : xs) =- pt1 : ys ++ extendIntervals n2 (pt2 : xs)- where- s1 = m1 Map.! p- s2 = m2 Map.! p- n1 = if s1 == Zero then n+1 else n- root = RootOf p n1- (ys, n2)- | s1 == s2 = ( [ (Interval lb ub, Map.insert p s1 m) ], n1 )- | s1 == Zero = ( [ (Interval lb ub, Map.insert p s2 m) ], n1 )- | s2 == Zero = ( [ (Interval lb ub, Map.insert p s1 m) ], n1 )- | otherwise = ( [ (Interval lb root, Map.insert p s1 m)- , (Point root, Map.insert p Zero m)- , (Interval root ub, Map.insert p s2 m)- ]- , n1 + 1- )- extendIntervals _ xs = xs- - signAt :: Point (Polynomial Rational v) -> Map (UPolynomial (Polynomial Rational v)) Sign -> M v Sign- signAt PosInf _ = do- (c,_) <- getHighestNonzeroTerm p- signCoeff c- signAt NegInf _ = do- (c,d) <- getHighestNonzeroTerm p- if even d- then signCoeff c- else liftM Sign.negate $ signCoeff c- signAt (RootOf q _) m = do- Just (bm,k,r) <- zmod p q- s1 <- if P.deg r > 0- then return $ m Map.! r- else signCoeff $ P.coeff P.mone r- -- 場合分けを出来るだけ避ける- if even k- then return s1- else do- s2 <- signCoeff bm- return $ s1 `Sign.div` Sign.pow s2 k-- signCoeff :: Polynomial Rational v -> M v Sign- signCoeff c =- msum [ assume c [s] >> return s- | s <- [Neg, Zero, Pos]- ]---- -----------------------------------------------------------------------------type Model v = Map v AReal.AReal--findSample :: Ord v => Model v -> Cell (Polynomial Rational v) -> Maybe AReal.AReal-findSample m cell =- case evalCell m cell of- Point (RootOf p n) -> - Just $ AReal.realRoots p !! n- Interval NegInf PosInf ->- Just $ 0- Interval NegInf (RootOf p n) ->- Just $ fromInteger $ floor ((AReal.realRoots p !! n) - 1)- Interval (RootOf p n) PosInf ->- Just $ fromInteger $ ceiling ((AReal.realRoots p !! n) + 1)- Interval (RootOf p1 n1) (RootOf p2 n2)- | (pt1 < pt2) -> Just $ (pt1 + pt2) / 2- | otherwise -> Nothing- where- pt1 = AReal.realRoots p1 !! n1- pt2 = AReal.realRoots p2 !! n2- _ -> error $ "findSample: should not happen"--evalCell :: Ord v => Model v -> Cell (Polynomial Rational v) -> Cell Rational-evalCell m (Point pt) = Point $ evalPoint m pt-evalCell m (Interval pt1 pt2) = Interval (evalPoint m pt1) (evalPoint m pt2)--evalPoint :: Ord v => Model v -> Point (Polynomial Rational v) -> Point Rational-evalPoint _ NegInf = NegInf-evalPoint _ PosInf = PosInf-evalPoint m (RootOf p n) = RootOf (AReal.minimalPolynomial a) (AReal.rootIndex a)- where- a = AReal.realRootsEx (P.mapCoeff (P.eval (m Map.!) . P.mapCoeff fromRational) p) !! n---- -----------------------------------------------------------------------------solve- :: forall v. (Ord v, Show v, PrettyVar v)- => Set v- -> [(Rel (Polynomial Rational v))]- -> Maybe (Model v)-solve vs cs0 = solve' vs (map f cs0)- where- f (Rel lhs op rhs) = (lhs - rhs, g op)- g Le = [Zero, Neg]- g Ge = [Zero, Pos]- g Lt = [Neg]- g Gt = [Pos]- g Eql = [Zero]- g NEq = [Pos,Neg]--solve'- :: forall v. (Ord v, Show v, PrettyVar v)- => Set v- -> [(Polynomial Rational v, [Sign])]- -> Maybe (Model v)-solve' vs0 cs0 = go (Set.toList vs0) cs0- where- go :: [v] -> [(Polynomial Rational v, [Sign])] -> Maybe (Model v)- go [] cs =- if and [Sign.signOf v `elem` ss | (p,ss) <- cs, let v = P.eval (\_ -> undefined) p]- then Just Map.empty- else Nothing- go (v:vs) cs = listToMaybe $ do- (cs2, cell:_) <- project [(P.toUPolynomialOf p v, ss) | (p,ss) <- cs]- case go vs cs2 of- Nothing -> mzero- Just m -> do- let Just val = findSample m cell- seq val $ return $ Map.insert v val m---- -----------------------------------------------------------------------------showDNF :: (Ord v, Show v, PrettyVar v) => DNF (Polynomial Rational v, [Sign]) -> String-showDNF (DNF xss) = intercalate " | " [showConj xs | xs <- xss]- where- showConj xs = "(" ++ intercalate " & " [f p ss | (p,ss) <- xs] ++ ")"- f p ss = prettyShow p ++ g ss- g [Zero] = " = 0"- g [Pos] = " > 0"- g [Neg] = " < 0"- g xs- | Set.fromList xs == Set.fromList [Pos,Neg] = "/= 0"- | Set.fromList xs == Set.fromList [Zero,Pos] = ">= 0"- | Set.fromList xs == Set.fromList [Zero,Neg] = "<= 0"- | otherwise = error "showDNF: should not happen"--dumpProjection- :: (Ord v, Show v, PrettyVar v)- => [([(Polynomial Rational v, [Sign])], [Cell (Polynomial Rational v)])]- -> IO ()-dumpProjection xs =- forM_ xs $ \(gs, cells) -> do- putStrLn "============"- forM_ gs $ \(p, ss) -> do- putStrLn $ f p ss- putStrLn " =>"- forM_ cells $ \cell -> do- putStrLn $ showCell cell- where- f p ss = prettyShow p ++ g ss- g [Zero] = " = 0"- g [Pos] = " > 0"- g [Neg] = " < 0"- g xs- | Set.fromList xs == Set.fromList [Pos,Neg] = "/= 0"- | Set.fromList xs == Set.fromList [Zero,Pos] = ">= 0"- | Set.fromList xs == Set.fromList [Zero,Neg] = "<= 0"- | otherwise = error "showDNF: should not happen"--dumpSignConf- :: forall v.- (Ord v, PrettyVar v, Show v)- => [(SignConf (Polynomial Rational v), Map (Polynomial Rational v) (Set Sign))]- -> IO ()-dumpSignConf x = - forM_ x $ \(conf, as) -> do- putStrLn "============"- mapM_ putStrLn $ showSignConf conf- forM_ (Map.toList as) $ \(p, sign) ->- printf "%s %s\n" (prettyShow p) (show sign)---- -----------------------------------------------------------------------------test1a :: IO ()-test1a = mapM_ putStrLn $ showSignConf conf- where- x = P.var X- ps :: [UPolynomial (Polynomial Rational Int)]- ps = [x + 1, -2*x + 3, x]- [(conf, _)] = runM $ buildSignConf ps--test1b :: Bool-test1b = isJust $ solve vs cs- where- x = P.var X- vs = Set.singleton X- cs = [x + 1 .>. 0, -2*x + 3 .>. 0, x .>. 0]--test1c :: Bool-test1c = isJust $ do- m <- solve' (Set.singleton X) cs- guard $ and $ do- (p, ss) <- cs- let val = P.eval (m Map.!) (P.mapCoeff fromRational p)- return $ Sign.signOf val `elem` ss- where- x = P.var X- cs = [(x + 1, [Pos]), (-2*x + 3, [Pos]), (x, [Pos])]--test2a :: IO ()-test2a = mapM_ putStrLn $ showSignConf conf- where- x = P.var X- ps :: [UPolynomial (Polynomial Rational Int)]- ps = [x^(2::Int)]- [(conf, _)] = runM $ buildSignConf ps--test2b :: Bool-test2b = isNothing $ solve vs cs- where- x = P.var X- vs = Set.singleton X- cs = [x^(2::Int) .<. 0]--test = and [test1b, test1c, test2b]--test_project :: DNF (Polynomial Rational Int, [Sign])-test_project = DNF $ map fst $ project [(p', [Zero])]- where- a = P.var 0- b = P.var 1- c = P.var 2- x = P.var 3- p :: Polynomial Rational Int- p = a*x^(2::Int) + b*x + c- p' = P.toUPolynomialOf p 3--test_project_print :: IO ()-test_project_print = putStrLn $ showDNF $ test_project--test_project_2 = project [(p, [Zero]), (x, [Pos])]- where- x = P.var X- p :: UPolynomial (Polynomial Rational Int)- p = x^(2::Int) + 4*x - 10--test_project_3_print = dumpProjection $ project [(P.toUPolynomialOf p 0, [Neg])]- where- a = P.var 0- b = P.var 1- c = P.var 2- p :: Polynomial Rational Int- p = a^(2::Int) + b^(2::Int) + c^(2::Int) - 1--test_solve = solve vs [p .<. 0]- where- a = P.var 0- b = P.var 1- c = P.var 2- vs = Set.fromList [0,1,2]- p :: Polynomial Rational Int- p = a^(2::Int) + b^(2::Int) + c^(2::Int) - 1--test_collectPolynomials- :: [( Set (UPolynomial (Polynomial Rational Int))- , Map (Polynomial Rational Int) (Set Sign)- )]-test_collectPolynomials = runM $ collectPolynomials (Set.singleton p')- where- a = P.var 0- b = P.var 1- c = P.var 2- x = P.var 3- p :: Polynomial Rational Int- p = a*x^(2::Int) + b*x + c- p' = P.toUPolynomialOf p 3--test_collectPolynomials_print :: IO ()-test_collectPolynomials_print = do- forM_ test_collectPolynomials $ \(ps,s) -> do- putStrLn "============"- mapM_ (putStrLn . prettyShow) (Set.toList ps)- forM_ (Map.toList s) $ \(p, sign) ->- printf "%s %s\n" (prettyShow p) (show sign)--test_buildSignConf :: [(SignConf (Polynomial Rational Int), Map (Polynomial Rational Int) (Set Sign))]-test_buildSignConf = runM $ buildSignConf [P.toUPolynomialOf p 3]- where- a = P.var 0- b = P.var 1- c = P.var 2- x = P.var 3- p :: Polynomial Rational Int- p = a*x^(2::Int) + b*x + c--test_buildSignConf_print :: IO ()-test_buildSignConf_print = dumpSignConf test_buildSignConf--test_buildSignConf_2 :: [(SignConf (Polynomial Rational Int), Map (Polynomial Rational Int) (Set Sign))]-test_buildSignConf_2 = runM $ buildSignConf [P.toUPolynomialOf p 0 | p <- ps]- where- x = P.var 0- ps :: [Polynomial Rational Int]- ps = [x + 1, -2*x + 3, x]--test_buildSignConf_2_print :: IO ()-test_buildSignConf_2_print = dumpSignConf test_buildSignConf_2--test_buildSignConf_3 :: [(SignConf (Polynomial Rational Int), Map (Polynomial Rational Int) (Set Sign))]-test_buildSignConf_3 = runM $ buildSignConf [P.toUPolynomialOf p 0 | p <- ps]- where- x = P.var 0- ps :: [Polynomial Rational Int]- ps = [x, 2*x]--test_buildSignConf_3_print :: IO ()-test_buildSignConf_3_print = dumpSignConf test_buildSignConf_3---- ---------------------------------------------------------------------------
− src/Algorithm/CongruenceClosure.hs
@@ -1,188 +0,0 @@-{-# OPTIONS_GHC -Wall #-}--------------------------------------------------------------------------------- |--- Module : Algorithm.CongruenceClosure--- Copyright : (c) Masahiro Sakai 2012--- License : BSD-style--- --- Maintainer : masahiro.sakai@gmail.com--- Stability : provisional--- Portability : portable------ References:------ * R. Nieuwenhuis and A. Oliveras, "Fast congruence closure and extensions,"--- Information and Computation, vol. 205, no. 4, pp. 557-580, Apr. 2007.--- <http://www.lsi.upc.edu/~oliveras/espai/papers/IC.pdf>----------------------------------------------------------------------------------module Algorithm.CongruenceClosure- ( Solver- , Var- , FlatTerm (..)- , newSolver- , newVar- , merge- , areCongruent- ) where--import Prelude hiding (lookup)--import Control.Monad-import Data.IORef-import Data.Maybe-import Data.IntMap (IntMap)-import qualified Data.IntMap as IntMap--type Var = Int--data FlatTerm- = FTConst Var- | FTApp Var Var- deriving (Ord, Eq, Show)--type Eqn1 = (FlatTerm, Var)-type PendingEqn = Either (Var,Var) (Eqn1, Eqn1)--data Solver- = Solver- { svVarCounter :: IORef Int- , svPending :: IORef [PendingEqn]- , svRepresentativeTable :: IORef (IntMap Var) -- 本当は配列が良い- , svClassList :: IORef (IntMap [Var])- , svUseList :: IORef (IntMap [Eqn1])- , svLookupTable :: IORef (IntMap (IntMap Eqn1))- }--newSolver :: IO Solver-newSolver = do- vcnt <- newIORef 0- pending <- newIORef []- rep <- newIORef IntMap.empty- classes <- newIORef IntMap.empty- useList <- newIORef IntMap.empty- lookup <- newIORef IntMap.empty- return $- Solver- { svVarCounter = vcnt- , svPending = pending- , svRepresentativeTable = rep- , svClassList = classes- , svUseList = useList- , svLookupTable = lookup- }--newVar :: Solver -> IO Var-newVar solver = do- v <- readIORef (svVarCounter solver)- writeIORef (svVarCounter solver) $! v + 1- modifyIORef (svRepresentativeTable solver) (IntMap.insert v v)- modifyIORef (svClassList solver) (IntMap.insert v [v])- modifyIORef (svUseList solver) (IntMap.insert v [])- return v--merge :: Solver -> (FlatTerm, Var) -> IO ()-merge solver (s, a) = do- case s of- FTConst c -> do- addToPending solver (Left (c, a))- propagate solver- FTApp a1 a2 -> do- a1' <- getRepresentative solver a1- a2' <- getRepresentative solver a2- ret <- lookup solver a1' a2'- case ret of- Just (FTApp b1 b2, b) -> do- addToPending solver $ Right ((FTApp a1 a2, a), (FTApp b1 b2, b))- propagate solver- Nothing -> do- setLookup solver a1' a2' (FTApp a1 a2, a)- modifyIORef (svUseList solver) $- IntMap.alter (Just . ((FTApp a1 a2, a) :) . fromMaybe []) a1' .- IntMap.alter (Just . ((FTApp a1 a2, a) :) . fromMaybe []) a2'--propagate :: Solver -> IO ()-propagate solver = go- where- go = do- ps <- readIORef (svPending solver)- case ps of- [] -> return ()- (p:ps') -> do- writeIORef (svPending solver) ps'- processEqn p- go-- processEqn p = do- let (a,b) = case p of- Left (a,b) -> (a,b)- Right ((_, a), (_, b)) -> (a,b)- a' <- getRepresentative solver a- b' <- getRepresentative solver b- if a' == b'- then return ()- else do- clist <- readIORef (svClassList solver)- let classA = clist IntMap.! a'- classB = clist IntMap.! b'- if length classA < length classB- then update a' b' classA classB- else update b' a' classB classA-- update a' b' classA classB = do- modifyIORef (svRepresentativeTable solver) $ - IntMap.union (IntMap.fromList [(c,b') | c <- classA])- modifyIORef (svClassList solver) $- IntMap.insert b' (classA ++ classB) . IntMap.delete a'-- useList <- readIORef (svUseList solver)- forM_ (useList IntMap.! a') $ \(FTApp c1 c2, c) -> do -- FIXME: not exhaustive- c1' <- getRepresentative solver c1- c2' <- getRepresentative solver c2- ret <- lookup solver c1' c2'- case ret of- Just (FTApp d1 d2, d) -> do -- FIXME: not exhaustive- addToPending solver $ Right ((FTApp c1 c2, c), (FTApp d1 d2, d))- Nothing -> do- return ()- writeIORef (svUseList solver) $ IntMap.delete a' useList --areCongruent :: Solver -> FlatTerm -> FlatTerm -> IO Bool-areCongruent solver t1 t2 = do- u1 <- normalize solver t1- u2 <- normalize solver t2- return $ u1 == u2--normalize :: Solver -> FlatTerm -> IO FlatTerm-normalize solver (FTConst c) = liftM FTConst $ getRepresentative solver c-normalize solver (FTApp t1 t2) = do- u1 <- getRepresentative solver t1- u2 <- getRepresentative solver t2- ret <- lookup solver u1 u2- case ret of- Just (FTApp _ _, a) -> liftM FTConst $ getRepresentative solver a- Nothing -> return $ FTApp u1 u2--{--------------------------------------------------------------------- Helper funcions---------------------------------------------------------------------}--lookup :: Solver -> Var -> Var -> IO (Maybe Eqn1)-lookup solver c1 c2 = do- tbl <- readIORef $ svLookupTable solver- return $ do- m <- IntMap.lookup c1 tbl- IntMap.lookup c2 m--setLookup :: Solver -> Var -> Var -> Eqn1 -> IO ()-setLookup solver a1 a2 eqn = do- modifyIORef (svLookupTable solver) $- IntMap.insertWith IntMap.union a1 (IntMap.singleton a2 eqn)--addToPending :: Solver -> PendingEqn -> IO ()-addToPending solver eqn = modifyIORef (svPending solver) (eqn :)--getRepresentative :: Solver -> Var -> IO Var-getRepresentative solver c = do- m <- readIORef $ svRepresentativeTable solver- return $ m IntMap.! c
− src/Algorithm/ContiTraverso.hs
@@ -1,123 +0,0 @@--------------------------------------------------------------------------------- |--- Module : Algorithm.ContiTraverso--- Copyright : (c) Masahiro Sakai 2012--- License : BSD-style--- --- Maintainer : masahiro.sakai@gmail.com--- Stability : provisional--- Portability : portable------ References:------ * P. Conti and C. Traverso, "Buchberger algorithm and integer programming,"--- Applied Algebra, Algebraic Algorithms and Error-Correcting Codes,--- Lecture Notes in Computer Science Volume 539, 1991, pp 130-139--- <http://dx.doi.org/10.1007/3-540-54522-0_102>--- <http://posso.dm.unipi.it/users/traverso/conti-traverso-ip.ps>------ * IKEGAMI Daisuke, "数列と多項式の愛しい関係," 2011,--- <http://madscientist.jp/~ikegami/articles/IntroSequencePolynomial.html>------ * 伊藤雅史, , 平林 隆一, "整数計画問題のための b-Gröbner 基底変換アルゴリズム,"--- <http://www.kurims.kyoto-u.ac.jp/~kyodo/kokyuroku/contents/pdf/1295-27.pdf>--- ----------------------------------------------------------------------------------module Algorithm.ContiTraverso- ( solve- , solve'- ) where--import Data.Function-import qualified Data.IntMap as IM-import qualified Data.IntSet as IS-import qualified Data.Map as Map-import Data.List-import Data.Monoid-import Data.Ratio-import Data.VectorSpace--import Data.ArithRel-import qualified Data.LA as LA-import Data.OptDir-import Data.Polynomial (Polynomial, UPolynomial, Monomial, MonomialOrder)-import qualified Data.Polynomial as P-import Data.Polynomial.GroebnerBasis as GB-import Data.Var-import qualified Algorithm.LPUtil as LPUtil--solve :: MonomialOrder Var -> VarSet -> OptDir -> LA.Expr Rational -> [LA.Atom Rational] -> Maybe (Model Integer)-solve cmp vs dir obj cs = do- m <- solve' cmp vs obj3 cs3- return . IM.map round . mt . IM.map fromInteger $ m- where- ((obj2,cs2), mt) = LPUtil.toStandardForm (if dir == OptMin then obj else negateV obj, cs)- obj3 = LA.mapCoeff g obj2- where- g = round . (c*)- c = fromInteger $ foldl' lcm 1 [denominator c | (c,_) <- LA.terms obj]- cs3 = map f cs2- f (lhs,rhs) = (LA.mapCoeff g lhs, g rhs)- where- g = round . (c*)- c = fromInteger $ foldl' lcm 1 [denominator c | (c,_) <- LA.terms lhs]--solve' :: MonomialOrder Var -> VarSet -> LA.Expr Integer -> [(LA.Expr Integer, Integer)] -> Maybe (Model Integer)-solve' cmp vs' obj cs- | or [c < 0 | (c,x) <- LA.terms obj, x /= LA.unitVar] = error "all coefficient of cost function should be non-negative"- | otherwise =- if IM.keysSet (IM.filter (/= 0) m) `IS.isSubsetOf` vs'- then Just $ IM.filterWithKey (\y _ -> y `IS.member` vs') m- else Nothing-- where- vs :: [Var]- vs = IS.toList vs'-- v2 :: Var- v2 = if IS.null vs' then 0 else IS.findMax vs' + 1-- vs2 :: [Var]- vs2 = [v2 .. v2 + length cs - 1]-- vs2' :: IS.IntSet- vs2' = IS.fromList vs2-- t :: Var- t = v2 + length cs-- cmp2 :: MonomialOrder Var- cmp2 = elimOrdering (IS.fromList vs2) `mappend` elimOrdering (IS.singleton t) `mappend` costOrdering obj `mappend` cmp-- gb :: [Polynomial Rational Var]- gb = GB.basis' GB.defaultOptions cmp2 (product (map P.var (t:vs2)) - 1 : phi)- where- phi = do- xj <- vs- let aj = [(yi, aij) | (yi,(ai,_)) <- zip vs2 cs, let aij = LA.coeff xj ai]- return $ product [P.var yi ^ aij | (yi, aij) <- aj, aij > 0]- - product [P.var yi ^ (-aij) | (yi, aij) <- aj, aij < 0] * P.var xj-- yb = product [P.var yi ^ bi | ((_,bi),yi) <- zip cs vs2]-- [(_,z)] = P.terms (P.reduce cmp2 yb gb)-- m = mkModel (vs++vs2++[t]) z--mkModel :: [Var] -> Monomial Var -> Model Integer-mkModel vs xs = IM.fromDistinctAscList (Map.toAscList (P.mindicesMap xs)) `IM.union` IM.fromList [(x, 0) | x <- vs]--- IM.union is left-biased--costOrdering :: LA.Expr Integer -> MonomialOrder Var-costOrdering obj = compare `on` f- where- vs = vars obj- f xs = LA.evalExpr (mkModel (IS.toList vs) xs) obj--elimOrdering :: IS.IntSet -> MonomialOrder Var-elimOrdering xs = compare `on` f- where- f ys = not $ IS.null $ xs `IS.intersection` ys'- where- ys' = IS.fromDistinctAscList [y | (y,_) <- Map.toAscList $ P.mindicesMap ys]
− src/Algorithm/Cooper.hs
@@ -1,50 +0,0 @@-{-# OPTIONS_GHC -Wall #-}--------------------------------------------------------------------------------- |--- Module : Algorithm.Cooper--- Copyright : (c) Masahiro Sakai 2011--- License : BSD-style--- --- Maintainer : masahiro.sakai@gmail.com--- Stability : provisional--- Portability : non-portable (FlexibleInstances)------ Naive implementation of Cooper's algorithm------ Reference:--- --- * <http://hagi.is.s.u-tokyo.ac.jp/pub/staff/hagiya/kougiroku/ronri/5.txt>--- --- * <http://www.cs.cmu.edu/~emc/spring06/home1_files/Presburger%20Arithmetic.ppt>--- --- See also:------ * <http://hackage.haskell.org/package/presburger>----------------------------------------------------------------------------------module Algorithm.Cooper- (- -- * Language of presburger arithmetics- ExprZ- , Lit (..)- , QFFormula (..)- , fromLAAtom- , (.|.)-- -- * Projection- , project- , projectCases- , projectCasesN-- -- * Quantifier elimination- , eliminateQuantifiers-- -- * Constraint solving- , solve- , solveQFFormula- , solveFormula- , solveQFLA- ) where--import Algorithm.Cooper.Core-import Algorithm.Cooper.FOL
− src/Algorithm/Cooper/Core.hs
@@ -1,449 +0,0 @@-{-# OPTIONS_GHC -Wall #-}-{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances #-}--------------------------------------------------------------------------------- |--- Module : Algorithm.Cooper.Core--- Copyright : (c) Masahiro Sakai 2011-2013--- License : BSD-style--- --- Maintainer : masahiro.sakai@gmail.com--- Stability : provisional--- Portability : non-portable (FlexibleInstances)------ Naive implementation of Cooper's algorithm------ Reference:--- --- * <http://hagi.is.s.u-tokyo.ac.jp/pub/staff/hagiya/kougiroku/ronri/5.txt>--- --- * <http://www.cs.cmu.edu/~emc/spring06/home1_files/Presburger%20Arithmetic.ppt>--- --- See also:------ * <http://hackage.haskell.org/package/presburger>----------------------------------------------------------------------------------module Algorithm.Cooper.Core- (- -- * Language of presburger arithmetics- ExprZ- , Lit (..)- , evalLit- , QFFormula (..)- , fromLAAtom- , (.|.)- , evalQFFormula-- -- * Projection- , project- , projectN- , projectCases- , projectCasesN-- -- * Constraint solving- , solve- , solveQFFormula- , solveQFLA- ) where--import Control.Monad-import Data.List-import Data.Maybe-import qualified Data.IntMap as IM-import qualified Data.IntSet as IS-import Data.VectorSpace hiding (project)--import Algebra.Lattice-import Algebra.Lattice.Boolean--import Data.ArithRel-import qualified Data.LA as LA-import Data.Var-import qualified Algorithm.FourierMotzkin as FM-import qualified Algorithm.FourierMotzkin.Core as FM---- ------------------------------------------------------------------------------- | Linear arithmetic expression over integers.-type ExprZ = LA.Expr Integer--fromLAAtom :: LA.Atom Rational -> QFFormula-fromLAAtom (Rel a op b) = rel op a' b'- where- (e1,c1) = FM.toRat a- (e2,c2) = FM.toRat b- a' = c2 *^ e1- b' = c1 *^ e2--leZ, ltZ, geZ, gtZ :: ExprZ -> ExprZ -> Lit-leZ e1 e2 = e1 `ltZ` (e2 ^+^ LA.constant 1)-ltZ e1 e2 = Pos $ (e2 ^-^ e1)-geZ = flip leZ-gtZ = flip gtZ--eqZ :: ExprZ -> ExprZ -> QFFormula-eqZ e1 e2 = Lit (e1 `leZ` e2) .&&. Lit (e1 `geZ` e2)---- | Literal--- --- * @Pos e@ means @e > 0@--- --- * @Divisible True d e@ means @e@ can be divided by @d@ (i.e. @d|e@)--- --- * @Divisible False d e@ means @e@ can not be divided by @d@ (i.e. @¬(d|e)@)-data Lit- = Pos ExprZ- | Divisible Bool Integer ExprZ- deriving (Show, Eq, Ord)--instance Variables Lit where- vars (Pos t) = vars t- vars (Divisible _ _ t) = vars t--instance Complement Lit where- notB (Pos e) = e `leZ` LA.constant 0- notB (Divisible b c e) = Divisible (not b) c e---- | quantifier-free negation normal form-data QFFormula- = T'- | F'- | And' QFFormula QFFormula- | Or' QFFormula QFFormula- | Lit Lit- deriving (Show, Eq, Ord)--instance Complement QFFormula where- notB T' = F'- notB F' = T'- notB (And' a b) = Or' (notB a) (notB b)- notB (Or' a b) = And' (notB a) (notB b)- notB (Lit lit) = Lit (notB lit)--instance JoinSemiLattice QFFormula where- join = Or'--instance MeetSemiLattice QFFormula where- meet = And'--instance Lattice QFFormula--instance BoundedJoinSemiLattice QFFormula where- bottom = F'--instance BoundedMeetSemiLattice QFFormula where- top = T'--instance BoundedLattice QFFormula--instance Boolean QFFormula--instance Variables QFFormula where- vars T' = IS.empty- vars F' = IS.empty- vars (And' a b) = vars a `IS.union` vars b- vars (Or' a b) = vars a `IS.union` vars b- vars (Lit l) = vars l--instance IsRel (LA.Expr Integer) QFFormula where- rel op lhs rhs =- case op of- Le -> Lit $ leZ lhs rhs- Ge -> Lit $ geZ lhs rhs- Lt -> Lit $ ltZ lhs rhs- Gt -> Lit $ gtZ lhs rhs- Eql -> eqZ lhs rhs- NEq -> notB $ rel Eql lhs rhs--(.|.) :: Integer -> ExprZ -> QFFormula-n .|. e = Lit $ Divisible True n e--subst1 :: Var -> ExprZ -> QFFormula -> QFFormula-subst1 x e = go- where- go T' = T'- go F' = F'- go (And' a b) = And' (go a) (go b)- go (Or' a b) = Or' (go a) (go b)- go (Lit (Divisible b c e1)) = Lit $ Divisible b c $ LA.applySubst1 x e e1- go (Lit (Pos e1)) = Lit $ Pos $ LA.applySubst1 x e e1--simplify :: QFFormula -> QFFormula-simplify (And' a b) = simplify1 $ And' (simplify a) (simplify b)-simplify (Or' a b) = simplify1 $ Or' (simplify a) (simplify b)-simplify formula = simplify1 formula--simplify1 :: QFFormula -> QFFormula-simplify1 T' = T'-simplify1 F' = F'-simplify1 (And' a b) =- case (a, b) of- (T', b') -> b'- (a', T') -> a'- (F', _) -> false- (_, F') -> false- (a',b') -> a' .&&. b'-simplify1 (Or' a b) =- case (a, b) of- (F', b') -> b'- (a', F') -> a'- (T', _) -> true- (_, T') -> true- (a',b') -> a' .||. b'-simplify1 (Lit lit) = simplifyLit lit--simplifyLit :: Lit -> QFFormula-simplifyLit (Pos e) =- case LA.asConst e of- Just c -> if c > 0 then true else false- Nothing ->- -- e > 0 <=> e - 1 >= 0- -- <=> LA.mapCoeff (`div` d) (e - 1) >= 0- -- <=> LA.mapCoeff (`div` d) (e - 1) + 1 > 0- Lit $ Pos $ LA.mapCoeff (`div` d) e1 ^+^ LA.constant 1- where- e1 = e ^-^ LA.constant 1- d = if null cs then 1 else abs $ foldl1' gcd cs- cs = [c | (c,x) <- LA.terms e1, x /= LA.unitVar]-simplifyLit lit@(Divisible b c e)- | LA.coeff LA.unitVar e `mod` d /= 0 = if b then false else true- | c' == 1 = if b then true else false- | d == 1 = Lit lit- | otherwise = Lit $ Divisible b c' e'- where- d = abs $ foldl' gcd c [c2 | (c2,x) <- LA.terms e, x /= LA.unitVar]- c' = c `div` d- e' = LA.mapCoeff (`div` d) e--evalQFFormula :: Model Integer -> QFFormula -> Bool-evalQFFormula m = f- where- f T' = True- f F' = False- f (And' x1 x2) = f x1 && f x2- f (Or' x1 x2) = f x1 || f x2- f (Lit lit) = evalLit m lit--evalLit :: Model Integer -> Lit -> Bool-evalLit m (Pos e) = LA.evalExpr m e > 0-evalLit m (Divisible True n e) = LA.evalExpr m e `mod` n == 0-evalLit m (Divisible False n e) = LA.evalExpr m e `mod` n /= 0---- -----------------------------------------------------------------------------data Witness = WCase1 Integer ExprZ | WCase2 Integer Integer Integer [ExprZ]--evalWitness :: Model Integer -> Witness -> Integer-evalWitness model (WCase1 c e) = LA.evalExpr model e `div` c-evalWitness model (WCase2 c j delta us)- | null us' = j `div` c- | otherwise = (j + (((u - delta - 1) `div` delta) * delta)) `div` c- where- us' = map (LA.evalExpr model) us- u = minimum us'---- -----------------------------------------------------------------------------project :: Var -> QFFormula -> (QFFormula, Model Integer -> Model Integer)-project x formula = (formula', mt)- where- xs = projectCases x formula- formula' = simplify $ orB [phi | (phi,_) <- xs, phi /= F']- mt m = head $ do- (phi, mt') <- xs- guard $ evalQFFormula m phi- return $ mt' m--projectN :: VarSet -> QFFormula -> (QFFormula, Model Integer -> Model Integer)-projectN vs2 = f (IS.toList vs2)- where- f :: [Var] -> QFFormula -> (QFFormula, Model Integer -> Model Integer)- f [] formula = (formula, id)- f (v:vs) formula = (formula3, mt1 . mt2)- where- (formula2, mt1) = project v formula- (formula3, mt2) = f vs formula2--projectCases :: Var -> QFFormula -> [(QFFormula, Model Integer -> Model Integer)]-projectCases x formula = do- (phi, wit) <- projectCases' x formula- return (phi, \m -> IM.insert x (evalWitness m wit) m)--projectCases' :: Var -> QFFormula -> [(QFFormula, Witness)]-projectCases' x formula = [(simplify phi, w) | (phi,w) <- case1 ++ case2]- where- -- xの係数の最小公倍数- c :: Integer- c = f formula- where- f :: QFFormula -> Integer- f T' = 1- f F' = 1- f (And' a b) = lcm (f a) (f b)- f (Or' a b) = lcm (f a) (f b)- f (Lit (Pos e)) = fromMaybe 1 (LA.lookupCoeff x e)- f (Lit (Divisible _ _ e)) = fromMaybe 1 (LA.lookupCoeff x e)- - -- 式をスケールしてxの係数の絶対値をcへと変換し、その後cxをxで置き換え、- -- xがcで割り切れるという制約を追加した論理式- formula1 :: QFFormula- formula1 = simplify $ f formula .&&. Lit (Divisible True c (LA.var x))- where- f :: QFFormula -> QFFormula- f T' = T'- f F' = F'- f (And' a b) = f a .&&. f b- f (Or' a b) = f a .||. f b- f lit@(Lit (Pos e)) =- case LA.lookupCoeff x e of- Nothing -> lit- Just a ->- let s = abs (c `div` a)- in Lit $ Pos $ g s e- f lit@(Lit (Divisible b d e)) =- case LA.lookupCoeff x e of- Nothing -> lit- Just a ->- let s = abs (c `div` a)- in Lit $ Divisible b (s*d) $ g s e-- g :: Integer -> ExprZ -> ExprZ- g s = LA.mapCoeffWithVar (\c' x' -> if x==x' then signum c' else s*c')-- -- d|x+t という形の論理式の d の最小公倍数- delta :: Integer- delta = f formula1- where- f :: QFFormula -> Integer- f T' = 1- f F' = 1- f (And' a b) = lcm (f a) (f b)- f (Or' a b) = lcm (f a) (f b)- f (Lit (Divisible _ d _)) = d- f (Lit (Pos _)) = 1-- -- ts = {t | t < x は formula1 に現れる原子論理式}- ts :: [ExprZ]- ts = f formula1- where- f :: QFFormula -> [ExprZ]- f T' = []- f F' = []- f (And' a b) = f a ++ f b- f (Or' a b) = f a ++ f b- f (Lit (Divisible _ _ _)) = []- f (Lit (Pos e)) =- case LA.extractMaybe x e of- Nothing -> []- Just (1, e') -> [negateV e'] -- Pos e <=> (x + e' > 0) <=> (-e' < x)- Just (-1, _) -> [] -- Pos e <=> (-x + e' > 0) <=> (x < e')- _ -> error "should not happen"-- -- formula1を真にする最小のxが存在する場合- case1 :: [(QFFormula, Witness)]- case1 = [ (subst1 x e formula1, WCase1 c e)- | j <- [1..delta], t <- ts, let e = t ^+^ LA.constant j ]-- -- formula1のなかの x < t を真に t < x を偽に置き換えた論理式- formula2 :: QFFormula- formula2 = simplify $ f formula1- where - f :: QFFormula -> QFFormula- f T' = T'- f F' = F'- f (And' a b) = f a .&&. f b- f (Or' a b) = f a .||. f b- f lit@(Lit (Pos e)) =- case LA.lookupCoeff x e of- Nothing -> lit- Just 1 -> F' -- Pos e <=> ( x + e' > 0) <=> -e' < x- Just (-1) -> T' -- Pos e <=> (-x + e' > 0) <=> x < e'- _ -> error "should not happen"- f lit@(Lit (Divisible _ _ _)) = lit-- -- us = {u | x < u は formula1 に現れる原子論理式}- us :: [ExprZ]- us = f formula1- where- f :: QFFormula -> [ExprZ]- f T' = []- f F' = []- f (And' a b) = f a ++ f b- f (Or' a b) = f a ++ f b- f (Lit (Pos e)) =- case LA.extractMaybe x e of- Nothing -> []- Just (1, _) -> [] -- Pos e <=> ( x + e' > 0) <=> -e' < x- Just (-1, e') -> [e'] -- Pos e <=> (-x + e' > 0) <=> x < e'- _ -> error "should not happen"- f (Lit (Divisible _ _ _)) = []-- -- formula1を真にする最小のxが存在しない場合- case2 :: [(QFFormula, Witness)]- case2 = [(subst1 x (LA.constant j) formula2, WCase2 c j delta us) | j <- [1..delta]]--projectCasesN :: VarSet -> QFFormula -> [(QFFormula, Model Integer -> Model Integer)]-projectCasesN vs2 = f (IS.toList vs2)- where- f :: [Var] -> QFFormula -> [(QFFormula, Model Integer -> Model Integer)]- f [] formula = return (formula, id)- f (v:vs) formula = do- (formula2, mt1) <- projectCases v formula- (formula3, mt2) <- f vs formula2- return (formula3, mt1 . mt2)---- -----------------------------------------------------------------------------solveQFFormula :: VarSet -> QFFormula -> Maybe (Model Integer)-solveQFFormula vs formula = listToMaybe $ do- (formula2, mt) <- projectCasesN vs formula- case formula2 of- T' -> return $ mt IM.empty- _ -> mzero---- | solve a (open) quantifier-free formula-solve :: VarSet -> [LA.Atom Rational] -> Maybe (Model Integer)-solve vs cs = solveQFFormula vs $ andB $ map fromLAAtom cs---- | solve a (open) quantifier-free formula-solveQFLA :: VarSet -> [LA.Atom Rational] -> VarSet -> Maybe (Model Rational)-solveQFLA vs cs ivs = listToMaybe $ do- (cs2, mt) <- FM.projectN rvs cs- m <- maybeToList $ solve ivs cs2- return $ mt $ IM.map fromInteger m- where- rvs = vs `IS.difference` ivs---- -----------------------------------------------------------------------------testHagiya :: QFFormula-testHagiya = fst $ project 1 $ andB [c1, c2, c3]- where- [x,y,z] = map LA.var [1..3]- c1 = x .<. (y ^+^ y)- c2 = z .<. x- c3 = 3 .|. x--{--∃ x. 0 < y+y ∧ z<x ∧ 3|x-⇔-(2y-z > 0 ∧ 3|z+1) ∨ (2y-z > -2 ∧ 3|z+2) ∨ (2y-z > -3 ∧ 3|z+3)--}--test3 :: QFFormula-test3 = fst $ project 1 $ andB [p1,p2,p3,p4]- where- x = LA.var 0- y = LA.var 1- p1 = LA.constant 0 .<. y- p2 = 2 *^ x .<. y- p3 = y .<. x ^+^ LA.constant 2- p4 = 2 .|. y--{--∃ y. 0 < y ∧ 2x<y ∧ y < x+2 ∧ 2|y-⇔-(2x < 2 ∧ 0 < x) ∨ (0 < 2x+2 ∧ x < 0)--}---- ---------------------------------------------------------------------------
− src/Algorithm/Cooper/FOL.hs
@@ -1,54 +0,0 @@-{-# OPTIONS_GHC -Wall #-}--------------------------------------------------------------------------------- |--- Module : Algorithm.Cooper.FOL--- Copyright : (c) Masahiro Sakai 2011-2013--- License : BSD-style--- --- Maintainer : masahiro.sakai@gmail.com--- Stability : provisional--- Portability : portable--- -------------------------------------------------------------------------------module Algorithm.Cooper.FOL- ( eliminateQuantifiers- , solveFormula- ) where--import Control.Monad--import Algebra.Lattice.Boolean--import Data.ArithRel-import qualified Data.FOL.Arith as FOL-import qualified Data.LA.FOL as LAFOL-import Data.Var--import Algorithm.Cooper.Core---- | eliminate quantifiers and returns equivalent quantifier-free formula.-eliminateQuantifiers :: FOL.Formula (FOL.Atom Rational) -> Maybe QFFormula-eliminateQuantifiers = f- where- f FOL.T = return T'- f FOL.F = return F'- f (FOL.Atom (Rel a op b)) = do- a' <- LAFOL.fromFOLExpr a- b' <- LAFOL.fromFOLExpr b- return $ fromLAAtom (Rel a' op b')- f (FOL.And a b) = liftM2 (.&&.) (f a) (f b)- f (FOL.Or a b) = liftM2 (.||.) (f a) (f b)- f (FOL.Not a) = f (FOL.pushNot a)- f (FOL.Imply a b) = f $ FOL.Or (FOL.Not a) b- f (FOL.Equiv a b) = f $ FOL.And (FOL.Imply a b) (FOL.Imply b a)- f (FOL.Forall x body) = liftM notB $ f $ FOL.Exists x $ FOL.Not body- f (FOL.Exists x body) = liftM (fst . project x) (f body)--solveFormula :: VarSet -> FOL.Formula (FOL.Atom Rational) -> FOL.SatResult Integer-solveFormula vs formula =- case eliminateQuantifiers formula of- Nothing -> FOL.Unknown- Just formula' ->- case solveQFFormula vs formula' of- Nothing -> FOL.Unsat- Just m -> FOL.Sat m
− src/Algorithm/FOLModelFinder.hs
@@ -1,555 +0,0 @@-{-# LANGUAGE TypeSynonymInstances, FlexibleInstances, ScopedTypeVariables #-}--------------------------------------------------------------------------------- |--- Module : Algorithm.FOLModelFinder--- Copyright : (c) Masahiro Sakai 2012--- License : BSD-style--- --- Maintainer : masahiro.sakai@gmail.com--- Stability : provisional--- Portability : non-portable (TypeSynonymInstances, FlexibleInstances, ScopedTypeVariables)------ A simple model finder.------ References:------ * Koen Claessen and Niklas Sörensson.--- New Techniques that Improve MACE-style Finite Model Finding.--- CADE-19. 2003.--- <http://www.cs.miami.edu/~geoff/Conferences/CADE/Archive/CADE-19/WS4/04.pdf>----------------------------------------------------------------------------------module Algorithm.FOLModelFinder- (- -- * Formula types- Var- , FSym- , PSym- , GenLit (..)- , Term (..)- , Atom (..)- , Lit- , Clause- , Formula- , GenFormula (..)- , toSkolemNF-- -- * Model types- , Model (..)- , Entity- , showModel- , showEntity-- -- * Main function- , findModel- ) where--import Control.Monad-import Control.Monad.State-import Data.Array.IArray-import Data.IORef-import Data.List-import Data.Maybe-import Data.Map (Map)-import qualified Data.Map as Map-import Data.Set (Set)-import qualified Data.Set as Set-import Text.Printf--import qualified SAT---- ------------------------------------------------------------------------------- | Variable-type Var = String---- | Function Symbol-type FSym = String---- | Predicate Symbol-type PSym = String--class Vars a where- vars :: a -> Set Var--instance Vars a => Vars [a] where- vars = Set.unions . map vars---- | Generalized literal type parameterized by atom type-data GenLit a- = Pos a- | Neg a- deriving (Show, Eq, Ord)--instance Vars a => Vars (GenLit a) where- vars (Pos a) = vars a- vars (Neg a) = vars a---- ------------------------------------------------------------------------------- | Term-data Term- = TmApp FSym [Term]- | TmVar Var- deriving (Show, Eq, Ord)--data Atom = PApp PSym [Term]- deriving (Show, Eq, Ord)--type Lit = GenLit Atom--type Clause = [Lit]--instance Vars Term where- vars (TmVar v) = Set.singleton v- vars (TmApp _ ts) = vars ts--instance Vars Atom where- vars (PApp _ ts) = vars ts---- ------------------------------------------------------------------------------- Formula type-type Formula = GenFormula Atom---- Generalized formula parameterized by atom type-data GenFormula a- = T- | F- | Atom a- | And (GenFormula a) (GenFormula a)- | Or (GenFormula a) (GenFormula a)- | Not (GenFormula a)- | Imply (GenFormula a) (GenFormula a)- | Equiv (GenFormula a) (GenFormula a)- | Forall Var (GenFormula a)- | Exists Var (GenFormula a)- deriving (Show, Eq, Ord)--instance Vars a => Vars (GenFormula a) where- vars T = Set.empty- vars F = Set.empty- vars (Atom a) = vars a- vars (And phi psi) = vars phi `Set.union` vars psi- vars (Or phi psi) = vars phi `Set.union` vars psi- vars (Not phi) = vars phi- vars (Imply phi psi) = vars phi `Set.union` vars psi- vars (Equiv phi psi) = vars phi `Set.union` vars psi- vars (Forall v phi) = Set.delete v (vars phi)- vars (Exists v phi) = Set.delete v (vars phi)--toNNF :: Formula -> Formula-toNNF = f- where - f (And phi psi) = f phi `And` f psi- f (Or phi psi) = f phi `Or` f psi- f (Not phi) = g phi- f (Imply phi psi) = g phi `Or` f psi- f (Equiv phi psi) = f (And (Imply phi psi) (Imply psi phi))- f (Forall v phi) = Forall v (f phi)- f (Exists v phi) = Exists v (f phi)- f phi = phi-- g :: Formula -> Formula- g T = F- g F = T- g (And phi psi) = g phi `Or` g psi- g (Or phi psi) = g phi `And` g psi- g (Not phi) = f phi- g (Imply phi psi) = f phi `And` g psi- g (Equiv phi psi) = g (And (Imply phi psi) (Imply psi phi))- g (Forall v phi) = Exists v (g phi)- g (Exists v phi) = Forall v (g phi)- g (Atom a) = Not (Atom a)---- | normalize a formula into a skolem normal form.--- --- TODO:--- --- * Tseitin encoding-toSkolemNF :: forall m. Monad m => (String -> Int -> m FSym) -> Formula -> m [Clause]-toSkolemNF skolem phi = f [] Map.empty (toNNF phi)- where- f :: [Var] -> Map Var Term -> Formula -> m [Clause]- f _ _ T = return []- f _ _ F = return [[]]- f _ s (Atom a) = return [[Pos (substAtom s a)]]- f _ s (Not (Atom a)) = return [[Neg (substAtom s a)]]- f uvs s (And phi psi) = do- phi' <- f uvs s phi- psi' <- f uvs s psi- return $ phi' ++ psi'- f uvs s (Or phi psi) = do- phi' <- f uvs s phi- psi' <- f uvs s psi- return $ [c1++c2 | c1 <- phi', c2 <- psi']- f uvs s psi@(Forall v phi) = do- let v' = gensym v (vars psi `Set.union` Set.fromList uvs)- f (v' : uvs) (Map.insert v (TmVar v') s) phi- f uvs s (Exists v phi) = do- fsym <- skolem v (length uvs)- f uvs (Map.insert v (TmApp fsym [TmVar v | v <- reverse uvs]) s) phi- f _ _ _ = error "toSkolemNF: should not happen"-- gensym :: String -> Set Var -> Var- gensym template vs = head [name | name <- names, Set.notMember name vs]- where- names = template : [template ++ show n | n <-[1..]]-- substAtom :: Map Var Term -> Atom -> Atom- substAtom s (PApp p ts) = PApp p (map (substTerm s) ts)-- substTerm :: Map Var Term -> Term -> Term- substTerm s (TmVar v) = fromMaybe (TmVar v) (Map.lookup v s)- substTerm s (TmApp f ts) = TmApp f (map (substTerm s) ts)--test_toSkolemNF = do- ref <- newIORef 0- let skolem name _ = do- n <- readIORef ref- let fsym = name ++ "#" ++ show n- writeIORef ref (n+1)- return fsym-- -- ∀x. animal(a) → (∃y. heart(y) ∧ has(x,y))- let phi = Forall "x" $- Imply- (Atom (PApp "animal" [TmVar "x"]))- (Exists "y" $- And (Atom (PApp "heart" [TmVar "y"]))- (Atom (PApp "has" [TmVar "x", TmVar "y"])))-- phi' <- toSkolemNF skolem phi-- print phi'-{--[[Neg (PApp "animal" [TmVar "x"]),Pos (PApp "heart" [TmApp "y#0" [TmVar "x"]])],[Neg (PApp "animal" [TmVar "x"]),Pos (PApp "has" [TmVar "x",TmApp "y#0" [TmVar "x"]])]]--{¬animal(x) ∨ heart(y#1(x)), ¬animal(x) ∨ has(x1, y#0(x))}--}---- ------------------------------------------------------------------------------- | Shallow term-data SGenTerm v- = STmApp FSym [v]- | STmVar v- deriving (Show, Eq, Ord)---- | Shallow atom-data SGenAtom v- = SPApp PSym [v]- | SEq (SGenTerm v) v- deriving (Show, Eq, Ord)--type STerm = SGenTerm Var-type SAtom = SGenAtom Var-type SLit = GenLit SAtom-type SClause = [SLit]--instance Vars STerm where- vars (STmApp _ xs) = Set.fromList xs- vars (STmVar v) = Set.singleton v--instance Vars SAtom where- vars (SPApp _ xs) = Set.fromList xs- vars (SEq t v) = Set.insert v (vars t)---- -----------------------------------------------------------------------------type M = State (Set Var, Int, [SLit])--flatten :: Clause -> SClause-flatten c =- case runState (mapM flattenLit c) (vars c, 0, []) of- (c, (_,_,ls)) -> removeNegEq $ ls ++ c- where- gensym :: M Var- gensym = do- (vs, n, ls) <- get- let go m = do- let v = "#" ++ show m- if v `Set.member` vs- then go (m+1)- else do- put (Set.insert v vs, m+1, ls)- return v- go n-- flattenLit :: Lit -> M SLit- flattenLit (Pos a) = liftM Pos $ flattenAtom a- flattenLit (Neg a) = liftM Neg $ flattenAtom a- - flattenAtom :: Atom -> M SAtom- flattenAtom (PApp "=" [TmVar x, TmVar y]) = return $ SEq (STmVar x) y- flattenAtom (PApp "=" [TmVar x, TmApp f ts]) = do- xs <- mapM flattenTerm ts- return $ SEq (STmApp f xs) x- flattenAtom (PApp "=" [TmApp f ts, TmVar x]) = do- xs <- mapM flattenTerm ts- return $ SEq (STmApp f xs) x- flattenAtom (PApp "=" [TmApp f ts, t2]) = do- xs <- mapM flattenTerm ts- x <- flattenTerm t2- return $ SEq (STmApp f xs) x- flattenAtom (PApp p ts) = do- xs <- mapM flattenTerm ts- return $ SPApp p xs- - flattenTerm :: Term -> M Var- flattenTerm (TmVar x) = return x- flattenTerm (TmApp f ts) = do- xs <- mapM flattenTerm ts- x <- gensym- (vs, n, ls) <- get- put (vs, n, Neg (SEq (STmApp f xs) x) : ls)- return x-- removeNegEq :: SClause -> SClause- removeNegEq = go []- where- go r [] = r- go r (Neg (SEq (STmVar x) y) : ls) = go (map (substLit x y) r) (map (substLit x y) ls)- go r (l : ls) = go (l : r) ls-- substLit :: Var -> Var -> SLit -> SLit- substLit x y (Pos a) = Pos $ substAtom x y a - substLit x y (Neg a) = Neg $ substAtom x y a-- substAtom :: Var -> Var -> SAtom -> SAtom- substAtom x y (SPApp p xs) = SPApp p (map (substVar x y) xs)- substAtom x y (SEq t v) = SEq (substTerm x y t) (substVar x y v)-- substTerm :: Var -> Var -> STerm -> STerm- substTerm x y (STmApp f xs) = STmApp f (map (substVar x y) xs)- substTerm x y (STmVar v) = STmVar (substVar x y v)-- substVar :: Var -> Var -> Var -> Var- substVar x y v- | v==x = y- | otherwise = v--test_flatten = flatten [Pos $ PApp "P" [TmApp "a" [], TmApp "f" [TmVar "x"]]]--{--[Pos $ PApp "P" [TmApp "a" [], TmApp "f" [TmVar "x"]]]--P(a, f(x))--[Pos (SPApp "P" ["#0","#1"]),Neg (SEq (STmApp "a" []) "#0"),Neg (SEq (STmApp "f" ["x"]) "#1")]--f(x) ≠ z ∨ a ≠ y ∨ P(y,z)-(f(x) = z ∧ a = y) → P(y,z)--}---- ------------------------------------------------------------------------------- | Element of model.-type Entity = Int---- | print entity-showEntity :: Entity -> String-showEntity e = "$" ++ show e--showEntityTuple :: [Entity] -> String-showEntityTuple xs = printf "(%s)" $ intercalate ", " $ map showEntity xs---- -----------------------------------------------------------------------------type GroundTerm = SGenTerm Entity-type GroundAtom = SGenAtom Entity-type GroundLit = GenLit GroundAtom-type GroundClause = [GroundLit]--type Subst = Map Var Entity--enumSubst :: Set Var -> [Entity] -> [Subst]-enumSubst vs univ = do- ps <- sequence [[(v,e) | e <- univ] | v <- Set.toList vs]- return $ Map.fromList ps--applySubst :: Subst -> SClause -> GroundClause-applySubst s = map substLit- where- substLit :: SLit -> GroundLit- substLit (Pos a) = Pos $ substAtom a- substLit (Neg a) = Neg $ substAtom a-- substAtom :: SAtom -> GroundAtom- substAtom (SPApp p xs) = SPApp p (map substVar xs)- substAtom (SEq t v) = SEq (substTerm t) (substVar v)-- substTerm :: STerm -> GroundTerm- substTerm (STmApp f xs) = STmApp f (map substVar xs)- substTerm (STmVar v) = STmVar (substVar v)-- substVar :: Var -> Entity- substVar = (s Map.!)--simplifyGroundClause :: GroundClause -> Maybe GroundClause-simplifyGroundClause = liftM concat . mapM f- where- f :: GroundLit -> Maybe [GroundLit]- f (Pos (SEq (STmVar x) y)) = if x==y then Nothing else return []- f lit = return [lit]--collectFSym :: SClause -> Set (FSym, Int)-collectFSym = Set.unions . map f- where- f :: SLit -> Set (FSym, Int)- f (Pos a) = g a- f (Neg a) = g a-- g :: SAtom -> Set (FSym, Int)- g (SEq (STmApp f xs) _) = Set.singleton (f, length xs)- g _ = Set.empty--collectPSym :: SClause -> Set (PSym, Int)-collectPSym = Set.unions . map f- where- f :: SLit -> Set (PSym, Int)- f (Pos a) = g a- f (Neg a) = g a-- g :: SAtom -> Set (PSym, Int)- g (SPApp p xs) = Set.singleton (p, length xs)- g _ = Set.empty---- -----------------------------------------------------------------------------data Model- = Model- { mUniverse :: [Entity]- , mRelations :: Map PSym [[Entity]]- , mFunctions :: Map FSym [([Entity], Entity)]- }--showModel :: Model -> [String]-showModel m = - printf "DOMAIN = {%s}" (intercalate ", " (map showEntity (mUniverse m))) :- [ printf "%s = { %s }" p s- | (p, xss) <- Map.toList (mRelations m)- , let s = intercalate ", " [if length xs == 1 then showEntity (head xs) else showEntityTuple xs | xs <- xss]- ] ++- [ printf "%s%s = %s" f (if length xs == 0 then "" else showEntityTuple xs) (showEntity y)- | (f, xss) <- Map.toList (mFunctions m)- , (xs, y) <- xss- ]---- -----------------------------------------------------------------------------findModel :: Int -> [Clause] -> IO (Maybe Model)-findModel size cs = do- let univ = [0..size-1]-- let cs2 = map flatten cs- fs = Set.unions $ map collectFSym cs2- ps = Set.unions $ map collectPSym cs2-- solver <- SAT.newSolver-- ref <- newIORef Map.empty-- let translateAtom :: GroundAtom -> IO SAT.Var- translateAtom (SEq (STmVar _) _) = error "should not happen"- translateAtom a = do- m <- readIORef ref- case Map.lookup a m of- Just b -> return b- Nothing -> do- b <- SAT.newVar solver- writeIORef ref (Map.insert a b m)- return b-- translateLit :: GroundLit -> IO SAT.Lit- translateLit (Pos a) = translateAtom a- translateLit (Neg a) = liftM negate $ translateAtom a-- translateClause :: GroundClause -> IO SAT.Clause- translateClause = mapM translateLit-- -- Instances- forM_ cs2 $ \c -> do- forM_ (enumSubst (vars c) univ) $ \s -> do- case simplifyGroundClause (applySubst s c) of- Nothing -> return ()- Just c' -> SAT.addClause solver =<< translateClause c'-- -- Functional definitions- forM_ (Set.toList fs) $ \(f, arity) -> do- forM_ (replicateM arity univ) $ \args ->- forM_ [(y1,y2) | y1 <- univ, y2 <- univ, y1 < y2] $ \(y1,y2) -> do- let c = [Neg (SEq (STmApp f args) y1), Neg (SEq (STmApp f args) y2)]- c' <- translateClause c- SAT.addClause solver c'-- -- Totality definitions- forM_ (Set.toList fs) $ \(f, arity) -> do- forM_ (replicateM arity univ) $ \args -> do- let c = [Pos (SEq (STmApp f args) y) | y <- univ]- c' <- translateClause c- SAT.addClause solver c'-- ret <- SAT.solve solver- if ret- then do- bmodel <- SAT.model solver- m <- readIORef ref-- let rels = Map.fromList $ do- (p,_) <- Set.toList ps- let tbl = sort [xs | (SPApp p' xs, b) <- Map.toList m, p == p', bmodel ! b]- return (p, tbl)- let funs = Map.fromList $ do- (f,_) <- Set.toList fs- let tbl = sort [(xs, y) | (SEq (STmApp f' xs) y, b) <- Map.toList m, f == f', bmodel ! b]- return (f, tbl)-- let model = Model- { mUniverse = univ- , mRelations = rels- , mFunctions = funs- }-- return (Just model)- else do- return Nothing---- -----------------------------------------------------------------------------{--∀x. ∃y. x≠y && f(y)=x-∀x. x≠g(x) ∧ f(g(x))=x--}--test = do- let c1 = [Pos $ PApp "=" [TmApp "f" [TmApp "g" [TmVar "x"]], TmVar "x"]]- c2 = [Neg $ PApp "=" [TmVar "x", TmApp "g" [TmVar "x"]]]- ret <- findModel 3 [c1, c2]- case ret of- Nothing -> putStrLn "=== NO MODEL FOUND ==="- Just m -> do- putStrLn "=== A MODEL FOUND ==="- mapM_ putStrLn $ showModel m--test2 = do- let phi = Forall "x" $ Exists "y" $- And (Not (Atom (PApp "=" [TmVar "x", TmVar "y"])))- (Atom (PApp "=" [TmApp "f" [TmVar "y"], TmVar "x"]))-- ref <- newIORef 0- let skolem name _ = do- n <- readIORef ref- let fsym = name ++ "#" ++ show n- writeIORef ref (n+1)- return fsym- cs <- toSkolemNF skolem phi-- ret <- findModel 3 cs- case ret of- Nothing -> putStrLn "=== NO MODEL FOUND ==="- Just m -> do- putStrLn "=== A MODEL FOUND ==="- mapM_ putStrLn $ showModel m---- ---------------------------------------------------------------------------
− src/Algorithm/FourierMotzkin.hs
@@ -1,29 +0,0 @@-{-# OPTIONS_GHC -Wall #-}--------------------------------------------------------------------------------- |--- Module : Algorithm.FourierMotzkin--- Copyright : (c) Masahiro Sakai 2011-2013--- License : BSD-style--- --- Maintainer : masahiro.sakai@gmail.com--- Stability : provisional--- Portability : portable------ Naïve implementation of Fourier-Motzkin Variable Elimination--- --- Reference:------ * <http://users.cecs.anu.edu.au/~michaeln/pubs/arithmetic-dps.pdf>----------------------------------------------------------------------------------module Algorithm.FourierMotzkin- ( Lit (..)- , project- , projectN- , eliminateQuantifiers- , solveFormula- , solve- ) where--import Algorithm.FourierMotzkin.Core-import Algorithm.FourierMotzkin.FOL
− src/Algorithm/FourierMotzkin/Core.hs
@@ -1,229 +0,0 @@-{-# OPTIONS_GHC -Wall #-}--------------------------------------------------------------------------------- |--- Module : Algorithm.FourierMotzkin.Core--- Copyright : (c) Masahiro Sakai 2011-2013--- License : BSD-style--- --- Maintainer : masahiro.sakai@gmail.com--- Stability : provisional--- Portability : portable------ Naïve implementation of Fourier-Motzkin Variable Elimination--- --- Reference:------ * <http://users.cecs.anu.edu.au/~michaeln/pubs/arithmetic-dps.pdf>----------------------------------------------------------------------------------module Algorithm.FourierMotzkin.Core- ( ExprZ- , Rat- , toRat- , fromRat-- , Lit (..)- , fromLAAtom- , toLAAtom-- , project- , project'- , projectN- , projectN'- , solve- , solve'- ) where--import Control.Monad-import Data.List-import Data.Maybe-import Data.Ratio-import qualified Data.IntMap as IM-import qualified Data.IntSet as IS-import Data.VectorSpace hiding (project)--import Algebra.Lattice.Boolean--import Data.ArithRel-import Data.DNF-import qualified Data.LA as LA-import qualified Data.Interval as Interval-import Data.Interval (Interval, EndPoint (..), (<=..<), (<..<=), (<..<))-import Data.Var---- -----------------------------------------------------------------------------type ExprZ = LA.Expr Integer--normalizeExprR :: ExprZ -> ExprZ-normalizeExprR e = LA.mapCoeff (`div` d) e- where d = abs $ gcd' $ map fst $ LA.terms e---- ------------------------------------------------------------------------------- | (t,c) represents t/c, and c must be >0.-type Rat = (ExprZ, Integer)--toRat :: LA.Expr Rational -> Rat-toRat e = seq m $ (LA.mapCoeff f e, m)- where- f x = numerator (fromInteger m * x)- m = foldl' lcm 1 [denominator c | (c,_) <- LA.terms e]--fromRat :: Rat -> LA.Expr Rational-fromRat (e,c) = LA.mapCoeff (% c) e--evalRat :: Model Rational -> Rat -> Rational-evalRat model (e, d) = LA.lift1 1 (model IM.!) (LA.mapCoeff fromIntegral e) / (fromIntegral d)---- ------------------------------------------------------------------------------- | Literal-data Lit = Nonneg ExprZ | Pos ExprZ deriving (Show, Eq, Ord)--instance Variables Lit where- vars (Pos t) = vars t- vars (Nonneg t) = vars t--instance Complement Lit where- notB (Pos t) = Nonneg (negateV t)- notB (Nonneg t) = Pos (negateV t)---- 制約集合の単純化--- It returns Nothing when a inconsistency is detected.-simplify :: [Lit] -> Maybe [Lit]-simplify = fmap concat . mapM f- where- f :: Lit -> Maybe [Lit]- f lit@(Pos e) =- case LA.asConst e of- Just x -> guard (x > 0) >> return []- Nothing -> return [lit]- f lit@(Nonneg e) =- case LA.asConst e of- Just x -> guard (x >= 0) >> return []- Nothing -> return [lit]---- -----------------------------------------------------------------------------fromLAAtom :: LA.Atom Rational -> DNF Lit-fromLAAtom (Rel a op b) = atomR' op (toRat a) (toRat b)--toLAAtom :: Lit -> LA.Atom Rational-toLAAtom (Nonneg e) = LA.mapCoeff fromInteger e .>=. LA.constant 0-toLAAtom (Pos e) = LA.mapCoeff fromInteger e .>. LA.constant 0--constraintsToDNF :: [LA.Atom Rational] -> DNF Lit-constraintsToDNF = andB . map fromLAAtom--atomR' :: RelOp -> Rat -> Rat -> DNF Lit-atomR' op a b = - case op of- Le -> DNF [[a `leR` b]]- Lt -> DNF [[a `ltR` b]]- Ge -> DNF [[a `geR` b]]- Gt -> DNF [[a `gtR` b]]- Eql -> DNF [[a `leR` b, a `geR` b]]- NEq -> DNF [[a `ltR` b], [a `gtR` b]]--leR, ltR, geR, gtR :: Rat -> Rat -> Lit-leR (e1,c) (e2,d) = Nonneg $ normalizeExprR $ c *^ e2 ^-^ d *^ e1-ltR (e1,c) (e2,d) = Pos $ normalizeExprR $ c *^ e2 ^-^ d *^ e1-geR = flip leR-gtR = flip gtR---- -----------------------------------------------------------------------------{--(ls1,ls2,us1,us2) represents-{ x | ∀(M,c)∈ls1. M/c≤x, ∀(M,c)∈ls2. M/c<x, ∀(M,c)∈us1. x≤M/c, ∀(M,c)∈us2. x<M/c }--}-type BoundsR = ([Rat], [Rat], [Rat], [Rat])--project :: Var -> [LA.Atom Rational] -> [([LA.Atom Rational], Model Rational -> Model Rational)]-project v xs = do- ys <- unDNF $ constraintsToDNF xs- (zs, mt) <- project' v ys- return (map toLAAtom zs, mt)--project' :: Var -> [Lit] -> [([Lit], Model Rational -> Model Rational)]-project' v xs = do- case collectBounds v xs of- (bnd, rest) -> do- cond <- unDNF $ boundConditions bnd- let mt m =- case Interval.pickup (evalBounds m bnd) of- Nothing -> error "FourierMotzkin.project: should not happen"- Just val -> IM.insert v val m- return (rest ++ cond, mt)--projectN :: VarSet -> [LA.Atom Rational] -> [([LA.Atom Rational], Model Rational -> Model Rational)]-projectN vs xs = do- ys <- unDNF $ constraintsToDNF xs- (zs, mt) <- projectN' vs ys- return (map toLAAtom zs, mt)--projectN' :: VarSet -> [Lit] -> [([Lit], Model Rational -> Model Rational)]-projectN' vs2 xs2 = do- (zs, mt) <- f (IS.toList vs2) xs2- return (zs, mt)- where- f [] xs = return (xs, id)- f (v:vs) xs = do- (ys, mt1) <- project' v xs- (zs, mt2) <- f vs ys- return (zs, mt1 . mt2)--collectBounds :: Var -> [Lit] -> (BoundsR, [Lit])-collectBounds v = foldr phi (([],[],[],[]),[])- where- phi :: Lit -> (BoundsR, [Lit]) -> (BoundsR, [Lit])- phi lit@(Nonneg t) x = f False lit t x- phi lit@(Pos t) x = f True lit t x-- f :: Bool -> Lit -> ExprZ -> (BoundsR, [Lit]) -> (BoundsR, [Lit])- f strict lit t (bnd@(ls1,ls2,us1,us2), xs) =- case LA.extract v t of- (c,t') ->- case c `compare` 0 of- EQ -> (bnd, lit : xs)- GT ->- if strict- then ((ls1, (negateV t', c) : ls2, us1, us2), xs) -- 0 < cx + M ⇔ -M/c < x- else (((negateV t', c) : ls1, ls2, us1, us2), xs) -- 0 ≤ cx + M ⇔ -M/c ≤ x- LT ->- if strict- then ((ls1, ls2, us1, (t', negate c) : us2), xs) -- 0 < cx + M ⇔ x < M/-c- else ((ls1, ls2, (t', negate c) : us1, us2), xs) -- 0 ≤ cx + M ⇔ x ≤ M/-c--boundConditions :: BoundsR -> DNF Lit-boundConditions (ls1, ls2, us1, us2) = DNF $ maybeToList $ simplify $ - [ x `leR` y | x <- ls1, y <- us1 ] ++- [ x `ltR` y | x <- ls1, y <- us2 ] ++ - [ x `ltR` y | x <- ls2, y <- us1 ] ++- [ x `ltR` y | x <- ls2, y <- us2 ]--solve :: VarSet -> [LA.Atom Rational] -> Maybe (Model Rational)-solve vs cs = msum [solve' vs cs2 | cs2 <- unDNF (constraintsToDNF cs)]--solve' :: VarSet -> [Lit] -> Maybe (Model Rational)-solve' vs cs = listToMaybe $ do- (ys,mt) <- projectN' vs =<< maybeToList (simplify cs)- guard $ Just [] == simplify ys- return $ mt IM.empty--evalBounds :: Model Rational -> BoundsR -> Interval Rational-evalBounds model (ls1,ls2,us1,us2) =- foldl' Interval.intersection Interval.whole $ - [ Finite (evalRat model x) <=..< PosInf | x <- ls1 ] ++- [ Finite (evalRat model x) <..< PosInf | x <- ls2 ] ++- [ NegInf <..<= Finite (evalRat model x) | x <- us1 ] ++- [ NegInf <..< Finite (evalRat model x) | x <- us2 ]---- -----------------------------------------------------------------------------gcd' :: [Integer] -> Integer-gcd' [] = 1-gcd' xs = foldl1' gcd xs---- ---------------------------------------------------------------------------
− src/Algorithm/FourierMotzkin/FOL.hs
@@ -1,59 +0,0 @@-{-# OPTIONS_GHC -Wall #-}-module Algorithm.FourierMotzkin.FOL- ( solveFormula- , eliminateQuantifiers- , eliminateQuantifiers'- )- where--import Control.Monad-import qualified Data.IntSet as IS--import Algebra.Lattice.Boolean--import Data.ArithRel-import Data.DNF-import qualified Data.FOL.Arith as FOL-import qualified Data.LA.FOL as LAFOL-import Data.Var--import Algorithm.FourierMotzkin.Core---- -----------------------------------------------------------------------------solveFormula :: [Var] -> FOL.Formula (FOL.Atom Rational) -> FOL.SatResult Rational-solveFormula vs formula =- case eliminateQuantifiers' formula of- Nothing -> FOL.Unknown- Just dnf ->- case msum [solve' (IS.fromList vs) xs | xs <- unDNF dnf] of- Nothing -> FOL.Unsat- Just m -> FOL.Sat m--eliminateQuantifiers :: FOL.Formula (FOL.Atom Rational) -> Maybe (FOL.Formula (FOL.Atom Rational))-eliminateQuantifiers phi = do- dnf <- eliminateQuantifiers' phi- return $ orB $ map (andB . map (LAFOL.toFOLFormula . toLAAtom)) $ unDNF dnf--eliminateQuantifiers' :: FOL.Formula (FOL.Atom Rational) -> Maybe (DNF Lit)-eliminateQuantifiers' = f- where- f FOL.T = return true- f FOL.F = return false- f (FOL.Atom (Rel a op b)) = do- a' <- LAFOL.fromFOLExpr a- b' <- LAFOL.fromFOLExpr b- return $ fromLAAtom $ Rel a' op b'- f (FOL.And a b) = liftM2 (.&&.) (f a) (f b)- f (FOL.Or a b) = liftM2 (.||.) (f a) (f b)- f (FOL.Not a) = f (FOL.pushNot a)- f (FOL.Imply a b) = f (FOL.Or (FOL.Not a) b)- f (FOL.Equiv a b) = f (FOL.And (FOL.Imply a b) (FOL.Imply b a))- f (FOL.Forall v a) = do- dnf <- f (FOL.Exists v (FOL.pushNot a))- return (notB dnf)- f (FOL.Exists v a) = do- dnf <- f a- return $ orB [DNF $ map fst $ project' v xs | xs <- unDNF dnf]---- ---------------------------------------------------------------------------
− src/Algorithm/LPSolver.hs
@@ -1,253 +0,0 @@-{-# LANGUAGE ScopedTypeVariables #-}-{-# OPTIONS_GHC -Wall #-}--------------------------------------------------------------------------------- |--- Module : Algorithm.LPSolver--- Copyright : (c) Masahiro Sakai 2011--- License : BSD-style--- --- Maintainer : masahiro.sakai@gmail.com--- Stability : provisional--- Portability : non-portable (ScopedTypeVariables)------ Naïve implementation of Simplex method--- --- Reference:------ * <http://www.math.cuhk.edu.hk/~wei/lpch3.pdf>-----------------------------------------------------------------------------------module Algorithm.LPSolver where--import Control.Monad-import Control.Monad.State-import qualified Data.IntMap as IM-import qualified Data.IntSet as IS-import Data.OptDir-import Data.VectorSpace--import Data.ArithRel-import qualified Data.LA as LA-import qualified Data.Interval as Interval-import Data.Var-import qualified Algorithm.Simplex as Simplex-import qualified Algorithm.BoundsInference as BI---- ------------------------------------------------------------------------------ LP Monad--type Solver r = (Var, Simplex.Tableau r, VarSet, VarMap (LA.Expr r))-type LP r = State (Solver r)--emptySolver :: VarSet -> Solver r-emptySolver vs = (1 + maximum ((-1) : IS.toList vs), IM.empty, IS.empty, IM.empty)--gensym :: LP r Var-gensym = do- (x,tbl,avs,defs) <- get- put (x+1,tbl,avs,defs)- return x--getTableau :: LP r (Simplex.Tableau r)-getTableau = do- (_,tbl,_,_) <- get- return tbl--putTableau :: Simplex.Tableau r -> LP r ()-putTableau tbl = do- (x,_,avs,defs) <- get- put (x,tbl,avs,defs)--addArtificialVariable :: Var -> LP r ()-addArtificialVariable v = do- (x,tbl,avs,defs) <- get- put (x, tbl, IS.insert v avs, defs)--getArtificialVariables :: LP r VarSet-getArtificialVariables = do- (_,_,avs,_) <- get- return avs--clearArtificialVariables :: LP r ()-clearArtificialVariables = do- (x,tbl,_,defs) <- get- put (x, tbl, IS.empty, defs)--define :: Var -> LA.Expr r -> LP r ()-define v e = do- (x,tbl,avs,defs) <- get- put (x,tbl,avs, IM.insert v e defs)--getDefs :: LP r (VarMap (LA.Expr r))-getDefs = do- (_,_,_,defs) <- get- return defs---- -----------------------------------------------------------------------------addConstraint :: Real r => LA.Atom r -> LP r ()-addConstraint c = do- c2 <- expandDefs' c- let (e, rop, b) = normalizeConstraint c2- tbl <- getTableau- case rop of- -- x≥b で b≤0 なら追加しない。ad hoc なので一般化したい。- Ge | isSingleVar e && b<=0 -> return ()-- Le -> do- v <- gensym -- slack variable- putTableau $ Simplex.setRow v tbl (LA.coeffMap e, b)- Ge -> do- v1 <- gensym -- surplus variable- v2 <- gensym -- artificial variable- putTableau $ Simplex.setRow v2 tbl (LA.coeffMap (e ^-^ LA.var v1), b)- addArtificialVariable v2- Eql -> do- v <- gensym -- artificial variable- putTableau $ Simplex.setRow v tbl (LA.coeffMap e, b)- addArtificialVariable v- _ -> error $ "addConstraint does not support " ++ show rop- where- isSingleVar e =- case LA.terms e of- [(1,_)] -> True- _ -> False--addConstraint2 :: Real r => LA.Atom r -> LP r ()-addConstraint2 c = do- Rel lhs rop rhs <- expandDefs' c- let- (b', e) = LA.extract LA.unitVar (lhs ^-^ rhs)- b = - b'- case rop of- Le -> f e b- Ge -> f (negateV e) (negate b)- Eql -> do- f e b- f (negateV e) (negate b)- _ -> error $ "addConstraint does not support " ++ show rop- where- -- -x≤b で -b≤0 なら追加しない。ad hoc なので一般化したい。- f e b | isSingleNegatedVar e && -b <= 0 = return ()- f e b = do- tbl <- getTableau- v <- gensym -- slack variable- putTableau $ Simplex.setRow v tbl (LA.coeffMap e, b)-- isSingleNegatedVar e =- case LA.terms e of- [(-1,_)] -> True- _ -> False--expandDefs :: (Num r, Eq r) => LA.Expr r -> LP r (LA.Expr r)-expandDefs e = do- defs <- getDefs- return $ LA.applySubst defs e--expandDefs' :: (Num r, Eq r) => LA.Atom r -> LP r (LA.Atom r)-expandDefs' (Rel lhs op rhs) = do- lhs' <- expandDefs lhs- rhs' <- expandDefs rhs- return $ Rel lhs' op rhs'--tableau :: (RealFrac r) => [LA.Atom r] -> LP r ()-tableau cs = do- let (nonnegVars, cs') = collectNonnegVars cs IS.empty- fvs = vars cs `IS.difference` nonnegVars- forM_ (IS.toList fvs) $ \v -> do- v1 <- gensym- v2 <- gensym- define v (LA.var v1 ^-^ LA.var v2)- mapM_ addConstraint cs'--getModel :: Fractional r => VarSet -> LP r (Model r)-getModel vs = do- tbl <- getTableau- defs <- getDefs- let bs = IM.map snd (IM.delete Simplex.objRow tbl)- vs' = vs `IS.union` IS.fromList [v | e <- IM.elems defs, v <- IS.toList (vars e)]- -- Note that IM.union is left-biased- m0 = bs `IM.union` IM.fromList [(v,0) | v <- IS.toList vs']- return $ IM.filterWithKey (\k _ -> k `IS.member` vs) $ IM.map (LA.evalExpr m0) defs `IM.union` m0--phaseI :: (Fractional r, Real r) => LP r Bool-phaseI = do- tbl <- getTableau- avs <- getArtificialVariables- let (ret, tbl') = Simplex.phaseI tbl avs- putTableau tbl'- when ret clearArtificialVariables- return ret--simplex :: (Fractional r, Real r) => OptDir -> LA.Expr r -> LP r Bool-simplex optdir obj = do- tbl <- getTableau- defs <- getDefs- let (ret, tbl') = Simplex.simplex optdir (Simplex.setObjFun tbl (LA.applySubst defs obj))- putTableau tbl'- return ret--dualSimplex :: (Fractional r, Real r) => OptDir -> LA.Expr r -> LP r Bool-dualSimplex optdir obj = do- tbl <- getTableau- defs <- getDefs- let (ret, tbl') = Simplex.dualSimplex optdir (Simplex.setObjFun tbl (LA.applySubst defs obj))- putTableau tbl'- return ret---- -----------------------------------------------------------------------------normalizeConstraint :: forall r. Real r => LA.Atom r -> (LA.Expr r, RelOp, r)-normalizeConstraint (Rel a op b)- | rhs < 0 = (negateV lhs, flipOp op, negate rhs)- | otherwise = (lhs, op, rhs)- where- (c, lhs) = LA.extract LA.unitVar (a ^-^ b)- rhs = - c--collectNonnegVars :: forall r. (RealFrac r) => [LA.Atom r] -> VarSet -> (VarSet, [LA.Atom r])-collectNonnegVars cs ivs = (nonnegVars, cs)- where- vs = vars cs- bounds = BI.inferBounds initialBounds cs ivs 1000- where- initialBounds = IM.fromList [(v, Interval.whole) | v <- IS.toList vs]- nonnegVars = IS.filter f vs- where- f v = case Interval.lowerBound (bounds IM.! v) of- Interval.Finite lb | 0 <= lb -> True- _ -> False-- isTriviallyTrue :: LA.Atom r -> Bool- isTriviallyTrue (Rel a op b) =- case op of- Le ->- case ub of- Interval.PosInf -> False- Interval.Finite val -> val <= 0- Interval.NegInf -> True -- should not happen- Ge ->- case lb of- Interval.NegInf -> False- Interval.Finite val -> val >= 0- Interval.PosInf -> True -- should not happen- Lt ->- case ub of- Interval.PosInf -> False- Interval.Finite val -> val < 0 || (not inUB && val <= 0)- Interval.NegInf -> True -- should not happen- Gt ->- case lb of- Interval.NegInf -> False- Interval.Finite val -> val > 0 || (not inLB && val >= 0)- Interval.PosInf -> True -- should not happen- Eql -> isTriviallyTrue (c .<=. zeroV) && isTriviallyTrue (c .>=. zeroV)- NEq -> isTriviallyTrue (c .<. zeroV) || isTriviallyTrue (c .>. zeroV)- where- c = a ^-^ b- i = LA.computeInterval bounds c- (lb, inLB) = Interval.lowerBound' i- (ub, inUB) = Interval.upperBound' i---- ---------------------------------------------------------------------------
− src/Algorithm/LPSolverHL.hs
@@ -1,277 +0,0 @@-{-# LANGUAGE ScopedTypeVariables #-}-{-# OPTIONS_GHC -Wall #-}--------------------------------------------------------------------------------- |--- Module : Algorithm.LPSolverHL--- Copyright : (c) Masahiro Sakai 2011--- License : BSD-style--- --- Maintainer : masahiro.sakai@gmail.com--- Stability : provisional--- Portability : non-portable (ScopedTypeVariables)------ High-Level API for LPSolver.hs-----------------------------------------------------------------------------------module Algorithm.LPSolverHL- ( OptResult (..)- , minimize- , maximize- , optimize- , solve- ) where--import Control.Monad.State-import qualified Data.IntMap as IM-import qualified Data.IntSet as IS-import Data.OptDir-import Data.VectorSpace--import Data.ArithRel-import qualified Data.LA as LA-import Data.Var-import qualified Algorithm.Simplex as Simplex-import Algorithm.LPSolver---- ------------------------------------------------------------------------------- | results of optimization-data OptResult r = OptUnsat | Unbounded | Optimum r (Model r)- deriving (Show, Eq, Ord)--maximize :: (RealFrac r) => LA.Expr r -> [LA.Atom r] -> OptResult r-maximize = optimize OptMax--minimize :: (RealFrac r) => LA.Expr r -> [LA.Atom r] -> OptResult r-minimize = optimize OptMin--solve :: (RealFrac r) => [LA.Atom r] -> Maybe (Model r)-solve cs =- flip evalState (emptySolver vs) $ do- tableau cs- ret <- phaseI- if not ret- then return Nothing- else do- m <- getModel vs- return (Just m)- where- vs = vars cs--optimize :: (RealFrac r) => OptDir -> LA.Expr r -> [LA.Atom r] -> OptResult r-optimize optdir obj cs =- flip evalState (emptySolver vs) $ do- tableau cs- ret <- phaseI- if not ret- then return OptUnsat- else do- ret2 <- simplex optdir obj- if not ret2- then return Unbounded- else do- m <- getModel vs- tbl <- getTableau - return $ Optimum (Simplex.currentObjValue tbl) m- where- vs = vars cs `IS.union` vars obj---- ------------------------------------------------------------------------------ Test cases--example_3_2 :: (LA.Expr Rational, [LA.Atom Rational])-example_3_2 = (obj, cond)- where- x1 = LA.var 1- x2 = LA.var 2- x3 = LA.var 3- obj = 3*^x1 ^+^ 2*^x2 ^+^ 3*^x3- cond = [ 2*^x1 ^+^ x2 ^+^ x3 .<=. LA.constant 2- , x1 ^+^ 2*^x2 ^+^ 3*^x3 .<=. LA.constant 5- , 2*^x1 ^+^ 2*^x2 ^+^ x3 .<=. LA.constant 6- , x1 .>=. LA.constant 0- , x2 .>=. LA.constant 0- , x3 .>=. LA.constant 0- ]--test_3_2 :: Bool-test_3_2 =- uncurry maximize example_3_2 == - Optimum (27/5) (IM.fromList [(1,1/5),(2,0),(3,8/5)])--example_3_5 :: (LA.Expr Rational, [LA.Atom Rational])-example_3_5 = (obj, cond)- where- x1 = LA.var 1- x2 = LA.var 2- x3 = LA.var 3- x4 = LA.var 4- x5 = LA.var 5- obj = (-2)*^x1 ^+^ 4*^x2 ^+^ 7*^x3 ^+^ x4 ^+^ 5*^x5- cond = [ (-1)*^x1 ^+^ x2 ^+^ 2*^x3 ^+^ x4 ^+^ 2*^x5 .==. LA.constant 7- , (-1)*^x1 ^+^ 2*^x2 ^+^ 3*^x3 ^+^ x4 ^+^ x5 .==. LA.constant 6- , (-1)*^x1 ^+^ x2 ^+^ x3 ^+^ 2*^x4 ^+^ x5 .==. LA.constant 4- , x2 .>=. LA.constant 0- , x3 .>=. LA.constant 0- , x4 .>=. LA.constant 0- , x5 .>=. LA.constant 0- ]--test_3_5 :: Bool-test_3_5 =- uncurry minimize example_3_5 ==- Optimum 19 (IM.fromList [(1,-1),(2,0),(3,1),(4,0),(5,2)])--example_4_1 :: (LA.Expr Rational, [LA.Atom Rational])-example_4_1 = (obj, cond)- where- x1 = LA.var 1- x2 = LA.var 2- obj = 2*^x1 ^+^ x2- cond = [ (-1)*^x1 ^+^ x2 .>=. LA.constant 2- , x1 ^+^ x2 .<=. LA.constant 1- , x1 .>=. LA.constant 0- , x2 .>=. LA.constant 0- ]--test_4_1 :: Bool-test_4_1 =- uncurry maximize example_4_1 ==- OptUnsat--example_4_2 :: (LA.Expr Rational, [LA.Atom Rational])-example_4_2 = (obj, cond)- where- x1 = LA.var 1- x2 = LA.var 2- obj = 2*^x1 ^+^ x2- cond = [ (-1)*^x1 ^-^ x2 .<=. LA.constant 10- , 2*^x1 ^-^ x2 .<=. LA.constant 40- , x1 .>=. LA.constant 0- , x2 .>=. LA.constant 0- ]--test_4_2 :: Bool-test_4_2 =- uncurry maximize example_4_2 ==- Unbounded--example_4_3 :: (LA.Expr Rational, [LA.Atom Rational])-example_4_3 = (obj, cond)- where- x1 = LA.var 1- x2 = LA.var 2- obj = 6*^x1 ^-^ 2*^x2- cond = [ 2*^x1 ^-^ x2 .<=. LA.constant 2- , x1 .<=. LA.constant 4- , x1 .>=. LA.constant 0- , x2 .>=. LA.constant 0- ]--test_4_3 :: Bool-test_4_3 =- uncurry maximize example_4_3 ==- Optimum 12 (IM.fromList [(1,4),(2,6)])--example_4_5 :: (LA.Expr Rational, [LA.Atom Rational])-example_4_5 = (obj, cond)- where- x1 = LA.var 1- x2 = LA.var 2- obj = 2*^x1 ^+^ x2- cond = [ 4*^x1 ^+^ 3*^x2 .<=. LA.constant 12- , 4*^x1 ^+^ x2 .<=. LA.constant 8- , 4*^x1 ^-^ x2 .<=. LA.constant 8- , x1 .>=. LA.constant 0- , x2 .>=. LA.constant 0- ]--test_4_5 :: Bool-test_4_5 =- uncurry maximize example_4_5 ==- Optimum 5 (IM.fromList [(1,3/2),(2,2)])--example_4_6 :: (LA.Expr Rational, [LA.Atom Rational])-example_4_6 = (obj, cond)- where- x1 = LA.var 1- x2 = LA.var 2- x3 = LA.var 3- x4 = LA.var 4- obj = 20*^x1 ^+^ (1/2)*^x2 ^-^ 6*^x3 ^+^ (3/4)*^x4- cond = [ x1 .<=. LA.constant 2- , 8*^x1 ^-^ x2 ^+^ 9*^x3 ^+^ (1/4)*^x4 .<=. LA.constant 16- , 12*^x1 ^-^ (1/2)*^x2 ^+^ 3*^x3 ^+^ (1/2)*^x4 .<=. LA.constant 24- , x2 .<=. LA.constant 1- , x1 .>=. LA.constant 0- , x2 .>=. LA.constant 0- , x3 .>=. LA.constant 0- , x4 .>=. LA.constant 0- ]--test_4_6 :: Bool-test_4_6 =- uncurry maximize example_4_6 ==- Optimum (165/4) (IM.fromList [(1,2),(2,1),(3,0),(4,1)])--example_4_7 :: (LA.Expr Rational, [LA.Atom Rational])-example_4_7 = (obj, cond)- where- x1 = LA.var 1- x2 = LA.var 2- x3 = LA.var 3- x4 = LA.var 4- obj = x1 ^+^ 1.5*^x2 ^+^ 5*^x3 ^+^ 2*^x4- cond = [ 3*^x1 ^+^ 2*^x2 ^+^ x3 ^+^ 4*^x4 .<=. LA.constant 6- , 2*^x1 ^+^ x2 ^+^ 5*^x3 ^+^ x4 .<=. LA.constant 4- , 2*^x1 ^+^ 6*^x2 ^-^ 4*^x3 ^+^ 8*^x4 .==. LA.constant 0- , x1 ^+^ 3*^x2 ^-^ 2*^x3 ^+^ 4*^x4 .==. LA.constant 0- , x1 .>=. LA.constant 0- , x2 .>=. LA.constant 0- , x3 .>=. LA.constant 0- , x4 .>=. LA.constant 0- ]--test_4_7 :: Bool-test_4_7 =- uncurry maximize example_4_7 ==- Optimum (48/11) (IM.fromList [(1,0),(2,0),(3,81),(4,41)])---- 退化して巡回の起こるKuhnの7変数3制約の例-kuhn_7_3 :: (LA.Expr Rational, [LA.Atom Rational])-kuhn_7_3 = (obj, cond)- where- [x1,x2,x3,x4,x5,x6,x7] = map LA.var [1..7]- obj = (-2)*^x4 ^+^ (-3)*^x5 ^+^ x6 ^+^ 12*^x7- cond = [ x1 ^-^ 2*^x4 ^-^ 9*^x5 ^+^ x6 ^+^ 9*^x7 .==. LA.constant 0- , x2 ^+^ (1/3)*^x4 ^+^ x5 ^-^ (1/3)*^x6 ^-^ 2*^x7 .==. LA.constant 0- , x3 ^+^ 2*^x4 ^+^ 3*^x5 ^-^ x6 ^-^ 12*^x7 .==. LA.constant 2- , x1 .>=. LA.constant 0- , x2 .>=. LA.constant 0- , x3 .>=. LA.constant 0- , x4 .>=. LA.constant 0- , x5 .>=. LA.constant 0- , x6 .>=. LA.constant 0- , x7 .>=. LA.constant 0- ]--test_kuhn_7_3 :: Bool-test_kuhn_7_3 =- uncurry minimize kuhn_7_3 ==- Optimum (-2) (IM.fromList [(1,2),(2,0),(3,0),(4,2),(5,0),(6,2),(7,0)])--testAll :: Bool-testAll = and- [ test_3_2- , test_3_5- , test_4_1- , test_4_2- , test_4_3- , test_4_5- , test_4_6- , test_4_7- , test_kuhn_7_3- ]---- ---------------------------------------------------------------------------
− src/Algorithm/LPUtil.hs
@@ -1,91 +0,0 @@-module Algorithm.LPUtil- ( toStandardForm- , toStandardForm'- ) where--import Control.Exception-import Control.Monad-import Control.Monad.State-import qualified Data.IntMap as IM-import qualified Data.IntSet as IS-import Data.Maybe-import Data.VectorSpace--import Data.ArithRel-import qualified Data.LA as LA-import qualified Data.Interval as Interval-import Data.Var-import qualified Algorithm.BoundsInference as BI--toStandardForm- :: (LA.Expr Rational, [Rel (LA.Expr Rational)])- -> ( (LA.Expr Rational, [(LA.Expr Rational, Rational)])- , Model Rational -> Model Rational- )-toStandardForm prob1@(obj, cs) = (prob2, mt)- where- vs = vars obj `IS.union` vars cs- (prob2,s) = toStandardForm' prob1- mt m = IM.fromAscList $ do- v <- IS.toAscList vs- case IM.lookup v s of- Just def -> return (v, LA.evalExpr m def)- Nothing -> return (v, m IM.! v)--type M = State Var--toStandardForm'- :: (LA.Expr Rational, [Rel (LA.Expr Rational)])- -> ( (LA.Expr Rational, [(LA.Expr Rational, Rational)])- , VarMap (LA.Expr Rational)- )-toStandardForm' (obj, cs) = m- where- vs = vars obj `IS.union` vars cs- v1 = if IS.null vs then 0 else IS.findMax vs + 1- initialBounds = IM.fromList [(v, Interval.whole) | v <- IS.toList vs]- bounds = BI.inferBounds initialBounds cs IS.empty 10-- gensym :: M Var- gensym = do- v <- get- put $ v+1- return v-- m = flip evalState v1 $ do- s <- liftM IM.unions $ forM (IM.toList bounds) $ \(v,i) -> do- case Interval.lowerBound i of- Interval.NegInf -> do- v1 <- gensym- v2 <- gensym- return $ IM.singleton v (LA.var v1 ^-^ LA.var v2)- Interval.Finite lb- | lb >= 0 -> return IM.empty- | otherwise -> do- v1 <- gensym- return $ IM.singleton v (LA.var v1 ^-^ LA.constant lb)- let obj2 = LA.applySubst s obj-- cs2 <- liftM concat $ forM cs $ \(Rel lhs op rhs) -> do- case LA.extract LA.unitVar (LA.applySubst s (lhs ^-^ rhs)) of- (c,e) -> do- let (lhs2,op2,rhs2) =- if -c >= 0- then (e,op,-c)- else (negateV e, flipOp op, c)- case op2 of- Eql -> return [(lhs2,rhs2)]- Le -> do- v <- gensym- return [(lhs2 ^+^ LA.var v, rhs2)]- Ge -> do- case LA.terms lhs2 of- [(1,_)] | rhs2<=0 -> return []- _ -> do- v <- gensym- return [(lhs2 ^-^ LA.var v, rhs2)]- _ -> error $ "LPUtil.toStandardForm: " ++ show op2 ++ " is not supported"-- assert (and [isNothing $ LA.lookupCoeff LA.unitVar c | (c,_) <- cs2]) $ return ()-- return ((obj2,cs2),s)
− src/Algorithm/MIPSolver2.hs
@@ -1,490 +0,0 @@-{-# LANGUAGE ScopedTypeVariables, Rank2Types #-}-{-# OPTIONS_GHC -Wall #-}--------------------------------------------------------------------------------- |--- Module : Algorithm.MIPSolver2--- Copyright : (c) Masahiro Sakai 2012--- License : BSD-style--- --- Maintainer : masahiro.sakai@gmail.com--- Stability : provisional--- Portability : non-portable (ScopedTypeVariables, Rank2Types)------ Naïve implementation of MIP solver based on Simplex2 module--- --- Reference:------ * <http://www.math.cuhk.edu.hk/~wei/lpch3.pdf>--- --- * Ralph E. Gomory.--- \"An Algorithm for the Mixed Integer Problem\", Technical Report--- RM-2597, 1960, The Rand Corporation, Santa Monica, CA.--- <http://www.rand.org/pubs/research_memoranda/RM2597.html>------ * Ralph E. Gomory.--- \"Outline of an algorithm for integer solutions to linear programs\".--- Bull. Amer. Math. Soc., Vol. 64, No. 5. (1958), pp. 275-278.--- <http://projecteuclid.org/euclid.bams/1183522679>--- --- * R. C. Daniel and Martyn Jeffreys.--- \"Unboundedness in Integer and Discrete Programming L.P. Relaxations\"--- The Journal of the Operational Research Society, Vol. 30, No. 12. (1979)--- <http://www.jstor.org/stable/3009435>--- -------------------------------------------------------------------------------module Algorithm.MIPSolver2- (- -- * The @Solver@ type- Solver- , newSolver-- -- * Solving- , optimize-- -- * Extract results- , model- , getObjValue-- -- * Configulation- , setNThread- , setLogger- , setShowRational- ) where--import Prelude hiding (log)--import Control.Monad-import Control.Exception-import Control.Concurrent-import Control.Concurrent.STM-import Data.List-import Data.OptDir-import Data.Ord-import Data.IORef-import Data.Maybe-import qualified Data.IntSet as IS-import qualified Data.IntMap as IM-import qualified Data.Map as Map-import qualified Data.Sequence as Seq-import qualified Data.Foldable as F-import Data.VectorSpace-import Data.Time-import System.CPUTime-import System.Timeout-import Text.Printf--import qualified Data.LA as LA-import Data.ArithRel ((.<=.), (.>=.))-import qualified Algorithm.Simplex2 as Simplex2-import Algorithm.Simplex2 (OptResult (..), Var, Model)-import Util (isInteger, fracPart)--data Solver- = MIP- { mipRootLP :: Simplex2.Solver- , mipIVs :: IS.IntSet- , mipBest :: TVar (Maybe Node)-- , mipNThread :: IORef Int- , mipLogger :: IORef (Maybe (String -> IO ()))- , mipShowRational :: IORef Bool- }--data Node =- Node- { ndLP :: Simplex2.Solver- , ndDepth :: {-# UNPACK #-} !Int- , ndValue :: Rational- }--newSolver :: Simplex2.Solver -> IS.IntSet -> IO Solver-newSolver lp ivs = do- lp2 <- Simplex2.cloneSolver lp-- forM_ (IS.toList ivs) $ \v -> do- lb <- Simplex2.getLB lp2 v- case lb of- Just l | not (isInteger l) ->- Simplex2.assertLower lp2 v (fromInteger (ceiling l))- _ -> return ()- ub <- Simplex2.getUB lp2 v- case ub of- Just u | not (isInteger u) ->- Simplex2.assertLower lp2 v (fromInteger (floor u))- _ -> return ()-- bestRef <- newTVarIO Nothing-- nthreadRef <- newIORef 0- logRef <- newIORef Nothing- showRef <- newIORef False-- return $- MIP- { mipRootLP = lp2- , mipIVs = ivs- , mipBest = bestRef-- , mipNThread = nthreadRef- , mipLogger = logRef- , mipShowRational = showRef- }--optimize :: Solver -> (Model -> Rational -> IO ()) -> IO OptResult-optimize solver update = do- let lp = mipRootLP solver- log solver "MIP: Solving LP relaxation..."- ret <- Simplex2.check lp- if not ret- then return Unsat- else do- s0 <- showValue solver =<< Simplex2.getObjValue lp- log solver (printf "MIP: LP relaxation is satisfiable with obj = %s" s0)- log solver "MIP: Optimizing LP relaxation"- ret2 <- Simplex2.optimize lp Simplex2.defaultOptions- case ret2 of- Unsat -> error "should not happen"- ObjLimit -> error "should not happen"- Unbounded -> do- log solver "MIP: LP relaxation is unbounded"- let ivs = mipIVs solver- if IS.null ivs- then return Unbounded- else do- {-- * In general, original problem may have optimal- solution even though LP relaxiation is unbounded.- * But if restricted to rational numbers, the- original problem is unbounded or unsatisfiable- when LP relaxation is unbounded.- -}- origObj <- Simplex2.getObj lp- lp2 <- Simplex2.cloneSolver lp- Simplex2.clearLogger lp2- Simplex2.setObj lp2 (LA.constant 0)- branchAndBound solver lp2 $ \m _ -> do- update m (LA.evalExpr m origObj)- best <- readTVarIO (mipBest solver)- case best of- Just nd -> do- m <- Simplex2.model (ndLP nd)- atomically $ writeTVar (mipBest solver) $ Just nd{ ndValue = LA.evalExpr m origObj }- return Unbounded- Nothing -> return Unsat- Optimum -> do- s1 <- showValue solver =<< Simplex2.getObjValue lp- log solver $ "MIP: LP relaxation optimum is " ++ s1- log solver "MIP: Integer optimization begins..."- Simplex2.clearLogger lp- branchAndBound solver lp update- m <- readTVarIO (mipBest solver)- case m of- Nothing -> return Unsat- Just _ -> return Optimum--branchAndBound :: Solver -> Simplex2.Solver -> (Model -> Rational -> IO ()) -> IO ()-branchAndBound solver rootLP update = do- dir <- Simplex2.getOptDir rootLP- rootVal <- Simplex2.getObjValue rootLP- let root = Node{ ndLP = rootLP, ndDepth = 0, ndValue = rootVal }-- pool <- newTVarIO (Seq.singleton root)- activeThreads <- newTVarIO (Map.empty)- visitedNodes <- newTVarIO 0- solchan <- newTChanIO-- let addNode :: Node -> STM ()- addNode nd = do- modifyTVar pool (Seq.|> nd)-- pickNode :: IO (Maybe Node)- pickNode = do- self <- myThreadId- atomically $ modifyTVar activeThreads (Map.delete self)- atomically $ do- s <- readTVar pool- case Seq.viewl s of- nd Seq.:< s2 -> do- writeTVar pool s2- modifyTVar activeThreads (Map.insert self nd)- return (Just nd)- Seq.EmptyL -> do- ths <- readTVar activeThreads- if Map.null ths- then return Nothing- else retry-- processNode :: Node -> IO ()- processNode node = do- let lp = ndLP node- lim <- liftM (fmap ndValue) $ readTVarIO (mipBest solver)- ret <- Simplex2.dualSimplex lp Simplex2.defaultOptions{ Simplex2.objLimit = lim }-- case ret of- Unbounded -> error "should not happen"- Unsat -> return ()- ObjLimit -> return ()- Optimum -> do- val <- Simplex2.getObjValue lp- p <- prune solver val- unless p $ do- xs <- violated node (mipIVs solver)- case xs of- [] -> atomically $ writeTChan solchan $ node { ndValue = val }- _ -> do- r <- if ndDepth node `mod` 100 /= 0- then return Nothing- else liftM listToMaybe $ filterM (canDeriveGomoryCut lp) $ map fst xs- case r of- Nothing -> do -- branch- let (v0,val0) = fst $ maximumBy (comparing snd)- [((v,vval), abs (fromInteger (round vval) - vval)) | (v,vval) <- xs]- let lp1 = lp- lp2 <- Simplex2.cloneSolver lp- Simplex2.assertAtom lp1 (LA.var v0 .<=. LA.constant (fromInteger (floor val0)))- Simplex2.assertAtom lp2 (LA.var v0 .>=. LA.constant (fromInteger (ceiling val0)))- atomically $ do- addNode $ Node lp1 (ndDepth node + 1) val- addNode $ Node lp2 (ndDepth node + 1) val- modifyTVar visitedNodes (+1)- Just v -> do -- cut- atom <- deriveGomoryCut lp (mipIVs solver) v- Simplex2.assertAtom lp atom- atomically $ do- addNode $ Node lp (ndDepth node + 1) val-- let isCompleted = do- nodes <- readTVar pool- threads <- readTVar activeThreads- return $ Seq.null nodes && Map.null threads-- -- fork worker threads- nthreads <- liftM (max 1) $ readIORef (mipNThread solver)-- log solver $ printf "MIP: forking %d worker threads..." nthreads-- startCPU <- getCPUTime- startWC <- getCurrentTime- ex <- newEmptyTMVarIO-- let printStatus :: Seq.Seq Node -> Int -> IO ()- printStatus nodes visited- | Seq.null nodes = return () -- should not happen- | otherwise = do- nowCPU <- getCPUTime- nowWC <- getCurrentTime- let spentCPU = (nowCPU - startCPU) `div` 10^(12::Int)- let spentWC = round (nowWC `diffUTCTime` startWC) :: Int-- let vs = map ndValue (F.toList nodes)- dualBound =- case dir of- OptMin -> minimum vs- OptMax -> maximum vs-- primalBound <- do- x <- readTVarIO (mipBest solver) -- TODO: 引数にするようにした方が良い?- return $ case x of- Nothing -> Nothing- Just node -> Just (ndValue node)-- (p,g) <- case primalBound of- Nothing -> return ("not yet found", "--")- Just val -> do- p <- showValue solver val- let g = if val == 0- then "inf"- else printf "%.2f%%" (fromRational (abs (dualBound - val) * 100 / abs val) :: Double)- return (p, g)- d <- showValue solver dualBound- - let range =- case dir of- OptMin -> p ++ " >= " ++ d- OptMax -> p ++ " <= " ++ d-- log solver $ printf "cpu time = %d sec; wc time = %d sec; active nodes = %d; visited nodes = %d; %s; gap = %s"- spentCPU spentWC (Seq.length nodes) visited range g-- mask $ \(restore :: forall a. IO a -> IO a) -> do- threads <- replicateM nthreads $ do- forkIO $ do- let loop = do- m <- pickNode- case m of- Nothing -> return ()- Just node -> processNode node >> loop- ret <- try $ restore loop- case ret of- Left e -> atomically (putTMVar ex e)- Right _ -> return () -- let propagateException :: SomeException -> IO ()- propagateException e = do- mapM_ (\t -> throwTo t e) threads- throwIO e-- let loop = do- ret <- try $ timeout (2*1000*1000) $ restore $ atomically $ msum- [ do node <- readTChan solchan- ret <- do- old <- readTVar (mipBest solver)- case old of- Nothing -> do- writeTVar (mipBest solver) (Just node)- return True- Just best -> do- let isBetter = if dir==OptMin then ndValue node < ndValue best else ndValue node > ndValue best- when isBetter $ writeTVar (mipBest solver) (Just node)- return isBetter- return $ do- when ret $ do- let lp = ndLP node- m <- Simplex2.model lp- update m (ndValue node)- loop- , do b <- isCompleted- guard b- return $ return ()- , do e <- readTMVar ex- return $ propagateException e- ]-- case ret of- Left (e::SomeException) -> propagateException e- Right (Just m) -> m- Right Nothing -> do -- timeout- (nodes, visited) <- atomically $ do- nodes <- readTVar pool- athreads <- readTVar activeThreads- visited <- readTVar visitedNodes- return (Seq.fromList (Map.elems athreads) Seq.>< nodes, visited)- printStatus nodes visited- loop-- loop--model :: Solver -> IO Model-model solver = do- m <- readTVarIO (mipBest solver)- case m of- Nothing -> error "no model"- Just node -> Simplex2.model (ndLP node)--getObjValue :: Solver -> IO Rational-getObjValue solver = do- m <- readTVarIO (mipBest solver)- case m of- Nothing -> error "no model"- Just node -> return $ ndValue node--violated :: Node -> IS.IntSet -> IO [(Var, Rational)]-violated node ivs = do- m <- Simplex2.model (ndLP node)- let p (v,val) = v `IS.member` ivs && not (isInteger val)- return $ filter p (IM.toList m)--prune :: Solver -> Rational -> IO Bool-prune solver lb = do- b <- readTVarIO (mipBest solver)- case b of- Nothing -> return False- Just node -> do- dir <- Simplex2.getOptDir (mipRootLP solver)- return $ if dir==OptMin then ndValue node <= lb else ndValue node >= lb--showValue :: Solver -> Rational -> IO String-showValue solver v = do- printRat <- readIORef (mipShowRational solver)- return $ Simplex2.showValue printRat v--setShowRational :: Solver -> Bool -> IO ()-setShowRational solver = writeIORef (mipShowRational solver)--setNThread :: Solver -> Int -> IO ()-setNThread solver = writeIORef (mipNThread solver)--{--------------------------------------------------------------------- Logging---------------------------------------------------------------------}---- | set callback function for receiving messages.-setLogger :: Solver -> (String -> IO ()) -> IO ()-setLogger solver logger = do- writeIORef (mipLogger solver) (Just logger)--log :: Solver -> String -> IO ()-log solver msg = logIO solver (return msg)--logIO :: Solver -> IO String -> IO ()-logIO solver action = do- m <- readIORef (mipLogger solver)- case m of- Nothing -> return ()- Just logger -> action >>= logger--{--------------------------------------------------------------------- GomoryCut---------------------------------------------------------------------}--deriveGomoryCut :: Simplex2.Solver -> IS.IntSet -> Var -> IO (LA.Atom Rational)-deriveGomoryCut lp ivs xi = do- v0 <- Simplex2.getValue lp xi- let f0 = fracPart v0- assert (0 < f0 && f0 < 1) $ return ()-- row <- Simplex2.getRow lp xi-- -- remove fixed variables- let p (_,xj) = do- lb <- Simplex2.getLB lp xj- ub <- Simplex2.getUB lp xj- case (lb,ub) of- (Just l, Just u) -> return (l < u)- _ -> return True- ns <- filterM p $ LA.terms row-- js <- flip filterM ns $ \(_, xj) -> do- vj <- Simplex2.getValue lp xj- lb <- Simplex2.getLB lp xj- return $ Just vj == lb- ks <- flip filterM ns $ \(_, xj) -> do- vj <- Simplex2.getValue lp xj- ub <- Simplex2.getUB lp xj- return $ Just vj == ub-- xs1 <- forM js $ \(aij, xj) -> do- let fj = fracPart aij- Just lj <- Simplex2.getLB lp xj- let c = if xj `IS.member` ivs- then (if fj <= 1 - f0 then fj / (1 - f0) else ((1 - fj) / f0))- else (if aij > 0 then aij / (1 - f0) else (-aij / f0))- return $ c *^ (LA.var xj ^-^ LA.constant lj)- xs2 <- forM ks $ \(aij, xj) -> do- let fj = fracPart aij- Just uj <- Simplex2.getUB lp xj- let c = if xj `IS.member` ivs- then (if fj <= f0 then fj / f0 else ((1 - fj) / (1 - f0)))- else (if aij > 0 then aij / f0 else (-aij / (1 - f0)))- return $ c *^ (LA.constant uj ^-^ LA.var xj)-- return $ sumV xs1 ^+^ sumV xs2 .>=. LA.constant 1---- TODO: Simplex2をδに対応させたら、xi, xj がδを含まない有理数であるという条件も必要-canDeriveGomoryCut :: Simplex2.Solver -> Var -> IO Bool-canDeriveGomoryCut lp xi = do- b <- Simplex2.isBasicVariable lp xi- if not b- then return False- else do- val <- Simplex2.getValue lp xi- if isInteger val- then return False- else do- row <- Simplex2.getRow lp xi- ys <- forM (LA.terms row) $ \(_,xj) -> do- vj <- Simplex2.getValue lp xj- lb <- Simplex2.getLB lp xj- ub <- Simplex2.getUB lp xj- return $ Just vj == lb || Just vj == ub- return (and ys)
− src/Algorithm/MIPSolverHL.hs
@@ -1,286 +0,0 @@-{-# LANGUAGE ScopedTypeVariables #-}-{-# OPTIONS_GHC -Wall #-}--------------------------------------------------------------------------------- |--- Module : Algorithm.MIPSolverHL--- Copyright : (c) Masahiro Sakai 2011--- License : BSD-style------ Maintainer : masahiro.sakai@gmail.com--- Stability : provisional--- Portability : non-portable (ScopedTypeVariables)------ References:--- --- * [Gomory1960]--- Ralph E. Gomory.--- An Algorithm for the Mixed Integer Problem, Technical Report--- RM-2597, 1960, The Rand Corporation, Santa Monica, CA.--- <http://www.rand.org/pubs/research_memoranda/RM2597.html>------ * [Gomory1958]--- Ralph E. Gomory.--- Outline of an algorithm for integer solutions to linear programs.--- Bull. Amer. Math. Soc., Vol. 64, No. 5. (1958), pp. 275-278.--- <http://projecteuclid.org/euclid.bams/1183522679>--------------------------------------------------------------------------------module Algorithm.MIPSolverHL- ( module Data.OptDir- , OptResult (..)- , minimize- , maximize- , optimize- ) where--import Control.Exception-import Control.Monad.State-import Data.Ord-import Data.Maybe-import Data.List (maximumBy)-import qualified Data.IntMap as IM-import qualified Data.IntSet as IS-import Data.OptDir-import Data.VectorSpace--import Data.ArithRel-import Data.Var-import qualified Data.LA as LA-import qualified Algorithm.Simplex as Simplex-import qualified Algorithm.LPSolver as LPSolver-import Algorithm.LPSolver-import Algorithm.LPSolverHL (OptResult (..))-import qualified Algorithm.OmegaTest as OmegaTest-import Util (isInteger, fracPart)---- -----------------------------------------------------------------------------data Node r- = Node- { ndSolver :: LPSolver.Solver r- , ndDepth :: {-# UNPACK #-} !Int--- , ndCutSlackVariables :: VarSet- }--ndTableau :: Node r -> Simplex.Tableau r-ndTableau node = evalState getTableau (ndSolver node)--ndLowerBound :: (Num r, Eq r) => Node r -> r-ndLowerBound node = evalState (liftM Simplex.currentObjValue getTableau) (ndSolver node)--data Err = ErrUnbounded | ErrUnsat deriving (Ord, Eq, Show, Enum, Bounded)--maximize :: RealFrac r => LA.Expr r -> [LA.Atom r] -> VarSet -> OptResult r-maximize = optimize OptMax--minimize :: RealFrac r => LA.Expr r -> [LA.Atom r] -> VarSet -> OptResult r-minimize = optimize OptMin--optimize :: RealFrac r => OptDir -> LA.Expr r -> [LA.Atom r] -> VarSet -> OptResult r-optimize optdir obj cs ivs = - case mkInitialNode optdir obj cs ivs of- Left err ->- case err of- ErrUnsat -> OptUnsat- ErrUnbounded ->- if IS.null ivs- then Unbounded- else- {-- Fallback to Fourier-Motzkin + OmegaTest- * In general, original problem may have optimal- solution even though LP relaxiation is unbounded.- * But if restricted to rational numbers, the- original problem is unbounded or unsatisfiable- when LP relaxation is unbounded.- -}- case OmegaTest.solveQFLA OmegaTest.defaultOptions (vars cs `IS.union` ivs) (map conv cs) ivs of- Nothing -> OptUnsat- Just _ -> Unbounded - Right (node0, ivs2) -> - case traverse optdir obj ivs2 node0 of- Left ErrUnbounded -> error "shoud not happen"- Left ErrUnsat -> OptUnsat- Right node -> flip evalState (ndSolver node) $ do- tbl <- getTableau- model <- getModel vs- return $ Optimum (Simplex.currentObjValue tbl) model- where- vs = vars cs `IS.union` vars obj--tableau' :: (RealFrac r) => [LA.Atom r] -> VarSet -> LP r VarSet-tableau' cs ivs = do- let (nonnegVars, cs') = collectNonnegVars cs ivs- fvs = vars cs `IS.difference` nonnegVars- ivs2 <- liftM IS.unions $ forM (IS.toList fvs) $ \v -> do- v1 <- gensym- v2 <- gensym- define v (LA.var v1 ^-^ LA.var v2)- return $ if v `IS.member` ivs then IS.fromList [v1,v2] else IS.empty- mapM_ addConstraint cs'- return ivs2--conv :: RealFrac r => LA.Atom r -> LA.Atom Rational-conv (Rel a op b) = Rel (f a) op (f b)- where- f = LA.mapCoeff toRational--mkInitialNode :: RealFrac r => OptDir -> LA.Expr r -> [LA.Atom r] -> VarSet -> Either Err (Node r, VarSet)-mkInitialNode optdir obj cs ivs =- flip evalState (emptySolver vs) $ do- ivs2 <- tableau' cs ivs- ret <- phaseI- if not ret- then return (Left ErrUnsat)- else do- ret2 <- simplex optdir obj- if ret2- then do- solver <- get- return $ Right $- ( Node{ ndSolver = solver- , ndDepth = 0--- , ndCutSlackVariables = IS.empty- }- , ivs `IS.union` ivs2- )- else return (Left ErrUnbounded)- where- vs = vars cs `IS.union` vars obj--isStrictlyBetter :: RealFrac r => OptDir -> r -> r -> Bool-isStrictlyBetter optdir = if optdir==OptMin then (<) else (>)--traverse :: forall r. RealFrac r => OptDir -> LA.Expr r -> VarSet -> Node r -> Either Err (Node r)-traverse optdir obj ivs node0 = loop [node0] Nothing- where- loop :: [Node r] -> Maybe (Node r) -> Either Err (Node r)- loop [] (Just best) = Right best- loop [] Nothing = Left ErrUnsat- loop (n:ns) Nothing =- case children n of- Nothing -> loop ns (Just n)- Just cs -> loop (cs++ns) Nothing- loop (n:ns) (Just best)- | isStrictlyBetter optdir (ndLowerBound n) (ndLowerBound best) =- case children n of- Nothing -> loop ns (Just n)- Just cs -> loop (cs++ns) (Just best)- | otherwise = loop ns (Just best)-- reopt :: Solver r -> Maybe (Solver r)- reopt s = flip evalState s $ do- ret <- dualSimplex optdir obj- if ret- then liftM Just get- else return Nothing-- children :: Node r -> Maybe [Node r]- children node- | null xs = Nothing -- no violation- | ndDepth node `mod` 100 == 0 = -- cut- let- (f0, m0) = maximumBy (comparing fst) [(fracPart val, m) | (_,m,val) <- xs]- sv = flip execState (ndSolver node) $ do- s <- gensym- let g j x = assert (a >= 0) a- where- a | j `IS.member` ivs =- if fracPart x <= f0- then fracPart x- else (f0 / (f0 - 1)) * (fracPart x - 1)- -- [Gomory1960] では (f0 / (1 - f0)) * (fracPart x - 1) としているが、- -- これは誤り- | otherwise =- if x >= 0- then x- else (f0 / (f0 - 1)) * x- putTableau $ IM.insert s (IM.mapWithKey (\j x -> negate (g j x)) m0, negate f0) tbl- in Just $ [node{ ndSolver = sv2, ndDepth = ndDepth node + 1 } | sv2 <- maybeToList (reopt sv)]- | otherwise = -- branch- let (v0, val0) = snd $ maximumBy (comparing fst) [(fracPart val, (v, val)) | (v,_,val) <- xs]- cs = [ LA.var v0 .>=. LA.constant (fromIntegral (ceiling val0 :: Integer))- , LA.var v0 .<=. LA.constant (fromIntegral (floor val0 :: Integer))- ]- svs = [execState (addConstraint2 c) (ndSolver node) | c <- cs]- in Just $ [node{ ndSolver = sv, ndDepth = ndDepth node + 1 } | Just sv <- map reopt svs]- - where- tbl :: Simplex.Tableau r- tbl = ndTableau node-- xs :: [(Var, VarMap r, r)]- xs = [ (v, m, val)- | v <- IS.toList ivs- , Just (m, val) <- return (IM.lookup v tbl)- , not (isInteger val)- ]---- -----------------------------------------------------------------------------example1 :: (Fractional r, Eq r) => (OptDir, LA.Expr r, [LA.Atom r], VarSet)-example1 = (optdir, obj, cs, ivs)- where- optdir = OptMax- x1 = LA.var 1- x2 = LA.var 2- x3 = LA.var 3- x4 = LA.var 4- obj = x1 ^+^ 2 *^ x2 ^+^ 3 *^ x3 ^+^ x4- cs =- [ (-1) *^ x1 ^+^ x2 ^+^ x3 ^+^ 10*^x4 .<=. LA.constant 20- , x1 ^-^ 3 *^ x2 ^+^ x3 .<=. LA.constant 30- , x2 ^-^ 3.5 *^ x4 .==. LA.constant 0- , LA.constant 0 .<=. x1- , x1 .<=. LA.constant 40- , LA.constant 0 .<=. x2- , LA.constant 0 .<=. x3- , LA.constant 2 .<=. x4- , x4 .<=. LA.constant 3- ]- ivs = IS.singleton 4--test1 :: Bool-test1 = result==expected- where- (optdir, obj, cs, ivs) = example1- result, expected :: OptResult Rational- result = optimize optdir obj cs ivs- expected = Optimum (245/2) (IM.fromList [(1,40),(2,21/2),(3,39/2),(4,3)])--test1' :: Bool-test1' = result==expected- where- (optdir, obj, cs, ivs) = example1- f OptMin = OptMax- f OptMax = OptMin- result, expected :: OptResult Rational- result = optimize (f optdir) (negateV obj) cs ivs- expected = Optimum (-245/2) (IM.fromList [(1,40),(2,21/2),(3,39/2),(4,3)])---- 『数理計画法の基礎』(坂和 正敏) p.109 例 3.8-example2 :: (Fractional r, Eq r) => (OptDir, LA.Expr r, [LA.Atom r], VarSet)-example2 = (optdir, obj, cs, ivs)- where- optdir = OptMin- [x1,x2,x3] = map LA.var [1..3]- obj = (-1) *^ x1 ^-^ 3 *^ x2 ^-^ 5 *^ x3- cs =- [ 3 *^ x1 ^+^ 4 *^ x2 .<=. LA.constant 10- , 2 *^ x1 ^+^ x2 ^+^ x3 .<=. LA.constant 7- , 3*^x1 ^+^ x2 ^+^ 4 *^ x3 .==. LA.constant 12- , LA.constant 0 .<=. x1- , LA.constant 0 .<=. x2- , LA.constant 0 .<=. x3- ]- ivs = IS.fromList [1,2]--test2 :: Bool-test2 = result == expected- where- result, expected :: OptResult Rational- result = optimize optdir obj cs ivs- expected = Optimum (-37/2) (IM.fromList [(1,0),(2,2),(3,5/2)])- (optdir, obj, cs, ivs) = example2---- ---------------------------------------------------------------------------
− src/Algorithm/OmegaTest.hs
@@ -1,292 +0,0 @@-{-# OPTIONS_GHC -Wall #-}--------------------------------------------------------------------------------- |--- Module : Algorithm.OmegaTest--- Copyright : (c) Masahiro Sakai 2011--- License : BSD-style--- --- Maintainer : masahiro.sakai@gmail.com--- Stability : provisional--- Portability : portable------ (incomplete) implementation of Omega Test------ References:------ * William Pugh. The Omega test: a fast and practical integer--- programming algorithm for dependence analysis. In Proceedings of--- the 1991 ACM/IEEE conference on Supercomputing (1991), pp. 4-13.------ * <http://users.cecs.anu.edu.au/~michaeln/pubs/arithmetic-dps.pdf>------ See also:------ * <http://hackage.haskell.org/package/Omega>----------------------------------------------------------------------------------module Algorithm.OmegaTest- ( Model- , solve- , solveQFLA- , Options (..)- , defaultOptions- , checkRealNoCheck- , checkRealByFM- ) where--import Control.Monad-import Data.List-import Data.Maybe-import Data.Ord-import Data.Ratio-import qualified Data.IntMap as IM-import qualified Data.IntSet as IS-import Data.VectorSpace--import Algebra.Lattice.Boolean--import Data.ArithRel-import Data.DNF-import qualified Data.LA as LA-import Data.Var-import Util (combineMaybe)-import qualified Algorithm.FourierMotzkin as FM-import Algorithm.FourierMotzkin.Core (Lit (..), Rat, toLAAtom)---- -----------------------------------------------------------------------------data Options- = Options- { optCheckReal :: VarSet -> [LA.Atom Rational] -> Bool- }--defaultOptions :: Options-defaultOptions =- Options- { optCheckReal =- -- checkRealNoCheck- checkRealByFM- }--checkRealNoCheck :: VarSet -> [LA.Atom Rational] -> Bool-checkRealNoCheck _ _ = True--checkRealByFM :: VarSet -> [LA.Atom Rational] -> Bool-checkRealByFM vs as = isJust $ FM.solve vs as---- -----------------------------------------------------------------------------type ExprZ = LA.Expr Integer---- 制約集合の単純化--- It returns Nothing when a inconsistency is detected.-simplify :: [Lit] -> Maybe [Lit]-simplify = fmap concat . mapM f- where- f :: Lit -> Maybe [Lit]- f lit@(Pos e) =- case LA.asConst e of- Just x -> guard (x > 0) >> return []- Nothing -> return [lit]- f lit@(Nonneg e) =- case LA.asConst e of- Just x -> guard (x >= 0) >> return []- Nothing -> return [lit]---- -----------------------------------------------------------------------------leZ, ltZ, geZ, gtZ :: ExprZ -> ExprZ -> Lit--- Note that constants may be floored by division-leZ e1 e2 = Nonneg (LA.mapCoeff (`div` d) e)- where- e = e2 ^-^ e1- d = abs $ gcd' [c | (c,v) <- LA.terms e, v /= LA.unitVar]-ltZ e1 e2 = (e1 ^+^ LA.constant 1) `leZ` e2-geZ = flip leZ-gtZ = flip gtZ--eqZ :: ExprZ -> ExprZ -> (DNF Lit)-eqZ e1 e2- = if LA.coeff LA.unitVar e3 `mod` d == 0- then DNF [[Nonneg e, Nonneg (negateV e)]]- else false- where- e = LA.mapCoeff (`div` d) e3- e3 = e1 ^-^ e2- d = abs $ gcd' [c | (c,v) <- LA.terms e3, v /= LA.unitVar]---- -----------------------------------------------------------------------------{--(ls,us) represents-{ x | ∀(M,c)∈ls. M/c≤x, ∀(M,c)∈us. x≤M/c }--}-type BoundsZ = ([Rat],[Rat])--collectBoundsZ :: Var -> [Lit] -> (BoundsZ,[Lit])-collectBoundsZ v = foldr phi (([],[]),[])- where- phi :: Lit -> (BoundsZ,[Lit]) -> (BoundsZ,[Lit])- phi (Pos t) x = phi (Nonneg (t ^-^ LA.constant 1)) x- phi lit@(Nonneg t) ((ls,us),xs) =- case LA.extract v t of- (c,t') -> - case c `compare` 0 of- EQ -> ((ls, us), lit : xs)- GT -> (((negateV t', c) : ls, us), xs) -- 0 ≤ cx + M ⇔ -M/c ≤ x- LT -> ((ls, (t', negate c) : us), xs) -- 0 ≤ cx + M ⇔ x ≤ M/-c--isExact :: BoundsZ -> Bool-isExact (ls,us) = and [a==1 || b==1 | (_,a)<-ls , (_,b)<-us]--solve' :: Options -> [Var] -> [Lit] -> Maybe (Model Integer)-solve' opt vs2 xs = simplify xs >>= go vs2- where- go :: [Var] -> [Lit] -> Maybe (Model Integer)- go [] [] = return IM.empty- go [] _ = mzero- go vs ys | not (optCheckReal opt (IS.fromList vs) (map toLAAtom ys)) = mzero- go vs ys =- if isExact bnd- then case1- else case1 `mplus` case2- where- (v,vs',bnd@(ls,us),rest) = chooseVariable vs ys-- case1 = do- let zs = [ LA.constant ((a-1)*(b-1)) `leZ` (a *^ d ^-^ b *^ c)- | (c,a)<-ls , (d,b)<-us ]- model <- go vs' =<< simplify (zs ++ rest)- case pickupZ (evalBoundsZ model bnd) of- Nothing -> error "solve': should not happen"- Just val -> return $ IM.insert v val model-- case2 = msum- [ do eq <- isZero $ a' *^ LA.var v ^-^ (c' ^+^ LA.constant k)- let (vs'', lits'', mt) = elimEq eq (v:vs') ys- model <- go vs'' =<< simplify lits''- return $ mt model- | let m = maximum [b | (_,b)<-us]- , (c',a') <- ls- , k <- [0 .. (m*a'-a'-m) `div` m]- ]--chooseVariable :: [Var] -> [Lit] -> (Var, [Var], BoundsZ, [Lit])-chooseVariable vs xs = head $ [e | e@(_,_,bnd,_) <- table, isExact bnd] ++ table- where- table = [ (v, vs', bnd, rest)- | (v,vs') <- pickup vs, let (bnd, rest) = collectBoundsZ v xs- ]--evalBoundsZ :: Model Integer -> BoundsZ -> IntervalZ-evalBoundsZ model (ls,us) =- foldl' intersectZ univZ $ - [ (Just (ceiling (LA.evalExpr model x % c)), Nothing) | (x,c) <- ls ] ++ - [ (Nothing, Just (floor (LA.evalExpr model x % c))) | (x,c) <- us ]--elimEq :: ExprZ -> [Var] -> [Lit] -> ([Var], [Lit], Model Integer -> Model Integer)-elimEq e vs lits = - if abs ak == 1- then- case LA.extract xk e of- (_, e') ->- let xk_def = signum ak *^ negateV e'- in ( vs- , [applySubst1Lit xk xk_def lit | lit <- lits]- , \model -> IM.insert xk (LA.evalExpr model xk_def) model- )- else- let m = abs ak + 1- xk_def = (- signum ak * m) *^ LA.var sigma ^+^- LA.fromTerms [(signum ak * (a `zmod` m), x) | (a,x) <- LA.terms e, x /= xk]- e2 = (- abs ak) *^ LA.var sigma ^+^ - LA.fromTerms [((floor (a%m + 1/2) + (a `zmod` m)), x) | (a,x) <- LA.terms e, x /= xk]- -- LA.applySubst1 xk xk_def e を normalize したもの- in case elimEq e2 (sigma : vs) [applySubst1Lit xk xk_def lit | lit <- lits] of- (vs2, lits2, mt) ->- ( vs2- , lits2- , \model ->- let model2 = mt model- in IM.delete sigma $ IM.insert xk (LA.evalExpr model2 xk_def) model2- )- where- (ak,xk) = minimumBy (comparing (abs . fst)) [(a,x) | (a,x) <- LA.terms e, x /= LA.unitVar]- sigma = maximum (-1 : vs) + 1--applySubst1Lit :: Var -> ExprZ -> Lit -> Lit-applySubst1Lit v e (Nonneg e2) = LA.applySubst1 v e e2 `geZ` LA.constant 0---- -----------------------------------------------------------------------------isZero :: ExprZ -> Maybe ExprZ-isZero e- = if LA.coeff LA.unitVar e `mod` d == 0- then Just $ e2- else Nothing- where- e2 = LA.mapCoeff (`div` d) e- d = abs $ gcd' [c | (c,v) <- LA.terms e, v /= LA.unitVar]---- -----------------------------------------------------------------------------type IntervalZ = (Maybe Integer, Maybe Integer)--univZ :: IntervalZ-univZ = (Nothing, Nothing)--intersectZ :: IntervalZ -> IntervalZ -> IntervalZ-intersectZ (l1,u1) (l2,u2) = (combineMaybe max l1 l2, combineMaybe min u1 u2)--pickupZ :: IntervalZ -> Maybe Integer-pickupZ (Nothing,Nothing) = return 0-pickupZ (Just x, Nothing) = return x-pickupZ (Nothing, Just x) = return x-pickupZ (Just x, Just y) = if x <= y then return x else mzero ---- -----------------------------------------------------------------------------solve :: Options -> VarSet -> [LA.Atom Rational] -> Maybe (Model Integer)-solve opt vs cs = msum [solve' opt (IS.toList vs) lits | lits <- unDNF dnf]- where- dnf = andB (map f cs)- f (Rel lhs op rhs) =- case op of- Lt -> DNF [[a `ltZ` b]]- Le -> DNF [[a `leZ` b]]- Gt -> DNF [[a `gtZ` b]]- Ge -> DNF [[a `geZ` b]]- Eql -> eqZ a b- NEq -> DNF [[a `ltZ` b], [a `gtZ` b]]- where- (e1,c1) = g lhs- (e2,c2) = g rhs- a = c2 *^ e1- b = c1 *^ e2- g :: LA.Expr Rational -> (ExprZ, Integer)- g a = (LA.mapCoeff (\c -> floor (c * fromInteger d)) a, d)- where- d = foldl' lcm 1 [denominator c | (c,_) <- LA.terms a]--solveQFLA :: Options -> VarSet -> [LA.Atom Rational] -> VarSet -> Maybe (Model Rational)-solveQFLA opt vs cs ivs = listToMaybe $ do- (cs2, mt) <- FM.projectN rvs cs- m <- maybeToList $ solve opt ivs cs2- return $ mt $ IM.map fromInteger m- where- rvs = vs `IS.difference` ivs---- -----------------------------------------------------------------------------zmod :: Integer -> Integer -> Integer-a `zmod` b = a - b * floor (a % b + 1 / 2)--gcd' :: [Integer] -> Integer-gcd' [] = 1-gcd' xs = foldl1' gcd xs--pickup :: [a] -> [(a,[a])]-pickup [] = []-pickup (x:xs) = (x,xs) : [(y,x:ys) | (y,ys) <- pickup xs]---- ---------------------------------------------------------------------------
− src/Algorithm/OmegaTest/Misc.hs
@@ -1,39 +0,0 @@-{-# OPTIONS_GHC -Wall #-}-module Algorithm.OmegaTest.Misc- ( checkRealByCAD- , checkRealBySimplex- ) where--import Control.Monad-import qualified Data.IntMap as IM-import qualified Data.IntSet as IS-import Data.Maybe-import qualified Data.Set as Set-import System.IO.Unsafe--import qualified Data.LA as LA-import qualified Data.Polynomial as P-import Data.Var-import qualified Algorithm.CAD as CAD-import qualified Algorithm.Simplex2 as Simplex2--checkRealByCAD :: VarSet -> [LA.Atom Rational] -> Bool-checkRealByCAD vs as = isJust $ CAD.solve vs2 (map (fmap f) as)- where- vs2 = Set.fromAscList $ IS.toAscList vs-- f :: LA.Expr Rational -> P.Polynomial Rational Int- f t = sum [ if x == LA.unitVar- then P.constant c- else P.constant c * P.var x- | (c,x) <- LA.terms t ]--checkRealBySimplex :: VarSet -> [LA.Atom Rational] -> Bool-checkRealBySimplex vs as = unsafePerformIO $ do- solver <- Simplex2.newSolver- s <- liftM IM.fromList $ forM (IS.toList vs) $ \v -> do- v2 <- Simplex2.newVar solver- return (v, LA.var v2)- forM_ as $ \a -> do- Simplex2.assertAtomEx solver (fmap (LA.applySubst s) a)- Simplex2.check solver
− src/Algorithm/Simplex.hs
@@ -1,309 +0,0 @@-{-# LANGUAGE ScopedTypeVariables #-}-{-# OPTIONS_GHC -Wall #-}--------------------------------------------------------------------------------- |--- Module : Algorithm.Simplex--- Copyright : (c) Masahiro Sakai 2011--- License : BSD-style--- --- Maintainer : masahiro.sakai@gmail.com--- Stability : provisional--- Portability : non-portable (ScopedTypeVariables)------ Naïve implementation of Simplex method--- --- Reference:------ * <http://www.math.cuhk.edu.hk/~wei/lpch3.pdf>----------------------------------------------------------------------------------module Algorithm.Simplex- ( module Data.OptDir- , Tableau- , RowIndex- , ColIndex- , Row- , PivotResult- , objRow- , pivot- , lookupRow- , setRow- , setObjFun- , currentObjValue- , simplex- , dualSimplex- , phaseI- , toCSV- ) where--import Data.Ord-import Data.List (intersperse, minimumBy, foldl')-import qualified Data.IntMap as IM-import qualified Data.IntSet as IS-import Data.OptDir-import Data.VectorSpace-import Control.Exception--import qualified Data.LA as LA-import Data.Var---- -----------------------------------------------------------------------------type Tableau r = VarMap (Row r)-{--tbl ! v == (m, val)-==>-var v .+. m .==. constant val--}--type RowIndex = Int-type ColIndex = Int-type Row r = (VarMap r, r)-data PivotResult r = PivotUnbounded | PivotFinished | PivotSuccess (Tableau r)- deriving (Show, Eq, Ord)--objRow :: RowIndex-objRow = -1--pivot :: (Fractional r, Eq r) => RowIndex -> ColIndex -> Tableau r -> Tableau r-{-# INLINE pivot #-}-{-# SPECIALIZE pivot :: RowIndex -> ColIndex -> Tableau Rational -> Tableau Rational #-}-{-# SPECIALIZE pivot :: RowIndex -> ColIndex -> Tableau Double -> Tableau Double #-}-pivot r s tbl =- assert (validTableau tbl) $ -- precondition- assert (validTableau tbl') $ -- postcondition- tbl'- where- tbl' = IM.insert s row_s $ IM.map f $ IM.delete r $ tbl- f orig@(row_i, row_i_val) =- case IM.lookup s row_i of- Nothing -> orig- Just c ->- ( IM.filter (0/=) $ IM.unionWith (+) (IM.delete s row_i) (IM.map (negate c *) row_r')- , row_i_val - c*row_r_val'- )- (row_r, row_r_val) = lookupRow r tbl- a_rs = row_r IM.! s- row_r' = IM.map (/ a_rs) $ IM.insert r 1 $ IM.delete s row_r- row_r_val' = row_r_val / a_rs- row_s = (row_r', row_r_val')--lookupRow :: RowIndex -> Tableau r -> Row r-lookupRow r m = m IM.! r---- 行の基底変数の列が0になるように変形-normalizeRow :: (Num r, Eq r) => Tableau r -> Row r -> Row r-normalizeRow a (row0,val0) = obj'- where- obj' = g $ foldl' f (IM.empty, val0) $ - [ case IM.lookup j a of- Nothing -> (IM.singleton j x, 0)- Just (row,val) -> (IM.map ((-x)*) (IM.delete j row), -x*val)- | (j,x) <- IM.toList row0 ]- f (m1,v1) (m2,v2) = (IM.unionWith (+) m1 m2, v1+v2)- g (m,v) = (IM.filter (0/=) m, v)--setRow :: (Num r, Eq r) => RowIndex -> Tableau r -> Row r -> Tableau r-setRow i tbl row = assert (validTableau tbl) $ assert (validTableau tbl') $ tbl'- where- tbl' = IM.insert i (normalizeRow tbl row) tbl--setObjFun :: (Num r, Eq r) => Tableau r -> LA.Expr r -> Tableau r-setObjFun tbl e = setRow objRow tbl row- where- row =- case LA.extract LA.unitVar e of- (c, e') -> (LA.coeffMap (negateV e'), c)--copyObjRow :: (Num r, Eq r) => Tableau r -> Tableau r -> Tableau r-copyObjRow from to =- case IM.lookup objRow from of- Nothing -> IM.delete objRow to- Just row -> setRow objRow to row--currentObjValue :: (Num r, Eq r) => Tableau r -> r-currentObjValue = snd . lookupRow objRow--validTableau :: Tableau r -> Bool-validTableau tbl =- and [v `IM.notMember` m | (v, (m,_)) <- IM.toList tbl, v /= objRow] &&- and [IS.null (IM.keysSet m `IS.intersection` vs) | (m,_) <- IM.elems tbl']- where- tbl' = IM.delete objRow tbl- vs = IM.keysSet tbl' --isFeasible :: Real r => Tableau r -> Bool-isFeasible tbl = - and [val >= 0 | (v, (_,val)) <- IM.toList tbl, v /= objRow]--isOptimal :: Real r => OptDir -> Tableau r -> Bool-isOptimal optdir tbl =- and [not (cmp cj) | cj <- IM.elems (fst (lookupRow objRow tbl))]- where- cmp = case optdir of- OptMin -> (0<)- OptMax -> (0>)--isImproving :: Real r => OptDir -> Tableau r -> Tableau r -> Bool-isImproving OptMin from to = currentObjValue to <= currentObjValue from -isImproving OptMax from to = currentObjValue to >= currentObjValue from ---- ------------------------------------------------------------------------------ primal simplex--simplex :: (Real r, Fractional r) => OptDir -> Tableau r -> (Bool, Tableau r)-{-# SPECIALIZE simplex :: OptDir -> Tableau Rational -> (Bool, Tableau Rational) #-}-{-# SPECIALIZE simplex :: OptDir -> Tableau Double -> (Bool, Tableau Double) #-}-simplex optdir = go- where- go tbl = assert (isFeasible tbl) $- case primalPivot optdir tbl of- PivotFinished -> assert (isOptimal optdir tbl) (True, tbl)- PivotUnbounded -> (False, tbl)- PivotSuccess tbl' -> assert (isImproving optdir tbl tbl') $ go tbl'--primalPivot :: (Real r, Fractional r) => OptDir -> Tableau r -> PivotResult r-{-# INLINE primalPivot #-}-primalPivot optdir tbl- | null cs = PivotFinished- | null rs = PivotUnbounded- | otherwise = PivotSuccess (pivot r s tbl)- where- cmp = case optdir of- OptMin -> (0<)- OptMax -> (0>)- cs = [(j,cj) | (j,cj) <- IM.toList (fst (lookupRow objRow tbl)), cmp cj]- -- smallest subscript rule- s = fst $ head cs- -- classical rule- --s = fst $ (if optdir==OptMin then maximumBy else minimumBy) (compare `on` snd) cs- rs = [ (i, y_i0 / y_is)- | (i, (row_i, y_i0)) <- IM.toList tbl, i /= objRow- , let y_is = IM.findWithDefault 0 s row_i, y_is > 0- ]- r = fst $ minimumBy (comparing snd) rs---- ------------------------------------------------------------------------------ dual simplex--dualSimplex :: (Real r, Fractional r) => OptDir -> Tableau r -> (Bool, Tableau r)-{-# SPECIALIZE dualSimplex :: OptDir -> Tableau Rational -> (Bool, Tableau Rational) #-}-{-# SPECIALIZE dualSimplex :: OptDir -> Tableau Double -> (Bool, Tableau Double) #-}-dualSimplex optdir = go- where- go tbl = assert (isOptimal optdir tbl) $- case dualPivot optdir tbl of- PivotFinished -> assert (isFeasible tbl) $ (True, tbl)- PivotUnbounded -> (False, tbl)- PivotSuccess tbl' -> assert (isImproving optdir tbl' tbl) $ go tbl'--dualPivot :: (Real r, Fractional r) => OptDir -> Tableau r -> PivotResult r-{-# INLINE dualPivot #-}-dualPivot optdir tbl- | null rs = PivotFinished- | null cs = PivotUnbounded- | otherwise = PivotSuccess (pivot r s tbl)- where- rs = [(i, row_i) | (i, (row_i, y_i0)) <- IM.toList tbl, i /= objRow, 0 > y_i0]- (r, row_r) = head rs- cs = [ (j, if optdir==OptMin then y_0j / y_rj else - y_0j / y_rj)- | (j, y_rj) <- IM.toList row_r- , y_rj < 0- , let y_0j = IM.findWithDefault 0 j obj- ]- s = fst $ minimumBy (comparing snd) cs- (obj,_) = lookupRow objRow tbl---- ------------------------------------------------------------------------------ phase I of the two-phased method--phaseI :: (Real r, Fractional r) => Tableau r -> VarSet -> (Bool, Tableau r)-{-# SPECIALIZE phaseI :: Tableau Rational -> VarSet -> (Bool, Tableau Rational) #-}-{-# SPECIALIZE phaseI :: Tableau Double -> VarSet -> (Bool, Tableau Double) #-}-phaseI tbl avs- | currentObjValue tbl1' /= 0 = (False, tbl1')- | otherwise = (True, copyObjRow tbl $ removeArtificialVariables avs $ tbl1')- where- optdir = OptMax- tbl1 = setObjFun tbl $ negateV $ sumV [LA.var v | v <- IS.toList avs]- tbl1' = go tbl1- go tbl2- | currentObjValue tbl2 == 0 = tbl2- | otherwise = - case primalPivot optdir tbl2 of- PivotSuccess tbl2' -> assert (isImproving optdir tbl2 tbl2') $ go tbl2'- PivotFinished -> assert (isOptimal optdir tbl2) tbl2- PivotUnbounded -> error "phaseI: should not happen"---- post-processing of phaseI--- pivotを使ってartificial variablesを基底から除いて、削除-removeArtificialVariables :: (Real r, Fractional r) => VarSet -> Tableau r -> Tableau r-removeArtificialVariables avs tbl0 = tbl2- where- tbl1 = foldl' f (IM.delete objRow tbl0) (IS.toList avs)- tbl2 = IM.map (\(row,val) -> (IM.filterWithKey (\j _ -> j `IS.notMember` avs) row, val)) tbl1- f tbl i =- case IM.lookup i tbl of- Nothing -> tbl- Just row ->- case [j | (j,c) <- IM.toList (fst row), c /= 0, j `IS.notMember` avs] of- [] -> IM.delete i tbl- j:_ -> pivot i j tbl----- -----------------------------------------------------------------------------toCSV :: (Num r, Eq r, Show r) => (r -> String) -> Tableau r -> String-toCSV showCell tbl = unlines . map (concat . intersperse ",") $ header : body- where- header :: [String]- header = "" : map colName cols ++ [""]-- body :: [[String]]- body = [showRow i (lookupRow i tbl) | i <- rows]-- rows :: [RowIndex]- rows = IM.keys (IM.delete objRow tbl) ++ [objRow]-- cols :: [ColIndex]- cols = [0..colMax]- where- colMax = maximum (-1 : [c | (row, _) <- IM.elems tbl, c <- IM.keys row])-- rowName :: RowIndex -> String- rowName i = if i==objRow then "obj" else "x" ++ show i-- colName :: ColIndex -> String- colName j = "x" ++ show j-- showRow i (row, row_val) = rowName i : [showCell (IM.findWithDefault 0 j row') | j <- cols] ++ [showCell row_val]- where row' = IM.insert i 1 row---- ------------------------------------------------------------------------------- 退化して巡回の起こるKuhnの7変数3制約の例--kuhn_7_3 :: Tableau Rational-kuhn_7_3 = IM.fromList- [ (1, (IM.fromList [(4,-2), (5,-9), (6,1), (7,9)], 0))- , (2, (IM.fromList [(4,1/3), (5,1), (6,-1/3), (7,-2)], 0))- , (3, (IM.fromList [(4,2), (5,3), (6,-1), (7,-12)], 2))- , (objRow, (IM.fromList [(4,2), (5,3), (6,-1), (7,-12)], 0))- ]--test_kuhn_7_3 :: (Bool, Tableau Rational)-test_kuhn_7_3 = simplex OptMin kuhn_7_3---- from http://www.math.cuhk.edu.hk/~wei/lpch5.pdf-example_5_7 :: Tableau Rational-example_5_7 = IM.fromList- [ (4, (IM.fromList [(1,-1), (2,-2), (3,-3)], -5))- , (5, (IM.fromList [(1,-2), (2,-2), (3,-1)], -6))- , (objRow, (IM.fromList [(1,3),(2,4),(3,5)], 0))- ]--test_example_5_7 :: (Bool, Tableau Rational)-test_example_5_7 = dualSimplex OptMax example_5_7--- optimal value should be -11---- ---------------------------------------------------------------------------
− src/Algorithm/Simplex2.hs
@@ -1,1029 +0,0 @@-{-# LANGUAGE TypeSynonymInstances, FlexibleInstances, TypeFamilies, CPP #-}--------------------------------------------------------------------------------- |--- Module : Algorithm.Simplex2--- Copyright : (c) Masahiro Sakai 2012--- License : BSD-style--- --- Maintainer : masahiro.sakai@gmail.com--- Stability : provisional--- Portability : non-portable (TypeSynonymInstances, FlexibleInstances, TypeFamilies, CPP)------ Naïve implementation of Simplex method--- --- Reference:------ * <http://www.math.cuhk.edu.hk/~wei/lpch3.pdf>--- --- * Bruno Dutertre and Leonardo de Moura.--- A Fast Linear-Arithmetic Solver for DPLL(T).--- Computer Aided Verification In Computer Aided Verification, Vol. 4144 (2006), pp. 81-94.--- <http://yices.csl.sri.com/cav06.pdf>------ * Bruno Dutertre and Leonardo de Moura.--- Integrating Simplex with DPLL(T).--- CSL Technical Report SRI-CSL-06-01. 2006.--- <http://yices.csl.sri.com/sri-csl-06-01.pdf>----------------------------------------------------------------------------------module Algorithm.Simplex2- (- -- * The @Solver@ type- Solver- , GenericSolver- , SolverValue (..)- , newSolver- , cloneSolver-- -- * Problem specification- , Var- , newVar- , RelOp (..)- , (.<=.), (.>=.), (.==.), (.<.), (.>.)- , Atom (..)- , assertAtom- , assertAtomEx- , assertLower- , assertUpper- , setObj- , getObj- , OptDir (..)- , setOptDir- , getOptDir-- -- * Solving- , check- , Options (..)- , defaultOptions- , OptResult (..)- , optimize- , dualSimplex-- -- * Extract results- , Model- , model- , RawModel- , rawModel- , getValue- , getObjValue-- -- * Reading status- , getTableau- , getRow- , getCol- , getCoeff- , nVars- , isBasicVariable- , isNonBasicVariable- , isFeasible- , isOptimal- , getLB- , getUB-- -- * Configulation- , setLogger- , clearLogger- , PivotStrategy (..)- , setPivotStrategy-- -- * Debug- , dump- ) where--import Prelude hiding (log)-import Control.Exception-import Control.Monad-import Data.Ord-import Data.IORef-import Data.List-import Data.Maybe-import Data.Ratio-import Data.Map (Map)-import qualified Data.Map as Map-import Data.IntMap (IntMap)-import qualified Data.IntMap as IntMap-import Text.Printf-import Data.Time-import Data.OptDir-import Data.VectorSpace-import System.CPUTime--import qualified Data.LA as LA-import Data.LA (Atom (..))-import Data.ArithRel-import Data.Delta-import Util (showRational)--{--------------------------------------------------------------------- The @Solver@ type---------------------------------------------------------------------}--type Var = Int--data GenericSolver v- = GenericSolver- { svTableau :: !(IORef (IntMap (LA.Expr Rational)))- , svLB :: !(IORef (IntMap v))- , svUB :: !(IORef (IntMap v))- , svModel :: !(IORef (IntMap v))- , svVCnt :: !(IORef Int)- , svOk :: !(IORef Bool)- , svOptDir :: !(IORef OptDir)-- , svDefDB :: !(IORef (Map (LA.Expr Rational) Var))-- , svLogger :: !(IORef (Maybe (String -> IO ())))- , svPivotStrategy :: !(IORef PivotStrategy)- , svNPivot :: !(IORef Int)- }--type Solver = GenericSolver Rational---- special basic variable-objVar :: Int-objVar = -1--newSolver :: SolverValue v => IO (GenericSolver v)-newSolver = do- t <- newIORef (IntMap.singleton objVar zeroV)- l <- newIORef IntMap.empty- u <- newIORef IntMap.empty- m <- newIORef (IntMap.singleton objVar zeroV)- v <- newIORef 0- ok <- newIORef True- dir <- newIORef OptMin- defs <- newIORef Map.empty- logger <- newIORef Nothing- pivot <- newIORef PivotStrategyBlandRule- npivot <- newIORef 0- return $- GenericSolver- { svTableau = t- , svLB = l- , svUB = u- , svModel = m- , svVCnt = v- , svOk = ok- , svOptDir = dir- , svDefDB = defs- , svLogger = logger- , svNPivot = npivot- , svPivotStrategy = pivot- }--cloneSolver :: GenericSolver v -> IO (GenericSolver v)-cloneSolver solver = do- t <- newIORef =<< readIORef (svTableau solver)- l <- newIORef =<< readIORef (svLB solver)- u <- newIORef =<< readIORef (svUB solver)- m <- newIORef =<< readIORef (svModel solver)- v <- newIORef =<< readIORef (svVCnt solver)- ok <- newIORef =<< readIORef (svOk solver)- dir <- newIORef =<< readIORef (svOptDir solver)- defs <- newIORef =<< readIORef (svDefDB solver)- logger <- newIORef =<< readIORef (svLogger solver)- pivot <- newIORef =<< readIORef (svPivotStrategy solver)- npivot <- newIORef =<< readIORef (svNPivot solver)- return $- GenericSolver- { svTableau = t- , svLB = l- , svUB = u- , svModel = m- , svVCnt = v- , svOk = ok- , svOptDir = dir- , svDefDB = defs- , svLogger = logger- , svNPivot = npivot- , svPivotStrategy = pivot- } --class (VectorSpace v, Scalar v ~ Rational, Ord v) => SolverValue v where- toValue :: Rational -> v- showValue :: Bool -> v -> String- model :: GenericSolver v -> IO Model--instance SolverValue Rational where- toValue = id- showValue = showRational- model = rawModel--instance SolverValue (Delta Rational) where- toValue = fromReal- showValue = showDelta- model solver = do- xs <- variables solver- ys <- liftM concat $ forM xs $ \x -> do- Delta p q <- getValue solver x- lb <- getLB solver x- ub <- getUB solver x- return $- [(p - c) / (k - q) | Just (Delta c k) <- return lb, c < p, k > q] ++- [(d - p) / (q - h) | Just (Delta d h) <- return ub, p < d, q > h]- let delta0 :: Rational- delta0 = if null ys then 0.1 else minimum ys- f :: Delta Rational -> Rational- f (Delta r k) = r + k * delta0- liftM (IntMap.map f) $ readIORef (svModel solver)--{--Largest coefficient rule: original rule suggested by G. Dantzig.-Largest increase rule: computationally more expensive in comparison with Largest coefficient, but locally maximizes the progress.-Steepest edge rule: best pivot rule in practice, an efficient approximate implementation is "Devex".-Bland’s rule: avoids cycling but one of the slowest rules.-Random edge rule: Randomized have lead to the current best provable bounds for the number of pivot steps of the simplex method.-Lexicographic rule: used for avoiding cyclying.--}-data PivotStrategy- = PivotStrategyBlandRule- | PivotStrategyLargestCoefficient--- | PivotStrategySteepestEdge- deriving (Eq, Ord, Enum, Show, Read)--setPivotStrategy :: GenericSolver v -> PivotStrategy -> IO ()-setPivotStrategy solver ps = writeIORef (svPivotStrategy solver) ps--{--------------------------------------------------------------------- problem description---------------------------------------------------------------------}--newVar :: SolverValue v => GenericSolver v -> IO Var-newVar solver = do- v <- readIORef (svVCnt solver)- writeIORef (svVCnt solver) $! v+1- modifyIORef (svModel solver) (IntMap.insert v zeroV)- return v--assertAtom :: Solver -> LA.Atom Rational -> IO ()-assertAtom solver atom = do- (v,op,rhs') <- simplifyAtom solver atom- case op of- Le -> assertUpper solver v (toValue rhs')- Ge -> assertLower solver v (toValue rhs')- Eql -> do- assertLower solver v (toValue rhs')- assertUpper solver v (toValue rhs')- _ -> error "unsupported"- return ()--assertAtomEx :: GenericSolver (Delta Rational) -> LA.Atom Rational -> IO ()-assertAtomEx solver atom = do- (v,op,rhs') <- simplifyAtom solver atom- case op of- Le -> assertUpper solver v (toValue rhs')- Ge -> assertLower solver v (toValue rhs')- Lt -> assertUpper solver v (toValue rhs' ^-^ delta)- Gt -> assertLower solver v (toValue rhs' ^+^ delta)- Eql -> do- assertLower solver v (toValue rhs')- assertUpper solver v (toValue rhs')- return ()--simplifyAtom :: SolverValue v => GenericSolver v -> LA.Atom Rational -> IO (Var, RelOp, Rational)-simplifyAtom solver (Rel lhs op rhs) = do- let (lhs',rhs') =- case LA.extract LA.unitVar (lhs ^-^ rhs) of- (n,e) -> (e, -n)- case LA.terms lhs' of- [(1,v)] -> return (v, op, rhs')- [(-1,v)] -> return (v, flipOp op, -rhs')- _ -> do- defs <- readIORef (svDefDB solver)- let (c,lhs'') = scale lhs' -- lhs' = lhs'' / c = rhs'- rhs'' = c *^ rhs'- op'' = if c < 0 then flipOp op else op- case Map.lookup lhs'' defs of- Just v -> do- return (v,op'',rhs'')- Nothing -> do- v <- newVar solver- setRow solver v lhs''- modifyIORef (svDefDB solver) $ Map.insert lhs'' v- return (v,op'',rhs'')- where- scale :: LA.Expr Rational -> (Rational, LA.Expr Rational)- scale e = (c, c *^ e)- where- c = c1 * c2- c1 = fromIntegral $ foldl' lcm 1 [denominator c | (c, _) <- LA.terms e]- c2 = signum $ head ([c | (c,x) <- LA.terms e] ++ [1])--assertLower :: SolverValue v => GenericSolver v -> Var -> v -> IO ()-assertLower solver x l = do- l0 <- getLB solver x- u0 <- getUB solver x- case (l0,u0) of - (Just l0', _) | l <= l0' -> return ()- (_, Just u0') | u0' < l -> markBad solver- _ -> do- modifyIORef (svLB solver) (IntMap.insert x l)- b <- isNonBasicVariable solver x- v <- getValue solver x- when (b && not (l <= v)) $ update solver x l- checkNBFeasibility solver--assertUpper :: SolverValue v => GenericSolver v -> Var -> v -> IO ()-assertUpper solver x u = do- l0 <- getLB solver x- u0 <- getUB solver x- case (l0,u0) of - (_, Just u0') | u0' <= u -> return ()- (Just l0', _) | u < l0' -> markBad solver- _ -> do- modifyIORef (svUB solver) (IntMap.insert x u)- b <- isNonBasicVariable solver x- v <- getValue solver x- when (b && not (v <= u)) $ update solver x u- checkNBFeasibility solver---- FIXME: 式に定数項が含まれる可能性を考えるとこれじゃまずい?-setObj :: SolverValue v => GenericSolver v -> LA.Expr Rational -> IO ()-setObj solver e = setRow solver objVar e--getObj :: SolverValue v => GenericSolver v -> IO (LA.Expr Rational)-getObj solver = getRow solver objVar--setRow :: SolverValue v => GenericSolver v -> Var -> LA.Expr Rational -> IO ()-setRow solver v e = do- modifyIORef (svTableau solver) $ \t ->- IntMap.insert v (LA.applySubst t e) t- modifyIORef (svModel solver) $ \m -> - IntMap.insert v (LA.evalLinear m (toValue 1) e) m --setOptDir :: GenericSolver v -> OptDir -> IO ()-setOptDir solver dir = writeIORef (svOptDir solver) dir--getOptDir :: GenericSolver v -> IO OptDir-getOptDir solver = readIORef (svOptDir solver)--{--------------------------------------------------------------------- Status---------------------------------------------------------------------}--nVars :: GenericSolver v -> IO Int-nVars solver = readIORef (svVCnt solver)--isBasicVariable :: GenericSolver v -> Var -> IO Bool-isBasicVariable solver v = do- t <- readIORef (svTableau solver)- return $ v `IntMap.member` t--isNonBasicVariable :: GenericSolver v -> Var -> IO Bool-isNonBasicVariable solver x = liftM not (isBasicVariable solver x)--isFeasible :: SolverValue v => GenericSolver v -> IO Bool-isFeasible solver = do- xs <- variables solver- liftM and $ forM xs $ \x -> do- v <- getValue solver x- l <- getLB solver x- u <- getUB solver x- return (testLB l v && testUB u v)--isOptimal :: SolverValue v => GenericSolver v -> IO Bool-isOptimal solver = do- obj <- getRow solver objVar- ret <- selectEnteringVariable solver- return $! isNothing ret--{--------------------------------------------------------------------- Satisfiability solving---------------------------------------------------------------------}--check :: SolverValue v => GenericSolver v -> IO Bool-check solver = do- let- loop :: IO Bool- loop = do- m <- selectViolatingBasicVariable solver-- case m of- Nothing -> return True- Just xi -> do- li <- getLB solver xi- ui <- getUB solver xi- isLBViolated <- do- vi <- getValue solver xi- return $ not (testLB li vi)- let q = if isLBViolated- then -- select the smallest non-basic variable xj such that- -- (aij > 0 and β(xj) < uj) or (aij < 0 and β(xj) > lj)- canIncrease solver- else -- select the smallest non-basic variable xj such that- -- (aij < 0 and β(xj) < uj) or (aij > 0 and β(xj) > lj)- canDecrease solver- xi_def <- getRow solver xi- r <- liftM (fmap snd) $ findM q (LA.terms xi_def) - case r of- Nothing -> markBad solver >> return False- Just xj -> do- pivotAndUpdate solver xi xj (fromJust (if isLBViolated then li else ui))- loop-- ok <- readIORef (svOk solver)- if not ok- then return False- else do- log solver "check"- result <- recordTime solver loop- when result $ checkFeasibility solver- return result--selectViolatingBasicVariable :: SolverValue v => GenericSolver v -> IO (Maybe Var)-selectViolatingBasicVariable solver = do- let- p :: Var -> IO Bool- p x | x == objVar = return False- p xi = do- li <- getLB solver xi- ui <- getUB solver xi- vi <- getValue solver xi- return $ not (testLB li vi) || not (testUB ui vi)- vs <- basicVariables solver-- ps <- readIORef (svPivotStrategy solver)- case ps of- PivotStrategyBlandRule ->- findM p vs- PivotStrategyLargestCoefficient -> do- xs <- filterM p vs- case xs of- [] -> return Nothing- _ -> do- xs2 <- forM xs $ \xi -> do- vi <- getValue solver xi- li <- getLB solver xi- ui <- getUB solver xi- if not (testLB li vi)- then return (xi, fromJust li ^-^ vi)- else return (xi, vi ^-^ fromJust ui)- return $ Just $ fst $ maximumBy (comparing snd) xs2--{--------------------------------------------------------------------- Optimization---------------------------------------------------------------------}---- | results of optimization-data OptResult = Optimum | Unsat | Unbounded | ObjLimit- deriving (Show, Eq, Ord)--data Options- = Options- { objLimit :: Maybe Rational- }- deriving (Show, Eq, Ord)--defaultOptions :: Options-defaultOptions- = Options- { objLimit = Nothing- }--optimize :: Solver -> Options -> IO OptResult-optimize solver opt = do- ret <- do- is_fea <- isFeasible solver- if is_fea then return True else check solver- if not ret- then return Unsat -- unsat- else do- log solver "optimize"- result <- recordTime solver loop- when (result == Optimum) $ checkOptimality solver- return result- where- loop :: IO OptResult- loop = do- checkFeasibility solver- ret <- selectEnteringVariable solver- case ret of- Nothing -> return Optimum- Just (c,xj) -> do- dir <- getOptDir solver- r <- if dir==OptMin- then if c > 0- then decreaseNB solver xj -- xj を小さくして目的関数を小さくする- else increaseNB solver xj -- xj を大きくして目的関数を小さくする- else if c > 0- then increaseNB solver xj -- xj を大きくして目的関数を大きくする- else decreaseNB solver xj -- xj を小さくして目的関数を大きくする- if r- then loop- else return Unbounded--selectEnteringVariable :: SolverValue v => GenericSolver v -> IO (Maybe (Rational, Var))-selectEnteringVariable solver = do- ps <- readIORef (svPivotStrategy solver)- obj_def <- getRow solver objVar- case ps of- PivotStrategyBlandRule ->- findM canEnter (LA.terms obj_def)- PivotStrategyLargestCoefficient -> do- ts <- filterM canEnter (LA.terms obj_def)- case ts of- [] -> return Nothing- _ -> return $ Just $ snd $ maximumBy (comparing fst) [(abs c, (c,xj)) | (c,xj) <- ts]- where- canEnter :: (Rational, Var) -> IO Bool- canEnter (_,xj) | xj == LA.unitVar = return False- canEnter (c,xj) = do- dir <- getOptDir solver- if dir==OptMin- then canDecrease solver (c,xj)- else canIncrease solver (c,xj)--canIncrease :: SolverValue v => GenericSolver v -> (Rational,Var) -> IO Bool-canIncrease solver (a,x) =- case compare a 0 of- EQ -> return False- GT -> canIncrease1 solver x- LT -> canDecrease1 solver x--canDecrease :: SolverValue v => GenericSolver v -> (Rational,Var) -> IO Bool-canDecrease solver (a,x) =- case compare a 0 of- EQ -> return False- GT -> canDecrease1 solver x- LT -> canIncrease1 solver x--canIncrease1 :: SolverValue v => GenericSolver v -> Var -> IO Bool-canIncrease1 solver x = do- u <- getUB solver x- v <- getValue solver x- case u of- Nothing -> return True- Just uv -> return $! (v < uv)--canDecrease1 :: SolverValue v => GenericSolver v -> Var -> IO Bool-canDecrease1 solver x = do- l <- getLB solver x- v <- getValue solver x- case l of- Nothing -> return True- Just lv -> return $! (lv < v)---- | feasibility を保ちつつ non-basic variable xj の値を大きくする-increaseNB :: Solver -> Var -> IO Bool-increaseNB solver xj = do- col <- getCol solver xj-- -- Upper bounds of θ- -- NOTE: xj 自体の上限も考慮するのに注意- ubs <- liftM concat $ forM ((xj,1) : IntMap.toList col) $ \(xi,aij) -> do- v1 <- getValue solver xi- li <- getLB solver xi- ui <- getUB solver xi- return [ assert (theta >= zeroV) ((xi,v2), theta)- | Just v2 <- [ui | aij > 0] ++ [li | aij < 0]- , let theta = (v2 ^-^ v1) ^/ aij ]-- -- β(xj) := β(xj) + θ なので θ を大きく- case ubs of- [] -> return False -- unbounded- _ -> do- let (xi, v) = fst $ minimumBy (comparing snd) ubs- pivotAndUpdate solver xi xj v- return True---- | feasibility を保ちつつ non-basic variable xj の値を小さくする-decreaseNB :: Solver -> Var -> IO Bool-decreaseNB solver xj = do- col <- getCol solver xj-- -- Lower bounds of θ- -- NOTE: xj 自体の下限も考慮するのに注意- lbs <- liftM concat $ forM ((xj,1) : IntMap.toList col) $ \(xi,aij) -> do- v1 <- getValue solver xi- li <- getLB solver xi- ui <- getUB solver xi- return [ assert (theta <= zeroV) ((xi,v2), theta)- | Just v2 <- [li | aij > 0] ++ [ui | aij < 0]- , let theta = (v2 ^-^ v1) ^/ aij ]-- -- β(xj) := β(xj) + θ なので θ を小さく- case lbs of- [] -> return False -- unbounded- _ -> do- let (xi, v) = fst $ maximumBy (comparing snd) lbs- pivotAndUpdate solver xi xj v- return True--dualSimplex :: Solver -> Options -> IO OptResult-dualSimplex solver opt = do- let- loop :: IO OptResult- loop = do- checkOptimality solver-- p <- prune solver opt- if p- then return ObjLimit- else do- m <- selectViolatingBasicVariable solver- case m of- Nothing -> return Optimum- Just xi -> do- xi_def <- getRow solver xi- li <- getLB solver xi- ui <- getUB solver xi- isLBViolated <- do- vi <- getValue solver xi- return $ not (testLB li vi)- r <- dualRTest solver xi_def isLBViolated- case r of- Nothing -> markBad solver >> return Unsat -- dual unbounded- Just xj -> do- pivotAndUpdate solver xi xj (fromJust (if isLBViolated then li else ui))- loop-- ok <- readIORef (svOk solver)- if not ok- then return Unsat- else do- log solver "dual simplex"- result <- recordTime solver loop- when (result == Optimum) $ checkFeasibility solver- return result--dualRTest :: Solver -> LA.Expr Rational -> Bool -> IO (Maybe Var)-dualRTest solver row isLBViolated = do- -- normalize to the cases of minimization- obj_def <- do- def <- getRow solver objVar- dir <- getOptDir solver- return $- case dir of- OptMin -> def- OptMax -> negateV def- -- normalize to the cases of lower bound violation- let xi_def =- if isLBViolated- then row- else negateV row- ws <- do- -- select non-basic variable xj such that- -- (aij > 0 and β(xj) < uj) or (aij < 0 and β(xj) > lj)- liftM concat $ forM (LA.terms xi_def) $ \(aij, xj) -> do- b <- canIncrease solver (aij, xj)- if b- then do- let cj = LA.coeff xj obj_def- let ratio = cj / aij- return [(xj, ratio) | ratio >= 0]- else- return []- case ws of- [] -> return Nothing- _ -> return $ Just $ fst $ minimumBy (comparing snd) ws--prune :: Solver -> Options -> IO Bool-prune solver opt =- case objLimit opt of- Nothing -> return False- Just lim -> do - o <- getObjValue solver- dir <- getOptDir solver- case dir of- OptMin -> return $! (lim <= o)- OptMax -> return $! (lim >= o)--{--------------------------------------------------------------------- Extract results---------------------------------------------------------------------}--type RawModel v = IntMap v--rawModel :: GenericSolver v -> IO (RawModel v)-rawModel solver = do- xs <- variables solver- liftM IntMap.fromList $ forM xs $ \x -> do- val <- getValue solver x- return (x,val)--getObjValue :: GenericSolver v -> IO v-getObjValue solver = getValue solver objVar --type Model = IntMap Rational- -{--------------------------------------------------------------------- major function---------------------------------------------------------------------}--update :: SolverValue v => GenericSolver v -> Var -> v -> IO ()-update solver xj v = do- -- log solver $ printf "before update x%d (%s)" xj (show v)- -- dump solver-- v0 <- getValue solver xj- let diff = v ^-^ v0-- aj <- getCol solver xj- modifyIORef (svModel solver) $ \m ->- let m2 = IntMap.map (\aij -> aij *^ diff) aj- in IntMap.insert xj v $ IntMap.unionWith (^+^) m2 m-- -- log solver $ printf "after update x%d (%s)" xj (show v)- -- dump solver--pivot :: SolverValue v => GenericSolver v -> Var -> Var -> IO ()-pivot solver xi xj = do- modifyIORef' (svNPivot solver) (+1)- modifyIORef' (svTableau solver) $ \defs ->- case LA.solveFor (LA.var xi .==. (defs IntMap.! xi)) xj of- Just (Eql, xj_def) ->- IntMap.insert xj xj_def . IntMap.map (LA.applySubst1 xj xj_def) . IntMap.delete xi $ defs- _ -> error "pivot: should not happen"--pivotAndUpdate :: SolverValue v => GenericSolver v -> Var -> Var -> v -> IO ()-pivotAndUpdate solver xi xj v | xi == xj = update solver xi v -- xi = xj is non-basic variable-pivotAndUpdate solver xi xj v = do- -- xi is basic variable- -- xj is non-basic varaible-- -- log solver $ printf "before pivotAndUpdate x%d x%d (%s)" xi xj (show v)- -- dump solver-- m <- readIORef (svModel solver)-- aj <- getCol solver xj- let aij = aj IntMap.! xi- let theta = (v ^-^ (m IntMap.! xi)) ^/ aij-- let m' = IntMap.fromList $- [(xi, v), (xj, (m IntMap.! xj) ^+^ theta)] ++- [(xk, (m IntMap.! xk) ^+^ (akj *^ theta)) | (xk, akj) <- IntMap.toList aj, xk /= xi]- writeIORef (svModel solver) (IntMap.union m' m) -- note that 'IntMap.union' is left biased.-- pivot solver xi xj-- -- log solver $ printf "after pivotAndUpdate x%d x%d (%s)" xi xj (show v)- -- dump solver--getLB :: GenericSolver v -> Var -> IO (Maybe v)-getLB solver x = do- lb <- readIORef (svLB solver)- return $ IntMap.lookup x lb--getUB :: GenericSolver v -> Var -> IO (Maybe v)-getUB solver x = do- ub <- readIORef (svUB solver)- return $ IntMap.lookup x ub--getTableau :: GenericSolver v -> IO (IntMap (LA.Expr Rational))-getTableau solver = do- t <- readIORef (svTableau solver)- return $ IntMap.delete objVar t--getValue :: GenericSolver v -> Var -> IO v-getValue solver x = do- m <- readIORef (svModel solver)- return $ m IntMap.! x--getRow :: GenericSolver v -> Var -> IO (LA.Expr Rational)-getRow solver x = do- -- x should be basic variable or 'objVar'- t <- readIORef (svTableau solver)- return $! (t IntMap.! x)---- aijが非ゼロの列も全部探しているのは効率が悪い-getCol :: SolverValue v => GenericSolver v -> Var -> IO (IntMap Rational)-getCol solver xj = do- t <- readIORef (svTableau solver)- return $ IntMap.mapMaybe (LA.lookupCoeff xj) t--getCoeff :: GenericSolver v -> Var -> Var -> IO Rational-getCoeff solver xi xj = do- xi_def <- getRow solver xi- return $! LA.coeff xj xi_def--markBad :: GenericSolver v -> IO ()-markBad solver = writeIORef (svOk solver) False--{--------------------------------------------------------------------- utility---------------------------------------------------------------------}--findM :: Monad m => (a -> m Bool) -> [a] -> m (Maybe a)-findM _ [] = return Nothing-findM p (x:xs) = do- r <- p x- if r- then return (Just x)- else findM p xs--testLB :: SolverValue v => Maybe v -> v -> Bool-testLB Nothing _ = True-testLB (Just l) x = l <= x--testUB :: SolverValue v => Maybe v -> v -> Bool-testUB Nothing _ = True-testUB (Just u) x = x <= u--variables :: GenericSolver v -> IO [Var]-variables solver = do- vcnt <- nVars solver- return [0..vcnt-1]--basicVariables :: GenericSolver v -> IO [Var]-basicVariables solver = do- t <- readIORef (svTableau solver)- return (IntMap.keys t)--#if !MIN_VERSION_base(4,6,0)--modifyIORef' :: IORef a -> (a -> a) -> IO ()-modifyIORef' ref f = do- x <- readIORef ref- writeIORef ref $! f x--#endif--recordTime :: SolverValue v => GenericSolver v -> IO a -> IO a-recordTime solver act = do- dumpSize solver- writeIORef (svNPivot solver) 0-- startCPU <- getCPUTime- startWC <- getCurrentTime-- result <- act-- endCPU <- getCPUTime- endWC <- getCurrentTime-- (log solver . printf "cpu time = %.3fs") (fromIntegral (endCPU - startCPU) / 10^(12::Int) :: Double)- (log solver . printf "wall clock time = %.3fs") (realToFrac (endWC `diffUTCTime` startWC) :: Double)- (log solver . printf "#pivot = %d") =<< readIORef (svNPivot solver)- return result--showDelta :: Bool -> Delta Rational -> String-showDelta asRatio v = - case v of- (Delta r k) -> - f r ++- case compare k 0 of- EQ -> ""- GT -> " + " ++ f k ++ " delta"- LT -> " - " ++ f (abs k) ++ " delta"- where- f = showRational asRatio--{--------------------------------------------------------------------- Logging---------------------------------------------------------------------}---- | set callback function for receiving messages.-setLogger :: GenericSolver v -> (String -> IO ()) -> IO ()-setLogger solver logger = do- writeIORef (svLogger solver) (Just logger)--clearLogger :: GenericSolver v -> IO ()-clearLogger solver = writeIORef (svLogger solver) Nothing--log :: GenericSolver v -> String -> IO ()-log solver msg = logIO solver (return msg)--logIO :: GenericSolver v -> IO String -> IO ()-logIO solver action = do- m <- readIORef (svLogger solver)- case m of- Nothing -> return ()- Just logger -> action >>= logger--{--------------------------------------------------------------------- debug and tests---------------------------------------------------------------------}--test4 :: IO ()-test4 = do- solver <- newSolver- setLogger solver putStrLn- x0 <- newVar solver- x1 <- newVar solver-- writeIORef (svTableau solver) (IntMap.fromList [(x1, LA.var x0)])- writeIORef (svLB solver) (IntMap.fromList [(x0, toValue 0), (x1, toValue 0)])- writeIORef (svUB solver) (IntMap.fromList [(x0, toValue 2), (x1, toValue 3)])- setObj solver (LA.fromTerms [(-1, x0)])-- ret <- optimize solver defaultOptions- print ret- dump solver--test5 :: IO ()-test5 = do- solver <- newSolver- setLogger solver putStrLn- x0 <- newVar solver- x1 <- newVar solver-- writeIORef (svTableau solver) (IntMap.fromList [(x1, LA.var x0)])- writeIORef (svLB solver) (IntMap.fromList [(x0, toValue 0), (x1, toValue 0)])- writeIORef (svUB solver) (IntMap.fromList [(x0, toValue 2), (x1, toValue 0)])- setObj solver (LA.fromTerms [(-1, x0)])-- checkFeasibility solver-- ret <- optimize solver defaultOptions- print ret- dump solver--test6 :: IO ()-test6 = do- solver <- newSolver- setLogger solver putStrLn- x0 <- newVar solver-- assertAtom solver (LA.constant 1 .<. LA.var x0)- assertAtom solver (LA.constant 2 .>. LA.var x0)-- ret <- check solver- print ret- dump solver-- m <- model solver- print m--dumpSize :: SolverValue v => GenericSolver v -> IO ()-dumpSize solver = do- t <- readIORef (svTableau solver)- let nrows = IntMap.size t - 1 -- -1 is objVar- xs <- variables solver- let ncols = length xs - nrows- let nnz = sum [IntMap.size $ LA.coeffMap xi_def | (xi,xi_def) <- IntMap.toList t, xi /= objVar]- log solver $ printf "%d rows, %d columns, %d non-zeros" nrows ncols nnz--dump :: SolverValue v => GenericSolver v -> IO ()-dump solver = do- log solver "============="-- log solver "Tableau:"- t <- readIORef (svTableau solver)- log solver $ printf "obj = %s" (show (t IntMap.! objVar))- forM_ (IntMap.toList t) $ \(xi, e) -> do- when (xi /= objVar) $ log solver $ printf "x%d = %s" xi (show e)-- log solver ""-- log solver "Assignments and Bounds:"- objVal <- getValue solver objVar- log solver $ printf "beta(obj) = %s" (showValue True objVal)- xs <- variables solver - forM_ xs $ \x -> do- l <- getLB solver x- u <- getUB solver x- v <- getValue solver x- let f Nothing = "Nothing"- f (Just x) = showValue True x- log solver $ printf "beta(x%d) = %s; %s <= x%d <= %s" x (showValue True v) (f l) x (f u)-- log solver ""- log solver "Status:"- is_fea <- isFeasible solver- is_opt <- isOptimal solver- log solver $ printf "Feasible: %s" (show is_fea)- log solver $ printf "Optimal: %s" (show is_opt)-- log solver "============="--checkFeasibility :: SolverValue v => GenericSolver v -> IO ()-checkFeasibility _ | True = return ()-checkFeasibility solver = do- xs <- variables solver- forM_ xs $ \x -> do- v <- getValue solver x- l <- getLB solver x- u <- getUB solver x- let f Nothing = "Nothing"- f (Just x) = showValue True x- unless (testLB l v) $- error (printf "(%s) <= x%d is violated; x%d = (%s)" (f l) x x (showValue True v))- unless (testUB u v) $- error (printf "x%d <= (%s) is violated; x%d = (%s)" x (f u) x (showValue True v))- return ()--checkNBFeasibility :: SolverValue v => GenericSolver v -> IO ()-checkNBFeasibility _ | True = return ()-checkNBFeasibility solver = do- xs <- variables solver- forM_ xs $ \x -> do- b <- isNonBasicVariable solver x- when b $ do- v <- getValue solver x- l <- getLB solver x- u <- getUB solver x- let f Nothing = "Nothing"- f (Just x) = showValue True x- unless (testLB l v) $- error (printf "checkNBFeasibility: (%s) <= x%d is violated; x%d = (%s)" (f l) x x (showValue True v))- unless (testUB u v) $- error (printf "checkNBFeasibility: x%d <= (%s) is violated; x%d = (%s)" x (f u) x (showValue True v))--checkOptimality :: Solver -> IO ()-checkOptimality _ | True = return ()-checkOptimality solver = do- ret <- selectEnteringVariable solver- case ret of- Nothing -> return () -- optimal- Just (_,x) -> error (printf "checkOptimality: not optimal (x%d can be changed)" x)
− src/Algorithm/Wang.hs
@@ -1,46 +0,0 @@-import Control.Monad (guard,msum) -import Data.List (intersect) -import Data.Maybe (isJust, listToMaybe) - -data Formula x - = Atom x - | Not !(Formula x) - | Imply !(Formula x) !(Formula x) - | And !(Formula x) !(Formula x) - | Or !(Formula x) !(Formula x) - deriving Eq - -type Sequent x = ([Formula x], [Formula x]) - -isValid :: Eq x => Sequent x -> Bool -isValid = isJust . isValid' - -isValid' :: Eq x => Sequent x -> Maybe () -isValid' (l,r) = - do xs <- listToMaybe $ msum $ - [ do let i = intersect l r - guard $ not $ null i - return [] - , do (Not p, r) <- pick r - return [(p:l,r)] - , do (Not p, l) <- pick l - return [(l,p:r)] - , do (Imply p q, r) <- pick r - return [(p:l,q:r)] - , do (Or p q, r) <- pick r - return [(l,p:q:r)] - , do (And p q, l) <- pick l - return [(p:q:l,r)] - , do (Or p q, l) <- pick l - return [(p:l,r), (q:l,r)] - , do (And p q, r) <- pick r - return [(l,p:r), (l,q:r)] - , do (Imply p q, l) <- pick l - return [(q:l,r), (l,p:r)] - ] - mapM_ isValid' xs - return () - -pick :: [x] -> [(x,[x])] -pick [] = [] -pick (x:xs) = (x,xs) : [(y,x:ys) | (y,ys) <- pick xs]
− src/Converter/LP2SMT.hs
@@ -1,304 +0,0 @@-{-# OPTIONS_GHC -Wall #-}--------------------------------------------------------------------------------- |--- Module : Converter.LP2SMT--- Copyright : (c) Masahiro Sakai 2012--- License : BSD-style--- --- Maintainer : masahiro.sakai@gmail.com--- Stability : experimental--- Portability : portable----------------------------------------------------------------------------------module Converter.LP2SMT- ( convert- , Options (..)- , defaultOptions- , Language (..)- ) where--import Data.Char-import Data.Ord-import Data.List-import Data.Ratio-import qualified Data.Set as Set-import Data.Map (Map)-import qualified Data.Map as Map-import System.IO-import Text.Printf-import qualified Text.LPFile as LP-import Util (showRationalAsFiniteDecimal)--data Options- = Options- { optLanguage :: Language- , optCheckSAT :: Bool- , optProduceModel :: Bool- , optOptimize :: Bool- }- deriving (Show, Eq, Ord)--defaultOptions :: Options-defaultOptions- = Options- { optLanguage = SMTLIB2- , optCheckSAT = True- , optProduceModel = True- , optOptimize = False- }--data Language- = SMTLIB2- | YICES- deriving (Show, Eq, Ord, Enum)---- --------------------------------------------------------------------------type Var = String-type Env = Map LP.Var Var--concatS :: [ShowS] -> ShowS-concatS = foldr (.) id- -unlinesS :: [ShowS] -> ShowS-unlinesS = concatS . map (. showChar '\n')--list :: [ShowS] -> ShowS-list xs = showParen True $ concatS (intersperse (showChar ' ') xs)--and' :: [ShowS] -> ShowS-and' [] = showString "true"-and' [x] = x-and' xs = list (showString "and" : xs)--or' :: [ShowS] -> ShowS-or' [] = showString "false"-or' [x] = x-or' xs = list (showString "or" : xs)--not' :: ShowS -> ShowS-not' x = list [showString "not", x]--expr :: Options -> Env -> LP.LP -> LP.Expr -> ShowS-expr opt env lp e =- case e of- [] -> showChar '0'- _ -> list (showChar '+' : map f e)- where- f (LP.Term c []) = realNum opt c- f (LP.Term c vs) =- case xs of- [] -> realNum opt 1- [x] -> x- _ -> list (showChar '*' : xs)- where- xs = [realNum opt c | c /= 1] ++- [ v3- | v <- vs- , let v2 = env Map.! v- , let v3 = if LP.getVarType lp v == LP.IntegerVariable- then toReal opt (showString v2)- else showString v2- ]--realNum :: Options -> Rational -> ShowS-realNum opt r =- case optLanguage opt of- SMTLIB2- | r < 0 -> list [showChar '-', f (negate r)]- | otherwise -> f r- YICES ->- if denominator r == 1- then shows (numerator r)- else shows (numerator r) . showChar '/' . shows (denominator r)- where- f r = case showRationalAsFiniteDecimal r of- Just s -> showString s- Nothing -> list [showChar '/', shows (numerator r) . showString ".0", shows (denominator r) . showString ".0"]--rel :: Bool -> LP.RelOp -> ShowS -> ShowS -> ShowS-rel True LP.Eql x y = and' [rel False LP.Le x y, rel False LP.Ge x y]-rel _ LP.Eql x y = list [showString "=", x, y]-rel _ LP.Le x y = list [showString "<=", x, y]-rel _ LP.Ge x y = list [showString ">=", x, y]--toReal :: Options -> ShowS -> ShowS-toReal opt x =- case optLanguage opt of- SMTLIB2 -> list [showString "to_real", x]- YICES -> x--assert :: Options -> (ShowS, Maybe String) -> ShowS-assert opt (x, label) = list [showString "assert", x']- where- x' = case label of- Just name | optLanguage opt == SMTLIB2 ->- list [ showString "!"- , x- , showString ":named"- , showString (encode opt name)- ]- _ -> x--constraint :: Options -> Bool -> Env -> LP.LP -> LP.Constraint -> (ShowS, Maybe String)-constraint opt q env lp- LP.Constraint- { LP.constrLabel = label- , LP.constrIndicator = g- , LP.constrBody = (e, op, b)- } = (c1, label)- where- c0 = rel q op (expr opt env lp e) (realNum opt b)- c1 = case g of- Nothing -> c0- Just (var,val) ->- list [ showString "=>"- , rel q LP.Eql (expr opt env lp [LP.Term 1 [var]]) (realNum opt val)- , c0- ]--conditions :: Options -> Bool -> Env -> LP.LP -> [(ShowS, Maybe String)]-conditions opt q env lp = bnds ++ cs ++ ss- where- vs = LP.variables lp- bnds = map bnd (Set.toList vs)- bnd v = (c1, Nothing)- where- v2 = env Map.! v- v3 = if LP.getVarType lp v == LP.IntegerVariable- then toReal opt (showString v2)- else showString v2- (lb,ub) = LP.getBounds lp v- s1 = case lb of- LP.NegInf -> []- LP.PosInf -> [showString "false"]- LP.Finite x -> [list [showString "<=", realNum opt x, v3]]- s2 = case ub of- LP.NegInf -> [showString "false"]- LP.PosInf -> []- LP.Finite x -> [list [showString "<=", v3, realNum opt x]]- c0 = and' (s1 ++ s2)- c1 = if LP.getVarType lp v == LP.SemiContinuousVariable- then or' [list [showString "=", showString v2, realNum opt 0], c0]- else c0- cs = map (constraint opt q env lp) (LP.constraints lp)- ss = concatMap sos (LP.sos lp)- sos (label, typ, xs) = do- (x1,x2) <- case typ of- LP.S1 -> pairs $ map fst xs- LP.S2 -> nonAdjacentPairs $ map fst $ sortBy (comparing snd) $ xs- let c = not' $ and'- [ list [showString "/=", v3, realNum opt 0]- | v<-[x1,x2]- , let v2 = env Map.! v- , let v3 = if LP.getVarType lp v == LP.IntegerVariable- then toReal opt (showString v2)- else showString v2- ]- return (c, label)--pairs :: [a] -> [(a,a)]-pairs [] = []-pairs (x:xs) = [(x,x2) | x2 <- xs] ++ pairs xs--nonAdjacentPairs :: [a] -> [(a,a)]-nonAdjacentPairs (x1:x2:xs) = [(x1,x3) | x3 <- xs] ++ nonAdjacentPairs (x2:xs)-nonAdjacentPairs _ = []--convert :: Options -> LP.LP -> ShowS-convert opt lp =- unlinesS $ defs ++ map (assert opt) (conditions opt False env lp)- ++ [ assert opt (optimality, Nothing) | optOptimize opt ]- ++ [ case optLanguage opt of- SMTLIB2 -> list [showString "set-option", showString ":produce-models", showString "true"]- YICES -> list [showString "set-evidence!", showString "true"]- | optProduceModel opt ]- ++ [ case optLanguage opt of- SMTLIB2 -> list [showString "check-sat"]- YICES -> list [showString "check"]- | optCheckSAT opt ]- where- vs = LP.variables lp- real_vs = vs `Set.difference` int_vs- int_vs = LP.integerVariables lp- realType =- case optLanguage opt of- SMTLIB2 -> "Real"- YICES -> "real"- intType =- case optLanguage opt of- SMTLIB2 -> "Int"- YICES -> "int"- ts = [(v, realType) | v <- Set.toList real_vs] ++ [(v, intType) | v <- Set.toList int_vs]- obj = snd (LP.objectiveFunction lp)- env = Map.fromList [(v, encode opt v) | v <- Set.toList vs]- -- Note that identifiers of LPFile does not contain '-'.- -- So that there are no name crash.- env2 = Map.fromList [(v, encode opt (v ++ "-2")) | v <- Set.toList vs]-- defs = do- (v,t) <- ts- let v2 = env Map.! v- return $ showString $- case optLanguage opt of- SMTLIB2 -> printf "(declare-fun %s () %s)" v2 t- YICES -> printf "(define %s::%s) ; %s" v2 t v-- optimality = list [showString "forall", decl, body]- where- decl =- case optLanguage opt of- SMTLIB2 -> list [list [showString (env2 Map.! v), showString t] | (v,t) <- ts]- YICES -> list [showString $ printf "%s::%s" (env2 Map.! v) t | (v,t) <- ts]- body = list [showString "=>"- , and' (map fst (conditions opt True env2 lp))- , list [ showString $ if LP.dir lp == LP.OptMin then "<=" else ">="- , expr opt env lp obj, expr opt env2 lp obj- ]- ]--encode :: Options -> String -> String-encode opt s = - case optLanguage opt of- SMTLIB2- | all p s -> s- | any q s -> error $ "cannot encode " ++ show s- | otherwise -> "|" ++ s ++ "|"- YICES -> concatMap f s- where- p c = isAscii c && (isAlpha c || isDigit c || c `elem` "~!@$%^&*_-+=<>.?/")- q c = c == '|' && c == '\\'-- -- Note that '[', ']', '\\' does not appear in identifiers of LP file.- f '(' = "["- f ')' = "]"- f c | c `elem` "/\";" = printf "\\x%02d" (fromEnum c :: Int)- f c = [c]---- --------------------------------------------------------------------------testFile :: FilePath -> IO ()-testFile fname = do- result <- LP.parseFile fname- case result of- Right lp -> putStrLn $ convert defaultOptions lp ""- Left err -> hPrint stderr err--test :: IO ()-test = putStrLn $ convert defaultOptions testdata ""--testdata :: LP.LP-Right testdata = LP.parseString "test" $ unlines- [ "Maximize"- , " obj: x1 + 2 x2 + 3 x3 + x4"- , "Subject To"- , " c1: - x1 + x2 + x3 + 10 x4 <= 20"- , " c2: x1 - 3 x2 + x3 <= 30"- , " c3: x2 - 3.5 x4 = 0"- , "Bounds"- , " 0 <= x1 <= 40"- , " 2 <= x4 <= 3"- , "General"- , " x4"- , "End"- ]
− src/Converter/MaxSAT2LP.hs
@@ -1,25 +0,0 @@-{-# OPTIONS_GHC -Wall #-}--------------------------------------------------------------------------------- |--- Module : Converter.MaxSAT2LP--- Copyright : (c) Masahiro Sakai 2011-2012--- License : BSD-style--- --- Maintainer : masahiro.sakai@gmail.com--- Stability : experimental--- Portability : portable----------------------------------------------------------------------------------module Converter.MaxSAT2LP- ( convert- ) where--import Data.Map (Map)-import qualified Text.LPFile as LPFile-import qualified Text.MaxSAT as MaxSAT-import SAT.Types-import qualified Converter.MaxSAT2WBO as MaxSAT2WBO-import qualified Converter.PB2LP as PB2LP--convert :: Bool -> MaxSAT.WCNF -> (LPFile.LP, Map LPFile.Var Rational -> Model)-convert useIndicator wcnf = PB2LP.convertWBO useIndicator (MaxSAT2WBO.convert wcnf)
− src/Converter/MaxSAT2NLPB.hs
@@ -1,28 +0,0 @@-{-# OPTIONS_GHC -Wall #-}--------------------------------------------------------------------------------- |--- Module : Converter.MaxSAT2NLPB--- Copyright : (c) Masahiro Sakai 2013--- License : BSD-style--- --- Maintainer : masahiro.sakai@gmail.com--- Stability : experimental--- Portability : portable----------------------------------------------------------------------------------module Converter.MaxSAT2NLPB- ( convert- ) where--import qualified Text.PBFile as PBFile-import qualified Text.MaxSAT as MaxSAT--convert :: MaxSAT.WCNF -> PBFile.Formula-convert- MaxSAT.WCNF- { MaxSAT.topCost = top- , MaxSAT.clauses = cs- } = (Just obj, cs2)- where- obj = [(w, [-l | l <- ls]) | (w,ls) <- cs, w /= top]- cs2 = [([(1,[l]) | l <- ls], PBFile.Ge, 1) | (w,ls) <- cs, w == top]
− src/Converter/MaxSAT2WBO.hs
@@ -1,32 +0,0 @@-{-# OPTIONS_GHC -Wall #-}--------------------------------------------------------------------------------- |--- Module : Converter.MaxSAT2WBO--- Copyright : (c) Masahiro Sakai 2013--- License : BSD-style--- --- Maintainer : masahiro.sakai@gmail.com--- Stability : experimental--- Portability : portable----------------------------------------------------------------------------------module Converter.MaxSAT2WBO- ( convert- ) where--import qualified Text.PBFile as PBFile-import qualified Text.MaxSAT as MaxSAT--convert :: MaxSAT.WCNF -> PBFile.SoftFormula-convert- MaxSAT.WCNF- { MaxSAT.topCost = top- , MaxSAT.clauses = cs- } = (Nothing, map f cs)- where- f (w,ls)- | w>=top = (Nothing, p) -- hard constraint- | otherwise = (Just w, p) -- soft constraint- where- p = ([(1,[l]) | l <- ls], PBFile.Ge, 1)-
− src/Converter/ObjType.hs
@@ -1,18 +0,0 @@-{-# OPTIONS_GHC -Wall #-} ------------------------------------------------------------------------------ --- | --- Module : Converter.ObjType --- Copyright : (c) Masahiro Sakai 2011-2012 --- License : BSD-style --- --- Maintainer : masahiro.sakai@gmail.com --- Stability : experimental --- Portability : portable --- ------------------------------------------------------------------------------ -module Converter.ObjType - ( ObjType (..) - ) where - -data ObjType = ObjNone | ObjMaxOne | ObjMaxZero - deriving Eq
− src/Converter/PB2LP.hs
@@ -1,218 +0,0 @@-{-# OPTIONS_GHC -Wall #-}--------------------------------------------------------------------------------- |--- Module : Converter.PB2LP--- Copyright : (c) Masahiro Sakai 2011-2012--- License : BSD-style--- --- Maintainer : masahiro.sakai@gmail.com--- Stability : experimental--- Portability : portable----------------------------------------------------------------------------------module Converter.PB2LP- ( convert- , convertWBO- ) where--import Data.Array.IArray-import Data.List-import Data.Maybe-import Data.IntSet (IntSet)-import qualified Data.IntSet as IntSet-import qualified Data.Set as Set-import Data.Map (Map)-import qualified Data.Map as Map-import qualified Text.PBFile as PBFile-import qualified Text.LPFile as LPFile-import qualified SAT.Types as SAT--convert :: PBFile.Formula -> (LPFile.LP, Map LPFile.Var Rational -> SAT.Model)-convert formula@(obj, cs) = (lp, mtrans (PBFile.pbNumVars formula))- where- lp = LPFile.LP- { LPFile.variables = vs2- , LPFile.dir = dir- , LPFile.objectiveFunction = (Nothing, obj2)- , LPFile.constraints = cs2- , LPFile.varInfo = Map.fromAscList- [ ( v- , LPFile.VarInfo- { LPFile.varName = v- , LPFile.varType = LPFile.IntegerVariable- , LPFile.varBounds = (LPFile.Finite 0, LPFile.Finite 1)- }- )- | v <- Set.toAscList vs2- ]- , LPFile.sos = []- }-- vs1 = collectVariables formula- vs2 = (Set.fromList . map convVar . IntSet.toList) $ vs1-- (dir,obj2) =- case obj of- Just obj' -> (LPFile.OptMin, convExpr obj')- Nothing -> (LPFile.OptMin, convExpr [])-- cs2 = do- (lhs,op,rhs) <- cs- let op2 = case op of- PBFile.Ge -> LPFile.Ge- PBFile.Eq -> LPFile.Eql- lhs2 = convExpr lhs- lhs3a = [t | t@(LPFile.Term _ (_:_)) <- lhs2]- lhs3b = sum [c | LPFile.Term c [] <- lhs2]- return $ LPFile.Constraint- { LPFile.constrType = LPFile.NormalConstraint- , LPFile.constrLabel = Nothing- , LPFile.constrIndicator = Nothing- , LPFile.constrBody = (lhs3a, op2, fromIntegral rhs - lhs3b)- }--convExpr :: PBFile.Sum -> LPFile.Expr-convExpr [] = [LPFile.Term 0 ["x1"]]-convExpr s = concatMap g2 s- where- g2 :: PBFile.WeightedTerm -> LPFile.Expr- g2 (w, tm) = foldl' prodE [LPFile.Term (fromIntegral w) []] (map g3 tm)-- g3 :: PBFile.Lit -> LPFile.Expr- g3 x- | x > 0 = [LPFile.Term 1 [convVar x]]- | otherwise = [LPFile.Term 1 [], LPFile.Term (-1) [convVar (abs x)]]-- prodE :: LPFile.Expr -> LPFile.Expr -> LPFile.Expr- prodE e1 e2 = [prodT t1 t2 | t1 <- e1, t2 <- e2]-- prodT :: LPFile.Term -> LPFile.Term -> LPFile.Term- prodT (LPFile.Term c1 vs1) (LPFile.Term c2 vs2) = LPFile.Term (c1*c2) (vs1++vs2)--convVar :: PBFile.Var -> LPFile.Var-convVar x = ("x" ++ show x)--collectVariables :: PBFile.Formula -> IntSet-collectVariables (obj, cs) = IntSet.unions $ maybe IntSet.empty f obj : [f s | (s,_,_) <- cs]- where- f :: PBFile.Sum -> IntSet- f xs = IntSet.fromList $ do- (_,ts) <- xs- lit <- ts- return $ abs lit--convertWBO :: Bool -> PBFile.SoftFormula -> (LPFile.LP, Map LPFile.Var Rational -> SAT.Model)-convertWBO useIndicator formula@(top, cs) = (lp, mtrans (PBFile.wboNumVars formula))- where- lp = LPFile.LP- { LPFile.variables = vs2- , LPFile.dir = LPFile.OptMin- , LPFile.objectiveFunction = (Nothing, obj2)- , LPFile.constraints = topConstr ++ map snd cs2- , LPFile.varInfo = Map.fromAscList- [ ( v- , LPFile.VarInfo- { LPFile.varName = v- , LPFile.varType = LPFile.IntegerVariable- , LPFile.varBounds = (LPFile.Finite 0, LPFile.Finite 1)- }- )- | v <- Set.toAscList vs2- ]- , LPFile.sos = []- }-- vs1 = collectVariablesWBO formula- vs2 = ((Set.fromList . map convVar . IntSet.toList) $ vs1) `Set.union` vs3- vs3 = Set.fromList [v | (ts, _) <- cs2, (_, v) <- ts]-- obj2 = [LPFile.Term (fromIntegral w) [v] | (ts, _) <- cs2, (w, v) <- ts]-- topConstr :: [LPFile.Constraint]- topConstr = - case top of- Nothing -> []- Just t ->- [ LPFile.Constraint- { LPFile.constrType = LPFile.NormalConstraint- , LPFile.constrLabel = Nothing- , LPFile.constrIndicator = Nothing- , LPFile.constrBody = (obj2, LPFile.Le, fromInteger t - 1)- }- ]-- cs2 :: [([(Integer, LPFile.Var)], LPFile.Constraint)]- cs2 = do- (n, (w, (lhs,op,rhs))) <- zip [(0::Int)..] cs- let - lhs2 = convExpr lhs- lhs3 = [t | t@(LPFile.Term _ (_:_)) <- lhs2]- rhs3 = fromIntegral rhs - sum [c | LPFile.Term c [] <- lhs2]- v = "r" ++ show n- (ts,ind) =- case w of- Nothing -> ([], Nothing)- Just w2 -> ([(w2, v)], Just (v,0))- if isNothing w || useIndicator then do- let op2 =- case op of- PBFile.Ge -> LPFile.Ge- PBFile.Eq -> LPFile.Eql- c = LPFile.Constraint- { LPFile.constrType = LPFile.NormalConstraint- , LPFile.constrLabel = Nothing- , LPFile.constrIndicator = ind- , LPFile.constrBody = (lhs3, op2, rhs3)- }- return (ts, c)- else do- let (lhsGE,rhsGE) = relaxGE v (lhs3,rhs3)- c1 = LPFile.Constraint- { LPFile.constrType = LPFile.NormalConstraint- , LPFile.constrLabel = Nothing- , LPFile.constrIndicator = Nothing- , LPFile.constrBody = (lhsGE, LPFile.Ge, rhsGE)- }- case op of- PBFile.Ge -> do- return (ts, c1)- PBFile.Eq -> do- let (lhsLE,rhsLE) = relaxLE v (lhs3,rhs3)- c2 = LPFile.Constraint- { LPFile.constrType = LPFile.NormalConstraint- , LPFile.constrLabel = Nothing- , LPFile.constrIndicator = Nothing- , LPFile.constrBody = (lhsLE, LPFile.Le, rhsLE)- }- [ (ts, c1), ([], c2) ]--relaxGE :: LPFile.Var -> (LPFile.Expr, Rational) -> (LPFile.Expr, Rational)-relaxGE v (lhs, rhs) = (LPFile.Term (rhs - lhs_lb) [v] : lhs, rhs)- where- lhs_lb = sum [min c 0 | LPFile.Term c _ <- lhs]--relaxLE :: LPFile.Var -> (LPFile.Expr, Rational) -> (LPFile.Expr, Rational)-relaxLE v (lhs, rhs) = (LPFile.Term (rhs - lhs_ub) [v] : lhs, rhs)- where- lhs_ub = sum [max c 0 | LPFile.Term c _ <- lhs]--collectVariablesWBO :: PBFile.SoftFormula -> IntSet-collectVariablesWBO (_top, cs) = IntSet.unions [f s | (_,(s,_,_)) <- cs]- where- f :: PBFile.Sum -> IntSet- f xs = IntSet.fromList $ do- (_,ts) <- xs- lit <- ts- return $ abs lit--mtrans :: Int -> Map LPFile.Var Rational -> SAT.Model-mtrans nvar m =- array (1, nvar)- [ (i, val)- | i <- [1 .. nvar]- , let val =- case m Map.! (convVar i) of- 0 -> False- 1 -> True- v0 -> error (show v0 ++ " is neither 0 nor 1")- ]
− src/Converter/PB2LSP.hs
@@ -1,60 +0,0 @@-{-# OPTIONS_GHC -Wall #-}--------------------------------------------------------------------------------- |--- Module : Converter.PB2LSP--- Copyright : (c) Masahiro Sakai 2013--- License : BSD-style--- --- Maintainer : masahiro.sakai@gmail.com--- Stability : experimental--- Portability : portable----------------------------------------------------------------------------------module Converter.PB2LSP- ( convert- ) where--import Data.List-import qualified Text.PBFile as PBFile--convert :: PBFile.Formula -> ShowS-convert formula@(obj, cs) =- showString "function model() {\n" .- decls .- constrs .- obj2 .- showString "}\n"- where- nv = PBFile.pbNumVars formula-- decls = showString $- " for [i in 1.." ++ show nv ++ "] x[i] <- bool();\n"-- constrs = foldr (.) id- [ showString " constraint " .- showString (showSum lhs) .- showString op2 .- shows rhs .- showString ";\n"- | (lhs, op, rhs) <- cs- , let op2 = case op of- PBFile.Ge -> " >= "- PBFile.Eq -> " == "- ]-- sum' :: [String] -> String- sum' xs = "sum(" ++ intercalate ", " xs ++ ")"-- showSum = sum' . map showTerm-- showTerm (n,ls) = intercalate "*" $ [show n | n /= 1] ++ [showLit l | l<-ls]-- showLit l =- if l < 0- then "!x[" ++ show (abs l) ++ "]"- else "x[" ++ show l ++ "]"-- obj2 =- case obj of- Just obj' -> showString " minimize " . showString (showSum obj') . showString ";\n"- Nothing -> id
− src/Converter/PB2SMP.hs
@@ -1,85 +0,0 @@-{-# OPTIONS_GHC -Wall #-}--------------------------------------------------------------------------------- |--- Module : Converter.PB2SMP--- Copyright : (c) Masahiro Sakai 2013--- License : BSD-style--- --- Maintainer : masahiro.sakai@gmail.com--- Stability : experimental--- Portability : portable----------------------------------------------------------------------------------module Converter.PB2SMP- ( convert- ) where--import Data.List-import qualified Text.PBFile as PBFile--convert :: Bool -> PBFile.Formula -> ShowS-convert isUnix formula@(obj, cs) =- header .- decls .- showString "\n" .- obj2 .- showString "\n" .- constrs .- showString "\n" .- actions .- footer- where- nv = PBFile.pbNumVars formula-- header =- if isUnix- then showString "#include \"simple.h\"\nvoid ufun()\n{\n\n"- else id- - footer =- if isUnix- then showString "\n}\n"- else id-- actions =- showString "solve();\n" .- showString "x[i].val.print();\n" .- showString "cost.val.print();\n"-- decls = showString $- "Element i(set=\"1 .. " ++ show nv ++ "\");\n" ++- "IntegerVariable x(type=binary, index=i);\n"-- constrs = foldr (.) id- [ showString (showSum lhs) .- showString op2 .- shows rhs .- showString ";\n"- | (lhs, op, rhs) <- cs- , let op2 = case op of- PBFile.Ge -> " >= "- PBFile.Eq -> " == "- ]-- showSum :: PBFile.Sum -> String- showSum [] = "0"- showSum xs = intercalate " + " $ map showTerm xs-- showTerm (n,ls) = intercalate "*" $ showCoeff n ++ [showLit l | l<-ls]-- showCoeff n- | n == 1 = []- | n < 0 = ["(" ++ show n ++ ")"]- | otherwise = [show n]-- showLit l =- if l < 0- then "(1-x[" ++ show (abs l) ++ "])"- else "x[" ++ show l ++ "]"-- obj2 =- case obj of- Just obj' ->- showString "Objective cost(type=minimize);\n" .- showString "cost = " . showString (showSum obj') . showString ";\n"- Nothing -> id
− src/Converter/PB2WBO.hs
@@ -1,33 +0,0 @@-{-# OPTIONS_GHC -Wall #-}--------------------------------------------------------------------------------- |--- Module : Converter.PB2WBO--- Copyright : (c) Masahiro Sakai 2013--- License : BSD-style--- --- Maintainer : masahiro.sakai@gmail.com--- Stability : experimental--- Portability : portable------ References:------ * Improving Unsatisfiability-based Algorithms for Boolean Optimization--- <http://sat.inesc-id.pt/~ruben/talks/sat10-talk.pdf>----------------------------------------------------------------------------------module Converter.PB2WBO (convert) where--import qualified Text.PBFile as PBFile--convert :: PBFile.Formula -> PBFile.SoftFormula-convert (obj, cs) = (Nothing, cs1 ++ cs2)- where- cs1 = [(Nothing, c) | c <- cs]- cs2 = case obj of- Nothing -> []- Just e ->- [ if w >= 0- then (Just w, ([(-1,ls)], PBFile.Ge, 0))- else (Just (abs w), ([(1,ls)], PBFile.Ge, 1))- | (w,ls) <- e- ]
− src/Converter/PBSetObj.hs
@@ -1,31 +0,0 @@-{-# OPTIONS_GHC -Wall #-}--------------------------------------------------------------------------------- |--- Module : Converter.PBSetObj--- Copyright : (c) Masahiro Sakai 2013--- License : BSD-style--- --- Maintainer : masahiro.sakai@gmail.com--- Stability : experimental--- Portability : portable----------------------------------------------------------------------------------module Converter.PBSetObj- ( ObjType (..)- , setObj- ) where--import qualified Text.PBFile as PBFile-import Converter.ObjType--setObj :: ObjType -> PBFile.Formula -> PBFile.Formula-setObj objType formula@(_, cs) = (Just obj2, cs)- where- obj2 = genObj objType formula--genObj :: ObjType -> PBFile.Formula -> PBFile.Sum-genObj objType formula =- case objType of- ObjNone -> []- ObjMaxOne -> [(1,[-v]) | v <- [1 .. PBFile.pbNumVars formula]] -- minimize false literals- ObjMaxZero -> [(1,[ v]) | v <- [1 .. PBFile.pbNumVars formula]] -- minimize true literals
− src/Converter/SAT2LP.hs
@@ -1,25 +0,0 @@-{-# OPTIONS_GHC -Wall #-}--------------------------------------------------------------------------------- |--- Module : Converter.SAT2LP--- Copyright : (c) Masahiro Sakai 2011-2012--- License : BSD-style--- --- Maintainer : masahiro.sakai@gmail.com--- Stability : experimental--- Portability : portable----------------------------------------------------------------------------------module Converter.SAT2LP- ( convert- ) where--import Data.Map (Map)-import qualified Text.LPFile as LPFile-import qualified Language.CNF.Parse.ParseDIMACS as DIMACS-import qualified SAT.Types as SAT-import qualified Converter.PB2LP as PB2LP-import qualified Converter.SAT2PB as SAT2PB--convert :: DIMACS.CNF -> (LPFile.LP, Map LPFile.Var Rational -> SAT.Model)-convert cnf = PB2LP.convert (SAT2PB.convert cnf)
− src/Converter/SAT2PB.hs
@@ -1,24 +0,0 @@-{-# OPTIONS_GHC -Wall #-}--------------------------------------------------------------------------------- |--- Module : Converter.SAT2PB--- Copyright : (c) Masahiro Sakai 2013--- License : BSD-style--- --- Maintainer : masahiro.sakai@gmail.com--- Stability : experimental--- Portability : portable----------------------------------------------------------------------------------module Converter.SAT2PB- ( convert- ) where--import Data.Array.IArray-import qualified Text.PBFile as PBFile-import qualified Language.CNF.Parse.ParseDIMACS as DIMACS--convert :: DIMACS.CNF -> PBFile.Formula-convert cnf = (Nothing, map f (DIMACS.clauses cnf))- where- f clause = ([(1,[l]) | l <- elems clause], PBFile.Ge, 1)
− src/Converter/WBO2PB.hs
@@ -1,47 +0,0 @@-{-# OPTIONS_GHC -Wall #-}--------------------------------------------------------------------------------- |--- Module : Converter.WBO2PB--- Copyright : (c) Masahiro Sakai 2013--- License : BSD-style--- --- Maintainer : masahiro.sakai@gmail.com--- Stability : experimental--- Portability : portable----------------------------------------------------------------------------------module Converter.WBO2PB (convert) where--import Data.Array.IArray-import qualified SAT.Types as SAT-import qualified Text.PBFile as PBFile--convert :: PBFile.SoftFormula -> (PBFile.Formula, SAT.Model -> SAT.Model)-convert wbo@(top, cs) = ((Just obj, topConstr ++ concatMap f cm), mtrans)- where- nv = PBFile.wboNumVars wbo-- cm = zip [nv+1..] cs- obj = [(w, [i]) | (i, (Just w,_)) <- cm]-- f :: (PBFile.Var, PBFile.SoftConstraint) -> [PBFile.Constraint]- f (_, (Nothing, c)) = return c- f (i, (Just _, c)) = relax i c-- relax :: PBFile.Var -> PBFile.Constraint -> [PBFile.Constraint]- relax i (lhs, PBFile.Ge, rhs) = [((d, [i]) : lhs, PBFile.Ge, rhs)]- where- d = rhs - SAT.pbLowerBound [(c,1) | (c,_) <- lhs]- relax i (lhs, PBFile.Eq, rhs) =- relax i (lhs, PBFile.Ge, rhs) ++- relax i ([(-c,ls) | (c,ls) <- lhs], PBFile.Ge, - rhs)-- topConstr :: [PBFile.Constraint]- topConstr = - case top of- Nothing -> []- Just t -> [([(-c,ls) | (c,ls) <- obj], PBFile.Ge, - (t - 1))]-- mtrans :: SAT.Model -> SAT.Model- mtrans m = - array (1, nv) [(x, m ! x) | x <- [1..nv]]
− src/Data/AlgebraicNumber/Real.hs
@@ -1,436 +0,0 @@-{-# LANGUAGE Rank2Types #-}--------------------------------------------------------------------------------- |--- Module : Data.AlgebraicNumber.Real--- Copyright : (c) Masahiro Sakai 2012-2013--- License : BSD-style--- --- Maintainer : masahiro.sakai@gmail.com--- Stability : provisional--- Portability : non-portable (Rank2Types)------ Algebraic reals------ Reference:------ * Why the concept of a field extension is a natural one--- <http://www.dpmms.cam.ac.uk/~wtg10/galois.html>--- -------------------------------------------------------------------------------module Data.AlgebraicNumber.Real- (- -- * Algebraic real type- AReal-- -- * Construction- , realRoots- , realRootsEx-- -- * Properties- , minimalPolynomial- , isRational- , isAlgebraicInteger- , height- , rootIndex-- -- * Operations- , nthRoot-- -- * Approximation- , approx- , approxInterval-- -- * Misc- , simpARealPoly- , goldenRatio- ) where--import Control.Exception (assert)-import Control.Monad-import Data.List-import Data.Ratio-import qualified Data.Set as Set-import qualified Text.PrettyPrint.HughesPJClass as PP-import Text.PrettyPrint.HughesPJClass (Doc, PrettyLevel, Pretty (..), prettyParen)--import Data.Polynomial (Polynomial, UPolynomial, X (..))-import qualified Data.Polynomial as P-import qualified Data.Polynomial.RootSeparation.Sturm as Sturm-import Data.Interval (Interval, EndPoint (..), (<=..<), (<..<=), (<..<), (<!), (>!))-import qualified Data.Interval as Interval-import Data.AlgebraicNumber.Root--{--------------------------------------------------------------------- Construction---------------------------------------------------------------------}---- | Algebraic real numbers.-data AReal = RealRoot (UPolynomial Rational) (Interval Rational)- deriving Show---- | Real roots of the polynomial in ascending order.-realRoots :: UPolynomial Rational -> [AReal]-realRoots p = Set.toAscList $ Set.fromList $ do- (q,_) <- P.factor p- realRoots' q---- | Real roots of the polynomial in ascending order.-realRootsEx :: UPolynomial AReal -> [AReal]-realRootsEx p- | and [isRational c | (c,_) <- P.terms p] = realRoots $ P.mapCoeff toRational p- | otherwise = [a | a <- realRoots (simpARealPoly p), a `P.isRootOf` p]---- p must already be factored.-realRoots' :: UPolynomial Rational -> [AReal]-realRoots' p = do- guard $ P.deg p > 0- i <- Sturm.separate p- return $ realRoot' p i--realRoot :: UPolynomial Rational -> Interval Rational -> AReal-realRoot p i = - case [q | (q,_) <- P.factor p, P.deg q > 0, Sturm.numRoots q i == 1] of- p2:_ -> realRoot' p2 i- [] -> error "Data.AlgebraicNumber.Real.realRoot: invalid interval"---- p must already be factored.-realRoot' :: UPolynomial Rational -> Interval Rational -> AReal-realRoot' p i = RealRoot (normalizePoly p) i--{--------------------------------------------------------------------- Operations---------------------------------------------------------------------}--isZero :: AReal -> Bool-isZero a = 0 `Interval.member` (interval a) && 0 `P.isRootOf` minimalPolynomial a--scaleAReal :: Rational -> AReal -> AReal-scaleAReal r a = realRoot' p2 i2- where- p2 = rootScale r (minimalPolynomial a)- i2 = Interval.singleton r * interval a--shiftAReal :: Rational -> AReal -> AReal-shiftAReal r a = realRoot' p2 i2- where- p2 = rootShift r (minimalPolynomial a)- i2 = Interval.singleton r + interval a--instance Eq AReal where- a == b = p1==p2 && Sturm.numRoots' c (Interval.intersection i1 i2) == 1- where- p1 = minimalPolynomial a- p2 = minimalPolynomial b- i1 = interval a- i2 = interval b- c = sturmChain a--instance Ord AReal where- compare a b- | i1 >! i2 = GT- | i1 <! i2 = LT- | a == b = EQ- | otherwise = go i1 i2- where- i1 = interval a- i2 = interval b- c1 = sturmChain a- c2 = sturmChain b- go i1 i2- | i1 >! i2 = GT- | i1 <! i2 = LT- | otherwise =- if Interval.width i1 > Interval.width i2- then go (Sturm.halve' c1 i1) i2- else go i1 (Sturm.halve' c2 i2)--instance Num AReal where- a + b- | isRational a = shiftAReal (toRational a) b- | isRational b = shiftAReal (toRational b) a- | otherwise = realRoot p3 i3- where- p3 = rootAdd (minimalPolynomial a) (minimalPolynomial b)- c1 = sturmChain a- c2 = sturmChain b- c3 = Sturm.sturmChain p3- i3 = go (interval a) (interval b) (Sturm.separate' c3)-- go i1 i2 is3 =- case [i5 | i3 <- is3, let i5 = Interval.intersection i3 i4, Sturm.numRoots' c3 i5 > 0] of- [] -> error "AReal.+: should not happen"- [i5] -> i5- is5 -> go (Sturm.halve' c1 i1) (Sturm.halve' c2 i2) [Sturm.halve' c3 i5 | i5 <- is5]- where- i4 = i1 + i2-- a * b- | isRational a = scaleAReal (toRational a) b- | isRational b = scaleAReal (toRational b) a- | otherwise = realRoot p3 i3- where- p3 = rootMul (minimalPolynomial a) (minimalPolynomial b)- c1 = sturmChain a- c2 = sturmChain b- c3 = Sturm.sturmChain p3- i3 = go (interval a) (interval b) (Sturm.separate' c3)-- go i1 i2 is3 =- case [i5 | i3 <- is3, let i5 = Interval.intersection i3 i4, Sturm.numRoots' c3 i5 > 0] of- [] -> error "AReal.*: should not happen"- [i5] -> i5- is5 -> go (Sturm.halve' c1 i1) (Sturm.halve' c2 i2) [Sturm.halve' c3 i5 | i5 <- is5]- where- i4 = i1 * i2-- negate a = scaleAReal (-1) a-- abs a =- case compare 0 a of- EQ -> fromInteger 0- LT -> a- GT -> negate a-- signum a = fromInteger $- case compare 0 a of- EQ -> 0- LT -> 1- GT -> -1-- fromInteger = fromRational . toRational--instance Fractional AReal where- fromRational r = realRoot' (x - P.constant r) (Interval.singleton r)- where- x = P.var X-- recip a- | isZero a = error "AReal.recip: zero division"- | otherwise = realRoot' p2 i2- where- p2 = rootRecip (minimalPolynomial a)- c1 = sturmChain a- c2 = Sturm.sturmChain p2- i2 = go (interval a) (Sturm.separate' c2)- go i1 is2 =- case [i2 | i2 <- is2, Interval.member 1 (i1 * i2)] of- [] -> error "AReal.recip: should not happen"- [i2] -> i2- is2' -> go (Sturm.halve' c1 i1) [Sturm.halve' c2 i2 | i2 <- is2']--instance Real AReal where- toRational x- | isRational x =- let p = minimalPolynomial x- a = P.coeff (P.var X) p- b = P.coeff P.mone p- in - b / a- | otherwise = error "toRational: proper algebraic number"--instance RealFrac AReal where- properFraction = properFraction'- truncate = truncate'- round = round'- ceiling = ceiling'- floor = floor'---- | Returns approximate rational value such that @abs (a - approx a epsilon) <= epsilon@.-approx- :: AReal -- ^ a- -> Rational -- ^ epsilon- -> Rational-approx a epsilon =- if isRational a- then toRational a- else Sturm.approx' (sturmChain a) (interval a) epsilon---- | Returns approximate interval such that @width (approxInterval a epsilon) <= epsilon@.-approxInterval- :: AReal -- ^ a- -> Rational -- ^ epsilon- -> Interval Rational-approxInterval a epsilon =- if isRational a- then Interval.singleton (toRational a)- else Sturm.narrow' (sturmChain a) (interval a) epsilon---- | Same as 'properFraction'.-properFraction' :: Integral b => AReal -> (b, AReal)-properFraction' x =- case compare x 0 of- EQ -> (0, 0)- GT -> (fromInteger floor_x, x - fromInteger floor_x)- LT -> (fromInteger ceiling_x, x - fromInteger ceiling_x)- where- floor_x = floor' x- ceiling_x = ceiling' x---- | Same as 'truncate'.-truncate' :: Integral b => AReal -> b-truncate' = fst . properFraction'---- | Same as 'round'.-round' :: Integral b => AReal -> b-round' x = - case signum (abs r - 0.5) of- -1 -> n- 0 -> if even n then n else m- 1 -> m- _ -> error "round default defn: Bad value"- where- (n,r) = properFraction' x- m = if r < 0 then n - 1 else n + 1---- | Same as 'ceiling'.-ceiling' :: Integral b => AReal -> b-ceiling' a =- if Sturm.numRoots' chain (Interval.intersection i2 i3) >= 1- then fromInteger ceiling_lb- else fromInteger ceiling_ub- where- chain = sturmChain a- i2 = Sturm.narrow' chain (interval a) (1/2)- (Finite lb, inLB) = Interval.lowerBound' i2- (Finite ub, inUB) = Interval.upperBound' i2- ceiling_lb = ceiling lb- ceiling_ub = ceiling ub- i3 = NegInf <..<= Finite (fromInteger ceiling_lb)---- | Same as 'floor'.-floor' :: Integral b => AReal -> b-floor' a =- if Sturm.numRoots' chain (Interval.intersection i2 i3) >= 1- then fromInteger floor_ub- else fromInteger floor_lb- where- chain = sturmChain a- i2 = Sturm.narrow' chain (interval a) (1/2)- (Finite lb, inLB) = Interval.lowerBound' i2- (Finite ub, inUB) = Interval.upperBound' i2- floor_lb = floor lb- floor_ub = floor ub- i3 = Finite (fromInteger floor_ub) <=..< PosInf---- | The @n@th root of @a@-nthRoot :: Integer -> AReal -> AReal-nthRoot n a- | n <= 0 = error "Data.AlgebraicNumver.Root.nthRoot"- | even n =- if a < 0- then error "Data.AlgebraicNumver.Root.nthRoot: no real roots"- else assert (length bs == 2) (maximum bs) -- select positive root- | otherwise =- assert (length bs == 1) (head bs) -- select unique root- where- bs = nthRoots n a--nthRoots :: Integer -> AReal -> [AReal]-nthRoots n _ | n <= 0 = []-nthRoots n a | even n && a < 0 = []-nthRoots n a = filter check (realRoots p2)- where- p1 = minimalPolynomial a- p2 = rootNthRoot n p1- c1 = sturmChain a- ok0 = interval a- ng0 = map interval $ delete a $ realRoots p1-- check :: AReal -> Bool- check b = loop ok0 ng0 (interval b)- where- c2 = sturmChain b- loop ok ng i- | Sturm.numRoots' c1 ok' == 0 = False- | null ng' = True- | otherwise =- loop (Sturm.halve' c1 ok')- (map (\i3 -> Sturm.halve' c1 i3) ng')- (Sturm.halve' c2 i)- where- i2 = i ^ n- ok' = Interval.intersection i2 ok- ng' = filter (\i3 -> Sturm.numRoots' c1 i3 /= 0) $- map (Interval.intersection i2) ng--{--------------------------------------------------------------------- Properties---------------------------------------------------------------------}---- | The polynomial of which the algebraic number is root.-minimalPolynomial :: AReal -> UPolynomial Rational-minimalPolynomial (RealRoot p _) = p--sturmChain :: AReal -> Sturm.SturmChain-sturmChain a = Sturm.sturmChain (minimalPolynomial a)--interval :: AReal -> Interval Rational-interval (RealRoot _ i) = i---- | Degree of the algebraic number.--- --- If the algebraic number's 'minimalPolynomial' has degree @n@,--- then the algebraic number is said to be degree @n@.-instance P.Degree AReal where- deg a = P.deg $ minimalPolynomial a---- | Whether the algebraic number is a rational.-isRational :: AReal -> Bool-isRational x = P.deg x == 1---- | Whether the algebraic number is a root of a polynomial with integer--- coefficients with leading coefficient @1@ (a monic polynomial).-isAlgebraicInteger :: AReal -> Bool-isAlgebraicInteger x = abs (P.lc P.grlex (P.pp (minimalPolynomial x))) == 1---- | Height of the algebraic number.------ The height of an algebraic number is the greatest absolute value of the--- coefficients of the irreducible and primitive polynomial with integral--- rational coefficients.-height :: AReal -> Integer-height x = maximum [abs (numerator c) | (c,_) <- P.terms $ P.pp $ minimalPolynomial x]---- | root index, satisfying------ @--- 'realRoots' ('minimalPolynomial' a) !! rootIndex a == a--- @-rootIndex :: AReal -> Int-rootIndex a = idx- where- as = realRoots' (minimalPolynomial a)- Just idx = elemIndex a as--{--------------------------------------------------------------------- Pretty printing---------------------------------------------------------------------}--instance Pretty AReal where- pPrintPrec lv prec r =- prettyParen (prec > appPrec) $- PP.hsep [PP.text "RealRoot", pPrintPrec lv (appPrec+1) p, PP.int (rootIndex r)]- where- p = minimalPolynomial r- appPrec = 10--instance P.PrettyCoeff AReal where- pPrintCoeff = pPrintPrec- isNegativeCoeff = (0>)--{--------------------------------------------------------------------- Manipulation of polynomials---------------------------------------------------------------------}---- 代数的数を係数とする多項式の根を、有理数係数多項式の根として表す-simpARealPoly :: UPolynomial AReal -> UPolynomial Rational-simpARealPoly p = rootSimpPoly minimalPolynomial p--{--------------------------------------------------------------------- Misc---------------------------------------------------------------------}---- | Golden ratio -goldenRatio :: AReal-goldenRatio = (1 + root5) / 2- where- [_, root5] = sort $ realRoots' ((P.var X)^2 - 5)
− src/Data/AlgebraicNumber/Root.hs
@@ -1,120 +0,0 @@-{-# LANGUAGE Rank2Types #-}--------------------------------------------------------------------------------- |--- Module : Data.AlgebraicNumber.Root--- Copyright : (c) Masahiro Sakai 2012--- License : BSD-style--- --- Maintainer : masahiro.sakai@gmail.com--- Stability : provisional--- Portability : non-portable (Rank2Types)------ Manipulating polynomials for corresponding operations for algebraic numbers.--- --- Reference:------ * <http://www.dpmms.cam.ac.uk/~wtg10/galois.html>--- -------------------------------------------------------------------------------module Data.AlgebraicNumber.Root where--import Data.List-import Data.Maybe-import Data.Map (Map)-import qualified Data.Map as Map-import qualified Data.Set as Set--import Data.Polynomial (Polynomial, UPolynomial, X (..))-import qualified Data.Polynomial as P-import qualified Data.Polynomial.GroebnerBasis as GB--type Var = Int--{--------------------------------------------------------------------- Manipulation of polynomials---------------------------------------------------------------------}--normalizePoly :: UPolynomial Rational -> UPolynomial Rational-normalizePoly = P.toMonic P.grlex--rootAdd :: UPolynomial Rational -> UPolynomial Rational -> UPolynomial Rational-rootAdd p1 p2 = lift2 (+) p1 p2--rootMul :: UPolynomial Rational -> UPolynomial Rational -> UPolynomial Rational-rootMul p1 p2 = lift2 (*) p1 p2--rootShift :: Rational -> UPolynomial Rational -> UPolynomial Rational-rootShift 0 p = p-rootShift r p = normalizePoly $ P.subst p (\X -> P.var X - P.constant r)--rootScale :: Rational -> UPolynomial Rational -> UPolynomial Rational-rootScale 0 p = P.var X-rootScale r p = normalizePoly $ P.subst p (\X -> P.constant (recip r) * P.var X)--rootRecip :: UPolynomial Rational -> UPolynomial Rational-rootRecip p = normalizePoly $ P.fromTerms [(c, P.var X `P.mpow` (d - P.deg xs)) | (c, xs) <- P.terms p]- where- d = P.deg p---- 代数的数を係数とする多項式の根を、有理数係数多項式の根として表す-rootSimpPoly :: (a -> UPolynomial Rational) -> UPolynomial a -> UPolynomial Rational-rootSimpPoly f p = findPoly (P.var 0) ps- where- ys :: [(UPolynomial Rational, Var)]- ys = zip (Set.toAscList $ Set.fromList [f c | (c, _) <- P.terms p]) [1..]-- m :: Map (UPolynomial Rational) Var- m = Map.fromDistinctAscList ys-- p' :: Polynomial Rational Var- p' = P.eval (\X -> P.var 0) (P.mapCoeff (\c -> P.var (m Map.! (f c))) p)-- ps :: [Polynomial Rational Var]- ps = p' : [P.subst q (\X -> P.var x) | (q, x) <- ys]--rootNthRoot :: Integer -> UPolynomial Rational -> UPolynomial Rational-rootNthRoot n p = P.subst p (\X -> (P.var X)^n)--lift2 :: (forall a. Num a => a -> a -> a)- -> UPolynomial Rational -> UPolynomial Rational -> UPolynomial Rational-lift2 f p1 p2 = findPoly f_a_b gbase- where- a, b :: Var- a = 0- b = 1-- f_a_b :: Polynomial Rational Var- f_a_b = f (P.var a) (P.var b)-- gbase :: [Polynomial Rational Var]- gbase = [ P.subst p1 (\X -> P.var a), P.subst p2 (\X -> P.var b) ] ---- ps のもとで c を根とする多項式を求める-findPoly :: Polynomial Rational Var -> [Polynomial Rational Var] -> UPolynomial Rational-findPoly c ps = normalizePoly $ sum [P.constant coeff * (P.var X) ^ n | (n,coeff) <- zip [0..] coeffs]- where - vn :: Var- vn = if Set.null vs then 0 else Set.findMax vs + 1- where- vs = Set.fromList [x | p <- (c:ps), (_,xs) <- P.terms p, (x,_) <- P.mindices xs]-- coeffs :: [Rational]- coeffs = head $ catMaybes $ [isLinearlyDependent cs2 | cs2 <- inits cs]- where- cmp = P.grlex- ps' = GB.basis cmp ps- cs = iterate (\p -> P.reduce cmp (c * p) ps') 1-- isLinearlyDependent :: [Polynomial Rational Var] -> Maybe [Rational]- isLinearlyDependent cs = if any (0/=) sol then Just sol else Nothing- where- cs2 = zip [vn..] cs- sol = map (\(l,_) -> P.eval (\_ -> 1) $ P.reduce cmp2 (P.var l) gbase2) cs2- cmp2 = P.grlex- gbase2 = GB.basis cmp2 es- es = Map.elems $ Map.fromListWith (+) $ do- (n,xs) <- P.terms $ sum [P.var ln * cn | (ln,cn) <- cs2]- let xs' = P.mindicesMap xs- ys = P.mfromIndicesMap $ Map.filterWithKey (\x _ -> x < vn) xs'- zs = P.mfromIndicesMap $ Map.filterWithKey (\x _ -> x >= vn) xs'- return (ys, P.fromTerm (n,zs))
− src/Data/ArithRel.hs
@@ -1,133 +0,0 @@-{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses, FunctionalDependencies #-}--------------------------------------------------------------------------------- |--- Module : Data.ArithRel--- Copyright : (c) Masahiro Sakai 2011--- License : BSD-style--- --- Maintainer : masahiro.sakai@gmail.com--- Stability : provisional--- Portability : non-portable (FlexibleInstances, MultiParamTypeClasses, FunctionalDependencies)------ Arithmetic relations--- -------------------------------------------------------------------------------module Data.ArithRel- (- -- * Relational operators- RelOp (..)- , flipOp- , negOp- , showOp- , evalOp-- -- * Relation- , Rel (..)-- -- * DSL- , IsRel (..)- , (.<.), (.<=.), (.>=.), (.>.), (.==.), (./=.)- ) where--import Algebra.Lattice.Boolean (Complement (..))-import qualified Data.IntSet as IS-import Data.Var--infix 4 .<., .<=., .>=., .>., .==., ./=.---- ------------------------------------------------------------------------------- | relational operators-data RelOp = Lt | Le | Ge | Gt | Eql | NEq- deriving (Show, Eq, Ord)----- | flipping relational operator------ @rel (flipOp op) a b@ is equivalent to @rel op b a@-flipOp :: RelOp -> RelOp -flipOp Le = Ge-flipOp Ge = Le-flipOp Lt = Gt-flipOp Gt = Lt-flipOp Eql = Eql-flipOp NEq = NEq---- | negating relational operator------ @rel (negOp op) a b@ is equivalent to @notB (rel op a b)@-negOp :: RelOp -> RelOp-negOp Lt = Ge-negOp Le = Gt-negOp Ge = Lt-negOp Gt = Le-negOp Eql = NEq-negOp NEq = Eql---- | operator symbol-showOp :: RelOp -> String-showOp Lt = "<"-showOp Le = "<="-showOp Ge = ">="-showOp Gt = ">"-showOp Eql = "="-showOp NEq = "/="---- | evaluate an operator into a comparision function-evalOp :: Ord a => RelOp -> a -> a -> Bool-evalOp Lt = (<)-evalOp Le = (<=)-evalOp Ge = (>=)-evalOp Gt = (>)-evalOp Eql = (==)-evalOp NEq = (/=)---- ------------------------------------------------------------------------------- | type class for constructing relational formula-class IsRel e r | r -> e where- rel :: RelOp -> e -> e -> r---- | constructing relational formula-(.<.) :: IsRel e r => e -> e -> r-a .<. b = rel Lt a b---- | constructing relational formula-(.<=.) :: IsRel e r => e -> e -> r-a .<=. b = rel Le a b---- | constructing relational formula-(.>.) :: IsRel e r => e -> e -> r-a .>. b = rel Gt a b---- | constructing relational formula-(.>=.) :: IsRel e r => e -> e -> r-a .>=. b = rel Ge a b---- | constructing relational formula-(.==.) :: IsRel e r => e -> e -> r-a .==. b = rel Eql a b---- | constructing relational formula-(./=.) :: IsRel e r => e -> e -> r-a ./=. b = rel NEq a b---- ------------------------------------------------------------------------------- | Atomic formula-data Rel e = Rel e RelOp e- deriving (Show, Eq, Ord)--instance Complement (Rel c) where- notB (Rel lhs op rhs) = Rel lhs (negOp op) rhs--instance IsRel e (Rel e) where- rel op a b = Rel a op b--instance Variables e => Variables (Rel e) where- vars (Rel a _ b) = vars a `IS.union` vars b--instance Functor Rel where- fmap f (Rel a op b) = Rel (f a) op (f b)---- ---------------------------------------------------------------------------
− src/Data/DNF.hs
@@ -1,46 +0,0 @@--------------------------------------------------------------------------------- |--- Module : Data.DNF--- Copyright : (c) Masahiro Sakai 2011-2013--- License : BSD-style--- --- Maintainer : masahiro.sakai@gmail.com--- Stability : provisional--- Portability : portable------ Disjunctive Normal Form--- -------------------------------------------------------------------------------module Data.DNF- ( DNF (..)- ) where--import Algebra.Lattice-import Algebra.Lattice.Boolean---- | Disjunctive normal form-newtype DNF lit- = DNF- { unDNF :: [[lit]] -- ^ list of conjunction of literals- } deriving (Show)--instance Complement lit => Complement (DNF lit) where- notB (DNF xs) = DNF . sequence . map (map notB) $ xs--instance JoinSemiLattice (DNF lit) where- DNF xs `join` DNF ys = DNF (xs++ys)--instance MeetSemiLattice (DNF lit) where- DNF xs `meet` DNF ys = DNF [x++y | x<-xs, y<-ys]--instance Lattice (DNF lit)--instance BoundedJoinSemiLattice (DNF lit) where- bottom = DNF []--instance BoundedMeetSemiLattice (DNF lit) where- top = DNF [[]]--instance BoundedLattice (DNF lit)--instance Complement lit => Boolean (DNF lit)
− src/Data/Delta.hs
@@ -1,93 +0,0 @@-{-# LANGUAGE TypeFamilies #-}--------------------------------------------------------------------------------- |--- Module : Data.Delta--- Copyright : (c) Masahiro Sakai 2011-2013--- License : BSD-style--- --- Maintainer : masahiro.sakai@gmail.com--- Stability : provisional--- Portability : non-portable (TypeFamilies)------ Augmenting number types with infinitesimal parameter δ.------ Reference:--- --- * Bruno Dutertre and Leonardo de Moura,--- \"/A Fast Linear-Arithmetic Solver for DPLL(T)/\",--- Computer Aided Verification In Computer Aided Verification, Vol. 4144--- (2006), pp. 81-94.--- <http://dx.doi.org/10.1007/11817963_11>--- <http://yices.csl.sri.com/cav06.pdf>-----------------------------------------------------------------------------------module Data.Delta- (- -- * The Delta type- Delta (..)-- -- * Construction- , fromReal- , delta-- -- * Query- , realPart- , deltaPart-- -- * Relationship with integers- , floor'- , ceiling'- , isInteger'- ) where--import Data.VectorSpace-import Util (isInteger)---- | @Delta r k@ represents r + kδ for symbolic infinitesimal parameter δ.-data Delta r = Delta !r !r deriving (Ord, Eq, Show)---- | symbolic infinitesimal parameter δ.-delta :: Num r => Delta r-delta = Delta 0 1---- | Conversion from a base @r@ value to @Delta r@.-fromReal :: Num r => r -> Delta r-fromReal x = Delta x 0---- | Extracts the real part..-realPart :: Delta r -> r-realPart (Delta r _) = r---- | Extracts the δ part..-deltaPart :: Delta r -> r-deltaPart (Delta _ k) = k--instance Num r => AdditiveGroup (Delta r) where- Delta r1 k1 ^+^ Delta r2 k2 = Delta (r1+r2) (k1+k2)- zeroV = Delta 0 0- negateV (Delta r k) = Delta (- r) (- k)--instance Num r => VectorSpace (Delta r) where- type Scalar (Delta r) = r- c *^ Delta r k = Delta (c*r) (c*k)---- | 'Delta' version of 'floor'.--- @'floor'' x@ returns the greatest integer not greater than @x@-floor' :: (RealFrac r, Integral a) => Delta r -> a-floor' (Delta r k) = fromInteger $ if r2==r && k < 0 then i-1 else i- where- i = floor r- r2 = fromInteger i---- | 'Delta' version of 'ceiling'.--- @'ceiling'' x@ returns the least integer not less than @x@-ceiling' :: (RealFrac r, Integral a) => Delta r -> a-ceiling' (Delta r k) = fromInteger $ if r2==r && k > 0 then i+1 else i- where- i = ceiling r- r2 = fromInteger i---- | Is this a integer?-isInteger' :: RealFrac r => Delta r -> Bool-isInteger' (Delta r k) = isInteger r && k == 0
− src/Data/FOL/Arith.hs
@@ -1,113 +0,0 @@-{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses #-}--------------------------------------------------------------------------------- |--- Module : Data.FOL.Arith--- Copyright : (c) Masahiro Sakai 2011-2013--- License : BSD-style--- --- Maintainer : masahiro.sakai@gmail.com--- Stability : provisional--- Portability : non-portable (FlexibleInstances, MultiParamTypeClasses)------ Arithmetic language (not limited to linear ones).--- -------------------------------------------------------------------------------module Data.FOL.Arith- (- -- * Arithmetic expressions- Expr (..)- , var- , evalExpr-- -- * Atomic formula- , module Data.ArithRel- , Atom (..)- , evalAtom-- -- * Arithmetic formula- , module Data.FOL.Formula -- -- * Misc- , SatResult (..)- ) where--import qualified Data.IntMap as IM-import qualified Data.IntSet as IS-import Data.Ratio--import Data.ArithRel-import Data.FOL.Formula-import Data.Var---- ------------------------------------------------------------------------------- | Arithmetic expressions-data Expr r- = Const r- | Var Var- | Expr r :+: Expr r- | Expr r :*: Expr r- | Expr r :/: Expr r- deriving (Eq, Ord, Show)--instance Num r => Num (Expr r) where- a + b = a :+: b- a * b = a :*: b- a - b = a + negate b- negate a = Const (-1) :*: a- abs a = a- signum _ = 1- fromInteger = Const . fromInteger--instance Fractional r => Fractional (Expr r) where- a / b = a :/: b- fromRational x = fromInteger (numerator x) / fromInteger (denominator x)--instance Functor Expr where- fmap f = g- where- g (Const c) = Const (f c)- g (Var v) = Var v- g (a :+: b) = g a :+: g b- g (a :*: b) = g a :*: g b- g (a :/: b) = g a :/: g b--instance Variables (Expr r) where- vars (Const _) = IS.empty- vars (Var v) = IS.singleton v- vars (a :+: b) = vars a `IS.union` vars b- vars (a :*: b) = vars a `IS.union` vars b- vars (a :/: b) = vars a `IS.union` vars b---- | single variable expression-var :: Var -> Expr r-var = Var---- | evaluate an 'Expr' with respect to a 'Model'-evalExpr :: Fractional r => Model r -> Expr r -> r-evalExpr m = f- where- f (Const x) = x- f (Var v) = m IM.! v- f (a :+: b) = f a + f b- f (a :*: b) = f a * f b- f (a :/: b) = f a / f b---- ------------------------------------------------------------------------------- | Atomic formula-type Atom c = Rel (Expr c)--evalAtom :: (Real r, Fractional r) => Model r -> Atom r -> Bool-evalAtom m (Rel a op b) = evalOp op (evalExpr m a) (evalExpr m b)--instance IsRel (Expr c) (Formula (Atom c)) where- rel op a b = Atom $ rel op a b---- ------------------------------------------------------------------------------- | results of satisfiability checking-data SatResult r = Unknown | Unsat | Sat (Model r)- deriving (Show, Eq, Ord)---- ---------------------------------------------------------------------------
− src/Data/FOL/Formula.hs
@@ -1,92 +0,0 @@--------------------------------------------------------------------------------- |--- Module : Data.FOL.Formula--- Copyright : (c) Masahiro Sakai 2011-2013--- License : BSD-style--- --- Maintainer : masahiro.sakai@gmail.com--- Stability : provisional--- Portability : portable------ Formula of first order logic.--- -------------------------------------------------------------------------------module Data.FOL.Formula- (- -- * Overloaded operations for formula.- module Algebra.Lattice.Boolean-- -- * Concrete formula- , Formula (..)- , pushNot- ) where--import Algebra.Lattice-import Algebra.Lattice.Boolean--import qualified Data.IntSet as IS-import Data.Var---- ------------------------------------------------------------------------------- | formulas of first order logic-data Formula a- = T- | F- | Atom a- | And (Formula a) (Formula a)- | Or (Formula a) (Formula a)- | Not (Formula a)- | Imply (Formula a) (Formula a)- | Equiv (Formula a) (Formula a)- | Forall Var (Formula a)- | Exists Var (Formula a)- deriving (Show, Eq, Ord)--instance Variables a => Variables (Formula a) where- vars T = IS.empty- vars F = IS.empty- vars (Atom a) = vars a- vars (And a b) = vars a `IS.union` vars b- vars (Or a b) = vars a `IS.union` vars b- vars (Not a) = vars a- vars (Imply a b) = vars a `IS.union` vars b- vars (Equiv a b) = vars a `IS.union` vars b- vars (Forall v a) = IS.delete v (vars a)- vars (Exists v a) = IS.delete v (vars a)--instance Complement (Formula a) where- notB = Not--instance JoinSemiLattice (Formula c) where- join = Or--instance MeetSemiLattice (Formula c) where- meet = And--instance Lattice (Formula c)--instance BoundedJoinSemiLattice (Formula c) where- bottom = F--instance BoundedMeetSemiLattice (Formula c) where- top = T--instance BoundedLattice (Formula c)--instance Boolean (Formula c) where- (.=>.) = Imply- (.<=>.) = Equiv---- | convert a formula into negation normal form-pushNot :: Complement a => Formula a -> Formula a-pushNot T = F-pushNot F = T-pushNot (Atom a) = Atom $ notB a-pushNot (And a b) = Or (pushNot a) (pushNot b)-pushNot (Or a b) = And (pushNot a) (pushNot b)-pushNot (Not a) = a-pushNot (Imply a b) = And a (pushNot b)-pushNot (Equiv a b) = Or (And a (pushNot b)) (And b (pushNot a))-pushNot (Forall v a) = Exists v (pushNot a)-pushNot (Exists v a) = Forall v (pushNot a)
− src/Data/IndexedPriorityQueue.hs
@@ -1,297 +0,0 @@-{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances, BangPatterns, TypeSynonymInstances #-}-{-# OPTIONS_GHC -Wall #-}--------------------------------------------------------------------------------- |--- Module : Data.IndexedPriorityQueue--- Copyright : (c) Masahiro Sakai 2012--- License : BSD-style--- --- Maintainer : masahiro.sakai@gmail.com--- Stability : provisional--- Portability : non-portable (MultiParamTypeClasses, FlexibleInstances, BangPatterns, TypeSynonymInstances)------ Priority queue implemented as array-based binary heap.----------------------------------------------------------------------------------module Data.IndexedPriorityQueue- (- -- * PriorityQueue type- PriorityQueue- , Value- , Index-- -- * Constructors- , newPriorityQueue- , newPriorityQueueBy- , NewFifo (..)-- -- * Operators- , getElems- , clear- , clone- , Enqueue (..)- , Dequeue (..)- , QueueSize (..)- , member- , update- , getHeapArray- ) where--import Control.Monad-import Data.Ix-import qualified Data.Array.Base as A-import qualified Data.Array.IO as A-import Data.IORef-import Data.Queue.Classes--type Index = Int-type Value = Int---- | Priority queue implemented as array-based binary heap.-data PriorityQueue- = PriorityQueue- { lt :: !(Value -> Value -> IO Bool)- , heap :: !(IORef (Int, A.IOUArray Index Value))- , table :: !(IORef (A.IOUArray Value Index))- }---- | Build a priority queue with default ordering ('(<)' of 'Ord' class)-newPriorityQueue :: IO PriorityQueue-newPriorityQueue = newPriorityQueueBy (\a b -> return (a < b))---- | Build a priority queue with a given /less than/ operator.-newPriorityQueueBy :: (Value -> Value -> IO Bool) -> IO (PriorityQueue)-newPriorityQueueBy cmp = do- h <- A.newArray_ (0,-1)- ref <- newIORef (0,h)- idx <- A.newArray_ (0,-1)- ref2 <- newIORef idx- return $ PriorityQueue{ lt = cmp, heap = ref, table =ref2 }---- | Return a list of all the elements of a priority queue. (not sorted)-getElems :: PriorityQueue -> IO [Value]-getElems q = do- (n,arr) <- readIORef (heap q)- forM [0..n-1] $ \i -> A.readArray arr i---- | Remove all elements from a priority queue.-clear :: PriorityQueue -> IO ()-clear q = do- (_,arr) <- readIORef (heap q)- writeIORef (heap q) (0,arr)-- idx <- readIORef (table q)- (!lb,!ub) <- A.getBounds idx- let go i- | i > ub = return ()- | otherwise = A.unsafeWrite idx i (-1) >> go (i+1)- go lb---- | Create a copy of a priority queue.-clone :: PriorityQueue -> IO PriorityQueue-clone q = do- (n,arr) <- readIORef (heap q)- arr' <- cloneArray arr- ref <- newIORef (n,arr')-- idx <- readIORef (table q)- idx' <- cloneArray idx- ref2 <- newIORef idx'-- return $ PriorityQueue{ lt = lt q, heap = ref, table = ref2 }--instance Enqueue (PriorityQueue) IO Value where- enqueue q val = do- m <- member q val- unless m $ do- (n,arr) <- readIORef (heap q) - c <- liftM rangeSize $ A.getBounds arr- if (n+1 < c)- then do- A.unsafeWrite arr n val- writeIORef (heap q) (n+1,arr)- else do- let c' = max 2 (c * 3 `div` 2)- arr' <- A.newArray_ (0, c'-1)- copyTo arr arr' (0, n-1)- A.unsafeWrite arr' n val- writeIORef (heap q) (n+1,arr')-- idx <- readIORef (table q)- c2 <- liftM rangeSize $ A.getBounds idx- if val < c2- then A.unsafeWrite idx val n- else do- let c2' = max 2 (c2 * 3 `div` 2)- idx' <- A.newArray_ (0, c2'-1)- copyTo idx idx' (0, c2-1)- forM_ [c2..c2'-1] $ \i -> A.unsafeWrite idx' i (-1)- A.unsafeWrite idx' val n- writeIORef (table q) idx'- - up q n--instance Dequeue (PriorityQueue) IO Value where- dequeue q = do- (n,arr) <- readIORef (heap q)- idx <- readIORef (table q)- case n of- 0 -> do- return Nothing- _ -> do- val <- A.readArray arr 0- A.unsafeWrite idx val (-1)- writeIORef (heap q) (n-1, arr)- when (n > 1) $ do- val1 <- A.readArray arr (n-1)- A.unsafeWrite arr 0 val1- A.unsafeWrite idx val1 0- down q 0- return (Just val)-- dequeueBatch q = go []- where- go xs = do- r <- dequeue q- case r of- Nothing -> return (reverse xs)- Just x -> go (x:xs)--instance QueueSize (PriorityQueue) IO where- queueSize q = do- (n,_) <- readIORef (heap q)- return n--member :: PriorityQueue -> Value -> IO Bool-member q v = do- idx <- readIORef (table q)- r <- A.getBounds idx- if not (inRange r v) then- return False- else do- i <- A.unsafeRead idx v- return $! i /= -1--update :: PriorityQueue -> Value -> IO ()-update q v = do- idx <- readIORef (table q)- i <- A.readArray idx v- unless (i == -1) $ do- up q i- down q i--up :: PriorityQueue -> Index -> IO ()-up q !i = do- (_,arr) <- readIORef (heap q)- idx <- readIORef (table q)- val <- A.readArray arr i- let loop 0 = return 0- loop j = do- let p = parent j- val_p <- A.readArray arr p- b <- lt q val val_p- if b- then do- A.unsafeWrite arr j val_p- A.unsafeWrite idx val_p j- loop p- else return j- j <- loop i- A.unsafeWrite arr j val- A.unsafeWrite idx val j--down :: PriorityQueue -> Index -> IO ()-down q !i = do- (!n,arr) <- readIORef (heap q)- idx <- readIORef (table q)- val <- A.readArray arr i- let loop !j = do- let !l = left j- !r = right j- if l >= n- then return j- else do- child <- do- if r >= n- then return l- else do- val_l <- A.readArray arr l- val_r <- A.readArray arr r- b <- lt q val_r val_l- if b- then return r- else return l- val_child <- A.readArray arr child- b <- lt q val_child val- if not b- then return j- else do- A.unsafeWrite arr j val_child- A.unsafeWrite idx val_child j- loop child- j <- loop i- A.unsafeWrite arr j val- A.unsafeWrite idx val j---- | Get the internal representation of a given priority queue.-getHeapArray :: PriorityQueue -> IO (A.IOUArray Index Value)-getHeapArray q = liftM snd $ readIORef (heap q)--{--------------------------------------------------------------------- Index "traversal" functions---------------------------------------------------------------------}--{-# INLINE left #-}-left :: Index -> Index-left i = i*2 + 1--{-# INLINE right #-}-right :: Index -> Index-right i = (i+1)*2;--{-# INLINE parent #-}-parent :: Index -> Index-parent i = (i-1) `div` 2--{--------------------------------------------------------------------- utility---------------------------------------------------------------------}--cloneArray :: (A.MArray a e m) => a Index e -> m (a Index e)-cloneArray arr = do- b <- A.getBounds arr- arr' <- A.newArray_ b- copyTo arr arr' b- return arr'--copyTo :: (A.MArray a e m) => a Index e -> a Index e -> (Index,Index) -> m ()-copyTo fromArr toArr b = do- forM_ (range b) $ \i -> do- val_i <- A.readArray fromArr i- A.unsafeWrite toArr i val_i--{--------------------------------------------------------------------- test---------------------------------------------------------------------}--{--checkHeapProperty :: String -> PriorityQueue -> IO ()-checkHeapProperty str q = do - (n,arr) <- readIORef (heap q)- let go i = do- val <- A.readArray arr i- forM_ [left i, right i] $ \j ->- when (j < n) $ do- val2 <- A.readArray arr j- b <- lt q val2 val- when b $ do- error (str ++ ": invalid heap " ++ show j)- go j- when (n > 0) $ go 0-- idx <- readIORef (table q)- forM_ [0..n-1] $ \i -> do- v <- A.readArray arr i- i' <- A.readArray idx v- when (i /= i') $ error $ str ++ ": invalid index " ++ show (i,v,i')--}
− src/Data/LA.hs
@@ -1,279 +0,0 @@-{-# LANGUAGE TypeFamilies #-}--------------------------------------------------------------------------------- |--- Module : Data.LA--- Copyright : (c) Masahiro Sakai 2011--- License : BSD-style--- --- Maintainer : masahiro.sakai@gmail.com--- Stability : provisional--- Portability : non-portable (TypeFamilies)------ Some definition for Theory of Linear Arithmetics.--- -------------------------------------------------------------------------------module Data.LA- (- -- * Expression of linear arithmetics- Expr-- -- ** Conversion- , var- , constant- , terms- , fromTerms- , coeffMap- , fromCoeffMap- , unitVar- , asConst-- -- ** Query- , coeff- , lookupCoeff- , extract- , extractMaybe -- -- ** Operations- , mapCoeff- , mapCoeffWithVar- , evalExpr- , evalLinear- , lift1- , applySubst- , applySubst1- , showExpr-- -- * Atomic formula of linear arithmetics- , Atom (..)- , showAtom- , evalAtom- , solveFor-- -- * misc- , BoundsEnv- , computeInterval- ) where--import Control.Monad-import Control.DeepSeq-import Data.List-import Data.Maybe-import Data.IntMap (IntMap)-import qualified Data.IntMap as IntMap-import qualified Data.IntSet as IntSet-import qualified Data.ArithRel as ArithRel-import Data.Interval-import Data.Var-import Data.VectorSpace----------------------------------------------------------------------------------- | Linear combination of variables and constants.--- Non-negative keys are used for variables's coefficients.--- key 'unitVar' is used for constants.-newtype Expr r- = Expr- { -- | a mapping from variables to coefficients- coeffMap :: IntMap r- } deriving (Eq, Ord)---- | Create a @Expr@ from a mapping from variables to coefficients.-fromCoeffMap :: (Num r, Eq r) => IntMap r -> Expr r-fromCoeffMap m = normalizeExpr (Expr m)---- | terms contained in the expression.-terms :: Expr r -> [(r,Var)]-terms (Expr m) = [(c,v) | (v,c) <- IntMap.toList m]---- | Create a @Expr@ from a list of terms.-fromTerms :: (Num r, Eq r) => [(r,Var)] -> Expr r-fromTerms ts = fromCoeffMap $ IntMap.fromListWith (+) [(x,c) | (c,x) <- ts]--instance Variables (Expr r) where- vars (Expr m) = IntSet.delete unitVar (IntMap.keysSet m)--instance Show r => Show (Expr r) where- showsPrec d m = showParen (d > 10) $- showString "fromTerms " . shows (terms m)--instance (Num r, Eq r, Read r) => Read (Expr r) where- readsPrec p = readParen (p > 10) $ \ r -> do- ("fromTerms",s) <- lex r- (xs,t) <- reads s- return (fromTerms xs, t)--instance NFData r => NFData (Expr r) where- rnf (Expr m) = rnf m---- | Special variable that should always be evaluated to 1.-unitVar :: Var-unitVar = -1--asConst :: Num r => Expr r -> Maybe r-asConst (Expr m) =- case IntMap.toList m of- [] -> Just 0- [(v,x)] | v==unitVar -> Just x- _ -> Nothing--normalizeExpr :: (Num r, Eq r) => Expr r -> Expr r-normalizeExpr (Expr t) = Expr $ IntMap.filter (0/=) t---- | variable-var :: Num r => Var -> Expr r-var v = Expr $ IntMap.singleton v 1---- | constant-constant :: (Num r, Eq r) => r -> Expr r-constant c = normalizeExpr $ Expr $ IntMap.singleton unitVar c---- | map coefficients.-mapCoeff :: (Num b, Eq b) => (a -> b) -> Expr a -> Expr b-mapCoeff f (Expr t) = Expr $ IntMap.mapMaybe g t- where- g c = if c' == 0 then Nothing else Just c'- where c' = f c---- | map coefficients.-mapCoeffWithVar :: (Num b, Eq b) => (a -> Var -> b) -> Expr a -> Expr b-mapCoeffWithVar f (Expr t) = Expr $ IntMap.mapMaybeWithKey g t- where- g v c = if c' == 0 then Nothing else Just c'- where c' = f c v--instance (Num r, Eq r) => AdditiveGroup (Expr r) where- Expr t ^+^ e2 | IntMap.null t = e2- e1 ^+^ Expr t | IntMap.null t = e1- e1 ^+^ e2 = normalizeExpr $ plus e1 e2- zeroV = Expr $ IntMap.empty- negateV = ((-1) *^)--instance (Num r, Eq r) => VectorSpace (Expr r) where- type Scalar (Expr r) = r- 1 *^ e = e- 0 *^ e = zeroV- c *^ e = mapCoeff (c*) e--plus :: Num r => Expr r -> Expr r -> Expr r-plus (Expr t1) (Expr t2) = Expr $ IntMap.unionWith (+) t1 t2---- | evaluate the expression under the model.-evalExpr :: Num r => Model r -> Expr r -> r-evalExpr m (Expr t) = sum [(m' IntMap.! v) * c | (v,c) <- IntMap.toList t]- where m' = IntMap.insert unitVar 1 m---- | evaluate the expression under the model.-evalLinear :: VectorSpace a => Model a -> a -> Expr (Scalar a) -> a-evalLinear m u (Expr t) = sumV [c *^ (m' IntMap.! v) | (v,c) <- IntMap.toList t]- where m' = IntMap.insert unitVar u m--lift1 :: VectorSpace x => x -> (Var -> x) -> Expr (Scalar x) -> x-lift1 unit f (Expr t) = sumV [c *^ (g v) | (v,c) <- IntMap.toList t]- where- g v- | v==unitVar = unit- | otherwise = f v--applySubst :: (Num r, Eq r) => VarMap (Expr r) -> Expr r -> Expr r-applySubst s (Expr m) = sumV (map f (IntMap.toList m))- where- f (v,c) = c *^ (- case IntMap.lookup v s of- Just tm -> tm- Nothing -> var v)---- | applySubst1 x e e1 == e1[e/x]-applySubst1 :: (Num r, Eq r) => Var -> Expr r -> Expr r -> Expr r-applySubst1 x e e1 =- case extractMaybe x e1 of- Nothing -> e1- Just (c,e2) -> c *^ e ^+^ e2---- | lookup a coefficient of the variable.--- @--- coeff v e == fst (extract v e)--- @-coeff :: Num r => Var -> Expr r -> r-coeff v (Expr m) = IntMap.findWithDefault 0 v m---- | lookup a coefficient of the variable.--- It returns @Nothing@ if the expression does not contain @v@.--- @--- lookupCoeff v e == fmap fst (extractMaybe v e)--- @-lookupCoeff :: Num r => Var -> Expr r -> Maybe r-lookupCoeff v (Expr m) = IntMap.lookup v m ---- | @extract v e@ returns @(c, e')@ such that @e == c *^ v ^+^ e'@-extract :: Num r => Var -> Expr r -> (r, Expr r)-extract v (Expr m) = (IntMap.findWithDefault 0 v m, Expr (IntMap.delete v m))-{---- Alternative implementation which may be faster but allocte more memory-extract v (Expr m) = - case IntMap.updateLookupWithKey (\_ _ -> Nothing) v m of- (Nothing, _) -> (0, Expr m)- (Just c, m2) -> (c, Expr m2)--}---- | @extractMaybe v e@ returns @Just (c, e')@ such that @e == c *^ v ^+^ e'@--- if @e@ contains v, and returns @Nothing@ otherwise.-extractMaybe :: Num r => Var -> Expr r -> Maybe (r, Expr r)-extractMaybe v (Expr m) =- case IntMap.lookup v m of- Nothing -> Nothing- Just c -> Just (c, Expr (IntMap.delete v m))-{---- Alternative implementation which may be faster but allocte more memory-extractMaybe v (Expr m) =- case IntMap.updateLookupWithKey (\_ _ -> Nothing) v m of- (Nothing, _) -> Nothing- (Just c, m2) -> Just (c, Expr m2)--}--showExpr :: (Num r, Eq r, Show r) => Expr r -> String-showExpr = showExprWith f- where- f x = "x" ++ show x--showExprWith :: (Num r, Show r, Eq r) => (Var -> String) -> Expr r -> String-showExprWith env (Expr m) = foldr (.) id xs ""- where- xs = intersperse (showString " + ") ts- ts = [if c==1- then showString (env x)- else showsPrec 8 c . showString "*" . showString (env x)- | (x,c) <- IntMap.toList m, x /= unitVar] ++- [showsPrec 7 c | c <- maybeToList (IntMap.lookup unitVar m)]----------------------------------------------------------------------------------- | Atomic Formula of Linear Arithmetics-type Atom r = ArithRel.Rel (Expr r)--showAtom :: (Num r, Eq r, Show r) => Atom r -> String-showAtom (ArithRel.Rel lhs op rhs) = showExpr lhs ++ ArithRel.showOp op ++ showExpr rhs---- | evaluate the formula under the model.-evalAtom :: (Num r, Ord r) => Model r -> Atom r -> Bool-evalAtom m (ArithRel.Rel lhs op rhs) = ArithRel.evalOp op (evalExpr m lhs) (evalExpr m rhs)---- | Solve linear (in)equation for the given variable.------ @solveFor a v@ returns @Just (op, e)@ such that @Atom v op e@--- is equivalent to @a@.-solveFor :: (Real r, Fractional r) => Atom r -> Var -> Maybe (ArithRel.RelOp, Expr r)-solveFor (ArithRel.Rel lhs op rhs) v = do- (c,e) <- extractMaybe v (lhs ^-^ rhs)- return ( if c < 0 then ArithRel.flipOp op else op- , (1/c) *^ negateV e- )---------------------------------------------------------------------------------type BoundsEnv r = VarMap (Interval r)---- | compute bounds for a @Expr@ with respect to @BoundsEnv@.-computeInterval :: (Real r, Fractional r) => BoundsEnv r -> Expr r -> Interval r-computeInterval b = evalExpr b . mapCoeff singleton-------------------------------------------------------------------------------
− src/Data/LA/FOL.hs
@@ -1,56 +0,0 @@-{-# OPTIONS_GHC -Wall #-}-module Data.LA.FOL- ( fromFOLAtom- , toFOLFormula- , fromFOLExpr- , toFOLExpr- ) where--import Control.Monad--import Data.ArithRel-import Data.FOL.Arith-import Data.VectorSpace--import qualified Data.LA as LA---- -----------------------------------------------------------------------------fromFOLAtom :: (Real r, Fractional r) => Atom r -> Maybe (LA.Atom r)-fromFOLAtom (Rel a op b) = do- a' <- fromFOLExpr a- b' <- fromFOLExpr b- return $ rel op a' b'--toFOLFormula :: (Real r, Fractional r) => LA.Atom r -> Formula (Atom r)-toFOLFormula r = Atom $ fmap toFOLExpr r--fromFOLExpr :: (Real r, Fractional r) => Expr r -> Maybe (LA.Expr r)-fromFOLExpr (Const c) = return (LA.constant c)-fromFOLExpr (Var v) = return (LA.var v)-fromFOLExpr (a :+: b) = liftM2 (^+^) (fromFOLExpr a) (fromFOLExpr b)-fromFOLExpr (a :*: b) = do- a' <- fromFOLExpr a- b' <- fromFOLExpr b- msum [ do{ c <- LA.asConst a'; return (c *^ b') }- , do{ c <- LA.asConst b'; return (c *^ a') }- ]-fromFOLExpr (a :/: b) = do- a' <- fromFOLExpr a- b' <- fromFOLExpr b- c <- LA.asConst b'- guard $ c /= 0- return (a' ^/ c)--toFOLExpr :: (Real r, Fractional r) => LA.Expr r -> Expr r-toFOLExpr e =- case map f (LA.terms e) of- [] -> Const 0- [t] -> t- ts -> foldr1 (*) ts- where- f (c,x)- | x == LA.unitVar = Const c- | otherwise = Const c * Var x---- ---------------------------------------------------------------------------
− src/Data/LBool.hs
@@ -1,84 +0,0 @@--------------------------------------------------------------------------------- |--- Module : Data.LBool--- Copyright : (c) Masahiro Sakai 2012--- License : BSD-style--- --- Maintainer : masahiro.sakai@gmail.com--- Stability : provisional--- Portability : portable------ Lifted boolean type.--- -------------------------------------------------------------------------------module Data.LBool- ( LBool- , lTrue- , lFalse- , lUndef- , lnot- , liftBool- , unliftBool- ) where--import Data.Int---- | Lifted Bool type. It has three values 'lTrue', 'lFalse', 'lUndef'.-newtype LBool = LBool Int8 deriving Eq---- | lifted true value-{-# INLINE lTrue #-}-lTrue :: LBool-lTrue = LBool 1---- | lifted false value-{-# INLINE lFalse #-}-lFalse :: LBool-lFalse = LBool (-1)---- | undefined truth value-{-# INLINE lUndef #-}-lUndef :: LBool-lUndef = LBool 0---- |--- @--- lnot lTrue == lFalse--- lnot lFalse == lTrue--- lnot lUndef == lUndef--- @-{-# INLINE lnot #-}-lnot :: LBool -> LBool-lnot x- | x == lTrue = lFalse- | x == lFalse = lTrue- | otherwise = lUndef---- |--- @--- liftBool True == lTrue--- liftBool False == lFalse--- @-{-# INLINE liftBool #-}-liftBool :: Bool -> LBool-liftBool True = lTrue-liftBool False = lFalse---- |--- @--- unliftBool lTrue == Just True--- unliftBool lFalse == Just False--- unliftBool lUndef == Nothing--- @-{-# INLINE unliftBool #-}-unliftBool :: LBool -> Maybe Bool-unliftBool x- | x == lTrue = Just True- | x == lFalse = Just False- | otherwise = Nothing--instance Show LBool where- show x- | x == lTrue = "lTrue"- | x == lFalse = "lFalse"- | otherwise = "lUndef"
− src/Data/Polyhedron.hs
@@ -1,152 +0,0 @@--------------------------------------------------------------------------------- |--- Module : Data.Polyhedron--- Copyright : (c) Masahiro Sakai 2012--- License : BSD-style--- --- Maintainer : masahiro.sakai@gmail.com--- Stability : provisional--- Portability : portable------ Affine subspaces that are characterized by a set of linear (in)equalities.--- -------------------------------------------------------------------------------module Data.Polyhedron- ( Polyhedron- , univ- , empty- , intersection- , fromConstraints- , toConstraints- ) where--import Data.List-import Data.Ratio-import qualified Data.IntSet as IntSet-import Data.Map (Map)-import qualified Data.Map as Map-import Data.VectorSpace-import Prelude hiding (null)--import Algebra.Lattice--import qualified Data.Interval as Interval-import Data.ArithRel-import qualified Data.LA as LA-import Data.Var--type ExprR = LA.Expr Rational-type ExprZ = LA.Expr Integer--type AtomR = LA.Atom Rational--type IntervalR = Interval.Interval Rational---- | Intersection of half-spaces-data Polyhedron- = Polyhedron (Map ExprZ IntervalR)- | Empty- deriving (Eq)--instance Variables Polyhedron where- vars (Polyhedron m) = IntSet.unions [vars e | e <- Map.keys m]- vars Empty = IntSet.empty--instance JoinSemiLattice Polyhedron where- join Empty b = b- join a Empty = a- join (Polyhedron m1) (Polyhedron m2) =- normalize $ Polyhedron (Map.intersectionWith Interval.join m1 m2)--instance MeetSemiLattice Polyhedron where- meet = intersection--instance Lattice Polyhedron--instance BoundedJoinSemiLattice Polyhedron where- bottom = empty --instance BoundedMeetSemiLattice Polyhedron where- top = univ--instance BoundedLattice Polyhedron--normalize :: Polyhedron -> Polyhedron-normalize (Polyhedron m) | any Interval.null (Map.elems m) = Empty-normalize p = p---- | universe-univ :: Polyhedron-univ = Polyhedron Map.empty---- | empty space-empty :: Polyhedron-empty = Empty---- | intersection of -intersection :: Polyhedron -> Polyhedron -> Polyhedron-intersection (Polyhedron m1) (Polyhedron m2) =- normalize $ Polyhedron (Map.unionWith Interval.intersection m1 m2)-intersection _ _ = Empty---- | Create a set of 'Polyhedron's that are characterized by a given--- set of linear (in)equalities.-fromConstraints :: [AtomR] -> [Polyhedron]-fromConstraints cs = - map (foldl' intersection univ) $ transpose $ map fromAtom cs--fromAtom :: AtomR -> [Polyhedron]-fromAtom (Rel lhs NEq rhs) =- fromAtom (lhs .<. rhs) ++ fromAtom (lhs .>. rhs)-fromAtom (Rel lhs op rhs) =- case LA.extract LA.unitVar (lhs .-. rhs) of- (c, e1) ->- case toRat e1 of- (lhs1, d) ->- let rhs1 = - c * fromIntegral d- (lhs2,op2,rhs2) =- if p lhs1- then (negateV lhs1, flipOp op, - rhs1)- else (lhs1, op, rhs1)- ival =- case op of- Lt -> Interval.interval Nothing (Just (False, rhs2))- Le -> Interval.interval Nothing (Just (True, rhs2))- Ge -> Interval.interval (Just (True, rhs2)) Nothing- Gt -> Interval.interval (Just (False, rhs2)) Nothing- Eql -> Interval.singleton rhs2- NEq -> error "should not happen"- in filter (Empty /=) [normalize $ Polyhedron (Map.singleton lhs2 ival)]---- | Convert the polyhedron to a list of linear (in)equalities.-toConstraints :: Polyhedron -> [AtomR]-toConstraints Empty = [LA.constant 0 .<. LA.constant 0]-toConstraints (Polyhedron m) = do- (e, ival) <- Map.toList m- let e' = LA.mapCoeff fromIntegral e- xs = case Interval.lowerBound ival of- Nothing -> []- Just (True,c) -> [LA.constant c .<=. e']- Just (False,c) -> [LA.constant c .<. e']- ys = case Interval.upperBound ival of- Nothing -> []- Just (True,c) -> [e' .<=. LA.constant c]- Just (False,c) -> [e' .<. LA.constant c]- xs ++ ys--p :: ExprZ -> Bool-p e =- case LA.terms e of- (c,_):_ | c < 0 -> True- _ -> False---- | (t,c) represents t/c, and c must be >0.-type Rat = (ExprZ, Integer)--toRat :: ExprR -> Rat-toRat e = (LA.mapCoeff f e, d)- where- f :: Rational -> Integer- f x = round (x * fromIntegral d)- d :: Integer- d = foldl' lcm 1 [denominator c | (c,_) <- LA.terms e]
− src/Data/Polynomial.hs
@@ -1,125 +0,0 @@-{-# OPTIONS_GHC -Wall #-}--------------------------------------------------------------------------------- |--- Module : Data.Polynomial--- Copyright : (c) Masahiro Sakai 2012-2013--- License : BSD-style--- --- Maintainer : masahiro.sakai@gmail.com--- Stability : provisional--- Portability : portable------ Polynomials------ References:------ * Monomial order <http://en.wikipedia.org/wiki/Monomial_order>------ * Polynomial class for Ruby <http://www.math.kobe-u.ac.jp/~kodama/tips-RubyPoly.html>------ * constructive-algebra package <http://hackage.haskell.org/package/constructive-algebra>--- -------------------------------------------------------------------------------module Data.Polynomial- (- -- * Polynomial type- Polynomial-- -- * Conversion- , Var (..)- , constant- , terms- , fromTerms- , coeffMap- , fromCoeffMap- , fromTerm-- -- * Query- , Degree (..)- , Vars (..)- , lt- , lc- , lm- , coeff- , lookupCoeff- , isPrimitive- , isRootOf-- -- * Operations- , Factor (..)- , SQFree (..)- , ContPP (..)- , deriv- , integral- , eval- , subst- , mapCoeff- , toMonic- , toUPolynomialOf- , divModMP- , reduce-- -- * Univariate polynomials- , UPolynomial- , X (..)- , UTerm- , UMonomial- , div- , mod- , divMod- , divides- , gcd- , lcm- , exgcd- , pdivMod- , pdiv- , pmod- , gcd'- , isSquareFree-- -- * Term- , Term- , tdeg- , tmult- , tdivides- , tdiv- , tderiv- , tintegral-- -- * Monic monomial- , Monomial- , mone- , mfromIndices- , mfromIndicesMap- , mindices- , mindicesMap- , mmult- , mpow- , mdivides- , mdiv- , mderiv- , mintegral- , mlcm- , mgcd- , mcoprime-- -- * Monomial order- , MonomialOrder- , lex- , revlex- , grlex- , grevlex-- -- * Pretty Printing- , PrintOptions (..)- , defaultPrintOptions- , prettyPrint- , PrettyCoeff (..)- , PrettyVar (..)- ) where--import Prelude hiding (lex, div, mod, divMod, gcd, lcm)-import Data.Polynomial.Base-import Data.Polynomial.Factorization.FiniteField ()-import Data.Polynomial.Factorization.Integer ()-import Data.Polynomial.Factorization.Rational ()
− src/Data/Polynomial/Base.hs
@@ -1,802 +0,0 @@-{-# LANGUAGE ScopedTypeVariables, FlexibleInstances, MultiParamTypeClasses, FunctionalDependencies, TypeFamilies, BangPatterns, DeriveDataTypeable #-}-{-# OPTIONS_GHC -Wall #-}--------------------------------------------------------------------------------- |--- Module : Data.Polynomial.Base--- Copyright : (c) Masahiro Sakai 2012-2013--- License : BSD-style--- --- Maintainer : masahiro.sakai@gmail.com--- Stability : provisional--- Portability : non-portable (ScopedTypeVariables, FlexibleInstances, MultiParamTypeClasses, FunctionalDependencies, TypeFamilies, BangPatterns, DeriveDataTypeable)------ Polynomials------ References:------ * Monomial order <http://en.wikipedia.org/wiki/Monomial_order>------ * Polynomial class for Ruby <http://www.math.kobe-u.ac.jp/~kodama/tips-RubyPoly.html>------ * constructive-algebra package <http://hackage.haskell.org/package/constructive-algebra>--- -------------------------------------------------------------------------------module Data.Polynomial.Base- (- -- * Polynomial type- Polynomial-- -- * Conversion- , Var (..)- , constant- , terms- , fromTerms- , coeffMap- , fromCoeffMap- , fromTerm-- -- * Query- , Degree (..)- , Vars (..)- , lt- , lc- , lm- , coeff- , lookupCoeff- , isPrimitive- , isRootOf-- -- * Operations- , Factor (..)- , SQFree (..)- , ContPP (..)- , deriv- , integral- , eval- , subst- , mapCoeff- , toMonic- , toUPolynomialOf- , divModMP- , reduce-- -- * Univariate polynomials- , UPolynomial- , X (..)- , UTerm- , UMonomial- , div- , mod- , divMod- , divides- , gcd- , lcm- , exgcd- , pdivMod- , pdiv- , pmod- , gcd'- , isSquareFree-- -- * Term- , Term- , tdeg- , tmult- , tdivides- , tdiv- , tderiv- , tintegral-- -- * Monic monomial- , Monomial- , mone- , mfromIndices- , mfromIndicesMap- , mindices- , mindicesMap- , mmult- , mpow- , mdivides- , mdiv- , mderiv- , mintegral- , mlcm- , mgcd- , mcoprime-- -- * Monomial order- , MonomialOrder- , lex- , revlex- , grlex- , grevlex-- -- * Pretty Printing- , PrintOptions (..)- , defaultPrintOptions- , prettyPrint- , PrettyCoeff (..)- , PrettyVar (..)- ) where--import Prelude hiding (lex, div, mod, divMod, gcd, lcm)-import qualified Prelude-import Control.DeepSeq-import Control.Exception (assert)-import Control.Monad-import Data.Data-import qualified Data.FiniteField as FF-import Data.Function-import Data.List-import Data.Monoid-import Data.Ratio-import Data.Map (Map)-import qualified Data.Map as Map-import Data.Set (Set)-import qualified Data.Set as Set-import Data.IntMap (IntMap)-import qualified Data.IntMap as IntMap-import Data.Typeable-import Data.VectorSpace-import qualified Text.PrettyPrint.HughesPJClass as PP-import Text.PrettyPrint.HughesPJClass (Doc, PrettyLevel, Pretty (..), prettyParen)--infixl 7 `div`, `mod`--{--------------------------------------------------------------------- Classes---------------------------------------------------------------------}--class Vars a v => Var a v | a -> v where- var :: v -> a--class Ord v => Vars a v | a -> v where- vars :: a -> Set v---- | total degree of a given polynomial-class Degree t where- deg :: t -> Integer--{--------------------------------------------------------------------- Polynomial type---------------------------------------------------------------------}---- | Polynomial over commutative ring r-newtype Polynomial r v = Polynomial{ coeffMap :: Map (Monomial v) r }- deriving (Eq, Ord, Typeable)--instance (Eq k, Num k, Ord v) => Num (Polynomial k v) where- (+) = plus- (*) = mult- negate = neg- abs x = x -- OK?- signum _ = 1 -- OK?- fromInteger x = constant (fromInteger x)--instance (Eq k, Num k, Ord v) => AdditiveGroup (Polynomial k v) where- (^+^) = plus- zeroV = zero- negateV = neg--instance (Eq k, Num k, Ord v) => VectorSpace (Polynomial k v) where- type Scalar (Polynomial k v) = k- k *^ p = scale k p--instance (Show v, Ord v, Show k) => Show (Polynomial k v) where- showsPrec d p = showParen (d > 10) $- showString "fromTerms " . shows (terms p)--instance (NFData k, NFData v) => NFData (Polynomial k v) where- rnf (Polynomial m) = rnf m--instance (Eq k, Num k, Ord v) => Var (Polynomial k v) v where- var x = fromTerm (1, var x)--instance (Eq k, Num k, Ord v) => Vars (Polynomial k v) v where- vars p = Set.unions $ [vars mm | (_, mm) <- terms p]--instance Degree (Polynomial k v) where- deg p- | isZero p = -1- | otherwise = maximum [deg mm | (_,mm) <- terms p]--normalize :: (Eq k, Num k, Ord v) => Polynomial k v -> Polynomial k v-normalize (Polynomial m) = Polynomial (Map.filter (0/=) m)--asConstant :: Num k => Polynomial k v -> Maybe k-asConstant p =- case terms p of- [] -> Just 0- [(c,xs)] | Map.null (mindicesMap xs) -> Just c- _ -> Nothing--scale :: (Eq k, Num k, Ord v) => k -> Polynomial k v -> Polynomial k v-scale 0 _ = zero-scale 1 p = p-scale a (Polynomial m) = normalize $ Polynomial (Map.map (a*) m)--zero :: (Eq k, Num k, Ord v) => Polynomial k v-zero = Polynomial $ Map.empty--plus :: (Eq k, Num k, Ord v) => Polynomial k v -> Polynomial k v -> Polynomial k v-plus (Polynomial m1) (Polynomial m2) = normalize $ Polynomial $ Map.unionWith (+) m1 m2--neg :: (Eq k, Num k, Ord v) => Polynomial k v -> Polynomial k v-neg (Polynomial m) = Polynomial $ Map.map negate m--mult :: (Eq k, Num k, Ord v) => Polynomial k v -> Polynomial k v -> Polynomial k v-mult a b- | Just c <- asConstant a = scale c b- | Just c <- asConstant b = scale c a-mult (Polynomial m1) (Polynomial m2) = normalize $ Polynomial $ Map.fromListWith (+)- [ (xs1 `mmult` xs2, c1*c2)- | (xs1,c1) <- Map.toList m1, (xs2,c2) <- Map.toList m2- ]--isZero :: Polynomial k v -> Bool-isZero (Polynomial m) = Map.null m---- | construct a polynomial from a constant-constant :: (Eq k, Num k, Ord v) => k -> Polynomial k v-constant c = fromTerm (c, mone)---- | construct a polynomial from a list of monomials-fromTerms :: (Eq k, Num k, Ord v) => [Term k v] -> Polynomial k v-fromTerms = normalize . Polynomial . Map.fromListWith (+) . map (\(c,xs) -> (xs,c))--fromCoeffMap :: (Eq k, Num k, Ord v) => Map (Monomial v) k -> Polynomial k v-fromCoeffMap m = normalize $ Polynomial m---- | construct a polynomial from a monomial-fromTerm :: (Eq k, Num k, Ord v) => Term k v -> Polynomial k v-fromTerm (c,xs) = normalize $ Polynomial $ Map.singleton xs c---- | list of monomials-terms :: Polynomial k v -> [Term k v]-terms (Polynomial m) = [(c,xs) | (xs,c) <- Map.toList m]---- | leading term with respect to a given monomial order-lt :: (Eq k, Num k, Ord v) => MonomialOrder v -> Polynomial k v -> Term k v-lt cmp p =- case terms p of- [] -> (0, mone) -- should be error?- ms -> maximumBy (cmp `on` snd) ms---- | leading coefficient with respect to a given monomial order-lc :: (Eq k, Num k, Ord v) => MonomialOrder v -> Polynomial k v -> k-lc cmp = fst . lt cmp---- | leading monomial with respect to a given monomial order-lm :: (Eq k, Num k, Ord v) => MonomialOrder v -> Polynomial k v -> Monomial v-lm cmp = snd . lt cmp--coeff :: (Num k, Ord v) => Monomial v -> Polynomial k v -> k-coeff xs (Polynomial m) = Map.findWithDefault 0 xs m--lookupCoeff :: Ord v => Monomial v -> Polynomial k v -> Maybe k-lookupCoeff xs (Polynomial m) = Map.lookup xs m--contI :: (Integral r, Ord v) => Polynomial r v -> r-contI 0 = 1-contI p = foldl1' Prelude.gcd [abs c | (c,_) <- terms p]--ppI :: (Integral r, Ord v) => Polynomial r v -> Polynomial r v-ppI p = mapCoeff f p- where- c = contI p- f x = assert (x `Prelude.mod` c == 0) $ x `Prelude.div` c--class ContPP k where- -- | Content of a polynomial - cont :: (Ord v) => Polynomial k v -> k- -- constructive-algebra-0.3.0 では cont 0 は error になる-- -- | Primitive part of a polynomial- pp :: (Ord v) => Polynomial k v -> Polynomial k v--instance ContPP Integer where- cont = contI- pp = ppI--instance Integral r => ContPP (Ratio r) where- {-# SPECIALIZE instance ContPP (Ratio Integer) #-}-- cont 0 = 1- cont p = foldl1' Prelude.gcd ns % foldl' Prelude.lcm 1 ds- where- ns = [abs (numerator c) | (c,_) <- terms p]- ds = [denominator c | (c,_) <- terms p] -- pp p = mapCoeff (/ c) p- where- c = cont p--isPrimitive :: (Eq k, Num k, ContPP k, Ord v) => Polynomial k v -> Bool-isPrimitive p = isZero p || cont p == 1---- | Formal derivative of polynomials-deriv :: (Eq k, Num k, Ord v) => Polynomial k v -> v -> Polynomial k v-deriv p x = sumV [fromTerm (tderiv m x) | m <- terms p]---- | Formal integral of polynomials-integral :: (Eq k, Fractional k, Ord v) => Polynomial k v -> v -> Polynomial k v-integral p x = sumV [fromTerm (tintegral m x) | m <- terms p]---- | Evaluation-eval :: (Num k, Ord v) => (v -> k) -> Polynomial k v -> k-eval env p = sum [c * product [(env x) ^ e | (x,e) <- mindices xs] | (c,xs) <- terms p]---- | Substitution or bind-subst- :: (Eq k, Num k, Ord v1, Ord v2)- => Polynomial k v1 -> (v1 -> Polynomial k v2) -> Polynomial k v2-subst p s =- sumV [constant c * product [(s x)^e | (x,e) <- mindices xs] | (c, xs) <- terms p]--isRootOf :: (Eq k, Num k) => k -> UPolynomial k -> Bool-isRootOf x p = eval (\_ -> x) p == 0--isSquareFree :: (Eq k, Fractional k) => UPolynomial k -> Bool-isSquareFree p = gcd p (deriv p X) == 1--mapCoeff :: (Eq k1, Num k1, Ord v) => (k -> k1) -> Polynomial k v -> Polynomial k1 v-mapCoeff f (Polynomial m) = Polynomial $ Map.mapMaybe g m- where- g x = if y == 0 then Nothing else Just y- where- y = f x--toMonic :: (Eq r, Fractional r, Ord v) => MonomialOrder v -> Polynomial r v -> Polynomial r v-toMonic cmp p- | c == 0 || c == 1 = p- | otherwise = mapCoeff (/c) p- where- c = lc cmp p--toUPolynomialOf :: (Ord k, Num k, Ord v) => Polynomial k v -> v -> UPolynomial (Polynomial k v)-toUPolynomialOf p v = fromTerms $ do- (c,mm) <- terms p- let m = mindicesMap mm- return ( fromTerms [(c, mfromIndicesMap (Map.delete v m))]- , var X `mpow` Map.findWithDefault 0 v m- )---- | Multivariate division algorithm-divModMP- :: forall k v. (Eq k, Fractional k, Ord v)- => MonomialOrder v -> Polynomial k v -> [Polynomial k v] -> ([Polynomial k v], Polynomial k v)-divModMP cmp p fs = go IntMap.empty p- where- ls = [(lt cmp f, f) | f <- fs]-- go :: IntMap (Polynomial k v) -> Polynomial k v -> ([Polynomial k v], Polynomial k v)- go qs g =- case xs of- [] -> ([IntMap.findWithDefault 0 i qs | i <- [0 .. length fs - 1]], g)- (i, b, g') : _ -> go (IntMap.insertWith (+) i b qs) g'- where- ms = sortBy (flip cmp `on` snd) (terms g)- xs = do- (i,(a,f)) <- zip [0..] ls- h <- ms- guard $ a `tdivides` h- let b = fromTerm $ tdiv h a- return (i, b, g - b * f)---- | Multivariate division algorithm-reduce- :: (Eq k, Fractional k, Ord v)- => MonomialOrder v -> Polynomial k v -> [Polynomial k v] -> Polynomial k v-reduce cmp p fs = go p- where- ls = [(lt cmp f, f) | f <- fs]- go g = if null xs then g else go (head xs)- where- ms = sortBy (flip cmp `on` snd) (terms g)- xs = do- (a,f) <- ls- h <- ms- guard $ a `tdivides` h- return (g - fromTerm (tdiv h a) * f)---- | Factorization of polynomials-class Factor a where- -- | factor a polynomial @p@ into @p1 ^ n1 + p2 ^ n2 + ..@ and- -- return a list @[(p1,n1), (p2,n2), ..]@.- factor :: a -> [(a, Integer)]---- | Square-free factorization of polynomials-class SQFree a where- -- | factor a polynomial @p@ into @p1 ^ n1 + p2 ^ n2 + ..@ and- -- return a list @[(p1,n1), (p2,n2), ..]@.- sqfree :: a -> [(a, Integer)]--{--------------------------------------------------------------------- Pretty printing---------------------------------------------------------------------}--data PrintOptions k v- = PrintOptions- { pOptPrintVar :: PrettyLevel -> Rational -> v -> Doc- , pOptPrintCoeff :: PrettyLevel -> Rational -> k -> Doc- , pOptIsNegativeCoeff :: k -> Bool- , pOptMonomialOrder :: MonomialOrder v- }--defaultPrintOptions :: (PrettyCoeff k, PrettyVar v, Ord v) => PrintOptions k v-defaultPrintOptions- = PrintOptions- { pOptPrintVar = pPrintVar- , pOptPrintCoeff = pPrintCoeff- , pOptIsNegativeCoeff = isNegativeCoeff- , pOptMonomialOrder = grlex- }--instance (Ord k, Num k, Ord v, PrettyCoeff k, PrettyVar v) => Pretty (Polynomial k v) where- pPrintPrec = prettyPrint defaultPrintOptions--prettyPrint- :: (Ord k, Num k, Ord v)- => PrintOptions k v- -> PrettyLevel -> Rational -> Polynomial k v -> Doc-prettyPrint opt lv prec p =- case sortBy (flip (pOptMonomialOrder opt) `on` snd) $ terms p of- [] -> PP.int 0- [t] -> pLeadingTerm prec t- t:ts ->- prettyParen (prec > addPrec) $- PP.hcat (pLeadingTerm addPrec t : map pTrailingTerm ts)- where- pLeadingTerm prec (c,xs) =- if pOptIsNegativeCoeff opt c- then prettyParen (prec > addPrec) $- PP.char '-' <> prettyPrintTerm opt lv (addPrec+1) (-c,xs)- else prettyPrintTerm opt lv prec (c,xs)-- pTrailingTerm (c,xs) =- if pOptIsNegativeCoeff opt c- then PP.space <> PP.char '-' <> PP.space <> prettyPrintTerm opt lv (addPrec+1) (-c,xs)- else PP.space <> PP.char '+' <> PP.space <> prettyPrintTerm opt lv (addPrec+1) (c,xs)--prettyPrintTerm- :: (Ord k, Num k, Ord v)- => PrintOptions k v- -> PrettyLevel -> Rational -> Term k v -> Doc-prettyPrintTerm opt lv prec (c,xs)- | len == 0 = pOptPrintCoeff opt lv (appPrec+1) c- -- intentionally specify (appPrec+1) to parenthesize any composite expression- | len == 1 && c == 1 = pPow prec $ head (mindices xs)- | otherwise =- prettyParen (prec > mulPrec) $- PP.hcat $ intersperse (PP.char '*') fs- where- len = Map.size $ mindicesMap xs- fs = [pOptPrintCoeff opt lv (appPrec+1) c | c /= 1] ++ [pPow (mulPrec+1) p | p <- mindices xs]- -- intentionally specify (appPrec+1) to parenthesize any composite expression-- pPow prec (x,1) = pOptPrintVar opt lv prec x- pPow prec (x,n) =- prettyParen (prec > expPrec) $- pOptPrintVar opt lv (expPrec+1) x <> PP.char '^' <> PP.integer n--class PrettyCoeff a where- pPrintCoeff :: PrettyLevel -> Rational -> a -> Doc- isNegativeCoeff :: a -> Bool- isNegativeCoeff _ = False--instance PrettyCoeff Integer where- pPrintCoeff = pPrintPrec- isNegativeCoeff = (0>)--instance (PrettyCoeff a, Integral a) => PrettyCoeff (Ratio a) where- pPrintCoeff lv p r- | denominator r == 1 = pPrintCoeff lv p (numerator r)- | otherwise = - prettyParen (p > ratPrec) $- pPrintCoeff lv (ratPrec+1) (numerator r) <>- PP.char '/' <>- pPrintCoeff lv (ratPrec+1) (denominator r)- isNegativeCoeff x = isNegativeCoeff (numerator x)--instance PrettyCoeff (FF.PrimeField a) where- pPrintCoeff lv p a = pPrintCoeff lv p (FF.toInteger a)- isNegativeCoeff _ = False--instance (Num c, Ord c, PrettyCoeff c, Ord v, PrettyVar v) => PrettyCoeff (Polynomial c v) where- pPrintCoeff = pPrintPrec--class PrettyVar a where- pPrintVar :: PrettyLevel -> Rational -> a -> Doc--instance PrettyVar Int where- pPrintVar _ _ n = PP.char 'x' <> PP.int n--instance PrettyVar X where- pPrintVar _ _ X = PP.char 'x'--addPrec, mulPrec, ratPrec, expPrec, appPrec :: Rational-addPrec = 6 -- Precedence of '+'-mulPrec = 7 -- Precedence of '*'-ratPrec = 7 -- Precedence of '/'-expPrec = 8 -- Precedence of '^'-appPrec = 10 -- Precedence of function application--{--------------------------------------------------------------------- Univariate polynomials---------------------------------------------------------------------}---- | Univariate polynomials over commutative ring r-type UPolynomial r = Polynomial r X--data X = X- deriving (Eq, Ord, Bounded, Enum, Show, Read, Typeable, Data)--instance NFData X--ucmp :: MonomialOrder X-ucmp = grlex---- | division of univariate polynomials-div :: (Eq k, Fractional k) => UPolynomial k -> UPolynomial k -> UPolynomial k-div f1 f2 = fst (divMod f1 f2)---- | division of univariate polynomials-mod :: (Eq k, Fractional k) => UPolynomial k -> UPolynomial k -> UPolynomial k-mod f1 f2 = snd (divMod f1 f2)---- | division of univariate polynomials-divMod :: (Eq k, Fractional k) => UPolynomial k -> UPolynomial k -> (UPolynomial k, UPolynomial k)-divMod f g- | isZero g = error "divMod: division by zero"- | otherwise = go 0 f- where- lt_g = lt ucmp g- go !q !r- | deg r < deg g = (q,r)- | otherwise = go (q + t) (r - t * g)- where- lt_r = lt ucmp r- t = fromTerm $ lt_r `tdiv` lt_g--divides :: (Eq k, Fractional k) => UPolynomial k -> UPolynomial k -> Bool-divides f1 f2 = f2 `mod` f1 == 0---- | GCD of univariate polynomials-gcd :: (Eq k, Fractional k) => UPolynomial k -> UPolynomial k -> UPolynomial k-gcd f1 0 = toMonic ucmp f1-gcd f1 f2 = gcd f2 (f1 `mod` f2)---- | LCM of univariate polynomials-lcm :: (Eq k, Fractional k) => UPolynomial k -> UPolynomial k -> UPolynomial k-lcm _ 0 = 0-lcm 0 _ = 0-lcm f1 f2 = toMonic ucmp $ (f1 `mod` (gcd f1 f2)) * f2---- | Extended GCD algorithm-exgcd- :: (Eq k, Fractional k)- => UPolynomial k- -> UPolynomial k- -> (UPolynomial k, UPolynomial k, UPolynomial k)-exgcd f1 f2 = f $ go f1 f2 1 0 0 1- where- go !r0 !r1 !s0 !s1 !t0 !t1- | r1 == 0 = (r0, s0, t0)- | otherwise = go r1 r2 s1 s2 t1 t2- where- (q, r2) = r0 `divMod` r1- s2 = s0 - q*s1- t2 = t0 - q*t1- f (g,u,v)- | lc_g == 0 = (g, u, v)- | otherwise = (mapCoeff (/lc_g) g, mapCoeff (/lc_g) u, mapCoeff (/lc_g) v)- where- lc_g = lc ucmp g---- | pseudo division-pdivMod :: (Eq r, Num r) => UPolynomial r -> UPolynomial r -> (r, UPolynomial r, UPolynomial r)-pdivMod _ 0 = error "pdivMod: division by 0"-pdivMod f g- | deg f < deg g = (1, 0, f)- | otherwise = go (deg f - deg g + 1) f 0- where- (lc_g, lm_g) = lt ucmp g- b = lc_g ^ (deg f - deg_g + 1)- deg_g = deg g- go !n !f1 !q- | deg_g > deg f1 = (b, q, scale (lc_g ^ n) f1)- | otherwise = go (n - 1) (scale lc_g f1 - s * g) (q + scale (lc_g ^ (n-1)) s)- where- (lc_f1, lm_f1) = lt ucmp f1- s = fromTerm (lc_f1, lm_f1 `mdiv` lm_g)---- | pseudo quotient-pdiv :: (Eq r, Num r) => UPolynomial r -> UPolynomial r -> UPolynomial r-pdiv f g =- case f `pdivMod` g of- (_, q, _) -> q---- | pseudo reminder-pmod :: (Eq r, Num r) => UPolynomial r -> UPolynomial r -> UPolynomial r-pmod _ 0 = error "pmod: division by 0"-pmod f g- | deg f < deg g = f- | otherwise = go (deg f - deg g + 1) f- where- (lc_g, lm_g) = lt ucmp g- deg_g = deg g- go !n !f1- | deg_g > deg f1 = scale (lc_g ^ n) f1- | otherwise = go (n - 1) (scale lc_g f1 - s * g)- where- (lc_f1, lm_f1) = lt ucmp f1- s = fromTerm (lc_f1, lm_f1 `mdiv` lm_g)---- | GCD of univariate polynomials-gcd' :: (Eq r, Integral r) => UPolynomial r -> UPolynomial r -> UPolynomial r-gcd' f1 0 = ppI f1-gcd' f1 f2 = gcd' f2 (f1 `pmod` f2)--{--------------------------------------------------------------------- Term---------------------------------------------------------------------}--type Term k v = (k, Monomial v)-type UTerm k = Term k X--tdeg :: Term k v -> Integer-tdeg (_,xs) = deg xs--tmult :: (Num k, Ord v) => Term k v -> Term k v -> Term k v-tmult (c1,xs1) (c2,xs2) = (c1*c2, xs1 `mmult` xs2)--tdivides :: (Fractional k, Ord v) => Term k v -> Term k v -> Bool-tdivides (_,xs1) (_,xs2) = xs1 `mdivides` xs2--tdiv :: (Fractional k, Ord v) => Term k v -> Term k v -> Term k v-tdiv (c1,xs1) (c2,xs2) = (c1 / c2, xs1 `mdiv` xs2)--tderiv :: (Eq k, Num k, Ord v) => Term k v -> v -> Term k v-tderiv (c,xs) x =- case mderiv xs x of- (s,ys) -> (c * fromIntegral s, ys)--tintegral :: (Eq k, Fractional k, Ord v) => Term k v -> v -> Term k v-tintegral (c,xs) x =- case mintegral xs x of- (s,ys) -> (c * fromRational s, ys)--{--------------------------------------------------------------------- Monic Monomial---------------------------------------------------------------------}---- 本当は変数の型に応じて type family で表現を変えたい---- | Monic monomials-newtype Monomial v = Monomial{ mindicesMap :: Map v Integer }- deriving (Eq, Ord, Typeable)--type UMonomial = Monomial X--instance (Ord v, Show v) => Show (Monomial v) where- showsPrec d m = showParen (d > 10) $- showString "mfromIndices " . shows (mindices m)--instance (NFData v) => NFData (Monomial v) where- rnf (Monomial m) = rnf m--instance Degree (Monomial v) where- deg (Monomial m) = sum $ Map.elems m--instance Ord v => Var (Monomial v) v where- var x = Monomial $ Map.singleton x 1--instance Ord v => Vars (Monomial v) v where- vars mm = Map.keysSet (mindicesMap mm)--mone :: Monomial v-mone = Monomial $ Map.empty--mfromIndices :: Ord v => [(v, Integer)] -> Monomial v-mfromIndices xs- | any (\(_,e) -> 0>e) xs = error "mfromIndices: negative exponent"- | otherwise = Monomial $ Map.fromListWith (+) [(x,e) | (x,e) <- xs, e > 0]--mfromIndicesMap :: Ord v => Map v Integer -> Monomial v-mfromIndicesMap m- | any (\(_,e) -> 0>e) (Map.toList m) = error "mfromIndicesMap: negative exponent"- | otherwise = mfromIndicesMap' m--mfromIndicesMap' :: Ord v => Map v Integer -> Monomial v-mfromIndicesMap' m = Monomial $ Map.filter (>0) m--mindices :: Ord v => Monomial v -> [(v, Integer)]-mindices = Map.toAscList . mindicesMap--mmult :: Ord v => Monomial v -> Monomial v -> Monomial v-mmult (Monomial xs1) (Monomial xs2) = mfromIndicesMap' $ Map.unionWith (+) xs1 xs2--mpow :: Ord v => Monomial v -> Integer -> Monomial v-mpow _ 0 = mone-mpow m 1 = m-mpow (Monomial xs) e- | 0 > e = error "mpow: negative exponent"- | otherwise = Monomial $ Map.map (e*) xs--mdivides :: Ord v => Monomial v -> Monomial v -> Bool-mdivides (Monomial xs1) (Monomial xs2) = Map.isSubmapOfBy (<=) xs1 xs2--mdiv :: Ord v => Monomial v -> Monomial v -> Monomial v-mdiv (Monomial xs1) (Monomial xs2) = Monomial $ Map.differenceWith f xs1 xs2- where- f m n- | m <= n = Nothing- | otherwise = Just (m - n)--mderiv :: Ord v => Monomial v -> v -> (Integer, Monomial v)-mderiv (Monomial xs) x- | n==0 = (0, mone)- | otherwise = (n, Monomial $ Map.update f x xs)- where- n = Map.findWithDefault 0 x xs- f m- | m <= 1 = Nothing- | otherwise = Just $! m - 1--mintegral :: Ord v => Monomial v -> v -> (Rational, Monomial v)-mintegral (Monomial xs) x =- (1 % fromIntegral (n + 1), Monomial $ Map.insert x (n+1) xs)- where- n = Map.findWithDefault 0 x xs--mlcm :: Ord v => Monomial v -> Monomial v -> Monomial v-mlcm (Monomial m1) (Monomial m2) = Monomial $ Map.unionWith max m1 m2--mgcd :: Ord v => Monomial v -> Monomial v -> Monomial v-mgcd (Monomial m1) (Monomial m2) = Monomial $ Map.intersectionWith min m1 m2--mcoprime :: Ord v => Monomial v -> Monomial v -> Bool-mcoprime m1 m2 = mgcd m1 m2 == mone--{--------------------------------------------------------------------- Monomial Order---------------------------------------------------------------------}--type MonomialOrder v = Monomial v -> Monomial v -> Ordering---- | Lexicographic order-lex :: Ord v => MonomialOrder v-lex xs1 xs2 = go (mindices xs1) (mindices xs2)- where- go [] [] = EQ- go [] _ = LT -- = compare 0 n2- go _ [] = GT -- = compare n1 0- go ((x1,n1):xs1) ((x2,n2):xs2) =- case compare x1 x2 of- LT -> GT -- = compare n1 0- GT -> LT -- = compare 0 n2- EQ -> compare n1 n2 `mappend` go xs1 xs2---- | Reverse lexicographic order.--- --- Note that revlex is NOT a monomial order.-revlex :: Ord v => Monomial v -> Monomial v -> Ordering-revlex xs1 xs2 = go (Map.toDescList (mindicesMap xs1)) (Map.toDescList (mindicesMap xs2))- where- go [] [] = EQ- go [] _ = GT -- = cmp 0 n2- go _ [] = LT -- = cmp n1 0- go ((x1,n1):xs1) ((x2,n2):xs2) =- case compare x1 x2 of- LT -> GT -- = cmp 0 n2- GT -> LT -- = cmp n1 0- EQ -> cmp n1 n2 `mappend` go xs1 xs2- cmp n1 n2 = compare n2 n1---- | Graded lexicographic order-grlex :: Ord v => MonomialOrder v-grlex = (compare `on` deg) `mappend` lex---- | Graded reverse lexicographic order-grevlex :: Ord v => MonomialOrder v-grevlex = (compare `on` deg) `mappend` revlex
− src/Data/Polynomial/Factorization/FiniteField.hs
@@ -1,150 +0,0 @@-{-# LANGUAGE ScopedTypeVariables, BangPatterns, TypeSynonymInstances, FlexibleInstances #-}-{-# OPTIONS_GHC -Wall #-}--------------------------------------------------------------------------------- |--- Module : Data.Polynomial.Factorization.FiniteField--- Copyright : (c) Masahiro Sakai 2012-2013--- License : BSD-style--- --- Maintainer : masahiro.sakai@gmail.com--- Stability : provisional--- Portability : non-portable (ScopedTypeVariables, BangPatterns, TypeSynonymInstances, FlexibleInstances)------ Factoriation of polynomial over a finite field.------ References:------ * <http://en.wikipedia.org/wiki/Factorization_of_polynomials_over_a_finite_field_and_irreducibility_tests>--- --- * <http://en.wikipedia.org/wiki/Berlekamp%27s_algorithm>------ * Martin Kreuzer and Lorenzo Robbiano. Computational Commutative Algebra 1. Springer Verlag, 2000.----------------------------------------------------------------------------------module Data.Polynomial.Factorization.FiniteField- ( factor- , sqfree- , berlekamp- , basisOfBerlekampSubalgebra- ) where--import Control.Exception (assert)-import Data.FiniteField-import Data.Function (on)-import Data.List-import Data.Set (Set)-import qualified Data.Set as Set-import Data.Polynomial.Base (Polynomial, UPolynomial, X (..), MonomialOrder)-import qualified Data.Polynomial.Base as P-import qualified Data.Polynomial.GroebnerBasis as GB-import qualified TypeLevel.Number.Nat as TL--instance TL.Nat p => P.Factor (UPolynomial (PrimeField p)) where- factor = factor--instance TL.Nat p => P.SQFree (UPolynomial (PrimeField p)) where- sqfree = sqfree--factor :: forall k. (Ord k, FiniteField k) => UPolynomial k -> [(UPolynomial k, Integer)]-factor f = do- (g,n) <- sqfree f- if P.deg g > 0- then do- h <- berlekamp g- return (h,n)- else do- return (g,n)---- | Square-free decomposition of univariate polynomials over a finite field.-sqfree :: forall k. (Eq k, FiniteField k) => UPolynomial k -> [(UPolynomial k, Integer)]-sqfree f- | c == 1 = sqfree' f- | otherwise = (P.constant c, 1) : sqfree' (P.mapCoeff (/c) f)- where- c = P.lc ucmp f--sqfree' :: forall k. (Eq k, FiniteField k) => UPolynomial k -> [(UPolynomial k, Integer)]-sqfree' 0 = []-sqfree' f- | g == 0 = [(h, n*p) | (h,n) <- sqfree' (polyPthRoot f)]- | otherwise = go 1 c0 w0 []- where- p = char (undefined :: k)- g = P.deriv f X- c0 = P.gcd f g- w0 = P.div f c0- go !i c w !result- | w == 1 =- if c == 1- then result- else result ++ [(h, n*p) | (h,n) <- sqfree' (polyPthRoot c)]- | otherwise = go (i+1) c' w' result'- where- y = P.gcd w c- z = w `P.div` y - c' = c `P.div` y- w' = y- result' = [(z,i) | z /= 1] ++ result--ucmp :: MonomialOrder X-ucmp = P.grlex--polyPthRoot :: forall k. (Eq k, FiniteField k) => UPolynomial k -> UPolynomial k-polyPthRoot f = assert (P.deriv f X == 0) $- P.fromTerms [(pthRoot c, g mm) | (c,mm) <- P.terms f]- where- p = char (undefined :: k)- g mm = P.var X `P.mpow` (P.deg mm `div` p)---- | Berlekamp algorithm for polynomial factorization.------ Input polynomial is assumed to be monic and square-free.-berlekamp :: forall k. (Eq k, Ord k, FiniteField k) => UPolynomial k -> [UPolynomial k]-berlekamp f = go (Set.singleton f) basis- where- go :: Set (UPolynomial k) -> [UPolynomial k] -> [UPolynomial k]- go _ [] = error $ "berlekamp: should not happen"- go fs (b:bs)- | Set.size fs == r = Set.toList fs- | otherwise = go (Set.unions [func fi | fi <- Set.toList fs]) bs- where- func fi = Set.fromList $ hs2 ++ hs1- where- hs1 = [h | k <- allValues, let h = P.gcd fi (b - P.constant k), P.deg h > 0]- hs2 = if P.deg g > 0 then [g] else []- where- g = fi `P.div` product hs1- basis = basisOfBerlekampSubalgebra f- r = length basis--basisOfBerlekampSubalgebra :: forall k. (Ord k, FiniteField k) => UPolynomial k -> [UPolynomial k]-basisOfBerlekampSubalgebra f =- sortBy (flip compare `on` P.deg) $- map (P.toMonic ucmp) $- basis- where- q = order (undefined :: k)- d = P.deg f- x = P.var X-- qs :: [UPolynomial k]- qs = [(x^(q*i)) `P.mod` f | i <- [0 .. d - 1]]-- gb :: [Polynomial k Int]- gb = GB.basis P.grlex [p3 | (p3,_) <- P.terms p2]-- p1 :: Polynomial k Int- p1 = sum [P.var i * (P.subst qi (\X -> P.var (-1)) - (P.var (-1) ^ i)) | (i, qi) <- zip [0..] qs]- p2 :: UPolynomial (Polynomial k Int)- p2 = P.toUPolynomialOf p1 (-1)-- es = [(i, P.reduce P.grlex (P.var i) gb) | i <- [0 .. fromIntegral d - 1]]- vs1 = [i | (i, gi_def) <- es, gi_def == P.var i]- vs2 = [(i, gi_def) | (i, gi_def) <- es, gi_def /= P.var i]-- basis :: [UPolynomial k]- basis = [ x^i + sum [P.constant (P.eval (delta i) gj_def) * x^j | (j, gj_def) <- vs2] | i <- vs1 ]- where- delta i k- | k==i = 1- | otherwise = 0
− src/Data/Polynomial/Factorization/Hensel.hs
@@ -1,147 +0,0 @@-{-# LANGUAGE ScopedTypeVariables, BangPatterns, TemplateHaskell #-}-{-# OPTIONS_GHC -Wall #-}--------------------------------------------------------------------------------- |--- Module : Data.Polynomial.Factorization.Hensel--- Copyright : (c) Masahiro Sakai 2013--- License : BSD-style--- --- Maintainer : masahiro.sakai@gmail.com--- Stability : provisional--- Portability : non-portable (ScopedTypeVariables, BangPatterns, TemplateHaskell)------ References:------ * <http://www.math.kobe-u.ac.jp/Asir/ca.pdf>--- --- * <http://www14.in.tum.de/konferenzen/Jass07/courses/1/Bulwahn/Buhlwahn_Paper.pdf>----------------------------------------------------------------------------------module Data.Polynomial.Factorization.Hensel- ( hensel- ) where--import Control.Exception (assert)-import Data.FiniteField-import Data.Polynomial.Base (UPolynomial, X (..))-import qualified Data.Polynomial.Base as P-import qualified TypeLevel.Number.Nat as TL---- import Text.PrettyPrint.HughesPJClass--hensel :: forall p. TL.Nat p => UPolynomial Integer -> [UPolynomial (PrimeField p)] -> Integer -> [UPolynomial Integer]-hensel f fs1 k- | k <= 0 = error "hensel; k <= 0"- | otherwise = assert precondition $ go 1 (map (P.mapCoeff Data.FiniteField.toInteger) fs1)- where- precondition =- P.mapCoeff fromInteger f == product fs1 && - P.deg f == P.deg (product fs1)-- p :: Integer- p = TL.toInt (undefined :: p)-- go :: Integer -> [UPolynomial Integer] -> [UPolynomial Integer]- go !i fs- | i==k = assert (check i fs) $ fs- | otherwise = assert (check i fs) $ go (i+1) (lift i fs)-- check :: Integer -> [UPolynomial Integer] -> Bool- check k fs =- and - [ P.mapCoeff (`mod` pk) f == P.mapCoeff (`mod` pk) (product fs)- , fs1 == map (P.mapCoeff fromInteger) fs- , and [P.deg fi1 == P.deg fik | (fi1, fik) <- zip fs1 fs]- ]- where- pk = p ^ k-- lift :: Integer -> [UPolynomial Integer] -> [UPolynomial Integer]- lift k fs = fs'- where- pk = p^k- pk1 = p^(k+1)-- -- f ≡ product fs + p^k h (mod p^(k+1))- h :: UPolynomial Integer- h = P.mapCoeff (\c -> (c `mod` pk1) `div` pk) (f - product fs)-- hs :: [UPolynomial (PrimeField p)]- hs = prop_5_11 (map (P.mapCoeff fromInteger) fs) (P.mapCoeff fromInteger h)-- fs' :: [UPolynomial Integer]- fs' = [ P.mapCoeff (`mod` pk1) (fi + P.constant pk * P.mapCoeff Data.FiniteField.toInteger hi)- | (fi, hi) <- zip fs hs ]---- http://www14.in.tum.de/konferenzen/Jass07/courses/1/Bulwahn/Buhlwahn_Paper.pdf-test_hensel :: Bool-test_hensel = and- [ hensel f fs 2 == [x^(2::Int) + 5*x + 18, x + 5]- , hensel f fs 3 == [x^(2::Int) + 105*x + 43, x + 30]- , hensel f fs 4 == [x^(2::Int) + 605*x + 168, x + 30]- ]- where- x :: forall k. (Eq k, Num k) => UPolynomial k- x = P.var X- f :: UPolynomial Integer- f = x^(3::Int) + 10*x^(2::Int) - 432*x + 5040- fs :: [UPolynomial $(primeField 5)]- fs = [x^(2::Int)+3, x]---- http://www.math.kobe-u.ac.jp/Asir/ca.pdf-prop_5_10 :: forall k. (Num k, Fractional k, Eq k) => [UPolynomial k] -> [UPolynomial k]-prop_5_10 fs = normalize (go fs)- where- check :: [UPolynomial k] -> [UPolynomial k] -> Bool- check es fs = sum [ei * (product fs `P.div` fi) | (ei,fi) <- zip es fs] == 1-- go :: [UPolynomial k] -> [UPolynomial k]- go [] = error "prop_5_10: empty list"- go [fi] = assert (check [1] [fi]) [1]- go fs@(fi : fs') = - case P.exgcd (product fs') fi of- (g,ei,v) ->- assert (g == 1) $- let es' = go fs'- es = ei : map (v*) es'- in assert (check es fs) es-- normalize :: [UPolynomial k] -> [UPolynomial k]- normalize es = assert (check es2 fs) es2- where- es2 = zipWith P.mod es fs--test_prop_5_10 :: Bool-test_prop_5_10 = sum [ei * (product fs `P.div` fi) | (ei,fi) <- zip es fs] == 1- where- x :: UPolynomial Rational- x = P.var P.X- fs = [x, x+1, x+2]- es = prop_5_10 fs---- http://www.math.kobe-u.ac.jp/Asir/ca.pdf-prop_5_11 :: forall k. (Num k, Fractional k, Eq k, P.PrettyCoeff k, Ord k) => [UPolynomial k] -> UPolynomial k -> [UPolynomial k]-prop_5_11 fs g =- assert (P.deg g <= P.deg (product fs)) $- assert (P.deg c <= 0) $- assert (check es2 fs g) $- es2- where- es = map (g*) $ prop_5_10 fs- c = sum [ei `P.div` fi | (ei,fi) <- zip es fs]- es2 = case zipWith P.mod es fs of- e2' : es2' -> e2' + c * head fs : es2' -- check :: [UPolynomial k] -> [UPolynomial k] -> UPolynomial k -> Bool- check es fs g =- sum [ei * (product fs `P.div` fi) | (ei,fi) <- zip es fs] == g &&- and [P.deg ei <= P.deg fi | (ei,fi) <- zip es fs]--test_prop_5_11 :: Bool-test_prop_5_11 = sum [ei * (product fs `P.div` fi) | (ei,fi) <- zip es fs] == g- where- x :: UPolynomial Rational- x = P.var P.X- fs = [x, x+1, x+2]- g = x^(2::Int) + 1- es = prop_5_11 fs g
− src/Data/Polynomial/Factorization/Integer.hs
@@ -1,20 +0,0 @@-{-# LANGUAGE TypeSynonymInstances, FlexibleInstances #-}--------------------------------------------------------------------------------- |--- Module : Data.Polynomial.Factorization.Integer--- Copyright : (c) Masahiro Sakai 2012-2013--- License : BSD-style--- --- Maintainer : masahiro.sakai@gmail.com--- Stability : provisional--- Portability : non-portable (TypeSynonymInstances, FlexibleInstances)----------------------------------------------------------------------------------module Data.Polynomial.Factorization.Integer () where---- import Data.Polynomial.Factorization.Kronecker-import qualified Data.Polynomial.Base as P-import Data.Polynomial.Factorization.Zassenhaus--instance P.Factor (P.UPolynomial Integer) where- factor = factor
− src/Data/Polynomial/Factorization/Kronecker.hs
@@ -1,132 +0,0 @@-{-# LANGUAGE BangPatterns #-}--------------------------------------------------------------------------------- |--- Module : Data.Polynomial.Factorization.Kronecker--- Copyright : (c) Masahiro Sakai 2012-2013--- License : BSD-style--- --- Maintainer : masahiro.sakai@gmail.com--- Stability : provisional--- Portability : non-portable (BangPatterns)------ Factoriation of integer-coefficient polynomial using Kronecker's method.------ References:------ * <http://en.wikipedia.org/wiki/Polynomial_factorization>----------------------------------------------------------------------------------module Data.Polynomial.Factorization.Kronecker- ( factor- ) where--import Data.List-import Data.MultiSet (MultiSet)-import qualified Data.MultiSet as MultiSet-import Data.Numbers.Primes (primes)-import Data.Ratio-import Data.Polynomial.Base (Polynomial, UPolynomial, X (..))-import qualified Data.Polynomial.Base as P-import qualified Data.Polynomial.Interpolation.Lagrange as Interpolation-import Util (isInteger)--factor :: UPolynomial Integer -> [(UPolynomial Integer, Integer)]-factor 0 = [(0,1)]-factor 1 = []-factor p | P.deg p == 0 = [(p,1)]-factor p = [(P.constant c, 1) | c /= 1] ++ [(q, fromIntegral m) | (q,m) <- MultiSet.toOccurList qs]- where- (c,qs) = normalize (P.cont p, factor' (P.pp p))--normalize :: (Integer, MultiSet (UPolynomial Integer)) -> (Integer, MultiSet (UPolynomial Integer))-normalize (c,ps) = go (MultiSet.toOccurList ps) c MultiSet.empty- where- go [] !c !qs = (c, qs)- go ((p,m) : ps) !c !qs- | P.deg p == 0 = go ps (c * (P.coeff (P.var X) p) ^ m) qs- | P.lc P.grlex p < 0 = go ps (c * (-1)^m) (MultiSet.insertMany (-p) m qs)- | otherwise = go ps c (MultiSet.insertMany p m qs)--factor' :: UPolynomial Integer -> MultiSet (UPolynomial Integer)-factor' p = go (MultiSet.singleton p) MultiSet.empty- where- go ps ret- | MultiSet.null ps = ret- | otherwise =- case factor2 p of- Nothing ->- go ps' (MultiSet.insertMany p m ret)- Just (q1,q2) ->- go (MultiSet.insertMany q1 m $ MultiSet.insertMany q2 m ps') ret- where- p = MultiSet.findMin ps- m = MultiSet.occur p ps- ps' = MultiSet.deleteAll p ps--factor2 :: UPolynomial Integer -> Maybe (UPolynomial Integer, UPolynomial Integer)-factor2 p | p == P.var X = Nothing-factor2 p =- case find (\(_,yi) -> yi==0) vs of- Just (xi,_) ->- let q1 = x - P.constant xi- q2 = p' `P.div` P.mapCoeff fromInteger q1- in Just (q1, toZ q2)- Nothing ->- let qs = map Interpolation.interpolate $- sequence [[(fromInteger xi, fromInteger z) | z <- factors yi] | (xi,yi) <- vs]- zs = [ (q1,q2)- | q1 <- qs, P.deg q1 > 0, isUPolyZ q1- , let (q2,r) = p' `P.divMod` q1- , r == 0, P.deg q2 > 0, isUPolyZ q2- ]- in case zs of- [] -> Nothing- (q1,q2):_ -> Just (toZ q1, toZ q2)- where- n = P.deg p `div` 2- xs = take (fromIntegral n + 1) xvalues- vs = [(x, P.eval (\X -> x) p) | x <- xs]- x = P.var X- p' :: UPolynomial Rational- p' = P.mapCoeff fromInteger p--isUPolyZ :: UPolynomial Rational -> Bool-isUPolyZ p = and [isInteger c | (c,_) <- P.terms p]--toZ :: Ord v => Polynomial Rational v -> Polynomial Integer v-toZ = P.mapCoeff numerator . P.pp---- [0, 1, -1, 2, -2, 3, -3 ..]-xvalues :: [Integer]-xvalues = 0 : interleave [1,2..] [-1,-2..]--interleave :: [a] -> [a] -> [a]-interleave xs [] = xs-interleave [] ys = ys-interleave (x:xs) ys = x : interleave ys xs--factors :: Integer -> [Integer]-factors 0 = []-factors x = xs ++ map negate xs- where- ps = primeFactors (abs x)- xs = map product $ sequence [take (n+1) (iterate (p*) 1) | (p,n) <- MultiSet.toOccurList ps]--primeFactors :: Integer -> MultiSet Integer-primeFactors 0 = MultiSet.empty-primeFactors n = go n primes MultiSet.empty- where- go :: Integer -> [Integer] -> MultiSet Integer -> MultiSet Integer- go 1 !_ !result = result- go n (p:ps) !result- | p*p > n = MultiSet.insert n result- | otherwise =- case f p n of- (m,n') -> go n' ps (MultiSet.insertMany p m result)-- f :: Integer -> Integer -> (Int, Integer)- f p = go2 0- where- go2 !m !n- | n `mod` p == 0 = go2 (m+1) (n `div` p)- | otherwise = (m, n)
− src/Data/Polynomial/Factorization/Rational.hs
@@ -1,16 +0,0 @@-{-# LANGUAGE TypeSynonymInstances, FlexibleInstances #-}-module Data.Polynomial.Factorization.Rational () where--import Data.List (foldl')-import Data.Polynomial.Base (UPolynomial)-import qualified Data.Polynomial.Base as P-import Data.Polynomial.Factorization.Integer ()-import Data.Ratio--instance P.Factor (UPolynomial Rational) where- factor 0 = [(0,1)]- factor p = [(P.constant c, 1) | c /= 1] ++ qs2- where- qs = P.factor $ P.mapCoeff numerator $ P.pp p- qs2 = [(P.mapCoeff fromInteger q, m) | (q,m) <- qs, P.deg q > 0]- c = toRational (product [(P.coeff P.mone q)^m | (q,m) <- qs, P.deg q == 0]) * P.cont p
− src/Data/Polynomial/Factorization/SquareFree.hs
@@ -1,62 +0,0 @@-{-# LANGUAGE BangPatterns, TypeSynonymInstances, FlexibleInstances #-}--------------------------------------------------------------------------------- |--- Module : Data.Polynomial.Factorization.SquareFree--- Copyright : (c) Masahiro Sakai 2013--- License : BSD-style--- --- Maintainer : masahiro.sakai@gmail.com--- Stability : provisional--- Portability : non-portable (BangPatterns, TypeSynonymInstances, FlexibleInstances)------ References:------ * <http://www.math.kobe-u.ac.jp/Asir/ca.pdf>----------------------------------------------------------------------------------module Data.Polynomial.Factorization.SquareFree- ( sqfreeChar0- ) where--import Control.Exception-import Data.Polynomial.Base (UPolynomial, X (..))-import qualified Data.Polynomial.Base as P-import Data.Ratio---- | Square-free decomposition of univariate polynomials over a field of characteristic 0.-sqfreeChar0 :: (Eq k, Fractional k) => UPolynomial k -> [(UPolynomial k, Integer)]-sqfreeChar0 0 = []-sqfreeChar0 p = assert (product [q^m | (q,m) <- result] == p) $ result- where- result = go p (p `P.div` P.gcd p (P.deriv p X)) 0 []- go p flat !m result- | P.deg flat <= 0 = [(p,1) | p /= 1] ++ reverse result- | otherwise = go p' flat' m' ((flat `P.div` flat', m') : result)- where- (p',n) = f p flat- flat' = P.gcd p' flat- m' = m + n--f :: (Eq k, Fractional k) => UPolynomial k -> UPolynomial k -> (UPolynomial k, Integer)-f p1 p2 = assert (p1 == p2 ^ m * q) $ result- where- result@(q, m) = go 0 p1- go !m p =- case p `P.divMod` p2 of- (q, 0) -> go (m+1) q- _ -> (p, m)---instance P.SQFree (UPolynomial Rational) where- sqfree = sqfreeChar0--instance P.SQFree (UPolynomial Integer) where- sqfree 0 = [(0,1)]- sqfree f = go 1 [] (P.sqfree (P.mapCoeff fromIntegral f))- where- go !u ys [] =- assert (denominator u == 1) $- [(P.constant (numerator u), 1) | u /= 1] ++ ys- go !u ys ((g,n):xs)- | P.deg g <= 0 = go (u * P.coeff P.mone g) ys xs- | otherwise = go (u * (P.cont g)^n) ((P.mapCoeff numerator (P.pp g), n) : ys) xs
− src/Data/Polynomial/Factorization/Zassenhaus.hs
@@ -1,171 +0,0 @@-{-# LANGUAGE BangPatterns, ScopedTypeVariables #-}-{-# OPTIONS_GHC -Wall #-}--------------------------------------------------------------------------------- |--- Module : Data.Polynomial.Factorization.Zassenhaus--- Copyright : (c) Masahiro Sakai 2012-2013--- License : BSD-style--- --- Maintainer : masahiro.sakai@gmail.com--- Stability : provisional--- Portability : non-portable (BangPatterns, ScopedTypeVariables)------ Factoriation of integer-coefficient polynomial using Zassenhaus algorithm.------ References:------ * <http://www.math.kobe-u.ac.jp/Asir/ca.pdf>----------------------------------------------------------------------------------module Data.Polynomial.Factorization.Zassenhaus- ( factor- ) where--import Control.Monad-import Control.Monad.ST-import Control.Exception (assert)-import Data.List-import Data.Maybe-import Data.Numbers.Primes (primes)-import Data.Ratio-import Data.STRef--import Data.Polynomial.Base (UPolynomial, X (..))-import qualified Data.Polynomial.Base as P-import Data.Polynomial.Factorization.FiniteField ()-import Data.Polynomial.Factorization.SquareFree ()-import qualified Data.Polynomial.Factorization.Hensel as Hensel--import qualified TypeLevel.Number.Nat as TL-import Data.FiniteField---- import Text.PrettyPrint.HughesPJClass--factor :: UPolynomial Integer -> [(UPolynomial Integer, Integer)]-factor f = [(h,n) | (g,n) <- P.sqfree f, h <- if P.deg g > 0 then zassenhaus g else return g]--zassenhaus :: UPolynomial Integer -> [UPolynomial Integer]-zassenhaus f = fromJust $ msum [TL.withNat zassenhausWithP p | p <- primes]- where- zassenhausWithP :: forall p. TL.Nat p => p -> Maybe [UPolynomial Integer]- zassenhausWithP _ = do- let f_mod_p :: UPolynomial (PrimeField p)- f_mod_p = P.mapCoeff fromInteger f- guard $ P.deg f == P.deg f_mod_p -- 主係数を割り切らないことと同値- guard $ P.isSquareFree f_mod_p- let fs :: [UPolynomial (PrimeField p)]- fs = [assert (n==1) fi | (fi,n) <- P.factor f_mod_p]- return $ lift f fs--{--Suppose @g@ is a factor of @f@.--From Landau-Mignotte inequality,- @sum [abs c | (c,_) <- mapCoeff ((lc f / lc g) *) $ terms g] <= 2^(deg g) * norm2 f@ holds.--This together with @deg g <= deg f@ implies- @all [- 2^(deg f) * norm2 f <= c <= 2^(deg f) * norm2 f | (c,_) <- terms ((lc f / lc g) * g)]@.--Choose smallest @k@ such that @p^k / 2 > 2^(deg f) * norm2 f@, so that- @all [- (p^k)/2 < c < (p^k)/2 | (c,_) <- terms ((lc f / lc g) * g)]@.--Then it call @search@ to look for actual factorization.--}-lift :: forall p. TL.Nat p => UPolynomial Integer -> [UPolynomial (PrimeField p)] -> [UPolynomial Integer]-lift f [_] = [f]-lift f fs = search pk f (Hensel.hensel f fs k)- where- p = TL.toInt (undefined :: p)- k, pk :: Integer- (k,pk) = head [(k,pk) | k <- [1,2..], let pk = p^k, pk^(2::Int) > (2^(P.deg f + 1))^(2::Int) * norm2sq f]--search :: Integer -> UPolynomial Integer -> [UPolynomial Integer] -> [UPolynomial Integer]-search pk f0 fs0 = runST $ do- let a = P.lc P.grlex f0- m = length fs0-- fRef <- newSTRef f0- fsRef <- newSTRef fs0- retRef <- newSTRef []-- forM_ [1 .. m `div` 2] $ \l -> do- fs <- readSTRef fsRef- forM_ (comb fs l) $ \s -> do- {-- A factor @g@ of @f@ must satisfy @(lc f / lc g) * g ≡ product s (mod p^k)@ for some @s@.- So we construct a candidate of @(lc f / lc g) * g@ from @product s@.- -}- let g0 = product s- -- @g1@ is a candidate of @(lc f / lc g) * g@- g1 :: UPolynomial Rational- g1 = P.mapCoeff conv g0- conv :: Integer -> Rational- conv b = b3- where- b1 = (a % P.lc P.grlex g0) * fromIntegral b- -- @b1 ≡ b2 (mod p^k)@ and @0 <= b2 < p^k@- b2 = b1 - (fromIntegral (floor (b1 / pk') :: Integer) * pk')- -- @b1 ≡ b2 ≡ b3 (mod p^k)@ and @-(p^k)/2 <= b3 <= (p^k)/2@- b3 = if pk'/2 < b2 then b2 - pk' else b2- pk' = fromIntegral pk-- f <- readSTRef fRef- let f1 = P.mapCoeff fromInteger f-- when (P.deg g1 > 0 && g1 `P.divides` f1) $ do- let g2 = P.mapCoeff numerator $ P.pp g1- -- we choose leading coefficient to be positive.- g :: UPolynomial Integer- g = if P.lc P.grlex g2 < 0 then - g2 else g2- writeSTRef fRef $! f `div'` g- modifySTRef retRef (g :)- modifySTRef fsRef (\\ s)-- f <- readSTRef fRef- ret <- readSTRef retRef- if f==1- then return ret- else return $ f : ret---- |f|^2-norm2sq :: Num a => UPolynomial a -> a-norm2sq f = sum [c^(2::Int) | (c,_) <- P.terms f]--div' :: UPolynomial Integer -> UPolynomial Integer -> UPolynomial Integer-div' f1 f2 = assert (and [denominator c == 1 | (c,_) <- P.terms g3]) g4- where- g1, g2 :: UPolynomial Rational- g1 = P.mapCoeff fromInteger f1- g2 = P.mapCoeff fromInteger f2- g3 = g1 `P.div` g2- g4 = P.mapCoeff numerator g3--comb :: [a] -> Int -> [[a]]-comb _ 0 = [[]]-comb [] _ = []-comb (x:xs) n = [x:ys | ys <- comb xs (n-1)] ++ comb xs n---- -----------------------------------------------------------------------------test_zassenhaus :: [UPolynomial Integer]-test_zassenhaus = zassenhaus f- where- x = P.var X- f = x^(4::Int) + 4--test_zassenhaus2 :: [UPolynomial Integer]-test_zassenhaus2 = zassenhaus f- where- x = P.var X- f = x^(9::Int) - 15*x^(6::Int) - 87*x^(3::Int) - 125--test_foo :: [(UPolynomial Integer, Integer)]-test_foo = actual- where- x :: UPolynomial Integer- x = P.var X - f = - (x^(5::Int) + x^(4::Int) + x^(2::Int) + x + 2)- actual = factor f- expected = [(-1,1), (x^(2::Int)+x+1,1), (x^(3::Int)-x+2,1)]---- ---------------------------------------------------------------------------
− src/Data/Polynomial/GroebnerBasis.hs
@@ -1,144 +0,0 @@-{-# LANGUAGE ScopedTypeVariables #-}--------------------------------------------------------------------------------- |--- Module : Data.Polynomial.GroebnerBasis--- Copyright : (c) Masahiro Sakai 2012-2013--- License : BSD-style--- --- Maintainer : masahiro.sakai@gmail.com--- Stability : provisional--- Portability : non-portable (ScopedTypeVariables)--- --- Gröbner basis------ References:------ * Monomial order <http://en.wikipedia.org/wiki/Monomial_order>--- --- * Gröbner basis <http://en.wikipedia.org/wiki/Gr%C3%B6bner_basis>------ * グレブナー基底 <http://d.hatena.ne.jp/keyword/%A5%B0%A5%EC%A5%D6%A5%CA%A1%BC%B4%F0%C4%EC>------ * Gröbner Bases and Buchberger’s Algorithm <http://math.rice.edu/~cbruun/vigre/vigreHW6.pdf>------ * Docon <http://www.haskell.org/docon/>--- --------------------------------------------------------------------------------module Data.Polynomial.GroebnerBasis- (- -- * Options- Options (..)- , Strategy (..)- , defaultOptions-- -- * Gröbner basis computation- , basis- , basis'- , spolynomial- , reduceGBasis- ) where--import qualified Data.Set as Set-import qualified Data.Heap as H -- http://hackage.haskell.org/package/heaps-import Data.Polynomial.Base (Polynomial, Monomial, MonomialOrder)-import qualified Data.Polynomial.Base as P--data Options- = Options- { optStrategy :: Strategy- }--defaultOptions :: Options-defaultOptions =- Options- { optStrategy = NormalStrategy- }--data Strategy- = NormalStrategy- | SugarStrategy -- ^ sugar strategy (not implemented yet)- deriving (Eq, Ord, Show, Read, Bounded, Enum)--spolynomial- :: (Eq k, Fractional k, Ord v)- => MonomialOrder v -> Polynomial k v -> Polynomial k v -> Polynomial k v-spolynomial cmp f g =- P.fromTerm ((1,xs) `P.tdiv` lt1) * f- - P.fromTerm ((1,xs) `P.tdiv` lt2) * g- where- xs = P.mlcm xs1 xs2- lt1@(c1, xs1) = P.lt cmp f- lt2@(c2, xs2) = P.lt cmp g--basis- :: forall k v. (Eq k, Fractional k, Ord k, Ord v)- => MonomialOrder v- -> [Polynomial k v]- -> [Polynomial k v]-basis = basis' defaultOptions--basis'- :: forall k v. (Eq k, Fractional k, Ord k, Ord v)- => Options- -> MonomialOrder v- -> [Polynomial k v]- -> [Polynomial k v]-basis' opt cmp fs =- reduceGBasis cmp $ go fs (H.fromList [item cmp fi fj | (fi,fj) <- pairs fs, checkGCD fi fj])- where- go :: [Polynomial k v] -> H.Heap (Item k v) -> [Polynomial k v]- go gs h | H.null h = gs- go gs h- | r == 0 = go gs h'- | otherwise = go (r:gs) (H.union h' (H.fromList [item cmp r g | g <- gs, checkGCD r g]))- where- Just (i, h') = H.viewMin h- fi = iFst i- fj = iSnd i- spoly = spolynomial cmp fi fj- r = P.reduce cmp spoly gs-- -- gcdが1となる組は選ばなくて良い- checkGCD fi fj = not $ P.mcoprime (P.lm cmp fi) (P.lm cmp fj)--reduceGBasis- :: forall k v. (Eq k, Ord k, Fractional k, Ord v)- => MonomialOrder v -> [Polynomial k v] -> [Polynomial k v]-reduceGBasis cmp ps = Set.toList $ Set.fromList $ go ps []- where- go [] qs = qs- go (p:ps) qs- | q == 0 = go ps qs- | otherwise = go ps (P.toMonic cmp q : qs)- where- q = P.reduce cmp p (ps++qs)--{--------------------------------------------------------------------- Item---------------------------------------------------------------------}--data Item k v- = Item- { iFst :: Polynomial k v- , iSnd :: Polynomial k v- , iCmp :: MonomialOrder v- , iLCM :: Monomial v- }--item :: (Eq k, Num k, Ord v) => MonomialOrder v -> Polynomial k v -> Polynomial k v -> Item k v-item cmp f g = Item f g cmp (P.mlcm (P.lm cmp f) (P.lm cmp g))--instance Ord v => Ord (Item k v) where- a `compare` b = iCmp a (iLCM a) (iLCM b)--instance Ord v => Eq (Item k v) where- a == b = compare a b == EQ--{--------------------------------------------------------------------- Utilities---------------------------------------------------------------------}--pairs :: [a] -> [(a,a)]-pairs [] = []-pairs (x:xs) = [(x,y) | y <- xs] ++ pairs xs
− src/Data/Polynomial/Interpolation/Lagrange.hs
@@ -1,14 +0,0 @@--- http://en.wikipedia.org/wiki/Lagrange_polynomial-module Data.Polynomial.Interpolation.Lagrange- ( interpolate- ) where--import Data.Polynomial (UPolynomial, X (..))-import qualified Data.Polynomial as P--interpolate :: (Eq k, Fractional k) => [(k,k)] -> UPolynomial k-interpolate zs = sum $ do- (xj,yj) <- zs- let lj x = product [P.constant (1 / (xj - xm)) * (x - P.constant xm) | (xm,_) <- zs, xj /= xm]- let x = P.var X- return $ P.constant yj * lj x
− src/Data/Polynomial/RootSeparation/Graeffe.hs
@@ -1,76 +0,0 @@--------------------------------------------------------------------------------- |--- Module : Data.Polynomial.RootSeparation.Graeffe--- Copyright : (c) Masahiro Sakai 2012--- License : BSD-style--- --- Maintainer : masahiro.sakai@gmail.com--- Stability : provisional--- Portability : portable--- --- Graeffe's Method------ Reference:--- --- * <http://mathworld.wolfram.com/GraeffesMethod.html>--- --- * <http://en.wikipedia.org/wiki/Graeffe's_method>--- --------------------------------------------------------------------------------module Data.Polynomial.RootSeparation.Graeffe- ( NthRoot (..)- , graeffesMethod- ) where--import Control.Exception-import qualified Data.IntMap as IM-import Data.Polynomial (UPolynomial, X (..))-import qualified Data.Polynomial as P--data NthRoot = NthRoot !Integer !Rational- deriving (Show)--graeffesMethod :: UPolynomial Rational -> Int -> [NthRoot]-graeffesMethod p v = xs !! (v - 1)- where- xs = map (uncurry g) $ zip [1..] (tail $ iterate f $ P.toMonic P.grlex p)-- n = P.deg p-- g :: Int -> UPolynomial Rational -> [NthRoot]- g v p = do- i <- [1::Int .. fromInteger n]- let yi = if i == 1 then - (b i) else - (b i / b (i-1))- return $ NthRoot (2 ^ fromIntegral v) yi- where- bs = IM.fromList [(fromInteger i, b) | (b,ys) <- P.terms p, let i = n - P.deg ys, i /= 0]- b i = IM.findWithDefault 0 i bs--f :: UPolynomial Rational -> UPolynomial Rational-f p = (-1) ^ (P.deg p) *- P.fromTerms [ (c, assert (P.deg xs `mod` 2 == 0) (P.var X `P.mpow` (P.deg xs `div` 2)))- | (c, xs) <- P.terms (p * P.subst p (\X -> - P.var X)) ]--f' :: UPolynomial Rational -> UPolynomial Rational-f' p = P.fromTerms [(b k, P.var X `P.mpow` (n - k)) | k <- [0..n]]- where- n = P.deg p-- a :: Integer -> Rational- a k- | n >= k = P.coeff (P.var X `P.mpow` (n - k)) p- | otherwise = 0-- b :: Integer -> Rational- b k = (-1)^k * (a k)^2 + 2 * sum [(-1)^j * (a j) * (a (2*k-j)) | j <- [0..k-1]]--test v = graeffesMethod p v- where- x = P.var X- p = x^2 - 2--test2 v = graeffesMethod p v- where- x = P.var X- p = x^5 - 3*x - 1
− src/Data/Polynomial/RootSeparation/Sturm.hs
@@ -1,167 +0,0 @@--------------------------------------------------------------------------------- |--- Module : Data.Polynomial.RootSeparation.Sturm--- Copyright : (c) Masahiro Sakai 2012--- License : BSD-style--- --- Maintainer : masahiro.sakai@gmail.com--- Stability : provisional--- Portability : portable--- --- Reference:--- --- * \"/Sturm's theorem/.\" Wikipedia, The Free Encyclopedia. Wikimedia Foundation, Inc.--- 2012-06-23. <http://en.wikipedia.org/wiki/Sturm%27s_theorem>--- --- * Weisstein, Eric W. \"/Sturm Function/.\" From MathWorld--A Wolfram Web Resource.--- <http://mathworld.wolfram.com/SturmFunction.html>--- --------------------------------------------------------------------------------module Data.Polynomial.RootSeparation.Sturm- ( SturmChain- , sturmChain- , numRoots- , numRoots'- , separate- , separate'- , halve- , halve'- , narrow- , narrow'- , approx- , approx'- ) where--import Data.Maybe-import Data.Polynomial (UPolynomial, X (..))-import qualified Data.Polynomial as P-import qualified Data.Interval as Interval-import Data.Interval (Interval, EndPoint (..), (<..<=), (<=..<=))---- | Sturm's chain (Sturm's sequence)-type SturmChain = [UPolynomial Rational]---- | Sturm's sequence of a polynomial-sturmChain :: UPolynomial Rational -> SturmChain-sturmChain p = p0 : p1 : go p0 p1- where- p0 = p- p1 = P.deriv p P.X- go p q = if r==0 then [] else r : go q r- where- r = - (p `P.mod` q)---- | The number of distinct real roots of @p@ in a given interval-numRoots- :: UPolynomial Rational- -> Interval Rational- -> Int-numRoots p ival = numRoots' (sturmChain p) ival---- | The number of distinct real roots of @p@ in a given interval.--- This function takes @p@'s sturm chain instead of @p@ itself.-numRoots'- :: SturmChain- -> Interval Rational- -> Int-numRoots' chain@(p:_) ival- | Interval.null ival2 = 0- | otherwise =- case (Interval.lowerBound ival2, Interval.upperBound ival2) of- (Finite lb, Finite ub) ->- (if lb==ub then 0 else (n lb - n ub)) +- (if lb `Interval.member` ival2 && lb `P.isRootOf` p then 1 else 0) +- (if ub `Interval.notMember` ival2 && ub `P.isRootOf` p then -1 else 0)- _ -> error "numRoots'': should not happen"- where- ival2 = boundInterval p ival- n x = countSignChanges [P.eval (\X -> x) q | q <- chain]--countSignChanges :: [Rational] -> Int-countSignChanges rs = countChanges xs- where- xs :: [Bool]- xs = map (0<) . filter (0/=) $ rs--countChanges :: Eq a => [a] -> Int-countChanges [] = 0-countChanges (x:xs) = go x xs 0- where- go x [] r = r- go x1 (x2:xs) r- | x1==x2 = go x1 xs r- | otherwise = go x2 xs (r+1)---- | Closed interval that contains all real roots of a given polynomial.--- 根の限界--- <http://aozoragakuen.sakura.ne.jp/taiwa/taiwaNch02/node26.html>-bounds :: UPolynomial Rational -> (Rational, Rational)-bounds p = (-m, m)- where- m = if p==0- then 0- else max 1 (sum [abs (c/s) | (c,_) <- P.terms p] - 1)- s = P.lc P.grlex p--boundInterval :: UPolynomial Rational -> Interval Rational -> Interval Rational-boundInterval p ival = Interval.intersection ival (Finite lb <=..<= Finite ub)- where- (lb,ub) = bounds p---- | Disjoint intervals each of which contains exactly one real roots of the given polynoimal @p@.--- The intervals can be further narrowed by 'narrow' or 'narrow''.-separate :: UPolynomial Rational -> [Interval Rational]-separate p = separate' (sturmChain p)---- | Disjoint intervals each of which contains exactly one real roots of the given polynoimal @p@.--- The intervals can be further narrowed by 'narrow' or 'narrow''.--- This function takes @p@'s sturm chain instead of @p@ itself.-separate' :: SturmChain -> [Interval Rational]-separate' chain@(p:_) = f (bounds p)- where- n x = countSignChanges [P.eval (\X -> x) q | q <- chain]-- f (lb,ub) =- if lb `P.isRootOf` p- then Interval.singleton lb : g (lb,ub)- else g (lb,ub)- - g (lb,ub) =- case n lb - n ub of- 0 -> []- 1 -> [Finite lb <..<= Finite ub]- _ -> g (lb, mid) ++ g (mid, ub)- where- mid = (lb + ub) / 2--halve :: UPolynomial Rational -> Interval Rational -> Interval Rational-halve p ival = halve' (sturmChain p) ival--halve' :: SturmChain -> Interval Rational -> Interval Rational-halve' chain@(p:_) ival- | Interval.width ival == 0 = ival- | numRoots' chain ivalL > 0 = ivalL- | otherwise = ivalR -- numRoots' chain ivalR > 0- where- Finite lb = Interval.lowerBound ival- Finite ub = Interval.upperBound ival- mid = (lb + ub) / 2- ivalL = Interval.interval (Interval.lowerBound' ival) (Finite mid, True)- ivalR = Interval.interval (Finite mid, False) (Interval.upperBound' ival)--narrow :: UPolynomial Rational -> Interval Rational -> Rational -> Interval Rational-narrow p ival size = narrow' (sturmChain p) ival size--narrow' :: SturmChain -> Interval Rational -> Rational -> Interval Rational-narrow' chain@(p:_) ival size = go (boundInterval p ival)- where- go ival- | Interval.width ival < size = ival- | otherwise = go (halve' chain ival)--approx :: UPolynomial Rational -> Interval Rational -> Rational -> Rational-approx p = approx' (sturmChain p)--approx' :: SturmChain -> Interval Rational -> Rational -> Rational-approx' chain ival epsilon = fromJust $ Interval.pickup $ narrow' chain ival epsilon
− src/Data/SeqQueue.hs
@@ -1,67 +0,0 @@-{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses #-}--------------------------------------------------------------------------------- |--- Module : Data.SeqQueue--- Copyright : (c) Masahiro Sakai 2012--- License : BSD-style--- --- Maintainer : masahiro.sakai@gmail.com--- Stability : provisional--- Portability : non-portable (FlexibleInstances, MultiParamTypeClasses)------ Queue implemented using IORef and Sequence.--- -------------------------------------------------------------------------------module Data.SeqQueue- (- -- * SeqQueue type- SeqQueue-- -- * Constructors- , NewFifo (..)-- -- * Operators - , Enqueue (..)- , Dequeue (..)- , QueueSize (..)- , clear- ) where--import Data.IORef-import Data.Queue-import Data.Foldable-import qualified Data.Sequence as Seq--newtype SeqQueue a = SeqQueue (IORef (Seq.Seq a))--instance NewFifo (SeqQueue a) IO where- newFifo = do- ref <- newIORef Seq.empty- return (SeqQueue ref)--instance Enqueue (SeqQueue a) IO a where- enqueue (SeqQueue ref) val = do- modifyIORef ref (Seq.|> val)--instance Dequeue (SeqQueue a) IO a where- dequeue (SeqQueue ref) = do- s <- readIORef ref- case Seq.viewl s of- Seq.EmptyL -> return Nothing- val Seq.:< s' -> do- writeIORef ref s'- return (Just val)-- dequeueBatch (SeqQueue ref) = do- s <- readIORef ref- writeIORef ref Seq.empty- return (toList s)--instance QueueSize (SeqQueue a) IO where- queueSize (SeqQueue ref) = do- s <- readIORef ref- return $! Seq.length s--clear :: SeqQueue a -> IO ()-clear (SeqQueue ref) = do- writeIORef ref Seq.empty
− src/Data/Sign.hs
@@ -1,141 +0,0 @@-{-# LANGUAGE FlexibleInstances, DeriveDataTypeable, CPP #-}--------------------------------------------------------------------------------- |--- Module : Data.Sign--- Copyright : (c) Masahiro Sakai 2013--- License : BSD-style--- --- Maintainer : masahiro.sakai@gmail.com--- Stability : provisional--- Portability : non-portable (FlexibleInstances, DeriveDataTypeable, CPP)------ Algebra of Signs.----------------------------------------------------------------------------------module Data.Sign- (- -- * Algebra of Sign- Sign (..)- , negate- , mult- , recip- , div- , pow- , signOf- , symbol- ) where--import Prelude hiding (negate, recip, div)-import Algebra.Enumerable (Enumerable (..), universeBounded) -- from lattices package-import qualified Algebra.Lattice as L -- from lattices package-import Control.DeepSeq-import Data.Hashable-import Data.Set (Set)-import qualified Data.Set as Set-import Data.Typeable-import Data.Data-import qualified Numeric.Algebra as Alg--data Sign = Neg | Zero | Pos- deriving (Eq, Ord, Show, Read, Enum, Bounded, Typeable, Data)--instance NFData Sign--instance Hashable Sign where hashWithSalt = hashUsing fromEnum--instance Enumerable Sign where- universe = universeBounded--instance Alg.Multiplicative Sign where- (*) = mult- pow1p s n = pow s (1+n)--instance Alg.Commutative Sign--instance Alg.Unital Sign where- one = Pos- pow = pow--instance Alg.Division Sign where- recip = recip- (/) = div- (\\) = flip div- (^) = pow--negate :: Sign -> Sign-negate Neg = Pos-negate Zero = Zero-negate Pos = Neg--mult :: Sign -> Sign -> Sign-mult Pos s = s-mult s Pos = s-mult Neg s = negate s-mult s Neg = negate s-mult _ _ = Zero--recip :: Sign -> Sign-recip Pos = Pos-recip Zero = error "Data.Sign.recip: division by Zero"-recip Neg = Neg--div :: Sign -> Sign -> Sign-div s Pos = s-div _ Zero = error "Data.Sign.div: division by Zero"-div s Neg = negate s--pow :: Integral x => Sign -> x -> Sign-pow _ 0 = Pos-pow Pos _ = Pos-pow Zero _ = Zero-pow Neg n = if even n then Pos else Neg--signOf :: Real a => a -> Sign-signOf r =- case r `compare` 0 of- LT -> Neg- EQ -> Zero- GT -> Pos--symbol :: Sign -> String-symbol Pos = "+"-symbol Neg = "-"-symbol Zero = "0"--instance L.MeetSemiLattice (Set Sign) where- meet = Set.intersection--instance L.Lattice (Set Sign)--instance L.BoundedMeetSemiLattice (Set Sign) where- top = Set.fromList universe--instance L.BoundedLattice (Set Sign)--#if !MIN_VERSION_hashable(1,2,0)--- Copied from hashable-1.2.0.7:--- Copyright : (c) Milan Straka 2010--- (c) Johan Tibell 2011--- (c) Bryan O'Sullivan 2011, 2012---- | Transform a value into a 'Hashable' value, then hash the--- transformed value using the given salt.------ This is a useful shorthand in cases where a type can easily be--- mapped to another type that is already an instance of 'Hashable'.--- Example:------ > data Foo = Foo | Bar--- > deriving (Enum)--- >--- > instance Hashable Foo where--- > hashWithSalt = hashUsing fromEnum-hashUsing :: (Hashable b) =>- (a -> b) -- ^ Transformation function.- -> Int -- ^ Salt.- -> a -- ^ Value to transform.- -> Int-hashUsing f salt x = hashWithSalt salt (f x)-{-# INLINE hashUsing #-}-#endif-
− src/Data/Var.hs
@@ -1,46 +0,0 @@--------------------------------------------------------------------------------- |--- Module : Data.Var--- Copyright : (c) Masahiro Sakai 2011-2013--- License : BSD-style--- --- Maintainer : masahiro.sakai@gmail.com--- Stability : provisional--- Portability : portable--- -------------------------------------------------------------------------------module Data.Var- ( Var- , VarSet- , VarMap- , Variables (..)- , Model- ) where--import Data.IntMap (IntMap)-import Data.IntSet (IntSet)-import qualified Data.IntSet as IntSet-import Data.Ratio---- ------------------------------------------------------------------------------- | Variables are represented as non-negative integers-type Var = Int---- | Set of variables-type VarSet = IntSet---- | Map from variables-type VarMap = IntMap---- | collecting free variables-class Variables a where- vars :: a -> VarSet--instance Variables a => Variables [a] where- vars = IntSet.unions . map vars---- | A @Model@ is a map from variables to values.-type Model r = VarMap r---- ---------------------------------------------------------------------------
− src/SAT.hs
@@ -1,2428 +0,0 @@-{-# OPTIONS_GHC -Wall -fno-warn-unused-do-bind #-}-{-# LANGUAGE BangPatterns, ScopedTypeVariables, CPP, DeriveDataTypeable #-}-#if __GLASGOW_HASKELL__ < 706-{-# LANGUAGE DoRec #-}-#else-{-# LANGUAGE RecursiveDo #-}-#endif--------------------------------------------------------------------------------- |--- Module : SAT--- Copyright : (c) Masahiro Sakai 2012--- License : BSD-style--- --- Maintainer : masahiro.sakai@gmail.com--- Stability : provisional--- Portability : non-portable (BangPatterns, RecursiveDo, ScopedTypeVariables, CPP, DeriveDataTypeable)------ A CDCL SAT solver.------ It follows the design of MiniSat and SAT4J.------ See also:------ * <http://hackage.haskell.org/package/funsat>------ * <http://hackage.haskell.org/package/incremental-sat-solver>----------------------------------------------------------------------------------module SAT- (- -- * The @Solver@ type- Solver- , newSolver-- -- * Basic data structures- , Var- , Lit- , literal- , litNot- , litVar- , litPolarity- , Clause-- -- * Problem specification- , newVar- , newVars- , newVars_- , addClause- , addAtLeast- , addAtMost- , addExactly- , addPBAtLeast- , addPBAtMost- , addPBExactly- , addPBAtLeastSoft- , addPBAtMostSoft- , addPBExactlySoft-- -- * Solving- , solve- , solveWith- , BudgetExceeded (..)-- -- * Extract results- , Model- , model- , failedAssumptions-- -- * Solver configulation- , RestartStrategy (..)- , setRestartStrategy- , defaultRestartStrategy- , setRestartFirst- , defaultRestartFirst- , setRestartInc- , defaultRestartInc- , setLearntSizeFirst- , defaultLearntSizeFirst- , setLearntSizeInc- , defaultLearntSizeInc- , setCCMin- , defaultCCMin- , LearningStrategy (..)- , setLearningStrategy- , defaultLearningStrategy- , setVarPolarity- , setLogger- , setCheckModel- , setRandomFreq- , defaultRandomFreq- , setRandomSeed- , setConfBudget-- -- * Read state- , nVars- , nAssigns- , nClauses- , nLearnt-- -- * Internal API- , varBumpActivity- , varDecayActivity- ) where--import Prelude hiding (log)-import Control.Monad-import Control.Exception-#if MIN_VERSION_array(0,4,0)-import Data.Array.IO hiding (unsafeFreeze)-import Data.Array.Unsafe (unsafeFreeze)-#else-import Data.Array.IO-#endif-import Data.Array.Base (unsafeRead, unsafeWrite)-import Data.IORef-import Data.List-import Data.Maybe-import Data.Ord-import qualified Data.IntMap as IM-import qualified Data.IntSet as IS-import qualified Data.Set as Set-import qualified Data.IndexedPriorityQueue as PQ-import qualified Data.SeqQueue as SQ-import Data.Time-import Data.Typeable-import System.CPUTime-import qualified System.Random as Rand-import Text.Printf--import Data.LBool-import SAT.Types--{--------------------------------------------------------------------- internal data structures---------------------------------------------------------------------}--type Level = Int--levelRoot :: Level-levelRoot = -1--data Assignment- = Assignment- { aValue :: !Bool- , aLevel :: {-# UNPACK #-} !Level- , aReason :: !(Maybe SomeConstraint)- , aBacktrackCBs :: !(IORef [IO ()])- }--data VarData- = VarData- { vdAssignment :: !(IORef (Maybe Assignment))- , vdPolarity :: !(IORef Bool)- , vdPosLitData :: !LitData- , vdNegLitData :: !LitData- , vdActivity :: !(IORef VarActivity)- }--newtype LitData- = LitData- { -- | will be invoked when this literal is falsified- ldWatches :: IORef [SomeConstraint]- }--newVarData :: IO VarData-newVarData = do- ainfo <- newIORef Nothing- polarity <- newIORef True- pos <- newLitData- neg <- newLitData- activity <- newIORef 0- return $ VarData ainfo polarity pos neg activity--newLitData :: IO LitData-newLitData = do- ws <- newIORef []- return $ LitData ws--varData :: Solver -> Var -> IO VarData-varData s !v = do- a <- readIORef (svVarData s)- unsafeRead a (v-1)--litData :: Solver -> Lit -> IO LitData-litData s !l =- -- litVar による heap allocation を避けるために、- -- litPolarityによる分岐後にvarDataを呼ぶ。- if litPolarity l- then do- vd <- varData s l- return $ vdPosLitData vd- else do- vd <- varData s (negate l)- return $ vdNegLitData vd--{-# INLINE varValue #-}-varValue :: Solver -> Var -> IO LBool-varValue s !v = do- vd <- varData s v- m <- readIORef (vdAssignment vd)- case m of- Nothing -> return lUndef- Just x -> return $! (liftBool $! aValue x)--{-# INLINE litValue #-}-litValue :: Solver -> Lit -> IO LBool-litValue s !l = do- -- litVar による heap allocation を避けるために、- -- litPolarityによる分岐後にvarDataを呼ぶ。- if litPolarity l- then varValue s l- else do- m <- varValue s (negate l)- return $! lnot m--varLevel :: Solver -> Var -> IO Level-varLevel s !v = do- vd <- varData s v- m <- readIORef (vdAssignment vd)- case m of- Nothing -> error ("varLevel: unassigned var " ++ show v)- Just a -> return (aLevel a)--litLevel :: Solver -> Lit -> IO Level-litLevel s l = varLevel s (litVar l)--varReason :: Solver -> Var -> IO (Maybe SomeConstraint)-varReason s !v = do- vd <- varData s v- m <- readIORef (vdAssignment vd)- case m of- Nothing -> error ("varReason: unassigned var " ++ show v)- Just a -> return (aReason a)---- | Solver instance-data Solver- = Solver- { svOk :: !(IORef Bool)- , svVarQueue :: !PQ.PriorityQueue- , svTrail :: !(IORef [Lit])- , svVarCounter :: !(IORef Int)- , svVarData :: !(IORef (IOArray Int VarData))- , svClauseDB :: !(IORef [SomeConstraint])- , svLearntDB :: !(IORef (Int,[SomeConstraint]))- , svAssumptions :: !(IORef (IOUArray Int Lit))- , svLevel :: !(IORef Level)- , svBCPQueue :: !(SQ.SeqQueue Lit)- , svModel :: !(IORef (Maybe Model))- , svNDecision :: !(IORef Int)- , svNRandomDecision :: !(IORef Int)- , svNConflict :: !(IORef Int)- , svNRestart :: !(IORef Int)- , svNAssigns :: !(IORef Int)- , svNFixed :: !(IORef Int)- , svNLearntGC :: !(IORef Int)- , svNRemovedConstr :: !(IORef Int)-- -- | Inverse of the variable activity decay factor. (default 1 / 0.95)- , svVarDecay :: !(IORef Double)-- -- | Amount to bump next variable with.- , svVarInc :: !(IORef Double)-- -- | Inverse of the clause activity decay factor. (1 / 0.999)- , svClaDecay :: !(IORef Double)-- -- | Amount to bump next clause with.- , svClaInc :: !(IORef Double)-- , svRestartStrategy :: !(IORef RestartStrategy)-- -- | The initial restart limit. (default 100)- , svRestartFirst :: !(IORef Int)-- -- | The factor with which the restart limit is multiplied in each restart. (default 1.5)- , svRestartInc :: !(IORef Double)-- -- | The initial limit for learnt clauses.- , svLearntSizeFirst :: !(IORef Int)-- -- | The limit for learnt clauses is multiplied with this factor periodically. (default 1.1)- , svLearntSizeInc :: !(IORef Double)-- , svLearntLim :: !(IORef Int)- , svLearntLimAdjCnt :: !(IORef Int)- , svLearntLimSeq :: !(IORef [(Int,Int)])-- -- | Controls conflict clause minimization (0=none, 1=local, 2=recursive)- , svCCMin :: !(IORef Int)-- , svLearningStrategy :: !(IORef LearningStrategy)-- , svLogger :: !(IORef (Maybe (String -> IO ())))- , svStartWC :: !(IORef UTCTime)- , svLastStatWC :: !(IORef UTCTime)-- , svCheckModel :: !(IORef Bool)-- , svRandomFreq :: !(IORef Double)- , svRandomGen :: !(IORef Rand.StdGen)-- , svFailedAssumptions :: !(IORef [Lit])-- , svConfBudget :: !(IORef Int)- }--markBad :: Solver -> IO ()-markBad solver = writeIORef (svOk solver) False--bcpEnqueue :: Solver -> Lit -> IO ()-bcpEnqueue solver l = SQ.enqueue (svBCPQueue solver) l--bcpDequeue :: Solver -> IO (Maybe Lit)-bcpDequeue solver = SQ.dequeue (svBCPQueue solver)--assignBy :: Constraint c => Solver -> Lit -> c -> IO Bool-assignBy solver lit c = assign_ solver lit (Just (toConstraint c))--assign :: Solver -> Lit -> IO Bool-assign solver lit = assign_ solver lit Nothing--assign_ :: Solver -> Lit -> Maybe SomeConstraint -> IO Bool-assign_ solver !lit reason = assert (validLit lit) $ do- vd <- varData solver (litVar lit)- m <- readIORef (vdAssignment vd)- case m of- Just a -> return $ litPolarity lit == aValue a- Nothing -> do- lv <- readIORef (svLevel solver)- bt <- newIORef []-- writeIORef (vdAssignment vd) $ Just $- Assignment- { aValue = litPolarity lit- , aLevel = lv- , aReason = reason- , aBacktrackCBs = bt- }-- modifyIORef (svTrail solver) (lit:)- modifyIORef' (svNAssigns solver) (+1)- when (lv == levelRoot) $ modifyIORef' (svNFixed solver) (+1)- bcpEnqueue solver lit-- when debugMode $ logIO solver $ do- let r = case reason of- Nothing -> ""- Just _ -> " by propagation"- return $ printf "assign(level=%d): %d%s" lv lit r-- return True--unassign :: Solver -> Var -> IO ()-unassign solver !v = assert (validVar v) $ do- vd <- varData solver v- m <- readIORef (vdAssignment vd)- case m of- Nothing -> error "unassign: should not happen"- Just a -> do- writeIORef (vdPolarity vd) (aValue a)- readIORef (aBacktrackCBs a) >>= sequence_- writeIORef (vdAssignment vd) Nothing- modifyIORef' (svNAssigns solver) (subtract 1)- PQ.enqueue (svVarQueue solver) v--addBacktrackCB :: Solver -> Var -> IO () -> IO ()-addBacktrackCB solver !v callback = do- vd <- varData solver v- m <- readIORef (vdAssignment vd)- case m of- Nothing -> error "addBacktrackCB: should not happen"- Just a -> modifyIORef (aBacktrackCBs a) (callback :)---- | Register the constraint to be notified when the literal becames false.-watch :: Constraint c => Solver -> Lit -> c -> IO ()-watch solver !lit c = do- when debugMode $ do- lits <- watchedLiterals solver c- unless (lit `elem` lits) $ error "watch: should not happen"- ld <- litData solver lit- modifyIORef (ldWatches ld) (toConstraint c : )---- | Returns list of constraints that are watching the literal.-watches :: Solver -> Lit -> IO [SomeConstraint]-watches solver !lit = do- ld <- litData solver lit- readIORef (ldWatches ld)--addToDB :: Constraint c => Solver -> c -> IO ()-addToDB solver c = do- modifyIORef (svClauseDB solver) (toConstraint c : )- when debugMode $ logIO solver $ do- str <- showConstraint solver c- return $ printf "constraint %s is added" str- sanityCheck solver--addToLearntDB :: Constraint c => Solver -> c -> IO ()-addToLearntDB solver c = do- modifyIORef (svLearntDB solver) $ \(n,xs) -> (n+1, toConstraint c : xs)- when debugMode $ logIO solver $ do- str <- showConstraint solver c- return $ printf "constraint %s is added" str- sanityCheck solver--reduceDB :: Solver -> IO ()-reduceDB solver = do- (_,cs) <- readIORef (svLearntDB solver)-- xs <- forM cs $ \c -> do- p <- constrIsProtected solver c- actval <- constrActivity solver c- return (c, (p, actval))-- -- Note that False <= True- let ys = sortBy (comparing snd) xs- (zs,ws) = splitAt (length ys `div` 2) ys-- let loop [] ret = return ret- loop ((c,(isShort,_)) : rest) ret = do- flag <- if isShort- then return True- else isLocked solver c- if flag- then loop rest (c:ret)- else do- detach solver c- loop rest ret- zs2 <- loop zs []-- let cs2 = zs2 ++ map fst ws- n2 = length cs2-- -- log solver $ printf "learnt constraints deletion: %d -> %d" n n2- writeIORef (svLearntDB solver) (n2,cs2)--type VarActivity = Double--varActivity :: Solver -> Var -> IO VarActivity-varActivity solver !v = do- vd <- varData solver v- readIORef (vdActivity vd)--varDecayActivity :: Solver -> IO ()-varDecayActivity solver = do- d <- readIORef (svVarDecay solver)- modifyIORef' (svVarInc solver) (d*)--varBumpActivity :: Solver -> Var -> IO ()-varBumpActivity solver !v = do- inc <- readIORef (svVarInc solver)- vd <- varData solver v- modifyIORef' (vdActivity vd) (+inc)- PQ.update (svVarQueue solver) v- aval <- readIORef (vdActivity vd)- when (aval > 1e20) $- -- Rescale- varRescaleAllActivity solver--varRescaleAllActivity :: Solver -> IO ()-varRescaleAllActivity solver = do- vs <- variables solver- forM_ vs $ \v -> do- vd <- varData solver v- modifyIORef' (vdActivity vd) (* 1e-20)- modifyIORef' (svVarInc solver) (* 1e-20)--variables :: Solver -> IO [Var]-variables solver = do- n <- nVars solver- return [1 .. n]---- | number of variables of the problem.-nVars :: Solver -> IO Int-nVars solver = do- vcnt <- readIORef (svVarCounter solver)- return $! (vcnt-1)---- | number of assigned variables.-nAssigns :: Solver -> IO Int-nAssigns solver = readIORef (svNAssigns solver)---- | number of clauses.-nClauses :: Solver -> IO Int-nClauses solver = do- xs <- readIORef (svClauseDB solver)- return $ length xs---- | number of learnt constrints.-nLearnt :: Solver -> IO Int-nLearnt solver = do- (n,_) <- readIORef (svLearntDB solver)- return n--learntConstraints :: Solver -> IO [SomeConstraint]-learntConstraints solver = do- (_,cs) <- readIORef (svLearntDB solver)- return cs--{--------------------------------------------------------------------- Solver---------------------------------------------------------------------}---- | Create a new Solver instance.-newSolver :: IO Solver-newSolver = do- rec- ok <- newIORef True- vcnt <- newIORef 1- trail <- newIORef []- vars <- newIORef =<< newArray_ (1,0)- vqueue <- PQ.newPriorityQueueBy (ltVar solver)- db <- newIORef []- db2 <- newIORef (0,[])- as <- newIORef =<< newArray_ (0,-1)- lv <- newIORef levelRoot- q <- SQ.newFifo- m <- newIORef Nothing- ndecision <- newIORef 0- nranddec <- newIORef 0- nconflict <- newIORef 0- nrestart <- newIORef 0- nassigns <- newIORef 0- nfixed <- newIORef 0- nlearntgc <- newIORef 0- nremoved <- newIORef 0-- claDecay <- newIORef (1 / 0.999)- claInc <- newIORef 1- varDecay <- newIORef (1 / 0.95)- varInc <- newIORef 1- restartStrat <- newIORef defaultRestartStrategy- restartFirst <- newIORef defaultRestartFirst- restartInc <- newIORef defaultRestartInc- learning <- newIORef defaultLearningStrategy- learntSizeFirst <- newIORef defaultLearntSizeFirst- learntSizeInc <- newIORef defaultLearntSizeInc- ccMin <- newIORef defaultCCMin- checkModel <- newIORef False-- learntLim <- newIORef undefined- learntLimAdjCnt <- newIORef (-1)- learntLimSeq <- newIORef undefined-- logger <- newIORef Nothing- startWC <- newIORef undefined- lastStatWC <- newIORef undefined-- randfreq <- newIORef defaultRandomFreq- randgen <- newIORef =<< Rand.newStdGen-- failed <- newIORef []-- confBudget <- newIORef (-1)-- let solver =- Solver- { svOk = ok- , svVarCounter = vcnt- , svVarQueue = vqueue- , svTrail = trail- , svVarData = vars- , svClauseDB = db- , svLearntDB = db2- , svAssumptions = as- , svLevel = lv- , svBCPQueue = q- , svModel = m- , svNDecision = ndecision- , svNRandomDecision = nranddec- , svNConflict = nconflict- , svNRestart = nrestart- , svNAssigns = nassigns- , svNFixed = nfixed- , svNLearntGC = nlearntgc- , svNRemovedConstr = nremoved- , svVarDecay = varDecay- , svVarInc = varInc- , svClaDecay = claDecay- , svClaInc = claInc- , svRestartStrategy = restartStrat- , svRestartFirst = restartFirst- , svRestartInc = restartInc- , svLearningStrategy = learning- , svLearntSizeFirst = learntSizeFirst- , svLearntSizeInc = learntSizeInc- , svCCMin = ccMin- , svLearntLim = learntLim- , svLearntLimAdjCnt = learntLimAdjCnt- , svLearntLimSeq = learntLimSeq- , svLogger = logger- , svStartWC = startWC- , svLastStatWC = lastStatWC- , svCheckModel = checkModel- , svRandomFreq = randfreq- , svRandomGen = randgen- , svFailedAssumptions = failed- , svConfBudget = confBudget- }- return solver--ltVar :: Solver -> Var -> Var -> IO Bool-ltVar solver v1 v2 = do- a1 <- varActivity solver v1- a2 <- varActivity solver v2- return $! a1 > a2--{--------------------------------------------------------------------- Problem specification---------------------------------------------------------------------}---- |Add a new variable-newVar :: Solver -> IO Var-newVar s = do- v <- readIORef (svVarCounter s)- writeIORef (svVarCounter s) (v+1)- vd <- newVarData-- a <- readIORef (svVarData s)- (_,ub) <- getBounds a- if v <= ub- then writeArray a v vd- else do- let ub' = max 2 (ub * 3 `div` 2)- a' <- newArray_ (1,ub')- forM_ [1..ub] $ \v2 -> do- vd2 <- readArray a v2- writeArray a' v2 vd2- writeArray a' v vd- writeIORef (svVarData s) a'-- PQ.enqueue (svVarQueue s) v- return v---- |Add variables. @newVars solver n = replicateM n (newVar solver)@-newVars :: Solver -> Int -> IO [Var]-newVars s n = replicateM n (newVar s)---- |Add variables. @newVars_ solver n >> return () = newVars_ solver n@-newVars_ :: Solver -> Int -> IO ()-newVars_ s n = replicateM_ n (newVar s)---- |Add a clause to the solver.-addClause :: Solver -> Clause -> IO ()-addClause solver lits = do- d <- readIORef (svLevel solver)- assert (d == levelRoot) $ return ()-- lits2 <- instantiateClause solver lits- case normalizeClause =<< lits2 of- Nothing -> return ()- Just [] -> markBad solver- Just [lit] -> do- ret <- assign solver lit- assert ret $ return ()- ret2 <- deduce solver- case ret2 of- Nothing -> return ()- Just _ -> markBad solver- Just lits3 -> do- clause <- newClauseData lits3 False- attach solver clause- addToDB solver clause---- | Add a cardinality constraints /atleast({l1,l2,..},n)/.-addAtLeast :: Solver -- ^ The 'Solver' argument.- -> [Lit] -- ^ set of literals /{l1,l2,..}/ (duplicated elements are ignored)- -> Int -- ^ /n/.- -> IO ()-addAtLeast solver lits n = do- d <- readIORef (svLevel solver)- assert (d == levelRoot) $ return ()-- (lits',n') <- liftM normalizeAtLeast $ instantiateAtLeast solver (lits,n)- let len = length lits'-- if n' <= 0 then return ()- else if n' > len then markBad solver- else if n' == 1 then addClause solver lits'- else if n' == len then do- forM_ lits' $ \l -> do- ret <- assign solver l- assert ret $ return ()- ret2 <- deduce solver- case ret2 of- Nothing -> return ()- Just _ -> markBad solver- else do- c <- newAtLeastData lits' n' False- attach solver c- addToDB solver c---- | Add a cardinality constraints /atmost({l1,l2,..},n)/.-addAtMost :: Solver -- ^ The 'Solver' argument- -> [Lit] -- ^ set of literals /{l1,l2,..}/ (duplicated elements are ignored)- -> Int -- ^ /n/- -> IO ()-addAtMost solver lits n = addAtLeast solver lits' (len-n)- where- len = length lits- lits' = map litNot lits---- | Add a cardinality constraints /exactly({l1,l2,..},n)/.-addExactly :: Solver -- ^ The 'Solver' argument- -> [Lit] -- ^ set of literals /{l1,l2,..}/ (duplicated elements are ignored)- -> Int -- ^ /n/- -> IO ()-addExactly solver lits n = do- addAtLeast solver lits n- addAtMost solver lits n---- | Add a pseudo boolean constraints /c1*l1 + c2*l2 + … ≥ n/.-addPBAtLeast :: Solver -- ^ The 'Solver' argument.- -> [(Integer,Lit)] -- ^ set of terms @[(c1,l1),(c2,l2),…]@- -> Integer -- ^ /n/- -> IO ()-addPBAtLeast solver ts n = do- d <- readIORef (svLevel solver)- assert (d == levelRoot) $ return ()-- (ts',degree) <- liftM normalizePBAtLeast $ instantiatePB solver (ts,n)- let cs = map fst ts'- slack = sum cs - degree-- if degree <= 0 then return ()- else if slack < 0 then markBad solver- else if Set.size (Set.fromList cs) == 1 then do- let c = head cs- addAtLeast solver (map snd ts') (fromInteger ((degree+c-1) `div` c))- else do- c <- newPBAtLeastData ts' degree False- attach solver c- addToDB solver c- ret <- pbPropagate solver c- if not ret- then do- markBad solver- else do- ret2 <- deduce solver- case ret2 of- Nothing -> return ()- Just _ -> markBad solver---- | Add a pseudo boolean constraints /c1*l1 + c2*l2 + … ≤ n/.-addPBAtMost :: Solver -- ^ The 'Solver' argument.- -> [(Integer,Lit)] -- ^ list of @[(c1,l1),(c2,l2),…]@- -> Integer -- ^ /n/- -> IO ()-addPBAtMost solver ts n = addPBAtLeast solver [(-c,l) | (c,l) <- ts] (negate n)---- | Add a pseudo boolean constraints /c1*l1 + c2*l2 + … = n/.-addPBExactly :: Solver -- ^ The 'Solver' argument.- -> [(Integer,Lit)] -- ^ list of terms @[(c1,l1),(c2,l2),…]@- -> Integer -- ^ /n/- -> IO ()-addPBExactly solver ts n = do- (ts2,n2) <- liftM normalizePBExactly $ instantiatePB solver (ts,n)- addPBAtLeast solver ts2 n2- addPBAtMost solver ts2 n2---- | Add a soft pseudo boolean constraints /lit ⇒ c1*l1 + c2*l2 + … ≥ n/.-addPBAtLeastSoft- :: Solver -- ^ The 'Solver' argument.- -> Lit -- ^ indicator @lit@- -> [(Integer,Lit)] -- ^ set of terms @[(c1,l1),(c2,l2),…]@- -> Integer -- ^ /n/- -> IO ()-addPBAtLeastSoft solver sel lhs rhs = do- (lhs', rhs') <- liftM normalizePBAtLeast $ instantiatePB solver (lhs,rhs)- addPBAtLeast solver ((rhs', litNot sel) : lhs') rhs'---- | Add a soft pseudo boolean constraints /lit ⇒ c1*l1 + c2*l2 + … ≤ n/.-addPBAtMostSoft- :: Solver -- ^ The 'Solver' argument.- -> Lit -- ^ indicator @lit@- -> [(Integer,Lit)] -- ^ set of terms @[(c1,l1),(c2,l2),…]@- -> Integer -- ^ /n/- -> IO ()-addPBAtMostSoft solver sel lhs rhs =- addPBAtLeastSoft solver sel [(negate c, lit) | (c,lit) <- lhs] (negate rhs)---- | Add a soft pseudo boolean constraints /lit ⇒ c1*l1 + c2*l2 + … = n/.-addPBExactlySoft- :: Solver -- ^ The 'Solver' argument.- -> Lit -- ^ indicator @lit@- -> [(Integer,Lit)] -- ^ set of terms @[(c1,l1),(c2,l2),…]@- -> Integer -- ^ /n/- -> IO ()-addPBExactlySoft solver sel lhs rhs = do- (lhs2, rhs2) <- liftM normalizePBExactly $ instantiatePB solver (lhs,rhs)- addPBAtLeastSoft solver sel lhs2 rhs2- addPBAtMostSoft solver sel lhs2 rhs2--{--------------------------------------------------------------------- Problem solving---------------------------------------------------------------------}---- | Solve constraints.--- Returns 'True' if the problem is SATISFIABLE.--- Returns 'False' if the problem is UNSATISFIABLE.-solve :: Solver -> IO Bool-solve solver = do- as <- newArray_ (0,-1)- writeIORef (svAssumptions solver) as- solve_ solver---- | Solve constraints under assuptions.--- Returns 'True' if the problem is SATISFIABLE.--- Returns 'False' if the problem is UNSATISFIABLE.-solveWith :: Solver- -> [Lit] -- ^ Assumptions- -> IO Bool-solveWith solver ls = do- as <- newListArray (0, length ls -1) ls- writeIORef (svAssumptions solver) as- solve_ solver--solve_ :: Solver -> IO Bool-solve_ solver = do- log solver "Solving starts ..."- resetStat solver- writeIORef (svModel solver) Nothing- writeIORef (svFailedAssumptions solver) []-- ok <- readIORef (svOk solver)- if not ok- then return False- else do- when debugMode $ dumpVarActivity solver- d <- readIORef (svLevel solver)- assert (d == levelRoot) $ return ()-- restartStrategy <- readIORef (svRestartStrategy solver)- restartFirst <- readIORef (svRestartFirst solver)- restartInc <- readIORef (svRestartInc solver)- let restartSeq = mkRestartSeq restartStrategy restartFirst restartInc-- let learntSizeAdj = do- (size,adj) <- shift (svLearntLimSeq solver)- writeIORef (svLearntLim solver) size- writeIORef (svLearntLimAdjCnt solver) adj- onConflict = do- cnt <- readIORef (svLearntLimAdjCnt solver)- if (cnt==0)- then learntSizeAdj- else writeIORef (svLearntLimAdjCnt solver) $! cnt-1-- cnt <- readIORef (svLearntLimAdjCnt solver)- when (cnt == -1) $ do- learntSizeFirst <- readIORef (svLearntSizeFirst solver)- learntSizeInc <- readIORef (svLearntSizeInc solver)- nc <- nClauses solver- nv <- nVars solver- let initialLearntLim = if learntSizeFirst > 0 then learntSizeFirst else max ((nc + nv) `div` 3) 16- learntSizeSeq = iterate (ceiling . (learntSizeInc*) . fromIntegral) initialLearntLim- learntSizeAdjSeq = iterate (\x -> (x * 3) `div` 2) (100::Int)- writeIORef (svLearntLimSeq solver) (zip learntSizeSeq learntSizeAdjSeq)- learntSizeAdj-- let loop [] = error "solve_: should not happen"- loop (conflict_lim:rs) = do- printStat solver True- ret <- search solver conflict_lim onConflict- case ret of- SRFinished x -> return $ Just x- SRBudgetExceeded -> return Nothing- SRRestart -> do- modifyIORef' (svNRestart solver) (+1)- backtrackTo solver levelRoot- loop rs-- printStatHeader solver-- startCPU <- getCPUTime- startWC <- getCurrentTime- writeIORef (svStartWC solver) startWC- result <- loop restartSeq- endCPU <- getCPUTime- endWC <- getCurrentTime-- when (result == Just True) $ do- checkModel <- readIORef (svCheckModel solver)- when checkModel $ checkSatisfied solver- constructModel solver-- backtrackTo solver levelRoot-- when debugMode $ dumpVarActivity solver- when debugMode $ dumpClaActivity solver- printStat solver True- (log solver . printf "#cpu_time = %.3fs") (fromIntegral (endCPU - startCPU) / 10^(12::Int) :: Double)- (log solver . printf "#wall_clock_time = %.3fs") (realToFrac (endWC `diffUTCTime` startWC) :: Double)- (log solver . printf "#decision = %d") =<< readIORef (svNDecision solver)- (log solver . printf "#random_decision = %d") =<< readIORef (svNRandomDecision solver)- (log solver . printf "#conflict = %d") =<< readIORef (svNConflict solver)- (log solver . printf "#restart = %d") =<< readIORef (svNRestart solver)-- case result of- Just x -> return x- Nothing -> throw BudgetExceeded--data BudgetExceeded = BudgetExceeded- deriving (Show, Typeable)--instance Exception BudgetExceeded--data SearchResult- = SRFinished Bool- | SRRestart- | SRBudgetExceeded--search :: Solver -> Int -> IO () -> IO SearchResult-search solver !conflict_lim onConflict = loop 0- where- loop :: Int -> IO SearchResult- loop !c = do- sanityCheck solver- conflict <- deduce solver- sanityCheck solver-- case conflict of- Nothing -> do- lv <- readIORef (svLevel solver)- when (lv == levelRoot) $ simplify solver-- n <- nLearnt solver- m <- nAssigns solver- learnt_lim <- readIORef (svLearntLim solver)- when (learnt_lim >= 0 && n - m > learnt_lim) $ do- modifyIORef' (svNLearntGC solver) (+1)- reduceDB solver-- r <- pickAssumption- case r of- Nothing -> return (SRFinished False)- Just lit- | lit /= litUndef -> decide solver lit >> loop c- | otherwise -> do- lit2 <- pickBranchLit solver- if lit2 == litUndef- then return (SRFinished True)- else decide solver lit2 >> loop c-- Just constr -> do- varDecayActivity solver- constrDecayActivity solver- onConflict-- modifyIORef' (svNConflict solver) (+1)- d <- readIORef (svLevel solver)-- when debugMode $ logIO solver $ do- str <- showConstraint solver constr- return $ printf "conflict(level=%d): %s" d str-- when (c `mod` 100 == 0) $ do- printStat solver False-- modifyIORef' (svConfBudget solver) $ \confBudget ->- if confBudget > 0 then confBudget - 1 else confBudget- confBudget <- readIORef (svConfBudget solver)-- if d == levelRoot- then markBad solver >> return (SRFinished False)- else if confBudget==0 then- return SRBudgetExceeded- else if conflict_lim >= 0 && c+1 >= conflict_lim then- return SRRestart- else do- b <- handleConflict constr- if b- then loop (c+1)- else markBad solver >> return (SRFinished False)-- pickAssumption :: IO (Maybe Lit)- pickAssumption = do- !as <- readIORef (svAssumptions solver)- !b <- getBounds as- let go = do- d <- readIORef (svLevel solver)- if not (inRange b (d+1))- then return (Just litUndef)- else do- l <- readArray as (d+1)- val <- litValue solver l- if val == lTrue then do- -- dummy decision level- modifyIORef' (svLevel solver) (+1)- go- else if val == lFalse then do- -- conflict with assumption- core <- analyzeFinal solver l- writeIORef (svFailedAssumptions solver) core- return Nothing- else- return (Just l)- go-- handleConflict :: SomeConstraint -> IO Bool- handleConflict constr = do- strat <- readIORef (svLearningStrategy solver)- case strat of- LearningClause -> do- (learntClause, level) <- analyzeConflict solver constr- backtrackTo solver level- case learntClause of- [] -> error "search(LearningClause): should not happen"- [lit] -> do- ret <- assign solver lit- assert ret $ return ()- return ()- lit:_ -> do- cl <- newClauseData learntClause True- attach solver cl- addToLearntDB solver cl- assignBy solver lit cl- constrBumpActivity solver cl- return True- LearningHybrid -> do- (learntClause, level, pb) <- analyzeConflictHybrid solver constr- level2 <- pbBacktrackLevel solver pb- let level3 = min level level2-- pbdata <- newPBAtLeastData (fst pb) (snd pb) True- attach solver pbdata- addToLearntDB solver pbdata-- backtrackTo solver level3- slack <- readIORef (pbSlack pbdata)- if slack < 0- then do- if level3 == levelRoot- then return False- else handleConflict (toConstraint pbdata)- else do- case learntClause of- [] -> error "search(LearningHybrid): should not happen"- [lit] -> do- ret <- assign solver lit- assert ret $ return ()- return ()- lit:_ -> do- cl <- newClauseData learntClause True- attach solver cl- addToLearntDB solver cl- when (level3 == level) $ do- assignBy solver lit cl- constrBumpActivity solver cl- pbPropagate solver pbdata- return True---- | After 'solve' returns True, it returns the model.-model :: Solver -> IO Model-model solver = do- m <- readIORef (svModel solver)- return (fromJust m)---- | After 'solveWith' returns False, it returns a set of assumptions--- that leads to contradiction. In particular, if it returns an empty--- set, the problem is unsatisiable without any assumptions.-failedAssumptions :: Solver -> IO [Lit]-failedAssumptions solver = readIORef (svFailedAssumptions solver)---- | Simplify the clause database according to the current top-level assigment.-simplify :: Solver -> IO ()-simplify solver = do- let loop [] rs !n = return (rs,n)- loop (y:ys) rs !n = do- b1 <- isSatisfied solver y- b2 <- isLocked solver y- if b1 && not b2- then do- detach solver y- loop ys rs (n+1)- else loop ys (y:rs) n-- -- simplify original constraint DB- do- xs <- readIORef (svClauseDB solver)- (ys,n) <- loop xs [] (0::Int)- modifyIORef' (svNRemovedConstr solver) (+n)- writeIORef (svClauseDB solver) ys-- -- simplify learnt constraint DB- do- (m,xs) <- readIORef (svLearntDB solver)- (ys,n) <- loop xs [] (0::Int)- writeIORef (svLearntDB solver) (m-n, ys)--{--------------------------------------------------------------------- Parameter settings.---------------------------------------------------------------------}--setRestartStrategy :: Solver -> RestartStrategy -> IO ()-setRestartStrategy solver s = writeIORef (svRestartStrategy solver) s---- | default value for @RestartStrategy@.-defaultRestartStrategy :: RestartStrategy-defaultRestartStrategy = MiniSATRestarts---- | The initial restart limit. (default 100)--- Negative value is used to disable restart.-setRestartFirst :: Solver -> Int -> IO ()-setRestartFirst solver !n = writeIORef (svRestartFirst solver) n---- | default value for @RestartFirst@.-defaultRestartFirst :: Int-defaultRestartFirst = 100---- | The factor with which the restart limit is multiplied in each restart. (default 1.5)-setRestartInc :: Solver -> Double -> IO ()-setRestartInc solver !r = writeIORef (svRestartInc solver) r---- | default value for @RestartInc@.-defaultRestartInc :: Double-defaultRestartInc = 1.5--data LearningStrategy- = LearningClause- | LearningHybrid--setLearningStrategy :: Solver -> LearningStrategy -> IO ()-setLearningStrategy solver l = writeIORef (svLearningStrategy solver) $! l--defaultLearningStrategy :: LearningStrategy-defaultLearningStrategy = LearningClause---- | The initial limit for learnt clauses.-setLearntSizeFirst :: Solver -> Int -> IO ()-setLearntSizeFirst solver !x = writeIORef (svLearntSizeFirst solver) x---- | default value for @LearntSizeFirst@.-defaultLearntSizeFirst :: Int-defaultLearntSizeFirst = -1---- | The limit for learnt clauses is multiplied with this factor each restart. (default 1.1)-setLearntSizeInc :: Solver -> Double -> IO ()-setLearntSizeInc solver !r = writeIORef (svLearntSizeInc solver) r---- | default value for @LearntSizeInc@.-defaultLearntSizeInc :: Double-defaultLearntSizeInc = 1.1---- | The limit for learnt clauses is multiplied with this factor each restart. (default 1.1)-setCCMin :: Solver -> Int -> IO ()-setCCMin solver !v = writeIORef (svCCMin solver) v---- | default value for @CCMin@.-defaultCCMin :: Int-defaultCCMin = 2---- | The default polarity of a variable.-setVarPolarity :: Solver -> Var -> Bool -> IO ()-setVarPolarity solver v val = do- vd <- varData solver v- writeIORef (vdPolarity vd) val--setCheckModel :: Solver -> Bool -> IO ()-setCheckModel solver flag = do- writeIORef (svCheckModel solver) flag---- | The frequency with which the decision heuristic tries to choose a random variable-setRandomFreq :: Solver -> Double -> IO ()-setRandomFreq solver r = do- writeIORef (svRandomFreq solver) r--defaultRandomFreq :: Double-defaultRandomFreq = 0.005---- | Used by the random variable selection-setRandomSeed :: Solver -> Int -> IO ()-setRandomSeed solver seed = do- writeIORef (svRandomGen solver) (Rand.mkStdGen seed)--setConfBudget :: Solver -> Maybe Int -> IO ()-setConfBudget solver (Just b) | b >= 0 = writeIORef (svConfBudget solver) b-setConfBudget solver _ = writeIORef (svConfBudget solver) (-1)--{--------------------------------------------------------------------- API for implementation of @solve@---------------------------------------------------------------------}--pickBranchLit :: Solver -> IO Lit-pickBranchLit !solver = do- let vqueue = svVarQueue solver-- -- Random decision- let withRandGen :: (Rand.StdGen -> (a, Rand.StdGen)) -> IO a- withRandGen f = do- randgen <- readIORef (svRandomGen solver)- let (r, randgen') = f randgen- writeIORef (svRandomGen solver) randgen'- return r- !randfreq <- readIORef (svRandomFreq solver)- !size <- PQ.queueSize vqueue- !r <- withRandGen Rand.random- var <-- if (r < randfreq && size >= 2)- then do- a <- PQ.getHeapArray vqueue- i <- withRandGen $ Rand.randomR (0, size-1)- var <- readArray a i- val <- varValue solver var- if val == lUndef- then do- modifyIORef' (svNRandomDecision solver) (1+)- return var- else return litUndef- else- return litUndef-- -- Activity based decision- let loop :: IO Var- loop = do- m <- PQ.dequeue vqueue- case m of- Nothing -> return litUndef- Just var2 -> do- val2 <- varValue solver var2- if val2 /= lUndef- then loop- else return var2- var2 <-- if var==litUndef- then loop- else return var-- if var2==litUndef- then return litUndef- else do- vd <- varData solver var2- -- TODO: random polarity- p <- readIORef (vdPolarity vd)- return $! literal var2 p--decide :: Solver -> Lit -> IO ()-decide solver !lit = do- modifyIORef' (svNDecision solver) (+1)- modifyIORef' (svLevel solver) (+1)- when debugMode $ do- val <- litValue solver lit- when (val /= lUndef) $ error "decide: should not happen"- assign solver lit- return ()--deduce :: Solver -> IO (Maybe SomeConstraint)-deduce solver = loop- where- loop :: IO (Maybe SomeConstraint)- loop = do- r <- bcpDequeue solver- case r of- Nothing -> return Nothing- Just lit -> do- ret <- processLit lit- case ret of- Just _ -> return ret- Nothing -> loop-- processLit :: Lit -> IO (Maybe SomeConstraint)- processLit !lit = do- let lit2 = litNot lit- ld <- litData solver lit2- let wsref = ldWatches ld- let loop2 [] = return Nothing- loop2 (w:ws) = do- ok <- propagate solver w lit2- if ok- then loop2 ws- else do- modifyIORef wsref (++ws)- return (Just w)- ws <- readIORef wsref- writeIORef wsref []- loop2 ws--analyzeConflict :: Constraint c => Solver -> c -> IO (Clause, Level)-analyzeConflict solver constr = do- d <- readIORef (svLevel solver)-- let split :: [Lit] -> IO (LitSet, LitSet)- split = go (IS.empty, IS.empty)- where- go (xs,ys) [] = return (xs,ys)- go (xs,ys) (l:ls) = do- lv <- litLevel solver l- if lv == levelRoot then- go (xs,ys) ls- else if lv >= d then- go (IS.insert l xs, ys) ls- else- go (xs, IS.insert l ys) ls-- let loop :: LitSet -> LitSet -> IO LitSet- loop lits1 lits2- | sz==1 = do- return $ lits1 `IS.union` lits2- | sz>=2 = do- ret <- popTrail solver- case ret of- Nothing -> do- error $ printf "analyzeConflict: should not happen: empty trail: loop %s %s"- (show lits1) (show lits2)- Just l -> do- if litNot l `IS.notMember` lits1- then do- unassign solver (litVar l)- loop lits1 lits2- else do- m <- varReason solver (litVar l)- case m of- Nothing -> error "analyzeConflict: should not happen"- Just constr2 -> do- constrBumpActivity solver constr2- xs <- reasonOf solver constr2 (Just l)- forM_ xs $ \lit -> varBumpActivity solver (litVar lit)- unassign solver (litVar l)- (ys,zs) <- split xs- loop (IS.delete (litNot l) lits1 `IS.union` ys)- (lits2 `IS.union` zs)- | otherwise = error "analyzeConflict: should not happen: reason of current level is empty"- where- sz = IS.size lits1-- constrBumpActivity solver constr- conflictClause <- reasonOf solver constr Nothing- forM_ conflictClause $ \lit -> varBumpActivity solver (litVar lit)- (ys,zs) <- split conflictClause- lits <- loop ys zs-- lits2 <- minimizeConflictClause solver lits-- xs <- liftM (sortBy (flip (comparing snd))) $- forM (IS.toList lits2) $ \l -> do- lv <- litLevel solver l- return (l,lv)-- let level = case xs of- [] -> error "analyzeConflict: should not happen"- [_] -> levelRoot- _:(_,lv):_ -> lv- return (map fst xs, level)---- { p } ∪ { pにfalseを割り当てる原因のassumption }-analyzeFinal :: Solver -> Lit -> IO [Lit]-analyzeFinal solver p = do- lits <- readIORef (svTrail solver)- let go :: [Lit] -> VarSet -> [Lit] -> IO [Lit]- go [] _ result = return result- go (l:ls) seen result = do- lv <- litLevel solver l- if lv == levelRoot then- return result- else if litVar l `IS.member` seen then do- r <- varReason solver (litVar l)- case r of- Nothing -> do- let seen' = IS.delete (litVar l) seen- go ls seen' (l : result)- Just constr -> do- c <- reasonOf solver constr (Just l)- let seen' = IS.delete (litVar l) seen `IS.union` IS.fromList [litVar l2 | l2 <- c]- go ls seen' result- else- go ls seen result- go lits (IS.singleton (litVar p)) [p]--analyzeConflictHybrid :: Constraint c => Solver -> c -> IO (Clause, Level, ([(Integer,Lit)], Integer))-analyzeConflictHybrid solver constr = do- d <- readIORef (svLevel solver)-- let split :: [Lit] -> IO (LitSet, LitSet)- split = go (IS.empty, IS.empty)- where- go (xs,ys) [] = return (xs,ys)- go (xs,ys) (l:ls) = do- lv <- litLevel solver l- if lv == levelRoot then- go (xs,ys) ls- else if lv >= d then- go (IS.insert l xs, ys) ls- else- go (xs, IS.insert l ys) ls-- let loop :: LitSet -> LitSet -> ([(Integer,Lit)],Integer) -> IO (LitSet, ([(Integer,Lit)],Integer))- loop lits1 lits2 pb- | sz==1 = do- return $ (lits1 `IS.union` lits2, pb)- | sz>=2 = do- ret <- popTrail solver- case ret of- Nothing -> do- error $ printf "analyzeConflictHybrid: should not happen: empty trail: loop %s %s"- (show lits1) (show lits2)- Just l -> do- m <- varReason solver (litVar l)- case m of- Nothing -> error "analyzeConflictHybrid: should not happen"- Just constr2 -> do- xs <- reasonOf solver constr2 (Just l)- (lits1',lits2') <-- if litNot l `IS.notMember` lits1- then return (lits1,lits2)- else do- constrBumpActivity solver constr2- forM_ xs $ \lit -> varBumpActivity solver (litVar lit)- (ys,zs) <- split xs- return (IS.delete (litNot l) lits1 `IS.union` ys, lits2 `IS.union` zs)-- pb2 <- toPBAtLeast solver constr2- o <- pbOverSAT solver pb2- let pb3 = if o then ([(1,l2) | l2 <- l:xs],1) else pb2- let pb' =- if any (\(_,l2) -> litNot l == l2) (fst pb)- then cutResolve pb pb3 (litVar l)- else pb-- unassign solver (litVar l)- loop lits1' lits2' pb'-- | otherwise = error "analyzeConflictHybrid: should not happen: reason of current level is empty"- where- sz = IS.size lits1-- constrBumpActivity solver constr- conflictClause <- reasonOf solver constr Nothing- pbConfl <- toPBAtLeast solver constr- forM_ conflictClause $ \lit -> varBumpActivity solver (litVar lit)- (ys,zs) <- split conflictClause- (lits, pb) <- loop ys zs pbConfl-- lits2 <- minimizeConflictClause solver lits-- xs <- liftM (sortBy (flip (comparing snd))) $- forM (IS.toList lits2) $ \l -> do- lv <- litLevel solver l- return (l,lv)-- let level = case xs of- [] -> error "analyzeConflict: should not happen"- [_] -> levelRoot- _:(_,lv):_ -> lv- return (map fst xs, level, pb)--pbBacktrackLevel :: Solver -> ([(Integer,Lit)],Integer) -> IO Level-pbBacktrackLevel _ ([], rhs) = assert (rhs > 0) $ return levelRoot-pbBacktrackLevel solver (lhs, rhs) = do- let go lvs lhs' s = - case IS.minView lvs of- Nothing -> error "pbBacktrackLevel: should not happen"- Just (lv2, lvs2) -> do- let s2 = s - sum [c | (c,_,lv3) <- lhs', Just lv2 == lv3]- lhs2 = [x | x@(_,_,lv3) <- lhs', Just lv2 /= lv3]- if s2 < 0 then- return lv2 -- conflict- else if takeWhile (\(c,_,_) -> c > s) lhs2 /= [] then- return lv2 --unit- else- go lvs2 lhs2 s2-- lhs' <- forM (sortBy (flip (comparing fst)) lhs) $ \(c, lit) -> do- v <- litValue solver lit- if v /= lFalse- then return (c, lit, Nothing)- else do- lv <- litLevel solver lit- return (c, lit, Just lv)-- let lvs = IS.fromList [lv | (_,_,Just lv) <- lhs']- s0 = sum [c | (c,_) <- lhs] - rhs- go lvs lhs' s0--minimizeConflictClause :: Solver -> LitSet -> IO LitSet-minimizeConflictClause solver lits = do- ccmin <- readIORef (svCCMin solver)- if ccmin >= 2 then- minimizeConflictClauseRecursive solver lits- else if ccmin >= 1 then- minimizeConflictClauseLocal solver lits- else- return lits--minimizeConflictClauseLocal :: Solver -> LitSet -> IO LitSet-minimizeConflictClauseLocal solver lits = do- let xs = IS.toAscList lits- ys <- filterM (liftM not . isRedundant) xs- when debugMode $ do- log solver "minimizeConflictClauseLocal:"- log solver $ show xs- log solver $ show ys- return $ IS.fromAscList $ ys-- where- isRedundant :: Lit -> IO Bool- isRedundant lit = do- c <- varReason solver (litVar lit)- case c of- Nothing -> return False- Just c2 -> do- ls <- reasonOf solver c2 (Just (litNot lit))- allM test ls-- test :: Lit -> IO Bool- test lit = do- lv <- litLevel solver lit- return $ lv == levelRoot || lit `IS.member` lits--minimizeConflictClauseRecursive :: Solver -> LitSet -> IO LitSet-minimizeConflictClauseRecursive solver lits = do- let- isRedundant :: Lit -> IO Bool- isRedundant lit = do- c <- varReason solver (litVar lit)- case c of- Nothing -> return False- Just c2 -> do- ls <- reasonOf solver c2 (Just (litNot lit))- go ls IS.empty-- go :: [Lit] -> IS.IntSet -> IO Bool- go [] _ = return True- go (lit : ls) seen = do- lv <- litLevel solver lit- if lv == levelRoot || lit `IS.member` lits || lit `IS.member` seen- then go ls seen- else do- c <- varReason solver (litVar lit)- case c of- Nothing -> return False- Just c2 -> do- ls2 <- reasonOf solver c2 (Just (litNot lit))- go (ls2 ++ ls) (IS.insert lit seen)-- let xs = IS.toAscList lits- ys <- filterM (liftM not . isRedundant) xs- when debugMode $ do- log solver "minimizeConflictClauseRecursive:"- log solver $ show xs- log solver $ show ys- return $ IS.fromAscList $ ys--popTrail :: Solver -> IO (Maybe Lit)-popTrail solver = do- m <- readIORef (svTrail solver)- case m of- [] -> return Nothing- l:ls -> do- writeIORef (svTrail solver) ls- return $ Just l---- | Revert to the state at given level--- (keeping all assignment at @level@ but not beyond).-backtrackTo :: Solver -> Int -> IO ()-backtrackTo solver level = do- when debugMode $ log solver $ printf "backtrackTo: %d" level- writeIORef (svTrail solver) =<< loop =<< readIORef (svTrail solver)- SQ.clear (svBCPQueue solver)- writeIORef (svLevel solver) level- where- loop :: [Lit] -> IO [Lit]- loop [] = return []- loop lls@(l:ls) = do- lv <- litLevel solver l- if lv <= level- then return lls- else unassign solver (litVar l) >> loop ls--constructModel :: Solver -> IO ()-constructModel solver = do- n <- nVars solver- (marr::IOUArray Var Bool) <- newArray_ (1,n)- forM_ [1..n] $ \v -> do- vd <- varData solver v- a <- readIORef (vdAssignment vd)- writeArray marr v (aValue (fromJust a))- m <- unsafeFreeze marr- writeIORef (svModel solver) (Just m)--constrDecayActivity :: Solver -> IO ()-constrDecayActivity solver = do- d <- readIORef (svClaDecay solver)- modifyIORef' (svClaInc solver) (d*)--constrRescaleAllActivity :: Solver -> IO ()-constrRescaleAllActivity solver = do- xs <- learntConstraints solver- forM_ xs $ \c -> constrRescaleActivity solver c- modifyIORef' (svClaInc solver) (* 1e-20)--resetStat :: Solver -> IO ()-resetStat solver = do- writeIORef (svNDecision solver) 0- writeIORef (svNRandomDecision solver) 0- writeIORef (svNConflict solver) 0- writeIORef (svNRestart solver) 0- writeIORef (svNLearntGC solver) 0--printStatHeader :: Solver -> IO ()-printStatHeader solver = do- log solver $ "============================[ Search Statistics ]============================"- log solver $ " Time | Restart | Decision | Conflict | LEARNT | Fixed | Removed "- log solver $ " | | | | Limit GC | Var | Constra "- log solver $ "============================================================================="--printStat :: Solver -> Bool -> IO ()-printStat solver force = do- nowWC <- getCurrentTime- b <- if force- then return True- else do- lastWC <- readIORef (svLastStatWC solver)- return $ (nowWC `diffUTCTime` lastWC) > 1- when b $ do- startWC <- readIORef (svStartWC solver)- let tm = showTimeDiff $ nowWC `diffUTCTime` startWC- restart <- readIORef (svNRestart solver)- dec <- readIORef (svNDecision solver)- conflict <- readIORef (svNConflict solver)- learntLim <- readIORef (svLearntLim solver)- learntGC <- readIORef (svNLearntGC solver)- fixed <- readIORef (svNFixed solver)- removed <- readIORef (svNRemovedConstr solver)- log solver $ printf "%s | %7d | %8d | %8d | %8d %6d | %8d | %8d"- tm restart dec conflict learntLim learntGC fixed removed- writeIORef (svLastStatWC solver) nowWC--showTimeDiff :: NominalDiffTime -> String-showTimeDiff sec- | si < 100 = printf "%4.1fs" (fromRational s :: Double)- | si <= 9999 = printf "%4ds" si- | mi < 100 = printf "%4.1fm" (fromRational m :: Double)- | mi <= 9999 = printf "%4dm" mi- | hi < 100 = printf "%4.1fs" (fromRational h :: Double)- | otherwise = printf "%4dh" hi- where- s :: Rational- s = realToFrac sec-- si :: Integer- si = round s-- m :: Rational- m = s / 60-- mi :: Integer- mi = round m-- h :: Rational- h = m / 60-- hi :: Integer- hi = round h--{--------------------------------------------------------------------- constraint implementation---------------------------------------------------------------------}--class Constraint a where- toConstraint :: a -> SomeConstraint-- showConstraint :: Solver -> a -> IO String-- attach :: Solver -> a -> IO ()-- watchedLiterals :: Solver -> a -> IO [Lit]-- -- | invoked with the watched literal when the literal is falsified.- -- 'watch' で 'toConstraint' を呼び出して heap allocation が発生するのを- -- 避けるために、元の 'SomeConstraint' も渡しておく。- basicPropagate :: Solver -> SomeConstraint -> a -> Lit -> IO Bool-- -- | deduce a clause C∨l from the constraint and return C.- -- C and l should be false and true respectively under the current- -- assignment.- basicReasonOf :: Solver -> a -> Maybe Lit -> IO Clause-- toPBAtLeast :: Solver -> a -> IO ([(Integer,Lit)], Integer)-- isSatisfied :: Solver -> a -> IO Bool-- constrIsProtected :: Solver -> a -> IO Bool- constrIsProtected _ _ = return False-- constrActivity :: Solver -> a -> IO Double-- constrBumpActivity :: Solver -> a -> IO ()- constrBumpActivity _ _ = return ()-- constrRescaleActivity :: Solver -> a -> IO ()- constrRescaleActivity _ _ = return ()--detach :: Constraint a => Solver -> a -> IO ()-detach solver c = do- let c2 = toConstraint c- lits <- watchedLiterals solver c- forM_ lits $ \lit -> do- ld <- litData solver lit- modifyIORef' (ldWatches ld) (delete c2)---- | invoked with the watched literal when the literal is falsified.-propagate :: Solver -> SomeConstraint -> Lit -> IO Bool-propagate solver c l = basicPropagate solver c c l---- | deduce a clause C∨l from the constraint and return C.--- C and l should be false and true respectively under the current--- assignment.-reasonOf :: Constraint a => Solver -> a -> Maybe Lit -> IO Clause-reasonOf solver c x = do- when debugMode $- case x of- Nothing -> return ()- Just lit -> do- val <- litValue solver lit- unless (lTrue == val) $ do- str <- showConstraint solver c- error (printf "reasonOf: value of literal %d should be True but %s (basicReasonOf %s %s)" lit (show val) str (show x))- cl <- basicReasonOf solver c x- when debugMode $ do- forM_ cl $ \lit -> do- val <- litValue solver lit- unless (lFalse == val) $ do- str <- showConstraint solver c- error (printf "reasonOf: value of literal %d should be False but %s (basicReasonOf %s %s)" lit (show val) str (show x))- return cl--isLocked :: Solver -> SomeConstraint -> IO Bool-isLocked solver c = anyM p =<< watchedLiterals solver c- where- p :: Lit -> IO Bool- p lit = do- val <- litValue solver lit- if val /= lTrue- then return False- else do- m <- varReason solver (litVar lit)- case m of- Nothing -> return False- Just c2 -> return $! c == c2--data SomeConstraint- = ConstrClause !ClauseData- | ConstrAtLeast !AtLeastData- | ConstrPBAtLeast !PBAtLeastData- deriving Eq--instance Constraint SomeConstraint where- toConstraint = id-- showConstraint s (ConstrClause c) = showConstraint s c- showConstraint s (ConstrAtLeast c) = showConstraint s c- showConstraint s (ConstrPBAtLeast c) = showConstraint s c-- attach s (ConstrClause c) = attach s c- attach s (ConstrAtLeast c) = attach s c- attach s (ConstrPBAtLeast c) = attach s c-- watchedLiterals s (ConstrClause c) = watchedLiterals s c- watchedLiterals s (ConstrAtLeast c) = watchedLiterals s c- watchedLiterals s (ConstrPBAtLeast c) = watchedLiterals s c-- basicPropagate s this (ConstrClause c) lit = basicPropagate s this c lit- basicPropagate s this (ConstrAtLeast c) lit = basicPropagate s this c lit- basicPropagate s this (ConstrPBAtLeast c) lit = basicPropagate s this c lit-- basicReasonOf s (ConstrClause c) l = basicReasonOf s c l- basicReasonOf s (ConstrAtLeast c) l = basicReasonOf s c l- basicReasonOf s (ConstrPBAtLeast c) l = basicReasonOf s c l-- toPBAtLeast s (ConstrClause c) = toPBAtLeast s c- toPBAtLeast s (ConstrAtLeast c) = toPBAtLeast s c- toPBAtLeast s (ConstrPBAtLeast c) = toPBAtLeast s c-- isSatisfied s (ConstrClause c) = isSatisfied s c- isSatisfied s (ConstrAtLeast c) = isSatisfied s c- isSatisfied s (ConstrPBAtLeast c) = isSatisfied s c-- constrIsProtected s (ConstrClause c) = constrIsProtected s c- constrIsProtected s (ConstrAtLeast c) = constrIsProtected s c- constrIsProtected s (ConstrPBAtLeast c) = constrIsProtected s c-- constrActivity s (ConstrClause c) = constrActivity s c- constrActivity s (ConstrAtLeast c) = constrActivity s c- constrActivity s (ConstrPBAtLeast c) = constrActivity s c-- constrBumpActivity s (ConstrClause c) = constrBumpActivity s c- constrBumpActivity s (ConstrAtLeast c) = constrBumpActivity s c- constrBumpActivity s (ConstrPBAtLeast c) = constrBumpActivity s c-- constrRescaleActivity s (ConstrClause c) = constrRescaleActivity s c- constrRescaleActivity s (ConstrAtLeast c) = constrRescaleActivity s c- constrRescaleActivity s (ConstrPBAtLeast c) = constrRescaleActivity s c--{--------------------------------------------------------------------- Clause---------------------------------------------------------------------}--data ClauseData- = ClauseData- { claLits :: !(IOUArray Int Lit)- , claActivity :: !(IORef Double)- }--instance Eq ClauseData where- c1 == c2 = claActivity c1 == claActivity c2--newClauseData :: Clause -> Bool -> IO ClauseData-newClauseData ls learnt = do- let size = length ls- a <- newListArray (0, size-1) ls- act <- newIORef $! (if learnt then 0 else -1)- return (ClauseData a act)--instance Constraint ClauseData where- toConstraint = ConstrClause-- showConstraint _ this = do- lits <- getElems (claLits this)- return (show lits)-- attach solver this = do- lits <- getElems (claLits this)- case lits of- l1:l2:_ -> do- watch solver l1 this- watch solver l2 this- _ -> return ()-- watchedLiterals _ this = do- lits <- getElems (claLits this)- case lits of- l1:l2:_ -> return [l1, l2]- _ -> return []-- basicPropagate !s this this2 !falsifiedLit = do- preprocess-- !lit0 <- unsafeRead a 0- !val0 <- litValue s lit0- if val0 == lTrue- then do- watch s falsifiedLit this- return True- else do- (!lb,!ub) <- getBounds a- assert (lb==0) $ return ()- i <- findForWatch 2 ub- case i of- -1 -> do- when debugMode $ logIO s $ do- str <- showConstraint s this- return $ printf "basicPropagate: %s is unit" str- watch s falsifiedLit this- assignBy s lit0 this- _ -> do- !lit1 <- unsafeRead a 1- !liti <- unsafeRead a i- unsafeWrite a 1 liti- unsafeWrite a i lit1- watch s liti this- return True-- where- a = claLits this2-- preprocess :: IO ()- preprocess = do- !l0 <- unsafeRead a 0- !l1 <- unsafeRead a 1- assert (l0==falsifiedLit || l1==falsifiedLit) $ return ()- when (l0==falsifiedLit) $ do- unsafeWrite a 0 l1- unsafeWrite a 1 l0-- -- Maybe を heap allocation するのを避けるために、- -- 見つからなかったときは -1 を返すことに。- findForWatch :: Int -> Int -> IO Int- findForWatch i end | i > end = return (-1)- findForWatch i end = do- val <- litValue s =<< unsafeRead a i- if val /= lFalse- then return i- else findForWatch (i+1) end-- basicReasonOf _ this l = do- lits <- getElems (claLits this)- case l of- Nothing -> return lits- Just lit -> do- assert (lit == head lits) $ return ()- return $ tail lits-- toPBAtLeast _ (ClauseData a _) = do- lits <- getElems a- return ([(1,l) | l <- lits], 1)-- isSatisfied solver this = do- lits <- getElems (claLits this)- vals <- mapM (litValue solver) lits- return $ lTrue `elem` vals-- constrIsProtected _ this = do- size <- liftM rangeSize (getBounds (claLits this))- return $! size <= 2-- constrActivity _ this = do- let act = claActivity this- readIORef act-- constrBumpActivity solver this = do- let act = claActivity this- aval <- readIORef act- when (aval >= 0) $ do -- learnt clause- inc <- readIORef (svClaInc solver)- let aval2 = aval+inc- writeIORef act $! aval2- when (aval2 > 1e20) $- -- Rescale- constrRescaleAllActivity solver-- constrRescaleActivity _ this = do- let act = claActivity this- aval <- readIORef act- when (aval >= 0) $ writeIORef act $! (aval * 1e-20)--instantiateClause :: Solver -> Clause -> IO (Maybe Clause)-instantiateClause solver = loop []- where- loop :: [Lit] -> [Lit] -> IO (Maybe Clause)- loop ret [] = return $ Just ret- loop ret (l:ls) = do- val <- litValue solver l- if val==lTrue then- return Nothing- else if val==lFalse then- loop ret ls- else- loop (l : ret) ls--{--------------------------------------------------------------------- Cardinality Constraint---------------------------------------------------------------------}--data AtLeastData- = AtLeastData- { atLeastLits :: IOUArray Int Lit- , atLeastNum :: !Int- , atLeastActivity :: !(IORef Double)- }- deriving Eq--newAtLeastData :: [Lit] -> Int -> Bool -> IO AtLeastData-newAtLeastData ls n learnt = do- let size = length ls- a <- newListArray (0, size-1) ls- act <- newIORef $! (if learnt then 0 else -1)- return (AtLeastData a n act)--instance Constraint AtLeastData where- toConstraint = ConstrAtLeast-- showConstraint _ this = do- lits <- getElems (atLeastLits this)- return $ show lits ++ " >= " ++ show (atLeastNum this)-- attach solver this = do- lits <- getElems (atLeastLits this)- let n = atLeastNum this- let ws = if length lits > n then take (n+1) lits else []- forM_ ws $ \l -> watch solver l this-- watchedLiterals _ this = do- lits <- getElems (atLeastLits this)- let n = atLeastNum this- let ws = if length lits > n then take (n+1) lits else []- return ws-- basicPropagate s this this2 falsifiedLit = do- preprocess-- when debugMode $ do- litn <- readArray a n- unless (litn == falsifiedLit) $ error "AtLeastData.basicPropagate: should not happen"-- (lb,ub) <- getBounds a- assert (lb==0) $ return ()- ret <- findForWatch (n+1) ub- case ret of- Nothing -> do- when debugMode $ logIO s $ do- str <- showConstraint s this- return $ printf "basicPropagate: %s is unit" str- watch s falsifiedLit this- let loop :: Int -> IO Bool- loop i- | i >= n = return True- | otherwise = do- liti <- readArray a i- ret2 <- assignBy s liti this- if ret2- then loop (i+1)- else return False- loop 0- Just i -> do- liti <- readArray a i- litn <- readArray a n- writeArray a i litn- writeArray a n liti- watch s liti this- return True-- where- a = atLeastLits this2- n = atLeastNum this2-- preprocess :: IO ()- preprocess = loop 0- where- loop :: Int -> IO ()- loop i- | i >= n = return ()- | otherwise = do- li <- readArray a i- if (li /= falsifiedLit)- then loop (i+1)- else do- ln <- readArray a n- writeArray a n li- writeArray a i ln-- findForWatch :: Int -> Int -> IO (Maybe Int)- findForWatch i end | i > end = return Nothing- findForWatch i end = do- val <- litValue s =<< readArray a i- if val /= lFalse- then return (Just i)- else findForWatch (i+1) end-- basicReasonOf s this concl = do- lits <- getElems (atLeastLits this)- let n = atLeastNum this- case concl of- Nothing -> do- let f :: [Lit] -> IO Lit- f [] = error "AtLeastData.basicReasonOf: should not happen"- f (l:ls) = do- val <- litValue s l- if val == lFalse- then return l- else f ls- lit <- f (take n lits)- return $ lit : drop n lits- Just lit -> do- assert (lit `elem` take n lits) $ return ()- return $ drop n lits-- toPBAtLeast _ this = do- lits <- getElems (atLeastLits this)- return ([(1,l) | l <- lits], fromIntegral (atLeastNum this))-- isSatisfied solver this = do- lits <- getElems (atLeastLits this)- vals <- mapM (litValue solver) lits- return $ length [v | v <- vals, v == lTrue] >= atLeastNum this-- constrActivity _ this = do- let act = atLeastActivity this- readIORef act-- constrBumpActivity solver this = do- let act = atLeastActivity this- aval <- readIORef act- when (aval >= 0) $ do -- learnt clause- inc <- readIORef (svClaInc solver)- let aval2 = aval+inc- writeIORef act $! aval2- when (aval2 > 1e20) $- -- Rescale- constrRescaleAllActivity solver-- constrRescaleActivity _ this = do- let act = atLeastActivity this- aval <- readIORef act- when (aval >= 0) $ writeIORef act $! (aval * 1e-20)--instantiateAtLeast :: Solver -> ([Lit],Int) -> IO ([Lit],Int)-instantiateAtLeast solver (xs,n) = loop ([],n) xs- where- loop :: ([Lit],Int) -> [Lit] -> IO ([Lit],Int)- loop ret [] = return ret- loop (ys,m) (l:ls) = do- val <- litValue solver l- if val == lTrue then- loop (ys, m-1) ls- else if val == lFalse then- loop (ys, m) ls- else- loop (l:ys, m) ls--{--------------------------------------------------------------------- Pseudo Boolean Constraint---------------------------------------------------------------------}--data PBAtLeastData- = PBAtLeastData- { pbTerms :: !(LitMap Integer)- , pbDegree :: !Integer- , pbSlack :: !(IORef Integer)- , pbActivity :: !(IORef Double)- , pbReasons :: !(IORef (LitMap [(Lit, Integer)]))- }- deriving Eq--newPBAtLeastData :: [(Integer,Lit)] -> Integer -> Bool -> IO PBAtLeastData-newPBAtLeastData ts degree learnt = do- let slack = sum (map fst ts) - degree- m = IM.fromList [(l,c) | (c,l) <- ts]- s <- newIORef slack- act <- newIORef $! (if learnt then 0 else -1)- rs <- newIORef IM.empty- return (PBAtLeastData m degree s act rs)--instance Constraint PBAtLeastData where- toConstraint = ConstrPBAtLeast-- showConstraint _ this = do- return $ show [(c,l) | (l,c) <- IM.toList (pbTerms this)] ++ " >= " ++ show (pbDegree this)-- attach solver this = do- forM_ (IM.keys (pbTerms this)) $ \l -> watch solver l this- cs <- forM (IM.toList (pbTerms this)) $ \(l,c) -> do- v <- litValue solver l- if v == lFalse- then do- addBacktrackCB solver (litVar l) $ modifyIORef' (pbSlack this) (+ c)- return 0- else return c- writeIORef (pbSlack this) $! sum cs - pbDegree this-- watchedLiterals _ this = do- return $ IM.keys $ pbTerms this-- basicPropagate solver this this2 falsifiedLit = do- watch solver falsifiedLit this- let c = pbTerms this2 IM.! falsifiedLit- let slack = pbSlack this2- modifyIORef' slack (subtract c)- addBacktrackCB solver (litVar falsifiedLit) $ modifyIORef' slack (+ c)- pbPropagate solver this2-- basicReasonOf solver this l = do- let m = pbTerms this- xs <-- case l of- Just lit -> do- -- 保存しておいたものを使わないと、- -- その後に割り当てられたものを含んでしまってまずいことがある。- rs <- readIORef (pbReasons this)- return $ sortBy (flip (comparing snd)) $ (rs IM.! lit)- Nothing -> do- -- 直接のコンフリクトの場合には現在のもので大丈夫なはず- tmp <- filterM (\(lit,_) -> liftM (lFalse ==) (litValue solver lit)) (IM.toList m)- return $ sortBy (flip (comparing snd)) $ tmp- let max_slack = sum (map snd $ IM.toList m) - pbDegree this- case l of- Nothing -> return $ f max_slack xs- Just lit -> return $ f (max_slack - (m IM.! lit)) xs- where- f :: Integer -> [(Lit,Integer)] -> [Lit]- f s xs = go s xs []-- go :: Integer -> [(Lit,Integer)] -> [Lit] -> [Lit]- go s _ ret | s < 0 = ret- go _ [] _ = error "PBAtLeastData.basicReasonOf: should not happen"- go s ((lit,c):xs) ret = go (s - c) xs (lit:ret)-- toPBAtLeast _ this = do- return ([(c,l) | (l,c) <- IM.toList (pbTerms this)], pbDegree this)-- isSatisfied solver this = do- xs <- forM (IM.toList (pbTerms this)) $ \(l,c) -> do- v <- litValue solver l- if v == lTrue- then return c- else return 0- return $ sum xs >= pbDegree this-- constrActivity _ this = do- let act = pbActivity this- readIORef act-- constrBumpActivity solver this = do- let act = pbActivity this- aval <- readIORef act- when (aval >= 0) $ do -- learnt clause- inc <- readIORef (svClaInc solver)- let aval2 = aval+inc- writeIORef act $! aval2- when (aval2 > 1e20) $- -- Rescale- constrRescaleAllActivity solver-- constrRescaleActivity _ this = do- let act = pbActivity this- aval <- readIORef act- when (aval >= 0) $ writeIORef act $! (aval * 1e-20)--instantiatePB :: Solver -> ([(Integer,Lit)],Integer) -> IO ([(Integer,Lit)],Integer)-instantiatePB solver (xs,n) = loop ([],n) xs- where- loop :: ([(Integer,Lit)],Integer) -> [(Integer,Lit)] -> IO ([(Integer,Lit)],Integer)- loop ret [] = return ret- loop (ys,m) ((c,l):ts) = do- val <- litValue solver l- if val == lTrue then- loop (ys, m-c) ts- else if val == lFalse then- loop (ys, m) ts- else- loop ((c,l):ys, m) ts--pbPropagate :: Solver -> PBAtLeastData -> IO Bool-pbPropagate solver this = do- let slack = pbSlack this- s <- readIORef slack- if s < 0- then return False- else do- ref <- newIORef Nothing- let m = do- x <- readIORef ref- case x of- Just r -> return r- Nothing -> do- let isFalse (l,_) = liftM (lFalse==) (litValue solver l)- r <- filterM isFalse $ IM.toAscList $ pbTerms this- writeIORef ref (Just r)- return r-- forM_ (IM.toList (pbTerms this)) $ \(l1,c1) -> do- when (c1 > s) $ do- v <- litValue solver l1- when (v == lUndef) $ do- -- あとでbasicReasonOfで使うために、- -- その時点でfalseになっているリテラルを保存しておく- r <- m- modifyIORef (pbReasons this) (IM.insert l1 r)-- assignBy solver l1 this- constrBumpActivity solver this- return ()-- return True--pbOverSAT :: Solver -> ([(Integer,Lit)],Integer) -> IO Bool-pbOverSAT solver (lhs, rhs) = do- ss <- forM lhs $ \(c,l) -> do- v <- litValue solver l- if v /= lFalse- then return c- else return 0- return $! sum ss > rhs--{--------------------------------------------------------------------- Restart strategy---------------------------------------------------------------------}--data RestartStrategy = MiniSATRestarts | ArminRestarts | LubyRestarts- deriving (Show, Eq, Ord)--mkRestartSeq :: RestartStrategy -> Int -> Double -> [Int]-mkRestartSeq MiniSATRestarts = miniSatRestartSeq-mkRestartSeq ArminRestarts = arminRestartSeq-mkRestartSeq LubyRestarts = lubyRestartSeq--miniSatRestartSeq :: Int -> Double -> [Int]-miniSatRestartSeq start inc = iterate (ceiling . (inc *) . fromIntegral) start--{--miniSatRestartSeq :: Int -> Double -> [Int]-miniSatRestartSeq start inc = map round $ iterate (inc*) (fromIntegral start)--}--arminRestartSeq :: Int -> Double -> [Int]-arminRestartSeq start inc = go (fromIntegral start) (fromIntegral start)- where - go !inner !outer = round inner : go inner' outer'- where- (inner',outer') = - if inner >= outer- then (fromIntegral start, outer * inc)- else (inner * inc, outer)--lubyRestartSeq :: Int -> Double -> [Int]-lubyRestartSeq start inc = map (ceiling . (fromIntegral start *) . luby inc) [0..]--{-- Finite subsequences of the Luby-sequence:-- 0: 1- 1: 1 1 2- 2: 1 1 2 1 1 2 4- 3: 1 1 2 1 1 2 4 1 1 2 1 1 2 4 8- ...----}-luby :: Double -> Integer -> Double-luby y x = go2 size1 sequ1 x- where- -- Find the finite subsequence that contains index 'x', and the- -- size of that subsequence:- (size1, sequ1) = go 1 0-- go :: Integer -> Integer -> (Integer, Integer)- go size sequ- | size < x+1 = go (2*size+1) (sequ+1)- | otherwise = (size, sequ)-- go2 :: Integer -> Integer -> Integer -> Double- go2 size sequ x2- | size-1 /= x2 = let size' = (size-1) `div` 2 in go2 size' (sequ - 1) (x2 `mod` size')- | otherwise = y ^ sequ---{--------------------------------------------------------------------- utility---------------------------------------------------------------------}--allM :: Monad m => (a -> m Bool) -> [a] -> m Bool-allM p = go- where- go [] = return True- go (x:xs) = do- b <- p x- if b- then go xs- else return False--anyM :: Monad m => (a -> m Bool) -> [a] -> m Bool-anyM p = go- where- go [] = return False- go (x:xs) = do- b <- p x- if b- then return True- else go xs--#if !MIN_VERSION_base(4,6,0)--modifyIORef' :: IORef a -> (a -> a) -> IO ()-modifyIORef' ref f = do- x <- readIORef ref- writeIORef ref $! f x--#endif--shift :: IORef [a] -> IO a-shift ref = do- (x:xs) <- readIORef ref- writeIORef ref xs- return x --{--------------------------------------------------------------------- debug---------------------------------------------------------------------}--debugMode :: Bool-debugMode = False--checkSatisfied :: Solver -> IO ()-checkSatisfied solver = do- cls <- readIORef (svClauseDB solver)- forM_ cls $ \c -> do- b <- isSatisfied solver c- unless b $ do- s <- showConstraint solver c- log solver $ "BUG: " ++ s ++ " is violated"--sanityCheck :: Solver -> IO ()-sanityCheck _ | not debugMode = return ()-sanityCheck solver = do- cls <- readIORef (svClauseDB solver)- forM_ cls $ \constr -> do- lits <- watchedLiterals solver constr- forM_ lits $ \l -> do- ws <- watches solver l- unless (constr `elem` ws) $ error $ printf "sanityCheck:A:%s" (show lits)-- vs <- variables solver- let lits = [l | v <- vs, l <- [literal v True, literal v False]]- forM_ lits $ \l -> do- cs <- watches solver l- forM_ cs $ \constr -> do- lits2 <- watchedLiterals solver constr- unless (l `elem` lits2) $ do- error $ printf "sanityCheck:C:%d %s" l (show lits2)--dumpVarActivity :: Solver -> IO ()-dumpVarActivity solver = do- log solver "Variable activity:"- vs <- variables solver- forM_ vs $ \v -> do- activity <- varActivity solver v- log solver $ printf "activity(%d) = %d" v activity--dumpClaActivity :: Solver -> IO ()-dumpClaActivity solver = do- log solver "Learnt clause activity:"- xs <- learntConstraints solver- forM_ xs $ \c -> do- s <- showConstraint solver c- aval <- constrActivity solver c- log solver $ printf "activity(%s) = %f" s aval---- | set callback function for receiving messages.-setLogger :: Solver -> (String -> IO ()) -> IO ()-setLogger solver logger = do- writeIORef (svLogger solver) (Just logger)--log :: Solver -> String -> IO ()-log solver msg = logIO solver (return msg)--logIO :: Solver -> IO String -> IO ()-logIO solver action = do- m <- readIORef (svLogger solver)- case m of- Nothing -> return ()- Just logger -> action >>= logger
− src/SAT/CAMUS.hs
@@ -1,128 +0,0 @@--------------------------------------------------------------------------------- |--- Module : SAT.CAMUS--- Copyright : (c) Masahiro Sakai 2012--- License : BSD-style--- --- Maintainer : masahiro.sakai@gmail.com--- Stability : provisional--- Portability : portable----------------------------------------------------------------------------------module SAT.CAMUS- ( MUS- , MCS- , Options (..)- , defaultOptions- , allMCSAssumptions- , allMUSAssumptions- , enumMCSAssumptions- , hittingSetDual- ) where--import Control.Monad-import Data.Array.IArray-import qualified Data.IntSet as IS-import Data.List-import Data.IORef-import SAT--type MUS = [Lit]-type MCS = [Lit]---- | Options for 'enumMCSAssumptions', 'allMCSAssumptions', 'allMUSAssumptions'-data Options- = Options- { optLogger :: String -> IO ()- , optCallback :: MCS -> IO ()- }---- | default 'Options' value-defaultOptions :: Options-defaultOptions =- Options- { optLogger = \_ -> return ()- , optCallback = \_ -> return ()- }--enumMCSAssumptions :: SAT.Solver -> [Lit] -> Options -> IO ()-enumMCSAssumptions solver sels opt = loop 1- where- log :: String -> IO ()- log = optLogger opt-- callback :: MCS -> IO ()- callback = optCallback opt-- loop :: Integer -> IO ()- loop k = do- log $ "CAMUS: k = " ++ show k- ret <- SAT.solve solver- when ret $ do- vk <- SAT.newVar solver- SAT.addPBAtMostSoft solver vk [(1,-sel) | sel <- sels] k- let loop2 = do- ret2 <- SAT.solveWith solver [vk]- when ret2 $ do- m <- SAT.model solver- let mcs = [sel | sel <- sels, not (evalLit sel m)]- callback mcs- SAT.addClause solver mcs- loop2- loop2- SAT.addClause solver [-vk]- loop (k+1)--evalLit :: Lit -> Model -> Bool-evalLit l m = m ! SAT.litVar l == SAT.litPolarity l--allMCSAssumptions :: SAT.Solver -> [Lit] -> Options -> IO [MCS]-allMCSAssumptions solver sels opt = do- ref <- newIORef [] - let opt2 =- opt- { optCallback = \mcs -> do- modifyIORef ref (mcs:)- optCallback opt mcs- }- enumMCSAssumptions solver sels opt2- readIORef ref--allMUSAssumptions :: SAT.Solver -> [Lit] -> Options -> IO [MCS]-allMUSAssumptions solver sels opt = do- log "CAMUS: MCS enumeration begins"- mcses <- allMCSAssumptions solver sels opt- log "CAMUS: MCS enumeration done"- return $ hittingSetDual mcses- where- log :: String -> IO ()- log = optLogger opt---- FIXME: remove nub-hittingSetDual :: [MCS] -> [MUS]-hittingSetDual mcses = nub $ f (map IS.fromList mcses) []- where- f :: [IS.IntSet] -> [Int] -> [MUS]- f [] mus = return mus- f mcses mus = do- sel <- IS.toList $ IS.unions mcses- let mus' = sel:mus- mcs <- mcses- guard $ sel `IS.member` mcs- let mcses' = propagateChoice mcses sel mcs- f mcses' mus'--propagateChoice :: [IS.IntSet] -> Lit -> IS.IntSet -> [IS.IntSet]-propagateChoice mcses sel mcs = zs- where- xs = filter (sel `IS.notMember`) mcses- ys = map (IS.filter (sel <) . (`IS.difference` mcs)) xs- zs = maintainNoSupersets ys--maintainNoSupersets :: [IS.IntSet] -> [IS.IntSet]-maintainNoSupersets xss = go [] xss- where- go yss [] = yss- go yss (xs:xss) = go (xs : filter p yss) (filter p xss)- where- p zs = not (xs `IS.isSubsetOf` zs)
− src/SAT/Integer.hs
@@ -1,93 +0,0 @@-{-# LANGUAGE TypeFamilies #-}-module SAT.Integer- ( Expr (..)- , newVar- , linearize- , addConstraint- , addConstraintSoft- , eval- ) where--import Control.Monad-import Data.Array.IArray-import Data.VectorSpace-import Text.Printf--import Data.ArithRel-import qualified SAT-import qualified SAT.TseitinEncoder as TseitinEncoder--data Expr = Expr [(Integer, [SAT.Lit])]--newVar :: SAT.Solver -> Integer -> Integer -> IO Expr-newVar solver lo hi = do- when (lo > hi) $ error $ printf "SAT.Integer.newVar: inconsistent bounds given [%d, %d]" lo hi- let hi' = hi - lo- bitWidth = head $ [w | w <- [1..], let mx = 2 ^ w - 1, hi' <= mx]- vs <- SAT.newVars solver bitWidth- let xs = zip (iterate (2*) 1) vs- SAT.addPBAtMost solver xs hi'- return $ Expr ((lo,[]) : [(c,[x]) | (c,x) <- xs])--instance AdditiveGroup Expr where- Expr xs1 ^+^ Expr xs2 = Expr (xs1++xs2)- zeroV = Expr []- negateV = ((-1) *^)--instance VectorSpace Expr where- type Scalar Expr = Integer- n *^ Expr xs = Expr [(n*m,lits) | (m,lits) <- xs]--instance Num Expr where- Expr xs1 + Expr xs2 = Expr (xs1++xs2)- Expr xs1 * Expr xs2 = Expr [(c1*c2, lits1++lits2) | (c1,lits1) <- xs1, (c2,lits2) <- xs2]- negate (Expr xs) = Expr [(-c,lits) | (c,lits) <- xs]- abs = id- signum _ = 1- fromInteger c = Expr [(c,[])]--linearize :: TseitinEncoder.Encoder -> Expr -> IO ([(Integer,SAT.Lit)], Integer)-linearize enc (Expr xs) = do- let ys = [(c,lits) | (c,lits@(_:_)) <- xs]- c = sum [c | (c,[]) <- xs]- zs <- forM ys $ \(c,lits) -> do- l <- TseitinEncoder.encodeConj enc lits- return (c,l)- return (zs, c)--addConstraint :: TseitinEncoder.Encoder -> Rel Expr -> IO ()-addConstraint enc (Rel lhs op rhs) = do- let solver = TseitinEncoder.encSolver enc- (lhs2,c) <- linearize enc (lhs - rhs)- let rhs2 = -c- case op of- Le -> SAT.addPBAtMost solver lhs2 rhs2- Lt -> SAT.addPBAtMost solver lhs2 (rhs2-1)- Ge -> SAT.addPBAtLeast solver lhs2 rhs2- Gt -> SAT.addPBAtLeast solver lhs2 (rhs2+1)- Eql -> SAT.addPBExactly solver lhs2 rhs2- NEq -> do- sel <- SAT.newVar solver- SAT.addPBAtLeastSoft solver sel lhs2 (rhs2+1)- SAT.addPBAtMostSoft solver (-sel) lhs2 (rhs2-1)--addConstraintSoft :: TseitinEncoder.Encoder -> SAT.Lit -> Rel Expr -> IO ()-addConstraintSoft enc sel (Rel lhs op rhs) = do- let solver = TseitinEncoder.encSolver enc- (lhs2,c) <- linearize enc (lhs - rhs)- let rhs2 = -c- case op of- Le -> SAT.addPBAtMostSoft solver sel lhs2 rhs2- Lt -> SAT.addPBAtMostSoft solver sel lhs2 (rhs2-1)- Ge -> SAT.addPBAtLeastSoft solver sel lhs2 rhs2- Gt -> SAT.addPBAtLeastSoft solver sel lhs2 (rhs2+1)- Eql -> SAT.addPBExactlySoft solver sel lhs2 rhs2- NEq -> do- sel2 <- SAT.newVar solver- sel3 <- TseitinEncoder.encodeConj enc [sel,sel2]- sel4 <- TseitinEncoder.encodeConj enc [sel,-sel2]- SAT.addPBAtLeastSoft solver sel3 lhs2 (rhs2+1)- SAT.addPBAtMostSoft solver sel4 lhs2 (rhs2-1)--eval :: SAT.Model -> Expr -> Integer-eval m (Expr ts) = sum [if and [m ! SAT.litVar lit == SAT.litPolarity lit | lit <- lits] then n else 0 | (n,lits) <- ts]
− src/SAT/MUS.hs
@@ -1,91 +0,0 @@--------------------------------------------------------------------------------- |--- Module : SAT.MUS--- Copyright : (c) Masahiro Sakai 2012--- License : BSD-style--- --- Maintainer : masahiro.sakai@gmail.com--- Stability : provisional--- Portability : non-portable------ Minimal Unsatifiable Subset (MUS) Finder----------------------------------------------------------------------------------module SAT.MUS- ( Options (..)- , defaultOptions- , findMUSAssumptions- ) where--import Control.Monad-import Data.List-import qualified Data.IntSet as IS-import SAT---- | Options for 'findMUSAssumptions' function-data Options- = Options- { optLogger :: String -> IO ()- , optUpdateBest :: [Lit] -> IO ()- , optLitPrinter :: Lit -> String- }---- | default 'Options' value-defaultOptions :: Options-defaultOptions =- Options- { optLogger = \_ -> return ()- , optUpdateBest = \_ -> return ()- , optLitPrinter = show- }---- | Find a minimal set of assumptions that causes a conflict.--- Initial set of assumptions is taken from 'SAT.failedAssumptions'.-findMUSAssumptions- :: SAT.Solver- -> Options- -> IO [Lit]-findMUSAssumptions solver opt = do- log "computing a minimal unsatisfiable core"- core <- liftM IS.fromList $ SAT.failedAssumptions solver- update $ IS.toList core- log $ "core = " ++ showLits core- mus <- loop core IS.empty- return $ IS.toList mus-- where- log :: String -> IO ()- log = optLogger opt-- update :: [Lit] -> IO ()- update = optUpdateBest opt-- showLit :: Lit -> String- showLit = optLitPrinter opt-- showLits :: IS.IntSet -> String- showLits ls = "{" ++ intercalate ", " (map showLit (IS.toList ls)) ++ "}"-- loop :: IS.IntSet -> IS.IntSet -> IO IS.IntSet- loop ls1 fixed = do- case IS.minView ls1 of- Nothing -> do- log $ "found a minimal unsatisfiable core"- return fixed- Just (l,ls) -> do- log $ "trying to remove " ++ showLit l- ret <- SAT.solveWith solver (IS.toList ls)- if not ret- then do- ls2 <- liftM IS.fromList $ SAT.failedAssumptions solver- let removed = ls1 `IS.difference` ls2- log $ "successed to remove " ++ showLits removed- log $ "new core = " ++ showLits (ls2 `IS.union` fixed)- update $ IS.toList ls2- forM_ (IS.toList removed) $ \l ->- SAT.addClause solver [-l]- loop ls2 fixed- else do- log $ "failed to remove " ++ showLit l- SAT.addClause solver [l]- loop ls (IS.insert l fixed)
− src/SAT/PBO.hs
@@ -1,210 +0,0 @@-{-# OPTIONS_GHC -Wall -fno-warn-unused-do-bind #-}--------------------------------------------------------------------------------- |--- Module : SAT.PBO--- Copyright : (c) Masahiro Sakai 2012-2013--- License : BSD-style--- --- Maintainer : masahiro.sakai@gmail.com--- Stability : provisional--- Portability : portable------ Pseudo-Boolean Optimization (PBO) Solver----------------------------------------------------------------------------------module SAT.PBO where--import Control.Exception-import Control.Monad-import Data.List-import Data.Ord-import Text.Printf-import SAT-import SAT.Types-import qualified SAT.PBO.UnsatBased as UnsatBased-import qualified SAT.PBO.MSU4 as MSU4--data SearchStrategy- = LinearSearch- | BinarySearch- | AdaptiveSearch- | UnsatBased- | MSU4--data Options- = Options- { optLogger :: String -> IO ()- , optUpdateBest :: Model -> Integer -> IO ()- , optUpdateLB :: Integer -> IO ()- , optObjFunVarsHeuristics :: Bool- , optSearchStrategy :: SearchStrategy- , optTrialLimitConf :: Int- }--defaultOptions :: Options-defaultOptions- = Options- { optLogger = \_ -> return ()- , optUpdateBest = \_ _ -> return ()- , optUpdateLB = \_ -> return ()- , optObjFunVarsHeuristics = True- , optSearchStrategy = LinearSearch- , optTrialLimitConf = 1000- }--minimize :: Solver -> [(Integer, Lit)] -> Options -> IO (Maybe Model)-minimize solver obj opt = do- when (optObjFunVarsHeuristics opt) $ tweakParams solver obj-- case optSearchStrategy opt of- UnsatBased -> do- let opt2 = UnsatBased.defaultOptions- { UnsatBased.optLogger = optLogger opt- , UnsatBased.optUpdateBest = optUpdateBest opt- , UnsatBased.optUpdateLB = optUpdateLB opt- }- UnsatBased.solve solver obj opt2- MSU4 -> do- let opt2 = MSU4.defaultOptions- { MSU4.optLogger = optLogger opt- , MSU4.optUpdateBest = optUpdateBest opt- , MSU4.optUpdateLB = optUpdateLB opt- }- MSU4.solve solver obj opt2- _ -> do- updateLB (pbLowerBound obj)- result <- solve solver- if not result then- return Nothing- else- case optSearchStrategy opt of- LinearSearch -> liftM Just linSearch- BinarySearch -> liftM Just binSearch- AdaptiveSearch -> liftM Just adaptiveSearch- _ -> error "SAT.PBO.minimize: should not happen"-- where- logIO :: String -> IO ()- logIO = optLogger opt-- updateBest :: Model -> Integer -> IO ()- updateBest = optUpdateBest opt-- updateLB :: Integer -> IO ()- updateLB = optUpdateLB opt-- linSearch :: IO Model- linSearch = do- m <- model solver- let v = pbEval m obj- updateBest m v- addPBAtMost solver obj (v - 1)- result <- solve solver- if result- then linSearch- else return m-- binSearch :: IO Model- binSearch = do- m0 <- model solver- let v0 = pbEval m0 obj- updateBest m0 v0- let ub0 = v0 - 1- lb0 = pbLowerBound obj- addPBAtMost solver obj ub0- loop lb0 ub0 m0- where- loop lb ub m | ub < lb = return m- loop lb ub m = do- let mid = (lb + ub) `div` 2- logIO $ printf "Binary Search: %d <= obj <= %d; guessing obj <= %d" lb ub mid- sel <- newVar solver- addPBAtMostSoft solver sel obj mid- ret <- solveWith solver [sel]- if ret then do- m2 <- model solver- let v = pbEval m2 obj- updateBest m2 v- -- deleting temporary constraint- -- ただし、これに依存した補題を活かすためには残したほうが良い?- addClause solver [-sel]- let ub' = v - 1- logIO $ printf "Binary Search: updating upper bound: %d -> %d" ub ub'- addPBAtMost solver obj ub'- loop lb ub' m2- else do- -- deleting temporary constraint- addClause solver [-sel]- let lb' = mid + 1- updateLB lb'- logIO $ printf "Binary Search: updating lower bound: %d -> %d" lb lb'- addPBAtLeast solver obj lb'- loop lb' ub m-- -- adaptive search strategy from pbct-0.1.3 <http://www.residual.se/pbct/>- adaptiveSearch :: IO Model- adaptiveSearch = do- m0 <- model solver- let v0 = pbEval m0 obj- updateBest m0 v0- let ub0 = v0 - 1- lb0 = pbLowerBound obj- addPBAtMost solver obj ub0- loop lb0 ub0 (0::Rational) m0- where- loop lb ub _ m | ub < lb = return m- loop lb ub fraction m = do- let interval = ub - lb- mid = ub - floor (fromIntegral interval * fraction)- if ub == mid then do- logIO $ printf "Adaptive Search: %d <= obj <= %d" lb ub- result <- solve solver- if result then do- m2 <- model solver- let v = pbEval m2 obj- updateBest m2 v- let ub' = v - 1- fraction' = min 0.5 (fraction + 0.1)- loop lb ub' fraction' m2- else- return m- else do- logIO $ printf "Adaptive Search: %d <= obj <= %d; guessing obj <= %d" lb ub mid- sel <- newVar solver- addPBAtMostSoft solver sel obj mid- setConfBudget solver $ Just (optTrialLimitConf opt)- ret' <- try $ solveWith solver [sel]- setConfBudget solver Nothing- case ret' of- Left BudgetExceeded -> do- let fraction' = max 0 (fraction - 0.05)- loop lb ub fraction' m- Right ret -> do- let fraction' = min 0.5 (fraction + 0.1)- if ret then do- m2 <- model solver- let v = pbEval m2 obj- updateBest m2 v- -- deleting temporary constraint- -- ただし、これに依存した補題を活かすためには残したほうが良い?- addClause solver [-sel]- let ub' = v - 1- logIO $ printf "Adaptive Search: updating upper bound: %d -> %d" ub ub'- addPBAtMost solver obj ub'- loop lb ub' fraction' m2- else do- -- deleting temporary constraint- addClause solver [-sel]- let lb' = mid + 1- updateLB lb'- logIO $ printf "Adaptive Search: updating lower bound: %d -> %d" lb lb'- addPBAtLeast solver obj lb'- loop lb' ub fraction' m--tweakParams :: Solver -> [(Integer, Lit)] -> IO ()-tweakParams solver obj = do- forM_ obj $ \(c,l) -> do- let p = if c > 0 then not (litPolarity l) else litPolarity l- setVarPolarity solver (litVar l) p- forM_ (zip [1..] (map snd (sortBy (comparing fst) [(abs c, l) | (c,l) <- obj]))) $ \(n,l) -> do- replicateM n $ varBumpActivity solver (litVar l)
− src/SAT/PBO/MSU4.hs
@@ -1,109 +0,0 @@-{-# OPTIONS_GHC -Wall -fno-warn-unused-do-bind #-}--------------------------------------------------------------------------------- |--- Module : SAT.PBO.MSU4--- Copyright : (c) Masahiro Sakai 2013--- License : BSD-style--- --- Maintainer : masahiro.sakai@gmail.com--- Stability : provisional--- Portability : portable--- --- Reference:------ * João P. Marques-Silva and Jordi Planes.--- Algorithms for Maximum Satisfiability using Unsatisfiable Cores.--- In Design, Automation and Test in Europe, 2008 (DATE '08). March 2008.--- pp. 408-413, doi:10.1109/date.2008.4484715.--- <http://dx.doi.org/10.1109/date.2008.4484715>--- <http://eprints.soton.ac.uk/265000/1/jpms-date08.pdf>--- <http://www.csi.ucd.ie/staff/jpms/talks/talksite/jpms-date08.pdf>----------------------------------------------------------------------------------module SAT.PBO.MSU4- ( Options (..)- , defaultOptions- , solve- , solveWBO- ) where--import qualified Data.IntSet as IS-import qualified Data.IntMap as IM-import qualified SAT as SAT-import SAT.Types--import Text.Printf--data Options- = Options- { optLogger :: String -> IO ()- , optUpdateBest :: SAT.Model -> Integer -> IO ()- , optUpdateLB :: Integer -> IO ()- }--defaultOptions :: Options-defaultOptions- = Options- { optLogger = \_ -> return ()- , optUpdateBest = \_ _ -> return ()- , optUpdateLB = \_ -> return ()- }--solve :: SAT.Solver -> [(Integer, SAT.Lit)] -> Options -> IO (Maybe SAT.Model)-solve solver obj opt = do- result <- solveWBO solver [(-v, c) | (c,v) <- obj'] opt'- case result of- Nothing -> return Nothing- Just (m,_) -> return (Just m)- where- (obj',offset) = normalizePBSum (obj,0)- opt' =- opt- { optUpdateBest = \m val -> optUpdateBest opt m (offset + val)- , optUpdateLB = \val -> optUpdateLB opt (offset + val)- }--solveWBO :: SAT.Solver -> [(Lit, Integer)] -> Options -> IO (Maybe (SAT.Model, Integer))-solveWBO solver sels opt = do- optUpdateLB opt 0- loop (IM.keysSet weights) IS.empty 0 Nothing-- where- weights = IM.fromList sels- - loop :: IS.IntSet -> IS.IntSet -> Integer -> Maybe (SAT.Model, Integer) -> IO (Maybe (SAT.Model, Integer))- loop unrelaxed relaxed lb best = do- ret <- SAT.solveWith solver (IS.toList unrelaxed)- if ret then do- currModel <- SAT.model solver- let violated = [weights IM.! l | l <- IS.toList relaxed, evalLit currModel l == False]- currVal = sum violated- best' <-- case best of- Just (_, bestVal)- | currVal < bestVal -> do- optUpdateBest opt currModel currVal- return $ Just (currModel, currVal)- | otherwise -> do- return best- Nothing -> do- optUpdateBest opt currModel currVal- return $ Just (currModel, currVal)- SAT.addPBAtMost solver [(c,-l) | (l,c) <- sels] (currVal - 1)- cont unrelaxed relaxed lb best'- else do- core <- SAT.failedAssumptions solver- let ls = IS.fromList core `IS.intersection` unrelaxed- if IS.null ls then do- return best- else do- SAT.addClause solver [-l | l <- core] -- optional constraint but sometimes useful- let min_weight = minimum [weights IM.! l | l <- IS.toList ls]- lb' = lb + min_weight- optLogger opt $ printf "MSU4: found a core: size = %d, minimal weight = %d" (length core) min_weight - optUpdateLB opt lb'- cont (unrelaxed `IS.difference` ls) (relaxed `IS.union` ls) lb' best-- cont :: IS.IntSet -> IS.IntSet -> Integer -> Maybe (SAT.Model, Integer) -> IO (Maybe (SAT.Model, Integer))- cont _ _ lb best@(Just (_, bestVal)) | lb == bestVal = return best- cont unrelaxed relaxed lb best = loop unrelaxed relaxed lb best
− src/SAT/PBO/UnsatBased.hs
@@ -1,93 +0,0 @@-{-# LANGUAGE BangPatterns #-}-{-# OPTIONS_GHC -Wall #-}--------------------------------------------------------------------------------- |--- Module : SAT.PBO.UnsatBased--- Copyright : (c) Masahiro Sakai 2013--- License : BSD-style--- --- Maintainer : masahiro.sakai@gmail.com--- Stability : provisional--- Portability : non-portable (BangPatterns)----------------------------------------------------------------------------------module SAT.PBO.UnsatBased- ( Options (..)- , defaultOptions- , solve- , solveWBO- ) where--import Control.Monad-import Data.IntMap (IntMap)-import qualified Data.IntMap as IntMap-import qualified SAT as SAT-import qualified SAT.Types as SAT--data Options- = Options- { optLogger :: String -> IO ()- , optUpdateBest :: SAT.Model -> Integer -> IO ()- , optUpdateLB :: Integer -> IO ()- }--defaultOptions :: Options-defaultOptions- = Options- { optLogger = \_ -> return ()- , optUpdateBest = \_ _ -> return ()- , optUpdateLB = \_ -> return ()- }--solve :: SAT.Solver -> [(Integer, SAT.Lit)] -> Options -> IO (Maybe SAT.Model)-solve solver obj opt = do- result <- solveWBO solver [(-v, c) | (c,v) <- obj'] opt'- case result of- Nothing -> return Nothing- Just (m,_) -> return (Just m)- where- (obj',offset) = SAT.normalizePBSum (obj,0)- opt' =- opt- { optUpdateBest = \m val -> optUpdateBest opt m (offset + val)- , optUpdateLB = \val -> optUpdateLB opt (offset + val)- }--solveWBO :: SAT.Solver -> [(SAT.Lit, Integer)] -> Options -> IO (Maybe (SAT.Model, Integer))-solveWBO solver sels0 opt = loop 0 (IntMap.fromList sels0)- where- loop :: Integer -> IntMap Integer -> IO (Maybe (SAT.Model, Integer))- loop !lb sels = do- optUpdateLB opt lb-- ret <- SAT.solveWith solver (IntMap.keys sels)- if ret- then do- m <- SAT.model solver- -- モデルから余計な変数を除去する?- optUpdateBest opt m lb- return $ Just (m, lb)- else do- core <- SAT.failedAssumptions solver- case core of- [] -> return Nothing- _ -> do- let !min_c = minimum [sels IntMap.! sel | sel <- core]- !lb' = lb + min_c-- xs <- forM core $ \sel -> do- r <- SAT.newVar solver- return (sel, r)- SAT.addExactly solver (map snd xs) 1- SAT.addClause solver [-l | l <- core] -- optional constraint but sometimes useful-- ys <- liftM IntMap.unions $ forM xs $ \(sel, r) -> do- sel' <- SAT.newVar solver- SAT.addClause solver [-sel', r, sel]- let c = sels IntMap.! sel- if c > min_c- then return $ IntMap.fromList [(sel', min_c), (sel, c - min_c)]- else return $ IntMap.singleton sel' min_c- let sels' = IntMap.union ys (IntMap.difference sels (IntMap.fromList [(sel, ()) | sel <- core]))-- loop lb' sels'
− src/SAT/Printer.hs
@@ -1,85 +0,0 @@--------------------------------------------------------------------------------- |--- Module : SAT.Printer--- Copyright : (c) Masahiro Sakai 2012--- License : BSD-style--- --- Maintainer : masahiro.sakai@gmail.com--- Stability : provisional--- Portability : portable------ Printing utilities.----------------------------------------------------------------------------------module SAT.Printer- ( satPrintModel- , maxsatPrintModel- , pbPrintModel- , musPrintSol- ) where--import Control.Monad-import Data.Array.IArray-import Data.List-import System.IO-import SAT.Types---- | Print a 'Model' in a way specified for SAT Competition.--- See <http://www.satcompetition.org/2011/rules.pdf> for details.-satPrintModel :: Handle -> Model -> Int -> IO ()-satPrintModel h m n = do- let as = if n > 0- then takeWhile (\(v,_) -> v <= n) $ assocs m- else assocs m- forM_ (split 10 as) $ \xs -> do- hPutStr h "v"- forM_ xs $ \(var,val) -> hPutStr h (' ': show (literal var val))- hPutStrLn h ""- hPutStrLn h "v 0"- hFlush h---- | Print a 'Model' in a way specified for Max-SAT Evaluation.--- See <http://maxsat.ia.udl.cat/requirements/> for details.-maxsatPrintModel :: Handle -> Model -> Int -> IO ()-maxsatPrintModel h m n = do- let as = if n > 0- then takeWhile (\(v,_) -> v <= n) $ assocs m- else assocs m- forM_ (split 10 as) $ \xs -> do- hPutStr h "v"- forM_ xs $ \(var,val) -> hPutStr h (' ' : show (literal var val))- hPutStrLn h ""- -- no terminating 0 is necessary- hFlush stdout---- | Print a 'Model' in a way specified for Pseudo-Boolean Competition.--- See <http://www.cril.univ-artois.fr/PB12/format.pdf> for details.-pbPrintModel :: Handle -> Model -> Int -> IO ()-pbPrintModel h m n = do- let as = if n > 0- then takeWhile (\(v,_) -> v <= n) $ assocs m- else assocs m- forM_ (split 10 as) $ \xs -> do- hPutStr h "v"- forM_ xs $ \(var,val) -> hPutStr h (" " ++ (if val then "" else "-") ++ "x" ++ show var)- hPutStrLn h ""- hFlush stdout--musPrintSol :: Handle -> [Int] -> IO ()-musPrintSol h is = do- forM_ (split 10 is) $ \xs -> do- hPutStr h "v"- forM_ xs $ \i -> hPutStr h (' ': show i)- hPutStrLn h ""- hPutStrLn h "v 0"- hFlush h---- --------------------------------------------------------------------------split :: Int -> [a] -> [[a]]-split n = go- where- go [] = []- go xs =- case splitAt n xs of- (ys, zs) -> ys : go zs
− src/SAT/TheorySolver.hs
@@ -1,25 +0,0 @@-module SAT.TheorySolver- ( TheorySolver (..)- , emptyTheory- ) where--import SAT.Types--data TheorySolver =- TheorySolver- { thAssertLit :: (Lit -> IO Bool) -> Lit -> IO Bool- , thCheck :: (Lit -> IO Bool) -> IO Bool- , thExplain :: IO [Lit]- , thPushBacktrackPoint :: IO ()- , thPopBacktrackPoint :: IO ()- }--emptyTheory :: TheorySolver-emptyTheory =- TheorySolver- { thAssertLit = \propagate lit -> return True- , thCheck = \propagate -> return True- , thExplain = error "should not happen"- , thPushBacktrackPoint = return ()- , thPopBacktrackPoint = return ()- }
− src/SAT/TseitinEncoder.hs
@@ -1,203 +0,0 @@-{-# OPTIONS_GHC -Wall #-}--------------------------------------------------------------------------------- |--- Module : SAT.TseitinEncoder--- Copyright : (c) Masahiro Sakai 2012--- License : BSD-style--- --- Maintainer : masahiro.sakai@gmail.com--- Stability : provisional--- Portability : portable--- --- Tseitin encoding------ TODO:--- --- * reduce variables.------ References:------ * [Tse83] G. Tseitin. On the complexity of derivation in propositional--- calculus. Automation of Reasoning: Classical Papers in Computational--- Logic, 2:466-483, 1983. Springer-Verlag. ------ * [For60] R. Fortet. Application de l'algèbre de Boole en rechercheop--- opérationelle. Revue Française de Recherche Opérationelle, 4:17-26,--- 1960. ------ * [BM84a] E. Balas and J. B. Mazzola. Nonlinear 0-1 programming:--- I. Linearization techniques. Mathematical Programming, 30(1):1-21,--- 1984.--- --- * [BM84b] E. Balas and J. B. Mazzola. Nonlinear 0-1 programming:--- II. Dominance relations and algorithms. Mathematical Programming,--- 30(1):22-45, 1984.-------------------------------------------------------------------------------module SAT.TseitinEncoder- (- -- * The @Encoder@ type- Encoder- , newEncoder- , setUsePB- , encSolver-- -- * Encoding of boolean formula- , Formula (..)- , addFormula- , encodeConj- , encodeDisj- ) where--import Control.Monad-import Data.IORef-import Data.Map (Map)-import qualified Data.Map as Map-import Data.IntSet (IntSet)-import qualified Data.IntSet as IntSet-import qualified SAT as SAT---- | Arbitrary formula not restricted to CNF-data Formula- = Var SAT.Var- | And [Formula]- | Or [Formula]- | Not Formula- | Imply Formula Formula- | Equiv Formula Formula- deriving (Show, Eq, Ord)---- | Encoder instance-data Encoder =- Encoder- { encSolver :: SAT.Solver- , encUsePB :: IORef Bool- , encConjTable :: !(IORef (Map IntSet SAT.Lit))- }---- | Create a @Encoder@ instance.-newEncoder :: SAT.Solver -> IO Encoder-newEncoder solver = do- usePBRef <- newIORef False- table <- newIORef Map.empty- return $- Encoder- { encSolver = solver- , encUsePB = usePBRef- , encConjTable = table- }---- | Use /pseudo boolean constraints/ or use only /clauses/.-setUsePB :: Encoder -> Bool -> IO ()-setUsePB encoder usePB = writeIORef (encUsePB encoder) usePB---- | Assert a given formula to underlying SAT solver by using--- Tseitin encoding.-addFormula :: Encoder -> Formula -> IO ()-addFormula encoder formula = do- let solver = encSolver encoder- case formula of- And xs -> mapM_ (addFormula encoder) xs- Equiv a b -> do- lit1 <- encodeToLit encoder a- lit2 <- encodeToLit encoder b- SAT.addClause solver [SAT.litNot lit1, lit2] -- a→b- SAT.addClause solver [SAT.litNot lit2, lit1] -- b→a- Not (Not a) -> addFormula encoder a- Not (Or xs) -> addFormula encoder (And (map Not xs))- Not (Imply a b) -> addFormula encoder (And [a, Not b])- Not (Equiv a b) -> do- lit1 <- encodeToLit encoder a- lit2 <- encodeToLit encoder b- SAT.addClause solver [lit1, lit2] -- a ∨ b- SAT.addClause solver [SAT.litNot lit1, SAT.litNot lit2] -- ¬a ∨ ¬b- _ -> do- c <- encodeToClause encoder formula- SAT.addClause solver c--encodeToClause :: Encoder -> Formula -> IO SAT.Clause-encodeToClause encoder formula =- case formula of- And [x] -> encodeToClause encoder x- Or xs -> do- cs <- mapM (encodeToClause encoder) xs- return $ concat cs- Not (Not x) -> encodeToClause encoder x- Not (And xs) -> do- encodeToClause encoder (Or (map Not xs))- Imply a b -> do- encodeToClause encoder (Or [Not a, b])- _ -> do- l <- encodeToLit encoder formula- return [l]--encodeToLit :: Encoder -> Formula -> IO SAT.Lit-encodeToLit encoder formula = do- let solver = encSolver encoder- case formula of- Var v -> return v- And xs -> do- v <- SAT.newVar solver- ls <- mapM (encodeToLit encoder) xs- addIsConjOf encoder v ls- return v- Or xs -> do- v <- SAT.newVar solver- ls <- mapM (encodeToLit encoder) xs- addIsDisjOf encoder v ls- return v- Not x -> do- lit <- encodeToLit encoder x- return $ SAT.litNot lit- Imply x y -> do- encodeToLit encoder (Or [Not x, y])- Equiv x y -> do- lit1 <- encodeToLit encoder x- lit2 <- encodeToLit encoder y- encodeToLit encoder $- And [ Imply (Var lit1) (Var lit2)- , Imply (Var lit2) (Var lit1)- ]- -- Varにリテラルを渡しているのは少し気持ち悪い---- | Return an literal which is equivalent to a given conjunction.-encodeConj :: Encoder -> [SAT.Lit] -> IO SAT.Lit-encodeConj _ [l] = return l-encodeConj encoder ls = do- let ls2 = IntSet.fromList ls- table <- readIORef (encConjTable encoder)- case Map.lookup ls2 table of- Just l -> return l- Nothing -> do- let sat = encSolver encoder- v <- SAT.newVar sat- addIsConjOf encoder v ls- writeIORef (encConjTable encoder) (Map.insert ls2 v table)- return v---- | Return an literal which is equivalent to a given disjunction.-encodeDisj :: Encoder -> [SAT.Lit] -> IO SAT.Lit-encodeDisj _ [l] = return l-encodeDisj encoder ls = do- -- ¬l ⇔ ¬(¬l1 ∧ … ∧ ¬ln) ⇔ (l1 ∨ … ∨ ln)- l <- encodeConj encoder [SAT.litNot li | li <- ls]- return $ SAT.litNot l--addIsConjOf :: Encoder -> SAT.Lit -> [SAT.Lit] -> IO ()-addIsConjOf encoder l ls = do- let solver = encSolver encoder- usePB <- readIORef (encUsePB encoder)- if usePB- then do- -- ∀i.(l → li) ⇔ Σli >= n*l ⇔ Σli - n*l >= 0- let n = length ls- SAT.addPBAtLeast solver ((- fromIntegral n, l) : [(1,li) | li <- ls]) 0- else do- forM_ ls $ \li -> do- -- (l → li) ⇔ (¬l ∨ li)- SAT.addClause solver [SAT.litNot l, li]- -- ((l1 ∧ l2 ∧ … ∧ ln) → l) ⇔ (¬l1 ∨ ¬l2 ∨ … ∨ ¬ln ∨ l)- SAT.addClause solver (l : map SAT.litNot ls)--addIsDisjOf :: Encoder -> SAT.Lit -> [SAT.Lit] -> IO ()-addIsDisjOf encoder l ls =- addIsConjOf encoder (SAT.litNot l) [SAT.litNot li | li <- ls]
− src/SAT/Types.hs
@@ -1,247 +0,0 @@-{-# LANGUAGE BangPatterns #-}-module SAT.Types- (- -- * Variable- Var- , VarSet- , VarMap- , validVar-- -- * Model- , Model-- -- * Literal- , Lit- , LitSet- , LitMap- , litUndef- , validLit- , literal- , litNot- , litVar- , litPolarity- , evalLit-- -- * Clause- , Clause- , normalizeClause-- -- * Cardinality Constraint- , normalizeAtLeast-- -- * Pseudo Boolean Constraint- , normalizePBSum- , normalizePBAtLeast- , normalizePBExactly- , cutResolve- , cardinalityReduction- , negatePBAtLeast- , pbEval- , pbLowerBound- , pbUpperBound- ) where--import Control.Monad-import Control.Exception-import Data.Array.Unboxed-import Data.Ord-import Data.List-import Data.IntMap (IntMap)-import qualified Data.IntMap as IntMap-import Data.IntSet (IntSet)-import qualified Data.IntSet as IntSet---- | Variable is represented as positive integers (DIMACS format).-type Var = Int--type VarSet = IntSet-type VarMap = IntMap--{-# INLINE validVar #-}-validVar :: Var -> Bool-validVar v = v > 0---- | A model is represented as a mapping from variables to its values.-type Model = UArray Var Bool---- | Positive (resp. negative) literals are represented as positive (resp.--- negative) integers. (DIMACS format).-type Lit = Int--{-# INLINE litUndef #-}-litUndef :: Lit-litUndef = 0--type LitSet = IntSet-type LitMap = IntMap--{-# INLINE validLit #-}-validLit :: Lit -> Bool-validLit l = l /= 0--{-# INLINE literal #-}--- | Construct a literal from a variable and its polarity.--- 'True' (resp 'False') means positive (resp. negative) literal.-literal :: Var -- ^ variable- -> Bool -- ^ polarity- -> Lit-literal v polarity =- assert (validVar v) $ if polarity then v else litNot v--{-# INLINE litNot #-}--- | Negation of the 'Lit'.-litNot :: Lit -> Lit-litNot l = assert (validLit l) $ negate l--{-# INLINE litVar #-}--- | Underlying variable of the 'Lit'-litVar :: Lit -> Var-litVar l = assert (validLit l) $ abs l--{-# INLINE litPolarity #-}--- | Polarity of the 'Lit'.--- 'True' means positive literal and 'False' means negative literal.-litPolarity :: Lit -> Bool-litPolarity l = assert (validLit l) $ l > 0--{-# INLINE evalLit #-}-evalLit :: Model -> Lit -> Bool-evalLit m l = if l > 0 then m ! l else not (m ! abs l)---- | Disjunction of 'Lit'.-type Clause = [Lit]---- | Normalizing clause------ 'Nothing' if the clause is trivially true.-normalizeClause :: Clause -> Maybe Clause-normalizeClause lits = assert (IntSet.size ys `mod` 2 == 0) $- if IntSet.null ys- then Just (IntSet.toList xs)- else Nothing- where- xs = IntSet.fromList lits- ys = xs `IntSet.intersection` (IntSet.map litNot xs)--normalizeAtLeast :: ([Lit],Int) -> ([Lit],Int)-normalizeAtLeast (lits,n) = assert (IntSet.size ys `mod` 2 == 0) $- (IntSet.toList lits', n')- where- xs = IntSet.fromList lits- ys = xs `IntSet.intersection` (IntSet.map litNot xs)- lits' = xs `IntSet.difference` ys- n' = n - (IntSet.size ys `div` 2)---- | normalizing PB term of the form /c1 x1 + c2 x2 ... cn xn + c/ into--- /d1 x1 + d2 x2 ... dm xm + d/ where d1,...,dm ≥ 1.-normalizePBSum :: ([(Integer,Lit)], Integer) -> ([(Integer,Lit)], Integer)-normalizePBSum = step2 . step1- where- -- 同じ変数が複数回現れないように、一度全部 @v@ に統一。- step1 :: ([(Integer,Lit)], Integer) -> ([(Integer,Lit)], Integer)- step1 (xs,n) =- case loop (IntMap.empty,n) xs of- (ys,n') -> ([(c,v) | (v,c) <- IntMap.toList ys], n')- where- loop :: (VarMap Integer, Integer) -> [(Integer,Lit)] -> (VarMap Integer, Integer)- loop (ys,m) [] = (ys,m)- loop (ys,m) ((c,l):zs) =- if litPolarity l- then loop (IntMap.insertWith (+) l c ys, m) zs- else loop (IntMap.insertWith (+) (litNot l) (negate c) ys, m+c) zs-- -- 係数が0のものも取り除き、係数が負のリテラルを反転することで、- -- 係数が正になるようにする。- step2 :: ([(Integer,Lit)], Integer) -> ([(Integer,Lit)], Integer)- step2 (xs,n) = loop ([],n) xs- where- loop (ys,m) [] = (ys,m)- loop (ys,m) (t@(c,l):zs)- | c == 0 = loop (ys,m) zs- | c < 0 = loop ((negate c,litNot l):ys, m+c) zs- | otherwise = loop (t:ys,m) zs---- | normalizing PB constraint of the form /c1 x1 + c2 cn ... cn xn >= b/.-normalizePBAtLeast :: ([(Integer,Lit)], Integer) -> ([(Integer,Lit)], Integer)-normalizePBAtLeast a =- case step1 a of- (xs,n)- | n > 0 -> step3 (saturate n xs, n)- | otherwise -> ([], 0) -- trivially true- where- step1 :: ([(Integer,Lit)], Integer) -> ([(Integer,Lit)], Integer)- step1 (xs,n) =- case normalizePBSum (xs,-n) of- (ys,m) -> (ys, -m)-- -- degree以上の係数はそこで抑える。- saturate :: Integer -> [(Integer,Lit)] -> [(Integer,Lit)]- saturate n xs = [assert (c>0) (min n c, l) | (c,l) <- xs]-- -- omega test と同様の係数の gcd による単純化- step3 :: ([(Integer,Lit)], Integer) -> ([(Integer,Lit)], Integer)- step3 ([],n) = ([],n)- step3 (xs,n) = ([(c `div` d, l) | (c,l) <- xs], (n+d-1) `div` d)- where- d = foldl1' gcd [c | (c,_) <- xs]---- | normalizing PB constraint of the form /c1 x1 + c2 cn ... cn xn = b/.-normalizePBExactly :: ([(Integer,Lit)], Integer) -> ([(Integer,Lit)], Integer)-normalizePBExactly a =- case step1 $ a of- (xs,n)- | n >= 0 -> step2 (xs, n)- | otherwise -> ([], 1) -- false- where- step1 :: ([(Integer,Lit)], Integer) -> ([(Integer,Lit)], Integer)- step1 (xs,n) =- case normalizePBSum (xs,-n) of- (ys,m) -> (ys, -m)-- -- omega test と同様の係数の gcd による単純化- step2 :: ([(Integer,Lit)], Integer) -> ([(Integer,Lit)], Integer)- step2 ([],n) = ([],n)- step2 (xs,n)- | n `mod` d == 0 = ([(c `div` d, l) | (c,l) <- xs], n `div` d)- | otherwise = ([], 1) -- false- where- d = foldl1' gcd [c | (c,_) <- xs]--cutResolve :: ([(Integer,Lit)],Integer) -> ([(Integer,Lit)],Integer) -> Var -> ([(Integer,Lit)],Integer)-cutResolve (lhs1,rhs1) (lhs2,rhs2) v = assert (l1 == litNot l2) $ normalizePBAtLeast pb- where- (c1,l1) = head [(c,l) | (c,l) <- lhs1, litVar l == v]- (c2,l2) = head [(c,l) | (c,l) <- lhs2, litVar l == v]- g = gcd c1 c2- s1 = c2 `div` g- s2 = c1 `div` g- pb = ([(s1*c,l) | (c,l) <- lhs1] ++ [(s2*c,l) | (c,l) <- lhs2], s1*rhs1 + s2 * rhs2)--cardinalityReduction :: ([(Integer,Lit)],Integer) -> ([Lit],Int)-cardinalityReduction (lhs,rhs) = (ls, rhs')- where- rhs' = go1 0 0 (sortBy (flip (comparing fst)) lhs)-- go1 !s !k ((a,_):ts)- | s < rhs = go1 (s+a) (k+1) ts- | otherwise = k- go1 _ _ [] = error "cardinalityReduction: should not happen"-- ls = go2 (minimum (rhs : map (subtract 1 . fst) lhs)) (sortBy (comparing fst) lhs)-- go2 !guard' ((a,_) : ts)- | a - 1 < guard' = go2 (guard' - a) ts- | otherwise = map snd ts- go2 _ [] = error "cardinalityReduction: should not happen"--negatePBAtLeast :: ([(Integer, Lit)], Integer) -> ([(Integer, Lit)], Integer)-negatePBAtLeast (xs, rhs) = ([(-c,lit) | (c,lit)<-xs] , -rhs + 1)--pbEval :: Model -> [(Integer, Lit)] -> Integer-pbEval m xs = sum [c | (c,lit) <- xs, evalLit m lit]--pbLowerBound :: [(Integer, Lit)] -> Integer-pbLowerBound xs = sum [if c < 0 then c else 0 | (c,_) <- xs]--pbUpperBound :: [(Integer, Lit)] -> Integer-pbUpperBound xs = sum [if c > 0 then c else 0 | (c,_) <- xs]
− src/Text/GCNF.hs
@@ -1,93 +0,0 @@-{-# OPTIONS_GHC -Wall #-}--------------------------------------------------------------------------------- |--- Module : Text.GCNF--- Copyright : (c) Masahiro Sakai 2012--- License : BSD-style--- --- Maintainer : masahiro.sakai@gmail.com--- Stability : provisional--- Portability : portable--- --- References:--- --- * <http://www.satcompetition.org/2011/rules.pdf>-------------------------------------------------------------------------------------module Text.GCNF- (- GCNF (..)- , GroupIndex- , GClause-- -- * Parsing .gcnf files- , parseString- , parseFile- ) where--import qualified SAT.Types as SAT-import Text.Util--data GCNF- = GCNF- { numVars :: !Int- , numClauses :: !Int- , lastGroupIndex :: !GroupIndex- , clauses :: [GClause]- }--type GroupIndex = Int--type GClause = (GroupIndex, SAT.Clause)--parseString :: String -> Either String GCNF-parseString s =- case words l of- (["p","gcnf", nbvar', nbclauses', lastGroupIndex']) ->- Right $- GCNF- { numVars = read nbvar'- , numClauses = read nbclauses'- , lastGroupIndex = read lastGroupIndex'- , clauses = map parseLine ls- }- (["p","cnf", nbvar', nbclause']) ->- Right $- GCNF- { numVars = read nbvar'- , numClauses = read nbclause'- , lastGroupIndex = read nbclause'- , clauses = zip [1..] $ map parseCNFLine ls- }- _ ->- Left "cannot find gcnf header"- where- (l:ls) = filter (not . isComment) (lines s)--parseFile :: FilePath -> IO (Either String GCNF)-parseFile filename = do- s <- readFile filename- return $ parseString s--isComment :: String -> Bool-isComment ('c':_) = True-isComment _ = False--parseLine :: String -> GClause-parseLine s =- case words s of- (('{':w):xs) ->- let ys = map readInt $ init xs- idx = readInt $ init w- in seq idx $ seqList ys $ (idx, ys)- _ -> error "parse error"--parseCNFLine :: String -> SAT.Clause-parseCNFLine s = seq xs $ seqList xs $ xs- where- xs = init (map readInt (words s))--seqList :: [a] -> b -> b-seqList [] b = b-seqList (x:xs) b = seq x $ seqList xs b
− src/Text/GurobiSol.hs
@@ -1,18 +0,0 @@-module Text.GurobiSol- ( Model- , render- ) where--import Data.Map (Map)-import qualified Data.Map as Map-import Data.Ratio--type Model = Map String Double--render :: Model -> Maybe Double -> String-render m obj = unlines $ ls1 ++ ls2- where- ls1 = case obj of- Nothing -> []- Just val -> ["# Objective value = " ++ show val]- ls2 = [name ++ " " ++ show val | (name,val) <- Map.toList m]
− src/Text/LPFile.hs
@@ -1,754 +0,0 @@-{-# OPTIONS_GHC -Wall -fno-warn-unused-do-bind #-}--------------------------------------------------------------------------------- |--- Module : Text.LPFile--- Copyright : (c) Masahiro Sakai 2011--- License : BSD-style--- --- Maintainer : masahiro.sakai@gmail.com--- Stability : provisional--- Portability : portable------ A CPLEX .lp format parser library.--- --- References:--- --- * <http://publib.boulder.ibm.com/infocenter/cosinfoc/v12r2/index.jsp?topic=/ilog.odms.cplex.help/Content/Optimization/Documentation/CPLEX/_pubskel/CPLEX880.html>--- --- * <http://www.gurobi.com/doc/45/refman/node589.html>--- --- * <http://lpsolve.sourceforge.net/5.5/CPLEX-format.htm>----------------------------------------------------------------------------------module Text.LPFile- ( LP (..)- , Expr- , Term (..)- , OptDir (..)- , ObjectiveFunction- , ConstraintType (..)- , Constraint (..)- , Bounds- , Label- , Var- , VarType (..)- , VarInfo (..)- , BoundExpr (..)- , RelOp (..)- , SOSType (..)- , SOS- , defaultBounds- , defaultLB- , defaultUB- , getVarInfo- , getVarType- , getBounds- , integerVariables- , semiContinuousVariables- , parseString- , parseFile- , render- ) where--import Control.Monad-import Control.Monad.Writer-import Data.Char-import Data.List-import Data.Maybe-import Data.Ratio-import Data.Map (Map)-import qualified Data.Map as Map-import Data.Set (Set)-import qualified Data.Set as Set-import Data.OptDir-import Text.ParserCombinators.Parsec hiding (label)--import Util (combineMaybe)---- ------------------------------------------------------------------------------- | Problem-data LP- = LP- { variables :: Set Var- , dir :: OptDir- , objectiveFunction :: ObjectiveFunction- , constraints :: [Constraint]- , varInfo :: Map Var VarInfo- , sos :: [SOS]- }- deriving (Show, Eq, Ord)---- | expressions-type Expr = [Term]---- | terms-data Term = Term Rational [Var]- deriving (Eq, Ord, Show)---- | objective function-type ObjectiveFunction = (Maybe Label, Expr)--data ConstraintType- = NormalConstraint- | LazyConstraint- | UserDefinedCut- deriving (Eq, Ord, Bounded, Enum, Show)---- | constraint-data Constraint- = Constraint- { constrType :: ConstraintType- , constrLabel :: Maybe Label- , constrIndicator :: Maybe (Var, Rational)- , constrBody :: (Expr, RelOp, Rational)- }- deriving (Eq, Ord, Show)--data VarType- = ContinuousVariable- | IntegerVariable--- 'nothaddock' is inserted not to confuse haddock- -- nothaddock | BinaryVariable- | SemiContinuousVariable- -- nothaddock | SemiIntegerVariable- deriving (Eq, Ord, Show)--data VarInfo- = VarInfo- { varName :: Var- , varType :: VarType- , varBounds :: Bounds- }- deriving (Eq, Ord, Show)--defaultVarInfo :: VarInfo-defaultVarInfo- = VarInfo- { varName = ""- , varType = ContinuousVariable- , varBounds = defaultBounds- }---- | type for representing lower/upper bound of variables-type Bounds = (BoundExpr, BoundExpr)---- | label-type Label = String---- | variable-type Var = String---- | type for representing lower/upper bound of variables-data BoundExpr = NegInf | Finite Rational | PosInf- deriving (Eq, Ord, Show)---- | relational operators-data RelOp = Le | Ge | Eql- deriving (Eq, Ord, Enum, Show)---- | types of SOS (special ordered sets) constraints-data SOSType- = S1 -- ^ Type 1 SOS constraint- | S2 -- ^ Type 2 SOS constraint- deriving (Eq, Ord, Enum, Show, Read)---- | SOS (special ordered sets) constraints-type SOS = (Maybe Label, SOSType, [(Var, Rational)])--class Variables a where- vars :: a -> Set Var--instance Variables a => Variables [a] where- vars = Set.unions . map vars--instance Variables LP where- vars = variables--instance Variables Term where- vars (Term _ xs) = Set.fromList xs--instance Variables Constraint where- vars Constraint{ constrIndicator = ind, constrBody = (lhs, _, _) } =- vars lhs `Set.union` vs2- where- vs2 = maybe Set.empty (Set.singleton . fst) ind---- | default bounds-defaultBounds :: Bounds-defaultBounds = (defaultLB, defaultUB)---- | default lower bound (0)-defaultLB :: BoundExpr-defaultLB = Finite 0---- | default upper bound (+∞)-defaultUB :: BoundExpr-defaultUB = PosInf---- | looking up attributes for a variable-getVarInfo :: LP -> Var -> VarInfo-getVarInfo lp v = Map.findWithDefault defaultVarInfo v (varInfo lp)---- | looking up bounds for a variable-getVarType :: LP -> Var -> VarType-getVarType lp v = varType $ getVarInfo lp v---- | looking up bounds for a variable-getBounds :: LP -> Var -> Bounds-getBounds lp v = varBounds $ getVarInfo lp v--intersectBounds :: Bounds -> Bounds -> Bounds-intersectBounds (lb1,ub1) (lb2,ub2) = (max lb1 lb2, min ub1 ub2)--integerVariables :: LP -> Set Var-integerVariables lp = Map.keysSet $ Map.filter p (varInfo lp)- where- p VarInfo{ varType = vt } = vt == IntegerVariable--semiContinuousVariables :: LP -> Set Var-semiContinuousVariables lp = Map.keysSet $ Map.filter p (varInfo lp)- where- p VarInfo{ varType = vt } = vt == SemiContinuousVariable---- ------------------------------------------------------------------------------- | Parse a string containing LP file data.--- The source name is only | used in error messages and may be the empty string.-parseString :: SourceName -> String -> Either ParseError LP-parseString = parse lpfile---- | Parse a file containing LP file data.-parseFile :: FilePath -> IO (Either ParseError LP)-parseFile = parseFromFile lpfile---- -----------------------------------------------------------------------------char' :: Char -> Parser Char-char' c = (char c <|> char (toUpper c)) <?> show c--string' :: String -> Parser ()-string' s = mapM_ char' s <?> show s--sep :: Parser ()-sep = skipMany ((comment >> return ()) <|> (space >> return ()))--comment :: Parser String-comment = do- char '\\'- manyTill anyChar (try newline)--tok :: Parser a -> Parser a-tok p = do- x <- p- sep- return x--ident :: Parser String-ident = tok $ do- x <- letter <|> oneOf syms1 - xs <- many (alphaNum <|> oneOf syms2)- let s = x:xs - guard $ map toLower s `Set.notMember` reserved- return s- where- syms1 = "!\"#$%&()/,;?@_`'{}|~"- syms2 = '.' : syms1--label :: Parser Label-label = do- name <- ident- tok $ char ':'- return name--reserved :: Set String-reserved = Set.fromList- [ "bound", "bounds"- , "gen", "general", "generals"- , "bin", "binary", "binaries"- , "semi", "semi-continuous", "semis"- , "sos"- , "end"- , "subject"- ]---- -----------------------------------------------------------------------------lpfile :: Parser LP-lpfile = do- sep- (flag, obj) <- problem-- cs <- liftM concat $ many $ msum $- [ constraintSection- , lazyConstraintsSection- , userCutsSection- ]-- bnds <- option Map.empty (try boundsSection)- exvs <- many (liftM Left generalSection <|> liftM Right binarySection)- let ints = Set.fromList $ concat [x | Left x <- exvs]- bins = Set.fromList $ concat [x | Right x <- exvs]- bnds2 <- return $ Map.unionWith intersectBounds- bnds (Map.fromAscList [(v, (Finite 0, Finite 1)) | v <- Set.toAscList bins])- scs <- liftM Set.fromList $ option [] (try semiSection)-- ss <- option [] (try sosSection)- end- let vs = Set.unions $ map vars cs ++- [ Map.keysSet bnds2- , ints- , bins- , scs- , vars (snd obj)- ] ++- [Set.fromList (map fst xs) | (_,_,xs) <- ss]- return $- LP- { variables = vs- , dir = flag- , objectiveFunction = obj- , constraints = cs- , sos = ss- , varInfo =- Map.fromAscList- [ ( v- , VarInfo- { varName = v- , varBounds = Map.findWithDefault defaultBounds v bnds2- , varType =- if v `Set.member` ints || v `Set.member` bins then IntegerVariable- else if v `Set.member` scs then SemiContinuousVariable- else ContinuousVariable- }- )- | v <- Set.toAscList vs- ]- }--problem :: Parser (OptDir, ObjectiveFunction)-problem = do- flag <- (try minimize >> return OptMin)- <|> (try maximize >> return OptMax)- name <- optionMaybe (try label)- obj <- expr- return (flag, (name, obj))--minimize, maximize :: Parser ()-minimize = tok $ string' "min" >> optional (string' "imize")-maximize = tok $ string' "max" >> optional (string' "imize")--end :: Parser ()-end = tok $ string' "end"---- -----------------------------------------------------------------------------constraintSection :: Parser [Constraint]-constraintSection = subjectTo >> many (try (constraint NormalConstraint))--subjectTo :: Parser ()-subjectTo = msum- [ try $ tok (string' "subject") >> tok (string' "to")- , try $ tok (string' "such") >> tok (string' "that")- , try $ tok (string' "st")- , try $ tok (string' "s") >> optional (tok (char '.')) >> tok (string' "t")- >> tok (char '.') >> return ()- ]--constraint :: ConstraintType -> Parser Constraint-constraint t = do- name <- optionMaybe (try label)-- g <- optionMaybe $ try $ do- var <- ident- tok (char '=')- val <- tok ((char '0' >> return 0) <|> (char '1' >> return 1))- tok $ string "->"- return (var, val)-- -- It seems that CPLEX allows empty lhs, but GLPK rejects it.- e <- expr- op <- relOp- s <- option 1 sign- rhs <- number- return $ Constraint- { constrType = t- , constrLabel = name- , constrIndicator = g- , constrBody = (e, op, s*rhs)- }--relOp :: Parser RelOp-relOp = tok $ msum- [ char '<' >> optional (char '=') >> return Le- , char '>' >> optional (char '=') >> return Ge- , char '=' >> msum [ char '<' >> return Le- , char '>' >> return Ge- , return Eql- ]- ]--lazyConstraintsSection :: Parser [Constraint]-lazyConstraintsSection = do- tok $ string' "lazy"- tok $ string' "constraints"- many $ try $ constraint LazyConstraint--userCutsSection :: Parser [Constraint]-userCutsSection = do- tok $ string' "user"- tok $ string' "cuts"- many $ try $ constraint $ UserDefinedCut--type Bounds2 = (Maybe BoundExpr, Maybe BoundExpr)--boundsSection :: Parser (Map Var Bounds)-boundsSection = do- tok $ string' "bound" >> optional (char' 's')- liftM (Map.map g . Map.fromListWith f) $ many (try bound)- where- f (lb1,ub1) (lb2,ub2) = (combineMaybe max lb1 lb2, combineMaybe min ub1 ub2)- g (lb, ub) = ( fromMaybe defaultLB lb- , fromMaybe defaultUB ub- )--bound :: Parser (Var, Bounds2)-bound = msum- [ try $ do- v <- try ident- msum- [ do- op <- relOp- b <- boundExpr- return- ( v- , case op of- Le -> (Nothing, Just b)- Ge -> (Just b, Nothing)- Eql -> (Just b, Just b)- )- , do- tok $ string' "free"- return (v, (Just NegInf, Just PosInf))- ]- , do- b1 <- liftM Just boundExpr- op1 <- relOp- guard $ op1 == Le- v <- ident- b2 <- option Nothing $ do- op2 <- relOp- guard $ op2 == Le- liftM Just boundExpr- return (v, (b1, b2))- ]--boundExpr :: Parser BoundExpr-boundExpr = msum - [ try (tok (char '+') >> inf >> return PosInf)- , try (tok (char '-') >> inf >> return NegInf)- , do- s <- option 1 sign- x <- number- return $ Finite (s*x)- ]--inf :: Parser ()-inf = tok (string "inf" >> optional (string "inity"))---- -----------------------------------------------------------------------------generalSection :: Parser [Var]-generalSection = do- tok $ string' "gen" >> optional (string' "eral" >> optional (string' "s"))- many (try ident)--binarySection :: Parser [Var]-binarySection = do- tok $ string' "bin" >> optional (string' "ar" >> (string' "y" <|> string' "ies"))- many (try ident)--semiSection :: Parser [Var]-semiSection = do- tok $ string' "semi" >> optional (string' "-continuous" <|> string' "s")- many (try ident)--sosSection :: Parser [SOS]-sosSection = do- tok $ string' "sos"- many $ try $ do- (l,t) <- try (do{ l <- label; t <- typ; return (Just l, t) })- <|> (do{ t <- typ; return (Nothing, t) })- xs <- many $ try $ do- v <- ident- tok $ char ':'- w <- number- return (v,w)- return (l,t,xs)- where- typ = do- t <- tok $ (char' 's' >> ((char '1' >> return S1) <|> (char '2' >> return S2)))- tok (string "::")- return t---- -----------------------------------------------------------------------------expr :: Parser Expr-expr = try expr1 <|> return []- where- expr1 :: Parser Expr- expr1 = do- t <- term True- ts <- many (term False)- return $ concat (t : ts)--sign :: Num a => Parser a-sign = tok ((char '+' >> return 1) <|> (char '-' >> return (-1)))--term :: Bool -> Parser Expr-term flag = do- s <- if flag then optionMaybe sign else liftM Just sign- c <- optionMaybe number- e <- liftM (\s' -> [Term 1 [s']]) ident <|> qexpr- return $ case combineMaybe (*) s c of- Nothing -> e- Just d -> [Term (d*c') vs | Term c' vs <- e]--qexpr :: Parser Expr-qexpr = do- tok (char '[')- t <- qterm True- ts <- many (qterm False)- tok (char ']')- -- Gurobi allows ommiting "/2"- (do mapM_ (tok . char) "/2"- return [Term (r / 2) vs | Term r vs <- t:ts])- <|> return (t:ts)--qterm :: Bool -> Parser Term-qterm flag = do- s <- if flag then optionMaybe sign else liftM Just sign- c <- optionMaybe number- es <- qfactor `chainl1` (tok (char '*') >> return (++))- return $ case combineMaybe (*) s c of- Nothing -> Term 1 es- Just d -> Term d es--qfactor :: Parser [Var]-qfactor = do- v <- ident- msum [ tok (char '^') >> tok (char '2') >> return [v,v]- , return [v]- ]--number :: Parser Rational-number = tok $ do- b <- (do{ x <- nat; y <- option 0 frac; return (fromInteger x + y) })- <|> frac- c <- option 0 e- return (b*10^^c)- where- digits = many1 digit-- nat :: Parser Integer- nat = liftM read digits-- frac :: Parser Rational- frac = do- char '.'- s <- digits- return (read s % 10^(length s))-- e :: Parser Integer- e = do- oneOf "eE"- f <- msum [ char '+' >> return id- , char '-' >> return negate- , return id- ]- liftM f nat---- ------------------------------------------------------------------------------- | Render a problem into a string.-render :: LP -> Maybe String-render lp = fmap ($ "") $ execWriterT (render' lp)--render' :: LP -> WriterT ShowS Maybe ()-render' lp = do- tell $ showString $- case dir lp of- OptMin -> "MINIMIZE"- OptMax -> "MAXIMIZE"- tell $ showChar '\n'-- do- let (l, obj) = objectiveFunction lp- renderLabel l- renderExpr True obj- tell $ showChar '\n'-- tell $ showString "SUBJECT TO\n"- forM_ (constraints lp) $ \c -> do- when (constrType c == NormalConstraint) $ do- renderConstraint c- tell $ showChar '\n'-- let lcs = [c | c <- constraints lp, constrType c == LazyConstraint]- unless (null lcs) $ do- tell $ showString "LAZY CONSTRAINTS\n"- forM_ lcs $ \c -> do- renderConstraint c- tell $ showChar '\n'-- let cuts = [c | c <- constraints lp, constrType c == UserDefinedCut]- unless (null cuts) $ do- tell $ showString "USER CUTS\n"- forM_ cuts $ \c -> do- renderConstraint c- tell $ showChar '\n'-- let ivs = integerVariables lp- (bins,gens) = Set.partition (\v -> getBounds lp v == (Finite 0, Finite 1)) ivs- scs = semiContinuousVariables lp-- tell $ showString "BOUNDS\n"- forM_ (Map.toAscList (varInfo lp)) $ \(v, VarInfo{ varBounds = (lb,ub) }) -> do- unless (v `Set.member` bins) $ do- renderBoundExpr lb- tell $ showString " <= "- tell $ showString v- tell $ showString " <= "- renderBoundExpr ub- tell $ showChar '\n'-- unless (Set.null gens) $ do- tell $ showString "GENERALS\n"- renderVariableList $ Set.toList gens-- unless (Set.null bins) $ do- tell $ showString "BINARIES\n"- renderVariableList $ Set.toList bins-- unless (Set.null scs) $ do- tell $ showString "SEMI-CONTINUOUS\n"- renderVariableList $ Set.toList scs-- unless (null (sos lp)) $ do- tell $ showString "SOS\n"- forM_ (sos lp) $ \(l, typ, xs) -> do- renderLabel l- tell $ shows typ- tell $ showString " ::"- forM_ xs $ \(v, r) -> do- tell $ showString " "- tell $ showString v- tell $ showString " : "- tell $ showValue r- tell $ showChar '\n'-- tell $ showString "END\n"---- FIXME: Gurobi は quadratic term が最後に一つある形式でないとダメっぽい-renderExpr :: Bool -> Expr -> WriterT ShowS Maybe ()-renderExpr isObj e = fill 80 (ts1 ++ ts2)- where- (ts,qts) = partition isLin e - isLin (Term _ []) = True- isLin (Term _ [_]) = True- isLin _ = False-- ts1 = map f ts- ts2- | null qts = []- | otherwise =- -- マイナスで始めるとSCIP 2.1.1 は「cannot have '-' in front of quadratic part ('[')」というエラーを出す- ["+ ["] ++ map g qts ++ [if isObj then "] / 2" else "]"]-- f :: Term -> String- f (Term c []) = showConstTerm c ""- f (Term c [v]) = showCoeff c v- f _ = error "should not happen"-- g :: Term -> String- g (Term c vs) = - (if isObj then showCoeff (2*c) else showCoeff c)- (intercalate " * " vs)--showValue :: Rational -> ShowS-showValue c =- if denominator c == 1- then shows (numerator c)- else shows (fromRational c :: Double)--showCoeff :: Rational -> ShowS-showCoeff c = s . v- where- c' = abs c- s = showString (if c >= 0 then "+ " else "- ")- v = (if c' /= 1 then showValue c' . showChar ' ' else id)--showConstTerm :: Rational -> ShowS-showConstTerm c = s . v- where- s = showString (if c >= 0 then "+ " else "- ")- v = showValue (abs c)--renderLabel :: Maybe Label -> WriterT ShowS Maybe ()-renderLabel l =- case l of- Nothing -> return ()- Just s -> tell $ showString s . showString ": "--renderOp :: RelOp -> WriterT ShowS Maybe ()-renderOp Le = tell $ showString "<="-renderOp Ge = tell $ showString ">="-renderOp Eql = tell $ showString "="--renderConstraint :: Constraint -> WriterT ShowS Maybe ()-renderConstraint c@Constraint{ constrBody = (e,op,val) } = do- renderLabel (constrLabel c)- case constrIndicator c of- Nothing -> return ()- Just (v,vval) -> do- tell $ showString v . showString " = "- tell $ showValue vval- tell $ showString " -> "-- renderExpr False e- tell $ showChar ' '- renderOp op- tell $ showChar ' '- tell $ showValue val--renderBoundExpr :: BoundExpr -> WriterT ShowS Maybe ()-renderBoundExpr (Finite r) = tell $ showValue r-renderBoundExpr NegInf = tell $ showString "-inf"-renderBoundExpr PosInf = tell $ showString "+inf"--renderVariableList :: [Var] -> WriterT ShowS Maybe ()-renderVariableList vs = fill 80 vs >> tell (showChar '\n')--fill :: Int -> [String] -> WriterT ShowS Maybe ()-fill width str = go str 0- where- go [] _ = return ()- go (x:xs) 0 = tell (showString x) >> go xs (length x)- go (x:xs) w =- if w + 1 + length x <= width- then tell (showChar ' ' . showString x) >> go xs (w + 1 + length x)- else tell (showChar '\n') >> go (x:xs) 0---- -----------------------------------------------------------------------------{--compileExpr :: Expr -> Maybe (Map Var Rational)-compileExpr e = do- xs <- forM e $ \(Term c vs) ->- case vs of- [v] -> return (v, c)- _ -> mzero- return (Map.fromList xs)--}---- ---------------------------------------------------------------------------
− src/Text/MPSFile.hs
@@ -1,537 +0,0 @@-{-# OPTIONS_GHC -Wall -fno-warn-unused-do-bind #-}--------------------------------------------------------------------------------- |--- Module : Text.MPSFile--- Copyright : (c) Masahiro Sakai 2012--- License : BSD-style--- --- Maintainer : masahiro.sakai@gmail.com--- Stability : provisional--- Portability : portable------ A .mps format parser library.--- --- References:--- --- * <http://pic.dhe.ibm.com/infocenter/cosinfoc/v12r4/topic/ilog.odms.cplex.help/CPLEX/File_formats_reference/topics/MPS_synopsis.html>--- --- * <http://pic.dhe.ibm.com/infocenter/cosinfoc/v12r4/topic/ilog.odms.cplex.help/CPLEX/File_formats_reference/topics/MPS_ext_synopsis.html>--- --- * <http://www.gurobi.com/documentation/5.0/reference-manual/node744>------ * <http://en.wikipedia.org/wiki/MPS_(format)>----------------------------------------------------------------------------------module Text.MPSFile- ( parseString- , parseFile- ) where--import Control.Monad-import Data.Maybe-import Data.Set (Set)-import qualified Data.Set as Set-import Data.Map (Map)-import qualified Data.Map as Map-import Data.Ratio--import qualified Text.ParserCombinators.Parsec as P-import Text.ParserCombinators.Parsec hiding (spaces, newline, Column)--import Data.OptDir-import qualified Text.LPFile as LPFile--type Column = String-type Row = String--data BoundType- = LO -- lower bound- | UP -- upper bound- | FX -- variable is fixed at the specified value- | FR -- free variable (no lower or upper bound)- | MI -- infinite lower bound- | PL -- infinite upper bound- | BV -- variable is binary (equal 0 or 1)- | LI -- lower bound for integer variable- | UI -- upper bound for integer variable- | SC -- upper bound for semi-continuous variable- deriving (Eq, Ord, Show, Read)---- ------------------------------------------------------------------------------- | Parse a string containing LP file data.--- The source name is only | used in error messages and may be the empty string.-parseString :: SourceName -> String -> Either ParseError LPFile.LP-parseString = parse mpsfile---- | Parse a file containing LP file data.-parseFile :: FilePath -> IO (Either ParseError LPFile.LP)-parseFile = parseFromFile mpsfile---- -----------------------------------------------------------------------------space' :: Parser Char-space' = oneOf [' ', '\t']--spaces' :: Parser ()-spaces' = skipMany space' >> return ()--spaces1' :: Parser ()-spaces1' = skipMany1 space' >> return ()--commentline :: Parser ()-commentline = do- _ <- char '*'- _ <- manyTill anyChar P.newline- return ()--newline' :: Parser ()-newline' = do- spaces'- _ <- P.newline- skipMany commentline- return ()--tok :: Parser a -> Parser a-tok p = do- x <- p- msum [spaces1', lookAhead (try (char '\n' >> return ())), eof]- return x--ident :: Parser String-ident = tok $ many1 $ noneOf [' ', '\t', '\n']--stringLn :: String -> Parser ()-stringLn s = string s >> newline'--sign :: Num a => Parser a-sign = (char '+' >> return 1) <|> (char '-' >> return (-1))--number :: Parser Rational-number = tok $ do- b <- (do{ s <- option 1 sign; x <- nat; y <- option 0 frac; return (s * (fromInteger x + y)) })- <|> frac- c <- option 0 e- return (b*10^^c)- where- digits = many1 digit-- nat :: Parser Integer- nat = liftM read digits-- frac :: Parser Rational- frac = do- char '.'- s <- digits- return (read s % 10^(length s))-- e :: Parser Integer- e = do- oneOf "eE"- f <- msum [ char '+' >> return id- , char '-' >> return negate- , return id- ]- liftM f nat---- -----------------------------------------------------------------------------mpsfile :: Parser LPFile.LP-mpsfile = do- many commentline-- _name <- nameSection-- -- http://pic.dhe.ibm.com/infocenter/cosinfoc/v12r4/topic/ilog.odms.cplex.help/CPLEX/File_formats_reference/topics/MPS_ext_objsen.html- -- CPLEX extends the MPS standard by allowing two additional sections: OBJSEN and OBJNAME.- -- If these options are used, they must appear in order and as the first and second sections after the NAME section. - objsense <- optionMaybe $ objSenseSection- objname <- optionMaybe $ objNameSection-- rows <- rowsSection-- -- http://pic.dhe.ibm.com/infocenter/cosinfoc/v12r4/topic/ilog.odms.cplex.help/CPLEX/File_formats_reference/topics/MPS_ext_usercuts.html- -- The order of sections must be ROWS USERCUTS. - usercuts <- option [] userCutsSection-- -- http://pic.dhe.ibm.com/infocenter/cosinfoc/v12r4/topic/ilog.odms.cplex.help/CPLEX/File_formats_reference/topics/MPS_ext_lazycons.html- -- The order of sections must be ROWS USERCUTS LAZYCONS.- lazycons <- option [] lazyConsSection-- (cols, intvs1) <- colsSection- rhss <- rhsSection- rngs <- option Map.empty rangesSection- bnds <- option [] boundsSection-- -- http://pic.dhe.ibm.com/infocenter/cosinfoc/v12r4/topic/ilog.odms.cplex.help/CPLEX/File_formats_reference/topics/MPS_ext_quadobj.html- -- Following the BOUNDS section, a QMATRIX section may be specified.- qobj <- msum [quadObjSection, qMatrixSection, return []]-- -- http://pic.dhe.ibm.com/infocenter/cosinfoc/v12r4/topic/ilog.odms.cplex.help/CPLEX/File_formats_reference/topics/MPS_ext_sos.html- -- Note that in an MPS file, the SOS section must follow the BOUNDS section.- sos <- option [] sosSection-- -- http://pic.dhe.ibm.com/infocenter/cosinfoc/v12r4/topic/ilog.odms.cplex.help/CPLEX/File_formats_reference/topics/MPS_ext_qcmatrix.html- -- QCMATRIX sections appear after the optional SOS section. - qterms <- liftM Map.fromList $ many qcMatrixSection-- -- http://pic.dhe.ibm.com/infocenter/cosinfoc/v12r4/topic/ilog.odms.cplex.help/CPLEX/File_formats_reference/topics/MPS_ext_indicators.html- -- The INDICATORS section follows any quadratic constraint section and any quadratic objective section.- inds <- option Map.empty indicatorsSection-- string "ENDATA"-- let objrow =- case objname of- Nothing -> head [row | (Nothing, row) <- rows] -- XXX- Just r -> r- objdir =- case objsense of- Nothing -> OptMin- Just d -> d- vs = Map.keysSet cols- intvs2 = Set.fromList [col | (t,col,_) <- bnds, t `elem` [BV,LI,UI]]- scvs = Set.fromList [col | (SC,col,_) <- bnds]-- let explicitBounds = Map.fromListWith f- [ case typ of- LO -> (col, (Just (LPFile.Finite val), Nothing))- UP -> (col, (Nothing, Just (LPFile.Finite val)))- FX -> (col, (Just (LPFile.Finite val), Just (LPFile.Finite val)))- FR -> (col, (Just LPFile.NegInf, Just LPFile.PosInf))- MI -> (col, (Just LPFile.NegInf, Nothing))- PL -> (col, (Nothing, Just LPFile.PosInf))- BV -> (col, (Just (LPFile.Finite 0), Just (LPFile.Finite 1)))- LI -> (col, (Just (LPFile.Finite val), Nothing))- UI -> (col, (Nothing, Just (LPFile.Finite val)))- SC -> (col, (Nothing, Just (LPFile.Finite val)))- | (typ,col,val) <- bnds ]- where- f (a1,b1) (a2,b2) = (g a1 a2, g b1 b2)- g _ (Just x) = Just x- g x Nothing = x-- let bounds = Map.fromList- [ case Map.lookup v explicitBounds of- Nothing ->- if v `Set.member` intvs1- then- -- http://eaton.math.rpi.edu/cplex90html/reffileformatscplex/reffileformatscplex9.html- -- If no bounds are specified for the variables within markers, bounds of 0 (zero) and 1 (one) are assumed.- (v, (LPFile.Finite 0, LPFile.Finite 1))- else- (v, (LPFile.Finite 0, LPFile.PosInf))- Just (Nothing, Just (LPFile.Finite ub)) | ub < 0 ->- {-- http://pic.dhe.ibm.com/infocenter/cosinfoc/v12r4/topic/ilog.odms.cplex.help/CPLEX/File_formats_reference/topics/MPS_records.html- If no bounds are specified, CPLEX assumes a lower- bound of 0 (zero) and an upper bound of +∞. If only a- single bound is specified, the unspecified bound- remains at 0 or +∞, whichever applies, with one- exception. If an upper bound of less than 0 is- specified and no other bound is specified, the lower- bound is automatically set to -∞. CPLEX deviates- slightly from a convention used by some MPS readers- when it encounters an upper bound of 0 (zero). Rather- than automatically set this variable’s lower bound to- -∞, CPLEX accepts both a lower and upper bound of 0,- effectively fixing that variable at 0. CPLEX resets- the lower bound to -∞ only if the upper bound is less- than 0. A warning message is issued when this- exception is encountered.- -}- (v, (LPFile.NegInf, LPFile.Finite ub))- {-- lp_solve uses 1 as default lower bound for semi-continuous variable.- <http://lpsolve.sourceforge.net/5.5/mps-format.htm>- But Gurobi Optimizer uses 0 as default lower bound for semi-continuous variable.- Here we adopt Gurobi's way.- -}-{-- Just (Nothing, ub) | v `Set.member` scvs ->- (v, (LPFile.Finite 1, fromMaybe LPFile.PosInf ub))--}- Just (lb,ub) ->- (v, (fromMaybe (LPFile.Finite 0) lb, fromMaybe LPFile.PosInf ub))- | v <- Set.toList vs ]-- let lp =- LPFile.LP- { LPFile.variables = vs- , LPFile.dir = objdir- , LPFile.objectiveFunction =- ( Just objrow- , [LPFile.Term c [col] | (col,m) <- Map.toList cols, c <- maybeToList (Map.lookup objrow m)] ++ qobj- )- , LPFile.constraints =- [ LPFile.Constraint- { LPFile.constrType = typ- , LPFile.constrLabel = Just row- , LPFile.constrIndicator = Map.lookup row inds- , LPFile.constrBody = (lhs, op2, rhs2)- }- | (typ, (Just op, row)) <- zip (repeat LPFile.NormalConstraint) rows ++- zip (repeat LPFile.UserDefinedCut) usercuts ++- zip (repeat LPFile.LazyConstraint) lazycons- , let lhs = [LPFile.Term c [col] | (col,m) <- Map.toList cols, c <- maybeToList (Map.lookup row m)]- ++ Map.findWithDefault [] row qterms- , let rhs = Map.findWithDefault 0 row rhss- , (op2,rhs2) <-- case Map.lookup row rngs of- Nothing -> return (op, rhs)- Just rng ->- case op of- LPFile.Ge -> [(LPFile.Ge, rhs), (LPFile.Le, rhs + abs rng)]- LPFile.Le -> [(LPFile.Ge, rhs - abs rng), (LPFile.Le, rhs)]- LPFile.Eql ->- if rng < 0- then [(LPFile.Ge, rhs + rng), (LPFile.Le, rhs)]- else [(LPFile.Ge, rhs), (LPFile.Le, rhs + rng)]- ]- , LPFile.varInfo =- Map.fromAscList- [ ( v- , LPFile.VarInfo- { LPFile.varName = v- , LPFile.varBounds = Map.findWithDefault LPFile.defaultBounds v bounds- , LPFile.varType =- if v `Set.member` intvs1 || v `Set.member` intvs2 then LPFile.IntegerVariable- else if v `Set.member` scvs then LPFile.SemiContinuousVariable- else LPFile.ContinuousVariable- }- )- | v <- Set.toAscList vs- ]- , LPFile.sos = sos- }-- return lp--nameSection :: Parser (Maybe String)-nameSection = do- string "NAME"- n <- optionMaybe $ do- spaces1'- ident- newline'- return n--objSenseSection :: Parser OptDir-objSenseSection = do- try $ stringLn "OBJSENSE"- spaces1'- d <- (try (stringLn "MAX") >> return OptMax)- <|> (stringLn "MIN" >> return OptMin)- return d--objNameSection :: Parser String-objNameSection = do- try $ stringLn "OBJNAME"- spaces1'- name <- ident- newline'- return name--rowsSection :: Parser [(Maybe LPFile.RelOp, Row)]-rowsSection = do- try $ stringLn "ROWS"- rowsBody--userCutsSection :: Parser [(Maybe LPFile.RelOp, Row)]-userCutsSection = do- try $ stringLn "USERCUTS"- rowsBody--lazyConsSection :: Parser [(Maybe LPFile.RelOp, Row)]-lazyConsSection = do- try $ stringLn "LAZYCONS"- rowsBody--rowsBody :: Parser [(Maybe LPFile.RelOp, Row)]-rowsBody = many $ do- spaces1'- op <- msum- [ char 'N' >> return Nothing- , char 'G' >> return (Just LPFile.Ge)- , char 'L' >> return (Just LPFile.Le)- , char 'E' >> return (Just LPFile.Eql)- ]- spaces1'- name <- ident- newline'- return (op, name)--colsSection :: Parser (Map Column (Map Row Rational), Set Column)-colsSection = do- try $ stringLn "COLUMNS"- body False Map.empty Set.empty- where- body :: Bool -> Map Column (Map Row Rational) -> Set Column -> Parser (Map Column (Map Row Rational), Set Column)- body isInt rs ivs = msum- [ do isInt' <- try intMarker- body isInt' rs ivs- , do (k,v) <- entry- let rs' = Map.insertWith Map.union k v rs- ivs' = if isInt then Set.insert k ivs else ivs- seq rs' $ seq ivs' $ body isInt rs' ivs'- , return (rs, ivs)- ]-- intMarker :: Parser Bool- intMarker = do- spaces1'- _marker <- ident - string "'MARKER'"- spaces1'- b <- (try (string "'INTORG'") >> return True)- <|> (string "'INTEND'" >> return False)- newline'- return b-- entry :: Parser (Column, Map Row Rational)- entry = do- spaces1'- col <- ident- rv1 <- rowAndVal- opt <- optionMaybe rowAndVal- newline'- case opt of- Nothing -> return (col, rv1)- Just rv2 -> return (col, Map.union rv1 rv2)--rowAndVal :: Parser (Map Row Rational)-rowAndVal = do- row <- ident- val <- number- return $ Map.singleton row val--rhsSection :: Parser (Map Row Rational)-rhsSection = do- try $ stringLn "RHS"- liftM Map.unions $ many entry- where- entry = do- spaces1'- _name <- ident- rv1 <- rowAndVal- opt <- optionMaybe rowAndVal- newline'- case opt of- Nothing -> return rv1- Just rv2 -> return $ Map.union rv1 rv2--rangesSection :: Parser (Map Row Rational)-rangesSection = do- try $ stringLn "RANGES"- liftM Map.unions $ many entry- where- entry = do- spaces1'- _name <- ident- rv1 <- rowAndVal- opt <- optionMaybe rowAndVal- newline'- case opt of- Nothing -> return rv1- Just rv2 -> return $ Map.union rv1 rv2--boundsSection :: Parser [(BoundType, Column, Rational)]-boundsSection = do- try $ stringLn "BOUNDS"- many entry- where- entry = do- spaces1'- typ <- boundType- _name <- ident- col <- ident- val <- if typ `elem` [FR, BV, MI, PL]- then return 0- else number- newline'- return (typ, col, val)--boundType :: Parser BoundType-boundType = tok $ do- let ks = ["LO", "UP", "FX", "FR", "MI", "PL", "BV", "LI", "UI", "SC"]- msum [try (string k) >> return (read k) | k <- ks]--sosSection :: Parser [(Maybe String, LPFile.SOSType, [(Column, Rational)])]-sosSection = do- try $ stringLn "SOS"- many entry- where- entry = do- spaces1'- typ <- (try (string "S1") >> return LPFile.S1)- <|> (string "S2" >> return LPFile.S2)- spaces1'- name <- ident- newline'- xs <- many (try identAndVal)- return (Just name, typ, xs)-- identAndVal :: Parser (Row, Rational)- identAndVal = do- spaces1'- row <- ident- val <- number- newline'- return (row, val)--quadObjSection :: Parser [LPFile.Term]-quadObjSection = do- try $ stringLn "QUADOBJ"- many entry- where- entry = do- spaces1'- col1 <- ident- col2 <- ident- val <- number- newline'- return $ LPFile.Term (if col1 /= col2 then val else val / 2) [col1, col2]--qMatrixSection :: Parser [LPFile.Term]-qMatrixSection = do- try $ stringLn "QMATRIX"- many entry- where- entry = do- spaces1'- col1 <- ident- col2 <- ident- val <- number- newline'- return $ LPFile.Term (val / 2) [col1, col2]--qcMatrixSection :: Parser (Row, [LPFile.Term])-qcMatrixSection = do- try $ stringLn "QCMATRIX"- spaces1'- row <- ident- xs <- many entry- return (row, xs)- where- entry = do- spaces1'- col1 <- ident- col2 <- ident- val <- number- newline'- return $ LPFile.Term val [col1, col2]--indicatorsSection :: Parser (Map Row (Column, Rational))-indicatorsSection = do- try $ stringLn "INDICATORS"- liftM Map.fromList $ many entry- where- entry = do- spaces1'- string "IF"- spaces1'- row <- ident- var <- ident- val <- number- newline'- return (row, (var, val))
− src/Text/MaxSAT.hs
@@ -1,101 +0,0 @@-{-# OPTIONS_GHC -Wall #-} ------------------------------------------------------------------------------ --- | --- Module : Text.MaxSAT --- Copyright : (c) Masahiro Sakai 2012 --- License : BSD-style --- --- Maintainer : masahiro.sakai@gmail.com --- Stability : provisional --- Portability : portable --- --- References: --- --- * <http://maxsat.ia.udl.cat/requirements/> --- ------------------------------------------------------------------------------ -module Text.MaxSAT - ( - WCNF (..) - , WeightedClause - , Weight - - -- * Parsing .cnf/.wcnf files - , parseWCNFString - , parseWCNFFile - ) where - -import qualified SAT.Types as SAT -import Text.Util - -data WCNF - = WCNF - { numVars :: !Int - , numClauses :: !Int - , topCost :: !Weight - , clauses :: [WeightedClause] - } - -type WeightedClause = (Weight, SAT.Clause) - --- | should be able to represent 2^63 -type Weight = Integer - -parseWCNFString :: String -> Either String WCNF -parseWCNFString s = - case words l of - (["p","wcnf", nvar, nclause, top]) -> - Right $ - WCNF - { numVars = read nvar - , numClauses = read nclause - , topCost = read top - , clauses = map parseWCNFLine ls - } - (["p","wcnf", nvar, nclause]) -> - Right $ - WCNF - { numVars = read nvar - , numClauses = read nclause - , topCost = 2^(63::Int) - , clauses = map parseWCNFLine ls - } - (["p","cnf", nvar, nclause]) -> - Right $ - WCNF - { numVars = read nvar - , numClauses = read nclause - , topCost = 2 - , clauses = map parseCNFLine ls - } - _ -> - Left "cannot find wcnf/cnf header" - where - (l:ls) = filter (not . isComment) (lines s) - -parseWCNFFile :: FilePath -> IO (Either String WCNF) -parseWCNFFile filename = do - s <- readFile filename - return $ parseWCNFString s - -isComment :: String -> Bool -isComment ('c':_) = True -isComment _ = False - -parseWCNFLine :: String -> WeightedClause -parseWCNFLine s = - case words s of - (w:xs) -> - let w' = readUnsignedInteger w - ys = map readInt $ init xs - in seq w' $ seqList ys $ (w', ys) - _ -> error "parse error" - -parseCNFLine :: String -> WeightedClause -parseCNFLine s = seq xs $ seqList xs $ (1, xs) - where - xs = init (map readInt (words s)) - -seqList :: [a] -> b -> b -seqList [] b = b -seqList (x:xs) b = seq x $ seqList xs b
− src/Text/PBFile.hs
@@ -1,350 +0,0 @@-{-# LANGUAGE BangPatterns #-}--------------------------------------------------------------------------------- |--- Module : Text.PBFile--- Copyright : (c) Masahiro Sakai 2011--- License : BSD-style--- --- Maintainer : masahiro.sakai@gmail.com--- Portability : non-portable (BangPatterns)------ A parser library for .opb file and .wbo files used by PB Competition.--- --- References:------ * Input/Output Format and Solver Requirements for the Competitions of--- Pseudo-Boolean Solvers--- <http://www.cril.univ-artois.fr/PB11/format.pdf>-----------------------------------------------------------------------------------module Text.PBFile- (- -- * Abstract Syntax- Formula- , Constraint- , Op (..)- , SoftFormula- , SoftConstraint- , Sum- , WeightedTerm- , Term- , Lit (..)- , Var-- -- * Parsing .opb files- , parseOPBString- , parseOPBFile-- -- * Parsing .wbo files- , parseWBOString- , parseWBOFile-- -- * Show .opb files- , showOPB-- -- * Show .wbo files- , showWBO-- -- * Utility- , pbNumVars- , wboNumVars- ) where--import Prelude hiding (sum)-import Control.Monad-import Data.Maybe-import Data.List hiding (sum)-import Text.ParserCombinators.Parsec-import Data.Word-import Control.Exception (assert)-import Text.Printf-import Text.Util---- | Pair of /objective function/ and a list of constraints.-type Formula = (Maybe Sum, [Constraint])---- | Lhs, relational operator and rhs.-type Constraint = (Sum, Op, Integer)---- | Relational operators-data Op- = Ge -- ^ /greater than or equal/- | Eq -- ^ /equal/- deriving (Eq, Ord, Show, Enum, Bounded)---- | A pair of /top cost/ and a list of soft constraints.-type SoftFormula = (Maybe Integer, [SoftConstraint])---- | A pair of weight and constraint.-type SoftConstraint = (Maybe Integer, Constraint)---- | Sum of 'WeightedTerm'-type Sum = [WeightedTerm]---- | Coefficient and 'Term'-type WeightedTerm = (Integer, Term)---- | List of variables interpreted as products-type Term = [Lit]---- | Positive (resp. negative) literal is represented as a positive (resp. negative) integer.-type Lit = Int---- | Variable are repserented positive integer.-type Var = Int---- <formula>::= <sequence_of_comments> [<objective>] <sequence_of_comments_or_constraints>-formula :: Parser Formula-formula = do- sequence_of_comments- obj <- optionMaybe objective- cs <- sequence_of_comments_or_constraints- return (obj, cs)---- <sequence_of_comments>::= <comment> [<sequence_of_comments>]-sequence_of_comments :: Parser ()-sequence_of_comments = skipMany1 comment---- <comment>::= "*" <any_sequence_of_characters_other_than_EOL> <EOL>-comment :: Parser ()-comment = do- _ <- char '*' - _ <- manyTill anyChar eol- return ()---- <sequence_of_comments_or_constraints>::= <comment_or_constraint> [<sequence_of_comments_or_constraints>]-sequence_of_comments_or_constraints :: Parser [Constraint]-sequence_of_comments_or_constraints = do- xs <- many1 comment_or_constraint- return $ catMaybes xs---- <comment_or_constraint>::= <comment>|<constraint>-comment_or_constraint :: Parser (Maybe Constraint)-comment_or_constraint =- (comment >> return Nothing) <|> (liftM Just constraint)---- <objective>::= "min:" <zeroOrMoreSpace> <sum> ";"-objective :: Parser Sum-objective = do- _ <- string "min:"- zeroOrMoreSpace- obj <- sum- _ <- char ';'- eol- return obj---- <constraint>::= <sum> <relational_operator> <zeroOrMoreSpace> <integer> <zeroOrMoreSpace> ";"-constraint :: Parser Constraint-constraint = do- lhs <- sum- op <- relational_operator- zeroOrMoreSpace- rhs <- integer- zeroOrMoreSpace- semi- return (lhs, op, rhs)---- <sum>::= <weightedterm> | <weightedterm> <sum>-sum :: Parser Sum-sum = many1 weightedterm---- <weightedterm>::= <integer> <oneOrMoreSpace> <term> <oneOrMoreSpace>-weightedterm :: Parser WeightedTerm-weightedterm = do- w <- integer- oneOrMoreSpace- t <- term- oneOrMoreSpace- return (w,t)---- <integer>::= <unsigned_integer> | "+" <unsigned_integer> | "-" <unsigned_integer>-integer :: Parser Integer-integer = msum- [ unsigned_integer- , char '+' >> unsigned_integer- , char '-' >> liftM negate unsigned_integer- ]---- <unsigned_integer>::= <digit> | <digit><unsigned_integer>-unsigned_integer :: Parser Integer-unsigned_integer = do- ds <- many1 digit- return $! readUnsignedInteger ds---- <relational_operator>::= ">=" | "="-relational_operator :: Parser Op-relational_operator = (string ">=" >> return Ge) <|> (string "=" >> return Eq)---- <variablename>::= "x" <unsigned_integer>-variablename :: Parser Var-variablename = do- _ <- char 'x'- i <- unsigned_integer- return $! fromIntegral i---- <oneOrMoreSpace>::= " " [<oneOrMoreSpace>]-oneOrMoreSpace :: Parser ()-oneOrMoreSpace = skipMany1 (char ' ')---- <zeroOrMoreSpace>::= [" " <zeroOrMoreSpace>]-zeroOrMoreSpace :: Parser ()-zeroOrMoreSpace = skipMany (char ' ')--eol :: Parser ()-eol = char '\n' >> return ()--semi :: Parser ()-semi = char ';' >> eol--{--For linear pseudo-Boolean instances, <term> is defined as-<term>::=<variablename>--For non-linear instances, <term> is defined as-<term>::= <oneOrMoreLiterals>--}-term :: Parser Term-term = oneOrMoreLiterals---- <oneOrMoreLiterals>::= <literal> | <literal> <oneOrMoreSpace> <oneOrMoreLiterals>-oneOrMoreLiterals :: Parser [Lit]-oneOrMoreLiterals = do- l <- literal- mplus (try $ oneOrMoreSpace >> liftM (l:) (oneOrMoreLiterals)) (return [l])--- Note that we cannot use sepBy1.--- In "p `sepBy1` q", p should success whenever q success.--- But it's not the case here.---- <literal>::= <variablename> | "~"<variablename>-literal :: Parser Lit-literal = variablename <|> (char '~' >> liftM negate variablename)---- | Parse a .opb file containing pseudo boolean problem.-parseOPBString :: SourceName -> String -> Either ParseError Formula-parseOPBString = parse formula---- | Parse a .opb format string containing pseudo boolean problem.-parseOPBFile :: FilePath -> IO (Either ParseError Formula)-parseOPBFile = parseFromFile formula----- <softformula>::= <sequence_of_comments> <softheader> <sequence_of_comments_or_constraints>-softformula :: Parser SoftFormula-softformula = do- sequence_of_comments- top <- softheader- cs <- wbo_sequence_of_comments_or_constraints- return (top, cs)---- <softheader>::= "soft:" [<unsigned_integer>] ";"-softheader :: Parser (Maybe Integer)-softheader = do- _ <- string "soft:"- zeroOrMoreSpace -- XXX- top <- optionMaybe unsigned_integer- zeroOrMoreSpace -- XXX- semi- return top---- <sequence_of_comments_or_constraints>::= <comment_or_constraint> [<sequence_of_comments_or_constraints>]-wbo_sequence_of_comments_or_constraints :: Parser [SoftConstraint]-wbo_sequence_of_comments_or_constraints = do- xs <- many1 wbo_comment_or_constraint- return $ catMaybes xs---- <comment_or_constraint>::= <comment>|<constraint>|<softconstraint>-wbo_comment_or_constraint :: Parser (Maybe SoftConstraint)-wbo_comment_or_constraint = (comment >> return Nothing) <|> m- where- m = liftM Just $ (constraint >>= \c -> return (Nothing, c)) <|> softconstraint---- <softconstraint>::= "[" <zeroOrMoreSpace> <unsigned_integer> <zeroOrMoreSpace> "]" <constraint>-softconstraint :: Parser SoftConstraint-softconstraint = do- _ <- char '['- zeroOrMoreSpace- cost <- unsigned_integer- zeroOrMoreSpace- _ <- char ']'- zeroOrMoreSpace -- XXX- c <- constraint- return (Just cost, c)---- | Parse a .wbo file containing weighted boolean optimization problem.-parseWBOString :: SourceName -> String -> Either ParseError SoftFormula-parseWBOString = parse softformula---- | Parse a .wbo format string containing weighted boolean optimization problem.-parseWBOFile :: FilePath -> IO (Either ParseError SoftFormula)-parseWBOFile = parseFromFile softformula---showOPB :: Formula -> ShowS-showOPB opb@(obj, cs) = (size . part1 . part2)- where- nv = pbNumVars opb- nc = length cs- size = showString (printf "* #variable= %d #constraint= %d\n" nv nc)- part1 = - case obj of- Nothing -> id- Just o -> showString "min: " . showSum o . showString ";\n"- part2 = foldr (.) id (map showConstraint cs)--showWBO :: SoftFormula -> ShowS-showWBO wbo@(top, cs) = size . part1 . part2- where- nv = wboNumVars wbo- nc = length cs- size = showString (printf "* #variable= %d #constraint= %d\n" nv nc)- part1 = - case top of- Nothing -> showString "soft: ;\n"- Just t -> showString "soft: " . showsPrec 0 t . showString ";\n"- part2 = foldr (.) id (map showSoftConstraint cs)--showSum :: Sum -> ShowS-showSum = foldr (.) id . map showWeightedTerm--showWeightedTerm :: WeightedTerm -> ShowS-showWeightedTerm (c, lits) = foldr (\f g -> f . showChar ' ' . g) id (x:xs)- where- x = if c >= 0 then showChar '+' . showsPrec 0 c else showsPrec 0 c- xs = map showLit lits--showLit :: Lit -> ShowS-showLit lit = if lit > 0 then v else showChar '~' . v- where- v = showChar 'x' . showsPrec 0 (abs lit)--showConstraint :: Constraint -> ShowS-showConstraint (lhs, op, rhs) =- showSum lhs . f op . showChar ' ' . showsPrec 0 rhs . showString ";\n"- where- f Eq = showString "="- f Ge = showString ">="--showSoftConstraint :: SoftConstraint -> ShowS-showSoftConstraint (cost, constr) =- case cost of- Nothing -> showConstraint constr- Just c -> showChar '[' . showsPrec 0 c . showChar ']' . showChar ' ' . showConstraint constr--pbNumVars :: Formula -> Int-pbNumVars (m, cs) = maximum (0 : vs)- where- vs = do- s <- maybeToList m ++ [s | (s,_,_) <- cs]- (_, tm) <- s- lit <- tm- return $ abs lit--wboNumVars :: SoftFormula -> Int-wboNumVars (_, cs) = maximum vs- where- vs = do- s <- [s | (_, (s,_,_)) <- cs]- (_, tm) <- s- lit <- tm- return $ abs lit
− src/Text/SDPFile.hs
@@ -1,400 +0,0 @@-{-# OPTIONS_GHC -Wall #-}--------------------------------------------------------------------------------- |--- Module : Text.SDPFile--- Copyright : (c) Masahiro Sakai 2012--- License : BSD-style--- --- Maintainer : masahiro.sakai@gmail.com--- Stability : provisional--- Portability : portable------ References:------ * SDPA (Semidefinite Programming Algorithm) User's Manual--- <http://sdpa.indsys.chuo-u.ac.jp/~fujisawa/sdpa_doc.pdf>------ * <http://euler.nmt.edu/~brian/sdplib/FORMAT>----------------------------------------------------------------------------------module Text.SDPFile- ( -- * The problem type- Problem (..)- , Matrix- , Block- , mDim- , nBlock- , blockElem-- -- * Construction- , DenseMatrix- , DenseBlock- , denseMatrix- , denseBlock- , diagBlock- - -- * Rendering- , render- , renderSparse-- -- * Parsing- , parseDataString- , parseDataFile- , parseSparseDataString- , parseSparseDataFile- ) where--import Control.Monad-import Data.List (intersperse)-import Data.Ratio-import Data.Map (Map)-import qualified Data.Map as Map-import qualified Data.IntMap as IntMap-import Text.ParserCombinators.Parsec---- ------------------------------------------------------------------------------ problem description--- -----------------------------------------------------------------------------data Problem- = Problem- { blockStruct :: [Int] -- ^ the block strcuture vector (bLOCKsTRUCT)- , costs :: [Rational] -- ^ Constant Vector- , matrices :: [Matrix] -- ^ Constraint Matrices- }- deriving (Show, Ord, Eq)--type Matrix = [Block]--type Block = Map (Int,Int) Rational---- | the number of primal variables (mDim)-mDim :: Problem -> Int-mDim prob = length (matrices prob) - 1---- | the number of blocks (nBLOCK)-nBlock :: Problem -> Int-nBlock prob = length (blockStruct prob)--blockElem :: Int -> Int -> Block -> Rational-blockElem i j b = Map.findWithDefault 0 (i,j) b---- ------------------------------------------------------------------------------ construction--- -----------------------------------------------------------------------------type DenseMatrix = [DenseBlock]--type DenseBlock = [[Rational]]--denseBlock :: DenseBlock -> Block-denseBlock xxs = Map.fromList [((i,j),x) | (i,xs) <- zip [1..] xxs, (j,x) <- zip [1..] xs, x /= 0]--denseMatrix :: DenseMatrix -> Matrix-denseMatrix = map denseBlock--diagBlock :: [Rational] -> Block-diagBlock xs = Map.fromList [((i,i),x) | (i,x) <- zip [1..] xs]---- ------------------------------------------------------------------------------ parsing--- ------------------------------------------------------------------------------- | Parse a SDPA format (.dat) string.-parseDataString :: SourceName -> String -> Either ParseError Problem-parseDataString = parse pDataFile---- | Parse a SDPA format file (.dat).-parseDataFile :: FilePath -> IO (Either ParseError Problem)-parseDataFile = parseFromFile pDataFile---- | Parse a SDPA sparse format (.dat-s) string.-parseSparseDataString :: SourceName -> String -> Either ParseError Problem-parseSparseDataString = parse pSparseDataFile---- | Parse a SDPA sparse format file (.dat-s).-parseSparseDataFile :: FilePath -> IO (Either ParseError Problem)-parseSparseDataFile = parseFromFile pSparseDataFile--pDataFile :: Parser Problem-pDataFile = do- _ <- many pComment- m <- nat_line -- mDim- _n <- nat_line -- nBlock- bs <- pBlockStruct -- bLOCKsTRUCT- cs <- pCosts- ms <- pDenseMatrices (fromIntegral m) bs- return $- Problem- { blockStruct = bs- , costs = cs- , matrices = ms- }--pSparseDataFile :: Parser Problem-pSparseDataFile = do- _ <- many pComment- m <- nat_line -- mDim- _n <- nat_line -- nBlock- bs <- pBlockStruct -- bLOCKsTRUCT- cs <- pCosts- ms <- pSparseMatrices (fromIntegral m) bs- return $- Problem- { blockStruct = bs- , costs = cs- , matrices = ms- }--pComment :: Parser String-pComment = do- c <- oneOf "*\""- cs <- manyTill anyChar newline- return (c:cs)--pBlockStruct :: Parser [Int]-pBlockStruct = do- optional sep- let int' = int >>= \i -> optional sep >> return i- xs <- many int'- _ <- manyTill anyChar newline- return $ map fromIntegral xs - where- sep = many1 (oneOf " \t(){},")--pCosts :: Parser [Rational]-pCosts = do- let sep = many1 (oneOf " \t(){},")- real' = real >>= \r -> optional sep >> return r- optional sep- cs <- many real'- _ <- newline- return cs--pDenseMatrices :: Int -> [Int] -> Parser [Matrix]-pDenseMatrices m bs = optional sep >> replicateM (fromIntegral m + 1) pDenceMatrix- where- sep = many1 (space <|> oneOf "(){},")- real' = real >>= \r -> optional sep >> return r- pDenceMatrix = forM bs $ \b ->- if b >= 0- then do- xs <- replicateM b (replicateM b real')- return $ denseBlock xs- else do- xs <- replicateM (abs b) real'- return $ diagBlock xs--pSparseMatrices :: Int -> [Int] -> Parser [Matrix]-pSparseMatrices m bs = do- xs <- many pLine- let t = IntMap.unionsWith (IntMap.unionWith Map.union)- [ IntMap.singleton matno (IntMap.singleton blkno (Map.fromList [((i,j),e),((j,i),e)]))- | (matno,blkno,i,j,e) <- xs ]- return $- [ [IntMap.findWithDefault Map.empty blkno mat | blkno <- [1 .. length bs]]- | matno <- [0..m], let mat = IntMap.findWithDefault IntMap.empty matno t- ]-- where- sep = many1 (oneOf " \t") >> return ()- pLine = do- optional sep- matno <- nat- sep- blkno <- nat- sep- i <- nat- sep- j <- nat- sep- e <- real- optional sep- _ <- newline- return (fromIntegral matno, fromIntegral blkno, fromIntegral i, fromIntegral j, e)--nat_line :: Parser Integer-nat_line = do- spaces- n <- nat- _ <- manyTill anyChar newline- return n--nat :: Parser Integer-nat = do- ds <- many1 digit- return $! read ds--int :: Parser Integer-int = do- s <- option 1 sign- n <- nat- return $! s * n--real :: Parser Rational-real = do- s <- option 1 sign - b <- (do{ x <- nat; y <- option 0 frac; return (fromInteger x + y) })- <|> frac- c <- option 0 e- return (s * b*10^^c)- where- digits = many1 digit-- frac :: Parser Rational- frac = do- _ <- char '.'- s <- digits- return (read s % 10^(length s))-- e :: Parser Integer- e = do- _ <- oneOf "eE"- f <- msum [ char '+' >> return id- , char '-' >> return negate- , return id- ]- liftM f nat--sign :: Num a => Parser a-sign = (char '+' >> return 1) <|> (char '-' >> return (-1))---- ------------------------------------------------------------------------------ rendering--- -----------------------------------------------------------------------------render :: Problem -> ShowS-render = renderImpl False--renderSparse :: Problem -> ShowS-renderSparse = renderImpl True--renderImpl :: Bool -> Problem -> ShowS-renderImpl sparse prob =- -- mDim- shows (mDim prob) . showString " = mDIM\n" .-- -- nBlock- shows (nBlock prob) . showString " = nBlock\n" .-- -- blockStruct- showChar '(' .- sepByS [shows i | i <- blockStruct prob] (showString ", ") .- showChar ')' .- showString " = bLOCKsTRUCT\n" .-- -- costs- showChar '(' .- sepByS [showRat c | c <- costs prob] (showString ", ") .- showString ")\n" .-- -- matrices- if sparse- then concatS [renderSparseMatrix matno m | (matno, m) <- zip [0..] (matrices prob)]- else concatS $ map renderDenseMatrix (matrices prob)-- where- renderSparseMatrix :: Int -> Matrix -> ShowS- renderSparseMatrix matno m =- concatS [ shows matno . showChar ' ' .- shows blkno . showChar ' ' .- shows i . showChar ' ' .- shows j . showChar ' ' .- showRat e . showChar '\n'- | (blkno, blk) <- zip [(1::Int)..] m, ((i,j),e) <- Map.toList blk, i <= j ]-- renderDenseMatrix :: Matrix -> ShowS- renderDenseMatrix m = - showString "{\n" .- concatS [renderDenseBlock b s . showString "\n" | (b,s) <- zip m (blockStruct prob)] .- showString "}\n"-- renderDenseBlock :: Block -> Int -> ShowS- renderDenseBlock b s- | s < 0 =- showString " " . renderVec [blockElem i i b | i <- [1 .. abs s]]- | otherwise = - showString " { " .- sepByS [renderRow i | i <- [1..s]] (showString ", ") . - showString " }"- where- renderRow i = renderVec [blockElem i j b | j <- [1..s]]--renderVec :: [Rational] -> ShowS-renderVec xs =- showChar '{' .- sepByS (map showRat xs) (showString ", ") .- showChar '}'--showRat :: Rational -> ShowS-showRat r- | denominator r == 1 = shows (numerator r)- | otherwise = shows (fromRational r :: Double)--concatS :: [ShowS] -> ShowS-concatS = foldr (.) id--sepByS :: [ShowS] -> ShowS -> ShowS-sepByS xs sep = concatS $ intersperse sep xs---- ------------------------------------------------------------------------------ samples--- -----------------------------------------------------------------------------{--example1 :: Problem-example1- = Problem- { blockStruct = [2]- , costs = [48, -8, 20]- , matrices = map denseMatrix [f0,f1,f2,f3]- }- where- f0 = [[[-11,0], [0,23]]]- f1 = [[[10,4], [4,0]]]- f2 = [[[0,0], [0,-8]]]- f3 = [[[0,-8], [-8,-2]]]--example2 :: Problem-example2- = Problem- { blockStruct = [2,3,-2]- , costs = [1.1, -10, 6.6, 19, 4.1]- , matrices = map denseMatrix [f0,f1,f5]- }- where- f0 = [ [[-1.4, -3.2], [-3.2, -28]]- , [[15, -12, 2.1], [-12, 16, -3.8], [2.1, -3.8, 15]] - , [[1.8, 0], [0, -4.0]] - ]- f1 = [ [[0.5, 5.2], [5.2,-5.3]]- , [[7.8, -2.4, 6.0], [-2.4, 4.2, 6.5], [6.0, 6.5, 2.1]] - , [[-4.5, 0], [0, -3.5]]- ]- f5 = [ [[-6.5, -5.4], [-5.4, -6.6]]- , [[6.7, -7.2, -3.6], [-7.2, 7.3, -3.0], [-3.6, -3.0, -1.4]] - , [[6.1, 0],[0, -1.5]] - ]--tests = [test1, test2, test3, test4]--test1 = example1 == example1b- where- s = render example1 ""- Right example1b = parse pDataFile "" s--test2 = example1 == example1b- where- s = renderSparse example1 ""- Right example1b = parse pSparseDataFile "" s--test3 = example2 == example2b- where- s = render example2 ""- Right example2b = parse pDataFile "" s--test4 = example2 == example2b- where- s = renderSparse example2 ""- Right example2b = parse pSparseDataFile "" s--}
− src/Text/Util.hs
@@ -1,80 +0,0 @@-{-# LANGUAGE BangPatterns #-}--------------------------------------------------------------------------------- |--- Module : Text.Util--- Copyright : (c) Masahiro Sakai 2012-2013--- License : BSD-style--- --- Maintainer : masahiro.sakai@gmail.com--- Stability : provisional--- Portability : non-portable (BangPatterns)----------------------------------------------------------------------------------module Text.Util- ( readInt- , readUnsignedInteger- ) where--import Control.Exception-import Data.Word--{-# INLINABLE readInt #-}-readInt :: String -> Int-readInt ('-':str) = - readUnsignedInt str-readInt str = readUnsignedInt str--{-# INLINABLE readUnsignedInt #-}-readUnsignedInt :: String -> Int-readUnsignedInt str = go 0 str- where- go !r [] = r- go !r (c:cs) = go (r*10 + charToInt c) cs-- charToInt :: Char -> Int- charToInt '0' = 0- charToInt '1' = 1- charToInt '2' = 2- charToInt '3' = 3- charToInt '4' = 4- charToInt '5' = 5- charToInt '6' = 6- charToInt '7' = 7- charToInt '8' = 8- charToInt '9' = 9---- | 'read' allocate too many intermediate 'Integer'.--- Therefore we use this optimized implementation instead.--- Many intermediate values in this implementation will be optimized--- away by worker-wrapper transformation and unboxing.-{-# INLINABLE readUnsignedInteger #-}-readUnsignedInteger :: String -> Integer -readUnsignedInteger str = assert (result == read str) $ result- where- result :: Integer- result = go 0 str-- lim :: Word- lim = maxBound `div` 10- - go :: Integer -> [Char] -> Integer - go !r [] = r- go !r ds =- case go2 0 1 ds of- (r2,b,ds2) -> go (r * fromIntegral b + fromIntegral r2) ds2-- go2 :: Word -> Word -> [Char] -> (Word, Word, [Char])- go2 !r !b dds | assert (b > r) (b > lim) = (r,b,dds)- go2 !r !b [] = (r, b, [])- go2 !r !b (d:ds) = go2 (r*10 + charToWord d) (b*10) ds-- charToWord :: Char -> Word- charToWord '0' = 0- charToWord '1' = 1- charToWord '2' = 2- charToWord '3' = 3- charToWord '4' = 4- charToWord '5' = 5- charToWord '6' = 6- charToWord '7' = 7- charToWord '8' = 8- charToWord '9' = 9
+ src/ToySolver/BoundsInference.hs view
@@ -0,0 +1,109 @@+{-# LANGUAGE ScopedTypeVariables, BangPatterns #-}+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.BoundsInference+-- Copyright : (c) Masahiro Sakai 2011+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : provisional+-- Portability : non-portable (ScopedTypeVariables, BangPatterns)+--+-- Tightening variable bounds by constraint propagation.+-- +-----------------------------------------------------------------------------+module ToySolver.BoundsInference+ ( BoundsEnv+ , inferBounds+ , LA.computeInterval+ ) where++import Control.Monad+import qualified Data.IntMap as IM+import qualified Data.IntSet as IS+import Data.VectorSpace+import Data.Interval++import ToySolver.Data.ArithRel+import ToySolver.Data.LA (BoundsEnv)+import qualified ToySolver.Data.LA as LA+import ToySolver.Data.Var+import ToySolver.Internal.Util (isInteger)++type C r = (RelOp, LA.Expr r)++-- | tightening variable bounds by constraint propagation.+inferBounds :: forall r. (RealFrac r)+ => LA.BoundsEnv r -- ^ initial bounds+ -> [LA.Atom r] -- ^ constraints+ -> VarSet -- ^ integral variables+ -> Int -- ^ limit of iterations+ -> LA.BoundsEnv r+inferBounds bounds constraints ivs limit = loop 0 bounds+ where+ cs :: VarMap [C r]+ cs = IM.fromListWith (++) $ do+ Rel lhs op rhs <- constraints+ let m = LA.coeffMap (lhs ^-^ rhs)+ (v,c) <- IM.toList m+ guard $ v /= LA.unitVar+ let op' = if c < 0 then flipOp op else op+ rhs' = (-1/c) *^ LA.fromCoeffMap (IM.delete v m)+ return (v, [(op', rhs')])++ loop :: Int -> LA.BoundsEnv r -> LA.BoundsEnv r+ loop !i b = if (limit>=0 && i>=limit) || b==b' then b else loop (i+1) b'+ where+ b' = refine b++ refine :: LA.BoundsEnv r -> LA.BoundsEnv r+ refine b = IM.mapWithKey (\v i -> tighten v $ f b (IM.findWithDefault [] v cs) i) b++ -- tighten bounds of integer variables+ tighten :: Var -> Interval r -> Interval r+ tighten v x =+ if v `IS.notMember` ivs+ then x+ else tightenToInteger x++f :: (Real r, Fractional r) => LA.BoundsEnv r -> [C r] -> Interval r -> Interval r+f b cs i = foldr intersection i $ do+ (op, rhs) <- cs+ let i' = LA.computeInterval b rhs+ lb = lowerBound' i'+ ub = upperBound' i'+ case op of+ Eql -> return i'+ Le -> return $ interval (NegInf, False) ub+ Ge -> return $ interval lb (PosInf, False)+ Lt -> return $ interval (NegInf, False) (strict ub)+ Gt -> return $ interval (strict ub) (PosInf, False)+ NEq -> []++strict :: (EndPoint r, Bool) -> (EndPoint r, Bool)+strict (x, _) = (x, False)++-- | tightening intervals by ceiling lower bounds and flooring upper bounds.+tightenToInteger :: forall r. (RealFrac r) => Interval r -> Interval r+tightenToInteger ival = interval lb2 ub2+ where+ lb@(x1, in1) = lowerBound' ival+ ub@(x2, in2) = upperBound' ival+ lb2 =+ case x1 of+ Finite x ->+ ( if isInteger x && not in1+ then Finite (x + 1)+ else Finite (fromInteger (ceiling x))+ , True+ )+ _ -> lb+ ub2 =+ case x2 of+ Finite x ->+ ( if isInteger x && not in2+ then Finite (x - 1)+ else Finite (fromInteger (floor x))+ , True+ )+ _ -> ub
+ src/ToySolver/CAD.hs view
@@ -0,0 +1,667 @@+{-# LANGUAGE ScopedTypeVariables, BangPatterns #-}+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.CAD+-- Copyright : (c) Masahiro Sakai 2012+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : provisional+-- Portability : non-portable (ScopedTypeVariables, BangPatterns)+--+-- References:+--+-- * Christian Michaux and Adem Ozturk.+-- Quantifier Elimination following Muchnik+-- <https://math.umons.ac.be/preprints/src/Ozturk020411.pdf>+--+-- * Arnab Bhattacharyya.+-- Something you should know about: Quantifier Elimination (Part I)+-- <http://cstheory.blogoverflow.com/2011/11/something-you-should-know-about-quantifier-elimination-part-i/>+-- +-- * Arnab Bhattacharyya.+-- Something you should know about: Quantifier Elimination (Part II)+-- <http://cstheory.blogoverflow.com/2012/02/something-you-should-know-about-quantifier-elimination-part-ii/>+--+-----------------------------------------------------------------------------+module ToySolver.CAD+ (+ -- * Basic data structures+ Point (..)+ , Cell (..)++ -- * Projection+ , project++ -- * Solving+ , solve+ , solve'++ -- * Model+ , Model+ , findSample+ , evalCell+ , evalPoint+ ) where++import Control.Exception+import Control.Monad.State+import Data.List+import Data.Maybe+import Data.Ord+import Data.Map (Map)+import qualified Data.Map as Map+import Data.Set (Set)+import qualified Data.Set as Set+import Text.Printf+import Text.PrettyPrint.HughesPJClass++import qualified Data.Interval as I+import Data.Sign (Sign (..))+import qualified Data.Sign as Sign++import ToySolver.Data.ArithRel+import qualified ToySolver.Data.AlgebraicNumber.Real as AReal+import ToySolver.Data.DNF+import ToySolver.Data.Polynomial (Polynomial, UPolynomial, X (..), PrettyVar, PrettyCoeff)+import qualified ToySolver.Data.Polynomial as P+import qualified ToySolver.Data.Polynomial.GroebnerBasis as GB++import Debug.Trace++-- ---------------------------------------------------------------------------++data Point c = NegInf | RootOf (UPolynomial c) Int | PosInf+ deriving (Eq, Ord, Show)++data Cell c+ = Point (Point c)+ | Interval (Point c) (Point c)+ deriving (Eq, Ord, Show)++showCell :: (Num c, Ord c, PrettyCoeff c) => Cell c -> String+showCell (Point pt) = showPoint pt+showCell (Interval lb ub) = printf "(%s, %s)" (showPoint lb) (showPoint ub)++showPoint :: (Num c, Ord c, PrettyCoeff c) => Point c -> String+showPoint NegInf = "-inf"+showPoint PosInf = "+inf"+showPoint (RootOf p n) = "rootOf(" ++ prettyShow p ++ ", " ++ show n ++ ")"++-- ---------------------------------------------------------------------------++type SignConf c = [(Cell c, Map (UPolynomial c) Sign)]++emptySignConf :: SignConf c+emptySignConf =+ [ (Point NegInf, Map.empty)+ , (Interval NegInf PosInf, Map.empty)+ , (Point PosInf, Map.empty)+ ]++showSignConf :: forall c. (Num c, Ord c, PrettyCoeff c) => SignConf c -> [String]+showSignConf = f+ where+ f :: SignConf c -> [String]+ f = concatMap $ \(cell, m) -> showCell cell : g m++ g :: Map (UPolynomial c) Sign -> [String]+ g m =+ [printf " %s: %s" (prettyShow p) (Sign.symbol s) | (p, s) <- Map.toList m]++normalizeSignConfKey :: Ord v => UPolynomial (Polynomial Rational v) -> UPolynomial (Polynomial Rational v)+normalizeSignConfKey p+ | p == 0 = 0+ | otherwise = q+ where+ c = P.lc P.grevlex $ P.lc P.nat p+ q = P.mapCoeff (P.mapCoeff (/ c)) p++lookupSignConf :: Ord v => UPolynomial (Polynomial Rational v) -> Map (UPolynomial (Polynomial Rational v)) Sign -> Sign+lookupSignConf p m+ | p == 0 = Zero+ | otherwise = Sign.signOf c `Sign.mult` (m Map.! q)+ where+ c = P.lc P.grevlex $ P.lc P.nat p+ q = P.mapCoeff (P.mapCoeff (/ c)) p++-- ---------------------------------------------------------------------------++-- modified reminder+mr+ :: forall k. (Ord k, Show k, Num k, PrettyCoeff k)+ => UPolynomial k+ -> UPolynomial k+ -> (k, Integer, UPolynomial k)+mr p q+ | n >= m = assert (P.constant (bm^(n-m+1)) * p == q * l + r && m > P.deg r) $ (bm, n-m+1, r)+ | otherwise = error "mr p q: not (deg p >= deg q)"+ where+ x = P.var X+ n = P.deg p+ m = P.deg q+ bm = P.lc P.nat q+ (l,r) = f p n++ f :: UPolynomial k -> Integer -> (UPolynomial k, UPolynomial k)+ f p n+ | n==m =+ let l = P.constant an+ r = P.constant bm * p - P.constant an * q+ in assert (P.constant (bm^(n-m+1)) * p == q*l + r && m > P.deg r) $ (l, r)+ | otherwise =+ let p' = (P.constant bm * p - P.constant an * x^(n-m) * q)+ (l',r) = f p' (n-1)+ l = l' + P.constant (an*bm^(n-m)) * x^(n-m)+ in assert (n > P.deg p') $+ assert (P.constant (bm^(n-m+1)) * p == q*l + r && m > P.deg r) $ (l, r)+ where+ an = P.coeff (P.var X `P.mpow` n) p++test_mr_1 :: (Coeff Int, Integer, UPolynomial (Coeff Int))+test_mr_1 = mr (P.toUPolynomialOf p 3) (P.toUPolynomialOf q 3)+ where+ a = P.var 0+ b = P.var 1+ c = P.var 2+ x = P.var 3+ p = a*x^(2::Int) + b*x + c+ q = 2*a*x + b++test_mr_2 :: (Coeff Int, Integer, UPolynomial (Coeff Int))+test_mr_2 = mr (P.toUPolynomialOf p 3) (P.toUPolynomialOf p 3)+ where+ a = P.var 0+ b = P.var 1+ c = P.var 2+ x = P.var 3+ p = a*x^(2::Int) + b*x + c++-- ---------------------------------------------------------------------------++type Coeff v = Polynomial Rational v++type M v = StateT (Assumption v) []++runM :: M v a -> [(a, Assumption v)]+runM m = runStateT m emptyAssumption++assume :: (Ord v, Show v, PrettyVar v) => Polynomial Rational v -> [Sign] -> M v ()+assume p ss = do+ (m,gb) <- get+ p <- return $ P.reduce P.grevlex p gb+ ss <- return $ Set.fromList ss+ ss <- return $ ss `Set.intersection` computeSignSet m p+ guard $ not $ Set.null ss+ when (P.deg p > 0) $ do+ let c = P.lc P.grlex p+ (p,ss) <- return $ (P.mapCoeff (/c) p, Set.map (\s -> s `Sign.div` Sign.signOf c) ss)+ let ss_orig = Map.findWithDefault (Set.fromList [Neg,Zero,Pos]) p m+ ss <- return $ Set.intersection ss ss_orig+ guard $ not $ Set.null ss+ case propagate (Map.insertWith Set.intersection p ss m, gb) of+ Nothing -> mzero+ Just a -> put a++project+ :: forall v. (Ord v, Show v, PrettyVar v)+ => [(UPolynomial (Polynomial Rational v), [Sign])]+ -> [([(Polynomial Rational v, [Sign])], [Cell (Polynomial Rational v)])]+project cs = [ (assumption2cond gs, cells) | (cells, gs) <- result ]+ where+ result :: [([Cell (Polynomial Rational v)], Assumption v)]+ result = runM $ do+ forM_ cs $ \(p,ss) -> do+ when (1 > P.deg p) $ assume (P.coeff P.mone p) ss+ conf <- buildSignConf (map fst cs)+ -- normalizePoly前に次数が1以上で、normalizePoly結果の次数が0以下の時のための処理が必要なので注意+ cs' <- liftM catMaybes $ forM cs $ \(p,ss) -> do+ p' <- normalizePoly p+ if (1 > P.deg p')+ then assume (P.coeff P.mone p') ss >> return Nothing+ else return $ Just (p',ss)+ let satCells = [cell | (cell, m) <- conf, cell /= Point NegInf, cell /= Point PosInf, ok cs' m]+ guard $ not $ null satCells+ return satCells++ ok :: [(UPolynomial (Polynomial Rational v), [Sign])] -> Map (UPolynomial (Polynomial Rational v)) Sign -> Bool+ ok cs m = and [checkSign m p ss | (p,ss) <- cs]+ where+ checkSign m p ss = lookupSignConf p m `elem` ss++buildSignConf+ :: (Ord v, Show v, PrettyVar v)+ => [UPolynomial (Polynomial Rational v)]+ -> M v (SignConf (Polynomial Rational v))+buildSignConf ps = do+ ps2 <- collectPolynomials ps+ -- normalizePoly後の多項式の次数でソートしておく必要があるので注意+ let ts = sortBy (comparing P.deg) ps2+ --trace ("collected polynomials: " ++ prettyShow ts) $ return ()+ foldM (flip refineSignConf) emptySignConf ts++collectPolynomials+ :: (Ord v, Show v, PrettyVar v)+ => [UPolynomial (Polynomial Rational v)]+ -> M v [UPolynomial (Polynomial Rational v)]+collectPolynomials ps = go Set.empty =<< f ps+ where+ f ps = do+ ps' <- mapM normalizePoly $ Set.toList $ Set.fromList $ [p | p <- ps, P.deg p > 0]+ return $ Set.fromList $ map normalizeSignConfKey $ filter (\p -> P.deg p > 0) ps'++ go result ps | Set.null ps = return $ Set.toList result+ go result ps = do+ rs <- f [P.deriv p X | p <- Set.toList ps]+ rss <-+ forM [(p1,p2) | p1 <- Set.toList ps, p2 <- Set.toList ps ++ Set.toList result, p1 /= p2] $ \(p1,p2) -> do+ let d = P.deg p1+ e = P.deg p2+ f [r | (_,_,r) <- [mr p1 p2 | d >= e] ++ [mr p2 p1 | e >= d]]+ let ps' = Set.unions (rs:rss)+ go (result `Set.union` ps) (ps' `Set.difference` result)++-- ゼロであるような高次の項を消した多項式を返す+normalizePoly+ :: forall v. (Ord v, Show v, PrettyVar v)+ => UPolynomial (Polynomial Rational v)+ -> M v (UPolynomial (Polynomial Rational v))+normalizePoly p = liftM P.fromTerms $ go $ sortBy (flip (comparing (P.deg . snd))) $ P.terms p+ where+ go [] = return []+ go xxs@((c,d):xs) =+ mplus+ (assume c [Pos, Neg] >> return xxs)+ (assume c [Zero] >> go xs)++refineSignConf+ :: forall v. (Show v, Ord v, PrettyVar v)+ => UPolynomial (Polynomial Rational v)+ -> SignConf (Polynomial Rational v) + -> M v (SignConf (Polynomial Rational v))+refineSignConf p conf = liftM (extendIntervals 0) $ mapM extendPoint conf+ where + extendPoint+ :: (Cell (Polynomial Rational v), Map (UPolynomial (Polynomial Rational v)) Sign)+ -> M v (Cell (Polynomial Rational v), Map (UPolynomial (Polynomial Rational v)) Sign)+ extendPoint (Point pt, m) = do+ s <- signAt pt m+ return (Point pt, Map.insert p s m)+ extendPoint x = return x+ + extendIntervals+ :: Int+ -> [(Cell (Polynomial Rational v), Map (UPolynomial (Polynomial Rational v)) Sign)]+ -> [(Cell (Polynomial Rational v), Map (UPolynomial (Polynomial Rational v)) Sign)]+ extendIntervals !n (pt1@(Point _, m1) : (Interval lb ub, m) : pt2@(Point _, m2) : xs) =+ pt1 : ys ++ extendIntervals n2 (pt2 : xs)+ where+ s1 = lookupSignConf p m1+ s2 = lookupSignConf p m2+ n1 = if s1 == Zero then n+1 else n+ root = RootOf p n1+ (ys, n2)+ | s1 == s2 = ( [ (Interval lb ub, Map.insert p s1 m) ], n1 )+ | s1 == Zero = ( [ (Interval lb ub, Map.insert p s2 m) ], n1 )+ | s2 == Zero = ( [ (Interval lb ub, Map.insert p s1 m) ], n1 )+ | otherwise = ( [ (Interval lb root, Map.insert p s1 m)+ , (Point root, Map.insert p Zero m)+ , (Interval root ub, Map.insert p s2 m)+ ]+ , n1 + 1+ )+ extendIntervals _ xs = xs+ + signAt :: Point (Polynomial Rational v) -> Map (UPolynomial (Polynomial Rational v)) Sign -> M v Sign+ signAt PosInf _ = signCoeff (P.lc P.nat p)+ signAt NegInf _ = do+ let (c,mm) = P.lt P.nat p+ if even (P.deg mm)+ then signCoeff c+ else liftM Sign.negate $ signCoeff c+ signAt (RootOf q _) m = do+ let (bm,k,r) = mr p q+ r <- normalizePoly r+ s1 <- if P.deg r > 0+ then return $ lookupSignConf r m+ else signCoeff $ P.coeff P.mone r+ -- 場合分けを出来るだけ避ける+ if even k+ then return s1+ else do+ s2 <- signCoeff bm+ return $ s1 `Sign.div` Sign.pow s2 k++ signCoeff :: Polynomial Rational v -> M v Sign+ signCoeff c =+ msum [ assume c [s] >> return s+ | s <- [Neg, Zero, Pos]+ ]++-- ---------------------------------------------------------------------------++type Assumption v = (Map (Polynomial Rational v) (Set Sign), [Polynomial Rational v])++emptyAssumption :: Assumption v+emptyAssumption = (Map.empty, [])++propagate :: Ord v => Assumption v -> Maybe (Assumption v)+propagate = go + where+ go a = do+ a' <- f a+ if a == a'+ then return a+ else go a'+ f a = liftM dropConstants $ propagateSign =<< propagateEq a++propagateEq :: forall v. Ord v => Assumption v -> Maybe (Assumption v)+propagateEq (m, gb)+ | any (\(p,ss) -> Set.singleton Zero == ss) (Map.toList m) = do+ (m', gb') <- f (m, gb)+ propagateEq (m', gb')+ | otherwise =+ return (m, gb)+ where+ f :: Assumption v -> Maybe (Assumption v)+ f (m, gb) = + case Map.partition (Set.singleton Zero ==) m of+ (m0, m) -> do+ let gb' = GB.basis P.grevlex (Map.keys m0 ++ gb)+ m' = Map.fromListWith Set.intersection $ do+ (p,ss) <- Map.toList m+ let p' = P.reduce P.grevlex p gb'+ c = P.lc P.grlex p'+ (p'',ss')+ | c == 0 = (p', ss)+ | otherwise = (P.mapCoeff (/c) p', Set.map (\s -> s `Sign.div` Sign.signOf c) ss)+ return (p'', ss')+ return $ (m', gb')++propagateSign :: Ord v => Assumption v -> Maybe (Assumption v)+propagateSign (m, gb) = go (m, gb)+ where+ go a@(m, gb)+ | not (isOkay a) = Nothing+ | m == m' = Just (m, gb)+ | otherwise = go (m', gb)+ where+ m' = Map.mapWithKey (\p ss -> Set.intersection ss (computeSignSet m p)) m++isOkay :: Ord v => Assumption v -> Bool+isOkay (m, gb) =+ and [not (Set.null ss) | (_,ss) <- Map.toList m] &&+ and [Set.member Zero (computeSignSet m p) | p <- gb]++dropConstants :: Ord v => Assumption v -> Assumption v+dropConstants (m, gb) = (Map.filterWithKey (\p _ -> P.deg p > 0) m, gb)++assumption2cond :: Ord v => Assumption v -> [(Polynomial Rational v, [Sign])]+assumption2cond (m, gb) = [(p, Set.toList ss) | (p, ss) <- Map.toList m] ++ [(p, [Zero]) | p <- gb]++-- ---------------------------------------------------------------------------++computeSignSet :: Ord v => Map (Polynomial Rational v) (Set Sign) -> Polynomial Rational v -> Set Sign+computeSignSet m p = P.eval env (P.mapCoeff fromRational p)+ where+ env v =+ case Map.lookup (P.var v) m of+ Just ss -> ss+ Nothing -> Set.fromList [Neg,Zero,Pos]++-- ---------------------------------------------------------------------------++type Model v = Map v AReal.AReal++findSample :: Ord v => Model v -> Cell (Polynomial Rational v) -> Maybe AReal.AReal+findSample m cell =+ case evalCell m cell of+ Point (RootOf p n) -> + Just $ AReal.realRoots p !! n+ Interval lb ub ->+ case I.simplestRationalWithin (f lb I.<..< f ub) of+ Nothing -> error $ "ToySolver.CAD.findSample: should not happen"+ Just r -> Just $ fromRational r+ where+ f :: Point Rational -> I.EndPoint AReal.AReal+ f NegInf = I.NegInf+ f PosInf = I.PosInf+ f (RootOf p n) = I.Finite (AReal.realRoots p !! n)++evalCell :: Ord v => Model v -> Cell (Polynomial Rational v) -> Cell Rational+evalCell m (Point pt) = Point $ evalPoint m pt+evalCell m (Interval pt1 pt2) = Interval (evalPoint m pt1) (evalPoint m pt2)++evalPoint :: Ord v => Model v -> Point (Polynomial Rational v) -> Point Rational+evalPoint _ NegInf = NegInf+evalPoint _ PosInf = PosInf+evalPoint m (RootOf p n) = RootOf (AReal.minimalPolynomial a) (AReal.rootIndex a)+ where+ a = AReal.realRootsEx (P.mapCoeff (P.eval (m Map.!) . P.mapCoeff fromRational) p) !! n++-- ---------------------------------------------------------------------------++solve+ :: forall v. (Ord v, Show v, PrettyVar v)+ => Set v+ -> [(Rel (Polynomial Rational v))]+ -> Maybe (Model v)+solve vs cs0 = solve' vs (map f cs0)+ where+ f (Rel lhs op rhs) = (lhs - rhs, g op)+ g Le = [Zero, Neg]+ g Ge = [Zero, Pos]+ g Lt = [Neg]+ g Gt = [Pos]+ g Eql = [Zero]+ g NEq = [Pos,Neg]++solve'+ :: forall v. (Ord v, Show v, PrettyVar v)+ => Set v+ -> [(Polynomial Rational v, [Sign])]+ -> Maybe (Model v)+solve' vs0 cs0 = go (Set.toList vs0) cs0+ where+ go :: [v] -> [(Polynomial Rational v, [Sign])] -> Maybe (Model v)+ go [] cs =+ if and [Sign.signOf v `elem` ss | (p,ss) <- cs, let v = P.eval (\_ -> undefined) p]+ then Just Map.empty+ else Nothing+ go (v:vs) cs = listToMaybe $ do+ (cs2, cell:_) <- project [(P.toUPolynomialOf p v, ss) | (p,ss) <- cs]+ case go vs cs2 of+ Nothing -> mzero+ Just m -> do+ let Just val = findSample m cell+ seq val $ return $ Map.insert v val m++-- ---------------------------------------------------------------------------++showDNF :: (Ord v, Show v, PrettyVar v) => DNF (Polynomial Rational v, [Sign]) -> String+showDNF (DNF xss) = intercalate " | " [showConj xs | xs <- xss]+ where+ showConj xs = "(" ++ intercalate " & " [f p ss | (p,ss) <- xs] ++ ")"+ f p ss = prettyShow p ++ g ss+ g [Zero] = " = 0"+ g [Pos] = " > 0"+ g [Neg] = " < 0"+ g xs+ | Set.fromList xs == Set.fromList [Pos,Neg] = "/= 0"+ | Set.fromList xs == Set.fromList [Zero,Pos] = ">= 0"+ | Set.fromList xs == Set.fromList [Zero,Neg] = "<= 0"+ | otherwise = error "showDNF: should not happen"++dumpProjection+ :: (Ord v, Show v, PrettyVar v)+ => [([(Polynomial Rational v, [Sign])], [Cell (Polynomial Rational v)])]+ -> IO ()+dumpProjection xs =+ forM_ xs $ \(gs, cells) -> do+ putStrLn "============"+ forM_ gs $ \(p, ss) -> do+ putStrLn $ f p ss+ putStrLn " =>"+ forM_ cells $ \cell -> do+ putStrLn $ showCell cell+ where+ f p ss = prettyShow p ++ g ss+ g [Zero] = " = 0"+ g [Pos] = " > 0"+ g [Neg] = " < 0"+ g xs+ | Set.fromList xs == Set.fromList [Pos,Neg] = "/= 0"+ | Set.fromList xs == Set.fromList [Zero,Pos] = ">= 0"+ | Set.fromList xs == Set.fromList [Zero,Neg] = "<= 0"+ | otherwise = error "showDNF: should not happen"++dumpSignConf+ :: forall v.+ (Ord v, PrettyVar v, Show v)+ => [(SignConf (Polynomial Rational v), Assumption v)]+ -> IO ()+dumpSignConf x = + forM_ x $ \(conf, as) -> do+ putStrLn "============"+ mapM_ putStrLn $ showSignConf conf+ forM_ (assumption2cond as) $ \(p, ss) ->+ printf "%s %s\n" (prettyShow p) (show ss)++-- ---------------------------------------------------------------------------++test1a :: IO ()+test1a = mapM_ putStrLn $ showSignConf conf+ where+ x = P.var X+ ps :: [UPolynomial (Polynomial Rational Int)]+ ps = [x + 1, -2*x + 3, x]+ [(conf, _)] = runM $ buildSignConf ps++test1b :: Bool+test1b = isJust $ solve vs cs+ where+ x = P.var X+ vs = Set.singleton X+ cs = [x + 1 .>. 0, -2*x + 3 .>. 0, x .>. 0]++test1c :: Bool+test1c = isJust $ do+ m <- solve' (Set.singleton X) cs+ guard $ and $ do+ (p, ss) <- cs+ let val = P.eval (m Map.!) (P.mapCoeff fromRational p)+ return $ Sign.signOf val `elem` ss+ where+ x = P.var X+ cs = [(x + 1, [Pos]), (-2*x + 3, [Pos]), (x, [Pos])]++test2a :: IO ()+test2a = mapM_ putStrLn $ showSignConf conf+ where+ x = P.var X+ ps :: [UPolynomial (Polynomial Rational Int)]+ ps = [x^(2::Int)]+ [(conf, _)] = runM $ buildSignConf ps++test2b :: Bool+test2b = isNothing $ solve vs cs+ where+ x = P.var X+ vs = Set.singleton X+ cs = [x^(2::Int) .<. 0]++test = and [test1b, test1c, test2b]++test_project :: DNF (Polynomial Rational Int, [Sign])+test_project = DNF $ map fst $ project [(p', [Zero])]+ where+ a = P.var 0+ b = P.var 1+ c = P.var 2+ x = P.var 3+ p :: Polynomial Rational Int+ p = a*x^(2::Int) + b*x + c+ p' = P.toUPolynomialOf p 3++test_project_print :: IO ()+test_project_print = putStrLn $ showDNF $ test_project++test_project_2 = project [(p, [Zero]), (x, [Pos])]+ where+ x = P.var X+ p :: UPolynomial (Polynomial Rational Int)+ p = x^(2::Int) + 4*x - 10++test_project_3_print = dumpProjection $ project [(P.toUPolynomialOf p 0, [Neg])]+ where+ a = P.var 0+ b = P.var 1+ c = P.var 2+ p :: Polynomial Rational Int+ p = a^(2::Int) + b^(2::Int) + c^(2::Int) - 1++test_solve = solve vs [p .<. 0]+ where+ a = P.var 0+ b = P.var 1+ c = P.var 2+ vs = Set.fromList [0,1,2]+ p :: Polynomial Rational Int+ p = a^(2::Int) + b^(2::Int) + c^(2::Int) - 1++test_collectPolynomials+ :: [( [UPolynomial (Polynomial Rational Int)]+ , Assumption Int+ )]+test_collectPolynomials = runM $ collectPolynomials [p']+ where+ a = P.var 0+ b = P.var 1+ c = P.var 2+ x = P.var 3+ p :: Polynomial Rational Int+ p = a*x^(2::Int) + b*x + c+ p' = P.toUPolynomialOf p 3++test_collectPolynomials_print :: IO ()+test_collectPolynomials_print = do+ forM_ test_collectPolynomials $ \(ps,g) -> do+ putStrLn "============"+ mapM_ (putStrLn . prettyShow) ps+ forM_ (assumption2cond g) $ \(p, ss) ->+ printf "%s %s\n" (prettyShow p) (show ss)++test_buildSignConf :: [(SignConf (Polynomial Rational Int), Assumption Int)]+test_buildSignConf = runM $ buildSignConf [P.toUPolynomialOf p 3]+ where+ a = P.var 0+ b = P.var 1+ c = P.var 2+ x = P.var 3+ p :: Polynomial Rational Int+ p = a*x^(2::Int) + b*x + c++test_buildSignConf_print :: IO ()+test_buildSignConf_print = dumpSignConf test_buildSignConf++test_buildSignConf_2 :: [(SignConf (Polynomial Rational Int), Assumption Int)]+test_buildSignConf_2 = runM $ buildSignConf [P.toUPolynomialOf p 0 | p <- ps]+ where+ x = P.var 0+ ps :: [Polynomial Rational Int]+ ps = [x + 1, -2*x + 3, x]++test_buildSignConf_2_print :: IO ()+test_buildSignConf_2_print = dumpSignConf test_buildSignConf_2++test_buildSignConf_3 :: [(SignConf (Polynomial Rational Int), Assumption Int)]+test_buildSignConf_3 = runM $ buildSignConf [P.toUPolynomialOf p 0 | p <- ps]+ where+ x = P.var 0+ ps :: [Polynomial Rational Int]+ ps = [x, 2*x]++test_buildSignConf_3_print :: IO ()+test_buildSignConf_3_print = dumpSignConf test_buildSignConf_3++-- ---------------------------------------------------------------------------
+ src/ToySolver/CongruenceClosure.hs view
@@ -0,0 +1,188 @@+{-# OPTIONS_GHC -Wall #-}+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.CongruenceClosure+-- Copyright : (c) Masahiro Sakai 2012+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : provisional+-- Portability : portable+--+-- References:+--+-- * R. Nieuwenhuis and A. Oliveras, "Fast congruence closure and extensions,"+-- Information and Computation, vol. 205, no. 4, pp. 557-580, Apr. 2007.+-- <http://www.lsi.upc.edu/~oliveras/espai/papers/IC.pdf>+--+-----------------------------------------------------------------------------+module ToySolver.CongruenceClosure+ ( Solver+ , Var+ , FlatTerm (..)+ , newSolver+ , newVar+ , merge+ , areCongruent+ ) where++import Prelude hiding (lookup)++import Control.Monad+import Data.IORef+import Data.Maybe+import Data.IntMap (IntMap)+import qualified Data.IntMap as IntMap++type Var = Int++data FlatTerm+ = FTConst Var+ | FTApp Var Var+ deriving (Ord, Eq, Show)++type Eqn1 = (FlatTerm, Var)+type PendingEqn = Either (Var,Var) (Eqn1, Eqn1)++data Solver+ = Solver+ { svVarCounter :: IORef Int+ , svPending :: IORef [PendingEqn]+ , svRepresentativeTable :: IORef (IntMap Var) -- 本当は配列が良い+ , svClassList :: IORef (IntMap [Var])+ , svUseList :: IORef (IntMap [Eqn1])+ , svLookupTable :: IORef (IntMap (IntMap Eqn1))+ }++newSolver :: IO Solver+newSolver = do+ vcnt <- newIORef 0+ pending <- newIORef []+ rep <- newIORef IntMap.empty+ classes <- newIORef IntMap.empty+ useList <- newIORef IntMap.empty+ lookup <- newIORef IntMap.empty+ return $+ Solver+ { svVarCounter = vcnt+ , svPending = pending+ , svRepresentativeTable = rep+ , svClassList = classes+ , svUseList = useList+ , svLookupTable = lookup+ }++newVar :: Solver -> IO Var+newVar solver = do+ v <- readIORef (svVarCounter solver)+ writeIORef (svVarCounter solver) $! v + 1+ modifyIORef (svRepresentativeTable solver) (IntMap.insert v v)+ modifyIORef (svClassList solver) (IntMap.insert v [v])+ modifyIORef (svUseList solver) (IntMap.insert v [])+ return v++merge :: Solver -> (FlatTerm, Var) -> IO ()+merge solver (s, a) = do+ case s of+ FTConst c -> do+ addToPending solver (Left (c, a))+ propagate solver+ FTApp a1 a2 -> do+ a1' <- getRepresentative solver a1+ a2' <- getRepresentative solver a2+ ret <- lookup solver a1' a2'+ case ret of+ Just (FTApp b1 b2, b) -> do+ addToPending solver $ Right ((FTApp a1 a2, a), (FTApp b1 b2, b))+ propagate solver+ Nothing -> do+ setLookup solver a1' a2' (FTApp a1 a2, a)+ modifyIORef (svUseList solver) $+ IntMap.alter (Just . ((FTApp a1 a2, a) :) . fromMaybe []) a1' .+ IntMap.alter (Just . ((FTApp a1 a2, a) :) . fromMaybe []) a2'++propagate :: Solver -> IO ()+propagate solver = go+ where+ go = do+ ps <- readIORef (svPending solver)+ case ps of+ [] -> return ()+ (p:ps') -> do+ writeIORef (svPending solver) ps'+ processEqn p+ go++ processEqn p = do+ let (a,b) = case p of+ Left (a,b) -> (a,b)+ Right ((_, a), (_, b)) -> (a,b)+ a' <- getRepresentative solver a+ b' <- getRepresentative solver b+ if a' == b'+ then return ()+ else do+ clist <- readIORef (svClassList solver)+ let classA = clist IntMap.! a'+ classB = clist IntMap.! b'+ if length classA < length classB+ then update a' b' classA classB+ else update b' a' classB classA++ update a' b' classA classB = do+ modifyIORef (svRepresentativeTable solver) $ + IntMap.union (IntMap.fromList [(c,b') | c <- classA])+ modifyIORef (svClassList solver) $+ IntMap.insert b' (classA ++ classB) . IntMap.delete a'++ useList <- readIORef (svUseList solver)+ forM_ (useList IntMap.! a') $ \(FTApp c1 c2, c) -> do -- FIXME: not exhaustive+ c1' <- getRepresentative solver c1+ c2' <- getRepresentative solver c2+ ret <- lookup solver c1' c2'+ case ret of+ Just (FTApp d1 d2, d) -> do -- FIXME: not exhaustive+ addToPending solver $ Right ((FTApp c1 c2, c), (FTApp d1 d2, d))+ Nothing -> do+ return ()+ writeIORef (svUseList solver) $ IntMap.delete a' useList ++areCongruent :: Solver -> FlatTerm -> FlatTerm -> IO Bool+areCongruent solver t1 t2 = do+ u1 <- normalize solver t1+ u2 <- normalize solver t2+ return $ u1 == u2++normalize :: Solver -> FlatTerm -> IO FlatTerm+normalize solver (FTConst c) = liftM FTConst $ getRepresentative solver c+normalize solver (FTApp t1 t2) = do+ u1 <- getRepresentative solver t1+ u2 <- getRepresentative solver t2+ ret <- lookup solver u1 u2+ case ret of+ Just (FTApp _ _, a) -> liftM FTConst $ getRepresentative solver a+ Nothing -> return $ FTApp u1 u2++{--------------------------------------------------------------------+ Helper funcions+--------------------------------------------------------------------}++lookup :: Solver -> Var -> Var -> IO (Maybe Eqn1)+lookup solver c1 c2 = do+ tbl <- readIORef $ svLookupTable solver+ return $ do+ m <- IntMap.lookup c1 tbl+ IntMap.lookup c2 m++setLookup :: Solver -> Var -> Var -> Eqn1 -> IO ()+setLookup solver a1 a2 eqn = do+ modifyIORef (svLookupTable solver) $+ IntMap.insertWith IntMap.union a1 (IntMap.singleton a2 eqn)++addToPending :: Solver -> PendingEqn -> IO ()+addToPending solver eqn = modifyIORef (svPending solver) (eqn :)++getRepresentative :: Solver -> Var -> IO Var+getRepresentative solver c = do+ m <- readIORef $ svRepresentativeTable solver+ return $ m IntMap.! c
+ src/ToySolver/ContiTraverso.hs view
@@ -0,0 +1,124 @@+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.ContiTraverso+-- Copyright : (c) Masahiro Sakai 2012+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : provisional+-- Portability : portable+--+-- References:+--+-- * P. Conti and C. Traverso, "Buchberger algorithm and integer programming,"+-- Applied Algebra, Algebraic Algorithms and Error-Correcting Codes,+-- Lecture Notes in Computer Science Volume 539, 1991, pp 130-139+-- <http://dx.doi.org/10.1007/3-540-54522-0_102>+-- <http://posso.dm.unipi.it/users/traverso/conti-traverso-ip.ps>+--+-- * IKEGAMI Daisuke, "数列と多項式の愛しい関係," 2011,+-- <http://madscientist.jp/~ikegami/articles/IntroSequencePolynomial.html>+--+-- * 伊藤雅史, , 平林 隆一, "整数計画問題のための b-Gröbner 基底変換アルゴリズム,"+-- <http://www.kurims.kyoto-u.ac.jp/~kyodo/kokyuroku/contents/pdf/1295-27.pdf>+-- +--+-----------------------------------------------------------------------------+module ToySolver.ContiTraverso+ ( solve+ , solve'+ ) where++import Data.Function+import qualified Data.IntMap as IM+import qualified Data.IntSet as IS+import qualified Data.Map as Map+import Data.List+import Data.Monoid+import Data.Ratio+import Data.VectorSpace++import Data.OptDir++import ToySolver.Data.ArithRel+import qualified ToySolver.Data.LA as LA+import ToySolver.Data.Polynomial (Polynomial, UPolynomial, Monomial, MonomialOrder)+import qualified ToySolver.Data.Polynomial as P+import ToySolver.Data.Polynomial.GroebnerBasis as GB+import ToySolver.Data.Var+import qualified ToySolver.LPUtil as LPUtil++solve :: MonomialOrder Var -> VarSet -> OptDir -> LA.Expr Rational -> [LA.Atom Rational] -> Maybe (Model Integer)+solve cmp vs dir obj cs = do+ m <- solve' cmp vs obj3 cs3+ return . IM.map round . mt . IM.map fromInteger $ m+ where+ ((obj2,cs2), mt) = LPUtil.toStandardForm (if dir == OptMin then obj else negateV obj, cs)+ obj3 = LA.mapCoeff g obj2+ where+ g = round . (c*)+ c = fromInteger $ foldl' lcm 1 [denominator c | (c,_) <- LA.terms obj]+ cs3 = map f cs2+ f (lhs,rhs) = (LA.mapCoeff g lhs, g rhs)+ where+ g = round . (c*)+ c = fromInteger $ foldl' lcm 1 [denominator c | (c,_) <- LA.terms lhs]++solve' :: MonomialOrder Var -> VarSet -> LA.Expr Integer -> [(LA.Expr Integer, Integer)] -> Maybe (Model Integer)+solve' cmp vs' obj cs+ | or [c < 0 | (c,x) <- LA.terms obj, x /= LA.unitVar] = error "all coefficient of cost function should be non-negative"+ | otherwise =+ if IM.keysSet (IM.filter (/= 0) m) `IS.isSubsetOf` vs'+ then Just $ IM.filterWithKey (\y _ -> y `IS.member` vs') m+ else Nothing++ where+ vs :: [Var]+ vs = IS.toList vs'++ v2 :: Var+ v2 = if IS.null vs' then 0 else IS.findMax vs' + 1++ vs2 :: [Var]+ vs2 = [v2 .. v2 + length cs - 1]++ vs2' :: IS.IntSet+ vs2' = IS.fromList vs2++ t :: Var+ t = v2 + length cs++ cmp2 :: MonomialOrder Var+ cmp2 = elimOrdering (IS.fromList vs2) `mappend` elimOrdering (IS.singleton t) `mappend` costOrdering obj `mappend` cmp++ gb :: [Polynomial Rational Var]+ gb = GB.basis' GB.defaultOptions cmp2 (product (map P.var (t:vs2)) - 1 : phi)+ where+ phi = do+ xj <- vs+ let aj = [(yi, aij) | (yi,(ai,_)) <- zip vs2 cs, let aij = LA.coeff xj ai]+ return $ product [P.var yi ^ aij | (yi, aij) <- aj, aij > 0]+ - product [P.var yi ^ (-aij) | (yi, aij) <- aj, aij < 0] * P.var xj++ yb = product [P.var yi ^ bi | ((_,bi),yi) <- zip cs vs2]++ [(_,z)] = P.terms (P.reduce cmp2 yb gb)++ m = mkModel (vs++vs2++[t]) z++mkModel :: [Var] -> Monomial Var -> Model Integer+mkModel vs xs = IM.fromDistinctAscList (Map.toAscList (P.mindicesMap xs)) `IM.union` IM.fromList [(x, 0) | x <- vs]+-- IM.union is left-biased++costOrdering :: LA.Expr Integer -> MonomialOrder Var+costOrdering obj = compare `on` f+ where+ vs = vars obj+ f xs = LA.evalExpr (mkModel (IS.toList vs) xs) obj++elimOrdering :: IS.IntSet -> MonomialOrder Var+elimOrdering xs = compare `on` f+ where+ f ys = not $ IS.null $ xs `IS.intersection` ys'+ where+ ys' = IS.fromDistinctAscList [y | (y,_) <- Map.toAscList $ P.mindicesMap ys]
+ src/ToySolver/Converter/MIP2SMT.hs view
@@ -0,0 +1,379 @@+{-# OPTIONS_GHC -Wall #-}+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.Converter.MIP2SMT+-- Copyright : (c) Masahiro Sakai 2012-2014+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : experimental+-- Portability : portable+--+-----------------------------------------------------------------------------+module ToySolver.Converter.MIP2SMT+ ( convert+ , Options (..)+ , defaultOptions+ , Language (..)+ , YicesVersion (..)+ ) where++import Data.Char+import Data.Ord+import Data.List+import Data.Ratio+import qualified Data.Set as Set+import Data.Map (Map)+import qualified Data.Map as Map+import System.IO+import Text.Printf++import qualified ToySolver.Data.MIP as MIP+import qualified ToySolver.Text.LPFile as LPFile+import ToySolver.Internal.Util (showRationalAsFiniteDecimal, isInteger)++data Options+ = Options+ { optLanguage :: Language+ , optSetLogic :: Maybe String+ , optCheckSAT :: Bool+ , optProduceModel :: Bool+ , optOptimize :: Bool+ }+ deriving (Show, Eq, Ord)++defaultOptions :: Options+defaultOptions+ = Options+ { optLanguage = SMTLIB2+ , optSetLogic = Nothing+ , optCheckSAT = True+ , optProduceModel = True+ , optOptimize = False+ }++data Language+ = SMTLIB2+ | YICES YicesVersion+ deriving (Show, Eq, Ord)++data YicesVersion+ = Yices1+ | Yices2+ deriving (Show, Eq, Ord, Enum, Bounded)++-- ------------------------------------------------------------------------++type Var = String+type Env = Map MIP.Var Var++concatS :: [ShowS] -> ShowS+concatS = foldr (.) id+ +unlinesS :: [ShowS] -> ShowS+unlinesS = concatS . map (. showChar '\n')++list :: [ShowS] -> ShowS+list xs = showParen True $ concatS (intersperse (showChar ' ') xs)++and' :: [ShowS] -> ShowS+and' [] = showString "true"+and' [x] = x+and' xs = list (showString "and" : xs)++or' :: [ShowS] -> ShowS+or' [] = showString "false"+or' [x] = x+or' xs = list (showString "or" : xs)++not' :: ShowS -> ShowS+not' x = list [showString "not", x]++intExpr :: Options -> Env -> MIP.Problem -> MIP.Expr -> ShowS+intExpr opt env mip e =+ case e of+ [] -> intNum opt 0+ [t] -> f t+ _ -> list (showChar '+' : map f e)+ where+ f (MIP.Term c _) | not (isInteger c) =+ error ("ToySolver.Converter.MIP2SMT.intExpr: fractional coefficient: " ++ show c)+ f (MIP.Term c []) = intNum opt (floor c)+ f (MIP.Term (-1) vs) = list [showChar '-', f (MIP.Term 1 vs)]+ f (MIP.Term c vs) =+ case xs of+ [] -> intNum opt 1+ [x] -> x+ _ -> list (showChar '*' : xs)+ where+ xs = [intNum opt (floor c) | c /= 1] +++ [showString (env Map.! v) | v <- vs]++realExpr :: Options -> Env -> MIP.Problem -> MIP.Expr -> ShowS+realExpr opt env mip e =+ case e of+ [] -> realNum opt 0+ [t] -> f t+ _ -> list (showChar '+' : map f e)+ where+ f (MIP.Term c []) = realNum opt c+ f (MIP.Term (-1) vs) = list [showChar '-', f (MIP.Term 1 vs)]+ f (MIP.Term c vs) =+ case xs of+ [] -> realNum opt 1+ [x] -> x+ _ -> list (showChar '*' : xs)+ where+ xs = [realNum opt c | c /= 1] +++ [ v3+ | v <- vs+ , let v2 = env Map.! v+ , let v3 = if isInt mip v+ then toReal opt (showString v2)+ else showString v2+ ]++intNum :: Options -> Integer -> ShowS+intNum opt x =+ case optLanguage opt of+ SMTLIB2+ | x < 0 -> list [showChar '-', shows (negate x)]+ | otherwise -> shows x+ YICES _ -> shows x++realNum :: Options -> Rational -> ShowS+realNum opt r =+ case optLanguage opt of+ SMTLIB2+ | r < 0 -> list [showChar '-', f (negate r)]+ | otherwise -> f r+ YICES Yices1 ->+ if denominator r == 1+ then shows (numerator r)+ else shows (numerator r) . showChar '/' . shows (denominator r)+ YICES Yices2 ->+ case showRationalAsFiniteDecimal r of+ Just s -> showString s+ Nothing -> shows (numerator r) . showChar '/' . shows (denominator r)+ where+ f r = case showRationalAsFiniteDecimal r of+ Just s -> showString s+ Nothing -> list [showChar '/', shows (numerator r) . showString ".0", shows (denominator r) . showString ".0"]++rel :: Options -> Env -> MIP.Problem -> Bool -> MIP.RelOp -> MIP.Expr -> Rational -> ShowS+rel opt env mip q op lhs rhs+ | and [isInt mip v | v <- Set.toList (MIP.vars lhs)] &&+ and [isInteger c | MIP.Term c _ <- lhs] && isInteger rhs =+ f q op (intExpr opt env mip lhs) (intNum opt (floor rhs))+ | otherwise =+ f q op (realExpr opt env mip lhs) (realNum opt rhs)+ where+ f :: Bool -> MIP.RelOp -> ShowS -> ShowS -> ShowS+ f True MIP.Eql x y = and' [f False MIP.Le x y, f False MIP.Ge x y]+ f _ MIP.Eql x y = list [showString "=", x, y]+ f _ MIP.Le x y = list [showString "<=", x, y]+ f _ MIP.Ge x y = list [showString ">=", x, y]++toReal :: Options -> ShowS -> ShowS+toReal opt x =+ case optLanguage opt of+ SMTLIB2 -> list [showString "to_real", x]+ YICES _ -> x++assert :: Options -> (ShowS, Maybe String) -> ShowS+assert opt (x, label) = list [showString "assert", x']+ where+ x' = case label of+ Just name | optLanguage opt == SMTLIB2 ->+ list [ showString "!"+ , x+ , showString ":named"+ , showString (encode opt name)+ ]+ _ -> x++constraint :: Options -> Bool -> Env -> MIP.Problem -> MIP.Constraint -> (ShowS, Maybe String)+constraint opt q env mip+ MIP.Constraint+ { MIP.constrLabel = label+ , MIP.constrIndicator = g+ , MIP.constrBody = (e, op, b)+ } = (c1, label)+ where+ c0 = rel opt env mip q op e b+ c1 = case g of+ Nothing -> c0+ Just (var,val) ->+ list [ showString "=>"+ , rel opt env mip q MIP.Eql [MIP.Term 1 [var]] val+ , c0+ ]++conditions :: Options -> Bool -> Env -> MIP.Problem -> [(ShowS, Maybe String)]+conditions opt q env mip = bnds ++ cs ++ ss+ where+ vs = MIP.variables mip+ bnds = map bnd (Set.toList vs)+ bnd v = (c1, Nothing)+ where+ v2 = env Map.! v+ v3 = if isInt mip v+ then toReal opt (showString v2)+ else showString v2+ (lb,ub) = MIP.getBounds mip v+ s1 = case lb of+ MIP.NegInf -> []+ MIP.PosInf -> [showString "false"]+ MIP.Finite x ->+ if isInt mip v+ then [list [showString "<=", intNum opt (ceiling x), showString v2]]+ else [list [showString "<=", realNum opt x, v3]]+ s2 = case ub of+ MIP.NegInf -> [showString "false"]+ MIP.PosInf -> []+ MIP.Finite x ->+ if isInt mip v+ then [list [showString "<=", showString v2, intNum opt (floor x)]]+ else [list [showString "<=", v3, realNum opt x]]+ c0 = and' (s1 ++ s2)+ c1 = case MIP.getVarType mip v of+ MIP.SemiContinuousVariable ->+ or' [list [showString "=", showString v2, realNum opt 0], c0]+ MIP.SemiIntegerVariable ->+ or' [list [showString "=", showString v2, intNum opt 0], c0]+ _ ->+ c0+ cs = map (constraint opt q env mip) (MIP.constraints mip)+ ss = concatMap sos (MIP.sosConstraints mip)+ sos (MIP.SOSConstraint label typ xs) = do+ (x1,x2) <- case typ of+ MIP.S1 -> pairs $ map fst xs+ MIP.S2 -> nonAdjacentPairs $ map fst $ sortBy (comparing snd) $ xs+ let c = not' $ and'+ [ list [showString "/=", v3, realNum opt 0]+ | v<-[x1,x2]+ , let v2 = env Map.! v+ , let v3 = if isInt mip v+ then toReal opt (showString v2)+ else showString v2+ ]+ return (c, label)++pairs :: [a] -> [(a,a)]+pairs [] = []+pairs (x:xs) = [(x,x2) | x2 <- xs] ++ pairs xs++nonAdjacentPairs :: [a] -> [(a,a)]+nonAdjacentPairs (x1:x2:xs) = [(x1,x3) | x3 <- xs] ++ nonAdjacentPairs (x2:xs)+nonAdjacentPairs _ = []++convert :: Options -> MIP.Problem -> ShowS+convert opt mip =+ unlinesS $ options ++ set_logic ++ defs ++ map (assert opt) (conditions opt False env mip)+ ++ [ assert opt (optimality, Nothing) | optOptimize opt ]+ ++ [ case optLanguage opt of+ SMTLIB2 -> list [showString "check-sat"]+ YICES _ -> list [showString "check"]+ | optCheckSAT opt ]+ where+ vs = MIP.variables mip+ real_vs = vs `Set.difference` int_vs+ int_vs = MIP.integerVariables mip `Set.union` MIP.semiIntegerVariables mip+ realType =+ case optLanguage opt of+ SMTLIB2 -> "Real"+ YICES _ -> "real"+ intType =+ case optLanguage opt of+ SMTLIB2 -> "Int"+ YICES _ -> "int"+ ts = [(v, realType) | v <- Set.toList real_vs] ++ [(v, intType) | v <- Set.toList int_vs]+ obj = snd (MIP.objectiveFunction mip)+ env = Map.fromList [(v, encode opt (MIP.fromVar v)) | v <- Set.toList vs]+ -- Note that identifiers of LPFile does not contain '-'.+ -- So that there are no name crash.+ env2 = Map.fromList [(v, encode opt (MIP.fromVar v ++ "-2")) | v <- Set.toList vs]++ options =+ [ case optLanguage opt of+ SMTLIB2 -> list [showString "set-option", showString ":produce-models", showString "true"]+ YICES _ -> list [showString "set-evidence!", showString "true"]+ | optProduceModel opt && optLanguage opt /= YICES Yices2+ ]++ set_logic =+ case optSetLogic opt of+ Just logic | optLanguage opt == SMTLIB2 -> [list [showString "set-logic", showString logic]]+ _ -> []++ defs = do+ (v,t) <- ts+ let v2 = env Map.! v+ return $ showString $+ case optLanguage opt of+ SMTLIB2 -> printf "(declare-fun %s () %s)" v2 t+ YICES _ -> printf "(define %s::%s) ; %s" v2 t (MIP.fromVar v)++ optimality = list [showString "forall", decl, body]+ where+ decl =+ case optLanguage opt of+ SMTLIB2 -> list [list [showString (env2 Map.! v), showString t] | (v,t) <- ts]+ YICES _ -> list [showString $ printf "%s::%s" (env2 Map.! v) t | (v,t) <- ts]+ body = list [showString "=>"+ , and' (map fst (conditions opt True env2 mip))+ , list [ showString $ if MIP.dir mip == MIP.OptMin then "<=" else ">="+ , realExpr opt env mip obj, realExpr opt env2 mip obj+ ]+ ]++encode :: Options -> String -> String+encode opt s = + case optLanguage opt of+ SMTLIB2+ | all p s -> s+ | any q s -> error $ "cannot encode " ++ show s+ | otherwise -> "|" ++ s ++ "|"+ YICES _ -> concatMap f s+ where+ p c = isAscii c && (isAlpha c || isDigit c || c `elem` "~!@$%^&*_-+=<>.?/")+ q c = c == '|' && c == '\\'++ -- Note that '[', ']', '\\' does not appear in identifiers of LP file.+ f '(' = "["+ f ')' = "]"+ f c | c `elem` "/\";" = printf "\\x%02d" (fromEnum c :: Int)+ f c = [c]++isInt :: MIP.Problem -> MIP.Var -> Bool+isInt mip v = vt == MIP.IntegerVariable || vt == MIP.SemiIntegerVariable+ where+ vt = MIP.getVarType mip v++-- ------------------------------------------------------------------------++testFile :: FilePath -> IO ()+testFile fname = do+ result <- LPFile.parseFile fname+ case result of+ Right mip -> putStrLn $ convert defaultOptions mip ""+ Left err -> hPrint stderr err++test :: IO ()+test = putStrLn $ convert defaultOptions testdata ""++testdata :: MIP.Problem+Right testdata = LPFile.parseString "test" $ unlines+ [ "Maximize"+ , " obj: x1 + 2 x2 + 3 x3 + x4"+ , "Subject To"+ , " c1: - x1 + x2 + x3 + 10 x4 <= 20"+ , " c2: x1 - 3 x2 + x3 <= 30"+ , " c3: x2 - 3.5 x4 = 0"+ , "Bounds"+ , " 0 <= x1 <= 40"+ , " 2 <= x4 <= 3"+ , "General"+ , " x4"+ , "End"+ ]
+ src/ToySolver/Converter/MaxSAT2IP.hs view
@@ -0,0 +1,25 @@+{-# OPTIONS_GHC -Wall #-}+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.Converter.MaxSAT2IP+-- Copyright : (c) Masahiro Sakai 2011-2014+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : experimental+-- Portability : portable+--+-----------------------------------------------------------------------------+module ToySolver.Converter.MaxSAT2IP+ ( convert+ ) where++import Data.Map (Map)+import qualified ToySolver.Data.MIP as MIP+import qualified ToySolver.Text.MaxSAT as MaxSAT+import ToySolver.SAT.Types+import qualified ToySolver.Converter.MaxSAT2WBO as MaxSAT2WBO+import qualified ToySolver.Converter.PB2IP as PB2IP++convert :: Bool -> MaxSAT.WCNF -> (MIP.Problem, Map MIP.Var Rational -> Model)+convert useIndicator wcnf = PB2IP.convertWBO useIndicator (MaxSAT2WBO.convert wcnf)
+ src/ToySolver/Converter/MaxSAT2NLPB.hs view
@@ -0,0 +1,35 @@+{-# OPTIONS_GHC -Wall #-}+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.Converter.MaxSAT2NLPB+-- Copyright : (c) Masahiro Sakai 2013+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : experimental+-- Portability : portable+--+-----------------------------------------------------------------------------+module ToySolver.Converter.MaxSAT2NLPB+ ( convert+ ) where++import qualified ToySolver.Text.PBFile as PBFile+import qualified ToySolver.Text.MaxSAT as MaxSAT++convert :: MaxSAT.WCNF -> PBFile.Formula+convert+ MaxSAT.WCNF+ { MaxSAT.topCost = top+ , MaxSAT.clauses = cs+ , MaxSAT.numVars = nv+ } =+ PBFile.Formula+ { PBFile.pbObjectiveFunction = Just obj+ , PBFile.pbConstraints = cs2+ , PBFile.pbNumVars = nv+ , PBFile.pbNumConstraints = length cs2+ }+ where+ obj = [(w, [-l | l <- ls]) | (w,ls) <- cs, w /= top]+ cs2 = [([(1,[l]) | l <- ls], PBFile.Ge, 1) | (w,ls) <- cs, w == top]
+ src/ToySolver/Converter/MaxSAT2WBO.hs view
@@ -0,0 +1,40 @@+{-# OPTIONS_GHC -Wall #-}+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.Converter.MaxSAT2WBO+-- Copyright : (c) Masahiro Sakai 2013+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : experimental+-- Portability : portable+--+-----------------------------------------------------------------------------+module ToySolver.Converter.MaxSAT2WBO+ ( convert+ ) where++import qualified ToySolver.Text.PBFile as PBFile+import qualified ToySolver.Text.MaxSAT as MaxSAT++convert :: MaxSAT.WCNF -> PBFile.SoftFormula+convert+ MaxSAT.WCNF+ { MaxSAT.topCost = top+ , MaxSAT.clauses = cs+ , MaxSAT.numVars = nv+ , MaxSAT.numClauses = nc+ } =+ PBFile.SoftFormula+ { PBFile.wboTopCost = Nothing+ , PBFile.wboConstraints = map f cs+ , PBFile.wboNumVars = nv+ , PBFile.wboNumConstraints = nc+ }+ where+ f (w,ls)+ | w>=top = (Nothing, p) -- hard constraint+ | otherwise = (Just w, p) -- soft constraint+ where+ p = ([(1,[l]) | l <- ls], PBFile.Ge, 1)+
+ src/ToySolver/Converter/ObjType.hs view
@@ -0,0 +1,18 @@+{-# OPTIONS_GHC -Wall #-}+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.Converter.ObjType+-- Copyright : (c) Masahiro Sakai 2011-2012+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : experimental+-- Portability : portable+--+-----------------------------------------------------------------------------+module ToySolver.Converter.ObjType+ ( ObjType (..)+ ) where++data ObjType = ObjNone | ObjMaxOne | ObjMaxZero+ deriving Eq
+ src/ToySolver/Converter/PB2IP.hs view
@@ -0,0 +1,192 @@+{-# OPTIONS_GHC -Wall #-}+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.Converter.PB2IP+-- Copyright : (c) Masahiro Sakai 2011-2014+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : experimental+-- Portability : portable+--+-----------------------------------------------------------------------------+module ToySolver.Converter.PB2IP+ ( convert+ , convertWBO+ ) where++import Data.Array.IArray+import Data.List+import Data.Maybe+import Data.Map (Map)+import qualified Data.Map as Map++import qualified ToySolver.Data.MIP as MIP+import qualified ToySolver.Text.PBFile as PBFile+import qualified ToySolver.SAT.Types as SAT++convert :: PBFile.Formula -> (MIP.Problem, Map MIP.Var Rational -> SAT.Model)+convert formula = (mip, mtrans (PBFile.pbNumVars formula))+ where+ mip = MIP.Problem+ { MIP.dir = dir+ , MIP.objectiveFunction = (Nothing, obj2)+ , MIP.constraints = cs2+ , MIP.sosConstraints = []+ , MIP.userCuts = []+ , MIP.varInfo = Map.fromList+ [ ( v+ , MIP.VarInfo+ { MIP.varType = MIP.IntegerVariable+ , MIP.varBounds = (MIP.Finite 0, MIP.Finite 1)+ }+ )+ | v <- vs+ ]+ }++ vs = [convVar v | v <- [1..PBFile.pbNumVars formula]]++ (dir,obj2) =+ case PBFile.pbObjectiveFunction formula of+ Just obj' -> (MIP.OptMin, convExpr obj')+ Nothing -> (MIP.OptMin, convExpr [])++ cs2 = do+ (lhs,op,rhs) <- PBFile.pbConstraints formula+ let op2 = case op of+ PBFile.Ge -> MIP.Ge+ PBFile.Eq -> MIP.Eql+ lhs2 = convExpr lhs+ lhs3a = [t | t@(MIP.Term _ (_:_)) <- lhs2]+ lhs3b = sum [c | MIP.Term c [] <- lhs2]+ return $ MIP.Constraint+ { MIP.constrLabel = Nothing+ , MIP.constrIndicator = Nothing+ , MIP.constrIsLazy = False+ , MIP.constrBody = (lhs3a, op2, fromIntegral rhs - lhs3b)+ }++convExpr :: PBFile.Sum -> MIP.Expr+convExpr s = concatMap g2 s+ where+ g2 :: PBFile.WeightedTerm -> MIP.Expr+ g2 (w, tm) = foldl' prodE [MIP.Term (fromIntegral w) []] (map g3 tm)++ g3 :: PBFile.Lit -> MIP.Expr+ g3 x+ | x > 0 = [MIP.Term 1 [convVar x]]+ | otherwise = [MIP.Term 1 [], MIP.Term (-1) [convVar (abs x)]]++ prodE :: MIP.Expr -> MIP.Expr -> MIP.Expr+ prodE e1 e2 = [prodT t1 t2 | t1 <- e1, t2 <- e2]++ prodT :: MIP.Term -> MIP.Term -> MIP.Term+ prodT (MIP.Term c1 vs1) (MIP.Term c2 vs2) = MIP.Term (c1*c2) (vs1++vs2)++convVar :: PBFile.Var -> MIP.Var+convVar x = MIP.toVar ("x" ++ show x)++convertWBO :: Bool -> PBFile.SoftFormula -> (MIP.Problem, Map MIP.Var Rational -> SAT.Model)+convertWBO useIndicator formula = (mip, mtrans (PBFile.wboNumVars formula))+ where+ mip = MIP.Problem+ { MIP.dir = MIP.OptMin+ , MIP.objectiveFunction = (Nothing, obj2)+ , MIP.constraints = topConstr ++ map snd cs2+ , MIP.sosConstraints = []+ , MIP.userCuts = []+ , MIP.varInfo = Map.fromList+ [ ( v+ , MIP.VarInfo+ { MIP.varType = MIP.IntegerVariable+ , MIP.varBounds = (MIP.Finite 0, MIP.Finite 1)+ }+ )+ | v <- vs+ ]+ }++ vs = [convVar v | v <- [1..PBFile.wboNumVars formula]] ++ [v | (ts, _) <- cs2, (_, v) <- ts]++ obj2 = [MIP.Term (fromIntegral w) [v] | (ts, _) <- cs2, (w, v) <- ts]++ topConstr :: [MIP.Constraint]+ topConstr = + case PBFile.wboTopCost formula of+ Nothing -> []+ Just t ->+ [ MIP.Constraint+ { MIP.constrLabel = Nothing+ , MIP.constrIndicator = Nothing+ , MIP.constrIsLazy = False+ , MIP.constrBody = (obj2, MIP.Le, fromInteger t - 1)+ }+ ]++ cs2 :: [([(Integer, MIP.Var)], MIP.Constraint)]+ cs2 = do+ (n, (w, (lhs,op,rhs))) <- zip [(0::Int)..] (PBFile.wboConstraints formula)+ let + lhs2 = convExpr lhs+ lhs3 = [t | t@(MIP.Term _ (_:_)) <- lhs2]+ rhs3 = fromIntegral rhs - sum [c | MIP.Term c [] <- lhs2]+ v = MIP.toVar ("r" ++ show n)+ (ts,ind) =+ case w of+ Nothing -> ([], Nothing)+ Just w2 -> ([(w2,v)], Just (v,0))+ if isNothing w || useIndicator then do+ let op2 =+ case op of+ PBFile.Ge -> MIP.Ge+ PBFile.Eq -> MIP.Eql+ c = MIP.Constraint+ { MIP.constrLabel = Nothing+ , MIP.constrIndicator = ind+ , MIP.constrIsLazy = False+ , MIP.constrBody = (lhs3, op2, rhs3)+ }+ return (ts, c)+ else do+ let (lhsGE,rhsGE) = relaxGE v (lhs3,rhs3)+ c1 = MIP.Constraint+ { MIP.constrLabel = Nothing+ , MIP.constrIndicator = Nothing+ , MIP.constrIsLazy = False+ , MIP.constrBody = (lhsGE, MIP.Ge, rhsGE)+ }+ case op of+ PBFile.Ge -> do+ return (ts, c1)+ PBFile.Eq -> do+ let (lhsLE,rhsLE) = relaxLE v (lhs3,rhs3)+ c2 = MIP.Constraint+ { MIP.constrLabel = Nothing+ , MIP.constrIndicator = Nothing+ , MIP.constrIsLazy = False+ , MIP.constrBody = (lhsLE, MIP.Le, rhsLE)+ }+ [ (ts, c1), ([], c2) ]++relaxGE :: MIP.Var -> (MIP.Expr, Rational) -> (MIP.Expr, Rational)+relaxGE v (lhs, rhs) = (MIP.Term (rhs - lhs_lb) [v] : lhs, rhs)+ where+ lhs_lb = sum [min c 0 | MIP.Term c _ <- lhs]++relaxLE :: MIP.Var -> (MIP.Expr, Rational) -> (MIP.Expr, Rational)+relaxLE v (lhs, rhs) = (MIP.Term (rhs - lhs_ub) [v] : lhs, rhs)+ where+ lhs_ub = sum [max c 0 | MIP.Term c _ <- lhs]++mtrans :: Int -> Map MIP.Var Rational -> SAT.Model+mtrans nvar m =+ array (1, nvar)+ [ (i, val)+ | i <- [1 .. nvar]+ , let val =+ case Map.findWithDefault 0 (convVar i) m of+ 0 -> False+ 1 -> True+ v0 -> error (show v0 ++ " is neither 0 nor 1")+ ]
+ src/ToySolver/Converter/PB2LSP.hs view
@@ -0,0 +1,103 @@+{-# OPTIONS_GHC -Wall #-}+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.Converter.PB2LSP+-- Copyright : (c) Masahiro Sakai 2013-2014+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : experimental+-- Portability : portable+--+-----------------------------------------------------------------------------+module ToySolver.Converter.PB2LSP+ ( convert+ , convertWBO+ ) where++import Data.List+import qualified ToySolver.Text.PBFile as PBFile++convert :: PBFile.Formula -> ShowS+convert formula =+ showString "function model() {\n" .+ decls .+ constrs .+ obj2 .+ showString "}\n"+ where+ nv = PBFile.pbNumVars formula++ decls = showString $+ " for [i in 1.." ++ show nv ++ "] x[i] <- bool();\n"++ constrs = foldr (.) id+ [ showString " constraint " .+ showString (showConstr c) .+ showString ";\n"+ | c <- PBFile.pbConstraints formula+ ]++ obj2 =+ case PBFile.pbObjectiveFunction formula of+ Just obj' -> showString " minimize " . showString (showSum obj') . showString ";\n"+ Nothing -> id++convertWBO :: PBFile.SoftFormula -> ShowS+convertWBO softFormula =+ showString "function model() {\n" .+ decls .+ constrs .+ costDef .+ topConstr .+ showString " minimize cost;\n" .+ showString "}\n"+ where+ nv = PBFile.wboNumVars softFormula++ decls = showString $+ " for [i in 1.." ++ show nv ++ "] x[i] <- bool();\n"++ constrs = foldr (.) id+ [ showString " constraint " .+ showString (showConstr c) .+ showString ";\n"+ | (Nothing, c) <- PBFile.wboConstraints softFormula+ ]++ costDef = showString " cost <- sum(\n" . s . showString ");\n"+ where+ s = foldr (.) id . intersperse (showString ",\n") . map showString $ xs+ xs = [" " ++ show w ++ "*!(" ++ showConstr c ++ ")" | (Just w, c) <- PBFile.wboConstraints softFormula]++ topConstr =+ case PBFile.wboTopCost softFormula of+ Nothing -> id+ Just t -> showString $ " constraint cost <= " ++ show t ++ ";\n"++showConstr :: PBFile.Constraint -> String+showConstr (lhs, PBFile.Ge, 1) | and [c==1 | (c,_) <- lhs] =+ "or(" ++ intercalate "," (map (f . snd) lhs) ++ ")"+ where+ f [l] = showLit l+ f ls = "and(" ++ intercalate "," (map showLit ls) ++ ")"+showConstr (lhs, op, rhs) = showSum lhs ++ op2 ++ show rhs+ where+ op2 = case op of+ PBFile.Ge -> " >= "+ PBFile.Eq -> " == "++sum' :: [String] -> String+sum' xs = "sum(" ++ intercalate ", " xs ++ ")"++showSum :: PBFile.Sum -> String+showSum = sum' . map showTerm++showTerm :: PBFile.WeightedTerm -> String+showTerm (n,ls) = intercalate "*" $ [show n | n /= 1] ++ [showLit l | l<-ls]++showLit :: PBFile.Lit -> String+showLit l =+ if l < 0+ then "!x[" ++ show (abs l) ++ "]"+ else "x[" ++ show l ++ "]"
+ src/ToySolver/Converter/PB2SMP.hs view
@@ -0,0 +1,85 @@+{-# OPTIONS_GHC -Wall #-}+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.Converter.PB2SMP+-- Copyright : (c) Masahiro Sakai 2013+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : experimental+-- Portability : portable+--+-----------------------------------------------------------------------------+module ToySolver.Converter.PB2SMP+ ( convert+ ) where++import Data.List+import qualified ToySolver.Text.PBFile as PBFile++convert :: Bool -> PBFile.Formula -> ShowS+convert isUnix formula =+ header .+ decls .+ showString "\n" .+ obj2 .+ showString "\n" .+ constrs .+ showString "\n" .+ actions .+ footer+ where+ nv = PBFile.pbNumVars formula++ header =+ if isUnix+ then showString "#include \"simple.h\"\nvoid ufun()\n{\n\n"+ else id+ + footer =+ if isUnix+ then showString "\n}\n"+ else id++ actions =+ showString "solve();\n" .+ showString "x[i].val.print();\n" .+ showString "cost.val.print();\n"++ decls = showString $+ "Element i(set=\"1 .. " ++ show nv ++ "\");\n" +++ "IntegerVariable x(type=binary, index=i);\n"++ constrs = foldr (.) id+ [ showString (showSum lhs) .+ showString op2 .+ shows rhs .+ showString ";\n"+ | (lhs, op, rhs) <- PBFile.pbConstraints formula+ , let op2 = case op of+ PBFile.Ge -> " >= "+ PBFile.Eq -> " == "+ ]++ showSum :: PBFile.Sum -> String+ showSum [] = "0"+ showSum xs = intercalate " + " $ map showTerm xs++ showTerm (n,ls) = intercalate "*" $ showCoeff n ++ [showLit l | l<-ls]++ showCoeff n+ | n == 1 = []+ | n < 0 = ["(" ++ show n ++ ")"]+ | otherwise = [show n]++ showLit l =+ if l < 0+ then "(1-x[" ++ show (abs l) ++ "])"+ else "x[" ++ show l ++ "]"++ obj2 =+ case PBFile.pbObjectiveFunction formula of+ Just obj' ->+ showString "Objective cost(type=minimize);\n" .+ showString "cost = " . showString (showSum obj') . showString ";\n"+ Nothing -> id
+ src/ToySolver/Converter/PB2WBO.hs view
@@ -0,0 +1,39 @@+{-# OPTIONS_GHC -Wall #-}+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.Converter.PB2WBO+-- Copyright : (c) Masahiro Sakai 2013+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : experimental+-- Portability : portable+--+-- References:+--+-- * Improving Unsatisfiability-based Algorithms for Boolean Optimization+-- <http://sat.inesc-id.pt/~ruben/talks/sat10-talk.pdf>+--+-----------------------------------------------------------------------------+module ToySolver.Converter.PB2WBO (convert) where++import qualified ToySolver.Text.PBFile as PBFile++convert :: PBFile.Formula -> PBFile.SoftFormula+convert formula+ = PBFile.SoftFormula+ { PBFile.wboTopCost = Nothing+ , PBFile.wboConstraints = cs1 ++ cs2+ , PBFile.wboNumVars = PBFile.pbNumVars formula+ , PBFile.wboNumConstraints = PBFile.pbNumConstraints formula + length cs2+ }+ where+ cs1 = [(Nothing, c) | c <- PBFile.pbConstraints formula]+ cs2 = case PBFile.pbObjectiveFunction formula of+ Nothing -> []+ Just e ->+ [ if w >= 0+ then (Just w, ([(-1,ls)], PBFile.Ge, 0))+ else (Just (abs w), ([(1,ls)], PBFile.Ge, 1))+ | (w,ls) <- e+ ]
+ src/ToySolver/Converter/PBSetObj.hs view
@@ -0,0 +1,31 @@+{-# OPTIONS_GHC -Wall #-}+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.Converter.PBSetObj+-- Copyright : (c) Masahiro Sakai 2013+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : experimental+-- Portability : portable+--+-----------------------------------------------------------------------------+module ToySolver.Converter.PBSetObj+ ( ObjType (..)+ , setObj+ ) where++import qualified ToySolver.Text.PBFile as PBFile+import ToySolver.Converter.ObjType++setObj :: ObjType -> PBFile.Formula -> PBFile.Formula+setObj objType formula = formula{ PBFile.pbObjectiveFunction = Just obj2 }+ where+ obj2 = genObj objType formula++genObj :: ObjType -> PBFile.Formula -> PBFile.Sum+genObj objType formula =+ case objType of+ ObjNone -> []+ ObjMaxOne -> [(1,[-v]) | v <- [1 .. PBFile.pbNumVars formula]] -- minimize false literals+ ObjMaxZero -> [(1,[ v]) | v <- [1 .. PBFile.pbNumVars formula]] -- minimize true literals
+ src/ToySolver/Converter/SAT2IP.hs view
@@ -0,0 +1,26 @@+{-# OPTIONS_GHC -Wall #-}+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.Converter.SAT2IP+-- Copyright : (c) Masahiro Sakai 2011-2014+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : experimental+-- Portability : portable+--+-----------------------------------------------------------------------------+module ToySolver.Converter.SAT2IP+ ( convert+ ) where++import Data.Map (Map)+import qualified Language.CNF.Parse.ParseDIMACS as DIMACS++import qualified ToySolver.Data.MIP as MIP+import qualified ToySolver.SAT.Types as SAT+import qualified ToySolver.Converter.PB2IP as PB2IP+import qualified ToySolver.Converter.SAT2PB as SAT2PB++convert :: DIMACS.CNF -> (MIP.Problem, Map MIP.Var Rational -> SAT.Model)+convert cnf = PB2IP.convert (SAT2PB.convert cnf)
+ src/ToySolver/Converter/SAT2PB.hs view
@@ -0,0 +1,31 @@+{-# OPTIONS_GHC -Wall #-}+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.Converter.SAT2PB+-- Copyright : (c) Masahiro Sakai 2013+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : experimental+-- Portability : portable+--+-----------------------------------------------------------------------------+module ToySolver.Converter.SAT2PB+ ( convert+ ) where++import Data.Array.IArray+import qualified Language.CNF.Parse.ParseDIMACS as DIMACS++import qualified ToySolver.Text.PBFile as PBFile++convert :: DIMACS.CNF -> PBFile.Formula+convert cnf+ = PBFile.Formula+ { PBFile.pbObjectiveFunction = Nothing+ , PBFile.pbConstraints = map f (DIMACS.clauses cnf)+ , PBFile.pbNumVars = DIMACS.numVars cnf+ , PBFile.pbNumConstraints = DIMACS.numClauses cnf+ }+ where+ f clause = ([(1,[l]) | l <- elems clause], PBFile.Ge, 1)
+ src/ToySolver/Converter/WBO2PB.hs view
@@ -0,0 +1,57 @@+{-# OPTIONS_GHC -Wall #-}+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.Converter.WBO2PB+-- Copyright : (c) Masahiro Sakai 2013+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : experimental+-- Portability : portable+--+-----------------------------------------------------------------------------+module ToySolver.Converter.WBO2PB (convert) where++import Data.Array.IArray+import qualified ToySolver.SAT.Types as SAT+import qualified ToySolver.Text.PBFile as PBFile++convert :: PBFile.SoftFormula -> (PBFile.Formula, SAT.Model -> SAT.Model)+convert wbo = (formula, mtrans)+ where+ nv = PBFile.wboNumVars wbo++ cm = zip [nv+1..] (PBFile.wboConstraints wbo)+ obj = [(w, [i]) | (i, (Just w,_)) <- cm]++ f :: (PBFile.Var, PBFile.SoftConstraint) -> [PBFile.Constraint]+ f (_, (Nothing, c)) = return c+ f (i, (Just _, c)) = relax i c++ relax :: PBFile.Var -> PBFile.Constraint -> [PBFile.Constraint]+ relax i (lhs, PBFile.Ge, rhs) = [((d, [i]) : lhs, PBFile.Ge, rhs)]+ where+ d = rhs - SAT.pbLowerBound [(c,1) | (c,_) <- lhs]+ relax i (lhs, PBFile.Eq, rhs) =+ relax i (lhs, PBFile.Ge, rhs) +++ relax i ([(-c,ls) | (c,ls) <- lhs], PBFile.Ge, - rhs)++ topConstr :: [PBFile.Constraint]+ topConstr = + case PBFile.wboTopCost wbo of+ Nothing -> []+ Just t -> [([(-c,ls) | (c,ls) <- obj], PBFile.Ge, - (t - 1))]++ formula =+ PBFile.Formula+ { PBFile.pbObjectiveFunction = Just obj+ , PBFile.pbConstraints = cs+ , PBFile.pbNumVars = nv + PBFile.wboNumConstraints wbo+ , PBFile.pbNumConstraints = length cs+ }+ where+ cs = topConstr ++ concatMap f cm++ mtrans :: SAT.Model -> SAT.Model+ mtrans m = + array (1, nv) [(x, m ! x) | x <- [1..nv]]
+ src/ToySolver/Cooper.hs view
@@ -0,0 +1,50 @@+{-# OPTIONS_GHC -Wall #-}+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.Cooper+-- Copyright : (c) Masahiro Sakai 2011+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : provisional+-- Portability : non-portable (FlexibleInstances)+--+-- Naive implementation of Cooper's algorithm+--+-- Reference:+-- +-- * <http://hagi.is.s.u-tokyo.ac.jp/pub/staff/hagiya/kougiroku/ronri/5.txt>+-- +-- * <http://www.cs.cmu.edu/~emc/spring06/home1_files/Presburger%20Arithmetic.ppt>+-- +-- See also:+--+-- * <http://hackage.haskell.org/package/presburger>+--+-----------------------------------------------------------------------------+module ToySolver.Cooper+ (+ -- * Language of presburger arithmetics+ ExprZ+ , Lit (..)+ , QFFormula (..)+ , fromLAAtom+ , (.|.)++ -- * Projection+ , project+ , projectCases+ , projectCasesN++ -- * Quantifier elimination+ , eliminateQuantifiers++ -- * Constraint solving+ , solve+ , solveQFFormula+ , solveFormula+ , solveQFLA+ ) where++import ToySolver.Cooper.Core+import ToySolver.Cooper.FOL
+ src/ToySolver/Cooper/Core.hs view
@@ -0,0 +1,435 @@+{-# OPTIONS_GHC -Wall #-}+{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances #-}+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.Cooper.Core+-- Copyright : (c) Masahiro Sakai 2011-2013+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : provisional+-- Portability : non-portable (FlexibleInstances)+--+-- Naive implementation of Cooper's algorithm+--+-- Reference:+-- +-- * <http://hagi.is.s.u-tokyo.ac.jp/pub/staff/hagiya/kougiroku/ronri/5.txt>+-- +-- * <http://www.cs.cmu.edu/~emc/spring06/home1_files/Presburger%20Arithmetic.ppt>+-- +-- See also:+--+-- * <http://hackage.haskell.org/package/presburger>+--+-----------------------------------------------------------------------------+module ToySolver.Cooper.Core+ (+ -- * Language of presburger arithmetics+ ExprZ+ , Lit (..)+ , evalLit+ , QFFormula (..)+ , fromLAAtom+ , (.|.)+ , evalQFFormula++ -- * Projection+ , project+ , projectN+ , projectCases+ , projectCasesN++ -- * Constraint solving+ , solve+ , solveQFFormula+ , solveQFLA+ ) where++import Control.Monad+import Data.List+import Data.Maybe+import qualified Data.IntMap as IM+import qualified Data.IntSet as IS+import Data.VectorSpace hiding (project)++import ToySolver.Data.ArithRel+import ToySolver.Data.Boolean+import qualified ToySolver.Data.LA as LA+import ToySolver.Data.Var+import qualified ToySolver.FourierMotzkin as FM+import qualified ToySolver.FourierMotzkin.Core as FM++-- ---------------------------------------------------------------------------++-- | Linear arithmetic expression over integers.+type ExprZ = LA.Expr Integer++fromLAAtom :: LA.Atom Rational -> QFFormula+fromLAAtom (Rel a op b) = rel op a' b'+ where+ (e1,c1) = FM.toRat a+ (e2,c2) = FM.toRat b+ a' = c2 *^ e1+ b' = c1 *^ e2++leZ, ltZ, geZ, gtZ :: ExprZ -> ExprZ -> Lit+leZ e1 e2 = e1 `ltZ` (e2 ^+^ LA.constant 1)+ltZ e1 e2 = Pos $ (e2 ^-^ e1)+geZ = flip leZ+gtZ = flip gtZ++eqZ :: ExprZ -> ExprZ -> QFFormula+eqZ e1 e2 = Lit (e1 `leZ` e2) .&&. Lit (e1 `geZ` e2)++-- | Literal+-- +-- * @Pos e@ means @e > 0@+-- +-- * @Divisible True d e@ means @e@ can be divided by @d@ (i.e. @d|e@)+-- +-- * @Divisible False d e@ means @e@ can not be divided by @d@ (i.e. @¬(d|e)@)+data Lit+ = Pos ExprZ+ | Divisible Bool Integer ExprZ+ deriving (Show, Eq, Ord)++instance Variables Lit where+ vars (Pos t) = vars t+ vars (Divisible _ _ t) = vars t++instance Complement Lit where+ notB (Pos e) = e `leZ` LA.constant 0+ notB (Divisible b c e) = Divisible (not b) c e++-- | quantifier-free negation normal form+data QFFormula+ = T+ | F+ | And QFFormula QFFormula+ | Or QFFormula QFFormula+ | Lit Lit+ deriving (Show, Eq, Ord)++instance Complement QFFormula where+ notB T = F+ notB F = T+ notB (And a b) = Or (notB a) (notB b)+ notB (Or a b) = And (notB a) (notB b)+ notB (Lit lit) = Lit (notB lit)++instance Boolean QFFormula where+ true = T+ false = F+ (.&&.) = And+ (.||.) = Or++instance Variables QFFormula where+ vars T = IS.empty+ vars F = IS.empty+ vars (And a b) = vars a `IS.union` vars b+ vars (Or a b) = vars a `IS.union` vars b+ vars (Lit l) = vars l++instance IsRel (LA.Expr Integer) QFFormula where+ rel op lhs rhs =+ case op of+ Le -> Lit $ leZ lhs rhs+ Ge -> Lit $ geZ lhs rhs+ Lt -> Lit $ ltZ lhs rhs+ Gt -> Lit $ gtZ lhs rhs+ Eql -> eqZ lhs rhs+ NEq -> notB $ rel Eql lhs rhs++(.|.) :: Integer -> ExprZ -> QFFormula+n .|. e = Lit $ Divisible True n e++subst1 :: Var -> ExprZ -> QFFormula -> QFFormula+subst1 x e = go+ where+ go T = T+ go F = F+ go (And a b) = And (go a) (go b)+ go (Or a b) = Or (go a) (go b)+ go (Lit (Divisible b c e1)) = Lit $ Divisible b c $ LA.applySubst1 x e e1+ go (Lit (Pos e1)) = Lit $ Pos $ LA.applySubst1 x e e1++simplify :: QFFormula -> QFFormula+simplify (And a b) = simplify1 $ And (simplify a) (simplify b)+simplify (Or a b) = simplify1 $ Or (simplify a) (simplify b)+simplify formula = simplify1 formula++simplify1 :: QFFormula -> QFFormula+simplify1 T = T+simplify1 F = F+simplify1 (And a b) =+ case (a, b) of+ (T, b') -> b'+ (a', T) -> a'+ (F, _) -> false+ (_, F) -> false+ (a',b') -> a' .&&. b'+simplify1 (Or a b) =+ case (a, b) of+ (F, b') -> b'+ (a', F) -> a'+ (T, _) -> true+ (_, T) -> true+ (a',b') -> a' .||. b'+simplify1 (Lit lit) = simplifyLit lit++simplifyLit :: Lit -> QFFormula+simplifyLit (Pos e) =+ case LA.asConst e of+ Just c -> if c > 0 then true else false+ Nothing ->+ -- e > 0 <=> e - 1 >= 0+ -- <=> LA.mapCoeff (`div` d) (e - 1) >= 0+ -- <=> LA.mapCoeff (`div` d) (e - 1) + 1 > 0+ Lit $ Pos $ LA.mapCoeff (`div` d) e1 ^+^ LA.constant 1+ where+ e1 = e ^-^ LA.constant 1+ d = if null cs then 1 else abs $ foldl1' gcd cs+ cs = [c | (c,x) <- LA.terms e1, x /= LA.unitVar]+simplifyLit lit@(Divisible b c e)+ | LA.coeff LA.unitVar e `mod` d /= 0 = if b then false else true+ | c' == 1 = if b then true else false+ | d == 1 = Lit lit+ | otherwise = Lit $ Divisible b c' e'+ where+ d = abs $ foldl' gcd c [c2 | (c2,x) <- LA.terms e, x /= LA.unitVar]+ c' = c `div` d+ e' = LA.mapCoeff (`div` d) e++evalQFFormula :: Model Integer -> QFFormula -> Bool+evalQFFormula m = f+ where+ f T = True+ f F = False+ f (And x1 x2) = f x1 && f x2+ f (Or x1 x2) = f x1 || f x2+ f (Lit lit) = evalLit m lit++evalLit :: Model Integer -> Lit -> Bool+evalLit m (Pos e) = LA.evalExpr m e > 0+evalLit m (Divisible True n e) = LA.evalExpr m e `mod` n == 0+evalLit m (Divisible False n e) = LA.evalExpr m e `mod` n /= 0++-- ---------------------------------------------------------------------------++data Witness = WCase1 Integer ExprZ | WCase2 Integer Integer Integer [ExprZ]++evalWitness :: Model Integer -> Witness -> Integer+evalWitness model (WCase1 c e) = LA.evalExpr model e `div` c+evalWitness model (WCase2 c j delta us)+ | null us' = j `div` c+ | otherwise = (j + (((u - delta - 1) `div` delta) * delta)) `div` c+ where+ us' = map (LA.evalExpr model) us+ u = minimum us'++-- ---------------------------------------------------------------------------++project :: Var -> QFFormula -> (QFFormula, Model Integer -> Model Integer)+project x formula = (formula', mt)+ where+ xs = projectCases x formula+ formula' = simplify $ orB [phi | (phi,_) <- xs, phi /= F]+ mt m = head $ do+ (phi, mt') <- xs+ guard $ evalQFFormula m phi+ return $ mt' m++projectN :: VarSet -> QFFormula -> (QFFormula, Model Integer -> Model Integer)+projectN vs2 = f (IS.toList vs2)+ where+ f :: [Var] -> QFFormula -> (QFFormula, Model Integer -> Model Integer)+ f [] formula = (formula, id)+ f (v:vs) formula = (formula3, mt1 . mt2)+ where+ (formula2, mt1) = project v formula+ (formula3, mt2) = f vs formula2++projectCases :: Var -> QFFormula -> [(QFFormula, Model Integer -> Model Integer)]+projectCases x formula = do+ (phi, wit) <- projectCases' x formula+ return (phi, \m -> IM.insert x (evalWitness m wit) m)++projectCases' :: Var -> QFFormula -> [(QFFormula, Witness)]+projectCases' x formula = [(simplify phi, w) | (phi,w) <- case1 ++ case2]+ where+ -- xの係数の最小公倍数+ c :: Integer+ c = f formula+ where+ f :: QFFormula -> Integer+ f T = 1+ f F = 1+ f (And a b) = lcm (f a) (f b)+ f (Or a b) = lcm (f a) (f b)+ f (Lit (Pos e)) = fromMaybe 1 (LA.lookupCoeff x e)+ f (Lit (Divisible _ _ e)) = fromMaybe 1 (LA.lookupCoeff x e)+ + -- 式をスケールしてxの係数の絶対値をcへと変換し、その後cxをxで置き換え、+ -- xがcで割り切れるという制約を追加した論理式+ formula1 :: QFFormula+ formula1 = simplify $ f formula .&&. Lit (Divisible True c (LA.var x))+ where+ f :: QFFormula -> QFFormula+ f T = T+ f F = F+ f (And a b) = f a .&&. f b+ f (Or a b) = f a .||. f b+ f lit@(Lit (Pos e)) =+ case LA.lookupCoeff x e of+ Nothing -> lit+ Just a ->+ let s = abs (c `div` a)+ in Lit $ Pos $ g s e+ f lit@(Lit (Divisible b d e)) =+ case LA.lookupCoeff x e of+ Nothing -> lit+ Just a ->+ let s = abs (c `div` a)+ in Lit $ Divisible b (s*d) $ g s e++ g :: Integer -> ExprZ -> ExprZ+ g s = LA.mapCoeffWithVar (\c' x' -> if x==x' then signum c' else s*c')++ -- d|x+t という形の論理式の d の最小公倍数+ delta :: Integer+ delta = f formula1+ where+ f :: QFFormula -> Integer+ f T = 1+ f F = 1+ f (And a b) = lcm (f a) (f b)+ f (Or a b) = lcm (f a) (f b)+ f (Lit (Divisible _ d _)) = d+ f (Lit (Pos _)) = 1++ -- ts = {t | t < x は formula1 に現れる原子論理式}+ ts :: [ExprZ]+ ts = f formula1+ where+ f :: QFFormula -> [ExprZ]+ f T = []+ f F = []+ f (And a b) = f a ++ f b+ f (Or a b) = f a ++ f b+ f (Lit (Divisible _ _ _)) = []+ f (Lit (Pos e)) =+ case LA.extractMaybe x e of+ Nothing -> []+ Just (1, e') -> [negateV e'] -- Pos e <=> (x + e' > 0) <=> (-e' < x)+ Just (-1, _) -> [] -- Pos e <=> (-x + e' > 0) <=> (x < e')+ _ -> error "should not happen"++ -- formula1を真にする最小のxが存在する場合+ case1 :: [(QFFormula, Witness)]+ case1 = [ (subst1 x e formula1, WCase1 c e)+ | j <- [1..delta], t <- ts, let e = t ^+^ LA.constant j ]++ -- formula1のなかの x < t を真に t < x を偽に置き換えた論理式+ formula2 :: QFFormula+ formula2 = simplify $ f formula1+ where + f :: QFFormula -> QFFormula+ f T = T+ f F = F+ f (And a b) = f a .&&. f b+ f (Or a b) = f a .||. f b+ f lit@(Lit (Pos e)) =+ case LA.lookupCoeff x e of+ Nothing -> lit+ Just 1 -> F -- Pos e <=> ( x + e' > 0) <=> -e' < x+ Just (-1) -> T -- Pos e <=> (-x + e' > 0) <=> x < e'+ _ -> error "should not happen"+ f lit@(Lit (Divisible _ _ _)) = lit++ -- us = {u | x < u は formula1 に現れる原子論理式}+ us :: [ExprZ]+ us = f formula1+ where+ f :: QFFormula -> [ExprZ]+ f T = []+ f F = []+ f (And a b) = f a ++ f b+ f (Or a b) = f a ++ f b+ f (Lit (Pos e)) =+ case LA.extractMaybe x e of+ Nothing -> []+ Just (1, _) -> [] -- Pos e <=> ( x + e' > 0) <=> -e' < x+ Just (-1, e') -> [e'] -- Pos e <=> (-x + e' > 0) <=> x < e'+ _ -> error "should not happen"+ f (Lit (Divisible _ _ _)) = []++ -- formula1を真にする最小のxが存在しない場合+ case2 :: [(QFFormula, Witness)]+ case2 = [(subst1 x (LA.constant j) formula2, WCase2 c j delta us) | j <- [1..delta]]++projectCasesN :: VarSet -> QFFormula -> [(QFFormula, Model Integer -> Model Integer)]+projectCasesN vs2 = f (IS.toList vs2)+ where+ f :: [Var] -> QFFormula -> [(QFFormula, Model Integer -> Model Integer)]+ f [] formula = return (formula, id)+ f (v:vs) formula = do+ (formula2, mt1) <- projectCases v formula+ (formula3, mt2) <- f vs formula2+ return (formula3, mt1 . mt2)++-- ---------------------------------------------------------------------------++solveQFFormula :: VarSet -> QFFormula -> Maybe (Model Integer)+solveQFFormula vs formula = listToMaybe $ do+ (formula2, mt) <- projectCasesN vs formula+ case formula2 of+ T -> return $ mt IM.empty+ _ -> mzero++-- | solve a (open) quantifier-free formula+solve :: VarSet -> [LA.Atom Rational] -> Maybe (Model Integer)+solve vs cs = solveQFFormula vs $ andB $ map fromLAAtom cs++-- | solve a (open) quantifier-free formula+solveQFLA :: VarSet -> [LA.Atom Rational] -> VarSet -> Maybe (Model Rational)+solveQFLA vs cs ivs = listToMaybe $ do+ (cs2, mt) <- FM.projectN rvs cs+ m <- maybeToList $ solve ivs cs2+ return $ mt $ IM.map fromInteger m+ where+ rvs = vs `IS.difference` ivs++-- ---------------------------------------------------------------------------++testHagiya :: QFFormula+testHagiya = fst $ project 1 $ andB [c1, c2, c3]+ where+ [x,y,z] = map LA.var [1..3]+ c1 = x .<. (y ^+^ y)+ c2 = z .<. x+ c3 = 3 .|. x++{-+∃ x. 0 < y+y ∧ z<x ∧ 3|x+⇔+(2y-z > 0 ∧ 3|z+1) ∨ (2y-z > -2 ∧ 3|z+2) ∨ (2y-z > -3 ∧ 3|z+3)+-}++test3 :: QFFormula+test3 = fst $ project 1 $ andB [p1,p2,p3,p4]+ where+ x = LA.var 0+ y = LA.var 1+ p1 = LA.constant 0 .<. y+ p2 = 2 *^ x .<. y+ p3 = y .<. x ^+^ LA.constant 2+ p4 = 2 .|. y++{-+∃ y. 0 < y ∧ 2x<y ∧ y < x+2 ∧ 2|y+⇔+(2x < 2 ∧ 0 < x) ∨ (0 < 2x+2 ∧ x < 0)+-}++-- ---------------------------------------------------------------------------
+ src/ToySolver/Cooper/FOL.hs view
@@ -0,0 +1,52 @@+{-# OPTIONS_GHC -Wall #-}+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.Cooper.FOL+-- Copyright : (c) Masahiro Sakai 2011-2013+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : provisional+-- Portability : portable+-- +-----------------------------------------------------------------------------+module ToySolver.Cooper.FOL+ ( eliminateQuantifiers+ , solveFormula+ ) where++import Control.Monad++import ToySolver.Data.ArithRel+import ToySolver.Data.Boolean+import qualified ToySolver.Data.FOL.Arith as FOL+import qualified ToySolver.Data.LA.FOL as LAFOL+import ToySolver.Data.Var+import ToySolver.Cooper.Core++-- | eliminate quantifiers and returns equivalent quantifier-free formula.+eliminateQuantifiers :: FOL.Formula (FOL.Atom Rational) -> Maybe QFFormula+eliminateQuantifiers = f+ where+ f FOL.T = return T+ f FOL.F = return F+ f (FOL.Atom (Rel a op b)) = do+ a' <- LAFOL.fromFOLExpr a+ b' <- LAFOL.fromFOLExpr b+ return $ fromLAAtom (Rel a' op b')+ f (FOL.And a b) = liftM2 (.&&.) (f a) (f b)+ f (FOL.Or a b) = liftM2 (.||.) (f a) (f b)+ f (FOL.Not a) = f (FOL.pushNot a)+ f (FOL.Imply a b) = f $ FOL.Or (FOL.Not a) b+ f (FOL.Equiv a b) = f $ FOL.And (FOL.Imply a b) (FOL.Imply b a)+ f (FOL.Forall x body) = liftM notB $ f $ FOL.Exists x $ FOL.Not body+ f (FOL.Exists x body) = liftM (fst . project x) (f body)++solveFormula :: VarSet -> FOL.Formula (FOL.Atom Rational) -> FOL.SatResult Integer+solveFormula vs formula =+ case eliminateQuantifiers formula of+ Nothing -> FOL.Unknown+ Just formula' ->+ case solveQFFormula vs formula' of+ Nothing -> FOL.Unsat+ Just m -> FOL.Sat m
+ src/ToySolver/Data/AlgebraicNumber/Complex.hs view
@@ -0,0 +1,167 @@+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.Data.AlgebraicNumber.Complex+-- Copyright : (c) Masahiro Sakai 2013+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : provisional+-- Portability : portable+--+-- Algebraic Numbers+-- +-----------------------------------------------------------------------------+module ToySolver.Data.AlgebraicNumber.Complex+ (+ -- * Rectangular form+ AComplex((:+))++ -- * Properties+ , realPart -- :: AComplex -> AReal+ , imagPart -- :: AComplex -> AReal+ , magnitude -- :: AComplex -> AReal+ , minimalPolynomial -- :: AComplex -> UPolynomial Rational++ -- * Operations+ , conjugate -- :: AComplex -> AComplex+ ) where++import Control.Monad+import qualified Data.Sign as Sign+import qualified Data.Map as Map+import Data.Maybe++import qualified ToySolver.CAD as CAD+import qualified ToySolver.Data.AlgebraicNumber.Real as AReal+import ToySolver.Data.AlgebraicNumber.Real (AReal)+import qualified ToySolver.Data.AlgebraicNumber.Root as Root+import qualified ToySolver.Data.Polynomial as P+import ToySolver.Data.Polynomial (Polynomial, UPolynomial, X (..))++infix 6 :+++-- -----------------------------------------------------------------------------+-- The Complex type++-- | Complex numbers are an algebraic type.+--+-- For a complex number @z@, @'abs' z@ is a number with the magnitude of @z@,+-- but oriented in the positive real direction, whereas @'signum' z@+-- has the phase of @z@, but unit magnitude.+data AComplex = !AReal :+ !AReal+ deriving (Eq, Show)++-- -----------------------------------------------------------------------------+-- Functions over Complex++-- | Extracts the real part of a complex number.+realPart :: AComplex -> AReal+realPart (x :+ _) = x++-- | Extracts the imaginary part of a complex number.+imagPart :: AComplex -> AReal+imagPart (_ :+ y) = y++-- | The conjugate of a complex number.+conjugate :: AComplex -> AComplex+conjugate (x :+ y) = x :+ (-y)++-- | The nonnegative magnitude of a complex number.+magnitude :: AComplex -> AReal+magnitude (x :+ y) = AReal.nthRoot 2 (x*x + y*y)++-- -----------------------------------------------------------------------------+-- Instances of Complex++instance Num AComplex where+ (x:+y) + (x':+y') = (x+x') :+ (y+y')+ (x:+y) - (x':+y') = (x-x') :+ (y-y')+ (x:+y) * (x':+y') = (x*x'-y*y') :+ (x*y'+y*x')+ negate (x:+y) = negate x :+ negate y+ abs z = magnitude z :+ 0+ signum (0:+0) = 0+ signum z@(x:+y) = x/r :+ y/r where r = magnitude z+ fromInteger n = fromInteger n :+ 0++instance Fractional AComplex where+ (x:+y) / (x':+y') = (x*x'+y*y') / d :+ (y*x'-x*y') / d+ where d = x'*x' + y'*y'+ fromRational a = fromRational a :+ 0++-- -----------------------------------------------------------------------------++-- | The polynomial of which the algebraic number is root.+minimalPolynomial :: AComplex -> UPolynomial Rational+minimalPolynomial z@(x :+ y) =+ head [q | (q,_) <- P.factor p, P.deg q > 0, P.eval (\X -> z) (P.mapCoeff fromRational q) == 0]+ where+ p = Root.findPoly (P.var a + P.var b * P.var i) ps+ where+ a, b, i :: Int+ i = 0+ a = 1+ b = 2+ ps =+ [ (P.var i) ^ 2 + 1+ , P.subst (AReal.minimalPolynomial x) (\X -> P.var a)+ , P.subst (AReal.minimalPolynomial y) (\X -> P.var b)+ ]++-- -----------------------------------------------------------------------------++-- | Roots of the polynomial+roots :: UPolynomial Rational -> [AComplex]+roots f = do+ let cs1 = [ (u, [Sign.Zero]), (v, [Sign.Zero]) ] + (cs2, cells2) <- CAD.project [(P.toUPolynomialOf p 0, ss) | (p,ss) <- cs1]+ let tmp2 = CAD.project [(P.toUPolynomialOf p 1, ss) | (p,ss) <- cs2]+ (cs3, cells3) <- tmp2+ guard $ and [Sign.signOf v `elem` ss | (p,ss) <- cs3, let v = P.eval (\_ -> undefined) p]++ let m3 = Map.empty+ yval <- catMaybes [CAD.findSample m3 cell | cell <- cells3]+ let m2 = Map.insert 1 yval m3+ xval <- catMaybes [CAD.findSample m2 cell | cell <- cells2]++ return $ xval :+ yval++ where++ -- f(x + yi) = u(x,y) + v(x,y)i+ f1 :: P.Polynomial Rational Int+ f1 = P.subst f (\X -> P.var 0 + P.var 1 * P.var 2)+ f2 = P.toUPolynomialOf (P.reduce P.grevlex f1 [P.var 2 * P.var 2 + 1]) 2 + u = P.coeff P.mone f2+ v = P.coeff (P.var X) f2++-- -----------------------------------------------------------------------------++test1 = minimalPolynomial (sqrt2 :+ sqrt3)+ where+ sqrt2 = AReal.nthRoot 2 2+ sqrt3 = AReal.nthRoot 2 3++test2 = magnitude (sqrt2 :+ sqrt3)+ where+ sqrt2 = AReal.nthRoot 2 2+ sqrt3 = AReal.nthRoot 2 3++test3 = roots p+ where+ x = P.var X+ p = x - 2++test4 = roots p+ where+ x = P.var X+ p = x^2 - 2++test5 = roots p+ where+ x = P.var X+ p = x^3 - 1++test6 = roots p+ where+ x = P.var X+ p = x^4 + 2*x^2 + 25
+ src/ToySolver/Data/AlgebraicNumber/Graeffe.hs view
@@ -0,0 +1,76 @@+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.Data.AlgebraicNumber.Graeffe+-- Copyright : (c) Masahiro Sakai 2012+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : provisional+-- Portability : portable+-- +-- Graeffe's Method+--+-- Reference:+-- +-- * <http://mathworld.wolfram.com/GraeffesMethod.html>+-- +-- * <http://en.wikipedia.org/wiki/Graeffe's_method>+-- +-----------------------------------------------------------------------------++module ToySolver.Data.AlgebraicNumber.Graeffe+ ( NthRoot (..)+ , graeffesMethod+ ) where++import Control.Exception+import qualified Data.IntMap as IM+import ToySolver.Data.Polynomial (UPolynomial, X (..))+import qualified ToySolver.Data.Polynomial as P++data NthRoot = NthRoot !Integer !Rational+ deriving (Show)++graeffesMethod :: UPolynomial Rational -> Int -> [NthRoot]+graeffesMethod p v = xs !! (v - 1)+ where+ xs = map (uncurry g) $ zip [1..] (tail $ iterate f $ P.toMonic P.nat p)++ n = P.deg p++ g :: Int -> UPolynomial Rational -> [NthRoot]+ g v p = do+ i <- [1::Int .. fromInteger n]+ let yi = if i == 1 then - (b i) else - (b i / b (i-1))+ return $ NthRoot (2 ^ fromIntegral v) yi+ where+ bs = IM.fromList [(fromInteger i, b) | (b,ys) <- P.terms p, let i = n - P.deg ys, i /= 0]+ b i = IM.findWithDefault 0 i bs++f :: UPolynomial Rational -> UPolynomial Rational+f p = (-1) ^ (P.deg p) *+ P.fromTerms [ (c, assert (P.deg xs `mod` 2 == 0) (P.var X `P.mpow` (P.deg xs `div` 2)))+ | (c, xs) <- P.terms (p * P.subst p (\X -> - P.var X)) ]++f' :: UPolynomial Rational -> UPolynomial Rational+f' p = P.fromTerms [(b k, P.var X `P.mpow` (n - k)) | k <- [0..n]]+ where+ n = P.deg p++ a :: Integer -> Rational+ a k+ | n >= k = P.coeff (P.var X `P.mpow` (n - k)) p+ | otherwise = 0++ b :: Integer -> Rational+ b k = (-1)^k * (a k)^2 + 2 * sum [(-1)^j * (a j) * (a (2*k-j)) | j <- [0..k-1]]++test v = graeffesMethod p v+ where+ x = P.var X+ p = x^2 - 2++test2 v = graeffesMethod p v+ where+ x = P.var X+ p = x^5 - 3*x - 1
+ src/ToySolver/Data/AlgebraicNumber/Real.hs view
@@ -0,0 +1,447 @@+{-# LANGUAGE Rank2Types #-}+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.Data.AlgebraicNumber.Real+-- Copyright : (c) Masahiro Sakai 2012-2013+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : provisional+-- Portability : non-portable (Rank2Types)+--+-- Algebraic reals+--+-- Reference:+--+-- * Why the concept of a field extension is a natural one+-- <http://www.dpmms.cam.ac.uk/~wtg10/galois.html>+-- +-----------------------------------------------------------------------------+module ToySolver.Data.AlgebraicNumber.Real+ (+ -- * Algebraic real type+ AReal++ -- * Construction+ , realRoots+ , realRootsEx++ -- * Properties+ , minimalPolynomial+ , isolatingInterval+ , isRational+ , isAlgebraicInteger+ , height+ , rootIndex++ -- * Operations+ , nthRoot+ , refineIsolatingInterval++ -- * Approximation+ , approx+ , approxInterval++ -- * Misc+ , simpARealPoly+ , goldenRatio+ ) where++import Control.Exception (assert)+import Control.Monad+import Data.List+import Data.Ratio+import qualified Data.Set as Set+import qualified Text.PrettyPrint.HughesPJClass as PP+import Text.PrettyPrint.HughesPJClass (Doc, PrettyLevel, Pretty (..), prettyParen)++import Data.Interval (Interval, EndPoint (..), (<=..<), (<..<=), (<..<), (<!), (>!))+import qualified Data.Interval as Interval++import ToySolver.Data.Polynomial (Polynomial, UPolynomial, X (..))+import qualified ToySolver.Data.Polynomial as P+import ToySolver.Data.AlgebraicNumber.Root+import qualified ToySolver.Data.AlgebraicNumber.Sturm as Sturm++{--------------------------------------------------------------------+ Construction+--------------------------------------------------------------------}++-- | Algebraic real numbers.+data AReal = RealRoot (UPolynomial Rational) (Interval Rational)+ deriving Show++-- | Real roots of the polynomial in ascending order.+realRoots :: UPolynomial Rational -> [AReal]+realRoots p = Set.toAscList $ Set.fromList $ do+ (q,_) <- P.factor p+ realRoots' q++-- | Real roots of the polynomial in ascending order.+realRootsEx :: UPolynomial AReal -> [AReal]+realRootsEx p+ | and [isRational c | (c,_) <- P.terms p] = realRoots $ P.mapCoeff toRational p+ | otherwise = [a | a <- realRoots (simpARealPoly p), a `P.isRootOf` p]++-- p must already be factored.+realRoots' :: UPolynomial Rational -> [AReal]+realRoots' p = do+ guard $ P.deg p > 0+ i <- Sturm.separate p+ return $ realRoot' p i++realRoot :: UPolynomial Rational -> Interval Rational -> AReal+realRoot p i = + case [q | (q,_) <- P.factor p, P.deg q > 0, Sturm.numRoots q i == 1] of+ p2:_ -> realRoot' p2 i+ [] -> error "ToySolver.Data.AlgebraicNumber.Real.realRoot: invalid interval"++-- p must already be factored.+realRoot' :: UPolynomial Rational -> Interval Rational -> AReal+realRoot' p i = RealRoot (normalizePoly p) i++{--------------------------------------------------------------------+ Operations+--------------------------------------------------------------------}++isZero :: AReal -> Bool+isZero a = 0 `Interval.member` isolatingInterval a && 0 `P.isRootOf` minimalPolynomial a++scaleAReal :: Rational -> AReal -> AReal+scaleAReal r a = realRoot' p2 i2+ where+ p2 = rootScale r (minimalPolynomial a)+ i2 = Interval.singleton r * isolatingInterval a++shiftAReal :: Rational -> AReal -> AReal+shiftAReal r a = realRoot' p2 i2+ where+ p2 = rootShift r (minimalPolynomial a)+ i2 = Interval.singleton r + isolatingInterval a++instance Eq AReal where+ a == b = p1==p2 && Sturm.numRoots' c (Interval.intersection i1 i2) == 1+ where+ p1 = minimalPolynomial a+ p2 = minimalPolynomial b+ i1 = isolatingInterval a+ i2 = isolatingInterval b+ c = sturmChain a++instance Ord AReal where+ compare a b+ | i1 >! i2 = GT+ | i1 <! i2 = LT+ | a == b = EQ+ | otherwise = go i1 i2+ where+ i1 = isolatingInterval a+ i2 = isolatingInterval b+ c1 = sturmChain a+ c2 = sturmChain b+ go i1 i2+ | i1 >! i2 = GT+ | i1 <! i2 = LT+ | otherwise =+ if Interval.width i1 > Interval.width i2+ then go (Sturm.halve' c1 i1) i2+ else go i1 (Sturm.halve' c2 i2)++instance Num AReal where+ a + b+ | isRational a = shiftAReal (toRational a) b+ | isRational b = shiftAReal (toRational b) a+ | otherwise = realRoot p3 i3+ where+ p3 = rootAdd (minimalPolynomial a) (minimalPolynomial b)+ c1 = sturmChain a+ c2 = sturmChain b+ c3 = Sturm.sturmChain p3+ i3 = go (isolatingInterval a) (isolatingInterval b) (Sturm.separate' c3)++ go i1 i2 is3 =+ case [i5 | i3 <- is3, let i5 = Interval.intersection i3 i4, Sturm.numRoots' c3 i5 > 0] of+ [] -> error "AReal.+: should not happen"+ [i5] -> i5+ is5 -> go (Sturm.halve' c1 i1) (Sturm.halve' c2 i2) [Sturm.halve' c3 i5 | i5 <- is5]+ where+ i4 = i1 + i2++ a * b+ | isRational a = scaleAReal (toRational a) b+ | isRational b = scaleAReal (toRational b) a+ | otherwise = realRoot p3 i3+ where+ p3 = rootMul (minimalPolynomial a) (minimalPolynomial b)+ c1 = sturmChain a+ c2 = sturmChain b+ c3 = Sturm.sturmChain p3+ i3 = go (isolatingInterval a) (isolatingInterval b) (Sturm.separate' c3)++ go i1 i2 is3 =+ case [i5 | i3 <- is3, let i5 = Interval.intersection i3 i4, Sturm.numRoots' c3 i5 > 0] of+ [] -> error "AReal.*: should not happen"+ [i5] -> i5+ is5 -> go (Sturm.halve' c1 i1) (Sturm.halve' c2 i2) [Sturm.halve' c3 i5 | i5 <- is5]+ where+ i4 = i1 * i2++ negate a = scaleAReal (-1) a++ abs a =+ case compare 0 a of+ EQ -> fromInteger 0+ LT -> a+ GT -> negate a++ signum a = fromInteger $+ case compare 0 a of+ EQ -> 0+ LT -> 1+ GT -> -1++ fromInteger = fromRational . toRational++instance Fractional AReal where+ fromRational r = realRoot' (x - P.constant r) (Interval.singleton r)+ where+ x = P.var X++ recip a+ | isZero a = error "AReal.recip: zero division"+ | otherwise = realRoot' p2 i2+ where+ p2 = rootRecip (minimalPolynomial a)+ c1 = sturmChain a+ c2 = Sturm.sturmChain p2+ i2 = go (isolatingInterval a) (Sturm.separate' c2)+ go i1 is2 =+ case [i2 | i2 <- is2, Interval.member 1 (i1 * i2)] of+ [] -> error "AReal.recip: should not happen"+ [i2] -> i2+ is2' -> go (Sturm.halve' c1 i1) [Sturm.halve' c2 i2 | i2 <- is2']++instance Real AReal where+ toRational x+ | isRational x =+ let p = minimalPolynomial x+ a = P.coeff (P.var X) p+ b = P.coeff P.mone p+ in - b / a+ | otherwise = error "AReal.toRational: proper algebraic number"++instance RealFrac AReal where+ properFraction = properFraction'+ truncate = truncate'+ round = round'+ ceiling = ceiling'+ floor = floor'++-- | Returns approximate rational value such that @abs (a - approx a epsilon) <= epsilon@.+approx+ :: AReal -- ^ a+ -> Rational -- ^ epsilon+ -> Rational+approx a epsilon =+ if isRational a+ then toRational a+ else Sturm.approx' (sturmChain a) (isolatingInterval a) epsilon++-- | Returns approximate interval such that @width (approxInterval a epsilon) <= epsilon@.+approxInterval+ :: AReal -- ^ a+ -> Rational -- ^ epsilon+ -> Interval Rational+approxInterval a epsilon =+ if isRational a+ then Interval.singleton (toRational a)+ else Sturm.narrow' (sturmChain a) (isolatingInterval a) epsilon++-- | Same as 'properFraction'.+properFraction' :: Integral b => AReal -> (b, AReal)+properFraction' x =+ case compare x 0 of+ EQ -> (0, 0)+ GT -> (fromInteger floor_x, x - fromInteger floor_x)+ LT -> (fromInteger ceiling_x, x - fromInteger ceiling_x)+ where+ floor_x = floor' x+ ceiling_x = ceiling' x++-- | Same as 'truncate'.+truncate' :: Integral b => AReal -> b+truncate' = fst . properFraction'++-- | Same as 'round'.+round' :: Integral b => AReal -> b+round' x = + case signum (abs r - 0.5) of+ -1 -> n+ 0 -> if even n then n else m+ 1 -> m+ _ -> error "round default defn: Bad value"+ where+ (n,r) = properFraction' x+ m = if r < 0 then n - 1 else n + 1++-- | Same as 'ceiling'.+ceiling' :: Integral b => AReal -> b+ceiling' a =+ if Sturm.numRoots' chain (Interval.intersection i2 i3) >= 1+ then fromInteger ceiling_lb+ else fromInteger ceiling_ub+ where+ chain = sturmChain a+ i2 = Sturm.narrow' chain (isolatingInterval a) (1/2)+ (Finite lb, inLB) = Interval.lowerBound' i2+ (Finite ub, inUB) = Interval.upperBound' i2+ ceiling_lb = ceiling lb+ ceiling_ub = ceiling ub+ i3 = NegInf <..<= Finite (fromInteger ceiling_lb)++-- | Same as 'floor'.+floor' :: Integral b => AReal -> b+floor' a =+ if Sturm.numRoots' chain (Interval.intersection i2 i3) >= 1+ then fromInteger floor_ub+ else fromInteger floor_lb+ where+ chain = sturmChain a+ i2 = Sturm.narrow' chain (isolatingInterval a) (1/2)+ (Finite lb, inLB) = Interval.lowerBound' i2+ (Finite ub, inUB) = Interval.upperBound' i2+ floor_lb = floor lb+ floor_ub = floor ub+ i3 = Finite (fromInteger floor_ub) <=..< PosInf++-- | The @n@th root of @a@+nthRoot :: Integer -> AReal -> AReal+nthRoot n a+ | n <= 0 = error "ToySolver.Data.AlgebraicNumver.Root.nthRoot"+ | even n =+ if a < 0+ then error "ToySolver.Data.AlgebraicNumver.Root.nthRoot: no real roots"+ else assert (length bs == 2) (maximum bs) -- select positive root+ | otherwise =+ assert (length bs == 1) (head bs) -- select unique root+ where+ bs = nthRoots n a++nthRoots :: Integer -> AReal -> [AReal]+nthRoots n _ | n <= 0 = []+nthRoots n a | even n && a < 0 = []+nthRoots n a = filter check (realRoots p2)+ where+ p1 = minimalPolynomial a+ p2 = rootNthRoot n p1+ c1 = sturmChain a+ ok0 = isolatingInterval a+ ng0 = map isolatingInterval $ delete a $ realRoots p1++ check :: AReal -> Bool+ check b = loop ok0 ng0 (isolatingInterval b)+ where+ c2 = sturmChain b+ loop ok ng i+ | Sturm.numRoots' c1 ok' == 0 = False+ | null ng' = True+ | otherwise =+ loop (Sturm.halve' c1 ok')+ (map (\i3 -> Sturm.halve' c1 i3) ng')+ (Sturm.halve' c2 i)+ where+ i2 = i ^ n+ ok' = Interval.intersection i2 ok+ ng' = filter (\i3 -> Sturm.numRoots' c1 i3 /= 0) $+ map (Interval.intersection i2) ng++-- | Same algebraic real, but represented using finer grained 'isolatingInterval'.+refineIsolatingInterval :: AReal -> AReal+refineIsolatingInterval a@(RealRoot p i) =+ if Interval.width i <= 0+ then a+ else RealRoot p (Sturm.halve p i)++{--------------------------------------------------------------------+ Properties+--------------------------------------------------------------------}++-- | The polynomial of which the algebraic number is root.+minimalPolynomial :: AReal -> UPolynomial Rational+minimalPolynomial (RealRoot p _) = p++sturmChain :: AReal -> Sturm.SturmChain+sturmChain a = Sturm.sturmChain (minimalPolynomial a)++-- | Isolating interval that separate the number from other roots of 'minimalPolynomial' of it.+isolatingInterval :: AReal -> Interval Rational+isolatingInterval (RealRoot _ i) = i++-- | Degree of the algebraic number.+-- +-- If the algebraic number's 'minimalPolynomial' has degree @n@,+-- then the algebraic number is said to be degree @n@.+instance P.Degree AReal where+ deg a = P.deg $ minimalPolynomial a++-- | Whether the algebraic number is a rational.+isRational :: AReal -> Bool+isRational x = P.deg x == 1++-- | Whether the algebraic number is a root of a polynomial with integer+-- coefficients with leading coefficient @1@ (a monic polynomial).+isAlgebraicInteger :: AReal -> Bool+isAlgebraicInteger x = abs (P.lc P.nat (P.pp (minimalPolynomial x))) == 1++-- | Height of the algebraic number.+--+-- The height of an algebraic number is the greatest absolute value of the+-- coefficients of the irreducible and primitive polynomial with integral+-- rational coefficients.+height :: AReal -> Integer+height x = maximum [abs (numerator c) | (c,_) <- P.terms $ P.pp $ minimalPolynomial x]++-- | root index, satisfying+--+-- @+-- 'realRoots' ('minimalPolynomial' a) !! rootIndex a == a+-- @+rootIndex :: AReal -> Int+rootIndex a = idx+ where+ as = realRoots' (minimalPolynomial a)+ Just idx = elemIndex a as++{--------------------------------------------------------------------+ Pretty printing+--------------------------------------------------------------------}++instance Pretty AReal where+ pPrintPrec lv prec r =+ prettyParen (prec > appPrec) $+ PP.hsep [PP.text "RealRoot", pPrintPrec lv (appPrec+1) p, PP.int (rootIndex r)]+ where+ p = minimalPolynomial r+ appPrec = 10++instance P.PrettyCoeff AReal where+ pPrintCoeff = pPrintPrec+ isNegativeCoeff = (0>)++{--------------------------------------------------------------------+ Manipulation of polynomials+--------------------------------------------------------------------}++-- 代数的数を係数とする多項式の根を、有理数係数多項式の根として表す+simpARealPoly :: UPolynomial AReal -> UPolynomial Rational+simpARealPoly p = rootSimpPoly minimalPolynomial p++{--------------------------------------------------------------------+ Misc+--------------------------------------------------------------------}++-- | Golden ratio +goldenRatio :: AReal+goldenRatio = (1 + root5) / 2+ where+ [_, root5] = sort $ realRoots' ((P.var X)^2 - 5)
+ src/ToySolver/Data/AlgebraicNumber/Root.hs view
@@ -0,0 +1,120 @@+{-# LANGUAGE Rank2Types #-}+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.Data.AlgebraicNumber.Root+-- Copyright : (c) Masahiro Sakai 2012+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : provisional+-- Portability : non-portable (Rank2Types)+--+-- Manipulating polynomials for corresponding operations for algebraic numbers.+-- +-- Reference:+--+-- * <http://www.dpmms.cam.ac.uk/~wtg10/galois.html>+-- +-----------------------------------------------------------------------------+module ToySolver.Data.AlgebraicNumber.Root where++import Data.List+import Data.Maybe+import Data.Map (Map)+import qualified Data.Map as Map+import qualified Data.Set as Set++import ToySolver.Data.Polynomial (Polynomial, UPolynomial, X (..))+import qualified ToySolver.Data.Polynomial as P+import qualified ToySolver.Data.Polynomial.GroebnerBasis as GB++type Var = Int++{--------------------------------------------------------------------+ Manipulation of polynomials+--------------------------------------------------------------------}++normalizePoly :: UPolynomial Rational -> UPolynomial Rational+normalizePoly = P.toMonic P.nat++rootAdd :: UPolynomial Rational -> UPolynomial Rational -> UPolynomial Rational+rootAdd p1 p2 = lift2 (+) p1 p2++rootMul :: UPolynomial Rational -> UPolynomial Rational -> UPolynomial Rational+rootMul p1 p2 = lift2 (*) p1 p2++rootShift :: Rational -> UPolynomial Rational -> UPolynomial Rational+rootShift 0 p = p+rootShift r p = normalizePoly $ P.subst p (\X -> P.var X - P.constant r)++rootScale :: Rational -> UPolynomial Rational -> UPolynomial Rational+rootScale 0 p = P.var X+rootScale r p = normalizePoly $ P.subst p (\X -> P.constant (recip r) * P.var X)++rootRecip :: UPolynomial Rational -> UPolynomial Rational+rootRecip p = normalizePoly $ P.fromTerms [(c, P.var X `P.mpow` (d - P.deg xs)) | (c, xs) <- P.terms p]+ where+ d = P.deg p++-- 代数的数を係数とする多項式の根を、有理数係数多項式の根として表す+rootSimpPoly :: (a -> UPolynomial Rational) -> UPolynomial a -> UPolynomial Rational+rootSimpPoly f p = findPoly (P.var 0) ps+ where+ ys :: [(UPolynomial Rational, Var)]+ ys = zip (Set.toAscList $ Set.fromList [f c | (c, _) <- P.terms p]) [1..]++ m :: Map (UPolynomial Rational) Var+ m = Map.fromDistinctAscList ys++ p' :: Polynomial Rational Var+ p' = P.eval (\X -> P.var 0) (P.mapCoeff (\c -> P.var (m Map.! (f c))) p)++ ps :: [Polynomial Rational Var]+ ps = p' : [P.subst q (\X -> P.var x) | (q, x) <- ys]++rootNthRoot :: Integer -> UPolynomial Rational -> UPolynomial Rational+rootNthRoot n p = P.subst p (\X -> (P.var X)^n)++lift2 :: (forall a. Num a => a -> a -> a)+ -> UPolynomial Rational -> UPolynomial Rational -> UPolynomial Rational+lift2 f p1 p2 = findPoly f_a_b gbase+ where+ a, b :: Var+ a = 0+ b = 1++ f_a_b :: Polynomial Rational Var+ f_a_b = f (P.var a) (P.var b)++ gbase :: [Polynomial Rational Var]+ gbase = [ P.subst p1 (\X -> P.var a), P.subst p2 (\X -> P.var b) ] ++-- ps のもとで c を根とする多項式を求める+findPoly :: Polynomial Rational Var -> [Polynomial Rational Var] -> UPolynomial Rational+findPoly c ps = normalizePoly $ sum [P.constant coeff * (P.var X) ^ n | (n,coeff) <- zip [0..] coeffs]+ where + vn :: Var+ vn = if Set.null vs then 0 else Set.findMax vs + 1+ where+ vs = Set.fromList [x | p <- (c:ps), (_,xs) <- P.terms p, (x,_) <- P.mindices xs]++ coeffs :: [Rational]+ coeffs = head $ catMaybes $ [isLinearlyDependent cs2 | cs2 <- inits cs]+ where+ cmp = P.grlex+ ps' = GB.basis cmp ps+ cs = iterate (\p -> P.reduce cmp (c * p) ps') 1++ isLinearlyDependent :: [Polynomial Rational Var] -> Maybe [Rational]+ isLinearlyDependent cs = if any (0/=) sol then Just sol else Nothing+ where+ cs2 = zip [vn..] cs+ sol = map (\(l,_) -> P.eval (\_ -> 1) $ P.reduce cmp2 (P.var l) gbase2) cs2+ cmp2 = P.grlex+ gbase2 = GB.basis cmp2 es+ es = Map.elems $ Map.fromListWith (+) $ do+ (n,xs) <- P.terms $ sum [P.var ln * cn | (ln,cn) <- cs2]+ let xs' = P.mindicesMap xs+ ys = P.mfromIndicesMap $ Map.filterWithKey (\x _ -> x < vn) xs'+ zs = P.mfromIndicesMap $ Map.filterWithKey (\x _ -> x >= vn) xs'+ return (ys, P.fromTerm (n,zs))
+ src/ToySolver/Data/AlgebraicNumber/Sturm.hs view
@@ -0,0 +1,168 @@+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.Data.AlgebraicNumber.Sturm+-- Copyright : (c) Masahiro Sakai 2012+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : provisional+-- Portability : portable+-- +-- Reference:+-- +-- * \"/Sturm's theorem/.\" Wikipedia, The Free Encyclopedia. Wikimedia Foundation, Inc.+-- 2012-06-23. <http://en.wikipedia.org/wiki/Sturm%27s_theorem>+-- +-- * Weisstein, Eric W. \"/Sturm Function/.\" From MathWorld--A Wolfram Web Resource.+-- <http://mathworld.wolfram.com/SturmFunction.html>+-- +-----------------------------------------------------------------------------++module ToySolver.Data.AlgebraicNumber.Sturm+ ( SturmChain+ , sturmChain+ , numRoots+ , numRoots'+ , separate+ , separate'+ , halve+ , halve'+ , narrow+ , narrow'+ , approx+ , approx'+ ) where++import Data.Maybe+import qualified Data.Interval as Interval+import Data.Interval (Interval, EndPoint (..), (<..<=), (<=..<=))++import ToySolver.Data.Polynomial (UPolynomial, X (..))+import qualified ToySolver.Data.Polynomial as P++-- | Sturm's chain (Sturm's sequence)+type SturmChain = [UPolynomial Rational]++-- | Sturm's sequence of a polynomial+sturmChain :: UPolynomial Rational -> SturmChain+sturmChain p = p0 : p1 : go p0 p1+ where+ p0 = p+ p1 = P.deriv p P.X+ go p q = if r==0 then [] else r : go q r+ where+ r = - (p `P.mod` q)++-- | The number of distinct real roots of @p@ in a given interval+numRoots+ :: UPolynomial Rational+ -> Interval Rational+ -> Int+numRoots p ival = numRoots' (sturmChain p) ival++-- | The number of distinct real roots of @p@ in a given interval.+-- This function takes @p@'s sturm chain instead of @p@ itself.+numRoots'+ :: SturmChain+ -> Interval Rational+ -> Int+numRoots' chain@(p:_) ival+ | Interval.null ival2 = 0+ | otherwise =+ case (Interval.lowerBound ival2, Interval.upperBound ival2) of+ (Finite lb, Finite ub) ->+ (if lb==ub then 0 else (n lb - n ub)) ++ (if lb `Interval.member` ival2 && lb `P.isRootOf` p then 1 else 0) ++ (if ub `Interval.notMember` ival2 && ub `P.isRootOf` p then -1 else 0)+ _ -> error "numRoots'': should not happen"+ where+ ival2 = boundInterval p ival+ n x = countSignChanges [P.eval (\X -> x) q | q <- chain]++countSignChanges :: [Rational] -> Int+countSignChanges rs = countChanges xs+ where+ xs :: [Bool]+ xs = map (0<) . filter (0/=) $ rs++countChanges :: Eq a => [a] -> Int+countChanges [] = 0+countChanges (x:xs) = go x xs 0+ where+ go x [] r = r+ go x1 (x2:xs) r+ | x1==x2 = go x1 xs r+ | otherwise = go x2 xs (r+1)++-- | Closed interval that contains all real roots of a given polynomial.+-- 根の限界+-- <http://aozoragakuen.sakura.ne.jp/taiwa/taiwaNch02/node26.html>+bounds :: UPolynomial Rational -> (Rational, Rational)+bounds p = (-m, m)+ where+ m = if p==0+ then 0+ else max 1 (sum [abs (c/s) | (c,_) <- P.terms p] - 1)+ s = P.lc P.nat p++boundInterval :: UPolynomial Rational -> Interval Rational -> Interval Rational+boundInterval p ival = Interval.intersection ival (Finite lb <=..<= Finite ub)+ where+ (lb,ub) = bounds p++-- | Disjoint intervals each of which contains exactly one real roots of the given polynoimal @p@.+-- The intervals can be further narrowed by 'narrow' or 'narrow''.+separate :: UPolynomial Rational -> [Interval Rational]+separate p = separate' (sturmChain p)++-- | Disjoint intervals each of which contains exactly one real roots of the given polynoimal @p@.+-- The intervals can be further narrowed by 'narrow' or 'narrow''.+-- This function takes @p@'s sturm chain instead of @p@ itself.+separate' :: SturmChain -> [Interval Rational]+separate' chain@(p:_) = f (bounds p)+ where+ n x = countSignChanges [P.eval (\X -> x) q | q <- chain]++ f (lb,ub) =+ if lb `P.isRootOf` p+ then Interval.singleton lb : g (lb,ub)+ else g (lb,ub)+ + g (lb,ub) =+ case n lb - n ub of+ 0 -> []+ 1 -> [Finite lb <..<= Finite ub]+ _ -> g (lb, mid) ++ g (mid, ub)+ where+ mid = (lb + ub) / 2++halve :: UPolynomial Rational -> Interval Rational -> Interval Rational+halve p ival = halve' (sturmChain p) ival++halve' :: SturmChain -> Interval Rational -> Interval Rational+halve' chain@(p:_) ival+ | Interval.width ival == 0 = ival+ | numRoots' chain ivalL > 0 = ivalL+ | otherwise = ivalR -- numRoots' chain ivalR > 0+ where+ Finite lb = Interval.lowerBound ival+ Finite ub = Interval.upperBound ival+ mid = (lb + ub) / 2+ ivalL = Interval.interval (Interval.lowerBound' ival) (Finite mid, True)+ ivalR = Interval.interval (Finite mid, False) (Interval.upperBound' ival)++narrow :: UPolynomial Rational -> Interval Rational -> Rational -> Interval Rational+narrow p ival size = narrow' (sturmChain p) ival size++narrow' :: SturmChain -> Interval Rational -> Rational -> Interval Rational+narrow' chain@(p:_) ival size = go (boundInterval p ival)+ where+ go ival+ | Interval.width ival < size = ival+ | otherwise = go (halve' chain ival)++approx :: UPolynomial Rational -> Interval Rational -> Rational -> Rational+approx p = approx' (sturmChain p)++approx' :: SturmChain -> Interval Rational -> Rational -> Rational+approx' chain ival epsilon = fromJust $ Interval.pickup $ narrow' chain ival epsilon
+ src/ToySolver/Data/ArithRel.hs view
@@ -0,0 +1,134 @@+{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses, FunctionalDependencies #-}+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.Data.ArithRel+-- Copyright : (c) Masahiro Sakai 2011+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : provisional+-- Portability : non-portable (FlexibleInstances, MultiParamTypeClasses, FunctionalDependencies)+--+-- Arithmetic relations+-- +-----------------------------------------------------------------------------+module ToySolver.Data.ArithRel+ (+ -- * Relational operators+ RelOp (..)+ , flipOp+ , negOp+ , showOp+ , evalOp++ -- * Relation+ , Rel (..)++ -- * DSL+ , IsRel (..)+ , (.<.), (.<=.), (.>=.), (.>.), (.==.), (./=.)+ ) where++import qualified Data.IntSet as IS++import ToySolver.Data.Boolean+import ToySolver.Data.Var++infix 4 .<., .<=., .>=., .>., .==., ./=.++-- ---------------------------------------------------------------------------++-- | relational operators+data RelOp = Lt | Le | Ge | Gt | Eql | NEq+ deriving (Show, Eq, Ord)+++-- | flipping relational operator+--+-- @rel (flipOp op) a b@ is equivalent to @rel op b a@+flipOp :: RelOp -> RelOp +flipOp Le = Ge+flipOp Ge = Le+flipOp Lt = Gt+flipOp Gt = Lt+flipOp Eql = Eql+flipOp NEq = NEq++-- | negating relational operator+--+-- @rel (negOp op) a b@ is equivalent to @notB (rel op a b)@+negOp :: RelOp -> RelOp+negOp Lt = Ge+negOp Le = Gt+negOp Ge = Lt+negOp Gt = Le+negOp Eql = NEq+negOp NEq = Eql++-- | operator symbol+showOp :: RelOp -> String+showOp Lt = "<"+showOp Le = "<="+showOp Ge = ">="+showOp Gt = ">"+showOp Eql = "="+showOp NEq = "/="++-- | evaluate an operator into a comparision function+evalOp :: Ord a => RelOp -> a -> a -> Bool+evalOp Lt = (<)+evalOp Le = (<=)+evalOp Ge = (>=)+evalOp Gt = (>)+evalOp Eql = (==)+evalOp NEq = (/=)++-- ---------------------------------------------------------------------------++-- | type class for constructing relational formula+class IsRel e r | r -> e where+ rel :: RelOp -> e -> e -> r++-- | constructing relational formula+(.<.) :: IsRel e r => e -> e -> r+a .<. b = rel Lt a b++-- | constructing relational formula+(.<=.) :: IsRel e r => e -> e -> r+a .<=. b = rel Le a b++-- | constructing relational formula+(.>.) :: IsRel e r => e -> e -> r+a .>. b = rel Gt a b++-- | constructing relational formula+(.>=.) :: IsRel e r => e -> e -> r+a .>=. b = rel Ge a b++-- | constructing relational formula+(.==.) :: IsRel e r => e -> e -> r+a .==. b = rel Eql a b++-- | constructing relational formula+(./=.) :: IsRel e r => e -> e -> r+a ./=. b = rel NEq a b++-- ---------------------------------------------------------------------------++-- | Atomic formula+data Rel e = Rel e RelOp e+ deriving (Show, Eq, Ord)++instance Complement (Rel c) where+ notB (Rel lhs op rhs) = Rel lhs (negOp op) rhs++instance IsRel e (Rel e) where+ rel op a b = Rel a op b++instance Variables e => Variables (Rel e) where+ vars (Rel a _ b) = vars a `IS.union` vars b++instance Functor Rel where+ fmap f (Rel a op b) = Rel (f a) op (f b)++-- ---------------------------------------------------------------------------
+ src/ToySolver/Data/Boolean.hs view
@@ -0,0 +1,55 @@+{-# OPTIONS_GHC -Wall #-}+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.Data.Boolean+-- Copyright : (c) Masahiro Sakai 2012-2014+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : provisional+-- Portability : portable+--+-- Type classes for lattices and boolean algebras.+-- +-----------------------------------------------------------------------------+module ToySolver.Data.Boolean+ (+ -- * Boolean algebra+ Complement (..)+ , Boolean (..)+ , andB+ , orB+ ) where++infixr 3 .&&.+infixr 2 .||.+infix 1 .=>., .<=>.++-- | types that can be negated.+class Complement a where+ notB :: a -> a++-- | types that can be combined with boolean operations.+class Complement a => Boolean a where+ true, false :: a+ (.&&.) :: a -> a -> a+ (.||.) :: a -> a -> a++ (.=>.), (.<=>.) :: a -> a -> a+ x .=>. y = notB x .||. y+ x .<=>. y = (x .=>. y) .&&. (y .=>. x)++andB :: Boolean a => [a] -> a+andB = foldr (.&&.) true++orB :: Boolean a => [a] -> a+orB = foldr (.||.) false++instance Complement Bool where+ notB = not++instance Boolean Bool where+ true = True+ false = False+ (.&&.) = (&&)+ (.||.) = (||)
+ src/ToySolver/Data/DNF.hs view
@@ -0,0 +1,33 @@+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.Data.DNF+-- Copyright : (c) Masahiro Sakai 2011-2013+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : provisional+-- Portability : portable+--+-- Disjunctive Normal Form+-- +-----------------------------------------------------------------------------+module ToySolver.Data.DNF+ ( DNF (..)+ ) where++import ToySolver.Data.Boolean++-- | Disjunctive normal form+newtype DNF lit+ = DNF+ { unDNF :: [[lit]] -- ^ list of conjunction of literals+ } deriving (Show)++instance Complement lit => Complement (DNF lit) where+ notB (DNF xs) = DNF . sequence . map (map notB) $ xs++instance Complement lit => Boolean (DNF lit) where+ true = DNF [[]]+ false = DNF []+ DNF xs .||. DNF ys = DNF (xs++ys)+ DNF xs .&&. DNF ys = DNF [x++y | x<-xs, y<-ys]
+ src/ToySolver/Data/Delta.hs view
@@ -0,0 +1,93 @@+{-# LANGUAGE TypeFamilies #-}+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.Data.Delta+-- Copyright : (c) Masahiro Sakai 2011-2013+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : provisional+-- Portability : non-portable (TypeFamilies)+--+-- Augmenting number types with infinitesimal parameter δ.+--+-- Reference:+-- +-- * Bruno Dutertre and Leonardo de Moura,+-- \"/A Fast Linear-Arithmetic Solver for DPLL(T)/\",+-- Computer Aided Verification In Computer Aided Verification, Vol. 4144+-- (2006), pp. 81-94.+-- <http://dx.doi.org/10.1007/11817963_11>+-- <http://yices.csl.sri.com/cav06.pdf>+--+-----------------------------------------------------------------------------++module ToySolver.Data.Delta+ (+ -- * The Delta type+ Delta (..)++ -- * Construction+ , fromReal+ , delta++ -- * Query+ , realPart+ , deltaPart++ -- * Relationship with integers+ , floor'+ , ceiling'+ , isInteger'+ ) where++import Data.VectorSpace+import ToySolver.Internal.Util (isInteger)++-- | @Delta r k@ represents r + kδ for symbolic infinitesimal parameter δ.+data Delta r = Delta !r !r deriving (Ord, Eq, Show)++-- | symbolic infinitesimal parameter δ.+delta :: Num r => Delta r+delta = Delta 0 1++-- | Conversion from a base @r@ value to @Delta r@.+fromReal :: Num r => r -> Delta r+fromReal x = Delta x 0++-- | Extracts the real part..+realPart :: Delta r -> r+realPart (Delta r _) = r++-- | Extracts the δ part..+deltaPart :: Delta r -> r+deltaPart (Delta _ k) = k++instance Num r => AdditiveGroup (Delta r) where+ Delta r1 k1 ^+^ Delta r2 k2 = Delta (r1+r2) (k1+k2)+ zeroV = Delta 0 0+ negateV (Delta r k) = Delta (- r) (- k)++instance Num r => VectorSpace (Delta r) where+ type Scalar (Delta r) = r+ c *^ Delta r k = Delta (c*r) (c*k)++-- | 'Delta' version of 'floor'.+-- @'floor'' x@ returns the greatest integer not greater than @x@+floor' :: (RealFrac r, Integral a) => Delta r -> a+floor' (Delta r k) = fromInteger $ if r2==r && k < 0 then i-1 else i+ where+ i = floor r+ r2 = fromInteger i++-- | 'Delta' version of 'ceiling'.+-- @'ceiling'' x@ returns the least integer not less than @x@+ceiling' :: (RealFrac r, Integral a) => Delta r -> a+ceiling' (Delta r k) = fromInteger $ if r2==r && k > 0 then i+1 else i+ where+ i = ceiling r+ r2 = fromInteger i++-- | Is this a integer?+isInteger' :: RealFrac r => Delta r -> Bool+isInteger' (Delta r k) = isInteger r && k == 0
+ src/ToySolver/Data/FOL/Arith.hs view
@@ -0,0 +1,113 @@+{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses #-}+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.Data.FOL.Arith+-- Copyright : (c) Masahiro Sakai 2011-2013+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : provisional+-- Portability : non-portable (FlexibleInstances, MultiParamTypeClasses)+--+-- Arithmetic language (not limited to linear ones).+-- +-----------------------------------------------------------------------------+module ToySolver.Data.FOL.Arith+ (+ -- * Arithmetic expressions+ Expr (..)+ , var+ , evalExpr++ -- * Atomic formula+ , module ToySolver.Data.ArithRel+ , Atom (..)+ , evalAtom++ -- * Arithmetic formula+ , module ToySolver.Data.FOL.Formula ++ -- * Misc+ , SatResult (..)+ ) where++import qualified Data.IntMap as IM+import qualified Data.IntSet as IS+import Data.Ratio++import ToySolver.Data.ArithRel+import ToySolver.Data.FOL.Formula+import ToySolver.Data.Var++-- ---------------------------------------------------------------------------++-- | Arithmetic expressions+data Expr r+ = Const r+ | Var Var+ | Expr r :+: Expr r+ | Expr r :*: Expr r+ | Expr r :/: Expr r+ deriving (Eq, Ord, Show)++instance Num r => Num (Expr r) where+ a + b = a :+: b+ a * b = a :*: b+ a - b = a + negate b+ negate a = Const (-1) :*: a+ abs a = a+ signum _ = 1+ fromInteger = Const . fromInteger++instance Fractional r => Fractional (Expr r) where+ a / b = a :/: b+ fromRational x = fromInteger (numerator x) / fromInteger (denominator x)++instance Functor Expr where+ fmap f = g+ where+ g (Const c) = Const (f c)+ g (Var v) = Var v+ g (a :+: b) = g a :+: g b+ g (a :*: b) = g a :*: g b+ g (a :/: b) = g a :/: g b++instance Variables (Expr r) where+ vars (Const _) = IS.empty+ vars (Var v) = IS.singleton v+ vars (a :+: b) = vars a `IS.union` vars b+ vars (a :*: b) = vars a `IS.union` vars b+ vars (a :/: b) = vars a `IS.union` vars b++-- | single variable expression+var :: Var -> Expr r+var = Var++-- | evaluate an 'Expr' with respect to a 'Model'+evalExpr :: Fractional r => Model r -> Expr r -> r+evalExpr m = f+ where+ f (Const x) = x+ f (Var v) = m IM.! v+ f (a :+: b) = f a + f b+ f (a :*: b) = f a * f b+ f (a :/: b) = f a / f b++-- ---------------------------------------------------------------------------++-- | Atomic formula+type Atom c = Rel (Expr c)++evalAtom :: (Real r, Fractional r) => Model r -> Atom r -> Bool+evalAtom m (Rel a op b) = evalOp op (evalExpr m a) (evalExpr m b)++instance IsRel (Expr c) (Formula (Atom c)) where+ rel op a b = Atom $ rel op a b++-- ---------------------------------------------------------------------------++-- | results of satisfiability checking+data SatResult r = Unknown | Unsat | Sat (Model r)+ deriving (Show, Eq, Ord)++-- ---------------------------------------------------------------------------
+ src/ToySolver/Data/FOL/Formula.hs view
@@ -0,0 +1,79 @@+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.Data.FOL.Formula+-- Copyright : (c) Masahiro Sakai 2011-2013+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : provisional+-- Portability : portable+--+-- Formula of first order logic.+-- +-----------------------------------------------------------------------------+module ToySolver.Data.FOL.Formula+ (+ -- * Overloaded operations for formula.+ module ToySolver.Data.Boolean++ -- * Concrete formula+ , Formula (..)+ , pushNot+ ) where++import qualified Data.IntSet as IS++import ToySolver.Data.Boolean+import ToySolver.Data.Var++-- ---------------------------------------------------------------------------++-- | formulas of first order logic+data Formula a+ = T+ | F+ | Atom a+ | And (Formula a) (Formula a)+ | Or (Formula a) (Formula a)+ | Not (Formula a)+ | Imply (Formula a) (Formula a)+ | Equiv (Formula a) (Formula a)+ | Forall Var (Formula a)+ | Exists Var (Formula a)+ deriving (Show, Eq, Ord)++instance Variables a => Variables (Formula a) where+ vars T = IS.empty+ vars F = IS.empty+ vars (Atom a) = vars a+ vars (And a b) = vars a `IS.union` vars b+ vars (Or a b) = vars a `IS.union` vars b+ vars (Not a) = vars a+ vars (Imply a b) = vars a `IS.union` vars b+ vars (Equiv a b) = vars a `IS.union` vars b+ vars (Forall v a) = IS.delete v (vars a)+ vars (Exists v a) = IS.delete v (vars a)++instance Complement (Formula a) where+ notB = Not++instance Boolean (Formula c) where+ true = T+ false = F+ (.&&.) = And+ (.||.) = Or+ (.=>.) = Imply+ (.<=>.) = Equiv++-- | convert a formula into negation normal form+pushNot :: Complement a => Formula a -> Formula a+pushNot T = F+pushNot F = T+pushNot (Atom a) = Atom $ notB a+pushNot (And a b) = Or (pushNot a) (pushNot b)+pushNot (Or a b) = And (pushNot a) (pushNot b)+pushNot (Not a) = a+pushNot (Imply a b) = And a (pushNot b)+pushNot (Equiv a b) = Or (And a (pushNot b)) (And b (pushNot a))+pushNot (Forall v a) = Exists v (pushNot a)+pushNot (Exists v a) = Forall v (pushNot a)
+ src/ToySolver/Data/LA.hs view
@@ -0,0 +1,282 @@+{-# LANGUAGE TypeFamilies #-}+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.Data.LA+-- Copyright : (c) Masahiro Sakai 2011+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : provisional+-- Portability : non-portable (TypeFamilies)+--+-- Some definition for Theory of Linear Arithmetics.+-- +-----------------------------------------------------------------------------+module ToySolver.Data.LA+ (+ -- * Expression of linear arithmetics+ Expr++ -- ** Conversion+ , var+ , constant+ , terms+ , fromTerms+ , coeffMap+ , fromCoeffMap+ , unitVar+ , asConst++ -- ** Query+ , coeff+ , lookupCoeff+ , extract+ , extractMaybe ++ -- ** Operations+ , mapCoeff+ , mapCoeffWithVar+ , evalExpr+ , evalLinear+ , lift1+ , applySubst+ , applySubst1+ , showExpr++ -- * Atomic formula of linear arithmetics+ , Atom (..)+ , showAtom+ , evalAtom+ , solveFor+ , module ToySolver.Data.ArithRel++ -- * misc+ , BoundsEnv+ , computeInterval+ ) where++import Control.Monad+import Control.DeepSeq+import Data.List+import Data.Maybe+import Data.IntMap (IntMap)+import qualified Data.IntMap as IntMap+import qualified Data.IntSet as IntSet+import Data.Interval+import Data.VectorSpace++import qualified ToySolver.Data.ArithRel as ArithRel+import ToySolver.Data.ArithRel+import ToySolver.Data.Var++-----------------------------------------------------------------------------++-- | Linear combination of variables and constants.+-- Non-negative keys are used for variables's coefficients.+-- key 'unitVar' is used for constants.+newtype Expr r+ = Expr+ { -- | a mapping from variables to coefficients+ coeffMap :: IntMap r+ } deriving (Eq, Ord)++-- | Create a @Expr@ from a mapping from variables to coefficients.+fromCoeffMap :: (Num r, Eq r) => IntMap r -> Expr r+fromCoeffMap m = normalizeExpr (Expr m)++-- | terms contained in the expression.+terms :: Expr r -> [(r,Var)]+terms (Expr m) = [(c,v) | (v,c) <- IntMap.toList m]++-- | Create a @Expr@ from a list of terms.+fromTerms :: (Num r, Eq r) => [(r,Var)] -> Expr r+fromTerms ts = fromCoeffMap $ IntMap.fromListWith (+) [(x,c) | (c,x) <- ts]++instance Variables (Expr r) where+ vars (Expr m) = IntSet.delete unitVar (IntMap.keysSet m)++instance Show r => Show (Expr r) where+ showsPrec d m = showParen (d > 10) $+ showString "fromTerms " . shows (terms m)++instance (Num r, Eq r, Read r) => Read (Expr r) where+ readsPrec p = readParen (p > 10) $ \ r -> do+ ("fromTerms",s) <- lex r+ (xs,t) <- reads s+ return (fromTerms xs, t)++instance NFData r => NFData (Expr r) where+ rnf (Expr m) = rnf m++-- | Special variable that should always be evaluated to 1.+unitVar :: Var+unitVar = -1++asConst :: Num r => Expr r -> Maybe r+asConst (Expr m) =+ case IntMap.toList m of+ [] -> Just 0+ [(v,x)] | v==unitVar -> Just x+ _ -> Nothing++normalizeExpr :: (Num r, Eq r) => Expr r -> Expr r+normalizeExpr (Expr t) = Expr $ IntMap.filter (0/=) t++-- | variable+var :: Num r => Var -> Expr r+var v = Expr $ IntMap.singleton v 1++-- | constant+constant :: (Num r, Eq r) => r -> Expr r+constant c = normalizeExpr $ Expr $ IntMap.singleton unitVar c++-- | map coefficients.+mapCoeff :: (Num b, Eq b) => (a -> b) -> Expr a -> Expr b+mapCoeff f (Expr t) = Expr $ IntMap.mapMaybe g t+ where+ g c = if c' == 0 then Nothing else Just c'+ where c' = f c++-- | map coefficients.+mapCoeffWithVar :: (Num b, Eq b) => (a -> Var -> b) -> Expr a -> Expr b+mapCoeffWithVar f (Expr t) = Expr $ IntMap.mapMaybeWithKey g t+ where+ g v c = if c' == 0 then Nothing else Just c'+ where c' = f c v++instance (Num r, Eq r) => AdditiveGroup (Expr r) where+ Expr t ^+^ e2 | IntMap.null t = e2+ e1 ^+^ Expr t | IntMap.null t = e1+ e1 ^+^ e2 = normalizeExpr $ plus e1 e2+ zeroV = Expr $ IntMap.empty+ negateV = ((-1) *^)++instance (Num r, Eq r) => VectorSpace (Expr r) where+ type Scalar (Expr r) = r+ 1 *^ e = e+ 0 *^ e = zeroV+ c *^ e = mapCoeff (c*) e++plus :: Num r => Expr r -> Expr r -> Expr r+plus (Expr t1) (Expr t2) = Expr $ IntMap.unionWith (+) t1 t2++-- | evaluate the expression under the model.+evalExpr :: Num r => Model r -> Expr r -> r+evalExpr m (Expr t) = sum [(m' IntMap.! v) * c | (v,c) <- IntMap.toList t]+ where m' = IntMap.insert unitVar 1 m++-- | evaluate the expression under the model.+evalLinear :: VectorSpace a => Model a -> a -> Expr (Scalar a) -> a+evalLinear m u (Expr t) = sumV [c *^ (m' IntMap.! v) | (v,c) <- IntMap.toList t]+ where m' = IntMap.insert unitVar u m++lift1 :: VectorSpace x => x -> (Var -> x) -> Expr (Scalar x) -> x+lift1 unit f (Expr t) = sumV [c *^ (g v) | (v,c) <- IntMap.toList t]+ where+ g v+ | v==unitVar = unit+ | otherwise = f v++applySubst :: (Num r, Eq r) => VarMap (Expr r) -> Expr r -> Expr r+applySubst s (Expr m) = sumV (map f (IntMap.toList m))+ where+ f (v,c) = c *^ (+ case IntMap.lookup v s of+ Just tm -> tm+ Nothing -> var v)++-- | applySubst1 x e e1 == e1[e/x]+applySubst1 :: (Num r, Eq r) => Var -> Expr r -> Expr r -> Expr r+applySubst1 x e e1 =+ case extractMaybe x e1 of+ Nothing -> e1+ Just (c,e2) -> c *^ e ^+^ e2++-- | lookup a coefficient of the variable.+-- @+-- coeff v e == fst (extract v e)+-- @+coeff :: Num r => Var -> Expr r -> r+coeff v (Expr m) = IntMap.findWithDefault 0 v m++-- | lookup a coefficient of the variable.+-- It returns @Nothing@ if the expression does not contain @v@.+-- @+-- lookupCoeff v e == fmap fst (extractMaybe v e)+-- @+lookupCoeff :: Num r => Var -> Expr r -> Maybe r+lookupCoeff v (Expr m) = IntMap.lookup v m ++-- | @extract v e@ returns @(c, e')@ such that @e == c *^ v ^+^ e'@+extract :: Num r => Var -> Expr r -> (r, Expr r)+extract v (Expr m) = (IntMap.findWithDefault 0 v m, Expr (IntMap.delete v m))+{-+-- Alternative implementation which may be faster but allocte more memory+extract v (Expr m) = + case IntMap.updateLookupWithKey (\_ _ -> Nothing) v m of+ (Nothing, _) -> (0, Expr m)+ (Just c, m2) -> (c, Expr m2)+-}++-- | @extractMaybe v e@ returns @Just (c, e')@ such that @e == c *^ v ^+^ e'@+-- if @e@ contains v, and returns @Nothing@ otherwise.+extractMaybe :: Num r => Var -> Expr r -> Maybe (r, Expr r)+extractMaybe v (Expr m) =+ case IntMap.lookup v m of+ Nothing -> Nothing+ Just c -> Just (c, Expr (IntMap.delete v m))+{-+-- Alternative implementation which may be faster but allocte more memory+extractMaybe v (Expr m) =+ case IntMap.updateLookupWithKey (\_ _ -> Nothing) v m of+ (Nothing, _) -> Nothing+ (Just c, m2) -> Just (c, Expr m2)+-}++showExpr :: (Num r, Eq r, Show r) => Expr r -> String+showExpr = showExprWith f+ where+ f x = "x" ++ show x++showExprWith :: (Num r, Show r, Eq r) => (Var -> String) -> Expr r -> String+showExprWith env (Expr m) = foldr (.) id xs ""+ where+ xs = intersperse (showString " + ") ts+ ts = [if c==1+ then showString (env x)+ else showsPrec 8 c . showString "*" . showString (env x)+ | (x,c) <- IntMap.toList m, x /= unitVar] +++ [showsPrec 7 c | c <- maybeToList (IntMap.lookup unitVar m)]++-----------------------------------------------------------------------------++-- | Atomic Formula of Linear Arithmetics+type Atom r = Rel (Expr r)++showAtom :: (Num r, Eq r, Show r) => Atom r -> String+showAtom (Rel lhs op rhs) = showExpr lhs ++ showOp op ++ showExpr rhs++-- | evaluate the formula under the model.+evalAtom :: (Num r, Ord r) => Model r -> Atom r -> Bool+evalAtom m (Rel lhs op rhs) = evalOp op (evalExpr m lhs) (evalExpr m rhs)++-- | Solve linear (in)equation for the given variable.+--+-- @solveFor a v@ returns @Just (op, e)@ such that @Atom v op e@+-- is equivalent to @a@.+solveFor :: (Real r, Fractional r) => Atom r -> Var -> Maybe (RelOp, Expr r)+solveFor (Rel lhs op rhs) v = do+ (c,e) <- extractMaybe v (lhs ^-^ rhs)+ return ( if c < 0 then flipOp op else op+ , (1/c) *^ negateV e+ )++-----------------------------------------------------------------------------++type BoundsEnv r = VarMap (Interval r)++-- | compute bounds for a @Expr@ with respect to @BoundsEnv@.+computeInterval :: (Real r, Fractional r) => BoundsEnv r -> Expr r -> Interval r+computeInterval b = evalExpr b . mapCoeff singleton++-----------------------------------------------------------------------------
+ src/ToySolver/Data/LA/FOL.hs view
@@ -0,0 +1,55 @@+{-# OPTIONS_GHC -Wall #-}+module ToySolver.Data.LA.FOL+ ( fromFOLAtom+ , toFOLFormula+ , fromFOLExpr+ , toFOLExpr+ ) where++import Control.Monad+import Data.VectorSpace++import ToySolver.Data.ArithRel+import ToySolver.Data.FOL.Arith+import qualified ToySolver.Data.LA as LA++-- ---------------------------------------------------------------------------++fromFOLAtom :: (Real r, Fractional r) => Atom r -> Maybe (LA.Atom r)+fromFOLAtom (Rel a op b) = do+ a' <- fromFOLExpr a+ b' <- fromFOLExpr b+ return $ rel op a' b'++toFOLFormula :: (Real r, Fractional r) => LA.Atom r -> Formula (Atom r)+toFOLFormula r = Atom $ fmap toFOLExpr r++fromFOLExpr :: (Real r, Fractional r) => Expr r -> Maybe (LA.Expr r)+fromFOLExpr (Const c) = return (LA.constant c)+fromFOLExpr (Var v) = return (LA.var v)+fromFOLExpr (a :+: b) = liftM2 (^+^) (fromFOLExpr a) (fromFOLExpr b)+fromFOLExpr (a :*: b) = do+ a' <- fromFOLExpr a+ b' <- fromFOLExpr b+ msum [ do{ c <- LA.asConst a'; return (c *^ b') }+ , do{ c <- LA.asConst b'; return (c *^ a') }+ ]+fromFOLExpr (a :/: b) = do+ a' <- fromFOLExpr a+ b' <- fromFOLExpr b+ c <- LA.asConst b'+ guard $ c /= 0+ return (a' ^/ c)++toFOLExpr :: (Real r, Fractional r) => LA.Expr r -> Expr r+toFOLExpr e =+ case map f (LA.terms e) of+ [] -> Const 0+ [t] -> t+ ts -> foldr1 (*) ts+ where+ f (c,x)+ | x == LA.unitVar = Const c+ | otherwise = Const c * Var x++-- ---------------------------------------------------------------------------
+ src/ToySolver/Data/LBool.hs view
@@ -0,0 +1,84 @@+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.Data.LBool+-- Copyright : (c) Masahiro Sakai 2012+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : provisional+-- Portability : portable+--+-- Lifted boolean type.+-- +-----------------------------------------------------------------------------+module ToySolver.Data.LBool+ ( LBool+ , lTrue+ , lFalse+ , lUndef+ , lnot+ , liftBool+ , unliftBool+ ) where++import Data.Int++-- | Lifted Bool type. It has three values 'lTrue', 'lFalse', 'lUndef'.+newtype LBool = LBool Int8 deriving Eq++-- | lifted true value+{-# INLINE lTrue #-}+lTrue :: LBool+lTrue = LBool 1++-- | lifted false value+{-# INLINE lFalse #-}+lFalse :: LBool+lFalse = LBool (-1)++-- | undefined truth value+{-# INLINE lUndef #-}+lUndef :: LBool+lUndef = LBool 0++-- |+-- @+-- lnot lTrue == lFalse+-- lnot lFalse == lTrue+-- lnot lUndef == lUndef+-- @+{-# INLINE lnot #-}+lnot :: LBool -> LBool+lnot x+ | x == lTrue = lFalse+ | x == lFalse = lTrue+ | otherwise = lUndef++-- |+-- @+-- liftBool True == lTrue+-- liftBool False == lFalse+-- @+{-# INLINE liftBool #-}+liftBool :: Bool -> LBool+liftBool True = lTrue+liftBool False = lFalse++-- |+-- @+-- unliftBool lTrue == Just True+-- unliftBool lFalse == Just False+-- unliftBool lUndef == Nothing+-- @+{-# INLINE unliftBool #-}+unliftBool :: LBool -> Maybe Bool+unliftBool x+ | x == lTrue = Just True+ | x == lFalse = Just False+ | otherwise = Nothing++instance Show LBool where+ show x+ | x == lTrue = "lTrue"+ | x == lFalse = "lFalse"+ | otherwise = "lUndef"
+ src/ToySolver/Data/MIP.hs view
@@ -0,0 +1,222 @@+{-# OPTIONS_GHC -Wall #-}+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.Data.MIP+-- Copyright : (c) Masahiro Sakai 2011-2014+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : provisional+-- Portability : portable+--+-- Mixed-Integer Programming Problems with some commmonly used extensions+--+-----------------------------------------------------------------------------+module ToySolver.Data.MIP+ ( Problem (..)+ , Expr+ , Term (..)+ , OptDir (..)+ , ObjectiveFunction+ , Constraint (..)+ , Bounds+ , Label+ , Var+ , VarType (..)+ , VarInfo (..)+ , BoundExpr (..)+ , RelOp (..)+ , SOSType (..)+ , SOSConstraint (..)+ , defaultBounds+ , defaultLB+ , defaultUB+ , toVar+ , fromVar+ , getVarInfo+ , getVarType+ , getBounds+ , variables+ , integerVariables+ , semiContinuousVariables+ , semiIntegerVariables++ -- * Utilities+ , Variables (..)+ , intersectBounds+ ) where++import Data.Map (Map)+import qualified Data.Map as Map+import Data.Set (Set)+import qualified Data.Set as Set+import Data.Interned (intern, unintern)+import Data.Interned.String+import Data.OptDir++-- ---------------------------------------------------------------------------++-- | Problem+data Problem+ = Problem+ { dir :: OptDir+ , objectiveFunction :: ObjectiveFunction+ , constraints :: [Constraint]+ , sosConstraints :: [SOSConstraint]+ , userCuts :: [Constraint]+ , varInfo :: Map Var VarInfo+ }+ deriving (Show, Eq, Ord)++-- | expressions+type Expr = [Term]++-- | terms+data Term = Term Rational [Var]+ deriving (Eq, Ord, Show)++-- | objective function+type ObjectiveFunction = (Maybe Label, Expr)++-- | constraint+data Constraint+ = Constraint+ { constrLabel :: Maybe Label+ , constrIndicator :: Maybe (Var, Rational)+ , constrBody :: (Expr, RelOp, Rational)+ , constrIsLazy :: Bool+ }+ deriving (Eq, Ord, Show)++data VarType+ = ContinuousVariable+ | IntegerVariable+-- 'nothaddock' is inserted not to confuse haddock+ -- nothaddock | BinaryVariable+ | SemiContinuousVariable+ | SemiIntegerVariable+ deriving (Eq, Ord, Show)++data VarInfo+ = VarInfo+ { varType :: VarType+ , varBounds :: Bounds+ }+ deriving (Eq, Ord, Show)++defaultVarInfo :: VarInfo+defaultVarInfo+ = VarInfo+ { varType = ContinuousVariable+ , varBounds = defaultBounds+ }++-- | type for representing lower/upper bound of variables+type Bounds = (BoundExpr, BoundExpr)++-- | label+type Label = String++-- | variable+type Var = InternedString++-- | type for representing lower/upper bound of variables+data BoundExpr = NegInf | Finite Rational | PosInf+ deriving (Eq, Ord, Show)++-- | relational operators+data RelOp = Le | Ge | Eql+ deriving (Eq, Ord, Enum, Show)++-- | types of SOS (special ordered sets) constraints+data SOSType+ = S1 -- ^ Type 1 SOS constraint+ | S2 -- ^ Type 2 SOS constraint+ deriving (Eq, Ord, Enum, Show, Read)++-- | SOS (special ordered sets) constraints+data SOSConstraint+ = SOSConstraint+ { sosLabel :: Maybe Label+ , sosType :: SOSType+ , sosBody :: [(Var, Rational)]+ }+ deriving (Eq, Ord, Show)++class Variables a where+ vars :: a -> Set Var++instance Variables a => Variables [a] where+ vars = Set.unions . map vars++instance (Variables a, Variables b) => Variables (Either a b) where+ vars (Left a) = vars a+ vars (Right b) = vars b++instance Variables Problem where+ vars = variables++instance Variables Term where+ vars (Term _ xs) = Set.fromList xs++instance Variables Constraint where+ vars Constraint{ constrIndicator = ind, constrBody = (lhs, _, _) } =+ vars lhs `Set.union` vs2+ where+ vs2 = maybe Set.empty (Set.singleton . fst) ind++instance Variables SOSConstraint where+ vars SOSConstraint{ sosBody = xs } = Set.fromList (map fst xs)++-- | default bounds+defaultBounds :: Bounds+defaultBounds = (defaultLB, defaultUB)++-- | default lower bound (0)+defaultLB :: BoundExpr+defaultLB = Finite 0++-- | default upper bound (+∞)+defaultUB :: BoundExpr+defaultUB = PosInf++-- | convert a string into a variable+toVar :: String -> Var+toVar = intern++-- | convert a variable into a string+fromVar :: Var -> String+fromVar = unintern++-- | looking up attributes for a variable+getVarInfo :: Problem -> Var -> VarInfo+getVarInfo lp v = Map.findWithDefault defaultVarInfo v (varInfo lp)++-- | looking up bounds for a variable+getVarType :: Problem -> Var -> VarType+getVarType lp v = varType $ getVarInfo lp v++-- | looking up bounds for a variable+getBounds :: Problem -> Var -> Bounds+getBounds lp v = varBounds $ getVarInfo lp v++intersectBounds :: Bounds -> Bounds -> Bounds+intersectBounds (lb1,ub1) (lb2,ub2) = (max lb1 lb2, min ub1 ub2)++variables :: Problem -> Set Var+variables lp = Map.keysSet $ varInfo lp++integerVariables :: Problem -> Set Var+integerVariables lp = Map.keysSet $ Map.filter p (varInfo lp)+ where+ p VarInfo{ varType = vt } = vt == IntegerVariable++semiContinuousVariables :: Problem -> Set Var+semiContinuousVariables lp = Map.keysSet $ Map.filter p (varInfo lp)+ where+ p VarInfo{ varType = vt } = vt == SemiContinuousVariable++semiIntegerVariables :: Problem -> Set Var+semiIntegerVariables lp = Map.keysSet $ Map.filter p (varInfo lp)+ where+ p VarInfo{ varType = vt } = vt == SemiIntegerVariable
+ src/ToySolver/Data/Polyhedron.hs view
@@ -0,0 +1,152 @@+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.Data.Polyhedron+-- Copyright : (c) Masahiro Sakai 2012+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : provisional+-- Portability : portable+--+-- Affine subspaces that are characterized by a set of linear (in)equalities.+-- +-----------------------------------------------------------------------------+module ToySolver.Data.Polyhedron+ ( Polyhedron+ , univ+ , empty+ , intersection+ , fromConstraints+ , toConstraints+ ) where++import Data.List+import Data.Ratio+import qualified Data.IntSet as IntSet+import Data.Map (Map)+import qualified Data.Map as Map+import Data.VectorSpace+import Prelude hiding (null)++import Algebra.Lattice++import qualified Data.Interval as Interval+import ToySolver.Data.ArithRel+import qualified ToySolver.Data.LA as LA+import ToySolver.Data.Var++type ExprR = LA.Expr Rational+type ExprZ = LA.Expr Integer++type AtomR = LA.Atom Rational++type IntervalR = Interval.Interval Rational++-- | Intersection of half-spaces+data Polyhedron+ = Polyhedron (Map ExprZ IntervalR)+ | Empty+ deriving (Eq)++instance Variables Polyhedron where+ vars (Polyhedron m) = IntSet.unions [vars e | e <- Map.keys m]+ vars Empty = IntSet.empty++instance JoinSemiLattice Polyhedron where+ join Empty b = b+ join a Empty = a+ join (Polyhedron m1) (Polyhedron m2) =+ normalize $ Polyhedron (Map.intersectionWith Interval.join m1 m2)++instance MeetSemiLattice Polyhedron where+ meet = intersection++instance Lattice Polyhedron++instance BoundedJoinSemiLattice Polyhedron where+ bottom = empty ++instance BoundedMeetSemiLattice Polyhedron where+ top = univ++instance BoundedLattice Polyhedron++normalize :: Polyhedron -> Polyhedron+normalize (Polyhedron m) | any Interval.null (Map.elems m) = Empty+normalize p = p++-- | universe+univ :: Polyhedron+univ = Polyhedron Map.empty++-- | empty space+empty :: Polyhedron+empty = Empty++-- | intersection of +intersection :: Polyhedron -> Polyhedron -> Polyhedron+intersection (Polyhedron m1) (Polyhedron m2) =+ normalize $ Polyhedron (Map.unionWith Interval.intersection m1 m2)+intersection _ _ = Empty++-- | Create a set of 'Polyhedron's that are characterized by a given+-- set of linear (in)equalities.+fromConstraints :: [AtomR] -> [Polyhedron]+fromConstraints cs = + map (foldl' intersection univ) $ transpose $ map fromAtom cs++fromAtom :: AtomR -> [Polyhedron]+fromAtom (Rel lhs NEq rhs) =+ fromAtom (lhs .<. rhs) ++ fromAtom (lhs .>. rhs)+fromAtom (Rel lhs op rhs) =+ case LA.extract LA.unitVar (lhs .-. rhs) of+ (c, e1) ->+ case toRat e1 of+ (lhs1, d) ->+ let rhs1 = - c * fromIntegral d+ (lhs2,op2,rhs2) =+ if p lhs1+ then (negateV lhs1, flipOp op, - rhs1)+ else (lhs1, op, rhs1)+ ival =+ case op of+ Lt -> Interval.interval Nothing (Just (False, rhs2))+ Le -> Interval.interval Nothing (Just (True, rhs2))+ Ge -> Interval.interval (Just (True, rhs2)) Nothing+ Gt -> Interval.interval (Just (False, rhs2)) Nothing+ Eql -> Interval.singleton rhs2+ NEq -> error "should not happen"+ in filter (Empty /=) [normalize $ Polyhedron (Map.singleton lhs2 ival)]++-- | Convert the polyhedron to a list of linear (in)equalities.+toConstraints :: Polyhedron -> [AtomR]+toConstraints Empty = [LA.constant 0 .<. LA.constant 0]+toConstraints (Polyhedron m) = do+ (e, ival) <- Map.toList m+ let e' = LA.mapCoeff fromIntegral e+ xs = case Interval.lowerBound ival of+ Nothing -> []+ Just (True,c) -> [LA.constant c .<=. e']+ Just (False,c) -> [LA.constant c .<. e']+ ys = case Interval.upperBound ival of+ Nothing -> []+ Just (True,c) -> [e' .<=. LA.constant c]+ Just (False,c) -> [e' .<. LA.constant c]+ xs ++ ys++p :: ExprZ -> Bool+p e =+ case LA.terms e of+ (c,_):_ | c < 0 -> True+ _ -> False++-- | (t,c) represents t/c, and c must be >0.+type Rat = (ExprZ, Integer)++toRat :: ExprR -> Rat+toRat e = (LA.mapCoeff f e, d)+ where+ f :: Rational -> Integer+ f x = round (x * fromIntegral d)+ d :: Integer+ d = foldl' lcm 1 [denominator c | (c,_) <- LA.terms e]
+ src/ToySolver/Data/Polynomial.hs view
@@ -0,0 +1,126 @@+{-# OPTIONS_GHC -Wall #-}+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.Data.Polynomial+-- Copyright : (c) Masahiro Sakai 2012-2013+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : provisional+-- Portability : portable+--+-- Polynomials+--+-- References:+--+-- * Monomial order <http://en.wikipedia.org/wiki/Monomial_order>+--+-- * Polynomial class for Ruby <http://www.math.kobe-u.ac.jp/~kodama/tips-RubyPoly.html>+--+-- * constructive-algebra package <http://hackage.haskell.org/package/constructive-algebra>+-- +-----------------------------------------------------------------------------+module ToySolver.Data.Polynomial+ (+ -- * Polynomial type+ Polynomial++ -- * Conversion+ , Var (..)+ , constant+ , terms+ , fromTerms+ , coeffMap+ , fromCoeffMap+ , fromTerm++ -- * Query+ , Degree (..)+ , Vars (..)+ , lt+ , lc+ , lm+ , coeff+ , lookupCoeff+ , isPrimitive++ -- * Operations+ , Factor (..)+ , SQFree (..)+ , ContPP (..)+ , deriv+ , integral+ , eval+ , subst+ , mapCoeff+ , toMonic+ , toUPolynomialOf+ , divModMP+ , reduce++ -- * Univariate polynomials+ , UPolynomial+ , X (..)+ , UTerm+ , UMonomial+ , div+ , mod+ , divMod+ , divides+ , gcd+ , lcm+ , exgcd+ , pdivMod+ , pdiv+ , pmod+ , gcd'+ , isRootOf+ , isSquareFree+ , nat++ -- * Term+ , Term+ , tdeg+ , tmult+ , tdivides+ , tdiv+ , tderiv+ , tintegral++ -- * Monic monomial+ , Monomial+ , mone+ , mfromIndices+ , mfromIndicesMap+ , mindices+ , mindicesMap+ , mmult+ , mpow+ , mdivides+ , mdiv+ , mderiv+ , mintegral+ , mlcm+ , mgcd+ , mcoprime++ -- * Monomial order+ , MonomialOrder+ , lex+ , revlex+ , grlex+ , grevlex++ -- * Pretty Printing+ , PrintOptions (..)+ , defaultPrintOptions+ , prettyPrint+ , PrettyCoeff (..)+ , PrettyVar (..)+ ) where++import Prelude hiding (lex, div, mod, divMod, gcd, lcm)+import ToySolver.Data.Polynomial.Base+import ToySolver.Data.Polynomial.Factorization.FiniteField ()+import ToySolver.Data.Polynomial.Factorization.Integer ()+import ToySolver.Data.Polynomial.Factorization.Rational ()
+ src/ToySolver/Data/Polynomial/Base.hs view
@@ -0,0 +1,873 @@+{-# LANGUAGE ScopedTypeVariables, FlexibleInstances, MultiParamTypeClasses, FunctionalDependencies, TypeFamilies, BangPatterns, DeriveDataTypeable, CPP #-}+{-# OPTIONS_GHC -Wall #-}+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.Data.Polynomial.Base+-- Copyright : (c) Masahiro Sakai 2012-2013+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : provisional+-- Portability : non-portable (ScopedTypeVariables, FlexibleInstances, MultiParamTypeClasses, FunctionalDependencies, TypeFamilies, BangPatterns, DeriveDataTypeable, CPP)+--+-- Polynomials+--+-- References:+--+-- * Monomial order <http://en.wikipedia.org/wiki/Monomial_order>+--+-- * Polynomial class for Ruby <http://www.math.kobe-u.ac.jp/~kodama/tips-RubyPoly.html>+--+-- * constructive-algebra package <http://hackage.haskell.org/package/constructive-algebra>+-- +-----------------------------------------------------------------------------+module ToySolver.Data.Polynomial.Base+ (+ -- * Polynomial type+ Polynomial++ -- * Conversion+ , Var (..)+ , constant+ , terms+ , fromTerms+ , coeffMap+ , fromCoeffMap+ , fromTerm++ -- * Query+ , Degree (..)+ , Vars (..)+ , lt+ , lc+ , lm+ , coeff+ , lookupCoeff+ , isPrimitive++ -- * Operations+ , Factor (..)+ , SQFree (..)+ , ContPP (..)+ , deriv+ , integral+ , eval+ , subst+ , mapCoeff+ , toMonic+ , toUPolynomialOf+ , divModMP+ , reduce++ -- * Univariate polynomials+ , UPolynomial+ , X (..)+ , UTerm+ , UMonomial+ , div+ , mod+ , divMod+ , divides+ , gcd+ , lcm+ , exgcd+ , pdivMod+ , pdiv+ , pmod+ , gcd'+ , isRootOf+ , isSquareFree+ , nat++ -- * Term+ , Term+ , tdeg+ , tmult+ , tdivides+ , tdiv+ , tderiv+ , tintegral++ -- * Monic monomial+ , Monomial+ , mone+ , mfromIndices+ , mfromIndicesMap+ , mindices+ , mindicesMap+ , mmult+ , mpow+ , mdivides+ , mdiv+ , mderiv+ , mintegral+ , mlcm+ , mgcd+ , mcoprime++ -- * Monomial order+ , MonomialOrder+ , lex+ , revlex+ , grlex+ , grevlex++ -- * Pretty Printing+ , PrintOptions (..)+ , defaultPrintOptions+ , prettyPrint+ , PrettyCoeff (..)+ , PrettyVar (..)+ ) where++import Prelude hiding (lex, div, mod, divMod, gcd, lcm)+import qualified Prelude+import Control.DeepSeq+import Control.Exception (assert)+import Control.Monad+import Data.Data+import qualified Data.FiniteField as FF+import Data.Function+import Data.Hashable+import Data.List+import Data.Monoid+import Data.Ratio+import Data.String (IsString (..))+import Data.Map (Map)+import qualified Data.Map as Map+import Data.Set (Set)+import qualified Data.Set as Set+import Data.IntMap (IntMap)+import qualified Data.IntMap as IntMap+import Data.Typeable+import Data.VectorSpace+import qualified Text.PrettyPrint.HughesPJClass as PP+import Text.PrettyPrint.HughesPJClass (Doc, PrettyLevel, Pretty (..), prettyParen)++infixl 7 `div`, `mod`++{--------------------------------------------------------------------+ Classes+--------------------------------------------------------------------}++class Vars a v => Var a v | a -> v where+ var :: v -> a++class Ord v => Vars a v | a -> v where+ vars :: a -> Set v++-- | total degree of a given polynomial+class Degree t where+ deg :: t -> Integer++{--------------------------------------------------------------------+ Polynomial type+--------------------------------------------------------------------}++-- | Polynomial over commutative ring r+newtype Polynomial r v = Polynomial{ coeffMap :: Map (Monomial v) r }+ deriving (Eq, Ord, Typeable)++instance (Eq k, Num k, Ord v) => Num (Polynomial k v) where+ (+) = plus+ (*) = mult+ negate = neg+ abs x = x -- OK?+ signum _ = 1 -- OK?+ fromInteger x = constant (fromInteger x)++instance (Eq k, Num k, Ord v, IsString v) => IsString (Polynomial k v) where+ fromString s = var (fromString s)++instance (Eq k, Num k, Ord v) => AdditiveGroup (Polynomial k v) where+ (^+^) = plus+ zeroV = zero+ negateV = neg++instance (Eq k, Num k, Ord v) => VectorSpace (Polynomial k v) where+ type Scalar (Polynomial k v) = k+ k *^ p = scale k p++instance (Show v, Ord v, Show k) => Show (Polynomial k v) where+ showsPrec d p = showParen (d > 10) $+ showString "fromTerms " . shows (terms p)++instance (NFData k, NFData v) => NFData (Polynomial k v) where+ rnf (Polynomial m) = rnf m++instance (Hashable k, Hashable v) => Hashable (Polynomial k v) where+ hashWithSalt = hashUsing (Map.toList . coeffMap)++instance (Eq k, Num k, Ord v) => Var (Polynomial k v) v where+ var x = fromTerm (1, var x)++instance (Eq k, Num k, Ord v) => Vars (Polynomial k v) v where+ vars p = Set.unions $ [vars mm | (_, mm) <- terms p]++instance Degree (Polynomial k v) where+ deg p+ | isZero p = -1+ | otherwise = maximum [deg mm | (_,mm) <- terms p]++normalize :: (Eq k, Num k, Ord v) => Polynomial k v -> Polynomial k v+normalize (Polynomial m) = Polynomial (Map.filter (0/=) m)++asConstant :: Num k => Polynomial k v -> Maybe k+asConstant p =+ case terms p of+ [] -> Just 0+ [(c,xs)] | Map.null (mindicesMap xs) -> Just c+ _ -> Nothing++scale :: (Eq k, Num k, Ord v) => k -> Polynomial k v -> Polynomial k v+scale 0 _ = zero+scale 1 p = p+scale a (Polynomial m) = normalize $ Polynomial (Map.map (a*) m)++zero :: (Eq k, Num k, Ord v) => Polynomial k v+zero = Polynomial $ Map.empty++plus :: (Eq k, Num k, Ord v) => Polynomial k v -> Polynomial k v -> Polynomial k v+plus (Polynomial m1) (Polynomial m2) = normalize $ Polynomial $ Map.unionWith (+) m1 m2++neg :: (Eq k, Num k, Ord v) => Polynomial k v -> Polynomial k v+neg (Polynomial m) = Polynomial $ Map.map negate m++mult :: (Eq k, Num k, Ord v) => Polynomial k v -> Polynomial k v -> Polynomial k v+mult a b+ | Just c <- asConstant a = scale c b+ | Just c <- asConstant b = scale c a+mult (Polynomial m1) (Polynomial m2) = normalize $ Polynomial $ Map.fromListWith (+)+ [ (xs1 `mmult` xs2, c1*c2)+ | (xs1,c1) <- Map.toList m1, (xs2,c2) <- Map.toList m2+ ]++isZero :: Polynomial k v -> Bool+isZero (Polynomial m) = Map.null m++-- | construct a polynomial from a constant+constant :: (Eq k, Num k, Ord v) => k -> Polynomial k v+constant c = fromTerm (c, mone)++-- | construct a polynomial from a list of terms+fromTerms :: (Eq k, Num k, Ord v) => [Term k v] -> Polynomial k v+fromTerms = normalize . Polynomial . Map.fromListWith (+) . map (\(c,xs) -> (xs,c))++fromCoeffMap :: (Eq k, Num k, Ord v) => Map (Monomial v) k -> Polynomial k v+fromCoeffMap m = normalize $ Polynomial m++-- | construct a polynomial from a singlet term+fromTerm :: (Eq k, Num k, Ord v) => Term k v -> Polynomial k v+fromTerm (c,xs) = normalize $ Polynomial $ Map.singleton xs c++-- | list of terms+terms :: Polynomial k v -> [Term k v]+terms (Polynomial m) = [(c,xs) | (xs,c) <- Map.toList m]++-- | leading term with respect to a given monomial order+lt :: (Eq k, Num k, Ord v) => MonomialOrder v -> Polynomial k v -> Term k v+lt cmp p =+ case terms p of+ [] -> (0, mone) -- should be error?+ ms -> maximumBy (cmp `on` snd) ms++-- | leading coefficient with respect to a given monomial order+lc :: (Eq k, Num k, Ord v) => MonomialOrder v -> Polynomial k v -> k+lc cmp = fst . lt cmp++-- | leading monomial with respect to a given monomial order+lm :: (Eq k, Num k, Ord v) => MonomialOrder v -> Polynomial k v -> Monomial v+lm cmp = snd . lt cmp++-- | Look up a coefficient for a given monomial.+-- If no such term exists, it returns @0@.+coeff :: (Num k, Ord v) => Monomial v -> Polynomial k v -> k+coeff xs (Polynomial m) = Map.findWithDefault 0 xs m++-- | Look up a coefficient for a given monomial.+-- If no such term exists, it returns @Nothing@.+lookupCoeff :: Ord v => Monomial v -> Polynomial k v -> Maybe k+lookupCoeff xs (Polynomial m) = Map.lookup xs m++contI :: (Integral r, Ord v) => Polynomial r v -> r+contI 0 = 1+contI p = foldl1' Prelude.gcd [abs c | (c,_) <- terms p]++ppI :: (Integral r, Ord v) => Polynomial r v -> Polynomial r v+ppI p = mapCoeff f p+ where+ c = contI p+ f x = assert (x `Prelude.mod` c == 0) $ x `Prelude.div` c++class ContPP k where+ -- | Content of a polynomial + cont :: (Ord v) => Polynomial k v -> k+ -- constructive-algebra-0.3.0 では cont 0 は error になる++ -- | Primitive part of a polynomial+ pp :: (Ord v) => Polynomial k v -> Polynomial k v++instance ContPP Integer where+ cont = contI+ pp = ppI++instance Integral r => ContPP (Ratio r) where+ {-# SPECIALIZE instance ContPP (Ratio Integer) #-}++ cont 0 = 1+ cont p = foldl1' Prelude.gcd ns % foldl' Prelude.lcm 1 ds+ where+ ns = [abs (numerator c) | (c,_) <- terms p]+ ds = [denominator c | (c,_) <- terms p] ++ pp p = mapCoeff (/ c) p+ where+ c = cont p++-- | a polynomial is called primitive if the greatest common divisor of its coefficients is 1.+isPrimitive :: (Eq k, Num k, ContPP k, Ord v) => Polynomial k v -> Bool+isPrimitive p = isZero p || cont p == 1++-- | Formal derivative of polynomials+deriv :: (Eq k, Num k, Ord v) => Polynomial k v -> v -> Polynomial k v+deriv p x = sumV [fromTerm (tderiv m x) | m <- terms p]++-- | Formal integral of polynomials+integral :: (Eq k, Fractional k, Ord v) => Polynomial k v -> v -> Polynomial k v+integral p x = sumV [fromTerm (tintegral m x) | m <- terms p]++-- | Evaluation+eval :: (Num k, Ord v) => (v -> k) -> Polynomial k v -> k+eval env p = sum [c * product [(env x) ^ e | (x,e) <- mindices xs] | (c,xs) <- terms p]++-- | Substitution or bind+subst+ :: (Eq k, Num k, Ord v1, Ord v2)+ => Polynomial k v1 -> (v1 -> Polynomial k v2) -> Polynomial k v2+subst p s =+ sumV [constant c * product [(s x)^e | (x,e) <- mindices xs] | (c, xs) <- terms p]++-- | Transform polynomial coefficients.+mapCoeff :: (Eq k1, Num k1, Ord v) => (k -> k1) -> Polynomial k v -> Polynomial k1 v+mapCoeff f (Polynomial m) = Polynomial $ Map.mapMaybe g m+ where+ g x = if y == 0 then Nothing else Just y+ where+ y = f x++-- | Transform a polynomial into a monic polynomial with respect to the given monomial order.+toMonic :: (Eq r, Fractional r, Ord v) => MonomialOrder v -> Polynomial r v -> Polynomial r v+toMonic cmp p+ | c == 0 || c == 1 = p+ | otherwise = mapCoeff (/c) p+ where+ c = lc cmp p++-- | Convert /K[x,x1,x2,…]/ into /K[x1,x2,…][x]/.+toUPolynomialOf :: (Ord k, Num k, Ord v) => Polynomial k v -> v -> UPolynomial (Polynomial k v)+toUPolynomialOf p v = fromTerms $ do+ (c,mm) <- terms p+ let m = mindicesMap mm+ return ( fromTerms [(c, mfromIndicesMap (Map.delete v m))]+ , var X `mpow` Map.findWithDefault 0 v m+ )++-- | Multivariate division algorithm+--+-- @divModMP cmp f [g1,g2,..]@ returns a pair @([q1,q2,…],r)@ such that+--+-- * @f = g1*q1 + g2*q2 + .. + r@ and+--+-- * @g1, g2, ..@ do not divide @r@.+divModMP+ :: forall k v. (Eq k, Fractional k, Ord v)+ => MonomialOrder v -> Polynomial k v -> [Polynomial k v] -> ([Polynomial k v], Polynomial k v)+divModMP cmp p fs = go IntMap.empty p+ where+ ls = [(lt cmp f, f) | f <- fs]++ go :: IntMap (Polynomial k v) -> Polynomial k v -> ([Polynomial k v], Polynomial k v)+ go qs g =+ case xs of+ [] -> ([IntMap.findWithDefault 0 i qs | i <- [0 .. length fs - 1]], g)+ (i, b, g') : _ -> go (IntMap.insertWith (+) i b qs) g'+ where+ ms = sortBy (flip cmp `on` snd) (terms g)+ xs = do+ (i,(a,f)) <- zip [0..] ls+ h <- ms+ guard $ a `tdivides` h+ let b = fromTerm $ tdiv h a+ return (i, b, g - b * f)++-- | Multivariate division algorithm+--+-- @reduce cmp f gs = snd (divModMP cmp f gs)@+reduce+ :: (Eq k, Fractional k, Ord v)+ => MonomialOrder v -> Polynomial k v -> [Polynomial k v] -> Polynomial k v+reduce cmp p fs = go p+ where+ ls = [(lt cmp f, f) | f <- fs]+ go g = if null xs then g else go (head xs)+ where+ ms = sortBy (flip cmp `on` snd) (terms g)+ xs = do+ (a,f) <- ls+ h <- ms+ guard $ a `tdivides` h+ return (g - fromTerm (tdiv h a) * f)++-- | Prime factorization of polynomials+class Factor a where+ -- | factor a polynomial @p@ into @p1 ^ n1 * p2 ^ n2 * ..@ and+ -- return a list @[(p1,n1), (p2,n2), ..]@.+ factor :: a -> [(a, Integer)]++-- | Square-free factorization of polynomials+class SQFree a where+ -- | factor a polynomial @p@ into @p1 ^ n1 * p2 ^ n2 * ..@ and+ -- return a list @[(p1,n1), (p2,n2), ..]@.+ sqfree :: a -> [(a, Integer)]++{--------------------------------------------------------------------+ Pretty printing+--------------------------------------------------------------------}++data PrintOptions k v+ = PrintOptions+ { pOptPrintVar :: PrettyLevel -> Rational -> v -> Doc+ , pOptPrintCoeff :: PrettyLevel -> Rational -> k -> Doc+ , pOptIsNegativeCoeff :: k -> Bool+ , pOptMonomialOrder :: MonomialOrder v+ }++defaultPrintOptions :: (PrettyCoeff k, PrettyVar v, Ord v) => PrintOptions k v+defaultPrintOptions+ = PrintOptions+ { pOptPrintVar = pPrintVar+ , pOptPrintCoeff = pPrintCoeff+ , pOptIsNegativeCoeff = isNegativeCoeff+ , pOptMonomialOrder = grlex+ }++instance (Ord k, Num k, Ord v, PrettyCoeff k, PrettyVar v) => Pretty (Polynomial k v) where+ pPrintPrec = prettyPrint defaultPrintOptions++prettyPrint+ :: (Ord k, Num k, Ord v)+ => PrintOptions k v+ -> PrettyLevel -> Rational -> Polynomial k v -> Doc+prettyPrint opt lv prec p =+ case sortBy (flip (pOptMonomialOrder opt) `on` snd) $ terms p of+ [] -> PP.int 0+ [t] -> pLeadingTerm prec t+ t:ts ->+ prettyParen (prec > addPrec) $+ PP.hcat (pLeadingTerm addPrec t : map pTrailingTerm ts)+ where+ pLeadingTerm prec (c,xs) =+ if pOptIsNegativeCoeff opt c+ then prettyParen (prec > addPrec) $+ PP.char '-' <> prettyPrintTerm opt lv (addPrec+1) (-c,xs)+ else prettyPrintTerm opt lv prec (c,xs)++ pTrailingTerm (c,xs) =+ if pOptIsNegativeCoeff opt c+ then PP.space <> PP.char '-' <> PP.space <> prettyPrintTerm opt lv (addPrec+1) (-c,xs)+ else PP.space <> PP.char '+' <> PP.space <> prettyPrintTerm opt lv (addPrec+1) (c,xs)++prettyPrintTerm+ :: (Ord k, Num k, Ord v)+ => PrintOptions k v+ -> PrettyLevel -> Rational -> Term k v -> Doc+prettyPrintTerm opt lv prec (c,xs)+ | len == 0 = pOptPrintCoeff opt lv (appPrec+1) c+ -- intentionally specify (appPrec+1) to parenthesize any composite expression+ | len == 1 && c == 1 = pPow prec $ head (mindices xs)+ | otherwise =+ prettyParen (prec > mulPrec) $+ PP.hcat $ intersperse (PP.char '*') fs+ where+ len = Map.size $ mindicesMap xs+ fs = [pOptPrintCoeff opt lv (appPrec+1) c | c /= 1] ++ [pPow (mulPrec+1) p | p <- mindices xs]+ -- intentionally specify (appPrec+1) to parenthesize any composite expression++ pPow prec (x,1) = pOptPrintVar opt lv prec x+ pPow prec (x,n) =+ prettyParen (prec > expPrec) $+ pOptPrintVar opt lv (expPrec+1) x <> PP.char '^' <> PP.integer n++class PrettyCoeff a where+ pPrintCoeff :: PrettyLevel -> Rational -> a -> Doc+ isNegativeCoeff :: a -> Bool+ isNegativeCoeff _ = False++instance PrettyCoeff Integer where+ pPrintCoeff = pPrintPrec+ isNegativeCoeff = (0>)++instance (PrettyCoeff a, Integral a) => PrettyCoeff (Ratio a) where+ pPrintCoeff lv p r+ | denominator r == 1 = pPrintCoeff lv p (numerator r)+ | otherwise = + prettyParen (p > ratPrec) $+ pPrintCoeff lv (ratPrec+1) (numerator r) <>+ PP.char '/' <>+ pPrintCoeff lv (ratPrec+1) (denominator r)+ isNegativeCoeff x = isNegativeCoeff (numerator x)++instance PrettyCoeff (FF.PrimeField a) where+ pPrintCoeff lv p a = pPrintCoeff lv p (FF.toInteger a)+ isNegativeCoeff _ = False++instance (Num c, Ord c, PrettyCoeff c, Ord v, PrettyVar v) => PrettyCoeff (Polynomial c v) where+ pPrintCoeff = pPrintPrec++class PrettyVar a where+ pPrintVar :: PrettyLevel -> Rational -> a -> Doc++instance PrettyVar Int where+ pPrintVar _ _ n = PP.char 'x' <> PP.int n++instance PrettyVar X where+ pPrintVar _ _ X = PP.char 'x'++addPrec, mulPrec, ratPrec, expPrec, appPrec :: Rational+addPrec = 6 -- Precedence of '+'+mulPrec = 7 -- Precedence of '*'+ratPrec = 7 -- Precedence of '/'+expPrec = 8 -- Precedence of '^'+appPrec = 10 -- Precedence of function application++{--------------------------------------------------------------------+ Univariate polynomials+--------------------------------------------------------------------}++-- | Univariate polynomials over commutative ring r+type UPolynomial r = Polynomial r X++-- | Variable "x"+data X = X+ deriving (Eq, Ord, Bounded, Enum, Show, Read, Typeable, Data)++instance NFData X++instance Hashable X where+ hashWithSalt = hashUsing fromEnum++-- | Natural ordering /x^0 < x^1 < x^2 ../ is the unique monomial order for+-- univariate polynomials.+nat :: MonomialOrder X+nat = compare `on` deg++-- | division of univariate polynomials+div :: (Eq k, Fractional k) => UPolynomial k -> UPolynomial k -> UPolynomial k+div f1 f2 = fst (divMod f1 f2)++-- | division of univariate polynomials+mod :: (Eq k, Fractional k) => UPolynomial k -> UPolynomial k -> UPolynomial k+mod f1 f2 = snd (divMod f1 f2)++-- | division of univariate polynomials+divMod :: (Eq k, Fractional k) => UPolynomial k -> UPolynomial k -> (UPolynomial k, UPolynomial k)+divMod f g+ | isZero g = error "ToySolver.Data.Polynomial.divMod: division by zero"+ | otherwise = go 0 f+ where+ lt_g = lt nat g+ go !q !r+ | deg r < deg g = (q,r)+ | otherwise = go (q + t) (r - t * g)+ where+ lt_r = lt nat r+ t = fromTerm $ lt_r `tdiv` lt_g++divides :: (Eq k, Fractional k) => UPolynomial k -> UPolynomial k -> Bool+divides f1 f2 = f2 `mod` f1 == 0++-- | GCD of univariate polynomials+gcd :: (Eq k, Fractional k) => UPolynomial k -> UPolynomial k -> UPolynomial k+gcd f1 0 = toMonic nat f1+gcd f1 f2 = gcd f2 (f1 `mod` f2)++-- | LCM of univariate polynomials+lcm :: (Eq k, Fractional k) => UPolynomial k -> UPolynomial k -> UPolynomial k+lcm _ 0 = 0+lcm 0 _ = 0+lcm f1 f2 = toMonic nat $ (f1 `mod` (gcd f1 f2)) * f2++-- | Extended GCD algorithm+exgcd+ :: (Eq k, Fractional k)+ => UPolynomial k+ -> UPolynomial k+ -> (UPolynomial k, UPolynomial k, UPolynomial k)+exgcd f1 f2 = f $ go f1 f2 1 0 0 1+ where+ go !r0 !r1 !s0 !s1 !t0 !t1+ | r1 == 0 = (r0, s0, t0)+ | otherwise = go r1 r2 s1 s2 t1 t2+ where+ (q, r2) = r0 `divMod` r1+ s2 = s0 - q*s1+ t2 = t0 - q*t1+ f (g,u,v)+ | lc_g == 0 = (g, u, v)+ | otherwise = (mapCoeff (/lc_g) g, mapCoeff (/lc_g) u, mapCoeff (/lc_g) v)+ where+ lc_g = lc nat g++-- | pseudo division+pdivMod :: (Eq r, Num r) => UPolynomial r -> UPolynomial r -> (r, UPolynomial r, UPolynomial r)+pdivMod _ 0 = error "ToySolver.Data.Polynomial.pdivMod: division by 0"+pdivMod f g+ | deg f < deg g = (1, 0, f)+ | otherwise = go (deg f - deg g + 1) f 0+ where+ (lc_g, lm_g) = lt nat g+ b = lc_g ^ (deg f - deg_g + 1)+ deg_g = deg g+ go !n !f1 !q+ | deg_g > deg f1 = (b, q, scale (lc_g ^ n) f1)+ | otherwise = go (n - 1) (scale lc_g f1 - s * g) (q + scale (lc_g ^ (n-1)) s)+ where+ (lc_f1, lm_f1) = lt nat f1+ s = fromTerm (lc_f1, lm_f1 `mdiv` lm_g)++-- | pseudo quotient+pdiv :: (Eq r, Num r) => UPolynomial r -> UPolynomial r -> UPolynomial r+pdiv f g =+ case f `pdivMod` g of+ (_, q, _) -> q++-- | pseudo reminder+pmod :: (Eq r, Num r) => UPolynomial r -> UPolynomial r -> UPolynomial r+pmod _ 0 = error "ToySolver.Data.Polynomial.pmod: division by 0"+pmod f g+ | deg f < deg g = f+ | otherwise = go (deg f - deg g + 1) f+ where+ (lc_g, lm_g) = lt nat g+ deg_g = deg g+ go !n !f1+ | deg_g > deg f1 = scale (lc_g ^ n) f1+ | otherwise = go (n - 1) (scale lc_g f1 - s * g)+ where+ (lc_f1, lm_f1) = lt nat f1+ s = fromTerm (lc_f1, lm_f1 `mdiv` lm_g)++-- | GCD of univariate polynomials+gcd' :: (Eq r, Integral r) => UPolynomial r -> UPolynomial r -> UPolynomial r+gcd' f1 0 = ppI f1+gcd' f1 f2 = gcd' f2 (f1 `pmod` f2)++-- | Is the number a root of the polynomial?+isRootOf :: (Eq k, Num k) => k -> UPolynomial k -> Bool+isRootOf x p = eval (\_ -> x) p == 0++-- | Is the polynomial square free?+isSquareFree :: (Eq k, Fractional k) => UPolynomial k -> Bool+isSquareFree p = gcd p (deriv p X) == 1++{--------------------------------------------------------------------+ Term+--------------------------------------------------------------------}++type Term k v = (k, Monomial v)++type UTerm k = Term k X++tdeg :: Term k v -> Integer+tdeg (_,xs) = deg xs++tmult :: (Num k, Ord v) => Term k v -> Term k v -> Term k v+tmult (c1,xs1) (c2,xs2) = (c1*c2, xs1 `mmult` xs2)++tdivides :: (Fractional k, Ord v) => Term k v -> Term k v -> Bool+tdivides (_,xs1) (_,xs2) = xs1 `mdivides` xs2++tdiv :: (Fractional k, Ord v) => Term k v -> Term k v -> Term k v+tdiv (c1,xs1) (c2,xs2) = (c1 / c2, xs1 `mdiv` xs2)++tderiv :: (Eq k, Num k, Ord v) => Term k v -> v -> Term k v+tderiv (c,xs) x =+ case mderiv xs x of+ (s,ys) -> (c * fromIntegral s, ys)++tintegral :: (Eq k, Fractional k, Ord v) => Term k v -> v -> Term k v+tintegral (c,xs) x =+ case mintegral xs x of+ (s,ys) -> (c * fromRational s, ys)++{--------------------------------------------------------------------+ Monic Monomial+--------------------------------------------------------------------}++-- 本当は変数の型に応じて type family で表現を変えたい++-- | Monic monomials+newtype Monomial v = Monomial{ mindicesMap :: Map v Integer }+ deriving (Eq, Ord, Typeable)++type UMonomial = Monomial X++instance (Ord v, Show v) => Show (Monomial v) where+ showsPrec d m = showParen (d > 10) $+ showString "mfromIndices " . shows (mindices m)++instance (Ord v, IsString v) => IsString (Monomial v) where+ fromString s = var (fromString s)++instance (NFData v) => NFData (Monomial v) where+ rnf (Monomial m) = rnf m++instance Degree (Monomial v) where+ deg (Monomial m) = sum $ Map.elems m++instance Ord v => Var (Monomial v) v where+ var x = Monomial $ Map.singleton x 1++instance Ord v => Vars (Monomial v) v where+ vars mm = Map.keysSet (mindicesMap mm)++instance Hashable v => Hashable (Monomial v) where+ hashWithSalt = hashUsing (Map.toList . mindicesMap)++mone :: Monomial v+mone = Monomial $ Map.empty++mfromIndices :: Ord v => [(v, Integer)] -> Monomial v+mfromIndices xs+ | any (\(_,e) -> 0>e) xs = error "ToySolver.Data.Polynomial.mfromIndices: negative exponent"+ | otherwise = Monomial $ Map.fromListWith (+) [(x,e) | (x,e) <- xs, e > 0]++mfromIndicesMap :: Ord v => Map v Integer -> Monomial v+mfromIndicesMap m+ | any (\(_,e) -> 0>e) (Map.toList m) = error "ToySolver.Data.Polynomial.mfromIndicesMap: negative exponent"+ | otherwise = mfromIndicesMap' m++mfromIndicesMap' :: Ord v => Map v Integer -> Monomial v+mfromIndicesMap' m = Monomial $ Map.filter (>0) m++mindices :: Ord v => Monomial v -> [(v, Integer)]+mindices = Map.toAscList . mindicesMap++mmult :: Ord v => Monomial v -> Monomial v -> Monomial v+mmult (Monomial xs1) (Monomial xs2) = mfromIndicesMap' $ Map.unionWith (+) xs1 xs2++mpow :: Ord v => Monomial v -> Integer -> Monomial v+mpow _ 0 = mone+mpow m 1 = m+mpow (Monomial xs) e+ | 0 > e = error "ToySolver.Data.Polynomial.mpow: negative exponent"+ | otherwise = Monomial $ Map.map (e*) xs++mdivides :: Ord v => Monomial v -> Monomial v -> Bool+mdivides (Monomial xs1) (Monomial xs2) = Map.isSubmapOfBy (<=) xs1 xs2++mdiv :: Ord v => Monomial v -> Monomial v -> Monomial v+mdiv (Monomial xs1) (Monomial xs2) = Monomial $ Map.differenceWith f xs1 xs2+ where+ f m n+ | m <= n = Nothing+ | otherwise = Just (m - n)++mderiv :: Ord v => Monomial v -> v -> (Integer, Monomial v)+mderiv (Monomial xs) x+ | n==0 = (0, mone)+ | otherwise = (n, Monomial $ Map.update f x xs)+ where+ n = Map.findWithDefault 0 x xs+ f m+ | m <= 1 = Nothing+ | otherwise = Just $! m - 1++mintegral :: Ord v => Monomial v -> v -> (Rational, Monomial v)+mintegral (Monomial xs) x =+ (1 % fromIntegral (n + 1), Monomial $ Map.insert x (n+1) xs)+ where+ n = Map.findWithDefault 0 x xs++mlcm :: Ord v => Monomial v -> Monomial v -> Monomial v+mlcm (Monomial m1) (Monomial m2) = Monomial $ Map.unionWith max m1 m2++mgcd :: Ord v => Monomial v -> Monomial v -> Monomial v+mgcd (Monomial m1) (Monomial m2) = Monomial $ Map.intersectionWith min m1 m2++mcoprime :: Ord v => Monomial v -> Monomial v -> Bool+mcoprime m1 m2 = mgcd m1 m2 == mone++{--------------------------------------------------------------------+ Monomial Order+--------------------------------------------------------------------}++type MonomialOrder v = Monomial v -> Monomial v -> Ordering++-- | Lexicographic order+lex :: Ord v => MonomialOrder v+lex xs1 xs2 = go (mindices xs1) (mindices xs2)+ where+ go [] [] = EQ+ go [] _ = LT -- = compare 0 n2+ go _ [] = GT -- = compare n1 0+ go ((x1,n1):xs1) ((x2,n2):xs2) =+ case compare x1 x2 of+ LT -> GT -- = compare n1 0+ GT -> LT -- = compare 0 n2+ EQ -> compare n1 n2 `mappend` go xs1 xs2++-- | Reverse lexicographic order.+-- +-- Note that revlex is /NOT/ a monomial order.+revlex :: Ord v => Monomial v -> Monomial v -> Ordering+revlex xs1 xs2 = go (Map.toDescList (mindicesMap xs1)) (Map.toDescList (mindicesMap xs2))+ where+ go [] [] = EQ+ go [] _ = GT -- = cmp 0 n2+ go _ [] = LT -- = cmp n1 0+ go ((x1,n1):xs1) ((x2,n2):xs2) =+ case compare x1 x2 of+ LT -> GT -- = cmp 0 n2+ GT -> LT -- = cmp n1 0+ EQ -> cmp n1 n2 `mappend` go xs1 xs2+ cmp n1 n2 = compare n2 n1++-- | Graded lexicographic order+grlex :: Ord v => MonomialOrder v+grlex = (compare `on` deg) `mappend` lex++-- | Graded reverse lexicographic order+grevlex :: Ord v => MonomialOrder v+grevlex = (compare `on` deg) `mappend` revlex++{--------------------------------------------------------------------+ Helper+--------------------------------------------------------------------}++#if !MIN_VERSION_hashable(1,2,0)+-- Copied from hashable-1.2.0.7:+-- Copyright : (c) Milan Straka 2010+-- (c) Johan Tibell 2011+-- (c) Bryan O'Sullivan 2011, 2012++-- | Transform a value into a 'Hashable' value, then hash the+-- transformed value using the given salt.+--+-- This is a useful shorthand in cases where a type can easily be+-- mapped to another type that is already an instance of 'Hashable'.+-- Example:+--+-- > data Foo = Foo | Bar+-- > deriving (Enum)+-- >+-- > instance Hashable Foo where+-- > hashWithSalt = hashUsing fromEnum+hashUsing :: (Hashable b) =>+ (a -> b) -- ^ Transformation function.+ -> Int -- ^ Salt.+ -> a -- ^ Value to transform.+ -> Int+hashUsing f salt x = hashWithSalt salt (f x)+{-# INLINE hashUsing #-}+#endif
+ src/ToySolver/Data/Polynomial/Factorization/FiniteField.hs view
@@ -0,0 +1,148 @@+{-# LANGUAGE ScopedTypeVariables, BangPatterns, TypeSynonymInstances, FlexibleInstances #-}+{-# OPTIONS_GHC -Wall #-}+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.Data.Polynomial.Factorization.FiniteField+-- Copyright : (c) Masahiro Sakai 2012-2013+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : provisional+-- Portability : non-portable (ScopedTypeVariables, BangPatterns, TypeSynonymInstances, FlexibleInstances)+--+-- Factoriation of polynomial over a finite field.+--+-- References:+--+-- * <http://en.wikipedia.org/wiki/Factorization_of_polynomials_over_a_finite_field_and_irreducibility_tests>+-- +-- * <http://en.wikipedia.org/wiki/Berlekamp%27s_algorithm>+--+-- * Martin Kreuzer and Lorenzo Robbiano. Computational Commutative Algebra 1. Springer Verlag, 2000.+--+-----------------------------------------------------------------------------+module ToySolver.Data.Polynomial.Factorization.FiniteField+ ( factor+ , sqfree+ , berlekamp+ , basisOfBerlekampSubalgebra+ ) where++import Control.Exception (assert)+import Data.FiniteField+import Data.Function (on)+import Data.List+import Data.Set (Set)+import qualified Data.Set as Set+import qualified TypeLevel.Number.Nat as TL++import ToySolver.Data.Polynomial.Base (Polynomial, UPolynomial, X (..))+import qualified ToySolver.Data.Polynomial.Base as P+import qualified ToySolver.Data.Polynomial.GroebnerBasis as GB++instance TL.Nat p => P.Factor (UPolynomial (PrimeField p)) where+ factor = factor++instance TL.Nat p => P.SQFree (UPolynomial (PrimeField p)) where+ sqfree = sqfree++factor :: forall k. (Ord k, FiniteField k) => UPolynomial k -> [(UPolynomial k, Integer)]+factor f = do+ (g,n) <- sqfree f+ if P.deg g > 0+ then do+ h <- berlekamp g+ return (h,n)+ else do+ return (g,n)++-- | Square-free decomposition of univariate polynomials over a finite field.+sqfree :: forall k. (Eq k, FiniteField k) => UPolynomial k -> [(UPolynomial k, Integer)]+sqfree f+ | c == 1 = sqfree' f+ | otherwise = (P.constant c, 1) : sqfree' (P.mapCoeff (/c) f)+ where+ c = P.lc P.nat f++sqfree' :: forall k. (Eq k, FiniteField k) => UPolynomial k -> [(UPolynomial k, Integer)]+sqfree' 0 = []+sqfree' f+ | g == 0 = [(h, n*p) | (h,n) <- sqfree' (polyPthRoot f)]+ | otherwise = go 1 c0 w0 []+ where+ p = char (undefined :: k)+ g = P.deriv f X+ c0 = P.gcd f g+ w0 = P.div f c0+ go !i c w !result+ | w == 1 =+ if c == 1+ then result+ else result ++ [(h, n*p) | (h,n) <- sqfree' (polyPthRoot c)]+ | otherwise = go (i+1) c' w' result'+ where+ y = P.gcd w c+ z = w `P.div` y + c' = c `P.div` y+ w' = y+ result' = [(z,i) | z /= 1] ++ result++polyPthRoot :: forall k. (Eq k, FiniteField k) => UPolynomial k -> UPolynomial k+polyPthRoot f = assert (P.deriv f X == 0) $+ P.fromTerms [(pthRoot c, g mm) | (c,mm) <- P.terms f]+ where+ p = char (undefined :: k)+ g mm = P.var X `P.mpow` (P.deg mm `div` p)++-- | Berlekamp algorithm for polynomial factorization.+--+-- Input polynomial is assumed to be monic and square-free.+berlekamp :: forall k. (Eq k, Ord k, FiniteField k) => UPolynomial k -> [UPolynomial k]+berlekamp f = go (Set.singleton f) basis+ where+ go :: Set (UPolynomial k) -> [UPolynomial k] -> [UPolynomial k]+ go _ [] = error $ "ToySolver.Data.Polynomial.Factorization.FiniteField.berlekamp: should not happen"+ go fs (b:bs)+ | Set.size fs == r = Set.toList fs+ | otherwise = go (Set.unions [func fi | fi <- Set.toList fs]) bs+ where+ func fi = Set.fromList $ hs2 ++ hs1+ where+ hs1 = [h | k <- allValues, let h = P.gcd fi (b - P.constant k), P.deg h > 0]+ hs2 = if P.deg g > 0 then [g] else []+ where+ g = fi `P.div` product hs1+ basis = basisOfBerlekampSubalgebra f+ r = length basis++basisOfBerlekampSubalgebra :: forall k. (Ord k, FiniteField k) => UPolynomial k -> [UPolynomial k]+basisOfBerlekampSubalgebra f =+ sortBy (flip compare `on` P.deg) $+ map (P.toMonic P.nat) $+ basis+ where+ q = order (undefined :: k)+ d = P.deg f+ x = P.var X++ qs :: [UPolynomial k]+ qs = [(x^(q*i)) `P.mod` f | i <- [0 .. d - 1]]++ gb :: [Polynomial k Int]+ gb = GB.basis P.grlex [p3 | (p3,_) <- P.terms p2]++ p1 :: Polynomial k Int+ p1 = sum [P.var i * (P.subst qi (\X -> P.var (-1)) - (P.var (-1) ^ i)) | (i, qi) <- zip [0..] qs]+ p2 :: UPolynomial (Polynomial k Int)+ p2 = P.toUPolynomialOf p1 (-1)++ es = [(i, P.reduce P.grlex (P.var i) gb) | i <- [0 .. fromIntegral d - 1]]+ vs1 = [i | (i, gi_def) <- es, gi_def == P.var i]+ vs2 = [(i, gi_def) | (i, gi_def) <- es, gi_def /= P.var i]++ basis :: [UPolynomial k]+ basis = [ x^i + sum [P.constant (P.eval (delta i) gj_def) * x^j | (j, gj_def) <- vs2] | i <- vs1 ]+ where+ delta i k+ | k==i = 1+ | otherwise = 0
+ src/ToySolver/Data/Polynomial/Factorization/Hensel.hs view
@@ -0,0 +1,22 @@+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.Data.Polynomial.Factorization.Hensel+-- Copyright : (c) Masahiro Sakai 2013-2014+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : provisional+-- Portability : portable+--+-- References:+--+-- * <http://www.math.kobe-u.ac.jp/Asir/ca.pdf>+-- +-- * <http://www14.in.tum.de/konferenzen/Jass07/courses/1/Bulwahn/Buhlwahn_Paper.pdf>+--+-----------------------------------------------------------------------------+module ToySolver.Data.Polynomial.Factorization.Hensel+ ( hensel+ ) where++import ToySolver.Data.Polynomial.Factorization.Hensel.Internal (hensel)
+ src/ToySolver/Data/Polynomial/Factorization/Hensel/Internal.hs view
@@ -0,0 +1,122 @@+{-# LANGUAGE ScopedTypeVariables, BangPatterns #-}+{-# OPTIONS_GHC -Wall #-}+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.Data.Polynomial.Factorization.Hensel.Internal+-- Copyright : (c) Masahiro Sakai 2013-2014+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : provisional+-- Portability : non-portable (ScopedTypeVariables, BangPatterns)+--+-- References:+--+-- * <http://www.math.kobe-u.ac.jp/Asir/ca.pdf>+-- +-- * <http://www14.in.tum.de/konferenzen/Jass07/courses/1/Bulwahn/Buhlwahn_Paper.pdf>+--+-----------------------------------------------------------------------------+module ToySolver.Data.Polynomial.Factorization.Hensel.Internal+ ( hensel+ , cabook_proposition_5_10+ , cabook_proposition_5_11+ ) where++import Control.Exception (assert)+import Data.FiniteField+import qualified TypeLevel.Number.Nat as TL++import ToySolver.Data.Polynomial.Base (UPolynomial)+import qualified ToySolver.Data.Polynomial.Base as P++-- import Text.PrettyPrint.HughesPJClass++hensel :: forall p. TL.Nat p => UPolynomial Integer -> [UPolynomial (PrimeField p)] -> Integer -> [UPolynomial Integer]+hensel f fs1 k+ | k <= 0 = error "ToySolver.Data.Polynomial.Factorization.Hensel.hensel: k <= 0"+ | otherwise = assert precondition $ go 1 (map (P.mapCoeff Data.FiniteField.toInteger) fs1)+ where+ precondition =+ P.mapCoeff fromInteger f == product fs1 && + P.deg f == P.deg (product fs1)++ p :: Integer+ p = TL.toInt (undefined :: p)++ go :: Integer -> [UPolynomial Integer] -> [UPolynomial Integer]+ go !i fs+ | i==k = assert (check i fs) $ fs+ | otherwise = assert (check i fs) $ go (i+1) (lift i fs)++ check :: Integer -> [UPolynomial Integer] -> Bool+ check k fs =+ and + [ P.mapCoeff (`mod` pk) f == P.mapCoeff (`mod` pk) (product fs)+ , fs1 == map (P.mapCoeff fromInteger) fs+ , and [P.deg fi1 == P.deg fik | (fi1, fik) <- zip fs1 fs]+ ]+ where+ pk = p ^ k++ lift :: Integer -> [UPolynomial Integer] -> [UPolynomial Integer]+ lift k fs = fs'+ where+ pk = p^k+ pk1 = p^(k+1)++ -- f ≡ product fs + p^k h (mod p^(k+1))+ h :: UPolynomial Integer+ h = P.mapCoeff (\c -> (c `mod` pk1) `div` pk) (f - product fs)++ hs :: [UPolynomial (PrimeField p)]+ hs = cabook_proposition_5_11 (map (P.mapCoeff fromInteger) fs) (P.mapCoeff fromInteger h)++ fs' :: [UPolynomial Integer]+ fs' = [ P.mapCoeff (`mod` pk1) (fi + P.constant pk * P.mapCoeff Data.FiniteField.toInteger hi)+ | (fi, hi) <- zip fs hs ]++-- http://www.math.kobe-u.ac.jp/Asir/ca.pdf+cabook_proposition_5_10+ :: forall k. (Num k, Fractional k, Eq k)+ => [UPolynomial k] -> [UPolynomial k]+cabook_proposition_5_10 fs = normalize (go fs)+ where+ check :: [UPolynomial k] -> [UPolynomial k] -> Bool+ check es fs = sum [ei * (product fs `P.div` fi) | (ei,fi) <- zip es fs] == 1++ go :: [UPolynomial k] -> [UPolynomial k]+ go [] = error "cabook_proposition_5_10: empty list"+ go [fi] = assert (check [1] [fi]) [1]+ go fs@(fi : fs') = + case P.exgcd (product fs') fi of+ (g,ei,v) ->+ assert (g == 1) $+ let es' = go fs'+ es = ei : map (v*) es'+ in assert (check es fs) es++ normalize :: [UPolynomial k] -> [UPolynomial k]+ normalize es = assert (check es2 fs) es2+ where+ es2 = zipWith P.mod es fs++-- http://www.math.kobe-u.ac.jp/Asir/ca.pdf+cabook_proposition_5_11+ :: forall k. (Num k, Fractional k, Eq k, P.PrettyCoeff k, Ord k)+ => [UPolynomial k] -> UPolynomial k -> [UPolynomial k]+cabook_proposition_5_11 fs g =+ assert (P.deg g <= P.deg (product fs)) $+ assert (P.deg c <= 0) $+ assert (check es2 fs g) $+ es2+ where+ es = map (g*) $ cabook_proposition_5_10 fs+ c = sum [ei `P.div` fi | (ei,fi) <- zip es fs]+ es2 = case zipWith P.mod es fs of+ e2' : es2' -> e2' + c * head fs : es2' ++ check :: [UPolynomial k] -> [UPolynomial k] -> UPolynomial k -> Bool+ check es fs g =+ sum [ei * (product fs `P.div` fi) | (ei,fi) <- zip es fs] == g &&+ and [P.deg ei <= P.deg fi | (ei,fi) <- zip es fs]
+ src/ToySolver/Data/Polynomial/Factorization/Integer.hs view
@@ -0,0 +1,20 @@+{-# LANGUAGE TypeSynonymInstances, FlexibleInstances #-}+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.Data.Polynomial.Factorization.Integer+-- Copyright : (c) Masahiro Sakai 2012-2013+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : provisional+-- Portability : non-portable (TypeSynonymInstances, FlexibleInstances)+--+-----------------------------------------------------------------------------+module ToySolver.Data.Polynomial.Factorization.Integer () where++-- import ToySolver.Data.Polynomial.Factorization.Kronecker+import qualified ToySolver.Data.Polynomial.Base as P+import ToySolver.Data.Polynomial.Factorization.Zassenhaus++instance P.Factor (P.UPolynomial Integer) where+ factor = factor
+ src/ToySolver/Data/Polynomial/Factorization/Kronecker.hs view
@@ -0,0 +1,133 @@+{-# LANGUAGE BangPatterns #-}+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.Data.Polynomial.Factorization.Kronecker+-- Copyright : (c) Masahiro Sakai 2012-2013+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : provisional+-- Portability : non-portable (BangPatterns)+--+-- Factoriation of integer-coefficient polynomial using Kronecker's method.+--+-- References:+--+-- * <http://en.wikipedia.org/wiki/Polynomial_factorization>+--+-----------------------------------------------------------------------------+module ToySolver.Data.Polynomial.Factorization.Kronecker+ ( factor+ ) where++import Data.List+import Data.MultiSet (MultiSet)+import qualified Data.MultiSet as MultiSet+import Data.Numbers.Primes (primes)+import Data.Ratio++import ToySolver.Data.Polynomial.Base (Polynomial, UPolynomial, X (..))+import qualified ToySolver.Data.Polynomial.Base as P+import qualified ToySolver.Data.Polynomial.Interpolation.Lagrange as Interpolation+import ToySolver.Internal.Util (isInteger)++factor :: UPolynomial Integer -> [(UPolynomial Integer, Integer)]+factor 0 = [(0,1)]+factor 1 = []+factor p | P.deg p == 0 = [(p,1)]+factor p = [(P.constant c, 1) | c /= 1] ++ [(q, fromIntegral m) | (q,m) <- MultiSet.toOccurList qs]+ where+ (c,qs) = normalize (P.cont p, factor' (P.pp p))++normalize :: (Integer, MultiSet (UPolynomial Integer)) -> (Integer, MultiSet (UPolynomial Integer))+normalize (c,ps) = go (MultiSet.toOccurList ps) c MultiSet.empty+ where+ go [] !c !qs = (c, qs)+ go ((p,m) : ps) !c !qs+ | P.deg p == 0 = go ps (c * (P.coeff (P.var X) p) ^ m) qs+ | P.lc P.nat p < 0 = go ps (c * (-1)^m) (MultiSet.insertMany (-p) m qs)+ | otherwise = go ps c (MultiSet.insertMany p m qs)++factor' :: UPolynomial Integer -> MultiSet (UPolynomial Integer)+factor' p = go (MultiSet.singleton p) MultiSet.empty+ where+ go ps ret+ | MultiSet.null ps = ret+ | otherwise =+ case factor2 p of+ Nothing ->+ go ps' (MultiSet.insertMany p m ret)+ Just (q1,q2) ->+ go (MultiSet.insertMany q1 m $ MultiSet.insertMany q2 m ps') ret+ where+ p = MultiSet.findMin ps+ m = MultiSet.occur p ps+ ps' = MultiSet.deleteAll p ps++factor2 :: UPolynomial Integer -> Maybe (UPolynomial Integer, UPolynomial Integer)+factor2 p | p == P.var X = Nothing+factor2 p =+ case find (\(_,yi) -> yi==0) vs of+ Just (xi,_) ->+ let q1 = x - P.constant xi+ q2 = p' `P.div` P.mapCoeff fromInteger q1+ in Just (q1, toZ q2)+ Nothing ->+ let qs = map Interpolation.interpolate $+ sequence [[(fromInteger xi, fromInteger z) | z <- factors yi] | (xi,yi) <- vs]+ zs = [ (q1,q2)+ | q1 <- qs, P.deg q1 > 0, isUPolyZ q1+ , let (q2,r) = p' `P.divMod` q1+ , r == 0, P.deg q2 > 0, isUPolyZ q2+ ]+ in case zs of+ [] -> Nothing+ (q1,q2):_ -> Just (toZ q1, toZ q2)+ where+ n = P.deg p `div` 2+ xs = take (fromIntegral n + 1) xvalues+ vs = [(x, P.eval (\X -> x) p) | x <- xs]+ x = P.var X+ p' :: UPolynomial Rational+ p' = P.mapCoeff fromInteger p++isUPolyZ :: UPolynomial Rational -> Bool+isUPolyZ p = and [isInteger c | (c,_) <- P.terms p]++toZ :: Ord v => Polynomial Rational v -> Polynomial Integer v+toZ = P.mapCoeff numerator . P.pp++-- [0, 1, -1, 2, -2, 3, -3 ..]+xvalues :: [Integer]+xvalues = 0 : interleave [1,2..] [-1,-2..]++interleave :: [a] -> [a] -> [a]+interleave xs [] = xs+interleave [] ys = ys+interleave (x:xs) ys = x : interleave ys xs++factors :: Integer -> [Integer]+factors 0 = []+factors x = xs ++ map negate xs+ where+ ps = primeFactors (abs x)+ xs = map product $ sequence [take (n+1) (iterate (p*) 1) | (p,n) <- MultiSet.toOccurList ps]++primeFactors :: Integer -> MultiSet Integer+primeFactors 0 = MultiSet.empty+primeFactors n = go n primes MultiSet.empty+ where+ go :: Integer -> [Integer] -> MultiSet Integer -> MultiSet Integer+ go 1 !_ !result = result+ go n (p:ps) !result+ | p*p > n = MultiSet.insert n result+ | otherwise =+ case f p n of+ (m,n') -> go n' ps (MultiSet.insertMany p m result)++ f :: Integer -> Integer -> (Int, Integer)+ f p = go2 0+ where+ go2 !m !n+ | n `mod` p == 0 = go2 (m+1) (n `div` p)+ | otherwise = (m, n)
+ src/ToySolver/Data/Polynomial/Factorization/Rational.hs view
@@ -0,0 +1,17 @@+{-# LANGUAGE TypeSynonymInstances, FlexibleInstances #-}+module ToySolver.Data.Polynomial.Factorization.Rational () where++import Data.List (foldl')+import Data.Ratio++import ToySolver.Data.Polynomial.Base (UPolynomial)+import qualified ToySolver.Data.Polynomial.Base as P+import ToySolver.Data.Polynomial.Factorization.Integer ()++instance P.Factor (UPolynomial Rational) where+ factor 0 = [(0,1)]+ factor p = [(P.constant c, 1) | c /= 1] ++ qs2+ where+ qs = P.factor $ P.mapCoeff numerator $ P.pp p+ qs2 = [(P.mapCoeff fromInteger q, m) | (q,m) <- qs, P.deg q > 0]+ c = toRational (product [(P.coeff P.mone q)^m | (q,m) <- qs, P.deg q == 0]) * P.cont p
+ src/ToySolver/Data/Polynomial/Factorization/SquareFree.hs view
@@ -0,0 +1,63 @@+{-# LANGUAGE BangPatterns, TypeSynonymInstances, FlexibleInstances #-}+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.Data.Polynomial.Factorization.SquareFree+-- Copyright : (c) Masahiro Sakai 2013+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : provisional+-- Portability : non-portable (BangPatterns, TypeSynonymInstances, FlexibleInstances)+--+-- References:+--+-- * <http://www.math.kobe-u.ac.jp/Asir/ca.pdf>+--+-----------------------------------------------------------------------------+module ToySolver.Data.Polynomial.Factorization.SquareFree+ ( sqfreeChar0+ ) where++import Control.Exception+import Data.Ratio++import ToySolver.Data.Polynomial.Base (UPolynomial, X (..))+import qualified ToySolver.Data.Polynomial.Base as P++-- | Square-free decomposition of univariate polynomials over a field of characteristic 0.+sqfreeChar0 :: (Eq k, Fractional k) => UPolynomial k -> [(UPolynomial k, Integer)]+sqfreeChar0 0 = []+sqfreeChar0 p = assert (product [q^m | (q,m) <- result] == p) $ result+ where+ result = go p (p `P.div` P.gcd p (P.deriv p X)) 0 []+ go p flat !m result+ | P.deg flat <= 0 = [(p,1) | p /= 1] ++ reverse result+ | otherwise = go p' flat' m' ((flat `P.div` flat', m') : result)+ where+ (p',n) = f p flat+ flat' = P.gcd p' flat+ m' = m + n++f :: (Eq k, Fractional k) => UPolynomial k -> UPolynomial k -> (UPolynomial k, Integer)+f p1 p2 = assert (p1 == p2 ^ m * q) $ result+ where+ result@(q, m) = go 0 p1+ go !m p =+ case p `P.divMod` p2 of+ (q, 0) -> go (m+1) q+ _ -> (p, m)+++instance P.SQFree (UPolynomial Rational) where+ sqfree = sqfreeChar0++instance P.SQFree (UPolynomial Integer) where+ sqfree 0 = [(0,1)]+ sqfree f = go 1 [] (P.sqfree (P.mapCoeff fromIntegral f))+ where+ go !u ys [] =+ assert (denominator u == 1) $+ [(P.constant (numerator u), 1) | u /= 1] ++ ys+ go !u ys ((g,n):xs)+ | P.deg g <= 0 = go (u * P.coeff P.mone g) ys xs+ | otherwise = go (u * (P.cont g)^n) ((P.mapCoeff numerator (P.pp g), n) : ys) xs
+ src/ToySolver/Data/Polynomial/Factorization/Zassenhaus.hs view
@@ -0,0 +1,149 @@+{-# LANGUAGE BangPatterns, ScopedTypeVariables #-}+{-# OPTIONS_GHC -Wall #-}+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.Data.Polynomial.Factorization.Zassenhaus+-- Copyright : (c) Masahiro Sakai 2012-2013+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : provisional+-- Portability : non-portable (BangPatterns, ScopedTypeVariables)+--+-- Factoriation of integer-coefficient polynomial using Zassenhaus algorithm.+--+-- References:+--+-- * <http://www.math.kobe-u.ac.jp/Asir/ca.pdf>+--+-----------------------------------------------------------------------------+module ToySolver.Data.Polynomial.Factorization.Zassenhaus+ ( factor+ , zassenhaus+ ) where++import Control.Monad+import Control.Monad.ST+import Control.Exception (assert)+import Data.List+import Data.Maybe+import Data.Numbers.Primes (primes)+import Data.Ratio+import Data.STRef++import ToySolver.Data.Polynomial.Base (UPolynomial)+import qualified ToySolver.Data.Polynomial.Base as P+import ToySolver.Data.Polynomial.Factorization.FiniteField ()+import ToySolver.Data.Polynomial.Factorization.SquareFree ()+import qualified ToySolver.Data.Polynomial.Factorization.Hensel as Hensel++import qualified TypeLevel.Number.Nat as TL+import Data.FiniteField++-- import Text.PrettyPrint.HughesPJClass++factor :: UPolynomial Integer -> [(UPolynomial Integer, Integer)]+factor f = [(h,n) | (g,n) <- P.sqfree f, h <- if P.deg g > 0 then zassenhaus g else return g]++zassenhaus :: UPolynomial Integer -> [UPolynomial Integer]+zassenhaus f = fromJust $ msum [TL.withNat zassenhausWithP p | p <- primes :: [Integer]]+ where+ zassenhausWithP :: forall p. TL.Nat p => p -> Maybe [UPolynomial Integer]+ zassenhausWithP _ = do+ let f_mod_p :: UPolynomial (PrimeField p)+ f_mod_p = P.mapCoeff fromInteger f+ guard $ P.deg f == P.deg f_mod_p -- 主係数を割り切らないことと同値+ guard $ P.isSquareFree f_mod_p+ let fs :: [UPolynomial (PrimeField p)]+ fs = [assert (n==1) fi | (fi,n) <- P.factor f_mod_p]+ return $ lift f fs++{-+Suppose @g@ is a factor of @f@.++From Landau-Mignotte inequality,+ @sum [abs c | (c,_) <- mapCoeff ((lc f / lc g) *) $ terms g] <= 2^(deg g) * norm2 f@ holds.++This together with @deg g <= deg f@ implies+ @all [- 2^(deg f) * norm2 f <= c <= 2^(deg f) * norm2 f | (c,_) <- terms ((lc f / lc g) * g)]@.++Choose smallest @k@ such that @p^k / 2 > 2^(deg f) * norm2 f@, so that+ @all [- (p^k)/2 < c < (p^k)/2 | (c,_) <- terms ((lc f / lc g) * g)]@.++Then it call @search@ to look for actual factorization.+-}+lift :: forall p. TL.Nat p => UPolynomial Integer -> [UPolynomial (PrimeField p)] -> [UPolynomial Integer]+lift f [_] = [f]+lift f fs = search pk f (Hensel.hensel f fs k)+ where+ p = char (undefined :: PrimeField p)+ k, pk :: Integer+ (k,pk) = head [(k,pk) | k <- [1,2..], let pk = p^k, pk^(2::Int) > (2^(P.deg f + 1))^(2::Int) * norm2sq f]++search :: Integer -> UPolynomial Integer -> [UPolynomial Integer] -> [UPolynomial Integer]+search pk f0 fs0 = runST $ do+ let a = P.lc P.nat f0+ m = length fs0++ fRef <- newSTRef f0+ fsRef <- newSTRef fs0+ retRef <- newSTRef []++ forM_ [1 .. m `div` 2] $ \l -> do+ fs <- readSTRef fsRef+ forM_ (comb fs l) $ \s -> do+ {-+ A factor @g@ of @f@ must satisfy @(lc f / lc g) * g ≡ product s (mod p^k)@ for some @s@.+ So we construct a candidate of @(lc f / lc g) * g@ from @product s@.+ -}+ let g0 = product s+ -- @g1@ is a candidate of @(lc f / lc g) * g@+ g1 :: UPolynomial Rational+ g1 = P.mapCoeff conv g0+ conv :: Integer -> Rational+ conv b = b3+ where+ b1 = (a % P.lc P.nat g0) * fromIntegral b+ -- @b1 ≡ b2 (mod p^k)@ and @0 <= b2 < p^k@+ b2 = b1 - (fromIntegral (floor (b1 / pk') :: Integer) * pk')+ -- @b1 ≡ b2 ≡ b3 (mod p^k)@ and @-(p^k)/2 <= b3 <= (p^k)/2@+ b3 = if pk'/2 < b2 then b2 - pk' else b2+ pk' = fromIntegral pk++ f <- readSTRef fRef+ let f1 = P.mapCoeff fromInteger f++ when (P.deg g1 > 0 && g1 `P.divides` f1) $ do+ let g2 = P.mapCoeff numerator $ P.pp g1+ -- we choose leading coefficient to be positive.+ g :: UPolynomial Integer+ g = if P.lc P.nat g2 < 0 then - g2 else g2+ writeSTRef fRef $! f `div'` g+ modifySTRef retRef (g :)+ modifySTRef fsRef (\\ s)++ f <- readSTRef fRef+ ret <- readSTRef retRef+ if f==1+ then return ret+ else return $ f : ret++-- |f|^2+norm2sq :: Num a => UPolynomial a -> a+norm2sq f = sum [c^(2::Int) | (c,_) <- P.terms f]++div' :: UPolynomial Integer -> UPolynomial Integer -> UPolynomial Integer+div' f1 f2 = assert (and [denominator c == 1 | (c,_) <- P.terms g3]) g4+ where+ g1, g2 :: UPolynomial Rational+ g1 = P.mapCoeff fromInteger f1+ g2 = P.mapCoeff fromInteger f2+ g3 = g1 `P.div` g2+ g4 = P.mapCoeff numerator g3++comb :: [a] -> Int -> [[a]]+comb _ 0 = [[]]+comb [] _ = []+comb (x:xs) n = [x:ys | ys <- comb xs (n-1)] ++ comb xs n++-- ---------------------------------------------------------------------------
+ src/ToySolver/Data/Polynomial/GroebnerBasis.hs view
@@ -0,0 +1,144 @@+{-# LANGUAGE ScopedTypeVariables #-}+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.Data.Polynomial.GroebnerBasis+-- Copyright : (c) Masahiro Sakai 2012-2013+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : provisional+-- Portability : non-portable (ScopedTypeVariables)+-- +-- Gröbner basis+--+-- References:+--+-- * Monomial order <http://en.wikipedia.org/wiki/Monomial_order>+-- +-- * Gröbner basis <http://en.wikipedia.org/wiki/Gr%C3%B6bner_basis>+--+-- * グレブナー基底 <http://d.hatena.ne.jp/keyword/%A5%B0%A5%EC%A5%D6%A5%CA%A1%BC%B4%F0%C4%EC>+--+-- * Gröbner Bases and Buchberger’s Algorithm <http://math.rice.edu/~cbruun/vigre/vigreHW6.pdf>+--+-- * Docon <http://www.haskell.org/docon/>+-- +-----------------------------------------------------------------------------++module ToySolver.Data.Polynomial.GroebnerBasis+ (+ -- * Options+ Options (..)+ , Strategy (..)+ , defaultOptions++ -- * Gröbner basis computation+ , basis+ , basis'+ , spolynomial+ , reduceGBasis+ ) where++import qualified Data.Set as Set+import qualified Data.Heap as H -- http://hackage.haskell.org/package/heaps+import ToySolver.Data.Polynomial.Base (Polynomial, Monomial, MonomialOrder)+import qualified ToySolver.Data.Polynomial.Base as P++data Options+ = Options+ { optStrategy :: Strategy+ }++defaultOptions :: Options+defaultOptions =+ Options+ { optStrategy = NormalStrategy+ }++data Strategy+ = NormalStrategy+ | SugarStrategy -- ^ sugar strategy (not implemented yet)+ deriving (Eq, Ord, Show, Read, Bounded, Enum)++spolynomial+ :: (Eq k, Fractional k, Ord v)+ => MonomialOrder v -> Polynomial k v -> Polynomial k v -> Polynomial k v+spolynomial cmp f g =+ P.fromTerm ((1,xs) `P.tdiv` lt1) * f+ - P.fromTerm ((1,xs) `P.tdiv` lt2) * g+ where+ xs = P.mlcm xs1 xs2+ lt1@(c1, xs1) = P.lt cmp f+ lt2@(c2, xs2) = P.lt cmp g++basis+ :: forall k v. (Eq k, Fractional k, Ord k, Ord v)+ => MonomialOrder v+ -> [Polynomial k v]+ -> [Polynomial k v]+basis = basis' defaultOptions++basis'+ :: forall k v. (Eq k, Fractional k, Ord k, Ord v)+ => Options+ -> MonomialOrder v+ -> [Polynomial k v]+ -> [Polynomial k v]+basis' opt cmp fs =+ reduceGBasis cmp $ go fs (H.fromList [item cmp fi fj | (fi,fj) <- pairs fs, checkGCD fi fj])+ where+ go :: [Polynomial k v] -> H.Heap (Item k v) -> [Polynomial k v]+ go gs h | H.null h = gs+ go gs h+ | r == 0 = go gs h'+ | otherwise = go (r:gs) (H.union h' (H.fromList [item cmp r g | g <- gs, checkGCD r g]))+ where+ Just (i, h') = H.viewMin h+ fi = iFst i+ fj = iSnd i+ spoly = spolynomial cmp fi fj+ r = P.reduce cmp spoly gs++ -- gcdが1となる組は選ばなくて良い+ checkGCD fi fj = not $ P.mcoprime (P.lm cmp fi) (P.lm cmp fj)++reduceGBasis+ :: forall k v. (Eq k, Ord k, Fractional k, Ord v)+ => MonomialOrder v -> [Polynomial k v] -> [Polynomial k v]+reduceGBasis cmp ps = Set.toList $ Set.fromList $ go ps []+ where+ go [] qs = qs+ go (p:ps) qs+ | q == 0 = go ps qs+ | otherwise = go ps (P.toMonic cmp q : qs)+ where+ q = P.reduce cmp p (ps++qs)++{--------------------------------------------------------------------+ Item+--------------------------------------------------------------------}++data Item k v+ = Item+ { iFst :: Polynomial k v+ , iSnd :: Polynomial k v+ , iCmp :: MonomialOrder v+ , iLCM :: Monomial v+ }++item :: (Eq k, Num k, Ord v) => MonomialOrder v -> Polynomial k v -> Polynomial k v -> Item k v+item cmp f g = Item f g cmp (P.mlcm (P.lm cmp f) (P.lm cmp g))++instance Ord v => Ord (Item k v) where+ a `compare` b = iCmp a (iLCM a) (iLCM b)++instance Ord v => Eq (Item k v) where+ a == b = compare a b == EQ++{--------------------------------------------------------------------+ Utilities+--------------------------------------------------------------------}++pairs :: [a] -> [(a,a)]+pairs [] = []+pairs (x:xs) = [(x,y) | y <- xs] ++ pairs xs
+ src/ToySolver/Data/Polynomial/Interpolation/Lagrange.hs view
@@ -0,0 +1,14 @@+-- http://en.wikipedia.org/wiki/Lagrange_polynomial+module ToySolver.Data.Polynomial.Interpolation.Lagrange+ ( interpolate+ ) where++import ToySolver.Data.Polynomial (UPolynomial, X (..))+import qualified ToySolver.Data.Polynomial as P++interpolate :: (Eq k, Fractional k) => [(k,k)] -> UPolynomial k+interpolate zs = sum $ do+ (xj,yj) <- zs+ let lj x = product [P.constant (1 / (xj - xm)) * (x - P.constant xm) | (xm,_) <- zs, xj /= xm]+ let x = P.var X+ return $ P.constant yj * lj x
+ src/ToySolver/Data/Var.hs view
@@ -0,0 +1,46 @@+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.Data.Var+-- Copyright : (c) Masahiro Sakai 2011-2013+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : provisional+-- Portability : portable+-- +-----------------------------------------------------------------------------+module ToySolver.Data.Var+ ( Var+ , VarSet+ , VarMap+ , Variables (..)+ , Model+ ) where++import Data.IntMap (IntMap)+import Data.IntSet (IntSet)+import qualified Data.IntSet as IntSet+import Data.Ratio++-- ---------------------------------------------------------------------------++-- | Variables are represented as non-negative integers+type Var = Int++-- | Set of variables+type VarSet = IntSet++-- | Map from variables+type VarMap = IntMap++-- | collecting free variables+class Variables a where+ vars :: a -> VarSet++instance Variables a => Variables [a] where+ vars = IntSet.unions . map vars++-- | A @Model@ is a map from variables to values.+type Model r = VarMap r++-- ---------------------------------------------------------------------------
+ src/ToySolver/Data/Vec.hs view
@@ -0,0 +1,210 @@+{-# LANGUAGE BangPatterns, FlexibleContexts, ScopedTypeVariables #-}+{-# OPTIONS_GHC -Wall #-}+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.Data.Vec+-- Copyright : (c) Masahiro Sakai 2014+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : provisional+-- Portability : non-portable (BangPatterns, FlexibleContexts, ScopedTypeVariables)+--+-- Simple 1-dimentional resizable array+--+-----------------------------------------------------------------------------+module ToySolver.Data.Vec+ (+ -- * Vec type+ GenericVec+ , Vec+ , UVec+ , Index++ -- * Constructors+ , new+ , clone++ -- * Operators+ , getSize+ , read+ , write+ , unsafeRead+ , unsafeWrite+ , resize+ , growTo+ , push+ , clear+ , getElems++ -- * Low-level operators+ , getArray+ , getCapacity+ , resizeCapacity+ ) where++import Prelude hiding (read)++import Control.Loop+import Control.Monad+import Data.Ix+import qualified Data.Array.Base as A+import qualified Data.Array.IO as A+import Data.IORef++newtype GenericVec a e = GenericVec (IORef (Int, a Index e))+ deriving Eq++type Vec e = GenericVec A.IOArray e+type UVec e = GenericVec A.IOUArray e++type Index = Int++new :: A.MArray a e IO => IO (GenericVec a e)+new = do+ a <- A.newArray_ (0,-1)+ ref <- newIORef (0,a)+ return $ GenericVec ref++{- INLINE getSize #-}+-- | Get the internal representation array+getSize :: A.MArray a e IO => GenericVec a e -> IO Int+getSize (GenericVec ref) = liftM fst $ readIORef ref++{-# SPECIALIZE read :: Vec e -> Int -> IO e #-}+{-# SPECIALIZE read :: UVec Int -> Int -> IO Int #-}+{-# SPECIALIZE read :: UVec Double -> Int -> IO Double #-}+{-# SPECIALIZE read :: UVec Bool -> Int -> IO Bool #-}+read :: A.MArray a e IO => GenericVec a e -> Int -> IO e+read !v !i = do+ a <- getArray v+ s <- getSize v+ if 0 <= i && i < s then+ A.unsafeRead a i+ else+ error $ "ToySolver.Data.Vec.read: index " ++ show i ++ " out of bounds"++{-# SPECIALIZE write :: Vec e -> Int -> e -> IO () #-}+{-# SPECIALIZE write :: UVec Int -> Int -> Int -> IO () #-}+{-# SPECIALIZE write :: UVec Double -> Int -> Double -> IO () #-}+{-# SPECIALIZE write :: UVec Bool -> Int -> Bool -> IO () #-}+write :: A.MArray a e IO => GenericVec a e -> Int -> e -> IO ()+write !v !i e = do+ a <- getArray v+ s <- getSize v+ if 0 <= i && i < s then+ A.unsafeWrite a i e+ else+ error $ "ToySolver.Data.Vec.write: index " ++ show i ++ " out of bounds"++{-# INLINE unsafeRead #-}+unsafeRead :: A.MArray a e IO => GenericVec a e -> Int -> IO e+unsafeRead !v !i = do+ a <- getArray v+ A.unsafeRead a i++{-# INLINE unsafeWrite #-}+unsafeWrite :: A.MArray a e IO => GenericVec a e -> Int -> e -> IO ()+unsafeWrite !v !i e = do+ a <- getArray v+ A.unsafeWrite a i e++{-# SPECIALIZE resize :: Vec e -> Int -> IO () #-}+{-# SPECIALIZE resize :: UVec Int -> Int -> IO () #-}+{-# SPECIALIZE resize :: UVec Double -> Int -> IO () #-}+{-# SPECIALIZE resize :: UVec Bool -> Int -> IO () #-}+resize :: A.MArray a e IO => GenericVec a e -> Int -> IO ()+resize v@(GenericVec ref) !n = do+ a <- getArray v+ capa <- getCapacity v+ if n <= capa then do+ writeIORef ref (n,a)+ else do+ let capa' = max 2 (capa * 3 `div` 2)+ a' <- A.newArray_ (0, capa'-1)+ copyTo a a' (0,capa-1)+ writeIORef ref (n,a')++{-# SPECIALIZE growTo :: Vec e -> Int -> IO () #-}+{-# SPECIALIZE growTo :: UVec Int -> Int -> IO () #-}+{-# SPECIALIZE growTo :: UVec Double -> Int -> IO () #-}+{-# SPECIALIZE growTo :: UVec Bool -> Int -> IO () #-}+growTo :: A.MArray a e IO => GenericVec a e -> Int -> IO ()+growTo v !n = do+ m <- getSize v+ when (m < n) $ resize v n ++{-# SPECIALIZE push :: Vec e -> e -> IO () #-}+{-# SPECIALIZE push :: UVec Int -> Int -> IO () #-}+{-# SPECIALIZE push :: UVec Double -> Double -> IO () #-}+{-# SPECIALIZE push :: UVec Bool -> Bool -> IO () #-}+push :: A.MArray a e IO => GenericVec a e -> e -> IO ()+push v e = do+ s <- getSize v+ resize v (s+1)+ unsafeWrite v s e++clear :: A.MArray a e IO => GenericVec a e -> IO ()+clear v = resize v 0++getElems :: A.MArray a e IO => GenericVec a e -> IO [e]+getElems v = do+ s <- getSize v+ forM [0..s-1] $ \i -> unsafeRead v i++{-# SPECIALIZE clone :: Vec e -> IO (Vec e) #-}+{-# SPECIALIZE clone :: UVec Int -> IO (UVec Int) #-}+{-# SPECIALIZE clone :: UVec Double -> IO (UVec Double) #-}+{-# SPECIALIZE clone :: UVec Bool -> IO (UVec Bool) #-}+clone :: A.MArray a e IO => GenericVec a e -> IO (GenericVec a e)+clone (GenericVec ref) = do+ (n,a) <- readIORef ref+ a' <- cloneArray a+ liftM GenericVec $ newIORef (n,a')++{--------------------------------------------------------------------++--------------------------------------------------------------------}++{-# INLINE getArray #-}+-- | Get the internal representation array+getArray :: GenericVec a e -> IO (a Index e)+getArray (GenericVec ref) = liftM snd $ readIORef ref++{-# INLINE getCapacity #-}+-- | Get the internal representation array+getCapacity :: A.MArray a e IO => GenericVec a e -> IO Int+getCapacity vec = liftM rangeSize $ A.getBounds =<< getArray vec++{-# SPECIALIZE resizeCapacity :: Vec e -> Int -> IO () #-}+{-# SPECIALIZE resizeCapacity :: UVec Int -> Int -> IO () #-}+{-# SPECIALIZE resizeCapacity :: UVec Double -> Int -> IO () #-}+{-# SPECIALIZE resizeCapacity :: UVec Bool -> Int -> IO () #-}+-- | Pre-allocate internal buffer for @n@ elements.+resizeCapacity :: A.MArray a e IO => GenericVec a e -> Int -> IO ()+resizeCapacity (GenericVec ref) capa = do+ (n,arr) <- readIORef ref+ capa0 <- liftM rangeSize $ A.getBounds arr+ when (capa0 < capa) $ do+ arr' <- A.newArray_ (0, capa-1)+ copyTo arr arr' (0, n-1)+ writeIORef ref (n,arr')++{--------------------------------------------------------------------+ utility+--------------------------------------------------------------------}++{-# INLINE cloneArray #-}+cloneArray :: (A.MArray a e m) => a Index e -> m (a Index e)+cloneArray arr = do+ b <- A.getBounds arr+ arr' <- A.newArray_ b+ copyTo arr arr' b+ return arr'++{-# INLINE copyTo #-}+copyTo :: (A.MArray a e m) => a Index e -> a Index e -> (Index,Index) -> m ()+copyTo fromArr toArr (!lb,!ub) = do+ forLoop lb (<=ub) (+1) $ \i -> do+ val_i <- A.unsafeRead fromArr i+ A.unsafeWrite toArr i val_i
+ src/ToySolver/FOLModelFinder.hs view
@@ -0,0 +1,555 @@+{-# LANGUAGE TypeSynonymInstances, FlexibleInstances, ScopedTypeVariables #-}+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.FOLModelFinder+-- Copyright : (c) Masahiro Sakai 2012+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : provisional+-- Portability : non-portable (TypeSynonymInstances, FlexibleInstances, ScopedTypeVariables)+--+-- A simple model finder.+--+-- References:+--+-- * Koen Claessen and Niklas Sörensson.+-- New Techniques that Improve MACE-style Finite Model Finding.+-- CADE-19. 2003.+-- <http://www.cs.miami.edu/~geoff/Conferences/CADE/Archive/CADE-19/WS4/04.pdf>+--+-----------------------------------------------------------------------------+module ToySolver.FOLModelFinder+ (+ -- * Formula types+ Var+ , FSym+ , PSym+ , GenLit (..)+ , Term (..)+ , Atom (..)+ , Lit+ , Clause+ , Formula+ , GenFormula (..)+ , toSkolemNF++ -- * Model types+ , Model (..)+ , Entity+ , showModel+ , showEntity++ -- * Main function+ , findModel+ ) where++import Control.Monad+import Control.Monad.State+import Data.Array.IArray+import Data.IORef+import Data.List+import Data.Maybe+import Data.Map (Map)+import qualified Data.Map as Map+import Data.Set (Set)+import qualified Data.Set as Set+import Text.Printf++import qualified ToySolver.SAT as SAT++-- ---------------------------------------------------------------------------++-- | Variable+type Var = String++-- | Function Symbol+type FSym = String++-- | Predicate Symbol+type PSym = String++class Vars a where+ vars :: a -> Set Var++instance Vars a => Vars [a] where+ vars = Set.unions . map vars++-- | Generalized literal type parameterized by atom type+data GenLit a+ = Pos a+ | Neg a+ deriving (Show, Eq, Ord)++instance Vars a => Vars (GenLit a) where+ vars (Pos a) = vars a+ vars (Neg a) = vars a++-- ---------------------------------------------------------------------------++-- | Term+data Term+ = TmApp FSym [Term]+ | TmVar Var+ deriving (Show, Eq, Ord)++data Atom = PApp PSym [Term]+ deriving (Show, Eq, Ord)++type Lit = GenLit Atom++type Clause = [Lit]++instance Vars Term where+ vars (TmVar v) = Set.singleton v+ vars (TmApp _ ts) = vars ts++instance Vars Atom where+ vars (PApp _ ts) = vars ts++-- ---------------------------------------------------------------------------++-- Formula type+type Formula = GenFormula Atom++-- Generalized formula parameterized by atom type+data GenFormula a+ = T+ | F+ | Atom a+ | And (GenFormula a) (GenFormula a)+ | Or (GenFormula a) (GenFormula a)+ | Not (GenFormula a)+ | Imply (GenFormula a) (GenFormula a)+ | Equiv (GenFormula a) (GenFormula a)+ | Forall Var (GenFormula a)+ | Exists Var (GenFormula a)+ deriving (Show, Eq, Ord)++instance Vars a => Vars (GenFormula a) where+ vars T = Set.empty+ vars F = Set.empty+ vars (Atom a) = vars a+ vars (And phi psi) = vars phi `Set.union` vars psi+ vars (Or phi psi) = vars phi `Set.union` vars psi+ vars (Not phi) = vars phi+ vars (Imply phi psi) = vars phi `Set.union` vars psi+ vars (Equiv phi psi) = vars phi `Set.union` vars psi+ vars (Forall v phi) = Set.delete v (vars phi)+ vars (Exists v phi) = Set.delete v (vars phi)++toNNF :: Formula -> Formula+toNNF = f+ where + f (And phi psi) = f phi `And` f psi+ f (Or phi psi) = f phi `Or` f psi+ f (Not phi) = g phi+ f (Imply phi psi) = g phi `Or` f psi+ f (Equiv phi psi) = f (And (Imply phi psi) (Imply psi phi))+ f (Forall v phi) = Forall v (f phi)+ f (Exists v phi) = Exists v (f phi)+ f phi = phi++ g :: Formula -> Formula+ g T = F+ g F = T+ g (And phi psi) = g phi `Or` g psi+ g (Or phi psi) = g phi `And` g psi+ g (Not phi) = f phi+ g (Imply phi psi) = f phi `And` g psi+ g (Equiv phi psi) = g (And (Imply phi psi) (Imply psi phi))+ g (Forall v phi) = Exists v (g phi)+ g (Exists v phi) = Forall v (g phi)+ g (Atom a) = Not (Atom a)++-- | normalize a formula into a skolem normal form.+-- +-- TODO:+-- +-- * Tseitin encoding+toSkolemNF :: forall m. Monad m => (String -> Int -> m FSym) -> Formula -> m [Clause]+toSkolemNF skolem phi = f [] Map.empty (toNNF phi)+ where+ f :: [Var] -> Map Var Term -> Formula -> m [Clause]+ f _ _ T = return []+ f _ _ F = return [[]]+ f _ s (Atom a) = return [[Pos (substAtom s a)]]+ f _ s (Not (Atom a)) = return [[Neg (substAtom s a)]]+ f uvs s (And phi psi) = do+ phi' <- f uvs s phi+ psi' <- f uvs s psi+ return $ phi' ++ psi'+ f uvs s (Or phi psi) = do+ phi' <- f uvs s phi+ psi' <- f uvs s psi+ return $ [c1++c2 | c1 <- phi', c2 <- psi']+ f uvs s psi@(Forall v phi) = do+ let v' = gensym v (vars psi `Set.union` Set.fromList uvs)+ f (v' : uvs) (Map.insert v (TmVar v') s) phi+ f uvs s (Exists v phi) = do+ fsym <- skolem v (length uvs)+ f uvs (Map.insert v (TmApp fsym [TmVar v | v <- reverse uvs]) s) phi+ f _ _ _ = error "ToySolver.FOLModelFinder.toSkolemNF: should not happen"++ gensym :: String -> Set Var -> Var+ gensym template vs = head [name | name <- names, Set.notMember name vs]+ where+ names = template : [template ++ show n | n <-[1..]]++ substAtom :: Map Var Term -> Atom -> Atom+ substAtom s (PApp p ts) = PApp p (map (substTerm s) ts)++ substTerm :: Map Var Term -> Term -> Term+ substTerm s (TmVar v) = fromMaybe (TmVar v) (Map.lookup v s)+ substTerm s (TmApp f ts) = TmApp f (map (substTerm s) ts)++test_toSkolemNF = do+ ref <- newIORef 0+ let skolem name _ = do+ n <- readIORef ref+ let fsym = name ++ "#" ++ show n+ writeIORef ref (n+1)+ return fsym++ -- ∀x. animal(a) → (∃y. heart(y) ∧ has(x,y))+ let phi = Forall "x" $+ Imply+ (Atom (PApp "animal" [TmVar "x"]))+ (Exists "y" $+ And (Atom (PApp "heart" [TmVar "y"]))+ (Atom (PApp "has" [TmVar "x", TmVar "y"])))++ phi' <- toSkolemNF skolem phi++ print phi'+{-+[[Neg (PApp "animal" [TmVar "x"]),Pos (PApp "heart" [TmApp "y#0" [TmVar "x"]])],[Neg (PApp "animal" [TmVar "x"]),Pos (PApp "has" [TmVar "x",TmApp "y#0" [TmVar "x"]])]]++{¬animal(x) ∨ heart(y#1(x)), ¬animal(x) ∨ has(x1, y#0(x))}+-}++-- ---------------------------------------------------------------------------++-- | Shallow term+data SGenTerm v+ = STmApp FSym [v]+ | STmVar v+ deriving (Show, Eq, Ord)++-- | Shallow atom+data SGenAtom v+ = SPApp PSym [v]+ | SEq (SGenTerm v) v+ deriving (Show, Eq, Ord)++type STerm = SGenTerm Var+type SAtom = SGenAtom Var+type SLit = GenLit SAtom+type SClause = [SLit]++instance Vars STerm where+ vars (STmApp _ xs) = Set.fromList xs+ vars (STmVar v) = Set.singleton v++instance Vars SAtom where+ vars (SPApp _ xs) = Set.fromList xs+ vars (SEq t v) = Set.insert v (vars t)++-- ---------------------------------------------------------------------------++type M = State (Set Var, Int, [SLit])++flatten :: Clause -> SClause+flatten c =+ case runState (mapM flattenLit c) (vars c, 0, []) of+ (c, (_,_,ls)) -> removeNegEq $ ls ++ c+ where+ gensym :: M Var+ gensym = do+ (vs, n, ls) <- get+ let go m = do+ let v = "#" ++ show m+ if v `Set.member` vs+ then go (m+1)+ else do+ put (Set.insert v vs, m+1, ls)+ return v+ go n++ flattenLit :: Lit -> M SLit+ flattenLit (Pos a) = liftM Pos $ flattenAtom a+ flattenLit (Neg a) = liftM Neg $ flattenAtom a+ + flattenAtom :: Atom -> M SAtom+ flattenAtom (PApp "=" [TmVar x, TmVar y]) = return $ SEq (STmVar x) y+ flattenAtom (PApp "=" [TmVar x, TmApp f ts]) = do+ xs <- mapM flattenTerm ts+ return $ SEq (STmApp f xs) x+ flattenAtom (PApp "=" [TmApp f ts, TmVar x]) = do+ xs <- mapM flattenTerm ts+ return $ SEq (STmApp f xs) x+ flattenAtom (PApp "=" [TmApp f ts, t2]) = do+ xs <- mapM flattenTerm ts+ x <- flattenTerm t2+ return $ SEq (STmApp f xs) x+ flattenAtom (PApp p ts) = do+ xs <- mapM flattenTerm ts+ return $ SPApp p xs+ + flattenTerm :: Term -> M Var+ flattenTerm (TmVar x) = return x+ flattenTerm (TmApp f ts) = do+ xs <- mapM flattenTerm ts+ x <- gensym+ (vs, n, ls) <- get+ put (vs, n, Neg (SEq (STmApp f xs) x) : ls)+ return x++ removeNegEq :: SClause -> SClause+ removeNegEq = go []+ where+ go r [] = r+ go r (Neg (SEq (STmVar x) y) : ls) = go (map (substLit x y) r) (map (substLit x y) ls)+ go r (l : ls) = go (l : r) ls++ substLit :: Var -> Var -> SLit -> SLit+ substLit x y (Pos a) = Pos $ substAtom x y a + substLit x y (Neg a) = Neg $ substAtom x y a++ substAtom :: Var -> Var -> SAtom -> SAtom+ substAtom x y (SPApp p xs) = SPApp p (map (substVar x y) xs)+ substAtom x y (SEq t v) = SEq (substTerm x y t) (substVar x y v)++ substTerm :: Var -> Var -> STerm -> STerm+ substTerm x y (STmApp f xs) = STmApp f (map (substVar x y) xs)+ substTerm x y (STmVar v) = STmVar (substVar x y v)++ substVar :: Var -> Var -> Var -> Var+ substVar x y v+ | v==x = y+ | otherwise = v++test_flatten = flatten [Pos $ PApp "P" [TmApp "a" [], TmApp "f" [TmVar "x"]]]++{-+[Pos $ PApp "P" [TmApp "a" [], TmApp "f" [TmVar "x"]]]++P(a, f(x))++[Pos (SPApp "P" ["#0","#1"]),Neg (SEq (STmApp "a" []) "#0"),Neg (SEq (STmApp "f" ["x"]) "#1")]++f(x) ≠ z ∨ a ≠ y ∨ P(y,z)+(f(x) = z ∧ a = y) → P(y,z)+-}++-- ---------------------------------------------------------------------------++-- | Element of model.+type Entity = Int++-- | print entity+showEntity :: Entity -> String+showEntity e = "$" ++ show e++showEntityTuple :: [Entity] -> String+showEntityTuple xs = printf "(%s)" $ intercalate ", " $ map showEntity xs++-- ---------------------------------------------------------------------------++type GroundTerm = SGenTerm Entity+type GroundAtom = SGenAtom Entity+type GroundLit = GenLit GroundAtom+type GroundClause = [GroundLit]++type Subst = Map Var Entity++enumSubst :: Set Var -> [Entity] -> [Subst]+enumSubst vs univ = do+ ps <- sequence [[(v,e) | e <- univ] | v <- Set.toList vs]+ return $ Map.fromList ps++applySubst :: Subst -> SClause -> GroundClause+applySubst s = map substLit+ where+ substLit :: SLit -> GroundLit+ substLit (Pos a) = Pos $ substAtom a+ substLit (Neg a) = Neg $ substAtom a++ substAtom :: SAtom -> GroundAtom+ substAtom (SPApp p xs) = SPApp p (map substVar xs)+ substAtom (SEq t v) = SEq (substTerm t) (substVar v)++ substTerm :: STerm -> GroundTerm+ substTerm (STmApp f xs) = STmApp f (map substVar xs)+ substTerm (STmVar v) = STmVar (substVar v)++ substVar :: Var -> Entity+ substVar = (s Map.!)++simplifyGroundClause :: GroundClause -> Maybe GroundClause+simplifyGroundClause = liftM concat . mapM f+ where+ f :: GroundLit -> Maybe [GroundLit]+ f (Pos (SEq (STmVar x) y)) = if x==y then Nothing else return []+ f lit = return [lit]++collectFSym :: SClause -> Set (FSym, Int)+collectFSym = Set.unions . map f+ where+ f :: SLit -> Set (FSym, Int)+ f (Pos a) = g a+ f (Neg a) = g a++ g :: SAtom -> Set (FSym, Int)+ g (SEq (STmApp f xs) _) = Set.singleton (f, length xs)+ g _ = Set.empty++collectPSym :: SClause -> Set (PSym, Int)+collectPSym = Set.unions . map f+ where+ f :: SLit -> Set (PSym, Int)+ f (Pos a) = g a+ f (Neg a) = g a++ g :: SAtom -> Set (PSym, Int)+ g (SPApp p xs) = Set.singleton (p, length xs)+ g _ = Set.empty++-- ---------------------------------------------------------------------------++data Model+ = Model+ { mUniverse :: [Entity]+ , mRelations :: Map PSym [[Entity]]+ , mFunctions :: Map FSym [([Entity], Entity)]+ }++showModel :: Model -> [String]+showModel m = + printf "DOMAIN = {%s}" (intercalate ", " (map showEntity (mUniverse m))) :+ [ printf "%s = { %s }" p s+ | (p, xss) <- Map.toList (mRelations m)+ , let s = intercalate ", " [if length xs == 1 then showEntity (head xs) else showEntityTuple xs | xs <- xss]+ ] +++ [ printf "%s%s = %s" f (if length xs == 0 then "" else showEntityTuple xs) (showEntity y)+ | (f, xss) <- Map.toList (mFunctions m)+ , (xs, y) <- xss+ ]++-- ---------------------------------------------------------------------------++findModel :: Int -> [Clause] -> IO (Maybe Model)+findModel size cs = do+ let univ = [0..size-1]++ let cs2 = map flatten cs+ fs = Set.unions $ map collectFSym cs2+ ps = Set.unions $ map collectPSym cs2++ solver <- SAT.newSolver++ ref <- newIORef Map.empty++ let translateAtom :: GroundAtom -> IO SAT.Var+ translateAtom (SEq (STmVar _) _) = error "should not happen"+ translateAtom a = do+ m <- readIORef ref+ case Map.lookup a m of+ Just b -> return b+ Nothing -> do+ b <- SAT.newVar solver+ writeIORef ref (Map.insert a b m)+ return b++ translateLit :: GroundLit -> IO SAT.Lit+ translateLit (Pos a) = translateAtom a+ translateLit (Neg a) = liftM negate $ translateAtom a++ translateClause :: GroundClause -> IO SAT.Clause+ translateClause = mapM translateLit++ -- Instances+ forM_ cs2 $ \c -> do+ forM_ (enumSubst (vars c) univ) $ \s -> do+ case simplifyGroundClause (applySubst s c) of+ Nothing -> return ()+ Just c' -> SAT.addClause solver =<< translateClause c'++ -- Functional definitions+ forM_ (Set.toList fs) $ \(f, arity) -> do+ forM_ (replicateM arity univ) $ \args ->+ forM_ [(y1,y2) | y1 <- univ, y2 <- univ, y1 < y2] $ \(y1,y2) -> do+ let c = [Neg (SEq (STmApp f args) y1), Neg (SEq (STmApp f args) y2)]+ c' <- translateClause c+ SAT.addClause solver c'++ -- Totality definitions+ forM_ (Set.toList fs) $ \(f, arity) -> do+ forM_ (replicateM arity univ) $ \args -> do+ let c = [Pos (SEq (STmApp f args) y) | y <- univ]+ c' <- translateClause c+ SAT.addClause solver c'++ ret <- SAT.solve solver+ if ret+ then do+ bmodel <- SAT.model solver+ m <- readIORef ref++ let rels = Map.fromList $ do+ (p,_) <- Set.toList ps+ let tbl = sort [xs | (SPApp p' xs, b) <- Map.toList m, p == p', bmodel ! b]+ return (p, tbl)+ let funs = Map.fromList $ do+ (f,_) <- Set.toList fs+ let tbl = sort [(xs, y) | (SEq (STmApp f' xs) y, b) <- Map.toList m, f == f', bmodel ! b]+ return (f, tbl)++ let model = Model+ { mUniverse = univ+ , mRelations = rels+ , mFunctions = funs+ }++ return (Just model)+ else do+ return Nothing++-- ---------------------------------------------------------------------------++{-+∀x. ∃y. x≠y && f(y)=x+∀x. x≠g(x) ∧ f(g(x))=x+-}++test = do+ let c1 = [Pos $ PApp "=" [TmApp "f" [TmApp "g" [TmVar "x"]], TmVar "x"]]+ c2 = [Neg $ PApp "=" [TmVar "x", TmApp "g" [TmVar "x"]]]+ ret <- findModel 3 [c1, c2]+ case ret of+ Nothing -> putStrLn "=== NO MODEL FOUND ==="+ Just m -> do+ putStrLn "=== A MODEL FOUND ==="+ mapM_ putStrLn $ showModel m++test2 = do+ let phi = Forall "x" $ Exists "y" $+ And (Not (Atom (PApp "=" [TmVar "x", TmVar "y"])))+ (Atom (PApp "=" [TmApp "f" [TmVar "y"], TmVar "x"]))++ ref <- newIORef 0+ let skolem name _ = do+ n <- readIORef ref+ let fsym = name ++ "#" ++ show n+ writeIORef ref (n+1)+ return fsym+ cs <- toSkolemNF skolem phi++ ret <- findModel 3 cs+ case ret of+ Nothing -> putStrLn "=== NO MODEL FOUND ==="+ Just m -> do+ putStrLn "=== A MODEL FOUND ==="+ mapM_ putStrLn $ showModel m++-- ---------------------------------------------------------------------------
+ src/ToySolver/FourierMotzkin.hs view
@@ -0,0 +1,29 @@+{-# OPTIONS_GHC -Wall #-}+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.FourierMotzkin+-- Copyright : (c) Masahiro Sakai 2011-2013+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : provisional+-- Portability : portable+--+-- Naïve implementation of Fourier-Motzkin Variable Elimination+-- +-- Reference:+--+-- * <http://users.cecs.anu.edu.au/~michaeln/pubs/arithmetic-dps.pdf>+--+-----------------------------------------------------------------------------+module ToySolver.FourierMotzkin+ ( Lit (..)+ , project+ , projectN+ , eliminateQuantifiers+ , solveFormula+ , solve+ ) where++import ToySolver.FourierMotzkin.Core+import ToySolver.FourierMotzkin.FOL
+ src/ToySolver/FourierMotzkin/Core.hs view
@@ -0,0 +1,237 @@+{-# OPTIONS_GHC -Wall #-}+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.FourierMotzkin.Core+-- Copyright : (c) Masahiro Sakai 2011-2013+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : provisional+-- Portability : portable+--+-- Naïve implementation of Fourier-Motzkin Variable Elimination+-- +-- Reference:+--+-- * <http://users.cecs.anu.edu.au/~michaeln/pubs/arithmetic-dps.pdf>+--+-----------------------------------------------------------------------------+module ToySolver.FourierMotzkin.Core+ ( ExprZ+ , Rat+ , toRat+ , fromRat++ , Lit (..)+ , leR, ltR, geR, gtR+ , simplify++ , fromLAAtom+ , toLAAtom+ , constraintsToDNF++ , BoundsR+ , collectBounds+ , boundsToLits+ , evalBounds++ , project+ , project'+ , projectN+ , projectN'+ , solve+ , solve'+ ) where++import Control.Monad+import Data.List+import Data.Maybe+import Data.Ratio+import qualified Data.IntMap as IM+import qualified Data.IntSet as IS+import Data.VectorSpace hiding (project)+import qualified Data.Interval as Interval+import Data.Interval (Interval, EndPoint (..), (<=..<), (<..<=), (<..<))++import ToySolver.Data.ArithRel+import ToySolver.Data.Boolean+import ToySolver.Data.DNF+import qualified ToySolver.Data.LA as LA+import ToySolver.Data.Var++-- ---------------------------------------------------------------------------++type ExprZ = LA.Expr Integer++normalizeExprR :: ExprZ -> ExprZ+normalizeExprR e = LA.mapCoeff (`div` d) e+ where d = abs $ gcd' $ map fst $ LA.terms e++-- ---------------------------------------------------------------------------++-- | (t,c) represents t/c, and c must be >0.+type Rat = (ExprZ, Integer)++toRat :: LA.Expr Rational -> Rat+toRat e = seq m $ (LA.mapCoeff f e, m)+ where+ f x = numerator (fromInteger m * x)+ m = foldl' lcm 1 [denominator c | (c,_) <- LA.terms e]++fromRat :: Rat -> LA.Expr Rational+fromRat (e,c) = LA.mapCoeff (% c) e++evalRat :: Model Rational -> Rat -> Rational+evalRat model (e, d) = LA.lift1 1 (model IM.!) (LA.mapCoeff fromIntegral e) / (fromIntegral d)++-- ---------------------------------------------------------------------------++-- | Literal+data Lit = Nonneg ExprZ | Pos ExprZ deriving (Show, Eq, Ord)++instance Variables Lit where+ vars (Pos t) = vars t+ vars (Nonneg t) = vars t++instance Complement Lit where+ notB (Pos t) = Nonneg (negateV t)+ notB (Nonneg t) = Pos (negateV t)++leR, ltR, geR, gtR :: Rat -> Rat -> Lit+leR (e1,c) (e2,d) = Nonneg $ normalizeExprR $ c *^ e2 ^-^ d *^ e1+ltR (e1,c) (e2,d) = Pos $ normalizeExprR $ c *^ e2 ^-^ d *^ e1+geR = flip leR+gtR = flip gtR++-- 制約集合の単純化+-- It returns Nothing when a inconsistency is detected.+simplify :: [Lit] -> Maybe [Lit]+simplify = fmap concat . mapM f+ where+ f :: Lit -> Maybe [Lit]+ f lit@(Pos e) =+ case LA.asConst e of+ Just x -> guard (x > 0) >> return []+ Nothing -> return [lit]+ f lit@(Nonneg e) =+ case LA.asConst e of+ Just x -> guard (x >= 0) >> return []+ Nothing -> return [lit]++-- ---------------------------------------------------------------------------++fromLAAtom :: LA.Atom Rational -> DNF Lit+fromLAAtom (Rel a op b) = atomR' op (toRat a) (toRat b)++toLAAtom :: Lit -> LA.Atom Rational+toLAAtom (Nonneg e) = LA.mapCoeff fromInteger e .>=. LA.constant 0+toLAAtom (Pos e) = LA.mapCoeff fromInteger e .>. LA.constant 0++constraintsToDNF :: [LA.Atom Rational] -> DNF Lit+constraintsToDNF = andB . map fromLAAtom++atomR' :: RelOp -> Rat -> Rat -> DNF Lit+atomR' op a b = + case op of+ Le -> DNF [[a `leR` b]]+ Lt -> DNF [[a `ltR` b]]+ Ge -> DNF [[a `geR` b]]+ Gt -> DNF [[a `gtR` b]]+ Eql -> DNF [[a `leR` b, a `geR` b]]+ NEq -> DNF [[a `ltR` b], [a `gtR` b]]++-- ---------------------------------------------------------------------------++{-+(ls1,ls2,us1,us2) represents+{ x | ∀(M,c)∈ls1. M/c≤x, ∀(M,c)∈ls2. M/c<x, ∀(M,c)∈us1. x≤M/c, ∀(M,c)∈us2. x<M/c }+-}+type BoundsR = ([Rat], [Rat], [Rat], [Rat])++project :: Var -> [LA.Atom Rational] -> [([LA.Atom Rational], Model Rational -> Model Rational)]+project v xs = do+ ys <- unDNF $ constraintsToDNF xs+ (zs, mt) <- maybeToList $ project' v ys+ return (map toLAAtom zs, mt)++project' :: Var -> [Lit] -> Maybe ([Lit], Model Rational -> Model Rational)+project' v xs = do+ case collectBounds v xs of+ (bnd, rest) -> do+ cond <- boundsToLits bnd+ let mt m =+ case Interval.pickup (evalBounds m bnd) of+ Nothing -> error "ToySolver.FourierMotzkin.project': should not happen"+ Just val -> IM.insert v val m+ return (rest ++ cond, mt)++projectN :: VarSet -> [LA.Atom Rational] -> [([LA.Atom Rational], Model Rational -> Model Rational)]+projectN vs xs = do+ ys <- unDNF $ constraintsToDNF xs+ (zs, mt) <- maybeToList $ projectN' vs ys+ return (map toLAAtom zs, mt)++projectN' :: VarSet -> [Lit] -> Maybe ([Lit], Model Rational -> Model Rational)+projectN' vs2 xs2 = do+ (zs, mt) <- f (IS.toList vs2) xs2+ return (zs, mt)+ where+ f [] xs = return (xs, id)+ f (v:vs) xs = do+ (ys, mt1) <- project' v xs+ (zs, mt2) <- f vs ys+ return (zs, mt1 . mt2)++collectBounds :: Var -> [Lit] -> (BoundsR, [Lit])+collectBounds v = foldr phi (([],[],[],[]),[])+ where+ phi :: Lit -> (BoundsR, [Lit]) -> (BoundsR, [Lit])+ phi lit@(Nonneg t) x = f False lit t x+ phi lit@(Pos t) x = f True lit t x++ f :: Bool -> Lit -> ExprZ -> (BoundsR, [Lit]) -> (BoundsR, [Lit])+ f strict lit t (bnd@(ls1,ls2,us1,us2), xs) =+ case LA.extract v t of+ (c,t') ->+ case c `compare` 0 of+ EQ -> (bnd, lit : xs)+ GT ->+ if strict+ then ((ls1, (negateV t', c) : ls2, us1, us2), xs) -- 0 < cx + M ⇔ -M/c < x+ else (((negateV t', c) : ls1, ls2, us1, us2), xs) -- 0 ≤ cx + M ⇔ -M/c ≤ x+ LT ->+ if strict+ then ((ls1, ls2, us1, (t', negate c) : us2), xs) -- 0 < cx + M ⇔ x < M/-c+ else ((ls1, ls2, (t', negate c) : us1, us2), xs) -- 0 ≤ cx + M ⇔ x ≤ M/-c++boundsToLits :: BoundsR -> Maybe [Lit]+boundsToLits (ls1, ls2, us1, us2) = simplify $ + [ x `leR` y | x <- ls1, y <- us1 ] +++ [ x `ltR` y | x <- ls1, y <- us2 ] ++ + [ x `ltR` y | x <- ls2, y <- us1 ] +++ [ x `ltR` y | x <- ls2, y <- us2 ]++solve :: VarSet -> [LA.Atom Rational] -> Maybe (Model Rational)+solve vs cs = msum [solve' vs cs2 | cs2 <- unDNF (constraintsToDNF cs)]++solve' :: VarSet -> [Lit] -> Maybe (Model Rational)+solve' vs cs = do+ (ys,mt) <- projectN' vs =<< simplify cs+ guard $ Just [] == simplify ys+ return $ mt IM.empty++evalBounds :: Model Rational -> BoundsR -> Interval Rational+evalBounds model (ls1,ls2,us1,us2) =+ Interval.intersections $+ [ Finite (evalRat model x) <=..< PosInf | x <- ls1 ] +++ [ Finite (evalRat model x) <..< PosInf | x <- ls2 ] +++ [ NegInf <..<= Finite (evalRat model x) | x <- us1 ] +++ [ NegInf <..< Finite (evalRat model x) | x <- us2 ]++-- ---------------------------------------------------------------------------++gcd' :: [Integer] -> Integer+gcd' [] = 1+gcd' xs = foldl1' gcd xs++-- ---------------------------------------------------------------------------
+ src/ToySolver/FourierMotzkin/FOL.hs view
@@ -0,0 +1,59 @@+{-# OPTIONS_GHC -Wall #-}+module ToySolver.FourierMotzkin.FOL+ ( solveFormula+ , eliminateQuantifiers+ , eliminateQuantifiers'+ )+ where++import Control.Monad+import qualified Data.IntSet as IS+import Data.Maybe++import ToySolver.Data.ArithRel+import ToySolver.Data.Boolean+import ToySolver.Data.DNF+import qualified ToySolver.Data.FOL.Arith as FOL+import qualified ToySolver.Data.LA.FOL as LAFOL+import ToySolver.Data.Var++import ToySolver.FourierMotzkin.Core++-- ---------------------------------------------------------------------------++solveFormula :: [Var] -> FOL.Formula (FOL.Atom Rational) -> FOL.SatResult Rational+solveFormula vs formula =+ case eliminateQuantifiers' formula of+ Nothing -> FOL.Unknown+ Just dnf ->+ case msum [solve' (IS.fromList vs) xs | xs <- unDNF dnf] of+ Nothing -> FOL.Unsat+ Just m -> FOL.Sat m++eliminateQuantifiers :: FOL.Formula (FOL.Atom Rational) -> Maybe (FOL.Formula (FOL.Atom Rational))+eliminateQuantifiers phi = do+ dnf <- eliminateQuantifiers' phi+ return $ orB $ map (andB . map (LAFOL.toFOLFormula . toLAAtom)) $ unDNF dnf++eliminateQuantifiers' :: FOL.Formula (FOL.Atom Rational) -> Maybe (DNF Lit)+eliminateQuantifiers' = f+ where+ f FOL.T = return true+ f FOL.F = return false+ f (FOL.Atom (Rel a op b)) = do+ a' <- LAFOL.fromFOLExpr a+ b' <- LAFOL.fromFOLExpr b+ return $ fromLAAtom $ Rel a' op b'+ f (FOL.And a b) = liftM2 (.&&.) (f a) (f b)+ f (FOL.Or a b) = liftM2 (.||.) (f a) (f b)+ f (FOL.Not a) = f (FOL.pushNot a)+ f (FOL.Imply a b) = f (FOL.Or (FOL.Not a) b)+ f (FOL.Equiv a b) = f (FOL.And (FOL.Imply a b) (FOL.Imply b a))+ f (FOL.Forall v a) = do+ dnf <- f (FOL.Exists v (FOL.pushNot a))+ return (notB dnf)+ f (FOL.Exists v a) = do+ dnf <- f a+ return $ orB [DNF $ maybeToList $ fmap fst $ project' v xs | xs <- unDNF dnf]++-- ---------------------------------------------------------------------------
+ src/ToySolver/HittingSet.hs view
@@ -0,0 +1,55 @@+{-# LANGUAGE ScopedTypeVariables, BangPatterns #-}+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.HittingSet+-- Copyright : (c) Masahiro Sakai 2012-2014+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : provisional+-- Portability : portable+--+-----------------------------------------------------------------------------+module ToySolver.HittingSet+ ( minimalHittingSets+ ) where++import Control.Monad+import Data.IntSet (IntSet)+import qualified Data.IntSet as IntSet+import Data.List++type Vertex = Int+type HyperEdge = [Int]+type HittingSet = [Int]++type HyperEdge' = IntSet++-- FIXME: remove nub+minimalHittingSets :: [HyperEdge] -> [HittingSet]+minimalHittingSets es = nub $ f (map IntSet.fromList es) []+ where+ f :: [HyperEdge'] -> HittingSet -> [HittingSet]+ f [] hs = return hs+ f es hs = do+ v <- IntSet.toList $ IntSet.unions es+ let hs' = v:hs+ e <- es+ guard $ v `IntSet.member` e+ let es' = propagateChoice es v e+ f es' hs'++propagateChoice :: [HyperEdge'] -> Vertex -> HyperEdge' -> [HyperEdge']+propagateChoice es v e = zs+ where+ xs = filter (v `IntSet.notMember`) es+ ys = map (IntSet.filter (v <) . (`IntSet.difference` e)) xs+ zs = maintainNoSupersets ys++maintainNoSupersets :: [IntSet] -> [IntSet]+maintainNoSupersets xss = go [] xss+ where+ go yss [] = yss+ go yss (xs:xss) = go (xs : filter p yss) (filter p xss)+ where+ p zs = not (xs `IntSet.isSubsetOf` zs)
+ src/ToySolver/HittingSet/HTCBDD.hs view
@@ -0,0 +1,105 @@+{-# LANGUAGE DeriveDataTypeable #-}+{-# OPTIONS_GHC -Wall #-}+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.HittingSet.HTCBDD+-- Copyright : (c) Masahiro Sakai 2014+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : provisional+-- Portability : non-portable (DeriveDataTypeable)+--+-- Wrapper for htcbdd command.+--+-- * HTC-BDD: Hypergraph Transversal Computation with Binary Decision Diagrams+-- <http://kuma-san.net/htcbdd.html>+--+-----------------------------------------------------------------------------+module ToySolver.HittingSet.HTCBDD+ ( Options (..)+ , Method (..)+ , Failure (..)+ , defaultOptions+ , minimalHittingSets+ ) where++import Control.Exception (Exception, throwIO)+import Control.Monad+import Data.Array.Unboxed+import Data.IntSet (IntSet)+import qualified Data.IntSet as IntSet+import Data.IntMap (IntMap)+import qualified Data.IntMap as IntMap+import Data.List+import Data.Typeable+import System.Exit+import System.IO+import System.IO.Temp+import ToySolver.Internal.ProcessUtil (runProcessWithOutputCallback)++type Vertex = Int+type HyperEdge = [Vertex]+type HittingSet = [Vertex]++data Options+ = Options+ { optHTCBDDCommand :: FilePath+ , optMethod :: Method+ , optOnGetLine :: String -> IO ()+ , optOnGetErrorLine :: String -> IO ()+ }++data Method+ = MethodToda+ | MethodKnuth+ deriving (Eq, Ord, Show)++defaultOptions :: Options+defaultOptions =+ Options+ { optHTCBDDCommand = "htcbdd"+ , optMethod = MethodToda+ , optOnGetLine = \_ -> return ()+ , optOnGetErrorLine = \_ -> return ()+ }++data Failure = Failure !Int+ deriving (Show, Typeable)++instance Exception Failure++minimalHittingSets :: Options -> [HyperEdge] -> IO [HittingSet]+minimalHittingSets opt es = do+ withSystemTempFile "htcbdd-input.dat" $ \fname1 h1 -> do+ forM_ es' $ \e -> do+ hPutStrLn h1 $ intercalate " " [show (encTable IntMap.! v) | v <- IntSet.toList e]+ hClose h1+ withSystemTempFile "htcbdd-out.dat" $ \fname2 h2 -> do+ hClose h2+ execHTCBDD opt fname1 fname2+ s <- readFile fname2+ return $ map (map ((decTable !) . read) . words) $ lines s+ where+ es' :: [IntSet]+ es' = map IntSet.fromList es++ vs :: IntSet+ vs = IntSet.unions es'++ nv :: Int+ nv = IntSet.size vs++ encTable :: IntMap Int+ encTable = IntMap.fromList (zip (IntSet.toList vs) [1..nv])++ decTable :: UArray Int Int+ decTable = array (1,nv) (zip [1..nv] (IntSet.toList vs))++execHTCBDD :: Options -> FilePath -> FilePath -> IO ()+execHTCBDD opt inputFile outputFile = do+ let args = ["-k" | optMethod opt == MethodKnuth] ++ [inputFile, outputFile]+ exitcode <- runProcessWithOutputCallback (optHTCBDDCommand opt) args "" (optOnGetLine opt) (optOnGetErrorLine opt)+ case exitcode of+ ExitFailure n -> throwIO $ Failure n+ ExitSuccess -> return ()
+ src/ToySolver/HittingSet/SHD.hs view
@@ -0,0 +1,99 @@+{-# LANGUAGE DeriveDataTypeable #-}+{-# OPTIONS_GHC -Wall #-}+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.HittingSet.SHD+-- Copyright : (c) Masahiro Sakai 2014+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : provisional+-- Portability : non-portable (DeriveDataTypeable)+-- +-- Wrapper for shd command.+--+-- * Hypergraph Dualization Repository+-- <http://research.nii.ac.jp/~uno/dualization.html>+--+-----------------------------------------------------------------------------+module ToySolver.HittingSet.SHD+ ( Options (..)+ , Failure (..)+ , defaultOptions+ , minimalHittingSets+ ) where++import Control.Exception (Exception, throwIO)+import Control.Monad+import Data.Array.Unboxed+import Data.IntSet (IntSet)+import qualified Data.IntSet as IntSet+import Data.IntMap (IntMap)+import qualified Data.IntMap as IntMap+import Data.List+import Data.Typeable+import System.Exit+import System.IO+import System.IO.Temp+import ToySolver.Internal.ProcessUtil (runProcessWithOutputCallback)++type Vertex = Int+type HyperEdge = [Vertex]+type HittingSet = [Vertex]++data Options+ = Options+ { optSHDCommand :: FilePath+ , optSHDArgs :: [String]+ , optOnGetLine :: String -> IO ()+ , optOnGetErrorLine :: String -> IO ()+ }++defaultOptions :: Options+defaultOptions =+ Options+ { optSHDCommand = "shd"+ , optSHDArgs = ["0"]+ , optOnGetLine = \_ -> return ()+ , optOnGetErrorLine = \_ -> return ()+ }++data Failure = Failure !Int+ deriving (Show, Typeable)++instance Exception Failure++minimalHittingSets :: Options -> [HyperEdge] -> IO [HittingSet]+minimalHittingSets opt es = do+ withSystemTempFile "shd-input.dat" $ \fname1 h1 -> do+ forM_ es' $ \e -> do+ hPutStrLn h1 $ intercalate " " [show (encTable IntMap.! v) | v <- IntSet.toList e]+ hClose h1+ withSystemTempFile "shd-out.dat" $ \fname2 h2 -> do+ hClose h2+ execSHD opt fname1 fname2+ s <- readFile fname2+ return $ map (map ((decTable !) . read) . words) $ lines s+ where+ es' :: [IntSet]+ es' = map IntSet.fromList es++ vs :: IntSet+ vs = IntSet.unions es'++ nv :: Int+ nv = IntSet.size vs++ encTable :: IntMap Int+ encTable = IntMap.fromList (zip (IntSet.toList vs) [0..nv-1])++ decTable :: UArray Int Int+ decTable = array (0,nv-1) (zip [0..nv-1] (IntSet.toList vs))++execSHD :: Options -> FilePath -> FilePath -> IO ()+execSHD opt inputFile outputFile = do+ let args = optSHDArgs opt ++ [inputFile, outputFile]+ exitcode <- runProcessWithOutputCallback (optSHDCommand opt) args "" (optOnGetLine opt) (optOnGetErrorLine opt)+ case exitcode of+ ExitFailure n -> throwIO $ Failure n+ ExitSuccess -> return ()
+ src/ToySolver/Internal/Data/IndexedPriorityQueue.hs view
@@ -0,0 +1,254 @@+{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances, BangPatterns, TypeSynonymInstances #-}+{-# OPTIONS_GHC -Wall #-}+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.Internal.Data.IndexedPriorityQueue+-- Copyright : (c) Masahiro Sakai 2012+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : provisional+-- Portability : non-portable (MultiParamTypeClasses, FlexibleInstances, BangPatterns, TypeSynonymInstances)+--+-- Priority queue implemented as array-based binary heap.+--+-----------------------------------------------------------------------------+module ToySolver.Internal.Data.IndexedPriorityQueue+ (+ -- * PriorityQueue type+ PriorityQueue+ , Value+ , Index++ -- * Constructors+ , newPriorityQueue+ , newPriorityQueueBy+ , NewFifo (..)++ -- * Operators+ , getElems+ , clear+ , clone+ , Enqueue (..)+ , Dequeue (..)+ , QueueSize (..)+ , member+ , update+ , getHeapArray+ , getHeapVec++ -- * Misc operations+ , resizeHeapCapacity+ , resizeTableCapacity+ ) where++import Control.Monad+import qualified Data.Array.IO as A+import Data.Queue.Classes+import qualified ToySolver.Data.Vec as Vec++type Index = Int+type Value = Int++-- | Priority queue implemented as array-based binary heap.+data PriorityQueue+ = PriorityQueue+ { lt :: !(Value -> Value -> IO Bool)+ , heap :: !(Vec.UVec Value)+ , table :: !(Vec.UVec Index)+ }++-- | Build a priority queue with default ordering ('(<)' of 'Ord' class)+newPriorityQueue :: IO PriorityQueue+newPriorityQueue = newPriorityQueueBy (\a b -> return (a < b))++-- | Build a priority queue with a given /less than/ operator.+newPriorityQueueBy :: (Value -> Value -> IO Bool) -> IO PriorityQueue+newPriorityQueueBy cmp = do+ vec <- Vec.new+ idx <- Vec.new+ return $ PriorityQueue{ lt = cmp, heap = vec, table = idx }++-- | Return a list of all the elements of a priority queue. (not sorted)+getElems :: PriorityQueue -> IO [Value]+getElems q = Vec.getElems (heap q)++-- | Remove all elements from a priority queue.+clear :: PriorityQueue -> IO ()+clear q = do+ Vec.clear (heap q)+ Vec.clear (table q)++-- | Create a copy of a priority queue.+clone :: PriorityQueue -> IO PriorityQueue+clone q = do+ h2 <- Vec.clone (heap q)+ t2 <- Vec.clone (table q)+ return $ PriorityQueue{ lt = lt q, heap = h2, table = t2 }++instance NewFifo PriorityQueue IO where+ newFifo = newPriorityQueue++instance Enqueue PriorityQueue IO Value where+ enqueue q val = do+ m <- member q val+ unless m $ do+ n <- Vec.getSize (heap q)+ Vec.push (heap q) val+ Vec.growTo (table q) (val+1)+ Vec.unsafeWrite (table q) val n + up q n++instance Dequeue PriorityQueue IO Value where+ dequeue q = do+ n <- Vec.getSize (heap q)+ case n of+ 0 ->+ return Nothing+ _ -> do+ val <- Vec.unsafeRead (heap q) 0+ Vec.unsafeWrite (table q) val (-1)+ if n == 1 then do+ Vec.resize (heap q) (n-1)+ else do+ val1 <- Vec.unsafeRead (heap q) (n-1)+ Vec.unsafeWrite (heap q) 0 val1+ Vec.unsafeWrite (table q) val1 0+ Vec.resize (heap q) (n-1)+ down q 0+ return (Just val)++ dequeueBatch q = go []+ where+ go xs = do+ r <- dequeue q+ case r of+ Nothing -> return (reverse xs)+ Just x -> go (x:xs)++instance QueueSize PriorityQueue IO where+ queueSize q = Vec.getSize (heap q)++member :: PriorityQueue -> Value -> IO Bool+member q v = do+ n <- Vec.getSize (table q)+ if n <= v then+ return False+ else do+ i <- Vec.unsafeRead (table q) v+ return $! i /= -1++update :: PriorityQueue -> Value -> IO ()+update q v = do+ i <- Vec.unsafeRead (table q) v+ unless (i == -1) $ do+ up q i+ down q i++up :: PriorityQueue -> Index -> IO ()+up q !i = do+ val <- Vec.unsafeRead (heap q) i+ let loop 0 = return 0+ loop j = do+ let p = parent j+ val_p <- Vec.unsafeRead (heap q) p+ b <- lt q val val_p+ if b+ then do+ Vec.unsafeWrite (heap q) j val_p+ Vec.unsafeWrite (table q) val_p j+ loop p+ else return j+ j <- loop i+ Vec.unsafeWrite (heap q) j val+ Vec.unsafeWrite (table q) val j++down :: PriorityQueue -> Index -> IO ()+down q !i = do+ n <- Vec.getSize (heap q)+ val <- Vec.unsafeRead (heap q) i+ let loop !j = do+ let !l = left j+ !r = right j+ if l >= n+ then return j+ else do+ child <- do+ if r >= n+ then return l+ else do+ val_l <- Vec.unsafeRead (heap q) l+ val_r <- Vec.unsafeRead (heap q) r+ b <- lt q val_r val_l+ if b+ then return r+ else return l+ val_child <- Vec.unsafeRead (heap q) child+ b <- lt q val_child val+ if not b+ then return j+ else do+ Vec.unsafeWrite (heap q) j val_child+ Vec.unsafeWrite (table q) val_child j+ loop child+ j <- loop i+ Vec.unsafeWrite (heap q) j val+ Vec.unsafeWrite (table q) val j++-- | Get the internal representation of a given priority queue.+getHeapArray :: PriorityQueue -> IO (A.IOUArray Index Value)+getHeapArray q = Vec.getArray (heap q)++-- | Get the internal representation of a given priority queue.+getHeapVec :: PriorityQueue -> IO (Vec.UVec Value)+getHeapVec q = return (heap q)++-- | Pre-allocate internal buffer for @n@ elements.+resizeHeapCapacity :: PriorityQueue -> Int -> IO ()+resizeHeapCapacity q capa = Vec.resizeCapacity (heap q) capa++-- | Pre-allocate internal buffer for @[0..n-1]@ values.+resizeTableCapacity :: PriorityQueue -> Int -> IO ()+resizeTableCapacity q capa = Vec.resizeCapacity (table q) capa++{--------------------------------------------------------------------+ Index "traversal" functions+--------------------------------------------------------------------}++{-# INLINE left #-}+left :: Index -> Index+left i = i*2 + 1++{-# INLINE right #-}+right :: Index -> Index+right i = (i+1)*2;++{-# INLINE parent #-}+parent :: Index -> Index+parent i = (i-1) `div` 2++{--------------------------------------------------------------------+ test+--------------------------------------------------------------------}++{-+checkHeapProperty :: String -> PriorityQueue -> IO ()+checkHeapProperty str q = do + (n,arr) <- readIORef (heap q)+ let go i = do+ val <- A.readArray arr i+ forM_ [left i, right i] $ \j ->+ when (j < n) $ do+ val2 <- A.readArray arr j+ b <- lt q val2 val+ when b $ do+ error (str ++ ": invalid heap " ++ show j)+ go j+ when (n > 0) $ go 0++ idx <- readIORef (table q)+ forM_ [0..n-1] $ \i -> do+ v <- A.readArray arr i+ i' <- A.readArray idx v+ when (i /= i') $ error $ str ++ ": invalid index " ++ show (i,v,i')+-}
+ src/ToySolver/Internal/Data/PriorityQueue.hs view
@@ -0,0 +1,208 @@+{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances, BangPatterns #-}+{-# OPTIONS_GHC -Wall #-}+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.Internal.Data.PriorityQueue+-- Copyright : (c) Masahiro Sakai 2012+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : provisional+-- Portability : non-portable (MultiParamTypeClasses, FlexibleInstances, BangPatterns)+--+-- Priority queue implemented as array-based binary heap.+--+-----------------------------------------------------------------------------+module ToySolver.Internal.Data.PriorityQueue+ (+ -- * PriorityQueue type+ PriorityQueue+ , Index++ -- * Constructors+ , newPriorityQueue+ , newPriorityQueueBy+ , NewFifo (..)++ -- * Operators+ , getElems+ , clear+ , clone+ , Enqueue (..)+ , Dequeue (..)+ , QueueSize (..)+ , getHeapArray+ , getHeapVec++ -- * Misc operations+ , resizeHeapCapacity+ ) where++import Control.Monad+import qualified Data.Array.IO as A+import Data.Queue.Classes+import qualified ToySolver.Data.Vec as Vec++type Index = Int++-- | Priority queue implemented as array-based binary heap.+data PriorityQueue a+ = PriorityQueue+ { lt :: !(a -> a -> IO Bool)+ , heap :: !(Vec.Vec a)+ }++-- | Build a priority queue with default ordering ('(<)' of 'Ord' class)+newPriorityQueue :: Ord a => IO (PriorityQueue a)+newPriorityQueue = newPriorityQueueBy (\a b -> return (a < b))++-- | Build a priority queue with a given /less than/ operator.+newPriorityQueueBy :: (a -> a -> IO Bool) -> IO (PriorityQueue a)+newPriorityQueueBy cmp = do+ vec <- Vec.new+ return $ PriorityQueue{ lt = cmp, heap = vec }++-- | Return a list of all the elements of a priority queue. (not sorted)+getElems :: PriorityQueue a -> IO [a]+getElems q = Vec.getElems (heap q)++-- | Remove all elements from a priority queue.+clear :: PriorityQueue a -> IO ()+clear q = Vec.clear (heap q)++-- | Create a copy of a priority queue.+clone :: PriorityQueue a -> IO (PriorityQueue a)+clone q = do+ h2 <- Vec.clone (heap q)+ return $ PriorityQueue{ lt = lt q, heap = h2 }++instance Ord a => NewFifo (PriorityQueue a) IO where+ newFifo = newPriorityQueue++instance Enqueue (PriorityQueue a) IO a where+ enqueue q val = do+ n <- Vec.getSize (heap q)+ Vec.push (heap q) val+ up q n++instance Dequeue (PriorityQueue a) IO a where+ dequeue q = do+ n <- Vec.getSize (heap q)+ case n of+ 0 ->+ return Nothing+ _ -> do+ val <- Vec.unsafeRead (heap q) 0+ if n == 1 then do+ Vec.resize (heap q) (n-1)+ else do+ val1 <- Vec.unsafeRead (heap q) (n-1)+ Vec.unsafeWrite (heap q) 0 val1+ Vec.resize (heap q) (n-1)+ down q 0+ return (Just val)++ dequeueBatch q = go []+ where+ go xs = do+ r <- dequeue q+ case r of+ Nothing -> return (reverse xs)+ Just x -> go (x:xs)++instance QueueSize (PriorityQueue a) IO where+ queueSize q = Vec.getSize (heap q)++up :: PriorityQueue a -> Index -> IO ()+up q !i = do+ val <- Vec.unsafeRead (heap q) i+ let loop 0 = return 0+ loop j = do+ let p = parent j+ val_p <- Vec.unsafeRead (heap q) p+ b <- lt q val val_p+ if b+ then do+ Vec.unsafeWrite (heap q) j val_p+ loop p+ else return j+ j <- loop i+ Vec.unsafeWrite (heap q) j val++down :: PriorityQueue a -> Index -> IO ()+down q !i = do+ n <- Vec.getSize (heap q)+ val <- Vec.unsafeRead (heap q) i+ let loop !j = do+ let !l = left j+ !r = right j+ if l >= n+ then return j+ else do+ child <- do+ if r >= n+ then return l+ else do+ val_l <- Vec.unsafeRead (heap q) l+ val_r <- Vec.unsafeRead (heap q) r+ b <- lt q val_r val_l+ if b+ then return r+ else return l+ val_child <- Vec.unsafeRead (heap q) child+ b <- lt q val_child val+ if not b+ then return j+ else do+ Vec.unsafeWrite (heap q) j val_child+ loop child+ j <- loop i+ Vec.unsafeWrite (heap q) j val++-- | Get the internal representation of a given priority queue.+getHeapArray :: PriorityQueue a -> IO (A.IOArray Index a)+getHeapArray q = Vec.getArray (heap q)++-- | Get the internal representation of a given priority queue.+getHeapVec :: PriorityQueue a -> IO (Vec.Vec a)+getHeapVec q = return (heap q)++-- | Pre-allocate internal buffer for @n@ elements.+resizeHeapCapacity :: PriorityQueue a -> Int -> IO ()+resizeHeapCapacity q capa = Vec.resizeCapacity (heap q) capa++{--------------------------------------------------------------------+ Index "traversal" functions+--------------------------------------------------------------------}++{-# INLINE left #-}+left :: Index -> Index+left i = i*2 + 1++{-# INLINE right #-}+right :: Index -> Index+right i = (i+1)*2;++{-# INLINE parent #-}+parent :: Index -> Index+parent i = (i-1) `div` 2++{--------------------------------------------------------------------+ test+--------------------------------------------------------------------}++{-+checkHeapProperty :: String -> PriorityQueue a -> IO ()+checkHeapProperty str q = do + (n,arr) <- readIORef (heap q)+ let go i = do+ val <- A.readArray arr i+ forM_ [left i, right i] $ \j ->+ when (j < n) $ do+ val2 <- A.readArray arr j+ b <- lt q val2 val+ when b $ do+ error (str ++ ": invalid heap " ++ show j)+ go j+ when (n > 0) $ go 0+-}
+ src/ToySolver/Internal/Data/SeqQueue.hs view
@@ -0,0 +1,67 @@+{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses #-}+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.Internal.Data.SeqQueue+-- Copyright : (c) Masahiro Sakai 2012+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : provisional+-- Portability : non-portable (FlexibleInstances, MultiParamTypeClasses)+--+-- Queue implemented using IORef and Sequence.+-- +-----------------------------------------------------------------------------+module ToySolver.Internal.Data.SeqQueue+ (+ -- * SeqQueue type+ SeqQueue++ -- * Constructors+ , NewFifo (..)++ -- * Operators + , Enqueue (..)+ , Dequeue (..)+ , QueueSize (..)+ , clear+ ) where++import Data.IORef+import Data.Queue+import Data.Foldable+import qualified Data.Sequence as Seq++newtype SeqQueue a = SeqQueue (IORef (Seq.Seq a))++instance NewFifo (SeqQueue a) IO where+ newFifo = do+ ref <- newIORef Seq.empty+ return (SeqQueue ref)++instance Enqueue (SeqQueue a) IO a where+ enqueue (SeqQueue ref) val = do+ modifyIORef ref (Seq.|> val)++instance Dequeue (SeqQueue a) IO a where+ dequeue (SeqQueue ref) = do+ s <- readIORef ref+ case Seq.viewl s of+ Seq.EmptyL -> return Nothing+ val Seq.:< s' -> do+ writeIORef ref s'+ return (Just val)++ dequeueBatch (SeqQueue ref) = do+ s <- readIORef ref+ writeIORef ref Seq.empty+ return (toList s)++instance QueueSize (SeqQueue a) IO where+ queueSize (SeqQueue ref) = do+ s <- readIORef ref+ return $! Seq.length s++clear :: SeqQueue a -> IO ()+clear (SeqQueue ref) = do+ writeIORef ref Seq.empty
+ src/ToySolver/Internal/ProcessUtil.hs view
@@ -0,0 +1,97 @@+{-# LANGUAGE CPP #-}+{-# OPTIONS_GHC -Wall #-}+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.Internal.ProcessUtil+-- Copyright : (c) Masahiro Sakai 2014+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : provisional+-- Portability : non-portable (CPP)+--+-----------------------------------------------------------------------------+module ToySolver.Internal.ProcessUtil+ ( runProcessWithOutputCallback+ ) where++import Control.Concurrent+import Control.Concurrent.STM+import Control.Exception (SomeException, try, mask, throwIO)+import qualified Control.Exception as C+import Control.Monad+import Foreign.C+import System.Exit+import System.IO+#if MIN_VERSION_base(4,6,0)+import System.IO.Error+#else+import System.IO.Error hiding (try)+#endif+import System.Process++#ifdef __GLASGOW_HASKELL__+import GHC.IO.Exception ( IOErrorType(..), IOException(..) )+#endif++runProcessWithOutputCallback+ :: FilePath -- ^ Filename of the executable (see 'proc' for details)+ -> [String] -- ^ any arguments+ -> String -- ^ standard input+ -> (String -> IO ()) -- ^ callback function which is called when a line is read from stdout+ -> (String -> IO ()) -- ^ callback function which is called when a line is read from stderr+ -> IO ExitCode+runProcessWithOutputCallback cmd args input putMsg putErr = do+ (Just inh, Just outh, Just errh, processh) <- createProcess+ (proc cmd args)+ { std_in = CreatePipe+ , std_out = CreatePipe+ , std_err = CreatePipe+ }+ req <- newEmptyTMVarIO+ let f act = atomically (putTMVar req act)+ m1 = forever (hGetLine outh >>= \s -> f (putMsg s))+ `catchIOError` (\e -> if isEOFError e then return () else ioError e)+ m2 = forever (hGetLine errh >>= \s -> f (putErr s))+ `catchIOError` (\e -> if isEOFError e then return () else ioError e)+ withForkWait m1 $ \waitOut -> do+ withForkWait m2 $ \waitErr -> do+ -- now write any input+ unless (null input) $+ ignoreSigPipe $ hPutStr inh input+ -- hClose performs implicit hFlush, and thus may trigger a SIGPIPE+ ignoreSigPipe $ hClose inh++ hSetBuffering outh LineBuffering+ hSetBuffering errh LineBuffering+ let loop = join $ atomically $ msum $+ [ do act <- takeTMVar req+ return $ act >> loop+ , do guard =<< isEmptyTMVar req+ waitOut+ waitErr+ return $ return ()+ ]+ loop+ hClose outh+ hClose errh+ waitForProcess processh++withForkWait :: IO () -> (STM () -> IO a) -> IO a+withForkWait async body = do+ waitVar <- newEmptyTMVarIO :: IO (TMVar (Either SomeException ()))+ mask $ \restore -> do+ tid <- forkIO $ try (restore async) >>= \v -> atomically (putTMVar waitVar v)+ let wait = takeTMVar waitVar >>= either throwSTM return+ restore (body wait) `C.onException` killThread tid++ignoreSigPipe :: IO () -> IO ()+#if defined(__GLASGOW_HASKELL__)+ignoreSigPipe = C.handle $ \e -> case e of+ IOError { ioe_type = ResourceVanished+ , ioe_errno = Just ioe }+ | Errno ioe == ePIPE -> return ()+ _ -> throwIO e+#else+ignoreSigPipe = id+#endif
+ src/ToySolver/Internal/TextUtil.hs view
@@ -0,0 +1,87 @@+{-# LANGUAGE BangPatterns, CPP #-}+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.Internal.TextUtil+-- Copyright : (c) Masahiro Sakai 2012-2014+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : provisional+-- Portability : non-portable (BangPatterns)+--+-----------------------------------------------------------------------------+module ToySolver.Internal.TextUtil+ ( readInt+ , readUnsignedInteger+ ) where++#include "MachDeps.h"++import Control.Exception+import Data.Word++{-# INLINABLE readInt #-}+readInt :: String -> Int+readInt ('-':str) = - readUnsignedInt str+readInt str = readUnsignedInt str++{-# INLINABLE readUnsignedInt #-}+readUnsignedInt :: String -> Int+readUnsignedInt str = go 0 str+ where+ go !r [] = r+ go !r (c:cs) = go (r*10 + charToInt c) cs++ charToInt :: Char -> Int+ charToInt '0' = 0+ charToInt '1' = 1+ charToInt '2' = 2+ charToInt '3' = 3+ charToInt '4' = 4+ charToInt '5' = 5+ charToInt '6' = 6+ charToInt '7' = 7+ charToInt '8' = 8+ charToInt '9' = 9++-- | 'read' allocate too many intermediate 'Integer'.+-- Therefore we use this optimized implementation instead.+-- Many intermediate values in this implementation will be optimized+-- away by worker-wrapper transformation and unboxing.+{-# INLINABLE readUnsignedInteger #-}+readUnsignedInteger :: String -> Integer +readUnsignedInteger str = assert (result == read str) $ result+ where+ result :: Integer+ result = go 0 str++ lim :: Word+#if !MIN_VERSION_base(4,6,1) && WORD_SIZE_IN_BITS == 32+ {- To avoid a bug of maxBound <https://ghc.haskell.org/trac/ghc/ticket/8072> -}+ lim = 0xFFFFFFFF `div` 10+#else+ lim = maxBound `div` 10+#endif+ + go :: Integer -> [Char] -> Integer + go !r [] = r+ go !r ds =+ case go2 0 1 ds of+ (r2,b,ds2) -> go (r * fromIntegral b + fromIntegral r2) ds2++ go2 :: Word -> Word -> [Char] -> (Word, Word, [Char])+ go2 !r !b dds | assert (b > r) (b > lim) = (r,b,dds)+ go2 !r !b [] = (r, b, [])+ go2 !r !b (d:ds) = go2 (r*10 + charToWord d) (b*10) ds++ charToWord :: Char -> Word+ charToWord '0' = 0+ charToWord '1' = 1+ charToWord '2' = 2+ charToWord '3' = 3+ charToWord '4' = 4+ charToWord '5' = 5+ charToWord '6' = 6+ charToWord '7' = 7+ charToWord '8' = 8+ charToWord '9' = 9
+ src/ToySolver/Internal/Util.hs view
@@ -0,0 +1,87 @@+{-# OPTIONS_GHC -Wall #-}+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.Internal.Util+-- Copyright : (c) Masahiro Sakai 2011-2012+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : provisional+-- Portability : portable+--+-- Some utility functions.+-- +-----------------------------------------------------------------------------++module ToySolver.Internal.Util where++import Control.Monad+import Data.Ratio+import Data.Set (Set)+import qualified Data.Set as Set++-- | Combining two @Maybe@ values using given function.+combineMaybe :: (a -> a -> a) -> Maybe a -> Maybe a -> Maybe a+combineMaybe _ Nothing y = y+combineMaybe _ x Nothing = x+combineMaybe f (Just x) (Just y) = Just (f x y)++-- | is the number integral?+--+-- @+-- isInteger x = fromInteger (round x) == x+-- @+isInteger :: RealFrac a => a -> Bool+isInteger x = fromInteger (round x) == x++-- | fractional part+-- +-- @+-- fracPart x = x - fromInteger (floor x)+-- @+fracPart :: RealFrac a => a -> a+fracPart x = x - fromInteger (floor x)++showRational :: Bool -> Rational -> String+showRational asRatio v+ | denominator v == 1 = show (numerator v)+ | asRatio = show (numerator v) ++ "/" ++ show (denominator v)+ | otherwise = show (fromRational v :: Double)++showRationalAsFiniteDecimal :: Rational -> Maybe String+showRationalAsFiniteDecimal x = do+ let a :: Integer+ (a,b) = properFraction (abs x)+ s1 = if x < 0 then "-" else ""+ s2 = show a + s3 <- if b == 0+ then return ".0"+ else liftM ("." ++ ) $ loop Set.empty b+ return $ s1 ++ s2 ++ s3+ where+ loop :: Set Rational -> Rational -> Maybe String+ loop _ 0 = return ""+ loop rs r+ | r `Set.member` rs = mzero+ | otherwise = do+ let a :: Integer+ (a,b) = properFraction (r * 10)+ s <- loop (Set.insert r rs) b+ return $ show a ++ s++{-# INLINE revSequence #-}+revSequence :: Monad m => [m a] -> m [a]+revSequence = go []+ where+ go xs [] = return xs+ go xs (m:ms) = do+ x <- m+ go (x:xs) ms++{-# INLINE revMapM #-}+revMapM :: Monad m => (a -> m b) -> ([a] -> m [b])+revMapM f = revSequence . map f++{-# INLINE revForM #-}+revForM :: Monad m => [a] -> (a -> m b) -> m [b]+revForM = flip revMapM
+ src/ToySolver/Knapsack.hs view
@@ -0,0 +1,63 @@+{-# LANGUAGE ScopedTypeVariables, BangPatterns #-}+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.Knapsack+-- Copyright : (c) Masahiro Sakai 2014+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : provisional+-- Portability : portable+--+-- Simple 0-1 knapsack problem solver that uses branch-and-bound with LP-relaxation based upper bound.+--+-----------------------------------------------------------------------------+module ToySolver.Knapsack+ ( Weight+ , Value+ , solve+ ) where++import Control.Monad.State+import Data.Function (on)+import Data.IntSet (IntSet)+import qualified Data.IntSet as IntSet+import Data.List++type Weight = Rational+type Value = Rational++solve+ :: [(Value, Weight)]+ -> Weight+ -> (Value, Weight, [Bool])+solve items limit =+ ( sum [v | (n,(v,_)) <- zip [0..] items, n `IntSet.member` sol]+ , sum [w | (n,(_,w)) <- zip [0..] items, n `IntSet.member` sol]+ , [n `IntSet.member` sol | (n,_) <- zip [0..] items]+ )+ where+ items' :: [(Value, Weight, Int)]+ items' = map fst $ sortBy (flip compare `on` snd) [((v, w, n), (v / w, v)) | (n, (v, w)) <- zip [0..] items]++ sol :: IntSet+ sol = IntSet.fromList $ fst $ execState (f items' limit ([],0)) ([],0)++ f :: [(Value, Weight, Int)] -> Weight -> ([Int],Value) -> State ([Int],Value) ()+ f items !slack (is, !value) = do+ (_, bestVal) <- get+ when (computeUB items slack value > bestVal) $ do+ case items of+ [] -> put (is,value)+ (v,w,i):items -> do+ when (slack >= w) $ f items (slack - w) (i : is, v + value)+ f items slack (is, value)++ computeUB :: [(Value, Weight, Int)] -> Weight -> Value -> Value+ computeUB items slack value = go items slack value+ where+ go _ 0 val = val+ go [] _ val = val+ go ((v,w,_):items) slack val+ | slack >= w = go items (slack - w) (val + v)+ | otherwise = val + (v / w) * slack
+ src/ToySolver/LPSolver.hs view
@@ -0,0 +1,350 @@+{-# LANGUAGE ScopedTypeVariables #-}+{-# OPTIONS_GHC -Wall #-}+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.LPSolver+-- Copyright : (c) Masahiro Sakai 2011+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : provisional+-- Portability : non-portable (ScopedTypeVariables)+--+-- Naïve implementation of Simplex method+-- +-- Reference:+--+-- * <http://www.math.cuhk.edu.hk/~wei/lpch3.pdf>+--+-----------------------------------------------------------------------------++module ToySolver.LPSolver+ (+ -- * Solver type+ Solver+ , emptySolver++ -- * LP monad+ , LP+ , getTableau+ , putTableau++ -- * Problem specification+ , newVar+ , addConstraint+ , addConstraintWithArtificialVariable+ , tableau+ , define++ -- * Solving+ , phaseI+ , simplex+ , dualSimplex+ , OptResult (..)+ , twoPhaseSimplex+ , primalDualSimplex++ -- * Extract results+ , getModel++ -- * Utilities+ , collectNonnegVars+ ) where++import Control.Exception (assert)+import Control.Monad+import Control.Monad.State+import qualified Data.IntMap as IM+import qualified Data.IntSet as IS+import Data.OptDir+import Data.VectorSpace++import qualified Data.Interval as Interval++import ToySolver.Data.ArithRel+import qualified ToySolver.Data.LA as LA+import ToySolver.Data.Var+import qualified ToySolver.Simplex as Simplex+import qualified ToySolver.BoundsInference as BI++-- ---------------------------------------------------------------------------+-- Solver type++type Solver r = (Var, Simplex.Tableau r, VarSet, VarMap (LA.Expr r))++emptySolver :: VarSet -> Solver r+emptySolver vs = (1 + maximum ((-1) : IS.toList vs), Simplex.emptyTableau, IS.empty, IM.empty)++-- ---------------------------------------------------------------------------+-- LP Monad++type LP r = State (Solver r)++-- | Allocate a new /non-negative/ variable.+newVar :: LP r Var+newVar = do+ (x,tbl,avs,defs) <- get+ put (x+1,tbl,avs,defs)+ return x++getTableau :: LP r (Simplex.Tableau r)+getTableau = do+ (_,tbl,_,_) <- get+ return tbl++putTableau :: Simplex.Tableau r -> LP r ()+putTableau tbl = do+ (x,_,avs,defs) <- get+ put (x,tbl,avs,defs)++addArtificialVariable :: Var -> LP r ()+addArtificialVariable v = do+ (x,tbl,avs,defs) <- get+ put (x, tbl, IS.insert v avs, defs)++getArtificialVariables :: LP r VarSet+getArtificialVariables = do+ (_,_,avs,_) <- get+ return avs++clearArtificialVariables :: LP r ()+clearArtificialVariables = do+ (x,tbl,_,defs) <- get+ put (x, tbl, IS.empty, defs)++define :: Var -> LA.Expr r -> LP r ()+define v e = do+ (x,tbl,avs,defs) <- get+ put (x,tbl,avs, IM.insert v e defs)++getDefs :: LP r (VarMap (LA.Expr r))+getDefs = do+ (_,_,_,defs) <- get+ return defs++-- ---------------------------------------------------------------------------++-- | Add a contraint and maintain feasibility condition by introducing artificial variable (if necessary).+--+-- * Disequality is not supported.+-- +-- * Unlike 'addConstraint', an equality contstraint becomes one row with an artificial variable.+-- +addConstraintWithArtificialVariable :: Real r => LA.Atom r -> LP r ()+addConstraintWithArtificialVariable c = do+ c2 <- expandDefs' c+ let (e, rop, b) = normalizeConstraint c2+ assert (b >= 0) $ return ()+ tbl <- getTableau+ case rop of+ -- x≥0 is trivially true, since x is non-negative.+ Ge | b==0 && isSingleVar e -> return ()+ -- -x≤0 is trivially true, since x is non-negative.+ Le | b==0 && isSingleNegatedVar e -> return ()++ Le -> do+ v <- newVar -- slack variable+ putTableau $ Simplex.addRow tbl v (LA.coeffMap e, b)+ Ge -> do+ v1 <- newVar -- surplus variable+ v2 <- newVar -- artificial variable+ putTableau $ Simplex.addRow tbl v2 (LA.coeffMap (e ^-^ LA.var v1), b)+ addArtificialVariable v2+ Eql -> do+ v <- newVar -- artificial variable+ putTableau $ Simplex.addRow tbl v (LA.coeffMap e, b)+ addArtificialVariable v+ _ -> error $ "ToySolver.LPSolver.addConstraintWithArtificialVariable does not support " ++ show rop++-- | Add a contraint, without maintaining feasibilty condition of tableaus.+--+-- * Disequality is not supported.+--+-- * Unlike 'addConstraintWithArtificialVariable', an equality constraint becomes two rows.+-- +addConstraint :: Real r => LA.Atom r -> LP r ()+addConstraint c = do+ Rel lhs rop rhs <- expandDefs' c+ let+ (b', e) = LA.extract LA.unitVar (lhs ^-^ rhs)+ b = - b'+ case rop of+ Le -> f e b+ Ge -> f (negateV e) (negate b)+ Eql -> do+ -- Unlike addConstraintWithArtificialVariable, an equality constraint becomes two rows.+ f e b+ f (negateV e) (negate b)+ _ -> error $ "ToySolver.LPSolver.addConstraint does not support " ++ show rop+ where+ -- -x≤b with b≥0 is trivially true.+ f e b | isSingleNegatedVar e && 0 <= b = return ()+ f e b = do+ tbl <- getTableau+ v <- newVar -- slack variable+ putTableau $ Simplex.addRow tbl v (LA.coeffMap e, b)++isSingleVar :: Real r => LA.Expr r -> Bool+isSingleVar e =+ case LA.terms e of+ [(1,_)] -> True+ _ -> False++isSingleNegatedVar :: Real r => LA.Expr r -> Bool+isSingleNegatedVar e =+ case LA.terms e of+ [(-1,_)] -> True+ _ -> False++expandDefs :: (Num r, Eq r) => LA.Expr r -> LP r (LA.Expr r)+expandDefs e = do+ defs <- getDefs+ return $ LA.applySubst defs e++expandDefs' :: (Num r, Eq r) => LA.Atom r -> LP r (LA.Atom r)+expandDefs' (Rel lhs op rhs) = do+ lhs' <- expandDefs lhs+ rhs' <- expandDefs rhs+ return $ Rel lhs' op rhs'++tableau :: (RealFrac r) => [LA.Atom r] -> LP r ()+tableau cs = do+ let (nonnegVars, cs') = collectNonnegVars cs IS.empty+ fvs = vars cs `IS.difference` nonnegVars+ forM_ (IS.toList fvs) $ \v -> do+ v1 <- newVar+ v2 <- newVar+ define v (LA.var v1 ^-^ LA.var v2)+ mapM_ addConstraint cs'++getModel :: Fractional r => VarSet -> LP r (Model r)+getModel vs = do+ tbl <- getTableau+ defs <- getDefs+ let vs' = (vs `IS.difference` IM.keysSet defs) `IS.union` IS.unions [vars e | e <- IM.elems defs]+ m0 = IM.fromAscList [(v, Simplex.currentValue tbl v) | v <- IS.toAscList vs']+ return $ IM.filterWithKey (\k _ -> k `IS.member` vs) $ IM.map (LA.evalExpr m0) defs `IM.union` m0++phaseI :: (Fractional r, Real r) => LP r Bool+phaseI = do+ introduceArtificialVariables+ tbl <- getTableau+ avs <- getArtificialVariables+ let (ret, tbl') = Simplex.phaseI tbl avs+ putTableau tbl'+ when ret clearArtificialVariables+ return ret++introduceArtificialVariables :: (Real r) => LP r ()+introduceArtificialVariables = do+ tbl <- getTableau+ tbl' <- liftM IM.fromList $ forM (IM.toList tbl) $ \(v,(e,rhs)) -> do+ if rhs >= 0 then do+ return (v,(e,rhs)) -- v + e == rhs+ else do+ a <- newVar+ addArtificialVariable a+ return (a, (IM.insert v (-1) (IM.map negate e), -rhs)) -- a - (v + e) == -rhs+ putTableau tbl'++simplex :: (Fractional r, Real r) => OptDir -> LA.Expr r -> LP r Bool+simplex optdir obj = do+ tbl <- getTableau+ defs <- getDefs+ let (ret, tbl') = Simplex.simplex optdir (Simplex.setObjFun tbl (LA.applySubst defs obj))+ putTableau tbl'+ return ret++dualSimplex :: (Fractional r, Real r) => OptDir -> LA.Expr r -> LP r Bool+dualSimplex optdir obj = do+ tbl <- getTableau+ defs <- getDefs+ let (ret, tbl') = Simplex.dualSimplex optdir (Simplex.setObjFun tbl (LA.applySubst defs obj))+ putTableau tbl'+ return ret++-- | results of optimization+data OptResult = Optimum | Unsat | Unbounded+ deriving (Show, Eq, Ord)++twoPhaseSimplex :: (Fractional r, Real r) => OptDir -> LA.Expr r -> LP r OptResult+twoPhaseSimplex optdir obj = do+ ret <- phaseI+ if not ret then+ return Unsat+ else do+ ret <- simplex optdir obj+ if ret then+ return Optimum+ else+ return Unbounded++primalDualSimplex :: (Fractional r, Real r) => OptDir -> LA.Expr r -> LP r OptResult+primalDualSimplex optdir obj = do+ tbl <- getTableau+ defs <- getDefs+ let (ret, tbl') = Simplex.primalDualSimplex optdir (Simplex.setObjFun tbl (LA.applySubst defs obj))+ putTableau tbl'+ if ret then+ return Optimum+ else if not (Simplex.isFeasible tbl') then+ return Unsat+ else+ return Unbounded++-- ---------------------------------------------------------------------------++-- convert right hand side to be non-negative+normalizeConstraint :: forall r. Real r => LA.Atom r -> (LA.Expr r, RelOp, r)+normalizeConstraint (Rel a op b)+ | rhs < 0 = (negateV lhs, flipOp op, negate rhs)+ | otherwise = (lhs, op, rhs)+ where+ (c, lhs) = LA.extract LA.unitVar (a ^-^ b)+ rhs = - c++collectNonnegVars :: forall r. (RealFrac r) => [LA.Atom r] -> VarSet -> (VarSet, [LA.Atom r])+collectNonnegVars cs ivs = (nonnegVars, cs)+ where+ vs = vars cs+ bounds = BI.inferBounds initialBounds cs ivs 1000+ where+ initialBounds = IM.fromList [(v, Interval.whole) | v <- IS.toList vs]+ nonnegVars = IS.filter f vs+ where+ f v = case Interval.lowerBound (bounds IM.! v) of+ Interval.Finite lb | 0 <= lb -> True+ _ -> False++ isTriviallyTrue :: LA.Atom r -> Bool+ isTriviallyTrue (Rel a op b) =+ case op of+ Le ->+ case ub of+ Interval.PosInf -> False+ Interval.Finite val -> val <= 0+ Interval.NegInf -> True -- should not happen+ Ge ->+ case lb of+ Interval.NegInf -> False+ Interval.Finite val -> val >= 0+ Interval.PosInf -> True -- should not happen+ Lt ->+ case ub of+ Interval.PosInf -> False+ Interval.Finite val -> val < 0 || (not inUB && val <= 0)+ Interval.NegInf -> True -- should not happen+ Gt ->+ case lb of+ Interval.NegInf -> False+ Interval.Finite val -> val > 0 || (not inLB && val >= 0)+ Interval.PosInf -> True -- should not happen+ Eql -> isTriviallyTrue (c .<=. zeroV) && isTriviallyTrue (c .>=. zeroV)+ NEq -> isTriviallyTrue (c .<. zeroV) || isTriviallyTrue (c .>. zeroV)+ where+ c = a ^-^ b+ i = LA.computeInterval bounds c+ (lb, inLB) = Interval.lowerBound' i+ (ub, inUB) = Interval.upperBound' i++-- ---------------------------------------------------------------------------
+ src/ToySolver/LPSolverHL.hs view
@@ -0,0 +1,275 @@+{-# LANGUAGE ScopedTypeVariables #-}+{-# OPTIONS_GHC -Wall #-}+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.LPSolverHL+-- Copyright : (c) Masahiro Sakai 2011+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : provisional+-- Portability : non-portable (ScopedTypeVariables)+--+-- High-Level API for LPSolver.hs+--+-----------------------------------------------------------------------------++module ToySolver.LPSolverHL+ ( OptResult (..)+ , minimize+ , maximize+ , optimize+ , solve+ ) where++import Control.Monad.State+import qualified Data.IntMap as IM+import qualified Data.IntSet as IS+import Data.OptDir+import Data.VectorSpace++import ToySolver.Data.ArithRel+import qualified ToySolver.Data.LA as LA+import ToySolver.Data.Var+import qualified ToySolver.Simplex as Simplex+import qualified ToySolver.LPSolver as LPSolver+import ToySolver.LPSolver hiding (OptResult (..))++-- ---------------------------------------------------------------------------++-- | results of optimization+data OptResult r = OptUnsat | Unbounded | Optimum r (Model r)+ deriving (Show, Eq, Ord)++maximize :: (RealFrac r) => LA.Expr r -> [LA.Atom r] -> OptResult r+maximize = optimize OptMax++minimize :: (RealFrac r) => LA.Expr r -> [LA.Atom r] -> OptResult r+minimize = optimize OptMin++solve :: (RealFrac r) => [LA.Atom r] -> Maybe (Model r)+solve cs =+ flip evalState (emptySolver vs) $ do+ tableau cs+ ret <- phaseI+ if not ret+ then return Nothing+ else do+ m <- getModel vs+ return (Just m)+ where+ vs = vars cs++optimize :: (RealFrac r) => OptDir -> LA.Expr r -> [LA.Atom r] -> OptResult r+optimize optdir obj cs =+ flip evalState (emptySolver vs) $ do+ tableau cs+ ret <- LPSolver.twoPhaseSimplex optdir obj+ case ret of+ LPSolver.Unsat -> return OptUnsat+ LPSolver.Unbounded -> return Unbounded+ LPSolver.Optimum -> do+ m <- getModel vs+ tbl <- getTableau + return $ Optimum (Simplex.currentObjValue tbl) m+ where+ vs = vars cs `IS.union` vars obj++-- ---------------------------------------------------------------------------+-- Test cases++example_3_2 :: (LA.Expr Rational, [LA.Atom Rational])+example_3_2 = (obj, cond)+ where+ x1 = LA.var 1+ x2 = LA.var 2+ x3 = LA.var 3+ obj = 3*^x1 ^+^ 2*^x2 ^+^ 3*^x3+ cond = [ 2*^x1 ^+^ x2 ^+^ x3 .<=. LA.constant 2+ , x1 ^+^ 2*^x2 ^+^ 3*^x3 .<=. LA.constant 5+ , 2*^x1 ^+^ 2*^x2 ^+^ x3 .<=. LA.constant 6+ , x1 .>=. LA.constant 0+ , x2 .>=. LA.constant 0+ , x3 .>=. LA.constant 0+ ]++test_3_2 :: Bool+test_3_2 =+ uncurry maximize example_3_2 == + Optimum (27/5) (IM.fromList [(1,1/5),(2,0),(3,8/5)])++example_3_5 :: (LA.Expr Rational, [LA.Atom Rational])+example_3_5 = (obj, cond)+ where+ x1 = LA.var 1+ x2 = LA.var 2+ x3 = LA.var 3+ x4 = LA.var 4+ x5 = LA.var 5+ obj = (-2)*^x1 ^+^ 4*^x2 ^+^ 7*^x3 ^+^ x4 ^+^ 5*^x5+ cond = [ (-1)*^x1 ^+^ x2 ^+^ 2*^x3 ^+^ x4 ^+^ 2*^x5 .==. LA.constant 7+ , (-1)*^x1 ^+^ 2*^x2 ^+^ 3*^x3 ^+^ x4 ^+^ x5 .==. LA.constant 6+ , (-1)*^x1 ^+^ x2 ^+^ x3 ^+^ 2*^x4 ^+^ x5 .==. LA.constant 4+ , x2 .>=. LA.constant 0+ , x3 .>=. LA.constant 0+ , x4 .>=. LA.constant 0+ , x5 .>=. LA.constant 0+ ]++test_3_5 :: Bool+test_3_5 =+ uncurry minimize example_3_5 ==+ Optimum 19 (IM.fromList [(1,-1),(2,0),(3,1),(4,0),(5,2)])++example_4_1 :: (LA.Expr Rational, [LA.Atom Rational])+example_4_1 = (obj, cond)+ where+ x1 = LA.var 1+ x2 = LA.var 2+ obj = 2*^x1 ^+^ x2+ cond = [ (-1)*^x1 ^+^ x2 .>=. LA.constant 2+ , x1 ^+^ x2 .<=. LA.constant 1+ , x1 .>=. LA.constant 0+ , x2 .>=. LA.constant 0+ ]++test_4_1 :: Bool+test_4_1 =+ uncurry maximize example_4_1 ==+ OptUnsat++example_4_2 :: (LA.Expr Rational, [LA.Atom Rational])+example_4_2 = (obj, cond)+ where+ x1 = LA.var 1+ x2 = LA.var 2+ obj = 2*^x1 ^+^ x2+ cond = [ (-1)*^x1 ^-^ x2 .<=. LA.constant 10+ , 2*^x1 ^-^ x2 .<=. LA.constant 40+ , x1 .>=. LA.constant 0+ , x2 .>=. LA.constant 0+ ]++test_4_2 :: Bool+test_4_2 =+ uncurry maximize example_4_2 ==+ Unbounded++example_4_3 :: (LA.Expr Rational, [LA.Atom Rational])+example_4_3 = (obj, cond)+ where+ x1 = LA.var 1+ x2 = LA.var 2+ obj = 6*^x1 ^-^ 2*^x2+ cond = [ 2*^x1 ^-^ x2 .<=. LA.constant 2+ , x1 .<=. LA.constant 4+ , x1 .>=. LA.constant 0+ , x2 .>=. LA.constant 0+ ]++test_4_3 :: Bool+test_4_3 =+ uncurry maximize example_4_3 ==+ Optimum 12 (IM.fromList [(1,4),(2,6)])++example_4_5 :: (LA.Expr Rational, [LA.Atom Rational])+example_4_5 = (obj, cond)+ where+ x1 = LA.var 1+ x2 = LA.var 2+ obj = 2*^x1 ^+^ x2+ cond = [ 4*^x1 ^+^ 3*^x2 .<=. LA.constant 12+ , 4*^x1 ^+^ x2 .<=. LA.constant 8+ , 4*^x1 ^-^ x2 .<=. LA.constant 8+ , x1 .>=. LA.constant 0+ , x2 .>=. LA.constant 0+ ]++test_4_5 :: Bool+test_4_5 =+ uncurry maximize example_4_5 ==+ Optimum 5 (IM.fromList [(1,3/2),(2,2)])++example_4_6 :: (LA.Expr Rational, [LA.Atom Rational])+example_4_6 = (obj, cond)+ where+ x1 = LA.var 1+ x2 = LA.var 2+ x3 = LA.var 3+ x4 = LA.var 4+ obj = 20*^x1 ^+^ (1/2)*^x2 ^-^ 6*^x3 ^+^ (3/4)*^x4+ cond = [ x1 .<=. LA.constant 2+ , 8*^x1 ^-^ x2 ^+^ 9*^x3 ^+^ (1/4)*^x4 .<=. LA.constant 16+ , 12*^x1 ^-^ (1/2)*^x2 ^+^ 3*^x3 ^+^ (1/2)*^x4 .<=. LA.constant 24+ , x2 .<=. LA.constant 1+ , x1 .>=. LA.constant 0+ , x2 .>=. LA.constant 0+ , x3 .>=. LA.constant 0+ , x4 .>=. LA.constant 0+ ]++test_4_6 :: Bool+test_4_6 =+ uncurry maximize example_4_6 ==+ Optimum (165/4) (IM.fromList [(1,2),(2,1),(3,0),(4,1)])++example_4_7 :: (LA.Expr Rational, [LA.Atom Rational])+example_4_7 = (obj, cond)+ where+ x1 = LA.var 1+ x2 = LA.var 2+ x3 = LA.var 3+ x4 = LA.var 4+ obj = x1 ^+^ 1.5*^x2 ^+^ 5*^x3 ^+^ 2*^x4+ cond = [ 3*^x1 ^+^ 2*^x2 ^+^ x3 ^+^ 4*^x4 .<=. LA.constant 6+ , 2*^x1 ^+^ x2 ^+^ 5*^x3 ^+^ x4 .<=. LA.constant 4+ , 2*^x1 ^+^ 6*^x2 ^-^ 4*^x3 ^+^ 8*^x4 .==. LA.constant 0+ , x1 ^+^ 3*^x2 ^-^ 2*^x3 ^+^ 4*^x4 .==. LA.constant 0+ , x1 .>=. LA.constant 0+ , x2 .>=. LA.constant 0+ , x3 .>=. LA.constant 0+ , x4 .>=. LA.constant 0+ ]++test_4_7 :: Bool+test_4_7 =+ uncurry maximize example_4_7 ==+ Optimum (48/11) (IM.fromList [(1,0),(2,0),(3,81),(4,41)])++-- 退化して巡回の起こるKuhnの7変数3制約の例+kuhn_7_3 :: (LA.Expr Rational, [LA.Atom Rational])+kuhn_7_3 = (obj, cond)+ where+ [x1,x2,x3,x4,x5,x6,x7] = map LA.var [1..7]+ obj = (-2)*^x4 ^+^ (-3)*^x5 ^+^ x6 ^+^ 12*^x7+ cond = [ x1 ^-^ 2*^x4 ^-^ 9*^x5 ^+^ x6 ^+^ 9*^x7 .==. LA.constant 0+ , x2 ^+^ (1/3)*^x4 ^+^ x5 ^-^ (1/3)*^x6 ^-^ 2*^x7 .==. LA.constant 0+ , x3 ^+^ 2*^x4 ^+^ 3*^x5 ^-^ x6 ^-^ 12*^x7 .==. LA.constant 2+ , x1 .>=. LA.constant 0+ , x2 .>=. LA.constant 0+ , x3 .>=. LA.constant 0+ , x4 .>=. LA.constant 0+ , x5 .>=. LA.constant 0+ , x6 .>=. LA.constant 0+ , x7 .>=. LA.constant 0+ ]++test_kuhn_7_3 :: Bool+test_kuhn_7_3 =+ uncurry minimize kuhn_7_3 ==+ Optimum (-2) (IM.fromList [(1,2),(2,0),(3,0),(4,2),(5,0),(6,2),(7,0)])++testAll :: Bool+testAll = and+ [ test_3_2+ , test_3_5+ , test_4_1+ , test_4_2+ , test_4_3+ , test_4_5+ , test_4_6+ , test_4_7+ , test_kuhn_7_3+ ]++-- ---------------------------------------------------------------------------
+ src/ToySolver/LPUtil.hs view
@@ -0,0 +1,92 @@+module ToySolver.LPUtil+ ( toStandardForm+ , toStandardForm'+ ) where++import Control.Exception+import Control.Monad+import Control.Monad.State+import qualified Data.IntMap as IM+import qualified Data.IntSet as IS+import Data.Maybe+import Data.VectorSpace++import qualified Data.Interval as Interval++import ToySolver.Data.ArithRel+import qualified ToySolver.Data.LA as LA+import ToySolver.Data.Var+import qualified ToySolver.BoundsInference as BI++toStandardForm+ :: (LA.Expr Rational, [Rel (LA.Expr Rational)])+ -> ( (LA.Expr Rational, [(LA.Expr Rational, Rational)])+ , Model Rational -> Model Rational+ )+toStandardForm prob1@(obj, cs) = (prob2, mt)+ where+ vs = vars obj `IS.union` vars cs+ (prob2,s) = toStandardForm' prob1+ mt m = IM.fromAscList $ do+ v <- IS.toAscList vs+ case IM.lookup v s of+ Just def -> return (v, LA.evalExpr m def)+ Nothing -> return (v, m IM.! v)++type M = State Var++toStandardForm'+ :: (LA.Expr Rational, [Rel (LA.Expr Rational)])+ -> ( (LA.Expr Rational, [(LA.Expr Rational, Rational)])+ , VarMap (LA.Expr Rational)+ )+toStandardForm' (obj, cs) = m+ where+ vs = vars obj `IS.union` vars cs+ v1 = if IS.null vs then 0 else IS.findMax vs + 1+ initialBounds = IM.fromList [(v, Interval.whole) | v <- IS.toList vs]+ bounds = BI.inferBounds initialBounds cs IS.empty 10++ gensym :: M Var+ gensym = do+ v <- get+ put $ v+1+ return v++ m = flip evalState v1 $ do+ s <- liftM IM.unions $ forM (IM.toList bounds) $ \(v,i) -> do+ case Interval.lowerBound i of+ Interval.NegInf -> do+ v1 <- gensym+ v2 <- gensym+ return $ IM.singleton v (LA.var v1 ^-^ LA.var v2)+ Interval.Finite lb+ | lb >= 0 -> return IM.empty+ | otherwise -> do+ v1 <- gensym+ return $ IM.singleton v (LA.var v1 ^-^ LA.constant lb)+ let obj2 = LA.applySubst s obj++ cs2 <- liftM concat $ forM cs $ \(Rel lhs op rhs) -> do+ case LA.extract LA.unitVar (LA.applySubst s (lhs ^-^ rhs)) of+ (c,e) -> do+ let (lhs2,op2,rhs2) =+ if -c >= 0+ then (e,op,-c)+ else (negateV e, flipOp op, c)+ case op2 of+ Eql -> return [(lhs2,rhs2)]+ Le -> do+ v <- gensym+ return [(lhs2 ^+^ LA.var v, rhs2)]+ Ge -> do+ case LA.terms lhs2 of+ [(1,_)] | rhs2<=0 -> return []+ _ -> do+ v <- gensym+ return [(lhs2 ^-^ LA.var v, rhs2)]+ _ -> error $ "ToySolver.LPUtil.toStandardForm: " ++ show op2 ++ " is not supported"++ assert (and [isNothing $ LA.lookupCoeff LA.unitVar c | (c,_) <- cs2]) $ return ()++ return ((obj2,cs2),s)
+ src/ToySolver/MIPSolver2.hs view
@@ -0,0 +1,501 @@+{-# LANGUAGE ScopedTypeVariables, Rank2Types #-}+{-# OPTIONS_GHC -Wall #-}+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.MIPSolver2+-- Copyright : (c) Masahiro Sakai 2012+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : provisional+-- Portability : non-portable (ScopedTypeVariables, Rank2Types)+--+-- Naïve implementation of MIP solver based on Simplex2 module+-- +-- Reference:+--+-- * <http://www.math.cuhk.edu.hk/~wei/lpch3.pdf>+-- +-- * Ralph E. Gomory.+-- \"An Algorithm for the Mixed Integer Problem\", Technical Report+-- RM-2597, 1960, The Rand Corporation, Santa Monica, CA.+-- <http://www.rand.org/pubs/research_memoranda/RM2597.html>+--+-- * Ralph E. Gomory.+-- \"Outline of an algorithm for integer solutions to linear programs\".+-- Bull. Amer. Math. Soc., Vol. 64, No. 5. (1958), pp. 275-278.+-- <http://projecteuclid.org/euclid.bams/1183522679>+-- +-- * R. C. Daniel and Martyn Jeffreys.+-- \"Unboundedness in Integer and Discrete Programming L.P. Relaxations\"+-- The Journal of the Operational Research Society, Vol. 30, No. 12. (1979)+-- <http://www.jstor.org/stable/3009435>+-- +-----------------------------------------------------------------------------+module ToySolver.MIPSolver2+ (+ -- * The @Solver@ type+ Solver+ , newSolver++ -- * Solving+ , optimize++ -- * Extract results+ , getBestSolution+ , getBestValue+ , getBestModel++ -- * Configulation+ , setNThread+ , setLogger+ , setOnUpdateBestSolution+ , setShowRational+ ) where++import Prelude hiding (log)++import Control.Monad+import Control.Exception+import Control.Concurrent+import Control.Concurrent.STM+import Data.List+import Data.OptDir+import Data.Ord+import Data.IORef+import Data.Maybe+import qualified Data.IntSet as IS+import qualified Data.IntMap as IM+import qualified Data.Map as Map+import qualified Data.Sequence as Seq+import qualified Data.Foldable as F+import Data.VectorSpace+import Data.Time+import System.CPUTime+import System.Timeout+import Text.Printf++import qualified ToySolver.Data.LA as LA+import ToySolver.Data.ArithRel ((.<=.), (.>=.))+import qualified ToySolver.Simplex2 as Simplex2+import ToySolver.Simplex2 (OptResult (..), Var, Model)+import ToySolver.Internal.Util (isInteger, fracPart)++data Solver+ = MIP+ { mipRootLP :: Simplex2.Solver+ , mipIVs :: IS.IntSet+ , mipBest :: TVar (Maybe Node)++ , mipNThread :: IORef Int+ , mipLogger :: IORef (Maybe (String -> IO ()))+ , mipOnUpdateBestSolution :: IORef (Model -> Rational -> IO ())+ , mipShowRational :: IORef Bool+ }++data Node =+ Node+ { ndLP :: Simplex2.Solver+ , ndDepth :: {-# UNPACK #-} !Int+ , ndValue :: Rational+ }++newSolver :: Simplex2.Solver -> IS.IntSet -> IO Solver+newSolver lp ivs = do+ lp2 <- Simplex2.cloneSolver lp++ forM_ (IS.toList ivs) $ \v -> do+ lb <- Simplex2.getLB lp2 v+ case lb of+ Just l | not (isInteger l) ->+ Simplex2.assertLower lp2 v (fromInteger (ceiling l))+ _ -> return ()+ ub <- Simplex2.getUB lp2 v+ case ub of+ Just u | not (isInteger u) ->+ Simplex2.assertLower lp2 v (fromInteger (floor u))+ _ -> return ()++ bestRef <- newTVarIO Nothing++ nthreadRef <- newIORef 0+ logRef <- newIORef Nothing+ showRef <- newIORef False+ updateRef <- newIORef (\_ _ -> return ())++ return $+ MIP+ { mipRootLP = lp2+ , mipIVs = ivs+ , mipBest = bestRef++ , mipNThread = nthreadRef+ , mipLogger = logRef+ , mipOnUpdateBestSolution = updateRef+ , mipShowRational = showRef+ }++optimize :: Solver -> IO OptResult+optimize solver = do+ let lp = mipRootLP solver+ update <- readIORef (mipOnUpdateBestSolution solver)+ log solver "MIP: Solving LP relaxation..."+ ret <- Simplex2.check lp+ if not ret+ then return Unsat+ else do+ s0 <- showValue solver =<< Simplex2.getObjValue lp+ log solver (printf "MIP: LP relaxation is satisfiable with obj = %s" s0)+ log solver "MIP: Optimizing LP relaxation"+ ret2 <- Simplex2.optimize lp Simplex2.defaultOptions+ case ret2 of+ Unsat -> error "should not happen"+ ObjLimit -> error "should not happen"+ Unbounded -> do+ log solver "MIP: LP relaxation is unbounded"+ let ivs = mipIVs solver+ if IS.null ivs+ then return Unbounded+ else do+ {-+ * In general, original problem may have optimal+ solution even though LP relaxiation is unbounded.+ * But if restricted to rational numbers, the+ original problem is unbounded or unsatisfiable+ when LP relaxation is unbounded.+ -}+ origObj <- Simplex2.getObj lp+ lp2 <- Simplex2.cloneSolver lp+ Simplex2.clearLogger lp2+ Simplex2.setObj lp2 (LA.constant 0)+ branchAndBound solver lp2 $ \m _ -> do+ update m (LA.evalExpr m origObj)+ best <- readTVarIO (mipBest solver)+ case best of+ Just nd -> do+ m <- Simplex2.model (ndLP nd)+ atomically $ writeTVar (mipBest solver) $ Just nd{ ndValue = LA.evalExpr m origObj }+ return Unbounded+ Nothing -> return Unsat+ Optimum -> do+ s1 <- showValue solver =<< Simplex2.getObjValue lp+ log solver $ "MIP: LP relaxation optimum is " ++ s1+ log solver "MIP: Integer optimization begins..."+ Simplex2.clearLogger lp+ branchAndBound solver lp update+ m <- readTVarIO (mipBest solver)+ case m of+ Nothing -> return Unsat+ Just _ -> return Optimum++branchAndBound :: Solver -> Simplex2.Solver -> (Model -> Rational -> IO ()) -> IO ()+branchAndBound solver rootLP update = do+ dir <- Simplex2.getOptDir rootLP+ rootVal <- Simplex2.getObjValue rootLP+ let root = Node{ ndLP = rootLP, ndDepth = 0, ndValue = rootVal }++ pool <- newTVarIO (Seq.singleton root)+ activeThreads <- newTVarIO (Map.empty)+ visitedNodes <- newTVarIO 0+ solchan <- newTChanIO++ let addNode :: Node -> STM ()+ addNode nd = do+ modifyTVar pool (Seq.|> nd)++ pickNode :: IO (Maybe Node)+ pickNode = do+ self <- myThreadId+ atomically $ modifyTVar activeThreads (Map.delete self)+ atomically $ do+ s <- readTVar pool+ case Seq.viewl s of+ nd Seq.:< s2 -> do+ writeTVar pool s2+ modifyTVar activeThreads (Map.insert self nd)+ return (Just nd)+ Seq.EmptyL -> do+ ths <- readTVar activeThreads+ if Map.null ths+ then return Nothing+ else retry++ processNode :: Node -> IO ()+ processNode node = do+ let lp = ndLP node+ lim <- liftM (fmap ndValue) $ readTVarIO (mipBest solver)+ ret <- Simplex2.dualSimplex lp Simplex2.defaultOptions{ Simplex2.objLimit = lim }++ case ret of+ Unbounded -> error "should not happen"+ Unsat -> return ()+ ObjLimit -> return ()+ Optimum -> do+ val <- Simplex2.getObjValue lp+ p <- prune solver val+ unless p $ do+ xs <- violated node (mipIVs solver)+ case xs of+ [] -> atomically $ writeTChan solchan $ node { ndValue = val }+ _ -> do+ r <- if ndDepth node `mod` 100 /= 0+ then return Nothing+ else liftM listToMaybe $ filterM (canDeriveGomoryCut lp) $ map fst xs+ case r of+ Nothing -> do -- branch+ let (v0,val0) = fst $ maximumBy (comparing snd)+ [((v,vval), abs (fromInteger (round vval) - vval)) | (v,vval) <- xs]+ let lp1 = lp+ lp2 <- Simplex2.cloneSolver lp+ Simplex2.assertAtom lp1 (LA.var v0 .<=. LA.constant (fromInteger (floor val0)))+ Simplex2.assertAtom lp2 (LA.var v0 .>=. LA.constant (fromInteger (ceiling val0)))+ atomically $ do+ addNode $ Node lp1 (ndDepth node + 1) val+ addNode $ Node lp2 (ndDepth node + 1) val+ modifyTVar visitedNodes (+1)+ Just v -> do -- cut+ atom <- deriveGomoryCut lp (mipIVs solver) v+ Simplex2.assertAtom lp atom+ atomically $ do+ addNode $ Node lp (ndDepth node + 1) val++ let isCompleted = do+ nodes <- readTVar pool+ threads <- readTVar activeThreads+ return $ Seq.null nodes && Map.null threads++ -- fork worker threads+ nthreads <- liftM (max 1) $ readIORef (mipNThread solver)++ log solver $ printf "MIP: forking %d worker threads..." nthreads++ startCPU <- getCPUTime+ startWC <- getCurrentTime+ ex <- newEmptyTMVarIO++ let printStatus :: Seq.Seq Node -> Int -> IO ()+ printStatus nodes visited+ | Seq.null nodes = return () -- should not happen+ | otherwise = do+ nowCPU <- getCPUTime+ nowWC <- getCurrentTime+ let spentCPU = (nowCPU - startCPU) `div` 10^(12::Int)+ let spentWC = round (nowWC `diffUTCTime` startWC) :: Int++ let vs = map ndValue (F.toList nodes)+ dualBound =+ case dir of+ OptMin -> minimum vs+ OptMax -> maximum vs++ primalBound <- do+ x <- readTVarIO (mipBest solver) -- TODO: 引数にするようにした方が良い?+ return $ case x of+ Nothing -> Nothing+ Just node -> Just (ndValue node)++ (p,g) <- case primalBound of+ Nothing -> return ("not yet found", "--")+ Just val -> do+ p <- showValue solver val+ let g = if val == 0+ then "inf"+ else printf "%.2f%%" (fromRational (abs (dualBound - val) * 100 / abs val) :: Double)+ return (p, g)+ d <- showValue solver dualBound+ + let range =+ case dir of+ OptMin -> p ++ " >= " ++ d+ OptMax -> p ++ " <= " ++ d++ log solver $ printf "cpu time = %d sec; wc time = %d sec; active nodes = %d; visited nodes = %d; %s; gap = %s"+ spentCPU spentWC (Seq.length nodes) visited range g++ mask $ \(restore :: forall a. IO a -> IO a) -> do+ threads <- replicateM nthreads $ do+ forkIO $ do+ let loop = do+ m <- pickNode+ case m of+ Nothing -> return ()+ Just node -> processNode node >> loop+ ret <- try $ restore loop+ case ret of+ Left e -> atomically (putTMVar ex e)+ Right _ -> return () ++ let propagateException :: SomeException -> IO ()+ propagateException e = do+ mapM_ (\t -> throwTo t e) threads+ throwIO e++ let loop = do+ ret <- try $ timeout (2*1000*1000) $ restore $ atomically $ msum+ [ do node <- readTChan solchan+ ret <- do+ old <- readTVar (mipBest solver)+ case old of+ Nothing -> do+ writeTVar (mipBest solver) (Just node)+ return True+ Just best -> do+ let isBetter = if dir==OptMin then ndValue node < ndValue best else ndValue node > ndValue best+ when isBetter $ writeTVar (mipBest solver) (Just node)+ return isBetter+ return $ do+ when ret $ do+ let lp = ndLP node+ m <- Simplex2.model lp+ update m (ndValue node)+ loop+ , do b <- isCompleted+ guard b+ return $ return ()+ , do e <- readTMVar ex+ return $ propagateException e+ ]++ case ret of+ Left (e::SomeException) -> propagateException e+ Right (Just m) -> m+ Right Nothing -> do -- timeout+ (nodes, visited) <- atomically $ do+ nodes <- readTVar pool+ athreads <- readTVar activeThreads+ visited <- readTVar visitedNodes+ return (Seq.fromList (Map.elems athreads) Seq.>< nodes, visited)+ printStatus nodes visited+ loop++ loop++getBestSolution :: Solver -> IO (Maybe (Model, Rational))+getBestSolution solver = do+ ret <- readTVarIO (mipBest solver)+ case ret of+ Nothing -> return Nothing+ Just node -> do+ m <- Simplex2.model (ndLP node)+ return $ Just (m, ndValue node)++getBestModel :: Solver -> IO (Maybe Model)+getBestModel solver = liftM (fmap fst) $ getBestSolution solver++getBestValue :: Solver -> IO (Maybe Rational)+getBestValue solver = liftM (fmap snd) $ getBestSolution solver++violated :: Node -> IS.IntSet -> IO [(Var, Rational)]+violated node ivs = do+ m <- Simplex2.model (ndLP node)+ let p (v,val) = v `IS.member` ivs && not (isInteger val)+ return $ filter p (IM.toList m)++prune :: Solver -> Rational -> IO Bool+prune solver lb = do+ b <- readTVarIO (mipBest solver)+ case b of+ Nothing -> return False+ Just node -> do+ dir <- Simplex2.getOptDir (mipRootLP solver)+ return $ if dir==OptMin then ndValue node <= lb else ndValue node >= lb++showValue :: Solver -> Rational -> IO String+showValue solver v = do+ printRat <- readIORef (mipShowRational solver)+ return $ Simplex2.showValue printRat v++setShowRational :: Solver -> Bool -> IO ()+setShowRational solver = writeIORef (mipShowRational solver)++setNThread :: Solver -> Int -> IO ()+setNThread solver = writeIORef (mipNThread solver)++{--------------------------------------------------------------------+ Logging+--------------------------------------------------------------------}++-- | set callback function for receiving messages.+setLogger :: Solver -> (String -> IO ()) -> IO ()+setLogger solver logger = do+ writeIORef (mipLogger solver) (Just logger)++setOnUpdateBestSolution :: Solver -> (Model -> Rational -> IO ()) -> IO ()+setOnUpdateBestSolution solver cb = do+ writeIORef (mipOnUpdateBestSolution solver) cb++log :: Solver -> String -> IO ()+log solver msg = logIO solver (return msg)++logIO :: Solver -> IO String -> IO ()+logIO solver action = do+ m <- readIORef (mipLogger solver)+ case m of+ Nothing -> return ()+ Just logger -> action >>= logger++{--------------------------------------------------------------------+ GomoryCut+--------------------------------------------------------------------}++deriveGomoryCut :: Simplex2.Solver -> IS.IntSet -> Var -> IO (LA.Atom Rational)+deriveGomoryCut lp ivs xi = do+ v0 <- Simplex2.getValue lp xi+ let f0 = fracPart v0+ assert (0 < f0 && f0 < 1) $ return ()++ row <- Simplex2.getRow lp xi++ -- remove fixed variables+ let p (_,xj) = do+ lb <- Simplex2.getLB lp xj+ ub <- Simplex2.getUB lp xj+ case (lb,ub) of+ (Just l, Just u) -> return (l < u)+ _ -> return True+ ns <- filterM p $ LA.terms row++ js <- flip filterM ns $ \(_, xj) -> do+ vj <- Simplex2.getValue lp xj+ lb <- Simplex2.getLB lp xj+ return $ Just vj == lb+ ks <- flip filterM ns $ \(_, xj) -> do+ vj <- Simplex2.getValue lp xj+ ub <- Simplex2.getUB lp xj+ return $ Just vj == ub++ xs1 <- forM js $ \(aij, xj) -> do+ let fj = fracPart aij+ Just lj <- Simplex2.getLB lp xj+ let c = if xj `IS.member` ivs+ then (if fj <= 1 - f0 then fj / (1 - f0) else ((1 - fj) / f0))+ else (if aij > 0 then aij / (1 - f0) else (-aij / f0))+ return $ c *^ (LA.var xj ^-^ LA.constant lj)+ xs2 <- forM ks $ \(aij, xj) -> do+ let fj = fracPart aij+ Just uj <- Simplex2.getUB lp xj+ let c = if xj `IS.member` ivs+ then (if fj <= f0 then fj / f0 else ((1 - fj) / (1 - f0)))+ else (if aij > 0 then aij / f0 else (-aij / (1 - f0)))+ return $ c *^ (LA.constant uj ^-^ LA.var xj)++ return $ sumV xs1 ^+^ sumV xs2 .>=. LA.constant 1++-- TODO: Simplex2をδに対応させたら、xi, xj がδを含まない有理数であるという条件も必要+canDeriveGomoryCut :: Simplex2.Solver -> Var -> IO Bool+canDeriveGomoryCut lp xi = do+ b <- Simplex2.isBasicVariable lp xi+ if not b+ then return False+ else do+ val <- Simplex2.getValue lp xi+ if isInteger val+ then return False+ else do+ row <- Simplex2.getRow lp xi+ ys <- forM (LA.terms row) $ \(_,xj) -> do+ vj <- Simplex2.getValue lp xj+ lb <- Simplex2.getLB lp xj+ ub <- Simplex2.getUB lp xj+ return $ Just vj == lb || Just vj == ub+ return (and ys)
+ src/ToySolver/MIPSolverHL.hs view
@@ -0,0 +1,283 @@+{-# LANGUAGE ScopedTypeVariables #-}+{-# OPTIONS_GHC -Wall #-}+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.MIPSolverHL+-- Copyright : (c) Masahiro Sakai 2011+-- License : BSD-style+--+-- Maintainer : masahiro.sakai@gmail.com+-- Stability : provisional+-- Portability : non-portable (ScopedTypeVariables)+--+-- References:+-- +-- * [Gomory1960]+-- Ralph E. Gomory.+-- An Algorithm for the Mixed Integer Problem, Technical Report+-- RM-2597, 1960, The Rand Corporation, Santa Monica, CA.+-- <http://www.rand.org/pubs/research_memoranda/RM2597.html>+--+-- * [Gomory1958]+-- Ralph E. Gomory.+-- Outline of an algorithm for integer solutions to linear programs.+-- Bull. Amer. Math. Soc., Vol. 64, No. 5. (1958), pp. 275-278.+-- <http://projecteuclid.org/euclid.bams/1183522679>+-----------------------------------------------------------------------------++module ToySolver.MIPSolverHL+ ( module Data.OptDir+ , OptResult (..)+ , minimize+ , maximize+ , optimize+ ) where++import Control.Exception+import Control.Monad.State+import Data.Ord+import Data.Maybe+import Data.List (maximumBy)+import qualified Data.IntMap as IM+import qualified Data.IntSet as IS+import Data.OptDir+import Data.VectorSpace++import ToySolver.Data.ArithRel+import ToySolver.Data.Var+import qualified ToySolver.Data.LA as LA+import qualified ToySolver.Simplex as Simplex+import qualified ToySolver.LPSolver as LPSolver+import ToySolver.LPSolver hiding (OptResult (..))+import ToySolver.LPSolverHL (OptResult (..))+import qualified ToySolver.OmegaTest as OmegaTest+import ToySolver.Internal.Util (isInteger, fracPart)++-- ---------------------------------------------------------------------------++data Node r+ = Node+ { ndSolver :: LPSolver.Solver r+ , ndDepth :: {-# UNPACK #-} !Int+-- , ndCutSlackVariables :: VarSet+ }++ndTableau :: Node r -> Simplex.Tableau r+ndTableau node = evalState getTableau (ndSolver node)++ndLowerBound :: (Num r, Eq r) => Node r -> r+ndLowerBound node = evalState (liftM Simplex.currentObjValue getTableau) (ndSolver node)++data Err = ErrUnbounded | ErrUnsat deriving (Ord, Eq, Show, Enum, Bounded)++maximize :: RealFrac r => LA.Expr r -> [LA.Atom r] -> VarSet -> OptResult r+maximize = optimize OptMax++minimize :: RealFrac r => LA.Expr r -> [LA.Atom r] -> VarSet -> OptResult r+minimize = optimize OptMin++optimize :: RealFrac r => OptDir -> LA.Expr r -> [LA.Atom r] -> VarSet -> OptResult r+optimize optdir obj cs ivs = + case mkInitialNode optdir obj cs ivs of+ Left err ->+ case err of+ ErrUnsat -> OptUnsat+ ErrUnbounded ->+ if IS.null ivs+ then Unbounded+ else+ {-+ Fallback to Fourier-Motzkin + OmegaTest+ * In general, original problem may have optimal+ solution even though LP relaxiation is unbounded.+ * But if restricted to rational numbers, the+ original problem is unbounded or unsatisfiable+ when LP relaxation is unbounded.+ -}+ case OmegaTest.solveQFLA OmegaTest.defaultOptions (vars cs `IS.union` ivs) (map conv cs) ivs of+ Nothing -> OptUnsat+ Just _ -> Unbounded + Right (node0, ivs2) -> + case traverse optdir obj ivs2 node0 of+ Left ErrUnbounded -> error "shoud not happen"+ Left ErrUnsat -> OptUnsat+ Right node -> flip evalState (ndSolver node) $ do+ tbl <- getTableau+ model <- getModel vs+ return $ Optimum (Simplex.currentObjValue tbl) model+ where+ vs = vars cs `IS.union` vars obj++tableau' :: (RealFrac r) => [LA.Atom r] -> VarSet -> LP r VarSet+tableau' cs ivs = do+ let (nonnegVars, cs') = collectNonnegVars cs ivs+ fvs = vars cs `IS.difference` nonnegVars+ ivs2 <- liftM IS.unions $ forM (IS.toList fvs) $ \v -> do+ v1 <- newVar+ v2 <- newVar+ define v (LA.var v1 ^-^ LA.var v2)+ return $ if v `IS.member` ivs then IS.fromList [v1,v2] else IS.empty+ mapM_ addConstraint cs'+ return ivs2++conv :: RealFrac r => LA.Atom r -> LA.Atom Rational+conv (Rel a op b) = Rel (f a) op (f b)+ where+ f = LA.mapCoeff toRational++mkInitialNode :: RealFrac r => OptDir -> LA.Expr r -> [LA.Atom r] -> VarSet -> Either Err (Node r, VarSet)+mkInitialNode optdir obj cs ivs =+ flip evalState (emptySolver vs) $ do+ ivs2 <- tableau' cs ivs+ ret <- LPSolver.twoPhaseSimplex optdir obj+ case ret of+ LPSolver.Unsat -> return (Left ErrUnsat)+ LPSolver.Unbounded -> return (Left ErrUnbounded)+ LPSolver.Optimum -> do+ solver <- get+ return $ Right $+ ( Node{ ndSolver = solver+ , ndDepth = 0+-- , ndCutSlackVariables = IS.empty+ }+ , ivs `IS.union` ivs2+ )+ where+ vs = vars cs `IS.union` vars obj++isStrictlyBetter :: RealFrac r => OptDir -> r -> r -> Bool+isStrictlyBetter optdir = if optdir==OptMin then (<) else (>)++traverse :: forall r. RealFrac r => OptDir -> LA.Expr r -> VarSet -> Node r -> Either Err (Node r)+traverse optdir obj ivs node0 = loop [node0] Nothing+ where+ loop :: [Node r] -> Maybe (Node r) -> Either Err (Node r)+ loop [] (Just best) = Right best+ loop [] Nothing = Left ErrUnsat+ loop (n:ns) Nothing =+ case children n of+ Nothing -> loop ns (Just n)+ Just cs -> loop (cs++ns) Nothing+ loop (n:ns) (Just best)+ | isStrictlyBetter optdir (ndLowerBound n) (ndLowerBound best) =+ case children n of+ Nothing -> loop ns (Just n)+ Just cs -> loop (cs++ns) (Just best)+ | otherwise = loop ns (Just best)++ reopt :: Solver r -> Maybe (Solver r)+ reopt s = flip evalState s $ do+ ret <- dualSimplex optdir obj+ if ret+ then liftM Just get+ else return Nothing++ children :: Node r -> Maybe [Node r]+ children node+ | null xs = Nothing -- no violation+ | ndDepth node `mod` 100 == 0 = -- cut+ let+ (f0, m0) = maximumBy (comparing fst) [(fracPart val, m) | (_,m,val) <- xs]+ sv = flip execState (ndSolver node) $ do+ s <- newVar+ let g j x = assert (a >= 0) a+ where+ a | j `IS.member` ivs =+ if fracPart x <= f0+ then fracPart x+ else (f0 / (f0 - 1)) * (fracPart x - 1)+ -- [Gomory1960] では (f0 / (1 - f0)) * (fracPart x - 1) としているが、+ -- これは誤り+ | otherwise =+ if x >= 0+ then x+ else (f0 / (f0 - 1)) * x+ putTableau $ IM.insert s (IM.mapWithKey (\j x -> negate (g j x)) m0, negate f0) tbl+ in Just $ [node{ ndSolver = sv2, ndDepth = ndDepth node + 1 } | sv2 <- maybeToList (reopt sv)]+ | otherwise = -- branch+ let (v0, val0) = snd $ maximumBy (comparing fst) [(fracPart val, (v, val)) | (v,_,val) <- xs]+ cs = [ LA.var v0 .>=. LA.constant (fromIntegral (ceiling val0 :: Integer))+ , LA.var v0 .<=. LA.constant (fromIntegral (floor val0 :: Integer))+ ]+ svs = [execState (addConstraint c) (ndSolver node) | c <- cs]+ in Just $ [node{ ndSolver = sv, ndDepth = ndDepth node + 1 } | Just sv <- map reopt svs]+ + where+ tbl :: Simplex.Tableau r+ tbl = ndTableau node++ xs :: [(Var, VarMap r, r)]+ xs = [ (v, m, val)+ | v <- IS.toList ivs+ , Just (m, val) <- return (IM.lookup v tbl)+ , not (isInteger val)+ ]++-- ---------------------------------------------------------------------------++example1 :: (Fractional r, Eq r) => (OptDir, LA.Expr r, [LA.Atom r], VarSet)+example1 = (optdir, obj, cs, ivs)+ where+ optdir = OptMax+ x1 = LA.var 1+ x2 = LA.var 2+ x3 = LA.var 3+ x4 = LA.var 4+ obj = x1 ^+^ 2 *^ x2 ^+^ 3 *^ x3 ^+^ x4+ cs =+ [ (-1) *^ x1 ^+^ x2 ^+^ x3 ^+^ 10*^x4 .<=. LA.constant 20+ , x1 ^-^ 3 *^ x2 ^+^ x3 .<=. LA.constant 30+ , x2 ^-^ 3.5 *^ x4 .==. LA.constant 0+ , LA.constant 0 .<=. x1+ , x1 .<=. LA.constant 40+ , LA.constant 0 .<=. x2+ , LA.constant 0 .<=. x3+ , LA.constant 2 .<=. x4+ , x4 .<=. LA.constant 3+ ]+ ivs = IS.singleton 4++test1 :: Bool+test1 = result==expected+ where+ (optdir, obj, cs, ivs) = example1+ result, expected :: OptResult Rational+ result = optimize optdir obj cs ivs+ expected = Optimum (245/2) (IM.fromList [(1,40),(2,21/2),(3,39/2),(4,3)])++test1' :: Bool+test1' = result==expected+ where+ (optdir, obj, cs, ivs) = example1+ f OptMin = OptMax+ f OptMax = OptMin+ result, expected :: OptResult Rational+ result = optimize (f optdir) (negateV obj) cs ivs+ expected = Optimum (-245/2) (IM.fromList [(1,40),(2,21/2),(3,39/2),(4,3)])++-- 『数理計画法の基礎』(坂和 正敏) p.109 例 3.8+example2 :: (Fractional r, Eq r) => (OptDir, LA.Expr r, [LA.Atom r], VarSet)+example2 = (optdir, obj, cs, ivs)+ where+ optdir = OptMin+ [x1,x2,x3] = map LA.var [1..3]+ obj = (-1) *^ x1 ^-^ 3 *^ x2 ^-^ 5 *^ x3+ cs =+ [ 3 *^ x1 ^+^ 4 *^ x2 .<=. LA.constant 10+ , 2 *^ x1 ^+^ x2 ^+^ x3 .<=. LA.constant 7+ , 3*^x1 ^+^ x2 ^+^ 4 *^ x3 .==. LA.constant 12+ , LA.constant 0 .<=. x1+ , LA.constant 0 .<=. x2+ , LA.constant 0 .<=. x3+ ]+ ivs = IS.fromList [1,2]++test2 :: Bool+test2 = result == expected+ where+ result, expected :: OptResult Rational+ result = optimize optdir obj cs ivs+ expected = Optimum (-37/2) (IM.fromList [(1,0),(2,2),(3,5/2)])+ (optdir, obj, cs, ivs) = example2++-- ---------------------------------------------------------------------------
+ src/ToySolver/OmegaTest.hs view
@@ -0,0 +1,291 @@+{-# OPTIONS_GHC -Wall #-}+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.OmegaTest+-- Copyright : (c) Masahiro Sakai 2011+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : provisional+-- Portability : portable+--+-- (incomplete) implementation of Omega Test+--+-- References:+--+-- * William Pugh. The Omega test: a fast and practical integer+-- programming algorithm for dependence analysis. In Proceedings of+-- the 1991 ACM/IEEE conference on Supercomputing (1991), pp. 4-13.+--+-- * <http://users.cecs.anu.edu.au/~michaeln/pubs/arithmetic-dps.pdf>+--+-- See also:+--+-- * <http://hackage.haskell.org/package/Omega>+--+-----------------------------------------------------------------------------+module ToySolver.OmegaTest+ ( Model+ , solve+ , solveQFLA+ , Options (..)+ , defaultOptions+ , checkRealNoCheck+ , checkRealByFM+ ) where++import Control.Monad+import Data.List+import Data.Maybe+import Data.Ord+import Data.Ratio+import qualified Data.IntMap as IM+import qualified Data.IntSet as IS+import Data.VectorSpace++import ToySolver.Data.ArithRel+import ToySolver.Data.Boolean+import ToySolver.Data.DNF+import qualified ToySolver.Data.LA as LA+import ToySolver.Data.Var+import ToySolver.Internal.Util (combineMaybe)+import qualified ToySolver.FourierMotzkin as FM+import ToySolver.FourierMotzkin.Core (Lit (..), Rat, toLAAtom)++-- ---------------------------------------------------------------------------++data Options+ = Options+ { optCheckReal :: VarSet -> [LA.Atom Rational] -> Bool+ }++defaultOptions :: Options+defaultOptions =+ Options+ { optCheckReal =+ -- checkRealNoCheck+ checkRealByFM+ }++checkRealNoCheck :: VarSet -> [LA.Atom Rational] -> Bool+checkRealNoCheck _ _ = True++checkRealByFM :: VarSet -> [LA.Atom Rational] -> Bool+checkRealByFM vs as = isJust $ FM.solve vs as++-- ---------------------------------------------------------------------------++type ExprZ = LA.Expr Integer++-- 制約集合の単純化+-- It returns Nothing when a inconsistency is detected.+simplify :: [Lit] -> Maybe [Lit]+simplify = fmap concat . mapM f+ where+ f :: Lit -> Maybe [Lit]+ f lit@(Pos e) =+ case LA.asConst e of+ Just x -> guard (x > 0) >> return []+ Nothing -> return [lit]+ f lit@(Nonneg e) =+ case LA.asConst e of+ Just x -> guard (x >= 0) >> return []+ Nothing -> return [lit]++-- ---------------------------------------------------------------------------++leZ, ltZ, geZ, gtZ :: ExprZ -> ExprZ -> Lit+-- Note that constants may be floored by division+leZ e1 e2 = Nonneg (LA.mapCoeff (`div` d) e)+ where+ e = e2 ^-^ e1+ d = abs $ gcd' [c | (c,v) <- LA.terms e, v /= LA.unitVar]+ltZ e1 e2 = (e1 ^+^ LA.constant 1) `leZ` e2+geZ = flip leZ+gtZ = flip gtZ++eqZ :: ExprZ -> ExprZ -> (DNF Lit)+eqZ e1 e2+ = if LA.coeff LA.unitVar e3 `mod` d == 0+ then DNF [[Nonneg e, Nonneg (negateV e)]]+ else false+ where+ e = LA.mapCoeff (`div` d) e3+ e3 = e1 ^-^ e2+ d = abs $ gcd' [c | (c,v) <- LA.terms e3, v /= LA.unitVar]++-- ---------------------------------------------------------------------------++{-+(ls,us) represents+{ x | ∀(M,c)∈ls. M/c≤x, ∀(M,c)∈us. x≤M/c }+-}+type BoundsZ = ([Rat],[Rat])++collectBoundsZ :: Var -> [Lit] -> (BoundsZ,[Lit])+collectBoundsZ v = foldr phi (([],[]),[])+ where+ phi :: Lit -> (BoundsZ,[Lit]) -> (BoundsZ,[Lit])+ phi (Pos t) x = phi (Nonneg (t ^-^ LA.constant 1)) x+ phi lit@(Nonneg t) ((ls,us),xs) =+ case LA.extract v t of+ (c,t') -> + case c `compare` 0 of+ EQ -> ((ls, us), lit : xs)+ GT -> (((negateV t', c) : ls, us), xs) -- 0 ≤ cx + M ⇔ -M/c ≤ x+ LT -> ((ls, (t', negate c) : us), xs) -- 0 ≤ cx + M ⇔ x ≤ M/-c++isExact :: BoundsZ -> Bool+isExact (ls,us) = and [a==1 || b==1 | (_,a)<-ls , (_,b)<-us]++solve' :: Options -> [Var] -> [Lit] -> Maybe (Model Integer)+solve' opt vs2 xs = simplify xs >>= go vs2+ where+ go :: [Var] -> [Lit] -> Maybe (Model Integer)+ go [] [] = return IM.empty+ go [] _ = mzero+ go vs ys | not (optCheckReal opt (IS.fromList vs) (map toLAAtom ys)) = mzero+ go vs ys =+ if isExact bnd+ then case1+ else case1 `mplus` case2+ where+ (v,vs',bnd@(ls,us),rest) = chooseVariable vs ys++ case1 = do+ let zs = [ LA.constant ((a-1)*(b-1)) `leZ` (a *^ d ^-^ b *^ c)+ | (c,a)<-ls , (d,b)<-us ]+ model <- go vs' =<< simplify (zs ++ rest)+ case pickupZ (evalBoundsZ model bnd) of+ Nothing -> error "ToySolver.OmegaTest.solve': should not happen"+ Just val -> return $ IM.insert v val model++ case2 = msum+ [ do eq <- isZero $ a' *^ LA.var v ^-^ (c' ^+^ LA.constant k)+ let (vs'', lits'', mt) = elimEq eq (v:vs') ys+ model <- go vs'' =<< simplify lits''+ return $ mt model+ | let m = maximum [b | (_,b)<-us]+ , (c',a') <- ls+ , k <- [0 .. (m*a'-a'-m) `div` m]+ ]++chooseVariable :: [Var] -> [Lit] -> (Var, [Var], BoundsZ, [Lit])+chooseVariable vs xs = head $ [e | e@(_,_,bnd,_) <- table, isExact bnd] ++ table+ where+ table = [ (v, vs', bnd, rest)+ | (v,vs') <- pickup vs, let (bnd, rest) = collectBoundsZ v xs+ ]++evalBoundsZ :: Model Integer -> BoundsZ -> IntervalZ+evalBoundsZ model (ls,us) =+ foldl' intersectZ univZ $ + [ (Just (ceiling (LA.evalExpr model x % c)), Nothing) | (x,c) <- ls ] ++ + [ (Nothing, Just (floor (LA.evalExpr model x % c))) | (x,c) <- us ]++elimEq :: ExprZ -> [Var] -> [Lit] -> ([Var], [Lit], Model Integer -> Model Integer)+elimEq e vs lits = + if abs ak == 1+ then+ case LA.extract xk e of+ (_, e') ->+ let xk_def = signum ak *^ negateV e'+ in ( vs+ , [applySubst1Lit xk xk_def lit | lit <- lits]+ , \model -> IM.insert xk (LA.evalExpr model xk_def) model+ )+ else+ let m = abs ak + 1+ xk_def = (- signum ak * m) *^ LA.var sigma ^+^+ LA.fromTerms [(signum ak * (a `zmod` m), x) | (a,x) <- LA.terms e, x /= xk]+ e2 = (- abs ak) *^ LA.var sigma ^+^ + LA.fromTerms [((floor (a%m + 1/2) + (a `zmod` m)), x) | (a,x) <- LA.terms e, x /= xk]+ -- LA.applySubst1 xk xk_def e を normalize したもの+ in case elimEq e2 (sigma : vs) [applySubst1Lit xk xk_def lit | lit <- lits] of+ (vs2, lits2, mt) ->+ ( vs2+ , lits2+ , \model ->+ let model2 = mt model+ in IM.delete sigma $ IM.insert xk (LA.evalExpr model2 xk_def) model2+ )+ where+ (ak,xk) = minimumBy (comparing (abs . fst)) [(a,x) | (a,x) <- LA.terms e, x /= LA.unitVar]+ sigma = maximum (-1 : vs) + 1++applySubst1Lit :: Var -> ExprZ -> Lit -> Lit+applySubst1Lit v e (Nonneg e2) = LA.applySubst1 v e e2 `geZ` LA.constant 0++-- ---------------------------------------------------------------------------++isZero :: ExprZ -> Maybe ExprZ+isZero e+ = if LA.coeff LA.unitVar e `mod` d == 0+ then Just $ e2+ else Nothing+ where+ e2 = LA.mapCoeff (`div` d) e+ d = abs $ gcd' [c | (c,v) <- LA.terms e, v /= LA.unitVar]++-- ---------------------------------------------------------------------------++type IntervalZ = (Maybe Integer, Maybe Integer)++univZ :: IntervalZ+univZ = (Nothing, Nothing)++intersectZ :: IntervalZ -> IntervalZ -> IntervalZ+intersectZ (l1,u1) (l2,u2) = (combineMaybe max l1 l2, combineMaybe min u1 u2)++pickupZ :: IntervalZ -> Maybe Integer+pickupZ (Nothing,Nothing) = return 0+pickupZ (Just x, Nothing) = return x+pickupZ (Nothing, Just x) = return x+pickupZ (Just x, Just y) = if x <= y then return x else mzero ++-- ---------------------------------------------------------------------------++solve :: Options -> VarSet -> [LA.Atom Rational] -> Maybe (Model Integer)+solve opt vs cs = msum [solve' opt (IS.toList vs) lits | lits <- unDNF dnf]+ where+ dnf = andB (map f cs)+ f (Rel lhs op rhs) =+ case op of+ Lt -> DNF [[a `ltZ` b]]+ Le -> DNF [[a `leZ` b]]+ Gt -> DNF [[a `gtZ` b]]+ Ge -> DNF [[a `geZ` b]]+ Eql -> eqZ a b+ NEq -> DNF [[a `ltZ` b], [a `gtZ` b]]+ where+ (e1,c1) = g lhs+ (e2,c2) = g rhs+ a = c2 *^ e1+ b = c1 *^ e2+ g :: LA.Expr Rational -> (ExprZ, Integer)+ g a = (LA.mapCoeff (\c -> floor (c * fromInteger d)) a, d)+ where+ d = foldl' lcm 1 [denominator c | (c,_) <- LA.terms a]++solveQFLA :: Options -> VarSet -> [LA.Atom Rational] -> VarSet -> Maybe (Model Rational)+solveQFLA opt vs cs ivs = listToMaybe $ do+ (cs2, mt) <- FM.projectN rvs cs+ m <- maybeToList $ solve opt ivs cs2+ return $ mt $ IM.map fromInteger m+ where+ rvs = vs `IS.difference` ivs++-- ---------------------------------------------------------------------------++zmod :: Integer -> Integer -> Integer+a `zmod` b = a - b * floor (a % b + 1 / 2)++gcd' :: [Integer] -> Integer+gcd' [] = 1+gcd' xs = foldl1' gcd xs++pickup :: [a] -> [(a,[a])]+pickup [] = []+pickup (x:xs) = (x,xs) : [(y,x:ys) | (y,ys) <- pickup xs]++-- ---------------------------------------------------------------------------
+ src/ToySolver/OmegaTest/Misc.hs view
@@ -0,0 +1,39 @@+{-# OPTIONS_GHC -Wall #-}+module ToySolver.OmegaTest.Misc+ ( checkRealByCAD+ , checkRealBySimplex+ ) where++import Control.Monad+import qualified Data.IntMap as IM+import qualified Data.IntSet as IS+import Data.Maybe+import qualified Data.Set as Set+import System.IO.Unsafe++import qualified ToySolver.Data.LA as LA+import qualified ToySolver.Data.Polynomial as P+import ToySolver.Data.Var+import qualified ToySolver.CAD as CAD+import qualified ToySolver.Simplex2 as Simplex2++checkRealByCAD :: VarSet -> [LA.Atom Rational] -> Bool+checkRealByCAD vs as = isJust $ CAD.solve vs2 (map (fmap f) as)+ where+ vs2 = Set.fromAscList $ IS.toAscList vs++ f :: LA.Expr Rational -> P.Polynomial Rational Int+ f t = sum [ if x == LA.unitVar+ then P.constant c+ else P.constant c * P.var x+ | (c,x) <- LA.terms t ]++checkRealBySimplex :: VarSet -> [LA.Atom Rational] -> Bool+checkRealBySimplex vs as = unsafePerformIO $ do+ solver <- Simplex2.newSolver+ s <- liftM IM.fromList $ forM (IS.toList vs) $ \v -> do+ v2 <- Simplex2.newVar solver+ return (v, LA.var v2)+ forM_ as $ \a -> do+ Simplex2.assertAtomEx solver (fmap (LA.applySubst s) a)+ Simplex2.check solver
+ src/ToySolver/SAT.hs view
@@ -0,0 +1,3116 @@+{-# OPTIONS_GHC -Wall -fno-warn-unused-do-bind #-}+{-# LANGUAGE BangPatterns, ScopedTypeVariables, CPP, DeriveDataTypeable #-}+#ifdef __GLASGOW_HASKELL__+{-# LANGUAGE UnboxedTuples, MagicHash #-}+#endif+#if __GLASGOW_HASKELL__ < 706+{-# LANGUAGE DoRec #-}+#else+{-# LANGUAGE RecursiveDo #-}+#endif+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.SAT+-- Copyright : (c) Masahiro Sakai 2012-2014+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : provisional+-- Portability : non-portable (BangPatterns, ScopedTypeVariables, CPP, DeriveDataTypeable, RecursiveDo)+--+-- A CDCL SAT solver.+--+-- It follows the design of MiniSat and SAT4J.+--+-- See also:+--+-- * <http://hackage.haskell.org/package/funsat>+--+-- * <http://hackage.haskell.org/package/incremental-sat-solver>+--+-----------------------------------------------------------------------------+module ToySolver.SAT+ (+ -- * The @Solver@ type+ Solver+ , newSolver++ -- * Basic data structures+ , Var+ , Lit+ , literal+ , litNot+ , litVar+ , litPolarity+ , Clause++ -- * Problem specification+ , newVar+ , newVars+ , newVars_+ , resizeVarCapacity+ , addClause+ , addAtLeast+ , addAtMost+ , addExactly+ , addPBAtLeast+ , addPBAtMost+ , addPBExactly+ , addPBAtLeastSoft+ , addPBAtMostSoft+ , addPBExactlySoft++ -- * Solving+ , solve+ , solveWith+ , BudgetExceeded (..)++ -- * Extract results+ , Model+ , model+ , failedAssumptions++ -- * Solver configulation+ , RestartStrategy (..)+ , setRestartStrategy+ , defaultRestartStrategy+ , setRestartFirst+ , defaultRestartFirst+ , setRestartInc+ , defaultRestartInc+ , setLearntSizeFirst+ , defaultLearntSizeFirst+ , setLearntSizeInc+ , defaultLearntSizeInc+ , setCCMin+ , defaultCCMin+ , LearningStrategy (..)+ , setLearningStrategy+ , defaultLearningStrategy+ , setEnablePhaseSaving+ , getEnablePhaseSaving+ , defaultEnablePhaseSaving+ , setEnableForwardSubsumptionRemoval+ , getEnableForwardSubsumptionRemoval+ , defaultEnableForwardSubsumptionRemoval+ , setEnableBackwardSubsumptionRemoval+ , getEnableBackwardSubsumptionRemoval+ , defaultEnableBackwardSubsumptionRemoval+ , setVarPolarity+ , setLogger+ , setCheckModel+ , setRandomFreq+ , defaultRandomFreq+ , setRandomGen+ , getRandomGen+ , setConfBudget+ , PBHandlerType (..)+ , setPBHandlerType+ , defaultPBHandlerType++ -- * Read state+ , nVars+ , nAssigns+ , nConstraints+ , nLearnt++ -- * Internal API+ , varBumpActivity+ , varDecayActivity+ ) where++import Prelude hiding (log)+import Control.Loop+import Control.Monad+import Control.Exception+#if MIN_VERSION_array(0,5,0)+import Data.Array.IO+import Data.Array.Unsafe (unsafeFreeze)+#elif MIN_VERSION_array(0,4,0)+import Data.Array.IO hiding (unsafeFreeze)+import Data.Array.Unsafe (unsafeFreeze)+#else+import Data.Array.IO+#endif+import Data.Array.Base (unsafeRead, unsafeWrite)+#if MIN_VERSION_hashable(1,2,0)+import Data.Bits (xor) -- for defining 'combine' function+#endif+import Data.Function (on)+import Data.Hashable+import Data.HashSet (HashSet)+import qualified Data.HashSet as HashSet+import Data.IORef+import Data.List+import Data.Maybe+import Data.Ord+import qualified Data.IntMap as IM+import qualified Data.IntSet as IS+import qualified Data.Set as Set+import qualified ToySolver.Internal.Data.IndexedPriorityQueue as PQ+import qualified ToySolver.Internal.Data.SeqQueue as SQ+import Data.Time+import Data.Typeable+import System.CPUTime+import qualified System.Random as Rand+import Text.Printf++#ifdef __GLASGOW_HASKELL__+import GHC.Types (IO (..))+import GHC.Exts hiding (Constraint)+#endif++import ToySolver.Data.LBool+import ToySolver.SAT.Types++{--------------------------------------------------------------------+ internal data structures+--------------------------------------------------------------------}++type Level = Int++levelRoot :: Level+levelRoot = -1++data Assignment+ = Assignment+ { aValue :: !Bool+ , aIndex :: {-# UNPACK #-} !Int+ , aLevel :: {-# UNPACK #-} !Level+ , aReason :: !(Maybe SomeConstraintHandler)+ , aBacktrackCBs :: !(IORef [IO ()])+ }++data VarData+ = VarData+ { vdAssignment :: !(IORef (Maybe Assignment))+ , vdPolarity :: !(IORef Bool)+ , vdPosLitData :: !LitData+ , vdNegLitData :: !LitData+ , vdActivity :: !(IORef VarActivity)+ }++data LitData+ = LitData+ { -- | will be invoked when this literal is falsified+ ldWatches :: !(IORef [SomeConstraintHandler])+ , ldOccurList :: !(IORef (HashSet SomeConstraintHandler))+ }++newVarData :: IO VarData+newVarData = do+ ainfo <- newIORef Nothing+ polarity <- newIORef True+ pos <- newLitData+ neg <- newLitData+ activity <- newIORef 0+ return $ VarData ainfo polarity pos neg activity++newLitData :: IO LitData+newLitData = do+ ws <- newIORef []+ occ <- newIORef HashSet.empty+ return $ LitData ws occ++varData :: Solver -> Var -> IO VarData+varData solver !v = do+ a <- readIORef (svVarData solver)+ unsafeRead a (v-1)++litData :: Solver -> Lit -> IO LitData+litData solver !l =+ -- litVar による heap allocation を避けるために、+ -- litPolarityによる分岐後にvarDataを呼ぶ。+ if litPolarity l+ then do+ vd <- varData solver l+ return $ vdPosLitData vd+ else do+ vd <- varData solver (negate l)+ return $ vdNegLitData vd++{-# INLINE varValue #-}+varValue :: Solver -> Var -> IO LBool+varValue solver !v = do+ vd <- varData solver v+ m <- readIORef (vdAssignment vd)+ case m of+ Nothing -> return lUndef+ Just x -> return $! (liftBool $! aValue x)++{-# INLINE litValue #-}+litValue :: Solver -> Lit -> IO LBool+litValue solver !l = do+ -- litVar による heap allocation を避けるために、+ -- litPolarityによる分岐後にvarDataを呼ぶ。+ if litPolarity l+ then varValue solver l+ else do+ m <- varValue solver (negate l)+ return $! lnot m++varLevel :: Solver -> Var -> IO Level+varLevel solver !v = do+ vd <- varData solver v+ m <- readIORef (vdAssignment vd)+ case m of+ Nothing -> error ("ToySolver.SAT.varLevel: unassigned var " ++ show v)+ Just a -> return (aLevel a)++litLevel :: Solver -> Lit -> IO Level+litLevel solver l = varLevel solver (litVar l)++varReason :: Solver -> Var -> IO (Maybe SomeConstraintHandler)+varReason solver !v = do+ vd <- varData solver v+ m <- readIORef (vdAssignment vd)+ case m of+ Nothing -> error ("ToySolver.SAT.varReason: unassigned var " ++ show v)+ Just a -> return (aReason a)++varAssignNo :: Solver -> Var -> IO Int+varAssignNo solver !v = do+ vd <- varData solver v+ m <- readIORef (vdAssignment vd)+ case m of+ Nothing -> error ("ToySolver.SAT.varAssignNo: unassigned var " ++ show v)+ Just a -> return (aIndex a)++-- | Solver instance+data Solver+ = Solver+ { svOk :: !(IORef Bool)+ , svVarQueue :: !PQ.PriorityQueue+ , svTrail :: !(IORef [Lit])+ , svVarCounter :: !(IORef Int)+ , svVarData :: !(IORef (IOArray Int VarData))+ , svConstrDB :: !(IORef [SomeConstraintHandler])+ , svLearntDB :: !(IORef (Int,[SomeConstraintHandler]))+ , svAssumptions :: !(IORef (IOUArray Int Lit))+ , svLevel :: !(IORef Level)+ , svBCPQueue :: !(SQ.SeqQueue Lit)+ , svModel :: !(IORef (Maybe Model))+ , svNDecision :: !(IORef Int)+ , svNRandomDecision :: !(IORef Int)+ , svNConflict :: !(IORef Int)+ , svNRestart :: !(IORef Int)+ , svNAssigns :: !(IORef Int)+ , svNFixed :: !(IORef Int)+ , svNLearntGC :: !(IORef Int)+ , svNRemovedConstr :: !(IORef Int)++ -- | Inverse of the variable activity decay factor. (default 1 / 0.95)+ , svVarDecay :: !(IORef Double)++ -- | Amount to bump next variable with.+ , svVarInc :: !(IORef Double)++ -- | Inverse of the constraint activity decay factor. (1 / 0.999)+ , svConstrDecay :: !(IORef Double)++ -- | Amount to bump next constraint with.+ , svConstrInc :: !(IORef Double)++ , svRestartStrategy :: !(IORef RestartStrategy)++ -- | The initial restart limit. (default 100)+ , svRestartFirst :: !(IORef Int)++ -- | The factor with which the restart limit is multiplied in each restart. (default 1.5)+ , svRestartInc :: !(IORef Double)++ -- | The initial limit for learnt constraints.+ , svLearntSizeFirst :: !(IORef Int)++ -- | The limit for learnt constraints is multiplied with this factor periodically. (default 1.1)+ , svLearntSizeInc :: !(IORef Double)++ , svLearntLim :: !(IORef Int)+ , svLearntLimAdjCnt :: !(IORef Int)+ , svLearntLimSeq :: !(IORef [(Int,Int)])++ -- | Controls conflict constraint minimization (0=none, 1=local, 2=recursive)+ , svCCMin :: !(IORef Int)++ , svEnablePhaseSaving :: !(IORef Bool)+ , svEnableForwardSubsumptionRemoval :: !(IORef Bool)++ , svLearningStrategy :: !(IORef LearningStrategy)++ , svPBHandlerType :: !(IORef PBHandlerType)++ , svEnableBackwardSubsumptionRemoval :: !(IORef Bool)++ , svLogger :: !(IORef (Maybe (String -> IO ())))+ , svStartWC :: !(IORef UTCTime)+ , svLastStatWC :: !(IORef UTCTime)++ , svCheckModel :: !(IORef Bool)++ , svRandomFreq :: !(IORef Double)+ , svRandomGen :: !(IORef Rand.StdGen)++ , svFailedAssumptions :: !(IORef [Lit])++ , svConfBudget :: !(IORef Int)+ }++markBad :: Solver -> IO ()+markBad solver = do+ writeIORef (svOk solver) False+ SQ.clear (svBCPQueue solver)++bcpEnqueue :: Solver -> Lit -> IO ()+bcpEnqueue solver l = SQ.enqueue (svBCPQueue solver) l++bcpDequeue :: Solver -> IO (Maybe Lit)+bcpDequeue solver = SQ.dequeue (svBCPQueue solver)++bcpCheckEmpty :: Solver -> IO ()+bcpCheckEmpty solver = do+ size <- SQ.queueSize (svBCPQueue solver)+ unless (size == 0) $+ error "BUG: BCP Queue should be empty at this point"++assignBy :: ConstraintHandler c => Solver -> Lit -> c -> IO Bool+assignBy solver lit c = do+ lv <- readIORef (svLevel solver)+ let !c2 = if lv == levelRoot+ then Nothing+ else Just $! toConstraintHandler c+ assign_ solver lit c2++assign :: Solver -> Lit -> IO Bool+assign solver lit = assign_ solver lit Nothing++assign_ :: Solver -> Lit -> Maybe SomeConstraintHandler -> IO Bool+assign_ solver !lit reason = assert (validLit lit) $ do+ vd <- varData solver (litVar lit)+ m <- readIORef (vdAssignment vd)+ case m of+ Just a -> return $ litPolarity lit == aValue a+ Nothing -> do+ idx <- readIORef (svNAssigns solver)+ lv <- readIORef (svLevel solver)+ bt <- newIORef []++ writeIORef (vdAssignment vd) $ Just $!+ Assignment+ { aValue = litPolarity lit+ , aIndex = idx+ , aLevel = lv+ , aReason = reason+ , aBacktrackCBs = bt+ }++ modifyIORef (svTrail solver) (lit:)+ modifyIORef' (svNAssigns solver) (+1)+ when (lv == levelRoot) $ modifyIORef' (svNFixed solver) (+1)+ bcpEnqueue solver lit++ when debugMode $ logIO solver $ do+ let r = case reason of+ Nothing -> ""+ Just _ -> " by propagation"+ return $ printf "assign(level=%d): %d%s" lv lit r++ return True++unassign :: Solver -> Var -> IO ()+unassign solver !v = assert (validVar v) $ do+ vd <- varData solver v+ m <- readIORef (vdAssignment vd)+ case m of+ Nothing -> error "unassign: should not happen"+ Just a -> do+ flag <- getEnablePhaseSaving solver+ when flag $ writeIORef (vdPolarity vd) (aValue a)+ readIORef (aBacktrackCBs a) >>= sequence_+ writeIORef (vdAssignment vd) Nothing+ modifyIORef' (svNAssigns solver) (subtract 1)+ PQ.enqueue (svVarQueue solver) v++addBacktrackCB :: Solver -> Var -> IO () -> IO ()+addBacktrackCB solver !v callback = do+ vd <- varData solver v+ m <- readIORef (vdAssignment vd)+ case m of+ Nothing -> error "addBacktrackCB: should not happen"+ Just a -> modifyIORef (aBacktrackCBs a) (callback :)++-- | Register the constraint to be notified when the literal becames false.+watch :: ConstraintHandler c => Solver -> Lit -> c -> IO ()+watch solver !lit c = do+ when debugMode $ do+ lits <- watchedLiterals solver c+ unless (lit `elem` lits) $ error "watch: should not happen"+ ld <- litData solver lit+ modifyIORef (ldWatches ld) (toConstraintHandler c : )++-- | Returns list of constraints that are watching the literal.+watches :: Solver -> Lit -> IO [SomeConstraintHandler]+watches solver !lit = do+ ld <- litData solver lit+ readIORef (ldWatches ld)++addToDB :: ConstraintHandler c => Solver -> c -> IO ()+addToDB solver c = do+ let c2 = toConstraintHandler c+ modifyIORef (svConstrDB solver) (c2 : )+ when debugMode $ logIO solver $ do+ str <- showConstraintHandler solver c+ return $ printf "constraint %s is added" str++ (lhs,_) <- toPBAtLeast solver c+ forM_ lhs $ \(_,lit) -> do+ ld <- litData solver lit+ modifyIORef' (ldOccurList ld) (HashSet.insert c2)++ sanityCheck solver++addToLearntDB :: ConstraintHandler c => Solver -> c -> IO ()+addToLearntDB solver c = do+ modifyIORef (svLearntDB solver) $ \(n,xs) -> (n+1, toConstraintHandler c : xs)+ when debugMode $ logIO solver $ do+ str <- showConstraintHandler solver c+ return $ printf "constraint %s is added" str+ sanityCheck solver++reduceDB :: Solver -> IO ()+reduceDB solver = do+ (_,cs) <- readIORef (svLearntDB solver)++ xs <- forM cs $ \c -> do+ p <- constrIsProtected solver c+ w <- constrWeight solver c+ actval <- constrReadActivity c+ return (c, (p, w*actval))++ -- Note that False <= True+ let ys = sortBy (comparing snd) xs+ (zs,ws) = splitAt (length ys `div` 2) ys++ let loop [] ret = return ret+ loop ((c,(isShort,_)) : rest) ret = do+ flag <- if isShort+ then return True+ else isLocked solver c+ if flag+ then loop rest (c:ret)+ else do+ detach solver c+ loop rest ret+ zs2 <- loop zs []++ let cs2 = zs2 ++ map fst ws+ n2 = length cs2++ -- log solver $ printf "learnt constraints deletion: %d -> %d" n n2+ writeIORef (svLearntDB solver) (n2,cs2)++type VarActivity = Double++varActivity :: Solver -> Var -> IO VarActivity+varActivity solver !v = do+ vd <- varData solver v+ readIORef (vdActivity vd)++varDecayActivity :: Solver -> IO ()+varDecayActivity solver = do+ d <- readIORef (svVarDecay solver)+ modifyIORef' (svVarInc solver) (d*)++varBumpActivity :: Solver -> Var -> IO ()+varBumpActivity solver !v = do+ inc <- readIORef (svVarInc solver)+ vd <- varData solver v+ modifyIORef' (vdActivity vd) (+inc)+ PQ.update (svVarQueue solver) v+ aval <- readIORef (vdActivity vd)+ when (aval > 1e20) $+ -- Rescale+ varRescaleAllActivity solver++varRescaleAllActivity :: Solver -> IO ()+varRescaleAllActivity solver = do+ vs <- variables solver+ forM_ vs $ \v -> do+ vd <- varData solver v+ modifyIORef' (vdActivity vd) (* 1e-20)+ modifyIORef' (svVarInc solver) (* 1e-20)++variables :: Solver -> IO [Var]+variables solver = do+ n <- nVars solver+ return [1 .. n]++-- | number of variables of the problem.+nVars :: Solver -> IO Int+nVars solver = do+ vcnt <- readIORef (svVarCounter solver)+ return $! (vcnt-1)++-- | number of assigned variables.+nAssigns :: Solver -> IO Int+nAssigns solver = readIORef (svNAssigns solver)++-- | number of constraints.+nConstraints :: Solver -> IO Int+nConstraints solver = do+ xs <- readIORef (svConstrDB solver)+ return $ length xs++-- | number of learnt constrints.+nLearnt :: Solver -> IO Int+nLearnt solver = do+ (n,_) <- readIORef (svLearntDB solver)+ return n++learntConstraints :: Solver -> IO [SomeConstraintHandler]+learntConstraints solver = do+ (_,cs) <- readIORef (svLearntDB solver)+ return cs++{--------------------------------------------------------------------+ Solver+--------------------------------------------------------------------}++-- | Create a new Solver instance.+newSolver :: IO Solver+newSolver = do+ rec+ ok <- newIORef True+ vcnt <- newIORef 1+ trail <- newIORef []+ vars <- newIORef =<< newArray_ (1,0)+ vqueue <- PQ.newPriorityQueueBy (ltVar solver)+ db <- newIORef []+ db2 <- newIORef (0,[])+ as <- newIORef =<< newArray_ (0,-1)+ lv <- newIORef levelRoot+ q <- SQ.newFifo+ m <- newIORef Nothing+ ndecision <- newIORef 0+ nranddec <- newIORef 0+ nconflict <- newIORef 0+ nrestart <- newIORef 0+ nassigns <- newIORef 0+ nfixed <- newIORef 0+ nlearntgc <- newIORef 0+ nremoved <- newIORef 0++ constrDecay <- newIORef (1 / 0.999)+ constrInc <- newIORef 1+ varDecay <- newIORef (1 / 0.95)+ varInc <- newIORef 1+ restartStrat <- newIORef defaultRestartStrategy+ restartFirst <- newIORef defaultRestartFirst+ restartInc <- newIORef defaultRestartInc+ learning <- newIORef defaultLearningStrategy+ learntSizeFirst <- newIORef defaultLearntSizeFirst+ learntSizeInc <- newIORef defaultLearntSizeInc+ ccMin <- newIORef defaultCCMin+ checkModel <- newIORef False+ pbHandlerType <- newIORef defaultPBHandlerType+ enablePhaseSaving <- newIORef defaultEnablePhaseSaving+ enableForwardSubsumptionRemoval <- newIORef defaultEnableForwardSubsumptionRemoval+ enableBackwardSubsumptionRemoval <- newIORef defaultEnableBackwardSubsumptionRemoval++ learntLim <- newIORef undefined+ learntLimAdjCnt <- newIORef (-1)+ learntLimSeq <- newIORef undefined++ logger <- newIORef Nothing+ startWC <- newIORef undefined+ lastStatWC <- newIORef undefined++ randfreq <- newIORef defaultRandomFreq+ randgen <- newIORef =<< Rand.newStdGen++ failed <- newIORef []++ confBudget <- newIORef (-1)++ let solver =+ Solver+ { svOk = ok+ , svVarCounter = vcnt+ , svVarQueue = vqueue+ , svTrail = trail+ , svVarData = vars+ , svConstrDB = db+ , svLearntDB = db2+ , svAssumptions = as+ , svLevel = lv+ , svBCPQueue = q+ , svModel = m+ , svNDecision = ndecision+ , svNRandomDecision = nranddec+ , svNConflict = nconflict+ , svNRestart = nrestart+ , svNAssigns = nassigns+ , svNFixed = nfixed+ , svNLearntGC = nlearntgc+ , svNRemovedConstr = nremoved+ , svVarDecay = varDecay+ , svVarInc = varInc+ , svConstrDecay = constrDecay+ , svConstrInc = constrInc+ , svRestartStrategy = restartStrat+ , svRestartFirst = restartFirst+ , svRestartInc = restartInc+ , svLearningStrategy = learning+ , svLearntSizeFirst = learntSizeFirst+ , svLearntSizeInc = learntSizeInc+ , svCCMin = ccMin+ , svEnablePhaseSaving = enablePhaseSaving+ , svEnableForwardSubsumptionRemoval = enableForwardSubsumptionRemoval+ , svPBHandlerType = pbHandlerType+ , svEnableBackwardSubsumptionRemoval = enableBackwardSubsumptionRemoval+ , svLearntLim = learntLim+ , svLearntLimAdjCnt = learntLimAdjCnt+ , svLearntLimSeq = learntLimSeq+ , svLogger = logger+ , svStartWC = startWC+ , svLastStatWC = lastStatWC+ , svCheckModel = checkModel+ , svRandomFreq = randfreq+ , svRandomGen = randgen+ , svFailedAssumptions = failed+ , svConfBudget = confBudget+ }+ return solver++ltVar :: Solver -> Var -> Var -> IO Bool+ltVar solver v1 v2 = do+ a1 <- varActivity solver v1+ a2 <- varActivity solver v2+ return $! a1 > a2++{--------------------------------------------------------------------+ Problem specification+--------------------------------------------------------------------}++-- |Add a new variable+newVar :: Solver -> IO Var+newVar solver = do+ v <- readIORef (svVarCounter solver)+ writeIORef (svVarCounter solver) (v+1)+ vd <- newVarData++ a <- readIORef (svVarData solver)+ (_,ub) <- getBounds a+ if v <= ub+ then writeArray a v vd+ else do+ let ub' = max 2 (ub * 3 `div` 2)+ a' <- newArray_ (1,ub')+ forLoop 1 (<=ub) (+1) $ \v2 -> do+ vd2 <- readArray a v2+ writeArray a' v2 vd2+ writeArray a' v vd+ writeIORef (svVarData solver) a'++ PQ.enqueue (svVarQueue solver) v+ return v++-- |Add variables. @newVars solver n = replicateM n (newVar solver)@+newVars :: Solver -> Int -> IO [Var]+newVars solver n = do+ nv <- nVars solver+ resizeVarCapacity solver (nv+n)+ replicateM n (newVar solver)++-- |Add variables. @newVars_ solver n = newVars solver n >> return ()@+newVars_ :: Solver -> Int -> IO ()+newVars_ solver n = do+ nv <- nVars solver+ resizeVarCapacity solver (nv+n)+ replicateM_ n (newVar solver)++-- |Pre-allocate internal buffer for @n@ variables.+resizeVarCapacity :: Solver -> Int -> IO ()+resizeVarCapacity solver n = do+ PQ.resizeHeapCapacity (svVarQueue solver) n+ PQ.resizeTableCapacity (svVarQueue solver) (n+1)+ a <- readIORef (svVarData solver)+ (_,ub) <- getBounds a+ when (ub < n) $ do+ a' <- newArray_ (1,n)+ forLoop 1 (<=ub) (+1) $ \v -> do+ vd <- readArray a v+ writeArray a' v vd+ writeIORef (svVarData solver) a'++-- |Add a clause to the solver.+addClause :: Solver -> Clause -> IO ()+addClause solver lits = do+ d <- readIORef (svLevel solver)+ assert (d == levelRoot) $ return ()++ ok <- readIORef (svOk solver)+ when ok $ do+ lits2 <- instantiateClause solver lits+ case normalizeClause =<< lits2 of+ Nothing -> return ()+ Just [] -> markBad solver+ Just [lit] -> do+ {- We do not call 'removeBackwardSubsumedBy' here,+ because subsumed constraints will be removed by 'simplify'. -}+ ret <- assign solver lit+ assert ret $ return ()+ ret2 <- deduce solver+ case ret2 of+ Nothing -> return ()+ Just _ -> markBad solver+ Just lits3 -> do+ subsumed <- checkForwardSubsumption solver lits+ unless subsumed $ do+ removeBackwardSubsumedBy solver ([(1,lit) | lit <- lits3], 1)+ clause <- newClauseHandler lits3 False+ addToDB solver clause+ _ <- basicAttachClauseHandler solver clause+ return ()++-- | Add a cardinality constraints /atleast({l1,l2,..},n)/.+addAtLeast :: Solver -- ^ The 'Solver' argument.+ -> [Lit] -- ^ set of literals /{l1,l2,..}/ (duplicated elements are ignored)+ -> Int -- ^ /n/.+ -> IO ()+addAtLeast solver lits n = do+ d <- readIORef (svLevel solver)+ assert (d == levelRoot) $ return ()++ ok <- readIORef (svOk solver)+ when ok $ do+ (lits',n') <- liftM normalizeAtLeast $ instantiateAtLeast solver (lits,n)+ let len = length lits'++ if n' <= 0 then return ()+ else if n' > len then markBad solver+ else if n' == 1 then addClause solver lits'+ else if n' == len then do+ {- We do not call 'removeBackwardSubsumedBy' here,+ because subsumed constraints will be removed by 'simplify'. -}+ forM_ lits' $ \l -> do+ ret <- assign solver l+ assert ret $ return ()+ ret2 <- deduce solver+ case ret2 of+ Nothing -> return ()+ Just _ -> markBad solver+ else do+ removeBackwardSubsumedBy solver ([(1,lit) | lit <- lits'], fromIntegral n')+ c <- newAtLeastHandler lits' n' False+ addToDB solver c+ _ <- basicAttachAtLeastHandler solver c+ return ()++-- | Add a cardinality constraints /atmost({l1,l2,..},n)/.+addAtMost :: Solver -- ^ The 'Solver' argument+ -> [Lit] -- ^ set of literals /{l1,l2,..}/ (duplicated elements are ignored)+ -> Int -- ^ /n/+ -> IO ()+addAtMost solver lits n = addAtLeast solver lits' (len-n)+ where+ len = length lits+ lits' = map litNot lits++-- | Add a cardinality constraints /exactly({l1,l2,..},n)/.+addExactly :: Solver -- ^ The 'Solver' argument+ -> [Lit] -- ^ set of literals /{l1,l2,..}/ (duplicated elements are ignored)+ -> Int -- ^ /n/+ -> IO ()+addExactly solver lits n = do+ addAtLeast solver lits n+ addAtMost solver lits n++-- | Add a pseudo boolean constraints /c1*l1 + c2*l2 + … ≥ n/.+addPBAtLeast :: Solver -- ^ The 'Solver' argument.+ -> [(Integer,Lit)] -- ^ set of terms @[(c1,l1),(c2,l2),…]@+ -> Integer -- ^ /n/+ -> IO ()+addPBAtLeast solver ts n = do+ d <- readIORef (svLevel solver)+ assert (d == levelRoot) $ return ()++ ok <- readIORef (svOk solver)+ when ok $ do+ (ts',degree) <- liftM normalizePBLinAtLeast $ instantiatePB solver (ts,n)+ + case pbToAtLeast (ts',degree) of+ Just (lhs',rhs') -> addAtLeast solver lhs' rhs'+ Nothing -> do+ let cs = map fst ts'+ slack = sum cs - degree+ if degree <= 0 then return ()+ else if slack < 0 then markBad solver+ else do+ removeBackwardSubsumedBy solver (ts', degree)+ c <- newPBHandler solver ts' degree False+ addToDB solver c+ ret <- attach solver c+ if not ret+ then do+ markBad solver+ else do+ ret2 <- deduce solver+ case ret2 of+ Nothing -> return ()+ Just _ -> markBad solver++-- | Add a pseudo boolean constraints /c1*l1 + c2*l2 + … ≤ n/.+addPBAtMost :: Solver -- ^ The 'Solver' argument.+ -> [(Integer,Lit)] -- ^ list of @[(c1,l1),(c2,l2),…]@+ -> Integer -- ^ /n/+ -> IO ()+addPBAtMost solver ts n = addPBAtLeast solver [(-c,l) | (c,l) <- ts] (negate n)++-- | Add a pseudo boolean constraints /c1*l1 + c2*l2 + … = n/.+addPBExactly :: Solver -- ^ The 'Solver' argument.+ -> [(Integer,Lit)] -- ^ list of terms @[(c1,l1),(c2,l2),…]@+ -> Integer -- ^ /n/+ -> IO ()+addPBExactly solver ts n = do+ (ts2,n2) <- liftM normalizePBLinExactly $ instantiatePB solver (ts,n)+ addPBAtLeast solver ts2 n2+ addPBAtMost solver ts2 n2++-- | Add a soft pseudo boolean constraints /lit ⇒ c1*l1 + c2*l2 + … ≥ n/.+addPBAtLeastSoft+ :: Solver -- ^ The 'Solver' argument.+ -> Lit -- ^ indicator @lit@+ -> [(Integer,Lit)] -- ^ set of terms @[(c1,l1),(c2,l2),…]@+ -> Integer -- ^ /n/+ -> IO ()+addPBAtLeastSoft solver sel lhs rhs = do+ (lhs', rhs') <- liftM normalizePBLinAtLeast $ instantiatePB solver (lhs,rhs)+ addPBAtLeast solver ((rhs', litNot sel) : lhs') rhs'++-- | Add a soft pseudo boolean constraints /lit ⇒ c1*l1 + c2*l2 + … ≤ n/.+addPBAtMostSoft+ :: Solver -- ^ The 'Solver' argument.+ -> Lit -- ^ indicator @lit@+ -> [(Integer,Lit)] -- ^ set of terms @[(c1,l1),(c2,l2),…]@+ -> Integer -- ^ /n/+ -> IO ()+addPBAtMostSoft solver sel lhs rhs =+ addPBAtLeastSoft solver sel [(negate c, lit) | (c,lit) <- lhs] (negate rhs)++-- | Add a soft pseudo boolean constraints /lit ⇒ c1*l1 + c2*l2 + … = n/.+addPBExactlySoft+ :: Solver -- ^ The 'Solver' argument.+ -> Lit -- ^ indicator @lit@+ -> [(Integer,Lit)] -- ^ set of terms @[(c1,l1),(c2,l2),…]@+ -> Integer -- ^ /n/+ -> IO ()+addPBExactlySoft solver sel lhs rhs = do+ (lhs2, rhs2) <- liftM normalizePBLinExactly $ instantiatePB solver (lhs,rhs)+ addPBAtLeastSoft solver sel lhs2 rhs2+ addPBAtMostSoft solver sel lhs2 rhs2++{--------------------------------------------------------------------+ Problem solving+--------------------------------------------------------------------}++-- | Solve constraints.+-- Returns 'True' if the problem is SATISFIABLE.+-- Returns 'False' if the problem is UNSATISFIABLE.+solve :: Solver -> IO Bool+solve solver = do+ as <- newArray_ (0,-1)+ writeIORef (svAssumptions solver) as+ solve_ solver++-- | Solve constraints under assuptions.+-- Returns 'True' if the problem is SATISFIABLE.+-- Returns 'False' if the problem is UNSATISFIABLE.+solveWith :: Solver+ -> [Lit] -- ^ Assumptions+ -> IO Bool+solveWith solver ls = do+ as <- newListArray (0, length ls -1) ls+ writeIORef (svAssumptions solver) as+ solve_ solver++solve_ :: Solver -> IO Bool+solve_ solver = do+ log solver "Solving starts ..."+ resetStat solver+ writeIORef (svModel solver) Nothing+ writeIORef (svFailedAssumptions solver) []++ ok <- readIORef (svOk solver)+ if not ok+ then return False+ else do+ when debugMode $ dumpVarActivity solver+ d <- readIORef (svLevel solver)+ assert (d == levelRoot) $ return ()++ restartStrategy <- readIORef (svRestartStrategy solver)+ restartFirst <- readIORef (svRestartFirst solver)+ restartInc <- readIORef (svRestartInc solver)+ let restartSeq = mkRestartSeq restartStrategy restartFirst restartInc++ let learntSizeAdj = do+ (size,adj) <- shift (svLearntLimSeq solver)+ writeIORef (svLearntLim solver) size+ writeIORef (svLearntLimAdjCnt solver) adj+ onConflict = do+ cnt <- readIORef (svLearntLimAdjCnt solver)+ if (cnt==0)+ then learntSizeAdj+ else writeIORef (svLearntLimAdjCnt solver) $! cnt-1++ cnt <- readIORef (svLearntLimAdjCnt solver)+ when (cnt == -1) $ do+ learntSizeFirst <- readIORef (svLearntSizeFirst solver)+ learntSizeInc <- readIORef (svLearntSizeInc solver)+ nc <- nConstraints solver+ nv <- nVars solver+ let initialLearntLim = if learntSizeFirst > 0 then learntSizeFirst else max ((nc + nv) `div` 3) 16+ learntSizeSeq = iterate (ceiling . (learntSizeInc*) . fromIntegral) initialLearntLim+ learntSizeAdjSeq = iterate (\x -> (x * 3) `div` 2) (100::Int)+ writeIORef (svLearntLimSeq solver) (zip learntSizeSeq learntSizeAdjSeq)+ learntSizeAdj++ let loop [] = error "solve_: should not happen"+ loop (conflict_lim:rs) = do+ printStat solver True+ ret <- search solver conflict_lim onConflict+ case ret of+ SRFinished x -> return $ Just x+ SRBudgetExceeded -> return Nothing+ SRRestart -> do+ modifyIORef' (svNRestart solver) (+1)+ backtrackTo solver levelRoot+ loop rs++ printStatHeader solver++ startCPU <- getCPUTime+ startWC <- getCurrentTime+ writeIORef (svStartWC solver) startWC+ result <- loop restartSeq+ endCPU <- getCPUTime+ endWC <- getCurrentTime++ when (result == Just True) $ do+ checkModel <- readIORef (svCheckModel solver)+ when checkModel $ checkSatisfied solver+ constructModel solver++ backtrackTo solver levelRoot++ when debugMode $ dumpVarActivity solver+ when debugMode $ dumpConstrActivity solver+ printStat solver True+ (log solver . printf "#cpu_time = %.3fs") (fromIntegral (endCPU - startCPU) / 10^(12::Int) :: Double)+ (log solver . printf "#wall_clock_time = %.3fs") (realToFrac (endWC `diffUTCTime` startWC) :: Double)+ (log solver . printf "#decision = %d") =<< readIORef (svNDecision solver)+ (log solver . printf "#random_decision = %d") =<< readIORef (svNRandomDecision solver)+ (log solver . printf "#conflict = %d") =<< readIORef (svNConflict solver)+ (log solver . printf "#restart = %d") =<< readIORef (svNRestart solver)++ case result of+ Just x -> return x+ Nothing -> throw BudgetExceeded++data BudgetExceeded = BudgetExceeded+ deriving (Show, Typeable)++instance Exception BudgetExceeded++data SearchResult+ = SRFinished Bool+ | SRRestart+ | SRBudgetExceeded++search :: Solver -> Int -> IO () -> IO SearchResult+search solver !conflict_lim onConflict = do+ conflictCounter <- newIORef 0+ let + loop :: IO SearchResult+ loop = do+ sanityCheck solver+ conflict <- deduce solver+ sanityCheck solver+ case conflict of+ Just constr -> do+ ret <- handleConflict conflictCounter constr+ case ret of+ Just sr -> return sr+ Nothing -> loop+ Nothing -> do+ lv <- readIORef (svLevel solver)+ when (lv == levelRoot) $ simplify solver+ checkGC+ r <- pickAssumption+ case r of+ Nothing -> return (SRFinished False)+ Just lit+ | lit /= litUndef -> decide solver lit >> loop+ | otherwise -> do+ lit2 <- pickBranchLit solver+ if lit2 == litUndef+ then return (SRFinished True)+ else decide solver lit2 >> loop+ loop++ where+ checkGC :: IO ()+ checkGC = do+ n <- nLearnt solver+ m <- nAssigns solver+ learnt_lim <- readIORef (svLearntLim solver)+ when (learnt_lim >= 0 && n - m > learnt_lim) $ do+ modifyIORef' (svNLearntGC solver) (+1)+ reduceDB solver++ pickAssumption :: IO (Maybe Lit)+ pickAssumption = do+ !as <- readIORef (svAssumptions solver)+ !b <- getBounds as+ let go = do+ d <- readIORef (svLevel solver)+ if not (inRange b (d+1))+ then return (Just litUndef)+ else do+ l <- readArray as (d+1)+ val <- litValue solver l+ if val == lTrue then do+ -- dummy decision level+ modifyIORef' (svLevel solver) (+1)+ go+ else if val == lFalse then do+ -- conflict with assumption+ core <- analyzeFinal solver l+ writeIORef (svFailedAssumptions solver) core+ return Nothing+ else+ return (Just l)+ go++ handleConflict :: IORef Int -> SomeConstraintHandler -> IO (Maybe SearchResult)+ handleConflict conflictCounter constr = do+ varDecayActivity solver+ constrDecayActivity solver+ onConflict++ modifyIORef' (svNConflict solver) (+1)+ d <- readIORef (svLevel solver)++ when debugMode $ logIO solver $ do+ str <- showConstraintHandler solver constr+ return $ printf "conflict(level=%d): %s" d str++ modifyIORef' conflictCounter (+1)+ c <- readIORef conflictCounter++ modifyIORef' (svConfBudget solver) $ \confBudget ->+ if confBudget > 0 then confBudget - 1 else confBudget+ confBudget <- readIORef (svConfBudget solver)++ when (c `mod` 100 == 0) $ do+ printStat solver False++ if d == levelRoot then do+ markBad solver+ return $ Just (SRFinished False)+ else if confBudget==0 then+ return $ Just SRBudgetExceeded+ else if conflict_lim >= 0 && c >= conflict_lim then+ return $ Just SRRestart+ else do+ strat <- readIORef (svLearningStrategy solver)+ case strat of+ LearningClause -> learnClause constr >> return Nothing+ LearningHybrid -> learnHybrid conflictCounter constr++ learnClause :: SomeConstraintHandler -> IO ()+ learnClause constr = do+ (learntClause, level) <- analyzeConflict solver constr+ backtrackTo solver level+ case learntClause of+ [] -> error "search(LearningClause): should not happen"+ [lit] -> do+ ret <- assign solver lit+ assert ret $ return ()+ return ()+ lit:_ -> do+ cl <- newClauseHandler learntClause True+ addToLearntDB solver cl+ basicAttachClauseHandler solver cl+ assignBy solver lit cl+ constrBumpActivity solver cl++ learnHybrid :: IORef Int -> SomeConstraintHandler -> IO (Maybe SearchResult)+ learnHybrid conflictCounter constr = do+ ((learntClause, clauseLevel), (pb, pbLevel)) <- analyzeConflictHybrid solver constr+ let minLevel = min clauseLevel pbLevel+ backtrackTo solver minLevel++ case learntClause of+ [] -> error "search(LearningHybrid): should not happen"+ [lit] -> do+ _ <- assign solver lit -- This should always succeed.+ return ()+ lit:_ -> do+ cl <- newClauseHandler learntClause True+ addToLearntDB solver cl+ basicAttachClauseHandler solver cl+ constrBumpActivity solver cl+ when (minLevel == clauseLevel) $ do+ _ <- assignBy solver lit cl -- This should always succeed.+ return ()++ ret <- deduce solver+ case ret of+ Just conflicted -> do+ handleConflict conflictCounter conflicted+ -- TODO: should also learn the PB constraint?+ Nothing -> do+ let (lhs,rhs) = pb+ h <- newPBHandlerPromoted solver lhs rhs True+ case h of+ CHClause _ -> do+ {- We don't want to add additional clause,+ since it would be subsumed by already added one. -}+ return Nothing+ _ -> do+ addToLearntDB solver h+ ret2 <- attach solver h+ constrBumpActivity solver h+ if ret2 then+ return Nothing+ else+ handleConflict conflictCounter h++-- | After 'solve' returns True, it returns the model.+model :: Solver -> IO Model+model solver = do+ m <- readIORef (svModel solver)+ return (fromJust m)++-- | After 'solveWith' returns False, it returns a set of assumptions+-- that leads to contradiction. In particular, if it returns an empty+-- set, the problem is unsatisiable without any assumptions.+failedAssumptions :: Solver -> IO [Lit]+failedAssumptions solver = readIORef (svFailedAssumptions solver)++{--------------------------------------------------------------------+ Simplification+--------------------------------------------------------------------}++-- | Simplify the constraint database according to the current top-level assigment.+simplify :: Solver -> IO ()+simplify solver = do+ let loop [] rs !n = return (rs,n)+ loop (y:ys) rs !n = do+ b1 <- isSatisfied solver y+ b2 <- isLocked solver y+ if b1 && not b2+ then do+ detach solver y+ loop ys rs (n+1)+ else loop ys (y:rs) n++ -- simplify original constraint DB+ do+ xs <- readIORef (svConstrDB solver)+ (ys,n) <- loop xs [] (0::Int)+ modifyIORef' (svNRemovedConstr solver) (+n)+ writeIORef (svConstrDB solver) ys++ -- simplify learnt constraint DB+ do+ (m,xs) <- readIORef (svLearntDB solver)+ (ys,n) <- loop xs [] (0::Int)+ writeIORef (svLearntDB solver) (m-n, ys)++{-+References:+L. Zhang, "On subsumption removal and On-the-Fly CNF simplification,"+Theory and Applications of Satisfiability Testing (2005), pp. 482-489.+-}++checkForwardSubsumption :: Solver -> Clause -> IO Bool+checkForwardSubsumption solver lits = do+ flag <- getEnableForwardSubsumptionRemoval solver+ if not flag then+ return False+ else do+ withEnablePhaseSaving solver False $ do+ bracket_+ (modifyIORef' (svLevel solver) (+1))+ (backtrackTo solver levelRoot) $ do+ b <- allM (\lit -> assign solver (litNot lit)) lits+ if b then+ liftM isJust (deduce solver)+ else do+ when debugMode $ log solver ("forward subsumption: " ++ show lits)+ return True+ where+ withEnablePhaseSaving solver flag m =+ bracket+ (getEnablePhaseSaving solver)+ (setEnablePhaseSaving solver)+ (\_ -> setEnablePhaseSaving solver flag >> m)++removeBackwardSubsumedBy :: Solver -> PBLinAtLeast -> IO ()+removeBackwardSubsumedBy solver pb = do+ flag <- getEnableBackwardSubsumptionRemoval solver+ when flag $ do+ xs <- backwardSubsumedBy solver pb+ when debugMode $ do+ forM_ (HashSet.toList xs) $ \c -> do+ s <- showConstraintHandler solver c+ log solver (printf "backward subsumption: %s is subsumed by %s\n" s (show pb))+ removeConstraintHandlers solver xs++backwardSubsumedBy :: Solver -> PBLinAtLeast -> IO (HashSet SomeConstraintHandler)+backwardSubsumedBy solver pb@(lhs,_) = do+ xs <- forM lhs $ \(_,lit) -> do+ ld <- litData solver lit+ readIORef (ldOccurList ld)+ case xs of+ [] -> return HashSet.empty+ s:ss -> do+ let p c = do+ pb2 <- instantiatePB solver =<< toPBAtLeast solver c+ return $ pbSubsume pb pb2+ liftM HashSet.fromList+ $ filterM p+ $ HashSet.toList+ $ foldl' HashSet.intersection s ss++removeConstraintHandlers :: Solver -> HashSet SomeConstraintHandler -> IO ()+removeConstraintHandlers _ zs | HashSet.null zs = return ()+removeConstraintHandlers solver zs = do+ let loop [] rs !n = return (rs,n)+ loop (c:cs) rs !n = do+ if c `HashSet.member` zs+ then do+ detach solver c+ loop cs rs (n+1)+ else loop cs (c:rs) n+ xs <- readIORef (svConstrDB solver)+ (ys,n) <- loop xs [] (0::Int)+ modifyIORef' (svNRemovedConstr solver) (+n)+ writeIORef (svConstrDB solver) ys++{--------------------------------------------------------------------+ Parameter settings.+--------------------------------------------------------------------}++setRestartStrategy :: Solver -> RestartStrategy -> IO ()+setRestartStrategy solver s = writeIORef (svRestartStrategy solver) s++-- | default value for @RestartStrategy@.+defaultRestartStrategy :: RestartStrategy+defaultRestartStrategy = MiniSATRestarts++-- | The initial restart limit. (default 100)+-- Negative value is used to disable restart.+setRestartFirst :: Solver -> Int -> IO ()+setRestartFirst solver !n = writeIORef (svRestartFirst solver) n++-- | default value for @RestartFirst@.+defaultRestartFirst :: Int+defaultRestartFirst = 100++-- | The factor with which the restart limit is multiplied in each restart. (default 1.5)+setRestartInc :: Solver -> Double -> IO ()+setRestartInc solver !r = writeIORef (svRestartInc solver) r++-- | default value for @RestartInc@.+defaultRestartInc :: Double+defaultRestartInc = 1.5++data LearningStrategy+ = LearningClause+ | LearningHybrid++setLearningStrategy :: Solver -> LearningStrategy -> IO ()+setLearningStrategy solver l = writeIORef (svLearningStrategy solver) $! l++defaultLearningStrategy :: LearningStrategy+defaultLearningStrategy = LearningClause++-- | The initial limit for learnt clauses.+setLearntSizeFirst :: Solver -> Int -> IO ()+setLearntSizeFirst solver !x = writeIORef (svLearntSizeFirst solver) x++-- | default value for @LearntSizeFirst@.+defaultLearntSizeFirst :: Int+defaultLearntSizeFirst = -1++-- | The limit for learnt clauses is multiplied with this factor each restart. (default 1.1)+setLearntSizeInc :: Solver -> Double -> IO ()+setLearntSizeInc solver !r = writeIORef (svLearntSizeInc solver) r++-- | default value for @LearntSizeInc@.+defaultLearntSizeInc :: Double+defaultLearntSizeInc = 1.1++-- | The limit for learnt clauses is multiplied with this factor each restart. (default 1.1)+setCCMin :: Solver -> Int -> IO ()+setCCMin solver !v = writeIORef (svCCMin solver) v++-- | default value for @CCMin@.+defaultCCMin :: Int+defaultCCMin = 2++-- | The default polarity of a variable.+setVarPolarity :: Solver -> Var -> Bool -> IO ()+setVarPolarity solver v val = do+ vd <- varData solver v+ writeIORef (vdPolarity vd) val++setCheckModel :: Solver -> Bool -> IO ()+setCheckModel solver flag = do+ writeIORef (svCheckModel solver) flag++-- | The frequency with which the decision heuristic tries to choose a random variable+setRandomFreq :: Solver -> Double -> IO ()+setRandomFreq solver r = do+ writeIORef (svRandomFreq solver) r++defaultRandomFreq :: Double+defaultRandomFreq = 0.005++-- | Set random generator used by the random variable selection+setRandomGen :: Solver -> Rand.StdGen -> IO ()+setRandomGen solver = writeIORef (svRandomGen solver)++-- | Get random generator used by the random variable selection+getRandomGen :: Solver -> IO Rand.StdGen+getRandomGen solver = readIORef (svRandomGen solver)++setConfBudget :: Solver -> Maybe Int -> IO ()+setConfBudget solver (Just b) | b >= 0 = writeIORef (svConfBudget solver) b+setConfBudget solver _ = writeIORef (svConfBudget solver) (-1)++data PBHandlerType = PBHandlerTypeCounter | PBHandlerTypePueblo+ deriving (Show, Eq, Ord)++defaultPBHandlerType :: PBHandlerType+defaultPBHandlerType = PBHandlerTypeCounter++setPBHandlerType :: Solver -> PBHandlerType -> IO ()+setPBHandlerType solver ht = do+ writeIORef (svPBHandlerType solver) ht++setEnablePhaseSaving :: Solver -> Bool -> IO ()+setEnablePhaseSaving solver flag = do+ writeIORef (svEnablePhaseSaving solver) flag++getEnablePhaseSaving :: Solver -> IO Bool+getEnablePhaseSaving solver = do+ readIORef (svEnablePhaseSaving solver)++defaultEnablePhaseSaving :: Bool+defaultEnablePhaseSaving = True++setEnableForwardSubsumptionRemoval :: Solver -> Bool -> IO ()+setEnableForwardSubsumptionRemoval solver flag = do+ writeIORef (svEnableForwardSubsumptionRemoval solver) flag++getEnableForwardSubsumptionRemoval :: Solver -> IO Bool+getEnableForwardSubsumptionRemoval solver = do+ readIORef (svEnableForwardSubsumptionRemoval solver)++defaultEnableForwardSubsumptionRemoval :: Bool+defaultEnableForwardSubsumptionRemoval = False++setEnableBackwardSubsumptionRemoval :: Solver -> Bool -> IO ()+setEnableBackwardSubsumptionRemoval solver flag = do+ writeIORef (svEnableBackwardSubsumptionRemoval solver) flag++getEnableBackwardSubsumptionRemoval :: Solver -> IO Bool+getEnableBackwardSubsumptionRemoval solver = do+ readIORef (svEnableBackwardSubsumptionRemoval solver)++defaultEnableBackwardSubsumptionRemoval :: Bool+defaultEnableBackwardSubsumptionRemoval = False++{--------------------------------------------------------------------+ API for implementation of @solve@+--------------------------------------------------------------------}++pickBranchLit :: Solver -> IO Lit+pickBranchLit !solver = do+ let vqueue = svVarQueue solver++ -- Random decision+ let withRandGen :: (Rand.StdGen -> (a, Rand.StdGen)) -> IO a+ withRandGen f = do+ randgen <- readIORef (svRandomGen solver)+ let (r, randgen') = f randgen+ writeIORef (svRandomGen solver) randgen'+ return r+ !randfreq <- readIORef (svRandomFreq solver)+ !size <- PQ.queueSize vqueue+ !r <- withRandGen Rand.random+ var <-+ if (r < randfreq && size >= 2)+ then do+ a <- PQ.getHeapArray vqueue+ i <- withRandGen $ Rand.randomR (0, size-1)+ var <- readArray a i+ val <- varValue solver var+ if val == lUndef+ then do+ modifyIORef' (svNRandomDecision solver) (1+)+ return var+ else return litUndef+ else+ return litUndef++ -- Activity based decision+ let loop :: IO Var+ loop = do+ m <- PQ.dequeue vqueue+ case m of+ Nothing -> return litUndef+ Just var2 -> do+ val2 <- varValue solver var2+ if val2 /= lUndef+ then loop+ else return var2+ var2 <-+ if var==litUndef+ then loop+ else return var++ if var2==litUndef+ then return litUndef+ else do+ vd <- varData solver var2+ -- TODO: random polarity+ p <- readIORef (vdPolarity vd)+ return $! literal var2 p++decide :: Solver -> Lit -> IO ()+decide solver !lit = do+ modifyIORef' (svNDecision solver) (+1)+ modifyIORef' (svLevel solver) (+1)+ when debugMode $ do+ val <- litValue solver lit+ when (val /= lUndef) $ error "decide: should not happen"+ assign solver lit+ return ()++deduce :: Solver -> IO (Maybe SomeConstraintHandler)+deduce solver = loop+ where+ loop :: IO (Maybe SomeConstraintHandler)+ loop = do+ r <- bcpDequeue solver+ case r of+ Nothing -> return Nothing+ Just lit -> do+ ret <- processLit lit+ case ret of+ Just _ -> return ret+ Nothing -> loop++ processLit :: Lit -> IO (Maybe SomeConstraintHandler)+ processLit !lit = do+ let falsifiedLit = litNot lit+ ld <- litData solver falsifiedLit+ let wsref = ldWatches ld+ let loop2 [] = return Nothing+ loop2 (w:ws) = do+ ok <- propagate solver w falsifiedLit+ if ok+ then loop2 ws+ else do+ modifyIORef wsref (++ws)+ return (Just w)+ ws <- readIORef wsref+ writeIORef wsref []+ loop2 ws++analyzeConflict :: ConstraintHandler c => Solver -> c -> IO (Clause, Level)+analyzeConflict solver constr = do+ d <- readIORef (svLevel solver)++ let split :: [Lit] -> IO (LitSet, LitSet)+ split = go (IS.empty, IS.empty)+ where+ go (xs,ys) [] = return (xs,ys)+ go (xs,ys) (l:ls) = do+ lv <- litLevel solver l+ if lv == levelRoot then+ go (xs,ys) ls+ else if lv >= d then+ go (IS.insert l xs, ys) ls+ else+ go (xs, IS.insert l ys) ls++ let loop :: LitSet -> LitSet -> IO LitSet+ loop lits1 lits2+ | sz==1 = do+ return $ lits1 `IS.union` lits2+ | sz>=2 = do+ ret <- popTrail solver+ case ret of+ Nothing -> do+ error $ printf "analyzeConflict: should not happen: empty trail: loop %s %s"+ (show lits1) (show lits2)+ Just l -> do+ if litNot l `IS.notMember` lits1+ then do+ unassign solver (litVar l)+ loop lits1 lits2+ else do+ m <- varReason solver (litVar l)+ case m of+ Nothing -> error "analyzeConflict: should not happen"+ Just constr2 -> do+ constrBumpActivity solver constr2+ xs <- reasonOf solver constr2 (Just l)+ forM_ xs $ \lit -> varBumpActivity solver (litVar lit)+ unassign solver (litVar l)+ (ys,zs) <- split xs+ loop (IS.delete (litNot l) lits1 `IS.union` ys)+ (lits2 `IS.union` zs)+ | otherwise = error "analyzeConflict: should not happen: reason of current level is empty"+ where+ sz = IS.size lits1++ constrBumpActivity solver constr+ conflictClause <- reasonOf solver constr Nothing+ forM_ conflictClause $ \lit -> varBumpActivity solver (litVar lit)+ (ys,zs) <- split conflictClause+ lits <- loop ys zs++ lits2 <- minimizeConflictClause solver lits++ xs <- liftM (sortBy (flip (comparing snd))) $+ forM (IS.toList lits2) $ \l -> do+ lv <- litLevel solver l+ return (l,lv)++ let level = case xs of+ [] -> error "analyzeConflict: should not happen"+ [_] -> levelRoot+ _:(_,lv):_ -> lv+ return (map fst xs, level)++-- { p } ∪ { pにfalseを割り当てる原因のassumption }+analyzeFinal :: Solver -> Lit -> IO [Lit]+analyzeFinal solver p = do+ lits <- readIORef (svTrail solver)+ let go :: [Lit] -> VarSet -> [Lit] -> IO [Lit]+ go [] _ result = return result+ go (l:ls) seen result = do+ lv <- litLevel solver l+ if lv == levelRoot then+ return result+ else if litVar l `IS.member` seen then do+ r <- varReason solver (litVar l)+ case r of+ Nothing -> do+ let seen' = IS.delete (litVar l) seen+ go ls seen' (l : result)+ Just constr -> do+ c <- reasonOf solver constr (Just l)+ let seen' = IS.delete (litVar l) seen `IS.union` IS.fromList [litVar l2 | l2 <- c]+ go ls seen' result+ else+ go ls seen result+ go lits (IS.singleton (litVar p)) [p]++analyzeConflictHybrid :: ConstraintHandler c => Solver -> c -> IO ((Clause, Level), (PBLinAtLeast, Level))+analyzeConflictHybrid solver constr = do+ d <- readIORef (svLevel solver)++ let split :: [Lit] -> IO (LitSet, LitSet)+ split = go (IS.empty, IS.empty)+ where+ go (xs,ys) [] = return (xs,ys)+ go (xs,ys) (l:ls) = do+ lv <- litLevel solver l+ if lv == levelRoot then+ go (xs,ys) ls+ else if lv >= d then+ go (IS.insert l xs, ys) ls+ else+ go (xs, IS.insert l ys) ls++ let loop :: LitSet -> LitSet -> PBLinAtLeast -> IO (LitSet, PBLinAtLeast)+ loop lits1 lits2 pb+ | sz==1 = do+ return $ (lits1 `IS.union` lits2, pb)+ | sz>=2 = do+ ret <- popTrail solver+ case ret of+ Nothing -> do+ error $ printf "analyzeConflictHybrid: should not happen: empty trail: loop %s %s"+ (show lits1) (show lits2)+ Just l -> do+ m <- varReason solver (litVar l)+ case m of+ Nothing -> error "analyzeConflictHybrid: should not happen"+ Just constr2 -> do+ xs <- reasonOf solver constr2 (Just l)+ (lits1',lits2') <-+ if litNot l `IS.notMember` lits1+ then return (lits1,lits2)+ else do+ constrBumpActivity solver constr2+ forM_ xs $ \lit -> varBumpActivity solver (litVar lit)+ (ys,zs) <- split xs+ return (IS.delete (litNot l) lits1 `IS.union` ys, lits2 `IS.union` zs)++ pb' <- if any (\(_,l2) -> litNot l == l2) (fst pb)+ then do+ pb2 <- toPBAtLeast solver constr2+ o <- pbOverSAT solver pb2+ let pb3 = if o then ([(1,l2) | l2 <- l:xs],1) else pb2+ return $ cutResolve pb pb3 (litVar l)+ else return pb++ unassign solver (litVar l)+ loop lits1' lits2' pb'++ | otherwise = error "analyzeConflictHybrid: should not happen: reason of current level is empty"+ where+ sz = IS.size lits1++ constrBumpActivity solver constr+ conflictClause <- reasonOf solver constr Nothing+ pbConfl <- toPBAtLeast solver constr+ forM_ conflictClause $ \lit -> varBumpActivity solver (litVar lit)+ (ys,zs) <- split conflictClause+ (lits, pb) <- loop ys zs pbConfl++ lits2 <- minimizeConflictClause solver lits++ xs <- liftM (sortBy (flip (comparing snd))) $+ forM (IS.toList lits2) $ \l -> do+ lv <- litLevel solver l+ return (l,lv)++ let level = case xs of+ [] -> error "analyzeConflict: should not happen"+ [_] -> levelRoot+ _:(_,lv):_ -> lv+ pblevel <- pbBacktrackLevel solver pb+ return ((map fst xs, level), (pb, pblevel))++pbBacktrackLevel :: Solver -> PBLinAtLeast -> IO Level+pbBacktrackLevel _ ([], rhs) = assert (rhs > 0) $ return levelRoot+pbBacktrackLevel solver (lhs, rhs) = do+ levelToLiterals <- liftM (IM.unionsWith IM.union) $ forM lhs $ \(_,lit) -> do+ val <- litValue solver lit+ if val /= lUndef then do+ level <- litLevel solver lit+ return $ IM.singleton level (IM.singleton lit val)+ else+ return $ IM.empty++ let replay [] _ _ = error "pbBacktrackLevel: should not happen"+ replay ((lv,lv_lits) : lvs) lhs slack = do+ let slack_lv = slack - sum [c | (c,lit) <- lhs, IM.lookup lit lv_lits == Just lFalse]+ lhs_lv = [tm | tm@(_,lit) <- lhs, IM.notMember lit lv_lits]+ if slack_lv < 0 then+ return lv -- CONFLICT+ else if any (\(c,_) -> c > slack_lv) lhs_lv then+ return lv -- UNIT+ else+ replay lvs lhs_lv slack_lv++ let initial_slack = sum [c | (c,_) <- lhs] - rhs+ replay (IM.toList levelToLiterals) lhs initial_slack++minimizeConflictClause :: Solver -> LitSet -> IO LitSet+minimizeConflictClause solver lits = do+ ccmin <- readIORef (svCCMin solver)+ if ccmin >= 2 then+ minimizeConflictClauseRecursive solver lits+ else if ccmin >= 1 then+ minimizeConflictClauseLocal solver lits+ else+ return lits++minimizeConflictClauseLocal :: Solver -> LitSet -> IO LitSet+minimizeConflictClauseLocal solver lits = do+ let xs = IS.toAscList lits+ ys <- filterM (liftM not . isRedundant) xs+ when debugMode $ do+ log solver "minimizeConflictClauseLocal:"+ log solver $ show xs+ log solver $ show ys+ return $ IS.fromAscList $ ys++ where+ isRedundant :: Lit -> IO Bool+ isRedundant lit = do+ c <- varReason solver (litVar lit)+ case c of+ Nothing -> return False+ Just c2 -> do+ ls <- reasonOf solver c2 (Just (litNot lit))+ allM test ls++ test :: Lit -> IO Bool+ test lit = do+ lv <- litLevel solver lit+ return $ lv == levelRoot || lit `IS.member` lits++minimizeConflictClauseRecursive :: Solver -> LitSet -> IO LitSet+minimizeConflictClauseRecursive solver lits = do+ let+ isRedundant :: Lit -> IO Bool+ isRedundant lit = do+ c <- varReason solver (litVar lit)+ case c of+ Nothing -> return False+ Just c2 -> do+ ls <- reasonOf solver c2 (Just (litNot lit))+ go ls IS.empty++ go :: [Lit] -> IS.IntSet -> IO Bool+ go [] _ = return True+ go (lit : ls) seen = do+ lv <- litLevel solver lit+ if lv == levelRoot || lit `IS.member` lits || lit `IS.member` seen+ then go ls seen+ else do+ c <- varReason solver (litVar lit)+ case c of+ Nothing -> return False+ Just c2 -> do+ ls2 <- reasonOf solver c2 (Just (litNot lit))+ go (ls2 ++ ls) (IS.insert lit seen)++ let xs = IS.toAscList lits+ ys <- filterM (liftM not . isRedundant) xs+ when debugMode $ do+ log solver "minimizeConflictClauseRecursive:"+ log solver $ show xs+ log solver $ show ys+ return $ IS.fromAscList $ ys++popTrail :: Solver -> IO (Maybe Lit)+popTrail solver = do+ m <- readIORef (svTrail solver)+ case m of+ [] -> return Nothing+ l:ls -> do+ writeIORef (svTrail solver) ls+ return $ Just l++-- | Revert to the state at given level+-- (keeping all assignment at @level@ but not beyond).+backtrackTo :: Solver -> Int -> IO ()+backtrackTo solver level = do+ when debugMode $ log solver $ printf "backtrackTo: %d" level+ writeIORef (svTrail solver) =<< loop =<< readIORef (svTrail solver)+ SQ.clear (svBCPQueue solver)+ writeIORef (svLevel solver) level+ where+ loop :: [Lit] -> IO [Lit]+ loop [] = return []+ loop lls@(l:ls) = do+ lv <- litLevel solver l+ if lv <= level+ then return lls+ else unassign solver (litVar l) >> loop ls++constructModel :: Solver -> IO ()+constructModel solver = do+ n <- nVars solver+ (marr::IOUArray Var Bool) <- newArray_ (1,n)+ forLoop 1 (<=n) (+1) $ \v -> do+ vd <- varData solver v+ a <- readIORef (vdAssignment vd)+ writeArray marr v (aValue (fromJust a))+ m <- unsafeFreeze marr+ writeIORef (svModel solver) (Just m)++constrDecayActivity :: Solver -> IO ()+constrDecayActivity solver = do+ d <- readIORef (svConstrDecay solver)+ modifyIORef' (svConstrInc solver) (d*)++constrBumpActivity :: ConstraintHandler a => Solver -> a -> IO ()+constrBumpActivity solver this = do+ aval <- constrReadActivity this+ when (aval >= 0) $ do -- learnt clause+ inc <- readIORef (svConstrInc solver)+ let aval2 = aval+inc+ constrWriteActivity this $! aval2+ when (aval2 > 1e20) $+ -- Rescale+ constrRescaleAllActivity solver++constrRescaleAllActivity :: Solver -> IO ()+constrRescaleAllActivity solver = do+ xs <- learntConstraints solver+ forM_ xs $ \c -> do+ aval <- constrReadActivity c+ when (aval >= 0) $+ constrWriteActivity c $! (aval * 1e-20)+ modifyIORef' (svConstrInc solver) (* 1e-20)++resetStat :: Solver -> IO ()+resetStat solver = do+ writeIORef (svNDecision solver) 0+ writeIORef (svNRandomDecision solver) 0+ writeIORef (svNConflict solver) 0+ writeIORef (svNRestart solver) 0+ writeIORef (svNLearntGC solver) 0++printStatHeader :: Solver -> IO ()+printStatHeader solver = do+ log solver $ "============================[ Search Statistics ]============================"+ log solver $ " Time | Restart | Decision | Conflict | LEARNT | Fixed | Removed "+ log solver $ " | | | | Limit GC | Var | Constra "+ log solver $ "============================================================================="++printStat :: Solver -> Bool -> IO ()+printStat solver force = do+ nowWC <- getCurrentTime+ b <- if force+ then return True+ else do+ lastWC <- readIORef (svLastStatWC solver)+ return $ (nowWC `diffUTCTime` lastWC) > 1+ when b $ do+ startWC <- readIORef (svStartWC solver)+ let tm = showTimeDiff $ nowWC `diffUTCTime` startWC+ restart <- readIORef (svNRestart solver)+ dec <- readIORef (svNDecision solver)+ conflict <- readIORef (svNConflict solver)+ learntLim <- readIORef (svLearntLim solver)+ learntGC <- readIORef (svNLearntGC solver)+ fixed <- readIORef (svNFixed solver)+ removed <- readIORef (svNRemovedConstr solver)+ log solver $ printf "%s | %7d | %8d | %8d | %8d %6d | %8d | %8d"+ tm restart dec conflict learntLim learntGC fixed removed+ writeIORef (svLastStatWC solver) nowWC++showTimeDiff :: NominalDiffTime -> String+showTimeDiff sec+ | si < 100 = printf "%4.1fs" (fromRational s :: Double)+ | si <= 9999 = printf "%4ds" si+ | mi < 100 = printf "%4.1fm" (fromRational m :: Double)+ | mi <= 9999 = printf "%4dm" mi+ | hi < 100 = printf "%4.1fs" (fromRational h :: Double)+ | otherwise = printf "%4dh" hi+ where+ s :: Rational+ s = realToFrac sec++ si :: Integer+ si = round s++ m :: Rational+ m = s / 60++ mi :: Integer+ mi = round m++ h :: Rational+ h = m / 60++ hi :: Integer+ hi = round h++{--------------------------------------------------------------------+ constraint implementation+--------------------------------------------------------------------}++class (Eq a, Hashable a) => ConstraintHandler a where+ toConstraintHandler :: a -> SomeConstraintHandler++ showConstraintHandler :: Solver -> a -> IO String++ attach :: Solver -> a -> IO Bool++ watchedLiterals :: Solver -> a -> IO [Lit]++ -- | invoked with the watched literal when the literal is falsified.+ -- 'watch' で 'toConstraint' を呼び出して heap allocation が発生するのを+ -- 避けるために、元の 'SomeConstraintHandler' も渡しておく。+ basicPropagate :: Solver -> SomeConstraintHandler -> a -> Lit -> IO Bool++ -- | deduce a clause C∨l from the constraint and return C.+ -- C and l should be false and true respectively under the current+ -- assignment.+ basicReasonOf :: Solver -> a -> Maybe Lit -> IO Clause++ toPBAtLeast :: Solver -> a -> IO PBLinAtLeast++ isSatisfied :: Solver -> a -> IO Bool++ constrIsProtected :: Solver -> a -> IO Bool+ constrIsProtected _ _ = return False++ constrWeight :: Solver -> a -> IO Double+ constrWeight _ _ = return 1.0++ constrReadActivity :: a -> IO Double++ constrWriteActivity :: a -> Double -> IO ()++detach :: ConstraintHandler a => Solver -> a -> IO ()+detach solver c = do+ let c2 = toConstraintHandler c+ lits <- watchedLiterals solver c+ forM_ lits $ \lit -> do+ ld <- litData solver lit+ modifyIORef' (ldWatches ld) (delete c2)+ (lhs,_) <- toPBAtLeast solver c+ forM_ lhs $ \(_,lit) -> do+ ld <- litData solver lit+ modifyIORef' (ldOccurList ld) (HashSet.delete c2)++-- | invoked with the watched literal when the literal is falsified.+propagate :: Solver -> SomeConstraintHandler -> Lit -> IO Bool+propagate solver c l = basicPropagate solver c c l++-- | deduce a clause C∨l from the constraint and return C.+-- C and l should be false and true respectively under the current+-- assignment.+reasonOf :: ConstraintHandler a => Solver -> a -> Maybe Lit -> IO Clause+reasonOf solver c x = do+ when debugMode $+ case x of+ Nothing -> return ()+ Just lit -> do+ val <- litValue solver lit+ unless (lTrue == val) $ do+ str <- showConstraintHandler solver c+ error (printf "reasonOf: value of literal %d should be True but %s (basicReasonOf %s %s)" lit (show val) str (show x))+ cl <- basicReasonOf solver c x+ when debugMode $ do+ forM_ cl $ \lit -> do+ val <- litValue solver lit+ unless (lFalse == val) $ do+ str <- showConstraintHandler solver c+ error (printf "reasonOf: value of literal %d should be False but %s (basicReasonOf %s %s)" lit (show val) str (show x))+ return cl++isLocked :: Solver -> SomeConstraintHandler -> IO Bool+isLocked solver c = anyM p =<< watchedLiterals solver c+ where+ p :: Lit -> IO Bool+ p lit = do+ val <- litValue solver lit+ if val /= lTrue+ then return False+ else do+ m <- varReason solver (litVar lit)+ case m of+ Nothing -> return False+ Just c2 -> return $! c == c2++data SomeConstraintHandler+ = CHClause !ClauseHandler+ | CHAtLeast !AtLeastHandler+ | CHPBCounter !PBHandlerCounter+ | CHPBPueblo !PBHandlerPueblo+ deriving Eq++instance Hashable SomeConstraintHandler where+ hashWithSalt s (CHClause c) = s `hashWithSalt` (0::Int) `hashWithSalt` c+ hashWithSalt s (CHAtLeast c) = s `hashWithSalt` (1::Int) `hashWithSalt` c+ hashWithSalt s (CHPBCounter c) = s `hashWithSalt` (2::Int) `hashWithSalt` c+ hashWithSalt s (CHPBPueblo c) = s `hashWithSalt` (3::Int) `hashWithSalt` c++instance ConstraintHandler SomeConstraintHandler where+ toConstraintHandler = id++ showConstraintHandler solver (CHClause c) = showConstraintHandler solver c+ showConstraintHandler solver (CHAtLeast c) = showConstraintHandler solver c+ showConstraintHandler solver (CHPBCounter c) = showConstraintHandler solver c+ showConstraintHandler solver (CHPBPueblo c) = showConstraintHandler solver c++ attach solver (CHClause c) = attach solver c+ attach solver (CHAtLeast c) = attach solver c+ attach solver (CHPBCounter c) = attach solver c+ attach solver (CHPBPueblo c) = attach solver c++ watchedLiterals solver (CHClause c) = watchedLiterals solver c+ watchedLiterals solver (CHAtLeast c) = watchedLiterals solver c+ watchedLiterals solver (CHPBCounter c) = watchedLiterals solver c+ watchedLiterals solver (CHPBPueblo c) = watchedLiterals solver c++ basicPropagate solver this (CHClause c) lit = basicPropagate solver this c lit+ basicPropagate solver this (CHAtLeast c) lit = basicPropagate solver this c lit+ basicPropagate solver this (CHPBCounter c) lit = basicPropagate solver this c lit+ basicPropagate solver this (CHPBPueblo c) lit = basicPropagate solver this c lit++ basicReasonOf solver (CHClause c) l = basicReasonOf solver c l+ basicReasonOf solver (CHAtLeast c) l = basicReasonOf solver c l+ basicReasonOf solver (CHPBCounter c) l = basicReasonOf solver c l+ basicReasonOf solver (CHPBPueblo c) l = basicReasonOf solver c l++ toPBAtLeast solver (CHClause c) = toPBAtLeast solver c+ toPBAtLeast solver (CHAtLeast c) = toPBAtLeast solver c+ toPBAtLeast solver (CHPBCounter c) = toPBAtLeast solver c+ toPBAtLeast solver (CHPBPueblo c) = toPBAtLeast solver c++ isSatisfied solver (CHClause c) = isSatisfied solver c+ isSatisfied solver (CHAtLeast c) = isSatisfied solver c+ isSatisfied solver (CHPBCounter c) = isSatisfied solver c+ isSatisfied solver (CHPBPueblo c) = isSatisfied solver c++ constrIsProtected solver (CHClause c) = constrIsProtected solver c+ constrIsProtected solver (CHAtLeast c) = constrIsProtected solver c+ constrIsProtected solver (CHPBCounter c) = constrIsProtected solver c+ constrIsProtected solver (CHPBPueblo c) = constrIsProtected solver c++ constrReadActivity (CHClause c) = constrReadActivity c+ constrReadActivity (CHAtLeast c) = constrReadActivity c+ constrReadActivity (CHPBCounter c) = constrReadActivity c+ constrReadActivity (CHPBPueblo c) = constrReadActivity c++ constrWriteActivity (CHClause c) aval = constrWriteActivity c aval+ constrWriteActivity (CHAtLeast c) aval = constrWriteActivity c aval+ constrWriteActivity (CHPBCounter c) aval = constrWriteActivity c aval+ constrWriteActivity (CHPBPueblo c) aval = constrWriteActivity c aval++-- To avoid heap-allocation Maybe value, it returns -1 when not found.+findForWatch :: Solver -> IOUArray Int Lit -> Int -> Int -> IO Int+#ifndef __GLASGOW_HASKELL__+findForWatch solver a beg end = go beg end+ where+ go :: Int -> Int -> IO Int+ go i end | i > end = return (-1)+ go i end = do+ val <- litValue s =<< unsafeRead a i+ if val /= lFalse+ then return i+ else go (i+1) end+#else+{- We performed worker-wrapper transfomation manually, since the worker+ generated by GHC has type+ "Int# -> Int# -> State# RealWorld -> (# State# RealWorld, Int #)",+ not "Int# -> Int# -> State# RealWorld -> (# State# RealWorld, Int# #)".+ We want latter one to avoid heap-allocating Int value. -}+findForWatch solver a (I# beg) (I# end) = IO $ \w ->+ case go# beg end w of+ (# w2, ret #) -> (# w2, I# ret #)+ where+ go# :: Int# -> Int# -> State# RealWorld -> (# State# RealWorld, Int# #)+#if __GLASGOW_HASKELL__ < 708+ go# i end w | i ># end = (# w, -1# #)+#else+ go# i end w | isTrue# (i ># end) = (# w, -1# #)+#endif+ go# i end w =+ case unIO (litValue solver =<< unsafeRead a (I# i)) w of+ (# w2, val #) ->+ if val /= lFalse+ then (# w2, i #)+ else go# (i +# 1#) end w2++ unIO (IO f) = f+#endif++{--------------------------------------------------------------------+ Clause+--------------------------------------------------------------------}++data ClauseHandler+ = ClauseHandler+ { claLits :: !(IOUArray Int Lit)+ , claActivity :: !(IORef Double)+ , claHash :: !Int+ }++instance Eq ClauseHandler where+ (==) = (==) `on` claLits++instance Hashable ClauseHandler where+ hash = claHash+ hashWithSalt = defaultHashWithSalt++newClauseHandler :: Clause -> Bool -> IO ClauseHandler+newClauseHandler ls learnt = do+ let size = length ls+ a <- newListArray (0, size-1) ls+ act <- newIORef $! (if learnt then 0 else -1)+ return (ClauseHandler a act (hash ls))++instance ConstraintHandler ClauseHandler where+ toConstraintHandler = CHClause++ showConstraintHandler _ this = do+ lits <- getElems (claLits this)+ return (show lits)++ attach solver this = do+ -- BCP Queue should be empty at this point.+ -- If not, duplicated propagation happens.+ bcpCheckEmpty solver++ (lb,ub) <- getBounds (claLits this)+ assert (lb == 0) $ return ()+ let size = ub-lb+1++ if size == 0 then do+ markBad solver+ return False+ else if size == 1 then do+ lit0 <- unsafeRead (claLits this) 0+ assignBy solver lit0 this+ else do+ ref <- newIORef 1+ let f i = do+ lit_i <- unsafeRead (claLits this) i+ val_i <- litValue solver lit_i+ if val_i /= lFalse then+ return True+ else do+ j <- readIORef ref+ k <- findForWatch solver (claLits this) j ub+ case k of+ -1 -> do+ return False+ _ -> do+ lit_k <- unsafeRead (claLits this) k+ unsafeWrite (claLits this) i lit_k+ unsafeWrite (claLits this) k lit_i+ writeIORef ref $! (k+1)+ return True++ b <- f 0+ if b then do+ lit0 <- unsafeRead (claLits this) 0+ watch solver lit0 this+ b2 <- f 1+ if b2 then do+ lit1 <- unsafeRead (claLits this) 1+ watch solver lit1 this+ return True+ else do -- UNIT+ -- We need to watch the most recently falsified literal+ (i,_) <- liftM (maximumBy (comparing snd)) $ forM [1..ub] $ \l -> do+ lit <- unsafeRead (claLits this) l+ lv <- litLevel solver lit+ return (l,lv)+ lit1 <- unsafeRead (claLits this) 1+ liti <- unsafeRead (claLits this) i+ unsafeWrite (claLits this) 1 liti+ unsafeWrite (claLits this) i lit1+ watch solver liti this+ assignBy solver lit0 this -- should always succeed+ else do -- CONFLICT+ ls <- liftM (map fst . sortBy (flip (comparing snd))) $ forM [lb..ub] $ \l -> do+ lit <- unsafeRead (claLits this) l+ lv <- litLevel solver lit+ return (l,lv)+ forM_ (zip [0..] ls) $ \(i,lit) -> do+ unsafeWrite (claLits this) i lit+ lit0 <- unsafeRead (claLits this) 0+ lit1 <- unsafeRead (claLits this) 1+ watch solver lit0 this+ watch solver lit1 this+ return False++ watchedLiterals _ this = do+ lits <- getElems (claLits this)+ case lits of+ l1:l2:_ -> return [l1, l2]+ _ -> return []++ basicPropagate !solver this this2 !falsifiedLit = do+ preprocess++ !lit0 <- unsafeRead a 0+ !val0 <- litValue solver lit0+ if val0 == lTrue+ then do+ watch solver falsifiedLit this+ return True+ else do+ (!lb,!ub) <- getBounds a+ assert (lb==0) $ return ()+ i <- findForWatch solver a 2 ub+ case i of+ -1 -> do+ when debugMode $ logIO solver $ do+ str <- showConstraintHandler solver this+ return $ printf "basicPropagate: %s is unit" str+ watch solver falsifiedLit this+ assignBy solver lit0 this+ _ -> do+ !lit1 <- unsafeRead a 1+ !liti <- unsafeRead a i+ unsafeWrite a 1 liti+ unsafeWrite a i lit1+ watch solver liti this+ return True++ where+ a = claLits this2++ preprocess :: IO ()+ preprocess = do+ !l0 <- unsafeRead a 0+ !l1 <- unsafeRead a 1+ assert (l0==falsifiedLit || l1==falsifiedLit) $ return ()+ when (l0==falsifiedLit) $ do+ unsafeWrite a 0 l1+ unsafeWrite a 1 l0++ basicReasonOf _ this l = do+ lits <- getElems (claLits this)+ case l of+ Nothing -> return lits+ Just lit -> do+ assert (lit == head lits) $ return ()+ return $ tail lits++ toPBAtLeast _ this = do+ lits <- getElems (claLits this)+ return ([(1,l) | l <- lits], 1)++ isSatisfied solver this = do+ lits <- getElems (claLits this)+ vals <- mapM (litValue solver) lits+ return $ lTrue `elem` vals++ constrIsProtected _ this = do+ size <- liftM rangeSize (getBounds (claLits this))+ return $! size <= 2++ constrReadActivity this = readIORef (claActivity this)++ constrWriteActivity this aval = writeIORef (claActivity this) $! aval++instantiateClause :: Solver -> Clause -> IO (Maybe Clause)+instantiateClause solver = loop []+ where+ loop :: [Lit] -> [Lit] -> IO (Maybe Clause)+ loop ret [] = return $ Just ret+ loop ret (l:ls) = do+ val <- litValue solver l+ if val==lTrue then+ return Nothing+ else if val==lFalse then+ loop ret ls+ else+ loop (l : ret) ls++basicAttachClauseHandler :: Solver -> ClauseHandler -> IO Bool+basicAttachClauseHandler solver this = do+ lits <- getElems (claLits this)+ case lits of+ [] -> do+ markBad solver+ return False+ [l1] -> do+ assignBy solver l1 this+ l1:l2:_ -> do+ watch solver l1 this+ watch solver l2 this+ return True++{--------------------------------------------------------------------+ Cardinality Constraint+--------------------------------------------------------------------}++data AtLeastHandler+ = AtLeastHandler+ { atLeastLits :: IOUArray Int Lit+ , atLeastNum :: !Int+ , atLeastActivity :: !(IORef Double)+ , atLeastHash :: !Int+ }++instance Eq AtLeastHandler where+ (==) = (==) `on` atLeastLits++instance Hashable AtLeastHandler where+ hash = atLeastHash+ hashWithSalt = defaultHashWithSalt++newAtLeastHandler :: [Lit] -> Int -> Bool -> IO AtLeastHandler+newAtLeastHandler ls n learnt = do+ let size = length ls+ a <- newListArray (0, size-1) ls+ act <- newIORef $! (if learnt then 0 else -1)+ return (AtLeastHandler a n act (hash (ls,n)))++instance ConstraintHandler AtLeastHandler where+ toConstraintHandler = CHAtLeast++ showConstraintHandler _ this = do+ lits <- getElems (atLeastLits this)+ return $ show lits ++ " >= " ++ show (atLeastNum this)++ -- FIXME: simplify implementation+ attach solver this = do+ -- BCP Queue should be empty at this point.+ -- If not, duplicated propagation happens.+ bcpCheckEmpty solver++ let a = atLeastLits this+ (lb,ub) <- getBounds a+ assert (lb == 0) $ return ()+ let m = ub - lb + 1+ n = atLeastNum this++ if m < n then do+ markBad solver+ return False+ else if m == n then do+ let f i = do+ lit <- unsafeRead a i+ assignBy solver lit this+ allM f [0..n-1]+ else do -- m > n+ let f !i !j+ | i == n = do+ -- NOT VIOLATED: n literals (0 .. n-1) are watched+ k <- findForWatch solver a j ub+ if k /= -1 then do+ -- NOT UNIT+ lit_n <- unsafeRead a n+ lit_k <- unsafeRead a k+ unsafeWrite a n lit_k+ unsafeWrite a k lit_n+ watch solver lit_k this+ -- n+1 literals (0 .. n) are watched.+ else do+ -- UNIT+ forLoop 0 (<n) (+1) $ \l -> do+ lit <- unsafeRead a l+ _ <- assignBy solver lit this -- should always succeed+ return ()+ -- We need to watch the most recently falsified literal+ (l,_) <- liftM (maximumBy (comparing snd)) $ forM [n..ub] $ \l -> do+ lit <- unsafeRead a l+ lv <- litLevel solver lit+ when debugMode $ do+ val <- litValue solver lit+ unless (val == lFalse) $ error "AtLeastHandler.attach: should not happen"+ return (l,lv)+ lit_n <- unsafeRead a n+ lit_l <- unsafeRead a l+ unsafeWrite a n lit_l+ unsafeWrite a l lit_n+ watch solver lit_l this+ -- n+1 literals (0 .. n) are watched.+ return True+ | otherwise = do+ assert (i < n && n <= j) $ return ()+ lit_i <- unsafeRead a i+ val_i <- litValue solver lit_i+ if val_i /= lFalse then do+ watch solver lit_i this+ f (i+1) j+ else do+ k <- findForWatch solver a j ub+ if k /= -1 then do+ lit_k <- unsafeRead a k+ unsafeWrite a i lit_k+ unsafeWrite a k lit_i+ watch solver lit_k this+ f (i+1) (k+1)+ else do+ -- CONFLICT+ -- We need to watch unassigned literals or most recently falsified literals.+ do xs <- liftM (sortBy (flip (comparing snd))) $ forM [i..ub] $ \l -> do+ lit <- readArray a l+ val <- litValue solver lit+ if val == lFalse then do+ lv <- litLevel solver lit+ return (lit, lv)+ else do+ return (lit, maxBound)+ forM_ (zip [i..ub] xs) $ \(l,(lit,_lv)) -> do+ writeArray a l lit+ forLoop i (<=n) (+1) $ \l -> do+ lit_l <- readArray a l+ watch solver lit_l this+ -- n+1 literals (0 .. n) are watched.+ return False+ f 0 n++ watchedLiterals _ this = do+ lits <- getElems (atLeastLits this)+ let n = atLeastNum this+ let ws = if length lits > n then take (n+1) lits else []+ return ws++ basicPropagate solver this this2 falsifiedLit = do+ preprocess++ when debugMode $ do+ litn <- readArray a n+ unless (litn == falsifiedLit) $ error "AtLeastHandler.basicPropagate: should not happen"++ (lb,ub) <- getBounds a+ assert (lb==0) $ return ()+ i <- findForWatch solver a (n+1) ub+ case i of+ -1 -> do+ when debugMode $ logIO solver $ do+ str <- showConstraintHandler solver this+ return $ printf "basicPropagate: %s is unit" str+ watch solver falsifiedLit this+ let loop :: Int -> IO Bool+ loop i+ | i >= n = return True+ | otherwise = do+ liti <- unsafeRead a i+ ret2 <- assignBy solver liti this+ if ret2+ then loop (i+1)+ else return False+ loop 0+ _ -> do+ liti <- unsafeRead a i+ litn <- unsafeRead a n+ unsafeWrite a i litn+ unsafeWrite a n liti+ watch solver liti this+ return True++ where+ a = atLeastLits this2+ n = atLeastNum this2++ preprocess :: IO ()+ preprocess = loop 0+ where+ loop :: Int -> IO ()+ loop i+ | i >= n = return ()+ | otherwise = do+ li <- unsafeRead a i+ if (li /= falsifiedLit)+ then loop (i+1)+ else do+ ln <- unsafeRead a n+ unsafeWrite a n li+ unsafeWrite a i ln++ basicReasonOf solver this concl = do+ (lb,ub) <- getBounds (atLeastLits this)+ assert (lb==0) $ return ()+ let n = atLeastNum this+ falsifiedLits <- mapM (readArray (atLeastLits this)) [n..ub] -- drop first n elements+ when debugMode $ do+ forM_ falsifiedLits $ \lit -> do+ val <- litValue solver lit+ unless (val == lFalse) $ do+ error $ printf "AtLeastHandler.basicReasonOf: %d is %s (lFalse expected)" lit (show val)+ case concl of+ Nothing -> do+ let go :: Int -> IO Lit+ go i+ | i >= n = error $ printf "AtLeastHandler.basicReasonOf: cannot find falsified literal in first %d elements" n+ | otherwise = do+ lit <- readArray (atLeastLits this) i+ val <- litValue solver lit+ if val == lFalse+ then return lit+ else go (i+1)+ lit <- go lb+ return $ lit : falsifiedLits+ Just lit -> do+ when debugMode $ do+ es <- getElems (atLeastLits this)+ unless (lit `elem` take n es) $+ error $ printf "AtLeastHandler.basicReasonOf: cannot find %d in first %d elements" n+ return falsifiedLits++ toPBAtLeast _ this = do+ lits <- getElems (atLeastLits this)+ return ([(1,l) | l <- lits], fromIntegral (atLeastNum this))++ isSatisfied solver this = do+ lits <- getElems (atLeastLits this)+ vals <- mapM (litValue solver) lits+ return $ length [v | v <- vals, v == lTrue] >= atLeastNum this++ constrReadActivity this = readIORef (atLeastActivity this)++ constrWriteActivity this aval = writeIORef (atLeastActivity this) $! aval++instantiateAtLeast :: Solver -> AtLeast -> IO AtLeast+instantiateAtLeast solver (xs,n) = loop ([],n) xs+ where+ loop :: AtLeast -> [Lit] -> IO AtLeast+ loop ret [] = return ret+ loop (ys,m) (l:ls) = do+ val <- litValue solver l+ if val == lTrue then+ loop (ys, m-1) ls+ else if val == lFalse then+ loop (ys, m) ls+ else+ loop (l:ys, m) ls++basicAttachAtLeastHandler :: Solver -> AtLeastHandler -> IO Bool+basicAttachAtLeastHandler solver this = do+ lits <- getElems (atLeastLits this)+ let m = length lits+ n = atLeastNum this+ if m < n then do+ markBad solver+ return False+ else if m == n then do+ allM (\l -> assignBy solver l this) lits+ else do -- m > n+ forM_ (take (n+1) lits) $ \l -> watch solver l this+ return True++{--------------------------------------------------------------------+ Pseudo Boolean Constraint+--------------------------------------------------------------------}++newPBHandler :: Solver -> PBLinSum -> Integer -> Bool -> IO SomeConstraintHandler+newPBHandler solver ts degree learnt = do+ config <- readIORef (svPBHandlerType solver)+ case config of+ PBHandlerTypeCounter -> do+ c <- newPBHandlerCounter ts degree learnt+ return (toConstraintHandler c)+ PBHandlerTypePueblo -> do+ c <- newPBHandlerPueblo ts degree learnt+ return (toConstraintHandler c)++newPBHandlerPromoted :: Solver -> PBLinSum -> Integer -> Bool -> IO SomeConstraintHandler+newPBHandlerPromoted solver lhs rhs learnt = do+ case pbToAtLeast (lhs,rhs) of+ Nothing -> newPBHandler solver lhs rhs learnt+ Just (lhs2, rhs2) -> do+ if rhs2 /= 1 then do+ h <- newAtLeastHandler lhs2 rhs2 learnt+ return $ toConstraintHandler h+ else do+ h <- newClauseHandler lhs2 learnt+ return $ toConstraintHandler h++instantiatePB :: Solver -> PBLinAtLeast -> IO PBLinAtLeast+instantiatePB solver (xs,n) = loop ([],n) xs+ where+ loop :: PBLinAtLeast -> PBLinSum -> IO PBLinAtLeast+ loop ret [] = return ret+ loop (ys,m) ((c,l):ts) = do+ val <- litValue solver l+ if val == lTrue then+ loop (ys, m-c) ts+ else if val == lFalse then+ loop (ys, m) ts+ else+ loop ((c,l):ys, m) ts++pbOverSAT :: Solver -> PBLinAtLeast -> IO Bool+pbOverSAT solver (lhs, rhs) = do+ ss <- forM lhs $ \(c,l) -> do+ v <- litValue solver l+ if v /= lFalse+ then return c+ else return 0+ return $! sum ss > rhs++pbToAtLeast :: PBLinAtLeast -> Maybe AtLeast+pbToAtLeast (lhs, rhs) = do+ let cs = [c | (c,_) <- lhs]+ guard $ Set.size (Set.fromList cs) == 1+ let c = head cs+ return $ (map snd lhs, fromInteger ((rhs+c-1) `div` c))++{--------------------------------------------------------------------+ Pseudo Boolean Constraint (Counter)+--------------------------------------------------------------------} ++data PBHandlerCounter+ = PBHandlerCounter+ { pbTerms :: !PBLinSum -- sorted in the decending order on coefficients.+ , pbDegree :: !Integer+ , pbCoeffMap :: !(LitMap Integer)+ , pbMaxSlack :: !Integer+ , pbSlack :: !(IORef Integer)+ , pbActivity :: !(IORef Double)+ , pbHash :: !Int+ }++instance Eq PBHandlerCounter where+ (==) = (==) `on` pbSlack++instance Hashable PBHandlerCounter where+ hash = pbHash+ hashWithSalt = defaultHashWithSalt++newPBHandlerCounter :: PBLinSum -> Integer -> Bool -> IO PBHandlerCounter+newPBHandlerCounter ts degree learnt = do+ let ts' = sortBy (flip compare `on` fst) ts+ slack = sum (map fst ts) - degree + m = IM.fromList [(l,c) | (c,l) <- ts]+ s <- newIORef slack+ act <- newIORef $! (if learnt then 0 else -1)+ return (PBHandlerCounter ts' degree m slack s act (hash (ts,degree)))++instance ConstraintHandler PBHandlerCounter where+ toConstraintHandler = CHPBCounter++ showConstraintHandler _ this = do+ return $ show (pbTerms this) ++ " >= " ++ show (pbDegree this)++ attach solver this = do+ -- BCP queue should be empty at this point.+ -- It is important for calculating slack.+ bcpCheckEmpty solver+ s <- liftM sum $ forM (pbTerms this) $ \(c,l) -> do+ watch solver l this+ val <- litValue solver l+ if val == lFalse then do+ addBacktrackCB solver (litVar l) $ modifyIORef' (pbSlack this) (+ c)+ return 0+ else do+ return c+ let slack = s - pbDegree this+ writeIORef (pbSlack this) $! slack+ if slack < 0 then+ return False+ else do+ flip allM (pbTerms this) $ \(c,l) -> do+ val <- litValue solver l+ if c > slack && val == lUndef then do+ assignBy solver l this+ else+ return True++ watchedLiterals _ this = do+ return $ map snd $ pbTerms this++ basicPropagate solver this this2 falsifiedLit = do+ watch solver falsifiedLit this+ let c = pbCoeffMap this2 IM.! falsifiedLit+ modifyIORef' (pbSlack this2) (subtract c)+ addBacktrackCB solver (litVar falsifiedLit) $ modifyIORef' (pbSlack this2) (+ c)+ s <- readIORef (pbSlack this2)+ if s < 0 then+ return False+ else do+ forM_ (takeWhile (\(c1,_) -> c1 > s) (pbTerms this2)) $ \(_,l1) -> do+ v <- litValue solver l1+ when (v == lUndef) $ do+ assignBy solver l1 this+ return ()+ return True++ basicReasonOf solver this l = do+ case l of+ Nothing -> do+ let p _ = return True+ f p (pbMaxSlack this) (pbTerms this)+ Just lit -> do+ idx <- varAssignNo solver (litVar lit)+ -- PB制約の場合には複数回unitになる可能性があり、+ -- litへの伝播以降に割り当てられたリテラルを含まないよう注意が必要+ let p lit2 =do+ idx2 <- varAssignNo solver (litVar lit2)+ return $ idx2 < idx+ let c = pbCoeffMap this IM.! lit+ f p (pbMaxSlack this - c) (pbTerms this)+ where+ {-# INLINE f #-}+ f :: (Lit -> IO Bool) -> Integer -> PBLinSum -> IO [Lit]+ f p s xs = go s xs []+ where+ go :: Integer -> PBLinSum -> [Lit] -> IO [Lit]+ go s _ ret | s < 0 = return ret+ go _ [] _ = error "PBHandlerCounter.basicReasonOf: should not happen"+ go s ((c,lit):xs) ret = do+ val <- litValue solver lit+ if val == lFalse then do+ b <- p lit+ if b+ then go (s - c) xs (lit:ret)+ else go s xs ret+ else do+ go s xs ret++ toPBAtLeast _ this = do+ return (pbTerms this, pbDegree this)++ isSatisfied solver this = do+ xs <- forM (pbTerms this) $ \(c,l) -> do+ v <- litValue solver l+ if v == lTrue+ then return c+ else return 0+ return $ sum xs >= pbDegree this++ constrWeight _ _ = return 0.5++ constrReadActivity this = readIORef (pbActivity this)++ constrWriteActivity this aval = writeIORef (pbActivity this) $! aval++{--------------------------------------------------------------------+ Pseudo Boolean Constraint (Pueblo)+--------------------------------------------------------------------}++data PBHandlerPueblo+ = PBHandlerPueblo+ { puebloTerms :: !PBLinSum+ , puebloDegree :: !Integer+ , puebloMaxSlack :: !Integer+ , puebloWatches :: !(IORef LitSet)+ , puebloWatchSum :: !(IORef Integer)+ , puebloActivity :: !(IORef Double)+ , puebloHash :: !Int+ }++instance Eq PBHandlerPueblo where+ (==) = (==) `on` puebloWatchSum++instance Hashable PBHandlerPueblo where+ hash = puebloHash+ hashWithSalt = defaultHashWithSalt++puebloAMax :: PBHandlerPueblo -> Integer+puebloAMax this =+ case puebloTerms this of+ (c,_):_ -> c+ [] -> 0 -- should not happen?++newPBHandlerPueblo :: PBLinSum -> Integer -> Bool -> IO PBHandlerPueblo+newPBHandlerPueblo ts degree learnt = do+ let ts' = sortBy (flip compare `on` fst) ts+ slack = sum [c | (c,_) <- ts'] - degree+ ws <- newIORef IS.empty+ wsum <- newIORef 0+ act <- newIORef $! (if learnt then 0 else -1)+ return $ PBHandlerPueblo ts' degree slack ws wsum act (hash (ts,degree))++puebloGetWatchSum :: PBHandlerPueblo -> IO Integer+puebloGetWatchSum pb = readIORef (puebloWatchSum pb)++puebloWatch :: Solver -> SomeConstraintHandler -> PBHandlerPueblo -> PBLinTerm -> IO ()+puebloWatch solver constr !pb (c, lit) = do+ watch solver lit constr+ modifyIORef' (puebloWatches pb) (IS.insert lit)+ modifyIORef' (puebloWatchSum pb) (+c)++puebloUnwatch :: Solver -> PBHandlerPueblo -> PBLinTerm -> IO ()+puebloUnwatch _solver pb (c, lit) = do+ modifyIORef' (puebloWatches pb) (IS.delete lit)+ modifyIORef' (puebloWatchSum pb) (subtract c)++instance ConstraintHandler PBHandlerPueblo where+ toConstraintHandler = CHPBPueblo++ showConstraintHandler _ this = do+ return $ show (puebloTerms this) ++ " >= " ++ show (puebloDegree this)++ attach solver this = do+ bcpCheckEmpty solver+ let constr = toConstraintHandler this+ ret <- puebloPropagate solver constr this++ -- register to watch recently falsified literals to recover+ -- "WatchSum >= puebloDegree this + puebloAMax this" when backtrack is performed.+ wsum <- puebloGetWatchSum this+ unless (wsum >= puebloDegree this + puebloAMax this) $ do+ let f m tm@(_,lit) = do+ val <- litValue solver lit+ if val == lFalse then do+ idx <- varAssignNo solver (litVar lit)+ return (IM.insert idx tm m)+ else+ return m+#if MIN_VERSION_containers(0,5,0)+ xs <- liftM (map snd . IM.toDescList) $ foldM f IM.empty (puebloTerms this)+#else+ xs <- liftM (reverse . map snd . IM.toAscList) $ foldM f IM.empty (puebloTerms this)+#endif+ let g !_ [] = return ()+ g !s (t@(c,l):ts) = do+ addBacktrackCB solver (litVar l) $ puebloWatch solver constr this t+ if s+c >= puebloDegree this + puebloAMax this then return ()+ else g (s+c) ts+ g wsum xs++ return ret++ watchedLiterals _ this = liftM IS.toList $ readIORef (puebloWatches this)++ basicPropagate solver this this2 falsifiedLit = do+ let t = fromJust $ find (\(_,l) -> l==falsifiedLit) (puebloTerms this2)+ puebloUnwatch solver this2 t+ ret <- puebloPropagate solver this this2+ wsum <- puebloGetWatchSum this2+ unless (wsum >= puebloDegree this2 + puebloAMax this2) $+ addBacktrackCB solver (litVar falsifiedLit) $ puebloWatch solver this this2 t+ return ret++ basicReasonOf solver this l = do+ case l of+ Nothing -> do+ let p _ = return True+ f p (puebloMaxSlack this) (puebloTerms this)+ Just lit -> do+ idx <- varAssignNo solver (litVar lit)+ -- PB制約の場合には複数回unitになる可能性があり、+ -- litへの伝播以降に割り当てられたリテラルを含まないよう注意が必要+ let p lit2 =do+ idx2 <- varAssignNo solver (litVar lit2)+ return $ idx2 < idx+ let c = fst $ fromJust $ find (\(_,l) -> l == lit) (puebloTerms this)+ f p (puebloMaxSlack this - c) (puebloTerms this)+ where+ {-# INLINE f #-}+ f :: (Lit -> IO Bool) -> Integer -> PBLinSum -> IO [Lit]+ f p s xs = go s xs []+ where+ go :: Integer -> PBLinSum -> [Lit] -> IO [Lit]+ go s _ ret | s < 0 = return ret+ go _ [] _ = error "PBHandlerPueblo.basicReasonOf: should not happen"+ go s ((c,lit):xs) ret = do+ val <- litValue solver lit+ if val == lFalse then do+ b <- p lit+ if b+ then go (s - c) xs (lit:ret)+ else go s xs ret+ else do+ go s xs ret++ toPBAtLeast _ this = do+ return (puebloTerms this, puebloDegree this)++ isSatisfied solver this = do+ xs <- forM (puebloTerms this) $ \(c,l) -> do+ v <- litValue solver l+ if v == lTrue+ then return c+ else return 0+ return $ sum xs >= puebloDegree this++ constrWeight _ _ = return 0.5++ constrReadActivity this = readIORef (puebloActivity this)++ constrWriteActivity this aval = writeIORef (puebloActivity this) $! aval++puebloPropagate :: Solver -> SomeConstraintHandler -> PBHandlerPueblo -> IO Bool+puebloPropagate solver constr this = do+ puebloUpdateWatchSum solver constr this+ watchsum <- puebloGetWatchSum this+ if puebloDegree this + puebloAMax this <= watchsum then+ return True+ else if watchsum < puebloDegree this then do+ -- CONFLICT+ return False+ else do -- puebloDegree this <= watchsum < puebloDegree this + puebloAMax this+ -- UNIT PROPAGATION+ let f [] = return True+ f ((c,lit) : ts) = do+ watchsum <- puebloGetWatchSum this+ if watchsum - c >= puebloDegree this then+ return True+ else do+ val <- litValue solver lit+ when (val == lUndef) $ do+ b <- assignBy solver lit this+ assert b $ return ()+ f ts+ f $ puebloTerms this++puebloUpdateWatchSum :: Solver -> SomeConstraintHandler -> PBHandlerPueblo -> IO ()+puebloUpdateWatchSum solver constr this = do+ let f [] = return ()+ f (t@(_,lit):ts) = do+ watchSum <- puebloGetWatchSum this+ if watchSum >= puebloDegree this + puebloAMax this then+ return ()+ else do+ val <- litValue solver lit+ watched <- liftM (lit `IS.member`) $ readIORef (puebloWatches this)+ when (val /= lFalse && not watched) $ do+ puebloWatch solver constr this t+ f ts+ f (puebloTerms this)++{--------------------------------------------------------------------+ Restart strategy+--------------------------------------------------------------------}++data RestartStrategy = MiniSATRestarts | ArminRestarts | LubyRestarts+ deriving (Show, Eq, Ord)++mkRestartSeq :: RestartStrategy -> Int -> Double -> [Int]+mkRestartSeq MiniSATRestarts = miniSatRestartSeq+mkRestartSeq ArminRestarts = arminRestartSeq+mkRestartSeq LubyRestarts = lubyRestartSeq++miniSatRestartSeq :: Int -> Double -> [Int]+miniSatRestartSeq start inc = iterate (ceiling . (inc *) . fromIntegral) start++{-+miniSatRestartSeq :: Int -> Double -> [Int]+miniSatRestartSeq start inc = map round $ iterate (inc*) (fromIntegral start)+-}++arminRestartSeq :: Int -> Double -> [Int]+arminRestartSeq start inc = go (fromIntegral start) (fromIntegral start)+ where + go !inner !outer = round inner : go inner' outer'+ where+ (inner',outer') = + if inner >= outer+ then (fromIntegral start, outer * inc)+ else (inner * inc, outer)++lubyRestartSeq :: Int -> Double -> [Int]+lubyRestartSeq start inc = map (ceiling . (fromIntegral start *) . luby inc) [0..]++{-+ Finite subsequences of the Luby-sequence:++ 0: 1+ 1: 1 1 2+ 2: 1 1 2 1 1 2 4+ 3: 1 1 2 1 1 2 4 1 1 2 1 1 2 4 8+ ...+++-}+luby :: Double -> Integer -> Double+luby y x = go2 size1 sequ1 x+ where+ -- Find the finite subsequence that contains index 'x', and the+ -- size of that subsequence:+ (size1, sequ1) = go 1 0++ go :: Integer -> Integer -> (Integer, Integer)+ go size sequ+ | size < x+1 = go (2*size+1) (sequ+1)+ | otherwise = (size, sequ)++ go2 :: Integer -> Integer -> Integer -> Double+ go2 size sequ x2+ | size-1 /= x2 = let size' = (size-1) `div` 2 in go2 size' (sequ - 1) (x2 `mod` size')+ | otherwise = y ^ sequ+++{--------------------------------------------------------------------+ utility+--------------------------------------------------------------------}++allM :: Monad m => (a -> m Bool) -> [a] -> m Bool+allM p = go+ where+ go [] = return True+ go (x:xs) = do+ b <- p x+ if b+ then go xs+ else return False++anyM :: Monad m => (a -> m Bool) -> [a] -> m Bool+anyM p = go+ where+ go [] = return False+ go (x:xs) = do+ b <- p x+ if b+ then return True+ else go xs++#if !MIN_VERSION_base(4,6,0)++modifyIORef' :: IORef a -> (a -> a) -> IO ()+modifyIORef' ref f = do+ x <- readIORef ref+ writeIORef ref $! f x++#endif++shift :: IORef [a] -> IO a+shift ref = do+ (x:xs) <- readIORef ref+ writeIORef ref xs+ return x++defaultHashWithSalt :: Hashable a => Int -> a -> Int+defaultHashWithSalt salt x = salt `combine` hash x+#if MIN_VERSION_hashable(1,2,0)+ where+ combine :: Int -> Int -> Int+ combine h1 h2 = (h1 * 16777619) `xor` h2+#endif++{--------------------------------------------------------------------+ debug+--------------------------------------------------------------------}++debugMode :: Bool+debugMode = False++checkSatisfied :: Solver -> IO ()+checkSatisfied solver = do+ cls <- readIORef (svConstrDB solver)+ forM_ cls $ \c -> do+ b <- isSatisfied solver c+ unless b $ do+ s <- showConstraintHandler solver c+ log solver $ "BUG: " ++ s ++ " is violated"++sanityCheck :: Solver -> IO ()+sanityCheck _ | not debugMode = return ()+sanityCheck solver = do+ cls <- readIORef (svConstrDB solver)+ forM_ cls $ \constr -> do+ lits <- watchedLiterals solver constr+ forM_ lits $ \l -> do+ ws <- watches solver l+ unless (constr `elem` ws) $ error $ printf "sanityCheck:A:%s" (show lits)++ vs <- variables solver+ let lits = [l | v <- vs, l <- [literal v True, literal v False]]+ forM_ lits $ \l -> do+ cs <- watches solver l+ forM_ cs $ \constr -> do+ lits2 <- watchedLiterals solver constr+ unless (l `elem` lits2) $ do+ error $ printf "sanityCheck:C:%d %s" l (show lits2)++dumpVarActivity :: Solver -> IO ()+dumpVarActivity solver = do+ log solver "Variable activity:"+ vs <- variables solver+ forM_ vs $ \v -> do+ activity <- varActivity solver v+ log solver $ printf "activity(%d) = %d" v activity++dumpConstrActivity :: Solver -> IO ()+dumpConstrActivity solver = do+ log solver "Learnt constraints activity:"+ xs <- learntConstraints solver+ forM_ xs $ \c -> do+ s <- showConstraintHandler solver c+ aval <- constrReadActivity c+ log solver $ printf "activity(%s) = %f" s aval++-- | set callback function for receiving messages.+setLogger :: Solver -> (String -> IO ()) -> IO ()+setLogger solver logger = do+ writeIORef (svLogger solver) (Just logger)++log :: Solver -> String -> IO ()+log solver msg = logIO solver (return msg)++logIO :: Solver -> IO String -> IO ()+logIO solver action = do+ m <- readIORef (svLogger solver)+ case m of+ Nothing -> return ()+ Just logger -> action >>= logger
+ src/ToySolver/SAT/CAMUS.hs view
@@ -0,0 +1,131 @@+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.SAT.CAMUS+-- Copyright : (c) Masahiro Sakai 2012-2014+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : provisional+-- Portability : portable+--+-- * [CAMUS] M. Liffiton and K. Sakallah, Algorithms for computing minimal+-- unsatisfiable subsets of constraints, Journal of Automated Reasoning,+-- vol. 40, no. 1, pp. 1-33, Jan. 2008. +-- <http://sun.iwu.edu/~mliffito/publications/jar_liffiton_CAMUS.pdf>+--+-- * [HYCAM] A. Gregoire, B. Mazure, and C. Piette, Boosting a complete+-- technique to find MSS and MUS: thanks to a local search oracle, in+-- Proceedings of the 20th international joint conference on Artifical+-- intelligence, ser. IJCAI'07. San Francisco, CA, USA: Morgan Kaufmann+-- Publishers Inc., 2007, pp. 2300-2305.+-- <http://ijcai.org/papers07/Papers/IJCAI07-370.pdf>+--+-----------------------------------------------------------------------------+module ToySolver.SAT.CAMUS+ ( MUS+ , MCS+ , Options (..)+ , defaultOptions+ , allMCSAssumptions+ , allMUSAssumptions+ , enumMCSAssumptions+ ) where++import Control.Monad+import Data.Array.IArray+import qualified Data.IntSet as IS+import Data.List+import Data.IORef+import qualified ToySolver.HittingSet as HittingSet+import qualified ToySolver.SAT as SAT+import ToySolver.SAT.Types++-- | Minimal Unsatisfiable Subset of constraints.+type MUS = [Lit]++-- | Minimal Correction Subset of constraints.+type MCS = [Lit]++-- | Options for 'enumMCSAssumptions', 'allMCSAssumptions', 'allMUSAssumptions'+data Options+ = Options+ { optLogger :: String -> IO ()+ , optCallback :: MCS -> IO ()+ , optMCSCandidates :: [MCS]+ -- ^ MCS candidates (see HYCAM paper for details).+ -- A MCS candidate must be a superset of real MCS.+ }++-- | default 'Options' value+defaultOptions :: Options+defaultOptions =+ Options+ { optLogger = \_ -> return ()+ , optCallback = \_ -> return ()+ , optMCSCandidates = []+ }++enumMCSAssumptions :: SAT.Solver -> [Lit] -> Options -> IO ()+enumMCSAssumptions solver sels opt = do+ candRef <- newIORef [(IS.size s, s) | mcs <- optMCSCandidates opt, let s = IS.fromList mcs]+ loop candRef 1++ where+ log :: String -> IO ()+ log = optLogger opt++ mcsFound :: MCS -> IO ()+ mcsFound mcs = do+ optCallback opt mcs+ SAT.addClause solver mcs++ loop :: IORef [(Int, LitSet)] -> Int -> IO ()+ loop candRef k = do+ log $ "CAMUS: k = " ++ show k+ cand <- readIORef candRef++ ret <- if not (null cand) then return True else SAT.solve solver+ when ret $ do+ forM_ cand $ \(size,cs) -> do+ when (size == k) $ do+ -- If a candidate MCS is not superset of already obtained MCS,+ -- we are sure that they are real MCS.+ mcsFound (IS.toList cs)+ writeIORef candRef [(size,cs) | (size,cs) <- cand, size /= k]++ vk <- SAT.newVar solver+ SAT.addPBAtMostSoft solver vk [(1,-sel) | sel <- sels] (fromIntegral k)+ let loop2 = do+ ret2 <- SAT.solveWith solver [vk]+ when ret2 $ do+ m <- SAT.model solver+ let mcs = [sel | sel <- sels, not (evalLit m sel)]+ mcs' = IS.fromList mcs+ mcsFound mcs+ modifyIORef candRef (filter (\(_,cs) -> not (mcs' `IS.isSubsetOf` cs)))+ loop2+ loop2+ SAT.addClause solver [-vk]+ loop candRef (k+1)++allMCSAssumptions :: SAT.Solver -> [Lit] -> Options -> IO [MCS]+allMCSAssumptions solver sels opt = do+ ref <- newIORef [] + let opt2 =+ opt+ { optCallback = \mcs -> do+ modifyIORef ref (mcs:)+ optCallback opt mcs+ }+ enumMCSAssumptions solver sels opt2+ readIORef ref++allMUSAssumptions :: SAT.Solver -> [Lit] -> Options -> IO [MUS]+allMUSAssumptions solver sels opt = do+ log "CAMUS: MCS enumeration begins"+ mcses <- allMCSAssumptions solver sels opt+ log "CAMUS: MCS enumeration done"+ return $ HittingSet.minimalHittingSets mcses+ where+ log :: String -> IO ()+ log = optLogger opt
+ src/ToySolver/SAT/Integer.hs view
@@ -0,0 +1,94 @@+{-# LANGUAGE TypeFamilies #-}+module ToySolver.SAT.Integer+ ( Expr (..)+ , newVar+ , linearize+ , addConstraint+ , addConstraintSoft+ , eval+ ) where++import Control.Monad+import Data.Array.IArray+import Data.VectorSpace+import Text.Printf++import ToySolver.Data.ArithRel+import qualified ToySolver.SAT as SAT+import qualified ToySolver.SAT.Types as SAT+import qualified ToySolver.SAT.TseitinEncoder as TseitinEncoder++data Expr = Expr [(Integer, [SAT.Lit])]++newVar :: SAT.Solver -> Integer -> Integer -> IO Expr+newVar solver lo hi = do+ when (lo > hi) $ error $ printf "ToySolver.SAT.Integer.newVar: inconsistent bounds given [%d, %d]" lo hi+ let hi' = hi - lo+ bitWidth = head $ [w | w <- [1..], let mx = 2 ^ w - 1, hi' <= mx]+ vs <- SAT.newVars solver bitWidth+ let xs = zip (iterate (2*) 1) vs+ SAT.addPBAtMost solver xs hi'+ return $ Expr ((lo,[]) : [(c,[x]) | (c,x) <- xs])++instance AdditiveGroup Expr where+ Expr xs1 ^+^ Expr xs2 = Expr (xs1++xs2)+ zeroV = Expr []+ negateV = ((-1) *^)++instance VectorSpace Expr where+ type Scalar Expr = Integer+ n *^ Expr xs = Expr [(n*m,lits) | (m,lits) <- xs]++instance Num Expr where+ Expr xs1 + Expr xs2 = Expr (xs1++xs2)+ Expr xs1 * Expr xs2 = Expr [(c1*c2, lits1++lits2) | (c1,lits1) <- xs1, (c2,lits2) <- xs2]+ negate (Expr xs) = Expr [(-c,lits) | (c,lits) <- xs]+ abs = id+ signum _ = 1+ fromInteger c = Expr [(c,[])]++linearize :: TseitinEncoder.Encoder -> Expr -> IO (SAT.PBLinSum, Integer)+linearize enc (Expr xs) = do+ let ys = [(c,lits) | (c,lits@(_:_)) <- xs]+ c = sum [c | (c,[]) <- xs]+ zs <- forM ys $ \(c,lits) -> do+ l <- TseitinEncoder.encodeConj enc lits+ return (c,l)+ return (zs, c)++addConstraint :: TseitinEncoder.Encoder -> Rel Expr -> IO ()+addConstraint enc (Rel lhs op rhs) = do+ let solver = TseitinEncoder.encSolver enc+ (lhs2,c) <- linearize enc (lhs - rhs)+ let rhs2 = -c+ case op of+ Le -> SAT.addPBAtMost solver lhs2 rhs2+ Lt -> SAT.addPBAtMost solver lhs2 (rhs2-1)+ Ge -> SAT.addPBAtLeast solver lhs2 rhs2+ Gt -> SAT.addPBAtLeast solver lhs2 (rhs2+1)+ Eql -> SAT.addPBExactly solver lhs2 rhs2+ NEq -> do+ sel <- SAT.newVar solver+ SAT.addPBAtLeastSoft solver sel lhs2 (rhs2+1)+ SAT.addPBAtMostSoft solver (-sel) lhs2 (rhs2-1)++addConstraintSoft :: TseitinEncoder.Encoder -> SAT.Lit -> Rel Expr -> IO ()+addConstraintSoft enc sel (Rel lhs op rhs) = do+ let solver = TseitinEncoder.encSolver enc+ (lhs2,c) <- linearize enc (lhs - rhs)+ let rhs2 = -c+ case op of+ Le -> SAT.addPBAtMostSoft solver sel lhs2 rhs2+ Lt -> SAT.addPBAtMostSoft solver sel lhs2 (rhs2-1)+ Ge -> SAT.addPBAtLeastSoft solver sel lhs2 rhs2+ Gt -> SAT.addPBAtLeastSoft solver sel lhs2 (rhs2+1)+ Eql -> SAT.addPBExactlySoft solver sel lhs2 rhs2+ NEq -> do+ sel2 <- SAT.newVar solver+ sel3 <- TseitinEncoder.encodeConj enc [sel,sel2]+ sel4 <- TseitinEncoder.encodeConj enc [sel,-sel2]+ SAT.addPBAtLeastSoft solver sel3 lhs2 (rhs2+1)+ SAT.addPBAtMostSoft solver sel4 lhs2 (rhs2-1)++eval :: SAT.IModel m => m -> Expr -> Integer+eval m (Expr ts) = sum [if and [SAT.evalLit m lit | lit <- lits] then n else 0 | (n,lits) <- ts]
+ src/ToySolver/SAT/MUS.hs view
@@ -0,0 +1,92 @@+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.SAT.MUS+-- Copyright : (c) Masahiro Sakai 2012+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : provisional+-- Portability : non-portable+--+-- Minimal Unsatifiable Subset (MUS) Finder+--+-----------------------------------------------------------------------------+module ToySolver.SAT.MUS+ ( Options (..)+ , defaultOptions+ , findMUSAssumptions+ ) where++import Control.Monad+import Data.List+import qualified Data.IntSet as IS+import qualified ToySolver.SAT as SAT+import ToySolver.SAT.Types++-- | Options for 'findMUSAssumptions' function+data Options+ = Options+ { optLogger :: String -> IO ()+ , optUpdateBest :: [Lit] -> IO ()+ , optLitPrinter :: Lit -> String+ }++-- | default 'Options' value+defaultOptions :: Options+defaultOptions =+ Options+ { optLogger = \_ -> return ()+ , optUpdateBest = \_ -> return ()+ , optLitPrinter = show+ }++-- | Find a minimal set of assumptions that causes a conflict.+-- Initial set of assumptions is taken from 'SAT.failedAssumptions'.+findMUSAssumptions+ :: SAT.Solver+ -> Options+ -> IO [Lit]+findMUSAssumptions solver opt = do+ log "computing a minimal unsatisfiable core"+ core <- liftM IS.fromList $ SAT.failedAssumptions solver+ update $ IS.toList core+ log $ "core = " ++ showLits core+ mus <- loop core IS.empty+ return $ IS.toList mus++ where+ log :: String -> IO ()+ log = optLogger opt++ update :: [Lit] -> IO ()+ update = optUpdateBest opt++ showLit :: Lit -> String+ showLit = optLitPrinter opt++ showLits :: IS.IntSet -> String+ showLits ls = "{" ++ intercalate ", " (map showLit (IS.toList ls)) ++ "}"++ loop :: IS.IntSet -> IS.IntSet -> IO IS.IntSet+ loop ls1 fixed = do+ case IS.minView ls1 of+ Nothing -> do+ log $ "found a minimal unsatisfiable core"+ return fixed+ Just (l,ls) -> do+ log $ "trying to remove " ++ showLit l+ ret <- SAT.solveWith solver (IS.toList ls)+ if not ret+ then do+ ls2 <- liftM IS.fromList $ SAT.failedAssumptions solver+ let removed = ls1 `IS.difference` ls2+ log $ "successed to remove " ++ showLits removed+ log $ "new core = " ++ showLits (ls2 `IS.union` fixed)+ update $ IS.toList ls2+ forM_ (IS.toList removed) $ \l ->+ SAT.addClause solver [-l]+ loop ls2 fixed+ else do+ log $ "failed to remove " ++ showLit l+ SAT.addClause solver [l]+ loop ls (IS.insert l fixed)
+ src/ToySolver/SAT/PBO.hs view
@@ -0,0 +1,334 @@+{-# OPTIONS_GHC -Wall -fno-warn-unused-do-bind #-}+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.SAT.PBO+-- Copyright : (c) Masahiro Sakai 2012-2013+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : provisional+-- Portability : portable+--+-- Pseudo-Boolean Optimization (PBO) Solver+--+-----------------------------------------------------------------------------+module ToySolver.SAT.PBO+ (+ -- * The @Optimizer@ type+ Optimizer+ , newOptimizer++ -- * Solving+ , optimize+ , addSolution++ -- * Extract results+ , getBestSolution+ , getBestValue+ , getBestModel+ , isUnsat+ , isOptimum+ , isFinished++ -- * Configulation+ , SearchStrategy (..)+ , defaultSearchStrategy+ , getSearchStrategy+ , setSearchStrategy+ , defaultEnableObjFunVarsHeuristics+ , getEnableObjFunVarsHeuristics+ , setEnableObjFunVarsHeuristics+ , defaultTrialLimitConf+ , getTrialLimitConf+ , setTrialLimitConf+ , setOnUpdateBestSolution+ , setOnUpdateLowerBound+ , setLogger+ ) where++import Control.Concurrent.STM+import Control.Exception+import Control.Monad+import Data.IORef+import qualified Data.Set as Set+import qualified Data.Map as Map+import Text.Printf+import qualified ToySolver.SAT as SAT+import qualified ToySolver.SAT.Types as SAT+import qualified ToySolver.SAT.PBO.Context as C+import qualified ToySolver.SAT.PBO.BC as BC+import qualified ToySolver.SAT.PBO.BCD as BCD+import qualified ToySolver.SAT.PBO.BCD2 as BCD2+import qualified ToySolver.SAT.PBO.UnsatBased as UnsatBased+import qualified ToySolver.SAT.PBO.MSU4 as MSU4++data SearchStrategy+ = LinearSearch+ | BinarySearch+ | AdaptiveSearch+ | UnsatBased+ | MSU4+ | BC+ | BCD+ | BCD2++defaultSearchStrategy :: SearchStrategy+defaultSearchStrategy = LinearSearch++data Optimizer+ = Optimizer+ { optContext :: C.SimpleContext+ , optSolver :: SAT.Solver+ , optSearchStrategyRef :: IORef SearchStrategy+ , optEnableObjFunVarsHeuristicsRef :: IORef Bool+ , optTrialLimitConfRef :: IORef Int+ }++newOptimizer :: SAT.Solver -> SAT.PBLinSum -> IO Optimizer+newOptimizer solver obj = do+ cxt <- C.newSimpleContext obj+ strategyRef <- newIORef defaultSearchStrategy+ heuristicsRef <- newIORef defaultEnableObjFunVarsHeuristics+ trialLimitRef <- newIORef defaultTrialLimitConf+ return $+ Optimizer+ { optContext = cxt+ , optSolver = solver+ , optSearchStrategyRef = strategyRef+ , optEnableObjFunVarsHeuristicsRef = heuristicsRef+ , optTrialLimitConfRef = trialLimitRef+ }++optimize :: Optimizer -> IO ()+optimize opt = do+ let cxt = optContext opt+ let obj = C.getObjectiveFunction cxt+ let solver = optSolver opt++ getEnableObjFunVarsHeuristics opt >>= \b ->+ when b $ tweakParams solver obj++ strategy <- getSearchStrategy opt+ case strategy of+ UnsatBased -> UnsatBased.solve cxt solver+ MSU4 -> MSU4.solve cxt solver+ BC -> BC.solve cxt solver+ BCD -> BCD.solve cxt solver+ BCD2 -> do+ let opt2 = BCD2.defaultOptions+ BCD2.solve cxt solver opt2+ _ -> do+ SAT.setEnableBackwardSubsumptionRemoval solver True++ join $ atomically $ do+ ret <- C.getBestValue cxt+ case ret of+ Just _ -> return $ return ()+ Nothing -> return $ do+ result <- SAT.solve solver+ if not result then+ C.setFinished cxt+ else do+ m <- SAT.model solver+ C.addSolution cxt m++ join $ atomically $ do+ ret <- C.getBestValue cxt+ case ret of+ Nothing -> return $ return ()+ Just val -> return $ do+ let ub = val - 1+ SAT.addPBAtMost solver obj ub++ case strategy of+ LinearSearch -> linSearch cxt solver+ BinarySearch -> binSearch cxt solver+ AdaptiveSearch -> do+ lim <- getTrialLimitConf opt+ adaptiveSearch cxt solver lim+ _ -> error "ToySolver.SAT.PBO.minimize: should not happen" ++getSearchStrategy :: Optimizer -> IO SearchStrategy+getSearchStrategy opt = readIORef (optSearchStrategyRef opt)++setSearchStrategy :: Optimizer -> SearchStrategy -> IO ()+setSearchStrategy opt val = writeIORef (optSearchStrategyRef opt) val++defaultEnableObjFunVarsHeuristics :: Bool+defaultEnableObjFunVarsHeuristics = False++getEnableObjFunVarsHeuristics :: Optimizer -> IO Bool+getEnableObjFunVarsHeuristics opt = readIORef (optEnableObjFunVarsHeuristicsRef opt)++setEnableObjFunVarsHeuristics :: Optimizer -> Bool -> IO ()+setEnableObjFunVarsHeuristics opt val = writeIORef (optEnableObjFunVarsHeuristicsRef opt) val++defaultTrialLimitConf :: Int+defaultTrialLimitConf = 1000++getTrialLimitConf :: Optimizer -> IO Int+getTrialLimitConf opt = readIORef (optTrialLimitConfRef opt)++setTrialLimitConf :: Optimizer -> Int -> IO ()+setTrialLimitConf opt val = writeIORef (optTrialLimitConfRef opt) val+++setOnUpdateBestSolution :: Optimizer -> (SAT.Model -> Integer -> IO ()) -> IO ()+setOnUpdateBestSolution opt cb = C.setOnUpdateBestSolution (optContext opt) cb++setOnUpdateLowerBound :: Optimizer -> (Integer -> IO ()) -> IO ()+setOnUpdateLowerBound opt cb = C.setOnUpdateLowerBound (optContext opt) cb++setLogger :: Optimizer -> (String -> IO ()) -> IO ()+setLogger opt cb = C.setLogger (optContext opt) cb+++addSolution :: Optimizer -> SAT.Model -> IO ()+addSolution opt m = C.addSolution (optContext opt) m++getBestSolution :: Optimizer -> IO (Maybe (SAT.Model, Integer))+getBestSolution opt = atomically $ C.getBestSolution (optContext opt)++getBestValue :: Optimizer -> IO (Maybe Integer)+getBestValue opt = atomically $ C.getBestValue (optContext opt)++getBestModel :: Optimizer -> IO (Maybe SAT.Model)+getBestModel opt = atomically $ C.getBestModel (optContext opt)++isUnsat :: Optimizer -> IO Bool+isUnsat opt = atomically $ C.isUnsat (optContext opt)++isOptimum :: Optimizer -> IO Bool+isOptimum opt = atomically $ C.isOptimum (optContext opt)++isFinished :: Optimizer -> IO Bool+isFinished opt = atomically $ C.isFinished (optContext opt)+++linSearch :: C.Context cxt => cxt -> SAT.Solver -> IO ()+linSearch cxt solver = loop+ where+ obj = C.getObjectiveFunction cxt++ loop :: IO ()+ loop = do+ result <- SAT.solve solver+ if result then do+ m <- SAT.model solver+ let val = SAT.evalPBLinSum m obj+ let ub = val - 1+ C.addSolution cxt m+ SAT.addPBAtMost solver obj ub+ loop+ else do+ C.setFinished cxt+ return ()++binSearch :: C.Context cxt => cxt -> SAT.Solver -> IO ()+binSearch cxt solver = loop+ where+ obj = C.getObjectiveFunction cxt++ loop :: IO ()+ loop = join $ atomically $ do+ ub <- C.getSearchUpperBound cxt+ lb <- C.getLowerBound cxt+ if ub < lb then do+ return $ C.setFinished cxt+ else+ return $ do+ let mid = (lb + ub) `div` 2+ C.logMessage cxt $ printf "Binary Search: %d <= obj <= %d; guessing obj <= %d" lb ub mid+ sel <- SAT.newVar solver+ SAT.addPBAtMostSoft solver sel obj mid+ ret <- SAT.solveWith solver [sel]+ if ret then do+ m <- SAT.model solver+ let v = SAT.evalPBLinSum m obj+ let ub' = v - 1+ C.logMessage cxt $ printf "Binary Search: updating upper bound: %d -> %d" ub ub'+ C.addSolution cxt m+ -- old upper bound constraints will be removed by backward subsumption removal+ SAT.addClause solver [sel]+ SAT.addPBAtMost solver obj ub'+ loop+ else do+ -- deleting temporary constraint+ SAT.addClause solver [-sel]+ let lb' = mid + 1+ C.logMessage cxt $ printf "Binary Search: updating lower bound: %d -> %d" lb lb'+ C.addLowerBound cxt lb'+ SAT.addPBAtLeast solver obj lb'+ loop++-- adaptive search strategy from pbct-0.1.3 <http://www.residual.se/pbct/>+adaptiveSearch :: C.Context cxt => cxt -> SAT.Solver -> Int -> IO ()+adaptiveSearch cxt solver trialLimitConf = loop 0+ where+ obj = C.getObjectiveFunction cxt++ loop :: Rational -> IO ()+ loop fraction = join $ atomically $ do+ ub <- C.getSearchUpperBound cxt+ lb <- C.getLowerBound cxt+ if ub < lb then+ return $ C.setFinished cxt+ else+ return $ do+ let interval = ub - lb+ mid = ub - floor (fromIntegral interval * fraction)+ if ub == mid then do+ C.logMessage cxt $ printf "Adaptive Search: %d <= obj <= %d" lb ub+ result <- SAT.solve solver+ if result then do+ m <- SAT.model solver+ let v = SAT.evalPBLinSum m obj+ let ub' = v - 1+ C.addSolution cxt m+ SAT.addPBAtMost solver obj ub'+ let fraction' = min 0.5 (fraction + 0.1)+ loop fraction'+ else+ C.setFinished cxt+ else do+ C.logMessage cxt $ printf "Adaptive Search: %d <= obj <= %d; guessing obj <= %d" lb ub mid+ sel <- SAT.newVar solver+ SAT.addPBAtMostSoft solver sel obj mid+ SAT.setConfBudget solver $ Just trialLimitConf+ ret' <- try $ SAT.solveWith solver [sel]+ SAT.setConfBudget solver Nothing+ case ret' of+ Left SAT.BudgetExceeded -> do+ let fraction' = max 0 (fraction - 0.05)+ loop fraction'+ Right ret -> do+ let fraction' = min 0.5 (fraction + 0.1)+ if ret then do+ m <- SAT.model solver+ let v = SAT.evalPBLinSum m obj+ let ub' = v - 1+ C.logMessage cxt $ printf "Adaptive Search: updating upper bound: %d -> %d" ub ub'+ C.addSolution cxt m+ -- old upper bound constraints will be removed by backward subsumption removal+ SAT.addClause solver [sel]+ SAT.addPBAtMost solver obj ub'+ loop fraction'+ else do+ -- deleting temporary constraint+ SAT.addClause solver [-sel]+ let lb' = mid + 1+ C.logMessage cxt $ printf "Adaptive Search: updating lower bound: %d -> %d" lb lb'+ C.addLowerBound cxt lb'+ SAT.addPBAtLeast solver obj lb'+ loop fraction'++tweakParams :: SAT.Solver -> SAT.PBLinSum -> IO ()+tweakParams solver obj = do+ forM_ obj $ \(c,l) -> do+ let p = if c > 0 then not (SAT.litPolarity l) else SAT.litPolarity l+ SAT.setVarPolarity solver (SAT.litVar l) p+ let cs = Set.fromList [abs c | (c,_) <- obj]+ ws = Map.fromAscList $ zip (Set.toAscList cs) [1..]+ forM_ obj $ \(c,l) -> do+ let w = ws Map.! abs c+ replicateM w $ SAT.varBumpActivity solver (SAT.litVar l)
+ src/ToySolver/SAT/PBO/BC.hs view
@@ -0,0 +1,83 @@+{-# OPTIONS_GHC -Wall -fno-warn-unused-do-bind #-}+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.SAT.PBO.BC+-- Copyright : (c) Masahiro Sakai 2014+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : provisional+-- Portability : portable+--+-- Core-Guided binary search algorithm.+--+-- Reference:+--+-- * Federico Heras, Antonio Morgado, João Marques-Silva,+-- Core-Guided binary search algorithms for maximum satisfiability,+-- Twenty-Fifth AAAI Conference on Artificial Intelligence, 2011.+-- <http://www.aaai.org/ocs/index.php/AAAI/AAAI11/paper/view/3713>+-- +-----------------------------------------------------------------------------+module ToySolver.SAT.PBO.BC+ ( solve+ ) where++import Control.Concurrent.STM+import qualified Data.IntSet as IntSet+import qualified Data.IntMap as IntMap+import qualified ToySolver.SAT as SAT+import qualified ToySolver.SAT.Types as SAT+import qualified ToySolver.SAT.PBO.Context as C+import Text.Printf++solve :: C.Context cxt => cxt -> SAT.Solver -> IO ()+solve cxt solver = solveWBO (C.normalize cxt) solver++solveWBO :: C.Context cxt => cxt -> SAT.Solver -> IO ()+solveWBO cxt solver = do+ SAT.setEnableBackwardSubsumptionRemoval solver True+ ub <- atomically $ C.getSearchUpperBound cxt+ loop (IntSet.fromList [lit | (lit,_) <- sels], IntSet.empty) (0, ub)++ where+ obj :: SAT.PBLinSum+ obj = C.getObjectiveFunction cxt++ sels :: [(SAT.Lit, Integer)]+ sels = [(-lit, w) | (w,lit) <- obj]++ weights :: SAT.LitMap Integer+ weights = IntMap.fromList sels++ loop :: (SAT.LitSet, SAT.LitSet) -> (Integer, Integer) -> IO ()+ loop (unrelaxed, relaxed) (lb, ub)+ | lb > ub = C.setFinished cxt+ | otherwise = do+ let mid = (lb + ub) `div` 2+ C.logMessage cxt $ printf "BC: %d <= obj <= %d; guessing obj <= %d" lb ub mid+ sel <- SAT.newVar solver+ SAT.addPBAtMostSoft solver sel [(weights IntMap.! lit, -lit) | lit <- IntSet.toList relaxed] mid+ ret <- SAT.solveWith solver (sel : IntSet.toList unrelaxed)+ if ret then do+ m <- SAT.model solver+ let val = SAT.evalPBLinSum m obj+ let ub' = val - 1+ C.logMessage cxt $ printf "BC: updating upper bound: %d -> %d" ub ub'+ C.addSolution cxt m+ SAT.addClause solver [sel]+ SAT.addPBAtMost solver obj ub'+ loop (unrelaxed, relaxed) (lb, ub')+ else do+ core <- SAT.failedAssumptions solver+ SAT.addClause solver [-sel] -- delete temporary constraint+ let core2 = IntSet.fromList core `IntSet.intersection` unrelaxed+ if IntSet.null core2 then do+ C.logMessage cxt $ printf "BC: updating lower bound: %d -> %d" lb (mid+1)+ C.addLowerBound cxt (mid+1)+ loop (unrelaxed, relaxed) (mid+1, ub)+ else do+ let unrelaxed' = unrelaxed `IntSet.difference` core2+ relaxed' = relaxed `IntSet.union` core2+ C.logMessage cxt $ printf "BC: #unrelaxed=%d, #relaxed=%d" (IntSet.size unrelaxed') (IntSet.size relaxed')+ loop (unrelaxed', relaxed') (lb, ub)
+ src/ToySolver/SAT/PBO/BCD.hs view
@@ -0,0 +1,137 @@+{-# OPTIONS_GHC -Wall -fno-warn-unused-do-bind #-}+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.SAT.PBO.BCD+-- Copyright : (c) Masahiro Sakai 2014+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : provisional+-- Portability : portable+--+-- Reference:+--+-- * Federico Heras, Antonio Morgado, João Marques-Silva,+-- Core-Guided binary search algorithms for maximum satisfiability,+-- Twenty-Fifth AAAI Conference on Artificial Intelligence, 2011.+-- <http://www.aaai.org/ocs/index.php/AAAI/AAAI11/paper/view/3713>+--+-- * A. Morgado, F. Heras, and J. Marques-Silva,+-- Improvements to Core-Guided binary search for MaxSAT,+-- in Theory and Applications of Satisfiability Testing (SAT 2012),+-- pp. 284-297.+-- <http://dx.doi.org/10.1007/978-3-642-31612-8_22>+-- <http://ulir.ul.ie/handle/10344/2771>+-- +-----------------------------------------------------------------------------+module ToySolver.SAT.PBO.BCD+ ( solve+ ) where++import Control.Concurrent.STM+import Control.Monad+import qualified Data.IntSet as IntSet+import qualified Data.IntMap as IntMap+import Data.List+import qualified ToySolver.SAT as SAT+import qualified ToySolver.SAT.Types as SAT+import qualified ToySolver.SAT.PBO.Context as C+import Text.Printf++data CoreInfo+ = CoreInfo+ { coreLits :: SAT.LitSet+ , coreLB :: !Integer+ , coreUB :: !Integer+ }++coreMidValue :: CoreInfo -> Integer+coreMidValue c = (coreLB c + coreUB c) `div` 2++coreUnion :: CoreInfo -> CoreInfo -> CoreInfo+coreUnion c1 c2+ = CoreInfo+ { coreLits = IntSet.union (coreLits c1) (coreLits c2)+ , coreLB = coreLB c1 + coreLB c2+ , coreUB = coreUB c1 + coreUB c2+ }++solve :: C.Context cxt => cxt -> SAT.Solver -> IO ()+solve cxt solver = solveWBO (C.normalize cxt) solver++solveWBO :: C.Context cxt => cxt -> SAT.Solver -> IO ()+solveWBO cxt solver = do+ SAT.setEnableBackwardSubsumptionRemoval solver True+ ub <- atomically $ C.getSearchUpperBound cxt+ loop (IntSet.fromList [lit | (lit,_) <- sels], IntSet.empty) [] ub++ where+ obj :: SAT.PBLinSum+ obj = C.getObjectiveFunction cxt++ sels :: [(SAT.Lit, Integer)]+ sels = [(-lit, w) | (w,lit) <- obj]++ weights :: SAT.LitMap Integer+ weights = IntMap.fromList sels++ coreNew :: SAT.LitSet -> CoreInfo+ coreNew cs = CoreInfo{ coreLits = cs, coreLB = 0, coreUB = sum [weights IntMap.! lit | lit <- IntSet.toList cs] }++ coreCostFun :: CoreInfo -> SAT.PBLinSum+ coreCostFun c = [(weights IntMap.! lit, -lit) | lit <- IntSet.toList (coreLits c)]++ loop :: (SAT.LitSet, SAT.LitSet) -> [CoreInfo] -> Integer -> IO ()+ loop (unrelaxed, relaxed) cores ub = do+ let lb = sum [coreLB info | info <- cores]+ C.logMessage cxt $ printf "BCD: %d <= obj <= %d" lb ub+ C.logMessage cxt $ printf "BCD: #cores=%d, #unrelaxed=%d, #relaxed=%d"+ (length cores) (IntSet.size unrelaxed) (IntSet.size relaxed)++ sels <- liftM IntMap.fromList $ forM cores $ \info -> do+ sel <- SAT.newVar solver+ SAT.addPBAtMostSoft solver sel (coreCostFun info) (coreMidValue info)+ return (sel, info)++ ret <- SAT.solveWith solver (IntMap.keys sels ++ IntSet.toList unrelaxed)++ if ret then do+ m <- SAT.model solver+ let val = SAT.evalPBLinSum m obj+ let ub' = val - 1+ C.logMessage cxt $ printf "BCD: updating upper bound: %d -> %d" ub ub'+ C.addSolution cxt m+ SAT.addPBAtMost solver obj ub'+ let cores' = map (\info -> info{ coreUB = SAT.evalPBLinSum m (coreCostFun info) }) cores+ cont (unrelaxed, relaxed) cores' ub'+ else do+ core <- SAT.failedAssumptions solver+ case core of+ [] -> return ()+ [sel] | Just info <- IntMap.lookup sel sels -> do+ let info' = info{ coreLB = coreMidValue info + 1 }+ cores' = IntMap.elems $ IntMap.insert sel info' sels+ C.logMessage cxt $ printf "BCD: updating lower bound of a core"+ SAT.addPBAtLeast solver (coreCostFun info') (coreLB info') -- redundant, but useful for direct search+ cont (unrelaxed, relaxed) cores' ub+ _ -> do+ let coreSet = IntSet.fromList core+ torelax = unrelaxed `IntSet.intersection` coreSet+ intersected = [info | (sel,info) <- IntMap.toList sels, sel `IntSet.member` coreSet]+ rest = [info | (sel,info) <- IntMap.toList sels, sel `IntSet.notMember` coreSet]+ mergedCore = foldl' coreUnion (coreNew torelax) intersected+ unrelaxed' = unrelaxed `IntSet.difference` torelax+ relaxed' = relaxed `IntSet.union` torelax+ cores' = mergedCore : rest+ if null intersected then do+ C.logMessage cxt $ printf "BCD: found a new core of size %d" (IntSet.size torelax) + else do+ C.logMessage cxt $ printf "BCD: merging cores"+ SAT.addPBAtLeast solver (coreCostFun mergedCore) (coreLB mergedCore) -- redundant, but useful for direct search+ forM_ (IntMap.keys sels) $ \sel -> SAT.addClause solver [-sel] -- delete temporary constraints+ cont (unrelaxed', relaxed') cores' ub++ cont :: (SAT.LitSet, SAT.LitSet) -> [CoreInfo] -> Integer -> IO ()+ cont (unrelaxed, relaxed) cores ub+ | all (\info -> coreLB info > coreUB info) cores = C.setFinished cxt+ | otherwise = loop (unrelaxed, relaxed) cores ub
+ src/ToySolver/SAT/PBO/BCD2.hs view
@@ -0,0 +1,221 @@+{-# LANGUAGE BangPatterns #-}+{-# OPTIONS_GHC -Wall -fno-warn-unused-do-bind #-}+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.SAT.PBO.BCD2+-- Copyright : (c) Masahiro Sakai 2014+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : provisional+-- Portability : portable+--+-- Reference:+--+-- * Federico Heras, Antonio Morgado, João Marques-Silva,+-- Core-Guided binary search algorithms for maximum satisfiability,+-- Twenty-Fifth AAAI Conference on Artificial Intelligence, 2011.+-- <http://www.aaai.org/ocs/index.php/AAAI/AAAI11/paper/view/3713>+--+-- * A. Morgado, F. Heras, and J. Marques-Silva,+-- Improvements to Core-Guided binary search for MaxSAT,+-- in Theory and Applications of Satisfiability Testing (SAT 2012),+-- pp. 284-297.+-- <http://dx.doi.org/10.1007/978-3-642-31612-8_22>+-- <http://ulir.ul.ie/handle/10344/2771>+-- +-----------------------------------------------------------------------------+module ToySolver.SAT.PBO.BCD2+ ( Options (..)+ , defaultOptions+ , solve+ ) where++import Control.Concurrent.STM+import Control.Exception+import Control.Monad+import qualified Data.IntSet as IntSet+import qualified Data.IntMap as IntMap+import qualified ToySolver.SAT as SAT+import qualified ToySolver.SAT.Types as SAT+import qualified ToySolver.SAT.PBO.Context as C+import qualified ToySolver.Knapsack as Knapsack+import Text.Printf++data Options+ = Options+ { optEnableHardening :: Bool+ , optEnableBiasedSearch :: Bool+ , optSolvingNormalFirst :: Bool+ }++defaultOptions :: Options+defaultOptions+ = Options+ { optEnableHardening = True+ , optEnableBiasedSearch = True+ , optSolvingNormalFirst = True+ }++data CoreInfo+ = CoreInfo+ { coreLits :: SAT.LitSet+ , coreLB :: !Integer+ }++solve :: C.Context cxt => cxt -> SAT.Solver -> Options -> IO ()+solve cxt solver opt = solveWBO (C.normalize cxt) solver opt++solveWBO :: C.Context cxt => cxt -> SAT.Solver -> Options -> IO ()+solveWBO cxt solver opt = do+ SAT.setEnableBackwardSubsumptionRemoval solver True+ let unrelaxed = IntSet.fromList [lit | (lit,_) <- sels]+ relaxed = IntSet.empty+ hardened = IntSet.empty+ cnt = (1,1)+ best <- atomically $ C.getBestModel cxt+ case best of+ Just m -> do+ loop (unrelaxed, relaxed, hardened) weights [] (SAT.evalPBLinSum m obj - 1) (Just m) cnt+ Nothing+ | optSolvingNormalFirst opt -> do+ ret <- SAT.solve solver+ if ret then do+ m <- SAT.model solver+ let val = SAT.evalPBLinSum m obj+ let ub' = val - 1+ C.logMessage cxt $ printf "BCD2: updating upper bound: %d -> %d" (SAT.pbUpperBound obj) ub'+ C.addSolution cxt m+ SAT.addPBAtMost solver obj ub'+ loop (unrelaxed, relaxed, hardened) weights [] ub' (Just m) cnt+ else+ C.setFinished cxt+ | otherwise -> do+ loop (unrelaxed, relaxed, hardened) weights [] (SAT.pbUpperBound obj) Nothing cnt+ where+ obj :: SAT.PBLinSum+ obj = C.getObjectiveFunction cxt++ sels :: [(SAT.Lit, Integer)]+ sels = [(-lit, w) | (w,lit) <- obj]++ weights :: SAT.LitMap Integer+ weights = IntMap.fromList sels++ coreCostFun :: CoreInfo -> SAT.PBLinSum+ coreCostFun c = [(weights IntMap.! lit, -lit) | lit <- IntSet.toList (coreLits c)]++ computeLB :: [CoreInfo] -> Integer+ computeLB cores = sum [coreLB info | info <- cores]++ loop :: (SAT.LitSet, SAT.LitSet, SAT.LitSet) -> SAT.LitMap Integer -> [CoreInfo] -> Integer -> Maybe SAT.Model -> (Integer,Integer) -> IO ()+ loop (unrelaxed, relaxed, hardened) deductedWeight cores ub lastModel (!nsat,!nunsat) = do+ let lb = computeLB cores+ C.logMessage cxt $ printf "BCD2: %d <= obj <= %d" lb ub+ C.logMessage cxt $ printf "BCD2: #cores=%d, #unrelaxed=%d, #relaxed=%d, #hardened=%d" + (length cores) (IntSet.size unrelaxed) (IntSet.size relaxed) (IntSet.size hardened)++ when (optEnableBiasedSearch opt) $ do+ C.logMessage cxt $ printf "BCD2: bias = %d/%d" nunsat (nunsat + nsat)++ sels <- liftM IntMap.fromList $ forM cores $ \info -> do+ sel <- SAT.newVar solver+ let ep = case lastModel of+ Nothing -> sum [weights IntMap.! lit | lit <- IntSet.toList (coreLits info)]+ Just m -> SAT.evalPBLinSum m (coreCostFun info)+ mid+ | optEnableBiasedSearch opt = coreLB info + (ep - coreLB info) * nunsat `div` (nunsat + nsat)+ | otherwise = (coreLB info + ep) `div` 2+ SAT.addPBAtMostSoft solver sel (coreCostFun info) mid+ return (sel, (info,mid))++ ret <- SAT.solveWith solver (IntMap.keys sels ++ IntSet.toList unrelaxed)++ if ret then do+ m <- SAT.model solver+ let val = SAT.evalPBLinSum m obj+ let ub' = val - 1+ C.logMessage cxt $ printf "BCD2: updating upper bound: %d -> %d" ub ub'+ C.addSolution cxt m+ SAT.addPBAtMost solver obj ub'+ cont (unrelaxed, relaxed, hardened) deductedWeight cores ub' (Just m) (nsat+1,nunsat)+ else do+ core <- SAT.failedAssumptions solver+ case core of+ [] -> C.setFinished cxt+ [sel] | Just (info,mid) <- IntMap.lookup sel sels -> do+ let newLB = refine [weights IntMap.! lit | lit <- IntSet.toList (coreLits info)] mid+ info' = info{ coreLB = newLB }+ cores' = IntMap.elems $ IntMap.insert sel info' $ IntMap.map fst sels+ lb' = computeLB cores'+ deductedWeight' = IntMap.unionWith (+) deductedWeight (IntMap.fromList [(lit, - d) | let d = lb' - lb, d /= 0, lit <- IntSet.toList (coreLits info)])+ C.logMessage cxt $ printf "BCD2: updating lower bound of a core"+ SAT.addPBAtLeast solver (coreCostFun info') (coreLB info') -- redundant, but useful for direct search+ cont (unrelaxed, relaxed, hardened) deductedWeight' cores' ub lastModel (nsat,nunsat+1)+ _ -> do+ let coreSet = IntSet.fromList core+ torelax = unrelaxed `IntSet.intersection` coreSet+ unrelaxed' = unrelaxed `IntSet.difference` torelax+ relaxed' = relaxed `IntSet.union` torelax+ intersected = [(info,mid) | (sel,(info,mid)) <- IntMap.toList sels, sel `IntSet.member` coreSet]+ rest = [info | (sel,(info,_)) <- IntMap.toList sels, sel `IntSet.notMember` coreSet]+ delta = minimum $ [mid - coreLB info + 1 | (info,mid) <- intersected] ++ + [weights IntMap.! lit | lit <- IntSet.toList torelax]+ newLits = IntSet.unions $ torelax : [coreLits info | (info,_) <- intersected]+ mergedCore = CoreInfo+ { coreLits = newLits+ , coreLB = refine [weights IntMap.! lit | lit <- IntSet.toList relaxed'] (sum [coreLB info | (info,_) <- intersected] + delta - 1)+ }+ cores' = mergedCore : rest+ lb' = computeLB cores'+ deductedWeight' = IntMap.unionWith (+) deductedWeight (IntMap.fromList [(lit, - d) | let d = lb' - lb, d /= 0, lit <- IntSet.toList newLits])+ if null intersected then do+ C.logMessage cxt $ printf "BCD2: found a new core of size %d" (IntSet.size torelax) + else do+ C.logMessage cxt $ printf "BCD2: merging cores"+ SAT.addPBAtLeast solver (coreCostFun mergedCore) (coreLB mergedCore) -- redundant, but useful for direct search+ forM_ (IntMap.keys sels) $ \sel -> SAT.addClause solver [-sel] -- delete temporary constraints+ cont (unrelaxed', relaxed', hardened) deductedWeight' cores' ub lastModel (nsat,nunsat+1)++ cont :: (SAT.LitSet, SAT.LitSet, SAT.LitSet) -> SAT.LitMap Integer -> [CoreInfo] -> Integer -> Maybe SAT.Model -> (Integer,Integer) -> IO ()+ cont (unrelaxed, relaxed, hardened) deductedWeight cores ub lastModel (!nsat,!nunsat)+ | lb > ub = C.setFinished cxt+ | optEnableHardening opt = do+ let lits = IntMap.keysSet $ IntMap.filter (\w -> lb + w > ub) deductedWeight+ forM_ (IntSet.toList lits) $ \lit -> SAT.addClause solver [lit]+ let unrelaxed' = unrelaxed `IntSet.difference` lits+ relaxed' = relaxed `IntSet.difference` lits+ hardened' = hardened `IntSet.union` lits+ cores' = map (\core -> core{ coreLits = coreLits core `IntSet.difference` lits }) cores+ loop (unrelaxed', relaxed', hardened') deductedWeight cores' ub lastModel (nsat,nunsat)+ | otherwise = + loop (unrelaxed, relaxed, hardened) deductedWeight cores ub lastModel (nsat,nunsat)+ where+ lb = computeLB cores++-- | The smallest integer greater than @n@ that can be obtained by summing a subset of @ws@.+refine+ :: [Integer] -- ^ @ws@+ -> Integer -- ^ @n@+ -> Integer+refine ws n = n+1+{-+refine ws n = assert (n+1 <= result) $ result+ where+ sum_ws = sum ws+ (v,_,_) = Knapsack.solve [(fromInteger w, fromInteger w) | w <- ws] (fromInteger (sum_ws - n - 1))+ result = sum_ws - floor v+-}+{-+minimize Σ wi xi = Σ wi (1 - ¬xi) = Σ wi - (Σ wi ¬xi)+subject to Σ wi xi > n++maximize Σ wi ¬xi+subject to Σ wi ¬xi ≤ (Σ wi) - n - 1++Σ wi xi > n+Σ wi (1 - ¬xi) > n+(Σ wi) - (Σ wi ¬xi) > n+(Σ wi ¬xi) < (Σ wi) - n+(Σ wi ¬xi) ≤ (Σ wi) - n - 1+-}
+ src/ToySolver/SAT/PBO/Context.hs view
@@ -0,0 +1,210 @@+{-# LANGUAGE BangPatterns #-}+{-# OPTIONS_GHC -Wall #-}+module ToySolver.SAT.PBO.Context+ ( Context (..)+ , getBestValue+ , getBestModel+ , isOptimum+ , isFinished+ , getSearchUpperBound+ , setFinished++ , SimpleContext+ , newSimpleContext+ , setOnUpdateBestSolution+ , setOnUpdateLowerBound+ , setLogger++ , Normalized+ , normalize+ ) where++import Control.Monad+import Control.Concurrent.STM+import Data.IORef+import Data.Maybe+import qualified ToySolver.SAT.Types as SAT++{--------------------------------------------------------------------+ Context class+--------------------------------------------------------------------}++class Context a where+ getObjectiveFunction :: a -> SAT.PBLinSum++ isUnsat :: a -> STM Bool+ getBestSolution :: a -> STM (Maybe (SAT.Model, Integer))+ getLowerBound :: a -> STM Integer++ setUnsat :: a -> IO ()+ addSolution :: a -> SAT.Model -> IO ()+ addLowerBound :: a -> Integer -> IO ()+ logMessage :: a -> String -> IO ()++getBestValue :: Context a => a -> STM (Maybe Integer)+getBestValue cxt = liftM (fmap snd) $ getBestSolution cxt++getBestModel :: Context a => a -> STM (Maybe SAT.Model)+getBestModel cxt = liftM (fmap fst) $ getBestSolution cxt++isOptimum :: Context a => a -> STM Bool+isOptimum cxt = do+ ub <- getBestValue cxt+ lb <- getLowerBound cxt+ return $ ub == Just lb++isFinished :: Context a => a -> STM Bool+isFinished cxt = do+ b1 <- isUnsat cxt+ b2 <- isOptimum cxt+ return $ b1 || b2++getSearchUpperBound :: Context a => a -> STM Integer+getSearchUpperBound ctx = do+ ret <- getBestValue ctx+ case ret of+ Just val -> return $ val - 1+ Nothing -> return $ SAT.pbUpperBound $ getObjectiveFunction ctx++setFinished :: Context a => a -> IO ()+setFinished cxt = do+ join $ atomically $ do+ ret <- getBestValue cxt+ case ret of+ Just val -> return $ addLowerBound cxt val+ Nothing -> return $ setUnsat cxt++{--------------------------------------------------------------------+ Simple Context+--------------------------------------------------------------------}++data SimpleContext+ = SimpleContext+ { scGetObjectiveFunction :: SAT.PBLinSum++ , scUnsatRef :: TVar Bool+ , scBestSolutionRef :: TVar (Maybe (SAT.Model, Integer))+ , scLowerBoundRef :: TVar Integer++ , scOnUpdateBestSolutionRef :: IORef (SAT.Model -> Integer -> IO ())+ , scOnUpdateLowerBoundRef :: IORef (Integer -> IO ())+ , scLoggerRef :: IORef (String -> IO ())+ }++instance Context SimpleContext where+ getObjectiveFunction = scGetObjectiveFunction++ isUnsat sc = readTVar (scUnsatRef sc)+ getBestSolution sc = readTVar (scBestSolutionRef sc)+ getLowerBound sc = readTVar (scLowerBoundRef sc)++ setUnsat sc = do+ atomically $ do+ sol <- getBestSolution sc+ unless (isNothing sol) $ error "setUnsat: already has a solution" -- FIXME: use throwSTM?+ writeTVar (scUnsatRef sc) True++ addSolution sc m = do+ let !val = SAT.evalPBLinSum m (getObjectiveFunction sc)+ join $ atomically $ do+ unsat <- isUnsat sc+ when unsat $ error "addSolution: already marked as unsatisfiable" -- FIXME: use throwSTM?+ + sol0 <- getBestValue sc+ case sol0 of+ Just val0 | val0 <= val -> return $ return ()+ _ -> do+ writeTVar (scBestSolutionRef sc) (Just (m, val))+ return $ do+ h <- readIORef (scOnUpdateBestSolutionRef sc)+ h m val++ addLowerBound sc lb = do+ join $ atomically $ do+ lb0 <- getLowerBound sc+ if lb <= lb0 then+ return $ return ()+ else do+ writeTVar (scLowerBoundRef sc) lb+ return $ do+ h <- readIORef (scOnUpdateLowerBoundRef sc)+ h lb++ logMessage sc msg = do+ h <- readIORef (scLoggerRef sc)+ h msg++newSimpleContext :: SAT.PBLinSum -> IO SimpleContext+newSimpleContext obj = do+ unsatRef <- newTVarIO False+ bestsolRef <- newTVarIO Nothing+ lbRef <- newTVarIO $! SAT.pbLowerBound obj++ onUpdateBestSolRef <- newIORef $ \_ _ -> return ()+ onUpdateLBRef <- newIORef $ \_ -> return ()+ loggerRef <- newIORef $ \_ -> return ()++ return $+ SimpleContext+ { scGetObjectiveFunction = obj++ , scUnsatRef = unsatRef+ , scBestSolutionRef = bestsolRef+ , scLowerBoundRef = lbRef++ , scOnUpdateBestSolutionRef = onUpdateBestSolRef+ , scOnUpdateLowerBoundRef = onUpdateLBRef+ , scLoggerRef = loggerRef+ }++setOnUpdateBestSolution :: SimpleContext -> (SAT.Model -> Integer -> IO ()) -> IO ()+setOnUpdateBestSolution sc h = writeIORef (scOnUpdateBestSolutionRef sc) h ++setOnUpdateLowerBound :: SimpleContext -> (Integer -> IO ()) -> IO ()+setOnUpdateLowerBound sc h = writeIORef (scOnUpdateLowerBoundRef sc) h++setLogger :: SimpleContext -> (String -> IO ()) -> IO ()+setLogger sc h = writeIORef (scLoggerRef sc) h++{--------------------------------------------------------------------+ Normalization+--------------------------------------------------------------------}++data Normalized a+ = Normalized+ { nBase :: a+ , nObjectiveFunction :: SAT.PBLinSum+ , nOffset :: Integer+ }++instance Context a => Context (Normalized a) where+ getObjectiveFunction = nObjectiveFunction++ isUnsat cxt = isUnsat (nBase cxt)++ getBestSolution cxt = do+ sol <- getBestSolution (nBase cxt)+ case sol of+ Nothing -> return Nothing+ Just (m, val) -> return $ Just (m, val - nOffset cxt)++ getLowerBound cxt = do+ lb <- getLowerBound (nBase cxt)+ return $ lb - nOffset cxt++ setUnsat cxt = setUnsat $ nBase cxt++ addSolution cxt m = do+ addSolution (nBase cxt) m+ + addLowerBound cxt lb = do+ addLowerBound (nBase cxt) (lb + nOffset cxt)++ logMessage cxt msg = logMessage (nBase cxt) msg++normalize :: Context a => a -> Normalized a+normalize cxt = Normalized cxt obj' offset+ where+ obj = getObjectiveFunction cxt+ (obj',offset) = SAT.normalizePBLinSum (obj, 0)+
+ src/ToySolver/SAT/PBO/MSU4.hs view
@@ -0,0 +1,81 @@+{-# OPTIONS_GHC -Wall -fno-warn-unused-do-bind #-}+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.SAT.PBO.MSU4+-- Copyright : (c) Masahiro Sakai 2013+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : provisional+-- Portability : portable+-- +-- Reference:+--+-- * João P. Marques-Silva and Jordi Planes.+-- Algorithms for Maximum Satisfiability using Unsatisfiable Cores.+-- In Design, Automation and Test in Europe, 2008 (DATE '08). March 2008.+-- pp. 408-413, doi:10.1109/date.2008.4484715.+-- <http://dx.doi.org/10.1109/date.2008.4484715>+-- <http://eprints.soton.ac.uk/265000/1/jpms-date08.pdf>+-- <http://www.csi.ucd.ie/staff/jpms/talks/talksite/jpms-date08.pdf>+--+-----------------------------------------------------------------------------+module ToySolver.SAT.PBO.MSU4+ ( solve+ ) where++import Control.Concurrent.STM+import Control.Monad+import qualified Data.IntSet as IS+import qualified Data.IntMap as IM+import qualified ToySolver.SAT as SAT+import qualified ToySolver.SAT.Types as SAT+import qualified ToySolver.SAT.PBO.Context as C+import Text.Printf++solve :: C.Context cxt => cxt -> SAT.Solver -> IO ()+solve cxt solver = solveWBO (C.normalize cxt) solver++solveWBO :: C.Context cxt => cxt -> SAT.Solver -> IO ()+solveWBO cxt solver = do+ SAT.setEnableBackwardSubsumptionRemoval solver True+ loop (IM.keysSet weights, IS.empty) 0++ where+ obj :: SAT.PBLinSum+ obj = C.getObjectiveFunction cxt++ sels :: [(SAT.Lit, Integer)]+ sels = [(-lit, w) | (w,lit) <- obj]++ weights :: SAT.LitMap Integer+ weights = IM.fromList sels+ + loop :: (SAT.LitSet, SAT.LitSet) -> Integer -> IO ()+ loop (unrelaxed, relaxed) lb = do+ ret <- SAT.solveWith solver (IS.toList unrelaxed)+ if ret then do+ currModel <- SAT.model solver+ C.addSolution cxt currModel+ let violated = [weights IM.! l | l <- IS.toList relaxed, SAT.evalLit currModel l == False]+ currVal = sum violated+ SAT.addPBAtMost solver [(c,-l) | (l,c) <- sels] (currVal - 1)+ cont (unrelaxed, relaxed) lb+ else do+ core <- SAT.failedAssumptions solver+ let ls = IS.fromList core `IS.intersection` unrelaxed+ if IS.null ls then do+ C.setFinished cxt+ else do+ SAT.addClause solver [-l | l <- core] -- optional constraint but sometimes useful+ let min_weight = minimum [weights IM.! l | l <- IS.toList ls]+ lb' = lb + min_weight+ C.logMessage cxt $ printf "MSU4: found a core: size = %d, minimal weight = %d" (length core) min_weight + C.addLowerBound cxt lb'+ cont (unrelaxed `IS.difference` ls, relaxed `IS.union` ls) lb'++ cont :: (SAT.LitSet, SAT.LitSet) -> Integer -> IO ()+ cont (unrelaxed, relaxed) lb = do+ join $ atomically $ do+ b <- C.isFinished cxt+ return $ if b then return () else loop (unrelaxed, relaxed) lb
+ src/ToySolver/SAT/PBO/UnsatBased.hs view
@@ -0,0 +1,75 @@+{-# LANGUAGE BangPatterns #-}+{-# OPTIONS_GHC -Wall #-}+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.SAT.PBO.UnsatBased+-- Copyright : (c) Masahiro Sakai 2013+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : provisional+-- Portability : non-portable (BangPatterns)+-- +-- Reference:+--+-- * Vasco Manquinho Ruben Martins Inês Lynce+-- Improving Unsatisfiability-based Algorithms for Boolean Optimization.+-- Theory and Applications of Satisfiability Testing – SAT 2010, pp 181-193.+-- <http://dx.doi.org/10.1007/978-3-642-14186-7_16>+-- <http://sat.inesc-id.pt/~ruben/papers/manquinho-sat10.pdf>+-- <http://sat.inesc-id.pt/~ruben/talks/sat10-talk.pdf>+--+-----------------------------------------------------------------------------+module ToySolver.SAT.PBO.UnsatBased+ ( solve+ ) where++import Control.Monad+import qualified Data.IntMap as IntMap+import qualified ToySolver.SAT as SAT+import qualified ToySolver.SAT.Types as SAT+import qualified ToySolver.SAT.PBO.Context as C++solve :: C.Context cxt => cxt -> SAT.Solver -> IO ()+solve cxt solver = solveWBO (C.normalize cxt) solver++solveWBO :: C.Context cxt => cxt -> SAT.Solver -> IO ()+solveWBO cxt solver = do+ SAT.setEnableBackwardSubsumptionRemoval solver True+ let sels0 = [(-v, c) | (c,v) <- C.getObjectiveFunction cxt]+ loop 0 (IntMap.fromList sels0)+ where+ loop :: Integer -> SAT.LitMap Integer -> IO ()+ loop !lb sels = do+ C.addLowerBound cxt lb++ ret <- SAT.solveWith solver (IntMap.keys sels)+ if ret then do+ m <- SAT.model solver+ -- モデルから余計な変数を除去する?+ C.addSolution cxt m+ return ()+ else do+ core <- SAT.failedAssumptions solver+ case core of+ [] -> C.setFinished cxt+ _ -> do+ let !min_c = minimum [sels IntMap.! sel | sel <- core]+ !lb' = lb + min_c++ xs <- forM core $ \sel -> do+ r <- SAT.newVar solver+ return (sel, r)+ SAT.addExactly solver (map snd xs) 1+ SAT.addClause solver [-l | l <- core] -- optional constraint but sometimes useful++ ys <- liftM IntMap.unions $ forM xs $ \(sel, r) -> do+ sel' <- SAT.newVar solver+ SAT.addClause solver [-sel', r, sel]+ let c = sels IntMap.! sel+ if c > min_c+ then return $ IntMap.fromList [(sel', min_c), (sel, c - min_c)]+ else return $ IntMap.singleton sel' min_c+ let sels' = IntMap.union ys (IntMap.difference sels (IntMap.fromList [(sel, ()) | sel <- core]))++ loop lb' sels'
+ src/ToySolver/SAT/Printer.hs view
@@ -0,0 +1,85 @@+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.SAT.Printer+-- Copyright : (c) Masahiro Sakai 2012+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : provisional+-- Portability : portable+--+-- Printing utilities.+--+-----------------------------------------------------------------------------+module ToySolver.SAT.Printer+ ( satPrintModel+ , maxsatPrintModel+ , pbPrintModel+ , musPrintSol+ ) where++import Control.Monad+import Data.Array.IArray+import Data.List+import System.IO+import ToySolver.SAT.Types++-- | Print a 'Model' in a way specified for SAT Competition.+-- See <http://www.satcompetition.org/2011/rules.pdf> for details.+satPrintModel :: Handle -> Model -> Int -> IO ()+satPrintModel h m n = do+ let as = if n > 0+ then takeWhile (\(v,_) -> v <= n) $ assocs m+ else assocs m+ forM_ (split 10 as) $ \xs -> do+ hPutStr h "v"+ forM_ xs $ \(var,val) -> hPutStr h (' ': show (literal var val))+ hPutStrLn h ""+ hPutStrLn h "v 0"+ hFlush h++-- | Print a 'Model' in a way specified for Max-SAT Evaluation.+-- See <http://maxsat.ia.udl.cat/requirements/> for details.+maxsatPrintModel :: Handle -> Model -> Int -> IO ()+maxsatPrintModel h m n = do+ let as = if n > 0+ then takeWhile (\(v,_) -> v <= n) $ assocs m+ else assocs m+ forM_ (split 10 as) $ \xs -> do+ hPutStr h "v"+ forM_ xs $ \(var,val) -> hPutStr h (' ' : show (literal var val))+ hPutStrLn h ""+ -- no terminating 0 is necessary+ hFlush stdout++-- | Print a 'Model' in a way specified for Pseudo-Boolean Competition.+-- See <http://www.cril.univ-artois.fr/PB12/format.pdf> for details.+pbPrintModel :: Handle -> Model -> Int -> IO ()+pbPrintModel h m n = do+ let as = if n > 0+ then takeWhile (\(v,_) -> v <= n) $ assocs m+ else assocs m+ forM_ (split 10 as) $ \xs -> do+ hPutStr h "v"+ forM_ xs $ \(var,val) -> hPutStr h (" " ++ (if val then "" else "-") ++ "x" ++ show var)+ hPutStrLn h ""+ hFlush stdout++musPrintSol :: Handle -> [Int] -> IO ()+musPrintSol h is = do+ forM_ (split 10 is) $ \xs -> do+ hPutStr h "v"+ forM_ xs $ \i -> hPutStr h (' ': show i)+ hPutStrLn h ""+ hPutStrLn h "v 0"+ hFlush h++-- ------------------------------------------------------------------------++split :: Int -> [a] -> [[a]]+split n = go+ where+ go [] = []+ go xs =+ case splitAt n xs of+ (ys, zs) -> ys : go zs
+ src/ToySolver/SAT/TheorySolver.hs view
@@ -0,0 +1,25 @@+module ToySolver.SAT.TheorySolver+ ( TheorySolver (..)+ , emptyTheory+ ) where++import ToySolver.SAT.Types++data TheorySolver =+ TheorySolver+ { thAssertLit :: (Lit -> IO Bool) -> Lit -> IO Bool+ , thCheck :: (Lit -> IO Bool) -> IO Bool+ , thExplain :: IO [Lit]+ , thPushBacktrackPoint :: IO ()+ , thPopBacktrackPoint :: IO ()+ }++emptyTheory :: TheorySolver+emptyTheory =+ TheorySolver+ { thAssertLit = \propagate lit -> return True+ , thCheck = \propagate -> return True+ , thExplain = error "should not happen"+ , thPushBacktrackPoint = return ()+ , thPopBacktrackPoint = return ()+ }
+ src/ToySolver/SAT/TseitinEncoder.hs view
@@ -0,0 +1,205 @@+{-# OPTIONS_GHC -Wall #-}+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.SAT.TseitinEncoder+-- Copyright : (c) Masahiro Sakai 2012+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : provisional+-- Portability : portable+-- +-- Tseitin encoding+--+-- TODO:+-- +-- * reduce variables.+--+-- References:+--+-- * [Tse83] G. Tseitin. On the complexity of derivation in propositional+-- calculus. Automation of Reasoning: Classical Papers in Computational+-- Logic, 2:466-483, 1983. Springer-Verlag. +--+-- * [For60] R. Fortet. Application de l'algèbre de Boole en rechercheop+-- opérationelle. Revue Française de Recherche Opérationelle, 4:17-26,+-- 1960. +--+-- * [BM84a] E. Balas and J. B. Mazzola. Nonlinear 0-1 programming:+-- I. Linearization techniques. Mathematical Programming, 30(1):1-21,+-- 1984.+-- +-- * [BM84b] E. Balas and J. B. Mazzola. Nonlinear 0-1 programming:+-- II. Dominance relations and algorithms. Mathematical Programming,+-- 30(1):22-45, 1984.+-----------------------------------------------------------------------------+module ToySolver.SAT.TseitinEncoder+ (+ -- * The @Encoder@ type+ Encoder+ , newEncoder+ , setUsePB+ , encSolver++ -- * Encoding of boolean formula+ , Formula (..)+ , evalFormula+ , addFormula+ , encodeConj+ , encodeDisj+ , getDefinitions+ ) where++import Control.Monad+import Data.IORef+import Data.Map (Map)+import qualified Data.Map as Map+import Data.IntSet (IntSet)+import qualified Data.IntSet as IntSet+import qualified ToySolver.SAT as SAT+import qualified ToySolver.SAT.Types as SAT++-- | Arbitrary formula not restricted to CNF+data Formula+ = Lit SAT.Lit+ | And [Formula]+ | Or [Formula]+ | Not Formula+ | Imply Formula Formula+ | Equiv Formula Formula+ deriving (Show, Eq, Ord)++evalFormula :: SAT.IModel m => m -> Formula -> Bool+evalFormula m = e+ where+ e (Lit l) = SAT.evalLit m l+ e (And fs) = and (map e fs)+ e (Or fs) = or (map e fs)+ e (Not f) = not (e f)+ e (Imply f1 f2) = not (e f1) || e f2+ e (Equiv f1 f2) = e f1 == e f2++-- | Encoder instance+data Encoder =+ Encoder+ { encSolver :: SAT.Solver+ , encUsePB :: IORef Bool+ , encConjTable :: !(IORef (Map SAT.LitSet SAT.Lit))+ }++-- | Create a @Encoder@ instance.+newEncoder :: SAT.Solver -> IO Encoder+newEncoder solver = do+ usePBRef <- newIORef False+ table <- newIORef Map.empty+ return $+ Encoder+ { encSolver = solver+ , encUsePB = usePBRef+ , encConjTable = table+ }++-- | Use /pseudo boolean constraints/ or use only /clauses/.+setUsePB :: Encoder -> Bool -> IO ()+setUsePB encoder usePB = writeIORef (encUsePB encoder) usePB++-- | Assert a given formula to underlying SAT solver by using+-- Tseitin encoding.+addFormula :: Encoder -> Formula -> IO ()+addFormula encoder formula = do+ let solver = encSolver encoder+ case formula of+ And xs -> mapM_ (addFormula encoder) xs+ Equiv a b -> do+ lit1 <- encodeToLit encoder a+ lit2 <- encodeToLit encoder b+ SAT.addClause solver [SAT.litNot lit1, lit2] -- a→b+ SAT.addClause solver [SAT.litNot lit2, lit1] -- b→a+ Not (Not a) -> addFormula encoder a+ Not (Or xs) -> addFormula encoder (And (map Not xs))+ Not (Imply a b) -> addFormula encoder (And [a, Not b])+ Not (Equiv a b) -> do+ lit1 <- encodeToLit encoder a+ lit2 <- encodeToLit encoder b+ SAT.addClause solver [lit1, lit2] -- a ∨ b+ SAT.addClause solver [SAT.litNot lit1, SAT.litNot lit2] -- ¬a ∨ ¬b+ _ -> do+ c <- encodeToClause encoder formula+ SAT.addClause solver c++encodeToClause :: Encoder -> Formula -> IO SAT.Clause+encodeToClause encoder formula =+ case formula of+ And [x] -> encodeToClause encoder x+ Or xs -> do+ cs <- mapM (encodeToClause encoder) xs+ return $ concat cs+ Not (Not x) -> encodeToClause encoder x+ Not (And xs) -> do+ encodeToClause encoder (Or (map Not xs))+ Imply a b -> do+ encodeToClause encoder (Or [Not a, b])+ _ -> do+ l <- encodeToLit encoder formula+ return [l]++encodeToLit :: Encoder -> Formula -> IO SAT.Lit+encodeToLit encoder formula = do+ case formula of+ Lit l -> return l+ And xs -> encodeConj encoder =<< mapM (encodeToLit encoder) xs+ Or xs -> encodeDisj encoder =<< mapM (encodeToLit encoder) xs+ Not x -> liftM SAT.litNot $ encodeToLit encoder x+ Imply x y -> do+ encodeToLit encoder (Or [Not x, y])+ Equiv x y -> do+ lit1 <- encodeToLit encoder x+ lit2 <- encodeToLit encoder y+ encodeToLit encoder $+ And [ Imply (Lit lit1) (Lit lit2)+ , Imply (Lit lit2) (Lit lit1)+ ]++-- | Return an literal which is equivalent to a given conjunction.+encodeConj :: Encoder -> [SAT.Lit] -> IO SAT.Lit+encodeConj _ [l] = return l+encodeConj encoder ls = do+ let ls2 = IntSet.fromList ls+ table <- readIORef (encConjTable encoder)+ case Map.lookup ls2 table of+ Just l -> return l+ Nothing -> do+ let sat = encSolver encoder+ v <- SAT.newVar sat+ addIsConjOf encoder v ls+ return v++-- | Return an literal which is equivalent to a given disjunction.+encodeDisj :: Encoder -> [SAT.Lit] -> IO SAT.Lit+encodeDisj _ [l] = return l+encodeDisj encoder ls = do+ -- ¬l ⇔ ¬(¬l1 ∧ … ∧ ¬ln) ⇔ (l1 ∨ … ∨ ln)+ l <- encodeConj encoder [SAT.litNot li | li <- ls]+ return $ SAT.litNot l++addIsConjOf :: Encoder -> SAT.Lit -> [SAT.Lit] -> IO ()+addIsConjOf encoder l ls = do+ let solver = encSolver encoder+ usePB <- readIORef (encUsePB encoder)+ if usePB+ then do+ -- ∀i.(l → li) ⇔ Σli >= n*l ⇔ Σli - n*l >= 0+ let n = length ls+ SAT.addPBAtLeast solver ((- fromIntegral n, l) : [(1,li) | li <- ls]) 0+ else do+ forM_ ls $ \li -> do+ -- (l → li) ⇔ (¬l ∨ li)+ SAT.addClause solver [SAT.litNot l, li]+ -- ((l1 ∧ l2 ∧ … ∧ ln) → l) ⇔ (¬l1 ∨ ¬l2 ∨ … ∨ ¬ln ∨ l)+ SAT.addClause solver (l : map SAT.litNot ls)+ modifyIORef (encConjTable encoder) (Map.insert (IntSet.fromList ls) l)++getDefinitions :: Encoder -> IO [(SAT.Lit, Formula)]+getDefinitions encoder = do+ t <- readIORef (encConjTable encoder)+ return $ [(l, And [Lit l1 | l1 <- IntSet.toList ls]) | (ls, l) <- Map.toList t]
+ src/ToySolver/SAT/Types.hs view
@@ -0,0 +1,304 @@+{-# LANGUAGE BangPatterns, FlexibleInstances #-}+module ToySolver.SAT.Types+ (+ -- * Variable+ Var+ , VarSet+ , VarMap+ , validVar++ -- * Model+ , IModel (..)+ , Model++ -- * Literal+ , Lit+ , LitSet+ , LitMap+ , litUndef+ , validLit+ , literal+ , litNot+ , litVar+ , litPolarity+ , evalLit++ -- * Clause+ , Clause+ , normalizeClause+ , clauseSubsume+ , evalClause++ -- * Cardinality Constraint+ , AtLeast+ , normalizeAtLeast+ , evalAtLeast++ -- * Pseudo Boolean Constraint+ , PBLinTerm+ , PBLinSum+ , PBLinAtLeast+ , PBLinExactly+ , normalizePBLinSum+ , normalizePBLinAtLeast+ , normalizePBLinExactly+ , cutResolve+ , cardinalityReduction+ , negatePBLinAtLeast+ , evalPBLinSum+ , evalPBLinAtLeast+ , evalPBLinExactly+ , pbLowerBound+ , pbUpperBound+ , pbSubsume+ ) where++import Control.Monad+import Control.Exception+import Data.Array.Unboxed+import Data.Ord+import Data.List+import Data.IntMap (IntMap)+import qualified Data.IntMap as IntMap+import Data.IntSet (IntSet)+import qualified Data.IntSet as IntSet++-- | Variable is represented as positive integers (DIMACS format).+type Var = Int++type VarSet = IntSet+type VarMap = IntMap++{-# INLINE validVar #-}+validVar :: Var -> Bool+validVar v = v > 0++class IModel a where+ evalVar :: a -> Var -> Bool++-- | A model is represented as a mapping from variables to its values.+type Model = UArray Var Bool++instance IModel (UArray Var Bool) where+ evalVar m v = m ! v++instance IModel (Array Var Bool) where+ evalVar m v = m ! v++instance IModel (Var -> Bool) where+ evalVar m v = m v++-- | Positive (resp. negative) literals are represented as positive (resp.+-- negative) integers. (DIMACS format).+type Lit = Int++{-# INLINE litUndef #-}+litUndef :: Lit+litUndef = 0++type LitSet = IntSet+type LitMap = IntMap++{-# INLINE validLit #-}+validLit :: Lit -> Bool+validLit l = l /= 0++{-# INLINE literal #-}+-- | Construct a literal from a variable and its polarity.+-- 'True' (resp 'False') means positive (resp. negative) literal.+literal :: Var -- ^ variable+ -> Bool -- ^ polarity+ -> Lit+literal v polarity =+ assert (validVar v) $ if polarity then v else litNot v++{-# INLINE litNot #-}+-- | Negation of the 'Lit'.+litNot :: Lit -> Lit+litNot l = assert (validLit l) $ negate l++{-# INLINE litVar #-}+-- | Underlying variable of the 'Lit'+litVar :: Lit -> Var+litVar l = assert (validLit l) $ abs l++{-# INLINE litPolarity #-}+-- | Polarity of the 'Lit'.+-- 'True' means positive literal and 'False' means negative literal.+litPolarity :: Lit -> Bool+litPolarity l = assert (validLit l) $ l > 0++{-# INLINEABLE evalLit #-}+{-# SPECIALIZE evalLit :: Model -> Lit -> Bool #-}+evalLit :: IModel m => m -> Lit -> Bool+evalLit m l = if l > 0 then evalVar m l else not (evalVar m (abs l))++-- | Disjunction of 'Lit'.+type Clause = [Lit]++-- | Normalizing clause+--+-- 'Nothing' if the clause is trivially true.+normalizeClause :: Clause -> Maybe Clause+normalizeClause lits = assert (IntSet.size ys `mod` 2 == 0) $+ if IntSet.null ys+ then Just (IntSet.toList xs)+ else Nothing+ where+ xs = IntSet.fromList lits+ ys = xs `IntSet.intersection` (IntSet.map litNot xs)++clauseSubsume :: Clause -> Clause -> Bool+clauseSubsume cl1 cl2 = cl1' `IntSet.isSubsetOf` cl2'+ where+ cl1' = IntSet.fromList cl1+ cl2' = IntSet.fromList cl2++evalClause :: IModel m => m -> Clause -> Bool+evalClause m cl = any (evalLit m) cl++type AtLeast = ([Lit], Int)++normalizeAtLeast :: AtLeast -> AtLeast+normalizeAtLeast (lits,n) = assert (IntSet.size ys `mod` 2 == 0) $+ (IntSet.toList lits', n')+ where+ xs = IntSet.fromList lits+ ys = xs `IntSet.intersection` (IntSet.map litNot xs)+ lits' = xs `IntSet.difference` ys+ n' = n - (IntSet.size ys `div` 2)++evalAtLeast :: IModel m => m -> AtLeast -> Bool+evalAtLeast m (lits,n) = sum [1 | lit <- lits, evalLit m lit] >= n++type PBLinTerm = (Integer, Lit)+type PBLinSum = [PBLinTerm]+type PBLinAtLeast = (PBLinSum, Integer)+type PBLinExactly = (PBLinSum, Integer)++-- | normalizing PB term of the form /c1 x1 + c2 x2 ... cn xn + c/ into+-- /d1 x1 + d2 x2 ... dm xm + d/ where d1,...,dm ≥ 1.+normalizePBLinSum :: (PBLinSum, Integer) -> (PBLinSum, Integer)+normalizePBLinSum = step2 . step1+ where+ -- 同じ変数が複数回現れないように、一度全部 @v@ に統一。+ step1 :: (PBLinSum, Integer) -> (PBLinSum, Integer)+ step1 (xs,n) =+ case loop (IntMap.empty,n) xs of+ (ys,n') -> ([(c,v) | (v,c) <- IntMap.toList ys], n')+ where+ loop :: (VarMap Integer, Integer) -> PBLinSum -> (VarMap Integer, Integer)+ loop (ys,m) [] = (ys,m)+ loop (ys,m) ((c,l):zs) =+ if litPolarity l+ then loop (IntMap.insertWith (+) l c ys, m) zs+ else loop (IntMap.insertWith (+) (litNot l) (negate c) ys, m+c) zs++ -- 係数が0のものも取り除き、係数が負のリテラルを反転することで、+ -- 係数が正になるようにする。+ step2 :: (PBLinSum, Integer) -> (PBLinSum, Integer)+ step2 (xs,n) = loop ([],n) xs+ where+ loop (ys,m) [] = (ys,m)+ loop (ys,m) (t@(c,l):zs)+ | c == 0 = loop (ys,m) zs+ | c < 0 = loop ((negate c,litNot l):ys, m+c) zs+ | otherwise = loop (t:ys,m) zs++-- | normalizing PB constraint of the form /c1 x1 + c2 cn ... cn xn >= b/.+normalizePBLinAtLeast :: PBLinAtLeast -> PBLinAtLeast+normalizePBLinAtLeast a =+ case step1 a of+ (xs,n)+ | n > 0 -> step3 (saturate n xs, n)+ | otherwise -> ([], 0) -- trivially true+ where+ step1 :: PBLinAtLeast -> PBLinAtLeast+ step1 (xs,n) =+ case normalizePBLinSum (xs,-n) of+ (ys,m) -> (ys, -m)++ -- degree以上の係数はそこで抑える。+ saturate :: Integer -> PBLinSum -> PBLinSum+ saturate n xs = [assert (c>0) (min n c, l) | (c,l) <- xs]++ -- omega test と同様の係数の gcd による単純化+ step3 :: PBLinAtLeast -> PBLinAtLeast+ step3 ([],n) = ([],n)+ step3 (xs,n) = ([(c `div` d, l) | (c,l) <- xs], (n+d-1) `div` d)+ where+ d = foldl1' gcd [c | (c,_) <- xs]++-- | normalizing PB constraint of the form /c1 x1 + c2 cn ... cn xn = b/.+normalizePBLinExactly :: PBLinExactly -> PBLinExactly+normalizePBLinExactly a =+ case step1 $ a of+ (xs,n)+ | n >= 0 -> step2 (xs, n)+ | otherwise -> ([], 1) -- false+ where+ step1 :: PBLinExactly -> PBLinExactly+ step1 (xs,n) =+ case normalizePBLinSum (xs,-n) of+ (ys,m) -> (ys, -m)++ -- omega test と同様の係数の gcd による単純化+ step2 :: PBLinExactly -> PBLinExactly+ step2 ([],n) = ([],n)+ step2 (xs,n)+ | n `mod` d == 0 = ([(c `div` d, l) | (c,l) <- xs], n `div` d)+ | otherwise = ([], 1) -- false+ where+ d = foldl1' gcd [c | (c,_) <- xs]++cutResolve :: PBLinAtLeast -> PBLinAtLeast -> Var -> PBLinAtLeast+cutResolve (lhs1,rhs1) (lhs2,rhs2) v = assert (l1 == litNot l2) $ normalizePBLinAtLeast pb+ where+ (c1,l1) = head [(c,l) | (c,l) <- lhs1, litVar l == v]+ (c2,l2) = head [(c,l) | (c,l) <- lhs2, litVar l == v]+ g = gcd c1 c2+ s1 = c2 `div` g+ s2 = c1 `div` g+ pb = ([(s1*c,l) | (c,l) <- lhs1] ++ [(s2*c,l) | (c,l) <- lhs2], s1*rhs1 + s2 * rhs2)++cardinalityReduction :: PBLinAtLeast -> AtLeast+cardinalityReduction (lhs,rhs) = (ls, rhs')+ where+ rhs' = go1 0 0 (sortBy (flip (comparing fst)) lhs)++ go1 !s !k ((a,_):ts)+ | s < rhs = go1 (s+a) (k+1) ts+ | otherwise = k+ go1 _ _ [] = error "ToySolver.SAT.Types.cardinalityReduction: should not happen"++ ls = go2 (minimum (rhs : map (subtract 1 . fst) lhs)) (sortBy (comparing fst) lhs)++ go2 !guard' ((a,_) : ts)+ | a - 1 < guard' = go2 (guard' - a) ts+ | otherwise = map snd ts+ go2 _ [] = error "ToySolver.SAT.Types.cardinalityReduction: should not happen"++negatePBLinAtLeast :: PBLinAtLeast -> PBLinAtLeast+negatePBLinAtLeast (xs, rhs) = ([(-c,lit) | (c,lit)<-xs] , -rhs + 1)++evalPBLinSum :: IModel m => m -> PBLinSum -> Integer+evalPBLinSum m xs = sum [c | (c,lit) <- xs, evalLit m lit]++evalPBLinAtLeast :: IModel m => m -> PBLinAtLeast -> Bool+evalPBLinAtLeast m (lhs,rhs) = evalPBLinSum m lhs >= rhs++evalPBLinExactly :: IModel m => m -> PBLinAtLeast -> Bool+evalPBLinExactly m (lhs,rhs) = evalPBLinSum m lhs == rhs++pbLowerBound :: PBLinSum -> Integer+pbLowerBound xs = sum [if c < 0 then c else 0 | (c,_) <- xs]++pbUpperBound :: PBLinSum -> Integer+pbUpperBound xs = sum [if c > 0 then c else 0 | (c,_) <- xs]++-- (Σi ci li ≥ rhs1) subsumes (Σi di li ≥ rhs2) iff rhs1≥rhs2 and di≥ci for all i.+pbSubsume :: PBLinAtLeast -> PBLinAtLeast -> Bool+pbSubsume (lhs1,rhs1) (lhs2,rhs2) =+ rhs1 >= rhs2 && and [di >= ci | (ci,li) <- lhs1, let di = IntMap.findWithDefault 0 li lhs2']+ where+ lhs2' = IntMap.fromList [(l,c) | (c,l) <- lhs2]
+ src/ToySolver/Simplex.hs view
@@ -0,0 +1,366 @@+{-# LANGUAGE ScopedTypeVariables #-}+{-# OPTIONS_GHC -Wall #-}+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.Simplex+-- Copyright : (c) Masahiro Sakai 2011+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : provisional+-- Portability : non-portable (ScopedTypeVariables)+--+-- Naïve implementation of Simplex method+-- +-- Reference:+--+-- * <http://www.math.cuhk.edu.hk/~wei/lpch3.pdf>+--+-----------------------------------------------------------------------------+module ToySolver.Simplex+ (+ -- * The @Tableau@ type+ Tableau+ , RowIndex+ , ColIndex+ , Row+ , emptyTableau+ , objRowIndex+ , pivot+ , lookupRow+ , addRow+ , setObjFun++ -- * Optimization direction+ , module Data.OptDir++ -- * Reading status+ , currentValue+ , currentObjValue+ , isFeasible+ , isOptimal++ -- * High-level solving functions+ , simplex+ , dualSimplex+ , phaseI+ , primalDualSimplex++ -- * For debugging+ , isValidTableau+ , toCSV+ ) where++import Data.Ord+import Data.List+import qualified Data.IntMap as IM+import qualified Data.IntSet as IS+import Data.OptDir+import Data.VectorSpace+import Control.Exception++import qualified ToySolver.Data.LA as LA+import ToySolver.Data.Var++-- ---------------------------------------------------------------------------++type Tableau r = VarMap (Row r)+{-+tbl ! v == (m, val)+==>+var v .+. m .==. constant val+-}++-- | Basic variables+type RowIndex = Int++-- | Non-basic variables+type ColIndex = Int++type Row r = (VarMap r, r)++data PivotResult r = PivotUnbounded | PivotFinished | PivotSuccess (Tableau r)+ deriving (Show, Eq, Ord)++emptyTableau :: Tableau r+emptyTableau = IM.empty++objRowIndex :: RowIndex+objRowIndex = -1++pivot :: (Fractional r, Eq r) => RowIndex -> ColIndex -> Tableau r -> Tableau r+{-# INLINE pivot #-}+{-# SPECIALIZE pivot :: RowIndex -> ColIndex -> Tableau Rational -> Tableau Rational #-}+{-# SPECIALIZE pivot :: RowIndex -> ColIndex -> Tableau Double -> Tableau Double #-}+pivot r s tbl =+ assert (isValidTableau tbl) $ -- precondition+ assert (isValidTableau tbl') $ -- postcondition+ tbl'+ where+ tbl' = IM.insert s row_s $ IM.map f $ IM.delete r $ tbl+ f orig@(row_i, row_i_val) =+ case IM.lookup s row_i of+ Nothing -> orig+ Just c ->+ ( IM.filter (0/=) $ IM.unionWith (+) (IM.delete s row_i) (IM.map (negate c *) row_r')+ , row_i_val - c*row_r_val'+ )+ (row_r, row_r_val) = lookupRow r tbl+ a_rs = row_r IM.! s+ row_r' = IM.map (/ a_rs) $ IM.insert r 1 $ IM.delete s row_r+ row_r_val' = row_r_val / a_rs+ row_s = (row_r', row_r_val')++-- | Lookup a row by basic variable+lookupRow :: RowIndex -> Tableau r -> Row r+lookupRow r m = m IM.! r++-- 行の基底変数の列が0になるように変形+normalizeRow :: (Num r, Eq r) => Tableau r -> Row r -> Row r+normalizeRow a (row0,val0) = obj'+ where+ obj' = g $ foldl' f (IM.empty, val0) $ + [ case IM.lookup j a of+ Nothing -> (IM.singleton j x, 0)+ Just (row,val) -> (IM.map ((-x)*) (IM.delete j row), -x*val)+ | (j,x) <- IM.toList row0 ]+ f (m1,v1) (m2,v2) = (IM.unionWith (+) m1 m2, v1+v2)+ g (m,v) = (IM.filter (0/=) m, v)++setRow :: (Num r, Eq r) => Tableau r -> RowIndex -> Row r -> Tableau r+setRow tbl i row = assert (isValidTableau tbl) $ assert (isValidTableau tbl') $ tbl'+ where+ tbl' = IM.insert i (normalizeRow tbl row) tbl++addRow :: (Num r, Eq r) => Tableau r -> RowIndex -> Row r -> Tableau r+addRow tbl i row = assert (i `IM.notMember` tbl) $ setRow tbl i row++setObjFun :: (Num r, Eq r) => Tableau r -> LA.Expr r -> Tableau r+setObjFun tbl e = addRow tbl objRowIndex row+ where+ row =+ case LA.extract LA.unitVar e of+ (c, e') -> (LA.coeffMap (negateV e'), c)++copyObjRow :: (Num r, Eq r) => Tableau r -> Tableau r -> Tableau r+copyObjRow from to =+ case IM.lookup objRowIndex from of+ Nothing -> IM.delete objRowIndex to+ Just row -> addRow to objRowIndex row++currentValue :: Num r => Tableau r -> Var -> r+currentValue tbl v =+ case IM.lookup v tbl of+ Nothing -> 0+ Just (_, val) -> val++currentObjValue :: Num r => Tableau r -> r+currentObjValue = snd . lookupRow objRowIndex++isValidTableau :: Tableau r -> Bool+isValidTableau tbl =+ and [v `IM.notMember` m | (v, (m,_)) <- IM.toList tbl, v /= objRowIndex] &&+ and [IS.null (IM.keysSet m `IS.intersection` vs) | (m,_) <- IM.elems tbl']+ where+ tbl' = IM.delete objRowIndex tbl+ vs = IM.keysSet tbl' ++isFeasible :: Real r => Tableau r -> Bool+isFeasible tbl = + and [val >= 0 | (v, (_,val)) <- IM.toList tbl, v /= objRowIndex]++isOptimal :: Real r => OptDir -> Tableau r -> Bool+isOptimal optdir tbl =+ and [not (cmp cj) | cj <- IM.elems (fst (lookupRow objRowIndex tbl))]+ where+ cmp = case optdir of+ OptMin -> (0<)+ OptMax -> (0>)++isImproving :: Real r => OptDir -> Tableau r -> Tableau r -> Bool+isImproving OptMin from to = currentObjValue to <= currentObjValue from +isImproving OptMax from to = currentObjValue to >= currentObjValue from ++-- ---------------------------------------------------------------------------+-- primal simplex++simplex :: (Real r, Fractional r) => OptDir -> Tableau r -> (Bool, Tableau r)+{-# SPECIALIZE simplex :: OptDir -> Tableau Rational -> (Bool, Tableau Rational) #-}+{-# SPECIALIZE simplex :: OptDir -> Tableau Double -> (Bool, Tableau Double) #-}+simplex optdir = go+ where+ go tbl = assert (isFeasible tbl) $+ case primalPivot optdir tbl of+ PivotFinished -> assert (isOptimal optdir tbl) (True, tbl)+ PivotUnbounded -> (False, tbl)+ PivotSuccess tbl' -> assert (isImproving optdir tbl tbl') $ go tbl'++primalPivot :: (Real r, Fractional r) => OptDir -> Tableau r -> PivotResult r+{-# INLINE primalPivot #-}+primalPivot optdir tbl+ | null cs = PivotFinished+ | null rs = PivotUnbounded+ | otherwise = PivotSuccess (pivot r s tbl)+ where+ cmp = case optdir of+ OptMin -> (0<)+ OptMax -> (0>)+ cs = [(j,cj) | (j,cj) <- IM.toList (fst (lookupRow objRowIndex tbl)), cmp cj]+ -- smallest subscript rule+ s = fst $ head cs+ -- classical rule+ --s = fst $ (if optdir==OptMin then maximumBy else minimumBy) (compare `on` snd) cs+ rs = [ (i, y_i0 / y_is)+ | (i, (row_i, y_i0)) <- IM.toList tbl, i /= objRowIndex+ , let y_is = IM.findWithDefault 0 s row_i, y_is > 0+ ]+ r = fst $ minimumBy (comparing snd) rs++-- ---------------------------------------------------------------------------+-- dual simplex++dualSimplex :: (Real r, Fractional r) => OptDir -> Tableau r -> (Bool, Tableau r)+{-# SPECIALIZE dualSimplex :: OptDir -> Tableau Rational -> (Bool, Tableau Rational) #-}+{-# SPECIALIZE dualSimplex :: OptDir -> Tableau Double -> (Bool, Tableau Double) #-}+dualSimplex optdir = go+ where+ go tbl = assert (isOptimal optdir tbl) $+ case dualPivot optdir tbl of+ PivotFinished -> assert (isFeasible tbl) $ (True, tbl)+ PivotUnbounded -> (False, tbl)+ PivotSuccess tbl' -> assert (isImproving optdir tbl' tbl) $ go tbl'++dualPivot :: (Real r, Fractional r) => OptDir -> Tableau r -> PivotResult r+{-# INLINE dualPivot #-}+dualPivot optdir tbl+ | null rs = PivotFinished+ | null cs = PivotUnbounded+ | otherwise = PivotSuccess (pivot r s tbl)+ where+ rs = [(i, row_i) | (i, (row_i, y_i0)) <- IM.toList tbl, i /= objRowIndex, 0 > y_i0]+ (r, row_r) = head rs+ cs = [ (j, if optdir==OptMin then y_0j / y_rj else - y_0j / y_rj)+ | (j, y_rj) <- IM.toList row_r+ , y_rj < 0+ , let y_0j = IM.findWithDefault 0 j obj+ ]+ s = fst $ minimumBy (comparing snd) cs+ (obj,_) = lookupRow objRowIndex tbl++-- ---------------------------------------------------------------------------+-- phase I of the two-phased method++phaseI :: (Real r, Fractional r) => Tableau r -> VarSet -> (Bool, Tableau r)+{-# SPECIALIZE phaseI :: Tableau Rational -> VarSet -> (Bool, Tableau Rational) #-}+{-# SPECIALIZE phaseI :: Tableau Double -> VarSet -> (Bool, Tableau Double) #-}+phaseI tbl avs+ | currentObjValue tbl1' /= 0 = (False, tbl1')+ | otherwise = (True, copyObjRow tbl $ removeArtificialVariables avs $ tbl1')+ where+ optdir = OptMax+ tbl1 = setObjFun tbl $ negateV $ sumV [LA.var v | v <- IS.toList avs]+ tbl1' = go tbl1+ go tbl2+ | currentObjValue tbl2 == 0 = tbl2+ | otherwise = + case primalPivot optdir tbl2 of+ PivotSuccess tbl2' -> assert (isImproving optdir tbl2 tbl2') $ go tbl2'+ PivotFinished -> assert (isOptimal optdir tbl2) tbl2+ PivotUnbounded -> error "phaseI: should not happen"++-- post-processing of phaseI+-- pivotを使ってartificial variablesを基底から除いて、削除+removeArtificialVariables :: (Real r, Fractional r) => VarSet -> Tableau r -> Tableau r+removeArtificialVariables avs tbl0 = tbl2+ where+ tbl1 = foldl' f (IM.delete objRowIndex tbl0) (IS.toList avs)+ tbl2 = IM.map (\(row,val) -> (IM.filterWithKey (\j _ -> j `IS.notMember` avs) row, val)) tbl1+ f tbl i =+ case IM.lookup i tbl of+ Nothing -> tbl+ Just row ->+ case [j | (j,c) <- IM.toList (fst row), c /= 0, j `IS.notMember` avs] of+ [] -> IM.delete i tbl+ j:_ -> pivot i j tbl++-- ---------------------------------------------------------------------------+-- primal-dual simplex++data PDResult = PDUnsat | PDOptimal | PDUnbounded++primalDualSimplex :: (Real r, Fractional r) => OptDir -> Tableau r -> (Bool, Tableau r)+{-# SPECIALIZE primalDualSimplex :: OptDir -> Tableau Rational -> (Bool, Tableau Rational) #-}+{-# SPECIALIZE primalDualSimplex :: OptDir -> Tableau Double -> (Bool, Tableau Double) #-}+primalDualSimplex optdir = go+ where+ go tbl =+ case pdPivot optdir tbl of+ Left PDOptimal -> assert (isFeasible tbl) $ assert (isOptimal optdir tbl) $ (True, tbl)+ Left PDUnsat -> assert (not (isFeasible tbl)) $ (False, tbl)+ Left PDUnbounded -> assert (not (isOptimal optdir tbl)) $ (False, tbl)+ Right tbl' -> go tbl'++pdPivot :: (Real r, Fractional r) => OptDir -> Tableau r -> Either PDResult (Tableau r)+pdPivot optdir tbl+ | null ps && null qs = Left PDOptimal -- optimal+ | otherwise =+ case ret of+ Left p -> -- primal update+ let rs = [ (i, (bi - t) / y_ip)+ | (i, (row_i, bi)) <- IM.toList tbl, i /= objRowIndex+ , let y_ip = IM.findWithDefault 0 p row_i, y_ip > 0+ ]+ q = fst $ minimumBy (comparing snd) rs+ in if null rs+ then Left PDUnsat+ else Right (pivot q p tbl)+ Right q -> -- dual update+ let (row_q, _bq) = (tbl IM.! q)+ cs = [ (j, (cj'-t) / (-y_qj))+ | (j, y_qj) <- IM.toList row_q+ , y_qj < 0+ , let cj = IM.findWithDefault 0 j obj+ , let cj' = if optdir==OptMax then cj else -cj+ ]+ p = fst $ maximumBy (comparing snd) cs+ (obj,_) = lookupRow objRowIndex tbl+ in if null cs+ then Left PDUnbounded -- dual infeasible+ else Right (pivot q p tbl)+ where+ qs = [ (Right i, bi) | (i, (row_i, bi)) <- IM.toList tbl, i /= objRowIndex, 0 > bi ]+ ps = [ (Left j, cj')+ | (j,cj) <- IM.toList (fst (lookupRow objRowIndex tbl))+ , let cj' = if optdir==OptMax then cj else -cj+ , 0 > cj' ]+ (ret, t) = minimumBy (comparing snd) (qs ++ ps)++-- ---------------------------------------------------------------------------++toCSV :: (Num r, Eq r, Show r) => (r -> String) -> Tableau r -> String+toCSV showCell tbl = unlines . map (concat . intersperse ",") $ header : body+ where+ header :: [String]+ header = "" : map colName cols ++ [""]++ body :: [[String]]+ body = [showRow i (lookupRow i tbl) | i <- rows]++ rows :: [RowIndex]+ rows = IM.keys (IM.delete objRowIndex tbl) ++ [objRowIndex]++ cols :: [ColIndex]+ cols = [0..colMax]+ where+ colMax = maximum (-1 : [c | (row, _) <- IM.elems tbl, c <- IM.keys row])++ rowName :: RowIndex -> String+ rowName i = if i==objRowIndex then "obj" else "x" ++ show i++ colName :: ColIndex -> String+ colName j = "x" ++ show j++ showRow i (row, row_val) = rowName i : [showCell (IM.findWithDefault 0 j row') | j <- cols] ++ [showCell row_val]+ where row' = IM.insert i 1 row++-- ---------------------------------------------------------------------------
+ src/ToySolver/Simplex2.hs view
@@ -0,0 +1,1029 @@+{-# LANGUAGE TypeSynonymInstances, FlexibleInstances, TypeFamilies, CPP #-}+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.Simplex2+-- Copyright : (c) Masahiro Sakai 2012+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : provisional+-- Portability : non-portable (TypeSynonymInstances, FlexibleInstances, TypeFamilies, CPP)+--+-- Naïve implementation of Simplex method+-- +-- Reference:+--+-- * <http://www.math.cuhk.edu.hk/~wei/lpch3.pdf>+-- +-- * Bruno Dutertre and Leonardo de Moura.+-- A Fast Linear-Arithmetic Solver for DPLL(T).+-- Computer Aided Verification In Computer Aided Verification, Vol. 4144 (2006), pp. 81-94.+-- <http://yices.csl.sri.com/cav06.pdf>+--+-- * Bruno Dutertre and Leonardo de Moura.+-- Integrating Simplex with DPLL(T).+-- CSL Technical Report SRI-CSL-06-01. 2006.+-- <http://yices.csl.sri.com/sri-csl-06-01.pdf>+--+-----------------------------------------------------------------------------+module ToySolver.Simplex2+ (+ -- * The @Solver@ type+ Solver+ , GenericSolver+ , SolverValue (..)+ , newSolver+ , cloneSolver++ -- * Problem specification+ , Var+ , newVar+ , RelOp (..)+ , (.<=.), (.>=.), (.==.), (.<.), (.>.)+ , Atom (..)+ , assertAtom+ , assertAtomEx+ , assertLower+ , assertUpper+ , setObj+ , getObj+ , OptDir (..)+ , setOptDir+ , getOptDir++ -- * Solving+ , check+ , Options (..)+ , defaultOptions+ , OptResult (..)+ , optimize+ , dualSimplex++ -- * Extract results+ , Model+ , model+ , RawModel+ , rawModel+ , getValue+ , getObjValue++ -- * Reading status+ , getTableau+ , getRow+ , getCol+ , getCoeff+ , nVars+ , isBasicVariable+ , isNonBasicVariable+ , isFeasible+ , isOptimal+ , getLB+ , getUB++ -- * Configulation+ , setLogger+ , clearLogger+ , PivotStrategy (..)+ , setPivotStrategy++ -- * Debug+ , dump+ ) where++import Prelude hiding (log)+import Control.Exception+import Control.Monad+import Data.Ord+import Data.IORef+import Data.List+import Data.Maybe+import Data.Ratio+import Data.Map (Map)+import qualified Data.Map as Map+import Data.IntMap (IntMap)+import qualified Data.IntMap as IntMap+import Text.Printf+import Data.Time+import Data.OptDir+import Data.VectorSpace+import System.CPUTime++import qualified ToySolver.Data.LA as LA+import ToySolver.Data.LA (Atom (..))+import ToySolver.Data.ArithRel+import ToySolver.Data.Delta+import ToySolver.Internal.Util (showRational)++{--------------------------------------------------------------------+ The @Solver@ type+--------------------------------------------------------------------}++type Var = Int++data GenericSolver v+ = GenericSolver+ { svTableau :: !(IORef (IntMap (LA.Expr Rational)))+ , svLB :: !(IORef (IntMap v))+ , svUB :: !(IORef (IntMap v))+ , svModel :: !(IORef (IntMap v))+ , svVCnt :: !(IORef Int)+ , svOk :: !(IORef Bool)+ , svOptDir :: !(IORef OptDir)++ , svDefDB :: !(IORef (Map (LA.Expr Rational) Var))++ , svLogger :: !(IORef (Maybe (String -> IO ())))+ , svPivotStrategy :: !(IORef PivotStrategy)+ , svNPivot :: !(IORef Int)+ }++type Solver = GenericSolver Rational++-- special basic variable+objVar :: Int+objVar = -1++newSolver :: SolverValue v => IO (GenericSolver v)+newSolver = do+ t <- newIORef (IntMap.singleton objVar zeroV)+ l <- newIORef IntMap.empty+ u <- newIORef IntMap.empty+ m <- newIORef (IntMap.singleton objVar zeroV)+ v <- newIORef 0+ ok <- newIORef True+ dir <- newIORef OptMin+ defs <- newIORef Map.empty+ logger <- newIORef Nothing+ pivot <- newIORef PivotStrategyBlandRule+ npivot <- newIORef 0+ return $+ GenericSolver+ { svTableau = t+ , svLB = l+ , svUB = u+ , svModel = m+ , svVCnt = v+ , svOk = ok+ , svOptDir = dir+ , svDefDB = defs+ , svLogger = logger+ , svNPivot = npivot+ , svPivotStrategy = pivot+ }++cloneSolver :: GenericSolver v -> IO (GenericSolver v)+cloneSolver solver = do+ t <- newIORef =<< readIORef (svTableau solver)+ l <- newIORef =<< readIORef (svLB solver)+ u <- newIORef =<< readIORef (svUB solver)+ m <- newIORef =<< readIORef (svModel solver)+ v <- newIORef =<< readIORef (svVCnt solver)+ ok <- newIORef =<< readIORef (svOk solver)+ dir <- newIORef =<< readIORef (svOptDir solver)+ defs <- newIORef =<< readIORef (svDefDB solver)+ logger <- newIORef =<< readIORef (svLogger solver)+ pivot <- newIORef =<< readIORef (svPivotStrategy solver)+ npivot <- newIORef =<< readIORef (svNPivot solver)+ return $+ GenericSolver+ { svTableau = t+ , svLB = l+ , svUB = u+ , svModel = m+ , svVCnt = v+ , svOk = ok+ , svOptDir = dir+ , svDefDB = defs+ , svLogger = logger+ , svNPivot = npivot+ , svPivotStrategy = pivot+ } ++class (VectorSpace v, Scalar v ~ Rational, Ord v) => SolverValue v where+ toValue :: Rational -> v+ showValue :: Bool -> v -> String+ model :: GenericSolver v -> IO Model++instance SolverValue Rational where+ toValue = id+ showValue = showRational+ model = rawModel++instance SolverValue (Delta Rational) where+ toValue = fromReal+ showValue = showDelta+ model solver = do+ xs <- variables solver+ ys <- liftM concat $ forM xs $ \x -> do+ Delta p q <- getValue solver x+ lb <- getLB solver x+ ub <- getUB solver x+ return $+ [(p - c) / (k - q) | Just (Delta c k) <- return lb, c < p, k > q] +++ [(d - p) / (q - h) | Just (Delta d h) <- return ub, p < d, q > h]+ let delta0 :: Rational+ delta0 = if null ys then 0.1 else minimum ys+ f :: Delta Rational -> Rational+ f (Delta r k) = r + k * delta0+ liftM (IntMap.map f) $ readIORef (svModel solver)++{-+Largest coefficient rule: original rule suggested by G. Dantzig.+Largest increase rule: computationally more expensive in comparison with Largest coefficient, but locally maximizes the progress.+Steepest edge rule: best pivot rule in practice, an efficient approximate implementation is "Devex".+Bland’s rule: avoids cycling but one of the slowest rules.+Random edge rule: Randomized have lead to the current best provable bounds for the number of pivot steps of the simplex method.+Lexicographic rule: used for avoiding cyclying.+-}+data PivotStrategy+ = PivotStrategyBlandRule+ | PivotStrategyLargestCoefficient+-- | PivotStrategySteepestEdge+ deriving (Eq, Ord, Enum, Show, Read)++setPivotStrategy :: GenericSolver v -> PivotStrategy -> IO ()+setPivotStrategy solver ps = writeIORef (svPivotStrategy solver) ps++{--------------------------------------------------------------------+ problem description+--------------------------------------------------------------------}++newVar :: SolverValue v => GenericSolver v -> IO Var+newVar solver = do+ v <- readIORef (svVCnt solver)+ writeIORef (svVCnt solver) $! v+1+ modifyIORef (svModel solver) (IntMap.insert v zeroV)+ return v++assertAtom :: Solver -> LA.Atom Rational -> IO ()+assertAtom solver atom = do+ (v,op,rhs') <- simplifyAtom solver atom+ case op of+ Le -> assertUpper solver v (toValue rhs')+ Ge -> assertLower solver v (toValue rhs')+ Eql -> do+ assertLower solver v (toValue rhs')+ assertUpper solver v (toValue rhs')+ _ -> error "unsupported"+ return ()++assertAtomEx :: GenericSolver (Delta Rational) -> LA.Atom Rational -> IO ()+assertAtomEx solver atom = do+ (v,op,rhs') <- simplifyAtom solver atom+ case op of+ Le -> assertUpper solver v (toValue rhs')+ Ge -> assertLower solver v (toValue rhs')+ Lt -> assertUpper solver v (toValue rhs' ^-^ delta)+ Gt -> assertLower solver v (toValue rhs' ^+^ delta)+ Eql -> do+ assertLower solver v (toValue rhs')+ assertUpper solver v (toValue rhs')+ return ()++simplifyAtom :: SolverValue v => GenericSolver v -> LA.Atom Rational -> IO (Var, RelOp, Rational)+simplifyAtom solver (Rel lhs op rhs) = do+ let (lhs',rhs') =+ case LA.extract LA.unitVar (lhs ^-^ rhs) of+ (n,e) -> (e, -n)+ case LA.terms lhs' of+ [(1,v)] -> return (v, op, rhs')+ [(-1,v)] -> return (v, flipOp op, -rhs')+ _ -> do+ defs <- readIORef (svDefDB solver)+ let (c,lhs'') = scale lhs' -- lhs' = lhs'' / c = rhs'+ rhs'' = c *^ rhs'+ op'' = if c < 0 then flipOp op else op+ case Map.lookup lhs'' defs of+ Just v -> do+ return (v,op'',rhs'')+ Nothing -> do+ v <- newVar solver+ setRow solver v lhs''+ modifyIORef (svDefDB solver) $ Map.insert lhs'' v+ return (v,op'',rhs'')+ where+ scale :: LA.Expr Rational -> (Rational, LA.Expr Rational)+ scale e = (c, c *^ e)+ where+ c = c1 * c2+ c1 = fromIntegral $ foldl' lcm 1 [denominator c | (c, _) <- LA.terms e]+ c2 = signum $ head ([c | (c,x) <- LA.terms e] ++ [1])++assertLower :: SolverValue v => GenericSolver v -> Var -> v -> IO ()+assertLower solver x l = do+ l0 <- getLB solver x+ u0 <- getUB solver x+ case (l0,u0) of + (Just l0', _) | l <= l0' -> return ()+ (_, Just u0') | u0' < l -> markBad solver+ _ -> do+ modifyIORef (svLB solver) (IntMap.insert x l)+ b <- isNonBasicVariable solver x+ v <- getValue solver x+ when (b && not (l <= v)) $ update solver x l+ checkNBFeasibility solver++assertUpper :: SolverValue v => GenericSolver v -> Var -> v -> IO ()+assertUpper solver x u = do+ l0 <- getLB solver x+ u0 <- getUB solver x+ case (l0,u0) of + (_, Just u0') | u0' <= u -> return ()+ (Just l0', _) | u < l0' -> markBad solver+ _ -> do+ modifyIORef (svUB solver) (IntMap.insert x u)+ b <- isNonBasicVariable solver x+ v <- getValue solver x+ when (b && not (v <= u)) $ update solver x u+ checkNBFeasibility solver++-- FIXME: 式に定数項が含まれる可能性を考えるとこれじゃまずい?+setObj :: SolverValue v => GenericSolver v -> LA.Expr Rational -> IO ()+setObj solver e = setRow solver objVar e++getObj :: SolverValue v => GenericSolver v -> IO (LA.Expr Rational)+getObj solver = getRow solver objVar++setRow :: SolverValue v => GenericSolver v -> Var -> LA.Expr Rational -> IO ()+setRow solver v e = do+ modifyIORef (svTableau solver) $ \t ->+ IntMap.insert v (LA.applySubst t e) t+ modifyIORef (svModel solver) $ \m -> + IntMap.insert v (LA.evalLinear m (toValue 1) e) m ++setOptDir :: GenericSolver v -> OptDir -> IO ()+setOptDir solver dir = writeIORef (svOptDir solver) dir++getOptDir :: GenericSolver v -> IO OptDir+getOptDir solver = readIORef (svOptDir solver)++{--------------------------------------------------------------------+ Status+--------------------------------------------------------------------}++nVars :: GenericSolver v -> IO Int+nVars solver = readIORef (svVCnt solver)++isBasicVariable :: GenericSolver v -> Var -> IO Bool+isBasicVariable solver v = do+ t <- readIORef (svTableau solver)+ return $ v `IntMap.member` t++isNonBasicVariable :: GenericSolver v -> Var -> IO Bool+isNonBasicVariable solver x = liftM not (isBasicVariable solver x)++isFeasible :: SolverValue v => GenericSolver v -> IO Bool+isFeasible solver = do+ xs <- variables solver+ liftM and $ forM xs $ \x -> do+ v <- getValue solver x+ l <- getLB solver x+ u <- getUB solver x+ return (testLB l v && testUB u v)++isOptimal :: SolverValue v => GenericSolver v -> IO Bool+isOptimal solver = do+ obj <- getRow solver objVar+ ret <- selectEnteringVariable solver+ return $! isNothing ret++{--------------------------------------------------------------------+ Satisfiability solving+--------------------------------------------------------------------}++check :: SolverValue v => GenericSolver v -> IO Bool+check solver = do+ let+ loop :: IO Bool+ loop = do+ m <- selectViolatingBasicVariable solver++ case m of+ Nothing -> return True+ Just xi -> do+ li <- getLB solver xi+ ui <- getUB solver xi+ isLBViolated <- do+ vi <- getValue solver xi+ return $ not (testLB li vi)+ let q = if isLBViolated+ then -- select the smallest non-basic variable xj such that+ -- (aij > 0 and β(xj) < uj) or (aij < 0 and β(xj) > lj)+ canIncrease solver+ else -- select the smallest non-basic variable xj such that+ -- (aij < 0 and β(xj) < uj) or (aij > 0 and β(xj) > lj)+ canDecrease solver+ xi_def <- getRow solver xi+ r <- liftM (fmap snd) $ findM q (LA.terms xi_def) + case r of+ Nothing -> markBad solver >> return False+ Just xj -> do+ pivotAndUpdate solver xi xj (fromJust (if isLBViolated then li else ui))+ loop++ ok <- readIORef (svOk solver)+ if not ok+ then return False+ else do+ log solver "check"+ result <- recordTime solver loop+ when result $ checkFeasibility solver+ return result++selectViolatingBasicVariable :: SolverValue v => GenericSolver v -> IO (Maybe Var)+selectViolatingBasicVariable solver = do+ let+ p :: Var -> IO Bool+ p x | x == objVar = return False+ p xi = do+ li <- getLB solver xi+ ui <- getUB solver xi+ vi <- getValue solver xi+ return $ not (testLB li vi) || not (testUB ui vi)+ vs <- basicVariables solver++ ps <- readIORef (svPivotStrategy solver)+ case ps of+ PivotStrategyBlandRule ->+ findM p vs+ PivotStrategyLargestCoefficient -> do+ xs <- filterM p vs+ case xs of+ [] -> return Nothing+ _ -> do+ xs2 <- forM xs $ \xi -> do+ vi <- getValue solver xi+ li <- getLB solver xi+ ui <- getUB solver xi+ if not (testLB li vi)+ then return (xi, fromJust li ^-^ vi)+ else return (xi, vi ^-^ fromJust ui)+ return $ Just $ fst $ maximumBy (comparing snd) xs2++{--------------------------------------------------------------------+ Optimization+--------------------------------------------------------------------}++-- | results of optimization+data OptResult = Optimum | Unsat | Unbounded | ObjLimit+ deriving (Show, Eq, Ord)++data Options+ = Options+ { objLimit :: Maybe Rational+ }+ deriving (Show, Eq, Ord)++defaultOptions :: Options+defaultOptions+ = Options+ { objLimit = Nothing+ }++optimize :: Solver -> Options -> IO OptResult+optimize solver opt = do+ ret <- do+ is_fea <- isFeasible solver+ if is_fea then return True else check solver+ if not ret+ then return Unsat -- unsat+ else do+ log solver "optimize"+ result <- recordTime solver loop+ when (result == Optimum) $ checkOptimality solver+ return result+ where+ loop :: IO OptResult+ loop = do+ checkFeasibility solver+ ret <- selectEnteringVariable solver+ case ret of+ Nothing -> return Optimum+ Just (c,xj) -> do+ dir <- getOptDir solver+ r <- if dir==OptMin+ then if c > 0+ then decreaseNB solver xj -- xj を小さくして目的関数を小さくする+ else increaseNB solver xj -- xj を大きくして目的関数を小さくする+ else if c > 0+ then increaseNB solver xj -- xj を大きくして目的関数を大きくする+ else decreaseNB solver xj -- xj を小さくして目的関数を大きくする+ if r+ then loop+ else return Unbounded++selectEnteringVariable :: SolverValue v => GenericSolver v -> IO (Maybe (Rational, Var))+selectEnteringVariable solver = do+ ps <- readIORef (svPivotStrategy solver)+ obj_def <- getRow solver objVar+ case ps of+ PivotStrategyBlandRule ->+ findM canEnter (LA.terms obj_def)+ PivotStrategyLargestCoefficient -> do+ ts <- filterM canEnter (LA.terms obj_def)+ case ts of+ [] -> return Nothing+ _ -> return $ Just $ snd $ maximumBy (comparing fst) [(abs c, (c,xj)) | (c,xj) <- ts]+ where+ canEnter :: (Rational, Var) -> IO Bool+ canEnter (_,xj) | xj == LA.unitVar = return False+ canEnter (c,xj) = do+ dir <- getOptDir solver+ if dir==OptMin+ then canDecrease solver (c,xj)+ else canIncrease solver (c,xj)++canIncrease :: SolverValue v => GenericSolver v -> (Rational,Var) -> IO Bool+canIncrease solver (a,x) =+ case compare a 0 of+ EQ -> return False+ GT -> canIncrease1 solver x+ LT -> canDecrease1 solver x++canDecrease :: SolverValue v => GenericSolver v -> (Rational,Var) -> IO Bool+canDecrease solver (a,x) =+ case compare a 0 of+ EQ -> return False+ GT -> canDecrease1 solver x+ LT -> canIncrease1 solver x++canIncrease1 :: SolverValue v => GenericSolver v -> Var -> IO Bool+canIncrease1 solver x = do+ u <- getUB solver x+ v <- getValue solver x+ case u of+ Nothing -> return True+ Just uv -> return $! (v < uv)++canDecrease1 :: SolverValue v => GenericSolver v -> Var -> IO Bool+canDecrease1 solver x = do+ l <- getLB solver x+ v <- getValue solver x+ case l of+ Nothing -> return True+ Just lv -> return $! (lv < v)++-- | feasibility を保ちつつ non-basic variable xj の値を大きくする+increaseNB :: Solver -> Var -> IO Bool+increaseNB solver xj = do+ col <- getCol solver xj++ -- Upper bounds of θ+ -- NOTE: xj 自体の上限も考慮するのに注意+ ubs <- liftM concat $ forM ((xj,1) : IntMap.toList col) $ \(xi,aij) -> do+ v1 <- getValue solver xi+ li <- getLB solver xi+ ui <- getUB solver xi+ return [ assert (theta >= zeroV) ((xi,v2), theta)+ | Just v2 <- [ui | aij > 0] ++ [li | aij < 0]+ , let theta = (v2 ^-^ v1) ^/ aij ]++ -- β(xj) := β(xj) + θ なので θ を大きく+ case ubs of+ [] -> return False -- unbounded+ _ -> do+ let (xi, v) = fst $ minimumBy (comparing snd) ubs+ pivotAndUpdate solver xi xj v+ return True++-- | feasibility を保ちつつ non-basic variable xj の値を小さくする+decreaseNB :: Solver -> Var -> IO Bool+decreaseNB solver xj = do+ col <- getCol solver xj++ -- Lower bounds of θ+ -- NOTE: xj 自体の下限も考慮するのに注意+ lbs <- liftM concat $ forM ((xj,1) : IntMap.toList col) $ \(xi,aij) -> do+ v1 <- getValue solver xi+ li <- getLB solver xi+ ui <- getUB solver xi+ return [ assert (theta <= zeroV) ((xi,v2), theta)+ | Just v2 <- [li | aij > 0] ++ [ui | aij < 0]+ , let theta = (v2 ^-^ v1) ^/ aij ]++ -- β(xj) := β(xj) + θ なので θ を小さく+ case lbs of+ [] -> return False -- unbounded+ _ -> do+ let (xi, v) = fst $ maximumBy (comparing snd) lbs+ pivotAndUpdate solver xi xj v+ return True++dualSimplex :: Solver -> Options -> IO OptResult+dualSimplex solver opt = do+ let+ loop :: IO OptResult+ loop = do+ checkOptimality solver++ p <- prune solver opt+ if p+ then return ObjLimit+ else do+ m <- selectViolatingBasicVariable solver+ case m of+ Nothing -> return Optimum+ Just xi -> do+ xi_def <- getRow solver xi+ li <- getLB solver xi+ ui <- getUB solver xi+ isLBViolated <- do+ vi <- getValue solver xi+ return $ not (testLB li vi)+ r <- dualRTest solver xi_def isLBViolated+ case r of+ Nothing -> markBad solver >> return Unsat -- dual unbounded+ Just xj -> do+ pivotAndUpdate solver xi xj (fromJust (if isLBViolated then li else ui))+ loop++ ok <- readIORef (svOk solver)+ if not ok+ then return Unsat+ else do+ log solver "dual simplex"+ result <- recordTime solver loop+ when (result == Optimum) $ checkFeasibility solver+ return result++dualRTest :: Solver -> LA.Expr Rational -> Bool -> IO (Maybe Var)+dualRTest solver row isLBViolated = do+ -- normalize to the cases of minimization+ obj_def <- do+ def <- getRow solver objVar+ dir <- getOptDir solver+ return $+ case dir of+ OptMin -> def+ OptMax -> negateV def+ -- normalize to the cases of lower bound violation+ let xi_def =+ if isLBViolated+ then row+ else negateV row+ ws <- do+ -- select non-basic variable xj such that+ -- (aij > 0 and β(xj) < uj) or (aij < 0 and β(xj) > lj)+ liftM concat $ forM (LA.terms xi_def) $ \(aij, xj) -> do+ b <- canIncrease solver (aij, xj)+ if b+ then do+ let cj = LA.coeff xj obj_def+ let ratio = cj / aij+ return [(xj, ratio) | ratio >= 0]+ else+ return []+ case ws of+ [] -> return Nothing+ _ -> return $ Just $ fst $ minimumBy (comparing snd) ws++prune :: Solver -> Options -> IO Bool+prune solver opt =+ case objLimit opt of+ Nothing -> return False+ Just lim -> do + o <- getObjValue solver+ dir <- getOptDir solver+ case dir of+ OptMin -> return $! (lim <= o)+ OptMax -> return $! (lim >= o)++{--------------------------------------------------------------------+ Extract results+--------------------------------------------------------------------}++type RawModel v = IntMap v++rawModel :: GenericSolver v -> IO (RawModel v)+rawModel solver = do+ xs <- variables solver+ liftM IntMap.fromList $ forM xs $ \x -> do+ val <- getValue solver x+ return (x,val)++getObjValue :: GenericSolver v -> IO v+getObjValue solver = getValue solver objVar ++type Model = IntMap Rational+ +{--------------------------------------------------------------------+ major function+--------------------------------------------------------------------}++update :: SolverValue v => GenericSolver v -> Var -> v -> IO ()+update solver xj v = do+ -- log solver $ printf "before update x%d (%s)" xj (show v)+ -- dump solver++ v0 <- getValue solver xj+ let diff = v ^-^ v0++ aj <- getCol solver xj+ modifyIORef (svModel solver) $ \m ->+ let m2 = IntMap.map (\aij -> aij *^ diff) aj+ in IntMap.insert xj v $ IntMap.unionWith (^+^) m2 m++ -- log solver $ printf "after update x%d (%s)" xj (show v)+ -- dump solver++pivot :: SolverValue v => GenericSolver v -> Var -> Var -> IO ()+pivot solver xi xj = do+ modifyIORef' (svNPivot solver) (+1)+ modifyIORef' (svTableau solver) $ \defs ->+ case LA.solveFor (LA.var xi .==. (defs IntMap.! xi)) xj of+ Just (Eql, xj_def) ->+ IntMap.insert xj xj_def . IntMap.map (LA.applySubst1 xj xj_def) . IntMap.delete xi $ defs+ _ -> error "pivot: should not happen"++pivotAndUpdate :: SolverValue v => GenericSolver v -> Var -> Var -> v -> IO ()+pivotAndUpdate solver xi xj v | xi == xj = update solver xi v -- xi = xj is non-basic variable+pivotAndUpdate solver xi xj v = do+ -- xi is basic variable+ -- xj is non-basic varaible++ -- log solver $ printf "before pivotAndUpdate x%d x%d (%s)" xi xj (show v)+ -- dump solver++ m <- readIORef (svModel solver)++ aj <- getCol solver xj+ let aij = aj IntMap.! xi+ let theta = (v ^-^ (m IntMap.! xi)) ^/ aij++ let m' = IntMap.fromList $+ [(xi, v), (xj, (m IntMap.! xj) ^+^ theta)] +++ [(xk, (m IntMap.! xk) ^+^ (akj *^ theta)) | (xk, akj) <- IntMap.toList aj, xk /= xi]+ writeIORef (svModel solver) (IntMap.union m' m) -- note that 'IntMap.union' is left biased.++ pivot solver xi xj++ -- log solver $ printf "after pivotAndUpdate x%d x%d (%s)" xi xj (show v)+ -- dump solver++getLB :: GenericSolver v -> Var -> IO (Maybe v)+getLB solver x = do+ lb <- readIORef (svLB solver)+ return $ IntMap.lookup x lb++getUB :: GenericSolver v -> Var -> IO (Maybe v)+getUB solver x = do+ ub <- readIORef (svUB solver)+ return $ IntMap.lookup x ub++getTableau :: GenericSolver v -> IO (IntMap (LA.Expr Rational))+getTableau solver = do+ t <- readIORef (svTableau solver)+ return $ IntMap.delete objVar t++getValue :: GenericSolver v -> Var -> IO v+getValue solver x = do+ m <- readIORef (svModel solver)+ return $ m IntMap.! x++getRow :: GenericSolver v -> Var -> IO (LA.Expr Rational)+getRow solver x = do+ -- x should be basic variable or 'objVar'+ t <- readIORef (svTableau solver)+ return $! (t IntMap.! x)++-- aijが非ゼロの列も全部探しているのは効率が悪い+getCol :: SolverValue v => GenericSolver v -> Var -> IO (IntMap Rational)+getCol solver xj = do+ t <- readIORef (svTableau solver)+ return $ IntMap.mapMaybe (LA.lookupCoeff xj) t++getCoeff :: GenericSolver v -> Var -> Var -> IO Rational+getCoeff solver xi xj = do+ xi_def <- getRow solver xi+ return $! LA.coeff xj xi_def++markBad :: GenericSolver v -> IO ()+markBad solver = writeIORef (svOk solver) False++{--------------------------------------------------------------------+ utility+--------------------------------------------------------------------}++findM :: Monad m => (a -> m Bool) -> [a] -> m (Maybe a)+findM _ [] = return Nothing+findM p (x:xs) = do+ r <- p x+ if r+ then return (Just x)+ else findM p xs++testLB :: SolverValue v => Maybe v -> v -> Bool+testLB Nothing _ = True+testLB (Just l) x = l <= x++testUB :: SolverValue v => Maybe v -> v -> Bool+testUB Nothing _ = True+testUB (Just u) x = x <= u++variables :: GenericSolver v -> IO [Var]+variables solver = do+ vcnt <- nVars solver+ return [0..vcnt-1]++basicVariables :: GenericSolver v -> IO [Var]+basicVariables solver = do+ t <- readIORef (svTableau solver)+ return (IntMap.keys t)++#if !MIN_VERSION_base(4,6,0)++modifyIORef' :: IORef a -> (a -> a) -> IO ()+modifyIORef' ref f = do+ x <- readIORef ref+ writeIORef ref $! f x++#endif++recordTime :: SolverValue v => GenericSolver v -> IO a -> IO a+recordTime solver act = do+ dumpSize solver+ writeIORef (svNPivot solver) 0++ startCPU <- getCPUTime+ startWC <- getCurrentTime++ result <- act++ endCPU <- getCPUTime+ endWC <- getCurrentTime++ (log solver . printf "cpu time = %.3fs") (fromIntegral (endCPU - startCPU) / 10^(12::Int) :: Double)+ (log solver . printf "wall clock time = %.3fs") (realToFrac (endWC `diffUTCTime` startWC) :: Double)+ (log solver . printf "#pivot = %d") =<< readIORef (svNPivot solver)+ return result++showDelta :: Bool -> Delta Rational -> String+showDelta asRatio v = + case v of+ (Delta r k) -> + f r +++ case compare k 0 of+ EQ -> ""+ GT -> " + " ++ f k ++ " delta"+ LT -> " - " ++ f (abs k) ++ " delta"+ where+ f = showRational asRatio++{--------------------------------------------------------------------+ Logging+--------------------------------------------------------------------}++-- | set callback function for receiving messages.+setLogger :: GenericSolver v -> (String -> IO ()) -> IO ()+setLogger solver logger = do+ writeIORef (svLogger solver) (Just logger)++clearLogger :: GenericSolver v -> IO ()+clearLogger solver = writeIORef (svLogger solver) Nothing++log :: GenericSolver v -> String -> IO ()+log solver msg = logIO solver (return msg)++logIO :: GenericSolver v -> IO String -> IO ()+logIO solver action = do+ m <- readIORef (svLogger solver)+ case m of+ Nothing -> return ()+ Just logger -> action >>= logger++{--------------------------------------------------------------------+ debug and tests+--------------------------------------------------------------------}++test4 :: IO ()+test4 = do+ solver <- newSolver+ setLogger solver putStrLn+ x0 <- newVar solver+ x1 <- newVar solver++ writeIORef (svTableau solver) (IntMap.fromList [(x1, LA.var x0)])+ writeIORef (svLB solver) (IntMap.fromList [(x0, toValue 0), (x1, toValue 0)])+ writeIORef (svUB solver) (IntMap.fromList [(x0, toValue 2), (x1, toValue 3)])+ setObj solver (LA.fromTerms [(-1, x0)])++ ret <- optimize solver defaultOptions+ print ret+ dump solver++test5 :: IO ()+test5 = do+ solver <- newSolver+ setLogger solver putStrLn+ x0 <- newVar solver+ x1 <- newVar solver++ writeIORef (svTableau solver) (IntMap.fromList [(x1, LA.var x0)])+ writeIORef (svLB solver) (IntMap.fromList [(x0, toValue 0), (x1, toValue 0)])+ writeIORef (svUB solver) (IntMap.fromList [(x0, toValue 2), (x1, toValue 0)])+ setObj solver (LA.fromTerms [(-1, x0)])++ checkFeasibility solver++ ret <- optimize solver defaultOptions+ print ret+ dump solver++test6 :: IO ()+test6 = do+ solver <- newSolver+ setLogger solver putStrLn+ x0 <- newVar solver++ assertAtom solver (LA.constant 1 .<. LA.var x0)+ assertAtom solver (LA.constant 2 .>. LA.var x0)++ ret <- check solver+ print ret+ dump solver++ m <- model solver+ print m++dumpSize :: SolverValue v => GenericSolver v -> IO ()+dumpSize solver = do+ t <- readIORef (svTableau solver)+ let nrows = IntMap.size t - 1 -- -1 is objVar+ xs <- variables solver+ let ncols = length xs - nrows+ let nnz = sum [IntMap.size $ LA.coeffMap xi_def | (xi,xi_def) <- IntMap.toList t, xi /= objVar]+ log solver $ printf "%d rows, %d columns, %d non-zeros" nrows ncols nnz++dump :: SolverValue v => GenericSolver v -> IO ()+dump solver = do+ log solver "============="++ log solver "Tableau:"+ t <- readIORef (svTableau solver)+ log solver $ printf "obj = %s" (show (t IntMap.! objVar))+ forM_ (IntMap.toList t) $ \(xi, e) -> do+ when (xi /= objVar) $ log solver $ printf "x%d = %s" xi (show e)++ log solver ""++ log solver "Assignments and Bounds:"+ objVal <- getValue solver objVar+ log solver $ printf "beta(obj) = %s" (showValue True objVal)+ xs <- variables solver + forM_ xs $ \x -> do+ l <- getLB solver x+ u <- getUB solver x+ v <- getValue solver x+ let f Nothing = "Nothing"+ f (Just x) = showValue True x+ log solver $ printf "beta(x%d) = %s; %s <= x%d <= %s" x (showValue True v) (f l) x (f u)++ log solver ""+ log solver "Status:"+ is_fea <- isFeasible solver+ is_opt <- isOptimal solver+ log solver $ printf "Feasible: %s" (show is_fea)+ log solver $ printf "Optimal: %s" (show is_opt)++ log solver "============="++checkFeasibility :: SolverValue v => GenericSolver v -> IO ()+checkFeasibility _ | True = return ()+checkFeasibility solver = do+ xs <- variables solver+ forM_ xs $ \x -> do+ v <- getValue solver x+ l <- getLB solver x+ u <- getUB solver x+ let f Nothing = "Nothing"+ f (Just x) = showValue True x+ unless (testLB l v) $+ error (printf "(%s) <= x%d is violated; x%d = (%s)" (f l) x x (showValue True v))+ unless (testUB u v) $+ error (printf "x%d <= (%s) is violated; x%d = (%s)" x (f u) x (showValue True v))+ return ()++checkNBFeasibility :: SolverValue v => GenericSolver v -> IO ()+checkNBFeasibility _ | True = return ()+checkNBFeasibility solver = do+ xs <- variables solver+ forM_ xs $ \x -> do+ b <- isNonBasicVariable solver x+ when b $ do+ v <- getValue solver x+ l <- getLB solver x+ u <- getUB solver x+ let f Nothing = "Nothing"+ f (Just x) = showValue True x+ unless (testLB l v) $+ error (printf "checkNBFeasibility: (%s) <= x%d is violated; x%d = (%s)" (f l) x x (showValue True v))+ unless (testUB u v) $+ error (printf "checkNBFeasibility: x%d <= (%s) is violated; x%d = (%s)" x (f u) x (showValue True v))++checkOptimality :: Solver -> IO ()+checkOptimality _ | True = return ()+checkOptimality solver = do+ ret <- selectEnteringVariable solver+ case ret of+ Nothing -> return () -- optimal+ Just (_,x) -> error (printf "checkOptimality: not optimal (x%d can be changed)" x)
+ src/ToySolver/Text/GCNF.hs view
@@ -0,0 +1,93 @@+{-# OPTIONS_GHC -Wall #-}+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.Text.GCNF+-- Copyright : (c) Masahiro Sakai 2012+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : provisional+-- Portability : portable+-- +-- References:+-- +-- * <http://www.satcompetition.org/2011/rules.pdf>+--+--+-----------------------------------------------------------------------------+module ToySolver.Text.GCNF+ (+ GCNF (..)+ , GroupIndex+ , GClause++ -- * Parsing .gcnf files+ , parseString+ , parseFile+ ) where++import qualified ToySolver.SAT.Types as SAT+import ToySolver.Internal.TextUtil++data GCNF+ = GCNF+ { numVars :: !Int+ , numClauses :: !Int+ , lastGroupIndex :: !GroupIndex+ , clauses :: [GClause]+ }++type GroupIndex = Int++type GClause = (GroupIndex, SAT.Clause)++parseString :: String -> Either String GCNF+parseString s =+ case words l of+ (["p","gcnf", nbvar', nbclauses', lastGroupIndex']) ->+ Right $+ GCNF+ { numVars = read nbvar'+ , numClauses = read nbclauses'+ , lastGroupIndex = read lastGroupIndex'+ , clauses = map parseLine ls+ }+ (["p","cnf", nbvar', nbclause']) ->+ Right $+ GCNF+ { numVars = read nbvar'+ , numClauses = read nbclause'+ , lastGroupIndex = read nbclause'+ , clauses = zip [1..] $ map parseCNFLine ls+ }+ _ ->+ Left "cannot find gcnf header"+ where+ (l:ls) = filter (not . isComment) (lines s)++parseFile :: FilePath -> IO (Either String GCNF)+parseFile filename = do+ s <- readFile filename+ return $ parseString s++isComment :: String -> Bool+isComment ('c':_) = True+isComment _ = False++parseLine :: String -> GClause+parseLine s =+ case words s of+ (('{':w):xs) ->+ let ys = map readInt $ init xs+ idx = readInt $ init w+ in seq idx $ seqList ys $ (idx, ys)+ _ -> error "ToySolver.Text.GCNF: parse error"++parseCNFLine :: String -> SAT.Clause+parseCNFLine s = seq xs $ seqList xs $ xs+ where+ xs = init (map readInt (words s))++seqList :: [a] -> b -> b+seqList [] b = b+seqList (x:xs) b = seq x $ seqList xs b
+ src/ToySolver/Text/GurobiSol.hs view
@@ -0,0 +1,18 @@+module ToySolver.Text.GurobiSol+ ( Model+ , render+ ) where++import Data.Map (Map)+import qualified Data.Map as Map+import Data.Ratio++type Model = Map String Double++render :: Model -> Maybe Double -> String+render m obj = unlines $ ls1 ++ ls2+ where+ ls1 = case obj of+ Nothing -> []+ Just val -> ["# Objective value = " ++ show val]+ ls2 = [name ++ " " ++ show val | (name,val) <- Map.toList m]
+ src/ToySolver/Text/LPFile.hs view
@@ -0,0 +1,628 @@+{-# LANGUAGE OverloadedStrings #-}+{-# OPTIONS_GHC -Wall -fno-warn-unused-do-bind #-}+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.Text.LPFile+-- Copyright : (c) Masahiro Sakai 2011-2014+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : provisional+-- Portability : portable+--+-- A CPLEX .lp format parser library.+-- +-- References:+-- +-- * <http://publib.boulder.ibm.com/infocenter/cosinfoc/v12r2/index.jsp?topic=/ilog.odms.cplex.help/Content/Optimization/Documentation/CPLEX/_pubskel/CPLEX880.html>+-- +-- * <http://www.gurobi.com/doc/45/refman/node589.html>+-- +-- * <http://lpsolve.sourceforge.net/5.5/CPLEX-format.htm>+--+-----------------------------------------------------------------------------+module ToySolver.Text.LPFile+ ( parseString+ , parseFile+ , render+ ) where++import Control.Monad+import Control.Monad.Writer+import Data.Char+import Data.List+import Data.Maybe+import Data.Ratio+import Data.Map (Map)+import qualified Data.Map as Map+import Data.Set (Set)+import qualified Data.Set as Set+import Data.OptDir+import Text.ParserCombinators.Parsec hiding (label)++import qualified ToySolver.Data.MIP as MIP+import ToySolver.Internal.Util (combineMaybe)+import ToySolver.Internal.TextUtil (readUnsignedInteger)++-- ---------------------------------------------------------------------------++-- | Parse a string containing LP file data.+-- The source name is only | used in error messages and may be the empty string.+parseString :: SourceName -> String -> Either ParseError MIP.Problem+parseString = parse lpfile++-- | Parse a file containing LP file data.+parseFile :: FilePath -> IO (Either ParseError MIP.Problem)+parseFile = parseFromFile lpfile++-- ---------------------------------------------------------------------------++char' :: Char -> Parser Char+char' c = (char c <|> char (toUpper c)) <?> show c++string' :: String -> Parser ()+string' s = mapM_ char' s <?> show s++sep :: Parser ()+sep = skipMany ((comment >> return ()) <|> (space >> return ()))++comment :: Parser String+comment = do+ char '\\'+ manyTill anyChar (try newline)++tok :: Parser a -> Parser a+tok p = do+ x <- p+ sep+ return x++ident :: Parser String+ident = tok $ do+ x <- letter <|> oneOf syms1 + xs <- many (alphaNum <|> oneOf syms2)+ let s = x:xs + guard $ map toLower s `Set.notMember` reserved+ return s+ where+ syms1 = "!\"#$%&()/,;?@_`'{}|~"+ syms2 = '.' : syms1++variable :: Parser MIP.Var+variable = liftM MIP.toVar ident++label :: Parser MIP.Label+label = do+ name <- ident+ tok $ char ':'+ return name++reserved :: Set String+reserved = Set.fromList+ [ "bound", "bounds"+ , "gen", "general", "generals"+ , "bin", "binary", "binaries"+ , "semi", "semi-continuous", "semis"+ , "sos"+ , "end"+ , "subject"+ ]++-- ---------------------------------------------------------------------------++lpfile :: Parser MIP.Problem+lpfile = do+ sep+ (flag, obj) <- problem++ cs <- liftM concat $ many $ msum $+ [ liftM (map Left) constraintSection+ , liftM (map Left) lazyConstraintsSection+ , liftM (map Right) userCutsSection+ ]++ bnds <- option Map.empty (try boundsSection)+ exvs <- many (liftM Left generalSection <|> liftM Right binarySection)+ let ints = Set.fromList $ concat [x | Left x <- exvs]+ bins = Set.fromList $ concat [x | Right x <- exvs]+ bnds2 <- return $ Map.unionWith MIP.intersectBounds+ bnds (Map.fromAscList [(v, (MIP.Finite 0, MIP.Finite 1)) | v <- Set.toAscList bins])+ scs <- liftM Set.fromList $ option [] (try semiSection)++ ss <- option [] (try sosSection)+ end+ let vs = Set.unions $ map MIP.vars cs +++ [ Map.keysSet bnds2+ , ints+ , bins+ , scs+ , MIP.vars (snd obj)+ , MIP.vars ss+ ]+ isInt v = v `Set.member` ints || v `Set.member` bins+ isSemi v = v `Set.member` scs+ return $+ MIP.Problem+ { MIP.dir = flag+ , MIP.objectiveFunction = obj+ , MIP.constraints = [c | Left c <- cs]+ , MIP.userCuts = [c | Right c <- cs]+ , MIP.sosConstraints = ss+ , MIP.varInfo =+ Map.fromAscList+ [ ( v+ , MIP.VarInfo+ { MIP.varBounds = Map.findWithDefault MIP.defaultBounds v bnds2+ , MIP.varType =+ if isInt v then+ if isSemi v then MIP.SemiIntegerVariable+ else MIP.IntegerVariable+ else+ if isSemi v then MIP.SemiContinuousVariable+ else MIP.ContinuousVariable+ }+ )+ | v <- Set.toAscList vs+ ]+ }++problem :: Parser (OptDir, MIP.ObjectiveFunction)+problem = do+ flag <- (try minimize >> return OptMin)+ <|> (try maximize >> return OptMax)+ name <- optionMaybe (try label)+ obj <- expr+ return (flag, (name, obj))++minimize, maximize :: Parser ()+minimize = tok $ string' "min" >> optional (string' "imize")+maximize = tok $ string' "max" >> optional (string' "imize")++end :: Parser ()+end = tok $ string' "end"++-- ---------------------------------------------------------------------------++constraintSection :: Parser [MIP.Constraint]+constraintSection = subjectTo >> many (try (constraint False))++subjectTo :: Parser ()+subjectTo = msum+ [ try $ tok (string' "subject") >> tok (string' "to")+ , try $ tok (string' "such") >> tok (string' "that")+ , try $ tok (string' "st")+ , try $ tok (string' "s") >> optional (tok (char '.')) >> tok (string' "t")+ >> tok (char '.') >> return ()+ ]++constraint :: Bool -> Parser MIP.Constraint+constraint isLazy = do+ name <- optionMaybe (try label)++ g <- optionMaybe $ try $ do+ var <- variable+ tok (char '=')+ val <- tok ((char '0' >> return 0) <|> (char '1' >> return 1))+ tok $ string "->"+ return (var, val)++ -- It seems that CPLEX allows empty lhs, but GLPK rejects it.+ e <- expr+ op <- relOp+ s <- option 1 sign+ rhs <- number+ return $ MIP.Constraint+ { MIP.constrLabel = name+ , MIP.constrIndicator = g+ , MIP.constrBody = (e, op, s*rhs)+ , MIP.constrIsLazy = isLazy+ }++relOp :: Parser MIP.RelOp+relOp = tok $ msum+ [ char '<' >> optional (char '=') >> return MIP.Le+ , char '>' >> optional (char '=') >> return MIP.Ge+ , char '=' >> msum [ char '<' >> return MIP.Le+ , char '>' >> return MIP.Ge+ , return MIP.Eql+ ]+ ]++lazyConstraintsSection :: Parser [MIP.Constraint]+lazyConstraintsSection = do+ tok $ string' "lazy"+ tok $ string' "constraints"+ many $ try $ constraint True++userCutsSection :: Parser [MIP.Constraint]+userCutsSection = do+ tok $ string' "user"+ tok $ string' "cuts"+ many $ try $ constraint False++type Bounds2 = (Maybe MIP.BoundExpr, Maybe MIP.BoundExpr)++boundsSection :: Parser (Map MIP.Var MIP.Bounds)+boundsSection = do+ tok $ string' "bound" >> optional (char' 's')+ liftM (Map.map g . Map.fromListWith f) $ many (try bound)+ where+ f (lb1,ub1) (lb2,ub2) = (combineMaybe max lb1 lb2, combineMaybe min ub1 ub2)+ g (lb, ub) = ( fromMaybe MIP.defaultLB lb+ , fromMaybe MIP.defaultUB ub+ )++bound :: Parser (MIP.Var, Bounds2)+bound = msum+ [ try $ do+ v <- try variable+ msum+ [ do+ op <- relOp+ b <- boundExpr+ return+ ( v+ , case op of+ MIP.Le -> (Nothing, Just b)+ MIP.Ge -> (Just b, Nothing)+ MIP.Eql -> (Just b, Just b)+ )+ , do+ tok $ string' "free"+ return (v, (Just MIP.NegInf, Just MIP.PosInf))+ ]+ , do+ b1 <- liftM Just boundExpr+ op1 <- relOp+ guard $ op1 == MIP.Le+ v <- variable+ b2 <- option Nothing $ do+ op2 <- relOp+ guard $ op2 == MIP.Le+ liftM Just boundExpr+ return (v, (b1, b2))+ ]++boundExpr :: Parser MIP.BoundExpr+boundExpr = msum + [ try (tok (char '+') >> inf >> return MIP.PosInf)+ , try (tok (char '-') >> inf >> return MIP.NegInf)+ , do+ s <- option 1 sign+ x <- number+ return $ MIP.Finite (s*x)+ ]++inf :: Parser ()+inf = tok (string "inf" >> optional (string "inity"))++-- ---------------------------------------------------------------------------++generalSection :: Parser [MIP.Var]+generalSection = do+ tok $ string' "gen" >> optional (string' "eral" >> optional (string' "s"))+ many (try variable)++binarySection :: Parser [MIP.Var]+binarySection = do+ tok $ string' "bin" >> optional (string' "ar" >> (string' "y" <|> string' "ies"))+ many (try variable)++semiSection :: Parser [MIP.Var]+semiSection = do+ tok $ string' "semi" >> optional (string' "-continuous" <|> string' "s")+ many (try variable)++sosSection :: Parser [MIP.SOSConstraint]+sosSection = do+ tok $ string' "sos"+ many $ try $ do+ (l,t) <- try (do{ l <- label; t <- typ; return (Just l, t) })+ <|> (do{ t <- typ; return (Nothing, t) })+ xs <- many $ try $ do+ v <- variable+ tok $ char ':'+ w <- number+ return (v,w)+ return $ MIP.SOSConstraint l t xs+ where+ typ = do+ t <- tok $ (char' 's' >> ((char '1' >> return MIP.S1) <|> (char '2' >> return MIP.S2)))+ tok (string "::")+ return t++-- ---------------------------------------------------------------------------++expr :: Parser MIP.Expr+expr = try expr1 <|> return []+ where+ expr1 :: Parser MIP.Expr+ expr1 = do+ t <- term True+ ts <- many (term False)+ return $ concat (t : ts)++sign :: Num a => Parser a+sign = tok ((char '+' >> return 1) <|> (char '-' >> return (-1)))++term :: Bool -> Parser MIP.Expr+term flag = do+ s <- if flag then optionMaybe sign else liftM Just sign+ c <- optionMaybe number+ e <- liftM (\s' -> [MIP.Term 1 [s']]) variable <|> qexpr+ return $ case combineMaybe (*) s c of+ Nothing -> e+ Just d -> [MIP.Term (d*c') vs | MIP.Term c' vs <- e]++qexpr :: Parser MIP.Expr+qexpr = do+ tok (char '[')+ t <- qterm True+ ts <- many (qterm False)+ tok (char ']')+ -- Gurobi allows ommiting "/2"+ (do mapM_ (tok . char) "/2"+ return [MIP.Term (r / 2) vs | MIP.Term r vs <- t:ts])+ <|> return (t:ts)++qterm :: Bool -> Parser MIP.Term+qterm flag = do+ s <- if flag then optionMaybe sign else liftM Just sign+ c <- optionMaybe number+ es <- qfactor `chainl1` (tok (char '*') >> return (++))+ return $ case combineMaybe (*) s c of+ Nothing -> MIP.Term 1 es+ Just d -> MIP.Term d es++qfactor :: Parser [MIP.Var]+qfactor = do+ v <- variable+ msum [ tok (char '^') >> tok (char '2') >> return [v,v]+ , return [v]+ ]++number :: Parser Rational+number = tok $ do+ b <- (do{ x <- nat; y <- option 0 frac; return (fromInteger x + y) })+ <|> frac+ c <- option 0 e+ return (b*10^^c)+ where+ digits = many1 digit++ nat :: Parser Integer+ nat = liftM readUnsignedInteger digits++ frac :: Parser Rational+ frac = do+ char '.'+ s <- digits+ return (readUnsignedInteger s % 10^(length s))++ e :: Parser Integer+ e = do+ oneOf "eE"+ f <- msum [ char '+' >> return id+ , char '-' >> return negate+ , return id+ ]+ liftM f nat++-- ---------------------------------------------------------------------------++-- | Render a problem into a string.+render :: MIP.Problem -> Maybe String+render mip = fmap ($ "") $ execWriterT $ render' $ removeEmptyExpr mip++type M a = WriterT ShowS Maybe a++writeString :: String -> M ()+writeString s = tell $ showString s++writeChar :: Char -> M ()+writeChar c = tell $ showChar c++writeVar :: MIP.Var -> M ()+writeVar v = writeString $ MIP.fromVar v++render' :: MIP.Problem -> M ()+render' mip = do+ writeString $+ case MIP.dir mip of+ OptMin -> "MINIMIZE"+ OptMax -> "MAXIMIZE"+ writeChar '\n'++ do+ let (l, obj) = MIP.objectiveFunction mip+ renderLabel l+ renderExpr True obj+ writeChar '\n'++ writeString "SUBJECT TO\n"+ forM_ (MIP.constraints mip) $ \c -> do+ unless (MIP.constrIsLazy c) $ do+ renderConstraint c+ writeChar '\n'++ let lcs = [c | c <- MIP.constraints mip, MIP.constrIsLazy c]+ unless (null lcs) $ do+ writeString "LAZY CONSTRAINTS\n"+ forM_ lcs $ \c -> do+ renderConstraint c+ writeChar '\n'++ let cuts = [c | c <- MIP.userCuts mip]+ unless (null cuts) $ do+ writeString "USER CUTS\n"+ forM_ cuts $ \c -> do+ renderConstraint c+ writeChar '\n'++ let ivs = MIP.integerVariables mip `Set.union` MIP.semiIntegerVariables mip+ (bins,gens) = Set.partition (\v -> MIP.getBounds mip v == (MIP.Finite 0, MIP.Finite 1)) ivs+ scs = MIP.semiContinuousVariables mip `Set.union` MIP.semiIntegerVariables mip++ writeString "BOUNDS\n"+ forM_ (Map.toAscList (MIP.varInfo mip)) $ \(v, MIP.VarInfo{ MIP.varBounds = (lb,ub) }) -> do+ unless (v `Set.member` bins) $ do+ renderBoundExpr lb+ writeString " <= "+ writeVar v+ writeString " <= "+ renderBoundExpr ub+ writeChar '\n'++ unless (Set.null gens) $ do+ writeString "GENERALS\n"+ renderVariableList $ Set.toList gens++ unless (Set.null bins) $ do+ writeString "BINARIES\n"+ renderVariableList $ Set.toList bins++ unless (Set.null scs) $ do+ writeString "SEMI-CONTINUOUS\n"+ renderVariableList $ Set.toList scs++ unless (null (MIP.sosConstraints mip)) $ do+ writeString "SOS\n"+ forM_ (MIP.sosConstraints mip) $ \(MIP.SOSConstraint l typ xs) -> do+ renderLabel l+ writeString $ show typ+ writeString " ::"+ forM_ xs $ \(v, r) -> do+ writeString " "+ writeVar v+ writeString " : "+ writeString $ showValue r+ writeChar '\n'++ writeString "END\n"++-- FIXME: Gurobi は quadratic term が最後に一つある形式でないとダメっぽい+renderExpr :: Bool -> MIP.Expr -> M ()+renderExpr isObj e = fill 80 (ts1 ++ ts2)+ where+ (ts,qts) = partition isLin e + isLin (MIP.Term _ []) = True+ isLin (MIP.Term _ [_]) = True+ isLin _ = False++ ts1 = map f ts+ ts2+ | null qts = []+ | otherwise =+ -- マイナスで始めるとSCIP 2.1.1 は「cannot have '-' in front of quadratic part ('[')」というエラーを出す+ ["+ ["] ++ map g qts ++ [if isObj then "] / 2" else "]"]++ f :: MIP.Term -> String+ f (MIP.Term c []) = showConstTerm c+ f (MIP.Term c [v]) = showCoeff c ++ MIP.fromVar v+ f _ = error "should not happen"++ g :: MIP.Term -> String+ g (MIP.Term c vs) = + (if isObj then showCoeff (2*c) else showCoeff c) +++ intercalate " * " (map MIP.fromVar vs)++showValue :: Rational -> String+showValue c =+ if denominator c == 1+ then show (numerator c)+ else show (fromRational c :: Double)++showCoeff :: Rational -> String+showCoeff c =+ if c' == 1+ then s+ else s ++ showValue c' ++ " "+ where+ c' = abs c+ s = if c >= 0 then "+ " else "- "++showConstTerm :: Rational -> String+showConstTerm c = s ++ v+ where+ s = if c >= 0 then "+ " else "- "+ v = showValue (abs c)++renderLabel :: Maybe MIP.Label -> M ()+renderLabel l =+ case l of+ Nothing -> return ()+ Just s -> writeString s >> writeString ": "++renderOp :: MIP.RelOp -> M ()+renderOp MIP.Le = writeString "<="+renderOp MIP.Ge = writeString ">="+renderOp MIP.Eql = writeString "="++renderConstraint :: MIP.Constraint -> M ()+renderConstraint c@MIP.Constraint{ MIP.constrBody = (e,op,val) } = do+ renderLabel (MIP.constrLabel c)+ case MIP.constrIndicator c of+ Nothing -> return ()+ Just (v,vval) -> do+ writeVar v+ writeString " = "+ writeString $ showValue vval+ writeString " -> "++ renderExpr False e+ writeChar ' '+ renderOp op+ writeChar ' '+ writeString $ showValue val++renderBoundExpr :: MIP.BoundExpr -> M ()+renderBoundExpr (MIP.Finite r) = writeString $ showValue r+renderBoundExpr MIP.NegInf = writeString "-inf"+renderBoundExpr MIP.PosInf = writeString "+inf"++renderVariableList :: [MIP.Var] -> M ()+renderVariableList vs = fill 80 (map MIP.fromVar vs) >> writeChar '\n'++fill :: Int -> [String] -> M ()+fill width str = go str 0+ where+ go [] _ = return ()+ go (x:xs) 0 = writeString x >> go xs (length x)+ go (x:xs) w =+ if w + 1 + length x <= width+ then writeChar ' ' >> writeString x >> go xs (w + 1 + length x)+ else writeChar '\n' >> go (x:xs) 0++-- ---------------------------------------------------------------------------++{-+compileExpr :: Expr -> Maybe (Map Var Rational)+compileExpr e = do+ xs <- forM e $ \(Term c vs) ->+ case vs of+ [v] -> return (v, c)+ _ -> mzero+ return (Map.fromList xs)+-}++-- ---------------------------------------------------------------------------++removeEmptyExpr :: MIP.Problem -> MIP.Problem+removeEmptyExpr prob =+ prob+ { MIP.objectiveFunction =+ case MIP.objectiveFunction prob of+ (label, e) -> (label, convertExpr e)+ , MIP.constraints = map convertConstr $ MIP.constraints prob+ , MIP.userCuts = map convertConstr $ MIP.userCuts prob+ }+ where+ convertExpr [] = [MIP.Term 0 [MIP.toVar "x0"]]+ convertExpr e = e++ convertConstr constr =+ constr+ { MIP.constrBody =+ case MIP.constrBody constr of+ (lhs,op,rhs) -> (convertExpr lhs, op, rhs)+ }
+ src/ToySolver/Text/MPSFile.hs view
@@ -0,0 +1,843 @@+{-# OPTIONS_GHC -Wall -fno-warn-unused-do-bind #-}+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.Text.MPSFile+-- Copyright : (c) Masahiro Sakai 2012-2014+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : provisional+-- Portability : portable+--+-- A .mps format parser library.+-- +-- References:+-- +-- * <http://pic.dhe.ibm.com/infocenter/cosinfoc/v12r4/topic/ilog.odms.cplex.help/CPLEX/File_formats_reference/topics/MPS_synopsis.html>+-- +-- * <http://pic.dhe.ibm.com/infocenter/cosinfoc/v12r4/topic/ilog.odms.cplex.help/CPLEX/File_formats_reference/topics/MPS_ext_synopsis.html>+-- +-- * <http://www.gurobi.com/documentation/5.0/reference-manual/node744>+--+-- * <http://en.wikipedia.org/wiki/MPS_(format)>+--+-----------------------------------------------------------------------------+module ToySolver.Text.MPSFile+ ( parseString+ , parseFile+ , render+ ) where++import Control.Monad+import Control.Monad.Writer+import Data.Maybe+import Data.Set (Set)+import qualified Data.Set as Set+import Data.Map (Map)+import qualified Data.Map as Map+import Data.Ratio+import Data.Interned+import Data.Interned.String++import qualified Text.ParserCombinators.Parsec as P+import Text.ParserCombinators.Parsec hiding (spaces, newline, Column)+import Text.Printf++import Data.OptDir+import qualified ToySolver.Data.MIP as MIP+import ToySolver.Internal.TextUtil (readUnsignedInteger)++type Column = MIP.Var+type Row = InternedString++data BoundType+ = LO -- lower bound+ | UP -- upper bound+ | FX -- variable is fixed at the specified value+ | FR -- free variable (no lower or upper bound)+ | MI -- infinite lower bound+ | PL -- infinite upper bound+ | BV -- variable is binary (equal 0 or 1)+ | LI -- lower bound for integer variable+ | UI -- upper bound for integer variable+ | SC -- upper bound for semi-continuous variable+ | SI -- upper bound for semi-integer variable+ deriving (Eq, Ord, Show, Read, Enum, Bounded)++-- ---------------------------------------------------------------------------++-- | Parse a string containing LP file data.+-- The source name is only | used in error messages and may be the empty string.+parseString :: SourceName -> String -> Either ParseError MIP.Problem+parseString = parse mpsfile++-- | Parse a file containing LP file data.+parseFile :: FilePath -> IO (Either ParseError MIP.Problem)+parseFile = parseFromFile mpsfile++-- ---------------------------------------------------------------------------++space' :: Parser Char+space' = oneOf [' ', '\t']++spaces' :: Parser ()+spaces' = skipMany space'++spaces1' :: Parser ()+spaces1' = skipMany1 space'++commentline :: Parser ()+commentline = do+ _ <- char '*'+ _ <- manyTill anyChar P.newline+ return ()++newline' :: Parser ()+newline' = do+ spaces'+ _ <- P.newline+ skipMany commentline+ return ()++tok :: Parser a -> Parser a+tok p = do+ x <- p+ msum [spaces1', lookAhead (try (char '\n' >> return ())), eof]+ return x++row :: Parser Row+row = liftM intern ident++column :: Parser Column+column = liftM MIP.toVar ident++ident :: Parser String+ident = tok $ many1 $ noneOf [' ', '\t', '\n']++stringLn :: String -> Parser ()+stringLn s = string s >> newline'++sign :: Num a => Parser a+sign = (char '+' >> return 1) <|> (char '-' >> return (-1))++number :: Parser Rational+number = tok $ do+ b <- (do{ s <- option 1 sign; x <- nat; y <- option 0 frac; return (s * (fromInteger x + y)) })+ <|> frac+ c <- option 0 e+ return (b*10^^c)+ where+ digits = many1 digit++ nat :: Parser Integer+ nat = liftM readUnsignedInteger digits++ frac :: Parser Rational+ frac = do+ char '.'+ s <- digits+ return (readUnsignedInteger s % 10^(length s))++ e :: Parser Integer+ e = do+ oneOf "eE"+ f <- msum [ char '+' >> return id+ , char '-' >> return negate+ , return id+ ]+ liftM f nat++-- ---------------------------------------------------------------------------++mpsfile :: Parser MIP.Problem+mpsfile = do+ many commentline++ _name <- nameSection++ -- http://pic.dhe.ibm.com/infocenter/cosinfoc/v12r4/topic/ilog.odms.cplex.help/CPLEX/File_formats_reference/topics/MPS_ext_objsen.html+ -- CPLEX extends the MPS standard by allowing two additional sections: OBJSEN and OBJNAME.+ -- If these options are used, they must appear in order and as the first and second sections after the NAME section. + objsense <- optionMaybe $ objSenseSection+ objname <- optionMaybe $ objNameSection++ rows <- rowsSection++ -- http://pic.dhe.ibm.com/infocenter/cosinfoc/v12r4/topic/ilog.odms.cplex.help/CPLEX/File_formats_reference/topics/MPS_ext_usercuts.html+ -- The order of sections must be ROWS USERCUTS. + usercuts <- option [] userCutsSection++ -- http://pic.dhe.ibm.com/infocenter/cosinfoc/v12r4/topic/ilog.odms.cplex.help/CPLEX/File_formats_reference/topics/MPS_ext_lazycons.html+ -- The order of sections must be ROWS USERCUTS LAZYCONS.+ lazycons <- option [] lazyConsSection++ (cols, intvs1) <- colsSection+ rhss <- rhsSection+ rngs <- option Map.empty rangesSection+ bnds <- option [] boundsSection++ -- http://pic.dhe.ibm.com/infocenter/cosinfoc/v12r4/topic/ilog.odms.cplex.help/CPLEX/File_formats_reference/topics/MPS_ext_quadobj.html+ -- Following the BOUNDS section, a QMATRIX section may be specified.+ qobj <- msum [quadObjSection, qMatrixSection, return []]++ -- http://pic.dhe.ibm.com/infocenter/cosinfoc/v12r4/topic/ilog.odms.cplex.help/CPLEX/File_formats_reference/topics/MPS_ext_sos.html+ -- Note that in an MPS file, the SOS section must follow the BOUNDS section.+ sos <- option [] sosSection++ -- http://pic.dhe.ibm.com/infocenter/cosinfoc/v12r4/topic/ilog.odms.cplex.help/CPLEX/File_formats_reference/topics/MPS_ext_qcmatrix.html+ -- QCMATRIX sections appear after the optional SOS section. + qterms <- liftM Map.fromList $ many qcMatrixSection++ -- http://pic.dhe.ibm.com/infocenter/cosinfoc/v12r4/topic/ilog.odms.cplex.help/CPLEX/File_formats_reference/topics/MPS_ext_indicators.html+ -- The INDICATORS section follows any quadratic constraint section and any quadratic objective section.+ inds <- option Map.empty indicatorsSection++ string "ENDATA"++ let objrow =+ case objname of+ Nothing -> head [r | (Nothing, r) <- rows] -- XXX+ Just r -> intern r+ objdir =+ case objsense of+ Nothing -> OptMin+ Just d -> d+ vs = Map.keysSet cols+ intvs2 = Set.fromList [col | (t,col,_) <- bnds, t `elem` [BV,LI,UI]]+ scvs = Set.fromList [col | (SC,col,_) <- bnds]+ sivs = Set.fromList [col | (SI,col,_) <- bnds]++ let explicitBounds = Map.fromListWith f+ [ case typ of+ LO -> (col, (Just (MIP.Finite val), Nothing))+ UP -> (col, (Nothing, Just (MIP.Finite val)))+ FX -> (col, (Just (MIP.Finite val), Just (MIP.Finite val)))+ FR -> (col, (Just MIP.NegInf, Just MIP.PosInf))+ MI -> (col, (Just MIP.NegInf, Nothing))+ PL -> (col, (Nothing, Just MIP.PosInf))+ BV -> (col, (Just (MIP.Finite 0), Just (MIP.Finite 1)))+ LI -> (col, (Just (MIP.Finite val), Nothing))+ UI -> (col, (Nothing, Just (MIP.Finite val)))+ SC -> (col, (Nothing, Just (MIP.Finite val)))+ SI -> (col, (Nothing, Just (MIP.Finite val)))+ | (typ,col,val) <- bnds ]+ where+ f (a1,b1) (a2,b2) = (g a1 a2, g b1 b2)+ g _ (Just x) = Just x+ g x Nothing = x++ let bounds = Map.fromList+ [ case Map.lookup v explicitBounds of+ Nothing ->+ if v `Set.member` intvs1+ then+ -- http://eaton.math.rpi.edu/cplex90html/reffileformatscplex/reffileformatscplex9.html+ -- If no bounds are specified for the variables within markers, bounds of 0 (zero) and 1 (one) are assumed.+ (v, (MIP.Finite 0, MIP.Finite 1))+ else+ (v, (MIP.Finite 0, MIP.PosInf))+ Just (Nothing, Just (MIP.Finite ub)) | ub < 0 ->+ {-+ http://pic.dhe.ibm.com/infocenter/cosinfoc/v12r4/topic/ilog.odms.cplex.help/CPLEX/File_formats_reference/topics/MPS_records.html+ If no bounds are specified, CPLEX assumes a lower+ bound of 0 (zero) and an upper bound of +∞. If only a+ single bound is specified, the unspecified bound+ remains at 0 or +∞, whichever applies, with one+ exception. If an upper bound of less than 0 is+ specified and no other bound is specified, the lower+ bound is automatically set to -∞. CPLEX deviates+ slightly from a convention used by some MPS readers+ when it encounters an upper bound of 0 (zero). Rather+ than automatically set this variable’s lower bound to+ -∞, CPLEX accepts both a lower and upper bound of 0,+ effectively fixing that variable at 0. CPLEX resets+ the lower bound to -∞ only if the upper bound is less+ than 0. A warning message is issued when this+ exception is encountered.+ -}+ (v, (MIP.NegInf, MIP.Finite ub))+ {-+ lp_solve uses 1 as default lower bound for semi-continuous variable.+ <http://lpsolve.sourceforge.net/5.5/mps-format.htm>+ But Gurobi Optimizer uses 0 as default lower bound for semi-continuous variable.+ Here we adopt Gurobi's way.+ -}+{-+ Just (Nothing, ub) | v `Set.member` scvs ->+ (v, (MIP.Finite 1, fromMaybe MIP.PosInf ub))+-}+ Just (lb,ub) ->+ (v, (fromMaybe (MIP.Finite 0) lb, fromMaybe MIP.PosInf ub))+ | v <- Set.toList vs ]++ let rowCoeffs :: Map Row (Map Column Rational)+ rowCoeffs = Map.fromListWith Map.union [(row, Map.singleton col coeff) | (col,m) <- Map.toList cols, (row,coeff) <- Map.toList m]++ let f :: Bool -> (Maybe MIP.RelOp, Row) -> [MIP.Constraint]+ f _isLazy (Nothing, _row) = mzero+ f isLazy (Just op, row) = do+ let lhs = [MIP.Term c [col] | (col,c) <- Map.toList (Map.findWithDefault Map.empty row rowCoeffs)]+ ++ Map.findWithDefault [] row qterms+ let rhs = Map.findWithDefault 0 row rhss+ (op2,rhs2) <-+ case Map.lookup row rngs of+ Nothing -> return (op, rhs)+ Just rng ->+ case op of+ MIP.Ge -> [(MIP.Ge, rhs), (MIP.Le, rhs + abs rng)]+ MIP.Le -> [(MIP.Ge, rhs - abs rng), (MIP.Le, rhs)]+ MIP.Eql ->+ if rng < 0+ then [(MIP.Ge, rhs + rng), (MIP.Le, rhs)]+ else [(MIP.Ge, rhs), (MIP.Le, rhs + rng)]+ return $+ MIP.Constraint+ { MIP.constrLabel = Just $ unintern row+ , MIP.constrIndicator = Map.lookup row inds+ , MIP.constrIsLazy = isLazy+ , MIP.constrBody = (lhs, op2, rhs2)+ }++ let mip =+ MIP.Problem+ { MIP.dir = objdir+ , MIP.objectiveFunction =+ ( Just (unintern objrow)+ , [MIP.Term c [col] | (col,m) <- Map.toList cols, c <- maybeToList (Map.lookup objrow m)] ++ qobj+ )+ , MIP.constraints = concatMap (f False) rows ++ concatMap (f True) lazycons+ , MIP.sosConstraints = sos+ , MIP.userCuts = concatMap (f False) usercuts+ , MIP.varInfo =+ Map.fromAscList+ [ ( v+ , MIP.VarInfo+ { MIP.varBounds = Map.findWithDefault MIP.defaultBounds v bounds+ , MIP.varType =+ if v `Set.member` sivs then+ MIP.SemiIntegerVariable+ else if v `Set.member` intvs1 && v `Set.member` scvs then+ MIP.SemiIntegerVariable+ else if v `Set.member` intvs1 || v `Set.member` intvs2 then+ MIP.IntegerVariable+ else if v `Set.member` scvs then+ MIP.SemiContinuousVariable+ else+ MIP.ContinuousVariable+ }+ )+ | v <- Set.toAscList vs+ ]+ }++ return mip++nameSection :: Parser (Maybe String)+nameSection = do+ string "NAME"+ n <- optionMaybe $ try $ do+ spaces1'+ ident+ newline'+ return n++objSenseSection :: Parser OptDir+objSenseSection = do+ try $ stringLn "OBJSENSE"+ spaces1'+ d <- (try (stringLn "MAX") >> return OptMax)+ <|> (stringLn "MIN" >> return OptMin)+ return d++objNameSection :: Parser String+objNameSection = do+ try $ stringLn "OBJNAME"+ spaces1'+ name <- ident+ newline'+ return name++rowsSection :: Parser [(Maybe MIP.RelOp, Row)]+rowsSection = do+ try $ stringLn "ROWS"+ rowsBody++userCutsSection :: Parser [(Maybe MIP.RelOp, Row)]+userCutsSection = do+ try $ stringLn "USERCUTS"+ rowsBody++lazyConsSection :: Parser [(Maybe MIP.RelOp, Row)]+lazyConsSection = do+ try $ stringLn "LAZYCONS"+ rowsBody++rowsBody :: Parser [(Maybe MIP.RelOp, Row)]+rowsBody = many $ do+ spaces1'+ op <- msum+ [ char 'N' >> return Nothing+ , char 'G' >> return (Just MIP.Ge)+ , char 'L' >> return (Just MIP.Le)+ , char 'E' >> return (Just MIP.Eql)+ ]+ spaces1'+ name <- row+ newline'+ return (op, name)++colsSection :: Parser (Map Column (Map Row Rational), Set Column)+colsSection = do+ try $ stringLn "COLUMNS"+ body False Map.empty Set.empty+ where+ body :: Bool -> Map Column (Map Row Rational) -> Set Column -> Parser (Map Column (Map Row Rational), Set Column)+ body isInt rs ivs = msum+ [ do isInt' <- try intMarker+ body isInt' rs ivs+ , do (k,v) <- entry+ let rs' = Map.insertWith Map.union k v rs+ ivs' = if isInt then Set.insert k ivs else ivs+ seq rs' $ seq ivs' $ body isInt rs' ivs'+ , return (rs, ivs)+ ]++ intMarker :: Parser Bool+ intMarker = do+ spaces1'+ _marker <- ident + string "'MARKER'"+ spaces1'+ b <- (try (string "'INTORG'") >> return True)+ <|> (string "'INTEND'" >> return False)+ newline'+ return b++ entry :: Parser (Column, Map Row Rational)+ entry = do+ spaces1'+ col <- column+ rv1 <- rowAndVal+ opt <- optionMaybe rowAndVal+ newline'+ case opt of+ Nothing -> return (col, rv1)+ Just rv2 -> return (col, Map.union rv1 rv2)++rowAndVal :: Parser (Map Row Rational)+rowAndVal = do+ r <- row+ val <- number+ return $ Map.singleton r val++rhsSection :: Parser (Map Row Rational)+rhsSection = do+ try $ stringLn "RHS"+ liftM Map.unions $ many entry+ where+ entry = do+ spaces1'+ _name <- ident+ rv1 <- rowAndVal+ opt <- optionMaybe rowAndVal+ newline'+ case opt of+ Nothing -> return rv1+ Just rv2 -> return $ Map.union rv1 rv2++rangesSection :: Parser (Map Row Rational)+rangesSection = do+ try $ stringLn "RANGES"+ liftM Map.unions $ many entry+ where+ entry = do+ spaces1'+ _name <- ident+ rv1 <- rowAndVal+ opt <- optionMaybe rowAndVal+ newline'+ case opt of+ Nothing -> return rv1+ Just rv2 -> return $ Map.union rv1 rv2++boundsSection :: Parser [(BoundType, Column, Rational)]+boundsSection = do+ try $ stringLn "BOUNDS"+ many entry+ where+ entry = do+ spaces1'+ typ <- boundType+ _name <- ident+ col <- column+ val <- if typ `elem` [FR, BV, MI, PL]+ then return 0+ else number+ newline'+ return (typ, col, val)++boundType :: Parser BoundType+boundType = tok $ do+ msum [try (string (show k)) >> return k | k <- [minBound..maxBound]]++sosSection :: Parser [MIP.SOSConstraint]+sosSection = do+ try $ stringLn "SOS"+ many entry+ where+ entry = do+ spaces1'+ typ <- (try (string "S1") >> return MIP.S1)+ <|> (string "S2" >> return MIP.S2)+ spaces1'+ name <- ident+ newline'+ xs <- many (try identAndVal)+ return $ MIP.SOSConstraint{ MIP.sosLabel = Just name, MIP.sosType = typ, MIP.sosBody = xs }++ identAndVal :: Parser (Column, Rational)+ identAndVal = do+ spaces1'+ col <- column+ val <- number+ newline'+ return (col, val)++quadObjSection :: Parser [MIP.Term]+quadObjSection = do+ try $ stringLn "QUADOBJ"+ many entry+ where+ entry = do+ spaces1'+ col1 <- column+ col2 <- column+ val <- number+ newline'+ return $ MIP.Term (if col1 /= col2 then val else val / 2) [col1, col2]++qMatrixSection :: Parser [MIP.Term]+qMatrixSection = do+ try $ stringLn "QMATRIX"+ many entry+ where+ entry = do+ spaces1'+ col1 <- column+ col2 <- column+ val <- number+ newline'+ return $ MIP.Term (val / 2) [col1, col2]++qcMatrixSection :: Parser (Row, [MIP.Term])+qcMatrixSection = do+ try $ string "QCMATRIX"+ spaces1'+ r <- row+ newline'+ xs <- many entry+ return (r, xs)+ where+ entry = do+ spaces1'+ col1 <- column+ col2 <- column+ val <- number+ newline'+ return $ MIP.Term val [col1, col2]++indicatorsSection :: Parser (Map Row (Column, Rational))+indicatorsSection = do+ try $ stringLn "INDICATORS"+ liftM Map.fromList $ many entry+ where+ entry = do+ spaces1'+ string "IF"+ spaces1'+ r <- row+ var <- column+ val <- number+ newline'+ return (r, (var, val))++-- ---------------------------------------------------------------------------++render :: MIP.Problem -> Maybe String+render mip = fmap ($ "") $ execWriterT $ do+ guard $ checkAtMostQuadratic mip+ render' $ nameRows $ mip++type M a = WriterT ShowS Maybe a++render' :: MIP.Problem -> M ()+render' mip = do+ let probName = ""++ -- NAME section+ -- The name starts in column 15 in fixed formats.+ writeSectionHeader $ "NAME" ++ replicate 10 ' ' ++ probName++ -- OBJSENSE section+ -- Note: GLPK-4.48 does not support this section.+ writeSectionHeader "OBJSENSE"+ case MIP.dir mip of+ OptMin -> writeFields ["MIN"]+ OptMax -> writeFields ["MAX"]++ let (Just objName, obj) = MIP.objectiveFunction mip++{-+ -- OBJNAME section+ -- Note: GLPK-4.48 does not support this section.+ writeSectionHeader "OBJNAME"+ writeFields [objName]+-}++ let renderRows cs = do+ forM_ cs $ \c -> do+ let (_,op,_) = MIP.constrBody c+ let s = case op of+ MIP.Le -> "L"+ MIP.Ge -> "G"+ MIP.Eql -> "E"+ writeFields [s, fromJust $ MIP.constrLabel c]++ -- ROWS section+ writeSectionHeader "ROWS"+ writeFields ["N", objName]+ renderRows [c | c <- MIP.constraints mip, not (MIP.constrIsLazy c)]++ -- USERCUTS section+ unless (null (MIP.userCuts mip)) $ do+ writeSectionHeader "USERCUTS"+ renderRows (MIP.userCuts mip)++ -- LAZYCONS section+ let lcs = [c | c <- MIP.constraints mip, MIP.constrIsLazy c]+ unless (null lcs) $ do+ writeSectionHeader "LAZYCONS"+ renderRows lcs++ -- COLUMNS section+ writeSectionHeader "COLUMNS"+ let cols :: Map Column (Map String Rational)+ cols = Map.fromListWith Map.union+ [ (v, Map.singleton l d)+ | (Just l, xs) <-+ MIP.objectiveFunction mip :+ [(MIP.constrLabel c, lhs) | c <- MIP.constraints mip ++ MIP.userCuts mip, let (lhs,_,_) = MIP.constrBody c]+ , MIP.Term d [v] <- xs+ ]+ f col xs =+ forM_ (Map.toList xs) $ \(row, d) -> do+ writeFields ["", unintern col, row, showValue d]+ ivs = MIP.integerVariables mip `Set.union` MIP.semiIntegerVariables mip+ forM_ (Map.toList (Map.filterWithKey (\col _ -> col `Set.notMember` ivs) cols)) $ \(col, xs) -> f col xs+ unless (Set.null ivs) $ do+ writeFields ["", "MARK0000", "'MARKER'", "", "'INTORG'"]+ forM_ (Map.toList (Map.filterWithKey (\col _ -> col `Set.member` ivs) cols)) $ \(col, xs) -> f col xs+ writeFields ["", "MARK0001", "'MARKER'", "", "'INTEND'"]++ -- RHS section+ let rs = [(fromJust $ MIP.constrLabel c, rhs) | c <- MIP.constraints mip ++ MIP.userCuts mip, let (_,_,rhs) = MIP.constrBody c, rhs /= 0]+ writeSectionHeader "RHS"+ forM_ rs $ \(name, val) -> do+ writeFields ["", "rhs", name, showValue val]++ -- BOUNDS section+ writeSectionHeader "BOUNDS"+ forM_ (Map.keys cols) $ \col -> do+ let (lb,ub) = MIP.getBounds mip col+ vt = MIP.getVarType mip col+ case (lb,ub) of+ (MIP.NegInf, MIP.PosInf) -> do+ -- free variable (no lower or upper bound)+ writeFields ["FR", "bound", unintern col]+ + (MIP.Finite 0, MIP.Finite 1) | vt == MIP.IntegerVariable -> do+ -- variable is binary (equal 0 or 1)+ writeFields ["BV", "bound", unintern col] ++ (MIP.Finite a, MIP.Finite b) | a == b -> do+ -- variable is fixed at the specified value+ writeFields ["FX", "bound", unintern col, showValue a]++ _ -> do+ case lb of+ MIP.PosInf -> error "should not happen"+ MIP.NegInf -> do+ -- Minus infinity+ writeFields ["MI", "bound", unintern col]+ MIP.Finite 0 | vt == MIP.ContinuousVariable -> return ()+ MIP.Finite a -> do+ let t = case vt of+ MIP.IntegerVariable -> "LI" -- lower bound for integer variable+ _ -> "LO" -- Lower bound+ writeFields [t, "bound", unintern col, showValue a]++ case ub of+ MIP.NegInf -> error "should not happen"+ MIP.PosInf | vt == MIP.ContinuousVariable -> return ()+ MIP.PosInf -> do+ when (vt == MIP.SemiContinuousVariable || vt == MIP.SemiIntegerVariable) $+ error "cannot express +inf upper bound of semi-continuous or semi-integer variable"+ writeFields ["PL", "bound", unintern col] -- Plus infinity+ MIP.Finite a -> do+ let t = case vt of+ MIP.SemiContinuousVariable -> "SC" -- Upper bound for semi-continuous variable+ MIP.SemiIntegerVariable ->+ -- Gurobi uses "SC" while lpsolve uses "SI" for upper bound of semi-integer variable+ "SC"+ MIP.IntegerVariable -> "UI" -- Upper bound for integer variable+ _ -> "UP" -- Upper bound+ writeFields [t, "bound", unintern col, showValue a]++ -- QMATRIX section+ -- Gurobiは対称行列になっていないと "qmatrix isn't symmetric" というエラーを発生させる+ let qm = Map.map (2*) $ quadMatrix obj+ unless (Map.null qm) $ do+ writeSectionHeader "QMATRIX"+ forM_ (Map.toList qm) $ \(((v1,v2), val)) -> do+ writeFields ["", unintern v1, unintern v2, showValue val]++ -- SOS section+ unless (null (MIP.sosConstraints mip)) $ do+ writeSectionHeader "SOS"+ forM_ (MIP.sosConstraints mip) $ \sos -> do+ let t = case MIP.sosType sos of+ MIP.S1 -> "S1"+ MIP.S2 -> "S2"+ writeFields $ t : maybeToList (MIP.sosLabel sos)+ forM_ (MIP.sosBody sos) $ \(var,val) -> do+ writeFields ["", unintern var, showValue val]++ -- QCMATRIX section+ let xs = [ (fromJust $ MIP.constrLabel c, qm)+ | c <- MIP.constraints mip ++ MIP.userCuts mip+ , let (lhs,_,_) = MIP.constrBody c+ , let qm = quadMatrix lhs+ , not (Map.null qm) ]+ unless (null xs) $ do+ forM_ xs $ \(row, qm) -> do+ -- The name starts in column 12 in fixed formats.+ writeSectionHeader $ "QCMATRIX" ++ replicate 3 ' ' ++ row+ forM_ (Map.toList qm) $ \((v1,v2), val) -> do+ writeFields ["", unintern v1, unintern v2, showValue val]++ -- INDICATORS section+ -- Note: Gurobi-5.6.3 does not support this section.+ let ics = [c | c <- MIP.constraints mip, isJust $ MIP.constrIndicator c]+ unless (null ics) $ do+ writeSectionHeader "INDICATORS"+ forM_ ics $ \c -> do+ let Just (var,val) = MIP.constrIndicator c+ writeFields ["IF", fromJust (MIP.constrLabel c), unintern var, showValue val]++ -- ENDATA section+ writeSectionHeader "ENDATA"++writeString :: String -> M ()+writeString s = tell $ showString s++writeChar :: Char -> M ()+writeChar c = tell $ showChar c++writeSectionHeader :: String -> M ()+writeSectionHeader s = writeString s >> writeChar '\n'++-- Fields start in column 2, 5, 15, 25, 40 and 50+writeFields :: [String] -> M ()+writeFields xs = f1 xs >> writeChar '\n'+ where+ -- columns 1-4+ f1 [] = return ()+ f1 [x] = writeString (' ' : x)+ f1 (x:xs) = do+ writeString $ printf " %-2s " x+ f2 xs++ -- columns 5-14+ f2 [] = return ()+ f2 [x] = writeString x+ f2 (x:xs) = do+ writeString $ printf "%-9s " x+ f3 xs++ -- columns 15-24+ f3 [] = return ()+ f3 [x] = writeString x+ f3 (x:xs) = do+ writeString $ printf "%-9s " x+ f4 xs++ -- columns 25-39+ f4 [] = return ()+ f4 [x] = writeString x+ f4 (x:xs) = do+ writeString $ printf "%-14s " x+ f5 xs++ -- columns 40-49+ f5 [] = return ()+ f5 [x] = writeString x+ f5 (x:xs) = do+ writeString $ printf "%-19s " x+ f6 xs++ -- columns 50-+ f6 [] = return ()+ f6 [x] = writeString x+ f6 _ = mzero++showValue :: Rational -> String+showValue c =+ if denominator c == 1+ then show (numerator c)+ else show (fromRational c :: Double)+ +nameRows :: MIP.Problem -> MIP.Problem+nameRows mip+ = mip+ { MIP.objectiveFunction = (Just objName', obj)+ , MIP.constraints = f (MIP.constraints mip) ["row" ++ show n | n <- [(1::Int)..]]+ , MIP.userCuts = f (MIP.userCuts mip) ["usercut" ++ show n | n <- [(1::Int)..]]+ , MIP.sosConstraints = g (MIP.sosConstraints mip) ["sos" ++ show n | n <- [(1::Int)..]]+ }+ where+ (objName, obj) = MIP.objectiveFunction mip+ used = Set.fromList $ catMaybes $ objName : [MIP.constrLabel c | c <- MIP.constraints mip ++ MIP.userCuts mip] ++ [MIP.sosLabel c | c <- MIP.sosConstraints mip]+ objName' = fromMaybe (head [name | n <- [(1::Int)..], let name = "obj" ++ show n, name `Set.notMember` used]) objName++ f [] _ = []+ f (c:cs) (name:names)+ | isJust (MIP.constrLabel c) = c : f cs (name:names)+ | name `Set.notMember` used = c{ MIP.constrLabel = Just name } : f cs names+ | otherwise = f (c:cs) names++ g [] _ = []+ g (c:cs) (name:names)+ | isJust (MIP.sosLabel c) = c : g cs (name:names)+ | name `Set.notMember` used = c{ MIP.sosLabel = Just name } : g cs names+ | otherwise = g (c:cs) names++quadMatrix :: MIP.Expr -> Map (MIP.Var, MIP.Var) Rational+quadMatrix e = Map.fromList $ do+ let m = Map.fromListWith (+) [(if v1<=v2 then (v1,v2) else (v2,v1), c) | MIP.Term c [v1,v2] <- e]+ ((v1,v2),c) <- Map.toList m+ if v1==v2 then+ [((v1,v2), c)]+ else+ [((v1,v2), c/2), ((v2,v1), c/2)]++checkAtMostQuadratic :: MIP.Problem -> Bool+checkAtMostQuadratic mip = all (all f) es+ where+ es = snd (MIP.objectiveFunction mip) :+ [lhs | c <- MIP.constraints mip ++ MIP.userCuts mip, let (lhs,_,_) = MIP.constrBody c]+ f :: MIP.Term -> Bool+ f (MIP.Term _ [_]) = True+ f (MIP.Term _ [_,_]) = True+ f _ = False++-- ---------------------------------------------------------------------------
+ src/ToySolver/Text/MaxSAT.hs view
@@ -0,0 +1,181 @@+{-# LANGUAGE OverloadedStrings #-}+{-# OPTIONS_GHC -Wall #-}+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.Text.MaxSAT+-- Copyright : (c) Masahiro Sakai 2012+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : provisional+-- Portability : portable+-- +-- References:+-- +-- * <http://maxsat.ia.udl.cat/requirements/>+--+-----------------------------------------------------------------------------+module ToySolver.Text.MaxSAT+ (+ WCNF (..)+ , WeightedClause+ , Weight++ -- * Parsing .cnf/.wcnf files+ , parseFile+ , parseString+ , parseByteString+ ) where++import qualified Data.ByteString.Lazy.Char8 as BS+import Data.Char+import qualified ToySolver.SAT.Types as SAT+import ToySolver.Internal.TextUtil++data WCNF+ = WCNF+ { numVars :: !Int+ , numClauses :: !Int+ , topCost :: !Weight+ , clauses :: [WeightedClause]+ }++type WeightedClause = (Weight, SAT.Clause)++-- | Weigths must be greater than or equal to 1, and smaller than 2^63.+type Weight = Integer++parseFile :: FilePath -> IO (Either String WCNF)+parseFile filename = do+{-+ s <- readFile filename+ return $ parseString s+-}+ s <- BS.readFile filename+ return $ parseByteString s++parseString :: String -> Either String WCNF+parseString s =+ case words l of+ (["p","wcnf", nvar, nclause, top]) ->+ Right $+ WCNF+ { numVars = read nvar+ , numClauses = read nclause+ , topCost = read top+ , clauses = map parseWCNFLine ls+ }+ (["p","wcnf", nvar, nclause]) ->+ Right $+ WCNF+ { numVars = read nvar+ , numClauses = read nclause+ -- top must be greater than the sum of the weights of violated soft clauses.+ , topCost = fromInteger $ 2^(63::Int) - 1+ , clauses = map parseWCNFLine ls+ }+ (["p","cnf", nvar, nclause]) ->+ Right $+ WCNF+ { numVars = read nvar+ , numClauses = read nclause+ -- top must be greater than the sum of the weights of violated soft clauses.+ , topCost = fromInteger $ 2^(63::Int) - 1+ , clauses = map parseCNFLine ls+ }+ _ ->+ Left "cannot find wcnf/cnf header"+ where+ (l:ls) = filter (not . isComment) (lines s)++isComment :: String -> Bool+isComment ('c':_) = True+isComment _ = False++parseWCNFLine :: String -> WeightedClause+parseWCNFLine s =+ case words s of+ (w:xs)+ | last xs == "0" -> seq w' $ seqList ys $ (w', ys)+ | otherwise -> error "ToySolver.Text.MaxSAT: parse error"+ where+ w' = readUnsignedInteger w+ ys = map readInt $ init xs+ _ -> error "ToySolver.Text.MaxSAT: parse error"++parseCNFLine :: String -> WeightedClause+parseCNFLine s+ | null xs || last xs /= 0 = error "ToySolver.Text.MaxSAT: parse error"+ | otherwise = seqList ys $ (1, ys)+ where+ xs = map readInt (words s)+ ys = init xs++parseByteString :: BS.ByteString -> Either String WCNF+parseByteString s =+ case BS.words l of+ (["p","wcnf", nvar, nclause, top]) ->+ Right $+ WCNF+ { numVars = read $ BS.unpack nvar+ , numClauses = read $ BS.unpack nclause+ , topCost = read $ BS.unpack top+ , clauses = map parseWCNFLineBS ls+ }+ (["p","wcnf", nvar, nclause]) ->+ Right $+ WCNF+ { numVars = read $ BS.unpack nvar+ , numClauses = read $ BS.unpack nclause+ -- top must be greater than the sum of the weights of violated soft clauses.+ , topCost = fromInteger $ 2^(63::Int) - 1+ , clauses = map parseWCNFLineBS ls+ }+ (["p","cnf", nvar, nclause]) ->+ Right $+ WCNF+ { numVars = read $ BS.unpack nvar+ , numClauses = read $ BS.unpack nclause+ -- top must be greater than the sum of the weights of violated soft clauses.+ , topCost = fromInteger $ 2^(63::Int) - 1+ , clauses = map parseCNFLineBS ls+ }+ _ ->+ Left "cannot find wcnf/cnf header"+ where+ l :: BS.ByteString+ ls :: [BS.ByteString]+ (l:ls) = filter (not . isCommentBS) (BS.lines s)++parseWCNFLineBS :: BS.ByteString -> WeightedClause+parseWCNFLineBS s =+ case BS.readInteger (BS.dropWhile isSpace s) of+ Nothing -> error "ToySolver.Text.MaxSAT: no weight"+ Just (w, s') -> seq w $ seq xs $ (w, xs)+ where+ xs = parseClauseBS s'++parseCNFLineBS :: BS.ByteString -> WeightedClause+parseCNFLineBS s = seq xs $ (1, xs)+ where+ xs = parseClauseBS s++parseClauseBS :: BS.ByteString -> SAT.Clause+parseClauseBS s = seqList xs $ xs+ where+ xs = go s+ go s =+ case BS.readInt (BS.dropWhile isSpace s) of+ Nothing -> error "ToySolver.Text.MaxSAT: parse error"+ Just (0,_) -> []+ Just (i,s') -> i : go s'++isCommentBS :: BS.ByteString -> Bool+isCommentBS s =+ case BS.uncons s of+ Just ('c',_) -> True+ _ -> False++seqList :: [a] -> b -> b+seqList [] b = b+seqList (x:xs) b = seq x $ seqList xs b
+ src/ToySolver/Text/PBFile.hs view
@@ -0,0 +1,388 @@+{-# LANGUAGE BangPatterns #-}+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.Text.PBFile+-- Copyright : (c) Masahiro Sakai 2011+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Portability : non-portable (BangPatterns)+--+-- A parser library for .opb file and .wbo files used by PB Competition.+-- +-- References:+--+-- * Input/Output Format and Solver Requirements for the Competitions of+-- Pseudo-Boolean Solvers+-- <http://www.cril.univ-artois.fr/PB11/format.pdf>+--+-----------------------------------------------------------------------------++module ToySolver.Text.PBFile+ (+ -- * Abstract Syntax+ Formula (..)+ , Constraint+ , Op (..)+ , SoftFormula (..)+ , SoftConstraint+ , Sum+ , WeightedTerm+ , Term+ , Lit (..)+ , Var++ -- * Parsing .opb files+ , parseOPBString+ , parseOPBFile++ -- * Parsing .wbo files+ , parseWBOString+ , parseWBOFile++ -- * Show .opb files+ , showOPB++ -- * Show .wbo files+ , showWBO+ ) where++import Prelude hiding (sum)+import Control.Monad+import Data.Maybe+import Data.List hiding (sum)+import Text.ParserCombinators.Parsec+import Data.Word+import Control.Exception (assert)+import Text.Printf+import ToySolver.Internal.TextUtil++-- | Pair of /objective function/ and a list of constraints.+data Formula+ = Formula+ { pbObjectiveFunction :: Maybe Sum+ , pbConstraints :: [Constraint]+ , pbNumVars :: !Int+ , pbNumConstraints :: !Int+ }+ deriving (Eq, Ord, Show)++-- | Lhs, relational operator and rhs.+type Constraint = (Sum, Op, Integer)++-- | Relational operators+data Op+ = Ge -- ^ /greater than or equal/+ | Eq -- ^ /equal/+ deriving (Eq, Ord, Show, Enum, Bounded)++-- | A pair of /top cost/ and a list of soft constraints.+data SoftFormula+ = SoftFormula+ { wboTopCost :: Maybe Integer+ , wboConstraints :: [SoftConstraint]+ , wboNumVars :: !Int+ , wboNumConstraints :: !Int+ }+ deriving (Eq, Ord, Show)++-- | A pair of weight and constraint.+type SoftConstraint = (Maybe Integer, Constraint)++-- | Sum of 'WeightedTerm'+type Sum = [WeightedTerm]++-- | Coefficient and 'Term'+type WeightedTerm = (Integer, Term)++-- | List of variables interpreted as products+type Term = [Lit]++-- | Positive (resp. negative) literal is represented as a positive (resp. negative) integer.+type Lit = Int++-- | Variable are repserented positive integer.+type Var = Int++-- <formula>::= <sequence_of_comments> [<objective>] <sequence_of_comments_or_constraints>+formula :: Parser Formula+formula = do+ h <- optionMaybe hint+ sequence_of_comments+ obj <- optionMaybe objective+ cs <- sequence_of_comments_or_constraints+ return $+ Formula+ { pbObjectiveFunction = obj+ , pbConstraints = cs+ , pbNumVars = fromMaybe (pbComputeNumVars obj cs) (fmap fst h)+ , pbNumConstraints = fromMaybe (length cs) (fmap snd h)+ }++hint :: Parser (Int,Int)+hint = try $ do+ _ <- char '*'+ zeroOrMoreSpace+ string "#variable="+ zeroOrMoreSpace+ nv <- unsigned_integer+ oneOrMoreSpace + string "#constraint="+ zeroOrMoreSpace+ nc <- unsigned_integer+ _ <- manyTill anyChar eol+ return (fromIntegral nv, fromIntegral nc)++-- <sequence_of_comments>::= <comment> [<sequence_of_comments>]+sequence_of_comments :: Parser ()+sequence_of_comments = skipMany comment -- XXX: we allow empty sequence++-- <comment>::= "*" <any_sequence_of_characters_other_than_EOL> <EOL>+comment :: Parser ()+comment = do+ _ <- char '*' + _ <- manyTill anyChar eol+ return ()++-- <sequence_of_comments_or_constraints>::= <comment_or_constraint> [<sequence_of_comments_or_constraints>]+sequence_of_comments_or_constraints :: Parser [Constraint]+sequence_of_comments_or_constraints = do+ xs <- many1 comment_or_constraint+ return $ catMaybes xs++-- <comment_or_constraint>::= <comment>|<constraint>+comment_or_constraint :: Parser (Maybe Constraint)+comment_or_constraint =+ (comment >> return Nothing) <|> (liftM Just constraint)++-- <objective>::= "min:" <zeroOrMoreSpace> <sum> ";"+objective :: Parser Sum+objective = do+ _ <- string "min:"+ zeroOrMoreSpace+ obj <- sum+ _ <- char ';'+ eol+ return obj++-- <constraint>::= <sum> <relational_operator> <zeroOrMoreSpace> <integer> <zeroOrMoreSpace> ";"+constraint :: Parser Constraint+constraint = do+ lhs <- sum+ op <- relational_operator+ zeroOrMoreSpace+ rhs <- integer+ zeroOrMoreSpace+ semi+ return (lhs, op, rhs)++-- <sum>::= <weightedterm> | <weightedterm> <sum>+sum :: Parser Sum+sum = many1 weightedterm++-- <weightedterm>::= <integer> <oneOrMoreSpace> <term> <oneOrMoreSpace>+weightedterm :: Parser WeightedTerm+weightedterm = do+ w <- integer+ oneOrMoreSpace+ t <- term+ oneOrMoreSpace+ return (w,t)++-- <integer>::= <unsigned_integer> | "+" <unsigned_integer> | "-" <unsigned_integer>+integer :: Parser Integer+integer = msum+ [ unsigned_integer+ , char '+' >> unsigned_integer+ , char '-' >> liftM negate unsigned_integer+ ]++-- <unsigned_integer>::= <digit> | <digit><unsigned_integer>+unsigned_integer :: Parser Integer+unsigned_integer = do+ ds <- many1 digit+ return $! readUnsignedInteger ds++-- <relational_operator>::= ">=" | "="+relational_operator :: Parser Op+relational_operator = (string ">=" >> return Ge) <|> (string "=" >> return Eq)++-- <variablename>::= "x" <unsigned_integer>+variablename :: Parser Var+variablename = do+ _ <- char 'x'+ i <- unsigned_integer+ return $! fromIntegral i++-- <oneOrMoreSpace>::= " " [<oneOrMoreSpace>]+oneOrMoreSpace :: Parser ()+oneOrMoreSpace = skipMany1 (char ' ')++-- <zeroOrMoreSpace>::= [" " <zeroOrMoreSpace>]+zeroOrMoreSpace :: Parser ()+zeroOrMoreSpace = skipMany (char ' ')++eol :: Parser ()+eol = char '\n' >> return ()++semi :: Parser ()+semi = char ';' >> eol++{-+For linear pseudo-Boolean instances, <term> is defined as+<term>::=<variablename>++For non-linear instances, <term> is defined as+<term>::= <oneOrMoreLiterals>+-}+term :: Parser Term+term = oneOrMoreLiterals++-- <oneOrMoreLiterals>::= <literal> | <literal> <oneOrMoreSpace> <oneOrMoreLiterals>+oneOrMoreLiterals :: Parser [Lit]+oneOrMoreLiterals = do+ l <- literal+ mplus (try $ oneOrMoreSpace >> liftM (l:) (oneOrMoreLiterals)) (return [l])+-- Note that we cannot use sepBy1.+-- In "p `sepBy1` q", p should success whenever q success.+-- But it's not the case here.++-- <literal>::= <variablename> | "~"<variablename>+literal :: Parser Lit+literal = variablename <|> (char '~' >> liftM negate variablename)++-- | Parse a .opb file containing pseudo boolean problem.+parseOPBString :: SourceName -> String -> Either ParseError Formula+parseOPBString = parse formula++-- | Parse a .opb format string containing pseudo boolean problem.+parseOPBFile :: FilePath -> IO (Either ParseError Formula)+parseOPBFile = parseFromFile formula+++-- <softformula>::= <sequence_of_comments> <softheader> <sequence_of_comments_or_constraints>+softformula :: Parser SoftFormula+softformula = do+ h <- optionMaybe hint+ sequence_of_comments+ top <- softheader+ cs <- wbo_sequence_of_comments_or_constraints+ return $+ SoftFormula+ { wboTopCost = top+ , wboConstraints = cs+ , wboNumVars = fromMaybe (wboComputeNumVars cs) (fmap fst h)+ , wboNumConstraints = fromMaybe (length cs) (fmap snd h)+ }++-- <softheader>::= "soft:" [<unsigned_integer>] ";"+softheader :: Parser (Maybe Integer)+softheader = do+ _ <- string "soft:"+ zeroOrMoreSpace -- XXX+ top <- optionMaybe unsigned_integer+ zeroOrMoreSpace -- XXX+ semi+ return top++-- <sequence_of_comments_or_constraints>::= <comment_or_constraint> [<sequence_of_comments_or_constraints>]+wbo_sequence_of_comments_or_constraints :: Parser [SoftConstraint]+wbo_sequence_of_comments_or_constraints = do+ xs <- many1 wbo_comment_or_constraint+ return $ catMaybes xs++-- <comment_or_constraint>::= <comment>|<constraint>|<softconstraint>+wbo_comment_or_constraint :: Parser (Maybe SoftConstraint)+wbo_comment_or_constraint = (comment >> return Nothing) <|> m+ where+ m = liftM Just $ (constraint >>= \c -> return (Nothing, c)) <|> softconstraint++-- <softconstraint>::= "[" <zeroOrMoreSpace> <unsigned_integer> <zeroOrMoreSpace> "]" <constraint>+softconstraint :: Parser SoftConstraint+softconstraint = do+ _ <- char '['+ zeroOrMoreSpace+ cost <- unsigned_integer+ zeroOrMoreSpace+ _ <- char ']'+ zeroOrMoreSpace -- XXX+ c <- constraint+ return (Just cost, c)++-- | Parse a .wbo file containing weighted boolean optimization problem.+parseWBOString :: SourceName -> String -> Either ParseError SoftFormula+parseWBOString = parse softformula++-- | Parse a .wbo format string containing weighted boolean optimization problem.+parseWBOFile :: FilePath -> IO (Either ParseError SoftFormula)+parseWBOFile = parseFromFile softformula+++showOPB :: Formula -> ShowS+showOPB opb = (size . part1 . part2)+ where+ nv = pbNumVars opb+ nc = pbNumConstraints opb+ size = showString (printf "* #variable= %d #constraint= %d\n" nv nc)+ part1 = + case pbObjectiveFunction opb of+ Nothing -> id+ Just o -> showString "min: " . showSum o . showString ";\n"+ part2 = foldr (.) id (map showConstraint (pbConstraints opb))++showWBO :: SoftFormula -> ShowS+showWBO wbo = size . part1 . part2+ where+ nv = wboNumVars wbo+ nc = wboNumConstraints wbo+ size = showString (printf "* #variable= %d #constraint= %d\n" nv nc)+ part1 = + case wboTopCost wbo of+ Nothing -> showString "soft: ;\n"+ Just t -> showString "soft: " . showsPrec 0 t . showString ";\n"+ part2 = foldr (.) id (map showSoftConstraint (wboConstraints wbo))++showSum :: Sum -> ShowS+showSum = foldr (.) id . map showWeightedTerm++showWeightedTerm :: WeightedTerm -> ShowS+showWeightedTerm (c, lits) = foldr (\f g -> f . showChar ' ' . g) id (x:xs)+ where+ x = if c >= 0 then showChar '+' . showsPrec 0 c else showsPrec 0 c+ xs = map showLit lits++showLit :: Lit -> ShowS+showLit lit = if lit > 0 then v else showChar '~' . v+ where+ v = showChar 'x' . showsPrec 0 (abs lit)++showConstraint :: Constraint -> ShowS+showConstraint (lhs, op, rhs) =+ showSum lhs . f op . showChar ' ' . showsPrec 0 rhs . showString ";\n"+ where+ f Eq = showString "="+ f Ge = showString ">="++showSoftConstraint :: SoftConstraint -> ShowS+showSoftConstraint (cost, constr) =+ case cost of+ Nothing -> showConstraint constr+ Just c -> showChar '[' . showsPrec 0 c . showChar ']' . showChar ' ' . showConstraint constr++pbComputeNumVars :: Maybe Sum -> [Constraint] -> Int+pbComputeNumVars obj cs = maximum (0 : vs)+ where+ vs = do+ s <- maybeToList obj ++ [s | (s,_,_) <- cs]+ (_, tm) <- s+ lit <- tm+ return $ abs lit++wboComputeNumVars :: [SoftConstraint] -> Int+wboComputeNumVars cs = maximum (0 : vs)+ where+ vs = do+ s <- [s | (_, (s,_,_)) <- cs]+ (_, tm) <- s+ lit <- tm+ return $ abs lit
+ src/ToySolver/Text/SDPFile.hs view
@@ -0,0 +1,338 @@+{-# OPTIONS_GHC -Wall #-}+-----------------------------------------------------------------------------+-- |+-- Module : ToySolver.Text.SDPFile+-- Copyright : (c) Masahiro Sakai 2012+-- License : BSD-style+-- +-- Maintainer : masahiro.sakai@gmail.com+-- Stability : provisional+-- Portability : portable+--+-- References:+--+-- * SDPA (Semidefinite Programming Algorithm) User's Manual+-- <http://sdpa.indsys.chuo-u.ac.jp/~fujisawa/sdpa_doc.pdf>+--+-- * <http://euler.nmt.edu/~brian/sdplib/FORMAT>+--+-----------------------------------------------------------------------------+module ToySolver.Text.SDPFile+ ( -- * The problem type+ Problem (..)+ , Matrix+ , Block+ , mDim+ , nBlock+ , blockElem++ -- * Construction+ , DenseMatrix+ , DenseBlock+ , denseMatrix+ , denseBlock+ , diagBlock+ + -- * Rendering+ , render+ , renderSparse++ -- * Parsing+ , parseDataString+ , parseDataFile+ , parseSparseDataString+ , parseSparseDataFile+ ) where++import Control.Monad+import Data.List (intersperse)+import Data.Ratio+import Data.Map (Map)+import qualified Data.Map as Map+import qualified Data.IntMap as IntMap+import Text.ParserCombinators.Parsec++-- ---------------------------------------------------------------------------+-- problem description+-- ---------------------------------------------------------------------------++data Problem+ = Problem+ { blockStruct :: [Int] -- ^ the block strcuture vector (bLOCKsTRUCT)+ , costs :: [Rational] -- ^ Constant Vector+ , matrices :: [Matrix] -- ^ Constraint Matrices+ }+ deriving (Show, Ord, Eq)++type Matrix = [Block]++type Block = Map (Int,Int) Rational++-- | the number of primal variables (mDim)+mDim :: Problem -> Int+mDim prob = length (matrices prob) - 1++-- | the number of blocks (nBLOCK)+nBlock :: Problem -> Int+nBlock prob = length (blockStruct prob)++blockElem :: Int -> Int -> Block -> Rational+blockElem i j b = Map.findWithDefault 0 (i,j) b++-- ---------------------------------------------------------------------------+-- construction+-- ---------------------------------------------------------------------------++type DenseMatrix = [DenseBlock]++type DenseBlock = [[Rational]]++denseBlock :: DenseBlock -> Block+denseBlock xxs = Map.fromList [((i,j),x) | (i,xs) <- zip [1..] xxs, (j,x) <- zip [1..] xs, x /= 0]++denseMatrix :: DenseMatrix -> Matrix+denseMatrix = map denseBlock++diagBlock :: [Rational] -> Block+diagBlock xs = Map.fromList [((i,i),x) | (i,x) <- zip [1..] xs]++-- ---------------------------------------------------------------------------+-- parsing+-- ---------------------------------------------------------------------------++-- | Parse a SDPA format (.dat) string.+parseDataString :: SourceName -> String -> Either ParseError Problem+parseDataString = parse pDataFile++-- | Parse a SDPA format file (.dat).+parseDataFile :: FilePath -> IO (Either ParseError Problem)+parseDataFile = parseFromFile pDataFile++-- | Parse a SDPA sparse format (.dat-s) string.+parseSparseDataString :: SourceName -> String -> Either ParseError Problem+parseSparseDataString = parse pSparseDataFile++-- | Parse a SDPA sparse format file (.dat-s).+parseSparseDataFile :: FilePath -> IO (Either ParseError Problem)+parseSparseDataFile = parseFromFile pSparseDataFile++pDataFile :: Parser Problem+pDataFile = do+ _ <- many pComment+ m <- nat_line -- mDim+ _n <- nat_line -- nBlock+ bs <- pBlockStruct -- bLOCKsTRUCT+ cs <- pCosts+ ms <- pDenseMatrices (fromIntegral m) bs+ return $+ Problem+ { blockStruct = bs+ , costs = cs+ , matrices = ms+ }++pSparseDataFile :: Parser Problem+pSparseDataFile = do+ _ <- many pComment+ m <- nat_line -- mDim+ _n <- nat_line -- nBlock+ bs <- pBlockStruct -- bLOCKsTRUCT+ cs <- pCosts+ ms <- pSparseMatrices (fromIntegral m) bs+ return $+ Problem+ { blockStruct = bs+ , costs = cs+ , matrices = ms+ }++pComment :: Parser String+pComment = do+ c <- oneOf "*\""+ cs <- manyTill anyChar newline+ return (c:cs)++pBlockStruct :: Parser [Int]+pBlockStruct = do+ optional sep+ let int' = int >>= \i -> optional sep >> return i+ xs <- many int'+ _ <- manyTill anyChar newline+ return $ map fromIntegral xs + where+ sep = many1 (oneOf " \t(){},")++pCosts :: Parser [Rational]+pCosts = do+ let sep = many1 (oneOf " \t(){},")+ real' = real >>= \r -> optional sep >> return r+ optional sep+ cs <- many real'+ _ <- newline+ return cs++pDenseMatrices :: Int -> [Int] -> Parser [Matrix]+pDenseMatrices m bs = optional sep >> replicateM (fromIntegral m + 1) pDenceMatrix+ where+ sep = many1 (space <|> oneOf "(){},")+ real' = real >>= \r -> optional sep >> return r+ pDenceMatrix = forM bs $ \b ->+ if b >= 0+ then do+ xs <- replicateM b (replicateM b real')+ return $ denseBlock xs+ else do+ xs <- replicateM (abs b) real'+ return $ diagBlock xs++pSparseMatrices :: Int -> [Int] -> Parser [Matrix]+pSparseMatrices m bs = do+ xs <- many pLine+ let t = IntMap.unionsWith (IntMap.unionWith Map.union)+ [ IntMap.singleton matno (IntMap.singleton blkno (Map.fromList [((i,j),e),((j,i),e)]))+ | (matno,blkno,i,j,e) <- xs ]+ return $+ [ [IntMap.findWithDefault Map.empty blkno mat | blkno <- [1 .. length bs]]+ | matno <- [0..m], let mat = IntMap.findWithDefault IntMap.empty matno t+ ]++ where+ sep = many1 (oneOf " \t") >> return ()+ pLine = do+ optional sep+ matno <- nat+ sep+ blkno <- nat+ sep+ i <- nat+ sep+ j <- nat+ sep+ e <- real+ optional sep+ _ <- newline+ return (fromIntegral matno, fromIntegral blkno, fromIntegral i, fromIntegral j, e)++nat_line :: Parser Integer+nat_line = do+ spaces+ n <- nat+ _ <- manyTill anyChar newline+ return n++nat :: Parser Integer+nat = do+ ds <- many1 digit+ return $! read ds++int :: Parser Integer+int = do+ s <- option 1 sign+ n <- nat+ return $! s * n++real :: Parser Rational+real = do+ s <- option 1 sign + b <- (do{ x <- nat; y <- option 0 frac; return (fromInteger x + y) })+ <|> frac+ c <- option 0 e+ return (s * b*10^^c)+ where+ digits = many1 digit++ frac :: Parser Rational+ frac = do+ _ <- char '.'+ s <- digits+ return (read s % 10^(length s))++ e :: Parser Integer+ e = do+ _ <- oneOf "eE"+ f <- msum [ char '+' >> return id+ , char '-' >> return negate+ , return id+ ]+ liftM f nat++sign :: Num a => Parser a+sign = (char '+' >> return 1) <|> (char '-' >> return (-1))++-- ---------------------------------------------------------------------------+-- rendering+-- ---------------------------------------------------------------------------++render :: Problem -> ShowS+render = renderImpl False++renderSparse :: Problem -> ShowS+renderSparse = renderImpl True++renderImpl :: Bool -> Problem -> ShowS+renderImpl sparse prob =+ -- mDim+ shows (mDim prob) . showString " = mDIM\n" .++ -- nBlock+ shows (nBlock prob) . showString " = nBlock\n" .++ -- blockStruct+ showChar '(' .+ sepByS [shows i | i <- blockStruct prob] (showString ", ") .+ showChar ')' .+ showString " = bLOCKsTRUCT\n" .++ -- costs+ showChar '(' .+ sepByS [showRat c | c <- costs prob] (showString ", ") .+ showString ")\n" .++ -- matrices+ if sparse+ then concatS [renderSparseMatrix matno m | (matno, m) <- zip [0..] (matrices prob)]+ else concatS $ map renderDenseMatrix (matrices prob)++ where+ renderSparseMatrix :: Int -> Matrix -> ShowS+ renderSparseMatrix matno m =+ concatS [ shows matno . showChar ' ' .+ shows blkno . showChar ' ' .+ shows i . showChar ' ' .+ shows j . showChar ' ' .+ showRat e . showChar '\n'+ | (blkno, blk) <- zip [(1::Int)..] m, ((i,j),e) <- Map.toList blk, i <= j ]++ renderDenseMatrix :: Matrix -> ShowS+ renderDenseMatrix m = + showString "{\n" .+ concatS [renderDenseBlock b s . showString "\n" | (b,s) <- zip m (blockStruct prob)] .+ showString "}\n"++ renderDenseBlock :: Block -> Int -> ShowS+ renderDenseBlock b s+ | s < 0 =+ showString " " . renderVec [blockElem i i b | i <- [1 .. abs s]]+ | otherwise = + showString " { " .+ sepByS [renderRow i | i <- [1..s]] (showString ", ") . + showString " }"+ where+ renderRow i = renderVec [blockElem i j b | j <- [1..s]]++renderVec :: [Rational] -> ShowS+renderVec xs =+ showChar '{' .+ sepByS (map showRat xs) (showString ", ") .+ showChar '}'++showRat :: Rational -> ShowS+showRat r+ | denominator r == 1 = shows (numerator r)+ | otherwise = shows (fromRational r :: Double)++concatS :: [ShowS] -> ShowS+concatS = foldr (.) id++sepByS :: [ShowS] -> ShowS -> ShowS+sepByS xs sep = concatS $ intersperse sep xs
+ src/ToySolver/Version.hs view
@@ -0,0 +1,107 @@+{-# LANGUAGE CPP #-}+module ToySolver.Version+ ( version+ , packageVersions+ ) where++import Data.List+import Data.Version+import Paths_toysolver++packageVersions :: [(String, String)]+packageVersions = sort $ tail+ [ (undefined, undefined) -- dummy+#ifdef VERSION_OptDir+ , ("OptDir", VERSION_OptDir )+#endif+#ifdef VERSION_algebra+ , ("algebra", VERSION_algebra )+#endif+#ifdef VERSION_array+ , ("array", VERSION_array )+#endif+#ifdef VERSION_base+ , ("base", VERSION_base )+#endif+#ifdef VERSION_bytestring+ , ("bytestring", VERSION_bytestring )+#endif+#ifdef VERSION_containers+ , ("containers", VERSION_containers )+#endif+#ifdef VERSION_data_interval+ , ("data-interval",VERSION_data_interval)+#endif+#ifdef VERSION_deepseq+ , ("deepseq", VERSION_deepseq )+#endif+#ifdef VERSION_filepath+ , ("filepath", VERSION_filepath )+#endif+#ifdef VERSION_finite_field+ , ("finite-field", VERSION_finite_field )+#endif+#ifdef VERSION_hashable+ , ("hashable", VERSION_hashable )+#endif+#ifdef VERSION_heaps+ , ("heaps", VERSION_heaps )+#endif+#ifdef VERSION_intern+ , ("intern", VERSION_intern )+#endif+#ifdef VERSION_lattices+ , ("lattices", VERSION_lattices )+#endif+#ifdef VERSION_mtl+ , ("mtl", VERSION_mtl )+#endif+#ifdef VERSION_multiset+ , ("multiset", VERSION_multiset )+#endif+#ifdef VERSION_old_locale+ , ("old_locale", VERSION_old_locale )+#endif+#ifdef VERSION_parse_dimacs+ , ("parse_dimacs", VERSION_parse_dimacs )+#endif+#ifdef VERSION_parsec+ , ("parsec", VERSION_parsec )+#endif+#ifdef VERSION_prettyclass+ , ("prettyclass", VERSION_prettyclass )+#endif+#ifdef VERSION_primes+ , ("primes", VERSION_primes )+#endif+#ifdef VERSION_queue+ , ("queue", VERSION_queue )+#endif+#ifdef VERSION_random+ , ("random", VERSION_random )+#endif+#ifdef VERSION_sign+ , ("sign", VERSION_sign )+#endif+#ifdef VERSION_stm+ , ("stm", VERSION_stm )+#endif+#ifdef VERSION_time+ , ("time", VERSION_time )+#endif+#ifdef VERSION_type_level_numbers+ , ("type-level-numbers", VERSION_type_level_numbers)+#endif+#ifdef VERSION_unbounded_delays+ , ("unbounded-delays", VERSION_unbounded_delays)+#endif+#ifdef VERSION_unordered_containers+ , ("unordered-containers", VERSION_unordered_containers)+#endif+#ifdef VERSION_vector_space+ , ("vector-space", VERSION_vector_space)+#endif+#ifdef VERSION_logic_TPTP+ , ("logic-TPTP", VERSION_logic_TPTP )+#endif+ ]
+ src/ToySolver/Wang.hs view
@@ -0,0 +1,48 @@+module ToySolver.Wang where++import Control.Monad (guard,msum)+import Data.List (intersect)+import Data.Maybe (isJust, listToMaybe)++data Formula x+ = Atom x+ | Not !(Formula x)+ | Imply !(Formula x) !(Formula x)+ | And !(Formula x) !(Formula x)+ | Or !(Formula x) !(Formula x)+ deriving Eq++type Sequent x = ([Formula x], [Formula x])++isValid :: Eq x => Sequent x -> Bool+isValid = isJust . isValid'++isValid' :: Eq x => Sequent x -> Maybe ()+isValid' (l,r) =+ do xs <- listToMaybe $ msum $+ [ do let i = intersect l r+ guard $ not $ null i+ return []+ , do (Not p, r) <- pick r+ return [(p:l,r)]+ , do (Not p, l) <- pick l+ return [(l,p:r)]+ , do (Imply p q, r) <- pick r+ return [(p:l,q:r)]+ , do (Or p q, r) <- pick r+ return [(l,p:q:r)]+ , do (And p q, l) <- pick l+ return [(p:q:l,r)]+ , do (Or p q, l) <- pick l+ return [(p:l,r), (q:l,r)]+ , do (And p q, r) <- pick r+ return [(l,p:r), (l,q:r)]+ , do (Imply p q, l) <- pick l+ return [(q:l,r), (l,p:r)]+ ]+ mapM_ isValid' xs+ return ()++pick :: [x] -> [(x,[x])]+pick [] = []+pick (x:xs) = (x,xs) : [(y,x:ys) | (y,ys) <- pick xs]
− src/Util.hs
@@ -1,87 +0,0 @@-{-# OPTIONS_GHC -Wall #-}--------------------------------------------------------------------------------- |--- Module : Util--- Copyright : (c) Masahiro Sakai 2011-2012--- License : BSD-style--- --- Maintainer : masahiro.sakai@gmail.com--- Stability : provisional--- Portability : portable------ Some utility functions.--- --------------------------------------------------------------------------------module Util where--import Control.Monad-import Data.Ratio-import Data.Set (Set)-import qualified Data.Set as Set---- | Combining two @Maybe@ values using given function.-combineMaybe :: (a -> a -> a) -> Maybe a -> Maybe a -> Maybe a-combineMaybe _ Nothing y = y-combineMaybe _ x Nothing = x-combineMaybe f (Just x) (Just y) = Just (f x y)---- | is the number integral?------ @--- isInteger x = fromInteger (round x) == x--- @-isInteger :: RealFrac a => a -> Bool-isInteger x = fromInteger (round x) == x---- | fractional part--- --- @--- fracPart x = x - fromInteger (floor x)--- @-fracPart :: RealFrac a => a -> a-fracPart x = x - fromInteger (floor x)--showRational :: Bool -> Rational -> String-showRational asRatio v- | denominator v == 1 = show (numerator v)- | asRatio = show (numerator v) ++ "/" ++ show (denominator v)- | otherwise = show (fromRational v :: Double)--showRationalAsFiniteDecimal :: Rational -> Maybe String-showRationalAsFiniteDecimal x = do- let a :: Integer- (a,b) = properFraction (abs x)- s1 = if x < 0 then "-" else ""- s2 = show a - s3 <- if b == 0- then return ".0"- else liftM ("." ++ ) $ loop Set.empty b- return $ s1 ++ s2 ++ s3- where- loop :: Set Rational -> Rational -> Maybe String- loop _ 0 = return ""- loop rs r- | r `Set.member` rs = mzero- | otherwise = do- let a :: Integer- (a,b) = properFraction (r * 10)- s <- loop (Set.insert r rs) b- return $ show a ++ s--{-# INLINE revSequence #-}-revSequence :: Monad m => [m a] -> m [a]-revSequence = go []- where- go xs [] = return xs- go xs (m:ms) = do- x <- m- go (x:xs) ms--{-# INLINE revMapM #-}-revMapM :: Monad m => (a -> m b) -> ([a] -> m [b])-revMapM f = revSequence . map f--{-# INLINE revForM #-}-revForM :: Monad m => [a] -> (a -> m b) -> m [b]-revForM = flip revMapM
− src/Version.hs
@@ -1,77 +0,0 @@-{-# LANGUAGE CPP #-}-module Version- ( version- , packageVersions- ) where--import Data.List-import Data.Version-import Paths_toysolver--packageVersions :: [(String, String)]-packageVersions = sort $ tail- [ (undefined, undefined) -- dummy-#ifdef VERSION_OptDir- , ("OptDir", VERSION_OptDir )-#endif-#ifdef VERSION_array- , ("array", VERSION_array )-#endif-#ifdef VERSION_base- , ("base", VERSION_base )-#endif-#ifdef VERSION_bytestring- , ("bytestring", VERSION_bytestring )-#endif-#ifdef VERSION_containers- , ("containers", VERSION_containers )-#endif-#ifdef VERSION_data_interval- , ("data-interval",VERSION_data_interval)-#endif-#ifdef VERSION_deepseq- , ("deepseq", VERSION_deepseq )-#endif-#ifdef VERSION_filepath- , ("filepath", VERSION_filepath )-#endif-#ifdef VERSION_heaps- , ("heaps", VERSION_heaps )-#endif-#ifdef VERSION_mtl- , ("mtl", VERSION_mtl )-#endif-#ifdef VERSION_old_locale- , ("old_locale", VERSION_old_locale )-#endif-#ifdef VERSION_parse_dimacs- , ("parse_dimacs", VERSION_parse_dimacs )-#endif-#ifdef VERSION_parsec- , ("parsec", VERSION_parsec )-#endif-#ifdef VERSION_primes- , ("primes", VERSION_primes )-#endif-#ifdef VERSION_queue- , ("queue", VERSION_queue )-#endif-#ifdef VERSION_random- , ("random", VERSION_random )-#endif-#ifdef VERSION_stm- , ("stm", VERSION_stm )-#endif-#ifdef VERSION_time- , ("time", VERSION_time )-#endif-#ifdef VERSION_unbounded_delays- , ("unbounded-delays", VERSION_unbounded_delays)-#endif-#ifdef VERSION_vector_space- , ("vector-space", VERSION_vector_space)-#endif-#ifdef VERSION_logic_TPTP- , ("logic-TPTP", VERSION_logic_TPTP )-#endif- ]
− src/maxsatverify.hs
@@ -1,42 +0,0 @@-module Main where--import Control.Monad-import Data.Array.IArray-import Data.IORef-import System.Environment-import Text.Printf-import qualified Text.MaxSAT as MaxSAT-import SAT.Types--main :: IO ()-main = do- [problemFile, modelFile] <- getArgs- Right wcnf <- MaxSAT.parseWCNFFile problemFile- model <- liftM readModel (readFile modelFile)- costRef <- newIORef 0- forM_ (MaxSAT.clauses wcnf) $ \(w,c) ->- unless (eval model c) $- if w == MaxSAT.topCost wcnf- then printf "violated hard constraint: %s\n" (show c)- else do- tc <- readIORef costRef- writeIORef costRef $! tc + w- printf "total cost = %d\n" =<< readIORef costRef--eval :: Model -> Clause -> Bool-eval m lits = or [evalLit m lit | lit <- lits]--readModel :: String -> Model-readModel s = array (1, maximum (0 : map fst ls2)) ls2- where- ls = lines s- ls2 = do- l <- ls- case l of- 'v':xs -> do- w <- words xs- case w of- '-':ys -> return (read ys, False)- ys -> return (read ys, True)- _ -> mzero-
− src/pbverify.hs
@@ -1,40 +0,0 @@-module Main where--import Control.Monad-import Data.Array.IArray-import System.Environment-import Text.Printf-import qualified Text.PBFile as PBFile-import SAT.Types--main :: IO ()-main = do- [problemFile, modelFile] <- getArgs- Right formula@(obj, cs) <- PBFile.parseOPBFile problemFile- model <- liftM readModel (readFile modelFile)- forM_ cs $ \c ->- unless (eval model c) $- printf "violated: %s\n" (show c)--eval :: Model -> PBFile.Constraint -> Bool-eval m (lhs, op, rhs) = op_v lhs_v rhs- where- lhs_v = sum [c | (c,lits) <- lhs, all (evalLit m) lits]- op_v = case op of- PBFile.Ge -> (>=)- PBFile.Eq -> (==)--readModel :: String -> Model-readModel s = array (1, maximum (0 : map fst ls2)) ls2- where- ls = lines s- ls2 = do- l <- ls- case l of- 'v':xs -> do- w <- words xs- case w of- '-':'x':ys -> return (read ys, False)- 'x':ys -> return (read ys, True)- _ -> mzero-
− src/pigeonhole.hs
@@ -1,33 +0,0 @@-module Main where--import Data.List-import System.Environment-import System.Exit-import System.IO-import Text.PBFile as PBFile--pigeonHole :: Integer -> Integer -> Formula-pigeonHole p h = (Nothing, cs1 ++ cs2)- where- vs :: [((Integer,Integer), Int)]- vs = zip [(i,j) | i<-[1..p], j<-[1..h]] [1..]-- cs1 :: [Constraint]- cs1 = [ ([(1,[v]) | j<-[1..h], let Just v = lookup (i,j) vs], PBFile.Ge, 1)- | i<-[1..p]- ]- cs2 :: [Constraint]- cs2 = [ ([(-1,[v]) | i<-[1..p], let Just v = lookup (i,j) vs], PBFile.Ge, -1)- | j<-[1..h]- ]--main :: IO ()-main = do- xs <- getArgs- case xs of- [p,h] -> do- let opb = pigeonHole (read p) (read h)- putStr $ showOPB opb ""- _ -> do- hPutStrLn stderr "Usage: pigeonhole number_of_pigeons number_of_holes"- exitFailure
test/TestAReal.hs view
@@ -9,10 +9,13 @@ import Test.Framework.Providers.HUnit import Test.Framework.Providers.QuickCheck2 -import Data.Polynomial (UPolynomial, X (..))-import qualified Data.Polynomial as P-import Data.AlgebraicNumber.Real-import Data.AlgebraicNumber.Root+import ToySolver.Data.Polynomial (UPolynomial, X (..))+import qualified ToySolver.Data.Polynomial as P+import qualified ToySolver.Data.AlgebraicNumber.Sturm as Sturm+import ToySolver.Data.AlgebraicNumber.Real+import ToySolver.Data.AlgebraicNumber.Root++import Data.Interval (Interval, EndPoint (..), (<=..<=), (<..<=), (<=..<), (<..<)) import qualified Data.Interval as Interval import Control.Monad@@ -234,6 +237,54 @@ if r > 0 then return (1/r) else return r++------------------------------------------------------------------------++-- http://mathworld.wolfram.com/SturmFunction.html+case_sturmChain = Sturm.sturmChain p0 @?= chain+ where+ x = P.var X+ p0 = x^5 - 3*x - 1+ p1 = 5*x^4 - 3+ p2 = P.constant (1/5) * (12*x + 5)+ p3 = P.constant (59083 / 20736)+ chain = [p0, p1, p2, p3]++-- http://mathworld.wolfram.com/SturmFunction.html+case_numRoots_1 =+ sequence_+ [ Sturm.numRoots p (Finite (-2) <=..<= Finite 0) @?= 2+ , Sturm.numRoots p (Finite 0 <=..<= Finite 2) @?= 1+ , Sturm.numRoots p (Finite (-1.5) <=..<= Finite (-1.0)) @?= 1+ , Sturm.numRoots p (Finite (-0.5) <=..<= Finite 0) @?= 1+ , Sturm.numRoots p (Finite 1 <=..<= Finite (1.5)) @?= 1+ ]+ where+ x = P.var X+ p = x^5 - 3*x - 1++-- check interpretation of intervals+case_numRoots_2 =+ sequence_+ [ Sturm.numRoots p (Finite 2 <..<= Finite 3) @?= 0+ , Sturm.numRoots p (Finite 2 <=..<= Finite 3) @?= 1+ , Sturm.numRoots p (Finite 1 <..< Finite 2) @?= 0+ , Sturm.numRoots p (Finite 1 <..<= Finite 2) @?= 1+ ]+ where+ x = P.var X+ p = x^2 - 4++case_separate = do+ forM_ (zip vals intervals) $ \(v,ival) -> do+ Interval.member v ival @?= True+ forM_ (filter (v/=) vals) $ \v2 -> do+ Interval.member v2 ival @?= False+ where+ x = P.var X+ p = x^5 - 3*x - 1+ intervals = Sturm.separate p+ vals = [-1.21465, -0.334734, 1.38879] ------------------------------------------------------------------------ -- Test harness
test/TestCongruenceClosure.hs view
@@ -6,7 +6,7 @@ import Test.Framework.TH import Test.Framework.Providers.HUnit -import Algorithm.CongruenceClosure+import ToySolver.CongruenceClosure ------------------------------------------------------------------------ -- Test cases
test/TestContiTraverso.hs view
@@ -12,13 +12,14 @@ import Test.Framework.TH import Test.Framework.Providers.HUnit -import Algorithm.ContiTraverso--import Data.ArithRel-import qualified Data.LA as LA import Data.OptDir-import Data.Polynomial (Polynomial)-import qualified Data.Polynomial as P++import ToySolver.ContiTraverso++import ToySolver.Data.ArithRel+import qualified ToySolver.Data.LA as LA+import ToySolver.Data.Polynomial (Polynomial)+import qualified ToySolver.Data.Polynomial as P -- http://madscientist.jp/~ikegami/articles/IntroSequencePolynomial.html -- optimum is (3,2,0)
test/TestLPFile.hs view
@@ -8,7 +8,7 @@ import Test.Framework (Test, defaultMain, testGroup) import Test.Framework.TH import Test.Framework.Providers.HUnit-import Text.LPFile+import ToySolver.Text.LPFile case_testdata = checkString "testdata" testdata case_test_indicator = checkFile "samples/lp/test-indicator.lp"
test/TestMIPSolver2.hs view
@@ -13,10 +13,10 @@ import Test.Framework.Providers.HUnit import Text.Printf -import qualified Data.LA as LA-import qualified Algorithm.Simplex2 as Simplex2-import Algorithm.Simplex2-import qualified Algorithm.MIPSolver2 as MIPSolver2+import qualified ToySolver.Data.LA as LA+import qualified ToySolver.Simplex2 as Simplex2+import ToySolver.Simplex2+import qualified ToySolver.MIPSolver2 as MIPSolver2 ------------------------------------------------------------------------ @@ -50,15 +50,15 @@ setObj lp obj mapM_ (Simplex2.assertAtom lp) cs mip <- MIPSolver2.newSolver lp ivs- ret <- MIPSolver2.optimize mip (\_ _ -> return ())+ ret <- MIPSolver2.optimize mip ret @?= Simplex2.Optimum - m <- MIPSolver2.model mip+ Just m <- MIPSolver2.getBestModel mip forM_ [(1,40),(2,21/2),(3,39/2),(4,3)] $ \(var, val) -> m IM.! var @?= val - v <- MIPSolver2.getObjValue mip+ Just v <- MIPSolver2.getBestValue mip v @?= 245/2 case_test1' = do@@ -69,15 +69,15 @@ setObj lp (negateV obj) mapM_ (Simplex2.assertAtom lp) cs mip <- MIPSolver2.newSolver lp ivs- ret <- MIPSolver2.optimize mip (\_ _ -> return ())+ ret <- MIPSolver2.optimize mip ret @?= Simplex2.Optimum - m <- MIPSolver2.model mip+ Just m <- MIPSolver2.getBestModel mip forM_ [(1,40),(2,21/2),(3,39/2),(4,3)] $ \(var, val) -> m IM.! var @?= val - v <- MIPSolver2.getObjValue mip+ Just v <- MIPSolver2.getBestValue mip v @?= -245/2 where@@ -108,15 +108,15 @@ setObj lp obj mapM_ (Simplex2.assertAtom lp) cs mip <- MIPSolver2.newSolver lp ivs- ret <- MIPSolver2.optimize mip (\_ _ -> return ())+ ret <- MIPSolver2.optimize mip ret @?= Simplex2.Optimum - m <- MIPSolver2.model mip+ Just m <- MIPSolver2.getBestModel mip forM_ [(1,0),(2,2),(3,5/2)] $ \(var, val) -> m IM.! var @?= val - v <- MIPSolver2.getObjValue mip+ Just v <- MIPSolver2.getBestValue mip v @?= -37/2 ------------------------------------------------------------------------
test/TestMPSFile.hs view
@@ -8,7 +8,7 @@ import Test.Framework (Test, defaultMain, testGroup) import Test.Framework.TH import Test.Framework.Providers.HUnit-import Text.MPSFile+import ToySolver.Text.MPSFile case_testdata = checkString "testdata" testdata case_example2 = checkFile "samples/mps/example2.mps"
test/TestPBFile.hs view
@@ -8,7 +8,7 @@ import Test.Framework (Test, defaultMain, testGroup) import Test.Framework.TH import Test.Framework.Providers.HUnit-import Text.PBFile+import ToySolver.Text.PBFile case_exampleLIN = checkOPBString "exampleLIN" exampleLIN case_exampleNLC1 = checkOPBString "exampleNLC1" exampleNLC1
test/TestPolynomial.hs view
@@ -1,6 +1,7 @@-{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TemplateHaskell, ScopedTypeVariables #-} import Prelude hiding (lex)+import qualified Control.Exception as E import Control.Monad import qualified Data.FiniteField as FF import Data.List@@ -15,12 +16,14 @@ import Test.Framework.Providers.QuickCheck2 import Text.PrettyPrint.HughesPJClass -import Data.Polynomial (Polynomial, Term, Monomial, UPolynomial, UTerm, UMonomial, X (..))-import qualified Data.Polynomial as P-import qualified Data.Polynomial.GroebnerBasis as GB-import Data.Polynomial.RootSeparation.Sturm-import qualified Data.Polynomial.Factorization.FiniteField as FactorFF-import qualified Data.Polynomial.Interpolation.Lagrange as LagrangeInterpolation+import ToySolver.Data.Polynomial (Polynomial, Term, Monomial, UPolynomial, UTerm, UMonomial, X (..))+import qualified ToySolver.Data.Polynomial as P+import qualified ToySolver.Data.Polynomial.GroebnerBasis as GB+import qualified ToySolver.Data.Polynomial.Factorization.FiniteField as FactorFF+import qualified ToySolver.Data.Polynomial.Factorization.Hensel.Internal as Hensel+import qualified ToySolver.Data.Polynomial.Factorization.Zassenhaus as Zassenhaus+import qualified ToySolver.Data.Polynomial.Interpolation.Lagrange as LagrangeInterpolation+ import qualified Data.Interval as Interval import Data.Interval (Interval, EndPoint (..), (<=..<=), (<..<=), (<=..<), (<..<)) @@ -445,7 +448,7 @@ a /= P.mone ==> cmp P.mone a == LT {--------------------------------------------------------------------- Gröbner basis+-- Gröbner basis --------------------------------------------------------------------} -- http://math.rice.edu/~cbruun/vigre/vigreHW6.pdf@@ -607,54 +610,6 @@ ------------------------------------------------------------------------ --- http://mathworld.wolfram.com/SturmFunction.html-case_sturmChain = sturmChain p0 @?= chain- where- x = P.var X- p0 = x^5 - 3*x - 1- p1 = 5*x^4 - 3- p2 = P.constant (1/5) * (12*x + 5)- p3 = P.constant (59083 / 20736)- chain = [p0, p1, p2, p3]---- http://mathworld.wolfram.com/SturmFunction.html-case_numRoots_1 =- sequence_- [ numRoots p (Finite (-2) <=..<= Finite 0) @?= 2- , numRoots p (Finite 0 <=..<= Finite 2) @?= 1- , numRoots p (Finite (-1.5) <=..<= Finite (-1.0)) @?= 1- , numRoots p (Finite (-0.5) <=..<= Finite 0) @?= 1- , numRoots p (Finite 1 <=..<= Finite (1.5)) @?= 1- ]- where- x = P.var X- p = x^5 - 3*x - 1---- check interpretation of intervals-case_numRoots_2 =- sequence_- [ numRoots p (Finite 2 <..<= Finite 3) @?= 0- , numRoots p (Finite 2 <=..<= Finite 3) @?= 1- , numRoots p (Finite 1 <..< Finite 2) @?= 0- , numRoots p (Finite 1 <..<= Finite 2) @?= 1- ]- where- x = P.var X- p = x^2 - 4--case_separate = do- forM_ (zip vals intervals) $ \(v,ival) -> do- Interval.member v ival @?= True- forM_ (filter (v/=) vals) $ \v2 -> do- Interval.member v2 ival @?= False- where- x = P.var X- p = x^5 - 3*x - 1- intervals = separate p- vals = [-1.21465, -0.334734, 1.38879]--------------------------------------------------------------------------- case_factorZ_zero = P.factor (0::UPolynomial Integer) @?= [(0,1)] case_factorZ_one = P.factor (1::UPolynomial Integer) @?= [] case_factorZ_two = P.factor (2::UPolynomial Integer) @?= [(2,1)]@@ -862,6 +817,70 @@ actual = P.sqfree (x^(2::Int) + 2*x + 1) expected = [(x + 1, 2)] +------------------------------------------------------------------------++-- http://www14.in.tum.de/konferenzen/Jass07/courses/1/Bulwahn/Buhlwahn_Paper.pdf+case_Hensel_Lifting :: IO ()+case_Hensel_Lifting = do+ Hensel.hensel f fs 2 @?= [x^(2::Int) + 5*x + 18, x + 5]+ Hensel.hensel f fs 3 @?= [x^(2::Int) + 105*x + 43, x + 30]+ Hensel.hensel f fs 4 @?= [x^(2::Int) + 605*x + 168, x + 30]+ where+ x :: forall k. (Eq k, Num k) => UPolynomial k+ x = P.var X+ f :: UPolynomial Integer+ f = x^(3::Int) + 10*x^(2::Int) - 432*x + 5040+ fs :: [UPolynomial $(FF.primeField 5)]+ fs = [x^(2::Int)+3, x]++case_cabook_proposition_5_10 :: IO ()+case_cabook_proposition_5_10 =+ sum [ei * (product fs `P.div` fi) | (ei,fi) <- zip es fs] @?= 1+ where+ x :: UPolynomial Rational+ x = P.var P.X+ fs = [x, x+1, x+2]+ es = Hensel.cabook_proposition_5_10 fs++case_cabook_proposition_5_11 :: IO ()+case_cabook_proposition_5_11 =+ sum [ei * (product fs `P.div` fi) | (ei,fi) <- zip es fs] @?= g+ where+ x :: UPolynomial Rational+ x = P.var P.X+ fs = [x, x+1, x+2]+ g = x^(2::Int) + 1+ es = Hensel.cabook_proposition_5_11 fs g++------------------------------------------------------------------------++case_Zassenhaus_factor :: IO ()+case_Zassenhaus_factor = actual @?= expected+ where+ x :: UPolynomial Integer+ x = P.var X + f = - (x^(5::Int) + x^(4::Int) + x^(2::Int) + x + 2)+ actual, expected :: [(UPolynomial Integer, Integer)]+ actual = sort $ Zassenhaus.factor f+ expected = sort $ [(-1,1), (x^(2::Int)+x+1,1), (x^(3::Int)-x+2,1)]++case_Zassenhaus_zassenhaus_1 :: IO ()+case_Zassenhaus_zassenhaus_1 = actual @?= expected+ where+ x = P.var X+ f = x^(4::Int) + 4+ actual, expected :: [UPolynomial Integer]+ actual = sort $ Zassenhaus.zassenhaus f+ expected = sort $ [x^(2::Int)+2*x+2, x^(2::Int)-2*x+2]++case_Zassenhaus_zassenhaus_2 :: IO ()+case_Zassenhaus_zassenhaus_2 = actual @?= expected+ where+ x = P.var X+ f = x^(9::Int) - 15*x^(6::Int) - 87*x^(3::Int) - 125+ actual, expected :: [UPolynomial Integer]+ actual = sort $ Zassenhaus.zassenhaus f+ expected = sort $ [f] ------------------------------------------------------------------------
test/TestQE.hs view
@@ -13,21 +13,22 @@ import Test.Framework.TH import Test.Framework.Providers.HUnit -import Data.AlgebraicNumber.Real-import Data.ArithRel-import Data.FOL.Arith-import qualified Data.LA as LA-import qualified Data.Polynomial as P import Data.OptDir-import Data.Var -import qualified Algorithm.FourierMotzkin as FourierMotzkin-import qualified Algorithm.OmegaTest as OmegaTest-import qualified Algorithm.Cooper as Cooper-import qualified Algorithm.CAD as CAD-import qualified Algorithm.Simplex2 as Simplex2-import qualified Algorithm.ContiTraverso as ContiTraverso+import ToySolver.Data.AlgebraicNumber.Real+import ToySolver.Data.ArithRel+import ToySolver.Data.FOL.Arith+import qualified ToySolver.Data.LA as LA+import qualified ToySolver.Data.Polynomial as P+import ToySolver.Data.Var +import qualified ToySolver.FourierMotzkin as FourierMotzkin+import qualified ToySolver.OmegaTest as OmegaTest+import qualified ToySolver.Cooper as Cooper+import qualified ToySolver.CAD as CAD+import qualified ToySolver.Simplex2 as Simplex2+import qualified ToySolver.ContiTraverso as ContiTraverso+ ------------------------------------------------------------------------ {-@@ -173,6 +174,19 @@ where vs = Set.fromAscList $ IS.toAscList $ fst test2' cs = map toPRel $ snd test2'++case_CAD_test_nonlinear_multivariate :: IO ()+case_CAD_test_nonlinear_multivariate =+ case CAD.solve vs cs of+ Nothing -> assertFailure "expected: Just\n but got: Nothing"+ Just m ->+ forM_ cs $ \a -> do+ evalPAtom m a @?= True+ where+ vs = Set.fromList [0,1]+ cs = [x^2 - y^2 - 2 .==. 0, 2*y*x .==. 0]+ x = P.var (0::Int)+ y = P.var 1 toP :: LA.Expr Rational -> P.Polynomial Rational Int toP e = P.fromTerms [(c, if x == LA.unitVar then P.mone else P.var x) | (c,x) <- LA.terms e]
test/TestSAT.hs view
@@ -2,20 +2,28 @@ module Main (main) where import Control.Monad+import Data.Array.IArray import Data.List+import Data.Set (Set) import qualified Data.Set as Set-import qualified Data.IntSet as IS+import Data.IntSet (IntSet)+import qualified Data.IntSet as IntSet import Test.HUnit hiding (Test)+import Test.QuickCheck import Test.Framework (Test, defaultMain, testGroup) import Test.Framework.TH import Test.Framework.Providers.HUnit-import SAT-import SAT.Types-import qualified SAT.TseitinEncoder as Tseitin-import SAT.TseitinEncoder (Formula (..))-import qualified SAT.MUS as MUS-import qualified SAT.CAMUS as CAMUS+import Test.Framework.Providers.QuickCheck2 +import ToySolver.HittingSet as HittingSet+import ToySolver.SAT+import ToySolver.SAT.Types+import qualified ToySolver.SAT.TseitinEncoder as Tseitin+import ToySolver.SAT.TseitinEncoder (Formula (..))+import qualified ToySolver.SAT.MUS as MUS+import qualified ToySolver.SAT.CAMUS as CAMUS+import qualified ToySolver.SAT.PBO as PBO+ -- should be SAT case_solve_SAT :: IO () case_solve_SAT = do@@ -285,14 +293,14 @@ -- = -4*(1 - x1) + 3*x1 + 10*(not x2) -- = -4 + 4*x1 + 3*x1 + 10*(not x2) -- = 7*x1 + 10*(not x2) - 4-case_normalizePBSum :: Assertion-case_normalizePBSum = do+case_normalizePBLinSum :: Assertion+case_normalizePBLinSum = do sort e @?= sort [(7,x1),(10,-x2)] c @?= -4 where x1 = 1 x2 = 2- (e,c) = normalizePBSum ([(-4,-x1),(3,x1),(10,-x2)], 0)+ (e,c) = normalizePBLinSum ([(-4,-x1),(3,x1),(10,-x2)], 0) -- -4*(not x1) + 3*x1 + 10*(not x2) >= 3 -- ⇔ -4*(1 - x1) + 3*x1 + 10*(not x2) >= 3@@ -300,27 +308,27 @@ -- ⇔ 7*x1 + 10*(not x2) >= 7 -- ⇔ 7*x1 + 7*(not x2) >= 7 -- ⇔ x1 + (not x2) >= 1-case_normalizePBAtLeast :: Assertion-case_normalizePBAtLeast = (sort lhs, rhs) @?= (sort [(1,x1),(1,-x2)], 1)+case_normalizePBLinAtLeast :: Assertion+case_normalizePBLinAtLeast = (sort lhs, rhs) @?= (sort [(1,x1),(1,-x2)], 1) where x1 = 1 x2 = 2- (lhs,rhs) = normalizePBAtLeast ([(-4,-x1),(3,x1),(10,-x2)], 3)+ (lhs,rhs) = normalizePBLinAtLeast ([(-4,-x1),(3,x1),(10,-x2)], 3) -case_normalizePBExactly_1 :: Assertion-case_normalizePBExactly_1 = (sort lhs, rhs) @?= (sort [(3,x1),(2,x2)], 1)+case_normalizePBLinExactly_1 :: Assertion+case_normalizePBLinExactly_1 = (sort lhs, rhs) @?= (sort [(3,x1),(2,x2)], 1) where x1 = 1 x2 = 2- (lhs,rhs) = normalizePBExactly ([(6,x1),(4,x2)], 2)+ (lhs,rhs) = normalizePBLinExactly ([(6,x1),(4,x2)], 2) -case_normalizePBExactly_2 :: Assertion-case_normalizePBExactly_2 = (sort lhs, rhs) @?= ([], 1)+case_normalizePBLinExactly_2 :: Assertion+case_normalizePBLinExactly_2 = (sort lhs, rhs) @?= ([], 1) where x1 = 1 x2 = 2 x3 = 3- (lhs,rhs) = normalizePBExactly ([(2,x1),(2,x2),(2,x3)], 3)+ (lhs,rhs) = normalizePBLinExactly ([(2,x1),(2,x2),(2,x3)], 3) case_cutResolve_1 :: Assertion case_cutResolve_1 = (sort lhs, rhs) @?= (sort [(1,x3),(1,x4)], 1)@@ -349,6 +357,17 @@ where (lhs, rhs) = cardinalityReduction ([(6,1),(5,2),(4,3),(3,4),(2,5),(1,6)], 17) +case_pbSubsume_clause :: Assertion+case_pbSubsume_clause = pbSubsume ([(1,1),(1,-3)],1) ([(1,1),(1,2),(1,-3),(1,4)],1) @?= True++case_pbSubsume_1 :: Assertion+case_pbSubsume_1 = pbSubsume ([(1,1),(1,2),(1,-3)],2) ([(1,1),(2,2),(1,-3),(1,4)],1) @?= True++case_pbSubsume_2 :: Assertion+case_pbSubsume_2 = pbSubsume ([(1,1),(1,2),(1,-3)],2) ([(1,1),(2,2),(1,-3),(1,4)],3) @?= False++------------------------------------------------------------------------+ -- from "Pueblo: A Hybrid Pseudo-Boolean SAT Solver" -- clauseがunitになるレベルで、PB制約が違反状態のままという例。 case_hybridLearning_1 :: IO ()@@ -420,7 +439,7 @@ solver <- newSolver enc <- Tseitin.newEncoder solver - [x1,x2,x3,x4,x5] <- replicateM 5 $ liftM Var $ newVar solver+ [x1,x2,x3,x4,x5] <- replicateM 5 $ liftM Lit $ newVar solver Tseitin.addFormula enc $ Or [Imply x1 (And [x3,x4]), Imply x2 (And [x3,x5])] -- x6 = x3 ∧ x4 -- x7 = x3 ∧ x5@@ -485,6 +504,20 @@ evalLit m x2 @?= False evalLit m x3 @?= False +case_evalFormula = do+ solver <- newSolver+ xs <- newVars solver 5+ let f = Or [Imply x1 (And [x3,x4]), Imply x2 (And [x3,x5])]+ where+ [x1,x2,x3,x4,x5] = map Tseitin.Lit xs+ g m = (not x1 || (x3 && x4)) || (not x2 || (x3 && x5))+ where+ [x1,x2,x3,x4,x5] = elems m+ let ms :: [Model]+ ms = liftM (array (1,5)) $ sequence [[(x,val) | val <- [False,True]] | x <- xs]+ forM_ ms $ \m -> do+ Tseitin.evalFormula m f @?= g m+ ------------------------------------------------------------------------ case_MUS = do@@ -502,8 +535,8 @@ ret @?= False actual <- MUS.findMUSAssumptions solver MUS.defaultOptions- let actual' = IS.fromList $ map (\x -> x-3) actual- expected = map IS.fromList [[1, 2], [1, 3, 4], [1, 5, 6]]+ let actual' = IntSet.fromList $ map (\x -> x-3) actual+ expected = map IntSet.fromList [[1, 2], [1, 3, 4], [1, 5, 6]] actual' `elem` expected @?= True ------------------------------------------------------------------------@@ -533,9 +566,9 @@ addClause solver [-y5, -x1, x3] addClause solver [-y6, -x3] actual <- CAMUS.allMCSAssumptions solver sels CAMUS.defaultOptions- let actual' = Set.fromList $ map IS.fromList actual+ let actual' = Set.fromList $ map IntSet.fromList actual expected = [[1], [2,3,5], [2,3,6], [2,4,5], [2,4,6]]- expected' = Set.fromList $ map (IS.fromList . map (+3)) expected+ expected' = Set.fromList $ map (IntSet.fromList . map (+3)) expected actual' @?= expected' case_camus_allMUSAssumptions = do@@ -549,17 +582,185 @@ addClause solver [-y5, -x1, x3] addClause solver [-y6, -x3] actual <- CAMUS.allMUSAssumptions solver sels CAMUS.defaultOptions- let actual' = Set.fromList $ map IS.fromList actual+ let actual' = Set.fromList $ map IntSet.fromList actual expected = [[1,2], [1,3,4], [1,5,6]]- expected' = Set.fromList $ map (IS.fromList . map (+3)) expected+ expected' = Set.fromList $ map (IntSet.fromList . map (+3)) expected actual' @?= expected' -case_camus_hittingSetDual = actual' @?= expected'+case_minimalHittingSets_1 = actual' @?= expected' where- actual = CAMUS.hittingSetDual [[1], [2,3,5], [2,3,6], [2,4,5], [2,4,6]]- actual' = Set.fromList $ map IS.fromList actual+ actual = HittingSet.minimalHittingSets [[1], [2,3,5], [2,3,6], [2,4,5], [2,4,6]]+ actual' = Set.fromList $ map IntSet.fromList actual expected = [[1,2], [1,3,4], [1,5,6]]- expected' = Set.fromList $ map IS.fromList expected+ expected' = Set.fromList $ map IntSet.fromList expected++-- an example from http://kuma-san.net/htcbdd.html+case_minimalHittingSets_2 = actual' @?= expected'+ where+ actual = HittingSet.minimalHittingSets [[2,4,7], [7,8], [9], [9,10]]+ actual' = Set.fromList $ map IntSet.fromList actual+ expected = [[7,9], [4,8,9], [2,8,9]]+ expected' = Set.fromList $ map IntSet.fromList expected++prop_minimalHittingSets_duality =+ forAll hyperGraph $ \g ->+ let h = HittingSet.minimalHittingSets g+ in normalize h == normalize (HittingSet.minimalHittingSets (HittingSet.minimalHittingSets h))+ where+ hyperGraph :: Gen [[Int]]+ hyperGraph = do+ nv <- choose (0, 10)+ ne <- choose (0, 20)+ replicateM ne $ do+ n <- choose (1,nv)+ liftM (IntSet.toList . IntSet.fromList) $ replicateM n $ choose (1, nv)++ normalize :: [[Int]] -> Set IntSet+ normalize = Set.fromList . map IntSet.fromList++{-+Boosting a Complete Technique to Find MSS and MUS thanks to a Local Search Oracle+http://www.cril.univ-artois.fr/~piette/IJCAI07_HYCAM.pdf+Example 3.+C0 : (d)+C1 : (b ∨ c)+C2 : (a ∨ b)+C3 : (a ∨ ¬c)+C4 : (¬b ∨ ¬e)+C5 : (¬a ∨ ¬b)+C6 : (a ∨ e)+C7 : (¬a ∨ ¬e)+C8 : (b ∨ e)+C9 : (¬a ∨ b ∨ ¬c)+C10 : (¬a ∨ b ∨ ¬d)+C11 : (a ∨ ¬b ∨ c)+C12 : (a ∨ ¬b ∨ ¬d)+-}+case_camus_allMUSAssumptions_2 = do+ solver <- newSolver+ [a,b,c,d,e] <- newVars solver 5+ sels@[y0,y1,y2,y3,y4,y5,y6,y7,y8,y9,y10,y11,y12] <- newVars solver 13+ addClause solver [-y0, d]+ addClause solver [-y1, b, c]+ addClause solver [-y2, a, b]+ addClause solver [-y3, a, -c]+ addClause solver [-y4, -b, -e]+ addClause solver [-y5, -a, -b]+ addClause solver [-y6, a, e]+ addClause solver [-y7, -a, -e]+ addClause solver [-y8, b, e]+ addClause solver [-y9, -a, b, -c]+ addClause solver [-y10, -a, b, -d]+ addClause solver [-y11, a, -b, c]+ addClause solver [-y12, a, -b, -d]++ -- Only three of the MUSes (marked with asterisks) are on the paper.+ let cores =+ [ [y0,y1,y2,y5,y9,y12]+ , [y0,y1,y3,y4,y5,y6,y10]+ , [y0,y1,y3,y5,y7,y8,y12]+ , [y0,y1,y3,y5,y9,y12]+ , [y0,y1,y3,y5,y10,y11]+ , [y0,y1,y3,y5,y10,y12]+ , [y0,y2,y3,y5,y10,y11]+ , [y0,y2,y4,y5,y6,y10]+ , [y0,y2,y5,y7,y8,y12]+ , [y0,y2,y5,y10,y12] -- (*)+ , [y1,y2,y4,y5,y6,y9]+ , [y1,y3,y4,y5,y6,y7,y8]+ , [y1,y3,y4,y5,y6,y9]+ , [y1,y3,y5,y7,y8,y11]+ , [y1,y3,y5,y9,y11] -- (*)+ , [y2,y3,y5,y7,y8,y11]+ , [y2,y4,y5,y6,y7,y8] -- (*)+ ]++ let remove1 :: [a] -> [[a]]+ remove1 [] = []+ remove1 (x:xs) = xs : [x : ys | ys <- remove1 xs]+ forM_ cores $ \core -> do+ ret <- solveWith solver core+ assertBool (show core ++ " should be a core") (not ret)+ forM (remove1 core) $ \xs -> do+ ret <- solveWith solver xs+ assertBool (show core ++ " should be satisfiable") ret++ actual <- CAMUS.allMUSAssumptions solver sels CAMUS.defaultOptions+ let actual' = Set.fromList $ map IntSet.fromList actual+ expected' = Set.fromList $ map IntSet.fromList cores+ actual' @?= expected'++case_HYCAM_allMUSAssumptions = do+ solver <- newSolver+ [a,b,c,d,e] <- newVars solver 5+ sels@[y0,y1,y2,y3,y4,y5,y6,y7,y8,y9,y10,y11,y12] <- newVars solver 13+ addClause solver [-y0, d]+ addClause solver [-y1, b, c]+ addClause solver [-y2, a, b]+ addClause solver [-y3, a, -c]+ addClause solver [-y4, -b, -e]+ addClause solver [-y5, -a, -b]+ addClause solver [-y6, a, e]+ addClause solver [-y7, -a, -e]+ addClause solver [-y8, b, e]+ addClause solver [-y9, -a, b, -c]+ addClause solver [-y10, -a, b, -d]+ addClause solver [-y11, a, -b, c]+ addClause solver [-y12, a, -b, -d]++ -- Only three of the MUSes (marked with asterisks) are on the paper.+ let cores =+ [ [y0,y1,y2,y5,y9,y12]+ , [y0,y1,y3,y4,y5,y6,y10]+ , [y0,y1,y3,y5,y7,y8,y12]+ , [y0,y1,y3,y5,y9,y12]+ , [y0,y1,y3,y5,y10,y11]+ , [y0,y1,y3,y5,y10,y12]+ , [y0,y2,y3,y5,y10,y11]+ , [y0,y2,y4,y5,y6,y10]+ , [y0,y2,y5,y7,y8,y12]+ , [y0,y2,y5,y10,y12] -- (*)+ , [y1,y2,y4,y5,y6,y9]+ , [y1,y3,y4,y5,y6,y7,y8]+ , [y1,y3,y4,y5,y6,y9]+ , [y1,y3,y5,y7,y8,y11]+ , [y1,y3,y5,y9,y11] -- (*)+ , [y2,y3,y5,y7,y8,y11]+ , [y2,y4,y5,y6,y7,y8] -- (*)+ ]+ mcses =+ [ [y0,y1,y7]+ , [y0,y1,y8]+ , [y0,y3,y4]+ , [y0,y3,y6]+ , [y0,y4,y11]+ , [y0,y6,y11]+ , [y0,y7,y9]+ , [y0,y8,y9]+ , [y1,y2]+ , [y1,y7,y10]+ , [y1,y8,y10]+ , [y2,y3]+ , [y3,y4,y12]+ , [y3,y6,y12]+ , [y4,y11,y12]+ , [y5]+ , [y6,y11,y12]+ , [y7,y9,y10]+ , [y8,y9,y10]+ ]++ -- HYCAM paper wrongly treated {C3,C8,C10} as a candidate MCS (CoMSS).+ -- Its complement {C0,C1,C2,C4,C5,C6,C7,C9,C11,C12} is unsatisfiable+ -- and hence not MSS.+ ret <- solveWith solver [y0,y1,y2,y4,y5,y6,y7,y9,y11,y12]+ assertBool "failed to prove the bug of HYCAM paper" (not ret)+ + let cand = [[y5], [y3,y2], [y0,y1,y2]]+ actual <- CAMUS.allMUSAssumptions solver sels CAMUS.defaultOptions{ CAMUS.optMCSCandidates = cand }+ let actual' = Set.fromList $ map IntSet.fromList actual+ expected' = Set.fromList $ map IntSet.fromList cores+ actual' @?= expected' ------------------------------------------------------------------------ -- Test harness
+ test/TestSDPFile.hs view
@@ -0,0 +1,80 @@+{-# LANGUAGE TemplateHaskell #-}+module Main (main) where++import Control.Monad+import Data.List+import Data.Maybe+import Test.HUnit hiding (Test)+import Test.Framework (Test, defaultMain, testGroup)+import Test.Framework.TH+import Test.Framework.Providers.HUnit+import ToySolver.Text.SDPFile++------------------------------------------------------------------------+-- Sample data++example1 :: Problem+example1+ = Problem+ { blockStruct = [2]+ , costs = [48, -8, 20]+ , matrices = map denseMatrix [f0,f1,f2,f3]+ }+ where+ f0 = [[[-11,0], [0,23]]]+ f1 = [[[10,4], [4,0]]]+ f2 = [[[0,0], [0,-8]]]+ f3 = [[[0,-8], [-8,-2]]]++example2 :: Problem+example2+ = Problem+ { blockStruct = [2,3,-2]+ , costs = [1.1, -10, 6.6, 19, 4.1]+ , matrices = map denseMatrix [f0,f1,f5]+ }+ where+ f0 = [ [[-1.4, -3.2], [-3.2, -28]]+ , [[15, -12, 2.1], [-12, 16, -3.8], [2.1, -3.8, 15]] + , [[1.8, 0], [0, -4.0]] + ]+ f1 = [ [[0.5, 5.2], [5.2,-5.3]]+ , [[7.8, -2.4, 6.0], [-2.4, 4.2, 6.5], [6.0, 6.5, 2.1]] + , [[-4.5, 0], [0, -3.5]]+ ]+ f5 = [ [[-6.5, -5.4], [-5.4, -6.6]]+ , [[6.7, -7.2, -3.6], [-7.2, 7.3, -3.0], [-3.6, -3.0, -1.4]] + , [[6.1, 0],[0, -1.5]] + ]++case_test1 = checkParsed example1b example1+ where+ s = render example1 ""+ example1b = parseDataString "" s++case_test2 = checkParsed example1b example1+ where+ s = renderSparse example1 ""+ example1b = parseSparseDataString "" s++case_test3 = checkParsed example2b example2+ where+ s = render example2 ""+ example2b = parseDataString "" s++case_test4 = checkParsed example2b example2+ where+ s = renderSparse example2 ""+ example2b = parseSparseDataString "" s++-- checkParsed :: Either ParseError Problem -> Problem -> IO ()+checkParsed actual expected =+ case actual of+ Left err -> assertFailure $ show err+ Right prob -> prob @?= expected++------------------------------------------------------------------------+-- Test harness++main :: IO ()+main = $(defaultMainGenerator)
+ test/TestSimplex.hs view
@@ -0,0 +1,178 @@+{-# LANGUAGE TemplateHaskell #-}+module Main (main) where++import Control.Monad+import Control.Monad.State+import Data.IntMap (IntMap)+import qualified Data.IntMap as IntMap+import Data.IntSet (IntSet)+import qualified Data.IntSet as IntSet+import Data.List+import Data.Ratio+import Test.HUnit hiding (Test)+import Test.Framework (Test, defaultMain, testGroup)+import Test.Framework.TH+import Test.Framework.Providers.HUnit+import Text.Printf++import qualified ToySolver.Data.LA as LA+import ToySolver.Data.LA ((.<=.))+import ToySolver.Simplex+import qualified ToySolver.LPSolver as LP++example_3_2 :: Tableau Rational+example_3_2 = IntMap.fromList+ [ (4, (IntMap.fromList [(1,2), (2,1), (3,1)], 2))+ , (5, (IntMap.fromList [(1,1), (2,2), (3,3)], 5))+ , (6, (IntMap.fromList [(1,2), (2,2), (3,1)], 6))+ , (objRowIndex, (IntMap.fromList [(1,-3), (2,-2), (3,-3)], 0))+ ]++case_example_3_2_simplex :: IO ()+case_example_3_2_simplex = do+ assertBool "simplex failed" ret+ assertBool "invalid tableau" (isValidTableau result)+ assertBool "infeasible tableau" (isFeasible result)+ assertBool "unoptimal tableau" (isOptimal OptMax result)+ currentObjValue result @?= 27/5+ where+ ret :: Bool+ result :: Tableau Rational+ (ret,result) = simplex OptMax example_3_2++case_example_3_2_primalDualSimplex :: IO ()+case_example_3_2_primalDualSimplex = do+ assertBool "simplex failed" ret+ assertBool "invalid tableau" (isValidTableau result)+ assertBool "infeasible tableau" (isFeasible result)+ assertBool "unoptimal tableau" (isOptimal OptMax result)+ currentObjValue result @?= 27/5+ where+ ret :: Bool+ result :: Tableau Rational+ (ret,result) = primalDualSimplex OptMax example_3_2++-- from http://www.math.cuhk.edu.hk/~wei/lpch5.pdf+exampe_5_3_phase1 :: Tableau Rational+exampe_5_3_phase1 = IntMap.fromList+ [ (6, (IntMap.fromList [(2,-1), (3,-1), (5,1), (6,1)], 1))+ , (7, (IntMap.fromList [(3,1), (4,-1), (5,1), (7,1)], 0))+ ]++case_exampe_5_3_phase1 :: IO ()+case_exampe_5_3_phase1 = do+ let (ret,result) = phaseI exampe_5_3_phase1 (IntSet.fromList [6,7])+ assertBool "phase1 failed" ret+ assertBool "invalid tableau" (isValidTableau result)+ assertBool "infeasible tableau" (isFeasible result) ++-- 退化して巡回の起こるKuhnの7変数3制約の例+kuhn_7_3 :: Tableau Rational+kuhn_7_3 = IntMap.fromList+ [ (1, (IntMap.fromList [(4,-2), (5,-9), (6,1), (7,9)], 0))+ , (2, (IntMap.fromList [(4,1/3), (5,1), (6,-1/3), (7,-2)], 0))+ , (3, (IntMap.fromList [(4,2), (5,3), (6,-1), (7,-12)], 2))+ , (objRowIndex, (IntMap.fromList [(4,2), (5,3), (6,-1), (7,-12)], 0))+ ]++case_kuhn_7_3 :: IO ()+case_kuhn_7_3 = do+ assertBool "simplex failed" ret+ assertBool "invalid tableau" (isValidTableau result)+ currentObjValue result @?= -2+ where+ ret :: Bool+ result :: Tableau Rational+ (ret,result) = simplex OptMin kuhn_7_3++-- case_pd_kuhn_7_3 :: IO ()+-- case_pd_kuhn_7_3 = do+-- assertBool "simplex failed" ret+-- assertBool "invalid tableau" (isValidTableau result)+-- currentObjValue result @?= -2+-- where+-- ret :: Bool+-- result :: Tableau Rational+-- (ret,result) = primalDualSimplex OptMin kuhn_7_3++-- from http://www.math.cuhk.edu.hk/~wei/lpch5.pdf+example_5_7 :: Tableau Rational+example_5_7 = IntMap.fromList+ [ (4, (IntMap.fromList [(1,-1), (2,-2), (3,-3)], -5))+ , (5, (IntMap.fromList [(1,-2), (2,-2), (3,-1)], -6))+ , (objRowIndex, (IntMap.fromList [(1,3),(2,4),(3,5)], 0))+ ]++case_example_5_7 :: IO ()+case_example_5_7 = do+ assertBool "dual simplex failed" ret+ assertBool "invalid tableau" (isValidTableau result)+ currentObjValue result @?= -11+ where+ ret :: Bool+ result :: Tableau Rational+ (ret,result) = dualSimplex OptMax example_5_7++case_pd_example_5_7 :: IO ()+case_pd_example_5_7 = do+ assertBool "dual simplex failed" ret+ assertBool "invalid tableau" (isValidTableau result)+ currentObjValue result @?= -11+ where+ ret :: Bool+ result :: Tableau Rational+ (ret,result) = primalDualSimplex OptMax example_5_7++------------------------------------------------------------------------++case_lp_example_5_7_twoPhaseSimplex :: IO ()+case_lp_example_5_7_twoPhaseSimplex = do + ret @?= LP.Optimum+ oval @?= -11+ assertBool "invalid tableau" (isValidTableau tbl)+ assertBool "infeasible tableau" (isFeasible tbl)+ assertBool "non-optimal tableau" (isOptimal OptMax tbl)+ where+ oval :: Rational+ ((ret,tbl,oval),result) = flip runState (LP.emptySolver IntSet.empty) $ do+ _ <- LP.newVar+ x1 <- LP.newVar + x2 <- LP.newVar+ x3 <- LP.newVar+ LP.addConstraint (LA.fromTerms [(-1,x1),(-2,x2),(-3,x3)] .<=. LA.constant (-5))+ LP.addConstraint (LA.fromTerms [(-2,x1),(-2,x2),(-1,x3)] .<=. LA.constant (-6))+ let obj = LA.fromTerms [(-3,x1), (-4,x2),(-5,x3)]+ ret <- LP.twoPhaseSimplex OptMax obj+ tbl <- LP.getTableau+ m <- LP.getModel (IntSet.fromList [x1,x2,x3])+ let oval = LA.evalExpr m obj+ return (ret,tbl,oval)++case_lp_example_5_7_primalDualSimplex :: IO ()+case_lp_example_5_7_primalDualSimplex = do + ret @?= LP.Optimum+ oval @?= -11+ assertBool "invalid tableau" (isValidTableau tbl)+ assertBool "infeasible tableau" (isFeasible tbl)+ assertBool "non-optimal tableau" (isOptimal OptMax tbl)+ where+ oval :: Rational+ ((ret,tbl,oval),result) = flip runState (LP.emptySolver IntSet.empty) $ do+ _ <- LP.newVar+ x1 <- LP.newVar + x2 <- LP.newVar+ x3 <- LP.newVar+ LP.addConstraint (LA.fromTerms [(-1,x1),(-2,x2),(-3,x3)] .<=. LA.constant (-5))+ LP.addConstraint (LA.fromTerms [(-2,x1),(-2,x2),(-1,x3)] .<=. LA.constant (-6))+ let obj = LA.fromTerms [(-3,x1), (-4,x2),(-5,x3)]+ ret <- LP.primalDualSimplex OptMax obj+ tbl <- LP.getTableau+ m <- LP.getModel (IntSet.fromList [x1,x2,x3])+ let oval = LA.evalExpr m obj+ return (ret,tbl,oval)++------------------------------------------------------------------------+-- Test harness++main :: IO ()+main = $(defaultMainGenerator)
test/TestSimplex2.hs view
@@ -11,8 +11,8 @@ import Test.Framework.Providers.HUnit import Text.Printf -import qualified Data.LA as LA-import Algorithm.Simplex2+import qualified ToySolver.Data.LA as LA+import ToySolver.Simplex2 case_test1 :: IO () case_test1 = do
test/TestUtil.hs view
@@ -1,13 +1,18 @@-{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TemplateHaskell, ScopedTypeVariables #-} module Main (main) where +import Control.Monad import Test.HUnit hiding (Test)+import Test.QuickCheck import Test.Framework (Test, defaultMain, testGroup) import Test.Framework.TH+import Test.Framework.Providers.QuickCheck2 import Test.Framework.Providers.HUnit-import Util+import qualified ToySolver.Data.Vec as Vec+import ToySolver.Internal.Util+import ToySolver.Internal.TextUtil+import qualified ToySolver.Knapsack as Knapsack --- should be SAT case_showRationalAsDecimal :: IO () case_showRationalAsDecimal = do showRationalAsFiniteDecimal 0 @?= Just "0.0"@@ -21,6 +26,52 @@ showRationalAsFiniteDecimal (-5/4) @?= Just "-1.25" showRationalAsFiniteDecimal (4/3) @?= Nothing showRationalAsFiniteDecimal (-4/3) @?= Nothing++case_readUnsignedInteger_maxBound_bug :: IO ()+case_readUnsignedInteger_maxBound_bug =+ readUnsignedInteger "006666666666666667" @?= 6666666666666667++prop_readUnsignedInteger = + forAll (choose (0, 2^128)) $ \i -> + readUnsignedInteger (show i) == i++case_knapsack_1 :: IO ()+case_knapsack_1 = Knapsack.solve [(5,4), (6,5), (3,2)] 9 @?= (11, 9, [True,True,False])++case_knapsack_2 :: IO ()+case_knapsack_2 = Knapsack.solve [(16,2), (19,3), (23,4), (28,5)] 7 @?= (44, 7, [True,False,False,True])++case_Vec :: IO ()+case_Vec = do+ (v::Vec.UVec Int) <- Vec.new+ let xs = [0..100]+ forM_ xs $ \i -> Vec.push v i+ ys <- Vec.getElems v+ ys @?= xs++ Vec.resize v 4+ zs <- Vec.getElems v+ zs @?= take 4 xs++ Vec.push v 1+ Vec.push v 2+ Vec.push v 3++ ws <- Vec.getElems v+ ws @?= take 4 xs ++ [1,2,3]++case_Vec_clone :: IO ()+case_Vec_clone = do+ (v::Vec.UVec Int) <- Vec.new + Vec.push v 0+ v2 <- Vec.clone v+ Vec.write v2 0 1++ a <- Vec.read v 0+ a @?= 0++ b <- Vec.read v2 0+ b @?= 1 ------------------------------------------------------------------------ -- Test harness
toyfmf/toyfmf.hs view
@@ -20,7 +20,7 @@ import System.Environment import System.IO import qualified Codec.TPTP as TPTP-import qualified Algorithm.FOLModelFinder as MF+import qualified ToySolver.FOLModelFinder as MF main :: IO () main = do
+ toysat/UBCSAT.hs view
@@ -0,0 +1,61 @@+{-# LANGUAGE ScopedTypeVariables #-}+{-# OPTIONS_GHC -Wall #-}+module UBCSAT (ubcsat) where++import Control.Exception+import Control.Monad+import Data.Array.IArray+import Data.Char+import Data.Either+import Data.Function+import Data.List+import System.Process+import Text.ParserCombinators.Parsec hiding (try)++import qualified ToySolver.SAT.Types as SAT+import qualified ToySolver.Text.MaxSAT as MaxSAT++ubcsat :: FilePath -> FilePath -> MaxSAT.WCNF -> IO (Maybe SAT.Model)+ubcsat cmd fname wcnf = do+ let args =+ [ "-w" | ".wcnf" `isSuffixOf` map toLower fname] +++ [ "-alg", "irots"+ , "-seed", "0"+ , "-runs", "10"+ , "-cutoff", show (MaxSAT.numVars wcnf * 50)+ , "-solve"+ , "-r", "bestsol"+ , "-inst", fname+ ]+ stdinStr = ""+ + ret <- try $ readProcess cmd args stdinStr+ case ret of+ Left (err :: IOError) -> do+ forM_ (lines (show err)) $ \l -> do+ putStr "c " >> putStrLn l+ return Nothing+ Right s -> do+ forM_ (lines s) $ \l -> putStr "c " >> putStrLn l+ case scanSolutions s of+ [] -> return Nothing+ sols -> do+ let (obj,m) = minimumBy (compare `on` fst) sols+ if obj < MaxSAT.topCost wcnf then+ return $ Just $ array (1, MaxSAT.numVars wcnf) (zip [1..] m)+ else+ return Nothing++scanSolutions :: String -> [(Integer, [Bool])]+scanSolutions s = rights $ map (parse solution "") $ lines s++solution :: Parser (Integer, [Bool])+solution = do+ skipMany1 digit+ spaces+ _ <- char '0' <|> char '1'+ spaces+ obj <- liftM read $ many1 digit+ spaces+ values <- many ((char '0' >> return False) <|> (char '1' >> return True))+ return (obj, values)
toysat/toysat.hs view
@@ -3,7 +3,7 @@ ----------------------------------------------------------------------------- -- | -- Module : toysat--- Copyright : (c) Masahiro Sakai 2012+-- Copyright : (c) Masahiro Sakai 2012-2014 -- License : BSD-style -- -- Maintainer : masahiro.sakai@gmail.com@@ -22,6 +22,7 @@ import Data.Array.IArray import qualified Data.ByteString.Lazy as BS import qualified Data.Set as Set+import Data.Map (Map) import qualified Data.Map as Map import Data.Char import Data.IORef@@ -40,6 +41,7 @@ import System.CPUTime import System.FilePath import qualified System.Info as SysInfo+import qualified System.Random as Rand import qualified Language.CNF.Parse.ParseDIMACS as DIMACS import Text.Printf #ifdef __GLASGOW_HASKELL__@@ -52,28 +54,31 @@ import qualified GHC.Stats as Stats #endif -import Data.ArithRel-import qualified Converter.MaxSAT2WBO as MaxSAT2WBO-import qualified SAT-import qualified SAT.PBO as PBO-import qualified SAT.Integer-import qualified SAT.TseitinEncoder as Tseitin-import qualified SAT.MUS as MUS-import qualified SAT.CAMUS as CAMUS-import SAT.Types (pbEval)-import SAT.Printer-import qualified Text.PBFile as PBFile-import qualified Text.LPFile as LPFile-import qualified Text.MPSFile as MPSFile-import qualified Text.MaxSAT as MaxSAT-import qualified Text.GCNF as GCNF-import qualified Text.GurobiSol as GurobiSol-import Version-import Util (showRational, revMapM, revForM)+import ToySolver.Data.ArithRel+import qualified ToySolver.Data.MIP as MIP+import qualified ToySolver.Converter.MaxSAT2WBO as MaxSAT2WBO+import qualified ToySolver.SAT as SAT+import qualified ToySolver.SAT.Types as SAT+import qualified ToySolver.SAT.PBO as PBO+import qualified ToySolver.SAT.Integer as Integer+import qualified ToySolver.SAT.TseitinEncoder as Tseitin+import qualified ToySolver.SAT.MUS as MUS+import qualified ToySolver.SAT.CAMUS as CAMUS+import ToySolver.SAT.Printer+import qualified ToySolver.Text.PBFile as PBFile+import qualified ToySolver.Text.LPFile as LPFile+import qualified ToySolver.Text.MPSFile as MPSFile+import qualified ToySolver.Text.MaxSAT as MaxSAT+import qualified ToySolver.Text.GCNF as GCNF+import qualified ToySolver.Text.GurobiSol as GurobiSol+import ToySolver.Version+import ToySolver.Internal.Util (showRational, revMapM, revForM) +import UBCSAT+ -- ------------------------------------------------------------------------ -data Mode = ModeHelp | ModeVersion | ModeSAT | ModeMUS | ModePB | ModeWBO | ModeMaxSAT | ModeLP+data Mode = ModeHelp | ModeVersion | ModeSAT | ModeMUS | ModePB | ModeWBO | ModeMaxSAT | ModeMIP data Options = Options@@ -85,16 +90,22 @@ , optLearntSizeFirst :: Int , optLearntSizeInc :: Double , optCCMin :: Int+ , optEnablePhaseSaving :: Bool+ , optEnableForwardSubsumptionRemoval :: Bool+ , optEnableBackwardSubsumptionRemoval :: Bool , optRandomFreq :: Double- , optRandomSeed :: Int+ , optRandomGen :: Maybe Rand.StdGen , optLinearizerPB :: Bool+ , optPBHandlerType :: SAT.PBHandlerType , optSearchStrategy :: PBO.SearchStrategy , optObjFunVarsHeuristics :: Bool+ , optLocalSearchInitial :: Bool , optAllMUSes :: Bool , optPrintRational :: Bool , optCheckModel :: Bool , optTimeout :: Integer , optWriteFile :: Maybe FilePath+ , optUBCSAT :: FilePath } defaultOptions :: Options@@ -108,16 +119,22 @@ , optLearntSizeFirst = SAT.defaultLearntSizeFirst , optLearntSizeInc = SAT.defaultLearntSizeInc , optCCMin = SAT.defaultCCMin+ , optEnablePhaseSaving = SAT.defaultEnablePhaseSaving+ , optEnableForwardSubsumptionRemoval = SAT.defaultEnableForwardSubsumptionRemoval , optRandomFreq = SAT.defaultRandomFreq- , optRandomSeed = 0+ , optRandomGen = Nothing , optLinearizerPB = False- , optSearchStrategy = PBO.optSearchStrategy PBO.defaultOptions- , optObjFunVarsHeuristics = PBO.optObjFunVarsHeuristics PBO.defaultOptions+ , optPBHandlerType = SAT.defaultPBHandlerType+ , optEnableBackwardSubsumptionRemoval = SAT.defaultEnableBackwardSubsumptionRemoval+ , optSearchStrategy = PBO.defaultSearchStrategy+ , optObjFunVarsHeuristics = PBO.defaultEnableObjFunVarsHeuristics+ , optLocalSearchInitial = False , optAllMUSes = False , optPrintRational = False , optCheckModel = False , optTimeout = 0 , optWriteFile = Nothing+ , optUBCSAT = "ubcsat" } options :: [OptDescr (Options -> Options)]@@ -125,12 +142,12 @@ [ Option ['h'] ["help"] (NoArg (\opt -> opt{ optMode = Just ModeHelp })) "show help" , Option [] ["version"] (NoArg (\opt -> opt{ optMode = Just ModeVersion})) "show version" - , Option [] ["sat"] (NoArg (\opt -> opt{ optMode = Just ModeSAT })) "solve pseudo boolean problems in .cnf file (default)"- , Option [] ["mus"] (NoArg (\opt -> opt{ optMode = Just ModeMUS })) "solve minimally unsatisfiable subset problems in .gcnf or .cnf file"- , Option [] ["pb"] (NoArg (\opt -> opt{ optMode = Just ModePB })) "solve pseudo boolean problems in .pb file"- , Option [] ["wbo"] (NoArg (\opt -> opt{ optMode = Just ModeWBO })) "solve weighted boolean optimization problem in .opb file"+ , Option [] ["sat"] (NoArg (\opt -> opt{ optMode = Just ModeSAT })) "solve boolean satisfiability problem in .cnf file (default)"+ , Option [] ["mus"] (NoArg (\opt -> opt{ optMode = Just ModeMUS })) "solve minimally unsatisfiable subset problem in .gcnf or .cnf file"+ , Option [] ["pb"] (NoArg (\opt -> opt{ optMode = Just ModePB })) "solve pseudo boolean problem in .opb file"+ , Option [] ["wbo"] (NoArg (\opt -> opt{ optMode = Just ModeWBO })) "solve weighted boolean optimization problem in .wbo file" , Option [] ["maxsat"] (NoArg (\opt -> opt{ optMode = Just ModeMaxSAT })) "solve MaxSAT problem in .cnf or .wcnf file"- , Option [] ["lp"] (NoArg (\opt -> opt{ optMode = Just ModeLP })) "solve binary integer programming problem in .lp or .mps file"+ , Option [] ["lp"] (NoArg (\opt -> opt{ optMode = Just ModeMIP })) "solve bounded integer programming problem in .lp or .mps file" , Option [] ["restart"] (ReqArg (\val opt -> opt{ optRestartStrategy = parseRestartStrategy val }) "<str>")@@ -143,7 +160,7 @@ (printf "The factor with which the restart limit is multiplied in each restart. (default %f)" SAT.defaultRestartInc) , Option [] ["learning"] (ReqArg (\val opt -> opt{ optLearningStrategy = parseLS val }) "<name>")- "Leaning scheme: clause (default)"+ "Leaning scheme: clause (default), hybrid" , Option [] ["learnt-size-first"] (ReqArg (\val opt -> opt{ optLearntSizeFirst = read val }) "<int>") "The initial limit for learnt clauses."@@ -153,27 +170,55 @@ , Option [] ["ccmin"] (ReqArg (\val opt -> opt{ optCCMin = read val }) "<int>") (printf "Conflict clause minimization (0=none, 1=local, 2=recursive; default %d)" SAT.defaultCCMin)+ , Option [] ["enable-phase-saving"]+ (NoArg (\opt -> opt{ optEnablePhaseSaving = True }))+ ("Enable phase saving" ++ (if SAT.defaultEnablePhaseSaving then " (default)" else ""))+ , Option [] ["disable-phase-saving"]+ (NoArg (\opt -> opt{ optEnablePhaseSaving = False }))+ ("Disable phase saving" ++ (if SAT.defaultEnablePhaseSaving then "" else " (default)"))+ , Option [] ["enable-forward-subsumption-removal"]+ (NoArg (\opt -> opt{ optEnableForwardSubsumptionRemoval = True }))+ ("Enable forward subumption removal (clauses only)" ++ (if SAT.defaultEnableForwardSubsumptionRemoval then " (default)" else ""))+ , Option [] ["disable-forward-subsumption-removal"]+ (NoArg (\opt -> opt{ optEnableForwardSubsumptionRemoval = False }))+ ("Disable forward subsumption removal (clauses only)" ++ (if SAT.defaultEnableForwardSubsumptionRemoval then "" else " (default)"))+ , Option [] ["enable-backward-subsumption-removal"]+ (NoArg (\opt -> opt{ optEnableBackwardSubsumptionRemoval = True }))+ ("Enable backward subsumption removal." ++ (if SAT.defaultEnableBackwardSubsumptionRemoval then " (default)" else ""))+ , Option [] ["disable-backward-subsumption-removal"]+ (NoArg (\opt -> opt{ optEnableBackwardSubsumptionRemoval = False }))+ ("Disable backward subsumption removal." ++ (if SAT.defaultEnableBackwardSubsumptionRemoval then "" else " (default)")) , Option [] ["random-freq"] (ReqArg (\val opt -> opt{ optRandomFreq = read val }) "<0..1>") (printf "The frequency with which the decision heuristic tries to choose a random variable (default %f)" SAT.defaultRandomFreq) , Option [] ["random-seed"]- (ReqArg (\val opt -> opt{ optRandomSeed = read val }) "<int>")- "Used by the random variable selection"+ (ReqArg (\val opt -> opt{ optRandomGen = Just (Rand.mkStdGen (read val)) }) "<int>")+ "random seed used by the random variable selection"+ , Option [] ["random-gen"]+ (ReqArg (\val opt -> opt{ optRandomGen = Just (read val) }) "<str>")+ "another way of specifying random seed used by the random variable selection" , Option [] ["linearizer-pb"] (NoArg (\opt -> opt{ optLinearizerPB = True })) "Use PB constraint in linearization." + , Option [] ["pb-handler"]+ (ReqArg (\val opt -> opt{ optPBHandlerType = parsePBHandler val }) "<name>")+ "PB constraint handler: counter (default), pueblo"+ , Option [] ["search"] (ReqArg (\val opt -> opt{ optSearchStrategy = parseSearch val }) "<str>")- "Search algorithm used in optimization; linear (default), binary, adaptive, unsat"+ "Search algorithm used in optimization; linear (default), binary, adaptive, unsat, msu4, bc, bcd, bcd2" , Option [] ["objfun-heuristics"] (NoArg (\opt -> opt{ optObjFunVarsHeuristics = True })) "Enable heuristics for polarity/activity of variables in objective function (default)" , Option [] ["no-objfun-heuristics"] (NoArg (\opt -> opt{ optObjFunVarsHeuristics = False })) "Disable heuristics for polarity/activity of variables in objective function"+ , Option [] ["ls-initial"]+ (NoArg (\opt -> opt{ optLocalSearchInitial = True }))+ "Use local search (currently UBCSAT) for finding initial solution" , Option [] ["all-mus"] (NoArg (\opt -> opt{ optAllMUSes = True }))@@ -193,6 +238,10 @@ , Option [] ["timeout"] (ReqArg (\val opt -> opt{ optTimeout = read val }) "<int>") "Kill toysat after given number of seconds (default 0 (no limit))"++ , Option [] ["with-ubcsat"]+ (ReqArg (\val opt -> opt{ optUBCSAT = val }) "<PATH>")+ "give the path to the UBCSAT command" ] where parseRestartStrategy s =@@ -200,7 +249,7 @@ "minisat" -> SAT.MiniSATRestarts "armin" -> SAT.ArminRestarts "luby" -> SAT.LubyRestarts- _ -> undefined+ _ -> error (printf "unknown restart strategy \"%s\"" s) parseSearch s = case map toLower s of@@ -209,12 +258,23 @@ "adaptive" -> PBO.AdaptiveSearch "unsat" -> PBO.UnsatBased "msu4" -> PBO.MSU4- _ -> error (printf "unknown search strategy %s" s)+ "bc" -> PBO.BC+ "bcd" -> PBO.BCD+ "bcd2" -> PBO.BCD2+ _ -> error (printf "unknown search strategy \"%s\"" s) - parseLS "clause" = SAT.LearningClause- parseLS "hybrid" = SAT.LearningHybrid- parseLS s = error (printf "unknown learning strategy %s" s)+ parseLS s =+ case map toLower s of+ "clause" -> SAT.LearningClause+ "hybrid" -> SAT.LearningHybrid+ _ -> error (printf "unknown learning strategy \"%s\"" s) + parsePBHandler s =+ case map toLower s of+ "counter" -> SAT.PBHandlerTypeCounter+ "pueblo" -> SAT.PBHandlerTypePueblo+ _ -> error (printf "unknown PB constraint handler %s" s)+ main :: IO () main = do #ifdef FORCE_CHAR8@@ -246,8 +306,8 @@ ".opb" -> ModePB ".wbo" -> ModeWBO ".wcnf" -> ModeMaxSAT- ".lp" -> ModeLP- ".mps" -> ModeLP+ ".lp" -> ModeMIP+ ".mps" -> ModeMIP _ -> ModeSAT case mode of@@ -274,7 +334,7 @@ ModePB -> mainPB opt solver args2 ModeWBO -> mainWBO opt solver args2 ModeMaxSAT -> mainMaxSAT opt solver args2- ModeLP -> mainLP opt solver args2+ ModeMIP -> mainMIP opt solver args2 when (isNothing ret) $ do putCommentLine "TIMEOUT"@@ -327,7 +387,7 @@ header :: String header = unlines [ "Usage:"- , " toysat [OPTION]... [file.cnf||-]"+ , " toysat [OPTION]... [file.cnf|-]" , " toysat [OPTION]... --mus [file.gcnf|-]" , " toysat [OPTION]... --pb [file.opb|-]" , " toysat [OPTION]... --wbo [file.wbo|-]"@@ -376,9 +436,16 @@ SAT.setLearntSizeInc solver (optLearntSizeInc opts) SAT.setCCMin solver (optCCMin opts) SAT.setRandomFreq solver (optRandomFreq opts)- when (optRandomSeed opts /= 0) $ - SAT.setRandomSeed solver (optRandomSeed opts)+ case optRandomGen opts of+ Nothing -> return ()+ Just gen -> SAT.setRandomGen solver gen+ do gen <- SAT.getRandomGen solver+ putCommentLine $ "use --random-gen=" ++ show (show gen) ++ " option to reproduce the execution" SAT.setLearningStrategy solver (optLearningStrategy opts)+ SAT.setEnablePhaseSaving solver (optEnablePhaseSaving opts)+ SAT.setEnableForwardSubsumptionRemoval solver (optEnableForwardSubsumptionRemoval opts)+ SAT.setEnableBackwardSubsumptionRemoval solver (optEnableBackwardSubsumptionRemoval opts)+ SAT.setPBHandlerType solver (optPBHandlerType opts) SAT.setLogger solver putCommentLine SAT.setCheckModel solver (optCheckModel opts) return solver@@ -398,7 +465,7 @@ solveSAT :: Options -> SAT.Solver -> DIMACS.CNF -> IO () solveSAT opt solver cnf = do putCommentLine $ printf "#vars %d" (DIMACS.numVars cnf)- putCommentLine $ printf "#constraints %d" (length (DIMACS.clauses cnf))+ putCommentLine $ printf "#constraints %d" (DIMACS.numClauses cnf) SAT.newVars_ solver (DIMACS.numVars cnf) forM_ (DIMACS.clauses cnf) $ \clause -> SAT.addClause solver (elems clause)@@ -433,6 +500,7 @@ putCommentLine $ printf "#constraints %d" (GCNF.numClauses gcnf) putCommentLine $ printf "#groups %d" (GCNF.lastGroupIndex gcnf) + SAT.resizeVarCapacity solver (GCNF.numVars gcnf + GCNF.lastGroupIndex gcnf) SAT.newVars_ solver (GCNF.numVars gcnf) tbl <- forM [1 .. GCNF.lastGroupIndex gcnf] $ \i -> do@@ -488,82 +556,93 @@ _ -> showHelp stderr >> exitFailure case ret of Left err -> hPrint stderr err >> exitFailure- Right formula -> solvePB opt solver formula--solvePB :: Options -> SAT.Solver -> PBFile.Formula -> IO ()-solvePB opt solver formula@(obj, cs) = do- let n = PBFile.pbNumVars formula+ Right formula -> solvePB opt solver formula Nothing - putCommentLine $ printf "#vars %d" n- putCommentLine $ printf "#constraints %d" (length cs)+solvePB :: Options -> SAT.Solver -> PBFile.Formula -> Maybe SAT.Model -> IO ()+solvePB opt solver formula initialModel = do+ let nv = PBFile.pbNumVars formula+ nc = PBFile.pbNumConstraints formula+ putCommentLine $ printf "#vars %d" nv+ putCommentLine $ printf "#constraints %d" nc - SAT.newVars_ solver n+ SAT.newVars_ solver nv enc <- Tseitin.newEncoder solver Tseitin.setUsePB enc (optLinearizerPB opt) - forM_ cs $ \(lhs, op, rhs) -> do+ forM_ (PBFile.pbConstraints formula) $ \(lhs, op, rhs) -> do lhs' <- pbConvSum enc lhs case op of PBFile.Ge -> SAT.addPBAtLeast solver lhs' rhs PBFile.Eq -> SAT.addPBExactly solver lhs' rhs - case obj of+ case PBFile.pbObjectiveFunction formula of Nothing -> do result <- SAT.solve solver putSLine $ if result then "SATISFIABLE" else "UNSATISFIABLE" when result $ do m <- SAT.model solver- pbPrintModel stdout m n- writeSOLFile opt m Nothing n+ pbPrintModel stdout m nv+ writeSOLFile opt m Nothing nv Just obj' -> do obj'' <- pbConvSum enc obj' - modelRef <- newIORef Nothing+ nv' <- SAT.nVars solver+ defs <- Tseitin.getDefinitions enc+ let extendModel :: SAT.Model -> SAT.Model+ extendModel m = array (1,nv') (assocs a)+ where+ -- Use BOXED array to tie the knot+ a :: Array SAT.Var Bool+ a = array (1,nv') $ assocs m ++ [(v, Tseitin.evalFormula a phi) | (v,phi) <- defs] - result <- try $ minimize opt solver obj'' $ \m val -> do- writeIORef modelRef (Just m)- putOLine (show val)+ pbo <- PBO.newOptimizer solver obj''+ setupOptimizer pbo opt+ PBO.setOnUpdateBestSolution pbo $ \_ val -> putOLine (show val)+ PBO.setOnUpdateLowerBound pbo $ \lb -> do+ putCommentLine $ printf "lower bound updated to %d" lb - case result of- Right Nothing -> do- putSLine "UNSATISFIABLE"- Right (Just m) -> do- putSLine "OPTIMUM FOUND"- pbPrintModel stdout m n- let objval = pbEval m obj''- writeSOLFile opt m (Just objval) n- Left (e :: SomeException) -> do- r <- readIORef modelRef- case r of- Nothing -> do- putSLine "UNKNOWN"- Just m -> do- putSLine "SATISFIABLE"- pbPrintModel stdout m n- let objval = pbEval m obj''- writeSOLFile opt m (Just objval) n- throwIO e+ case initialModel of+ Nothing -> return ()+ Just m -> PBO.addSolution pbo (extendModel m) -pbConvSum :: Tseitin.Encoder -> PBFile.Sum -> IO [(Integer, SAT.Lit)]+ finally (PBO.optimize pbo) $ do+ ret <- PBO.getBestSolution pbo+ case ret of+ Nothing -> do+ b <- PBO.isUnsat pbo+ if b+ then putSLine "UNSATISFIABLE"+ else putSLine "UNKNOWN"+ Just (m, val) -> do+ b <- PBO.isOptimum pbo+ if b+ then putSLine "OPTIMUM FOUND"+ else putSLine "SATISFIABLE"+ pbPrintModel stdout m nv+ writeSOLFile opt m (Just val) nv++pbConvSum :: Tseitin.Encoder -> PBFile.Sum -> IO SAT.PBLinSum pbConvSum enc = revMapM f where f (w,ls) = do l <- Tseitin.encodeConj enc ls return (w,l) -minimize :: Options -> SAT.Solver -> [(Integer, SAT.Lit)] -> (SAT.Model -> Integer -> IO ()) -> IO (Maybe SAT.Model)-minimize opt solver obj update = do- let opt2 =- PBO.defaultOptions- { PBO.optObjFunVarsHeuristics = optObjFunVarsHeuristics opt- , PBO.optSearchStrategy = optSearchStrategy opt- , PBO.optLogger = putCommentLine- , PBO.optUpdateBest = update- , PBO.optUpdateLB = \val -> putCommentLine $ printf "lower bound updated to %d" val- }- PBO.minimize solver obj opt2+evalPBConstraint :: SAT.IModel m => m -> PBFile.Constraint -> Bool+evalPBConstraint m (lhs,op,rhs) = op' lhs' rhs+ where+ op' = case op of+ PBFile.Ge -> (>=)+ PBFile.Eq -> (==)+ lhs' = sum [if and [SAT.evalLit m lit | lit <- tm] then c else 0 | (c,tm) <- lhs] +setupOptimizer :: PBO.Optimizer -> Options -> IO ()+setupOptimizer pbo opt = do+ PBO.setEnableObjFunVarsHeuristics pbo $ optObjFunVarsHeuristics opt+ PBO.setSearchStrategy pbo $ optSearchStrategy opt+ PBO.setLogger pbo putCommentLine+ -- ------------------------------------------------------------------------ mainWBO :: Options -> SAT.Solver -> [String] -> IO ()@@ -574,19 +653,23 @@ _ -> showHelp stderr >> exitFailure case ret of Left err -> hPrint stderr err >> exitFailure- Right formula -> solveWBO opt solver False formula+ Right formula -> solveWBO opt solver False formula Nothing -solveWBO :: Options -> SAT.Solver -> Bool -> PBFile.SoftFormula -> IO ()-solveWBO opt solver isMaxSat formula@(tco, cs) = do- let nvar = PBFile.wboNumVars formula- putCommentLine $ printf "#vars %d" nvar- putCommentLine $ printf "#constraints %d" (length cs)+solveWBO :: Options -> SAT.Solver -> Bool -> PBFile.SoftFormula -> Maybe SAT.Model -> IO ()+solveWBO opt solver isMaxSat formula initialModel = do+ let nv = PBFile.wboNumVars formula+ nc = PBFile.wboNumConstraints formula+ putCommentLine $ printf "#vars %d" nv+ putCommentLine $ printf "#constraints %d" nc - SAT.newVars_ solver nvar+ SAT.resizeVarCapacity solver (nv + length [() | (Just _, _) <- PBFile.wboConstraints formula])+ SAT.newVars_ solver nv enc <- Tseitin.newEncoder solver Tseitin.setUsePB enc (optLinearizerPB opt) - obj <- liftM concat $ revForM cs $ \(cost, (lhs, op, rhs)) -> do+ defsRef <- newIORef []++ obj <- liftM concat $ revForM (PBFile.wboConstraints formula) $ \(cost, constr@(lhs, op, rhs)) -> do lhs' <- pbConvSum enc lhs case cost of Nothing -> do@@ -603,65 +686,89 @@ _ -> do sel <- SAT.newVar solver SAT.addPBAtLeastSoft solver sel lhs' rhs+ modifyIORef defsRef ((sel, constr) : ) return sel PBFile.Eq -> do sel <- SAT.newVar solver SAT.addPBExactlySoft solver sel lhs' rhs+ modifyIORef defsRef ((sel, constr) : ) return sel return [(cval, SAT.litNot sel)] - case tco of+ case PBFile.wboTopCost formula of Nothing -> return () Just c -> SAT.addPBAtMost solver obj (c-1) - modelRef <- newIORef Nothing- result <- try $ minimize opt solver obj $ \m val -> do- writeIORef modelRef (Just m)- putOLine (show val)+ nv' <- SAT.nVars solver+ defs1 <- Tseitin.getDefinitions enc+ defs2 <- readIORef defsRef+ let extendModel :: SAT.Model -> SAT.Model+ extendModel m = array (1,nv') (assocs a)+ where+ -- Use BOXED array to tie the knot+ a :: Array SAT.Var Bool+ a = array (1,nv') $+ assocs m +++ [(v, Tseitin.evalFormula a phi) | (v, phi) <- defs1] +++ [(v, evalPBConstraint a constr) | (v, constr) <- defs2] - case result of- Right Nothing -> do- putSLine "UNSATISFIABLE"- Right (Just m) -> do- putSLine "OPTIMUM FOUND"- if isMaxSat- then maxsatPrintModel stdout m nvar- else pbPrintModel stdout m nvar- let objval = pbEval m obj- writeSOLFile opt m (Just objval) nvar- Left (e :: SomeException) -> do- r <- readIORef modelRef- case r of- Just m | not isMaxSat -> do+ pbo <- PBO.newOptimizer solver obj+ setupOptimizer pbo opt+ PBO.setOnUpdateBestSolution pbo $ \_ val -> putOLine (show val)+ PBO.setOnUpdateLowerBound pbo $ \lb -> do+ putCommentLine $ printf "lower bound updated to %d" lb++ case initialModel of+ Nothing -> return ()+ Just m -> PBO.addSolution pbo (extendModel m)++ finally (PBO.optimize pbo) $ do+ ret <- PBO.getBestSolution pbo+ case ret of+ Nothing -> do+ b <- PBO.isUnsat pbo+ if b+ then putSLine "UNSATISFIABLE"+ else putSLine "UNKNOWN"+ Just (m, val) -> do+ b <- PBO.isOptimum pbo+ if b then do+ putSLine "OPTIMUM FOUND"+ pbPrintModel stdout m nv+ writeSOLFile opt m (Just val) nv+ else if not isMaxSat then do putSLine "SATISFIABLE"- pbPrintModel stdout m nvar- let objval = pbEval m obj- writeSOLFile opt m (Just objval) nvar- _ -> do+ pbPrintModel stdout m nv+ writeSOLFile opt m (Just val) nv+ else putSLine "UNKNOWN"- throwIO e -- ------------------------------------------------------------------------ mainMaxSAT :: Options -> SAT.Solver -> [String] -> IO () mainMaxSAT opt solver args = do- s <- case args of- ["-"] -> getContents- [fname] -> readFile fname- _ -> showHelp stderr >> exitFailure- let ret = MaxSAT.parseWCNFString s+ ret <- case args of+ ["-"] -> liftM MaxSAT.parseByteString BS.getContents+ [fname] -> MaxSAT.parseFile fname+ _ -> showHelp stderr >> exitFailure case ret of Left err -> hPutStrLn stderr err >> exitFailure- Right wcnf -> solveMaxSAT opt solver wcnf+ Right wcnf -> do+ initialModel <-+ case args of+ [fname] | optLocalSearchInitial opt && or [s `isSuffixOf` map toLower fname | s <- [".cnf", ".wcnf"] ] ->+ UBCSAT.ubcsat (optUBCSAT opt) fname wcnf+ _ -> return Nothing+ solveMaxSAT opt solver wcnf initialModel -solveMaxSAT :: Options -> SAT.Solver -> MaxSAT.WCNF -> IO ()-solveMaxSAT opt solver wcnf =- solveWBO opt solver True (MaxSAT2WBO.convert wcnf)+solveMaxSAT :: Options -> SAT.Solver -> MaxSAT.WCNF -> Maybe SAT.Model -> IO ()+solveMaxSAT opt solver wcnf initialModel =+ solveWBO opt solver True (MaxSAT2WBO.convert wcnf) initialModel -- ------------------------------------------------------------------------ -mainLP :: Options -> SAT.Solver -> [String] -> IO ()-mainLP opt solver args = do+mainMIP :: Options -> SAT.Solver -> [String] -> IO ()+mainMIP opt solver args = do (fname,s) <- case args of ["-"] -> do@@ -671,23 +778,23 @@ s <- readFile fname return (fname, s) _ -> showHelp stderr >> exitFailure- lp <-+ mip <- case LPFile.parseString fname s of- Right lp -> return lp+ Right mip -> return mip Left err -> case MPSFile.parseString fname s of- Right lp -> return lp+ Right mip -> return mip Left err2 -> do hPrint stderr err hPrint stderr err2 exitFailure- solveLP opt solver lp+ solveMIP opt solver mip -solveLP :: Options -> SAT.Solver -> LPFile.LP -> IO ()-solveLP opt solver lp = do+solveMIP :: Options -> SAT.Solver -> MIP.Problem -> IO ()+solveMIP opt solver mip = do if not (Set.null nivs) then do- putCommentLine $ "cannot handle non-integer variables: " ++ intercalate ", " (Set.toList nivs)+ putCommentLine $ "cannot handle non-integer variables: " ++ intercalate ", " (map MIP.fromVar (Set.toList nivs)) putSLine "UNKNOWN" exitFailure else do@@ -696,99 +803,102 @@ putCommentLine $ "Loading variables and bounds" vmap <- liftM Map.fromList $ revForM (Set.toList ivs) $ \v -> do- let (lb,ub) = LPFile.getBounds lp v+ let (lb,ub) = MIP.getBounds mip v case (lb,ub) of- (LPFile.Finite lb', LPFile.Finite ub') -> do- v2 <- SAT.Integer.newVar solver (ceiling lb') (floor ub')+ (MIP.Finite lb', MIP.Finite ub') -> do+ v2 <- Integer.newVar solver (ceiling lb') (floor ub') return (v,v2) _ -> do- putCommentLine $ "cannot handle unbounded variable: " ++ v+ putCommentLine $ "cannot handle unbounded variable: " ++ MIP.fromVar v putSLine "UNKNOWN" exitFailure putCommentLine "Loading constraints"- forM_ (LPFile.constraints lp) $ \c -> do- let indicator = LPFile.constrIndicator c- (lhs, op, rhs) = LPFile.constrBody c- let d = foldl' lcm 1 (map denominator (rhs:[r | LPFile.Term r _ <- lhs]))- lhs' = sumV [asInteger (r * fromIntegral d) *^ product [vmap Map.! v | v <- vs] | LPFile.Term r vs <- lhs]+ forM_ (MIP.constraints mip) $ \c -> do+ let indicator = MIP.constrIndicator c+ (lhs, op, rhs) = MIP.constrBody c+ let d = foldl' lcm 1 (map denominator (rhs:[r | MIP.Term r _ <- lhs]))+ lhs' = sumV [asInteger (r * fromIntegral d) *^ product [vmap Map.! v | v <- vs] | MIP.Term r vs <- lhs] rhs' = asInteger (rhs * fromIntegral d) case indicator of Nothing -> case op of- LPFile.Le -> SAT.Integer.addConstraint enc $ lhs' .<=. fromInteger rhs'- LPFile.Ge -> SAT.Integer.addConstraint enc $ lhs' .>=. fromInteger rhs'- LPFile.Eql -> SAT.Integer.addConstraint enc $ lhs' .==. fromInteger rhs'+ MIP.Le -> Integer.addConstraint enc $ lhs' .<=. fromInteger rhs'+ MIP.Ge -> Integer.addConstraint enc $ lhs' .>=. fromInteger rhs'+ MIP.Eql -> Integer.addConstraint enc $ lhs' .==. fromInteger rhs' Just (var, val) -> do let var' = asBin (vmap Map.! var) f sel = do case op of- LPFile.Le -> SAT.Integer.addConstraintSoft enc sel $ lhs' .<=. fromInteger rhs'- LPFile.Ge -> SAT.Integer.addConstraintSoft enc sel $ lhs' .>=. fromInteger rhs'- LPFile.Eql -> SAT.Integer.addConstraintSoft enc sel $ lhs' .==. fromInteger rhs'+ MIP.Le -> Integer.addConstraintSoft enc sel $ lhs' .<=. fromInteger rhs'+ MIP.Ge -> Integer.addConstraintSoft enc sel $ lhs' .>=. fromInteger rhs'+ MIP.Eql -> Integer.addConstraintSoft enc sel $ lhs' .==. fromInteger rhs' case val of 1 -> f var' 0 -> f (SAT.litNot var') _ -> return () putCommentLine "Loading SOS constraints"- forM_ (LPFile.sos lp) $ \(_label, typ, xs) -> do+ forM_ (MIP.sosConstraints mip) $ \MIP.SOSConstraint{ MIP.sosType = typ, MIP.sosBody = xs } -> do case typ of- LPFile.S1 -> SAT.addAtMost solver (map (asBin . (vmap Map.!) . fst) xs) 1- LPFile.S2 -> do+ MIP.S1 -> SAT.addAtMost solver (map (asBin . (vmap Map.!) . fst) xs) 1+ MIP.S2 -> do let ps = nonAdjacentPairs $ map fst $ sortBy (comparing snd) $ xs forM_ ps $ \(x1,x2) -> do SAT.addClause solver [SAT.litNot $ asBin $ vmap Map.! v | v <- [x1,x2]] - let (_label,obj) = LPFile.objectiveFunction lp - d = foldl' lcm 1 [denominator r | LPFile.Term r _ <- obj] *- (if LPFile.dir lp == LPFile.OptMin then 1 else -1)- obj2 = sumV [asInteger (r * fromIntegral d) *^ product [vmap Map.! v | v <- vs] | LPFile.Term r vs <- obj]- (obj3,obj3_c) <- SAT.Integer.linearize enc obj2+ let (_label,obj) = MIP.objectiveFunction mip + d = foldl' lcm 1 [denominator r | MIP.Term r _ <- obj] *+ (if MIP.dir mip == MIP.OptMin then 1 else -1)+ obj2 = sumV [asInteger (r * fromIntegral d) *^ product [vmap Map.! v | v <- vs] | MIP.Term r vs <- obj]+ (obj3,obj3_c) <- Integer.linearize enc obj2 - modelRef <- newIORef Nothing+ let transformObjVal :: Integer -> Rational+ transformObjVal val = fromIntegral (val + obj3_c) / fromIntegral d - result <- try $ minimize opt solver obj3 $ \m val -> do- writeIORef modelRef (Just m)- putOLine $ showRational (optPrintRational opt) (fromIntegral (val + obj3_c) / fromIntegral d)+ transformModel :: SAT.Model -> Map String Integer+ transformModel m = Map.fromList+ [ (MIP.fromVar v, Integer.eval m (vmap Map.! v)) | v <- Set.toList ivs ] - let printModel :: SAT.Model -> IO ()+ printModel :: Map String Integer -> IO () printModel m = do- forM_ (Set.toList ivs) $ \v -> do- let val = SAT.Integer.eval m (vmap Map.! v)+ forM_ (Map.toList m) $ \(v, val) -> do printf "v %s = %d\n" v val hFlush stdout- writeSol m - writeSol :: SAT.Model -> IO ()- writeSol m = do+ writeSol :: Map String Integer -> Rational -> IO ()+ writeSol m val = do case optWriteFile opt of Nothing -> return () Just fname -> do- let m2 = Map.fromList [ (v, fromInteger val) - | v <- Set.toList ivs- , let val = SAT.Integer.eval m (vmap Map.! v) ]- o = fromInteger $ SAT.Integer.eval m obj2- writeFile fname (GurobiSol.render m2 (Just o))+ writeFile fname (GurobiSol.render (fmap fromInteger m) (Just (fromRational val))) - case result of- Right Nothing -> do- putSLine $ "UNSATISFIABLE"- Right (Just m) -> do- putSLine "OPTIMUM FOUND"- printModel m- Left (e :: SomeException) -> do- r <- readIORef modelRef- case r of- Nothing -> do- putSLine "UNKNOWN"- Just m -> do- putSLine "SATISFIABLE"- printModel m- throwIO e+ pbo <- PBO.newOptimizer solver obj3+ setupOptimizer pbo opt+ PBO.setOnUpdateBestSolution pbo $ \_ val -> do+ putOLine $ showRational (optPrintRational opt) (transformObjVal val)++ finally (PBO.optimize pbo) $ do+ ret <- PBO.getBestSolution pbo+ case ret of+ Nothing -> do+ b <- PBO.isUnsat pbo+ if b+ then putSLine "UNSATISFIABLE"+ else putSLine "UNKNOWN"+ Just (m,val) -> do+ b <- PBO.isOptimum pbo+ if b+ then putSLine "OPTIMUM FOUND"+ else putSLine "SATISFIABLE"+ let m2 = transformModel m+ val2 = transformObjVal val+ printModel m2+ writeSol m2 val2+ where- ivs = LPFile.integerVariables lp- nivs = LPFile.variables lp `Set.difference` ivs+ ivs = MIP.integerVariables mip+ nivs = MIP.variables mip `Set.difference` ivs asInteger :: Rational -> Integer asInteger r@@ -799,8 +909,8 @@ nonAdjacentPairs (x1:x2:xs) = [(x1,x3) | x3 <- xs] ++ nonAdjacentPairs (x2:xs) nonAdjacentPairs _ = [] - asBin :: SAT.Integer.Expr -> SAT.Lit- asBin (SAT.Integer.Expr [(1,[lit])]) = lit+ asBin :: Integer.Expr -> SAT.Lit+ asBin (Integer.Expr [(1,[lit])]) = lit asBin _ = error "asBin: failure" -- ------------------------------------------------------------------------
toysolver.cabal view
@@ -1,30 +1,33 @@ Name: toysolver-Version: 0.0.6+Version: 0.1.0 License: BSD3 License-File: COPYING Author: Masahiro Sakai (masahiro.sakai@gmail.com) Maintainer: masahiro.sakai@gmail.com-Category: Algorithms, Optimisation, Optimization, Theorem Provers+Category: Algorithms, Optimisation, Optimization, Theorem Provers, Constraints Cabal-Version: >= 1.10 Synopsis: Assorted decision procedures for SAT, Max-SAT, PB, MIP, etc Description: Toy-level implementation of some decision procedures Bug-Reports: https://github.com/msakai/toysolver/issues+Tested-With:+ GHC ==7.4.2+ GHC ==7.6.3+ GHC ==7.8.2 Extra-Source-Files: README.md COPYING+ .ghci .travis.yml src/TseitinEncode.hs- src/Data/Polyhedron.hs- src/pbverify.hs- src/maxsatverify.hs- src/pigeonhole.hs- src/Algorithm/Wang.hs+ src/ToySolver/Data/Polyhedron.hs+ src/ToySolver/Wang.hs samples/gcnf/*.cnf samples/gcnf/*.gcnf samples/lp/*.lp samples/lp/error/*.lp samples/maxsat/*.cnf samples/maxsat/*.wcnf+ samples/mps/*.mps samples/pbo/*.opb samples/pbs/*.opb samples/sat/*.cnf@@ -32,6 +35,7 @@ samples/sdp/*.dat samples/sdp/*.dat-s samples/smt/*.smt2+ samples/smt/*.ys samples/qbf/*.qdimacs test/TestAReal2.hs benchmarks/UF250.1065.100/*.cnf@@ -41,20 +45,52 @@ Flag ForceChar8 Description: set default encoding to char8 (not to use iconv) Default: False+ Manual: True +Flag BuildToyFMF+ Description: build toyfmf command+ Default: False+ Manual: True++Flag BuildMiscPrograms+ Description: build misc programs+ Default: False+ Manual: True++Flag Exceptions06+ Description: use exceptions >=0.6+ Manual: False++Flag Random1013+ Description: use random >=1.0.1.3+ Manual: False+ source-repository head type: git location: git://github.com/msakai/toysolver.git Library- Exposed: False+ Exposed: True Hs-source-dirs: src Build-Depends: base >=4 && <5,- containers >= 0.4.2, mtl, array, random, stm >=2.3, parsec, bytestring, filepath, deepseq, time, old-locale, primes,- parse-dimacs, queue, heaps, unbounded-delays, lattices >=1.2.1.1, vector-space >=0.8.6, multiset, algebra,- prettyclass >=1.0.0, type-level-numbers >=0.1.1.0 && <0.2.0.0, hashable >=1.1.2.5 && <1.3.0.0,- OptDir, data-interval >=0.2.0, finite-field >=0.7.0 && <1.0.0+ containers >= 0.4.2, unordered-containers >=0.2.3 && <0.3.0, mtl >=2.1.2, array, stm >=2.3, parsec, bytestring, filepath, deepseq, time, old-locale, primes, process >=1.1.0.2,+ parse-dimacs, queue, heaps, unbounded-delays, vector-space >=0.8.6, multiset,+ prettyclass >=1.0.0, type-level-numbers >=0.1.1.0 && <0.2.0.0, hashable >=1.1.2.5 && <1.3.0.0, intern >=0.9.1.2 && <1.0.0.0,+ loop >=0.2.0 && < 1.0.0,+ OptDir, data-interval >=0.6.0 && <1.0.0, finite-field >=0.7.0 && <1.0.0, sign >=0.2.0 && <1.0.0+ -- NOTE: temporary-1.2.0.2 does not work with exceptions-0.6+ if flag(Exceptions06)+ Build-Depends: temporary >1.2.0.2, exceptions >=0.6+ if !flag(Exceptions06)+ Build-Depends: temporary >=1.2, exceptions ==0.5+ if flag(Random1013)+ -- NOTE: random-1.0.1.3 uses atomicModifyIORef' which is provided by base >=4.6.0.0.+ Build-Depends: base >=4.6.0.0, random >=1.0.1.3+ else+ Build-Depends: random <1.0.1.3+ if impl(ghc)+ Build-Depends: ghc-prim Default-Language: Haskell2010 Other-Extensions: BangPatterns@@ -69,90 +105,104 @@ ScopedTypeVariables TypeFamilies TypeSynonymInstances+ OverloadedStrings Exposed-Modules:- Algebra.Lattice.Boolean- Algorithm.BoundsInference- Algorithm.CAD- Algorithm.CongruenceClosure- Algorithm.ContiTraverso- Algorithm.Cooper- Algorithm.Cooper.Core- Algorithm.Cooper.FOL- Algorithm.FOLModelFinder- Algorithm.FourierMotzkin- Algorithm.FourierMotzkin.Core- Algorithm.FourierMotzkin.FOL- Algorithm.LPSolver- Algorithm.LPSolverHL- Algorithm.LPUtil- Algorithm.MIPSolverHL- Algorithm.MIPSolver2- Algorithm.OmegaTest- Algorithm.OmegaTest.Misc- Algorithm.Simplex- Algorithm.Simplex2- Converter.ObjType- Converter.LP2SMT- Converter.MaxSAT2LP- Converter.MaxSAT2NLPB- Converter.MaxSAT2WBO- Converter.PB2LP- Converter.PB2LSP- Converter.PB2WBO- Converter.PBSetObj- Converter.PB2SMP- Converter.SAT2PB- Converter.SAT2LP- Converter.WBO2PB- Data.AlgebraicNumber.Real- Data.AlgebraicNumber.Root- Data.ArithRel- Data.Delta- Data.DNF- Data.FOL.Arith- Data.FOL.Formula- Data.LA- Data.LA.FOL- Data.LBool- Data.Polynomial- Data.Polynomial.Factorization.FiniteField- Data.Polynomial.Factorization.Hensel- Data.Polynomial.Factorization.Integer- Data.Polynomial.Factorization.Kronecker- Data.Polynomial.Factorization.Rational- Data.Polynomial.Factorization.SquareFree- Data.Polynomial.Factorization.Zassenhaus- Data.Polynomial.GroebnerBasis- Data.Polynomial.Interpolation.Lagrange- Data.Polynomial.RootSeparation.Graeffe- Data.Polynomial.RootSeparation.Sturm- Data.Sign- Data.Var- SAT- SAT.Integer- SAT.MUS- SAT.CAMUS- SAT.PBO- SAT.PBO.MSU4- SAT.PBO.UnsatBased- SAT.TheorySolver- SAT.TseitinEncoder- SAT.Types- SAT.Printer- Text.GCNF- Text.GurobiSol- Text.LPFile- Text.MPSFile- Text.MaxSAT- Text.PBFile- Text.SDPFile- Util- Version+ ToySolver.BoundsInference+ ToySolver.CAD+ ToySolver.CongruenceClosure+ ToySolver.ContiTraverso+ ToySolver.Cooper+ ToySolver.Cooper.Core+ ToySolver.Cooper.FOL+ ToySolver.FOLModelFinder+ ToySolver.FourierMotzkin+ ToySolver.FourierMotzkin.Core+ ToySolver.FourierMotzkin.FOL+ ToySolver.HittingSet+ ToySolver.HittingSet.HTCBDD+ ToySolver.HittingSet.SHD+ ToySolver.Knapsack+ ToySolver.LPSolver+ ToySolver.LPSolverHL+ ToySolver.LPUtil+ ToySolver.MIPSolverHL+ ToySolver.MIPSolver2+ ToySolver.OmegaTest+ ToySolver.OmegaTest.Misc+ ToySolver.Simplex+ ToySolver.Simplex2+ ToySolver.Converter.ObjType+ ToySolver.Converter.MIP2SMT+ ToySolver.Converter.MaxSAT2IP+ ToySolver.Converter.MaxSAT2NLPB+ ToySolver.Converter.MaxSAT2WBO+ ToySolver.Converter.PB2IP+ ToySolver.Converter.PB2LSP+ ToySolver.Converter.PB2WBO+ ToySolver.Converter.PBSetObj+ ToySolver.Converter.PB2SMP+ ToySolver.Converter.SAT2PB+ ToySolver.Converter.SAT2IP+ ToySolver.Converter.WBO2PB+ ToySolver.Data.AlgebraicNumber.Complex+ ToySolver.Data.AlgebraicNumber.Real+ ToySolver.Data.AlgebraicNumber.Root+ ToySolver.Data.AlgebraicNumber.Sturm+ ToySolver.Data.ArithRel+ ToySolver.Data.Boolean+ ToySolver.Data.Delta+ ToySolver.Data.DNF+ ToySolver.Data.FOL.Arith+ ToySolver.Data.FOL.Formula+ ToySolver.Data.LA+ ToySolver.Data.LA.FOL+ ToySolver.Data.LBool+ ToySolver.Data.MIP+ ToySolver.Data.Polynomial+ ToySolver.Data.Polynomial.Factorization.FiniteField+ ToySolver.Data.Polynomial.Factorization.Hensel+ ToySolver.Data.Polynomial.Factorization.Hensel.Internal+ ToySolver.Data.Polynomial.Factorization.Integer+ ToySolver.Data.Polynomial.Factorization.Kronecker+ ToySolver.Data.Polynomial.Factorization.Rational+ ToySolver.Data.Polynomial.Factorization.SquareFree+ ToySolver.Data.Polynomial.Factorization.Zassenhaus+ ToySolver.Data.Polynomial.GroebnerBasis+ ToySolver.Data.Polynomial.Interpolation.Lagrange+ ToySolver.Data.Vec+ ToySolver.Data.Var+ ToySolver.SAT+ ToySolver.SAT.Integer+ ToySolver.SAT.MUS+ ToySolver.SAT.CAMUS+ ToySolver.SAT.PBO+ ToySolver.SAT.PBO.Context+ ToySolver.SAT.PBO.BC+ ToySolver.SAT.PBO.BCD+ ToySolver.SAT.PBO.BCD2+ ToySolver.SAT.PBO.MSU4+ ToySolver.SAT.PBO.UnsatBased+ ToySolver.SAT.TheorySolver+ ToySolver.SAT.TseitinEncoder+ ToySolver.SAT.Types+ ToySolver.SAT.Printer+ ToySolver.Text.GCNF+ ToySolver.Text.GurobiSol+ ToySolver.Text.LPFile+ ToySolver.Text.MPSFile+ ToySolver.Text.MaxSAT+ ToySolver.Text.PBFile+ ToySolver.Text.SDPFile+ ToySolver.Internal.Data.IndexedPriorityQueue+ ToySolver.Internal.Data.PriorityQueue+ ToySolver.Internal.Data.SeqQueue+ ToySolver.Internal.ProcessUtil+ ToySolver.Internal.TextUtil+ ToySolver.Internal.Util+ ToySolver.Version Other-Modules:- Data.Polynomial.Base- Data.IndexedPriorityQueue- Data.SeqQueue- Text.Util+ ToySolver.Data.AlgebraicNumber.Graeffe+ ToySolver.Data.Polynomial.Base Paths_toysolver GHC-Prof-Options: -auto-all @@ -169,8 +219,9 @@ Executable toysat Main-is: toysat.hs+ Other-Modules: UBCSAT HS-Source-Dirs: toysat- Build-Depends: base >=4 && <5, containers >= 0.4.2, array, parsec, bytestring, filepath, parse-dimacs, time, old-locale, unbounded-delays, vector-space >=0.8.6, toysolver+ Build-Depends: base >=4 && <5, random, containers >= 0.4.2, array, process >=1.1.0.2, parsec, bytestring, filepath, parse-dimacs, time, old-locale, unbounded-delays, vector-space >=0.8.6, toysolver Default-Language: Haskell2010 Other-Extensions: ScopedTypeVariables, CPP if impl(ghc >= 7)@@ -181,9 +232,12 @@ CPP-OPtions: "-DFORCE_CHAR8" Executable toyfmf+ If !flag(BuildToyFMF)+ Buildable: False Main-is: toyfmf.hs HS-Source-Dirs: toyfmf- Build-Depends: base >=4 && <5, containers >= 0.4.2, toysolver, logic-TPTP+ If flag(BuildToyFMF)+ Build-Depends: base >=4 && <5, containers >= 0.4.2, toysolver, logic-TPTP >=0.4.1 Default-Language: Haskell2010 if impl(ghc >= 7) GHC-Options: -rtsopts@@ -201,14 +255,44 @@ Build-Depends: base >=4 && <5, containers, filepath, parse-dimacs, toysolver Default-Language: Haskell2010 +Executable pigeonhole+ If !flag(BuildMiscPrograms)+ Buildable: False+ Main-is: pigeonhole.hs+ HS-Source-Dirs: pigeonhole+ Build-Depends: base >=4 && <5, containers, filepath, toysolver+ Default-Language: Haskell2010++Executable maxsatverify+ If !flag(BuildMiscPrograms)+ Buildable: False+ Main-is: maxsatverify.hs+ HS-Source-Dirs: maxsatverify+ Build-Depends: base >=4 && <5, array, containers, filepath, toysolver+ Default-Language: Haskell2010++Executable pbverify+ Main-is: pbverify.hs+ HS-Source-Dirs: pbverify+ Build-Depends: base >=4 && <5, array, containers, filepath, toysolver+ Default-Language: Haskell2010+ Test-suite TestSAT Type: exitcode-stdio-1.0 HS-Source-Dirs: test Main-is: TestSAT.hs- Build-depends: base >=4 && <5, array, containers, toysolver, test-framework,test-framework-th,test-framework-hunit,HUnit+ Build-depends: base >=4 && <5, array, containers, toysolver, test-framework,test-framework-th,test-framework-hunit,test-framework-quickcheck2 >=0.2.12.3 && <0.4.0,HUnit,QuickCheck >=2.5 && <3 Default-Language: Haskell2010 Other-Extensions: TemplateHaskell +Test-suite TestSimplex+ Type: exitcode-stdio-1.0+ HS-Source-Dirs: test+ Main-is: TestSimplex.hs+ Build-depends: base >=4 && <5, containers, mtl, toysolver, test-framework,test-framework-th,test-framework-hunit,HUnit+ Default-Language: Haskell2010+ Other-Extensions: TemplateHaskell+ Test-suite TestSimplex2 Type: exitcode-stdio-1.0 HS-Source-Dirs: test@@ -229,7 +313,7 @@ Type: exitcode-stdio-1.0 HS-Source-Dirs: test Main-is: TestPolynomial.hs- Build-depends: base >=4 && <5, containers, toysolver, test-framework,test-framework-th,test-framework-hunit,test-framework-quickcheck2,HUnit,QuickCheck >=2 && <3, data-interval >=0.2.0, finite-field >=0.7.0 && <1.0.0, prettyclass >=1.0.0+ Build-depends: base >=4 && <5, containers, toysolver, test-framework,test-framework-th,test-framework-hunit,test-framework-quickcheck2 >=0.2.12.3 && <0.4.0,HUnit,QuickCheck >=2.5 && <3, data-interval, finite-field >=0.7.0 && <1.0.0, prettyclass >=1.0.0 Default-Language: Haskell2010 Other-Extensions: TemplateHaskell @@ -237,7 +321,7 @@ Type: exitcode-stdio-1.0 HS-Source-Dirs: test Main-is: TestAReal.hs- Build-depends: base >=4 && <5, containers, toysolver, test-framework,test-framework-th,test-framework-hunit,test-framework-quickcheck2,HUnit,QuickCheck >=2 && <3, data-interval+ Build-depends: base >=4 && <5, containers, toysolver, test-framework,test-framework-th,test-framework-hunit,test-framework-quickcheck2 >=0.2.12.3 && <0.4.0,HUnit,QuickCheck >=2.5 && <3, data-interval Default-Language: Haskell2010 Other-Extensions: TemplateHaskell, ScopedTypeVariables @@ -245,7 +329,7 @@ Type: exitcode-stdio-1.0 HS-Source-Dirs: test Main-is: TestQE.hs- Build-depends: base >=4 && <5, containers, vector-space >=0.8.6, toysolver, OptDir, test-framework,test-framework-th,test-framework-hunit,test-framework-quickcheck2,HUnit,QuickCheck >=2 && <3+ Build-depends: base >=4 && <5, containers, vector-space >=0.8.6, toysolver, OptDir, test-framework,test-framework-th,test-framework-hunit,test-framework-quickcheck2 >=0.2.12.3 && <0.4.0,HUnit,QuickCheck >=2.5 && <3 Default-Language: Haskell2010 Other-Extensions: TemplateHaskell @@ -253,7 +337,7 @@ Type: exitcode-stdio-1.0 HS-Source-Dirs: test Main-is: TestContiTraverso.hs- Build-depends: base >=4 && <5, containers, vector-space >=0.8.6, toysolver, OptDir, test-framework,test-framework-th,test-framework-hunit,test-framework-quickcheck2,HUnit,QuickCheck >=2 && <3+ Build-depends: base >=4 && <5, containers, vector-space >=0.8.6, toysolver, OptDir, test-framework,test-framework-th,test-framework-hunit,test-framework-quickcheck2 >=0.2.12.3 && <0.4.0,HUnit,QuickCheck >=2.5 && <3 Default-Language: Haskell2010 Other-Extensions: TemplateHaskell @@ -261,7 +345,7 @@ Type: exitcode-stdio-1.0 HS-Source-Dirs: test Main-is: TestCongruenceClosure.hs- Build-depends: base >=4 && <5, containers, toysolver, test-framework,test-framework-th,test-framework-hunit,test-framework-quickcheck2,HUnit,QuickCheck >=2 && <3+ Build-depends: base >=4 && <5, containers, toysolver, test-framework,test-framework-th,test-framework-hunit,test-framework-quickcheck2 >=0.2.12.3 && <0.4.0,HUnit,QuickCheck >=2.5 && <3 Default-Language: Haskell2010 Other-Extensions: TemplateHaskell @@ -269,7 +353,7 @@ Type: exitcode-stdio-1.0 HS-Source-Dirs: test Main-is: TestLPFile.hs- Build-depends: base >=4 && <5, containers, toysolver, test-framework,test-framework-th,test-framework-hunit,test-framework-quickcheck2,HUnit,QuickCheck >=2 && <3+ Build-depends: base >=4 && <5, containers, toysolver, test-framework,test-framework-th,test-framework-hunit,test-framework-quickcheck2 >=0.2.12.3 && <0.4.0,HUnit,QuickCheck >=2.5 && <3 Default-Language: Haskell2010 Other-Extensions: TemplateHaskell @@ -277,7 +361,7 @@ Type: exitcode-stdio-1.0 HS-Source-Dirs: test Main-is: TestMPSFile.hs- Build-depends: base >=4 && <5, containers, toysolver, test-framework,test-framework-th,test-framework-hunit,test-framework-quickcheck2,HUnit,QuickCheck >=2 && <3+ Build-depends: base >=4 && <5, containers, toysolver, test-framework,test-framework-th,test-framework-hunit,test-framework-quickcheck2 >=0.2.12.3 && <0.4.0,HUnit,QuickCheck >=2.5 && <3 Default-Language: Haskell2010 Other-Extensions: TemplateHaskell @@ -285,17 +369,25 @@ Type: exitcode-stdio-1.0 HS-Source-Dirs: test Main-is: TestPBFile.hs- Build-depends: base >=4 && <5, toysolver, test-framework,test-framework-th,test-framework-hunit,test-framework-quickcheck2,HUnit,QuickCheck >=2 && <3+ Build-depends: base >=4 && <5, toysolver, test-framework,test-framework-th,test-framework-hunit,test-framework-quickcheck2 >=0.2.12.3 && <0.4.0,HUnit,QuickCheck >=2.5 && <3 Default-Language: Haskell2010 Other-Extensions: TemplateHaskell +Test-suite TestSDPFile+ Type: exitcode-stdio-1.0+ HS-Source-Dirs: test+ Main-is: TestSDPFile.hs+ Build-depends: base >=4 && <5, toysolver, test-framework,test-framework-th,test-framework-hunit,test-framework-quickcheck2 >=0.2.12.3 && <0.4.0,HUnit,QuickCheck >=2.5 && <3+ Default-Language: Haskell2010+ Other-Extensions: TemplateHaskell+ Test-suite TestUtil Type: exitcode-stdio-1.0 HS-Source-Dirs: test Main-is: TestUtil.hs- Build-depends: base >=4 && <5, toysolver, test-framework,test-framework-th,test-framework-hunit,test-framework-quickcheck2,HUnit,QuickCheck >=2 && <3+ Build-depends: base >=4 && <5, toysolver, test-framework,test-framework-th,test-framework-hunit,test-framework-quickcheck2 >=0.2.12.3 && <0.4.0,HUnit,QuickCheck >=2.5 && <3 Default-Language: Haskell2010- Other-Extensions: TemplateHaskell+ Other-Extensions: TemplateHaskell, ScopedTypeVariables Benchmark BenchmarkSATLIB type: exitcode-stdio-1.0
toysolver/toysolver.hs view
@@ -1,7 +1,7 @@ ----------------------------------------------------------------------------- -- | -- Module : toysolver--- Copyright : (c) Masahiro Sakai 2011+-- Copyright : (c) Masahiro Sakai 2011-2014 -- License : BSD-style -- -- Maintainer : masahiro.sakai@gmail.com@@ -35,37 +35,39 @@ import qualified Language.CNF.Parse.ParseDIMACS as DIMACS import GHC.Conc (getNumProcessors, setNumCapabilities) -import Data.ArithRel-import Data.FOL.Arith as FOL import Data.OptDir-import qualified Data.LA as LA-import qualified Data.LA.FOL as LAFOL-import qualified Data.Polynomial as P-import qualified Data.AlgebraicNumber.Real as AReal-import qualified Algorithm.OmegaTest as OmegaTest-import qualified Algorithm.OmegaTest.Misc as OmegaTest-import qualified Algorithm.Cooper as Cooper-import qualified Algorithm.MIPSolverHL as MIPSolverHL-import qualified Algorithm.Simplex2 as Simplex2-import qualified Algorithm.MIPSolver2 as MIPSolver2-import qualified Algorithm.CAD as CAD-import qualified Algorithm.ContiTraverso as ContiTraverso-import qualified Text.LPFile as LP-import qualified Text.MPSFile as MPS-import qualified Text.PBFile as PBFile-import qualified Text.MaxSAT as MaxSAT-import qualified Text.GurobiSol as GurobiSol-import qualified Converter.SAT2LP as SAT2LP-import qualified Converter.PB2LP as PB2LP-import qualified Converter.MaxSAT2LP as MaxSAT2LP-import SAT.Printer-import qualified SAT.Types as SAT-import Version-import Util +import ToySolver.Data.ArithRel+import ToySolver.Data.FOL.Arith as FOL+import qualified ToySolver.Data.LA as LA+import qualified ToySolver.Data.LA.FOL as LAFOL+import qualified ToySolver.Data.Polynomial as P+import qualified ToySolver.Data.AlgebraicNumber.Real as AReal+import qualified ToySolver.Data.MIP as MIP+import qualified ToySolver.OmegaTest as OmegaTest+import qualified ToySolver.OmegaTest.Misc as OmegaTest+import qualified ToySolver.Cooper as Cooper+import qualified ToySolver.MIPSolverHL as MIPSolverHL+import qualified ToySolver.Simplex2 as Simplex2+import qualified ToySolver.MIPSolver2 as MIPSolver2+import qualified ToySolver.CAD as CAD+import qualified ToySolver.ContiTraverso as ContiTraverso+import qualified ToySolver.Text.LPFile as LPFile+import qualified ToySolver.Text.MPSFile as MPSFile+import qualified ToySolver.Text.PBFile as PBFile+import qualified ToySolver.Text.MaxSAT as MaxSAT+import qualified ToySolver.Text.GurobiSol as GurobiSol+import qualified ToySolver.Converter.SAT2IP as SAT2IP+import qualified ToySolver.Converter.PB2IP as PB2IP+import qualified ToySolver.Converter.MaxSAT2IP as MaxSAT2IP+import ToySolver.SAT.Printer+import qualified ToySolver.SAT.Types as SAT+import ToySolver.Version+import ToySolver.Internal.Util+ -- --------------------------------------------------------------------------- -data Mode = ModeSAT | ModePB | ModeWBO | ModeMaxSAT | ModeLP+data Mode = ModeSAT | ModePB | ModeWBO | ModeMaxSAT | ModeMIP deriving (Eq, Ord) data Flag@@ -94,11 +96,11 @@ , Option [] ["omega-real"] (ReqArg OmegaReal "SOLVER") "fourier-motzkin (default), cad, simplex, none" - , Option [] ["sat"] (NoArg (Mode ModeSAT)) "solve boolean satisfiability problems in .cnf file"- , Option [] ["pb"] (NoArg (Mode ModePB)) "solve pseudo boolean problems in .pb file"- , Option [] ["wbo"] (NoArg (Mode ModeWBO)) "solve weighted boolean optimization problem in .opb file"+ , Option [] ["sat"] (NoArg (Mode ModeSAT)) "solve boolean satisfiability problem in .cnf file"+ , Option [] ["pb"] (NoArg (Mode ModePB)) "solve pseudo boolean problem in .opb file"+ , Option [] ["wbo"] (NoArg (Mode ModeWBO)) "solve weighted boolean optimization problem in .wbo file" , Option [] ["maxsat"] (NoArg (Mode ModeMaxSAT)) "solve MaxSAT problem in .cnf or .wcnf file"- , Option [] ["lp"] (NoArg (Mode ModeLP)) "solve binary integer programming problem in .lp or .mps file (default)"+ , Option [] ["lp"] (NoArg (Mode ModeMIP)) "solve LP/MIP problem in .lp or .mps file (default)" , Option [] ["nomip"] (NoArg NoMIP) "consider all integer variables as continuous" ]@@ -111,11 +113,11 @@ run :: String -> [Flag]- -> LP.LP- -> (Map String Rational -> IO ())+ -> MIP.Problem+ -> (Map MIP.Var Rational -> IO ()) -> IO ()-run solver opt lp printModel = do- unless (Set.null (LP.semiContinuousVariables lp)) $ do+run solver opt mip printModel = do+ unless (Set.null (MIP.semiContinuousVariables mip)) $ do hPutStrLn stderr "semi-continuous variables are not supported." exitFailure case map toLower solver of@@ -125,42 +127,42 @@ s | s `elem` ["ct", "conti-traverso"] -> solveByContiTraverso _ -> solveByMIP2 where- vs = LP.variables lp+ vs = MIP.variables mip vsAssoc = zip (Set.toList vs) [0..] nameToVar = Map.fromList vsAssoc varToName = IntMap.fromList [(v,name) | (name,v) <- vsAssoc] - compileE :: LP.Expr -> Expr Rational+ compileE :: MIP.Expr -> Expr Rational compileE = foldr (+) (Const 0) . map compileT - compileT :: LP.Term -> Expr Rational- compileT (LP.Term c vs) =+ compileT :: MIP.Term -> Expr Rational+ compileT (MIP.Term c vs) = foldr (*) (Const c) [Var (nameToVar Map.! v) | v <- vs] - obj = compileE $ snd $ LP.objectiveFunction lp+ obj = compileE $ snd $ MIP.objectiveFunction mip cs1 = do v <- Set.toList vs let v2 = Var (nameToVar Map.! v)- let (l,u) = LP.getBounds lp v- [Const x .<=. v2 | LP.Finite x <- return l] ++- [v2 .<=. Const x | LP.Finite x <- return u]+ let (l,u) = MIP.getBounds mip v+ [Const x .<=. v2 | MIP.Finite x <- return l] +++ [v2 .<=. Const x | MIP.Finite x <- return u] cs2 = do- LP.Constraint- { LP.constrIndicator = ind- , LP.constrBody = (lhs, rel, rhs)- } <- LP.constraints lp+ MIP.Constraint+ { MIP.constrIndicator = ind+ , MIP.constrBody = (lhs, rel, rhs)+ } <- MIP.constraints mip let rel2 = case rel of- LP.Ge -> Ge- LP.Le -> Le- LP.Eql -> Eql+ MIP.Ge -> Ge+ MIP.Le -> Le+ MIP.Eql -> Eql case ind of Nothing -> return (Rel (compileE lhs) rel2 (Const rhs)) Just _ -> error "indicator constraint is not supported yet" ivs | NoMIP `elem` opt = Set.empty- | otherwise = LP.integerVariables lp+ | otherwise = MIP.integerVariables mip vs2 = IntMap.keysSet varToName ivs2 = IntSet.fromList . map (nameToVar Map.!) . Set.toList $ ivs@@ -210,7 +212,7 @@ putSLine "UNKNOWN" exitFailure Just (cs',obj') ->- case MIPSolverHL.optimize (LP.dir lp) obj' cs' ivs2 of+ case MIPSolverHL.optimize (MIP.dir mip) obj' cs' ivs2 of MIPSolverHL.OptUnsat -> do putSLine "UNSATISFIABLE" exitFailure@@ -236,7 +238,7 @@ Simplex2.setLogger solver putCommentLine replicateM (length vsAssoc) (Simplex2.newVar solver) -- XXX- Simplex2.setOptDir solver (LP.dir lp)+ Simplex2.setOptDir solver (MIP.dir mip) Simplex2.setObj solver $ fromJust (LAFOL.fromFOLExpr obj) putCommentLine "Loading constraints... " forM_ (cs1 ++ cs2) $ \c -> do@@ -246,6 +248,7 @@ mip <- MIPSolver2.newSolver solver ivs2 MIPSolver2.setShowRational mip printRat MIPSolver2.setLogger mip putCommentLine+ MIPSolver2.setOnUpdateBestSolution mip $ \m val -> putOLine (showValue val) procs <- if nthreads >= 1@@ -257,21 +260,19 @@ setNumCapabilities procs MIPSolver2.setNThread mip procs - let update m val = putOLine $ showValue val- ret <- MIPSolver2.optimize mip update+ ret <- MIPSolver2.optimize mip case ret of Simplex2.Unsat -> do putSLine "UNSATISFIABLE" exitFailure Simplex2.Unbounded -> do putSLine "UNBOUNDED"- m <- MIPSolver2.model mip+ Just m <- MIPSolver2.getBestModel mip let m2 = Map.fromAscList [(v, m IntMap.! (nameToVar Map.! v)) | v <- Set.toList vs] printModel m2 exitFailure Simplex2.Optimum -> do- m <- MIPSolver2.model mip- r <- MIPSolver2.getObjValue mip+ Just m <- MIPSolver2.getBestModel mip putSLine "OPTIMUM FOUND" let m2 = Map.fromAscList [(v, m IntMap.! (nameToVar Map.! v)) | v <- Set.toList vs] printModel m2@@ -325,7 +326,7 @@ putCommentLine "non-linear expressions are not supported by Conti-Traverso algorithm" exitFailure Just (linObj, linCon) -> do- case ContiTraverso.solve P.grlex vs2 (LP.dir lp) linObj linCon of+ case ContiTraverso.solve P.grlex vs2 (MIP.dir mip) linObj linCon of Nothing -> do putSLine "UNSATISFIABLE" exitFailure@@ -342,10 +343,10 @@ showValue :: Rational -> String showValue = showRational printRat -lpPrintModel :: Handle -> Bool -> Map String Rational -> IO ()-lpPrintModel h asRat m = do+mipPrintModel :: Handle -> Bool -> Map MIP.Var Rational -> IO ()+mipPrintModel h asRat m = do forM_ (Map.toList m) $ \(v, val) -> do- printf "v %s = %s\n" v (showRational asRat val)+ printf "v %s = %s\n" (MIP.fromVar v) (showRational asRat val) putCommentLine :: String -> IO ()@@ -389,9 +390,9 @@ ".opb" -> ModePB ".wbo" -> ModeWBO ".wcnf" -> ModeMaxSAT- ".lp" -> ModeLP- ".mps" -> ModeLP- _ -> ModeLP+ ".lp" -> ModeMIP+ ".mps" -> ModeMIP+ _ -> ModeMIP case mode of ModeSAT -> do@@ -399,8 +400,8 @@ case ret of Left err -> hPrint stderr err >> exitFailure Right cnf -> do- let (lp,mtrans) = SAT2LP.convert cnf- run (getSolver o) o lp $ \m -> do+ let (mip,mtrans) = SAT2IP.convert cnf+ run (getSolver o) o mip $ \m -> do let m2 = mtrans m satPrintModel stdout m2 0 writeSOLFileSAT o m2@@ -409,8 +410,8 @@ case ret of Left err -> hPrint stderr err >> exitFailure Right pb -> do- let (lp,mtrans) = PB2LP.convert pb- run (getSolver o) o lp $ \m -> do+ let (mip,mtrans) = PB2IP.convert pb+ run (getSolver o) o mip $ \m -> do let m2 = mtrans m pbPrintModel stdout m2 0 writeSOLFileSAT o m2@@ -419,48 +420,53 @@ case ret of Left err -> hPrint stderr err >> exitFailure Right wbo -> do- let (lp,mtrans) = PB2LP.convertWBO False wbo- run (getSolver o) o lp $ \m -> do+ let (mip,mtrans) = PB2IP.convertWBO False wbo+ run (getSolver o) o mip $ \m -> do let m2 = mtrans m pbPrintModel stdout m2 0 writeSOLFileSAT o m2 ModeMaxSAT -> do- ret <- MaxSAT.parseWCNFFile fname+ ret <- MaxSAT.parseFile fname case ret of Left err -> hPutStrLn stderr err >> exitFailure Right wcnf -> do- let (lp,mtrans) = MaxSAT2LP.convert False wcnf- run (getSolver o) o lp $ \m -> do+ let (mip,mtrans) = MaxSAT2IP.convert False wcnf+ run (getSolver o) o mip $ \m -> do let m2 = mtrans m maxsatPrintModel stdout m2 0 writeSOLFileSAT o m2- ModeLP -> do- ret <- LP.parseFile fname- lp <- case ret of- Right lp -> return lp+ ModeMIP -> do+ ret <- LPFile.parseFile fname+ mip <- case ret of+ Right mip -> return mip Left err -> do- ret <- MPS.parseFile fname+ ret <- MPSFile.parseFile fname case ret of- Right lp -> return lp+ Right mip -> return mip Left err2 -> do hPrint stderr err hPrint stderr err2 exitFailure- run (getSolver o) o lp $ \m -> do- lpPrintModel stdout (PrintRational `elem` o) m- writeSOLFileLP o m+ run (getSolver o) o mip $ \m -> do+ mipPrintModel stdout (PrintRational `elem` o) m+ writeSOLFileMIP o m (_,_,errs) -> hPutStrLn stderr $ concat errs ++ usageInfo header options -- FIXME: 目的関数値を表示するように-writeSOLFileLP :: [Flag] -> Map String Rational -> IO ()-writeSOLFileLP opt m = do- forM_ [fname | WriteFile fname <- opt ] $ \fname -> do- let m2 = Map.map fromRational m- writeFile fname (GurobiSol.render m2 Nothing)+writeSOLFileMIP :: [Flag] -> Map MIP.Var Rational -> IO ()+writeSOLFileMIP opt m = do+ let m2 = Map.fromList [(MIP.fromVar v, fromRational val) | (v,val) <- Map.toList m]+ writeSOLFileRaw opt m2 -- FIXME: 目的関数値を表示するように writeSOLFileSAT :: [Flag] -> SAT.Model -> IO () writeSOLFileSAT opt m = do let m2 = Map.fromList [("x" ++ show x, if b then 1 else 0) | (x,b) <- assocs m]- writeSOLFileLP opt m2+ writeSOLFileRaw opt m2++writeSOLFileRaw :: [Flag] -> Map String Rational -> IO ()+writeSOLFileRaw opt m = do+ forM_ [fname | WriteFile fname <- opt ] $ \fname -> do+ let m2 = Map.map fromRational m+ writeFile fname (GurobiSol.render m2 Nothing)