From 31b8f699e94863012441574239576c852ea8a8a7 Mon Sep 17 00:00:00 2001 From: Alexey Chernyshov Date: Fri, 21 Jul 2017 10:46:32 +0300 Subject: [PATCH] adds gevel functionality to pageinspect --- contrib/pageinspect/Makefile | 15 +- contrib/pageinspect/brinfuncs.c | 4 +- contrib/pageinspect/data/rect.data | 3378 ++++++++++++ contrib/pageinspect/data/test__int.data | 7000 +++++++++++++++++++++++++ contrib/pageinspect/expected/gin.out | 317 ++ contrib/pageinspect/expected/gist.out | 18 + contrib/pageinspect/expected/spgist.out | 120 + contrib/pageinspect/ginfuncs.c | 589 ++- contrib/pageinspect/gistfuncs.c | 509 ++ contrib/pageinspect/hashfuncs.c | 2 +- contrib/pageinspect/pageinspect--1.6--1.7.sql | 57 + contrib/pageinspect/pageinspect.control | 2 +- contrib/pageinspect/spgistfuncs.c | 439 ++ contrib/pageinspect/sql/gin.sql | 12 + contrib/pageinspect/sql/gist.sql | 6 + contrib/pageinspect/sql/spgist.sql | 11 + doc/src/sgml/pageinspect.sgml | 390 ++ 17 files changed, 12843 insertions(+), 26 deletions(-) create mode 100644 contrib/pageinspect/data/rect.data create mode 100644 contrib/pageinspect/data/test__int.data create mode 100644 contrib/pageinspect/expected/gist.out create mode 100644 contrib/pageinspect/expected/spgist.out create mode 100644 contrib/pageinspect/gistfuncs.c create mode 100644 contrib/pageinspect/pageinspect--1.6--1.7.sql create mode 100644 contrib/pageinspect/spgistfuncs.c create mode 100644 contrib/pageinspect/sql/gist.sql create mode 100644 contrib/pageinspect/sql/spgist.sql diff --git a/contrib/pageinspect/Makefile b/contrib/pageinspect/Makefile index 0a3cbee..f468d14 100644 --- a/contrib/pageinspect/Makefile +++ b/contrib/pageinspect/Makefile @@ -1,17 +1,18 @@ # contrib/pageinspect/Makefile MODULE_big = pageinspect -OBJS = rawpage.o heapfuncs.o btreefuncs.o fsmfuncs.o \ - brinfuncs.o ginfuncs.o hashfuncs.o $(WIN32RES) +OBJS = rawpage.o heapfuncs.o btreefuncs.o fsmfuncs.o brinfuncs.o \ + ginfuncs.o hashfuncs.o gistfuncs.o spgistfuncs.o $(WIN32RES) EXTENSION = pageinspect -DATA = pageinspect--1.5.sql pageinspect--1.5--1.6.sql \ - pageinspect--1.4--1.5.sql pageinspect--1.3--1.4.sql \ - pageinspect--1.2--1.3.sql pageinspect--1.1--1.2.sql \ - pageinspect--1.0--1.1.sql pageinspect--unpackaged--1.0.sql +DATA = pageinspect--1.5.sql pageinspect--1.6--1.7.sql \ + pageinspect--1.5--1.6.sql pageinspect--1.4--1.5.sql \ + pageinspect--1.3--1.4.sql pageinspect--1.2--1.3.sql \ + pageinspect--1.1--1.2.sql pageinspect--1.0--1.1.sql \ + pageinspect--unpackaged--1.0.sql PGFILEDESC = "pageinspect - functions to inspect contents of database pages" -REGRESS = page btree brin gin hash +REGRESS = page btree brin gin hash gist spgist ifdef USE_PGXS PG_CONFIG = pg_config diff --git a/contrib/pageinspect/brinfuncs.c b/contrib/pageinspect/brinfuncs.c index 13da761..5eb4b25 100644 --- a/contrib/pageinspect/brinfuncs.c +++ b/contrib/pageinspect/brinfuncs.c @@ -11,21 +11,21 @@ #include "pageinspect.h" -#include "access/htup_details.h" #include "access/brin.h" #include "access/brin_internal.h" #include "access/brin_page.h" #include "access/brin_revmap.h" #include "access/brin_tuple.h" +#include "access/htup_details.h" #include "catalog/index.h" #include "catalog/pg_type.h" #include "funcapi.h" #include "lib/stringinfo.h" +#include "miscadmin.h" #include "utils/array.h" #include "utils/builtins.h" #include "utils/lsyscache.h" #include "utils/rel.h" -#include "miscadmin.h" PG_FUNCTION_INFO_V1(brin_page_type); diff --git a/contrib/pageinspect/data/rect.data b/contrib/pageinspect/data/rect.data new file mode 100644 index 0000000..e32b6fe --- /dev/null +++ b/contrib/pageinspect/data/rect.data @@ -0,0 +1,3378 @@ +(12699,9028,12654,8987) +(22689,4680,22614,4626) +(43263,47296,43217,47217) +(6184,8397,6182,8379) +(863,28537,788,28456) +(33783,4733,33746,4693) +(40456,47134,40426,47087) +(45950,8153,45887,8060) +(33433,36474,33399,36460) +(41106,22017,41086,21962) +(19214,36781,19179,36767) +(11582,40823,11498,40737) +(35565,5404,35546,5360) +(26489,17387,26405,17356) +(30874,13849,30796,13814) +(38255,1619,38227,1593) +(4445,32006,4405,31914) +(3923,32921,3876,32913) +(36054,39464,36032,39434) +(46540,6780,46524,6758) +(12184,45811,12118,45787) +(13198,17090,13143,17051) +(30939,44578,30865,44486) +(12502,4939,12431,4902) +(3250,1108,3169,1063) +(34029,41240,33976,41180) +(47057,44018,46967,43927) +(699,10114,686,10058) +(5925,26020,5845,25979) +(9462,39388,9382,39388) +(270,32616,226,32607) +(3959,49145,3861,49115) +(207,40886,179,40879) +(48480,43312,48412,43233) +(37183,37209,37161,37110) +(13576,13505,13521,13487) +(5877,1037,5818,1036) +(6777,16694,6776,16692) +(49362,13905,49299,13845) +(29356,14606,29313,14562) +(5492,6976,5441,6971) +(288,49588,204,49571) +(36698,37213,36682,37158) +(718,41336,645,41272) +(8725,23369,8660,23333) +(40115,9894,40025,9818) +(40051,41181,40015,41153) +(5739,1740,5715,1731) +(25120,27935,25054,27876) +(27475,46084,27447,46003) +\N +(33197,3252,33161,3245) +(10892,15691,10869,15662) +(39012,44712,38995,44640) +(4506,6484,4458,6459) +(13970,26316,13964,26236) +(28009,28104,27968,28030) +(5991,27613,5906,27607) +(23649,6338,23610,6314) +(25942,10008,25911,9928) +(25651,29943,25590,29906) +\N +(24555,40334,24546,40330) +(46870,43762,46789,43709) +\N +(20030,2752,19945,2687) +(30758,26754,30718,26678) +\N +(4320,44673,4286,44625) +\N +(1011,15576,939,15574) +(41936,40699,41854,40655) +(20594,19002,20561,18995) +(9388,41056,9325,41042) +(34771,46693,34751,46645) +(49398,46359,49332,46357) +\N +(23115,35380,23036,35306) +(46305,34840,46283,34765) +(16768,21692,16691,21647) +(28695,3128,28654,3112) +(22182,7107,22107,7074) +(14567,1210,14468,1139) +(14156,37139,14136,37119) +(33500,38351,33477,38286) +(39983,41981,39944,41954) +(26773,20824,26719,20813) +(42516,22947,42460,22932) +(26127,10701,26044,10650) +(17808,13803,17724,13710) +(14913,49873,14849,49836) +(37013,820,36955,736) +(39071,1399,39022,1381) +\N +(9785,42546,9687,42540) +(13423,14066,13354,14052) +(3417,14558,3336,14478) +(25212,46368,25128,46316) +(10124,39848,10027,39820) +(39722,39226,39656,39162) +(6298,28101,6250,28076) +(45852,5846,45809,5750) +(48292,4885,48290,4841) +(18905,4454,18894,4424) +(18965,43474,18902,43444) +(39843,28239,39761,28199) +(18087,44660,18019,44632) +(33886,10382,33794,10286) +(38383,13163,38362,13092) +(18861,25050,18842,24965) +(29887,14326,29806,14274) +(18733,11644,18698,11644) +(5119,37952,5089,37950) +(16191,34884,16149,34864) +(29544,1104,29496,1062) +(27740,41555,27701,41540) +(4672,4087,4633,4060) +(45441,38994,45377,38958) +(3272,1176,3232,1146) +(12820,26606,12790,26575) +(30910,7590,30877,7512) +(42476,39152,42377,39127) +(6562,38490,6542,38447) +(30046,20332,29988,20259) +(40723,15950,40671,15949) +(4945,46857,4908,46817) +(47986,16882,47963,16877) +(9842,22339,9805,22305) +(29831,23169,29818,23122) +(12322,34404,12250,34312) +(22846,11091,22759,10992) +(47627,2424,47603,2397) +(18375,43632,18347,43577) +(40441,974,40394,965) +(34260,10573,34194,10522) +(32914,9549,32828,9503) +(49023,37827,48978,37799) +(22183,10691,22111,10669) +\N +(38036,15828,38014,15759) +(34604,16801,34508,16746) +(26737,29997,26675,29976) +(47375,40298,47293,40210) +(771,2661,732,2649) +(28514,25659,28504,25577) +(13438,46494,13376,46455) +(7187,17877,7125,17786) +(49957,43390,49897,43384) +(26543,20067,26482,20057) +(16416,29803,16385,29724) +(36353,7484,36286,7414) +(26498,3377,26415,3358) +(28990,32205,28936,32193) +(45005,3842,45001,3816) +(21672,23566,21603,23566) +(33360,43465,33302,43429) +\N +(29884,9544,29838,9520) +\N +(5599,15012,5596,14930) +(22396,21481,22344,21422) +(24810,14955,24780,14887) +(47114,18866,47081,18784) +(39013,39245,38953,39237) +(12863,40534,12803,40529) +(351,37068,310,37019) +\N +(12916,34327,12891,34240) +\N +(49191,2694,49170,2628) +(24127,38407,24050,38325) +(3264,23053,3213,23007) +(8172,30385,8144,30336) +(19630,35716,19573,35640) +(42554,5148,42521,5117) +(42168,33453,42136,33426) +(17732,32093,17666,32057) +(1039,16626,1037,16587) +(21287,7757,21265,7679) +(47063,8260,47039,8225) +(38645,16238,38561,16204) +(18258,25358,18196,25341) +(30458,1742,30458,1695) +(35147,9273,35121,9233) +(7670,16625,7642,16545) +(49503,23432,49484,23383) +(31089,23146,31062,23093) +(47758,2734,47670,2703) +\N +(35276,1027,35259,972) +(26337,17603,26313,17579) +(35649,16777,35626,16777) +(42454,5105,42362,5101) +(21682,24951,21646,24920) +\N +(48383,25174,48303,25156) +(14672,3532,14601,3460) +(22570,22587,22515,22512) +(23566,25623,23484,25573) +(9530,24542,9504,24459) +(41271,451,41236,401) +(5556,37528,5502,37527) +(12479,25042,12447,24991) +(16568,22916,16499,22864) +(42700,13084,42676,12992) +\N +(35523,40973,35504,40932) +(32948,16962,32857,16901) +(7808,13469,7712,13469) +(13920,35203,13870,35131) +(22731,31563,22658,31557) +\N +(22909,43956,22900,43857) +(33077,35080,33074,35030) +(48064,29307,48022,29280) +(20232,46682,20212,46613) +(29949,16790,29867,16711) +(30260,32029,30180,31979) +(17184,34503,17110,34482) +(16066,42687,16039,42648) +(2947,19819,2857,19788) +(4900,47934,4818,47894) +(27193,19014,27174,18976) +\N +(15597,27948,15590,27939) +(11090,28623,11002,28589) +(26956,18651,26920,18620) +(3107,47753,3103,47711) +(6745,24151,6711,24083) +(43923,19213,43871,19124) +(33451,23578,33370,23534) +(8944,20605,8862,20601) +(14905,7536,14892,7441) +(2412,18357,2383,18354) +(37060,1443,36974,1366) +(15501,6230,15429,6190) +\N +(30333,50,30273,6) +(35567,9965,35482,9912) +(49847,7128,49798,7067) +\N +(27685,36396,27668,36384) +(43832,18491,43825,18431) +(36849,34600,36785,34589) +(2348,47938,2307,47902) +\N +(20473,22131,20445,22113) +(38486,4293,38471,4288) +(30611,30451,30553,30400) +(3883,21299,3819,21260) +(7696,37555,7644,37534) +(22399,7913,22317,7911) +(42565,38605,42500,38598) +(36595,12151,36500,12106) +(587,35217,571,35123) +(5764,15300,5764,15231) +(12003,21265,11983,21210) +(42564,4803,42470,4737) +(42359,36834,42271,36746) +(44700,14680,44658,14670) +(19690,5627,19620,5607) +(17780,43602,17714,43565) +(45073,3491,45041,3434) +(35043,2136,35017,2084) +\N +(39653,19215,39646,19198) +(23970,25560,23935,25502) +(28698,49233,28600,49223) +(30266,3605,30245,3540) +(25538,7857,25500,7791) +(17711,1757,17708,1756) +(5248,594,5190,587) +(2730,32454,2671,32436) +(1722,49089,1635,49067) +(40954,5743,40921,5722) +\N +(21382,4426,21298,4331) +(7885,18629,7872,18605) +(42838,6459,42748,6451) +(8217,19894,8207,19845) +(20489,18524,20433,18520) +(17383,23559,17309,23515) +(38952,38968,38934,38913) +(44665,18137,44636,18051) +(22416,41220,22383,41213) +(9901,664,9818,646) +(23475,21981,23449,21973) +(41875,17991,41818,17988) +(36517,47731,36509,47713) +(37595,49849,37581,49834) +(38771,32720,38748,32684) +(810,38523,736,38452) +(29695,14942,29665,14907) +(31911,15168,31906,15113) +(3454,36839,3438,36831) +(4832,47554,4820,47473) +\N +(11590,8292,11539,8272) +(8193,33323,8106,33317) +(16043,14799,16001,14710) +(19574,11395,19514,11316) +(26290,41424,26224,41342) +(22844,12516,22807,12471) +\N +(15709,49580,15655,49553) +(13387,28084,13379,28066) +(2780,38807,2690,38711) +(22031,32458,22028,32377) +(13511,3351,13440,3297) +(14648,26473,14614,26383) +(17798,19885,17726,19852) +(32355,27940,32324,27861) +(43773,21031,43767,20985) +(15419,45759,15403,45666) +(770,38863,729,38806) +(21221,35619,21183,35596) +(38924,31021,38894,30961) +(7395,32439,7345,32416) +(2324,25118,2268,25074) +(2958,15089,2935,15087) +(2424,160,2424,81) +(12123,18644,12099,18616) +(7459,30276,7422,30218) +(15847,45488,15814,45428) +(26409,29897,26389,29863) +(12336,34322,12279,34322) +(9440,23550,9396,23466) +(4991,30850,4905,30768) +(47262,11940,47201,11939) +(30584,42868,30555,42838) +(23144,24089,23056,24067) +\N +(35930,11609,35847,11573) +(7812,17271,7789,17203) +(17946,37554,17878,37480) +(27356,32869,27298,32813) +(29971,47783,29933,47697) +(26075,46494,25988,46451) +(39314,41366,39289,41269) +(31708,42900,31688,42865) +(4510,10231,4439,10203) +(43806,8482,43758,8446) +(45990,49694,45927,49617) +(48815,27640,48782,27573) +(41675,26733,41622,26723) +(23229,7709,23175,7693) +(48976,17733,48962,17731) +(10686,41470,10597,41434) +(18053,27059,17989,27012) +\N +(35495,25950,35459,25912) +(41896,45014,41881,44999) +(22654,41896,22572,41801) +(18581,7087,18524,6988) +\N +(14697,22406,14681,22311) +(40092,28122,40043,28030) +(35844,24243,35816,24238) +(1254,25653,1250,25644) +(1603,21730,1556,21640) +(33048,21779,32991,21763) +(29979,1632,29916,1592) +(8620,633,8580,620) +(22992,27035,22932,27008) +(21409,29315,21390,29309) +(3610,44748,3547,44699) +(20402,9318,20343,9267) +(31001,8709,30908,8658) +(46840,47640,46773,47551) +(49173,4705,49143,4630) +(5339,31657,5251,31622) +(8644,49668,8630,49648) +(45387,2893,45309,2885) +(47641,31020,47584,30941) +(40238,10636,40208,10568) +(19247,36924,19227,36924) +(917,19957,827,19887) +(40967,17841,40870,17820) +(15850,4109,15794,4085) +(20181,30916,20085,30870) +(161,24465,107,24374) +(21737,49690,21667,49663) +(10328,20911,10232,20852) +(24187,49823,24128,49768) +(36084,4578,36007,4501) +(38771,31741,38673,31674) +(2202,30102,2111,30006) +(27322,16074,27228,16039) +(6843,17280,6765,17248) +(16972,39744,16912,39700) +(10608,38741,10553,38708) +\N +(4917,34801,4828,34766) +(39281,33659,39268,33618) +(31706,7119,31645,7063) +(3427,44006,3422,44004) +\N +(10134,42608,10044,42599) +(26294,32080,26200,32068) +(21777,34680,21769,34606) +(23373,25957,23314,25915) +(10710,8401,10681,8400) +(42062,19458,42019,19394) +(26530,43036,26458,43004) +(3394,46081,3360,46077) +(38743,33953,38677,33924) +(32438,8226,32345,8160) +(9210,27333,9118,27301) +(19594,1600,19568,1551) +(10003,12278,9952,12255) +(31737,7206,31650,7146) +(16594,15821,16502,15759) +(28208,30296,28189,30278) +(30602,46237,30555,46185) +(20715,5155,20697,5140) +(48892,35271,48793,35210) +(3175,5590,3113,5525) +(34220,27947,34132,27865) +(35105,39792,35011,39727) +(21919,27314,21839,27286) +\N +(23963,3723,23917,3699) +(16312,14078,16236,14045) +(19233,49824,19185,49794) +(1447,11768,1356,11699) +(17311,17709,17224,17653) +(11962,31709,11871,31627) +(21355,40131,21355,40085) +(33750,35273,33724,35180) +(38896,25539,38879,25524) +(39569,44899,39569,44893) +(11075,41547,11039,41500) +(3215,12202,3199,12127) +(46215,33458,46132,33455) +(15121,38012,15083,37974) +(44448,18726,44412,18690) +(3899,38263,3870,38262) +(13854,13353,13786,13298) +(8252,5402,8191,5320) +(46849,37968,46820,37897) +(16422,13957,16376,13897) +(47369,7665,47353,7629) +(11982,40874,11956,40806) +\N +(9552,27580,9496,27562) +(32247,19399,32176,19337) +(32704,2169,32635,2091) +(7471,44213,7411,44130) +(48433,7096,48379,7089) +(37357,6543,37338,6452) +(30460,29624,30433,29535) +(20350,28794,20341,28705) +(6326,32360,6267,32317) +(1711,47519,1654,47430) +(49540,16510,49521,16426) +\N +(26975,618,26908,579) +(24118,30880,24020,30821) +(3675,15477,3625,15418) +(44953,9577,44953,9530) +(38323,7965,38235,7910) +(6629,36482,6579,36448) +(33953,16460,33878,16408) +(49222,16790,49186,16695) +(17308,16951,17274,16904) +(14135,6888,14077,6833) +(38617,47768,38603,47760) +(7345,10992,7290,10914) +(35261,42152,35176,42096) +(28586,4809,28544,4735) +(37521,25299,37495,25217) +(41941,17954,41912,17915) +(1209,46863,1171,46863) +(20103,34947,20048,34896) +(32716,33816,32656,33769) +(11113,6531,11036,6467) +(48635,7321,48563,7262) +(28435,37059,28349,37014) +(12311,17208,12232,17112) +(1466,48010,1379,48008) +(11226,11997,11223,11925) +(46896,32540,46821,32510) +(32661,31255,32632,31187) +(37739,20376,37655,20306) +(44002,43326,43920,43257) +(30337,1023,30271,968) +(34436,23357,34432,23345) +\N +(21367,8168,21353,8091) +(36370,21611,36369,21569) +(4152,36488,4080,36476) +(17696,13924,17664,13853) +(34252,19395,34159,19316) +(12574,3072,12573,2975) +(3995,21243,3943,21167) +(44553,30126,44513,30108) +\N +(4599,45275,4552,45254) +(33191,11404,33176,11348) +\N +(14245,18633,14177,18540) +(32457,20705,32393,20700) +(40052,10499,40016,10457) +(29824,44065,29785,44037) +(31613,12565,31557,12543) +(42692,29000,42652,28996) +\N +(40680,22219,40603,22140) +\N +(33575,27661,33488,27644) +(46194,1385,46184,1355) +(38442,48501,38407,48426) +(25305,21544,25236,21523) +(15562,8226,15561,8208) +\N +(20844,43614,20752,43558) +(22566,30541,22554,30532) +(2760,47802,2672,47789) +(25515,30745,25433,30675) +(48382,45134,48382,45093) +(9940,27094,9871,27087) +\N +(48690,44361,48610,44338) +(18992,11585,18899,11582) +(21551,49983,21492,49885) +(46778,29113,46770,29071) +(43219,9593,43212,9548) +(40291,1248,40224,1190) +(12687,22225,12635,22219) +(49372,38790,49306,38721) +(49503,46808,49411,46798) +(24745,5162,24732,5138) +(5046,26517,5023,26424) +(5583,46538,5495,46531) +(6084,35950,6079,35895) +(3503,23096,3437,23024) +\N +(45275,8420,45244,8418) +(13514,45251,13491,45249) +(42112,2748,42047,2668) +\N +(7810,21907,7806,21878) +(48378,36029,48303,35979) +(32568,48605,32510,48563) +(859,18915,810,18915) +(41963,17950,41939,17915) +\N +(42723,8031,42685,7955) +\N +(19587,5965,19556,5961) +(8713,33083,8629,32996) +(21243,7769,21226,7740) +(43752,43026,43720,42944) +(7883,41311,7859,41242) +(10178,47874,10157,47826) +(32177,48725,32093,48646) +(22960,2784,22953,2774) +(25101,49159,25087,49090) +(32142,48915,32086,48850) +(6636,44887,6590,44825) +(37814,11606,37769,11578) +(2870,23198,2820,23121) +(21025,16364,20947,16271) +(31341,36137,31269,36114) +(38921,7906,38888,7831) +(6966,17259,6922,17199) +(32426,13344,32401,13253) +(8084,30572,8078,30572) +(42230,47674,42150,47603) +(20724,44854,20724,44830) +(27471,38453,27454,38430) +(24590,37973,24544,37941) +(45832,26077,45772,26031) +(9589,24239,9582,24156) +(37484,49472,37409,49432) +(30044,19340,30004,19333) +(16966,14632,16936,14572) +(9439,40491,9403,40482) +(28945,5814,28913,5805) +(43788,41302,43746,41231) +(33631,43451,33614,43354) +(17590,49396,17510,49324) +(15173,32572,15109,32507) +(1912,23580,1840,23504) +(38165,16185,38076,16154) +(6729,1179,6637,1177) +\N +(6994,45406,6983,45325) +(2912,21327,2908,21305) +(14678,14244,14659,14222) +(29944,14959,29898,14900) +(47432,35658,47407,35610) +(25542,39243,25466,39149) +(5330,7206,5304,7165) +(24790,27196,24695,27118) +(38806,1961,38795,1906) +(23290,4487,23212,4416) +\N +(35035,24337,34990,24297) +(5549,38948,5549,38891) +(24558,15492,24501,15425) +(4636,3011,4574,2933) +(26522,39986,26451,39940) +(33486,18424,33410,18366) +(36638,14324,36625,14287) +(35115,41236,35055,41191) +(31927,16896,31841,16806) +(5796,43937,5697,43886) +(25681,41645,25663,41608) +(10962,42777,10894,42732) +(32715,11026,32672,10991) +(45803,20406,45710,20371) +(34730,17672,34658,17606) +(8809,6323,8798,6232) +\N +(39471,23837,39390,23749) +\N +(34078,17435,33987,17433) +(9133,4544,9041,4509) +(47274,29126,47242,29060) +(6404,28488,6403,28475) +(48894,49751,48846,49694) +(17324,43023,17301,42972) +(15599,8433,15557,8386) +(48575,10202,48488,10175) +(27638,24428,27608,24378) +(45277,47456,45240,47422) +(26482,46607,26482,46570) +(41400,33898,41397,33802) +\N +(49853,18504,49848,18503) +(11528,25165,11476,25080) +(49902,41752,49818,41746) +(1956,47506,1922,47424) +(21834,22058,21802,21964) +\N +(19414,21842,19386,21822) +(34801,13722,34744,13681) +(13924,29243,13835,29160) +(47749,21986,47664,21894) +(47051,39582,46974,39489) +(31287,49923,31236,49913) +(47429,8625,47337,8585) +(46987,44364,46901,44277) +(16158,27510,16099,27467) +(41184,6400,41148,6317) +(1847,42471,1829,42426) +\N +(14409,48602,14320,48555) +\N +(38137,42951,38045,42918) +(42875,2312,42832,2243) +(27242,30617,27181,30535) +(24882,44559,24812,44548) +(22021,1596,22015,1581) +(24300,1523,24250,1443) +(43946,35909,43869,35868) +(816,15988,776,15967) +(25243,9401,25237,9332) +(27967,25958,27928,25949) +(6575,33949,6484,33900) +(44812,35980,44800,35913) +(37577,13064,37495,13019) +\N +(30891,29967,30814,29884) +(15829,28836,15753,28807) +(11128,34180,11126,34117) +(9834,12537,9801,12508) +(4899,29069,4809,29024) +(29370,38459,29276,38382) +(40743,46653,40647,46559) +(9618,2723,9578,2631) +(32542,26837,32515,26769) +(5625,13409,5576,13355) +(47490,19229,47472,19203) +(48118,40275,48063,40203) +(19245,20549,19227,20546) +(25312,22243,25280,22164) +(18797,28934,18723,28881) +(31609,49393,31512,49366) +(26183,32888,26135,32824) +(46198,26153,46180,26149) +\N +(45383,16904,45353,16888) +(7132,11408,7091,11338) +(48262,43227,48236,43159) +(31722,12861,31675,12810) +\N +(41695,48924,41691,48921) +(48318,12877,48287,12802) +(12069,32241,11978,32231) +(8395,2694,8380,2661) +(19552,34590,19550,34497) +(12203,26166,12187,26143) +(35745,9571,35654,9542) +(22384,22535,22352,22439) +(21459,28189,21360,28189) +(7418,7203,7343,7182) +(39497,48412,39413,48318) +(1058,11132,979,11051) +(45623,31417,45548,31381) +\N +(23887,31921,23876,31891) +(7797,1244,7785,1155) +(23679,43650,23594,43644) +(21891,30561,21833,30485) +(4069,6870,4019,6785) +(5134,25117,5103,25034) +(36101,41895,36085,41810) +(39617,39211,39544,39191) +(37437,6604,37434,6585) +\N +(7749,32601,7740,32515) +(26203,34991,26159,34946) +(31856,39006,31783,39003) +(45828,24767,45788,24723) +\N +(49836,35965,49757,35871) +(44113,49024,44033,48995) +(38237,22326,38187,22253) +(45235,19087,45190,19005) +(1588,45285,1520,45254) +(46628,8701,46552,8665) +(47707,18258,47668,18250) +(9377,26162,9325,26079) +(28331,16766,28302,16731) +(15792,27875,15727,27809) +(16454,1972,16415,1967) +(21012,15828,20972,15784) +(27465,30603,27390,30560) +(39256,7697,39225,7604) +(25908,32801,25854,32770) +(25215,40109,25201,40106) +\N +(23280,4613,23190,4596) +(32440,30879,32405,30807) +(49156,4224,49126,4126) +(20005,40423,19911,40370) +(20978,8226,20930,8170) +(32127,22611,32126,22579) +(21764,26509,21701,26455) +\N +(32923,2834,32914,2830) +(7499,25331,7426,25300) +(6163,36942,6107,36908) +(41118,14583,41034,14486) +(21211,33369,21208,33331) +(7899,27682,7853,27603) +(16546,48436,16535,48400) +(24898,40195,24855,40174) +(43029,982,43004,952) +(26266,7962,26252,7950) +\N +(11308,44367,11210,44322) +(8902,28402,8808,28334) +(11671,19619,11665,19549) +(47202,23593,47153,23505) +(21981,40220,21905,40160) +(46721,2514,46687,2471) +(3450,33839,3424,33811) +(41854,45864,41762,45792) +(40183,47816,40114,47742) +(26119,33910,26077,33816) +(3430,16518,3365,16500) +(40063,32176,40005,32166) +(38702,15253,38679,15187) +(17719,12291,17658,12257) +(46131,30669,46068,30587) +(42738,10952,42731,10907) +(8721,45155,8650,45076) +(45317,26123,45244,26113) +(42694,11561,42614,11490) +(10043,12479,10009,12391) +(27584,2345,27578,2257) +(30889,8253,30866,8167) +\N +(5176,48928,5107,48838) +(9781,21023,9745,20976) +(32430,27908,32404,27859) +(3984,7391,3973,7352) +(18904,8094,18842,8091) +(20573,5508,20482,5496) +(7806,44368,7753,44297) +(18875,41452,18817,41376) +(6632,12142,6566,12079) +(33066,17865,33055,17854) +(45726,19628,45714,19589) +(26971,18459,26941,18423) +(26554,23641,26515,23592) +(45503,1325,45441,1231) +(11898,20164,11880,20115) +(27868,22837,27843,22776) +(34931,8206,34855,8144) +(42375,33603,42350,33539) +(3184,8308,3129,8238) +(26667,15813,26661,15785) +\N +(5760,49617,5730,49546) +(794,27001,777,26992) +(13518,45289,13459,45235) +\N +(34430,29754,34363,29736) +(37912,24574,37880,24543) +(8130,2270,8083,2258) +\N +(26930,21516,26848,21455) +(3634,33511,3592,33489) +(33080,5036,33035,4972) +(48389,13942,48316,13915) +(9231,5298,9150,5232) +(1357,10601,1321,10548) +\N +(35175,15295,35091,15269) +(33917,36863,33879,36784) +(8279,12052,8239,12021) +(11868,19083,11862,19034) +(24019,30777,24006,30703) +(44619,6959,44618,6938) +(28610,2626,28523,2582) +(29579,41801,29482,41775) +(23448,37609,23396,37534) +(40676,11252,40670,11191) +(39656,14077,39564,13999) +(33060,31042,33033,30950) +(11720,6816,11654,6792) +(13775,28873,13730,28868) +(47851,39121,47802,39084) +(30923,40255,30860,40199) +(44169,15070,44085,15015) +(42574,28664,42558,28590) +(8993,43487,8941,43460) +(40782,11648,40763,11631) +(18516,10143,18423,10137) +(39068,551,39005,491) +\N +(39672,12000,39575,11913) +(18508,37761,18464,37712) +(19083,35318,19079,35280) +(30286,13736,30222,13672) +(7223,9164,7132,9069) +(20764,29286,20700,29210) +(5733,8063,5699,8058) +(8566,43873,8549,43797) +(22126,27444,22062,27366) +(15105,8717,15078,8660) +(43987,33145,43940,33083) +\N +(46833,38652,46755,38612) +(47768,27202,47681,27169) +(22792,1183,22731,1152) +(25650,43310,25562,43247) +(37084,20116,37045,20057) +(47461,32556,47423,32555) +\N +(41225,18124,41215,18117) +(17623,25218,17553,25158) +(13770,21703,13770,21700) +(48958,35441,48870,35388) +(2976,1808,2892,1802) +(45118,22318,45049,22224) +(42287,26616,42281,26560) +(25525,6327,25468,6244) +\N +(40756,31634,40713,31568) +(23105,26565,23078,26565) +(48268,39862,48265,39827) +(41656,26254,41567,26243) +(28062,17920,28045,17825) +(6443,17321,6402,17238) +(10191,45466,10151,45447) +(18097,39706,18043,39649) +(37592,3244,37569,3197) +(29809,5978,29762,5950) +(12145,11251,12130,11202) +(37507,42999,37446,42956) +(10820,2866,10782,2830) +(36440,42904,36421,42832) +(38370,3386,38279,3311) +(9345,17279,9313,17197) +(20477,14864,20395,14807) +(37147,37769,37110,37729) +(15325,36135,15284,36053) +(29034,32897,29009,32854) +(2116,22274,2037,22216) +(15078,38330,15048,38251) +(7968,33600,7914,33573) +(832,23851,770,23786) +(38669,4348,38594,4344) +(8521,48573,8425,48564) +(1060,43320,969,43289) +(26170,10150,26144,10069) +(32324,8539,32285,8506) +(13121,18044,13109,18021) +(1597,9383,1594,9367) +(49539,35164,49505,35065) +(39464,10295,39409,10261) +(8921,37898,8825,37803) +(31171,47076,31093,47039) +(7178,41397,7108,41304) +(16240,34832,16162,34761) +(2829,20119,2782,20091) +(45854,21265,45810,21250) +(6382,12106,6315,12030) +(22301,46291,22291,46274) +(34142,14181,34078,14158) +(11258,29748,11198,29742) +\N +(37450,6943,37398,6882) +(41675,27207,41643,27130) +(13578,49562,13573,49479) +(37132,37397,37081,37301) +(49404,37193,49332,37170) +(33536,31809,33444,31735) +(45990,42751,45893,42708) +(38852,20510,38802,20509) +(27453,15836,27391,15802) +(9347,29004,9284,28946) +(44871,27727,44778,27668) +(14978,19646,14970,19644) +(23243,47091,23166,47080) +(45204,21431,45167,21370) +(14082,22316,14078,22235) +(42778,22694,42744,22606) +(4834,25241,4760,25196) +(20497,18110,20494,18038) +(45738,35524,45706,35496) +(21575,5151,21493,5092) +(2194,10052,2172,9960) +\N +(47735,24472,47682,24460) +(46740,35700,46695,35609) +(24647,42807,24568,42779) +(18000,30576,17975,30506) +(48638,46630,48544,46628) +(48508,33600,48477,33578) +(38703,45408,38670,45313) +(21712,15015,21625,14956) +(5840,42007,5768,41992) +(44011,11138,43953,11117) +(3899,33262,3897,33238) +(30142,23967,30096,23927) +(36950,13226,36908,13141) +(13130,26915,13071,26873) +(38576,35408,38539,35392) +(16776,46244,16700,46176) +(38251,25969,38168,25948) +\N +(3512,32256,3417,32242) +(31923,31225,31832,31197) +(5144,4969,5124,4937) +(34499,46164,34430,46162) +\N +(39432,31907,39388,31828) +(17316,24606,17221,24533) +(20751,49352,20709,49323) +(41673,30418,41623,30377) +(29026,24400,28971,24345) +(21929,30617,21894,30598) +(35539,12421,35536,12355) +(24938,45583,24870,45525) +\N +(27442,33090,27353,33064) +(23949,12046,23949,12036) +(11399,377,11360,294) +(47099,9989,47023,9942) +(641,33118,639,33084) +(13687,41308,13682,41290) +\N +(3682,17727,3645,17660) +(13262,19396,13185,19357) +(18791,389,18774,366) +(12489,45384,12403,45369) +\N +(12065,6364,12015,6325) +\N +(32705,23886,32619,23827) +\N +(7004,37333,6911,37240) +(28594,38078,28530,38050) +(5805,21797,5710,21701) +(41145,18905,41058,18873) +(35599,10002,35591,9956) +(5387,39087,5326,38994) +(11703,14003,11671,13912) +(4093,10472,4091,10470) +\N +(14110,49740,14063,49695) +(4170,470,4097,463) +(22219,17296,22164,17221) +(2505,20879,2446,20842) +\N +(47235,24744,47151,24667) +(30035,23234,30013,23197) +(3489,11659,3461,11607) +(38435,46322,38429,46230) +(12315,32880,12277,32854) +(33350,35297,33317,35263) +(18845,37671,18836,37589) +(24855,23554,24783,23520) +(48251,44461,48188,44408) +(17695,43353,17605,43286) +(4964,21292,4893,21270) +(33919,29907,33852,29878) +(29139,40010,29084,39957) +(41611,37750,41572,37741) +(41773,34717,41682,34700) +(8225,7424,8221,7363) +(1785,28248,1771,28219) +(21553,36307,21505,36257) +(7552,18199,7527,18119) +\N +(14410,30977,14349,30944) +\N +(20940,49142,20901,49069) +(36892,5522,36810,5478) +(40192,20926,40179,20926) +(44702,15182,44641,15117) +(43431,4921,43337,4827) +(41129,21654,41084,21642) +(6205,42785,6113,42722) +(23714,10224,23666,10205) +(9318,35175,9274,35139) +(40698,12676,40618,12627) +(49954,1340,49905,1294) +(32774,33062,32763,33062) +(4336,22183,4241,22157) +(10241,47657,10151,47592) +(6746,16718,6666,16634) +(26842,49694,26839,49680) +(34870,47437,34820,47347) +(26365,22266,26326,22183) +(39859,932,39829,840) +(33995,10888,33902,10793) +(32972,22342,32951,22340) +\N +(19951,10161,19932,10111) +(26779,45188,26745,45151) +(11235,13593,11184,13589) +(27334,20968,27288,20953) +(9586,43102,9488,43085) +(43935,49759,43925,49680) +(10548,37032,10474,36955) +(9326,14927,9295,14848) +(41340,11312,41311,11303) +(6500,44553,6454,44515) +\N +(8198,26841,8104,26749) +(47761,34183,47702,34140) +(43637,17912,43577,17910) +(17623,11138,17590,11122) +(48122,13132,48077,13060) +(27911,39796,27908,39777) +(1108,7918,1080,7832) +(18776,24329,18699,24326) +(1171,37901,1075,37871) +(38437,33948,38364,33907) +(1913,11593,1817,11533) +(22684,266,22656,181) +(13299,17075,13241,17074) +(6924,30196,6851,30113) +\N +(4367,13150,4298,13053) +(37381,6101,37380,6046) +(10307,28383,10270,28349) +(12283,8636,12256,8610) +(20230,32775,20144,32723) +(32942,12812,32905,12714) +(46140,7138,46140,7047) +(37235,29436,37161,29425) +(42486,25454,42478,25444) +(47860,46973,47842,46961) +(41760,21026,41662,20955) +(29663,20088,29566,20026) +(19167,33241,19101,33235) +(12306,37845,12301,37803) +(11288,873,11203,857) +(30309,5120,30282,5060) +(46927,19737,46856,19687) +(16664,20052,16649,19989) +(7330,8675,7296,8613) +(45067,45724,44991,45631) +(45317,10862,45218,10842) +(15012,47009,14998,46956) +(47882,10146,47813,10099) +(31571,46215,31511,46148) +(32257,2619,32187,2531) +(38924,41305,38872,41285) +(49981,34876,49898,34786) +(30501,35099,30418,35011) +\N +(45862,41438,45854,41434) +(38448,31878,38391,31822) +(8278,43463,8274,43378) +(5883,30629,5878,30564) +(49501,40346,49447,40275) +(31651,43116,31560,43106) +(44244,32940,44244,32926) +\N +(17941,18079,17938,18035) +(9518,32524,9470,32511) +(30707,43469,30686,43457) +(3284,46542,3187,46477) +(43423,29642,43393,29602) +(19940,16825,19877,16736) +(26194,47446,26194,47407) +(30386,24675,30333,24652) +(42707,44466,42688,44456) +\N +(43395,18525,43320,18467) +(28346,32259,28276,32196) +(45106,40786,45026,40767) +(36734,20414,36722,20363) +(37140,11569,37099,11475) +(8967,6409,8882,6341) +(31036,27923,30993,27890) +(22442,47682,22347,47663) +(32511,24029,32482,23970) +(22593,34444,22519,34399) +(41534,15495,41518,15455) +\N +(35862,19997,35818,19928) +(31419,8323,31404,8285) +(31036,19023,30978,19000) +(46900,15192,46891,15102) +(12774,9651,12765,9604) +(49985,6436,49927,6338) +(7184,47344,7089,47285) +(12792,45021,12740,45011) +(15019,27192,14940,27096) +(35415,23106,35381,23095) +(42129,14283,42095,14245) +(29375,45807,29347,45743) +(21763,24916,21700,24889) +(47656,8794,47579,8774) +(6139,49571,6059,49472) +(44492,45607,44483,45532) +(22699,4301,22628,4240) +(27407,24241,27335,24158) +\N +(38424,34460,38403,34458) +(46572,48456,46554,48402) +(39676,29056,39643,28981) +(4202,33076,4107,33010) +(32499,10592,32482,10575) +(22504,45417,22459,45378) +(49619,40322,49619,40268) +(14463,9305,14426,9224) +(10070,20300,10035,20211) +(35060,28561,34965,28553) +(23970,47522,23887,47428) +(46803,19155,46790,19131) +\N +(46151,49848,46058,49830) +(45266,40766,45209,40738) +(31041,32195,31007,32110) +(41401,17245,41334,17224) +(37445,654,37435,602) +(45568,31904,45508,31857) +(29326,7923,29285,7896) +(27078,34643,27027,34606) +(34492,43443,34437,43345) +(34109,4307,34083,4265) +(2755,45325,2727,45312) +(12571,24218,12536,24195) +(41224,2454,41149,2445) +(711,34828,655,34788) +(9104,18865,9036,18850) +(3508,26816,3456,26771) +(20159,16212,20116,16160) +(36871,7425,36777,7421) +(2751,45244,2734,45222) +(35867,28071,35769,28052) +(46878,35730,46850,35725) +(20610,35086,20513,35037) +(3903,32612,3887,32517) +(9330,40226,9289,40169) +(6338,28242,6329,28184) +(35668,18344,35606,18304) +(29892,48927,29878,48879) +(26999,646,26932,612) +(36377,38898,36338,38847) +(40289,31459,40236,31436) +(30377,1164,30306,1069) +(7642,12183,7590,12112) +(40325,1716,40296,1662) +(36412,38787,36318,38691) +(3967,33268,3923,33261) +(33914,40774,33873,40763) +(45978,41431,45963,41332) +(39195,12546,39120,12520) +(29962,30878,29941,30846) +(9365,10732,9310,10726) +(28801,23943,28740,23885) +(28934,38858,28928,38807) +(22126,45897,22068,45803) +(2923,33832,2918,33751) +(25116,2276,25083,2272) +(31174,14546,31144,14460) +(11728,9072,11658,9004) +(19804,49195,19730,49125) +(23090,28826,23010,28787) +(33989,27553,33947,27486) +(39702,47613,39641,47553) +(31397,3607,31304,3519) +(5835,9262,5791,9226) +(40112,37022,40038,36926) +(12346,29356,12282,29344) +(28503,9623,28469,9591) +(38449,43143,38378,43066) +(36950,37311,36905,37265) +(34824,5729,34818,5706) +(9288,26969,9225,26900) +(2535,42176,2478,42159) +(29098,49051,29085,49031) +(44759,33326,44727,33230) +(42849,2970,42821,2919) +(46014,27193,45985,27151) +(14506,13713,14417,13626) +(19342,44905,19332,44895) +(38178,37003,38147,36925) +(29179,27310,29084,27288) +(42713,10158,42671,10060) +(43336,38389,43290,38326) +(41260,34410,41245,34327) +(27907,2695,27830,2596) +(16309,44972,16222,44966) +(6230,22262,6214,22249) +\N +(9266,39458,9175,39447) +(33120,33548,33087,33538) +(43659,11416,43599,11375) +(49707,39258,49702,39159) +(23520,22140,23486,22072) +(24736,46502,24668,46412) +(7826,16851,7730,16807) +(39114,6048,39056,5965) +(11859,8753,11764,8701) +(42254,48367,42240,48328) +(26136,49185,26056,49175) +(38395,11209,38334,11137) +(33249,9425,33209,9348) +(22131,38502,22112,38460) +(5306,24344,5267,24268) +(30292,1198,30233,1149) +(9903,10896,9850,10806) +(25568,22911,25487,22868) +(22048,43391,22043,43362) +(20852,25827,20851,25766) +(35204,17119,35114,17093) +(5575,43431,5554,43410) +(17727,13623,17678,13560) +(14721,29520,14709,29461) +(40317,42220,40267,42166) +(31435,31012,31386,30931) +(40655,10103,40645,10006) +(35783,17802,35773,17763) +(34874,10210,34856,10200) +(3694,14279,3610,14239) +(27854,5493,27799,5433) +(34913,7234,34894,7220) +(15758,26445,15738,26421) +(23710,7272,23705,7270) +\N +(33679,13468,33628,13415) +\N +(31271,40495,31178,40461) +(759,187,662,163) +(14419,40434,14402,40381) +(45879,42933,45814,42872) +(167,17214,92,17184) +(9964,12210,9958,12195) +(35834,46257,35817,46211) +(26077,5629,25978,5621) +(46177,44640,46082,44544) +(44780,28753,44707,28692) +(35491,24729,35425,24690) +(33914,34190,33914,34131) +(17709,33253,17668,33227) +(45516,11888,45423,11848) +(24497,24752,24411,24710) +(30333,5952,30331,5886) +(444,12587,430,12497) +(7592,22353,7541,22287) +\N +(13387,37414,13329,37318) +\N +(21504,35227,21449,35210) +(18533,12909,18438,12848) +(41049,27148,41048,27088) +(18205,12222,18151,12140) +(18026,5164,18026,5156) +(34104,29862,34006,29815) +(18520,49686,18454,49602) +(37000,41493,36920,41424) +(43025,25711,42986,25687) +(38620,47018,38535,46934) +(24119,36813,24023,36739) +(48887,26359,48879,26302) +(47827,14625,47810,14609) +(10792,30746,10776,30716) +(30384,40672,30318,40582) +(48417,22790,48358,22746) +(14854,5819,14785,5798) +(19142,44414,19085,44406) +(31179,27081,31145,27005) +\N +(19692,8711,19659,8642) +(39689,14082,39603,14051) +(11181,39091,11119,39002) +(46015,23374,45936,23328) +(12517,49702,12427,49690) +(21926,21137,21841,21111) +(31956,12509,31870,12494) +(5895,2030,5851,2020) +(27094,5447,27014,5377) +(35781,8717,35780,8618) +(14012,12023,13972,12015) +(1702,12442,1696,12419) +(28549,5251,28462,5248) +(26441,21007,26360,20925) +(49820,7990,49771,7967) +(26424,29698,26339,29693) +(35146,6820,35071,6817) +\N +(15438,18788,15435,18729) +(47115,5235,47096,5143) +(33982,9002,33915,8925) +(14206,37041,14174,36955) +(24300,36616,24232,36613) +(44658,1788,44580,1769) +\N +(31539,43550,31463,43464) +\N +(16722,9673,16633,9652) +(44813,20573,44733,20544) +\N +(42114,32559,42040,32552) +(41561,36244,41477,36241) +(39589,33796,39548,33716) +(20365,26770,20329,26709) +(28511,208,28479,114) +(10010,25524,9930,25508) +\N +(1549,45666,1512,45621) +(16193,1927,16166,1869) +(34486,11500,34421,11401) +(14048,37944,13994,37901) +(21692,9594,21617,9496) +(2568,37899,2557,37811) +(4360,24503,4278,24443) +(50027,49230,49951,49214) +(44849,14867,44836,14813) +(16695,34896,16683,34840) +(12600,35217,12593,35129) +(23113,24009,23030,23962) +(49907,30225,49810,30158) +(18026,25208,17970,25208) +(49711,39844,49651,39790) +(5427,42682,5357,42637) +(23901,14221,23802,14184) +(15470,12185,15376,12163) +(47302,34023,47292,34001) +(24336,17418,24315,17393) +(13948,17043,13903,16970) +(8555,8986,8530,8953) +(48830,6038,48743,5986) +(48720,40687,48623,40610) +(21161,30970,21146,30896) +(9507,36316,9411,36261) +\N +(36643,18136,36614,18106) +(1858,7457,1851,7402) +(24452,44306,24372,44252) +\N +(3292,807,3205,806) +(6845,30694,6792,30627) +(21333,25786,21237,25751) +(23008,22574,22999,22511) +(8790,8893,8772,8806) +(43333,47968,43264,47900) +(5377,24103,5302,24076) +(18410,23993,18329,23907) +(24752,19126,24713,19069) +(49772,11378,49696,11293) +(3468,12920,3396,12873) +(1746,40342,1736,40333) +(49187,29737,49139,29681) +(27657,44952,27581,44917) +\N +(35407,30177,35345,30151) +(4071,40568,4058,40544) +(25998,30513,25965,30452) +(8195,45403,8097,45310) +(8276,41689,8183,41670) +\N +(48435,28550,48355,28455) +\N +(8139,25449,8136,25380) +(20302,25574,20297,25531) +\N +(22055,46659,22034,46567) +(3531,49962,3463,49934) +(46828,46938,46739,46902) +(42294,786,42212,739) +(8779,3292,8761,3275) +(48146,46170,48082,46151) +(21571,10000,21531,9919) +(35526,26029,35450,25945) +(38893,22225,38865,22197) +(22189,37520,22132,37497) +(810,43261,751,43198) +(10352,39144,10290,39093) +(8740,35435,8720,35432) +(31657,13551,31583,13484) +(39803,4019,39755,4014) +(46353,7853,46312,7824) +(30078,48975,30021,48970) +(2847,32036,2819,31966) +(25250,10147,25165,10140) +\N +(15643,38953,15585,38947) +(40792,29798,40731,29731) +(43249,26858,43215,26835) +(47229,2199,47201,2134) +(10052,23601,9958,23570) +(38981,21615,38892,21604) +(3651,45004,3570,44917) +(21503,8261,21409,8166) +(13518,34201,13465,34105) +(13899,25117,13836,25114) +(18327,17403,18301,17349) +(19503,13648,19483,13607) +(3554,19487,3529,19466) +(41102,43355,41070,43314) +(4663,45858,4583,45765) +(3971,3023,3931,2975) +(37124,7061,37080,6993) +(48530,47172,48459,47160) +(14575,29843,14509,29750) +(43443,23124,43357,23038) +(8864,48290,8857,48263) +(41597,39852,41577,39791) +(35610,33392,35556,33353) +(36415,17906,36328,17846) +(24919,43933,24839,43883) +(7457,14056,7395,14051) +(43851,4090,43801,4080) +(43567,18468,43471,18388) +(16711,6084,16652,6055) +(45888,45934,45846,45880) +(45630,9313,45585,9248) +(27119,25969,27094,25884) +(36155,11420,36120,11405) +(41880,47111,41808,47049) +\N +(17554,20379,17482,20374) +(38848,5936,38763,5869) +(28324,31019,28276,30944) +(43257,17152,43176,17091) +(42717,24613,42691,24527) +(16786,41486,16763,41403) +(19259,28780,19160,28711) +(25843,28265,25760,28171) +(48645,34816,48546,34755) +(7004,49289,6976,49236) +(30261,21833,30181,21776) +(5290,46672,5219,46661) +(21237,31901,21188,31849) +(23340,38537,23253,38472) +(17269,3682,17183,3586) +\N +(48200,15377,48110,15369) +(16546,22195,16477,22142) +(21436,8460,21378,8449) +\N +(46598,17235,46577,17138) +\N +(30212,36184,30152,36092) +(18037,155,17941,109) +(4945,29201,4933,29184) +(32835,18782,32770,18750) +(34160,33104,34120,33007) +(5151,26989,5149,26909) +(1801,15549,1710,15461) +(48988,34819,48951,34764) +(20904,32547,20856,32497) +\N +(32654,35183,32606,35144) +(14336,11763,14328,11712) +(30546,23808,30463,23773) +(6813,21006,6781,20924) +\N +(14199,22030,14185,21934) +(3783,14709,3747,14658) +(49428,47052,49422,46973) +(29551,27682,29470,27654) +(29170,37260,29151,37181) +(48924,24689,48894,24680) +(48497,34052,48453,33966) +\N +(21263,8203,21242,8176) +(46537,3797,46462,3735) +(18406,14579,18393,14563) +\N +(11583,16529,11536,16471) +(10564,46257,10478,46228) +(49769,34513,49761,34458) +\N +(9202,6482,9138,6391) +(40387,37411,40357,37360) +(11966,11802,11888,11751) +(15551,47438,15486,47406) +(12017,43288,11969,43230) +(9717,22574,9701,22495) +\N +(35083,49443,35075,49355) +(33857,9320,33813,9269) +(32106,10581,32012,10560) +(14345,12485,14273,12424) +(24187,46416,24175,46402) +(43854,42159,43808,42129) +(35399,40707,35359,40646) +(29585,25576,29493,25556) +(24919,7829,24911,7753) +\N +(17049,48390,17022,48304) +(25224,35012,25217,34922) +(47397,20853,47346,20779) +(17221,16558,17181,16516) +(8669,16491,8645,16486) +(23502,44241,23484,44164) +(36169,37046,36072,37010) +(44775,32394,44763,32357) +(30685,36871,30662,36792) +(21783,47642,21714,47630) +(34847,27467,34761,27372) +(43925,49912,43888,49878) +(16455,27861,16364,27813) +(38406,18310,38329,18309) +(5408,9461,5319,9426) +(41856,36900,41784,36854) +(23723,4460,23646,4448) +(18454,40138,18430,40046) +(17505,36822,17418,36763) +(36686,33534,36641,33476) +(11347,9454,11289,9436) +\N +(27816,34752,27745,34736) +(44213,8559,44162,8461) +(45359,26789,45315,26776) +(31249,19475,31224,19421) +(25917,44239,25819,44149) +(47313,40691,47264,40685) +(40577,33848,40513,33794) +(9606,45253,9582,45174) +(30005,24521,29910,24496) +(49332,35375,49309,35299) +\N +(12164,33871,12075,33820) +(19598,43327,19593,43314) +\N +(3818,28584,3815,28504) +\N +(35579,8611,35541,8604) +(8811,20986,8750,20954) +(16139,44777,16128,44686) +(35550,41501,35534,41458) +(43180,11927,43109,11891) +(45798,8465,45711,8460) +(18196,6886,18126,6845) +(1774,32167,1701,32073) +(7030,40790,7029,40711) +(11676,23009,11665,22915) +(33990,22561,33953,22474) +\N +(30366,9447,30284,9353) +(37626,32913,37596,32853) +(7730,42561,7665,42470) +(49347,8403,49315,8387) +(6874,3499,6812,3458) +(44189,16999,44169,16964) +(6312,30167,6231,30083) +(18932,6611,18909,6518) +(32262,13076,32223,13057) +(45989,249,45910,222) +(42710,855,42692,796) +(25562,9849,25535,9802) +(13348,46719,13260,46689) +(30022,42196,30005,42160) +\N +(22263,45954,22243,45950) +(18918,18890,18820,18795) +(31918,12003,31852,11989) +(12252,39453,12211,39398) +(40208,9789,40194,9759) +(35943,21767,35914,21693) +(18439,10706,18383,10618) +(2803,18999,2778,18925) +(14953,27444,14875,27397) +(12587,22025,12545,21928) +(33930,21090,33918,21009) +(10444,2606,10407,2553) +(28700,29782,28665,29703) +\N +(1402,13497,1397,13465) +\N +(24155,3075,24083,3062) +(38378,1864,38339,1849) +(29261,49910,29247,49818) +(38139,37073,38098,37057) +\N +(24468,41130,24418,41053) +(9989,1015,9959,939) +(47001,33561,46994,33518) +(47058,16030,46983,16012) +(35509,1814,35426,1748) +(3630,48019,3597,47923) +(47781,12986,47741,12947) +(16364,9908,16356,9882) +(17290,41508,17287,41410) +(42423,26477,42349,26434) +(10039,920,9952,833) +(16851,21338,16846,21314) +\N +(23104,7700,23062,7688) +(5619,2079,5611,2075) +(31471,49632,31375,49549) +(25793,12526,25783,12456) +(3935,29528,3866,29513) +\N +(5957,1646,5947,1595) +(2467,22376,2429,22349) +(43715,32673,43664,32595) +(6726,13093,6636,12994) +(31477,18347,31421,18299) +(34232,36635,34200,36552) +(49061,14516,49008,14442) +(43996,6129,43955,6074) +(7728,33802,7670,33703) +\N +(6131,36766,6053,36749) +(35791,16361,35696,16329) +(45759,8935,45675,8886) +(43634,2029,43537,1940) +(4916,32233,4844,32181) +(46701,23508,46623,23477) +(29590,4893,29552,4871) +(38647,4423,38574,4396) +(7593,25845,7497,25751) +(8510,43552,8432,43492) +(18791,39181,18730,39162) +(7462,2956,7454,2858) +(1394,26795,1392,26780) +(16707,21993,16609,21932) +(26838,10866,26803,10836) +(31642,29842,31585,29760) +(21891,3502,21863,3406) +(13258,587,13250,507) +(6072,47397,6021,47369) +(16605,49730,16579,49659) +(42830,40981,42791,40981) +(12975,3706,12913,3637) +(30925,21660,30826,21649) +(1455,14229,1410,14156) +\N +(17583,16486,17562,16474) +(33377,3387,33333,3381) +(784,6177,750,6095) +(22111,44110,22106,44013) +(1444,403,1346,344) +(4010,46220,3982,46212) +(17932,8150,17861,8127) +(38685,31466,38636,31416) +(14257,11549,14242,11522) +(14990,15217,14904,15211) +(21395,21533,21307,21520) +\N +(31948,33725,31885,33694) +(433,49033,390,48961) +(45205,609,45173,523) +(25065,35494,25003,35455) +(33265,6677,33224,6611) +(18179,22345,18133,22256) +(3916,13759,3820,13732) +(1696,13478,1604,13436) +(47203,25980,47130,25907) +(24913,13361,24868,13268) +(13824,40177,13792,40130) +(25671,13555,25585,13494) +\N +(20133,37769,20105,37679) +\N +(26368,16734,26288,16726) +(30545,35438,30458,35376) +(48816,22926,48812,22831) +(48807,31389,48739,31330) +(11003,10859,10950,10765) +(17288,8570,17247,8485) +(38377,31415,38331,31379) +\N +(19085,23425,19059,23326) +(40059,17068,40052,17006) +(18811,13493,18734,13394) +(36319,17197,36225,17181) +(14939,38780,14863,38714) +(49539,17656,49479,17629) +(42530,45951,42466,45854) +(27318,26654,27233,26610) +(49980,35004,49937,34963) +(18326,32558,18322,32502) +(45951,28555,45896,28481) +(12104,33531,12014,33501) +(22311,41113,22215,41066) +(25073,18721,25047,18656) +\N +(14524,13486,14510,13390) +(40040,36688,40000,36599) +(21594,11473,21563,11436) +(44031,22274,43938,22187) +(729,30683,668,30601) +(14114,20873,14102,20803) +(28239,41377,28222,41308) +(26404,11922,26317,11843) +(41660,34586,41585,34501) +\N +(21128,2384,21101,2368) +(30209,16952,30156,16858) +(39078,24963,39045,24898) +(5598,1348,5499,1294) +\N +(38474,7436,38450,7364) +(15117,45734,15024,45693) +\N +(23909,39853,23888,39780) +(24292,30183,24282,30148) +(48871,17661,48868,17637) +(918,18752,847,18708) +\N +(43615,16162,43606,16104) +(33763,47410,33751,47409) +(4798,6485,4773,6388) +\N +(18524,41539,18433,41518) +(47745,42449,47651,42364) +(38936,21237,38864,21204) +\N +(5251,3516,5194,3475) +(22269,36269,22183,36228) +(18736,40983,18685,40947) +(38393,15444,38356,15363) +(38134,29898,38103,29862) +(37789,39557,37732,39474) +(31906,23005,31838,23003) +(10647,40094,10560,40040) +(9914,41547,9867,41545) +(44221,443,44125,433) +(41479,10936,41381,10847) +(42586,6301,42563,6235) +(2504,17588,2449,17554) +(7045,18782,7028,18764) +(41840,32018,41768,31938) +(38416,17158,38330,17060) +\N +(8605,39015,8605,38933) +(5764,43548,5719,43496) +\N +(20789,29902,20696,29843) +\N +(36104,47896,36079,47816) +(31736,13834,31722,13832) +(32617,19701,32597,19684) +(1671,18997,1622,18945) +(36007,26545,36005,26535) +(31864,17494,31820,17455) +(27346,28388,27303,28289) +(8191,9653,8133,9589) +(7501,21616,7405,21536) +(35450,9580,35368,9563) +(29281,37276,29247,37255) +(6225,17192,6200,17135) +\N +(43689,8119,43670,8028) +(41917,49601,41835,49563) +(44295,13116,44205,13078) +(22721,44772,22667,44748) +(32640,11107,32636,11050) +(20639,28851,20613,28839) +\N +(32479,10159,32446,10061) +(27251,16978,27196,16959) +(41401,33148,41339,33074) +\N +(49001,8538,48989,8444) +(37958,35843,37874,35802) +(46969,41229,46903,41138) +(18541,8876,18541,8870) +(4080,31634,4061,31627) +(8097,35240,8040,35152) +(18470,21414,18463,21412) +(20914,17897,20838,17869) +(42688,11681,42666,11641) +(47525,25005,47443,24907) +(32439,14438,32397,14400) +\N +(39667,19626,39622,19542) +(1212,44525,1169,44516) +(29766,4433,29668,4401) +(25847,49657,25813,49605) +(33859,17356,33827,17263) +(28989,45953,28904,45854) +(37211,30830,37113,30819) +\N +(45220,26382,45219,26340) +(12312,43250,12234,43246) +(37775,41504,37762,41421) +(45889,33499,45822,33411) +(49461,22601,49369,22553) +(39857,33844,39816,33824) +(46102,15822,46030,15778) +(46605,31239,46598,31170) +(23925,5856,23862,5808) +(15459,4262,15407,4241) +(12019,4907,12015,4818) +(38258,17973,38229,17923) +(40575,29566,40477,29521) +\N +(29715,45919,29697,45891) +(11694,9510,11670,9490) +(7053,44257,7012,44231) +(16465,8603,16391,8505) +(29170,15592,29098,15527) +(20400,37354,20345,37328) +(5281,10265,5252,10184) +(6084,48782,6058,48727) +(11006,6889,10971,6796) +(16299,19461,16286,19411) +(13718,29192,13642,29106) +(3999,2965,3963,2903) +(18509,12235,18430,12208) +(49542,38575,49537,38534) +(15093,41715,15071,41634) +(6802,8385,6714,8300) +(15127,17507,15097,17424) +(36921,3025,36835,2995) +(32117,24327,32101,24262) +(27244,24151,27165,24104) +(36339,42360,36313,42358) +(47288,46252,47245,46184) +(37867,6649,37818,6565) +(14886,22103,14865,22089) +(39611,17952,39513,17951) +(37329,31436,37298,31436) +(5715,39115,5698,39099) +(13266,7364,13203,7296) +(16076,10945,16006,10942) +(7197,41509,7126,41413) +(14411,40868,14330,40772) +(12872,33481,12862,33454) +(17786,19616,17758,19560) +(1052,37358,996,37311) +(42825,12643,42762,12625) +(20007,49858,19921,49778) +(27155,6355,27072,6257) +(14117,40208,14022,40155) +(47280,34069,47279,34028) +(17551,15803,17482,15763) +(1725,6673,1676,6649) +(43984,31128,43961,31105) +(43772,47042,43731,47038) +(46901,47317,46817,47228) +(19877,14179,19837,14168) +(20691,19989,20675,19935) +(4011,18914,3963,18817) +(1023,23378,933,23317) +(30051,46118,29966,46039) +(43499,46488,43496,46409) +\N +(43531,2412,43447,2396) +\N +(16034,32285,15976,32220) +(12817,21365,12740,21298) +(7607,47293,7585,47293) +(32512,12218,32463,12170) +(1848,21496,1839,21439) +(17567,23073,17478,23046) +(35813,31847,35807,31792) +\N +(563,30859,540,30842) +(13145,15488,13063,15433) +(36754,37479,36731,37411) +(1125,26069,1057,25997) +(4539,20676,4519,20618) +(8476,34721,8409,34681) +(7794,25691,7727,25656) +(23842,514,23800,473) +(47678,41396,47668,41365) +(6837,25974,6799,25892) +(13355,11174,13304,11161) +\N +(37243,25548,37158,25471) +(12528,30208,12441,30205) +(14929,1672,14886,1607) +(27263,49026,27263,49010) +(15892,21645,15835,21642) +(29446,48978,29360,48967) +(41304,9892,41211,9825) +(37418,49393,37338,49296) +(41146,32178,41120,32165) +(28738,13326,28722,13266) +(14899,36595,14873,36559) +(1973,31435,1921,31426) +(19485,17742,19421,17661) +(33072,20995,32980,20903) +(47091,30055,47080,30037) +(45753,12998,45686,12992) +\N +(11528,7826,11509,7794) +(21104,13921,21060,13836) +(16768,15491,16747,15470) +(13279,20396,13249,20326) +(4342,49518,4339,49446) +(20413,15476,20349,15447) +(45532,5649,45484,5627) +(18647,27196,18619,27115) +(1326,17473,1261,17400) +(47646,19644,47588,19609) +(35088,1813,35080,1732) +(38461,34839,38410,34838) +(34358,11540,34285,11506) +\N +(26969,7078,26953,6989) +(12629,40352,12617,40264) +(33800,7037,33731,6992) +(24462,13518,24392,13486) +(33164,47357,33096,47329) +(15422,18451,15413,18376) +(19643,12916,19567,12912) +(40860,42125,40770,42050) +(49103,29614,49039,29606) +(36319,35582,36222,35528) +(8924,36083,8873,36018) +(49603,44022,49505,44021) +(7783,40633,7702,40618) +(25388,49107,25346,49042) +(28375,38947,28306,38919) +(47324,22672,47321,22660) +(2287,8808,2266,8719) +(44343,16339,44248,16318) +(2374,28839,2336,28798) +(22913,40710,22819,40688) +\N +(47747,684,47658,627) +(16043,46011,16021,45984) +(34958,32168,34903,32092) +(4840,49328,4752,49258) +(24341,2087,24330,2009) +(18378,19374,18327,19358) +(48165,7217,48156,7141) +(14232,6044,14182,6004) +(23080,4196,22983,4191) +(259,1850,175,1820) +(270,29508,264,29440) +(45088,11375,45050,11295) +(29666,39386,29656,39302) +(8712,8782,8660,8713) +(15900,6650,15855,6561) +(28946,28348,28917,28347) +(32544,25845,32538,25779) +(44047,6957,43951,6942) +(36465,588,36382,503) +\N +(28167,26679,28150,26673) +(16065,4268,15975,4180) +(12950,23494,12893,23494) +(30145,24679,30056,24654) +(3027,16162,3001,16071) +(8259,34537,8202,34484) +(41447,1515,41427,1454) +(18407,28362,18309,28303) +(21393,41872,21328,41816) +(46040,26497,45996,26408) +\N +(49944,25163,49902,25153) +\N +(16195,11843,16159,11831) +(44257,15270,44254,15214) +(49760,4791,49699,4713) +(22558,33709,22519,33681) +(28375,10003,28336,9938) +(18179,24310,18106,24256) +(707,30688,664,30669) +(5851,26118,5822,26037) +(4266,1292,4221,1217) +(16516,11331,16432,11248) +(32374,38277,32313,38245) +(21939,8015,21927,7952) +(34322,32051,34242,32003) +(6262,35977,6260,35953) +(16717,38594,16622,38498) +(14564,3433,14535,3425) +(21078,1000,20994,974) +(28584,956,28575,868) +(5538,9962,5465,9870) +(34183,44102,34175,44085) +\N +(42507,10289,42441,10288) +(12671,19936,12594,19920) +(24835,12179,24770,12173) +(15664,11538,15598,11494) +(28892,24446,28821,24350) +(41654,26720,41570,26632) +(36583,387,36503,357) +(10842,34824,10795,34788) +(11518,42588,11429,42565) +(12577,40322,12486,40266) +(2453,4045,2439,3956) +(31837,33705,31803,33681) +(24403,27711,24383,27705) +(4431,2748,4337,2656) +\N +(3036,2887,3014,2826) +(37664,16118,37615,16022) +(8606,18063,8587,18038) +(24738,25458,24656,25362) +(45756,34022,45671,33948) +(34079,15236,33981,15171) +(9251,22488,9228,22470) +(25136,2809,25126,2717) +(5548,47695,5543,47685) +(13765,40800,13707,40754) +(25216,30678,25144,30677) +(22441,17169,22392,17106) +(1091,4770,1054,4734) +(36311,50073,36258,49987) +(22461,33163,22457,33128) +(35873,28907,35845,28867) +(42907,15848,42904,15785) +(6549,24897,6540,24861) +(21928,37764,21891,37681) +(21237,41132,21139,41086) +(12207,24266,12173,24235) +(40643,49770,40574,49687) +(32833,35686,32815,35674) +\N +(14545,18143,14541,18098) +(33892,42783,33884,42707) +(33933,8381,33921,8369) +(12450,19044,12403,19002) +(10176,45158,10088,45145) +(35828,12080,35732,12022) +(28102,13694,28061,13666) +(49432,31744,49340,31711) +(16192,37743,16162,37697) +(46830,867,46756,790) +(9200,28048,9159,27986) +(13397,19369,13340,19288) +(30879,43562,30785,43545) +(21995,48224,21920,48143) +\N +(11871,47569,11809,47568) +(29366,22196,29280,22154) +(26243,28176,26203,28116) +(28995,35031,28906,35014) +(29384,39276,29352,39183) +(8497,13798,8471,13789) +(7412,27226,7334,27220) +(25403,47678,25363,47654) +(11599,5556,11574,5502) +(44056,5123,44008,5111) +(49603,30877,49579,30840) +(32261,45876,32206,45865) +(35104,41659,35048,41587) +\N +(5457,35844,5376,35782) +(29423,3977,29354,3959) +(18059,3001,17965,2961) +(8509,5691,8463,5620) +\N +(27118,5762,27083,5747) +(2991,48605,2939,48559) +(44482,3484,44425,3459) +(45143,16439,45046,16365) +(2236,37531,2147,37530) +(41561,3217,41490,3210) +\N +(6270,27200,6171,27166) +(49195,24871,49138,24798) +\N +(46985,38881,46897,38845) +(37486,23522,37404,23441) +(26907,14490,26900,14391) +(30829,16111,30756,16056) +(3644,17291,3587,17262) +(20508,49775,20472,49680) +\N +(43279,8972,43198,8936) +(33744,7470,33734,7439) +(46303,20538,46284,20498) +(10365,48246,10291,48154) +(12636,24987,12545,24933) +(40998,46992,40989,46916) +(30536,6073,30531,6018) +(22102,9643,22051,9594) +(18616,34348,18530,34332) +(8222,8907,8123,8848) +(45698,28860,45698,28770) +(26958,1748,26924,1726) +\N +(26735,35073,26659,35025) +(48370,40813,48293,40737) +(13140,993,13108,934) +(10588,22893,10528,22883) +(23645,40789,23567,40698) +(49548,12374,49546,12329) +(41135,39626,41100,39602) +(41374,10856,41328,10769) +(12234,5765,12146,5674) +(12832,46941,12764,46917) +(47886,34532,47851,34500) +(23777,10549,23735,10495) +(1291,16913,1194,16873) +\N +(29239,30554,29202,30500) +\N +(36485,30007,36454,29924) +(7067,11320,7045,11229) +(16939,30482,16904,30462) +(27423,34386,27379,34303) +(35170,32021,35155,31979) +(42570,36477,42474,36457) +(19695,679,19682,594) +(47537,39450,47446,39450) +(19410,22942,19375,22922) +(34216,40166,34152,40158) +(37000,24351,36972,24299) +(24989,1681,24954,1672) +(54,38679,3,38602) +(41461,40693,41411,40599) +(7576,46054,7545,45963) +(35505,28262,35413,28222) +(1158,16976,1145,16927) +(23494,42291,23437,42229) +(32894,32519,32880,32485) +(604,13413,509,13401) +(18396,19712,18355,19646) +\N +(26657,28234,26597,28191) +(24240,47211,24154,47191) +(41778,10741,41766,10730) +(44022,43776,44010,43677) +(35967,30055,35906,29969) +(28878,18042,28806,18027) +(31507,27302,31428,27267) +(13267,21935,13265,21872) +(122,46832,64,46762) +(10348,45916,10306,45844) +(22962,12644,22927,12607) +(6320,22290,6284,22247) +(2297,11372,2216,11298) +(29366,36660,29325,36654) +(13962,39307,13921,39220) +(11094,19151,11092,19143) +(32289,23776,32258,23760) +\N +(36044,17356,35956,17273) +(46304,38692,46232,38675) +(10934,42999,10922,42909) +(4271,21177,4207,21093) +(7837,19926,7747,19905) +(25537,36605,25477,36584) +(22161,14999,22079,14962) +(5127,31243,5074,31213) +\N +(14904,40664,14838,40593) +(29308,8480,29268,8438) +(17731,7410,17699,7352) +(44840,29293,44797,29248) +(15523,31519,15505,31485) +(34429,38479,34421,38478) +(3530,23456,3440,23390) +(4699,6889,4603,6796) +(47405,48524,47389,48514) +\N +(23357,43160,23305,43156) +(16923,1995,16860,1937) +(47592,33853,47537,33758) +(31624,37490,31595,37473) +(42321,13380,42303,13337) +(3088,16094,3079,16060) +(22884,2955,22856,2857) +(17784,23073,17724,23044) +(32638,45577,32553,45512) +(13876,44091,13801,44000) +(27844,24384,27758,24330) +(28178,10225,28155,10167) +(39910,14277,39857,14241) +(30372,19524,30301,19514) +(38732,43151,38724,43151) +(32628,2068,32547,2068) +(13950,28652,13932,28566) +(38996,41070,38919,40993) +(31759,45246,31676,45215) +\N +(5424,34145,5382,34106) +(14727,45600,14699,45547) +\N +(31429,21537,31414,21499) +(14740,3420,14650,3323) +(21793,39498,21743,39471) +(18102,25924,18037,25868) +(33299,683,33213,594) +(45882,48765,45809,48721) +(49215,4098,49180,4067) +(49698,33743,49614,33663) +(21532,5215,21514,5151) +(24840,26877,24826,26808) +(32680,28433,32631,28364) +(20661,27511,20584,27414) +(28048,30385,28009,30315) +(45403,42533,45389,42464) +(46531,36947,46531,36850) +(36943,32817,36865,32737) +\N +(37984,43763,37888,43748) +(20593,10650,20557,10610) +(5387,40595,5326,40585) +(34412,10600,34352,10539) +(7237,47546,7206,47451) +(39931,26644,39915,26598) +(29843,4734,29800,4669) +(37503,8867,37406,8821) +(2583,2373,2570,2294) +(29275,46433,29256,46350) +(3332,45620,3287,45581) +(22472,39287,22472,39257) +(36786,18907,36708,18884) +(45503,28576,45482,28494) +(33262,28386,33163,28365) +(3606,49757,3538,49697) +(2082,49380,1991,49281) +(12065,3734,11983,3663) +(15606,9048,15596,9028) +(14687,19309,14637,19263) +(4568,15461,4499,15428) +\N +(43938,7429,43923,7391) +\N +(2168,50012,2108,49914) +(16022,8934,15963,8928) +(24567,39147,24561,39102) +\N +(42781,14149,42765,14088) +(39501,21084,39468,21078) +(6697,29628,6693,29584) +(11441,16164,11364,16125) +(39946,1920,39868,1844) +\N +(18138,45512,18111,45438) +\N +(20799,41217,20718,41138) +(30264,16697,30240,16639) +\N +(30746,50040,30727,49992) +(37429,43273,37423,43205) +(22854,28863,22789,28810) +(11380,48298,11287,48242) +(16471,37273,16439,37223) +(32737,39842,32661,39811) +(30959,3447,30949,3357) +(36396,13263,36348,13187) +(29607,14625,29531,14619) +(7851,43399,7824,43334) +(38515,14575,38496,14492) +(29125,3289,29086,3264) +(6866,10476,6839,10424) +(318,31489,235,31404) +(1140,7007,1113,6945) +(36574,9291,36484,9275) +\N +(40320,40937,40246,40866) +(588,25849,552,25801) +(6728,42539,6645,42507) +(12180,6185,12123,6123) +(32913,44123,32899,44037) +(25464,16803,25441,16749) +(23711,5829,23695,5750) +(31424,34930,31377,34906) +(42171,8298,42124,8222) +(451,31104,375,31083) +(39996,3278,39943,3260) +(25816,40396,25735,40362) +(34471,28587,34399,28547) +(45344,21540,45297,21496) +(27269,16787,27246,16763) +(18070,4469,18022,4423) +\N +(12668,16367,12645,16295) +(13823,17276,13730,17251) +(20555,45544,20511,45498) +(35893,42189,35861,42177) +(37081,45730,37076,45705) +(17270,15651,17201,15552) +(48690,46034,48667,45945) +(456,16088,368,16023) +(48707,12416,48670,12363) +(29692,11509,29614,11483) +(7005,3668,6981,3574) +(12162,389,12103,309) +(12371,24983,12366,24964) +(6886,48414,6868,48327) +(10653,26234,10624,26142) +(8526,48205,8517,48117) +(10521,31892,10480,31798) +(43353,1086,43281,1071) +(21007,35650,20998,35649) +(2343,4396,2310,4320) +(29379,12895,29284,12891) +(27662,17407,27570,17313) +(9845,29346,9807,29321) +(43855,38669,43790,38599) +\N +(20461,44189,20397,44158) +(11627,17368,11581,17289) +(2971,38855,2938,38807) +(43204,47082,43128,47018) +(9930,46902,9909,46871) +(30561,48461,30536,48365) +(44059,7591,44038,7563) +(46260,16898,46162,16886) +(27491,2891,27396,2814) +(36512,26034,36455,25941) +(31193,20022,31100,19942) +(17057,13643,16960,13621) +(26897,3399,26844,3318) +(1760,5504,1683,5431) +(29347,5511,29346,5450) +(38761,42083,38688,41999) +(11226,4089,11165,4068) +(46427,42983,46361,42970) +(12958,30737,12912,30712) +(44432,46521,44333,46443) +(16124,2948,16113,2852) +\N +(24704,25422,24635,25340) +(30833,46152,30790,46122) +(4487,37006,4473,36968) +(41047,23376,41036,23327) +(16312,49392,16298,49330) +(30081,14687,30042,14660) +(11160,13954,11103,13938) +(33207,23246,33143,23168) +(14872,7635,14860,7585) +(20139,23987,20059,23955) +(10946,49757,10923,49746) +(39438,36158,39426,36134) +(35502,2385,35464,2327) +(17073,42173,16987,42130) +(6079,17258,6068,17195) +(40458,15752,40364,15728) +(23340,7879,23313,7806) +\N +(31819,15096,31762,15059) +(31159,40864,31158,40780) +(26975,32144,26915,32113) +(34530,10378,34440,10298) +(18855,49577,18780,49528) +(16787,16625,16723,16586) +(32330,26538,32314,26458) +(34270,28674,34265,28595) +(10022,16026,10006,15962) +(23143,1479,23095,1469) +(33676,4483,33583,4408) +(31066,22074,31059,22035) +(21603,47121,21563,47082) +(30051,4244,30021,4157) +(30634,39478,30615,39446) +(34404,48724,34393,48724) +(31103,21414,31039,21380) +(22945,47397,22849,47313) +(18133,32025,18073,31941) +(4053,25759,3977,25667) +(39185,39091,39102,39068) +(43287,7407,43225,7314) +(13137,31188,13112,31182) +(46264,1438,46258,1389) +(22804,43892,22769,43822) +(7542,1044,7487,983) +(33022,8321,32925,8267) +(384,39161,286,39073) +(28205,24401,28142,24382) +(31708,39086,31696,39026) +(36626,15708,36560,15690) +(17099,16924,17079,16924) +(10817,6989,10747,6955) +(24338,19293,24291,19277) +(27566,17576,27544,17545) +(23041,38384,22970,38320) +\N +(12786,8485,12702,8435) +(13876,49473,13813,49448) +(31585,46998,31490,46929) +\N +(30227,8768,30206,8715) +(32062,39306,32023,39292) +(25003,35753,24921,35687) +(3281,6758,3232,6704) +\N +(11395,30299,11376,30220) +(5088,15275,5007,15203) +(31100,39538,31003,39444) +(2741,17877,2726,17793) +(42897,48620,42860,48537) +(4230,15778,4181,15776) +(17835,27530,17815,27431) +(34189,10933,34135,10921) +(7537,39974,7494,39973) +(21554,3507,21528,3476) +(9350,32326,9273,32275) +(16455,8874,16420,8793) +\N +(7346,34235,7330,34224) +(16417,48134,16352,48066) +\N +(41916,4971,41849,4886) +(15856,1522,15807,1521) +(41549,40218,41494,40144) +\N +(9978,16226,9972,16181) +(14856,13312,14808,13283) +(38490,41641,38428,41583) +(25828,7438,25807,7378) +(21876,30633,21796,30587) +(1908,14279,1825,14247) +\N +(32207,10251,32121,10184) +(370,9493,328,9441) +(42072,17634,41974,17600) +\N +(47298,9910,47235,9846) +(17856,11266,17782,11225) +(35009,21400,34956,21396) +(18337,11145,18335,11133) +\N +(25425,9139,25381,9085) +(35642,27783,35621,27782) +(3629,33164,3575,33163) +(17151,41255,17115,41204) +(17417,5835,17402,5751) +(33407,14226,33329,14141) +(1930,29955,1889,29931) +(41101,10942,41065,10844) +(36333,27288,36281,27233) +(21423,36868,21367,36825) +(36385,19566,36341,19510) +(27073,38301,27066,38232) +(43989,34187,43984,34174) +(48366,7488,48316,7483) +(37497,36075,37415,36043) +(46917,9891,46887,9870) +(37179,657,37103,634) +(3877,44736,3811,44684) +(30556,2975,30547,2962) +(7629,11447,7547,11416) +(45687,48147,45591,48088) +(5635,7184,5571,7146) +(9611,47327,9541,47246) +(7119,48224,7117,48152) +(15233,26480,15138,26430) +(37468,1526,37466,1513) +\N +(20855,2786,20828,2711) +(30538,44084,30480,44061) +(42231,41527,42149,41454) +(14963,13239,14952,13146) +(26819,43996,26745,43934) +(42172,35953,42086,35928) +(28785,12611,28710,12534) +(14089,1704,14047,1629) +(4343,26242,4341,26169) +(20327,42244,20231,42212) +(33671,12700,33666,12630) +(42144,32642,42128,32569) +(26590,19483,26503,19442) +(21741,46259,21723,46226) +(8822,34700,8760,34693) +\N +(2710,33521,2675,33505) +(26067,19998,26026,19989) +(12244,34509,12202,34489) +\N +(47162,598,47119,499) +(33093,49382,33068,49359) +(35170,26340,35153,26264) +(22552,35785,22490,35735) +(36791,23032,36781,22976) +(22857,10857,22833,10797) +\N +(47207,37405,47138,37365) +(21867,2836,21854,2811) +(3387,31487,3311,31456) +(47174,48121,47167,48101) +(24415,22232,24366,22224) +(7970,29251,7959,29211) +(18635,31294,18539,31221) +(8403,13380,8370,13372) +(738,18097,737,18054) +(37238,19195,37218,19114) +(582,47934,570,47897) +(12359,4635,12350,4619) +(43272,2013,43195,1958) +(47568,27149,47521,27088) +(24695,12827,24661,12796) +(26259,14077,26168,14019) +\N +(48478,36135,48425,36092) +(5230,39250,5206,39174) +(3488,18562,3423,18489) +(39502,16331,39460,16275) +(18296,1478,18233,1471) +\N +(28627,12430,28559,12410) +(25257,21981,25206,21954) +\N +(2410,41192,2325,41142) +(43681,9631,43587,9538) +\N +(15086,45309,15064,45270) +(13824,40807,13759,40787) +(7090,2207,7062,2159) +(3685,2480,3630,2391) +(14810,38335,14801,38275) +(26668,38018,26581,38012) +(45562,1517,45506,1424) +(11001,32481,10962,32402) +(27743,25245,27673,25161) +(15952,10598,15948,10535) +(12705,13308,12694,13232) +(31992,21195,31975,21118) +(25834,16652,25745,16626) +(21022,43625,20990,43576) +(45094,27254,45000,27240) +(9688,42601,9643,42533) +(17746,24659,17694,24616) +(1509,38859,1503,38809) +(2067,20438,2041,20369) +(7885,44528,7839,44444) +(27432,33052,27422,32987) +(26577,17157,26563,17142) +(10815,35985,10734,35908) +(44891,24067,44794,23979) +(48626,1900,48595,1850) +\N +(40659,35541,40659,35489) +(22231,26628,22210,26579) +(37408,23016,37375,22919) +(5920,15916,5906,15895) +\N +(33125,9952,33037,9880) +(12142,29705,12141,29670) +(3672,20995,3649,20899) +(39147,31967,39101,31907) +\N +(33812,48458,33748,48399) +(25038,14639,24978,14586) +(3859,16010,3857,15994) +(31926,39496,31889,39417) +(49300,28064,49297,28026) +(24121,38305,24048,38256) +(9252,4205,9155,4149) +(36124,30451,36056,30395) +(28809,49557,28794,49533) +(30500,44504,30471,44476) +(26866,42395,26822,42332) +(48195,1784,48101,1734) +(46201,14109,46112,14097) +\N +(2415,9975,2354,9914) +(30485,9581,30415,9558) +(6385,36838,6305,36838) +(2799,11189,2723,11095) +(21998,20503,21923,20406) +(29151,10714,29090,10671) +(28850,29276,28757,29207) +(43386,48845,43305,48834) +(25173,8310,25101,8294) +(34244,32352,34204,32342) +(35595,23728,35533,23672) +(1122,13581,1119,13538) +\N +(388,21716,296,21678) +(48782,11064,48701,11005) +(40293,12997,40213,12927) +\N +(28194,46428,28113,46414) +(4791,18118,4708,18105) +(471,29808,448,29775) +(3536,37803,3447,37737) +(1336,28416,1275,28392) +(16484,48478,16422,48454) +(25846,19320,25811,19296) +(48669,27703,48575,27615) +(24032,44217,24029,44127) +(12236,5019,12233,4986) +(1179,29838,1113,29778) +(33893,22049,33867,21955) +(16718,19462,16700,19440) +(17992,49438,17894,49433) +(35163,39941,35081,39885) +(33897,8362,33853,8328) +(2480,6640,2456,6599) +(28011,19729,27937,19679) +(15819,41516,15809,41440) +(29818,9136,29747,9089) +(28551,37016,28529,36941) +(36406,26879,36374,26872) +(16821,48925,16758,48914) +(23692,48163,23595,48160) +\N +(4803,10619,4759,10522) +(46600,33581,46553,33518) +(41349,11767,41310,11710) +(20856,29642,20799,29562) +(16559,46161,16504,46131) +(23041,1300,23003,1287) +(16630,44902,16554,44853) +(43065,14299,43013,14274) +(24818,22397,24796,22348) +(22282,24949,22218,24921) +(36668,28538,36631,28456) +(8080,1220,8018,1146) +(47282,34302,47277,34269) +(35603,33558,35557,33495) +(44764,32189,44700,32175) +\N +(46488,23965,46449,23868) +(46314,15047,46216,15013) +(6348,25381,6286,25363) +(3871,49288,3819,49251) +(462,38894,398,38867) +(23196,29214,23136,29169) +(29024,9775,29016,9759) +(42016,18555,41934,18472) +(8772,45981,8692,45973) +(11028,1351,10986,1278) +(26684,21668,26641,21656) +\N +(37262,26005,37260,25947) +(14899,44069,14814,44066) +\N +(39635,18701,39587,18698) +(28528,22948,28457,22857) +(7755,36528,7681,36454) +(32461,1172,32427,1106) +\N +(18775,27359,18736,27329) +(15379,20031,15337,19934) +(45888,33592,45881,33544) +(44013,24694,43962,24645) +\N +(43347,10699,43343,10699) +(49999,27218,49908,27176) +(13698,17326,13630,17317) +(34850,44313,34775,44302) +(38076,49235,37983,49214) +(35570,40218,35500,40136) +(40062,28973,40032,28878) +(3567,39847,3523,39781) +(498,2442,480,2401) +(29660,43620,29577,43561) +(10946,47356,10878,47351) +(8073,44233,8005,44144) +(9720,13473,9710,13462) +(3643,38014,3598,37932) +(16887,1408,16810,1375) +(7559,27914,7508,27874) +(30356,18573,30275,18569) +(12193,48176,12130,48116) +(11884,7756,11819,7731) +(18293,33272,18227,33234) +(46697,47874,46696,47828) +(35788,32517,35760,32446) +(33877,36987,33821,36958) +(31253,22819,31184,22808) +(7744,23115,7729,23103) +(21291,39817,21219,39778) +(13877,43379,13861,43290) +(42955,1406,42876,1382) +(49232,15950,49210,15880) +(48419,32001,48326,31902) +(18940,43246,18860,43150) +(32317,38240,32310,38201) +(11307,48298,11304,48222) +(38015,18190,38000,18176) +(27821,1177,27818,1131) +(18935,26757,18865,26682) +(42659,48284,42562,48244) +(30185,23350,30146,23291) +\N +(16496,11970,16441,11919) +(162,26040,120,25963) +(24238,47784,24185,47746) +(32326,8612,32274,8568) +(26141,13423,26051,13407) +(40132,22815,40089,22812) +(21151,48794,21056,48740) +\N +(22044,28358,22031,28334) +(6680,14746,6605,14669) +(40686,25139,40632,25070) +(22823,27549,22816,27507) +(2513,22841,2427,22811) +(36316,27787,36218,27728) +(554,35489,540,35441) +(536,30674,534,30609) +\N +(25385,38468,25295,38416) +(19467,47386,19437,47317) +(22425,38591,22387,38536) +(32493,17321,32396,17298) +(40115,47315,40109,47235) +(25002,2107,24963,2104) +(3901,9790,3898,9706) +\N +(40316,1721,40315,1658) +(40089,3454,40074,3443) +(793,17897,761,17897) +(6490,43552,6434,43522) +(10825,487,10820,405) +(47703,36067,47641,36011) +\N +(4480,11671,4468,11653) +(37713,10642,37711,10615) +(12315,5302,12273,5203) +\N +(8709,6617,8647,6557) +(24467,30535,24455,30494) +(40440,32757,40369,32668) +(49449,42447,49426,42428) +(44867,11197,44792,11137) +(39173,33241,39143,33187) +(43836,2212,43803,2184) +(23819,47613,23739,47575) +(20583,2134,20485,2042) +(48922,6169,48889,6111) +(5230,44613,5131,44604) +(37060,8051,37032,7975) +(19148,36711,19112,36704) +(36305,4216,36243,4118) +(6329,39089,6302,39047) +(36703,26367,36623,26307) +(44753,19721,44701,19631) +(42094,43310,42094,43285) +(4276,22377,4241,22352) +(30329,18906,30327,18815) +(21970,19605,21871,19590) +(23722,41924,23709,41861) +(30965,39775,30908,39692) +(32394,37895,32351,37890) +(23968,42162,23873,42095) +(1776,2621,1732,2548) +(24951,47758,24900,47679) +(32917,35771,32847,35753) +(5428,27773,5343,27769) +\N +(19650,142,19630,51) +(39769,17276,39743,17229) +(5171,24562,5119,24470) +(32976,35249,32917,35199) +\N +(4174,24603,4099,24504) +(38565,36960,38535,36926) +(39084,4328,39031,4301) +(32153,38043,32070,37990) +(38085,30640,38041,30603) +(14269,18426,14185,18422) +(42941,30850,42892,30788) +(32403,25999,32339,25960) +(16906,191,16816,139) +(3456,48722,3418,48721) +(3050,18287,3022,18243) +(6331,8439,6234,8364) +(5331,20797,5319,20793) +(39225,37408,39216,37348) +(34510,19838,34488,19810) +(45789,33873,45770,33786) +(369,1457,278,1409) +(16531,43785,16482,43729) +(11974,14789,11973,14730) +(23128,6811,23094,6798) +(43962,33659,43944,33599) +(20967,3115,20947,3079) +(39257,38606,39241,38595) +(22431,8246,22381,8235) +(26007,14672,25996,14593) +(24762,4261,24675,4261) +(35402,32077,35343,31988) +(5141,16476,5139,16393) +(16439,17564,16344,17472) +(36983,46663,36903,46567) +(35170,14144,35162,14048) +(22290,7841,22283,7810) +(22414,38398,22404,38319) +(9011,18177,8932,18150) +\N +(154,4019,138,3990) +(20447,4998,20383,4970) +(38867,35757,38795,35659) +(32322,15845,32227,15804) +\N +(29889,12142,29852,12055) +(36235,36918,36217,36897) +(41620,6581,41568,6581) +(24758,38504,24731,38483) +(42524,12904,42473,12895) +(17954,49975,17865,49915) +(1938,39019,1927,39013) +(4864,33279,4817,33258) +(45373,41967,45313,41885) +(28786,19028,28782,18978) +(41913,44950,41911,44908) +(33408,14698,33392,14681) +(27602,3460,27576,3419) +(3336,3728,3334,3715) +(9099,910,9080,813) +(34141,6403,34071,6367) +(48270,17216,48252,17130) +(2549,16546,2461,16474) +(27802,33669,27735,33642) +(48419,1682,48323,1583) +(5094,41211,5002,41123) +(11192,6217,11190,6146) +(6979,18503,6959,18421) +(41210,48187,41140,48143) +(15303,29527,15273,29441) +(12326,45572,12267,45570) +(29293,5861,29212,5826) +(23847,37241,23761,37178) +(44656,23926,44653,23831) +(30043,16194,29977,16105) +(902,9358,879,9339) +(23850,46501,23834,46494) +(42333,13300,42287,13246) +(25226,18086,25169,18005) +(40252,12082,40183,12038) +(49275,18076,49216,18055) +(8255,28878,8238,28862) +(11325,41286,11320,41235) +(16948,18588,16926,18528) +(31394,1099,31374,1038) +(30705,35772,30637,35766) +(3858,39131,3771,39125) +(17565,24892,17515,24808) +(9221,49715,9216,49661) +(44945,25769,44875,25722) +(33408,13563,33310,13527) +(48505,4407,48408,4373) +(21859,37217,21763,37217) +(39393,14422,39335,14364) +\N +(19905,1154,19841,1098) +(25946,10388,25906,10366) +(10104,13748,10027,13746) +(5822,24629,5820,24599) +(38194,11287,38127,11252) +(15694,46757,15625,46716) +(326,18837,285,18817) +(49611,47078,49533,47052) +(48233,18850,48150,18842) +\N +(29239,9962,29208,9875) +(40062,44554,39973,44460) +(19135,20729,19059,20643) +(31969,40664,31896,40643) +\N +(3725,9191,3711,9095) +(44280,40158,44264,40108) +(37236,42756,37160,42694) +(27958,19055,27888,18959) +(45270,17661,45187,17601) +(12115,39546,12061,39525) +(10227,32295,10168,32231) +(39264,31123,39226,31085) +(6566,40000,6532,39904) +(30058,6975,30012,6903) +(49631,6909,49597,6823) +(42168,10926,42134,10905) +(44892,30042,44858,29970) +(19540,19803,19495,19788) +(18403,25454,18371,25404) +(22929,26795,22841,26722) +(16648,30213,16626,30174) +(3440,7495,3429,7468) +(30708,49028,30643,48998) +(26258,14164,26255,14151) +(44206,31653,44121,31637) +(1510,15179,1426,15130) +(6986,30496,6887,30416) +(7192,43403,7138,43339) +(39921,22071,39866,21976) +(45870,17011,45796,16919) +(15939,9563,15917,9539) +(23728,24737,23691,24725) +(6444,40416,6363,40375) +(21899,23861,21857,23765) +(20610,36765,20533,36742) +(46520,33082,46433,32983) +(21406,20902,21311,20895) +\N +(37913,42300,37814,42269) +(18216,8177,18161,8173) +(32967,8258,32899,8244) +(14978,40230,14971,40149) +(30343,39152,30266,39101) +(25917,5835,25843,5806) +\N +(5169,45366,5141,45314) +\N +(16221,20898,16209,20875) +(13151,19869,13145,19811) +(44399,2801,44337,2713) +\N +(10959,48311,10957,48230) +(4794,11711,4732,11661) +(764,10149,762,10091) +(15985,46067,15898,46028) +(41434,22870,41342,22867) +(43769,23796,43743,23756) +(10017,18440,9919,18384) +(21141,43119,21097,43112) +(7782,13424,7694,13398) +(25088,36224,25059,36150) +(46325,48722,46241,48631) +\N +(11042,33125,11011,33071) +(22347,13460,22290,13375) +(3508,20538,3483,20536) +(5331,42945,5272,42875) +\N +(2368,15537,2339,15503) +(45314,31830,45254,31817) +(34358,2649,34319,2589) +\N +(17576,30407,17572,30323) +(29836,41324,29746,41287) +(21036,39996,21014,39899) +(26886,6460,26787,6400) +(15709,5625,15627,5558) +(37415,15979,37414,15911) +(47761,16860,47728,16813) +(35814,48252,35755,48173) +\N +(28559,20810,28496,20715) +(12034,11921,12002,11905) +(1818,27450,1805,27406) +(33810,45499,33806,45413) +(17376,18175,17323,18138) +(34106,28135,34049,28106) +(44947,23165,44919,23091) +(37670,41904,37616,41840) +(12614,15027,12555,14969) +(43301,75,43227,43) +\N +(27526,15096,27450,15088) +(26947,33409,26853,33333) +(1537,43572,1471,43499) +\N +(21607,35452,21605,35375) +(24869,46565,24818,46531) +(4774,30335,4723,30257) +(11615,18316,11579,18310) +(18444,15819,18354,15763) +(47267,22574,47203,22518) +(22287,49538,22203,49511) +(43010,16270,43010,16202) +\N +(1623,8350,1578,8254) +(21220,43808,21137,43748) +(40397,16471,40358,16434) +\N +(34839,1377,34744,1327) +(17096,5730,17090,5637) +\N +(28156,37782,28155,37723) +(3672,5686,3586,5638) +(21856,48656,21840,48638) +(6907,7791,6892,7761) +(17952,21370,17862,21350) +(37793,13461,37784,13381) +(14740,49655,14709,49604) +(21690,6337,21593,6289) +\N +(10423,33548,10364,33498) +\N +(39187,23274,39136,23197) +\N +(21882,37247,21835,37167) +\N +(11343,16957,11281,16914) +(38279,43400,38264,43352) +(23167,30271,23086,30224) +(46278,6037,46180,5964) +(28626,31165,28605,31095) +\N +(31018,367,30946,333) +(23541,12541,23530,12523) +(49741,14535,49691,14511) +(31444,12702,31425,12612) +\N +(22406,26536,22316,26534) +(6807,9761,6758,9723) +(15698,1941,15687,1848) +(49310,4625,49295,4584) +(21345,18939,21269,18887) +(31433,30493,31411,30439) +(44980,12400,44950,12372) +(25054,13949,24984,13949) +(40538,7253,40483,7212) +(16967,8627,16936,8604) +(26872,3646,26804,3594) +(24575,42883,24530,42883) +(11823,5755,11771,5721) +\N +(2553,46189,2513,46174) +(24993,14552,24898,14470) +(28453,1719,28419,1665) +(8925,22603,8878,22589) +(47635,15380,47546,15378) +(35378,18112,35324,18058) +(27347,22264,27293,22200) +\N +(44323,29044,44273,28958) +(41538,38324,41484,38290) +(19128,49932,19112,49849) +(17904,12548,17867,12503) +(35103,14426,35092,14336) +(29807,10142,29714,10052) +(44507,22903,44462,22847) +(11419,13324,11399,13251) +(8573,42221,8562,42123) +(46798,45843,46765,45765) +(12028,31783,11967,31749) +(10635,45300,10604,45251) +(9626,8248,9587,8194) +(18290,741,18246,732) +(39949,44672,39932,44641) +(7897,11692,7893,11637) +(20165,42246,20112,42168) +(4341,48390,4285,48338) +(30126,28913,30088,28869) +(40565,1733,40472,1721) +(9981,30147,9915,30133) +(47292,25511,47217,25462) +(20137,24489,20104,24392) +(2385,28283,2381,28189) +(20429,10052,20357,10009) +(8395,38568,8348,38480) +(17381,36112,17349,36038) +(37845,30953,37759,30926) +(27452,12732,27411,12652) +(38196,32186,38114,32116) +\N +(6527,49356,6508,49315) +(43891,29789,43856,29723) +(6146,37192,6085,37107) +\N +(42012,28897,41939,28808) +\N +(14909,13815,14846,13757) +(11120,24095,11035,24049) +(3132,41545,3053,41526) +(40084,40315,39994,40261) +(39671,17445,39576,17361) +(47135,35853,47085,35831) +(39297,1941,39290,1911) +(47143,35898,47072,35880) +(16017,6711,15989,6686) +(47110,30305,47087,30213) +(38102,27639,38091,27602) +(17954,22544,17863,22453) +(39891,11791,39815,11739) +(13996,20290,13922,20278) +(22284,23143,22190,23081) +(25345,24019,25313,24017) +(47134,44803,47055,44761) +(41360,16573,41326,16503) +(10464,1071,10457,998) +\N +(23515,47517,23451,47499) +(9308,8452,9238,8392) +(28695,5657,28671,5644) +(45104,9913,45077,9871) +(337,455,240,359) +(11562,45479,11472,45428) +(11952,18466,11931,18425) +\N +(35789,5154,35775,5128) +(19024,18299,18979,18230) +(43056,38113,42975,38067) +(10075,26847,10064,26806) +(3065,8107,3029,8038) +(24766,19059,24749,18985) +(14438,24805,14413,24708) +(9523,3058,9485,2998) +(24516,31262,24478,31204) +(49513,26044,49434,26035) +(14110,38528,14103,38461) +(31679,35618,31619,35618) +(10029,20258,10008,20248) +(39269,37586,39233,37539) +(12343,8197,12247,8113) +(11155,44223,11111,44134) +(25437,20606,25338,20534) +(46604,16156,46570,16131) +(4636,14004,4592,13941) +(15975,29628,15912,29556) +(49887,24274,49805,24184) +(11812,13440,11723,13418) +(21589,38179,21531,38085) +(32255,44463,32219,44454) +(15023,12698,14989,12687) +(28906,48630,28818,48568) +(28886,38905,28861,38832) +(34786,22285,34740,22240) +\N +(46513,46780,46425,46780) +\N +(26626,31759,26551,31677) +(19792,25967,19763,25933) +(20432,14394,20388,14365) +(27092,7301,27052,7278) +(22283,987,22198,928) +(6197,24363,6112,24311) +(46601,49259,46551,49231) +(12392,48052,12363,48038) +(46116,31386,46067,31356) +(7354,16855,7289,16778) +(47501,42808,47495,42761) +(16461,25487,16391,25398) +(42678,18798,42678,18756) +(9466,18207,9419,18185) +(17467,14177,17416,14097) +(28533,31886,28487,31832) +(13225,38472,13188,38395) +(5180,40970,5173,40902) +(83,10271,15,10265) +(2111,6784,2016,6690) +(41835,11064,41798,10995) +(29273,48585,29181,48536) +(29066,21615,28985,21543) +(19805,44143,19727,44128) +(48919,21468,48875,21467) +(28790,34287,28721,34251) +(10911,33074,10869,32989) +(6111,16519,6032,16489) +(43889,33838,43837,33768) +(32323,21685,32304,21644) +(9552,27819,9539,27753) +(38266,49852,38233,49844) +(37672,48362,37663,48277) +(32550,47029,32529,46931) +(46307,6620,46272,6616) +(23192,46608,23105,46566) +(30399,48330,30335,48239) +(36268,25058,36235,24984) +(19181,8120,19089,8098) +(24376,19983,24294,19925) +(18297,18375,18202,18292) +\N +(31608,6215,31575,6168) +(12788,49510,12784,49468) +(46071,13013,46035,12991) +(27647,8218,27582,8201) +(49580,11076,49537,11050) +\N +(35501,33782,35501,33687) +(19969,3148,19964,3082) +(37728,49153,37726,49152) +(5322,48440,5321,48435) +(48003,10096,47904,10005) +(39361,22318,39348,22236) +(30488,7456,30437,7430) +(18533,39476,18481,39394) +(39462,23701,39433,23604) +(26701,18300,26686,18235) +(17405,35577,17387,35517) +(33971,29928,33953,29919) +(6328,10241,6276,10217) +(32459,44259,32453,44217) +(1715,42385,1647,42357) +(48113,6960,48103,6872) +(30561,4255,30476,4240) +(38907,43619,38827,43553) +(29149,20773,29070,20698) +(17006,1543,16970,1497) +\N +(11737,18808,11714,18788) +(13019,30534,13005,30481) +(39224,31729,39191,31683) +(4942,41680,4907,41596) +(12287,37187,12188,37172) +(30758,29579,30725,29531) +\N +(16604,17963,16581,17912) +(19459,15888,19409,15812) +(34696,24783,34600,24725) +(21621,14159,21558,14110) +(12193,46149,12145,46096) +(37781,4715,37692,4635) +(41854,44125,41807,44040) +(23604,23585,23571,23533) +(7853,36967,7797,36908) +(2755,13279,2720,13206) +(4314,15424,4283,15383) +(29584,12685,29493,12594) +(25138,33726,25042,33691) +(38393,10270,38326,10185) +(4247,12615,4225,12567) +(36100,33156,36100,33107) +(20024,40796,20016,40708) +(3927,44892,3914,44843) +(10317,43168,10226,43096) +(22057,3419,22042,3334) +(37097,21814,37025,21811) +(32084,21564,31996,21491) +(34079,39921,34058,39911) +(23078,47459,23018,47373) +(38109,616,38082,568) +(11862,40382,11764,40292) +(33403,33320,33389,33289) +(36639,24829,36623,24829) +(12995,45080,12992,45040) +(16545,19981,16532,19891) +(26155,10659,26154,10634) +(24423,255,24360,213) +(823,22487,781,22442) +(12823,20064,12735,20040) +(19688,11710,19681,11654) +(2892,20452,2836,20424) +(15533,10807,15464,10711) +(46994,41143,46955,41082) +(18155,2421,18069,2392) +(2628,12688,2605,12602) +(35128,8396,35044,8365) +(44765,49615,44758,49524) +(11226,44529,11178,44515) +(31334,32463,31291,32456) +(43224,23387,43168,23364) +(30882,10414,30798,10395) +(29139,967,29139,923) +(29959,45244,29877,45223) +(19946,217,19941,118) +(49732,22033,49642,22012) +(32914,15360,32879,15290) +(47825,21097,47747,21030) +(10788,5131,10746,5086) +\N +(15497,9698,15481,9678) +(10617,47195,10601,47117) +(42392,10583,42340,10550) +(10753,33520,10669,33509) +(5553,21580,5521,21527) +(36840,12336,36817,12320) +(49785,12554,49702,12553) +(17737,38349,17639,38277) +(48000,7823,47956,7814) +(5019,3184,4931,3160) +(30120,3524,30063,3492) +(37044,2016,37001,1942) +(23496,38566,23469,38528) +(17255,48957,17200,48903) +(27815,2138,27808,2090) +(40440,11129,40368,11105) +(35305,21772,35272,21717) +(41308,45065,41229,44973) +(14893,28807,14817,28789) +(30776,45824,30731,45772) +(742,40724,652,40672) +(5985,41133,5927,41097) +(9576,10226,9540,10218) +(21407,23207,21323,23160) +(44880,34228,44877,34169) +(29146,49694,29143,49682) +(28502,34886,28471,34832) +\N +(30662,5584,30604,5528) +(12612,26081,12552,26001) +(17166,49308,17098,49270) +(9586,14116,9488,14104) +(37323,47576,37264,47482) +(48009,49713,48004,49614) +(49308,23780,49297,23760) +(8667,32342,8592,32294) +(37826,48560,37822,48485) +\N +(24493,18653,24486,18616) +(17914,3850,17887,3775) +(34270,43873,34231,43826) +(7753,44715,7660,44651) +(44328,36364,44265,36350) +(10146,3030,10111,2975) +(35273,40106,35269,40062) +\N +(38566,43846,38547,43760) +(12400,41394,12377,41378) +(45196,38286,45153,38250) +(48511,14972,48428,14883) +(25939,36328,25886,36277) +(38997,11007,38979,10917) +(30342,518,30244,453) +(6876,7468,6867,7454) +(17566,27575,17566,27480) +(18869,28538,18858,28475) +(16825,33309,16726,33255) +(14585,26111,14490,26035) +(28743,49392,28664,49349) +(26652,23359,26618,23297) +\N +(40129,33653,40102,33584) +(41074,26393,41038,26389) +(3869,33564,3869,33536) +(28455,14205,28364,14163) +(13866,45603,13770,45543) +(21666,30586,21578,30544) +(29978,11931,29893,11868) +(1594,1043,1517,971) +(948,1201,907,1156) +(27547,13692,27545,13677) +(13661,38184,13566,38154) +(2389,40026,2317,39938) +(35481,46379,35481,46320) +\N +(26917,45698,26864,45689) +(23933,41617,23909,41539) +(8912,8471,8862,8401) +(9625,4747,9558,4692) +(34743,35056,34721,34969) +(39544,21762,39475,21717) +\N +(11741,26330,11656,26293) +(39015,1315,38966,1285) +(13418,44237,13326,44202) +(2107,17672,2093,17616) +(42448,28844,42370,28764) +(49843,5175,49808,5145) +(6536,23000,6467,22958) +(11114,5822,11027,5739) +(48457,11074,48384,11024) +(12343,23110,12310,23074) +(17300,24847,17276,24825) +(8823,8253,8793,8238) +(3449,171,3354,108) +\N +(21650,23955,21605,23883) +(13260,3234,13193,3214) +(25361,10896,25305,10806) +(25051,25042,25011,25001) +(25044,25088,25015,25005) +\N +(25007,25061,25002,25013) +(25066,25105,25003,25007) +(25028,25012,25015,25011) +(25031,25057,25006,25018) +(25015,25042,25004,25012) +(25091,25049,25019,25019) +(25023,25011,25000,25004) +\N +(25053,25104,25010,25012) +(25058,25001,25018,25000) +(25059,25051,25008,25016) +(25043,25069,25007,25004) +(25006,25101,25002,25002) +(25095,25012,25014,25007) +(25054,25052,25019,25013) +(25108,25077,25009,25018) +(25007,25023,25003,25002) +\N +(25076,25098,25002,25016) +(25030,25077,25012,25006) diff --git a/contrib/pageinspect/data/test__int.data b/contrib/pageinspect/data/test__int.data new file mode 100644 index 0000000..b3903d0 --- /dev/null +++ b/contrib/pageinspect/data/test__int.data @@ -0,0 +1,7000 @@ +{18,31,54,95} +{23,50,13,9,39} +{99,54,77} +{79,83,16,63,32} +{52,41,61,79,94,87} +{76,59,39,36,21} +{} +{41,79,76,96,3} +{25,59,5,96,32} +{92,58,12,57} +{24,48,41,88} +{39,5,17} +{10,41,78,25,35} +{31,89,4} +{68,74,94} +{97,78,44,68,81,16} +{87,76} +{30,81} +{72,20,99,26} +{87,90,98,40,44} +{24,99,66,61} +{79,8,48,16} +{62,99,48,80,75,39} +{10,60,35,15} +{45,71,10,97,56} +{64,79,19,31} +{30,57,42,31,45} +{61,42,14,26} +{12,38,65,36,56,36} +{17,62,18,56} +{84,85,90,60,55,17} +{27,11,82,20,43} +{14,27,18,48,39,51} +{53,13,52} +{56,35,81,60,27} +{79,89,89,7} +{65,17,31,17,29,85} +{21,3} +{53,55,16,83,4} +{62,3,63} +{73,40,99} +{23,80} +{2,74,42,37,21} +{12,16} +{80,60} +{19,62,34} +{38,19,31,6,15,2} +{63,96,64,4,36,15} +{9,3} +{91,87,15,18,7,66} +{17,10} +{77,96} +{11,43,31,2,89} +{17,77,89,50} +{24,6,61,88,51} +{61,50,59,90,5,89} +{58,1,39,48} +{78,36,70,92} +{43,3,22,95,51} +{} +{88,64,25,64,86} +{34,6,49,90,25} +{86,35,13,22} +{21,44,83} +{42,88,72,65,59,96} +{36,33,1,98} +{16,54} +{35,16,44} +{73,23,20} +{84,25,1,52,35} +{27,36,54,87,31} +{38,47,83,3} +{64,13} +{65,84,85,16,22} +{57,9,39,73} +{89,11,67,55,73} +{78,39,84,63,62,45} +{50,63,8} +{} +{96,36,58,65,96} +{59,86,41,30} +{90,60,39,47,19} +{70,100,73,99} +{} +{85,14,39} +{76,53} +{96,38,52,13,87,85} +{97,51,15,30,53,87} +{30,59,9,40,13} +{31,91,68,79} +{37,56,39,78,75} +{82,2,47} +{33,25,45,40} +{51,21,92,20,18,76} +{84,93,36,95,34,69} +{66,25,5,40} +{77,6,57,42} +{} +{88,81,85,37,12} +{56,73,38} +{70,70,6,19} +{82,54,91} +{75,8} +{45,33,64,90,95} +{8,71,66,12} +{56,26,68,94} +{70,77,4,96,62,83} +{23,87} +{34,34,4,33} +{28,84} +{78,75,77} +{88,53} +{27,38} +{2,2,82} +{30,52,88,61,33} +{29,72,94,68} +{85,72} +{88,4} +{63,90,43,66,24,33} +{88,48,47} +{3,11,98,37,61} +{45,65,63,15,38} +{79,45,56,94} +{56,74,78,19,76} +{24,81,64,13,100} +{93,27,63,71,27,3} +{74,13,85,86,32,60} +{98,40,63,13} +{41,95,19,93,17,84} +{90,28,100,100,19,2} +{35,15,54} +{29,81,77} +{54,64,63,12,18} +{38,43,85,21,35} +{84,28,27,4,80,27} +{80,77,55,98} +{13,71,48,55,89,38} +{58,43,27,5,57} +{5,33,96,6} +{73,93,87,69,100,24} +{58,96,38,85,55,51} +{37,30,88,4,8,59} +{24,68,43,48,18,84} +{23,100,82,30,42} +{23,36,16,99,27} +{41,75} +{66,41,10,37,16,6} +{54,49,60} +{4,56,44,72,40} +{71,96,67,100,59} +{7,41} +{8,3,27} +{38,69,47,68,5,24} +{43,100,59,62} +{92,14,34,5,71,48} +{72,5,91,29,99,36} +{62,71,37,80,62,50} +{32,45,17} +{89,68} +{52,17,55} +{21,47,15,92} +{36,100,5} +{14,76,59,11,15} +{59,72} +{37,55,89,49} +{87,79,96,20,93} +{6,44} +{32,46,25} +{27,47,76,4,54} +{2,16} +{90,36} +{11,19,27,79} +{54,4} +{72,88} +{14,85,71,69,5,22} +{31,48} +{28,35,18} +{77,55,100,73,57,62} +{} +{14,59,53} +{98,3} +{13,56} +{26,61,88,54,88,33} +{70,12} +{55,16,15,42,76} +{13,75} +{97,38,82,51,86,53} +{41,76,39,84,32} +{94,66,47} +{55,28} +{} +{94,65,59,20} +{55,50,56,14,58} +{14,94,52,25,69,95} +{20,96} +{37,38} +{26,35,9,98,74} +{11,9,41,79} +{36,57,87,69,92,89} +{11,39,60,4,47,3} +{97,5} +{16,58,38,98,42} +{46,69} +{35,54} +{36,79,54} +{} +{63,78} +{12,86,52,29,60,30} +{29,27,58,86,42,62} +{42,12,60} +{90,93,85,29} +{16,8,45} +{29,33,85} +{32,14,6,47,74} +{14,85,14,26,3} +{46,71,10,16} +{30,63} +{} +{91,30,56} +{46,36,68,91,36,88} +{24,61} +{66,21,80,14} +{43,63,50,21,11} +{38,46,18,51} +{38,28,70} +{17,41,76,1,30} +{47,63} +{56,80,85,1,7,97} +{75,5,79,32} +{5,17,66,51,68} +{6,83,2} +{25,40,79,84} +{58,38,12,68} +{55,86,20,67,27} +{58,64} +{14,51} +{12,86,57,68} +{61,91,65,3,83,68} +{40,31,82,21} +\N +{24,64,35,32} +{32,83,18,27,43,32} +{50,83} +{94,84,58,3,25,79} +{66,2,27,36,24} +{71,34} +{17,57} +{22,40,49,50,10} +{79,62,94,78} +{92,79,24,72} +{23,41} +{69,60,77,70,18,48} +{39,45,91,85} +{27,43,22,21,85} +{84,51,96,7,18} +{100,38,69,93,66,39} +{73,42,35,15,69,98} +{100,17,37,15,40} +{1,91,2,17,90,48} +{18,12,52,24} +{39,43,89} +{16,13,88} +{69,8,75} +{34,91,54,81} +{37,68,89,1,56} +{81,83,39,36,14} +{12,15,2} +{14,16,88,43} +{59,12} +{1,62,21,94} +{29,43,70,52,93} +{29,36,56,78} +{91,56,86,89,53} +{14,83,39,94} +{29,58,72,4,45} +{76,56,84,28,58} +{4,52,6,88,43,17} +{21,1,35,62,77,6} +{78,74} +{1,20,93,43} +\N +{30,100,35,94,74,64} +{81,3,21,4} +{9,19,33} +{28,62,40,64,26} +{69,72,26,30,90} +{52,70,78,43} +{91,58,33,22,92,26} +{98,36,96,94,66} +{86,43,82} +{93,52,4,58,51} +\N +{49,61,80,79,90} +{50,81,72} +{57,29} +{54,31,36} +{52,31,6,48,2} +{4,51,37,83,17} +{60,20,94,82,18} +{52,64,26,81,69,61} +{39,8,22,2,8} +{31,25,95,99} +{11,72,30,95,20,28} +{78,87} +{21,40,98,41,73,33} +{67,88,42,62,11,47} +{85,1} +{4,68,100,72,24} +{82,43} +{97,55,47,52} +{51,52} +{20,21} +{69,46,34,59,54,61} +{9,31,43} +{68,20} +{73,63} +{71,12,93,8,48,10} +{44,46,42,91,21} +{98,52} +{45,60} +{95,38,30,3} +{27,77,2,46,53,18} +{99,5} +{79,33,34,48,82} +{3,29,82,72,35} +{73,75,83} +{25,43,37,26} +\N +{51,95,40} +{18,23,10,90,15,20} +{85,66} +{25,76,22,87,88,18} +{92,4} +{27,51} +{25,77,12,37} +{44,52,69,39,21,63} +{94,30,74,36} +{60,18} +{62,88,94,93,26} +{5,72,96,25} +{99,1,85,98,85,70} +{33,21,37,19} +{44,78} +{47,2,73,32,3} +{91,35,10,81} +{80,64,7,45,84} +{86,16,96,8,88} +{32,29,84,81,30,8} +{51,28,6,16} +{88,51,50,54,56,96} +{79,19,41,40} +{40,26,10,26,2} +{60,34,3,29} +{68,80,70,56} +{60,23,39} +{50,69,6,71,70,25} +{98,53,94,14,45,11} +{98,39,64,89,98,32} +\N +{45,5,15,23,41,63} +{54,31,55,58,32} +{36,56} +{38,78,65,4,75,38} +\N +{40,6,93,40,13,59} +{42,50,10,65,96} +{6,94,49} +{63,44,36,55} +{40,79} +{39,75,27} +{8,31} +{81,75} +{99,82,85,34,24,89} +{86,82,20} +{63,96} +{47,83,29} +{70,46,48} +{44,11} +{94,19,84,79,77,22} +{68,47,100,48,65,77} +\N +{76,12,86,58} +{13,14,79,61,12} +{68,65,16,93,89} +{95,18,29,89,92,43} +{19,12,50,47} +{82,93,85} +{71,40,85} +{95,96,100,86} +{2,40,71,36,25} +{11,95,25} +{79,46,41,35,39} +\N +\N +{88,29} +{54,14,94,88} +{59,67,81,41} +{46,68,78,56,47,30} +{5,76,87} +{23,89,47,46} +{47,98,14,31,1,60} +{32,14,96,61,37} +{79,66,93} +{98,1,77,44} +{21,68,2,31,17} +{94,23,15} +{48,47,57,94,49,71} +{54,3} +{99,40,81,86,81} +{85,12,98,81,5} +{60,41,21} +{38,82,55,41,96} +{11,98,12,69,93} +{11,70,66,44} +{23,92,80} +{10,8,43,97} +{17,30} +{78,56,58} +{84,87,84} +{12,32,7,58,47,48} +{29,46} +{87,34} +{59,30,72,85,71} +{67,48,83,98} +{35,10,73,71,1,77} +{21,51,16,60,64,12} +{36,61} +{54,98} +{44,74,84} +{83,14} +{71,52,48,48,15,92} +{79,78,98,35} +{52,29,47,86,96} +{10,37} +{21,25} +{57,22,28,30,97,47} +{15,28} +{88,24,98,45,65} +{78,42} +{36,70} +{40,48} +{72,3,78,69,57,33} +\N +{21,96,16,21,75,23} +{55,5,72,45} +{99,2,72,29} +{48,17} +{84,84,40,1,59} +{34,11} +{34,80,45,31} +{56,82,25,65,22,64} +{10,4,55} +{74,67,42,74,80} +{84,22,42,6,87,30} +{6,51,89,2,84,78} +{19,95,93,87,8} +{45,84,25} +{7,12,16,92} +{89,82,16} +{22,64} +{16,31,49,48,45,14} +{69,64,19,14,39,8} +{40,96,26,48,65} +{17,45,4,57} +{73,8} +{85,89,1,15,74,51} +\N +{57,89} +{25,12,55} +{39,62,35} +{85,88,71,98,83} +{64,63,75,72} +{100,40,38,1} +{2,44} +{13,46,59,43} +{87,9,93,50} +{77,7,11,30} +{61,11,18} +{19,25,68,83} +{67,25} +{54,18,85} +{96,81,38,11,3} +{87,32,47,79,62,56} +{42,49} +{41,65,24,13,79,75} +{85,32,96} +\N +{3,63,47,84,67,13} +{53,57,59,61} +{95,27,8,89,35} +{76,78,76,76,14,37} +{31,62,65} +{97,57,60,80} +{18,81,93,67} +{8,10} +{65,25} +{68,1,62,63,64,88} +{27,56,74} +{29,61,78,40} +{54,72} +{96,30,71,21,99} +{67,11,67} +{26,65,31} +{89,90,89,68} +{56,39,63,39} +{50,67} +{72,100,24,84,9} +{29,57,65,37,3} +{72,75,79,30} +{78,44,87,67} +{100,19} +{35,60,82} +{16,83,69,38} +{29,98,13,60} +{42,60,87} +{18,67,60} +{31,77,50} +{3,22,40,59,7} +{82,80} +\N +{32,92,70,30,18,35} +{48,38,92,82} +{10,92,66,59} +{4,67,42,21,71} +{27,88,20,21,9} +{46,22,27,85,36} +{42,55,36} +{24,2,96} +{96,48,40,48,52} +{15,5,90,10,68,20} +{30,2,67,92,96,63} +{16,82,87,26} +{88,98,76,29} +{29,11,94,23} +{58,20} +{52,18,55,73} +{20,81,52,19,37} +{93,21,97} +{2,77} +{46,91,80,48,71,20} +{87,7,93} +{68,77,61} +{59,33,52} +{67,62,89,2,62,90} +{30,82,72,44} +{72,18,60,38} +{11,14,59} +{74,65,54,58,67,66} +{74,56,40,73,50,66} +{42,17,56,59,53,19} +{75,25,76,9,72,50} +{14,57} +{61,47} +{90,11,72,13} +{52,27} +{80,84,53,55,98} +{16,26,55,17,79,96} +{42,73,77} +{6,84,67,54,96} +{99,48,99,63,73,77} +{5,41,72,5,88,81} +{19,20,20} +{21,89,55,44} +{82,67,11,64,61,5} +{44,34,8,62,53} +{75,53,66,36,100} +{46,65,6,70,4} +{84,10,56,35,18} +{65,60} +{88,56,27,11} +{10,9,97} +{97,49,100,100,76,32} +{2,98,57} +{47,57,84,74,79} +{80,9,24} +{96,33,86,28,19} +{43,76} +{46,14,55,92} +{60,69,66,62,22} +{45,85} +{45,9,36,13,45,1} +{24,49,8,37,66,64} +{98,53,96,47,2} +{36,44,32,4} +{77,36,78,51,63} +{82,36} +\N +{54,55,33,45,69,18} +{82,93} +{65,59,2,62,10,25} +{75,70,76,69,7,23} +{10,34,67,85} +{94,66,28,40,64,41} +{35,73,64,28,45,68} +{75,2} +{58,49,4,87,19} +{91,99,11,66,75,70} +{26,64} +\N +{13,51,18} +{39,33,21,18} +{27,50,82,2,3,71} +{51,89,44,53} +{88,91,34} +{45,96,27,12,51,52} +{31,96} +{2,9,54,89} +\N +{57,99} +{87,84,70,7,98,42} +{32,80} +{57,64,28} +{24,39,76,4,30} +{59,38,15,45,47,28} +{71,20,37,1} +{72,59} +{7,44} +{50,37,18,1,58,40} +{13,18,21,56} +{72,3,26,74,91} +{60,22,71,49} +{55,82,61,8,48,66} +{28,22,75,41,52} +{51,63,27,41,16} +{59,89,40,85,86} +{12,1} +{52,11,6} +{37,10,43,88,15,7} +{14,94,81} +{34,56,57,4} +{81,43,11,88,74,76} +\N +{67,10,50,79,70,35} +{14,51} +{49,50,23,84} +{51,41,57,100,19,14} +{31,55,40,96} +{8,42,33} +{83,34,1} +{56,80,22,93} +\N +{8,77,91} +{58,39} +{55,30,74} +{50,22,63,73} +{80,19,67,70,18} +{7,99,45,23,59,78} +{36,97,10,33,22,45} +{43,78,90} +\N +{1,68} +{63,95,54} +{5,67,61,37,89} +{32,97,2,56} +{83,31,6,80,63} +\N +{34,15,30,40,16} +{13,43,6} +{35,86,31} +{45,59,4,95,26} +{63,48,25} +{56,97,89,45,87,21} +{42,81,69} +{49,99,87} +{81,21,15,36,70,2} +{93,41,53} +{54,71,82} +{88,90,51} +{100,35,18} +{88,81} +{76,16,87,14} +{16,83,81,44} +{16,53,100,91} +{55,75,92} +{27,97,76,88,66} +{14,100,95,95} +{95,84,93,29,67} +{32,10} +{82,12,51} +{40,6,18,14,29,70} +{3,100,81} +{83,69} +{35,63,31,15} +{5,100,81,54,37,78} +{99,76,33} +{88,85,16} +{46,20,15,10,6,90} +{53,15,75,76,94} +{5,76} +{16,7,21,70} +{3,84,15} +{29,58,73,91} +{82,39,64} +{49,66,83,76} +{79,49,19,67,18,76} +{9,56,41} +{12,22,19} +{62,54} +{20,73,40} +{34,53,58,68,96} +{97,14,61,63} +{38,55,90,63} +{83,78,81,29,12,46} +{96,97,40,89,10} +{67,33,19,19,74,47} +{78,31} +{92,74,93} +{59,54,90,52,29,87} +{92,39,55,89,81,21} +{20,85,64} +{13,97} +{88,18,85,24,54,90} +{67,51,47} +{27,29,90} +{48,27,7,92} +{100,37,24,41,68,66} +{45,7,100,83,51} +{34,10} +{60,36,44} +{55,46,4} +{86,64} +{61,77,98,64} +{14,82,14,50,1} +\N +{53,31} +{64,43,35,44,98,75} +{98,15,52,58,76} +{55,94,92,40,80} +{1,14,100,42,45,74} +{13,90,84,97,18,92} +\N +{13,91} +{67,33,15} +{18,96,38} +{95,70,34,100} +{17,29,64,32} +{19,14,83,69,60,99} +{69,29,64,61,45,17} +{78,48,24} +{40,60,61,93,17} +{19,89,22,71} +{48,8,13,11,56} +{75,18,77,100} +{29,78} +{51,92,97,31} +{83,5,2,97,68,69} +{39,86,86,94,41} +{66,21,27} +{30,84,11,60} +{50,61,28,46,38,45} +{12,59,66,80,15,64} +{69,22} +{30,54,58,99} +{14,28,80,22} +{44,31,14,61,83,72} +{55,53,78,91,76,55} +{43,3,90,22,7} +{51,34,24} +{3,99,5,72,82} +{95,38,61} +{22,8} +{78,40,93,65,18,26} +{21,17,19,8,89} +\N +\N +{94,88,27} +{49,45} +{67,24,64,86,18,1} +{5,33,18,84,51} +{15,71,89,48,94,81} +{71,69} +{98,63,73,64} +{14,75,12} +{47,42,88,13} +{35,51,60} +{63,41} +{73,11,66,99,8} +\N +{2,17,6,44,97} +{95,24} +{2,13,35,21} +{76,29} +{81,37,21} +{23,63,27,53} +{70,66,58,27,4} +{69,62,22} +{62,96,44} +{68,87,99} +{51,40,81,52,93} +{81,11,45,92,22,21} +{5,39,46} +{44,7} +{14,63,62,9,12} +{9,19,90,72,51} +{70,61,24,36} +\N +{29,19,3,30} +{76,86,28,58,38} +{59,27} +{9,65,65,10,37,6} +{89,51,50,23} +{65,2} +{33,51} +{25,55,69,55,1,78} +{76,71,93,46,23} +{70,30,50,11,2,89} +{74,39} +{4,29,22,80,15,23} +{16,30,69,76,61,67} +{43,34,4,70,36} +{59,32,25,93,32,98} +{64,4} +{52,33,47} +{31,49,7,62,7,95} +{44,69,12,45,34,8} +{81,37,83,35,3} +{24,74,16,89,94,27} +{79,71,72,49,88,35} +{17,96,72,87,48} +{81,18,50} +{11,19,70} +{42,95,42,58,90} +{27,65,83,86,33} +{55,7} +{43,55,92,79} +{97,55} +{85,25} +{93,42,69,44,26,78} +{2,40,46,19,84} +{8,42,16,26,87} +{36,8,42} +{31,47,61,44,13} +{85,97,47} +{27,30,71,88,15,100} +{69,27,4,19} +{3,52,31,62,98} +{64,86} +{91,6} +{76,40} +{57,77,7,40} +{71,34,48,53,37} +{36,72} +{61,99,53,2,31,6} +{86,15} +{52,93,59,51} +{57,27,52} +{48,67,31,69} +{34,90,37,73,60,83} +{71,24,49,59} +{93,71,90} +{77,31,77} +{47,40,32,20} +{97,40,63,80,44} +{88,55,10,40} +{86,36,40,72,38,9} +{31,97} +{56,19,55,62,60} +{53,95} +{33,36} +{50,12,55,42,96,100} +{41,17,100,76} +{65,1,61,69,64,21} +{90,92} +\N +{74,42,86} +{2,4} +{99,78,5,92,1,61} +{1,69} +{80,73,60,31} +\N +{10,25,13} +{50,34,75} +{12,90,6,36,42} +{23,54,46} +{67,28,66,87} +{8,88,88,51,55,32} +{15,19,24,91,75} +{80,16,70} +{41,7,90,37} +{97,57,32,21} +{54,74,29,12,55,78} +{60,76,37,92,44,73} +{1,56,14} +{40,79} +{97,1,30,78,56} +{36,25,61} +{33,3,51,30,38} +{2,94,19,15} +{7,38,72} +{96,18,3} +{18,95,15,62,74,53} +{59,61} +{18,66,66,65,4,33} +{49,83,10} +{17,52,90,39,61,87} +{38,92,55,26} +{8,43} +{77,51,68,23,47} +{27,65,24,43,88,73} +{54,34,30,2,19,62} +{12,36,81,24,66,8} +{38,91,90,99,84} +{51,55,94,97,91,15} +{50,42,20,22} +{70,4,22} +{64,26} +{56,86,16,21,31,61} +{7,19,86,49,10,53} +{81,16,74} +{95,9,11,46,47} +{34,23,16} +{94,38,19,4,4} +{39,79} +{41,3,62} +{84,67,53,90,46} +{17,46,23} +{62,1,5,58,52,1} +{23,83,80,62,19} +{99,61,77} +{51,95,48,96,75} +{39,2,6,95,43,36} +{69,9,59} +{62,97,31} +{75,96} +{33,29,35,13,94,78} +{28,71,16,99} +{72,86,25} +{5,28,15,33} +\N +{13,13,52,20} +{58,98,83,85,81} +{13,75,42} +{7,91,3,83,82,37} +{72,91} +{10,67,61} +\N +{43,86,76} +{36,62} +{64,56} +{63,13,22,24} +{76,49,38,23,9,8} +\N +{92,58,24,19,96,90} +{24,37,76,37,1,95} +{91,9} +{46,35,48,37,91,76} +{72,21,6} +{30,80,39,90,89,18} +{83,30,67,17} +{43,36,46,43} +{4,31,34,36,33,48} +\N +{16,49} +{75,56,8,91,4} +{92,80} +{74,72,68,89,7,82} +{79,17,26} +{14,15,28,72,58} +{42,21,9} +{71,39,98,98,61} +{68,63,23,74,74,48} +{91,80,22,100,57,30} +{63,60} +{90,9,10,67,89,14} +{53,93} +{75,49,34,30,38} +{2,43} +{32,4,24,48,23,31} +{45,24,31,15,51} +{65,62,21} +{83,50} +{10,90,98,86,87,1} +{63,2,9,17,30} +\N +{77,46,60} +{49,39} +{37,86,4,63} +{33,28,37,33} +{4,88,80,14,47,45} +{90,64,17,65} +{60,90,12} +{7,2,38,33} +\N +{39,90,7} +{89,32} +{27,47,63,31} +{54,10,10,73,84,87} +{55,58,25,87} +{41,24} +{71,26,8,31} +{74,19,33,81,74} +{47,58} +{44,16,22,59} +{2,10,97,16,25} +{1,98,3,41,6,80} +{12,13} +{3,50,61,85} +{54,5,44,97,71,86} +{54,72,94} +{59,13,28,79} +{73,68,7,13} +{90,49,63,45} +{95,47,84} +{31,79,98,22} +\N +{13,15,83,89,87,20} +{1,58,87} +{15,21,39} +{93,27} +{40,81,13,31} +{29,52} +{28,48,36,41} +\N +{71,23,89} +{29,59,31,45,35} +{49,83,24,19,44,26} +{41,61,36,34,38,88} +{66,17,18,9} +{55,38,93,33} +{84,42,71,15,12} +{11,38,78,80,90,92} +{1,6,28,68,58} +{96,63,73,22,74,29} +{65,97,68} +{92,29,92,36} +{47,25,30} +{25,44,67,95,16} +{7,26,41} +{79,12,44,69} +{17,27,4,60} +{45,30,57} +{68,24,63} +{39,64,94,92} +{27,68,39,68,75,8} +{88,48,48} +{86,86,8,54,7,45} +{93,60,14,90,14} +{97,42,54,67,38} +{13,38} +{84,34,30} +{34,71,77,71,13} +{82,18} +{53,7,79,79} +{28,65,38,20,93,100} +{96,10} +{94,12,93,48,51,20} +{12,4,41,11,25,59} +{95,69,23,25,1,19} +\N +{44,38} +{12,4,96,7,48} +{18,24,52,81,58,77} +{15,36,1,50,81,23} +{39,66,74} +{52,22,99} +{51,11,77,44,22} +{51,19,18,91,75} +{20,17,5,96,63,30} +{31,56,9,21} +{45,70,31,62,9} +{84,22} +{99,62,97,44,87,90} +{95,94,95,24,25,47} +{79,72,57,18,3,26} +{54,67,37,57} +{3,90,9,3} +{95,90,40,7} +{36,70,76,68,14,71} +{15,59,7,1,48} +{91,29,79,62,94} +{76,36,92,82} +{50,79,68} +{55,63,88,87} +{86,89,49,17} +{19,74,14,52,8,59} +{8,58} +\N +{77,74,20,39,26,29} +{38,89} +{58,21,44,81,17,16} +{40,72,12,32,90} +{93,34,92,17,39,85} +{39,2} +{43,21,83} +{81,3,59,28} +{34,97,52} +\N +{84,90,6,74,43,70} +{41,6,10,98,86,41} +{13,72,78,11,37,5} +{100,40,54,75,33} +{66,31} +{58,58,75,83} +{81,90,8,73,87,41} +{9,63,22} +{19,66,19,93,52} +{39,88,13,25,66} +{80,85,66} +{66,76,11,71,97,77} +{70,35,87} +{36,17,69,2,41} +{30,85,65,39,38} +{39,35} +{64,100} +{83,53} +{25,29,29,72} +{19,63} +{32,2,82,15} +{31,31,46,11,2} +{41,1} +\N +{55,41,15} +{18,61,43,22,100} +{47,60,16} +{80,5} +{52,2,76} +{40,26} +{81,12,16,25} +{31,93,89,20,95,75} +{26,75,86,1} +{36,69,70,73,79} +{38,39} +{45,49,52} +{88,53,45,10,49,31} +{21,14,1,83} +{7,71} +{59,38,83,64,44} +{6,52} +{99,99,26,54,47,8} +{13,46,72,5,23} +{7,86,40,73,55} +{28,47,50,62,44} +{32,89} +{39,48,50,100,62,95} +{66,56,11,21,58,59} +{7,44,95,53,95,36} +{83,33,79} +{34,65,51,52} +{67,95,46,45,61} +{69,84,71,38,46} +\N +{24,57,48,27,97} +{83,91,97,94,37,44} +{22,31,38,77,21} +{72,32,53} +{30,45} +{93,94,27,95} +{95,4,79,3} +{33,90,92,54} +{55,8,76,39,85,64} +{82,54,93} +{31,42,5} +{38,14,73,12,14} +{64,13,64,28,32,89} +{5,28,4,22,72} +{37,78,94} +{58,73} +{24,57,33} +{48,28} +{69,42} +{97,91,75,84} +{95,69} +{64,95} +{1,3} +{76,38,81,11,90} +{21,30,54} +{92,100,97,21} +{10,76,64} +{85,79,100,79,76,63} +{13,96} +{91,47,84} +{100,19,45,49} +{99,71,21,10,69} +{19,41,7,63,56,85} +{16,32,6,92} +\N +{62,7,22,65} +{1,86,67,47,83} +{26,2,100,51,1} +{20,22,86} +{74,95,79} +{8,53} +{85,59,61,45,83,8} +{2,76,63,26} +{40,42,84,55,56,23} +{37,7,25,14,2,47} +{86,16,98,41,33} +{76,30} +\N +{16,88,61,4,41,42} +{59,92,94,76} +{96,76,57,62,99,61} +{14,30,23,13,9,32} +{47,49,86} +{48,19} +{73,25,40} +{29,75,31} +{53,26} +{28,95,78,84} +\N +{22,77,13,64,68} +{15,69,82,26} +{42,37} +{64,59,95} +{37,72,86,95} +{9,59,92,57} +{65,37,13} +{93,67,81,54,89} +{21,52,78,59,30} +{98,90} +{17,35,57,4} +{44,56} +\N +\N +{25,26,13} +{62,41,60} +{28,92,16,74,4} +{92,19,85,77,11} +{20,67,85,22} +{75,69,34,29,64,73} +{70,40,2,29} +{87,27,70,54,6} +{10,8,9,62} +{71,41,14,22,23} +{83,79,46,37,99} +{79,42,3,54,20} +{12,60,42,100,39,33} +{13,79} +{95,28,54,52,77,3} +{55,50,25,41,42,16} +{96,67,23,54} +{65,54,32,52,16} +{100,11,69,96,95} +{1,18,93} +{53,78} +{24,40,47,30,40,11} +{87,7,12,10,52,90} +{3,72,95,15,32} +{60,69,19,8,43,72} +{88,10,11,55,37} +{67,48,31,48} +{98,70,38,97,14} +\N +{52,12,94} +{41,26} +{81,65} +{66,74,9,66,12,3} +{47,6,33,92} +{95,2,12,90,73,97} +{23,76,34,23,2,20} +{7,22,37,83,15} +{44,61,21,8,36} +{88,52,8} +{66,3,67,43,87} +{16,51,10} +{66,43,28,69,70} +{47,2,94} +{57,67,55} +{40,59,6} +{63,19} +{51,71,68,28} +{73,97,48,56,70} +{3,4,28,48,18} +{31,94,27,70,44} +{85,18,40,6} +{78,91,79,88,33} +{11,90,78,49,97} +{74,91,27,79,75,53} +{1,70,3,40,43,99} +{97,35} +{58,27,40,6,47,33} +{43,42,60,94} +{41,34,23,53} +{57,44,50} +{8,10} +{49,53,22} +{91,2,90,13} +{46,80,27,82,42,99} +{12,96,72,23,83,56} +{48,82,71,8,35,16} +{38,69,38,49,47} +{80,28,13,9} +\N +{84,13,12,33} +{31,57} +{68,86} +{4,96,64,19,48,29} +{66,8} +{33,86} +{32,38,86,86,41,84} +{38,51,31} +{59,17,76,36} +{52,87,60,54} +{7,58} +{34,52,58,90} +\N +{30,67,97,2,1} +{93,10} +{47,16,46,8,39,84} +{90,77,37} +{92,58} +{38,94,49,53,11} +{70,49,35,67,18,28} +{58,81} +{79,100,9} +\N +{97,13,56} +{99,40,87,67,58} +{24,47,19,16} +{12,27,47,48,3,59} +{1,58,15} +{97,28,6} +{94,50,31} +{71,34,94,53} +{26,5} +{46,66,56,27,37} +{76,4,1} +{80,63,40} +{89,82} +{39,100,71,82,95,8} +{81,86,27,83,57,47} +{30,30,92,8,33} +{95,20} +{4,19,8,74} +{20,32,83,62,19,18} +{75,29} +{100,13,6,41,23} +{63,5,93,72,43} +{64,13,73} +{35,91,61,26,41,96} +{49,56} +{2,28,80,84} +{15,48} +{32,49,96} +{72,73,57,69,16} +{95,1,88,64} +{70,55,88,66} +{76,66,30,92,1} +{88,21,74,65,93} +{72,75,75,3,26} +{55,32,85,68,84} +{45,40,93,33,72,20} +{83,89,6} +{4,60} +{72,56} +{73,7,69,25,96,74} +{100,72,41,48,63,37} +{21,72,70,94,67,54} +{6,9,58,77,35} +{70,59,35,25} +{86,96,87,62,13,5} +{93,52,74,57,58} +{93,23,88,50,56} +\N +{95,72,68} +{63,52,58,41,54,90} +{52,23,53,32} +{93,87,39} +{23,73,6,46,79,72} +{44,17,12} +{79,59} +{31,62,14,26,75,23} +{64,72,18,48,63,50} +{71,40,59,87} +\N +{82,17,10} +{44,29} +{6,4,39,16,21} +{94,17} +{91,61,37,36,9} +{53,38,7,28,92} +{95,93,35,18,48} +{35,77,53,87,97,92} +{56,28,68,19,28,86} +\N +{23,91,56} +{97,5,89,24} +{18,81,17,78,63} +{83,19,46,10,22,66} +{100,17,45} +{25,87,61,79} +{17,57,99,1,39,1} +\N +{2,51,26} +{93,69,84,85,87} +{40,58,70} +{86,84,96,41} +{28,36} +{39,85} +{16,84,75,68,87,17} +{14,84,57} +{25,85,35,82,56} +\N +\N +{7,30,17,2,66,91} +{45,17,57,27,98,65} +{57,86,15,40,68,23} +{82,32,28,89,41,79} +{28,3,35,61} +{76,95,19,81,48,50} +{34,6,85,47,65,2} +{70,23,91,33,15} +{30,24,47,96,61,47} +{78,88,64,60} +{87,40,86,97} +{47,14,54,37,100} +{48,95,32,77,69} +{58,12} +{63,20,49} +{78,85,41,72,6} +{39,20,89,21,62,76} +{71,6,10} +{63,4,71} +{51,21,37,63,54} +{66,6,63,12,58} +{89,97} +{64,70} +{53,1,65} +{57,73,30,26} +{15,99,47,89,95,99} +{12,86,7} +{50,68,1,31,67} +{47,86,54,44} +{78,7,86,76,22} +{46,71,98,62,67} +\N +{64,91,80,63} +{82,61,17,58} +{85,64,90} +{37,26,64,97} +{68,25,26,61,68} +{11,21} +{63,53} +\N +{87,88,75,65,10,48} +{32,7,38,72,44} +{99,81,59,10} +{31,58,60,66,41,28} +{23,27,57,74,4} +{20,94,28,29} +{91,5,15,61,50,29} +{34,58,15,85,65,29} +{52,50,2,95,87} +{3,94,54} +{7,61,96,49} +{51,70,23} +{87,49,27,6,7} +{83,61} +{36,92,48,57,20,83} +{53,12,60} +{60,11} +{68,43,74,23,66,55} +{66,8,54,24} +{48,72,41,74} +{81,99,50,33,20,13} +{27,80,60,83,26,74} +{80,1,59,50,15,99} +{11,70,20,29} +{23,84,63} +{63,24,91,19,28} +{25,17,95} +{94,13,81,69,26,89} +{31,48} +{45,20,74,51,62,33} +{77,55,17,63,4,18} +{89,14} +{85,85} +{23,11,85,74} +{29,76} +{62,40,96} +{1,29,25} +{56,26,12} +{5,22,6} +{61,9,6,85} +\N +{31,34,49,11,19} +\N +{14,20,64,73} +{63,1,85} +{2,58,61,100,9} +{89,92} +{37,13,81,77} +{36,26,16,76} +{78,10,10,92,63} +{68,6,35,71,92,27} +{2,88,33,14,85,27} +{80,95,71,98} +{8,33,33,55,90} +{62,74,15,10,64} +{60,18} +{6,77} +{27,38,4,49,27,89} +{94,84,94,8,98} +{15,73,47,47,26} +{73,38,69,90,9,13} +{17,33,32} +{51,57,25,40,41,37} +{77,70} +{66,10} +{50,90} +{96,88,30,65} +{30,49,100} +{34,46,19,89,52,24} +{83,85,62,72,10,64} +{98,56,23,77,79} +{97,90,83,85} +{19,66,70} +{70,89,59,12,71} +{24,96,22,4} +{43,32} +\N +{92,85,41} +{96,90} +\N +{4,5,82} +{58,32,34,86,30} +{51,8,44} +{31,96,37,47} +{51,15,41,97} +{86,41} +{41,26,61} +{62,79,68,73,5} +{32,9,88,30} +{89,34,64} +{70,18} +{64,31} +{14,73,1,50,75} +{57,1} +{53,92,38,13,56} +{41,1,87,40,60} +{83,75,19} +{69,98,25,64} +{69,75} +{84,13,25,8,81} +{41,52} +{90,80,17} +{19,53,72,62,94} +{29,30,99,32} +{32,85,73,26,47} +{6,48,89,93,23} +{73,47,93,10,48} +{60,21,26,60,63} +{85,41} +{75,61,61,45} +{51,7,5} +{9,46} +{83,36,7,84,96} +{71,78,55} +{43,53,88} +{8,1,80,69} +{88,86,51,12,37} +{45,69,40,85} +\N +{36,53,60,15,7,7} +\N +{92,5} +\N +{51,13,34} +{39,23} +{16,26,93} +{91,96,19} +{89,64,2} +{8,74,29,24,66} +{26,19,30,27} +{81,59,52} +{99,28} +{5,12,63,79} +{14,80,90,83,47,79} +{67,64,32,58,44,19} +{27,32,52,79,55} +{68,87} +{14,31,20,12} +{38,99,65,32,15} +{27,57,35,17,53} +{63,64,6,60} +{70,38,47,65} +{24,87,20,4} +{86,27,19,56} +{62,44,1} +{46,10,26,48} +{40,57} +{61,9,59,80,51,20} +{83,44} +{77,1} +{78,63,42} +{75,93,95,76,9,52} +{20,58,10,37} +{72,75,41,73} +{63,93,5} +{57,65,47} +{34,6,51,38,21} +{54,7,19,9} +{61,6,47,64,100,86} +{39,45,55,17} +{81,53,67,33,70} +{11,94} +{57,98} +{78,81} +{75,71,20,8,13} +{3,2,58,95} +{37,58,5,46,54} +{40,50,36,27,69} +{73,42,86} +{97,73,87,80,38} +{27,56,94,73} +{80,81,74} +{53,79,86} +{79,4,55,21,34,74} +{84,63,21,97,92,38} +{72,38,76,63,97,79} +\N +{64,91,100,98} +{34,10} +{97,73,7} +{49,31} +{87,39,65,96} +{54,88,60,55,18,4} +{20,72,96,26} +{40,51} +{37,46,89} +{88,53,3,52,39} +{10,34,77,95} +{20,66,84,12} +{51,19,61} +{67,35} +{73,56,89,43,35} +{94,54,27,63} +{63,53,21,79,76,49} +{79,23,28,63,49} +{47,94,75,11} +{67,95,56} +{80,86} +\N +{62,73} +{98,69,11,57,24,90} +{87,41,77,21,94} +{21,87} +{3,40,75} +{67,53,78,29,16} +{18,46,70,76,98} +{14,67,50,63,22} +{4,2,92,4,8} +\N +{41,76,79,95,96,61} +{35,30,18,57} +{34,91,89,27} +{22,25,9,34,85} +{4,53} +{23,6,65,86,56,93} +{54,81,8,59,36,47} +{90,10,4,25,31,46} +{91,82,82,80} +\N +{64,12,59,21,10} +{49,93,76,26} +{22,10,21,15,57} +{14,29,93,31} +{68,21} +{62,95,12} +{34,74,55,4} +{26,39,93,31} +{67,31,63} +{23,89,98,88} +{48,93,22,79,28} +{1,88} +{95,74,84,18,38} +\N +{82,29,22,45,15,81} +{15,48} +\N +{17,36,97,77} +{93,59,71,15,51,35} +{67,33,57,11} +{35,80,72,43} +{69,89,69,48} +{52,29,16,52,100,22} +{60,30,45,19,25} +{28,3,39,86,13} +{81,40,25,20,39,5} +{77,14,93,47,23,6} +{42,19} +{52,52,98} +{9,29} +{78,77,6,72} +{2,59,73} +{13,85,77,26,29} +{64,63,94} +{54,76,3} +{7,1,5,91,100} +{24,94,57,94,79,55} +{4,22,1,75} +{34,53,19,87} +{69,75} +{71,47,47,61,42,89} +{3,32} +{84,61,4,13,73} +{74,61} +{47,65,85} +{50,84,83,18} +{51,97,11,3} +{59,92,4} +{49,42,65,27,97,52} +{19,33,40,44,71,100} +{82,68,99,60,47,59} +{47,33,82} +{3,45} +{47,28,60} +{3,98,60,30,50} +\N +{11,40} +{33,67,72,43,74} +{9,49} +{42,47,48} +{53,88} +{17,87,28} +{20,4,72,62} +{65,25,22,76,64} +{9,62,57} +{59,93,52,93,60} +{85,85,1,55,50} +{69,22,57} +{8,50,81,32,4} +{80,47} +{60,88} +{16,54,80,66} +{99,87,66,65} +{60,19,58,18} +{14,77,66,48,59,41} +{75,96,82} +{42,72,93,79} +{14,23,78,82,40} +\N +{29,47,16,41} +{13,11,45,67,23,92} +\N +{8,3,52,41,56} +{57,41,63} +{5,50,59,87,50,58} +{58,99,9} +{60,99,15,63} +{59,14,9} +{68,81,34} +{83,18,3,94,39} +{27,52,100,66,48,82} +{10,23,50,96} +{72,14,12,68,62} +\N +{45,30,55,86,89,48} +{5,80,97} +{52,67,86,81} +{99,4,38,79} +{21,98,78,71,73} +{10,23,38,61} +{12,17,19,70} +{79,23} +{55,66,65,60,19} +{7,34,68,88} +{37,70,5} +{41,57,86,31,10,6} +{70,59,96,78} +{88,18,32,22,56,21} +{93,72,81,47,89,72} +{100,14,49} +{83,80} +{73,11,97,14} +{60,47,32,34,13,29} +{39,6,88,24,6} +{54,66,55,52,47} +{56,89,88,98,94,48} +{2,37} +{13,54} +{68,39,68} +{60,81,10,85} +{74,54,14} +{30,52} +{41,74,47} +{77,28,8} +{90,3,43,89,4} +{29,46,84,63,79,83} +{26,15,80,19} +{76,28,77,6,47,91} +{51,15} +{93,15,51} +{8,68,34,58,15} +{5,56,57,81} +{27,87,61,54,41} +{31,37} +{68,80,3,98,49,6} +{96,10,39} +{25,19,21,72,79} +{69,1} +{5,51,61,80} +{76,25} +{36,92} +{54,46,31,87,13,8} +{25,13,83,57} +{29,53,73} +{83,60,26,19} +{27,89,34,13,20,38} +{29,74,26,67,65} +{90,36} +\N +{32,15,43,50} +\N +{55,86,68,51} +{91,14,53,70,49,38} +{75,29,79} +{19,59,38,44,18,79} +{43,31,24,20,16} +{43,83,59,37} +{61,17,95,61} +{67,89,1} +{65,20,46,58,49} +{72,54,38,52,49} +{75,12} +{63,95} +{99,17,79,11,35} +{62,60} +\N +{69,83,89,73,20} +{30,60,39,73} +{78,99,29,45,61,21} +{38,61} +{51,15,47,11,4} +{34,75} +{57,26,42,42} +{8,90,4,68} +{63,70,99,3} +{74,70,33,50,59} +{27,18,73,83} +{36,90} +{82,77,2,83} +{90,99} +{15,25} +{65,30,39,82,89,34} +{12,24,64,54,49,83} +{54,59} +{63,49,81,36,75,52} +{6,59,90,55,87} +\N +{97,52,54,97,3} +{8,53,89,42,30} +{68,42,64} +{97,42,99,74} +{19,31,32,52,7} +{69,83} +{61,17,35,39} +{81,47,70,7,63} +{78,10,63,97,31,48} +{84,92} +{64,82,40,39,57,44} +{39,25,92,33,5} +{27,74,85} +{90,67,21,28,84} +{36,33,62} +{77,87,98,82,11,88} +\N +{11,41,17,91,56} +{1,1} +{84,100,8,22,20} +{57,39,85,5} +{55,47} +{13,2,36,59,45} +{95,66,53,32,29} +{21,92} +{35,32,9,58,77} +{19,71,99,82} +{19,37,87,43} +{100,18} +{67,86,29,40} +\N +{66,54,64,55} +{67,25,18,31} +{60,26,59,86,26,67} +{26,21} +{70,67,30} +{93,82} +{89,58,39,91,95} +{15,86,25,8,12} +{59,20,41,33,78,87} +{10,72,89} +\N +{52,17,99} +{77,29,7,7,1} +{49,96,57,24,66,67} +{10,26,83,84} +{82,7,25} +{66,77,57,25} +{92,77} +{24,48} +{44,26,37,75,11} +{73,80} +{51,47,93,21,25,78} +{76,49,15,98} +{12,85,63,59,6} +{25,51,47,58} +{16,10} +{17,30} +{67,5} +\N +{54,96,21} +{12,47} +{29,90,69,22,89,82} +{78,93,86,65,66} +{83,84,58,67,13} +{85,35,81,27,1,2} +{76,29} +{64,82,91} +{35,89,38,89,10} +{19,40,96} +{83,70,85} +{72,85,70,99} +{34,1,39,16} +{84,53,22,86,73} +{32,23,70,49} +{15,67,91,11} +{73,95} +{71,57,64} +{88,91,56} +{12,16} +\N +{62,82,26,84} +{70,51,52,63,96} +{34,93,49,57} +{16,5,47} +{18,59,12,82,83,51} +{61,93,87,9} +{46,9,45,38} +{15,85,28,73} +{31,99,26,3} +{66,91,48,73} +{98,80,9} +{31,55,42,69,13,58} +{43,8,70,29,83} +{39,57,53,70,74} +{89,13,60,38,89,3} +{37,28,15} +{67,77} +{30,100,89,36,53,75} +{36,19,48} +{7,8} +{12,76,26} +{14,56,52,47,39,67} +{87,83,51,2,97,25} +{51,1} +{59,69,37} +{95,93,21} +{100,92,37} +{37,23,66,95,7,63} +{52,56,77,86,46} +{31,62,17} +{57,48,79} +{26,96,40,5,43,54} +{40,92} +{75,83,1,73,71} +{75,61} +{6,38} +{35,23,76} +{52,3,38,25,100,99} +{45,15,44} +{96,9,11,35,16,58} +{9,80,76} +{22,43,34,43,46} +{34,68,21} +{95,70,83} +{60,7} +{34,22,68,2} +{78,30} +{46,70,90,96} +{5,24,69,61,32} +{41,17,79,27} +{59,88,64} +{12,48,41,68,15,98} +{43,84,59,62,36,14} +{84,8,71,88,4,23} +{45,67,67,17} +{14,96,72,66} +{91,23,4,11,28} +{18,5} +{65,51} +{31,87,33} +{17,97,76,81,69} +{56,71} +{95,23} +{33,58,66,47} +{46,99,69} +{43,87,40} +{49,1,26} +{18,36,89,87,25,100} +{76,37,19} +{57,91,9,100,23,59} +{80,60} +{55,23,32,49} +{15,73} +{87,50} +{43,62,50,54} +{65,3,89,49,77} +\N +{73,12,25,78} +{79,89,38,59} +\N +{44,62,25} +{96,13,57} +{35,14,3} +{90,71} +{34,8,59,81,63,90} +{15,90,89,32,69} +{90,61,54,10,29} +{22,3,85,41,66} +{17,4,99,91,45,57} +{89,32,43,39,61,9} +{45,40,6} +{47,100,75,8,85} +{88,43,89} +{45,41} +{54,48,87,66,100,5} +{58,65,39} +{17,82} +{95,14,31,51} +{30,3,46} +{8,66,22,52,51,24} +{61,62,38} +{4,50,83,32,76} +{96,36} +{87,27} +{82,100,44} +{30,91,44} +{29,48,8,38,43,96} +{56,65} +{34,36,99,11} +{11,1,25,65,12,89} +{17,100,62,53,24} +{86,81,63} +{17,63,30,82,87,91} +{12,63,76,78,85} +{52,19} +{21,91,53,86,49,83} +{67,65,78} +{8,77} +{89,1,56,100,72,96} +{20,51,41,21,30,20} +{41,73,37,92,9,5} +{95,34,21,12} +{28,14,2,62} +{14,74,33,32} +{37,82,67} +{65,99,56,11,21,83} +{99,51} +{56,42} +{59,30,74,40} +{18,27,63,44,86} +{48,25,41} +{5,26,63,88} +\N +{24,66,64,1,26} +{72,74,11,61,70} +{28,27,90,30} +{96,35,21} +{64,100,75,94,88,3} +{93,79,42} +\N +{37,51,4,41} +{31,68} +{93,42} +{76,96,47} +{8,6,16,57,51,72} +{67,72} +{50,36,40} +{69,28} +{17,92,40} +{72,74} +{76,87,93,22,95,30} +{14,88} +{39,56,74,36,25,87} +{55,68} +{32,9} +{35,2,17,86} +{92,73,82} +{40,13,95} +{15,28,95} +{65,40} +{47,56} +{63,72,78,20,22} +{71,49,4,80} +{68,16,50,44,29,38} +{81,96,23} +{44,73} +{4,68} +{30,54,41,66,89} +{92,33} +{10,92,49,46,59,42} +{14,91,18,96,27,37} +{40,32,12} +{14,97,15,96,44} +{75,96,52} +{50,20,9} +{39,84,83} +\N +{14,48,3} +{47,85,76,27} +{5,3,25} +{55,36,29,76,41,44} +{34,56} +{62,29,83,6,58} +{67,32,85} +{75,62,4,66,100} +{47,31,27,43,9,57} +{92,44,36} +{31,22} +{14,88} +{18,25} +{82,63} +{54,67,6,59} +{90,42,19,91,37,75} +{70,39,87,52,32} +{51,20,34} +{85,62} +\N +{95,6,55,93} +{44,67,15} +{93,58,20,12} +{42,6,22,29,36} +{46,81} +{57,95,56,52} +{3,79,69,45,8,74} +{75,44} +{4,17,78,96,66,41} +{27,100} +{85,76,22,17,45,58} +{9,12,70,29,96} +{5,68} +{54,79,5,19,17,24} +{99,13,9,52,86} +{94,6,99,57} +{71,62} +{63,50,9} +{42,42,80} +{25,96} +{93,20,10} +{83,73} +{14,76,36} +{57,31,29} +{17,25,18,18,54,95} +{34,27,86,37,92,83} +{57,57,28,32} +{98,53,60} +{8,59,41,88,49,46} +{95,42,30} +{12,51,98,74,76} +{6,49,26} +{21,35,27,32,83,93} +{16,56,89} +{85,34,73,74} +{52,95,22,4,71} +{96,42,63,88,80,91} +{78,34,41,99} +{11,68,27} +{50,14} +{78,52,66,15} +{100,82,1} +{35,2,93,71,45} +{4,56,8} +{83,19,5} +{82,39,63} +{50,64,83,87,76} +{47,59,93,88,22,67} +{16,6} +{86,98,88} +{32,4,52,34,30,71} +{68,25,97} +\N +{19,17,91,84} +{97,88,89,98,33} +{37,56,70} +{27,17} +{56,58,51} +{69,80,47,84} +{89,22,89,88,16,1} +{95,14} +{14,95,97} +{47,15} +\N +{19,20,65,74,83,38} +{57,56} +{78,67,68,89,1,95} +{61,84,93} +{10,56,96,31,56} +{3,51,90} +{15,85,42,25,15,41} +\N +{50,7,89,89,96} +{90,10,44} +{11,43,15,27,30} +{55,68,48,30,44} +{38,69,3,95,39,6} +{57,51,88,94,82,23} +{69,37,2,67,49} +{93,94,5,84,39,47} +{45,47} +{58,55,79,63,64} +{63,65,59} +{42,36,76,75,89,86} +{41,83,98} +{13,90,13,46,11,37} +{76,33,52,65} +{52,29} +{20,60,45,23,29} +{89,6,14,8} +{91,69,64,72,41} +{46,91,31,66,83,33} +{6,58,61,65} +\N +\N +{90,65,16,5} +{24,46,33,36,47,45} +{11,62,40,98,21,88} +{28,95,58,33,27} +{45,63,99,31,38,90} +{11,49,41} +{23,24,82,25,28} +{42,3,34} +{52,10,58,88,97,37} +{20,41,11} +{86,30} +{36,92,93,10} +{5,36,85,50,71} +{51,75,100,46} +{55,81,31,45,87,8} +{83,10,45,81,33} +{16,94,91,23,76,44} +{62,73,14,39} +{16,14,83,100,82,7} +{25,69,86,12,71} +{29,86,45} +{76,62,100,47,57,52} +{41,21} +{33,56,58} +{23,96,44,16,91,86} +{65,15} +{3,92,56,4,21} +{32,39,95} +{95,87} +{65,96} +{16,96,93,100,35,78} +{64,33,55} +{96,75,41,40,62} +{50,50,86,11} +{93,34,83} +{19,30,62,67,93,19} +{53,67} +{55,46,99} +{70,32,38,4,84,91} +{50,36,40} +{21,93} +{29,6,10} +{4,73,45} +{72,33} +{36,73,18,55,27,100} +{65,73,98,90} +{20,1} +{59,36,60,87} +{20,79,63,93,34,31} +{60,18,92,6} +{48,34} +{63,70,78,1,2} +{15,32} +{5,15,84,73} +{32,35,90,11,40,23} +{91,41,7,52} +{84,90,88,30} +{12,10} +{84,86,36,79} +{76,45,84,66} +{41,25,61,96,97} +{18,100} +{63,39,17,34,32} +{22,45,74} +{83,24,45,48,69,84} +{43,41,12,44,75,91} +{69,75,95} +{100,28,14,66,1,14} +{94,91,60,36} +{88,28,54,63} +{68,78} +{29,68,6,100} +{12,84,35,44,59,55} +{30,59} +{64,18,40,57} +{97,97} +{85,64,73,82,49,88} +{99,31,24,6,90} +{23,89,38,20,40,95} +{84,64} +{21,3,91,7,7,87} +{91,74,32,76,43} +{13,22,96,8,75} +{59,71} +\N +{34,94,45} +{14,5} +{95,10,37,74} +{69,82} +{6,58,45,49,81} +{72,72} +{17,58,10} +{62,77,9,6,44,62} +{37,53,49,41} +{24,11,11} +{10,57} +{26,72} +{18,15,83,60,54,80} +{88,49,73,92,67} +{26,88,64,2,59} +{49,50,3,90,44,49} +{58,54,43} +\N +{86,78,40} +{42,17,65} +{1,86,17,6} +{79,27,37,60,8} +{46,62,46,22} +{9,75,17,68,54,35} +{99,86,64,10,20} +{3,21,35,6,24,64} +{25,62,9,50} +{63,2,79,42,81} +{44,41,2} +{99,93,98,78} +{2,92,9,96} +{79,82,25,64} +{47,84,52} +{97,77} +\N +{47,94,38} +{22,33,76} +{35,52,11} +{17,48} +{1,100,27} +{87,93,19} +{72,3,32,78,81} +{47,28,4,23,79} +{27,88,7,85} +{49,40,47} +\N +{91,89} +{80,2} +{86,78,42,6,81} +{7,50,25,4,8,22} +{23,3,64,59,53} +{1,42,63} +{95,81,86,31} +\N +{81,83,52,47,25,43} +{17,57,100,49,59,63} +{44,91,95,72,29,100} +{80,78,55,41} +{14,52,20,64,9,87} +{48,14,82} +{31,5} +{64,50,66,38,97} +{61,2,90,2,64} +{64,69,26} +\N +{64,62,68,89,12} +{12,10,88,71} +{41,66} +\N +{67,77,25,6} +{14,75,15,66,19} +\N +{88,52} +{78,56,61} +{93,88,47,38,52} +{72,100,54,34,18} +{77,99,89,53,25} +{38,51} +{3,25} +{83,39,85} +{60,15,77,59,69} +{38,64,91,97} +{65,35,30,8} +{46,6,48} +{63,91,29,91,85} +{43,100,56,60,74,53} +{95,30} +{86,63,28,62,37,79} +{2,48,29} +{1,44,20,47,56} +{43,34,86,86,64,14} +{11,82,99,71,63,41} +{77,45,74,17,56} +{18,25} +{51,82} +{27,35} +{1,20,84} +\N +{89,37,16,90} +{58,83,34,88,50,21} +{61,25,1} +{41,6} +{9,100,32,54,38,66} +{40,53} +{29,76,16,13,55,31} +{71,67,54,83,3,82} +{19,62,18,94,73,38} +{17,83,8,45,52} +{80,25,50,59,53} +{4,2} +{52,48,6,72} +{50,32,70} +{36,97} +{17,82,36,97,20} +{22,87} +{46,29,96,98,14,90} +{14,92,5} +{69,9,68} +{20,86,29,61,54} +{62,67,87} +{86,18,31,80,82,45} +{65,89,67,34,41} +{44,8,48,38,91} +{47,32} +{85,25,56,39} +{15,54} +{84,57,44,46} +{65,61,29,86,77,53} +\N +{26,58} +{76,1,57,93} +{57,91} +{13,15,66,11} +{84,12} +{43,32} +{83,24,31} +{82,9,65,84,27,94} +{62,93,55,7,39,46} +{90,100,33,22,61,46} +{9,51} +{87,93,82,94} +{49,45,95,95,66,39} +{100,56} +{11,5,78,42,45,37} +{3,57,80,46,13,34} +{1,74,53,31,33} +{11,84,8} +{27,99,21,31,96,58} +{99,81,90,17} +\N +{66,49,47,55} +{88,30} +{76,62,17,88,83} +{40,7,42,61} +{17,57,9,64,54,1} +{9,54,84} +{50,61} +{72,15,25,30,6} +{64,95,69,89,11} +{64,18,86,25} +{81,59,70,6,92} +{78,76} +{33,40,29} +{15,63,1,12,14,57} +{33,81,8,65,26} +{58,15,56,37,67} +{2,50,35,92,11,27} +{17,13} +{91,100,15,27,39,24} +{58,48,46} +{5,95,28} +{7,21,99} +{5,15,6,10} +{82,99} +{66,22,86,83,76} +{99,68,39} +{43,90,22} +{31,94} +{21,64,56,26,95,40} +{7,81,3,53,83} +{29,42,90,60} +{53,49} +\N +{26,31,14,73,88,51} +{69,2,100,9,34,16} +{78,35,97} +{68,16} +{34,45,42,73} +{7,19,55,70,69,11} +{11,62,61} +{32,17,51,33,87,6} +\N +{54,97,36,13,45,12} +{46,2,26} +{14,6,17} +{99,20,31,61,6,4} +{60,72,53,31,34,25} +{88,46,68,78} +{56,94,49} +\N +{33,65} +{70,51,84} +{55,91,27,33} +{22,19} +{34,78,11,94,3} +{16,67,91} +\N +\N +{64,5} +{76,18,83,5} +{57,13,30,56} +{60,92,25,31,43} +{38,17,54,5,2} +{56,58,39} +{42,43,5,69,56,89} +\N +{50,23,97,85,70,39} +{97,56,33,90,64,2} +{9,54,51,26,24,99} +{18,7,59} +{44,5,40,69,18} +{77,96} +{44,58,47,17,26,45} +{90,71} +{88,32,11,96,17,13} +{42,3} +{97,28,56,10} +{38,36} +{50,52,47,31} +{64,5,99,77,83} +{11,56,1} +{91,92} +{7,53,35,52} +{93,65,47,97,44,82} +\N +{64,66} +\N +{62,4,57,23,34,91} +{52,55,75,99,27} +{29,54,44,87,61,96} +{21,3,66,35,25,80} +{96,68} +{3,41,66,81,78} +{49,98,79,65} +{71,38} +{88,79,70,37,3,82} +{49,74} +{19,29} +{57,68,9,8,99} +{81,88,14} +{99,29,24,99} +{55,96,29,89,49} +\N +{56,2,84,79,74} +{30,52,64,74,62,5} +{88,32,19,25,9} +{40,11,49} +{98,52,27} +{11,86,29,86,6} +{91,53,63,53,44,28} +{88,10,30,48} +{75,64,75} +{14,92} +{98,62,35,67,66,35} +{40,65,11,80,73} +{1,1,63} +{85,32,53} +{91,27,68,50,66,63} +{66,54,38} +\N +{45,43,14,94} +{62,84} +{54,24,83,33,46} +{93,72,2} +{43,4,14} +{18,11,5,99,79,94} +{26,59,9,2} +{58,69,70,45,14,54} +{84,5,42,97} +{7,82,41} +{69,53,8,55,20} +{4,13,6,45,83} +{41,92,41,98,51,85} +{72,85,74} +{19,50,79} +{79,47,47} +{25,25} +{17,56,46,30,73,78} +\N +{92,42,83,34,92,29} +{8,52,76,80,9,55} +{80,100,2,52,24,4} +{55,15,92,27,86,50} +{83,79,41,88,86,53} +\N +{44,16,90,54} +{99,20,64} +{44,30,26,26} +{35,35,24,74,72} +{97,24,94,55} +{78,42,32,76,100,98} +{31,86,12,87,72,86} +{87,35,33,88,33} +{31,83,23} +{46,51,5,6,71,31} +{39,97,91,53,39} +{19,18,25} +{16,4} +{65,77,13} +{61,30,13,26,75} +{67,9} +\N +{31,3} +{15,19} +{97,39,71,30} +{12,96} +{36,96,82,62,5,74} +{81,22,46,11,19} +{97,55} +{58,67} +{10,68,79,74,23} +{29,71} +{50,59,8,1} +{12,51,32,7} +{62,16} +{48,82} +{84,21,24,13} +{46,86} +{100,96,32,54,13} +{72,41,3,67} +{61,9,7,75} +{39,44,50,30,38,6} +{63,63,6} +{69,35,6} +\N +{7,91,82,48,55} +{57,22,31,57} +{55,72,91} +\N +{76,98,43,71,10} +{100,34} +{78,53,14,73,23} +{42,90,28,44,44} +{90,34,22,81} +{60,32,56} +{98,53,58,58,61} +{61,70,59,78} +{2,96,27} +{83,99,25,47,13} +{17,54,11,47,70} +{70,43,11,89} +{93,70,82} +{72,57} +{35,95,49,36,19} +{82,25,16,49,43,93} +{2,51,96,48,88} +{20,81} +{74,4} +{66,83} +{90,75,98} +{25,87,59,92,55,96} +\N +{20,80,92,93} +{59,63,39,3,7,38} +{64,10,85,22} +{63,32,18,38,83} +{49,38,83,54,1} +{27,97} +{18,34,84,58,7,86} +{93,4,67} +{43,49,32} +\N +{29,14,5,50,30} +{59,15} +\N +{76,31,31,47,17,35} +{95,41,71,27} +{47,43} +{75,80,56,78} +{56,75,43} +{99,10,100,76,44,1} +{5,31,72,3,25} +{21,90,59} +{59,45,75,93,78,88} +{76,55,4} +{20,87,44,94,56,78} +{38,87,71,13,23} +{33,6,79,91,92,27} +{13,15,31,15,11} +{57,18,57,71,11} +{67,60,64} +{66,15} +{57,45,74} +{93,91,97,30,12,94} +{37,83,62,18,28} +{94,88} +{12,11,85,10} +{42,96,89} +{15,65,5,65} +{52,58,36,27,10} +{72,88,76,50,96} +{40,70,55,93} +{80,33,24} +{53,35,50} +{11,37,55} +{25,80,32,91,68} +{11,2,52,39,37} +{17,51,45,44,85,84} +{81,21,77,15} +{67,93,27,70,72,94} +{86,99,95,98,83,28} +{9,65} +{1,26,5,23,5,17} +{57,82,42,60} +{46,67,65,98,69,79} +{41,50,94} +{77,81} +{87,82,18,57} +{88,27} +\N +{32,58,81,88,94,90} +{23,37,65,38,29} +{61,11,65,77,25} +{50,53} +{38,2,11,9,27,94} +{64,9} +{1,45,97} +{61,41,67,46} +{13,41,90,15,80,82} +{83,6,9,22,25,37} +{95,74,22,64} +{16,17,4,80,66,33} +{25,42,43,84,96,85} +{25,93,50,87,6} +{35,67,90} +{82,37,59} +{4,44,83,2,81} +{78,46} +{64,79} +{18,41,3} +{56,20,51,83} +{26,77,52,70,93,13} +{54,53,12,47,57,63} +{94,48} +{39,12,41,5,3} +{28,33,93} +{20,29,9} +{75,38,10} +{96,54,96} +{47,87} +{19,35,11,3,80,72} +{75,56,84,24,55,48} +{58,5,13,6} +{10,53,32,6} +{23,8,59} +{71,2,35} +{41,16,99} +{77,6,16} +{30,27,56,85,11} +{47,21,93,82} +{50,68,85,34,19,57} +{14,76,58} +{78,81} +{68,99} +{19,79,67} +{91,73,82,88,44,36} +{49,18,75,32} +{54,18,99,74,9} +{51,58,60,30} +{99,86,83,22,88} +{24,42,76,30} +{86,16,54,69} +{37,39,72,45} +{92,62,3,36} +{31,80} +{43,22,11,15} +{38,88,95,25,49} +{92,21,10,28,47,55} +{99,18} +{26,64,72} +{29,12,17} +{54,69,49,84} +{57,42,4,61,10} +{60,85,74} +{24,29} +{91,71} +{96,49} +{47,51} +{88,67,59,18,86} +{32,18,64,54,41,27} +{78,100} +{77,30,85,93,2,20} +{80,90,68} +{49,37,5,42} +{88,12,94,51} +{85,65,2,41} +{60,38} +{87,37,20} +{27,81,94,37,54,84} +\N +\N +{38,74,78,78,89} +{3,100} +{42,80,68} +{34,17,96,91} +{7,29,83,71,87,26} +{28,81,76,8,43,48} +{74,11} +{28,85,84,78,59,69} +{30,22} +{3,83,75,60,78,11} +{20,62,18} +{74,69} +{91,44,50,62} +{57,18,9} +{14,48,21,33} +{91,1,53,58,92,51} +{64,41,90,52} +{81,95,38,78,7,44} +{65,25,15,90,40,51} +{66,41,31} +{5,92} +{17,98,7,57} +{97,36,99,77,50,88} +{96,56} +{40,62,88,8,53,62} +{18,91,63,93,94} +{88,79,43} +{31,87,98,85} +{12,88,58,53,77,38} +{83,10,37,69,1,7} +{13,47,66} +{85,33,39,48,6,39} +{74,87} +\N +{26,50,26} +{48,78,10,39,17} +{27,43} +{58,17,18,80} +{86,43,58,77,67} +{53,12} +{9,79,9} +{85,79,89,88} +{35,77,22,52} +{93,64} +{47,52,90,17} +{75,15,25,68,28} +{35,6,68,37,18,53} +{80,14,2,89,4} +{52,49,5,66,59,44} +{5,26,96,1,84} +{71,8,61,19,72} +{17,94,84,72,55,83} +{72,10,16,40,17,75} +{6,70,15} +{22,99,7,19} +{55,19,4} +{6,47,69,42} +{17,9,63,44,15} +{23,20,72} +{10,80,20,87} +{99,3,23} +{11,76,8,77,58,38} +{45,14} +{22,89,73,63,54,9} +{16,19} +{1,26,29} +{92,20,65,33,16,40} +{27,64} +{22,19,95} +{36,16,9,30,31,14} +{40,50,68,52,77,58} +{35,15,11} +{67,2} +\N +{63,48,76,25} +{14,65,42,60} +{61,58,31,51,70,4} +{35,41,72,29,46,62} +{98,48} +{90,23} +{1,79,80} +{10,5,54,59,16} +{15,1,9,75} +{34,100,90} +{73,76,25,77} +{98,82,77,67} +{79,5,20} +{9,69,9,52,2} +{23,22,77,80,79} +{32,51} +{23,52,5,33} +{95,20,96,78,48} +{100,37,6,15} +{98,1,53,20,97} +{5,28,26,78,33} +{19,75} +{49,42,30,72} +{50,98,56,26,87} +{76,59} +{51,16,18,48,46,97} +{80,60,51,43,58,28} +{23,12,70} +{40,16,14,18,46,21} +{72,79,47,57,23} +{7,17} +{49,95,6} +{14,24,29,13,90} +{82,28,34,55,15,87} +{31,24,3,50,45} +{86,95} +{97,22,17} +{27,14,27} +{61,63,31,74} +{55,81,87,67,90} +{81,9,79} +{100,29,43} +{41,88,37,29} +{62,57,16,91,60,65} +{94,90,34,94,27,48} +{15,36,80,30,23,90} +{47,91,6,42,93} +{53,74,5} +{84,14,56} +{30,56} +{10,12,92} +{33,7,75} +{96,39,50,77} +{89,85} +{20,39,63,22,44,18} +\N +{90,23,79,91,85,8} +\N +{73,70,52} +{75,100} +{27,4,29,96,25} +{56,31,80,59} +{1,91} +{16,67} +\N +{17,88,59,41} +{13,49,29,76,71,9} +{41,38,16,29,66,40} +{68,67} +{39,74,47,71,63,80} +{4,74,33,92} +{17,60,82,7,52} +{62,88,39,19,22} +{77,21,1,95,42,2} +{98,62} +{55,17,81,31,11,88} +{73,52,18,94} +{16,64,90,33} +{87,41,81,95,85} +{20,55,96,75} +{71,72,11,11,83} +{75,94,89,47,41,7} +{56,48} +{76,29,74,31,67} +{47,70,68,36,70} +{5,69,10,94,54,32} +{29,96,71} +{64,28,86,58} +{82,57} +{42,2} +{64,48,59,8,45} +{61,69,43,40,1} +{69,84} +{68,51} +{32,20} +{21,7,5,60,35} +{100,40,18,98,37} +{50,96} +{87,10,12,27} +{47,3,46,43} +{60,87,10,31} +{92,87,50,37,72,73} +{99,61,77,87,29} +{23,95,31} +{96,100,43} +{17,64,84} +{13,19,57} +{65,86,4,75,46,69} +{49,60,99,37,50,11} +{77,82,88,12} +{12,95,66,98,63} +{83,78,68} +{76,14,87,25,29,14} +{20,9,99,73,67} +{42,51} +{36,22,33,6,63} +{53,46,22} +{40,89} +{37,7,89,17} +{32,89,16} +{65,87,4} +{16,16,57,35} +{34,90} +{80,54,1} +{11,93,34} +{5,19,31,50,99,33} +{98,1,33,54,7} +{45,39,23,78} +{37,47,98,83,10,5} +{55,88} +{42,76,18,99} +{86,31,25,5,45} +{67,87,47,1} +{23,15} +{78,88,66,96} +{58,55,41,67,86,41} +{21,53} +{90,14,28,38,95,71} +{20,5,13,52,1,88} +{29,98,50,75} +{91,3,24,75,82} +{62,33} +{56,69,31,95,66} +{46,85,40} +{17,22,67,57,39,16} +{58,25,92} +{31,53,82,64,69,40} +{40,12,30,1,39} +{78,10,42,40,25} +{58,27,1,12} +{28,11,80} +{36,89,69} +{50,95} +{61,63,59,62} +{51,77} +{90,24,88,84} +{61,27,57} +{51,81,33,75,48} +{47,30,33,23,44} +\N +{79,51} +{62,44,5} +{98,83,80} +{31,33,89,69,19,40} +{22,38,61} +\N +{90,70,10} +{37,90,49,65,95,52} +{95,42,4,47} +{92,100,43,31,27,1} +{39,17,88,20,2,80} +{82,64,36,84} +{31,18,21,18,52,34} +{3,35,36,33} +{26,39,69} +{67,63,66} +{54,85} +{65,71} +{26,14,84} +{63,82,73,30} +{66,79,21} +{71,13} +{57,25,40,14,22} +{63,9,91,31} +{70,63,36,32,93} +\N +{11,85,47,31,54} +{34,47} +{42,78,92,85} +{75,64,12,83} +{33,98,52,91} +{22,25,91,79,33} +{33,51,20,77,23,65} +{83,66,46,24} +{54,65,31} +{43,41} +{52,47,66} +\N +{59,85,85,63,83,53} +{16,76} +{44,97,48,52} +{26,36,72} +{26,55,98,7} +{70,88,7,87,62,37} +{11,42} +{98,38,36,72} +{51,90,82,33,92} +{59,80,79} +{76,77,18,71} +{34,56,62} +{85,12,37,66} +{34,64,74} +{77,63,28,76,11} +{2,63,87,50} +{60,98,60,19,15,57} +{93,66,33,71,36,3} +{41,94} +{62,72,87,19} +{57,83,36} +{63,64,21,13,70,32} +{71,36,9,55,34} +{92,52,90,45,88} +{59,54} +{4,51} +{55,25,35,90,93,2} +\N +{75,15} +{25,86,43,18,77} +\N +{31,40} +{55,49} +{67,1,84,20,9} +{15,1,48,18,100} +{62,46} +{4,39,86,55} +{49,17} +{65,20,71,49,55,49} +{40,57,63,14,3} +{48,68} +{67,97,58,55,5,34} +{3,73} +{79,97} +{82,63,87,66,32} +{19,49,96,50,55} +{32,19,41} +{17,53} +{64,81,70} +{66,75,18,92,54,93} +{7,94,38,86} +{16,62,45,19,10,11} +{18,47} +{58,96,69} +{65,25,58,98} +{29,51,37,40,44} +{91,78} +{37,84,85,65} +{70,61,31,22,32,22} +{67,12,99,39,78} +{41,79,46,54,84,22} +{38,26,43,4,45,75} +{29,68,35} +{69,59,69,33} +{4,46,52,49} +{1,25,44,12,71,29} +{38,75,99} +{83,58,86,6} +{93,35,35,34} +{85,26} +{15,46,95,60} +{62,63,65,49,10} +{44,67,19,80,83} +{63,41,30,43,85} +{13,46} +\N +{13,95,1,34,72,37} +{4,32,22,47,6} +{67,65,77,3} +{40,70,22,44} +{74,9} +{44,28,5,32,67,51} +{55,14} +{41,3,72,68} +{64,82,72} +\N +{11,88} +{91,90,92} +{68,66,95,80,58,54} +{30,49,11} +{54,86,59,69,67} +{56,83,36} +{15,67,9,47} +{92,30,78,2,87} +{12,54,2,1,59,36} +{84,25,67,38,19,53} +{28,45} +{54,84,9,75,59,26} +{47,35,54,93} +{36,96,59,75} +{78,78,52,93} +{87,96,67} +{5,61,15,13,27} +{53,58,6,78,86} +{43,70} +{72,38,15,61,58} +{75,27,30,12,35,71} +{18,72,35,62,81} +{45,10} +{36,91,73,25} +{81,85,22,34,29} +\N +{15,97,82,44,19,83} +{51,23,18,6,74} +{53,75} +{62,9,73,95,37} +{58,42,33,41,71} +{5,97} +{30,2,89,81,93,61} +{32,3,18,84,24} +{6,97,20,89,23} +{27,74} +{22,86,81} +{77,19,42} +{92,9} +{58,90,59,91,30,54} +{29,51,92,34} +{85,68,59} +{36,83,75} +{37,50,86,9} +{79,70} +{33,46,93} +{97,17,6,88,10} +{18,42,88,4} +{41,95,71,27,95} +{8,2,81,56} +{54,94,54,28,70} +{34,87,20,10,5} +{36,76,87,5,100} +{97,91,25,89,89,95} +{76,26,73} +{82,23,7,42,58,72} +{53,16,99} +{10,34,57,47,2,96} +{81,93,26,19} +{8,1} +{79,55,37,61,62,3} +{34,16,69,58} +\N +{41,7,99,87} +{70,21,86} +{59,2,49,45,91,97} +{37,2,74,2,61,68} +{97,39,15,4,13,1} +{67,71,8} +{51,2,84,38} +{55,8} +\N +{75,27} +{37,36,49,70,82,41} +{70,20,85,89,99,90} +{69,61,100,49,75,35} +{11,4,67,4,91,17} +{77,56,65,78,25,8} +{16,58,6} +\N +{88,38,19,88,27,27} +{12,46} +{36,67} +{62,33,96,94,80,96} +{56,94,12,1,65,54} +{58,73} +{19,80,27,72} +{47,55} +{14,91} +{94,75,92,32,19} +{99,12,91,4,85} +{56,55} +{86,83,77,66,66,87} +{46,68,13,45} +{49,75,62,35,39} +{20,25,33} +\N +{91,47,56,68,14} +{88,43,24,42,4} +{50,24,94,18} +\N +{71,54,91,66,97,22} +{81,16,19,67,6} +{78,46,81} +{63,93,71,75,87} +{90,38,10,85,12} +{11,24,93,42,25,77} +{30,14,32,67,70} +\N +{86,91,77} +{73,74,64,66} +\N +{7,18} +{85,94} +{37,15,55,100,59} +{55,18,44,79,57} +\N +{52,40,97,75} +{60,53} +{38,9} +{27,67,77} +\N +{43,83,82,24,35,64} +{22,75,29} +{9,19} +{67,1} +{15,35,11} +{65,45,95} +{65,9} +{63,84,99,89,6,77} +{20,44,31} +{82,50,88} +{29,12,46,21,98,7} +{98,71,3,73,6,86} +{61,44,74,2,45,33} +{16,56} +{31,87} +{72,30,37,94} +{65,30,82,17,12} +{86,19} +{55,76,96,61} +\N +{44,92,83} +{41,22,79,95,20} +{36,33,86,9,61} +{22,88,8,57,73,30} +{63,97} +{36,53} +{56,52,48} +\N +{35,8,3,93} +\N +{53,52} +{7,48,78,46,70,14} +{33,92,55,17} +{39,57} +{71,43,72,7} +{92,85,55,38,35} +{68,30,67,8,18,92} +{9,85,82,24} +{46,46,19,14} +{96,97,31,59} +{35,99} +{54,7,20,28,29} +{20,21,56,82,19,40} +{2,39} +{33,49,63,49,93} +{35,40,26} +{30,35} +{94,70,2,23,91,74} +{34,37,72,19,15} +{92,21} +{72,63,64,35,40} +{59,11,9} +{24,3} +{93,75} +{22,14} +{63,99} +{39,47,10,14,3,45} +{51,74,5,85,70} +{6,33,15,4,89,20} +{97,82,29,15,66} +{47,47} +{88,79,57,10,68} +{18,22,13,100,100,67} +{75,50,9} +{3,12,34} +{39,51,20} +{56,5,63,18} +{83,44,86,46,37} +\N +\N +{60,16,54,75,62} +{91,95} +{39,55,11} +{37,7} +{29,49} +{38,4,52,85,67,38} +{36,56,2} +{52,14,92,39,77,16} +{42,25,49,55} +{70,10,33} +{53,46} +{83,15,28,59} +{35,69,82,4,58,46} +{73,55,64,9} +\N +\N +{60,25,8,8,39} +{50,71,61,64,64} +\N +{65,67,67,34} +{77,59,18,64,16} +{43,72,32,44,59} +{55,57} +{12,47} +{30,75,89,81} +{23,92,16,31} +{64,45,21,74,19} +{4,47,49,47,96} +{37,14,20,18,87} +{61,45,38,39,1,87} +{4,98,99,52,27} +\N +{23,6,50} +{22,61,46,79} +{90,54,60,9,49,42} +{73,27,51,72} +{73,11,23,60} +{7,31,52,34} +{27,68,39} +{39,8,21,48,64} +{86,64,92,60} +{55,36,40,46,23,46} +{32,79,86,44} +{72,29} +{33,87,57} +{57,87,61,22} +{67,84} +{32,99,26,92} +{22,27,34,82,8} +{99,25,99} +\N +{29,75} +{39,63,25,45,7} +{39,67,18,13,18} +{23,83} +{77,69,22} +{60,13,46} +{2,10,42} +{37,20,27} +{30,21} +{85,15,52} +{6,89,38} +{68,22,26,37,96} +{6,85} +{93,51,63,46,26,64} +{79,77,15,26} +{90,6,39} +\N +{50,58,85,27} +{69,8,72,47} +{7,59} +{55,16,54,95} +{96,5,50} +\N +{77,92,13} +{46,30} +{43,65} +{17,65,32} +{10,6,46,1,47,75} +{48,82,71} +{63,12} +{68,14,10,97,34} +{15,45,58,100,7,74} +{9,23,88,1,95} +{61,60,15,12,58} +{84,51,46,41,71,26} +{58,62,39} +{86,67,31} +{32,31,89,2,30} +\N +{90,74} +{65,79,76} +{22,30,77,47,40,23} +{67,99,56,73} +{11,24,30,93,89} +{70,17,65,78} +{100,6,67,29} +{39,4,22,59} +{84,29,70,9} +{74,43,72,27,55,27} +{12,39} +{1,83,100} +{48,23,9} +{21,88,21,35,16} +{92,34,44} +{91,96,13} +{93,57,40,79,81} +{86,3,94,82,43} +{78,70,19,97,49} +{47,22,98,36} +{20,59,65,54,81,27} +{58,13,73,19,54,96} +{26,20} +{70,75,14,70,82} +{77,67,53,33,83} +{2,43,36} +{84,17,28} +{68,25,95,62,92} +{47,90,15,69,85,23} +{92,92,24,37} +{96,14,14,38,38} +{80,4} +{66,86,28,15} +{18,90,74} +{93,76} +{64,96,14} +{76,41,86,67,64} +{58,95,2,86} +{12,60,96,70} +{22,37,58} +{1,67} +{75,23,24,7} +{3,57,66} +{57,30,68,100} +{68,57,33} +{26,32,65,51,75} +{40,14,60,97,83} +{88,96,42} +{66,21,21,78,34} +{15,56} +{86,60,66,66,16} +{94,6,58} +{99,63,70,57,10} +{82,59,62,38,82,51} +{48,61,9,46,28,57} +{29,23,61} +{12,30,42,20} +{99,65,24,7,97} +{20,5} +{6,49,85,56,97,4} +{62,93,88,86,75,29} +{46,2,94} +{57,71,45} +{38,60,21,78} +{95,53,92} +{61,1,88} +{67,80,49} +{59,82,1,48} +{19,94} +{25,64,16} +{96,73,50,85} +{28,17,46} +{81,51,50,18} +{57,99,66,93} +\N +{23,62,57,94,40} +{21,6,83} +{4,11} +{83,16,50} +{46,41,23,1} +{4,15,8} +{86,51,29,80} +{48,34,55,81,89} +{5,2,43,67,66} +{42,59,37,91,1} +{14,98,27,80,33} +{18,58} +{49,93,60,91,94,88} +{32,62,64,63,48} +{51,1,90} +{56,8,68,49} +{16,34,79,18,76} +{66,88,41} +{31,66,93,44,96,40} +{100,99,30} +{37,49,95,91,18,43} +{95,2,94} +{84,15,70,31,30,84} +{31,41,45} +{9,73,2,7,34} +{17,35,43,1,25,72} +{8,70,8} +{1,93,32,16,71,61} +{98,51,27,56,46,65} +{1,11,57,72,33,7} +{48,96,64,55,75} +{83,82} +{7,74,70,29,59,60} +{29,44,5,77,52} +{84,58} +{87,63,62,52,69} +{29,58,32,11,13,17} +{35,99,67,67,93} +{54,31} +{53,24} +{58,59,32,22} +{8,76,23,63,94,54} +{3,88,75,17,64,91} +{29,30} +{3,81,39,9,77,82} +{77,85,59,56,8} +{47,12,63,13,40} +{66,81} +{67,33} +{39,46,28,79,95,67} +{49,13,98,63,10,58} +{14,42} +{80,70,60,92} +{63,54} +{30,70} +{60,89,14,62} +{56,40,94,55} +{70,31,46,20,95} +{18,65,89,7,75} +{60,33,80,43,37,4} +{85,19,98,79,36,84} +{69,1,48} +\N +{30,87,9,22,99,60} +\N +{23,96,9,85} +{22,94,39,58} +{30,38,4,97} +{16,70,62,5} +{35,52} +{32,10,72} +{35,34,40,31,66,80} +{7,77,14,48,97} +{67,64,37,22,69} +{51,53} +{67,71,90} +{87,71,45} +{44,84} +{19,58,11,34,45,85} +{68,19,55} +{27,16} +{7,14,92,22,33,46} +{47,2,49,53,63,32} +{15,39} +{13,47,84} +{29,74,97} +{51,74} +{70,26,46,33,51} +{31,86,14,23,61} +{20,85} +{21,10,57} +{90,94,59,72,97} +{97,30,74,84} +{15,89,69} +{11,40,2} +{68,19,47,28} +{47,65} +{2,7,52,53,44} +{40,74,34,36,78,71} +{22,60} +\N +{37,75,47} +{53,78,2} +{4,32,42} +{35,76,69,88} +{95,13,3,38,3} +{74,74,62,90} +{8,72,42,2} +{11,43,5,43,70,16} +{69,19} +{61,37,26,49} +{16,100,69,32,35} +{58,77,26,76} +{74,87,37,47,84} +{8,82,29,93,15} +{74,88,93,85,97,95} +\N +{29,23,99,98,36,93} +{8,36,87,64} +{71,90,43} +{7,28,78,46,52} +{62,25} +{33,90,7} +{60,72,39,18,86} +{98,59,73,24} +{17,69,2} +{49,16,63,56} +{13,37,62,1,95} +{98,89,69,92} +{50,26,34} +{90,16} +\N +{40,54,3,79,51,19} +{29,24} +{6,12,82,24} +{92,52} +{89,2} +{64,25,68,55,81,2} +{64,77} +{71,46,58,50,56,34} +{94,17,35,30,60,33} +{37,30,2,40} +{98,15,16,92,2,50} +{44,19,82,57} +{37,34,6} +{59,43,1,53,79} +{7,37,14,14,92} +{80,78,49,81,23,17} +\N +{91,51,12,35,79} +{9,14,2,84} +{62,3,77} +{25,5,40,12,40,79} +{65,88,82,94,89,90} +{20,35} +{80,71,83} +{6,9,83} +{94,58} +{2,76,55,61,42,53} +{60,53,45,82,3} +{1,37,75,96} +{82,61,81,10} +{36,46,1,31,90,45} +{22,55,11,25,21} +{69,13,29,20} +{95,54} +{16,79,82,67} +{4,58,84,84} +{52,7} +{25,14,94} +{69,8,67,54} +{30,71,36} +{81,78,23,38,76,58} +{86,59,61} +{11,42,63,74,99} +{66,4,55,34,16} +{39,57} +{10,81,9,8,21,10} +{75,55,64,97,7,45} +{8,46,86} +{39,100,52} +{30,51,7,13,54} +{72,85} +{10,52} +\N +{61,7} +{93,1} +\N +{74,31,3} +{90,96,26,84} +{88,58,74} +{28,45,74,24,74} +{95,88} +{42,70,43,64,22} +{46,83,48,36} +{81,99,100,43,11} +{47,24} +{46,67,63} +{26,15,36,89} +{90,11,78,70,81,87} +{65,90} +{89,99,21,81,47,38} +{37,42} +\N +{94,51} +{12,57,95,63,29} +\N +{68,99} +{27,8} +{16,52,11} +{72,5,85,44,57,51} +{11,6,91,7} +{87,80} +{94,61,1,38,77,89} +{93,60,6,98,46} +{52,47,44} +{93,66,61,22} +{7,61} +{15,83,93,91,12,40} +{66,3,5,72,72,36} +{67,72,68} +{42,42} +{38,17} +{75,60,47,39} +{58,28,51} +{61,8,61,81,65} +{46,52,97,84,27,47} +{97,53,47} +{64,93,83,72,27} +{34,79,34,36} +{25,5,92,37} +{12,20,55,94} +{17,43} +{39,37,16,70} +{79,62,15,16,64,28} +{80,87,96,41} +{51,55,1,94,72} +{75,22,56} +{2,55,7,20,39} +{8,91} +{73,8,42,73,31} +{90,90,23} +{82,68} +{63,64,68,12,59,19} +{100,80,23,24,17} +{23,46} +{25,13,31} +{43,95,54,85} +{40,62,21,21,82} +{70,20,16} +{90,11,23,18} +{16,9} +{51,57,30,27,21} +{50,55,75,77,53,33} +{84,92} +{14,66,32} +{44,100,16,30,82} +{41,48,58,60,7,44} +{81,76,13} +{18,26,82} +{84,35,15,98} +{52,84} +{13,80,36,35,28} +{91,16,71,55} +{87,89,6,20,28} +{12,75,92} +{48,41,55} +{59,75,26} +{48,19,48,72} +{91,4,100,25,17} +{46,52,97,78,94} +{7,81,76} +{54,54,49} +{89,37} +{78,22,57} +{75,25,83} +{25,89,10,38,96} +{52,12,1,74,35} +{13,48,88,7} +{6,97,20,19,91} +{53,2,99,76} +{4,58,46} +{30,30,89} +{97,2,87,47,55} +{14,11,72,83,97,74} +{44,69,11,51} +{47,17,86,27} +{15,19,56,96,24,94} +{81,67} +{11,11} +{20,94,49,36,39} +{39,78,40,46} +{33,87} +{76,89,58} +{94,74,25} +{33,77,5,47,55} +{28,67,99,81,93,83} +{31,10,19,65,60} +{53,25,74,24,48} +{73,69,23,45,88} +{70,56,41} +{21,73,72,28,99,5} +{75,69} +{78,99} +{66,49,89,86,2} +{30,53,18,21} +{67,69} +{1,98,38} +{91,25,16,39} +\N +{75,54,93,39,18} +{96,84} +\N +{64,71} +{6,15,78,50} +{8,45,26,15,25} +{8,90,94} +{52,66,13,98,86,69} +{3,25,28,56,88} +{84,72,89} +{10,33,46,6,57,100} +{13,91,99,2,49} +{83,59} +{88,64,42,50,77,16} +{81,12,27,45} +{12,17,31,93,22,53} +\N +{28,84,85,35,3} +\N +{42,12,86,76,37,63} +{46,23,18} +{45,80,76} +{94,18,100} +{17,80,84,80} +{84,88,29,16,10} +{7,42,90,51,33,40} +{79,51,22,2} +{31,30,72,24,23,84} +\N +{55,50} +{69,47,82,29,83} +{94,56,69,18} +{7,81,71} +{95,13,32} +{66,59,68,62} +{52,19,62,51,80,32} +{38,18} +{73,24,81,58,22} +{11,59,41,19,96} +{61,11,56,89,89} +{61,72,9} +{63,12,8} +{76,54,75,84,6,44} +{74,3,11,62,30,74} +{46,60,71,55} +{28,47,52,71,33,33} +{35,51,37} +{38,89,40,29,30} +{18,26,99,89} +{36,44,8,100,72} +{1,23,6,5,23} +\N +{84,17,16,44,81} +{29,70,24,85} +{23,57} +{20,98,30,23,1,66} +{82,3} +{70,7} +{15,49,58} +{19,40,70,88,35} +{45,10} +{62,89,47,71,55} +{34,100,88,44,3,91} +{92,65,16,24,7,9} +{20,12,61,95,7} +\N +{57,49,42,87,88,14} +{89,99,86,31} +{32,55,51,78} +{55,66,78,10,12} +{37,19} +{13,5,36,66} +{89,7,40,45} +{41,58,41,24,11} +{98,8,9,27,40} +{49,83,89} +{91,36,78,44,100,62} +{76,78,9,52,57,27} +{100,59,37} +{51,1} +{92,83} +{45,1,85} +{8,81,45,94,32} +{52,26,9,98,7} +{97,52,4,85,13,11} +{94,38,58,4,72,91} +{5,39,26,14,74,51} +{31,44,37,24,89} +{8,74} +{56,93,36,3} +{23,46,25,90,42} +{4,98} +{31,95,27,26,20} +{3,7,79,9,90} +{29,22} +\N +{35,34} +{80,28,12,21} +\N +\N +\N +{36,49,94,83,25,9} +{6,62,89,93,59} +{67,75,3,93} +\N +{94,62,3} +{97,36} +{43,89,26,94} +{46,56,22} +{50,15} +{45,47,39,61} +{23,32,24,45,43,11} +{97,66,29,8,52,67} +{37,1,48} +{30,84,86,91} +{4,46,59,35} +{76,37,41,90} +{26,28,92,27,88,17} +{76,37,27,41} +{74,51,31} +{16,33} +{66,85,68} +{4,81,72,62} +{65,14} +\N +{11,43,28,14,9,43} +{60,88,95,1} +{52,92,69,48} +{37,81,85} +{57,73,8,79} +{50,26} +{52,41,99,6,33} +{9,34,58,22,9} +{56,37,19,77,50} +{93,21,18,90,41,40} +{28,89,76} +{4,36} +{89,54} +{70,28} +{66,11,3,47,30,43} +{69,54,86} +{45,41,57,34,18} +{91,46,32,68,42,68} +{25,87} +{75,57,12} +{55,15,68} +{6,63} +{22,39,88} +{77,39,10} +{39,49,69,61,66,77} +{78,25,42,73,89} +{17,47,36,27,79} +{33,83,44} +{27,75,12,96,94,87} +{50,17,95,42,25} +{67,13,22} +{59,85,95,2} +{81,57,83} +{25,11,72} +{32,84,97,6,65,52} +{62,25,24,27,50} +{80,64,23,74,54,75} +{97,17,15,100} +{50,11,41} +{57,82,40} +{10,90,41,52,39} +{4,11,86} +{79,17,51} +{48,100,92,77,58} +{88,67,19} +{40,96,52,35,16} +{89,63,32,81,28,63} +{44,56,66,50,55} +{28,73,46} +{32,40} +{52,65,85} +\N +{51,34,18,82,83} +{49,49,90,71} +{84,16,74,78,86,10} +\N +{73,9,47} +{51,59,49,90} +{85,13,78} +{98,77,18,15,92,85} +{40,94,66,94} +{89,51,80,12} +{23,26,75,17} +{96,2,51} +{88,62,90,32} +{85,19,87,89,30,15} +{33,38,9,46,19,87} +{27,45,15} +{39,79,82,88} +{31,33} +{41,64,10,1} +{35,61,22,76,74} +{75,11,90,16} +{71,23,43} +{35,3,97} +{88,4,97} +{100,61,28} +\N +{64,74} +{9,44,81,98,55} +\N +\N +{76,89} +{18,34,80} +{77,83,91,50,20,41} +{65,50,26,65} +{79,18,90} +{5,60} +{42,21} +{31,70,80} +{20,98,15,14} +{58,65,45,6,64} +\N +\N +{88,82,98} +{75,81,32,34,59} +{37,14} +{30,36,55,70,65} +{84,55,26} +{56,64,1} +{31,41,89} +{46,43,43,90,34,100} +{78,36,21,14,69} +{100,10,45} +{73,69} +{60,86,5,70,78,99} +{6,89,92,8} +{86,68} +{44,4,71} +{41,36} +{95,80,42,94,34} +{73,29,50,49} +{61,20,57,17,36} +{37,58,67} +{56,83,77,37} +{98,67,40,10,35,76} +{54,84,6} +{7,71} +{65,74,43,6} +{62,98,74} +{81,26,17,22,47} +{49,32,59,35,11,94} +{80,50} +{91,1,50,97} +{71,35,84} +{97,4,46,45,8,36} +\N +{81,62,76} +{69,78} +{89,3,16,64,17,17} +{78,72,26,88,81} +{25,34,9} +{50,27,34} +\N +{55,44} +{61,51,39,53,44,46} +{23,94,32,92,90} +{91,47,67} +{1,13,76,57,63} +{77,19,73,18,95} +{100,82,87,6,83,23} +{69,58,48,97,60,50} +{4,83,85,6} +{3,5,91,37,94} +{91,72,31,32,80} +{57,23,39,46,50,20} +{92,28,53} +{71,27,46} +\N +{59,73,29,21,89,30} +{1,83,96} +{34,41,65,35} +{52,89} +{62,68,80,7} +{82,82} +\N +{11,2,62,46,28,9} +{9,16} +\N +{22,44,73,82,39,86} +{97,52} +{46,36,76,56} +{17,97,26,72} +{16,78,9,70} +{65,55,30,91,16} +{27,45,76} +{17,5,90} +{86,52,93,89,42,27} +{51,70,41,35,1} +{91,57,66} +{53,59,62,57,52,56} +{100,100} +{32,78,87} +{61,57,74} +{86,79} +{55,94,64} +{81,20,26,22,23} +{9,96} +{86,65,35,19,88} +{1,37,90,51} +{79,47} +{93,93} +{32,85,69} +{49,12,6,69} +{6,44,92,37} +{28,42,57,28,2,69} +\N +{63,90,25} +{53,28,74,42} +{83,79,94,37,64,69} +{93,100,57,84,80} +{39,93,80} +{97,92,55} +{27,6} +{20,100} +{19,66,3,66} +{7,76,15} +{7,56,92,11} +{61,76,6,98,52} +{20,46,51} +{12,77,45,67} +{78,79,32,22,21,47} +{62,35,1} +{86,66,57,10,47,43} +{43,24,76,18,87,68} +{39,52,71,35,87} +{81,78,8,10} +{33,70,53,54} +{25,77,27,68,95} +{29,53,89,62,51} +{21,76,33,72,39} +{13,22} +{1,1,51,73,20} +{26,97} +{64,75,23,94,62,68} +{25,20,84,57,27} +{26,7} +{92,80,17,48,72,73} +{73,49,88} +{24,36,70,53} +{7,79} +{80,58,33,25,91} +{19,43,61} +{54,49,73} +{51,88,4} +{9,32,5,83} +{17,68,90,15,30} +{98,50,42} +{29,52} +{32,41,4} +{33,97,69,34} +{94,2,60,5,83} +{23,86,43,74,35} +{63,37,38,58,39,14} +{56,7,82} +{88,81} +{50,75} +{78,49,67,68} +{10,61,58} +{84,35,20,30} +{36,34,48,31,16} +{35,7,47,22} +{98,40,56,43} +{16,4,7,9,44,55} +{86,90,30,80,47,91} +{34,91} +\N +{12,67,77,23,11} +{94,8} +{5,68,31,82} +{26,65} +{51,19,86} +{55,83,39,39,96,51} +{31,22,70} +{20,50,15,93} +{1,55,64} +{8,2,14,3,40} +{2,71,25,41,5,5} +{98,61} +{21,64} +{100,76,99,18,78} +{17,4,69,97,61} +{52,79,97} +{52,26} +\N +{90,54,2,62,11,51} +{33,12,34,45,2} +{91,63,51,42,82} +{100,79,73,70,54,14} +{57,94,81,55} +{13,18,94,17,16,34} +{58,79} +{90,64,68,46,95} +\N +{37,46} +{91,94,10,85,100,24} +{65,86} +{94,89,7} +{72,79,77,53,95} +{65,19,92} +{41,79,53,8,63} +{28,60,50,42,9,32} +\N +{6,23,97,23,10} +{12,28,16,39,70,50} +{26,97,61,48,79,23} +{38,98,21,34,65,89} +{29,13,36,19,13,45} +{72,65,58,81} +{43,98,84,5} +{79,41,100} +{35,30,69,42} +{59,13} +{65,90} +{40,38,21,23} +{2,19,26,38,66} +{5,16} +{84,85,97,84} +{34,26} +{87,17,21,32,29,25} +{75,66,87,90,18} +{84,32,29,51,71,68} +{57,25,73,24,53,2} +{74,16,92} +{99,60,19} +{98,14,70,72} +{24,34} +{37,34,81,100} +{67,10,17,60,16,55} +{39,58,5,23,85,95} +{75,93,19,31,47} +{13,27} +{42,14,32,90} +{59,79,70} +{48,96,45,38,58} +{96,87,84} +{23,70} +{25,31,81,36,75,32} +{64,49} +{30,18,38} +{69,27} +{76,82,43,96,73,17} +{84,95,97,12,20} +{57,69,36} +{60,79,19,67,9,12} +{32,39,3,21} +{55,83,51,48} +\N +{37,11,98,53,11} +{2,73,24,18,77,74} +{69,96,17,49} +{53,2} +{1,76,72} +{35,93} +{35,36,36,25} +{59,77,30,13} +{35,69,36,31} +\N +{20,23,51} +{81,83,57} +{87,43,40,56,81,64} +{24,63} +{29,51,45,93} +{73,85} +{59,1} +\N +{13,57,14,11,34,91} +{69,1,4,28,77} +{63,68,41,53,64,43} +{11,1,46,40,6,88} +{51,19,77,10,86,66} +{74,40} +{25,54,46,62} +{94,17,64,15,20,36} +{100,71} +{63,66} +{33,88,5,92} +{92,86} +{91,69,75,13,20} +{57,22,32,33} +{72,87,44,64,46,6} +{50,56} +{36,23,7} +{74,63,3,6,14,29} +{91,42,8,11,49} +{32,64,94,88} +{91,78,55,27,59} +{2,20} +{52,95} +{57,59,35} +{51,15,52,24,14,13} +{64,16,18} +{50,98,71,10} +{92,99,92,80,77,73} +{96,12,70,85,54,73} +{10,44,30,77} +{29,47} +{40,55,62,58,30} +{59,93,7,21,6,20} +{58,91} +{5,70} +{36,23,58,80} +{16,93,54} +{20,8,97} +{78,32} +{10,31} +{24,10} +{56,14,28,10,45} +{1,79,53} +{56,58,86} +{93,83,17,89,93} +{12,4,26,45,97,17} +{42,67,17,13} +{31,90,59,38,4,20} +{86,52,67,10} +\N +{49,59,10,25} +{69,88,31,38,7,36} +{84,21,57} +\N +{60,8,19} +{35,81,66,96} +{13,95,54,38,31} +{27,25,34,11,65,64} +{54,43,20,20,65,95} +\N +{19,27,100,69,43} +{91,8} +{30,65,98,87,84} +{83,85,100,16,20,18} +{80,48,56} +{61,5,92} +{14,94,43,91} +{35,52,60,43} +{73,25,26,61} +{66,41,39,16} +{2,96,90,37,99,92} +{25,31} +{72,57,50,82} +{40,69,5} +{98,34,66} +{90,44} +{34,78,93,15,65,71} +{98,1,28,36} +{16,59,79} +{88,1,14,45} +{41,91,87,20,72} +{46,9,81,90,63,32} +{2,84,29,56} +{2,57,92,69,63,46} +{3,32,76,62,36} +{11,81,3,81,90,16} +{36,1,42,51} +{29,86,53,51,85} +{17,66,16} +{4,21,25,17,65,92} +{13,26,33} +{74,6,46} +{69,19} +{47,78,85,46,41} +{41,62,100,85} +{22,71,66} +{28,15,58,84,22,92} +{68,82,82,85,15,54} +{34,58,72,35,99} +{51,100,40,13,61} +{80,89,94,31,96} +{48,29,33} +{32,85,75} +{76,43,17} +{79,70,3,64} +{76,64,85} +{94,90,3,85} +{86,21,1,8,54} +{87,92,30,36,59} +{20,51,62,17} +{81,61,86,96,47,67} +{5,75,97} +{60,24,79,3} +{85,49,49,48,61} +{66,60,58,92,88,90} +{2,18} +{42,54} +{42,83,68} +{98,76,42,25,90,32} +{64,36,39,45,34,95} +{56,43,78,10,63,18} +{51,40,98} +{85,11,74,41,14,25} +{37,12} +{76,32} +{6,77,16,86,36,25} +{23,93,18} +{75,51,67,29} +{22,9} +{18,58,25,88} +{95,31,12,20,62,54} +{23,97,89,63,73} +{77,41,11,27} +{91,86,97,98} +{84,6} +{74,69,55} +{58,42,92,65,52} +{77,31} +{8,91} +{5,83} +{64,48} +{1,37} +{51,4,49,97,64} +{29,70,3,62,57,1} +{91,8,31} +{86,71} +\N +{61,50,8,6,59,76} +{83,8,54} +{50,45,66,86,52} +{75,48,18,88,82} +{1,52,60,78,45} +{46,65} +{53,2,63} +\N +{89,97} +\N +{75,23} +{30,58,13,50,2} +{59,73,52,8,70,39} +{20,35,77,34,10} +{55,86,14,74,14} +{67,46,48} +{20,9} +{20,92,62,75,34,98} +\N +{72,14,18,46} +{48,71,92,17,31,13} +{47,46,42} +{42,75,14,86} +{97,55,97,78,72} +{8,4,96} +{44,13,13,18,15} +{16,40,87} +{87,66,79} +{14,44} +{35,79,25,57,99,96} +{23,66} +{90,49,24,11,8} +{50,3,24,55} +{60,94,68,36} +{11,20,83} +{66,100,47,4,56,38} +{36,34,69} +{41,57,15,32,84} +{32,25,100,45,44,44} +{70,32} +{15,37,67,63,71,34} +\N +{81,62,20,91} +{32,62,1,68,86,54} +{20,91,40} +{79,69,22,98,14} +{45,42,24,2} +{30,53,15,62} +{81,100,42,20,96,42} +{93,19,7,59,100,49} +{25,7,18,64} +{11,27,1} +{89,67,65} +{39,97} +{47,62,30,61,58} +{4,11,83,18} +{38,30,95,58,13,81} +{83,6,33,73,64} +{89,51,77,45,58,16} +{13,11,88} +{96,79,71} +\N +{18,66,83,52,84,76} +{52,17} +{74,95,16,5,16,51} +{21,20,16,39,84,71} +\N +{75,47,36} +{65,45,12,5,100} +{41,74,84,21,73} +\N +{8,90,46,39,30} +{47,84,42,49,17} +{76,100,35,89,17} +{61,53,50,31,8} +{94,53,20,33,15} +{97,46,62,85,74} +{8,59,40} +{95,71,21,41,85,81} +{55,71,20,74} +{70,95} +{61,42} +{83,74,25,84,18} +{56,43,46,40} +{42,78} +{95,48,98,93,35,98} +{77,34} +{4,54,58} +\N +{13,54} +{87,66} +{12,88,90,95,6,95} +{65,20,10} +{62,74,59} +{49,17,51} +{14,17,65,3,27,41} +{43,42,43,46,79} +{88,75} +{21,46,84,95,31} +{17,17,28} +{32,73,29,11,46,94} +{3,34,81} +{80,83,1,92,69,100} +{9,24,56,17} +{3,80,57,36,14,94} +{39,89,54,17,31} +{70,19,67,21,31,72} +{82,48,68,52} +{96,81} +{92,18,39,50,18} +{6,54,27,52,28,100} +{23,40,7,74,93,50} +{87,51,38,88} +{98,42,43,30,8,71} +{33,26} +{20,21,83,35,99,100} +{28,77,94,32,1,13} +{17,15} +{35,100,9} +{42,6} +{16,28,55} +{7,94,81,60,91} +{100,63,21,28} +{65,20,35,16,76} +{95,3,88,62,1} +{73,44,46,13,55,69} +\N +{60,49,71,77} +{93,39,75,63,69} +{97,36} +\N +{77,16} +\N +{57,30} +{39,31,56,51} +{62,78,62,38,54} +{69,86,99,10,12} +{11,43} +{60,70,83} +{83,82,3,1,60} +{24,55,61,85} +{65,72,13,77,79,100} +\N +\N +{28,97,71,78,68,95} +{34,1,72,79,84} +{10,49,91,44,27,51} +{15,48,80,37,69} +{42,46,32,34,86} +{80,21,26,50,5,8} +{61,71,100,78,54,50} +{36,20,80} +{67,40,47,68} +{60,7,36,36,55,2} +{32,91,13,98,88} +{15,56,65,23,13} +{20,66,81} +{19,36,99,54,86,92} +{82,28} +{43,32,91,37,70,68} +{71,78,82,50} +{1,31,23,48,10,12} +{88,96,1,44} +{27,49,97,29,89,35} +{63,72,58} +{79,9,32,64} +{75,67} +{46,31,83,54} +{66,24,6,89} +{82,10,64} +\N +{19,31,52,34,89} +{16,36,11,12,23} +{55,50,6,20} +{81,72} +{71,74,8,6,31} +{6,20,96,80} +{95,85,56,91} +{36,33,88,12,50} +{77,44,52,50,50} +{94,12,7} +{97,44,40,43,8,21} +\N +{61,14,40,75,87} +{43,21,67,66} +{46,19,80,12,46,28} +{56,11,14,59} +{31,94,50} +{45,26,61,15} +{84,45,44,82} +{9,16,86,54,93,30} +{50,39,37} +{35,60,64,55,73,90} +{61,65,87,20,30} +{12,59,44} +{23,8,97} +{30,59,7} +{85,32,14,95,38} +{18,91} +{10,40,20,8,58} +{5,58,4,94} +{100,11,96,70} +{66,72,7} +{5,31,89,89,4} +{81,68,44,37} +{22,22,76,67,72} +{22,26,30} +{73,47,27,18,54,30} +{44,13,73,95,83} +{18,93,72} +{30,22,73,13,16} +{14,11,66} +{45,33,59,72,92,81} +{97,82} +{30,4} +{1,9,46,70} +{47,50,20,71,48,60} +{26,62,53,70,63,49} +{39,26} +{47,94,9} +{55,3,18,1,75,22} +{42,87,74,57,60,55} +{95,46,21,38,27} +\N +{13,35,48} +{24,39,24,67} +{44,83,49,72} +{22,8} +{77,39,87} +{37,41,44} +{100,57} +{48,54,58,79} +{14,84,40} +{11,51} +{23,80} +{80,82,43,59,2} +{92,53,56,44,90,66} +{44,67,78,9} +{43,91} +{70,74,100,69} +{12,5,75} +{65,51,22,65,56,36} +{52,54} +{38,78} +{30,45,38,99} +{18,88,88,63,51} +{61,24,53} +{72,24,77} +{61,46} +{11,83,49,86,27,60} +{86,60,83,34,33,28} +{65,15,10,51} +{98,92} +{49,49,60,3} +{58,56,43} +{19,25,15} +{24,40,36,49,61} +{5,62,9} +{72,8,71} +{64,85} +{72,84,67} +\N +\N +{80,87,30,70,21} +{30,86,95,19,21} +{17,90,15,89,81} +{40,51} +{77,88} +{14,89,82,62} +{40,66,93,16,55,45} +{22,46,31,17,4,71} +{8,41,88,94,25,61} +{80,8,23,71,59,53} +{61,70,23} +{2,4,79,6,67} +{27,70,42,68,33} +{46,27,10} +{1,93,42,12,8} +{31,9,19,32,62,15} +{16,42,81} +{56,29,12,17,61} +{52,100,98,42} +\N +{29,38} +{49,40,47,63,22,4} +{99,70,13} +{70,28,67,100} +{37,75,65,63,35} +{45,67,37,28} +{42,78,71,39} +{33,35,76,69} +{65,84,57,63} +{17,12,86,23} +{31,62,79} +{3,22} +{85,81,59} +{38,5,15,100,1,27} +{36,96,93,46,75} +{44,61,85,70,71} +{79,72,86,71,77,9} +{23,51,47} +{4,59,48,38,44} +{93,54,86,98} +{60,29} +{49,38} +{54,84} +{72,25} +{51,40,25,27,68} +{24,17} +{95,3,82,31,95} +{56,37,57} +{15,84,98,16,53} +{47,36,15} +{27,36,76} +{38,82,26} +{47,70} +{60,89} +{59,73,99,7,28,89} +{87,49,70,76} +{71,93,76,81,11,46} +{74,87,92,24,43,22} +\N +{26,1,85} +{18,73,43,94} +{92,2,73} +{5,58,85} +{20,7,39,18,59,90} +{11,16,19,77,60,56} +{77,1,95} +{4,4,11} +{48,40,56,74,96,29} +{71,1,62,69} +\N +{34,61,26} +{86,75,13,73,28} +{17,35} +{100,29,37,26,47} +{69,36,52,61} +\N +{81,51,54} +{54,78,46} +{1,78,96} +{33,54} +{72,9,37,30,100} +{67,10,52} +{77,19,74} +{52,27,41,37,98,73} +{8,74,86} +{4,40,99,6,59} +\N +{98,43} +{74,91} +{69,45,73,59,19} +{87,43,31,85} +{2,51,54,3} +{45,73,8,86,4,40} +{2,51,96} +{74,5,8,64,1,46} +{5,64,86,63,12,75} +{6,62,71,24} +{56,84,54} +{61,37,79,63} +{81,39,78,23,86,74} +{50,79,34,23} +{85,36,78,80,19} +{34,94,1,46} +{5,23,38,4,78,2} +{85,100,80,13,73} +{48,86,9} +{47,22,65} +{49,81,18,52,36} +{84,85} +{89,15,71,88,44} +{1,21,81,52,2} +{53,18,7,53,50,11} +{91,89} +\N +{20,6,20,70,12,32} +{98,94,70,52,41,35} +{43,25,2,63} +{95,86,6,82,2,41} +{79,24,63} +{12,96,7,18,48,67} +{55,35,4,75,28,39} +{48,46,33,75} +{10,99,5,5,98,25} +{43,87,5,53,76,64} +\N +{100,13,9,4} +{4,35,65,56} +{27,74,88} +{59,66,10} +\N +{59,85,39,48,17,29} +{59,42,17} +{27,99,12,21} +{9,10} +{15,4,80,25,67,59} +{12,89,96} +{50,32,92,49} +{40,74,10,6,26,43} +{80,71,29,54} +{74,82} +{22,25,27,65,12} +{84,88,53,43,75} +{84,16,51,84,46} +{10,9,44,95} +{87,19,22,10,44,80} +{18,20,87,41,86} +\N +{9,64,4,33} +{65,87,23,65,32,92} +{50,2,23,68} +{29,8,82,28} +{54,92,6,2,28,70} +{23,11,65,78,34} +{77,85} +{30,49,59,8,60} +{77,30,34} +{55,73} +{89,68,55,81,8,81} +{54,28} +{35,22,67,63,48} +{43,37,46,56,81} +{16,78,32,81,77,37} +{35,80,41,76} +{4,93} +{3,32,23} +{43,18,50} +{87,5} +{30,40,91} +{36,69,17,82,70,57} +{73,71,47,63,58} +{24,11,36} +{2,72,61,76,9} +{61,97,10,85,92,56} +{5,44,47} +{24,57,79} +{69,39,97,8} +{78,16} +{62,52,17,35,28} +{48,79,66,64,36} +{14,72,75,30} +{17,21,41,25} +{28,100,66,56,15} +{89,3,32,86,6} +{67,34,16} +\N +{48,27,70,60,1,40} +{69,34,36,46,95} +{59,24,84} +{44,21,90} +{22,30,5,62,13,58} +{79,67,44,10,1} +{67,8} +{40,48} +{64,5,65,35} +{74,45,75,15,31,69} +{42,3,49,33,52,97} +{86,59,69,84,53} +{64,64,41,64,99} +{47,95,16,78,73,68} +{54,11,52,90} +{54,62,79,58,96,59} +{28,34} +{52,94,17,42,9} +{94,22,77,7,56} +{72,24,47} +{6,11,3,23} +{9,6,97,82,40,39} +{73,47,57,8,7,97} +{27,26,1,2} +{64,45,38} +{71,6,6,83,33} +{78,28,40} +{25,8,17,15} +{24,67,53} +{72,42} +{66,25,56,36,32,93} +{18,11,22} +{88,9,75,23} +{20,32,24,44,51,34} +{76,86,11,7,1,61} +{11,77,41,55,87,59} +{62,53,94,46} +{77,20} +{74,97,59,78,9} +{7,94,26,18,77} +\N +{49,59} +{72,22,42,89,14,80} +{49,14,38,19} +{43,88,25,58,39,24} +{21,34,37,65} +{85,3,46} +\N +{11,60,86,65,49,83} +{51,98,7,28} +{85,17,34,59,14,86} +{89,81,48} +{67,40,11,60,75} +{13,45,42,22,82,82} +{98,21,89} +{30,63} +{35,45,68} +{9,29} +{43,71} +{82,44,59,72,48} +{1,48,29,44,14,11} +{75,33,85} +{7,32,92} +{62,14} +{29,31,1,36,51} +{92,12,28,20} +{13,67} +{88,72,14,22,61,42} +{15,98,49} +{65,27,9,76} +\N +{15,95,26,12,52,40} +{17,20,74} +{57,63,15,22,38} +{93,71,8} +{26,84,82} +{20,52,3,3} +{72,95} +{10,9,80} +{9,9,18,51} +{74,24,63,63,57,89} +{64,91,95,18,15} +{64,37,20,36,74} +{52,9,53,6} +{17,31,42} +{3,73,92,13,62} +{57,81,58,49} +{52,56,2,26,18} +\N +\N +{90,90} +{16,92} +{66,51,7,19,10} +{100,81,69,86,95} +{48,64,81} +{87,54,73} +{6,80,100,24,26,8} +{44,67} +{27,94,2,25,34} +{80,25} +{12,2,77,75,15} +{63,14,30} +{85,75,59} +{72,73,54,44,25,76} +{95,44,69,91,62} +{94,73,78,5} +{28,52} +{86,31} +{69,90,95,66} +{6,10} +{68,72,112} +{9,165} +{91,132,164} +{57,82,144,167,184} +{3,6,101,118} +{111,158} +{22,29,30,174} +{41,66} +{39,76,189} +{7,20,21,196} +{52,126,169,171,184} +{21,77,91,176,196} +{16,97,121} +{83,135,137} +{8,140,160,164,165,195} +{38,65,185} +{112,152} +{111,129,134,148} +{47,80,114,135,147,165} +{24,98,119,123} +{43,48,60,147,154} +{19,54,138,171,186} +{156,175} +{20,51,123,193,193} +{37,41,136,173,192} +{14,22,111,125} +{44,125,160,184} +{19,75,99,103,107,164} +{24,113,145} +{27,157} +{12,107,133,134} +{72,94,102,158,194} +{104,157} +{122,171} +{28,47,89,104,112} +{25,35,82,105,155} +{106,107,139,181} +{50,110,132,136} +{90,110,166} +{1,1,55,60,85,108} +{8,22,31,106,172,196} +{24,69,109,121,154} +{0,26,44,59,132,175} +{103,125,172,188,190} +{11,23,78,109,131} +{81,146,169,181,196} +{2,84,113,189} +{8,46,126,131} +{13,73,73,125,127} +{67,117,139,184} +{29,65,77,120,182} +{0,87,100,102,135} +{111,146,156} +{13,87,123,137,182,197} +{60,61,164} +{7,20,186} +{0,24,53,135,147} +{94,136} +{47,168} +{70,80} +{43,148} +{3,81,104,191} +{104,171,189} +{9,14,117,160,180} +{67,158} +{50,57,66,78,170,197} +{31,60,73,101,193,197} +{37,89,92,96,127} +{29,179} +{17,47,137,155,157,187} +{33,77,154} +{48,63,85,150,184} +{32,53,61,95,172} +{20,35,47,171,179,196} +{2,17,40,169,184} +{116,127,131,142} +{16,26,27,87,164,198} +{58,129} +{67,98,108,132,157,197} +{145,157} +{13,49,56} +{59,103,180,196} +{35,65,104,106,120,126} +{18,96,115,133} +{27,61} +{61,194,197} +{11,27,36,94} +{15,36,101,128,197} +{51,62,115,149} +{83,198} +{30,120,127,145,184} +{50,149} +{13,35,87,117,135,158} +{57,60,74,113,128,178} +{11,90,123,163,170} +{39,121,148,171,198,199} +{30,77,78,137,140,162} +{52,69,120,141} +{9,100,137} +{56,161} +{44,57,75,110,154} +{98,123,155,167} +{10,60,85,105,164,168} +{13,92,179,186} +{13,171,173,176,178} +{33,53,88,123,144,172} +{21,57,70,131,151} +{13,51,63,169,169} +{36,104,119,166} +{54,59,84,166,172} +{7,87,100,102,142,187} +{2,5,6,43,174} +{4,26,29,59,77} +{10,82,98,103,104} +{104,147} +{47,55,99} +{102,154,165} +{0,96,107,139,157,159} +{66,167,174} +{92,97,117} +{21,75,180,185} +{54,64,139,180} +{23,141,189} +{32,38,147} +{82,87} +{6,34,34,161,183} +{25,64,69,97,122} +{80,152,170,189} +{44,78,143,162} +{52,53,64,69,112,158} +{77,80,123,150,175} +{110,121,125,125,128,198} +{0,8,57,104,127,188} +{17,46,48,93,129,150} +{135,193} +{89,111,135,166,184} +{132,181} +{47,54,101,108,125} +{18,55,103,142} +{11,125} +{18,49,58,68,122,153} +{37,47,137,179,185} +{57,78,167,187,192} +{28,32,38,67,77,184} +{67,83} +{43,104,191} +{22,40,118,194} +{24,53,66,195} +{27,87,89,101,130,191} +{71,86,157,167,183} +{31,87,102} +{48,53,70,101,149,174} +{21,33,59,129,195} +{144,160} +{4,8,174,194} +{69,103,127,127,160} +{6,29,62,77,132} +{61,69,108,144,174} +{51,55,109,128,153} +{10,30} +{2,5,6,70,146,183} +{0,1,75,97,166,180} +{53,78,104} +{31,45,68,108,161} +{3,40,78,103,109,130} +{33,44,159} +{28,82,93,136,148,157} +{31,32,76,143,157} +{2,55,106} +{21,66,80,129,129,152} +{1,34,59,128,154,195} +{10,154,172,177} +{2,7,31,47,82,125} +{60,131,149,156} +{20,141} +{23,38,43,100} +{51,70} +{3,41,164} +{126,160,165,169} +{61,71,143} +{65,70,81,100,146} +{40,48,57,75,85,85} +{116,153} +{31,42,49,103,183} +{28,44,62,85,133,177} +{50,68,164,170} +{4,26,60,87,119,141} +{5,102,160} +{20,129,177} +{98,120,135,157,164,168} +{66,150} +{101,101} +{164,187} +{43,65,96,166,189} +{18,36,58,109,118} +{25,32,135,161,170} +{55,104,183} +{69,139,144,181,182} +{84,131,155} +{6,18,63,156,159} +{7,66,67,88} +{8,46,52,95,178} +{58,58,83,119,119,163} +{27,143} +{78,80,122,149,164,176} +{6,83,107,183,198} +{86,199} +{22,74} +{28,62,64,114} +{15,56} +{41,97,139,152,161,161} +{48,192} +{16,62,99,138,155} +{32,84,145} +{108,137} +{93,112,120,155} +{73,117} +{20,26,197} +{4,141} +{110,132} +{95,133,142,152,183,193} +{85,141} +{53,76,86,131} +{5,59,73,74,101,130} +{0,1,64,151,188} +{15,131,131,174} +{80,98,106,187} +{41,102,167,173} +{9,42,133} +{103,110,110,134,175,185} +{168,187} +{42,47,108,121,165,198} +{81,171} +{38,122,123,149} +{16,79} +{45,64,131,176,182,197} +{35,82,87,100,123,196} +{41,52} +{33,68} +{60,140} +{12,41,152} +{54,71} +{88,95,95,146,148,180} +{47,66,89,121,168,182} +{15,70,94,122,137,154} +{42,48,129,162} +{70,151} +{11,55,89,118} +{36,74,121,130,152} +{46,48,52,120,179} +{70,81} +{96,146,183} +{76,78,108,153} +{71,168} +{66,106,108,167} +{22,44,49,85,87,195} +{17,52,143,175} +{86,103} +{16,46,176} +{95,111,162,173,198} +{44,191} +{7,48,107,115,116} +{12,120,141,179,184} +{83,188} +{83,85,86,139,154} +{50,74,89,154,179} +{79,87,120,128,183} +{13,121} +{16,52,62,86,168,199} +{7,16,29,35,157,181} +{23,48,65,119,180} +{10,173} +{7,98,128,143,145,162} +{23,27,88,91,127} +{35,53,56,56,118} +{7,161} +{0,42,67,174} +{44,161} +{75,80,110,170} +{17,93,117,140,168,196} +{18,100,150,184} +{108,132} +{54,90,97,103,149} +{9,12,30,43,82,95} +{131,163} +{67,99,168} +{91,150,172} +{47,164,195} +{72,90,98} +{24,78,130,172} +{1,27,32,64,66,156} +{7,26,72,88,130,140} +{56,126,130} +{1,76,81,122,169,188} +{60,154} +{101,103,135,150} +{22,25,33} +{99,117} +{24,95,122,186} +{48,95,102,108,125,170} +{13,113,154} +{155,177} +{37,73,106} +{7,64,124,195} +{101,124,133,157,166,188} +{27,34,60,100} +{26,104,163} +{34,43,108,133,165} +{64,79,89,122,132} +{10,96,168} +{2,22,89,118,122,198} +{122,192} +{42,101,104,135,168,181} +{7,38,63,86,101,152} +{29,84,89,114,123,184} +{33,46,59,137,153,175} +{3,54,66,92} +{31,34,148,159,185} +{3,52,97,99} +{3,26} +{42,57,62,148,199} +{15,26,198} +{14,34,109,111,128,193} +{107,197} +{16,107} +{9,21,136,169} +{67,97,99,153,165,173} +{46,76,89,100,164} +{96,102,150,167,180} +{31,103,137,146,180} +{21,40,157,163,170,183} +{139,170} +{1,75,82,148,169,198} +{13,39,107} +{13,50,97,101,106} +{52,176} +{18,169} +{129,140,146,183,189} +{95,122,145} +{5,6,102,130,151} +{5,118,140,153} +{27,78,140,164,182} +{36,140,148} +{58,100,127} +{9,16} +{26,33,119} +{1,17,18,165} +{14,182} +{11,13,48,89,140,165} +{9,19,78,113} +{121,171} +{18,23,46,113,159,162} +{17,104} +{50,104,132,167,179} +{55,89,102,132,176} +{19,109} +{60,70,73,153,163} +{18,127,145} +{80,106,146,170} +{10,39,72,74,84,150} +{3,71} +{1,10,64} +{82,95,127,132,141,152} +{43,55,57,89,120,197} +{155,182} +{23,34,57,111,153} +{99,188} +{86,114,124} +{113,191} +{31,129,184} +{125,159,159} +{22,27,81,156} +{3,54,80,122,128,168} +{76,112} +{152,174} +{22,27,70,172} +{26,86} +{49,59,102,186} +{53,55,75,125} +{152,199} +{11,15,46,102,105,168} +{132,148,154} +{24,114,121,126,138,165} +{82,107} +{36,93,122,184,194} +{1,59,76,146} +{73,165} +{38,98,176} +{53,72,121,153} +{127,147} +{31,77,128,177} +{107,186,189} +{119,126,127,160} +{24,74,148,197} +{85,126,134,146} +{76,77,81,134} +{67,112,159,174,183} +{22,169,170} +{79,112,177,199} +{1,56} +{21,42,50,172} +{6,63,105,166,189} +{31,95,106,152,171,177} +{21,49,99,101,122,187} +{63,104,113,161,186} +{37,126,144,166,173} +{32,53,147} +{123,123,130} +{78,85,177} +{2,69,95,146,187} +{6,11,14,43,121} +{76,105,184} +{63,96,114,122,195} +{11,22,34,45,120,156} +{22,83,119,131,138,167} +{9,56,96,106,114} +{92,132,162} +{25,45,83,119,139,150} +{19,21,56,59,141} +{14,26,62,119,180,190} +{6,34,49,99,139,170} +{10,56,150,166,166} +{14,57,119,153,167,198} +{26,41,150,158,169} +{152,167} +{1,61,93,180} +{46,110,138,199} +{4,56,81,110,173} +{28,32,148,185} +{8,9,28,29,39,195} +{14,39,68,144} +{26,37,79,81,110} +{115,158,161} +{6,39,145,191} +{67,118,125,142,184,198} +{127,163} +{52,118} +{22,78,131,156} +{46,68,86,142,145,197} +{85,188} +{37,54,64,147,158} +{31,134,141,183,185} +{10,33,135,198} +{41,124,173,180} +{0,14,92,129,154,198} +{39,73,128,154,182,196} +{40,83,94,168} +{106,142} +{76,99} +{19,62,77,108,165,186} +{68,90,97,119,176} +{44,108,193} +{2,124} +{137,174,175,176,180} +{28,62,81,132,165,186} +{98,112,148,181} +{86,125} +{70,161} +{5,13,188} +{136,168} +{82,87} +{30,42,57} +{132,136,152} +{20,59,87,98,195} +{6,53,112,113,183,195} +{64,147,157} +{61,140,192} +{44,59,88,123,161} +{90,175} +{38,46,105,121,159} +{35,62,66,90,155} +{2,2,21,38} +{123,144} +{117,155} +{60,86} +{4,39,129,146,179} +{66,71,87,135,148,157} +{29,67,108,196} +{30,64,76,124,172} +{36,39,79,130,140,149} +{30,44,136,196} +{5,15,20,117,198} +{20,87,87,121} +{42,136,142,148} +{0,56} +{16,38,56,57} +{52,138} +{103,115} +{10,29,43,93,120,134} +{44,140,150,180} +{74,98,132,160} +{2,62,98,160} +{14,32,43,63,92} +{23,87,128,152,177,197} +{30,86,111,178,180} +{49,61,114,195,196} +{133,158,195} +{18,105,165,190} +{77,83,175} +{29,33,51,166,188} +{37,51,96,103,127} +{119,125,128,140} +{8,80,93,189} +{76,96,110,131,170} +{81,90} +{13,25,28,41,128,142} +{56,62,73,110} +{60,62,128,136,166,193} +{34,34,61,74} +{32,84,87,92,112,181} +{10,66,93,153} +{23,77,182} +{2,7,156} +{5,13,49,61,103,179} +{67,136,136,163,181,196} +{26,60,74,100,160} +{39,59,69,93,111} +{9,77,90} +{1,20,52,75,156,169} +{25,95,103,157,163,193} +{95,136} +{47,108,137,157,164} +{37,99,151,153,169,189} +{112,126,139,171,184,195} +{39,188} +{4,20,71,80,136,156} +{24,33,77,82} +{103,188} +{74,116} +{82,90,110,154,194,195} +{25,149,180} +{120,123,130,171} +{20,38,104,126,175,176} +{14,62,97,130,135,193} +{35,118} +{20,42,64,73,76,120} +{11,40,60,74,144,148} +{13,26,46,63,76} +{24,29,98,106} +{6,139,171,186} +{5,109,197} +{20,45,84,125} +{1,137,150,195} +{1,8,80,111} +{57,90,102,167} +{53,186} +{8,31,115,145,156,165} +{10,18,31,116,164} +{43,47} +{33,143,154} +{106,153,174,190} +{73,106,158} +{18,137,158,173} +{73,80,107,123,141,199} +{17,43,123,130,130,155} +{15,31,37,91,164,181} +{38,86} +{49,105,142,145,173,190} +{18,107,108,135,138} +{43,65,107,112,193} +{8,68,68,74} +{54,106,108,109,164} +{53,153} +{59,134,154,173,180} +{34,93} +{11,33,124} +{8,104} +{27,37,46,65,125,174} +{0,122,189} +{15,74,107,147,188} +{35,63,78} +{28,49,123,129,177,193} +{11,89,104} +{117,171,197} +{11,15,62,136,145,145} +{2,127,193} +{17,28,42,113,145} +{31,44,118,148} +{52,103,128,161,182} +{45,47,70,102,161,184} +{15,52,82,86} +{60,87,102,108,127,170} +{24,57,102,145,181} +{12,53} +{5,52,92,129,164} +{87,128} +{80,143,170} +{59,85,134,139} +{61,67,110,117,156,157} +{6,8,60,112,154,170} +{92,122,133} +{121,148,161} +{9,22,61,187} +{12,40,78,107,176} +{30,45,58,189,198} +{83,107,123,148} +{3,66,98,124,126,150} +{13,34} +{16,41,132} +{16,85} +{3,25} +{30,58,138,167} +{24,36,87,151,159,186} +{2,4,121,196} +{79,95,99,107} +{11,49,146,169} +{51,90} +{76,155} +{26,26,116,120,146,182} +{44,66,72,117,132,174} +{7,161,179,197} +{2,81,158} +{4,22,59,107,146,170} +{0,0,133,192} +{57,82} +{17,61} +{28,29,42,77,89,124} +{53,78,127,188} +{31,57,103,104,162} +{9,84,100} +{3,52,114,133,161,188} +{8,37,97,158,189} +{0,13,88} +{29,79,92,158,160,171} +{59,63,77,139,165} +{25,77,116,169} +{50,88,151,166} +{52,162,167} +{32,149,191,194,194} +{47,57,74,95,97} +{30,65,96,153,184} +{80,130,150,172} +{79,91,141,153,157} +{93,110,114,194} +{62,66,156,175} +{55,56,97,117} +{74,152,171,186} +{13,24,50,50,131} +{0,16,95,141,146,161} +{1,51,158} +{37,71,96,122} +{71,104,145} +{47,52,124,131,169} +{111,188} +{59,61,95,152,156,157} +{5,31,106,164,176} +{44,82,113,134,188} +{13,55,65,99,150} +{25,73,130,192} +{88,120,193} +{79,123,153,175} +{24,158,162} +{52,53,81} +{5,32,78,102} +{73,97,111,151} +{71,72,102,151} +{5,61,73,85,129,151} +{66,177} +{26,77,139,152} +{46,117} +{55,72,122,148,157,174} +{3,53,76,184,196} +{34,36,41,61,194} +{8,153,163,182} +{51,59} +{113,115,149} +{54,57,78} +{39,137} +{75,81,93} +{5,30,44,80,86,126} +{68,107,128,160,179} +{98,108,162} +{55,126} +{24,54,121,122} +{75,90} +{10,83,139} +{16,120,148} +{97,175} +{53,70,71,120,135,189} +{9,110,123,150} +{24,42,44,96,138,170} +{17,61} +{23,65,110,135,155,157} +{19,59,139} +{50,65,127,179} +{15,138,152,162} +{15,34} +{25,29,63,135,161} +{47,113,123,129,163} +{25,138,157,184} +{50,92,199} +{110,116} +{15,36,134,145,165,182} +{4,75,82,175} +{24,49,63,89,128} +{174,182} +{103,116,119} +{101,125,180,192} +{47,66,113,127,148} +{15,60,118} +{20,51,90,91,117} +{25,72,146,199} +{34,93,199} +{31,71,106,115,186} +{1,10,119,144,188,197} +{49,80,185} +{134,178,188} +{42,67,170,172} +{13,43,91,91} +{13,31,48,98,155,158} +{37,44,70,76,141,160} +{50,60,72} +{51,65,166,188} +{11,103,129,144} +{136,167,181} +{165,178} +{34,107} +{54,120} +{33,132,136,165,178} +{60,79,119,127,187,197} +{27,31,130,132} +{125,129} +{97,111} +{71,171,187,191} +{68,91,94} +{94,119,159,178} +{2,29,51,173} +{37,61,97,113,147} +{11,35,79,91} +{67,71} +{4,20,103,107,169,179} +{35,77} +{71,94} +{29,31,67,101,172,174} +{52,122} +{87,125} +{129,142,164} +{13,30,85,139} +{17,57,65,170,179} +{46,65,151,167,192,197} +{31,78,132,136,158} +{38,161} +{15,101,111,134} +{42,118,139,142,178} +{57,95,132,134} +{5,42,116,152,173,192} +{144,199} +{38,70,77,143,175,188} +{38,84,93,149} +{56,98,153,165,170,191} +{1,52,112,112,131,145} +{16,132,150,184} +{14,60,111,153} +{49,109,112,165} +{69,136,152} +{59,90,94,158,168} +{42,47} +{18,194} +{33,70,94,167,175,177} +{40,57,125,138,159} +{3,10,31} +{2,5,8,26,141,181} +{27,29,142,175,186,195} +{31,49,99,120} +{109,123} +{21,76,112,119,124} +{41,49,146,173} +{101,173} +{49,73,85,89,179} +{22,36,154,192} +{136,163} +{111,165} +{94,128} +{81,167} +{35,165} +{41,109,119} +{13,74,80,114} +{72,106,189} +{65,172} +{30,31,35,52,63} +{80,116} +{0,149} +{139,189} +{0,65,107,153,179} +{15,40,46,51,75,160} +{12,28,48,79,105} +{76,98,146,157,180} +{45,62,79,83,113,155} +{130,162,184} +{78,140,145,181,196,198} +{108,168} +{3,13,14,15,77} +{22,29,68,117,142,143} +{67,110,122,167,183} +{22,25,58,93,143,151} +{53,82,170} +{1,18,50,98,108,174} +{58,140} +{49,179,196} +{109,171} +{38,82,132,183} +{32,151,175} +{53,90,106,169,187} +{99,136,141,146,171} +{27,108,111,155,192} +{28,77,86} +{11,109,118,149,154,183} +{7,74,122,137,185} +{70,110,151,154,175} +{7,48,88,181,181,182} +{97,101,105,123,139,156} +{19,139} +{17,107,134} +{63,64,178} +{100,133,143} +{64,173} +{1,88,109,120,145,160} +{113,198} +{84,112,121,184} +{90,185,193} +{91,135,155,185} +{56,191} +{14,15,48,61,92,171} +{18,139,152,199} +{16,80,107,125,144,166} +{8,92,112,173,176} +{27,196} +{9,169,183,190} +{20,29,40,98,106,182} +{77,115,149,181} +{31,65} +{7,29,62,90,157,178} +{10,33,79,186} +{42,74,113,178,192} +{17,86,88,118} +{27,58,104,122,166} +{16,97,102,105,192} +{16,59,115,127} +{27,56,60} +{104,175} +{52,84} +{127,137} +{7,13,18,81,139,140} +{11,31,81,150,189} +{44,55,107} +{45,58,127,137} +{70,76,80,93,145} +{27,60} +{40,76,172} +{7,123,192} +{55,170} +{61,137,137,184,187} +{49,50,190} +{99,126,152,164} +{56,79,88,98,132} +{45,74,119,123,158,175} +{66,96} +{100,114} +{62,84,111,122} +{8,22,141,172,181} +{70,141} +{3,48,106,193} +{33,114,168,174,183} +{46,186,194} +{58,71,82,122,190} +{60,67} +{14,30,132,144,174} +{9,113,124} +{11,14,29,63,110,182} +{4,64,102,168,178} +{90,108,110,160,165,199} +{44,86,191} +{6,19,84,125,125,156} +{53,105,122,154,175,190} +{83,177,183} +{96,103,181} +{38,156} +{2,6,60,116,131} +{12,144} +{13,73,93,132} +{142,167} +{37,61,71,75,121,144} +{32,43,146} +{41,59,144,176} +{11,14,44,54,92,177} +{37,198} +{39,80,81,104,138,193} +{13,73,92,127,149,194} +{34,57,69,104,118,186} +{7,48,84,96,108} +{32,41,64,111} +{108,131,150,174,195} +{50,53,184,191} +{8,32} +{26,76,88} +{4,50,100,134,134} +{36,40,148,158,177} +{7,16,57,59} +{35,96,113,129,167} +{46,63,128,163} +{8,46,94,97,105,178} +{12,70} +{45,93,134,135,188,195} +{11,52,76,103,131,192} +{19,45,57,119,123,136} +{19,62} +{1,49,64,197} +{0,42,60,102,134,147} +{102,152,156,160} +{51,54,129} +{50,68,71,72,170} +{0,11,184} +{19,105} +{144,185,191} +{17,51,76,98,118,135} +{52,64,143,171} +{1,46,62,74,81} +{8,36,129} +{5,25,96,113,146,152} +{19,28,59,110,131,142} +{7,18,176,179} +{17,21,48,63,121} +{34,79,81,85,152,155} +{8,82,104,122,139,193} +{34,50,128,140,175} +{51,173} +{48,128,138} +{126,129,178} +{42,51,61,141,170,180} +{59,91,144} +{64,74,118,170,191} +{12,55,116,157,159} +{97,157} +{32,34,102,105,178} +{36,103,125} +{15,36,184} +{6,13} +{0,100,144,185,198} +{32,47,64,66,118,143} +{23,112,117} +{34,44,47,81,124,135} +{21,49,115} +{29,158} +{34,114,127,151} +{111,199} +{23,53,76,113,122,123} +{89,113,117,137} +{52,76,126,155,164} +{4,48,78,114,147,179} +{27,56,151,191} +{3,183} +{30,41,72,145} +{15,41,152,177,196} +{44,58,124,164,177} +{9,51,70,174} +{13,18,81,136,178} +{85,139,142} +{12,62,118,156} +{50,142,149,175} +{35,38,99,100,128} +{53,54,92,123,153,160} +{121,133} +{12,63,117,148,149,187} +{88,153,170,192,195} +{22,51,67,104,141} +{186,198} +{39,40,82,159,189} +{59,74,149} +{88,99,136,145,191} +{5,48,90,120,138,193} +{22,76,155,180} +{118,122,141,176} +{87,104,116,159,172,191} +{63,104,155} +{8,153,168} +{119,141,178,179} +{100,110} +{14,65,164} +{2,92,97,117,188} +{47,59,64,141,148,187} +{109,137,139,151,169} +{68,78,156} +{37,39,103,183,190,194} +{50,58,74,180} +{12,121,155,175} +{26,43,97} +{102,159,161} +{3,138,163,179} +{55,69,78,164} +{67,87,136} +{67,150} +{74,113,199} +{103,126,187} +{39,141,155} +{6,19,25,75,157} +{10,49,71,105,114,154} +{3,24,35,54,88} +{16,25,73,114,181,191} +{2,2,63,154} +{68,74,107,187,199} +{13,235} +{40,122,203,232,233,235} +{115,152,193,202,242} +{3,50,86,111,248} +{25,66,181,188,279} +{80,116} +{38,83,106,119,134} +{29,63,203} +{7,27,186,200,201} +{88,92,94,272,295} +{35,68,136,158} +{148,225,293} +{1,87,195} +{48,100,203} +{0,35,61,91,280} +{130,160,168,216} +{4,104,148,164} +{35,40,91,145,155,214} +{46,107} +{21,276} +{42,143,150,238,291} +{64,70,140,165,228,257} +{0,148,197} +{72,131,195,202,251,270} +{99,195,224,264,292} +{5,184,186,243} +{93,132,137,148,228,251} +{66,125,198,211,285} +{29,79,180} +{41,60,65,66,254} +{4,69,79,207} +{113,182,203,252,259,298} +{10,20} +{99,200,276} +{109,262} +{4,87,193,207,220,273} +{30,183,215} +{7,138,202,215,217} +{25,79,194,203,260} +{128,178} +{62,152,211,279} +{57,99,204,280} +{41,59} +{18,52,200} +{81,132,190,275} +{89,158} +{32,72,122,228,245,249} +{24,72,196,233,299} +{0,5,46,122,213} +{197,242} +{43,105,241,272} +{74,118,158,173,208,288} +{145,149,197,238,252,297} +{32,39,189} +{98,240} +{65,140,149,197,203,204} +{103,225,266} +{84,277,283} +{35,246} +{10,101,239} +{40,75,192,253} +{106,152,247,272,287} +{50,293} +{85,134} +{59,204} +{54,64,88,269,286} +{4,92,111,121,154,182} +{80,163,202,234,277,298} +{129,147,158,196,283,290} +{49,144,232,293} +{20,29,226,244,274} +{64,101,185,189,234,268} +{23,157} +{56,93,133} +{9,57,241,289} +{50,124,181,194,238} +{11,38,67,69,213} +{149,220} +{168,189,267} +{34,133,235,264,284} +{81,239,241,260} +{35,78,80,201,262,297} +{0,196,285} +{71,108,239,258,277,278} +{4,94} +{77,132,140,251} +{11,78,132} +{43,145,188} +{97,144,148,161,254} +{109,132} +{48,83,189,242} +{115,176,276} +{162,210} +{88,109,136,153,154,159} +{265,280} +{74,86,195} +{17,112,188,213,231,266} +{36,136,160,218,239} +{179,273} +{79,118,136,154,200,259} +{161,212} +{24,98,178} +{161,187} +{45,169,227,236} +{218,253} +{10,18,74,258} +{70,199,210,213,285,291} +{12,50,69,92,184,186} +{130,131,163,295} +{198,239,297} +{49,86,125,176,234,282} +{7,129,146,223,269} +{144,173} +{30,52,133,228} +{21,88,176} +{5,70,299} +{37,69,285} +{14,17,45,72,99,197} +{125,196} +{30,220} +{55,103,127,251} +{108,114,156,200,207,217} +{7,195,250} +{64,111,193,202,236} +{92,115,232,233,240} +{22,232,260} +{18,44,191,253,294} +{40,158} +{86,92,103,154,207,294} +{33,177,191,223,235} +{65,116,158,253} +{49,125,152,194} +{100,149,191,266,288} +{13,64,103,254,283} +{42,75,80,103,155} +{77,128,198,280} +{118,218,287} +{0,36,52,101,148} +{1,64,181,201,221} +{6,44,47,71,150,225} +{13,85,88,167} +{31,40,69,91,99,281} +{60,115,157,224,252,273} +{30,87,200,270,285} +{171,293} +{24,33} +{59,69,74,118,190,216} +{147,258,288} +{62,73,219,232,266} +{50,74,225,238,271} +{6,88,115,185,205,262} +{97,230} +{76,76,150,211,228,262} +{134,195} +{104,235} +{38,41,204} +{64,71,124} +{44,63,111,231} +{186,188} +{5,132,225} +{113,286} +{43,161,276} +{8,294} +{18,90,105,169} +{213,213} +{29,45,161,289} +{79,152} +{10,110,162,177,217,238} +{63,98,192,244} +{118,147,187,281} +{5,15,36,94,263} +{40,81,220} +{29,74,76,157,162,206} +{11,28,53,68,126,222} +{73,73,181,239} +{36,60,164} +{16,47,82,152,167,289} +{149,149,219,268,294} +{97,169} +{32,160,210,257} +{32,69} +{7,63,73,195} +{54,110} +{61,75,135,270} +{22,43,127,174,184,208} +{106,113,174} +{0,70,90,239} +{191,260} +{43,80,168} +{25,54,257,263} +{118,213} +{110,207,220,251,287} +{126,139,161,248,252} +{51,79,116,132,190,291} +{183,199,200,254} +{86,233} +{105,109,176,211} +{12,109} +{3,65,158} +{21,86} +{12,15,191} +{181,223,224,256,259,276} +{112,191,219,232,239} +{51,215} +{36,46,278} +{68,75,169,228,244,270} +{10,16,52,172,189,274} +{177,191,197,209,222,282} +{41,119,190,202} +{128,277,292,298} +{34,38} +{22,36,81,117} +{81,161,248,279} +{75,85,103,149,190,211} +{127,279} +{50,74,152} +{122,168,209,240,276,282} +{66,102,208,239,291} +{9,113} +{72,199,237} +{110,112,135,141,270} +{26,109,130,159,291} +{108,206} +{2,289} +{63,238} +{4,57,104,119,142,214} +{46,97,239} +{210,297} +{207,268} +{13,64,80} +{62,109,171,195,232} +{11,260,262,276,292} +{21,75,78,80,140,226} +{38,56} +{122,251,297} +{108,180,213} +{57,58,135,231,233} +{75,136,185,211} +{52,109,122,174,178,255} +{65,91,234,249} +{5,24,53,218} +{90,211,246} +{106,242,260} +{61,136} +{49,87,177,280} +{38,89,104,189,297} +{43,76,293,298} +{182,255,289} +{25,57,64,272} +{23,122,149} +{49,50,129,153} +{183,188,204} +{27,164,226,230} +{0,13,67,145,160,259} +{22,32,43,85,105,124} +{20,199} +{31,119} +{14,16,152,158,196} +{5,59,91,202,217,280} +{100,128,187} +{20,193,214,258,272} +{17,27,55,151,177,219} +{53,55,63,208,213,230} +{15,160,258,260} +{71,147,235,258} +{26,49,173,234,271} +{50,52,58,167,257} +{15,154,213,232} +{6,35,86,94,286} +{0,4,83,262,281} +{93,148,284} +{28,165,262,290} +{18,99,160,266} +{63,223,291,295} +{103,154,180} +{12,110,144,221} +{9,158,203} +{20,207,275} +{9,20,48,88,120,289} +{67,110,133,151,225,297} +{71,102} +{168,208} +{48,137,163,164,280,287} +{90,209} +{28,244} +{107,224,293} +{86,206} +{8,113,147,165,285,286} +{7,159,160,237} +{0,66,87,146,225,294} +{58,100,112,124,189} +{13,108} +{121,168,216,253} +{147,242,282} +{236,240} +{21,28,83,103,166} +{30,88,108,280,295} +{23,136,298} +{125,290} +{140,249,276,277} +{49,81,135,147,164,267} +{28,63,198,297} +{30,101,216,232,267,287} +{54,195,204,223,236,251} +{27,176,179,204,264,291} +{136,164,172,273} +{43,67,81,121,277} +{128,131,256,269} +{176,219,289} +{127,175,259} +{35,94,153,177,222,253} +{29,154,178,240,260} +{165,176,201,243,259} +{17,298} +{29,203,232,241,289} +{107,136,153,238} +{49,198} +{68,179,202,253} +{157,178} +{23,199,287} +{131,228} +{19,19,39,111,138,277} +{49,86,178,194,223,226} +{114,201} +{149,282} +{109,147,150,176,209,229} +{122,131,167,228,258} +{5,40,120,154,266} +{135,207,238,263} +{75,128} +{80,117,296} +{60,82,122,131,138} +{57,146,159,233,244,278} +{15,80,157,182,244,272} +{114,116,160,176,287} +{10,133,279} +{27,115,126,293} +{89,161} +{95,120,218} +{26,269} +{109,281} +{53,62,103,107,118,239} +{185,186,227,252} +{3,125,146,161,288} +{171,245,256,283} +{23,153,201,238} +{0,82,93,218,242} +{101,124,137,150,194} +{21,96,104,201,244,266} +{88,121,147,155,173,225} +{24,106,112,193} +{26,67,115,212,283} +{23,120,280} +{45,99} +{30,66,136,199} +{17,213} +{14,37,55,103,265} +{52,258,284} +{119,213,272,274,285} +{43,45,105,254,288} +{64,81,123,126,164,292} +{88,229,260} +{25,117} +{7,149,197,227,258} +{74,83,240,246,284,292} +{2,4,63,103,115,289} +{92,239} +{12,26,130,228,265} +{53,99,131,142,164,291} +{63,248,259,283} +{186,215,282} +{67,110,160} +{166,191} +{33,156,224} +{152,166,190,250,297} +{123,126,153,199,204} +{49,70,199,238,238,289} +{14,18,65,74,146,235} +{63,77,172,180,186,225} +{1,48,105,170} +{37,56,113,133,196} +{193,261,266} +{190,273} +{38,129,261} +{251,252,253,254,275,296} +{249,275} +{167,205,266} +{27,152,256} +{19,72,248} +{40,73,141,249} +{105,197} +{156,243,277,282} +{165,168,227,298} +{8,31,202,271} +{10,101,109,167,236,277} +{33,91,165,192,206,211} +{102,122,232} +{190,239,283} +{160,185} +{2,13,65,70} +{11,68,170,192,229,284} +{66,90,228,237} +{1,6,92,99,222,242} +{42,128,133,207,289} +{12,100,164,191} +{26,31,120,176,204,220} +{13,39,95,105,120,182} +{114,120,295} +{31,34,55,181,197,235} +{24,52,64,80,142} +{3,49,148,255,268} +{132,175,254} +{32,71,141} +{112,116,186,270,271} +{64,106,209,228,297} +{128,268} +{107,208,299} +{151,173,187,192,213} +{3,296} +{20,31,135,153,289} +{138,193,212,269,277,288} +{73,92,130,295} +{73,80,105} +{50,96,138,199,265} +{4,7,8,183,260,267} +{66,71,118,145} +{15,63,116,160,175,181} +{88,217} +{56,69,106,106,127,274} +{84,205} +{83,101,241,269} +{21,254} +{22,32,83,150,293} +{198,221} +{30,46,95,179,197} +{46,85,208} +{56,112,236} +{71,217} +{31,57,145,253} +{34,133,170} +{48,53,119,187,268,287} +{111,203,229,239} +{62,136} +{49,54,187,254,298} +{20,26,148,159,190,286} +{3,13,193,252,284} +{40,137,154,167,248,259} +{3,47,242,278} +{77,100,143,232} +{51,130} +{66,90,148,220,242,273} +{143,151,211} +{10,23} +{21,30,179} +{17,47,105,156,193,213} +{0,23,25,125,144,146} +{179,209} +{79,113,117,192} +{5,53,216,275,285} +{187,197} +{22,68,218,221} +{0,71,78,110,120,173} +{46,97,117,149,253,286} +{10,20,129,162,171,195} +{60,97,130,163,190} +{57,145,179,283} +{99,274} +{151,161,228,251} +{3,177,192,286} +{21,81,142} +{180,283} +{13,102,131,149,246} +{19,99,132,162,167,257} +{15,86,188,260} +{203,251,281} +{5,45,138,155,157} +{1,2,4,213,278} +{21,123,208,219,263,267} +{36,106,181,231,238} +{103,120,168,184,224,287} +{53,104,139,251} +{1,91,141,202,268} +{75,115,216,253} +{56,167,268,296} +{66,158,235,249} +{82,124,198} +{56,67,112,140,170,176} +{16,75,266} +{38,165,200,219,291,297} +{86,151,229,241,275} +{0,57,141,176,229,258} +{18,72,164,195,235} +{94,282} +{83,139,242,269,294} +{9,44,145,251,272} +{132,203,249,282} +{7,41,170,254} +{6,153,193,291} +{18,134,137,227,261} +{14,36,115,124,172,229} +{54,206} +{49,91,131,185,204} +{7,242} +{41,57,161} +{93,224,241,288} +{119,288} +{90,99,117,196,296} +{67,85,154} +{147,169,216,264} +{79,92,164} +{19,120,132,197,267} +{76,264} +{30,133} +{27,37,93,138,218} +{152,155,244} +{41,149,182,259} +{29,178,224} +{115,201,268} +{141,166,253,282} +{3,65,125,245,264} +{6,150,159,202,206,277} +{217,276} +{28,96,144,193} +{7,59,190} +{144,217} +{10,79,96,100,126,222} +{7,61,253} +{14,69,263} +{3,30,63,125,186,277} +{2,10,79,100,223} +{131,131,239} +{116,195,199,240} +{87,99,158} +{52,180} +{7,12,140,208,275} +{65,67,83,280} +{4,52,125,126,137,176} +{9,48,79,203,217,243} +{43,206,251} +{19,112,196,263,266} +{29,70,256} +{161,236,258} +{8,25,42,97,291} +{63,144,242,271} +{7,17} +{1,85,250} +{104,244,250} +{18,22,31,99,266,281} +{51,138,237,268,288} +{8,40,91,221,273} +{0,176,230,249,254,255} +{44,140,176,194,197} +{56,197,264} +{229,246,283} +{53,128,173,233,282} +{45,193,221} +{21,80,286} +{4,18,267} +{15,97,220} +{62,70,83,147,149,244} +{120,134,159,174,250} +{116,269} +{23,108} +{10,91,239} +{7,128,142,243,286} +{134,201,245,275,278} +{13,208,227,288} +{30,78,85} +{107,179} +{31,59,153,217,240,298} +{27,130,233,282,286} +{15,59,136,262} +{85,186,233} +{10,152,165,181,181} +{137,183} +{40,56,125,256,265,280} +{12,22,120,183} +{62,229} +{38,59,81,113,261} +{67,194,229} +{7,173} +{37,43,296} +{59,162,285} +{171,200,213,213} +{116,123,209,234,277} +{52,175} +{189,213} +{30,94,99,228,238} +{46,101,154,260,272,274} +{30,32,59} +{65,172,292} +{18,22,131,170,271} +{2,53,88,104,264,265} +{60,194,288} +{15,108,121,161,201} +{40,85,173,195,201,221} +{54,86,107,174,287} +{20,71,190,227} +{16,46,66,175,197,252} +{130,243,252,282} +{142,219,266,272} +{14,202,204,231,241,276} +{161,172,212,222} +{15,183,275} +{83,270} +{67,204} +{65,184,264} +{73,119,183,190,242} +{53,287} +{24,171} +{72,220,220} +{101,136,176,204,224,280} +{39,47,282} +{106,162,238,252} +{23,242,247,265} +{98,108,189,209,273} +{122,245,270} +{109,127,128,244,299} +{41,162,186,191} +{60,196} +{0,123,129,213,248} +{29,79,89,91} +{172,298} +{122,140,162,228,263,268} +{2,116,247,294} +{6,138} +{17,98,287} +{53,166,187,219,248,296} +{15,26,90,175,196} +{184,193,198} +{17,69,76,105,183,264} +{56,101,110} +{15,108,139,168,272} +{5,71,104,141} +{136,179} +{72,189} +{54,79,208} +{98,113,150,184,190,246} +{37,69,132,210,285} +{1,29,45,74,109,145} +{11,72,133,149,216} +{34,57,84,212,280} +{131,211,294} +{70,84,173} +{193,213,230,266,285,299} +{57,94,163,182,227} +{44,133,143} +{31,32,211} +{130,142,165,188,194,231} +{52,61,139,226,239,287} +{7,103,157} +{155,224,230} +{127,135,139} +{77,237,294} +{10,213,278} +{28,90,185,274} +{59,105,282,297} +{39,128,174,268} +{32,158,215} +{24,145,189,213,278} +{78,148,230,263} +{42,68,93,160,287,299} +{4,12,70,91,191,237} +{20,294} +{45,53,77,113,211,240} +{232,237} +{125,152,284} +{58,81,155,215,296} +{4,8,44} +{1,52,102,128,184,218} +{185,199,226,299} +{10,178,262,285} +{80,95,230,240,266} +{4,5,213} +{156,187,271,298} +{88,298} +{109,233,290} +{47,65,91,105,249,269} +{97,129} +{46,92,207} +{2,163,249,259,291} +{89,102,140,158,231} +{162,184,283} +{36,213} +{163,259} +{47,220,250} +{37,89,105,124,143,198} +{3,71} +{142,165,190,256,269,269} +{152,256} +{27,49,191,198,220,285} +{71,73,87,189,260} +{11,54,90,106,130,216} +{193,245,252} +{2,8,57,91,163,184} +{18,171,283} +{28,41,110,112} +{5,57} +{137,262,285} +{19,57,156,229,269} +{138,179,190,199,281} +{35,98,196,242} +{122,152} +{83,132,181,212,280,288} +{219,298} +{57,88,103} +{5,203} +{98,156,266} +{10,45,72,169,211} +{45,101,156,214,269} +{68,73,81} +{16,127,259} +{9,32,246} +{66,173,261,261,274} +{17,115,157,169,251} +{49,158} +{25,37} +{2,73,103,178,194,236} +{238,269,273} +{162,178,276} +{48,52,160,237,288} +{54,82,130,135,169,275} +{29,142} +{205,249,253,275,291} +{60,76,84,115,126} +{48,108,153,213,231} +{23,124,175,210,226,293} +{9,181} +{20,99,112,166,201,242} +{102,150,201} +{41,98,240,244,260} +{7,44,98,293} +{0,125,177,283} +{28,118,124,148,241,290} +{73,91,122} +{9,72,109,130,202,290} +{70,111,120,160,216,262} +{59,175,296} +{2,201} +{83,297} +{76,293} +{83,127,136,242,275,285} +{169,190,195} +{83,122,186,189,217,229} +{98,210,229} +{117,133} +{74,294} +{6,31,59,143,156,273} +{98,180,241} +{26,52,114,243} +{112,240} +{104,217} +{148,162,259,279} +{92,101,150,226,272,295} +{55,86,118,202,237,275} +{81,203} +{79,126,177,265} +{57,193} +{169,240,244} +{21,171,190,250,263} +{23,37,215,235} +{40,54,240,286} +{105,177,190,276,285} +{44,45,122,151} +{28,31,187} +{127,135,211} +{5,13,150,194,259} +{136,181,280} +{20,147,158,189,200} +{15,83,88,128,169} +{10,14,25,26,150,158} +{42,101,172,205} +{85,185,226,236,271} +{34,127,188,250,268} +{27,143} +{26,48,99,110,117,207} +{22,56,190,269,287} +{200,278} +{70,134,138,204,216,298} +{175,219,297} +{99,273} +{206,216} +{23,214} +{131,140} +{11,140,240} +{73,148} +{7,66,125,210} +{2,61,92} +{0,137} +{143,188,265} +{177,238} +{0,93,163,229} +{35,49} +{8,8,111,144,165} +{99,278} +{21,44,71,224,252,270} +{119,150,175,233,245,294} +{15,87} +{84,211,217,225} +{20,41,87,123,124,299} +{62,120,169} +{37,43,92,175,206,222} +{95,168,180,250,269,296} +{60,228,278,285} +{173,195,232,276} +{1,2,139,256,278} +{51,119} +{212,238,291} +{120,172,292} +{138,279} +{251,261} +{151,181,278,296} +{163,207,220,289,295} +{89,278,290} +{24,137,157,206,271,278} +{7,63,83,89,155,189} +{2,5,172,195,215,260} +{243,281} +{60,125} +{74,87,222,236} +{45,70,159,194} +{69,159,250} +{150,214,296} +{101,158,250} +{56,134} +{57,87,160,167,247,285} +{123,269} +{235,242} +{79,95,115,167,287} +{31,56,132,244,276} +{25,218,241,241} +{57,82,151,170,204} +{69,103,288} +{88,138,154,292} +{14,98,138,227,245,249} +{175,222,274} +{38,139,193,208,277} +{79,141} +{5,77,197,209} +{15,37,77,110,116} +{26,226} +{68,93,101,140,233} +{53,96,170,192,290} +{29,89,102,216,220} +{11,85,136,239} +{158,180,195,200,226} +{10,49,118,137,172} +{144,172,183} +{14,176,188,215,272} +{42,97,125} +{114,166} +{52,61,162,171,249} +{140,195,242} +{59,99,233} +{31,76,136,181,187} +{81,112,157,168,271,294} +{8,35,44,48,190,297} +{145,195,201} +{160,248,291} +{94,270,285} +{116,139,225} +{111,131,140} +{158,277} +{59,229,257} +{25,47,99,123,239} +{8,36,205,274,295} +{132,152,178,192,235} +{19,40,96,204} +{7,77} +{211,282} +{26,100,180,244,281,296} +{200,212,286} +{5,94,151,290} +{75,80,128,179,269,269} +{7,111} +{7,26,69,158,269,276} +{7,36,74,94,171,215} +{2,62,65,93,124,271} +{78,96,109,189} +{182,197,280,298} +{17,78,82,85,85,208} +{6,122,155} +{14,33,130} +{1,21,167,169} +{49,85,158,175,213} +{59,194} +{125,132,259,285} +{20,38,81,89,234,274} +{106,140,156,287} +{57,125} +{53,103,158,204,234,267} +{0,49,160,189,235} +{34,115,142,207} +{162,173,181,190,298} +{11,76,116,166,191} +{2,87,99,236,279} +{40,203} +{2,33,39,215,254} +{53,69,83,224,228} +{79,136,183,216,226,227} +{10,109,137,163,240} +{24,126,141} +{69,255} +{103,138,230,246,259,283} +{136,290} +{13,34,78,145,166,242} +{38,74,83,242,294} +{54,248,273} +{107,162} +{50,170,176,191,207,275} +{32,134,166,288,292} +{163,167,186,274,291,296} +{31,86,123,156,160} +{114,133,136,176,281,290} +{105,147,211} +{124,151,179,222,299} +{87,101} +{145,169,181,205,247} +{6,266} +{26,33,52,56,106,116} +{19,21,65,89,104,168} +{164,181,208} +{36,67,92,116,248} +{145,200,247} +{155,215} +{49,212} +{29,57,105,117,131} +{2,13,68,128,139,140} +{193,273,273} +{3,78,105,111,297} +{49,142,244} +{32,259} +{161,205} +{96,146,179,259} +{44,45,211,233} +{56,91,146,166,285} +{87,107,120,262,299} +{76,160,276,297} +{248,266} +{5,12,188,240,247} +{164,206,293} +{15,18,60,163} +{53,134,172,230,287,290} +{117,137,146,153,155} +{72,270} +{171,251} +{80,125,137,141,169} +{52,108,200,219,225,271} +{29,78,106,221} +{21,74,110,273} +{28,88,98,170} +{83,104} +{12,152} +{7,69,143,246,265,269} +{62,106,157,200} +{113,260,272,272,294} +{16,35,80,121,165,176} +{96,154,172,198,263} +{29,53,109,128,129,195} +{131,230,271,273,295,299} +{53,160,208,231} +{23,180,208,249,272} +{45,208,264} +{14,29,169} +{116,147,272} +{7,193,237,271} +{158,198,253} +{41,60,71} +{110,133,200,249} +{24,159,255} +{26,39,61,114,218,229} +{141,286,299} +{74,278} +{67,71,155} +{151,257,284} +{13,28,72,131,206} +{60,152,275,295} +{88,105,184,185} +{85,190,205,256,283,285} +{202,285} +{14,92,160,200,246,279} +{42,95,157,195} +{50,99,224,276} +{32,97,101,122} +{66,85} +{19,146,180,242,269,286} +{24,86,247,274} +{54,264,270,284} +{72,77,85,124,127,285} +{47,249} +{25,73,102,237} +{33,68,84,117,120} +{29,62,172,240,242,273} +{42,140,182,248,261,282} +{118,228,284} +{1,89,158,294} +{29,89,122,155,208,283} +{173,208,229} +{6,22,142,267,299} +{22,122,173,245,293} diff --git a/contrib/pageinspect/expected/gin.out b/contrib/pageinspect/expected/gin.out index 82f63b2..c4d0ef1 100644 --- a/contrib/pageinspect/expected/gin.out +++ b/contrib/pageinspect/expected/gin.out @@ -35,3 +35,320 @@ FROM gin_leafpage_items(get_raw_page('test1_y_idx', -[ RECORD 1 ] ?column? | t +\x +CREATE TABLE test__int(a int[]); +\copy test__int from 'data/test__int.data' +CREATE INDEX gin_idx ON test__int USING gin ( a ); +INSERT INTO test__int ( SELECT ARRAY[t] || '{1000}'::_int4 FROM generate_series (1,300) as t ); +INSERT INTO test__int ( SELECT ARRAY[t] || '{1001}'::_int4 FROM generate_series (1,300) as t, generate_series(1,12) ); +VACUUM ANALYZE test__int; +SELECT * FROM gin_value_count('gin_idx') as t(value int, nrow int); + value | nrow +-------+------ + 0 | 38 + 1 | 257 + 2 | 244 + 3 | 222 + 4 | 228 + 5 | 227 + 6 | 243 + 7 | 238 + 8 | 236 + 9 | 224 + 10 | 236 + 11 | 248 + 12 | 224 + 13 | 235 + 14 | 237 + 15 | 253 + 16 | 234 + 17 | 245 + 18 | 246 + 19 | 234 + 20 | 236 + 21 | 213 + 22 | 235 + 23 | 222 + 24 | 197 + 25 | 253 + 26 | 218 + 27 | 239 + 28 | 198 + 29 | 244 + 30 | 247 + 31 | 267 + 32 | 234 + 33 | 209 + 34 | 231 + 35 | 218 + 36 | 242 + 37 | 232 + 38 | 221 + 39 | 232 + 40 | 241 + 41 | 239 + 42 | 221 + 43 | 211 + 44 | 231 + 45 | 213 + 46 | 236 + 47 | 264 + 48 | 221 + 49 | 235 + 50 | 219 + 51 | 250 + 52 | 270 + 53 | 222 + 54 | 242 + 55 | 237 + 56 | 237 + 57 | 251 + 58 | 231 + 59 | 272 + 60 | 219 + 61 | 233 + 62 | 235 + 63 | 260 + 64 | 252 + 65 | 221 + 66 | 228 + 67 | 253 + 68 | 196 + 69 | 232 + 70 | 232 + 71 | 223 + 72 | 247 + 73 | 214 + 74 | 232 + 75 | 229 + 76 | 233 + 77 | 221 + 78 | 227 + 79 | 233 + 80 | 216 + 81 | 244 + 82 | 223 + 83 | 254 + 84 | 227 + 85 | 247 + 86 | 255 + 87 | 239 + 88 | 258 + 89 | 249 + 90 | 244 + 91 | 226 + 92 | 225 + 93 | 230 + 94 | 218 + 95 | 232 + 96 | 239 + 97 | 226 + 98 | 209 + 99 | 211 + 100 | 216 + 101 | 49 + 102 | 47 + 103 | 59 + 104 | 55 + 105 | 48 + 106 | 49 + 107 | 49 + 108 | 51 + 109 | 47 + 110 | 51 + 111 | 45 + 112 | 46 + 113 | 48 + 114 | 38 + 115 | 39 + 116 | 43 + 117 | 44 + 118 | 46 + 119 | 45 + 120 | 52 + 121 | 41 + 122 | 64 + 123 | 50 + 124 | 41 + 125 | 55 + 126 | 41 + 127 | 50 + 128 | 54 + 129 | 43 + 130 | 44 + 131 | 50 + 132 | 57 + 133 | 40 + 134 | 41 + 135 | 44 + 136 | 58 + 137 | 48 + 138 | 44 + 139 | 50 + 140 | 49 + 141 | 48 + 142 | 43 + 143 | 36 + 144 | 43 + 145 | 49 + 146 | 46 + 147 | 40 + 148 | 52 + 149 | 46 + 150 | 49 + 151 | 42 + 152 | 58 + 153 | 49 + 154 | 51 + 155 | 49 + 156 | 45 + 157 | 53 + 158 | 59 + 159 | 38 + 160 | 53 + 161 | 48 + 162 | 41 + 163 | 40 + 164 | 52 + 165 | 50 + 166 | 40 + 167 | 48 + 168 | 45 + 169 | 49 + 170 | 50 + 171 | 45 + 172 | 46 + 173 | 47 + 174 | 41 + 175 | 51 + 176 | 50 + 177 | 41 + 178 | 42 + 179 | 48 + 180 | 47 + 181 | 49 + 182 | 40 + 183 | 46 + 184 | 52 + 185 | 36 + 186 | 45 + 187 | 41 + 188 | 47 + 189 | 49 + 190 | 46 + 191 | 45 + 192 | 39 + 193 | 50 + 194 | 39 + 195 | 54 + 196 | 43 + 197 | 50 + 198 | 46 + 199 | 42 + 200 | 31 + 201 | 28 + 202 | 28 + 203 | 28 + 204 | 30 + 205 | 22 + 206 | 25 + 207 | 27 + 208 | 32 + 209 | 22 + 210 | 21 + 211 | 31 + 212 | 22 + 213 | 37 + 214 | 19 + 215 | 25 + 216 | 27 + 217 | 26 + 218 | 24 + 219 | 25 + 220 | 26 + 221 | 21 + 222 | 23 + 223 | 20 + 224 | 26 + 225 | 25 + 226 | 25 + 227 | 23 + 228 | 30 + 229 | 30 + 230 | 24 + 231 | 22 + 232 | 27 + 233 | 27 + 234 | 21 + 235 | 27 + 236 | 24 + 237 | 24 + 238 | 29 + 239 | 32 + 240 | 31 + 241 | 24 + 242 | 36 + 243 | 21 + 244 | 29 + 245 | 22 + 246 | 23 + 247 | 21 + 248 | 26 + 249 | 29 + 250 | 24 + 251 | 29 + 252 | 25 + 253 | 28 + 254 | 25 + 255 | 19 + 256 | 23 + 257 | 20 + 258 | 24 + 259 | 31 + 260 | 29 + 261 | 20 + 262 | 25 + 263 | 23 + 264 | 25 + 265 | 23 + 266 | 31 + 267 | 22 + 268 | 26 + 269 | 33 + 270 | 25 + 271 | 27 + 272 | 29 + 273 | 29 + 274 | 26 + 275 | 28 + 276 | 30 + 277 | 28 + 278 | 29 + 279 | 22 + 280 | 29 + 281 | 23 + 282 | 30 + 283 | 29 + 284 | 23 + 285 | 37 + 286 | 27 + 287 | 31 + 288 | 28 + 289 | 26 + 290 | 25 + 291 | 29 + 292 | 22 + 293 | 26 + 294 | 29 + 295 | 24 + 296 | 27 + 297 | 30 + 298 | 29 + 299 | 26 + 300 | 13 + 1000 | 300 + 1001 | 3600 + | 9 + | 244 +(305 rows) + diff --git a/contrib/pageinspect/expected/gist.out b/contrib/pageinspect/expected/gist.out new file mode 100644 index 0000000..46e55f4 --- /dev/null +++ b/contrib/pageinspect/expected/gist.out @@ -0,0 +1,18 @@ +CREATE TABLE gist_table (t box); +\copy gist_table from 'data/rect.data' +CREATE INDEX gist_idx ON gist_table USING gist (t); +SELECT gist_stats('gist_idx'); + gist_stats +----------------------------------------- + Number of levels: 2 + + Number of pages: 29 + + Number of leaf pages: 28 + + Number of tuples: 3406 + + Number of invalid tuples: 0 + + Number of leaf tuples: 3378 + + Total size of tuples: 143516 bytes+ + Total size of leaf tuples: 142296 bytes+ + Total size of index: 237568 bytes+ + +(1 row) + diff --git a/contrib/pageinspect/expected/spgist.out b/contrib/pageinspect/expected/spgist.out new file mode 100644 index 0000000..5bab22e --- /dev/null +++ b/contrib/pageinspect/expected/spgist.out @@ -0,0 +1,120 @@ +CREATE TABLE spgist_table (t box); +\copy spgist_table from 'data/rect.data' +SELECT center(t) AS p INTO spgist_table_p FROM spgist_table; +CREATE INDEX spgist_idx ON spgist_table_p USING spgist (p); +CREATE INDEX kdspgist_idx ON spgist_table_p USING spgist (p kd_point_ops); +SELECT spgist_stats('spgist_idx'); + spgist_stats +---------------------------------- + totalPages: 21 + + deletedPages: 0 + + innerPages: 2 + + leafPages: 19 + + emptyPages: 0 + + usedSpace: 126.70 kbytes+ + usedInnerSpace: 1.17 kbytes + + usedLeafSpace: 125.53 kbytes+ + freeSpace: 40.64 kbytes + + fillRatio: 75.71% + + leafTuples: 3947 + + innerTuples: 20 + + innerAllTheSame: 0 + + leafPlaceholders: 569 + + innerPlaceholders: 0 + + leafRedirects: 0 + + innerRedirects: 0 +(1 row) + +SELECT * FROM spgist_print('kdspgist_idx') as t(tid tid, allthesame bool, node_n int, level int, tid_pointer tid, prefix float8, node_label int, leaf_value point); + tid | allthesame | node_n | level | tid_pointer | prefix | node_label | leaf_value +----------+------------+--------+-------+-------------+---------+------------+------------------- + (1,1) | f | 0 | 1 | (5,1) | 23030 | | + (1,1) | f | 1 | 1 | (5,2) | 23030 | | + (5,2) | f | 0 | 2 | (5,6) | 21664 | | + (5,2) | f | 1 | 2 | (5,3) | 21664 | | + (5,3) | f | 0 | 3 | (5,5) | 37159.5 | | + (5,3) | f | 1 | 3 | (5,12) | 37159.5 | | + (5,12) | f | 0 | 4 | (5,13) | 36357.5 | | + (5,12) | f | 1 | 4 | (14,226) | 36357.5 | | + (14,226) | | | 5 | | | | (43240,47256.5) + (5,13) | f | 0 | 5 | (3,112) | 43507 | | + (5,13) | f | 1 | 5 | (5,25) | 43507 | | + (5,25) | f | 0 | 6 | (22,116) | 28862 | | + (5,25) | f | 1 | 6 | (22,115) | 28862 | | + (22,115) | | | 7 | | | | (30902,44532) + (22,116) | | | 7 | | | | (23048,47416) + (3,112) | | | 6 | | | | (35218.5,42124) + (5,5) | f | 0 | 4 | (5,11) | 33416 | | + (5,5) | f | 1 | 4 | (5,22) | 33416 | | + (5,22) | f | 0 | 5 | (20,225) | 30991 | | + (5,22) | f | 1 | 5 | (5,23) | 30991 | | + (5,23) | f | 0 | 6 | (9,112) | 41820 | | + (5,23) | f | 1 | 6 | (9,114) | 41820 | | + (9,114) | | | 7 | | | | (44732,32182) + (9,112) | | | 7 | | | | (35580,33526.5) + (20,225) | | | 6 | | | | (47724.5,27185.5) + (5,11) | f | 0 | 5 | (13,101) | 29986.5 | | + (5,11) | f | 1 | 5 | (13,100) | 29986.5 | | + (13,100) | | | 6 | | | | (24069,30850.5) + (13,101) | | | 6 | | | | (29539,25566) + (5,6) | f | 0 | 3 | (5,7) | 36774 | | + (5,6) | f | 1 | 3 | (5,19) | 36774 | | + (5,19) | f | 0 | 4 | (5,20) | 10075.5 | | + (5,19) | f | 1 | 4 | (18,225) | 10075.5 | | + (18,225) | | | 5 | | | | (20920.5,49105.5) + (5,20) | f | 0 | 5 | (10,110) | 44171.5 | | + (5,20) | f | 1 | 5 | (10,113) | 44171.5 | | + (10,113) | | | 6 | | | | (93,46797) + (10,110) | | | 6 | | | | (28.5,38640.5) + (5,7) | f | 0 | 4 | (7,113) | 9517 | | + (5,7) | f | 1 | 4 | (5,21) | 9517 | | + (5,21) | f | 0 | 5 | (19,115) | 28907.5 | | + (5,21) | f | 1 | 5 | (19,112) | 28907.5 | | + (19,112) | | | 6 | | | | (11916.5,31668) + (19,115) | | | 6 | | | | (20622.5,27462.5) + (7,113) | | | 5 | | | | (9296,35157) + (5,1) | f | 0 | 2 | (5,8) | 26938 | | + (5,1) | f | 1 | 2 | (5,4) | 26938 | | + (5,4) | f | 0 | 3 | (5,10) | 9532 | | + (5,4) | f | 1 | 3 | (5,14) | 9532 | | + (5,14) | f | 0 | 4 | (5,15) | 38603 | | + (5,14) | f | 1 | 4 | (15,222) | 38603 | | + (15,222) | | | 5 | | | | (41926.5,17934.5) + (5,15) | f | 0 | 5 | (8,113) | 16345 | | + (5,15) | f | 1 | 5 | (8,112) | 16345 | | + (8,112) | | | 6 | | | | (32425,20702.5) + (8,113) | | | 6 | | | | (29134,15559.5) + (5,10) | f | 0 | 4 | (12,94) | 38800.5 | | + (5,10) | f | 1 | 4 | (5,24) | 38800.5 | | + (5,24) | f | 0 | 5 | (21,108) | 4752 | | + (5,24) | f | 1 | 5 | (21,107) | 4752 | | + (21,107) | | | 6 | | | | (49822.5,7097.5) + (21,108) | | | 6 | | | | (40315.5,1689.5) + (12,94) | | | 5 | | | | (30295.5,5090) + (5,8) | f | 0 | 3 | (5,17) | 11733.5 | | + (5,8) | f | 1 | 3 | (5,9) | 11733.5 | | + (5,9) | f | 0 | 4 | (6,114) | 11993 | | + (5,9) | f | 1 | 4 | (5,16) | 11993 | | + (5,16) | f | 0 | 5 | (16,123) | 17591 | | + (5,16) | f | 1 | 5 | (16,127) | 17591 | | + (16,127) | | | 6 | | | | (18352.5,19366) + (16,123) | | | 6 | | | | (24795,14921) + (6,114) | | | 5 | | | | (6706,16676) + (5,17) | f | 0 | 4 | (5,18) | 13329.5 | | + (5,17) | f | 1 | 4 | (17,226) | 13329.5 | | + (17,226) | | | 5 | | | | (23690,10214.5) + (5,18) | f | 0 | 5 | (11,113) | 6375 | | + (5,18) | f | 1 | 5 | (11,109) | 6375 | | + (11,109) | | | 6 | | | | (5501.5,9916) + (11,113) | | | 6 | | | | (1072.5,4752) +(79 rows) + +SELECT * FROM spgist_print('spgist_idx') as t(tid tid, allthesame bool, node_n int, level int, tid_pointer tid, prefix point, node_label int, leaf_value point) WHERE level = 1; + tid | allthesame | node_n | level | tid_pointer | prefix | node_label | leaf_value +-------+------------+--------+-------+-------------+-------------------------------------+------------+------------ + (1,1) | f | 0 | 1 | (5,4) | (24530.2070484581,23595.7092511013) | | + (1,1) | f | 1 | 1 | (5,3) | (24530.2070484581,23595.7092511013) | | + (1,1) | f | 2 | 1 | (5,2) | (24530.2070484581,23595.7092511013) | | + (1,1) | f | 3 | 1 | (5,1) | (24530.2070484581,23595.7092511013) | | +(4 rows) + diff --git a/contrib/pageinspect/ginfuncs.c b/contrib/pageinspect/ginfuncs.c index f774495..5f86355 100644 --- a/contrib/pageinspect/ginfuncs.c +++ b/contrib/pageinspect/ginfuncs.c @@ -2,11 +2,18 @@ * ginfuncs.c * Functions to investigate the content of GIN indexes * + * Source code is based on Gevel module available at + * (http://www.sai.msu.su/~megera/oddmuse/index.cgi/Gevel) + * Originally developed by: + * - Oleg Bartunov , Moscow, Moscow University, Russia + * - Teodor Sigaev , Moscow, Moscow University, Russia + * * Copyright (c) 2014-2017, PostgreSQL Global Development Group * * IDENTIFICATION * contrib/pageinspect/ginfuncs.c */ + #include "postgres.h" #include "pageinspect.h" @@ -15,22 +22,263 @@ #include "access/gin_private.h" #include "access/htup_details.h" #include "catalog/namespace.h" +#include "catalog/pg_am.h" #include "catalog/pg_type.h" #include "funcapi.h" #include "miscadmin.h" +#include "tsearch/ts_utils.h" #include "utils/array.h" #include "utils/builtins.h" +#include "utils/datum.h" +#include "utils/fmgroids.h" #include "utils/rel.h" +#include "utils/regproc.h" +#include "utils/lsyscache.h" +#include "utils/varlena.h" + #define DatumGetItemPointer(X) ((ItemPointer) DatumGetPointer(X)) #define ItemPointerGetDatum(X) PointerGetDatum(X) +typedef struct GinStatState +{ + Relation index; + GinState ginstate; + OffsetNumber attnum; + + Buffer buffer; + OffsetNumber offset; + Datum curval; /* Key */ + GinNullCategory category; + Datum dvalues[2]; /* Represents tuple 0 - key; 1 - # of TIDs */ + char nulls[2]; +} GinStatState; + +typedef struct gin_leafpage_items_state +{ + TupleDesc tupd; + GinPostingList *seg; + GinPostingList *lastseg; +} gin_leafpage_items_state; + PG_FUNCTION_INFO_V1(gin_metapage_info); PG_FUNCTION_INFO_V1(gin_page_opaque_info); PG_FUNCTION_INFO_V1(gin_leafpage_items); +PG_FUNCTION_INFO_V1(gin_value_count); +PG_FUNCTION_INFO_V1(gin_count_estimate); +PG_FUNCTION_INFO_V1(gin_stats); + +/* + * process_tuples + * Retrieves the number of TIDs in a tuple. + */ +static void +process_tuple(FuncCallContext *funcctx, GinStatState * st, IndexTuple itup) +{ + MemoryContext oldcontext; + Datum key; + + oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx); + + key = gintuple_get_key(&st->ginstate, itup, &st->category); + + if (st->category != GIN_CAT_NORM_KEY) + st->curval = (Datum) 0; + else + st->curval = datumCopy( + key, + st->index->rd_att->attrs[st->attnum]->attbyval, + st->index->rd_att->attrs[st->attnum]->attlen); + MemoryContextSwitchTo(oldcontext); + + st->dvalues[0] = st->curval; + + /* do no distiguish various null category */ + st->nulls[0] = (st->category == GIN_CAT_NORM_KEY) ? false : true; + + if (GinIsPostingTree(itup)) + { + BlockNumber rootblkno = GinGetPostingTree(itup); + GinBtreeData btree; + GinBtreeStack *stack; + ItemPointerData minItem; + int nlist; + ItemPointer list; + Page page; + uint32 predictNumber; + + LockBuffer(st->buffer, GIN_UNLOCK); + stack = ginScanBeginPostingTree(&btree, st->index, rootblkno, NULL); + page = BufferGetPage(stack->buffer); + ItemPointerSetMin(&minItem); + list = GinDataLeafPageGetItems(page, &nlist, minItem); + pfree(list); + predictNumber = stack->predictNumber; + st->dvalues[1] = Int32GetDatum(predictNumber * nlist); + + LockBuffer(stack->buffer, GIN_UNLOCK); + freeGinBtreeStack(stack); + } + else + { + st->dvalues[1] = Int32GetDatum(GinGetNPosting(itup)); + LockBuffer(st->buffer, GIN_UNLOCK); + } +} + +static bool +move_right_if_needed(GinStatState * st) +{ + Page page = BufferGetPage(st->buffer); + + if (st->offset > PageGetMaxOffsetNumber(page)) + { + /* + * We scaned the whole page, so we should take right page + */ + BlockNumber blkno = GinPageGetOpaque(page)->rightlink; + + if (GinPageRightMost(page)) + return false; /* no more page */ + + LockBuffer(st->buffer, GIN_UNLOCK); + st->buffer = ReleaseAndReadBuffer(st->buffer, st->index, blkno); + LockBuffer(st->buffer, GIN_SHARE); + st->offset = FirstOffsetNumber; + } + + return true; +} + +/* + * refind_position + * Refinds a previois position, at returns it has correctly + * set offset and buffer is locked. + */ +static bool +refind_position(GinStatState * st) +{ + Page page; + + /* find left if needed (it causes only for first search) */ + for (;;) + { + IndexTuple itup; + BlockNumber blkno; + + LockBuffer(st->buffer, GIN_SHARE); + + page = BufferGetPage(st->buffer); + if (GinPageIsLeaf(page)) + break; + + itup = (IndexTuple) PageGetItem(page, + PageGetItemId(page, FirstOffsetNumber)); + blkno = GinItemPointerGetBlockNumber(&(itup)->t_tid); + + LockBuffer(st->buffer, GIN_UNLOCK); + st->buffer = ReleaseAndReadBuffer(st->buffer, st->index, blkno); + } + + if (st->offset == InvalidOffsetNumber) + { + return (PageGetMaxOffsetNumber(page) >= FirstOffsetNumber) ? true : false; + } + + for (;;) + { + int cmp; + GinNullCategory category; + Datum datum; + IndexTuple itup; + + if (move_right_if_needed(st) == false) + return false; + + itup = (IndexTuple) PageGetItem(page, PageGetItemId(page, st->offset)); + datum = gintuple_get_key(&st->ginstate, itup, &category); + cmp = ginCompareAttEntries(&st->ginstate, + st->attnum + 1, st->curval, st->category, + gintuple_get_attrnum(&st->ginstate, itup), + datum, category); + if (cmp == 0) + { + if (st->curval && !st->index->rd_att->attrs[st->attnum]->attbyval) + pfree((void *) st->curval); + return true; + } + + st->offset++; + } + + return false; +} + +static Relation +gin_index_open(RangeVar *relvar) +{ + Oid relOid = RangeVarGetRelid(relvar, NoLock, false); + Relation rel = index_open(relOid, AccessShareLock); + + if (rel->rd_index == NULL) + elog(ERROR, "Relation %s.%s is not an index", + get_namespace_name(RelationGetNamespace(rel)), + RelationGetRelationName(rel) + ); + + if (rel->rd_rel->relam != GIN_AM_OID) + elog(ERROR, "Index %s.%s has wrong type", + get_namespace_name(RelationGetNamespace(rel)), + RelationGetRelationName(rel) + ); + return rel; +} + +static void +gin_setup_firstcall(FuncCallContext *funcctx, text *name, int attnum) +{ + MemoryContext oldcontext; + GinStatState *st; + char *relname = text_to_cstring(name); + TupleDesc tupdesc; + oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx); + + st = (GinStatState *) palloc(sizeof(GinStatState)); + memset(st, 0, sizeof(GinStatState)); + st->index = gin_index_open( + makeRangeVarFromNameList(stringToQualifiedNameList(relname))); + initGinState(&st->ginstate, st->index); + + if (attnum < 0 || attnum >= st->index->rd_att->natts) + elog(ERROR, "Wrong column's number"); + st->attnum = attnum; + + funcctx->user_fctx = (void *) st; + + tupdesc = CreateTemplateTupleDesc(2, false); + TupleDescInitEntry(tupdesc, 1, "value", + st->index->rd_att->attrs[st->attnum]->atttypid, + st->index->rd_att->attrs[st->attnum]->atttypmod, + st->index->rd_att->attrs[st->attnum]->attndims); + TupleDescInitEntry(tupdesc, 2, "nrow", INT4OID, -1, 0); + + memset(st->nulls, false, 2 * sizeof(*st->nulls)); + + funcctx->slot = TupleDescGetSlot(tupdesc); + funcctx->attinmeta = TupleDescGetAttInMetadata(tupdesc); + + MemoryContextSwitchTo(oldcontext); + pfree(relname); + + st->offset = InvalidOffsetNumber; + st->buffer = ReadBuffer(st->index, GIN_ROOT_BLKNO); +} +/* + * gin_metapage_info + */ Datum gin_metapage_info(PG_FUNCTION_ARGS) { @@ -46,7 +294,8 @@ gin_metapage_info(PG_FUNCTION_ARGS) if (!superuser()) ereport(ERROR, (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), - (errmsg("must be superuser to use raw page functions")))); + (errmsg("must be superuser to use raw page functions"))) + ); page = get_page_from_raw(raw_page); @@ -56,7 +305,8 @@ gin_metapage_info(PG_FUNCTION_ARGS) (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("input page is not a GIN metapage"), errdetail("Flags %04X, expected %04X", - opaq->flags, GIN_META))); + opaq->flags, GIN_META)) + ); /* Build a tuple descriptor for our result type */ if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE) @@ -86,7 +336,9 @@ gin_metapage_info(PG_FUNCTION_ARGS) return HeapTupleGetDatum(resultTuple); } - +/* + * gin_page_opaque_info + */ Datum gin_page_opaque_info(PG_FUNCTION_ARGS) { @@ -104,7 +356,8 @@ gin_page_opaque_info(PG_FUNCTION_ARGS) if (!superuser()) ereport(ERROR, (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), - (errmsg("must be superuser to use raw page functions")))); + (errmsg("must be superuser to use raw page functions"))) + ); page = get_page_from_raw(raw_page); @@ -137,7 +390,8 @@ gin_page_opaque_info(PG_FUNCTION_ARGS) if (flagbits) { /* any flags we don't recognize are printed in hex */ - flags[nflags++] = DirectFunctionCall1(to_hex32, Int32GetDatum(flagbits)); + flags[nflags++] = DirectFunctionCall1(to_hex32, + Int32GetDatum(flagbits)); } memset(nulls, 0, sizeof(nulls)); @@ -153,13 +407,9 @@ gin_page_opaque_info(PG_FUNCTION_ARGS) return HeapTupleGetDatum(resultTuple); } -typedef struct gin_leafpage_items_state -{ - TupleDesc tupd; - GinPostingList *seg; - GinPostingList *lastseg; -} gin_leafpage_items_state; - +/* + * gin_leafpage_items + */ Datum gin_leafpage_items(PG_FUNCTION_ARGS) { @@ -170,7 +420,8 @@ gin_leafpage_items(PG_FUNCTION_ARGS) if (!superuser()) ereport(ERROR, (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), - (errmsg("must be superuser to use raw page functions")))); + (errmsg("must be superuser to use raw page functions"))) + ); if (SRF_IS_FIRSTCALL()) { @@ -190,7 +441,8 @@ gin_leafpage_items(PG_FUNCTION_ARGS) errmsg("input page is not a valid GIN data leaf page"), errdetail("Special size %d, expected %d", (int) PageGetSpecialSize(page), - (int) MAXALIGN(sizeof(GinPageOpaqueData))))); + (int) MAXALIGN(sizeof(GinPageOpaqueData)))) + ); opaq = (GinPageOpaque) PageGetSpecialPointer(page); if (opaq->flags != (GIN_DATA | GIN_LEAF | GIN_COMPRESSED)) @@ -199,7 +451,8 @@ gin_leafpage_items(PG_FUNCTION_ARGS) errmsg("input page is not a compressed GIN data leaf page"), errdetail("Flags %04X, expected %04X", opaq->flags, - (GIN_DATA | GIN_LEAF | GIN_COMPRESSED)))); + (GIN_DATA | GIN_LEAF | GIN_COMPRESSED))) + ); inter_call_data = palloc(sizeof(gin_leafpage_items_state)); @@ -261,5 +514,311 @@ gin_leafpage_items(PG_FUNCTION_ARGS) SRF_RETURN_NEXT(fctx, result); } else + { SRF_RETURN_DONE(fctx); + } +} + +/* + * gin_value_count + * Prints estimated counts for each indexed values. + */ +Datum +gin_value_count(PG_FUNCTION_ARGS) +{ + FuncCallContext *funcctx; + GinStatState *st; + Datum result = (Datum) 0; + IndexTuple ituple; + HeapTuple htuple; + Page page; + + if (SRF_IS_FIRSTCALL()) + { + text *name = PG_GETARG_TEXT_P(0); + + funcctx = SRF_FIRSTCALL_INIT(); + gin_setup_firstcall(funcctx, name, (PG_NARGS() == 2) ? + PG_GETARG_INT32(1) : 0); + PG_FREE_IF_COPY(name, 0); + } + + funcctx = SRF_PERCALL_SETUP(); + st = (GinStatState *) (funcctx->user_fctx); + + if (refind_position(st) == false) + { + UnlockReleaseBuffer(st->buffer); + index_close(st->index, AccessShareLock); + + SRF_RETURN_DONE(funcctx); + } + + for (;;) + { + st->offset++; + + if (move_right_if_needed(st) == false) + { + UnlockReleaseBuffer(st->buffer); + index_close(st->index, AccessShareLock); + + SRF_RETURN_DONE(funcctx); + } + + page = BufferGetPage(st->buffer); + ituple = (IndexTuple) PageGetItem(page, + PageGetItemId(page, st->offset)); + + if (st->attnum + 1 == gintuple_get_attrnum(&st->ginstate, ituple)) + break; + } + + process_tuple(funcctx, st, ituple); + + htuple = heap_form_tuple(funcctx->attinmeta->tupdesc, + st->dvalues, + st->nulls); + result = TupleGetDatum(funcctx->slot, htuple); + + SRF_RETURN_NEXT(funcctx, result); +} + +/* + * gin_count_estimate + * Outputs number of indexed rows matched query. It doesn't touch heap at + * all. + * + * Usage: + * SELECT gin_count_estimate('index_name', 'query'); + */ +Datum +gin_count_estimate(PG_FUNCTION_ARGS) +{ + text *name = PG_GETARG_TEXT_P(0); + Relation index; + IndexScanDesc scan; + int64 count = 0; + char *relname = text_to_cstring(name); + ScanKeyData key; + TIDBitmap *bitmap = tbm_create(work_mem * 1024L, NULL); + + index = gin_index_open(makeRangeVarFromNameList(stringToQualifiedNameList(relname))); + + if (index->rd_opcintype[0] != TSVECTOROID) + { + index_close(index, AccessShareLock); + elog(ERROR, "Column type is not a tsvector"); + } + + key.sk_flags = 0; + key.sk_attno = 1; + key.sk_strategy = TSearchStrategyNumber; + key.sk_subtype = 0; + key.sk_argument = PG_GETARG_DATUM(1); + + fmgr_info(F_TS_MATCH_VQ, &key.sk_func); + + scan = index_beginscan_bitmap(index, SnapshotSelf, 1); + index_rescan(scan, &key, 1, NULL, 0); + + count = index_getbitmap(scan, bitmap); + tbm_free(bitmap); + + pfree(relname); + + index_endscan(scan); + index_close(index, AccessShareLock); + + PG_RETURN_INT64(count); +} + +/* + * gin_stat + * Prints various stat about index internals. + * + * Usage: + * SELECT * FROM gin_stat('gin_idx') as t(value int, nrow int); + */ +Datum +gin_stats(PG_FUNCTION_ARGS) +{ + text *name = PG_GETARG_TEXT_P(0); + RangeVar *relvar; + Relation index; + BlockNumber blkno; + char res[1024]; + uint32 totalPages, + deletedPages = 0, + emptyDataPages = 0, + entryPages = 0, + dataPages = 0, + dataInnerPages = 0, + dataLeafPages = 0, + entryInnerPages = 0, + entryLeafPages = 0; + + uint64 dataInnerFreeSpace = 0, + dataLeafFreeSpace = 0, + dataInnerTuplesCount = 0, + dataLeafIptrsCount = 0, + entryInnerFreeSpace = 0, + entryLeafFreeSpace = 0, + entryInnerTuplesCount = 0, + entryLeafTuplesCount = 0, + entryPostingSize = 0, + entryPostingCount = 0, + entryAttrSize = 0; + + relvar = makeRangeVarFromNameList(textToQualifiedNameList(name)); + index = relation_openrv(relvar, AccessExclusiveLock); + + if (index->rd_rel->relkind != RELKIND_INDEX || + index->rd_rel->relam != GIN_AM_OID) + elog(ERROR, "relation \"%s\" is not a GIN index", + RelationGetRelationName(index)); + + totalPages = RelationGetNumberOfBlocks(index); + + for (blkno = GIN_ROOT_BLKNO; blkno < totalPages; blkno++) + { + Buffer buffer; + Page page; + PageHeader header; + + buffer = ReadBuffer(index, blkno); + LockBuffer(buffer, BUFFER_LOCK_SHARE); + + page = BufferGetPage(buffer); + header = (PageHeader) page; + + if (GinPageIsDeleted(page)) + { + deletedPages++; + } + else if (GinPageIsData(page)) + { + dataPages++; + if (GinPageIsLeaf(page)) + { + ItemPointerData minItem, + *ptr; + int nlist; + + + dataLeafPages++; + dataLeafFreeSpace += header->pd_upper - header->pd_lower; + ItemPointerSetMin(&minItem); + + ptr = GinDataLeafPageGetItems(page, &nlist, minItem); + + if (ptr) + { + pfree(ptr); + dataLeafIptrsCount += nlist; + } + else + emptyDataPages++; + } + else + { + dataInnerPages++; + dataInnerFreeSpace += header->pd_upper - header->pd_lower; + dataInnerTuplesCount += GinPageGetOpaque(page)->maxoff; + } + } + else + { + IndexTuple itup; + OffsetNumber i, + maxoff; + + maxoff = PageGetMaxOffsetNumber(page); + + entryPages++; + if (GinPageIsLeaf(page)) + { + entryLeafPages++; + entryLeafFreeSpace += header->pd_upper - header->pd_lower; + entryLeafTuplesCount += maxoff; + } + else + { + entryInnerPages++; + entryInnerFreeSpace += header->pd_upper - header->pd_lower; + entryInnerTuplesCount += maxoff; + } + + for (i = 1; i <= maxoff; i++) + { + itup = (IndexTuple) PageGetItem(page, PageGetItemId(page, i)); + + if (GinPageIsLeaf(page)) + { + GinPostingList *list = (GinPostingList *) GinGetPosting(itup); + + entryPostingCount += GinGetNPosting(itup); + entryPostingSize += SizeOfGinPostingList(list); + entryAttrSize += GinGetPostingOffset(itup) - + IndexInfoFindDataOffset((itup)->t_info); + } + else + { + entryAttrSize += IndexTupleSize(itup) - + IndexInfoFindDataOffset((itup)->t_info); + } + } + } + + UnlockReleaseBuffer(buffer); + } + + index_close(index, AccessExclusiveLock); + totalPages--; + + snprintf(res, sizeof(res), + "totalPages: %u\n" + "deletedPages: %u\n" + "emptyDataPages: %u\n" + "dataPages: %u\n" + "dataInnerPages: %u\n" + "dataLeafPages: %u\n" + "dataInnerFreeSpace: " INT64_FORMAT "\n" + "dataLeafFreeSpace: " INT64_FORMAT "\n" + "dataInnerTuplesCount: " INT64_FORMAT "\n" + "dataLeafIptrsCount: " INT64_FORMAT "\n" + "entryPages: %u\n" + "entryInnerPages: %u\n" + "entryLeafPages: %u\n" + "entryInnerFreeSpace: " INT64_FORMAT "\n" + "entryLeafFreeSpace: " INT64_FORMAT "\n" + "entryInnerTuplesCount: " INT64_FORMAT "\n" + "entryLeafTuplesCount: " INT64_FORMAT "\n" + "entryPostingSize: " INT64_FORMAT "\n" + "entryPostingCount: " INT64_FORMAT "\n" + "entryAttrSize: " INT64_FORMAT "\n" + , + totalPages, + deletedPages, + emptyDataPages, + dataPages, + dataInnerPages, + dataLeafPages, + dataInnerFreeSpace, + dataLeafFreeSpace, + dataInnerTuplesCount, + dataLeafIptrsCount, + entryPages, + entryInnerPages, + entryLeafPages, + entryInnerFreeSpace, + entryLeafFreeSpace, + entryInnerTuplesCount, + entryLeafTuplesCount, + entryPostingSize, + entryPostingCount, + entryAttrSize + ); + + PG_RETURN_TEXT_P(CStringGetTextDatum(res)); } diff --git a/contrib/pageinspect/gistfuncs.c b/contrib/pageinspect/gistfuncs.c new file mode 100644 index 0000000..c285606 --- /dev/null +++ b/contrib/pageinspect/gistfuncs.c @@ -0,0 +1,509 @@ +/* + * gistfuncs.c + * Functions to investigate the content of GiST indexes + * + * Source code is based on Gevel module available at + * (http://www.sai.msu.su/~megera/oddmuse/index.cgi/Gevel) + * Originally developed by: + * - Oleg Bartunov , Moscow, Moscow University, Russia + * - Teodor Sigaev , Moscow, Moscow University, Russia + * + * Copyright (c) 2017, PostgreSQL Global Development Group + * + * IDENTIFICATION + * contrib/pageinspect/gistfuncs.c + */ + +#include "postgres.h" + +#include "access/gist_private.h" +#include "access/relscan.h" +#include "catalog/namespace.h" +#include "catalog/pg_am.h" +#include "catalog/pg_type.h" +#include "funcapi.h" +#include "utils/builtins.h" +#include "utils/lsyscache.h" +#include "utils/regproc.h" + +#define PAGESIZE (BLCKSZ - MAXALIGN(sizeof(PageHeaderData) + \ + sizeof(ItemIdData))) + +/* + * For GiST tree dumping. + */ +typedef struct +{ + int maxlevel; /* Max level of tree to look through. */ + text *txt; + char *ptr; + int len; +} IdxInfo; + +/* + * For GiST tree traversal and statistics collection. + */ +typedef struct +{ + int level; + int numpages; + int numleafpages; + int numtuple; + int numinvalidtuple; + int numleaftuple; + uint64 tuplesize; + uint64 leaftuplesize; + uint64 totalsize; +} IdxStat; + +/* + * GiST page. + */ +typedef struct GPItem +{ + Buffer buffer; + Page page; + OffsetNumber offset; + int level; + struct GPItem *next; +} GPItem; + +typedef struct +{ + List *relname_list; + RangeVar *relvar; + Relation index; + Datum *dvalues; + bool *nulls; + GPItem *item; +} TypeStorage; + + +PG_FUNCTION_INFO_V1(gist_stats); +PG_FUNCTION_INFO_V1(gist_tree); +PG_FUNCTION_INFO_V1(gist_print); + + +static Relation +gist_index_open(RangeVar *relvar) +{ + Oid relOid = RangeVarGetRelid(relvar, NoLock, false); + Relation r = index_open(relOid, AccessExclusiveLock); + + if (r->rd_index == NULL) + elog(ERROR, "Relation %s.%s is not an index", + get_namespace_name(RelationGetNamespace(r)), + RelationGetRelationName(r) + ); + + if (r->rd_rel->relam != GIST_AM_OID) + elog(ERROR, "Index %s.%s has wrong type", + get_namespace_name(RelationGetNamespace(r)), + RelationGetRelationName(r) + ); + + return r; +} + +/* open_gp_page + * Opens GiST page. + */ +static GPItem * +open_gp_page(FuncCallContext *funcctx, BlockNumber blk) +{ + GPItem *nitem; + MemoryContext oldcontext; + Relation index = ((TypeStorage *) (funcctx->user_fctx))->index; + + oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx); + nitem = (GPItem *) palloc(sizeof(GPItem)); + memset(nitem, 0, sizeof(GPItem)); + + nitem->buffer = ReadBuffer(index, blk); + nitem->page = (Page) BufferGetPage(nitem->buffer); + nitem->offset = FirstOffsetNumber; + nitem->next = ((TypeStorage *) (funcctx->user_fctx))->item; + nitem->level = (nitem->next) ? nitem->next->level + 1 : 1; + ((TypeStorage *) (funcctx->user_fctx))->item = nitem; + + MemoryContextSwitchTo(oldcontext); + return nitem; +} + +/* + * close_gp_page + * Close GiST page. + */ +static GPItem * +close_gp_page(FuncCallContext *funcctx) +{ + GPItem *oitem = ((TypeStorage *) (funcctx->user_fctx))->item; + + ((TypeStorage *) (funcctx->user_fctx))->item = oitem->next; + + ReleaseBuffer(oitem->buffer); + pfree(oitem); + return ((TypeStorage *) (funcctx->user_fctx))->item; +} + +/* + * gist_stattree + * Traverses GiST tree and collects statistics. + */ +static void +gist_stattree(Relation r, int level, BlockNumber blk, OffsetNumber coff, + IdxStat * info) +{ + Buffer buffer; + Page page; + IndexTuple which; + ItemId iid; + OffsetNumber i, + maxoff; + BlockNumber cblk; + char *pred; + + pred = (char *) palloc(sizeof(char) * level * 4 + 1); + MemSet(pred, ' ', level * 4); + pred[level * 4] = '\0'; + + buffer = ReadBuffer(r, blk); + page = (Page) BufferGetPage(buffer); + + maxoff = PageGetMaxOffsetNumber(page); + + info->numpages++; + info->tuplesize += PAGESIZE - PageGetFreeSpace(page); + info->totalsize += BLCKSZ; + info->numtuple += maxoff; + if (info->level < level) + info->level = level; + + if (GistPageIsLeaf(page)) + { + info->numleafpages++; + info->leaftuplesize += PAGESIZE - PageGetFreeSpace(page); + info->numleaftuple += maxoff; + } + else + { + for (i = FirstOffsetNumber; i <= maxoff; i = OffsetNumberNext(i)) + { + iid = PageGetItemId(page, i); + which = (IndexTuple) PageGetItem(page, iid); + if (GistTupleIsInvalid(which)) + info->numinvalidtuple++; + cblk = ItemPointerGetBlockNumber(&(which->t_tid)); + gist_stattree(r, level + 1, cblk, i, info); + } + } + + ReleaseBuffer(buffer); + pfree(pred); +} + +/* + * gist_dumptree + * Recursively prints GiST tree. + */ +static void +gist_dumptree(Relation r, int level, BlockNumber blk, OffsetNumber coff, + IdxInfo * info) +{ + Buffer buffer; + Page page; + IndexTuple which; + ItemId iid; + OffsetNumber i, + maxoff; + BlockNumber cblk; + char *pred; + + pred = (char *) palloc(sizeof(char) * level * 4 + 1); + MemSet(pred, ' ', level * 4); + pred[level * 4] = '\0'; + + buffer = ReadBuffer(r, blk); + page = (Page) BufferGetPage(buffer); + + maxoff = PageGetMaxOffsetNumber(page); + + + while ((info->ptr - ((char *) info->txt)) + level * 4 + 128 >= info->len) + { + int dist = info->ptr - ((char *) info->txt); + + info->len *= 2; + info->txt = (text *) repalloc(info->txt, info->len); + info->ptr = ((char *) info->txt) + dist; + } + + sprintf(info->ptr, + "%s%d(l:%d) blk: %u numTuple: %d free: %db(%.2f%%) rightlink:%u (%s)\n", + pred, + coff, + level, + blk, + (int) maxoff, + (int) PageGetFreeSpace(page), + 100.0 * (((float) PAGESIZE) - (float) PageGetFreeSpace(page)) / + ((float) PAGESIZE), + GistPageGetOpaque(page)->rightlink, + (GistPageGetOpaque(page)->rightlink == InvalidBlockNumber) ? + "InvalidBlockNumber" : "OK"); + info->ptr = strchr(info->ptr, '\0'); + + if (!GistPageIsLeaf(page) && (info->maxlevel < 0 || level < info->maxlevel)) + for (i = FirstOffsetNumber; i <= maxoff; i = OffsetNumberNext(i)) + { + iid = PageGetItemId(page, i); + which = (IndexTuple) PageGetItem(page, iid); + cblk = ItemPointerGetBlockNumber(&(which->t_tid)); + gist_dumptree(r, level + 1, cblk, i, info); + } + ReleaseBuffer(buffer); + pfree(pred); +} + +/* + * setup_firstcall + * Initialization for first call of SRF. + */ +static void +setup_firstcall(FuncCallContext *funcctx, text *name) +{ + MemoryContext oldcontext; + TypeStorage *st; + char *relname = text_to_cstring(name); + TupleDesc tupdesc; + char attname[NAMEDATALEN]; + int i; + + oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx); + + st = (TypeStorage *) palloc(sizeof(TypeStorage)); + memset(st, 0, sizeof(TypeStorage)); + st->relname_list = stringToQualifiedNameList(relname); + st->relvar = makeRangeVarFromNameList(st->relname_list); + st->index = gist_index_open(st->relvar); + funcctx->user_fctx = (void *) st; + + tupdesc = CreateTemplateTupleDesc(st->index->rd_att->natts + 2, false); + TupleDescInitEntry(tupdesc, 1, "level", INT4OID, -1, 0); + TupleDescInitEntry(tupdesc, 2, "valid", BOOLOID, -1, 0); + for (i = 0; i < st->index->rd_att->natts; i++) + { + sprintf(attname, "z%d", i + 2); + TupleDescInitEntry( + tupdesc, + i + 3, + attname, + st->index->rd_att->attrs[i]->atttypid, + st->index->rd_att->attrs[i]->atttypmod, + st->index->rd_att->attrs[i]->attndims + ); + } + + st->dvalues = (Datum *) palloc((tupdesc->natts + 2) * sizeof(Datum)); + st->nulls = (char *) palloc((tupdesc->natts + 2) * sizeof(*st->nulls)); + + funcctx->slot = TupleDescGetSlot(tupdesc); + funcctx->attinmeta = TupleDescGetAttInMetadata(tupdesc); + + MemoryContextSwitchTo(oldcontext); + pfree(relname); + + st->item = open_gp_page(funcctx, GIST_ROOT_BLKNO); +} + +/* + * close_call + * Clean up before SRF returns. + */ +static void +close_call(FuncCallContext *funcctx) +{ + TypeStorage *st = (TypeStorage *) (funcctx->user_fctx); + + while (st->item && close_gp_page(funcctx)); + + pfree(st->dvalues); + pfree(st->nulls); + + index_close(st->index, AccessExclusiveLock); +} + +/* + * gist_stats + * Returns statistics about GiST tree. + * + * Usage: + * select gist_stats('pix'); + */ +Datum +gist_stats(PG_FUNCTION_ARGS) +{ + text *name = PG_GETARG_TEXT_P(0); + char *relname = text_to_cstring(name); + RangeVar *relvar; + Relation index; + List *relname_list; + IdxStat info; + text *out = (text *) palloc(1024); + char *ptr = ((char *) out) + VARHDRSZ; + + + relname_list = stringToQualifiedNameList(relname); + relvar = makeRangeVarFromNameList(relname_list); + index = gist_index_open(relvar); + PG_FREE_IF_COPY(name, 0); + + memset(&info, 0, sizeof(IdxStat)); + + gist_stattree(index, 0, GIST_ROOT_BLKNO, 0, &info); + + index_close(index, AccessExclusiveLock); + pfree(relname); + + sprintf(ptr, + "Number of levels: %d\n" + "Number of pages: %d\n" + "Number of leaf pages: %d\n" + "Number of tuples: %d\n" + "Number of invalid tuples: %d\n" + "Number of leaf tuples: %d\n" + "Total size of tuples: " INT64_FORMAT " bytes\n" + "Total size of leaf tuples: " INT64_FORMAT " bytes\n" + "Total size of index: " INT64_FORMAT " bytes\n", + info.level + 1, + info.numpages, + info.numleafpages, + info.numtuple, + info.numinvalidtuple, + info.numleaftuple, + info.tuplesize, + info.leaftuplesize, + info.totalsize); + + ptr = strchr(ptr, '\0'); + + SET_VARSIZE(out, ptr - ((char *) out)); + PG_RETURN_POINTER(out); +} + +/* + * gist_tree + * Show GiST tree. + * + * Usage: + * SELECT gist_tree('gist_idx'); + */ +Datum +gist_tree(PG_FUNCTION_ARGS) +{ + text *name = PG_GETARG_TEXT_P(0); + char *relname = text_to_cstring(name); + RangeVar *relvar; + Relation index; + List *relname_list; + IdxInfo info; + + relname_list = stringToQualifiedNameList(relname); + relvar = makeRangeVarFromNameList(relname_list); + index = gist_index_open(relvar); + PG_FREE_IF_COPY(name, 0); + + info.maxlevel = (PG_NARGS() > 1) ? PG_GETARG_INT32(1) : -1; + info.len = 1024; + info.txt = (text *) palloc(info.len); + info.ptr = ((char *) info.txt) + VARHDRSZ; + + gist_dumptree(index, 0, GIST_ROOT_BLKNO, 0, &info); + + index_close(index, AccessExclusiveLock); + pfree(relname); + + SET_VARSIZE(info.txt, info.ptr - ((char *) info.txt)); + PG_RETURN_POINTER(info.txt); +} + +/* + * gist_print + * Prints objects stored in GiST tree, works only if objects in index have + * textual representation (type_out functions should be implemented for + * given object type). + * + * Usage: + * SELECT * FROM gist_print('gist_idx') as t(level int, valid bool, a box); + */ +Datum +gist_print(PG_FUNCTION_ARGS) +{ + FuncCallContext *funcctx; + TypeStorage *st; + Datum result = (Datum) 0; + ItemId iid; + IndexTuple ituple; + HeapTuple htuple; + int i; + bool isnull; + + if (SRF_IS_FIRSTCALL()) + { + text *name = PG_GETARG_TEXT_P(0); + + funcctx = SRF_FIRSTCALL_INIT(); + setup_firstcall(funcctx, name); + PG_FREE_IF_COPY(name, 0); + } + + funcctx = SRF_PERCALL_SETUP(); + st = (TypeStorage *) (funcctx->user_fctx); + + if (!st->item) + { + close_call(funcctx); + SRF_RETURN_DONE(funcctx); + } + + while (st->item->offset > PageGetMaxOffsetNumber(st->item->page)) + { + if (!close_gp_page(funcctx)) + { + close_call(funcctx); + SRF_RETURN_DONE(funcctx); + } + } + + iid = PageGetItemId(st->item->page, st->item->offset); + ituple = (IndexTuple) PageGetItem(st->item->page, iid); + + st->dvalues[0] = Int32GetDatum(st->item->level); + st->nulls[0] = false; + st->dvalues[1] = BoolGetDatum((!GistPageIsLeaf(st->item->page) && + GistTupleIsInvalid(ituple)) ? false : true); + st->nulls[1] = false; + for (i = 2; i < funcctx->attinmeta->tupdesc->natts; i++) + { + if (!GistPageIsLeaf(st->item->page) && GistTupleIsInvalid(ituple)) + { + st->dvalues[i] = (Datum) 0; + st->nulls[i] = true; + } + else + { + st->dvalues[i] = index_getattr(ituple, i - 1, st->index->rd_att, + &isnull); + st->nulls[i] = (isnull) ? true : false; + } + } + + htuple = heap_form_tuple(funcctx->attinmeta->tupdesc, st->dvalues, + st->nulls); + result = TupleGetDatum(funcctx->slot, htuple); + st->item->offset = OffsetNumberNext(st->item->offset); + if (!GistPageIsLeaf(st->item->page)) + open_gp_page(funcctx, ItemPointerGetBlockNumber(&(ituple->t_tid))); + + SRF_RETURN_NEXT(funcctx, result); +} diff --git a/contrib/pageinspect/hashfuncs.c b/contrib/pageinspect/hashfuncs.c index dbe3b6a..9597631 100644 --- a/contrib/pageinspect/hashfuncs.c +++ b/contrib/pageinspect/hashfuncs.c @@ -14,8 +14,8 @@ #include "access/hash.h" #include "access/htup_details.h" -#include "catalog/pg_type.h" #include "catalog/pg_am.h" +#include "catalog/pg_type.h" #include "funcapi.h" #include "miscadmin.h" #include "utils/builtins.h" diff --git a/contrib/pageinspect/pageinspect--1.6--1.7.sql b/contrib/pageinspect/pageinspect--1.6--1.7.sql new file mode 100644 index 0000000..fc9d096 --- /dev/null +++ b/contrib/pageinspect/pageinspect--1.6--1.7.sql @@ -0,0 +1,57 @@ +/* contrib/pageinspect/pageinspect--1.6--1.7.sql */ + +-- complain if script is sourced in psql, rather than via ALTER EXTENSION +\echo Use "ALTER EXTENSION pageinspect UPDATE TO '1.7'" to load this file. \quit + +-- GiST +CREATE FUNCTION gist_stats(text) +RETURNS text +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT; + +CREATE FUNCTION gist_tree(text) +RETURNS text +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT; + +CREATE FUNCTION gist_tree(text, int4) +RETURNS text +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT; + +CREATE FUNCTION gist_print(text) +RETURNS SETOF record +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT; + +-- SP-GiST +CREATE FUNCTION spgist_stats(text) +RETURNS text +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT; + +CREATE FUNCTION spgist_print(text) +RETURNS SETOF record +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT; + +-- GIN +CREATE FUNCTION gin_value_count(text) +RETURNS SETOF record +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT; + +CREATE FUNCTION gin_value_count(text, int) +RETURNS SETOF record +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT; + +CREATE FUNCTION gin_stats(text) +RETURNS text +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT; + +CREATE FUNCTION gin_count_estimate(text, tsquery) +RETURNS bigint +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT; diff --git a/contrib/pageinspect/pageinspect.control b/contrib/pageinspect/pageinspect.control index 1a61c9f..dcfc61f 100644 --- a/contrib/pageinspect/pageinspect.control +++ b/contrib/pageinspect/pageinspect.control @@ -1,5 +1,5 @@ # pageinspect extension comment = 'inspect the contents of database pages at a low level' -default_version = '1.6' +default_version = '1.7' module_pathname = '$libdir/pageinspect' relocatable = true diff --git a/contrib/pageinspect/spgistfuncs.c b/contrib/pageinspect/spgistfuncs.c new file mode 100644 index 0000000..c5da323 --- /dev/null +++ b/contrib/pageinspect/spgistfuncs.c @@ -0,0 +1,439 @@ +/* + * spgistfuncs.c + * Functions to investigate the content of SP-GiST indexes + * + * Source code is based on Gevel module available at + * (http://www.sai.msu.su/~megera/oddmuse/index.cgi/Gevel) + * Originally developed by: + * - Oleg Bartunov , Moscow, Moscow University, Russia + * - Teodor Sigaev , Moscow, Moscow University, Russia + * + * Copyright (c) 2017, PostgreSQL Global Development Group + * + * IDENTIFICATION + * contrib/pageinspect/spgistfuncs.c + */ + +#include "postgres.h" + +#include "access/gist_private.h" +#include "access/spgist_private.h" +#include "access/relscan.h" +#include "catalog/namespace.h" +#include "catalog/pg_am.h" +#include "catalog/pg_type.h" +#include "funcapi.h" +#include "miscadmin.h" +#include "utils/builtins.h" +#include "utils/datum.h" +#include "utils/varlena.h" + +typedef struct SPGistPrintStackElem +{ + ItemPointerData iptr; + int16 nlabel; + int level; +} SPGistPrintStackElem; + +typedef struct SPGistPrint +{ + SpGistState state; + Relation index; + Datum dvalues[8 /* see CreateTemplateTupleDesc call */ ]; + char nulls[8 /* see CreateTemplateTupleDesc call */ ]; + List *stack; +} SPGistPrint; + +#define IsIndex(r) ((r)->rd_rel->relkind == RELKIND_INDEX) +#define IsSpGist(r) ((r)->rd_rel->relam == SPGIST_AM_OID) + +static void +pushSPGistPrint(FuncCallContext *funcctx, SPGistPrint * prst, ItemPointer ip, + int level) +{ + MemoryContext oldcontext; + SPGistPrintStackElem *e; + + oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx); + + e = palloc(sizeof(*e)); + e->iptr = *ip; + e->nlabel = 0; + e->level = level; + prst->stack = lcons(e, prst->stack); + + MemoryContextSwitchTo(oldcontext); +} + +static void +close_spgist_print(SPGistPrint * prst) +{ + index_close(prst->index, AccessExclusiveLock); +} + +PG_FUNCTION_INFO_V1(spgist_stats); +PG_FUNCTION_INFO_V1(spgist_print); + +/* + * spgist_stats + * Show statistics about SP-GiST tree. + * + * Usage: + * SELECT spgist_stats('spgist_idx'); + */ +Datum +spgist_stats(PG_FUNCTION_ARGS) +{ + text *name = PG_GETARG_TEXT_P(0); + RangeVar *relvar; + Relation index; + BlockNumber blkno; + BlockNumber totalPages = 0, + innerPages = 0, + leafPages = 0, + emptyPages = 0, + deletedPages = 0; + double usedSpace = 0.0, + usedLeafSpace = 0.0, + usedInnerSpace = 0.0; + char res[1024]; + int bufferSize = -1; + int64 innerTuples = 0, + leafTuples = 0, + nAllTheSame = 0, + nLeafPlaceholder = 0, + nInnerPlaceholder = 0, + nLeafRedirect = 0, + nInnerRedirect = 0; + + relvar = makeRangeVarFromNameList(textToQualifiedNameList(name)); + index = relation_openrv(relvar, AccessExclusiveLock); + + if (!IsIndex(index) || !IsSpGist(index)) + elog(ERROR, "relation \"%s\" is not an SPGiST index", + RelationGetRelationName(index)); + + totalPages = RelationGetNumberOfBlocks(index); + + for (blkno = SPGIST_ROOT_BLKNO; blkno < totalPages; blkno++) + { + Buffer buffer; + Page page; + int pageFree; + + buffer = ReadBuffer(index, blkno); + LockBuffer(buffer, BUFFER_LOCK_SHARE); + + page = BufferGetPage(buffer); + + if (PageIsNew(page) || SpGistPageIsDeleted(page)) + { + deletedPages++; + UnlockReleaseBuffer(buffer); + continue; + } + + if (SpGistPageIsLeaf(page)) + { + leafPages++; + leafTuples += PageGetMaxOffsetNumber(page); + nLeafPlaceholder += SpGistPageGetOpaque(page)->nPlaceholder; + nLeafRedirect += SpGistPageGetOpaque(page)->nRedirection; + } + else + { + int i, + max; + + innerPages++; + max = PageGetMaxOffsetNumber(page); + innerTuples += max; + nInnerPlaceholder += SpGistPageGetOpaque(page)->nPlaceholder; + nInnerRedirect += SpGistPageGetOpaque(page)->nRedirection; + for (i = FirstOffsetNumber; i <= max; i++) + { + SpGistInnerTuple it; + + it = (SpGistInnerTuple) PageGetItem(page, + PageGetItemId(page, i)); + if (it->allTheSame) + nAllTheSame++; + } + } + + if (bufferSize < 0) + bufferSize = BufferGetPageSize(buffer) + - MAXALIGN(sizeof(SpGistPageOpaqueData)) + - SizeOfPageHeaderData; + + pageFree = PageGetExactFreeSpace(page); + + usedSpace += bufferSize - pageFree; + if (SpGistPageIsLeaf(page)) + usedLeafSpace += bufferSize - pageFree; + else + usedInnerSpace += bufferSize - pageFree; + + if (pageFree == bufferSize) + emptyPages++; + + UnlockReleaseBuffer(buffer); + } + + index_close(index, AccessExclusiveLock); + + totalPages--; /* discount metapage */ + + snprintf(res, sizeof(res), + "totalPages: %u\n" + "deletedPages: %u\n" + "innerPages: %u\n" + "leafPages: %u\n" + "emptyPages: %u\n" + "usedSpace: %.2f kbytes\n" + "usedInnerSpace: %.2f kbytes\n" + "usedLeafSpace: %.2f kbytes\n" + "freeSpace: %.2f kbytes\n" + "fillRatio: %.2f%%\n" + "leafTuples: " INT64_FORMAT "\n" + "innerTuples: " INT64_FORMAT "\n" + "innerAllTheSame: " INT64_FORMAT "\n" + "leafPlaceholders: " INT64_FORMAT "\n" + "innerPlaceholders: " INT64_FORMAT "\n" + "leafRedirects: " INT64_FORMAT "\n" + "innerRedirects: " INT64_FORMAT, + totalPages, deletedPages, innerPages, leafPages, emptyPages, + usedSpace / 1024.0, + usedInnerSpace / 1024.0, + usedLeafSpace / 1024.0, + (((double) bufferSize) * ((double) totalPages) - usedSpace) / 1024, + 100.0 * (usedSpace / (((double) bufferSize) * ((double) totalPages))), + leafTuples, innerTuples, nAllTheSame, + nLeafPlaceholder, nInnerPlaceholder, + nLeafRedirect, nInnerRedirect); + + PG_RETURN_TEXT_P(CStringGetTextDatum(res)); +} + +/* + * spgist_print + * Prints objects stored in GiST tree, works only if objects in index have + * textual representation (type_out functions should be implemented for given + * object type). + */ +Datum +spgist_print(PG_FUNCTION_ARGS) +{ + FuncCallContext *funcctx; + SPGistPrint *prst; + SPGistPrintStackElem *s; + HeapTuple htuple; + Datum result; + MemoryContext oldcontext; + + if (SRF_IS_FIRSTCALL()) + { + text *name = PG_GETARG_TEXT_P(0); + RangeVar *relvar; + Relation index; + ItemPointerData ipd; + TupleDesc tupdesc; + + funcctx = SRF_FIRSTCALL_INIT(); + relvar = makeRangeVarFromNameList(textToQualifiedNameList(name)); + index = relation_openrv(relvar, AccessExclusiveLock); + + if (!IsIndex(index) || !IsSpGist(index)) + elog(ERROR, "relation \"%s\" is not an SPGiST index", + RelationGetRelationName(index)); + + oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx); + + prst = palloc(sizeof(*prst)); + + prst->index = index; + initSpGistState(&prst->state, index); + + tupdesc = CreateTemplateTupleDesc(3 /* types */ + 1 /* level */ + + 1 /* nlabel */ + 2 /* tids */ + + 1, false); + TupleDescInitEntry(tupdesc, 1, "tid", TIDOID, -1, 0); + TupleDescInitEntry(tupdesc, 2, "allthesame", BOOLOID, -1, 0); + TupleDescInitEntry(tupdesc, 3, "node", INT4OID, -1, 0); + TupleDescInitEntry(tupdesc, 4, "level", INT4OID, -1, 0); + TupleDescInitEntry(tupdesc, 5, "tid_pointer", TIDOID, -1, 0); + TupleDescInitEntry(tupdesc, 6, "prefix", + (prst->state.attPrefixType.type == VOIDOID) ? INT4OID + : prst->state.attPrefixType.type, + -1, 0); + TupleDescInitEntry(tupdesc, 7, "label", + (prst->state.attLabelType.type == VOIDOID) ? INT4OID + : prst->state.attLabelType.type, + -1, 0); + TupleDescInitEntry(tupdesc, 8, "leaf", + (prst->state.attType.type == VOIDOID) ? INT4OID + : prst->state.attType.type, + -1, 0); + + funcctx->slot = TupleDescGetSlot(tupdesc); + funcctx->attinmeta = TupleDescGetAttInMetadata(tupdesc); + + funcctx->user_fctx = (void *) prst; + + MemoryContextSwitchTo(oldcontext); + + ItemPointerSet(&ipd, SPGIST_ROOT_BLKNO, FirstOffsetNumber); + prst->stack = NIL; + pushSPGistPrint(funcctx, prst, &ipd, 1); + + PG_FREE_IF_COPY(name, 0); + } + + funcctx = SRF_PERCALL_SETUP(); + prst = (SPGistPrint *) (funcctx->user_fctx); + +next: + for (;;) + { + if (prst->stack == NIL) + { + close_spgist_print(prst); + SRF_RETURN_DONE(funcctx); + } + + CHECK_FOR_INTERRUPTS(); + + s = (SPGistPrintStackElem *) linitial(prst->stack); + prst->stack = list_delete_first(prst->stack); + + if (ItemPointerIsValid(&s->iptr)) + break; + free(s); + } + + do + { + Buffer buffer; + Page page; + SpGistDeadTuple dtuple; + ItemPointer tid; + + buffer = ReadBuffer(prst->index, ItemPointerGetBlockNumber(&s->iptr)); + LockBuffer(buffer, BUFFER_LOCK_SHARE); + + page = BufferGetPage(buffer); + if (ItemPointerGetOffsetNumber(&s->iptr) > PageGetMaxOffsetNumber(page)) + { + UnlockReleaseBuffer(buffer); + pfree(s); + goto next; + } + + dtuple = (SpGistDeadTuple) PageGetItem(page, + PageGetItemId(page, + ItemPointerGetOffsetNumber(&s->iptr))); + + if (dtuple->tupstate != SPGIST_LIVE) + { + UnlockReleaseBuffer(buffer); + pfree(s); + goto next; + } + + if (SpGistPageIsLeaf(page)) + { + SpGistLeafTuple leafTuple = (SpGistLeafTuple) dtuple; + + tid = palloc(sizeof(ItemPointerData)); + *tid = s->iptr; + prst->dvalues[0] = PointerGetDatum(tid); + prst->nulls[0] = false; + prst->nulls[1] = true; + prst->nulls[2] = true; + prst->dvalues[3] = s->level; + prst->nulls[3] = false; + prst->nulls[4] = true; + prst->nulls[5] = true; + prst->nulls[6] = true; + prst->dvalues[7] = datumCopy(SGLTDATUM(leafTuple, &prst->state), + prst->state.attType.attbyval, + prst->state.attType.attlen); + prst->nulls[7] = false; + } + else + { + SpGistInnerTuple innerTuple = (SpGistInnerTuple) dtuple; + int i; + SpGistNodeTuple node; + + SGITITERATE(innerTuple, i, node) + { + if (ItemPointerIsValid(&node->t_tid)) + { + if (i >= s->nlabel) + break; + } + } + + if (i >= innerTuple->nNodes) + { + UnlockReleaseBuffer(buffer); + pfree(s); + goto next; + + } + + tid = palloc(sizeof(ItemPointerData)); + *tid = s->iptr; + prst->dvalues[0] = PointerGetDatum(tid); + prst->nulls[0] = false; + prst->dvalues[1] = innerTuple->allTheSame; + prst->nulls[1] = false; + prst->dvalues[2] = Int32GetDatum(s->nlabel); + prst->nulls[2] = false; + prst->dvalues[3] = s->level; + prst->nulls[3] = false; + tid = palloc(sizeof(ItemPointerData)); + *tid = node->t_tid; + prst->dvalues[4] = PointerGetDatum(tid); + prst->nulls[4] = false; + if (innerTuple->prefixSize > 0) + { + prst->dvalues[5] = datumCopy(SGITDATUM(innerTuple, &prst->state), + prst->state.attPrefixType.attbyval, + prst->state.attPrefixType.attlen); + prst->nulls[5] = false; + } + else + prst->nulls[5] = true; + if (!IndexTupleHasNulls(node)) + { + prst->dvalues[6] = datumCopy(SGNTDATUM(node, &prst->state), + prst->state.attLabelType.attbyval, + prst->state.attLabelType.attlen); + prst->nulls[6] = false; + } + else + prst->nulls[6] = true; + prst->nulls[7] = true; + + pushSPGistPrint(funcctx, prst, &node->t_tid, s->level + 1); + s->nlabel = i + 1; + oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx); + prst->stack = lcons(s, prst->stack); + MemoryContextSwitchTo(oldcontext); + s = NULL; + } + + UnlockReleaseBuffer(buffer); + if (s) + pfree(s); + } while (0); + + htuple = heap_form_tuple(funcctx->attinmeta->tupdesc, + prst->dvalues, + prst->nulls); + result = TupleGetDatum(funcctx->slot, htuple); + + SRF_RETURN_NEXT(funcctx, result); +} diff --git a/contrib/pageinspect/sql/gin.sql b/contrib/pageinspect/sql/gin.sql index d516ed3..45a136f 100644 --- a/contrib/pageinspect/sql/gin.sql +++ b/contrib/pageinspect/sql/gin.sql @@ -17,3 +17,15 @@ SELECT COUNT(*) > 0 FROM gin_leafpage_items(get_raw_page('test1_y_idx', (pg_relation_size('test1_y_idx') / current_setting('block_size')::bigint)::int - 1)); + +\x + +CREATE TABLE test__int(a int[]); +\copy test__int from 'data/test__int.data' + +CREATE INDEX gin_idx ON test__int USING gin ( a ); + +INSERT INTO test__int ( SELECT ARRAY[t] || '{1000}'::_int4 FROM generate_series (1,300) as t ); +INSERT INTO test__int ( SELECT ARRAY[t] || '{1001}'::_int4 FROM generate_series (1,300) as t, generate_series(1,12) ); +VACUUM ANALYZE test__int; +SELECT * FROM gin_value_count('gin_idx') as t(value int, nrow int); diff --git a/contrib/pageinspect/sql/gist.sql b/contrib/pageinspect/sql/gist.sql new file mode 100644 index 0000000..04e7daf --- /dev/null +++ b/contrib/pageinspect/sql/gist.sql @@ -0,0 +1,6 @@ +CREATE TABLE gist_table (t box); +\copy gist_table from 'data/rect.data' + +CREATE INDEX gist_idx ON gist_table USING gist (t); + +SELECT gist_stats('gist_idx'); diff --git a/contrib/pageinspect/sql/spgist.sql b/contrib/pageinspect/sql/spgist.sql new file mode 100644 index 0000000..2bb6ac5 --- /dev/null +++ b/contrib/pageinspect/sql/spgist.sql @@ -0,0 +1,11 @@ +CREATE TABLE spgist_table (t box); +\copy spgist_table from 'data/rect.data' + +SELECT center(t) AS p INTO spgist_table_p FROM spgist_table; + +CREATE INDEX spgist_idx ON spgist_table_p USING spgist (p); +CREATE INDEX kdspgist_idx ON spgist_table_p USING spgist (p kd_point_ops); + +SELECT spgist_stats('spgist_idx'); +SELECT * FROM spgist_print('kdspgist_idx') as t(tid tid, allthesame bool, node_n int, level int, tid_pointer tid, prefix float8, node_label int, leaf_value point); +SELECT * FROM spgist_print('spgist_idx') as t(tid tid, allthesame bool, node_n int, level int, tid_pointer tid, prefix point, node_label int, leaf_value point) WHERE level = 1; diff --git a/doc/src/sgml/pageinspect.sgml b/doc/src/sgml/pageinspect.sgml index ccdaf3e..b5d7d85 100644 --- a/doc/src/sgml/pageinspect.sgml +++ b/doc/src/sgml/pageinspect.sgml @@ -484,6 +484,119 @@ test=# SELECT * FROM brin_page_items(get_raw_page('brinidx', 5), + gin_value_count(gin_index text) returns setof record + + gin_value_count + + + + + + gin_value_count prints estimated counts for each + indexed values, single-argument function will return result for a first + column of index. For example: + +test=# SELECT * FROM gin_value_count('gin_idx') as t(value int, nrow int) where nrow > 250; + value | nrow + -------+------ + 31 | 254 + 47 | 251 + 52 | 257 + 59 | 259 + + + + + + + + gin_value_count(gin_index text, colnumber int) returns setof record + + gin_value_count + + + + + + gin_value_count prints estimated counts for each + indexed value for a given column. For example: + +test=# SELECT * FROM gin_value_count('gin_idx', 0) as t(value int, nrow int) where nrow > 250; + value | nrow + -------+------ + 31 | 254 + 47 | 251 + 52 | 257 + 59 | 259 + + + + + + + + gin_count_estimate(gin_index text, query tsquery) returns bigint + + gin_count_estimate + + + + + + gin_count_estimate outputs number of indexed + rows matched query. It doesn't touch heap at all. For example: + +test=# select gin_count_estimate('qq', 'star'); + gin_count_estimate +-------------------- + 790 + + + + + + + + + gin_stats(gin_index text) returns text + + gin_stats + + + + + + gin_stats Prints various statistics about index + internals. For example: + +test=# SELECT gin_stats('gin_idx'); + gin_stats +------------------------------ + totalPages: 32 + + dataPages: 1 + + dataInnerPages: 0 + + dataLeafPages: 1 + + dataInnerFreeSpace: 0 + + dataLeafFreeSpace: 4454 + + dataInnerTuplesCount: 0 + + dataLeafIptrsCount: 3600 + + entryPages: 31 + + entryInnerPages: 21 + + entryLeafPages: 10 + + entryInnerFreeSpace: 15160+ + entryLeafFreeSpace: 32788+ + entryInnerTuplesCount: 7810 + + entryLeafTuplesCount: 305 + + entryPostingSize: 42122+ + entryPostingCount: 96759+ + entryAttrSize: 64924+ + + + + + + + gin_metapage_info(page bytea) returns record gin_metapage_info @@ -712,4 +825,281 @@ mapp | {65,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + + GiST Functions + + + + + gist_stats(indexname text) returns text + + gist_stats + + + + + + gist_stats returns information about + a GiST index. For example: + +test=# SELECT gist_stats('gist_index'); + gist_stats +----------------------------------------- + Number of levels: 2 + + Number of pages: 29 + + Number of leaf pages: 28 + + Number of tuples: 3406 + + Number of invalid tuples: 0 + + Number of leaf tuples: 3378 + + Total size of tuples: 143516 bytes+ + Total size of leaf tuples: 142296 bytes+ + Total size of index: 237568 bytes+ + + + + + + + + gist_tree(indexname text, maxlevel int4) returns text + + gist_tree + + + + + gist_tree shows GiST tree up to + maxlevel. For example: + +test=# SELECT gist_tree('gist_index', 0); + 0(l:0) blk: 0 numTuple: 29 free: 6888b(15.63%) + + Designation (from left to right): + + + 0 - page number + + + (l:0) - tree level + + + blk: 0 - block number + + + numTuple: 29 - the number of tuples + + + free: 6888b - free space in bytes + + + (15.63%) - occupied space in percents + + + + + + + + + gist_tree(indexname text) returns text + + gist_tree + + + + + gist_tree shows full GiST tree. + For example: + +test=# SELECT gist_tree('gist_index'); + 0(l:0) blk: 0 numTuple: 29 free: 6888b(15.63%) + 1(l:1) blk: 13 numTuple: 180 free: 244b(97.01%) + 2(l:1) blk: 11 numTuple: 175 free: 464b(94.32%) + 3(l:1) blk: 2 numTuple: 101 free: 3720b(54.43%) + 4(l:1) blk: 17 numTuple: 111 free: 3280b(59.82%) + 5(l:1) blk: 18 numTuple: 101 free: 3720b(54.43%) + 6(l:1) blk: 10 numTuple: 98 free: 3852b(52.82%) + 7(l:1) blk: 19 numTuple: 111 free: 3280b(59.82%) + 8(l:1) blk: 9 numTuple: 97 free: 3896b(52.28%) + 9(l:1) blk: 20 numTuple: 104 free: 3588b(56.05%) + 10(l:1) blk: 14 numTuple: 96 free: 3940b(51.74%) + 11(l:1) blk: 21 numTuple: 106 free: 3500b(57.13%) + 12(l:1) blk: 7 numTuple: 103 free: 3632b(55.51%) + 13(l:1) blk: 1 numTuple: 101 free: 3720b(54.43%) + 14(l:1) blk: 16 numTuple: 97 free: 3896b(52.28%) + 15(l:1) blk: 24 numTuple: 103 free: 3632b(55.51%) + 16(l:1) blk: 4 numTuple: 98 free: 3852b(52.82%) + 17(l:1) blk: 25 numTuple: 98 free: 3852b(52.82%) + 18(l:1) blk: 3 numTuple: 97 free: 3896b(52.28%) + 19(l:1) blk: 26 numTuple: 96 free: 3940b(51.74%) + 20(l:1) blk: 6 numTuple: 103 free: 3632b(55.51%) + 21(l:1) blk: 8 numTuple: 162 free: 1036b(87.31%) + 22(l:1) blk: 23 numTuple: 94 free: 4028b(50.66%) + 23(l:1) blk: 12 numTuple: 82 free: 4556b(44.19%) + 24(l:1) blk: 27 numTuple: 105 free: 3544b(56.59%) + 25(l:1) blk: 5 numTuple: 90 free: 4204b(48.51%) + 26(l:1) blk: 28 numTuple: 100 free: 3764b(53.90%) + 27(l:1) blk: 22 numTuple: 101 free: 3720b(54.43%) + 28(l:1) blk: 15 numTuple: 95 free: 3984b(51.20%) + 29(l:1) blk: 29 numTuple: 95 free: 3984b(51.20%) + + + + + + + + gist_print(indexname text) returns setof record + + gist_print + + + + + gist_print prints objects stored in + GiST tree, works only if objects in index have + textual representation (type_out functions should be + implemented for the given object type). It's known to work with R-tree + GiST based index. Note, in example below, objects are + of type box. For example: + +test=# SELECT * FROM gist_print('gist_index') AS t(level int, valid bool, a box) WHERE level = 1; + level | valid | a +-------+-------+----------------------------- + 1 | t | (37357,50073),(34242,357) + 1 | t | (43499,49770),(40358,43) + 1 | t | (31193,24679),(25047,12410) + 1 | t | (31018,12142),(25083,6) + 1 | t | (49944,25174),(43471,12802) + 1 | t | (12577,49757),(6302,37534) + 1 | t | (12528,37333),(6171,24861) + 1 | t | (50027,49751),(46817,25462) + 1 | t | (46870,49912),(43664,25722) + 1 | t | (24855,25574),(12447,19263) + 1 | t | (25054,19126),(12403,12796) + 1 | t | (32737,49923),(31178,1038) + 1 | t | (3184,24465),(15,81) + 1 | t | (24951,49983),(12740,44000) + 1 | t | (24919,43956),(12617,37901) + 1 | t | (40387,49852),(37338,25217) + 1 | t | (40325,24963),(37375,491) + 1 | t | (24919,12698),(12654,6518) + 1 | t | (25002,6338),(12350,51) + 1 | t | (49985,12554),(43447,222) + 1 | t | (25003,37769),(12552,25573) + 1 | t | (34270,49382),(32763,594) + 1 | t | (6205,50012),(3,37527) + 1 | t | (6163,37358),(120,25034) + 1 | t | (12343,24542),(9295,294) + 1 | t | (9308,24151),(6234,620) + 1 | t | (6230,24629),(3169,108) + 1 | t | (31179,50040),(28113,25556) + 1 | t | (28048,49694),(25000,25000) + + + + + + + + + SP-GiST Functions + + + + + spgist_stats(indexname text) returns text + + spgist_stats + + + + + + spgist_stats returns information about + a SP-GiST index. For example: + +test=# SELECT spgist_stats('spgist_idx'); + spgist_stats +---------------------------------- + totalPages: 21 + + deletedPages: 0 + + innerPages: 3 + + leafPages: 18 + + emptyPages: 1 + + usedSpace: 121.27 kbytes+ + freeSpace: 46.07 kbytes + + fillRatio: 72.47% + + leafTuples: 3669 + + innerTuples: 20 + + innerAllTheSame: 0 + + leafPlaceholders: 569 + + innerPlaceholders: 0 + + leafRedirects: 0 + + innerRedirects: 0 + + + + + + + + + spgist_print(indexname text) returns setof record + + spgist_print + + + + + + spgist_print prints objects stored in + SP-GiST tree, works only if objects in index have + textual representation (type_out functions should + be implemented for the given object type). + + + + Note 1. in example below we used quad_point_ops which uses point + for leaf and prefix value, but doesn't use node_label at all. + Use type 'int' as dummy type for prefix or/and node_label. + + + + + Note 2. + + quad_point_ops: prefix point, node_label int, leaf_value point + kd_point_ops: prefix float, node_label int, leaf_value point + text_ops: prefix text, node_label char, leaf_value text + + + + + For example: + +test=# SELECT * FROM spgist_print('spgist_idx') as t + ( + tid tid, + allthesame bool, + node_n int, + level int, + tid_pointer tid, + prefix point, + node_label int, + leaf_value point + ) where level = 1; + tid | allthesame | node_n | level | tid_pointer | prefix | node_label | leaf_value +-------+------------+--------+-------+-------------+-------------------------------------+------------+------------ + (1,1) | f | 0 | 1 | (5,4) | (24530.2070484581,23595.7092511013) | | + (1,1) | f | 1 | 1 | (5,3) | (24530.2070484581,23595.7092511013) | | + (1,1) | f | 2 | 1 | (5,2) | (24530.2070484581,23595.7092511013) | | + (1,1) | f | 3 | 1 | (5,1) | (24530.2070484581,23595.7092511013) | | + + + + + + + + -- 2.7.4