Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

PLT-936: Add Arbitrary Data instance #4922

Merged
merged 5 commits into from
Nov 3, 2022
Merged

Conversation

zliu41
Copy link
Member

@zliu41 zliu41 commented Oct 24, 2022

This is the first time I use QuickCheck, and I find it surprising that it doesn't have something equivalent to Hedgehog.Gen.list.

@zliu41 zliu41 changed the title Add Arbitrary Data instance PLT-936: Add Arbitrary Data instance Oct 24, 2022
Copy link
Contributor

@effectfully effectfully left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you show what kind of Data objects this generator produces? Via something like

replicateM 10 . generate . resize 80 $ arbitrary @Data

@zliu41
Copy link
Member Author

zliu41 commented Oct 25, 2022

Sure, here it is:

λ> traverse (putStrLn . ("=======\n" ++) . show) =<< (replicateM 10 . generate . resize 80 $ arbitrary @Data)
=======
I (-5305680094654670905)
=======
Constr 160045081313 [Map [(I 5,B "\237\148\158]r\240\164\158\166xP\229\141\135B\228\149\164_\225\149\178Gjl"),(I 27,I 12),(B "s\240\167\161\163MK\231\168\179\240\163\160\168\240\175\163\147?\240\165\143\161\&8bNRz\240\158\162\190\&4UN~{\\uJ$",Map [(List [Constr 32 [Map [(Constr 1 [],B "X)"),(List [List []],B ""),(List [Map [(B "E",B "\240\145\135\156"),(I 0,B "d"),(B "",B "\240\170\190\157"),(I (-1),I 0),(I (-1),B "f")],I 2,I 1],Map [(List [B "",I (-1),B "\240\157\150\151",B "",I 0],Map [(B "",B "X")]),(Constr 1 [I (-1),B "",B "U",I (-1),I 1],List []),(B "|",B "\240\175\165\138"),(List [B ""],Map [(I 1,I (-1)),(B "",I 0),(I 0,B ""),(B "",I 0),(B "",I 0)]),(List [],B "")]),(Map [(B "\240\155\176\165S",I (-2)),(Constr 1 [B "",B "\240\173\188\160",I (-1)],List [B ""]),(List [I 1,I 0,B "t",B "",B ""],Constr 1 [B ""])],List [List [B "@",B "F",I 0,B "M",I (-1)],Map [(I (-1),B "z"),(B "z",I 0),(I 0,B "O"),(I 0,I 0)],Map [(I 0,I 0),(B "",I (-1)),(B "?",I (-1))]]),(B "\240\165\157\181*T=",Map [(B "?z",Map []),(Constr 1 [B ""],Map [(I 0,I 0),(B "K",B ""),(B "t",B "\240\160\155\170"),(B "",I (-1))]),(Map [],List [B ""])])]],I 477,List [Constr 7 [Constr 2 [Map [],List [I (-1),B "",I 1,I 0],B "",I (-1)],Map [],B "\233\182\168}"]]],B "wzL?q0("),(List [I (-12)],List [List [Map [(Map [(Constr 0 [B "O",I (-1),I 0,B "h"],Constr 0 [I 0,B ""]),(I (-2),Map [(B "p",B "["),(I (-1),B "X"),(B "",I 0),(I 1,B "\233\132\137")])],List [])],Constr 5 []],Map [(I 1,B "E(\240\166\166\182r\"d"),(Map [(Map [(Map [],B "\\"),(Map [(I (-1),I 0),(B "\240\165\187\161",I (-1)),(B "",I 0),(B "(",I 1)],Constr 0 [B "",B ""]),(Map [(I (-1),B ""),(I 1,I (-1)),(I (-1),B ","),(B "",I 1)],Constr 0 [I 0,I 0,B ""]),(Constr 1 [I (-1),B "",I 0],Constr 1 [I (-1),I (-1),I 1]),(List [B "V"],Constr 0 [B "",I (-1),B "\236\171\165",B ""])],Map []),(Map [(List [I 0,B "",I 1,I 0,B "\240\167\146\142"],I (-1)),(Constr 0 [I 0,B "i",I 1],Map []),(Map [(I 1,I 1),(B "T",I 1),(I (-1),B ""),(B "",I 1)],List [B "n"]),(Constr 1 [B "d",B "Y",I (-1),I 1,I 1],Map [(I 1,B ""),(I 1,B "")])],Map [(I (-2),B "\240\151\173\184S"),(List [],List [B "",B "^",I 0])])],List [Constr 1 [I 2,Map [(B "I",I 0),(I 1,B "3"),(B "R",I 1),(B "w",B "")],B "T"],I 4,B ""]),(I 6,List [List [Constr 0 [I 0]],I 0])]])])],I (-152209641005),Map [(I (-18),B "}`yCjfz\234\129\162rVZA\240\160\165\153]Vg+?"),(B "is\240\146\132\177\240\165\176\137Zg\228\156\168P-\240\145\150\140EX2T",Map [(Map [],B "\\(")]),(B "\240\151\186\130x\240\172\170\154\228\174\179BJp79\240\177\135\145p/R\230\133\172^",Constr 19816 [List [],Constr 111 [I 8],I (-24652),Constr 242 [B "\"6\240\170\152\129L,b",I (-12),Map [(Constr 4 [Map [(B "52",I 0),(Constr 1 [B "",I (-1),I 0,B "("],B "")],I 1,Map [(Constr 1 [B ".",I 0,I (-1),I (-1),B ""],List [I 0,B "f",I 0,I 0]),(I (-1),B ""),(I 0,List [B "",B "c",B "m"]),(I (-2),List [I 1,I (-1),B "",B "f",B ""])]],B "~\240\160\172\148+a<b")],Constr 24 [B "M&!v",B "+4\240\167\160\132\&7",B "M\240\170\130\133R1\226\161\170V"],Constr 0 [Constr 8 [B "",B "NEW"],List [I (-3),B "",I (-1)]]]]),(List [Constr 137 [I 76,B "P\240\171\153\153bs\240\171\169\152\233\176\148#",Map [(Map [],Map [])],B "]",B "u]H\\W5\240\170\163\129sg"],Constr 150 [I (-10)],B "NCP-TC\240\167\154\142\\R|DfVy/&L8",I (-12)],B "cNJ`R\240\176\135\134'F\240\167\128\158O(\235\132\184t4\240\174\143\181>\232\175\164\240\176\173\183\240\167\161\187:()"),(I (-15822005),I 885546)],B " W\240\165\132\185",List [Map [(Map [(B "iQ\240\163\182\145`_91",B "=uW<=MOH.Lf\240\160\137\150")],B "\240\169\174\158F'^`MW'\235\165\186\240\146\139\183N\232\155\183t\240\171\137\155\230\147\160)*\235\165\154"),(Map [(Map [(I (-7),B ""),(Constr 4 [B "f+\240\171\150\140",Constr 1 [B "F",Constr 0 [B "9",I 0]],B "\240\164\152\129p+"],I (-3)),(Constr 2 [Map [(Constr 0 [B "n"],Map [(I 1,B ""),(I 0,I 1),(B "",I (-1))]),(I 0,Map [(B "",I 1),(B "B",I 0),(I 1,I (-1))]),(Constr 1 [I 0,I 1],List [B "[",I 0,B "",B ",",B "d"]),(List [],Map [(I 0,I 0),(B "1",B "G"),(B "",B "\240\171\179\158"),(B "\240\150\189\191",B "")])],I 2,B ""],B "D8>M"),(Map [(Map [(List [B "z",B "",I 0,B "",I 0],B "#"),(List [],I 0)],B ")\235\153\179\&7\234\128\138"),(Map [],Map [(B "",List [I 0,B "",B "",B "F"]),(B "",Constr 0 [I 1,B "|",I (-1),I 1]),(B "",B ""),(List [],List [I (-1),I 0,I (-1),B "",B ""]),(I (-2),Constr 0 [B "",I 1,I 1,I (-1)])]),(B "",I 2),(List [B "\235\157\150",B "",Constr 0 [I 1,I (-1)]],I 4),(Constr 1 [List [],B "Q",List [B ""]],Map [(List [I (-1),I 1,I 0],Constr 1 [I 1,I 1,B "\240\166\173\166",I (-1)]),(Constr 0 [I (-1),I (-1),B ""],List []),(List [],B "^")])],Constr 2 []),(Map [(Constr 2 [List [B "",B "",I 1,I 0],List [I (-1),I 0,B "[",I 0,B "W"]],Map [(B "6",Map [(B ")",I (-1)),(B "",B "W"),(B "J",I (-1)),(B "\240\164\160\158",I 1),(B "M",B "")]),(List [I 0,B "",I 0,B "5"],B "6?"),(List [],B ""),(I (-2),Map [(I 0,B ")"),(B "",B "")])]),(List [I 2],List [Map [],List [B "",B "",I 1],Constr 0 [I (-1),B "",B "",I 1],Constr 0 [I (-1),I 0,I (-1),B ""],Constr 0 [I 0,I (-1),I 1,B "",I 0]]),(I (-4),Map [(List [I 0,B "",B "",B "b",I 0],List [I (-1),I 0]),(B "*\229\147\136",I (-1)),(I 1,List [I 0])]),(List [Constr 1 [B "",I 1],I (-2)],B "J~=0")],Constr 8 [B "",Constr 0 [],List [Map [(I 0,B ""),(B "",I 1),(B "o",I 0),(B "p",I 1),(B "",I 1)],B "r^",I 1,List [I (-1),B "",B "",I (-1)]]])],Map []),(I (-6),B "C\240\151\170\155]\240\163\157\171\240\168\144\176X"),(Map [(List [List [List [],List [],Map [(B "W",I 1),(I (-1),I 0)],List [],B ""],Constr 1 [Constr 0 [B "k",I 1,B "",I 1],B "-"],Map [(B "",Constr 1 [I 1]),(B "\\?",Map [(I (-1),B "i"),(I 1,I 0),(B "",B "/")])],B "z"],B "s??K\232\134\131k"),(Constr 2 [],Map [(B "w",I 4),(Map [(B "s",Map [(B "",B "H"),(I (-1),I (-1)),(I (-1),B ""),(I (-1),B "")]),(List [I 1,B "3"],Map [(B "\240\175\167\144",B "f"),(B "",B "K"),(B "7",B "")]),(B "3C",I 1),(I (-1),Map [(I 0,B ""),(I 1,I 1),(B "",B ""),(B "",B "{"),(B "N",I (-1))])],Constr 2 [I (-1),I (-2),Constr 1 [B "\240\170\172\160",I (-1),I 1,B "",B "I"]]),(I 1,Constr 0 [I 0,Constr 0 [],Map [(I 0,B "q"),(B ";",I (-1)),(B "s",I (-1)),(I (-1),B "\240\169\131\156")]]),(List [I 2,List [B "r",B "m",B "\240\168\178\188",B "",B "R"]],B ""),(List [Constr 0 [],Constr 1 [B "N",B "",I 1,I 1,I 1],Map [],Constr 0 [I 1,B "\240\157\129\130"]],Map [(Constr 1 [I 1,B "J",B "",B "K",I 0],I (-1)),(I 0,I (-2))])]),(I 0,Constr 3 [B "ug\"",I 1,B "<"]),(Constr 2 [],I (-7))],Constr 6 [B "g+O{",I 3]),(Constr 20 [I (-10),Map [(Constr 2 [List [I (-1),I 0]],B "")]],I 12)],B "}XHOG$6`6jK\240\161\133\154\240\162\142\149\&6k"),(Map [(List [],I 11)],Constr 259 [List [Constr 2 [Map [(I (-1),B "\240\171\190\189\240\167\174\183"),(B "",Map [(I (-1),I (-1)),(I 0,B ""),(I (-1),B ">"),(I (-1),B "")]),(Constr 0 [B "",I 1,B "\236\132\172",B "U",I (-1)],Constr 1 [I 0,I 0,I (-1)]),(List [B "P"],Map [(B "",B ""),(B "",I 0)])],B "\240\145\152\159"],Constr 5 [],B "SKZ\240\176\181\164Es",Constr 8 [List [Constr 0 [B "\240\167\142\183",B ""],List [B "z",I (-1),B "$",B "&",I 1],Constr 0 [B "K",I (-1),I 0,B "|"]],Map [(Constr 1 [B "g",I (-1),B ""],Map [(I (-1),I 0)]),(I (-1),List [B "M",B "",B "\224\190\177"]),(B "",List [I 0,I 1,B "U",B ""]),(B "t",Constr 0 [I 1]),(Map [(B "*",I 0)],List [I 1])]]],Constr 0 [I (-1)],I (-9)]),(I (-13),List [])]]]
=======
Constr 205300311987 [I 3,Map [(B "m<0*@IJR\239\184\147Enk\240\174\132\141$#\229\136\191?zA{uJ|=",B "gL\230\181\149\240\164\129\153t\240\173\143\169%\240\165\191\185-Jz/[;8f\236\161\167 C\232\186\142"),(B "qj(j\229\162\137q{\240\161\161\136I\231\173\128Mx\240\169\143\162\226\149\181^\234\187\162PA*~V~",Constr 1752 []),(B "Yq0Gy0wEd",Map [(Constr 4 [],Constr 275 [Map [(Constr 3 [],Map [(Map [],Constr 2 [I 0]),(Map [(List [B "F",B "6"],B ""),(I 1,I (-1)),(B "k}",List [I (-1),B "Q",B "L",I (-1),B "\240\170\161\141"]),(I 1,B "")],Constr 2 [Constr 0 [I (-1)],Constr 1 [B "`",B "",I 0],I (-1),B "^"]),(Constr 1 [Constr 1 [I 0],List [I 0]],Map []),(Constr 0 [List [I (-1),B "",B "\240\161\191\182"],List [I 1],Map [(I 0,I (-1)),(B "g",I 0)]],List [Constr 1 [I 0],List [I 1,B "",I 1],I 2,List [B ""],B "A"]),(I (-1),List [List [B "",I 0,B "",I 0],Map [(B "O",I (-1))],Constr 0 [I 1,B ""]])])],I 318,I (-4),Constr 14 [Constr 2 [List [Map [],Constr 0 [I 1,I 1],B "Do",I 0]],Map [(Map [],B "2'.}"),(I 4,B "\234\143\172\231\141\165`"),(Map [(I 0,List [])],Constr 2 [Constr 0 [B "",I (-1),I 0],Map [(I (-1),I 0),(B "",I 0),(B "",B "e")],B "iL"])],I 26,List [List [I 1,List [],List [B "6",B "|",B "",I 1],Constr 0 [B ">"]],List [Constr 1 [],Map [],Map [(I 1,I 1)],Constr 1 [B "",B "",B "",I 1],Constr 0 [B "",I 0,B "",B "%",B "6"]],List [List [I (-1)],B ""],Constr 2 [List [I (-1),I 0,I 0,B ""],Map [],List [],I (-2)]],Constr 8 [B "2TM",List [Map [(B "n",B ""),(B "o",I 1),(B "",B "")],Constr 0 [I 0,B ""],Constr 0 []],I 4]],List [Map [(B "\240\170\179\182f",B "y\230\142\164TW")],B "F",I 2,Constr 5 [I 2]]]),(B "\243\160\134\130OR\228\164\149\240\144\147\141,lM\240\161\157\182\&7V",Map [(I 7,I (-9)),(List [I (-4),I (-18),Constr 0 [I 4,I 1,Map [(B "",List [I (-1)]),(I (-1),B ""),(I 1,B "~")],Constr 0 []]],Map [(List [List [B "="]],B "b;G?"),(B "~@\239\169\178",I 7),(Constr 6 [],List [I (-4),Constr 1 [I (-2),Constr 0 [B "T",B ",",I 1,I 1,I (-1)]],Map [(Map [(I 0,I 1)],I (-2))],I (-1)])]),(B "",Constr 19 [Constr 0 [List [Map []],Constr 1 [B "M!",B "\240\158\186\175m"],Map [(I (-1),Constr 1 [B "V",I (-1),B "",I 1])]],Map [(Map [],I 4),(List [List []],B ""),(List [],Constr 2 [I (-1),Constr 1 [B "D"],Constr 0 [B "\240\164\139\155",B "",B "8",B "",B "z"]]),(B "7",B "\240\167\172\131\240\157\159\189r=")],B "UT\233\131\179\234\131\177\&5<7",B "L\240\146\148\162c'",List [I 1,Map [],Constr 0 [Map [(I (-1),B ""),(B "",B ""),(I 0,B "."),(I 0,B "")]],List [B "/",B "]",I (-1)]]]),(I 0,Map []),(I 184,Map [(List [List [List [B "K",B "",I 0],B "",I (-2),List []],Map [],I (-2)],I (-3)),(I 2,I 0)])])])],B "):VG",B "i+"]
=======
List [Map [(B "W3#V =/?]7j3O",B "M)}c&(_"),(Constr 3852 [],Constr 25584 []),(Map [(Map [(Map [(List [],List []),(Constr 6 [I 4,Map [(Constr 0 [I 0,I 0],B "Mk")],List [],Constr 2 [B "i",Map [(B "N",I 0),(I 1,I 1),(I (-1),I (-1))],B "",Constr 1 [B "",I 0,I 1,B "",B ""],List [B "",B "",B "\240\171\167\185",B "",I 0]],B ""],I 9)],Map [(List [Constr 0 [B "\240\164\136\187",Map [(B "",I 1),(B "Q",B ""),(B "",B "p")]],Map [(Constr 0 [B "D",I (-1)],B "a"),(List [B "5",B "",I 1],List [B "",I 1])],Constr 2 [Constr 0 [B "g"],List [B "",I 0,I 1],List []],I 3],Constr 2 [I 4,Constr 0 [Map [(B "`",B "\240\155\177\157"),(B "v",I (-1)),(B "\232\148\147",I 0),(B "",B ""),(I (-1),B "?")],I 1,I (-2)],Map [(Map [],Constr 1 [])],Constr 0 [],B ""]),(List [Map [(Constr 1 [B "",B "?",I 1,I 0],Constr 0 [I 1,I 1]),(I (-2),Map [(B "\240\168\142\137",B "b")]),(Constr 0 [I 1,B ")",B "",B "",B "\240\164\184\137"],List [I 0,I (-1)]),(Constr 1 [I 0,I 1,I 0,B "",B "\240\170\179\128"],I 2)],B "5\240\172\181\178"],Constr 5 [Map [],Map [(B "a",I (-1))],Map [(I 0,Map [(B "",B "I"),(B "",I 0),(I 0,B ""),(I 1,B "y"),(B "",I 0)]),(Map [(I 0,B ""),(B "",B ""),(I 1,B ""),(B "J",I 0),(I (-1),B "B")],I (-2)),(B "",Map [(B "!",I 1),(I 1,B "n"),(B "",B "\231\165\141"),(B "j",I 1),(B "",B "")])],I (-1),List [I (-1),Constr 1 [I 0,B "`"],List [B "\227\144\190"],List [I 1,B "z",I 1]]])])],Map [(Map [(List [Map [(I (-1),Map [(B "T",B ""),(I 0,I 1)]),(Map [(B "",B "^")],List [I 1,I (-1),B "",B "k",I 0])],I (-1),Map [(Constr 0 [I (-1),B "",I (-1)],B "=\229\184\160"),(Constr 1 [I 0,I 0,I (-1)],Constr 0 [B ""]),(B "",Map [])]],Map [(List [B "\231\170\185",B "L?"],I 3),(List [B "",Constr 1 [B "\233\137\163",B "",I 1]],I (-1)),(Constr 1 [I (-1),Map [(I 0,B ""),(I 0,B ""),(I 0,B "")],B ""],I 0)]),(Constr 8 [I 1,B "[d",Map [(I (-2),Map [(B "",I 0),(B "",I 1)]),(B "",Constr 0 [I (-1),I (-1),I 0]),(I 0,Constr 1 [I (-1),B "Z"])]],List [I 0]),(Map [],B "w3KG="),(Map [(Map [(List [I 0,B "^",I 0,I (-1)],List []),(Constr 0 [I (-1),I 0],Map [(I 0,I 0),(I 1,I 1),(B "",B "."),(B "_",B ""),(B "1",I 0)]),(Constr 1 [B "\237\135\180"],Map [(B "",B "")]),(I (-1),Constr 0 [])],Map [(I (-1),List [B "\232\186\157",I (-1),B "`",B "t",I (-1)]),(Map [(I 0,I (-1)),(I 1,B "")],B ""),(B "s",B "u<"),(List [B "e"],Map [(B "",I 0),(I 1,B ""),(B "",B "3"),(I (-1),I (-1))]),(List [B "",I (-1)],B "\240\171\172\191\240\174\141\174")])],Constr 0 [Constr 2 [List [],I 0,Map [],B "\226\143\138i"],Constr 0 [Constr 0 [],B ",u",Map [(I 1,B ""),(B "",I 1),(B ";",I 1),(I (-1),B "c")],I (-2)],I 3])],I 9),(Map [(Constr 3 [Constr 2 [Map [(I 1,I 0),(B "",I 1),(I (-1),I 0),(B "<",I (-1))],Map [(B "",B "")]],B "\240\144\147\185n0",Map [(List [I 0,B "",I 0],Constr 0 [])],I 3],B "")],List [Constr 4 [Map [(Map [(I 0,B "\240\162\171\187"),(B "l",I (-1)),(B "\240\169\159\168",I (-1))],I 2),(B "mE",B ""),(List [B "",I 0,I 1,I (-1),B " "],List [I 1,B "",I 1,I 1,I 0]),(Map [(I 1,I 1)],Map [(I 0,B ""),(I (-1),I 0)])],Map [(I 1,List [B ""]),(Map [(I (-1),B "\224\181\161"),(B "\232\166\165",I 1),(I 0,B ""),(I 0,I 1),(I (-1),B " ")],List [B "",I 0,B "!",I 0,I 0])],List [B "s"]],List []]),(List [Constr 4 [List [Constr 1 [I 1,B "\240\161\184\142"],B "L",I 2,I 2],Map [],I (-8),Constr 1 [],I 4],List [Map [],Map [(I 0,I 0),(B "N\\",Constr 0 [])],List [B "Y",Constr 1 [I 1],B "0\240\171\134\157"]],Map [(List [B "\240\168\136\191\\",Map [(I (-1),B ""),(B "",B ")"),(B "",B "6")],List [B "",B ")",B "\240\168\157\129",B ""],Constr 0 [I (-1),B "?",B "5",I 0],Map [(I 0,B ""),(I 0,I 0),(I (-1),B "\228\175\151")]],Constr 1 [B "8",I (-2),B "k",I (-2),B "c\\"]),(B "O-n",Constr 0 [B "+U",List [I (-1),B ""],Map [(B "",I 0),(I (-1),B "b"),(B "\225\148\147",B "\240\157\128\175"),(I 0,B "")],Map [(I 1,I 1)]])],Map [],Map [(List [Constr 1 [B ","]],Constr 0 [List [I 1,B "",I 1,I 0],Map [],Constr 0 [I 1]]),(I 5,I 4),(List [I (-1),Constr 1 [I 1,I (-1),I (-1),B "",B "_"]],List [Map [(B "j",I 1),(B "[",B "="),(I 0,B ""),(I (-1),B ""),(I (-1),I 1)]]),(B "$v5L",Map [(I (-1),List [I 0,B "",B "(",I 0])])]],I (-11)),(I (-385),Constr 13 [Constr 3 [B ""],Constr 8 [Constr 2 [Constr 1 [I 1,B "d",B "}",I 0],I 1],Map [(B "\"",List [I 0,B ""]),(I (-2),Map []),(List [B "\240\169\170\131"],List [I 0]),(List [B "_",B "",B "",I (-1)],B "f%")],Map [(List [I 1,B "2",I (-1),B ""],List [B "\240\161\134\167",B "b"])],Map [(I 2,I (-1)),(Constr 0 [I 1,I 1,I 1],Constr 1 [I 0,B "\"",I 0,I 1,B ""])]]])]),(List [B " Wx/)*=}I",I (-7),Constr 13 [B "P|\240\161\134\169r{,\240\151\146\158",I (-4),List [I 2]],B "\233\186\183d.9jt",I 9],Constr 203 [B "Uh\240\167\131\136",Constr 12 [I 10,Constr 7 [Map [(I 2,I 1),(Map [],B "Mw"),(Map [(B "x",I 0),(I 0,I 1),(B "1",I 1)],Map [(B "_",B "J"),(I 0,I 1),(I (-1),B "-"),(I (-1),B "\\"),(I 1,I (-1))]),(List [B "\\",B "."],B "\229\177\165")],B "\240\174\155\164\240\166\150\133",List [Constr 0 [B "2",B "j",B "p"],List [I 0],Map [(B "",B "")],Constr 0 [B "n",B "(",B "u",I 0],B "u,"],B "i:"]],Map [(I 7,Map []),(Map [(List [Map [(B "F",I 0),(I 0,I 1),(B "",B ">"),(I (-1),I 0)],B "f"],Map []),(List [List [I 1]],Constr 2 [Constr 0 [B "\240\163\181\158",I 0,B "",I 1],Constr 0 [I (-1),I 1,I (-1)],I (-2),B "",List [B "",I 0,B "8"]])],Constr 0 [B "\240\152\134\188z{"]),(Constr 4 [Constr 0 [Constr 1 [I 0,B "",I (-1),B ""]],Constr 2 [Constr 0 [I 0,I 0,I (-1)],I 1,List [I (-1)],I 0],I 4,Map [(I 2,Constr 1 [B "\240\152\159\183",B "}",B "",B "",I 1]),(I 0,Map [(B "W",B "\240\165\186\186")])]],List [List [],List [B "f",I 0,Constr 0 [I (-1),B "",I (-1),I (-1),B ""],List [B "H",I 1,B "9",I 0,B "^"],B "TI"],Constr 1 [Map [(I 1,I 0),(I 0,I (-1)),(B "F",I 1),(I 1,B ""),(I (-1),I 1)],List [B "",I 1,B " "],Map [(B "\240\171\164\165",B ""),(B "",I (-1))],Map [(I (-1),B ""),(B "",B ""),(I 1,B ""),(I (-1),B ""),(I 1,B "s")],Constr 0 [I (-1),I 1,I (-1),I 0,I 0]]]),(List [I 5,Map [],I 4,Map [(I (-1),I (-2)),(Constr 1 [B "",B "",B "",I (-1)],List [I 1]),(List [B ""],Map [(I (-1),B "5")]),(B "",List []),(I 2,B "")],B "j[`"],I 5)],Constr 19 [],B "\240\167\161\137)o6{\240\157\128\162\240\151\142\185\230\176\171,@"]),(List [Map []],Map [(Map [(B "U\240\173\141\140&c",I 7),(List [B "",Constr 1 [],Constr 1 [B "",Constr 0 [I (-1)]]],Constr 2 []),(Constr 8 [Constr 0 [Constr 0 [I 0],B "",B ")",List [],I 1],B "",I 1,List []],List [List [I (-2),Constr 0 [B "",B "B"],List [B "",B "7"],I (-2)]])],I 11),(Map [(Constr 7 [],I 7),(B "\240\168\168\189d",B "o~\240\170\191\154n$e"),(B "i",Constr 8 [B "b\240\157\128\145\240\168\165\148",List [List [B "\233\148\176",I 0,B "u"],I (-2)],Constr 1 [Constr 1 [B "",I 0],Map [(B "",B "\240\171\152\159"),(B ">",I (-1)),(B "(",B "")],List [B "2",I (-1)],B "s"]]),(List [B "UC",List [Constr 0 [B ""],I (-1)]],I 2),(Map [(I (-1),Map []),(I (-3),B "wP")],Map [(B "\227\134\174\233\183\184\240\164\161\151",Map [])])],Map [(B "{Y\225\138\176>\240\161\186\180",Constr 3 [Map [(I 1,Map [(I (-1),I 1),(I (-1),I (-1)),(I 0,I (-1)),(B "",B "%"),(B "",I (-1))]),(Constr 1 [B "\229\139\150"],Map [(I 0,B ""),(I 1,I 1),(B "",B ""),(B "/",B "0"),(B "*",B "")]),(Constr 0 [B "",I (-1),I 0,I (-1)],I (-1))]]),(I 5,Constr 6 [I (-4)]),(I 5,I 4),(B "([6",Map []),(I 7,B "[\240\171\145\147")]),(Map [(I 0,List [Map [(Constr 1 [B "",I (-1)],Constr 0 [I 1,B "0",B ""])],Constr 0 [Map [(B "2",I (-1)),(I 1,B "%")],Map [(I 1,I 0)],Map [(I 0,I 1),(I 0,B "")],List [I 1]],Map [(B "",B "\239\174\167+"),(I (-2),I (-2))]]),(B "m\240\167\171\160TU\"5",List [Map [(Constr 1 [B ""],B "")],List [List [B "~",I 1],Constr 0 [I (-1),I (-1),I (-1),B "L",I (-1)],I 0,B "T>",Map [(B "N",B "("),(B "",I 1),(B "",I 0),(B "",B "\229\169\186"),(I (-1),I 1)]],Constr 1 [Constr 1 [I 1,I 1,I (-1),B "\\"],List [B ""],Map [(I 1,B "h"),(B "i",B ""),(I 0,B "Q"),(B "9",B "\240\165\162\181"),(B "",I 1)]]])],List [List [Constr 1 [Constr 1 [B "U",I (-1)],List [I 1],B "g",B ""],List [I (-1),List [],B "Nl",B "\227\184\128\&8"],Map [(Constr 0 [I 0],I 2),(I 1,B "&a"),(List [I 0],Map [(B "V",I 1)]),(B "ZT",List []),(Constr 0 [I (-1),I 0,I (-1)],List [])]]]),(Constr 16 [],B "3b\240\164\178\191"),(Constr 32 [Constr 5 [B "",I (-4),Map [(Constr 1 [I (-1),I 1,I 1],Map [(B "",I 0),(B "",B "\240\166\131\146")]),(Map [(B "Y",B "\240\171\134\190"),(I 1,I (-1)),(B "\230\189\137",B "M")],Constr 0 [B "",B "_"]),(Map [],Constr 1 [B "",I 1,B ""]),(Map [(B "",B "$"),(B "X",I 0)],B "I")]],Map [(List [Constr 0 [I 1,B "'"],List [B "",B "k"],B "2E"],Constr 1 [List [],Map [],Constr 1 [I 0,B "",I 1]]),(List [I 1],I 2),(Constr 1 [I 0],I 0),(List [Map [(I (-1),B "/"),(I 0,I (-1)),(I 0,I 1),(B "",I (-1)),(I (-1),B "")],B "\240\150\163\185",Constr 0 [],Constr 1 [I 0]],Map [(Map [(I 1,B "v")],List [B "f",I 0]),(List [I 1,B ""],B ":\230\152\170"),(List [],I (-1)),(I (-1),I 2)])],Constr 2 [Constr 1 [B "JT",I 1,Constr 0 [B "",B "h",I (-1)],List [B "q",B ">",I (-1),I 1],Map [(I 1,B "E"),(B "",I 0),(B "B",I 0),(B "\240\151\148\188",I (-1))]],I 2,I 0,Map [(Constr 1 [B "",I 1,I 0,B ""],Map [(I 0,I 1),(I 0,B "")])],Map [(Map [(B "M",I 1),(I (-1),I 0),(I 0,B ""),(B "M",B "c"),(B "-",B "b")],I 0)]]],Map [])]),(B "X)QP`zi \\t",Map [])],Map [(I 6,Constr 213 [Map [(Constr 2 [I 4,Constr 2 [List [I 0,B "(",B ""],B "1\234\160\153",Map [(I 0,I 1)],Map [(I 1,I (-1)),(I 1,B "h"),(B "",B ""),(B "V",B "\240\169\179\181")]],B "z.",Constr 0 []],Map [(Constr 1 [B "I,",I (-2),B "4Y",B "q\240\152\171\133",B ""],List []),(Map [(B "E",Map [(B "@",I (-1)),(I 1,I (-1)),(B "",I (-1)),(B "",I 1)]),(List [I 1,I 0,I 1],I 1),(B "\226\135\162",Constr 0 [])],Map [(I 2,I (-1))]),(List [],I (-1))]),(B "HIal",B "WUy"),(I 4,B "")]])]),(Map [(Constr 268 [B "+P0\240\169\158\170\240\170\153\179\240\167\144\187\&3",Constr 21 [Constr 7 []],B "Rii\240\165\148\170\&7t",Map [(I 3,B "L\240\162\147\178\230\144\135\&6\240\168\159\141.s"),(List [],List [Map [(B "",I 2),(Constr 1 [],List [I 0,B "",B "e",B ""])]]),(List [I 0,Map [(List [B "",I (-1),I 0,B "E"],List [])],Constr 0 [Map [(B "f",B "|"),(I 0,I 1)],B "",B ""],B "A\"$",List []],I 7),(List [],Map [(B "\240\169\179\145b",I (-4)),(List [Map [(I (-1),I 0),(I 1,I (-1)),(B "\228\177\185",I 0)],List [I 0]],I (-2)),(Map [(I (-2),B "\240\177\133\130"),(Constr 0 [B "m"],I (-1))],B "\230\182\190"),(List [Map [(B "",B "6"),(B "\227\131\178",I 0)],Constr 1 [I (-1),B "",B "F",B ""],B "V",Map [(B "",I (-1)),(I 0,I (-1)),(B "\240\170\136\187",I (-1)),(I 1,B "z"),(B "e",B "!")]],Constr 1 [Constr 0 [I (-1)],List [I 1,B ":",I (-1),I 0],List [I 0,I (-1),B "",I 1,I 1]]),(List [],Map [(B "w",B ""),(I 1,Map []),(List [B "@"],List [I 0,B "",I 0,B "",I 0]),(List [I 0],List [B "",I 0,I 0,B "k"])])])]],I (-8)),(Map [(Map [(Constr 3 [I (-4)],I (-15)),(B "f\237\134\153~\240\172\160\146",Constr 2 [Map [(I 0,Constr 0 [B "h",I 0,B ""])]]),(List [],Constr 3 [Constr 2 [B "#"],Constr 2 [Map [(I 0,I 1),(I 1,B "u"),(B "j",I (-1)),(I 1,B "/"),(B "",B "x")],Constr 0 [B "|",I (-1)],List [B "T",B "q",I 0,I 0,B "\240\151\134\165"],B "V!"],Map [(I 2,Map [(I 1,I (-1)),(I 0,I (-1)),(I 0,B ""),(I 1,B "\240\152\177\170")])],B "f|*",Constr 0 [Map [(I 1,I 0),(B "R",B ""),(I 1,B "J"),(B "@",I 0)],B "",I 0]]),(B "TLe",B ":\240\151\184\145R>PqS")],Constr 21 [List [I 0,Map [(List [B "",B ""],I 0),(Constr 0 [I 0,I (-1),I 1,B ""],Constr 1 [I 1,I 1,B ""])],Map [(B "4",List [I (-1),B "6",B "\\"]),(List [],I 0)],Constr 0 [List [B "",B "",B "Z"],B "",I 0,List [I 1]]],Constr 5 [Map [],Map [(I 2,Constr 0 [I (-1),I 1,I (-1),B "="])],Constr 1 [I (-2)],B "",List [Constr 0 [],B "8",B "3",List [B "",I 0,I (-1),I 1],Constr 0 [I 1,I 0,I 0,B "-"]]],List [List [],Constr 2 [List [B "h",I 1],B "$z",B "",List [B "\239\166\147",B "\239\173\143",B "d"],Map [(I 1,B "\240\150\163\131")]]]]),(B "#X\232\146\142@2\"Ej]mw2",Constr 30 [List [List [B "",I 2,Constr 1 [B "",I 0,I 1]],B "",Map [(List [I 1,B "\231\184\139",I 0,I 1],I (-2)),(List [B "w",B ""],Constr 1 [B "c",I 1,B "",I 1,I (-1)])]],Constr 1 [I 3,Map [(Constr 1 [B "U"],Map [])],Constr 0 [],Map [(B "@3",Constr 0 [I 0,I (-1),I (-1),B "K"]),(List [B ")",I 1,B "\227\167\167"],Constr 1 []),(Map [(I (-1),I 1)],B "\203\130\240\163\178\161")],Constr 2 [B "",Constr 1 [B "",B "\240\145\177\150"],B " ~",Constr 0 [B ""]]],List [List [Map [],Constr 0 [I 1,B "<",I 1,B "\225\162\154"]],I (-2),Map [(List [B "",B "\240\167\190\138",B "3",B ",",I (-1)],I 2)]],Constr 6 [B "\226\141\184",Constr 0 [I 1,Constr 1 [B "",B "",I (-1)],Map [(I (-1),I (-1)),(B "",I 0),(I (-1),B "8"),(B "",I (-1)),(I 0,B "")]],Constr 1 [List [I 1],I (-2)],Map [(Constr 0 [],I 0),(B "&+",List []),(List [B "",B "[",B "q"],I 0)],I (-1)],List [Constr 2 [List [I (-1),B "\240\171\162\147",B ""],Constr 0 [I 0],Constr 1 [I 1,B "",I 0,I (-1)]],I (-2)]]),(B "\240\151\184\191\240\152\168\179hx",B "n"),(Map [(I (-1),Map []),(B "M\240\174\161\160",I 2)],B "J!S"),(Constr 2 [List [],B "",List [Constr 0 [Constr 0 [B "",B "\240\162\172\156",B "M",I 1],Constr 1 [I 0,I 0,B "$",I 1,B "W"],B "qi",Constr 1 [B "",I (-1)],I 1],Map [(I (-1),B "5"),(I (-1),Constr 1 [B "\235\166\187",B "7",I 0,B ""]),(Map [],List [])],List [],I 3]],I 8)],B "uaO#"),(Constr 45 [List [List [Constr 0 [List [B "",I 0,B "j",I 1],Constr 1 [],Map [(I 0,I 0),(I 0,B "c"),(B "",I 0),(I 1,I 1)],I (-2),I (-2)],I (-3),Constr 0 [Constr 0 [],B "",I 0],List [Map [],I (-1),I 2,List [B "",B ""],I 0]]],I (-3),Map [],I 6,I 2],B "7k\240\157\150\191\229\149\182\&5\235\132\144 lO?5\230\175\136H3TW"),(Constr 153 [B "\230\167\190u:\230\141\149",List [],Map [(I 1,Map [(Constr 2 [],B "o;~")]),(B "?",Map [(Constr 2 [List [],Map [(I (-1),I (-1)),(B "\240\162\152\188",I 0)],I 2,I 1],List []),(B "3q/",Map [(List [I 0],List [I (-1)]),(I (-2),I 2),(Constr 0 [B "",B "k",B "",B ""],List [])]),(I (-1),I 0),(Map [(Map [(B "V",I (-1)),(I (-1),I 1),(I 1,I 1)],B "N<"),(B "",List []),(Constr 1 [I 0,I (-1),I 0,I 0],List [I 0,I 0,B "",I 1,B ""])],I 4),(Map [(I (-1),Constr 1 [B "Y",B "Z",I 0,B "z"]),(Constr 0 [I 0,I 0],I 1),(I (-1),Constr 0 [B ""]),(Map [(I 0,B "E"),(B "",I 1),(I 1,I 1)],Constr 0 [I (-1),B "N"]),(Constr 0 [I 1,I 1,I (-1)],B "")],I (-4))])],B "p\240\146\144\165or$",Map []],I 19),(B "wA(S.J@n",I 10)],I 23)],Constr 3410269 [I 7,B "Suq\240\162\181\135XL#.ZE#G\240\167\144\188\240\160\145\164Z]_s\240\145\182\130_C\240\168\191\153A",Constr 19156 [B "\240\151\171\188 \240\159\153\150eO",B "Tu`o\240\165\190\184L>\228\174\151%\228\144\189\&4`'\229\137\191vHu",Constr 315 [List [B "\239\165\135D[\233\164\186%",Constr 6 [],Constr 5 [List [Map [(B "",B ""),(I 0,B "")],B "M"],Constr 2 [Map [(I (-1),I (-1)),(I 1,B "c"),(I 1,B "3")],B "]\234\128\181",Map [(B " ",B ""),(I 0,I 0),(I 1,I 0),(I 1,B "\236\186\172"),(B "",B "")],Constr 0 []],Constr 0 [Map [(B "l",B ""),(B "\240\169\181\152",I 1),(I 0,B "x"),(B "",I 1)],List [I 1,B "",B "\228\183\160"],List [],Map [(I (-1),I (-1)),(B "b",B ""),(I 1,I (-1))]],List [List [],Map [(I (-1),I (-1)),(I 1,B "%"),(I (-1),I 1),(I (-1),I (-1))],Constr 1 [I (-1)],B "",Map [(I 0,B "")]]],Map [(Constr 0 [],I (-3)),(B "x",Map [(B "",Map [(B "",I (-1)),(I 1,I (-1)),(B "\240\165\143\176",I 0)]),(Map [(I 0,I 1),(I 1,I 0),(I 1,I 0),(B "G",I 1),(I 0,I (-1))],B "M"),(I (-2),B "'")]),(I 4,Constr 0 [B "",B "+",B "",B "s"])]],List [I (-7),Constr 5 [Constr 1 [I (-2),Constr 0 [B "9",B "",I 0]],Map [],List [Map [(B "",I 0),(B "j",I 1),(B "",B "_"),(I 1,I (-1))],Map [],List [I (-1),B ""],List [B ""]],B "5",I 2],B "p=`e",Map []],I 11,Constr 9 [Constr 1 [],Constr 5 [List [Map [(I (-1),I 1),(I 1,B ""),(I (-1),I 0),(I (-1),I 0)],Constr 0 [I 1,I 1],Map [(I 1,I 1),(B "h",I 0)]]],B "t\230\169\163",Map [(Constr 1 [Map [(B "Q",I (-1)),(I 1,B "")],Constr 1 [],I 1],B "o`i*")]],Constr 10 [I 1,Constr 3 [Map [(List [B "\240\165\170\168",I (-1),I (-1),B "",B ""],I (-1)),(I (-1),Constr 0 []),(Constr 1 [B "^",B ":",I 1],List [I 1,I (-1)])],Constr 1 [I (-2),Map [(B "",B "*")],B ""],Map [(List [B "",B ""],Constr 1 [B "B",B "",B ""]),(Constr 1 [B "7",I 0],Constr 1 [I 0,B "",I 1,B ","])],Map [(I 2,List [I (-1)]),(Constr 0 [],Constr 0 [])]],Constr 3 [B "",I (-4),List [Map [],B "Z",I 1],I 4,Map [(List [B ""],List [B "",B "h",B "",I 0]),(I 1,Constr 1 [I 1,I 1,B ""])]],Map [(List [],List [I 2,List [B "X",I 1,B ""],B "c0",B ""]),(B "",Constr 0 [Map [(B "!",I 1),(B "f",I (-1)),(I 1,B "i")],List [I 1,I (-1)]]),(Constr 0 [I 1],Constr 1 [I 2,Map [],List [I 1,B "f",I 0,I 1]])],Constr 6 [Constr 0 []]]],B "\218\138)[#G:kr\236\143\168yY')[H\240\155\128\186l0",I 18],B "Or'7",List [Map [(Constr 25 [I (-1),I (-28),B "\232\162\163\229\172\144",B "a8\240\176\133\157t"],Constr 6 [])]]],I (-10)]
=======
B "W %.,"
=======
Constr 283501837855 [Constr 8577247 [Constr 22164 [Constr 486 [B "hR=VM9J3",Constr 10 [I 2,I (-19),List [Constr 2 [Constr 1 [B ""],Constr 1 [I (-1),B "",B "",I (-1),B ""],Map [(B "",B "+"),(B "",B "0"),(B "3",B ""),(B "/",B "p"),(B "",I 0)],Map [(I 0,B "A"),(I (-1),I 0),(B "]",B "")]],List [Constr 1 [I 0,I 1,B ";"],Map [(B "",B "C")],List [I 1,B "Z",B "-",I 0]],B "d's",B "",List [Constr 1 [B "C",B "m"],Map [(B "",I 1),(B "\240\148\146\162",I (-1)),(B "|",I 0)]]],List [B "\240\166\169\155",List [List [I 1,I 0,B " ",B "",I 1]],Map [],I 2,Map [(Map [(I 1,B "O"),(B "\240\157\133\170",I 1),(B "Q",I (-1)),(B "V",B "\""),(I 1,I 1)],Map [(B "",B "")]),(List [I (-1),B "O",I 0],B "\240\170\191\177"),(Map [(I (-1),I (-1)),(I 1,I (-1)),(B "2",I (-1)),(B "",B ""),(B "",I 0)],List [B "",I 0,B "",I 0])]],List [Map [(List [I 1,I 0],I 0),(List [],I 0),(Constr 0 [B "Z"],B "{U"),(B "`?",List [I (-1),B "",B "="])],Constr 2 [],I (-2),B "7\240\162\151\142\230\165\189"]],Constr 26 [],Map [(Map [],Map [(Map [],B "\240\151\153\165\&5w"),(I (-2),Map [(Map [(B "",B "a"),(I 0,B ""),(I 1,I (-1)),(I 0,B ""),(I (-1),I 1)],I 0),(B "HQ",B ""),(B "\"",Map [(I (-1),B ""),(B "",B "P"),(B "",I 1),(I 0,I 1)]),(Map [(B "w",B "K"),(I (-1),B "H"),(B "\240\165\173\164",B "\240\165\163\139")],Map []),(List [],Map [(I 0,B ""),(I 1,I 1),(I (-1),B "Y"),(I 0,I 0)])]),(Map [],Constr 0 [I (-1),I 2,B ""]),(Map [(I 0,Map [(I (-1),B ""),(I 1,B "R"),(B "v",I (-1)),(B "",B ""),(I 0,B "I")]),(I 0,Map [])],B ">\240\164\144\179")]),(List [Constr 0 [I (-1),Map [(B "s",B ""),(I 0,B "N"),(B "",B ""),(I 1,B ""),(B "9",B "6")],I 1,I 2,Constr 0 [B "",B "\228\169\182",I (-1),I 1,B ""]],Map []],List []),(Constr 7 [List [B "z",I (-1),B "\240\146\140\151",Map [(I 0,I 1),(B "y",I (-1)),(B "D",I (-1)),(I (-1),I 0)],B "y"]],List [])]],B ":EVB\240\157\158\145b1o>D5U8"]]]
=======
List [List [Map [(B "o'9*dp\240\174\171\157p*%oqfkdp",List [List [List [List [],I 4,Map [(Map [(B "I",B ""),(B "[",B "")],B "")],B "j\240\172\188\145\225\150\188",Constr 1 [List [],I 2,B "D"]],Constr 7 []]])],Map [(Constr 446 [List [Constr 2 [List [List [I (-1),B "",I 0,B "",B ""],Constr 1 [],Constr 1 [B "",B "\240\144\142\166",B "",B ""]],Map [(Map [],Map [(B "",B ""),(I (-1),I 0)]),(List [],List [I 1,B "\240\169\191\163",B "'"]),(List [B "",B ""],List [B "g"])],Constr 0 [Map [(B "i",B "\240\176\165\178")]],List [],Map [(B "",Map [(B "y",I 1),(B "\240\144\186\167",B "w"),(B "",B "+"),(I (-1),B "%")]),(Map [(B "]",I 0),(I (-1),I (-1)),(I 0,B "\240\168\188\157"),(B "",B ""),(I 1,I (-1))],B "w"),(Constr 1 [B "",B "\"",B "",I (-1),I (-1)],Map [(B "",B "J"),(B " ",B ""),(B "",B ".")])]],B "\240\161\178\178\227\134\171S",I 1],List [B "",Map [(Constr 0 [Map [(B "",B ""),(I 0,B ""),(B "",B "")],B "-"],List [])],List [I 4,Constr 1 [],I (-1),Constr 2 [List [B "0"]]]],Map [(B "fd?v_c^",Constr 0 [List [Constr 0 [B "",I 1,I 0,B ""],Map [(B "L",I (-1)),(B "",B ""),(B ")",B "!"),(I (-1),I (-1))]],I 2,I (-4)]),(Map [(B "<",B ""),(List [List [I 0],List [I (-1),I 0,I 0,I 1],I 2,Constr 0 [I (-1),B "O",I 0,I 1,I 0],List [I 1,B "",I 1]],Constr 2 [List [],I 1]),(I (-2),I 3),(B "",I 1),(I 2,Constr 2 [Map [(B "\\",I 0),(B "",B "y")],I 1,Map [(B "A",I 1),(B "R",B "*")]])],I 2),(B "\240\159\160\135",Map [(I (-2),B "C%n"),(Constr 2 [List [B "",I 1,I 1,B "<",B "~"]],Constr 1 [Constr 0 [I (-1),I (-1)]]),(Constr 0 [B "6",Constr 0 [B "",B "",B "S",I (-1)],I 1],B "a"),(Map [(Map [(B "m",I 1)],Map [(B "P",B ""),(I 1,B "G"),(I 0,I 1),(B "",I (-1))]),(B "o ",Constr 1 [I 0,I 1,I 1,I 1,B "\240\165\131\131"]),(B "",B "L")],List [Map [],List [I 1,I 1,B "\230\171\140",B "l"],Map [(I 1,B "b"),(I (-1),B "P")],B "k"])])]],Map [(Constr 25 [Map [(List [I 1],Map [(I 2,Map [(I (-1),I 0),(I 0,B ""),(B "",I 0)])]),(List [Map [(B "o",B ""),(B "",I 1),(B "g",I 1),(B "",B "=")],List [],Map [],List [I 1,B "",B "",I 1,I 0]],List [B "",List [B "\240\151\191\172",B ""],B "pS"]),(B "y`",Map [(B "\240\171\179\162h",Constr 1 [B "",B "",I 0,I 0,B "l"]),(Constr 0 [],B "H")]),(List [Map [(B "\240\173\162\163",B "N"),(I (-1),I 0),(I (-1),I (-1))],List [B "",I (-1),I (-1)]],List [Map [(B "",B ""),(B "",I (-1)),(I 0,B ""),(B "",B ""),(I (-1),I (-1))],Map [(B "",I 0),(I 1,B ""),(I 0,I 0),(B "",I 0),(B "q",I (-1))],Map [(B "[",I (-1)),(B "",I 1)],Constr 0 [I (-1)]])]],Map [(Map [(List [Map [(I (-1),B ""),(I (-1),B "m"),(I (-1),B ""),(B "(",I 1),(I 0,B "")],Constr 0 [B "'",I 0],B "K\230\169\136",Map []],List [B "I9",B ""]),(B "",List [List [],I 0,List [B "",B "G",B ""]]),(Map [(Constr 1 [I (-1),B "\240\172\137\182",B ""],I 2),(I (-1),Constr 0 [I 1,I (-1),B "f"]),(B "",I 0),(B "-E",Map [(I 1,B "P")])],B ""),(B "e??Z",I (-3))],I 7),(List [Map [(Constr 0 [I (-1),B ""],B ""),(Constr 1 [],I 0),(Constr 0 [I 1,B ""],List []),(List [B "\240\164\152\169",I 1,I 0,I 1],Map [(B "",I (-1)),(I (-1),B "%"),(I (-1),B "w"),(I 0,B ""),(I 0,B "")])],Constr 2 [B "6",Constr 0 [I (-1),B "",I 0,B "6"],B "",B "\240\172\164\184z"]],B "#"),(B ":o",I 0),(B "+W\240\166\172\162/yTZ",B "\\P\240\162\170\171")]),(I 185,I (-10)),(B "",B "Z<]EHvFXNq\240\168\176\167\240\161\178\134"),(I 11,Map [(Map [(Map [],Constr 1 [B "",B "}",Constr 0 [B "N",B "?",B "",B " "]])],Constr 8 [Map [(I 1,List [I 0,I (-1),B "",B ""]),(Map [(I 1,I (-1))],List [])],Map [],B "1#H",B ".X"]),(Map [(Constr 0 [List [],Constr 1 [],I 0],B "D\240\163\150\174\235\182\162\240\165\170\157"),(I (-3),B "*fL")],Constr 4 [List [List [I (-1),B ""]]]),(Constr 6 [B "",B "IW$\233\174\139",B "Z70\225\177\143"],B "\240\164\172\142"),(I (-5),I (-2))]),(Map [(Constr 2 [I 4],I 0),(B ".M4B8",List [Constr 1 [],List [I (-1),List [I 0],B "",B "",I (-1)],Map [(I 2,Map [(I 1,I 0)]),(I (-1),I 0),(Constr 0 [I (-1)],I 2)],I (-2),List [Map [(B ")",I 0),(B "",I (-1)),(I 0,B ""),(B "",I 1),(B "<",B "K")],B "\240\173\149\147"]]),(I (-5),B "1"),(List [I 4,B "e",Constr 2 []],List [Map [(B " ",List []),(Map [(B "",I 1)],List [I (-1),B "*",I 1,I (-1)])],Map [(Constr 0 [B "",I (-1),I (-1),B "\229\138\143",B ""],List [I (-1)]),(B "",Constr 0 [B "v"])],B "sOZ/"])],I 9)]),(I 1,List [Map [(Constr 1 [Map [(Map [(I 0,B "h"),(I 1,B "i")],List [B "W",B "",I (-1)]),(B "(",Map [(I 0,I (-1)),(B "6",B "G"),(B "=",I 1),(B "z",I 1),(I 1,B "\240\159\174\148")]),(Constr 0 [I 1,I 1],Map [(B "",I 0),(B "",B "M")]),(B "",I 1),(I 2,List [B ""])],Map [(List [B "",B "Z",I (-1),I 0],I 1),(I 2,B "")],B "C"],I 7),(Constr 8 [I (-3)],List []),(B "7R",Map [(List [List [B ""],List [I (-1)],B "u",Map [(B "h",B ""),(B "S",I (-1)),(B "",B "")]],Map [(List [I 1,I 1,B "=",I 1],I (-2)),(B "'",List [B "B",B "}",I 1,B "l",I 0]),(List [I 1,I (-1),I 1,B "",B ""],Map [(I 0,B "l")]),(List [B "3"],B ""),(Map [(B "",I 1),(B "",B "~"),(I (-1),I 0)],B "Vu")]),(Constr 0 [I (-2)],Map [(Map [(B "\236\173\132",I 1),(B "",I 0),(I 1,B ""),(I 0,I 0)],Map [(B "G",I 0),(B "",I (-1))]),(B "c",List [B ""]),(Constr 0 [I (-1),B "",B ""],I 0),(Map [],Map [(B "",I 1),(B "",I (-1))]),(B "t#",B "")]),(B "eS*p",B "R"),(B "\240\151\167\150MZg",List [I (-2),Constr 0 [I 1,B "U",I 1,I 1,I 0]])]),(I 0,I (-7)),(Constr 7 [B "L,W9",List [B "",I 2,Map [(B "u",I (-1)),(B "",B ""),(B "m",B ""),(I 0,B "x")],Constr 0 [B ""],List [I 1]],Constr 0 [B "",Constr 0 [I 1,I (-1)]]],Map [(B "@\240\161\188\184[",List [List [B "v",B ""],I 2,List [B "",I 0]])])],B "hCr`O|(`Q",I (-6)])]],Map [],Map [(I (-25),I (-18)),(I (-29),Constr 8740 [Constr 505 [I 6,Map [],Map [],B "lo(/\240\165\158\187<i>\233\184\150"],Map [(Map [],B "\240\170\153\158 Y"),(B "8",B "bE[$AkZur[x"),(List [I (-4),Constr 4 [List [List [I 0,I 1,I (-1),I 1],B "iS"],Map [(I (-2),List [B "I",I (-1),B ""]),(B "",Map [(B "",I 0),(B "",B ""),(B "[",B ""),(B "",I 1)]),(I (-2),Constr 1 [I 1,B "a",I 0,B "T"])],B "i"],List [B ":\240\172\138\165:",Map [(I (-2),List [B "",B "n"])],I (-4),Constr 0 [Constr 0 [I 1,B "5",B "i"],B "\240\161\161\130",I (-1),List [],I (-2)],Constr 2 [Constr 0 [B "$",I 1,I 0,I 1,B ""],I (-1),B "",Map [(I (-1),B ""),(B "p",B ","),(I 0,B ""),(B "Q",B ":"),(I (-1),I 0)]]]],List [Constr 5 [B "t]",Constr 1 [B "GZ",Map [(I (-1),I 0)],Map [(B "",B ""),(B "4",I (-1)),(I 0,I 0),(I 0,B ""),(I 1,I 0)],B "u"]],Constr 2 [I (-3),B "",List [B ";",B ""],Map []]]),(Map [(Map [(B "\"\240\174\129\155y",B "&]\229\137\188")],B "\240\147\143\129G\240\157\163\132Tm"),(I (-2),Constr 1 [I (-3),Constr 2 [I 1,I 1,Map [(I 0,I 0),(B ";",I 0),(I 0,I 1),(B "",I (-1)),(B "",B "")],B "C"],I (-2),List [B "\240\161\174\187",Constr 1 [I (-1),B "",I (-1),B "",I 0]]]),(List [Constr 0 [B "",List [I 1,I 1,I (-1),I (-1)],Map [(I (-1),I (-1)),(I (-1),I 1),(B "",B "&"),(B "",I 1),(B "",I 1)],I (-1)],Map [(Constr 1 [],B ""),(B "",Map []),(List [B "9"],I (-1)),(Constr 0 [I 0,B "r",I 0,B "a"],I 2)],B "r"],Constr 4 [Constr 0 [Constr 0 [B "k",I 1,I 0,I (-1),B ""]],Constr 2 [I 0],I (-2)])],Constr 4 [List [I 7,B "C2;S",B ""],B "AwsW|",List [Map [],Constr 2 [],Constr 1 [I 0,I 0,I 2,I (-1)]],Constr 8 [B "",Constr 0 [],I 0,List [],B "W%_"],Constr 7 [List [Map [(B "3",B "0"),(I 0,B "")],B "n",Constr 0 [I 0,I 1],B ""],Map [(Constr 0 [I 1,I 1,B "+"],B ",J")],List [List [I 1,B "r"]]]]),(Map [],I (-7))]]),(List [I 0,I (-14),Constr 236 [Map [(Constr 8 [],Constr 4 [B "]",Constr 2 [Map [(I (-1),I (-1)),(B "\227\168\184",I (-1)),(B "",B ""),(B "T",I 0)],B "",List [B "",B "m",I 1,I (-1)]],B "Jk"]),(B "NqM\228\128\184)\240\169\177\142",I (-7)),(B "jos\227\148\144",List [Constr 0 [Constr 0 [B "\240\166\132\187",I 0]],B "{",Map [(List [I 0,B ""],Constr 0 [B "w",B "",B "",B ""])],Map [],Map [(Map [(I 0,I 1),(B "",I (-1)),(I 1,I 0),(I 1,B ""),(B "",B "D")],Map [(I (-1),I 0),(B "6",B ""),(I 1,I (-1))]),(Constr 0 [B "g",I 0,B "",B ""],List [I (-1),B "\240\164\185\144",I 0,I (-1),I (-1)])]])],I (-5)]],Map [(Map [(Constr 10 [B "^\240\152\131\188M",List []],Map [(Constr 0 [B "\233\174\177Pv"],Constr 5 []),(I 3,B "b"),(I 4,B "=1\231\134\129n$J")]),(Constr 3 [Constr 4 [B "]&\233\186\154\\",I (-2)],I (-6),List [List [Map [(I (-1),B "\240\176\178\148")],Constr 1 [B "",B "u",I 1,B "_"],B "$",List [I (-1),I 0,I 0,B "Q",B "\224\178\153"],Constr 0 [I (-1),B ""]],I (-1),I 2,List [Constr 1 [],Map [],Map [(B "M",I 1),(I (-1),B ""),(I 1,B ""),(I (-1),B "")],Constr 1 [I (-1),B "%",I 1,B ":",I 0],I 2]],I 0,List [List [Constr 1 []],List [],I 0,List [I 1,List [B ""],B "",Map []],List [Constr 1 [I 1],B "o3",I 1]]],B "Q")],B "@`6kK9;w=^\240\151\158\185A\232\156\147)y&"),(Constr 120 [],Map [(Constr 9 [B "Rw\\d",Map [(Constr 2 [],I 2),(List [B "",I 1],Map [(I 2,B ""),(B "Ly",I 2),(Map [(I (-1),B "")],Constr 0 [I 1])]),(List [I 2,Constr 1 [B "\240\165\188\176",I 0,I 1,I 1,B "l"],Constr 0 [I 1,B "",I 1,B "U",B "Q"]],B "-\240\159\160\189`"),(I 4,List [I 2,I 1,B "",List [I 1,B "/",I (-1),I (-1)],Map [(B "5",B ""),(I (-1),I (-1))]]),(I (-4),Map [(Map [(I 0,B "n")],Constr 0 []),(I (-2),I 1)])],I 5],Constr 7 [B "\212\140cE\240\170\184\146}'"]),(Map [(Map [(I 1,List [I 1,List [I (-1),I (-1)],B ""]),(Map [(List [B "",B "r"],List [B "M",B "",I 0]),(Map [(I 0,B ""),(B "]",I 1),(B "S",I 1),(B "a",B "o"),(B "\240\151\181\191",B ")")],Constr 0 [B "\240\176\190\130",B "",B "V"]),(Map [(B "4",B "#")],Map [(B "\230\140\168",B "D"),(B "",I 0),(I 1,B ""),(I 1,I 1)])],List [List [B "",B "",B ""],Constr 1 [B "+",B "",I (-1)],Map [(B "",B "")],Constr 1 [B "",I 1,B ""],Constr 1 [B "",I 0,I 1,I 1]]),(List [],I (-1))],Constr 0 [Constr 2 [I 2,List [],Map [(B "\\",I 1)],B "",List []]]),(Map [(B "i",List [B "_f",Map [(I 0,B ""),(B "",I (-1)),(I (-1),B ""),(I 0,B "")],Constr 1 [B ""]]),(B "ZT(",I 1)],Constr 5 [Map [(Map [(I 1,B "\240\160\186\137"),(B "<",B "")],Constr 1 [B "g",B "y"])],I (-1)]),(List [],Map [(Constr 0 [Constr 0 [],B "f\228\166\186",Constr 0 [I (-1),B "s",I 0,B "v",B ""],Constr 1 [I 0,B "i",B "",I (-1)]],Map [(B "K",Constr 0 [I 1,I 0]),(List [I (-1),I (-1),I 1,I 0,B ""],Map [(I 1,I (-1)),(I (-1),I 0),(I 0,I 1),(B "",I 1),(B "",B "J")]),(I 1,I 0)]),(List [Map [(I 1,B ""),(B "",I 0),(B "4",I 0)]],List [B "H",List [I 0,I (-1),I 0],Constr 0 [B "",B "",I (-1),B "9"]]),(B "(,",B "0%\240\152\158\155f"),(B "V",B "0a\231\139\150\\")]),(List [Constr 2 [Map [],B "z",Map [(B "",I 0),(B "\240\166\165\133",B "")]]],Map []),(B "",List [I 2,List [Map [(B "0",B "("),(I 0,B ""),(I (-1),B ""),(I 1,B ""),(B "",I 0)],B "",Constr 1 [I 1,I (-1)],List [B "",I (-1)]],List [List [],Map [(I 0,I (-1)),(I 0,I (-1)),(I 1,B "g"),(I 1,I 1),(B "",I 1)],B "",Constr 1 [B "!",B "+",B "+",B "X"]],B ")\240\163\130\165"])],List [List [I (-1),Map [(Map [(I 1,B "%"),(B "\\",B ""),(B "",I (-1))],Constr 1 []),(B "",Map [(B "",I 1),(I 0,B "!")]),(Constr 1 [B "@",B "",B "|",B ""],Constr 0 [B "9",I 0,I (-1),B "%"]),(Constr 1 [I (-1),B "6"],List [B "0",B "\240\160\177\190",I (-1),I 0,B "'"])],B ""],Map [(Map [(I 0,List [B "",I (-1),B ""]),(List [B "",I 1,I 0],B "?"),(I (-1),Constr 0 [I 0,I (-1),B "",I (-1),B "\236\148\184"]),(Map [],B "")],Map [(Map [(I 0,B "*"),(I (-1),B "")],B "\240\162\176\159"),(Map [],List [B "'",I 1,I 1]),(Constr 0 [I (-1),I 0],I 1)]),(List [],I 5)]])])])],I 8,Constr 1209816 []]
=======
Map [(B "hf6?\240\152\169\160pv,~\240\173\141\180\&5\240\160\168\173\235\185\163S(|3U\240\167\152\147\240\173\182\180EMx,{{W3\240\152\158\187}u\240\176\136\148\240\145\171\147\230\173\130C\240\152\134\172b0\240\174\133\177.K\240\165\149\156A7BhR",Constr 6982381 [List [],Map [(I (-26932),I 7205),(Map [(List [I 1,I (-4),Map [(B "",Constr 1 [Map [(B "",I 1),(B "",I 1),(B "}",B "$"),(I 1,I 1),(I 0,B ">")],Map [],Constr 1 [B "",I 1,I 0,B "",B "I"],List [I (-1),I (-1),I (-1),B "C",B "\240\176\153\145"]]),(B "\"E(",Map [(I 2,B "nl"),(B "",I (-1))]),(B "\234\133\137=sT",I (-1)),(List [B "",List [B "",B "J",I (-1),B "!"],I 0,I (-1),I (-1)],B "/\240\158\139\128"),(List [I 2,Constr 1 [I (-1),I 1,B "p"],Map [(I (-1),I (-1)),(B "0",I 0),(I 0,I (-1)),(I 0,B "")]],List [B "v",Map [(I 1,B "(")],Constr 1 [I 0,I (-1)],B ";",B "6"])],Constr 6 [],I 1],B "{"),(Map [(B "\240\159\160\153~V",Map [(I 7,B "\240\172\187\164@"),(Constr 2 [I 1,Map [(I 1,I (-1)),(B "",I (-1)),(I 0,I 1)],Constr 0 [B "*",B "v",I 0,I 0],Constr 1 [I (-1),I (-1),B "",I 1,B ""]],Constr 0 [Constr 0 [B "",B "\236\175\130"],B "_",B "j"]),(I 0,List [Map [],Constr 1 [I (-1),B "&",B "9",B ""],B "w"]),(I (-2),B "4\240\173\141\161$")]),(List [Constr 2 [I (-1)],List [Map [(I (-1),B ""),(B "",B ""),(B ">",I 1)],Map [],I (-1),I (-1)],I (-3)],I (-4))],B "RktJ\"SP\240\163\134\128B3")],B "zvIq:~n\240\145\163\169"),(Map [(B "",Map [(List [],B "_9("),(I (-1),I 5),(Constr 3 [I (-4)],B "L!+")])],B "\240\164\177\184IM2e\240\170\163\140\&4@Y\226\152\158\226\177\166\&9\\")]]),(Constr 12413250 [List [],List [Map [(I (-11),I 325),(Constr 0 [],List []),(I 8,Constr 5 []),(List [List [I 2,B "\231\154\143oL)",Map [(List [B "l",I 0,B "4",I (-1)],Constr 0 [B "}",I 0,I 0,B "3",I (-1)]),(Map [(B "Q",B ""),(B "",B ""),(I 1,B "")],B "N")]],B "\227\136\182 "],Map [(Map [(Map [(B "",Constr 1 [B "U",B "U",B ""]),(I 1,B "o\240\170\140\129")],Map []),(List [I (-1),Map [(B "O",I 1),(I (-1),B "Y")]],Constr 1 [List [B "",I 0,B "~"]]),(Map [(B "",I 2),(B "~y",I (-1)),(List [],I (-1)),(List [B "",I (-1),B "d",B "C",I 1],B "\240\162\160\138j"),(B ";",List [B "",B "t",B "u",I 0])],Map [(Constr 0 [I 1,I 0,B "",I 0],B "V"),(Constr 0 [B "",I 1,B ">",I (-1),I 1],I 2),(Map [(B "",I 0)],I 0)]),(I (-2),I 1),(B "eSE",B "")],List [Map [(List [B "%",I (-1),B "^"],B ""),(List [I 1,I 1,B "#"],List [B "@",I 0]),(Map [(I (-1),B "X"),(B "",I 0),(B "",I (-1))],Constr 0 [I 1]),(List [B "",B "&",B "\240\161\181\148",B "~"],Constr 0 [I 0,I 0,I 0]),(I 1,I 2)],I 3,Map [(B "D",I 0),(Constr 1 [B "G",I 1,B "",B ""],Constr 1 [I (-1),I 1,I (-1),B "\235\161\183"]),(B ";h",I (-1)),(I (-2),B "!")],Map [(Map [(B "",B ""),(B "",I 0),(B "",I (-1)),(I (-1),B "\237\159\169")],List [I (-1),I 1,B "",I 1,I 1])],Constr 0 [List [B "Q",I 1,I 1,B ""],Constr 1 [I 1,B "",I 1,I (-1)],Map [(B "",I 0),(I (-1),B "")],I 1]]),(B "|_Ye",I 5),(I 7,I 22)])],Constr 436 [],Constr 71 [Constr 18 [Map [(Map [(Map [(I (-1),I 0),(I 1,I 1),(I 0,B "k"),(I (-1),I 0)],B "\240\167\184\141"),(I 1,Map [(I (-1),I 0),(I 0,I 1),(I (-1),B "")]),(Constr 1 [I 0,I (-1),B ""],B "#"),(List [I 0],List [I 0]),(Map [(B "",I 1),(I 1,I 0)],Constr 1 [I (-1),B "",B ""])],I 3),(List [Constr 0 [I 0,B "",I (-1),I 0],Map [(B "2",I 0),(B "\240\170\142\138",I 0)],B "\240\170\176\160",Map [(B "\240\162\135\189",I (-1)),(I 1,B ""),(B "",B "\236\136\136"),(B ">",B ""),(I (-1),I 0)]],Map [(Constr 0 [B "\240\171\161\142",I (-1)],Map [(I 1,I (-1)),(B "f",B "M"),(B "z",I 0),(I 0,I 1)]),(Constr 0 [B "",B "\240\152\178\149",B ""],I 1),(B "<",B ""),(I 2,B "pq")]),(I 4,I 2),(Map [(Map [(I (-1),I 1),(B "",B "")],I 2),(Map [(B "L",B ""),(B "",B ""),(B "",I 1)],B "\240\161\128\147"),(List [B "",I 1,B "",I 0],Map [(I 1,B ""),(B "F",I 0),(B "",B ""),(B "a",I (-1))]),(B "\240\160\162\152`",List [B "m",I (-1),I (-1)]),(B "",B "")],Constr 0 [List [B ""],Constr 1 [I 1,B "l",I 0,B "J"]])],Constr 8 [Constr 0 [List [B "$",I 1,I (-1),I 0,B ""],B ""],List [I 0],B "",Constr 0 [I 1,List [I 0,B "\240\166\138\181",B "8",B "\240\162\181\191",I 0],Constr 1 []],I (-1)],B "",Constr 4 [I (-3)]],Map [(List [I 3,B "q\240\160\143\157\240\166\179\134h",List [List [I 1,I 0,I 0,B "H",B ""],I (-2)],Map [],Constr 1 [I 1]],B "\240\147\142\175"),(Constr 8 [I (-1),List [Constr 1 [I 1,I 0,B ""],Map [(B "",B "f"),(B "",B ""),(I 0,B "r"),(B "",B "6"),(I (-1),B "\240\162\145\133")],Constr 1 [I (-1),B "6",I 0],B "Ao",List [I 1]]],Constr 8 [Constr 0 [B ""],I 0,I 4])]]]],I (-42)),(Map [(List [B "\233\162\181\&9x4t:\"^j\231\150\142K,6\240\174\146\175B$\240\166\139\129]k",Map [(Map [(B "cuu%`",List [B " /\240\164\164\147",List [B "5"]]),(Map [(B "\240\166\191\171h\240\176\136\130e",List [I 1,List [I (-1)],Constr 0 [B "",I 0,I (-1),B "",B "="]]),(Map [(Map [(I 1,I 0),(I (-1),B "K"),(B "",B ""),(I (-1),B "")],B ""),(I 1,B "n")],List [I (-1),Constr 1 [],List [B "",I 0,I (-1)],Map [(I 0,B ""),(B "",I 0),(I 0,I 0),(I 0,B "\231\151\157"),(B "n",B "\\")]])],List [Constr 0 [Constr 0 [I 1]],List [I 2]])],List [I 2,B "#J\231\146\155e\225\178\159)5",I (-13)]),(B "\236\191\155[ve\240\167\136\188kx^e",List [Map [],B "\240\170\187\149DJF"]),(I 9,B "\240\176\187\181hplP<]R[4TU")],I (-13),Constr 428 [I 8,Map [],Constr 30 [B ":\240\165\171\151^",List [List [B "`",I 1,Constr 1 [I (-1)],Constr 0 [I 0,B "6",B "",I (-1)],I (-2)]],Constr 2 [List [I (-1),Map []],I (-4),B "5+k\\",B "",B ""],Constr 0 [List [],Constr 2 [Constr 0 [I 1],List [I 0,I 1,I 0,I (-1)]]]]],List [List [Constr 6 [B "$",Map [(List [I 1,B "O",I 0],Map [(I 0,B ""),(I 0,B "+"),(B "_",I 0),(I 1,I 1),(I 1,B "")]),(List [I 1,B "S"],B "/"),(B "\"w",Map []),(Constr 1 [B "\240\172\159\174",I 0],I 2),(Map [],B "")],Constr 0 [Map [(I (-1),I (-1))],Constr 1 []],B "j"],Map [(Constr 0 [Constr 0 [I 0,I 0,B ""],Map [(B ">",I 0),(I 1,I (-1))],List [I (-1),I 0,B "p"]],Map [(B "",B "P/"),(B "",Constr 0 [])]),(Constr 2 [I 2,List [I 1,B "\240\175\162\141",I (-1)],I 1,Map [(I (-1),I 1),(I 0,B "v"),(I 0,B ")"),(I (-1),I 0),(B "",I 1)]],B ""),(List [B ""],Map [(B "t\232\137\188",List [B ";",I 0,B "\240\164\172\189",B ""]),(Map [],B ""),(Constr 0 [I 1,I 0,I 0],B "\240\167\130\149H"),(Map [(I 1,I (-1))],List [I 0,I 0,B "",B "",I 0])]),(Map [(Map [(I (-1),B "}"),(B "L",I 1),(I 0,B "")],Map [(I 0,B ""),(I 1,I 1),(B ")",B "~"),(I 0,I (-1)),(I 0,B "")]),(B " ",B "L"),(List [I 1,B ""],List [B "",I 1])],List [Constr 0 [I 0,I (-1),I (-1),I (-1)],List [B "+",B "",I (-1)]]),(B "",List [Map [(I 1,B ""),(B "'",I 0),(I (-1),B "")],List [I 0,B "",I 1],Map [(I 0,B ""),(B "2",I 0),(B "W",I 0),(B "",B "(")]])],I (-2),I (-7),B "H^e5"],B "",Constr 18 [Constr 6 [List [],Map [(Constr 0 [I 0,B "l",I 0,I (-1),B ""],I 1),(List [I 0,I (-1)],List [I 1,B "4"]),(B "[",I 1)],Constr 0 [Constr 1 [],B "b"],Map [],B ";R"],B "\240\152\132\136\240\168\148\188",List [I (-8)]],B "%L(\227\137\128*I!iM"]],Map [(B "\233\160\172s}\240\161\187\146",B "11y'3L\240\177\128\147[]"),(Constr 352 [List [I 6,Constr 6 [List [B "",Map [],List [I (-1),I (-1),B "",B ""],B "*"],Constr 1 [List [I 0],Map [(I (-1),B ""),(I 0,I (-1))],I (-1)],List [I 1]],B "PeVA"],I 348,List [List [List [Constr 1 [I 0,B "y"],B "Ti",Constr 0 [],B "\233\152\141)",I (-2)],List [List [B "",B "h",I (-1),I (-1),I 1],B "",B "",Constr 0 [B "D",B "L"],B "\231\175\132\240\151\145\191"]],Map []]],B "4h7\240\160\155\166\"\240\174\153\165qd")])],I 14)]
=======
Map [(List [List [I 16,Constr 349 [Constr 24 [I (-5)],Constr 0 [List [B "]^"]],B "nk,DV\240\150\169\150Wflq",I 1],List [I (-149),B "3OE\240\172\191\165\&0\230\184\137$"]],Constr 1475 [I 4,List [I (-5),B "#\225\146\175\&5> 8",Constr 6 [Map []],I (-2),B "v}IGn\234\184\147u"],Constr 30 [Constr 22 [I 1]],B "<#5/soip:"],Map [(List [B "D",I (-180)],List [Map []]),(B "U",Map []),(Constr 447 [Map [(List [Map [(List [B "K",B "L",B ""],Map [(B "",B "}"),(I 1,I 1)]),(Constr 1 [B "B",B "2"],B "")],Constr 1 [List [B "n",I (-1),I 0,B "0",I (-1)],Map [],I (-2),B ""],List [B "C*"]],B "8()#")],B ">qus _.-n\240\167\172\166",I 9],Constr 181 [Constr 30 [],I (-4),Constr 1 [B "S]PK,gO",List [Map [(Constr 0 [B "",B ""],I (-1)),(B "",B ""),(Map [(B "",I (-1))],List [B "",I (-1),B "",I (-1)]),(B "p",Map [(I (-1),I 0),(I 1,I 1),(I 1,B "\240\169\178\129"),(I 1,B ""),(B "T",B "")]),(I (-1),Constr 0 [B "",I 0,I (-1),B "g",I 1])],B "\240\170\187\140d%",I (-1),Map [(List [I (-1),I (-1)],I (-2)),(Constr 0 [I 1,I 1,I 0,I 0],Constr 0 [I 0,B ""]),(I 0,I 1)]],Map [(I (-1),B "\229\185\128;'$")],I 32,Map [(List [List [I (-1),B ""],I (-1),B "",I 0,B "\230\158\145"],B "K "),(List [I 0,List [I 1,B ""],List [I 1,B "",I (-1),I 0,B "\240\164\187\171"],B "/\240\152\166\128",B "p\240\176\182\137"],List [I 2,Map [(B "x",I (-1)),(B "E",I 0)],B "(",Map [(I 1,B ""),(I 0,I 0)],List [B "5",B "",B "",I 1]]),(I (-2),Map [(List [B "\\"],List [I (-1),B "^",B ""]),(List [I 1,I (-1),B "4",I 1,B ""],Map [(B ":",I 1)])]),(B "gG",I 8)]]])],List []],I (-16)),(Map [(I (-6307362),Map [(B "b}\240\145\181\174uGJD.'!\240\166\165\133\231\162\131\240\174\147\174Zy\235\156\129_\236\182\130",B "8\240\151\128\174e$Ga"),(I 19,Map [(B "$>2",List [I 11,Map []])]),(B "a]`jm\232\170\147",Map [(I 2,Map [(Map [(I 3,B "\240\162\128\173"),(I (-4),B "q\240\172\148\142\227\135\139"),(Constr 1 [I 0,Map [(I (-1),B "L"),(B "M",B "z"),(I (-1),B "\225\153\185")],Map [],Map [(I 1,B ""),(B "\240\162\142\189",I 0)],Constr 0 [B ";",B ""]],I (-3)),(List [B "sS",Map [(B "&",B "")],I 2],B "\237\134\156\&7")],I 1),(List [Map [],Constr 0 [B "",List [B "",B "",B ")",I 1],List [B "",B "6"],List [I 1,B "\\"]],Map [(B "+,",I (-1)),(Map [(I (-1),I (-1)),(I 1,B ""),(I 1,I (-1)),(I 0,B "m"),(B "j",I (-1))],Map [(I (-1),B "G"),(I 0,B "&"),(B "",B ""),(B "",B "")]),(B "X7",List [B "",I 1]),(B "?",B ""),(I (-2),B "")],Map [(I (-2),List [B "_",I 1,I 1,B ""]),(Constr 1 [B "",B ":",B ",",B "",B ""],Constr 0 [])]],Constr 8 []),(Map [(B "",I 2),(Map [(B "",Constr 1 [I 1,B ""]),(List [I (-1),B "\240\148\146\177"],B "")],Map [(Constr 0 [B "k",B "\225\189\179",B "e"],List [B "A",I 1,I (-1),B "e"]),(List [B "u",I 0,I 1],List []),(Map [(I 1,B ""),(B "",I 0)],Map [(B "P",I 1),(I (-1),B "$"),(I 1,B "t"),(I (-1),B "")]),(Map [(B "&",I 0),(I 0,I 1),(I 1,I 0)],I (-1)),(I 0,List [B "",B "t"])]),(B "",I (-3)),(Map [(Map [],B ""),(I 0,Constr 1 [B "U",I (-1),B "o"]),(Map [(I (-1),B ""),(B "",B ""),(B "&",B "")],List [I 1,I 1,I 0]),(Map [(I (-1),B ""),(B "",I (-1)),(B "@",B ""),(B "6",I 1),(I 1,B "z")],Map [(B "r",I 0),(B "",B "3")]),(Constr 1 [I (-1),B "\231\191\167",B ""],B "\240\177\138\158~")],I 0)],Constr 8 []),(I 7,I 7)]),(I 4,B "\229\182\132h{"),(B "ak\230\164\133~",B "=sfP#\240\173\131\182^"),(I (-9),I 8),(Map [(I (-7),Constr 3 [I (-2),Constr 1 [],Constr 2 [B "\240\171\183\134",B "a_"],List [Map [(I 1,B ""),(I (-1),B "r"),(I 0,B "e"),(I 1,B "D")]],Map [(Map [(B "|",I 1),(I (-1),I (-1)),(B "",B "&")],B "")]])],Constr 27 [B "S",I (-8)])]),(I (-12),Constr 326 [Constr 16 [Constr 3 [Constr 2 [List [B "@",I 1,B "",I 0],I 2,List [I 1,B "",B "",I 0,B ""]],I (-2),Constr 2 [B "",Constr 1 [B "[",B "",B "",B "s"],B "HD",I 2],Map [(Constr 0 [I 1,B "",B ""],List [I (-1)]),(Constr 1 [],Constr 1 [I 0,I 0,I (-1),B ""]),(B "",B "")],I 3]],Constr 23 [I 0],Constr 30 [],I (-6)]),(B "/6]FG?sa",Constr 427 [B "nO",Constr 31 [List [I (-2),B "<>",I 4,List [I 1,I 1,Constr 0 []],B "sxp"],List []],I (-1),B "G",B "K2y\233\157\157eC3"])]),(Map [],List [List [Map [(Constr 5 [Map [(Map [(I (-1),B "\240\157\157\181")],List [B "h",I 0,I 1,B "C",B "|"]),(Map [(B "?",B "\229\163\149"),(I 1,I 1)],Constr 0 [])],Map [(Constr 0 [I 0,I 0],Constr 0 []),(Map [(B "",I 0),(I 1,I 0),(B "",I 1)],Map [])],List [I (-1),B ""]],List [List [Map [(I 0,B ""),(I 0,I (-1)),(B "",I (-1))],List [],I (-1),List [],I (-1)]])],Map [(Constr 5 [B "",List [B "J.",Constr 0 [B "",B "g"],I (-1),Constr 0 [B "t",B "",I 0,B "5",I 0]],B "6\224\190\141'K",List [Constr 0 [I 0,I 1,B "",B ""],Constr 1 [],Map [(I (-1),B "\240\164\171\182"),(B "",B ""),(I (-1),I 0),(I (-1),I 1),(I 0,B "\234\153\180")]],Map [(Map [(B "F",I (-1)),(B "",B ""),(B "S",I (-1)),(B "",B "\""),(I 1,B "")],B "\240\144\164\163u")]],B "")],B ""],Map [(List [],List [I (-14),B "["]),(Map [(List [List [Constr 1 [],B "Ss",List [B "F",I 0,B "[",I 0,B "q"]],Constr 1 [],B " >\225\188\189"],B "~"),(B "IF\240\173\152\184&G",I 5),(I (-16),I (-2))],Constr 26 [List [],I 1,I 7,Map [(List [B "v\240\151\183\163",B "\239\184\151\240\177\137\164",I (-2)],Constr 1 [I 1,List [I 1,B "A",I 0,I 1],Map [(I 0,I (-1))],List [I (-1),I (-1),I (-1)],Map []])]]),(I 329,Map [(Constr 5 [List [B "yR",Constr 1 [],Map [(I (-1),I 1)],I 1],Map [(Map [(B "",B "\237\140\148"),(I 1,I 0)],Constr 1 [B "",B ">",B "P",B "",I 0]),(I 0,Constr 0 [B "",I (-1),B ""]),(Constr 1 [B ".",I 1],Constr 0 [B "",B "r",B "&"]),(B "0",B "Gf")],Constr 1 [B ""],Map [(Constr 1 [B "x",I 1,B "",I (-1),B ""],I 1),(I 1,Constr 1 [B "d",B "K",I 0]),(Constr 0 [B "",B "/",B "",I 1,B ""],I (-1)),(I 1,Map [(I 0,B "]"),(B "+",I (-1)),(I 1,I (-1)),(I 1,B "I")]),(I 1,Constr 0 [B ""])]],B "\227\134\177"),(Constr 7 [List [Map [(B "x",B ""),(I 1,B ""),(B "!",B "U"),(B "",I 0)]],I 2,B "Mv~",List [Constr 1 [I 0,I 0,B "v"],I 0,B "\240\162\175\177@",I (-2),B ""],Constr 0 [Map [],B "^",Map [(I (-1),I 1),(B "y",B ""),(I 0,I 0)],I (-1)]],Constr 0 [Constr 1 [Constr 0 [B "",B "y",B ""],Map [(B "",I (-1)),(I 1,I 1),(B "",I (-1)),(B "",I 1),(B "",B "")],Constr 0 [I (-1),I 1]]]),(List [],Constr 6 [B "CrN",B "",Constr 1 [Map [(I 1,B ""),(B "N",B ""),(B "",I 1),(I 1,I 1)],Constr 0 [B "",I 1,I 0,B ""],Map [(I 1,I 0),(I 1,B "\240\173\160\138"),(B "",B "")]]]),(Constr 7 [List []],Constr 1 [List [],I 8,Constr 2 []])]),(I 0,Constr 25 [I 31,Map [(B "U4",Constr 1 [I 2,B "",Map [(I 0,B ";"),(B "8",I (-1)),(B "\239\169\157",I (-1)),(I 1,B "")],I (-2)]),(List [],Constr 2 [Constr 0 []]),(B "`\229\135\190@p",B ",Ya"),(B "",I 1),(B "9rr",Map [(B "",Map [(I 0,B "="),(I 0,I 0)]),(Constr 1 [I 0,I 1,B "q",I (-1),B "b"],I (-1)),(I (-2),Map []),(B "",List [B "",I 0]),(Constr 0 [B "",B "R",I (-1),I 1,I (-1)],Map [(B "",B "y"),(I (-1),B "\""),(I 0,I 1),(B "",I 0)])])],I 28])],I 15,I 3]),(List [Map [(Map [],Constr 16 [B ""]),(List [Map [(Map [(Constr 0 [B ""],B "]"),(B "\236\163\135b",List []),(I 0,Constr 1 [I 1,I (-1)])],Map [(Constr 0 [B "Z",I 1,B "\240\172\185\159"],I (-2)),(List [],List [I (-1),B "",B ""])]),(Constr 0 [B "i>"],I 3),(I 3,Map [(B "",Map [(B "",B ""),(B "",I (-1)),(I 1,I (-1)),(I (-1),B "")]),(Constr 0 [I 1,I (-1),I (-1)],I (-1)),(B "u[",List [I 1,B "g",I (-1)])])],List [Constr 2 [List [B "",I 0,B "",B "n"],Map [],B "z\240\167\164\170",Map [(I 0,I 0),(B "",B "n"),(B "",I 1),(B "",B "")],List [I 1,B ""]]],Map []],List []),(B "Q\240\166\182\182\&0$_wnP3L~`",List [List [Constr 0 [B ";",I 0,List [B "3",B "",I 0,B "2"]],B "m:\240\170\175\165b"]]),(List [Constr 3 [I 3,I (-2),List [List [I (-1)],List [I 0,I 0,B "!"],List [B "\239\167\128",I (-1),B ""],I 2],Constr 0 []],Map [(Map [(B "(\240\159\168\155",Map [(I 1,B ""),(I 0,I 0),(I 0,I 0),(I 1,I 1)]),(Map [(B "C",B ""),(B "",B "\"")],I (-2)),(List [B "\232\189\156",I 0,B "\240\159\161\179",B "t"],Constr 1 [B "t",B "",B "",B "",I 0]),(List [I 1,B "",I 0],I 1),(I 0,Map [(I 1,B "v"),(B "Z",B "")])],Map [(I 0,Constr 1 [B "&"]),(List [B "",B "V",I 0,B "v",B ""],Constr 1 [B "H",B "q",B "",B "\236\180\128"]),(Constr 0 [B "6",I (-1),I (-1),B "m",I 0],Map [(I (-1),I 1),(I 1,I 0)])]),(I (-1),I 1),(B "xye",Map [(List [B "\240\164\180\139",B ">"],I 0),(Map [(B "?",B "w"),(B "",I 0),(B "",B "")],Map []),(I 2,Constr 1 []),(Map [(I 1,I 1),(B "",I (-1)),(I 0,I 1),(I 1,B "`")],I (-1))])]],B "o\240\171\143\131U\240\163\170\184\&1"),(B "\240\171\171\157e<7(xno",I (-2))],Constr 324 [I 453,B "o6\240\169\184\136",Map [(Map [(Map [(I (-2),Map [])],I 3),(Map [],Map [(List [I 0],I (-2)),(Constr 0 [B "\240\172\187\136",B "",I (-1)],Constr 0 [B "W",B ""]),(List [B "Z",B "",I 0],Constr 1 [I 0,I 0])]),(List [Constr 0 [I 1],Constr 0 [B "\240\173\146\134",I 0]],Map [(I 0,I 0),(B "(s",B "\232\134\143")])],B "OX"),(Constr 8 [],Map [(Map [(List [B "D",B "",I 1,I (-1)],B "R"),(B "g",Constr 1 [I (-1),B "8",B "",B "",I 0]),(List [I 0,B "\230\148\145",B "\\",I 1],Map [(I 0,I 0),(I 1,I (-1)),(B "",I 0),(I 1,I (-1))])],Map [(Map [(I 0,I 1),(B "~",I 1),(B "Y",B "\240\173\138\178"),(I 1,B "")],List [I 1,B "",I 0,B "U",B "\240\171\189\190"])]),(I (-2),B ""),(Constr 1 [List [I 1,I 0,B "",I 0],Constr 0 [B "I",B "7"]],Map [(List [B "$",I 1],List [B "j",B "",B ""]),(Constr 1 [I 1,B "",I 1,B "\233\136\137",I 1],Constr 0 [B "8",B "",B "",B "\232\168\143"]),(Map [(B "",I 1),(B "o",I (-1)),(B "Z",B "")],List [B "v",B "",I (-1),B ""]),(I (-1),List [I 1])]),(Constr 0 [Map [(B "a",B "0"),(I 0,B ""),(B "\240\169\141\133",B "")],B "",I 1,B "[",Map [(B "",B ""),(I 1,I 0),(I 0,I (-1)),(I (-1),I (-1)),(I 0,I 0)]],List [Constr 0 [I (-1),I (-1),I (-1),B "0"]]),(I (-5),List [Constr 1 [I 0,B "",B "",B ""]])])]],Map [(List [B "o4"],Constr 21 [B "\230\143\155`[\240\162\132\168",Constr 4 [B ""],List [List [List [I 0,I (-1)],List [B "\227\138\130",B ""]],I (-2),Constr 2 [],I 5,List [Map [(I 1,I 0),(I 0,B "\240\176\149\154")]]],B "",List []]),(Map [(Constr 7 [List [I (-2),I 2,I 0,B ">"],I 2],List [I (-6),Map [(List [I (-1),I 1,I 1],I 1),(List [B "B",B "",I 1,B "N",I (-1)],B ""),(List [I (-1)],B "m3"),(B "@",List [B "",I (-1),B "T",I (-1),B ""])],List [Map [(I 1,I 1),(B "",B ""),(B "",I 0),(B "+",I 0),(I 0,I 0)],I 1,I 0,Constr 1 [I 0,I 1,I 1]]])],List [I (-5)])]],I (-10)),(List [Constr 187 [I 10,Constr 21 [List [Map [(List [I 1,I (-1),B "\240\172\161\188",B "",I (-1)],Constr 1 []),(I 2,B "\231\156\181\240\165\128\152"),(B "^",List [B "\240\163\190\134",B "",B "n",B "\240\174\169\151",I (-1)])],Map [(Constr 0 [],I 1),(Constr 0 [],Map [(I (-1),I 1),(B ")",B "\""),(I 0,B ""),(B "",I 1)]),(Map [(I 0,I 0),(B "{",I 1),(I 0,B "`"),(B "\240\162\176\153",B "Y"),(B "",B "")],I 1),(B "vV",B "?"),(B "e",List [I 1])],Constr 2 [Map [],I 2,List [I 1,I (-1),B "$"],Constr 1 [B "V",I 0,B "l",B "/"]],B ""],Map [(B "",B ""),(I 4,Constr 1 [Constr 1 [I 0],List [I (-1),B "\240\164\189\132"],Map [(I (-1),B "e"),(B "",I (-1))],Constr 1 [B "8",I 1,I 1,I 1]]),(Map [(I (-2),List [I 0,I (-1),I (-1),B "J",B "M"]),(B "",List [B "",I (-1),B ""]),(List [I (-1),I 1,I 0,I 1],I (-1)),(Map [(B "",B " "),(B "G",I 0),(B "y",I 0),(I (-1),B "\240\172\132\146"),(B "",B "P")],Map [(I (-1),I (-1)),(B "",I 1),(I 1,B "\240\167\143\150"),(B "",I 0),(I 1,B ":")])],I (-2)),(Map [(B "~",I 1)],B "")]]],List [Constr 17 []],Constr 338 [B "e/\237\143\135\233\177\153v7\227\151\185\&8^\234\173\179b",Constr 15 [B "g&"]],I (-14),List [Map [(List [B "\240\165\156\130A",B "m\240\152\140\144\240\165\172\180",Constr 2 [Map [(B "",B "'"),(I (-1),B ""),(B "",B "x"),(B "",B ""),(I (-1),I 0)],B "",B "o"]],Constr 8 [B "=r,L",List [Constr 1 [I (-1),B "2",B ")"],I 2,List [B "",B "",I 0,B ""]],B "\240\152\134\154z"]),(Map [(Constr 2 [I 0,List [B "\236\153\143"],List [I 1,B ""],I 2,Map [(I 0,I (-1)),(I (-1),I 0)]],Map [(B "",Constr 1 []),(I 1,B "")]),(List [Map [],I 2,I (-1),List [B "e"]],Constr 2 [B "+",List [B "B",I 1,I 1]]),(B "P{\240\170\184\164",Constr 2 [])],Constr 7 [I (-3),Constr 2 [Map [(I 1,I 0),(I 0,B ""),(B "",B ""),(I 0,B "7")],List [I (-1),B "I",B "",I 1,B ""],Map [(B "x",I 0)],B "",List [I 0,B "\233\182\191",I 0]],Constr 0 [Map [],Constr 0 [I 0],List [I 1,B "E",I 1],Map [],Constr 1 []]]),(B "65 A",Constr 4 [I 1,Constr 0 [],I 6,Constr 1 [Map [(I 1,B ""),(B "=",I (-1))],Map [(I 1,I 1),(B "",I (-1))],B "c\231\168\177"],B "\225\138\189"]),(B "TRz\240\173\161\185\&05m",List [Map [(I 0,B "X")],I (-2),Constr 1 []]),(Constr 7 [Constr 2 [I 0,Constr 1 [B "",I 1,B "N",I 1,B "d"],Map [(I (-1),B "")]],Constr 2 [B "p.",Map [(B "",B "\240\160\142\163"),(I 1,I (-1)),(B "c",I 1)],List [B ""],Map [(I 1,I (-1)),(I (-1),B "")],Constr 0 [I (-1),B "<",B "",I 0,I (-1)]],List [B "d",I (-2)]],Constr 6 [Constr 2 [List [],B "vw",List [I 0,B "",I 0,B "{"],B ""],Constr 1 [Map [],Constr 0 [B ""]],B "",Constr 2 [Map [(B "",I 0)],Map [],Constr 1 [I 0,I 1,B "",I (-1)],Constr 1 [],I (-2)]])]]],I (-9)),(Map [],B "\240\166\129\139\"JiGm")],I (-47)),(List [List [Constr 151 [Map [(Map [(List [],Map [(Map [],I (-1))]),(I (-1),Map [(B "",B "\240\152\171\160")]),(B "!",I (-3)),(List [B "\240\162\183\130;",Map [(B "r",I 0)],I 2,Map [(I 1,B ""),(I (-1),I 1),(B "~",B ""),(B "\240\170\138\162",I 0)]],List [I (-2),B ")",List [B "=",I 0,B "?",I (-1),I 1]])],I (-6)),(Map [(Constr 2 [],B "8I4"),(Constr 2 [Constr 1 [],B ""],Constr 0 []),(I (-2),Constr 2 []),(Constr 1 [List [I (-1),I (-1),B "\240\166\189\128",I (-1),B "w"],List [],Map [(I (-1),I 1),(I 0,B "\234\131\138"),(B "j",B "\240\157\150\180")],I (-1)],List [List [B ",",I 1,B "$",I 0,B ""],Constr 0 [I (-1),B "",B "t",I 0],I 1,I 2,I (-2)]),(Map [(I (-1),Map []),(Constr 0 [B "^"],Constr 1 [I 0,B "",B "s",I 0,B "8"]),(Map [],Constr 1 []),(Map [],List [I (-1),B "_",I 0,I 0])],I 4)],List [I (-1),I (-1),List [I 0,List [B "",I 0],Map [(B "",I (-1))],List [I (-1),B "#",I 0]]]),(List [List [B "4",List []],Map [(I 2,List []),(B "]\240\157\161\179",I 0)],List [Constr 0 [I (-1)],I 0]],I (-3)),(I 4,List [])],Constr 8 [I 1,B "`\240\152\149\161\&7EZ\240\146\148\153",Constr 5 [B "",Map [],Constr 0 [Constr 0 [I 1,B "",I 1,I 1,I (-1)],Constr 1 [I (-1),B "",I (-1)],Map [(I 1,I 0),(I 1,B "0"),(I 0,I (-1))],B "",Constr 0 [B "3",B "x",B "w"]],Constr 1 []],Constr 8 [Map [],List [Constr 0 [],I 0,Map []],I 1,List [Map [(I 0,B ""),(I 1,B ""),(B "z",B ""),(I 1,B "I")],I (-1),Constr 0 []]],B "p)<\\%"],List [Constr 5 [I 4,Map [(Constr 0 [B "",I (-1)],List [B "8"])]],Map [(Constr 0 [Map [],B "\240\159\155\140",I 0,B "HW"],I (-3)),(I 2,I (-3)),(B "=:W",B ":"),(Constr 1 [B "O\240\165\152\137",B "",Map [(I 0,I (-1)),(B "",B "b"),(I (-1),I 1),(B "",B "\\"),(I (-1),I 0)],I (-2),Map []],B "9U'"),(I (-6),Constr 1 [Map [(B "",I 1),(B "6",B ""),(B "",B ""),(B "",I (-1))],Map [(B "",I 1),(I (-1),I (-1)),(I (-1),I (-1)),(B "",B "c")]])],I 0,Constr 3 [B ""]],I 9,Constr 12 [B "\240\162\130\164y[FW"]]],List [Constr 394 [],Map [(List [I 5,Constr 7 [List [B "b",Constr 0 [I 1,B "",B "`",B "",B "4"],Constr 1 [I 1],List []],B "w_",Map [(Constr 1 [I 0,B "",B "",I (-1),B ""],B "\"\207\134"),(I 2,Map [])],B ";"]],Map [(Constr 8 [List [List [I 0,B "",I 1,I 1,B "i"],I (-1),B ";",I 2,List [I (-1),I 1,I 0]],List [Constr 0 []]],B "K\240\159\174\161R\235\174\176%,!"),(Map [],Constr 6 [I (-1),Constr 0 [],Map [(Map [(B "&",I 1)],B "["),(Map [],Constr 1 []),(List [B "",I 0,I (-1),I 1,I 0],Constr 1 [I 1,I (-1),I 1,I 0])],B "n\226\133\162\240\159\132\134#"])]),(List [List [I 2],B "wLq",Constr 5 [B "",Constr 2 [Map [(B "#",I 0),(B "",I 1),(B "g",B "")],Map [(B "",B ""),(I (-1),B "U"),(B "\239\174\134",I 0),(I 0,I 1),(I 0,B "s")],Map [(I 0,I 0),(B "",I 1)],B "o"],I 1,Map [(List [I (-1),B "",I 0],List [B "w",B "",B "e",B ""]),(B "G",List [B "b",I 0]),(List [I 1],I 1)],Map [(List [I 0,I 0],I (-1)),(List [B "/",I 0,B "",I 1,I 0],Constr 0 [I 1,I 1,I 1,I 0]),(List [B ",",I 1],Map [(I (-1),B ""),(I (-1),B "U"),(I (-1),B "`"),(I 0,I (-1))])]]],B "qK-~`\\%"),(Map [(Constr 6 [I 1],List [Map [(B "\240\167\133\188",Constr 1 [I 0])]]),(B "0\239\169\172o",I (-6)),(Constr 8 [Map [(I (-2),I (-1)),(B "",Constr 1 [I 1,B "s"]),(List [B "e"],Constr 0 [I 1,I 1]),(I (-1),B "`")],I 1,List [List [B "3"],Constr 1 [],Constr 1 [B "\236\184\129",I 1,I 1,I (-1)]]],Map [(Constr 1 [List [],Constr 0 [B "",I 0,B "",B "",B "F"],I 1,List [I 1,B "",B "",B "!"],List [B "@"]],List [Map [(B "f",I 0),(B "",B ""),(B "",B "")],Constr 1 []])]),(B "?",Constr 7 [List [List [I 0,B "C",I 0,B "S",B "\231\154\164"],List [],List [B "",B "",B ""],B "`",Constr 0 [B "",B "",B "",B "t"]],List [B "\240\147\128\161",Constr 0 [B "+"],Constr 0 [],I (-1)],Constr 1 [I 2],Map [(Map [(B "",B "")],Constr 0 [I 1,B "Y",B "J"]),(List [I 0],I 2),(B "",B "{9"),(I 1,List [B "d",I 1])],Constr 0 [List [I 0,B "",I (-1),B ""],Map [(B "",I 1),(I 1,B "\""),(B "\240\146\140\166",B ""),(I 1,I 1),(B "",B "+")],List [I (-1),I (-1),I 1,B ""],I 0,Constr 1 [I 0,B "E",B ""]]])],List [I (-6)])],B "Qb !g9R.Q"],List [List [Map [],Map [(B "kd\225\140\134\&4",B "dE\240\160\149\144dc"),(List [B "2",I 0,Map [(List [B "",B ""],List [B "",I (-1)]),(B "",B "j"),(B ":",Constr 1 [B "t",B "=",B "",B ""]),(List [I 1],Constr 1 [B "{",B "",B "@",I 0,I 0]),(Constr 1 [],List [B "",B "@"])]],B "z"),(Map [(I (-3),Map [(Map [(I 0,I 1),(I 1,B ""),(B "\235\160\147",B "")],Map [(I 1,I (-1)),(B "",I (-1)),(I 1,B "q"),(I (-1),B "")]),(I 0,Map [(B "",I (-1)),(I 1,I 1)])])],B "0"),(Constr 2 [List [B "",List [I 0,I 0],I 1],List [I 2],Map [(B "p&",B "k"),(List [I 1,B "",B "",I (-1)],Constr 0 [I 0,I (-1),B "S",I 0,B ""]),(I 0,B "W")],I (-1)],Map [(I (-3),List [B "!",Map [(I 0,I (-1))],Constr 0 [B "\240\170\170\189",B "",I 0],I 0]),(Map [(Constr 1 [I 1,B "",B "",I 1,B "R"],Map [(B "",I (-1)),(B "",B "#"),(B "",I 0)]),(B "2",Map [(B "",I 0),(B "!",I 0),(I 1,B "")]),(B ">\233\130\145",I 1),(B "",Constr 1 [B "s",B "l"])],B "")]),(B "Rkl",I (-5))],Map [(B "yAjI",Map [(B "l?",List [B "G",List [B "\235\128\187",I 1,I (-1),I 0],Map [(B "k",B "Y"),(I 0,B ""),(B "",B "&"),(I (-1),B "")],I (-2)]),(Map [(I 2,Map [(B "Q",B "<"),(B "",I 0),(I 0,B ""),(I 0,B "@")]),(List [],B "")],Map [(I (-2),List []),(B "a",Constr 0 [B "F"])])]),(Map [(List [Constr 0 [B "&"],Constr 0 [B "_"],Constr 1 []],Map []),(Constr 2 [],B "E\240\162\155\180>"),(I 3,I (-1)),(Constr 1 [List [B "\231\182\154",I 0,I 0,B "\240\171\157\143"]],Map [(I 2,List [B "",B "\240\160\165\130",B "["])])],Map []),(Map [],Constr 7 [Map [(List [I 0,B "",B "~",B ""],I (-1)),(List [B "",I (-1),I (-1),B "B",B "K"],I (-2)),(Map [(B "\240\151\143\165",B "z"),(I 0,B ""),(B "",I 0),(I 0,B "")],B ""),(B "",List [B "",I (-1)])]]),(Constr 7 [Map [(List [B "",I 0],B ""),(I 1,Map [(I 1,I 1),(B "",B ""),(I 0,I 0)]),(Constr 0 [I 0,I 1,I (-1),I 0,B "K"],B "")]],B "k\240\157\146\137B~o"),(Map [(Map [],I 1),(Map [(Map [(I 1,I 1),(B "",B ""),(B "I",I 0)],Constr 0 [B "s",I 0,I (-1),B "",I (-1)]),(I 0,Map [(B "H",I 0),(I 0,I 1),(I (-1),B ""),(B "9",B "m")]),(Map [(I (-1),B "m"),(B "",B "6")],List [B "",B "a",I 0]),(B "",Map [(I 0,B ""),(I 0,B "[")]),(I 2,Map [(B "",B ""),(I 0,B ""),(B "J",I 0)])],List [Map [(I (-1),B ""),(B ",",B ""),(I 1,I 0),(I (-1),I (-1))],B "0",Map [],I 2,I 0])],Constr 8 [Constr 2 [Constr 0 [I 0,B ""]],I 4])],Constr 25 [B "+>Z^",Constr 7 [List [],I (-1),Map [(B "",Constr 0 [B "-",I 1,I 0]),(I 2,B ""),(Map [(B "",I 1)],I (-2))],I (-2),List [Constr 1 [B "w",I 1,I 1],I (-1)]],B "da",Map [(I 3,Map [(B "l",B "t\240\167\163\182"),(List [],Map [(I (-1),I 0),(I (-1),B "")]),(Constr 0 [I (-1),B "w",I 0,I 1,B ""],Map [(B "x",I 1),(I (-1),B ""),(I (-1),B ""),(I 0,B "\232\161\133")]),(I 0,B "")])],Map [(B "[<,",B ""),(I (-4),List [Constr 0 [I 1]]),(Constr 2 [Constr 0 [I (-1),I 1],List [B "_",I 1,I 1,B ">",B ""]],Constr 0 [Constr 1 [I 0],I (-2),I 0,I 0])]]]]],Constr 12225560 [List [],Map [(Constr 423 [Map [(Constr 8 [List [Constr 1 [B "",I 1,B "u"],List [],Map [(B "d",B "Y"),(B "y",I 1)],Map [(B "",I 0),(I 1,B "("),(B "",B ""),(B " ",B ""),(B "",B "")]],Constr 1 [B "[t",I 1,Constr 1 [I 0],Map [(B "",I 1),(B "",I 0)],List [B "c",B "W"]],B "A",Map [(I 0,B "Z*"),(List [B ".",I 0],List []),(B "x=",Constr 0 [I 1,B "\233\177\163",I (-1)])],Map [(Map [(I (-1),I 0),(B "",I 1),(B "\\",I (-1))],List [I 1]),(List [B ""],I 0),(Constr 1 [B "\240\163\179\134",B "",B "",I 0],B "xk")]],Constr 6 [Constr 0 [List [],Map [(B "]",B ""),(B "",B "E"),(B "s",B ""),(I 0,B ""),(B "",B "X")]],Constr 1 [B ".U",Map [(I 1,I (-1)),(I (-1),B ""),(I 1,I 0),(B "}",B "6")],B ","],B "",List []]),(List [],Map []),(B "",B "\240\159\158\147(&y\240\157\156\178\&1")],Constr 8 [B "Bu",I 0,List [Constr 2 [],List [B "<",Constr 0 []],List []],Constr 6 [List [Map [(B "",B "K")],List [B "\240\177\128\159",B ""],Map [],Map []],Constr 0 [B "",B "5",B "\240\160\157\183\&4"]]],Map [(List [List [I (-1),Constr 0 [B ""]],Map [(List [B "",I 1,B ""],Map [(I 0,I 1),(I 0,B "1"),(B "",I 1),(I 1,I 0),(B "=",B "A")]),(I 1,List [B "",B "\199\141",B "",B "",I 1])],B "RZl",Map [],Map [(Map [(B "\240\162\176\141",B ""),(B ")",B ""),(B "",I 0),(I 0,I 1),(B "o",I (-1))],Constr 1 [B "d",I 0,I (-1),B "x",I 0]),(Constr 0 [],Constr 0 [I (-1)])]],Constr 7 [B "{L2a"]),(Constr 7 [List [B "",I 2,B "X-"]],I 5),(I 7,Map [(I 4,Map [(Constr 1 [I 1,B ""],List [I 0])]),(I 3,Map [])])],List [B "\240\166\152\191Xx",List [I 1,List [List [I (-1),B "Y",I 0,B "",I (-1)],Map [(B "",I (-1)),(B "}",I 1)]],Map [(List [I 0,I (-1)],Constr 1 [I 0,I (-1),I 1]),(List [I 0,B "T",B "",B ""],Map [(I 1,B ":")])],Constr 1 [List [],I 0,List [B "J",B "",I 1,I (-1),B "="]],List []],Constr 1 [I (-8),Map [(List [],I 2)],B "\240\159\130\174L",Map []]]],Constr 3 [Map [(B "",Constr 0 []),(Constr 4 [Map [(Map [],Constr 0 [I 1,B "\"",I (-1),I 1])]],List [B "\240\166\185\137"]),(Constr 3 [List [List [B "",I 1,B "",I 1,I 1],I (-1),B "\228\154\137\&7"],B "",I (-2),Map [],I (-4)],Constr 8 [Map [(List [B "",I 0,I 0],I 2),(B "",Constr 1 [B "",B "q",B "",I (-1),B ""])],I (-1),B "|mp",List [B "",Map [(B "a",I 1),(B "z",I 0),(I 0,I 1),(B "i",B "F"),(I 1,I (-1))],B "/",Constr 0 []]]),(Map [(I 0,List [List [],Constr 1 [B "?",B "",I 0],Map [(B "",B "\237\153\187"),(B "",B ""),(B "",I 0),(B "",B "\240\151\143\147"),(I 1,I 1)],I 1,I 0]),(List [B ""],Constr 0 [Constr 0 [I 0,B "",I (-1)],Map [(I 1,B ""),(I 1,I 0),(I (-1),I (-1)),(I (-1),I 0)]])],Map [(B "",I (-4)),(Constr 0 [B "l",I (-2),List [],List [B "",B "",B "\\",B "Y",B "H"],List [I (-1),I (-1),B "",I 1,B ""]],List [I (-1),Map [(I 1,B ""),(B "\"",B ""),(I (-1),I 0)],Constr 0 [I 1,I (-1),I 1,B "0",I 0]]),(Constr 2 [B "y",Map [(I (-1),I 0)],Constr 0 [I 1],B "",B "M"],Constr 0 [Map [],I 0,Constr 0 [I 0,I 1,I 1,I (-1)]]),(Map [],Map [(Map [(I 0,I (-1)),(B "6",I (-1)),(B "",B ""),(I (-1),B ""),(B "$",I 1)],I (-1)),(Map [(B "7",B "")],I (-1)),(Map [(B "",I (-1)),(B "+",B "["),(B "",I 1),(B "",I 1)],B "bk"),(I 0,Constr 0 [I 1,B "U",B "*"]),(List [I 0,I 0],B "")]),(B "",Map [(Map [],B "m"),(Map [(B " ",I 0),(I 0,I 1),(I 1,B "\237\145\159"),(B "",I 1)],I 1),(B "}*",Map [])])]),(Map [(I 3,Map [(Map [(I 1,B ""),(I 1,B "&"),(B ".",I (-1))],B "\226\135\182"),(List [],List [B "/",I 0]),(B "(o",Map [(I 0,I 0),(I 1,I 1),(B "",I (-1)),(B "+",B "$"),(I 0,B "")]),(List [B "\236\157\179",I 0,I 1,I 1],Map [(I 0,B "\226\185\131"),(B "m",B ""),(B "",B "W")])]),(Map [(I 0,I 0),(List [I 0,B "g",B "M",B "",I (-1)],I 2)],List [B "\240\171\161\153",B "",Constr 0 [B "\240\152\162\187",I (-1),B ""],I 0])],I 0)],Map [],List [List [Map [(Map [(B "",B "w"),(I 1,B "\240\167\182\145"),(B "",B "A"),(B "",B "")],I 0),(List [],I 2),(B "",Map [(B "",B "`"),(B "m",I 1),(I 0,I 1)])],B "\240\152\165\143",B ""],Constr 8 [I 4]],Constr 32 [Constr 4 [Constr 2 [I 2,B "",List [],Constr 1 [B "",B "2"]],Map [(Constr 0 [B "",B "\240\164\141\140"],Constr 1 [I 1,B "s",I 1])],B "\231\180\145y$0",I 4,Constr 2 [Map []]],I (-7),Map [(I 1,B "")]]])],I (-5),Constr 10414 [B "w|^\225\138\149\240\177\140\137V\240\170\145\169x\240\166\145\164\&4Rc",I 16,Constr 424 [Map [(B "@`\224\169\145",List [Constr 2 [List [I 1,B "",I (-1),I 0],B "",I (-2),B "",B ""],B "\240\147\129\191",Map [(B "",Map [(I 1,B ""),(B "*",B ""),(I 1,B "\240\163\177\145")]),(B "C\240\152\137\156",List [B "?",I 1,B "G"])]]),(Constr 0 [Constr 0 [B "}5"],I 2,Constr 1 [List [B "X"],Constr 1 [B "\\"],List [B "",I 0,I 1,I 1],Constr 0 [B "",I 1,B "",I (-1)],Map [(I 1,B ""),(B "",I 0),(I 0,I (-1)),(B "",B ""),(B "",B "v")]],I 2],I 0),(Constr 1 [B "m-Bz",List [List [B "f",I 0],I (-1),B ":",Map [(B "",I 0),(B "",B ""),(I (-1),B ""),(B "\240\173\189\184",I 1)],Constr 1 [B "",B "",I (-1)]]],Map [(Map [(Map [(I 1,B " "),(I (-1),B "0")],List [])],Map [(Map [(I 1,B ""),(I 1,B "^")],B ""),(List [B "",I (-1)],I (-1)),(List [B "F"],B "")])])],Constr 1 [B "C]8PE",B "E-la&"],Map [(Map [(Constr 1 [Constr 0 [B "",I (-1),I 1,B "i"],Constr 1 [I 1,B "\240\170\135\178"]],List []),(Constr 0 [List [B "",I (-1)]],List []),(List [],I (-1))],Constr 0 []),(List [I (-2),I 3,I 2,B "",Map [(I (-1),List [I 0]),(List [I (-1),I (-1),I 0],Map [(I 1,I (-1))]),(Map [(I (-1),B "r")],B ""),(Constr 1 [B "",I (-1),B "&",B "j",B "r"],Constr 0 []),(Constr 0 [],Map [(I 0,B "o"),(B "",I 0),(I 0,B "P"),(I 0,I 1)])]],I 5),(I 5,I 6),(B "mLYx",List [Map [(Constr 1 [],I 1),(I 1,List [B "\240\165\155\157",B "X",I 0,B "`",B "G"]),(Constr 1 [I 0,B ""],Map [])]]),(List [I (-1)],B "u~bao")]]]])]
=======
I 16

@@ -13,7 +14,8 @@ import Test.Tasty.QuickCheck
-- The default for the argument is @1@.
generators :: Int -> TestNested
generators factor = return $ testGroup "generators"
[ testProperty "prop_genKindCorrect" $ withMaxSuccess (factor*100000) (prop_genKindCorrect False)
[ testProperty "prop_genData" $ withMaxSuccess (factor*10000) prop_genData
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

plutus-ir/test is a weird place for this, no?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Particularly since the Data generator comes from PlutusCore.Generators.QuickCheck.Builtin.

@kwxm
Copy link
Contributor

kwxm commented Oct 25, 2022

This is the first time I use QuickCheck, and I find it surprising that it doesn't have something equivalent to Hedgehog.Gen.list.

You mean that the existing list generators don't let you provide a lower bound? Maybe that's so it doesn't interfere with shrinking.

@kwxm
Copy link
Contributor

kwxm commented Oct 25, 2022

I don't know if you're seen this, but there's a QuickCheck generator for Data in the cost modelling benchmarks. It's terrible! See the discussion here, especially at the end.

@zliu41
Copy link
Member Author

zliu41 commented Oct 25, 2022

You mean that the existing list generators don't let you provide a lower bound? Maybe that's so it doesn't interfere with shrinking.

It requires using resize to set the upper bound, and that doesn't work with the recursive combinator, because once a generator is resized, it cannot be resized or scaled again (and even if it can, it would change the upper bound, while what we need is to change the size of the list elements). See the comment above genList.

@michaelpj
Copy link
Contributor

I think there's also another generator for data somewhere else... ah yes: https://github.com/input-output-hk/plutus/blob/master/plutus-tx/test/Spec.hs#L133

@zliu41
Copy link
Member Author

zliu41 commented Oct 25, 2022

I think there's also another generator for data somewhere else... ah yes: https://github.com/input-output-hk/plutus/blob/master/plutus-tx/test/Spec.hs#L133

Yeah, there are two hedgehog generators for Data, which should be merged into one.

@zliu41
Copy link
Member Author

zliu41 commented Oct 25, 2022

I don't know if you're seen this, but there's a QuickCheck generator for Data in the cost modelling benchmarks. It's terrible! See the discussion #4480, especially at the end.

@kwxm Yeah, I saw that. Is it necessary to bound the imem, bmem in addition to size? Can the new one be used there? I'm not exactly sure how the budgeting benchmark works.

@kwxm
Copy link
Contributor

kwxm commented Oct 25, 2022

@kwxm Yeah, I saw that. Is it necessary to bound the imem, bmem in addition to size? Can the new one be used there? I'm not exactly sure how the budgeting benchmark works.

I think the main problem is that the size function for Data isn't actually a very good measure of size: you can have lots of things of the same size that take different times to process (and that may even depend on exactly how you're processing it). The generator in the benchmarks isn't very good because (I think) it's not generating enough different objects of the same size. I suspect that if you could do that then those graphs would look a lot more like solid fans instead of a bunch of straight lines radiating out from a point. I really don't know how to fix it to do that though: you might need to generate huge numbers of objects to get good coverage. Maybe that only matters for costing: in general I suppose that what a generator does may depend on what you're planning to do with it, so here you probably don't need to worry about these issues.

A better approach might be to fix the size measure and even have multiple measures of size for the same object (eg, number of nodes, total size of integer fields, total size of bytestring fields). There are some tickets to look into that.

@zliu41
Copy link
Member Author

zliu41 commented Oct 25, 2022

I took a closer look at genBoundedData. I don't think I understand its purpose, because its size parameter is not the same as the memoryUsage of Data. I thought it is supposed to generate a variety of Data values given a specific memoryUsage, but that's not what it's doing.

Anyway, I think it makes sense for the budgeting benchmark to have its own Data generator. The general purpose Data generator doesn't need to care about size or memoryUsage being precise; it just needs to generate some random, representative Data values with various size.

@effectfully
Copy link
Contributor

effectfully commented Oct 26, 2022

@zliu41

Sure, here it is:

There's a lot to discuss here...

The most obvious thing is that distribution of integers and bytestrings is horribly skewed. It's especially clear in this example:

Constr 283501837855 [Constr 8577247 [Constr 22164 [Constr 486 [B "hR=VM9J3",Constr 10 [I 2,I (-19),List [Constr 2 [Constr 1 [B ""],Constr 1 [I (-1),B "",B "",I (-1),B ""], <...>

This is because you start with a big size and generate big constants thereof, but as the size gets smaller, the constants get smaller and smaller too. We don't want the size of constants to be tied to the size of the AST. There's a Note about that in the brand new QuviQ's generators:

{- Note [Recursion Control and geAstSize]
One would be forgiven for thinking that you don't need `geAstSize` in `GenTm` because size is
built-in to 'Gen'. However, if you use 'Gen's built-in size to control the size of both the terms
you generate *and* the size of the constants in the terms you will end up with skewed
terms. Constants near the top of the term will be big and constants near the bottom of the term will
be small. For this reason we follow QuickCheck best practise and keep track of the "recursion
control size" separately from 'Gen's size in the 'geAstSize' field of the 'GenEnv'
environment. I.e. we let the QuickCheck's size parameter to be responsible for the size of constants
at the leaves of the AST and use 'geAstSize' to control the size of the AST itself.
-}

As such, you virtually never generate an "outer" Constr that denotes some actual constructor.

Which brings us to the next point: we do want to generate a lot of meaningful values in an Arbitrary instance. For Data a "meaningful value" is one that represents some actual value of an algebraic data type. Ideally covering a vast range of possible data types: nullary, product, sum, non-regular, mutually recursive, something else (we do support GADTs in Plutus Core unlike Plutus Tx...)? This I think requires us to separately generate "data type schemas" suitable for using them to generate values of data types represented by the schemas.

And I don't mean to suggest that we only want to generate meaningful values: it is as important to run tests over diverse "meaningless" values as it is to run them over meaningful ones.

And meaningful and meaningless are not the only kinds of possible values! Perhaps there's something in the middle: e.g. a Data object representing some sane value that doesn't really have a Haskell type. Such as a data type with infinitely many constructors for example.

Perhaps we don't want to go this far for an initial implementation at least, but we definitely should have a non-negligible amount of Data objects that don't fail to decode to some actual value of a data type (lists and maps aside).

Another issue is that this generator is exponential. Here are the line lengths (not a very scientific metric, but will do for the purpose of the argument) of the output you pasted:

24
7230
2612
16390
9
1833
11094
7290
24924
4

The size of values grows extremely fast. 30% of cases are trivial ones and then we immediately jump to thousands. What this means is that we extremely rarely generate, say, lists with multiple values, all of which are not huge. You can of course say that with the size 80 we aren't really supposed to get small lists anyway, but then what are those 30% of trivial cases doing there? And the real problem is that unlikeliness stacks: it's multiplicatively less likely to produce a list containing a list containing a list so that all other elements are small within each list. All this means that we lose many interesting patterns.

And the reason why those are not of hundreds of thousands of size is lists being always of length <= 5. As far as I understand there's no such semantic restriction and the lists can be of arbitrary length in a Data object, so it's unfortunate we have to keep them small to account for the exponentiality.

We have a generator in the prettyprinter-configurable tests. The values it generates aren't particularly good (because I didn't care), but the types have a fairly good distribution (this is for all sizes accumulated, not just 80):

distribution
4.8% [Integer]
3.2% [Char]
2.6% Maybe Integer
2.6% [Maybe Text]
2.4% Integer
2.2% Maybe Char
1.8% Maybe [Text]
1.8% Text
1.8% [Text]
1.6% (Integer, Char)
1.6% (Integer, Text)
1.6% Maybe Text
1.4% (Text, Text)
1.4% Maybe [Char]
1.4% [Maybe Char]
1.4% [Maybe Integer]
1.2% (Char, Integer)
1.2% Char
1.2% Maybe (Maybe Integer)
1.2% Maybe [Integer]
1.2% [[Integer]]
1.0% (Char, Char)
1.0% (Integer, Integer)
1.0% (Text, Char)
1.0% Maybe [[Integer]]
1.0% [(Char, Char)]
1.0% [[Text]]
1.0% [[[Char]]]
0.8% (Text, Integer)
0.8% (Text, [Char])
0.8% Maybe (Maybe Text)
0.8% [(Char, Text)]
0.8% [(Integer, Integer)]
0.6% ([Char], Text)
0.6% ([Integer], Char)
0.6% Maybe (Integer, Integer)
0.6% Maybe (Integer, Text)
0.6% [((Char, Integer), Text)]
0.6% [(Char, Integer)]
0.6% [(Text, Char)]
0.6% [(Text, Text)]
0.6% [Maybe (Maybe Text)]
0.6% [[(Char, Integer)]]
0.6% [[Maybe [Char]]]
0.4% (Char, Maybe Char)
0.4% (Char, Text)
0.4% (Integer, Maybe Integer)
0.4% (Maybe Char, Char)
0.4% (Maybe Integer, Text)
0.4% (Text, (Integer, Integer))
0.4% (Text, Maybe Char)
0.4% (Text, Maybe Text)
0.4% ([Char], Char)
0.4% Maybe (Char, Text)
0.4% Maybe (Char, [Integer])
0.4% Maybe (Maybe (Char, Char))
0.4% Maybe (Maybe Char)
0.4% Maybe (Maybe Text, Integer)
0.4% Maybe (Maybe [Char])
0.4% Maybe (Maybe [Text])
0.4% Maybe (Text, Char)
0.4% Maybe (Text, Maybe Integer)
0.4% Maybe ([Integer], Integer)
0.4% Maybe ([Text], Char)
0.4% Maybe [Maybe Char]
0.4% Maybe [Maybe Integer]
0.4% [(Integer, Char)]
0.4% [(Integer, Text)]
0.4% [([Integer], Char)]
0.4% [Maybe (Char, Integer)]
0.4% [Maybe [Integer]]
0.4% [[[Text]]]
0.2% ((Char, (Char, Integer)), Char)
0.2% ((Char, ([Char], Text)), (Text, Text))
0.2% ((Char, Char), (Char, Char))
0.2% ((Char, Integer), (Integer, Char))
0.2% ((Integer, Char), Maybe Text)
0.2% ((Integer, Char), Text)
0.2% ((Integer, Integer), (Text, [Text]))
0.2% ((Integer, Integer), Char)
0.2% ((Integer, Maybe Text), Text)
0.2% ((Integer, Text), Char)
0.2% ((Integer, Text), Maybe Char)
0.2% ((Maybe Integer, Integer), [Text])
0.2% ((Text, Char), (Integer, Integer))
0.2% ((Text, Char), Char)
0.2% ((Text, Integer), (Char, Integer))
0.2% ((Text, Integer), [Char])
0.2% ((Text, Maybe Char), Char)
0.2% ((Text, Maybe Text), [Text])
0.2% ((Text, Text), Text)
0.2% ((Text, [Text]), Char)
0.2% (([Integer], Text), (Char, Maybe Char))
0.2% (([Text], Char), Integer)
0.2% (Char, (Char, Char))
0.2% (Char, (Integer, Char))
0.2% (Char, (Text, Text))
0.2% (Char, [Char])
0.2% (Char, [Integer])
0.2% (Char, [Text])
0.2% (Integer, ((Text, Integer), Maybe Text))
0.2% (Integer, (Char, Text))
0.2% (Integer, Maybe (Integer, Text))
0.2% (Integer, Maybe (Text, Integer))
0.2% (Integer, Maybe Text)
0.2% (Integer, [Text])
0.2% (Maybe Char, (Maybe Text, Text))
0.2% (Maybe Char, [Text])
0.2% (Maybe Integer, (Char, (Text, Text)))
0.2% (Maybe Integer, (Text, Char))
0.2% (Maybe Integer, Maybe Text)
0.2% (Maybe Integer, [Text])
0.2% (Maybe Text, (Char, Char))
0.2% (Maybe Text, (Text, Integer))
0.2% (Maybe Text, Char)
0.2% (Maybe Text, Integer)
0.2% (Maybe Text, Maybe (Maybe Integer))
0.2% (Maybe Text, Text)
0.2% (Maybe [Integer], (Char, (Text, Char)))
0.2% (Maybe [Integer], Maybe Text)
0.2% (Maybe [Text], Integer)
0.2% (Text, ((Integer, Char), Text))
0.2% (Text, (Char, [Integer]))
0.2% (Text, (Integer, Char))
0.2% (Text, (Maybe Char, Text))
0.2% (Text, (Maybe Integer, Char))
0.2% (Text, Maybe (Integer, Text))
0.2% (Text, Maybe Integer)
0.2% (Text, Maybe [Char])
0.2% (Text, [Integer])
0.2% (Text, [Maybe Char])
0.2% (Text, [Text])
0.2% (Text, [[Text]])
0.2% ([Char], (Maybe Integer, Char))
0.2% ([Char], (Text, Char))
0.2% ([Char], Maybe Text)
0.2% ([Char], [Maybe Char])
0.2% ([Integer], Integer)
0.2% ([Integer], Maybe Text)
0.2% ([Integer], Text)
0.2% ([Integer], [[Char]])
0.2% ([Maybe Integer], Text)
0.2% ([Text], Maybe Integer)
0.2% ([Text], Text)
0.2% ([[Integer]], Char)
0.2% Maybe ((Char, Char), Char)
0.2% Maybe ((Char, Text), Char)
0.2% Maybe ((Integer, Char), Maybe Char)
0.2% Maybe ((Text, Char), Maybe Integer)
0.2% Maybe (Char, Char)
0.2% Maybe (Char, Integer)
0.2% Maybe (Char, [Char])
0.2% Maybe (Char, [Text])
0.2% Maybe (Integer, (Integer, Text))
0.2% Maybe (Integer, Maybe Char)
0.2% Maybe (Integer, [Char])
0.2% Maybe (Maybe (Char, Integer))
0.2% Maybe (Maybe (Char, Text))
0.2% Maybe (Maybe (Integer, Text))
0.2% Maybe (Maybe (Maybe (Maybe Text, Integer)))
0.2% Maybe (Maybe (Maybe Text))
0.2% Maybe (Maybe (Maybe [Maybe Char]))
0.2% Maybe (Maybe (Maybe [Text]))
0.2% Maybe (Maybe (Text, [Integer]))
0.2% Maybe (Maybe Integer, [Text])
0.2% Maybe (Maybe [(Text, Maybe Integer)])
0.2% Maybe (Maybe [Integer])
0.2% Maybe (Maybe [[Char]])
0.2% Maybe (Text, (Char, Maybe Integer))
0.2% Maybe (Text, (Text, Integer))
0.2% Maybe (Text, Maybe (Char, Maybe Char))
0.2% Maybe (Text, Maybe Char)
0.2% Maybe (Text, Text)
0.2% Maybe ([Char], (Integer, Char))
0.2% Maybe ([Char], Maybe Char)
0.2% Maybe ([Integer], Char)
0.2% Maybe ([[Char]], Integer)
0.2% Maybe [(((Text, Text), Integer), Text)]
0.2% Maybe [(Integer, Integer)]
0.2% Maybe [(Maybe Text, Integer)]
0.2% Maybe [(Text, Integer)]
0.2% Maybe [(Text, [Text])]
0.2% Maybe [([Text], [Text])]
0.2% Maybe [Maybe (Integer, Char)]
0.2% Maybe [Maybe (Text, Text)]
0.2% Maybe [Maybe Text]
0.2% Maybe [[Text]]
0.2% Maybe [[[Integer]]]
0.2% [(((Text, Char), Integer), Maybe [Integer])]
0.2% [((Char, Char), Char)]
0.2% [((Integer, Char), [Integer])]
0.2% [((Integer, Integer), Integer)]
0.2% [((Integer, Integer), Maybe Text)]
0.2% [((Integer, Integer), Text)]
0.2% [(([Integer], Text), Integer)]
0.2% [(([Text], Integer), Text)]
0.2% [(Char, [Char])]
0.2% [(Integer, [Char])]
0.2% [(Integer, [Integer])]
0.2% [(Maybe (Text, Integer), [Char])]
0.2% [(Maybe Char, Char)]
0.2% [(Maybe Char, Maybe Char)]
0.2% [(Text, (Char, Integer))]
0.2% [(Text, Maybe (Maybe Char))]
0.2% [(Text, Maybe Integer)]
0.2% [(Text, [Integer])]
0.2% [(Text, [Text])]
0.2% [([Integer], Text)]
0.2% [([Integer], [Char])]
0.2% [([Integer], [Integer])]
0.2% [([Text], Char)]
0.2% [([Text], Maybe Integer)]
0.2% [Maybe (Char, Char)]
0.2% [Maybe (Char, Text)]
0.2% [Maybe (Maybe Integer)]
0.2% [Maybe (Text, Integer)]
0.2% [Maybe ([Char], Char)]
0.2% [Maybe [(Char, Integer)]]
0.2% [Maybe [Maybe Char]]
0.2% [Maybe [Text]]
0.2% [[(((Integer, Integer), Maybe Text), Maybe Integer)]]
0.2% [[(Integer, Char)]]
0.2% [[(Integer, Integer)]]
0.2% [[(Integer, Maybe Char)]]
0.2% [[(Text, Text)]]
0.2% [[Maybe (Char, Integer)]]
0.2% [[Maybe (Integer, [Text])]]
0.2% [[Maybe Char]]
0.2% [[Maybe Integer]]
0.2% [[[Integer]]]

As you can see we get diverse and reasonably distributed types despite having pairs which potentially could lead to exponentiality and weird distribution (handling lists rather than pairs is gonna be a bit more complicated I think, but probably not much).

It is absolutely fine to get some weird distribution for a part of the generator, but the meaningful values should be generated with more or less reasonable distribution.

So overall, I think we can merge this PR, but if we care about having quality testing infrastructure, we'll have to devote more time to writing complex generators, up to writing tests for the generators.

@zliu41
Copy link
Member Author

zliu41 commented Oct 26, 2022

@effectfully Thanks, these are very good to know. Apparently writing a good generator is harder than I thought!
What do you think of one of our Hedgehog generators for Data, which takes a max depth argument, instead of using size? It doesn't seem to have either of the two problems you mentioned.

@effectfully
Copy link
Contributor

Apparently writing a good generator is harder than I thought!

I've got through multiple iterations of this realization already. Not feeling confident still.

What do you think of one of our Hedgehog generators for Data, which takes a max depth argument, instead of using size? It doesn't seem to have either of the two problems you mentioned.

Could you should some similar output? It's really hard to predict what ends up being generated.

@kwxm
Copy link
Contributor

kwxm commented Oct 27, 2022

Anyway, I think it makes sense for the budgeting benchmark to have its own Data generator. The general purpose Data generator doesn't need to care about size or memoryUsage being precise; it just needs to generate some random, representative Data values with various size.

I agree, but let me know if you have any good ideas!

I see that we have a separate issue (SCP-3653) for doing that for costing. I'll update the title of that to make it clear that it's for costing.

@kwxm
Copy link
Contributor

kwxm commented Oct 27, 2022

Constr 160045081313 [Map [(I 5,B "\237\148\158]r\240\164\158\166xP\229\141\135B\228\149\164_\225\149\178Gjl"),(I 27,I 12),(B "s\240\167\161\163MK\231\168\179\240\163\160\168\240\175\163\147?\240\165\143\161&8bNRz\240\158\162\190&4UN~{\uJ$"...

We should remember to do PLT-118 so that we get things like B #2f53aa instead of all the B "\240\171\190\189\240\167\174\183" stuff that we inherit from the Show instance for bytestrings.

@zliu41
Copy link
Member Author

zliu41 commented Oct 27, 2022

@effectfully 5f08336 contains a new generator that is an improved version of the Hedgehog generator, in that the longer the list, the smaller the elements.

Here are 20 random Data values, generated via

writeFile "/tmp/data" =<< (fmap (intercalate "\n\n==========\n\n" . fmap show) . replicateM 20 . generate . resize 30 $ genData 5)

data.txt

It looks reasonable to me but let me know what you think.

@effectfully
Copy link
Contributor

@zliu41 using the stupid metric of the rendered string's length I get multiple numbers higher than 100000 symbols:

152158
113311
162304

so there's still some exponentiality going on, but now it's bound by the constant depth rather than the dynamic size, which is good, because we're not going to generate an obscenely huge Data object, but there's a con to it too: the built-in size of QuickCheck no longer has any influence on the size of the AST of Data objects. Unlike for example with the PIR generators where the initial QuickCheck's size parameter is duplicated as both the size of the AST and the size of constants at its leaves.

As for the exponentiality, depth-based generation is inherently exponential if depth decreases additively (depth - 1) rather than multiplicatively (depth `div` 2) like in the types generator I referenced before. For example the size of a binary tree is O(2^depth). In our case it's even worse, because we have lists of pairs of recursive occurrences (which we could trivially collapse into just lists of recursive occurrences if we wanted to compute the complexity). Given that for any depth > 1 we're more likely to choose a recursive generator than a non-recursive one (there are 3 recursive ones and only 2 non-recursive ones and the ditribution is uniform), we naturally get an exponential generator.

BTW, one thing I noticed is that you decrease the depth for each recursive generator twice. Once in, say, genListData (depth - 1) and immediately afterwards in, say, (1, genList 0 5 (gen (depth - 1))). I.e. the depth is always decreased by at least 2, so given the initial depth of 5 we never generate a Data object that has, say, a list of lists of lists. Or anything else of "nestedness" 3 and above (is that correct?). And even with such draconic limitations we still get huge objects due to them growing very fast "sideways".

This generator is of course completely useless for testing any kind of business logic. There's virtually zero chance that a validator will not fail on a Data produced by the generator. I believe it's fine and we should completely abandon the idea of feeding validators fully arbitrary Data objects (if there was such an idea in the first place), because I don't think there's any way we could create a one-size-fits-all-validators generator even under "fits = there's a 0.001% chance of accidentally generating a Data object of the right shape" for validators expecting anything even slightly non-trivial.

Overall, I like the new version more, but it has a lot of the same problems as the previous one, plus there's no way of dynamically controlling the size of the AST of the generated Data object.

I'm still completely fine with us merging it as is and coming back to it later. It's not wrong, just skewed. And if we want to make a more balanced generator that does not blow up and we get both deep and wide Data objects, then we need to come up with more reasonable metrics and automate the process at least a bit (for example instead of printing the Data values, print only their AST in a structured form, because we mostly care about ASTs here, constants in the leaves are a separate and a much simpler problem and their generation is probably fine already).

@zliu41
Copy link
Member Author

zliu41 commented Nov 1, 2022

Again, great points. I like the depth `div` 2 suggestion. If I do that I should be able to avoid the hardcoded genData 5 and use the QuickCheck size. The default size 30 is too big for depth - 1.

@zliu41
Copy link
Member Author

zliu41 commented Nov 1, 2022

@effectfully updated - using depth `div` 2 and QuickCheck size.

Here's what I got:

Default size:

λ>  fmap (fmap (length . show)) . replicateM 20 . generate $ arbitrary @Data
[300,8,20,83,54,7,1062,30986,2695,100,19307,4,543,7,3,317,5083,1425,58,26]

Resize 80:

λ>  fmap (fmap (length . show)) . replicateM 20 . generate . resize 80 $ arbitrary @Data
[7583,279075,7,6324,192,269360,214836,189113,106403,17934,40230,16552,179453,137,21,84,4,21,6,3]

This one should be better than the previous two attempts, since we can control the AST size, and the constant sizes are not affected by AST sizes (there's no resize or scale).

@zliu41
Copy link
Member Author

zliu41 commented Nov 1, 2022

This probably contributed to the exponential behavior, at least in part:

[ (1, genList 0 5 (gen (depth - 1)))
, (1, genList 0 50 (gen (depth - 2)))
, (1, genList 0 500 (gen (depth - 3)))
]

Changing it to this seems to help:

[ (100, genList 0 5 (gen depth))
, (10, genList 0 50 (gen (depth `div` 2)))
, (1, genList 0 500 (gen (depth `div` 4)))
]

Of course, to get the optimal numbers we'd need to do some more rigorous analysis.

@michaelpj michaelpj merged commit 6e19729 into master Nov 3, 2022
@michaelpj michaelpj deleted the zliu41/arbitrary-data branch November 3, 2022 14:50
brainrake pushed a commit to mlabs-haskell/plutus that referenced this pull request Dec 8, 2022
* Add `Arbitrary Data` instance

* New generator

* Update `genData` include using ``depth `div` 2``
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants