#include <stdio.h>
#include <time.h>

#define RJ 0                 // 0 no debugging, 1 print solutions, 2 print puzzles, 3 print steps, 4 print pencil marks

int q,                       // Number of unsolved Cell positions Grid wise
    r[81],                   // Used for sorting and excluding each unsolved Cell positions Grid wise
    s[81],                   // Sudoku Grid 81 Cell positions for clues and solved
    g[81],                   // Bitwise Cell Clues for each unsolved Cell positions Grid wise
    n[8];                    // Number of Naked singles, Hidden singles, Guesses and Depth Grid wise, total without guess, maximum guess and depth

static const int b[512] = {  // Bitwise to digit Cell Clues
          0,        1,        2,       12,        3,       13,       23,      123,
          4,       14,       24,      124,       34,      134,      234,     1234,
          5,       15,       25,      125,       35,      135,      235,     1235,
         45,      145,      245,     1245,      345,     1345,     2345,    12345,
          6,       16,       26,      126,       36,      136,      236,     1236,
         46,      146,      246,     1246,      346,     1346,     2346,    12346,
         56,      156,      256,     1256,      356,     1356,     2356,    12356,
        456,     1456,     2456,    12456,     3456,    13456,    23456,   123456,
          7,       17,       27,      127,       37,      137,      237,     1237,
         47,      147,      247,     1247,      347,     1347,     2347,    12347,
         57,      157,      257,     1257,      357,     1357,     2357,    12357,
        457,     1457,     2457,    12457,     3457,    13457,    23457,   123457,
         67,      167,      267,     1267,      367,     1367,     2367,    12367,
        467,     1467,     2467,    12467,     3467,    13467,    23467,   123467,
        567,     1567,     2567,    12567,     3567,    13567,    23567,   123567,
       4567,    14567,    24567,   124567,    34567,   134567,   234567,  1234567,
          8,       18,       28,      128,       38,      138,      238,     1238,
         48,      148,      248,     1248,      348,     1348,     2348,    12348,
         58,      158,      258,     1258,      358,     1358,     2358,    12358,
        458,     1458,     2458,    12458,     3458,    13458,    23458,   123458,
         68,      168,      268,     1268,      368,     1368,     2368,    12368,
        468,     1468,     2468,    12468,     3468,    13468,    23468,   123468,
        568,     1568,     2568,    12568,     3568,    13568,    23568,   123568,
       4568,    14568,    24568,   124568,    34568,   134568,   234568,  1234568,
         78,      178,      278,     1278,      378,     1378,     2378,    12378,
        478,     1478,     2478,    12478,     3478,    13478,    23478,   123478,
        578,     1578,     2578,    12578,     3578,    13578,    23578,   123578,
       4578,    14578,    24578,   124578,    34578,   134578,   234578,  1234578,
        678,     1678,     2678,    12678,     3678,    13678,    23678,   123678,
       4678,    14678,    24678,   124678,    34678,   134678,   234678,  1234678,
       5678,    15678,    25678,   125678,    35678,   135678,   235678,  1235678,
      45678,   145678,   245678,  1245678,   345678,  1345678,  2345678, 12345678,
          9,       19,       29,      129,       39,      139,      239,     1239,
         49,      149,      249,     1249,      349,     1349,     2349,    12349,
         59,      159,      259,     1259,      359,     1359,     2359,    12359,
        459,     1459,     2459,    12459,     3459,    13459,    23459,   123459,
         69,      169,      269,     1269,      369,     1369,     2369,    12369,
        469,     1469,     2469,    12469,     3469,    13469,    23469,   123469,
        569,     1569,     2569,    12569,     3569,    13569,    23569,   123569,
       4569,    14569,    24569,   124569,    34569,   134569,   234569,  1234569,
         79,      179,      279,     1279,      379,     1379,     2379,    12379,
        479,     1479,     2479,    12479,     3479,    13479,    23479,   123479,
        579,     1579,     2579,    12579,     3579,    13579,    23579,   123579,
       4579,    14579,    24579,   124579,    34579,   134579,   234579,  1234579,
        679,     1679,     2679,    12679,     3679,    13679,    23679,   123679,
       4679,    14679,    24679,   124679,    34679,   134679,   234679,  1234679,
       5679,    15679,    25679,   125679,    35679,   135679,   235679,  1235679,
      45679,   145679,   245679,  1245679,   345679,  1345679,  2345679, 12345679,
         89,      189,      289,     1289,      389,     1389,     2389,    12389,
        489,     1489,     2489,    12489,     3489,    13489,    23489,   123489,
        589,     1589,     2589,    12589,     3589,    13589,    23589,   123589,
       4589,    14589,    24589,   124589,    34589,   134589,   234589,  1234589,
        689,     1689,     2689,    12689,     3689,    13689,    23689,   123689,
       4689,    14689,    24689,   124689,    34689,   134689,   234689,  1234689,
       5689,    15689,    25689,   125689,    35689,   135689,   235689,  1235689,
      45689,   145689,   245689,  1245689,   345689,  1345689,  2345689, 12345689,
        789,     1789,     2789,    12789,     3789,    13789,    23789,   123789,
       4789,    14789,    24789,   124789,    34789,   134789,   234789,  1234789,
       5789,    15789,    25789,   125789,    35789,   135789,   235789,  1235789,
      45789,   145789,   245789,  1245789,   345789,  1345789,  2345789, 12345789,
       6789,    16789,    26789,   126789,    36789,   136789,   236789,  1236789,
      46789,   146789,   246789,  1246789,   346789,  1346789,  2346789, 12346789,
      56789,   156789,   256789,  1256789,   356789,  1356789,  2356789, 12356789,
     456789,  1456789,  2456789, 12456789,  3456789, 13456789, 23456789,123456789},
           B[513] = {        // Count bitwise Cell Clues
   0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4,
   1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
   1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
   2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
   1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
   2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
   2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
   3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
   1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
   2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
   2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
   3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
   2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
   3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
   3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
   4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8,
   1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
   2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
   2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
   3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
   2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
   3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
   3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
   4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8,
   2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
   3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
   3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
   4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8,
   3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
   4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8,
   4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8,
   5, 6, 6, 7, 6, 7, 7, 8, 6, 7, 7, 8, 7, 8, 8, 9,10},
           w[81][21] = {     // 20 peer Cell positions; and Band, Stack, Row, Box and Column for 81 Cell positions
  { 3, 4, 5, 6, 7, 8, 1, 2,10,11,19,20, 9,18,27,36,45,54,63,72,    262657},
  { 3, 4, 5, 6, 7, 8, 0, 2, 9,11,18,20,10,19,28,37,46,55,64,73,    262658},
  { 3, 4, 5, 6, 7, 8, 0, 1, 9,10,18,19,11,20,29,38,47,56,65,74,    262660},
  { 0, 1, 2, 6, 7, 8, 4, 5,13,14,22,23,12,21,30,39,48,57,66,75, 134480904},
  { 0, 1, 2, 6, 7, 8, 3, 5,12,14,21,23,13,22,31,40,49,58,67,76, 134480912},
  { 0, 1, 2, 6, 7, 8, 3, 4,12,13,21,22,14,23,32,41,50,59,68,77, 134480928},
  { 0, 1, 2, 3, 4, 5, 7, 8,16,17,25,26,15,24,33,42,51,60,69,78, 268699712},
  { 0, 1, 2, 3, 4, 5, 6, 8,15,17,24,26,16,25,34,43,52,61,70,79, 268699776},
  { 0, 1, 2, 3, 4, 5, 6, 7,15,16,24,25,17,26,35,44,53,62,71,80, 268699904},
  {12,13,14,15,16,17,10,11, 1, 2,19,20, 0,18,27,36,45,54,63,72,    524801},
  {12,13,14,15,16,17, 9,11, 0, 2,18,20, 1,19,28,37,46,55,64,73,    524802},
  {12,13,14,15,16,17, 9,10, 0, 1,18,19, 2,20,29,38,47,56,65,74,    524804},
  { 9,10,11,15,16,17,13,14, 4, 5,22,23, 3,21,30,39,48,57,66,75, 134743048},
  { 9,10,11,15,16,17,12,14, 3, 5,21,23, 4,22,31,40,49,58,67,76, 134743056},
  { 9,10,11,15,16,17,12,13, 3, 4,21,22, 5,23,32,41,50,59,68,77, 134743072},
  { 9,10,11,12,13,14,16,17, 7, 8,25,26, 6,24,33,42,51,60,69,78, 268961856},
  { 9,10,11,12,13,14,15,17, 6, 8,24,26, 7,25,34,43,52,61,70,79, 268961920},
  { 9,10,11,12,13,14,15,16, 6, 7,24,25, 8,26,35,44,53,62,71,80, 268962048},
  {21,22,23,24,25,26,19,20, 1, 2,10,11, 0, 9,27,36,45,54,63,72,   1049089},
  {21,22,23,24,25,26,18,20, 0, 2, 9,11, 1,10,28,37,46,55,64,73,   1049090},
  {21,22,23,24,25,26,18,19, 0, 1, 9,10, 2,11,29,38,47,56,65,74,   1049092},
  {18,19,20,24,25,26,22,23, 4, 5,13,14, 3,12,30,39,48,57,66,75, 135267336},
  {18,19,20,24,25,26,21,23, 3, 5,12,14, 4,13,31,40,49,58,67,76, 135267344},
  {18,19,20,24,25,26,21,22, 3, 4,12,13, 5,14,32,41,50,59,68,77, 135267360},
  {18,19,20,21,22,23,25,26, 7, 8,16,17, 6,15,33,42,51,60,69,78, 269486144},
  {18,19,20,21,22,23,24,26, 6, 8,15,17, 7,16,34,43,52,61,70,79, 269486208},
  {18,19,20,21,22,23,24,25, 6, 7,15,16, 8,17,35,44,53,62,71,80, 269486336},
  {30,31,32,33,34,35,28,29,37,38,46,47,36,45, 0, 9,18,54,63,72, 538972161},
  {30,31,32,33,34,35,27,29,36,38,45,47,37,46, 1,10,19,55,64,73, 538972162},
  {30,31,32,33,34,35,27,28,36,37,45,46,38,47, 2,11,20,56,65,74, 538972164},
  {27,28,29,33,34,35,31,32,40,41,49,50,39,48, 3,12,21,57,66,75, 673193992},
  {27,28,29,33,34,35,30,32,39,41,48,50,40,49, 4,13,22,58,67,76, 673194000},
  {27,28,29,33,34,35,30,31,39,40,48,49,41,50, 5,14,23,59,68,77, 673194016},
  {27,28,29,30,31,32,34,35,43,44,52,53,42,51, 6,15,24,60,69,78, 807419968},
  {27,28,29,30,31,32,33,35,42,44,51,53,43,52, 7,16,25,61,70,79, 807420032},
  {27,28,29,30,31,32,33,34,42,43,51,52,44,53, 8,17,26,62,71,80, 807420160},
  {39,40,41,42,43,44,37,38,28,29,46,47,27,45, 0, 9,18,54,63,72, 541069313},
  {39,40,41,42,43,44,36,38,27,29,45,47,28,46, 1,10,19,55,64,73, 541069314},
  {39,40,41,42,43,44,36,37,27,28,45,46,29,47, 2,11,20,56,65,74, 541069316},
  {36,37,38,42,43,44,40,41,31,32,49,50,30,48, 3,12,21,57,66,75, 675291144},
  {36,37,38,42,43,44,39,41,30,32,48,50,31,49, 4,13,22,58,67,76, 675291152},
  {36,37,38,42,43,44,39,40,30,31,48,49,32,50, 5,14,23,59,68,77, 675291168},
  {36,37,38,39,40,41,43,44,34,35,52,53,33,51, 6,15,24,60,69,78, 809517120},
  {36,37,38,39,40,41,42,44,33,35,51,53,34,52, 7,16,25,61,70,79, 809517184},
  {36,37,38,39,40,41,42,43,33,34,51,52,35,53, 8,17,26,62,71,80, 809517312},
  {48,49,50,51,52,53,46,47,28,29,37,38,27,36, 0, 9,18,54,63,72, 545263617},
  {48,49,50,51,52,53,45,47,27,29,36,38,28,37, 1,10,19,55,64,73, 545263618},
  {48,49,50,51,52,53,45,46,27,28,36,37,29,38, 2,11,20,56,65,74, 545263620},
  {45,46,47,51,52,53,49,50,31,32,40,41,30,39, 3,12,21,57,66,75, 679485448},
  {45,46,47,51,52,53,48,50,30,32,39,41,31,40, 4,13,22,58,67,76, 679485456},
  {45,46,47,51,52,53,48,49,30,31,39,40,32,41, 5,14,23,59,68,77, 679485472},
  {45,46,47,48,49,50,52,53,34,35,43,44,33,42, 6,15,24,60,69,78, 813711424},
  {45,46,47,48,49,50,51,53,33,35,42,44,34,43, 7,16,25,61,70,79, 813711488},
  {45,46,47,48,49,50,51,52,33,34,42,43,35,44, 8,17,26,62,71,80, 813711616},
  {57,58,59,60,61,62,55,56,64,65,73,74,63,72, 0, 9,18,27,36,45,1090551809},
  {57,58,59,60,61,62,54,56,63,65,72,74,64,73, 1,10,19,28,37,46,1090551810},
  {57,58,59,60,61,62,54,55,63,64,72,73,65,74, 2,11,20,29,38,47,1090551812},
  {54,55,56,60,61,62,58,59,67,68,76,77,66,75, 3,12,21,30,39,48,1224802312},
  {54,55,56,60,61,62,57,59,66,68,75,77,67,76, 4,13,22,31,40,49,1224802320},
  {54,55,56,60,61,62,57,58,66,67,75,76,68,77, 5,14,23,32,41,50,1224802336},
  {54,55,56,57,58,59,61,62,70,71,79,80,69,78, 6,15,24,33,42,51,1359085632},
  {54,55,56,57,58,59,60,62,69,71,78,80,70,79, 7,16,25,34,43,52,1359085696},
  {54,55,56,57,58,59,60,61,69,70,78,79,71,80, 8,17,26,35,44,53,1359085824},
  {66,67,68,69,70,71,64,65,55,56,73,74,54,72, 0, 9,18,27,36,45,1107329025},
  {66,67,68,69,70,71,63,65,54,56,72,74,55,73, 1,10,19,28,37,46,1107329026},
  {66,67,68,69,70,71,63,64,54,55,72,73,56,74, 2,11,20,29,38,47,1107329028},
  {63,64,65,69,70,71,67,68,58,59,76,77,57,75, 3,12,21,30,39,48,1241579528},
  {63,64,65,69,70,71,66,68,57,59,75,77,58,76, 4,13,22,31,40,49,1241579536},
  {63,64,65,69,70,71,66,67,57,58,75,76,59,77, 5,14,23,32,41,50,1241579552},
  {63,64,65,66,67,68,70,71,61,62,79,80,60,78, 6,15,24,33,42,51,1375862848},
  {63,64,65,66,67,68,69,71,60,62,78,80,61,79, 7,16,25,34,43,52,1375862912},
  {63,64,65,66,67,68,69,70,60,61,78,79,62,80, 8,17,26,35,44,53,1375863040},
  {75,76,77,78,79,80,73,74,55,56,64,65,54,63, 0, 9,18,27,36,45,1140883457},
  {75,76,77,78,79,80,72,74,54,56,63,65,55,64, 1,10,19,28,37,46,1140883458},
  {75,76,77,78,79,80,72,73,54,55,63,64,56,65, 2,11,20,29,38,47,1140883460},
  {72,73,74,78,79,80,76,77,58,59,67,68,57,66, 3,12,21,30,39,48,1275133960},
  {72,73,74,78,79,80,75,77,57,59,66,68,58,67, 4,13,22,31,40,49,1275133968},
  {72,73,74,78,79,80,75,76,57,58,66,67,59,68, 5,14,23,32,41,50,1275133984},
  {72,73,74,75,76,77,79,80,61,62,70,71,60,69, 6,15,24,33,42,51,1409417280},
  {72,73,74,75,76,77,78,80,60,62,69,71,61,70, 7,16,25,34,43,52,1409417344},
  {72,73,74,75,76,77,78,79,60,61,69,70,62,71, 8,17,26,35,44,53,1409417472}},
           l[27][9] = {      // 9 Cell positions for 27 Units
  { 0, 1, 2, 3, 4, 5, 6, 7, 8}, { 9,10,11,12,13,14,15,16,17}, {18,19,20,21,22,23,24,25,26},
  {27,28,29,30,31,32,33,34,35}, {36,37,38,39,40,41,42,43,44}, {45,46,47,48,49,50,51,52,53},
  {54,55,56,57,58,59,60,61,62}, {63,64,65,66,67,68,69,70,71}, {72,73,74,75,76,77,78,79,80},
  { 0, 9,18,27,36,45,54,63,72}, { 1,10,19,28,37,46,55,64,73}, { 2,11,20,29,38,47,56,65,74},
  { 3,12,21,30,39,48,57,66,75}, { 4,13,22,31,40,49,58,67,76}, { 5,14,23,32,41,50,59,68,77},
  { 6,15,24,33,42,51,60,69,78}, { 7,16,25,34,43,52,61,70,79}, { 8,17,26,35,44,53,62,71,80},
  { 0, 1, 2, 9,10,11,18,19,20}, { 3, 4, 5,12,13,14,21,22,23}, { 6, 7, 8,15,16,17,24,25,26},
  {27,28,29,36,37,38,45,46,47}, {30,31,32,39,40,41,48,49,50}, {33,34,35,42,43,44,51,52,53},
  {54,55,56,63,64,65,72,73,74}, {57,58,59,66,67,68,75,76,77}, {60,61,62,69,70,71,78,79,80}},
           h[246][9] = {     // 36 pairs/84 triplets/126 quads and other Cell positions for each Unit
  { 0, 1, 2, 3, 4, 5, 6, 7, 8}, { 0, 2, 1, 3, 4, 5, 6, 7, 8}, { 0, 3, 1, 2, 4, 5, 6, 7, 8},
  { 0, 4, 1, 2, 3, 5, 6, 7, 8}, { 0, 5, 1, 2, 3, 4, 6, 7, 8}, { 0, 6, 1, 2, 3, 4, 5, 7, 8},
  { 0, 7, 1, 2, 3, 4, 5, 6, 8}, { 0, 8, 1, 2, 3, 4, 5, 6, 7}, { 1, 2, 0, 3, 4, 5, 6, 7, 8},
  { 1, 3, 0, 2, 4, 5, 6, 7, 8}, { 1, 4, 0, 2, 3, 5, 6, 7, 8}, { 1, 5, 0, 2, 3, 4, 6, 7, 8},
  { 1, 6, 0, 2, 3, 4, 5, 7, 8}, { 1, 7, 0, 2, 3, 4, 5, 6, 8}, { 1, 8, 0, 2, 3, 4, 5, 6, 7},
  { 2, 3, 0, 1, 4, 5, 6, 7, 8}, { 2, 4, 0, 1, 3, 5, 6, 7, 8}, { 2, 5, 0, 1, 3, 4, 6, 7, 8},
  { 2, 6, 0, 1, 3, 4, 5, 7, 8}, { 2, 7, 0, 1, 3, 4, 5, 6, 8}, { 2, 8, 0, 1, 3, 4, 5, 6, 7},
  { 3, 4, 0, 1, 2, 5, 6, 7, 8}, { 3, 5, 0, 1, 2, 4, 6, 7, 8}, { 3, 6, 0, 1, 2, 4, 5, 7, 8},
  { 3, 7, 0, 1, 2, 4, 5, 6, 8}, { 3, 8, 0, 1, 2, 4, 5, 6, 7}, { 4, 5, 0, 1, 2, 3, 6, 7, 8},
  { 4, 6, 0, 1, 2, 3, 5, 7, 8}, { 4, 7, 0, 1, 2, 3, 5, 6, 8}, { 4, 8, 0, 1, 2, 3, 5, 6, 7},
  { 5, 6, 0, 1, 2, 3, 4, 7, 8}, { 5, 7, 0, 1, 2, 3, 4, 6, 8}, { 5, 8, 0, 1, 2, 3, 4, 6, 7},
  { 6, 7, 0, 1, 2, 3, 4, 5, 8}, { 6, 8, 0, 1, 2, 3, 4, 5, 7}, { 7, 8, 0, 1, 2, 3, 4, 5, 6},
  { 0, 1, 2, 3, 4, 5, 6, 7, 8}, { 0, 1, 3, 2, 4, 5, 6, 7, 8}, { 0, 1, 4, 2, 3, 5, 6, 7, 8},
  { 0, 1, 5, 2, 3, 4, 6, 7, 8}, { 0, 1, 6, 2, 3, 4, 5, 7, 8}, { 0, 1, 7, 2, 3, 4, 5, 6, 8},
  { 0, 1, 8, 2, 3, 4, 5, 6, 7}, { 0, 2, 3, 1, 4, 5, 6, 7, 8}, { 0, 2, 4, 1, 3, 5, 6, 7, 8},
  { 0, 2, 5, 1, 3, 4, 6, 7, 8}, { 0, 2, 6, 1, 3, 4, 5, 7, 8}, { 0, 2, 7, 1, 3, 4, 5, 6, 8},
  { 0, 2, 8, 1, 3, 4, 5, 6, 7}, { 0, 3, 4, 1, 2, 5, 6, 7, 8}, { 0, 3, 5, 1, 2, 4, 6, 7, 8},
  { 0, 3, 6, 1, 2, 4, 5, 7, 8}, { 0, 3, 7, 1, 2, 4, 5, 6, 8}, { 0, 3, 8, 1, 2, 4, 5, 6, 7},
  { 0, 4, 5, 1, 2, 3, 6, 7, 8}, { 0, 4, 6, 1, 2, 3, 5, 7, 8}, { 0, 4, 7, 1, 2, 3, 5, 6, 8},
  { 0, 4, 8, 1, 2, 3, 5, 6, 7}, { 0, 5, 6, 1, 2, 3, 4, 7, 8}, { 0, 5, 7, 1, 2, 3, 4, 6, 8},
  { 0, 5, 8, 1, 2, 3, 4, 6, 7}, { 0, 6, 7, 1, 2, 3, 4, 5, 8}, { 0, 6, 8, 1, 2, 3, 4, 5, 7},
  { 0, 7, 8, 1, 2, 3, 4, 5, 6}, { 1, 2, 3, 0, 4, 5, 6, 7, 8}, { 1, 2, 4, 0, 3, 5, 6, 7, 8},
  { 1, 2, 5, 0, 3, 4, 6, 7, 8}, { 1, 2, 6, 0, 3, 4, 5, 7, 8}, { 1, 2, 7, 0, 3, 4, 5, 6, 8},
  { 1, 2, 8, 0, 3, 4, 5, 6, 7}, { 1, 3, 4, 0, 2, 5, 6, 7, 8}, { 1, 3, 5, 0, 2, 4, 6, 7, 8},
  { 1, 3, 6, 0, 2, 4, 5, 7, 8}, { 1, 3, 7, 0, 2, 4, 5, 6, 8}, { 1, 3, 8, 0, 2, 4, 5, 6, 7},
  { 1, 4, 5, 0, 2, 3, 6, 7, 8}, { 1, 4, 6, 0, 2, 3, 5, 7, 8}, { 1, 4, 7, 0, 2, 3, 5, 6, 8},
  { 1, 4, 8, 0, 2, 3, 5, 6, 7}, { 1, 5, 6, 0, 2, 3, 4, 7, 8}, { 1, 5, 7, 0, 2, 3, 4, 6, 8},
  { 1, 5, 8, 0, 2, 3, 4, 6, 7}, { 1, 6, 7, 0, 2, 3, 4, 5, 8}, { 1, 6, 8, 0, 2, 3, 4, 5, 7},
  { 1, 7, 8, 0, 2, 3, 4, 5, 6}, { 2, 3, 4, 0, 1, 5, 6, 7, 8}, { 2, 3, 5, 0, 1, 4, 6, 7, 8},
  { 2, 3, 6, 0, 1, 4, 5, 7, 8}, { 2, 3, 7, 0, 1, 4, 5, 6, 8}, { 2, 3, 8, 0, 1, 4, 5, 6, 7},
  { 2, 4, 5, 0, 1, 3, 6, 7, 8}, { 2, 4, 6, 0, 1, 3, 5, 7, 8}, { 2, 4, 7, 0, 1, 3, 5, 6, 8},
  { 2, 4, 8, 0, 1, 3, 5, 6, 7}, { 2, 5, 6, 0, 1, 3, 4, 7, 8}, { 2, 5, 7, 0, 1, 3, 4, 6, 8},
  { 2, 5, 8, 0, 1, 3, 4, 6, 7}, { 2, 6, 7, 0, 1, 3, 4, 5, 8}, { 2, 6, 8, 0, 1, 3, 4, 5, 7},
  { 2, 7, 8, 0, 1, 3, 4, 5, 6}, { 3, 4, 5, 0, 1, 2, 6, 7, 8}, { 3, 4, 6, 0, 1, 2, 5, 7, 8},
  { 3, 4, 7, 0, 1, 2, 5, 6, 8}, { 3, 4, 8, 0, 1, 2, 5, 6, 7}, { 3, 5, 6, 0, 1, 2, 4, 7, 8},
  { 3, 5, 7, 0, 1, 2, 4, 6, 8}, { 3, 5, 8, 0, 1, 2, 4, 6, 7}, { 3, 6, 7, 0, 1, 2, 4, 5, 8},
  { 3, 6, 8, 0, 1, 2, 4, 5, 7}, { 3, 7, 8, 0, 1, 2, 4, 5, 6}, { 4, 5, 6, 0, 1, 2, 3, 7, 8},
  { 4, 5, 7, 0, 1, 2, 3, 6, 8}, { 4, 5, 8, 0, 1, 2, 3, 6, 7}, { 4, 6, 7, 0, 1, 2, 3, 5, 8},
  { 4, 6, 8, 0, 1, 2, 3, 5, 7}, { 4, 7, 8, 0, 1, 2, 3, 5, 6}, { 5, 6, 7, 0, 1, 2, 3, 4, 8},
  { 5, 6, 8, 0, 1, 2, 3, 4, 7}, { 5, 7, 8, 0, 1, 2, 3, 4, 6}, { 6, 7, 8, 0, 1, 2, 3, 4, 5},
  { 0, 1, 2, 3, 4, 5, 6, 7, 8}, { 0, 1, 2, 4, 3, 5, 6, 7, 8}, { 0, 1, 2, 5, 3, 4, 6, 7, 8},
  { 0, 1, 2, 6, 3, 4, 5, 7, 8}, { 0, 1, 2, 7, 3, 4, 5, 6, 8}, { 0, 1, 2, 8, 3, 4, 5, 6, 7},
  { 0, 1, 3, 4, 2, 5, 6, 7, 8}, { 0, 1, 3, 5, 2, 4, 6, 7, 8}, { 0, 1, 3, 6, 2, 4, 5, 7, 8},
  { 0, 1, 3, 7, 2, 4, 5, 6, 8}, { 0, 1, 3, 8, 2, 4, 5, 6, 7}, { 0, 1, 4, 5, 2, 3, 6, 7, 8},
  { 0, 1, 4, 6, 2, 3, 5, 7, 8}, { 0, 1, 4, 7, 2, 3, 5, 6, 8}, { 0, 1, 4, 8, 2, 3, 5, 6, 7},
  { 0, 1, 5, 6, 2, 3, 4, 7, 8}, { 0, 1, 5, 7, 2, 3, 4, 6, 8}, { 0, 1, 5, 8, 2, 3, 4, 6, 7},
  { 0, 1, 6, 7, 2, 3, 4, 5, 8}, { 0, 1, 6, 8, 2, 3, 4, 5, 7}, { 0, 1, 7, 8, 2, 3, 4, 5, 6},
  { 0, 2, 3, 4, 1, 5, 6, 7, 8}, { 0, 2, 3, 5, 1, 4, 6, 7, 8}, { 0, 2, 3, 6, 1, 4, 5, 7, 8},
  { 0, 2, 3, 7, 1, 4, 5, 6, 8}, { 0, 2, 3, 8, 1, 4, 5, 6, 7}, { 0, 2, 4, 5, 1, 3, 6, 7, 8},
  { 0, 2, 4, 6, 1, 3, 5, 7, 8}, { 0, 2, 4, 7, 1, 3, 5, 6, 8}, { 0, 2, 4, 8, 1, 3, 5, 6, 7},
  { 0, 2, 5, 6, 1, 3, 4, 7, 8}, { 0, 2, 5, 7, 1, 3, 4, 6, 8}, { 0, 2, 5, 8, 1, 3, 4, 6, 7},
  { 0, 2, 6, 7, 1, 3, 4, 5, 8}, { 0, 2, 6, 8, 1, 3, 4, 5, 7}, { 0, 2, 7, 8, 1, 3, 4, 5, 6},
  { 0, 3, 4, 5, 1, 2, 6, 7, 8}, { 0, 3, 4, 6, 1, 2, 5, 7, 8}, { 0, 3, 4, 7, 1, 2, 5, 6, 8},
  { 0, 3, 4, 8, 1, 2, 5, 6, 7}, { 0, 3, 5, 6, 1, 2, 4, 7, 8}, { 0, 3, 5, 7, 1, 2, 4, 6, 8},
  { 0, 3, 5, 8, 1, 2, 4, 6, 7}, { 0, 3, 6, 7, 1, 2, 4, 5, 8}, { 0, 3, 6, 8, 1, 2, 4, 5, 7},
  { 0, 3, 7, 8, 1, 2, 4, 5, 6}, { 0, 4, 5, 6, 1, 2, 3, 7, 8}, { 0, 4, 5, 7, 1, 2, 3, 6, 8},
  { 0, 4, 5, 8, 1, 2, 3, 6, 7}, { 0, 4, 6, 7, 1, 2, 3, 5, 8}, { 0, 4, 6, 8, 1, 2, 3, 5, 7},
  { 0, 4, 7, 8, 1, 2, 3, 5, 6}, { 0, 5, 6, 7, 1, 2, 3, 4, 8}, { 0, 5, 6, 8, 1, 2, 3, 4, 7},
  { 0, 5, 7, 8, 1, 2, 3, 4, 6}, { 0, 6, 7, 8, 1, 2, 3, 4, 5}, { 1, 2, 3, 4, 0, 5, 6, 7, 8},
  { 1, 2, 3, 5, 0, 4, 6, 7, 8}, { 1, 2, 3, 6, 0, 4, 5, 7, 8}, { 1, 2, 3, 7, 0, 4, 5, 6, 8},
  { 1, 2, 3, 8, 0, 4, 5, 6, 7}, { 1, 2, 4, 5, 0, 3, 6, 7, 8}, { 1, 2, 4, 6, 0, 3, 5, 7, 8},
  { 1, 2, 4, 7, 0, 3, 5, 6, 8}, { 1, 2, 4, 8, 0, 3, 5, 6, 7}, { 1, 2, 5, 6, 0, 3, 4, 7, 8},
  { 1, 2, 5, 7, 0, 3, 4, 6, 8}, { 1, 2, 5, 8, 0, 3, 4, 6, 7}, { 1, 2, 6, 7, 0, 3, 4, 5, 8},
  { 1, 2, 6, 8, 0, 3, 4, 5, 7}, { 1, 2, 7, 8, 0, 3, 4, 5, 6}, { 1, 3, 4, 5, 0, 2, 6, 7, 8},
  { 1, 3, 4, 6, 0, 2, 5, 7, 8}, { 1, 3, 4, 7, 0, 2, 5, 6, 8}, { 1, 3, 4, 8, 0, 2, 5, 6, 7},
  { 1, 3, 5, 6, 0, 2, 4, 7, 8}, { 1, 3, 5, 7, 0, 2, 4, 6, 8}, { 1, 3, 5, 8, 0, 2, 4, 6, 7},
  { 1, 3, 6, 7, 0, 2, 4, 5, 8}, { 1, 3, 6, 8, 0, 2, 4, 5, 7}, { 1, 3, 7, 8, 0, 2, 4, 5, 6},
  { 1, 4, 5, 6, 0, 2, 3, 7, 8}, { 1, 4, 5, 7, 0, 2, 3, 6, 8}, { 1, 4, 5, 8, 0, 2, 3, 6, 7},
  { 1, 4, 6, 7, 0, 2, 3, 5, 8}, { 1, 4, 6, 8, 0, 2, 3, 5, 7}, { 1, 4, 7, 8, 0, 2, 3, 5, 6},
  { 1, 5, 6, 7, 0, 2, 3, 4, 8}, { 1, 5, 6, 8, 0, 2, 3, 4, 7}, { 1, 5, 7, 8, 0, 2, 3, 4, 6},
  { 1, 6, 7, 8, 0, 2, 3, 4, 5}, { 2, 3, 4, 5, 0, 1, 6, 7, 8}, { 2, 3, 4, 6, 0, 1, 5, 7, 8},
  { 2, 3, 4, 7, 0, 1, 5, 6, 8}, { 2, 3, 4, 8, 0, 1, 5, 6, 7}, { 2, 3, 5, 6, 0, 1, 4, 7, 8},
  { 2, 3, 5, 7, 0, 1, 4, 6, 8}, { 2, 3, 5, 8, 0, 1, 4, 6, 7}, { 2, 3, 6, 7, 0, 1, 4, 5, 8},
  { 2, 3, 6, 8, 0, 1, 4, 5, 7}, { 2, 3, 7, 8, 0, 1, 4, 5, 6}, { 2, 4, 5, 6, 0, 1, 3, 7, 8},
  { 2, 4, 5, 7, 0, 1, 3, 6, 8}, { 2, 4, 5, 8, 0, 1, 3, 6, 7}, { 2, 4, 6, 7, 0, 1, 3, 5, 8},
  { 2, 4, 6, 8, 0, 1, 3, 5, 7}, { 2, 4, 7, 8, 0, 1, 3, 5, 6}, { 2, 5, 6, 7, 0, 1, 3, 4, 8},
  { 2, 5, 6, 8, 0, 1, 3, 4, 7}, { 2, 5, 7, 8, 0, 1, 3, 4, 6}, { 2, 6, 7, 8, 0, 1, 3, 4, 5},
  { 3, 4, 5, 6, 0, 1, 2, 7, 8}, { 3, 4, 5, 7, 0, 1, 2, 6, 8}, { 3, 4, 5, 8, 0, 1, 2, 6, 7},
  { 3, 4, 6, 7, 0, 1, 2, 5, 8}, { 3, 4, 6, 8, 0, 1, 2, 5, 7}, { 3, 4, 7, 8, 0, 1, 2, 5, 6},
  { 3, 5, 6, 7, 0, 1, 2, 4, 8}, { 3, 5, 6, 8, 0, 1, 2, 4, 7}, { 3, 5, 7, 8, 0, 1, 2, 4, 6},
  { 3, 6, 7, 8, 0, 1, 2, 4, 5}, { 4, 5, 6, 7, 0, 1, 2, 3, 8}, { 4, 5, 6, 8, 0, 1, 2, 3, 7},
  { 4, 5, 7, 8, 0, 1, 2, 3, 6}, { 4, 6, 7, 8, 0, 1, 2, 3, 5}, { 5, 6, 7, 8, 0, 1, 2, 3, 4}},
           j[54][15] = {     // 3 Intersection and peer 6 Line + 6 Box Cell positions for 54 Box-Line
  { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,18,19,20},
  { 3, 4, 5, 0, 1, 2, 6, 7, 8,12,13,14,21,22,23},
  { 6, 7, 8, 0, 1, 2, 3, 4, 5,15,16,17,24,25,26},
  { 9,10,11,12,13,14,15,16,17, 0, 1, 2,18,19,20},
  {12,13,14, 9,10,11,15,16,17, 3, 4, 5,21,22,23},
  {15,16,17, 9,10,11,12,13,14, 6, 7, 8,24,25,26},
  {18,19,20,21,22,23,24,25,26, 0, 1, 2, 9,10,11},
  {21,22,23,18,19,20,24,25,26, 3, 4, 5,12,13,14},
  {24,25,26,18,19,20,21,22,23, 6, 7, 8,15,16,17},
  {27,28,29,30,31,32,33,34,35,36,37,38,45,46,47},
  {30,31,32,27,28,29,33,34,35,39,40,41,48,49,50},
  {33,34,35,27,28,29,30,31,32,42,43,44,51,52,53},
  {36,37,38,39,40,41,42,43,44,27,28,29,45,46,47},
  {39,40,41,36,37,38,42,43,44,30,31,32,48,49,50},
  {42,43,44,36,37,38,39,40,41,33,34,35,51,52,53},
  {45,46,47,48,49,50,51,52,53,27,28,29,36,37,38},
  {48,49,50,45,46,47,51,52,53,30,31,32,39,40,41},
  {51,52,53,45,46,47,48,49,50,33,34,35,42,43,44},
  {54,55,56,57,58,59,60,61,62,63,64,65,72,73,74},
  {57,58,59,54,55,56,60,61,62,66,67,68,75,76,77},
  {60,61,62,54,55,56,57,58,59,69,70,71,78,79,80},
  {63,64,65,66,67,68,69,70,71,54,55,56,72,73,74},
  {66,67,68,63,64,65,69,70,71,57,58,59,75,76,77},
  {69,70,71,63,64,65,66,67,68,60,61,62,78,79,80},
  {72,73,74,75,76,77,78,79,80,54,55,56,63,64,65},
  {75,76,77,72,73,74,78,79,80,57,58,59,66,67,68},
  {78,79,80,72,73,74,75,76,77,60,61,62,69,70,71},
  { 0, 9,18,27,36,45,54,63,72, 1, 2,10,11,19,20},
  {27,36,45, 0, 9,18,54,63,72,28,29,37,38,46,47},
  {54,63,72, 0, 9,18,27,36,45,55,56,64,65,73,74},
  { 1,10,19,28,37,46,55,64,73, 0, 2, 9,11,18,20},
  {28,37,46, 1,10,19,55,64,73,27,29,36,38,45,47},
  {55,64,73, 1,10,19,28,37,46,54,56,63,65,72,74},
  { 2,11,20,29,38,47,56,65,74, 0, 1, 9,10,18,19},
  {29,38,47, 2,11,20,56,65,74,27,28,36,37,45,46},
  {56,65,74, 2,11,20,29,38,47,54,55,63,64,72,73},
  { 3,12,21,30,39,48,57,66,75, 4, 5,13,14,22,23},
  {30,39,48, 3,12,21,57,66,75,31,32,40,41,49,50},
  {57,66,75, 3,12,21,30,39,48,58,59,67,68,76,77},
  { 4,13,22,31,40,49,58,67,76, 3, 5,12,14,21,23},
  {31,40,49, 4,13,22,58,67,76,30,32,39,41,48,50},
  {58,67,76, 4,13,22,31,40,49,57,59,66,68,75,77},
  { 5,14,23,32,41,50,59,68,77, 3, 4,12,13,21,22},
  {32,41,50, 5,14,23,59,68,77,30,31,39,40,48,49},
  {59,68,77, 5,14,23,32,41,50,57,58,66,67,75,76},
  { 6,15,24,33,42,51,60,69,78, 7, 8,16,17,25,26},
  {33,42,51, 6,15,24,60,69,78,34,35,43,44,52,53},
  {60,69,78, 6,15,24,33,42,51,61,62,70,71,79,80},
  { 7,16,25,34,43,52,61,70,79, 6, 8,15,17,24,26},
  {34,43,52, 7,16,25,61,70,79,33,35,42,44,51,53},
  {61,70,79, 7,16,25,34,43,52,60,62,69,71,78,80},
  { 8,17,26,35,44,53,62,71,80, 6, 7,15,16,24,25},
  {35,44,53, 8,17,26,62,71,80,33,34,42,43,51,52},
  {62,71,80, 8,17,26,35,44,53,60,61,69,70,78,79}},
           W[12][2] = {      // References used for Basic, Hybrid and Transport Wings
  {14,12}, { 0,14}, { 6,20}, { 6,12}, { 7,13}, { 3,17},
  { 8, 6}, { 9, 8}, {12,10}, {10, 7}, {11, 9}, {13,11}};

#if RJ > 3
void prn (void)
{
  int a = 0,
      k[9] = {1, 1, 1, 1, 1, 1, 1, 1, 1};

  for (; a < 81; ++a)
    if (k[a % 9] < B[g[a]])
      k[a % 9] = B[g[a]];
  printf (" +%.*s+%.*s+%.*s+\n",
    k[0] + k[1] + k[2] + 4, "-------------------------------",
    k[3] + k[4] + k[5] + 4, "-------------------------------",
    k[6] + k[7] + k[8] + 4, "-------------------------------");
  for (a = 0; a < 81; ++a)
  {
    printf ("%s%-*d", a % 3 ? " " : " | ", k[a % 9], b[g[a] | s[a]]);
    if ((a % 9) & 8)
    {
      printf (" |\n");
      if (a % 27 == 26)
        printf (" +%.*s+%.*s+%.*s+\n",
          k[0] + k[1] + k[2] + 4, "-------------------------------",
          k[3] + k[4] + k[5] + 4, "-------------------------------",
          k[6] + k[7] + k[8] + 4, "-------------------------------");
    }
  }
}
#endif

int solve (int p)
{
  int a = 0,
      Y,
      x,                     // Unsolved Cell position for least Cell Clues checking
      y = 0,                 // 0 Represent Naked single Cell position
      z = 512;               // 512 Represent greatest Cell Clue for first time least Cell Clues checking

#if RJ > 3
  prn ();
#endif
  for (; a < 27; ++a)        // Check zero state Unit wise
    if (9 - !g[l[a][0]] - !g[l[a][1]] - !g[l[a][2]] - !g[l[a][3]] -
      !g[l[a][4]] - !g[l[a][5]] - !g[l[a][6]] - !g[l[a][7]] - !g[l[a][8]] !=
      B[g[l[a][0]] | g[l[a][1]] | g[l[a][2]] | g[l[a][3]] | g[l[a][4]] |
      g[l[a][5]] | g[l[a][6]] | g[l[a][7]] | g[l[a][8]]])
      return 0;
  for (a = p; a < q; ++a)    // Search Hidden single Cell Clue for each unsolved Cell position
  {
    Y = (((g[w[r[a]][0]] | g[w[r[a]][1]] | g[w[r[a]][2]] | g[w[r[a]][3]] |
      g[w[r[a]][4]] | g[w[r[a]][5]] | g[w[r[a]][6]] | g[w[r[a]][7]]) ^ g[r[a]]) |
      ((g[w[r[a]][6]] | g[w[r[a]][7]] | g[w[r[a]][8]] | g[w[r[a]][9]] |
      g[w[r[a]][10]] | g[w[r[a]][11]] | g[w[r[a]][12]] | g[w[r[a]][13]]) ^ g[r[a]]) |
      ((g[w[r[a]][12]] | g[w[r[a]][13]] | g[w[r[a]][14]] | g[w[r[a]][15]] |
      g[w[r[a]][16]] | g[w[r[a]][17]] | g[w[r[a]][18]] | g[w[r[a]][19]]) ^ g[r[a]])) & g[r[a]];
                             // Assign Hidden single Cell Clue
    if (!Y)
      continue;              // Skip for no Hidden single Cell Clue in unsolved Cell position
    x = a;                   // Assign Hidden single Cell position
    z = Y;                   // Assign Hidden single Cell Clue
    y = 1;                   // 1 Represent Hidden single Cell position
    goto NHSCF;
  }
  for (a = p; a < q; ++a)    // Search Naked single Cell Clue or Guess minimum Cell Clues for each unsolved Cell position
    if (B[z] > B[g[r[a]]])   // Check least Cell Clues in current unsolved Cell position
      if (B[z = g[r[x = a]]] < 2)
        goto NHSCF;          // Naked single Cell Clue in current unsolved Cell position
  for (; y < 27; ++y)        // Search Naked/Hidden Tuples Cell Clues for each Unit
  {
    Y = !g[l[y][0]] + !g[l[y][1]] + !g[l[y][2]] + !g[l[y][3]] +
      !g[l[y][4]] + !g[l[y][5]] + !g[l[y][6]] + !g[l[y][7]] + !g[l[y][8]];
                             // Count Unit solved Cell positions
    if (Y > 6)
      continue;              // Skip Unit for more than 6 solved Cell positions
    for (a = 0; a < 36; ++a) // Search Naked/Hidden pair Cell Clues for each Unit 36 pair Cell positions
    {
      if (!g[l[y][h[a][0]]] || !g[l[y][h[a][1]]])
      {                      // Skip for no unsolved Cell positions
        if (!g[l[y][h[a][0]]])
          a += 7 - h[a][0];
        continue;
      }
      int K[2] = {g[l[y][h[a][0]]] | g[l[y][h[a][1]]], g[l[y][h[a][2]]] |
                 g[l[y][h[a][3]]] | g[l[y][h[a][4]]] | g[l[y][h[a][5]]] |
                 g[l[y][h[a][6]]] | g[l[y][h[a][7]]] | g[l[y][h[a][8]]]};
                             // Assign Cell Clues in Unit pair Cell positions and Unit other Cell positions
      if (B[K[0]] == 2)      // Check Naked pair Cell Clues in Unit pair Cell positions
      {
        if (!(K[0] & K[1]))
          continue;          // Skip for no Naked pair Cell Clues in Unit other Cell positions
        int k[7] = {g[l[y][h[a][2]]], g[l[y][h[a][3]]], g[l[y][h[a][4]]],
                   g[l[y][h[a][5]]], g[l[y][h[a][6]]], g[l[y][h[a][7]]], g[l[y][h[a][8]]]};
                             // Backup and drop Naked pair Cell Clues from Unit other Cell positions
        g[l[y][h[a][2]]] &= ~K[0];
        g[l[y][h[a][3]]] &= ~K[0];
        g[l[y][h[a][4]]] &= ~K[0];
        g[l[y][h[a][5]]] &= ~K[0];
        g[l[y][h[a][6]]] &= ~K[0];
        g[l[y][h[a][7]]] &= ~K[0];
        g[l[y][h[a][8]]] &= ~K[0];
#if RJ > 2
        printf ("%d) Found Naked pair %s %d Cells %d %d drop Clues %d from Cells %d %d %d %d %d %d %d\n",
          p, y < 9 ? "Row" : y < 18 ? "Column" : "Box", y % 9 + 1,
          l[y][h[a][0]], l[y][h[a][1]], b[K[0]], l[y][h[a][2]], l[y][h[a][3]],
          l[y][h[a][4]], l[y][h[a][5]], l[y][h[a][6]], l[y][h[a][7]], l[y][h[a][8]]);
#endif
        if (solve (p))
          return 1;
#if RJ > 2
        printf ("%d) Restore Naked pair %s %d Cells %d %d add Clues %d to Cells %d %d %d %d %d %d %d\n",
          p, y < 9 ? "Row" : y < 18 ? "Column" : "Box", y % 9 + 1,
          l[y][h[a][0]], l[y][h[a][1]], b[K[0]], l[y][h[a][2]], l[y][h[a][3]],
          l[y][h[a][4]], l[y][h[a][5]], l[y][h[a][6]], l[y][h[a][7]], l[y][h[a][8]]);
#endif
        g[l[y][h[a][2]]] = k[0];
        g[l[y][h[a][3]]] = k[1];
        g[l[y][h[a][4]]] = k[2];
        g[l[y][h[a][5]]] = k[3];
        g[l[y][h[a][6]]] = k[4];
        g[l[y][h[a][7]]] = k[5];
        g[l[y][h[a][8]]] = k[6];
#if RJ > 3
        prn ();
#endif
        return 0;            // Restore Naked pair Cell Clues to Unit other Cell positions
      }
      if (B[K[0] &= K[0] ^ K[1]] != 2)
        continue;            // Skip for no Hidden pair Cell Clues in Unit pair Cell positions
      int k[2] = {g[l[y][h[a][0]]], g[l[y][h[a][1]]]};
                             // Backup and drop other than Hidden pair Cell Clues from Unit pair Cell positions
      g[l[y][h[a][0]]] &= K[0];
      g[l[y][h[a][1]]] &= K[0];
#if RJ > 2
      printf ("%d) Found Hidden pair %s %d Cells %d %d Clues %d\n",
        p, y < 9 ? "Row" : y < 18 ? "Column" : "Box", y % 9 + 1, l[y][h[a][0]], l[y][h[a][1]], b[K[0]]);
#endif
      if (solve (p))
        return 1;
#if RJ > 2
      printf ("%d) Restore Hidden pair %s %d Cells %d %d Clues %d\n",
        p, y < 9 ? "Row" : y < 18 ? "Column" : "Box", y % 9 + 1, l[y][h[a][0]], l[y][h[a][1]], b[K[0]]);
#endif
      g[l[y][h[a][0]]] = k[0];
      g[l[y][h[a][1]]] = k[1];
#if RJ > 3
      prn ();
#endif
      return 0;              // Restore other than Hidden pair Cell Clues to Unit pair Cell positions
    }
    if (Y > 4)
      continue;              // Skip triplets and quads for more than 4 solved Cell positions
    for (; a < 120; ++a)     // Search Naked/Hidden triplet Cell Clues for each Unit 84 triplet Cell positions
    {
      if (!g[l[y][h[a][0]]] || !g[l[y][h[a][1]]] || !g[l[y][h[a][2]]])
      {                      // Skip for no unsolved Cell positions
        if (!g[l[y][h[a][0]]])
        {
          int A[7] = {27,20,14, 9, 5, 2, 0};

          a += A[h[a][0]];
        }
        else if (!g[l[y][h[a][1]]])
          a += 7 - h[a][1];
        continue;
      }
      int K[2] = {g[l[y][h[a][0]]] | g[l[y][h[a][1]]] | g[l[y][h[a][2]]],
                 g[l[y][h[a][3]]] | g[l[y][h[a][4]]] | g[l[y][h[a][5]]] |
                 g[l[y][h[a][6]]] | g[l[y][h[a][7]]] | g[l[y][h[a][8]]]};
                             // Assign Cell Clues in Unit triplet Cell positions and Unit other Cell positions
      if (B[K[0]] == 3)      // Check Naked triplet Cell Clues in Unit triplet Cell positions
      {
        if (!(K[0] & K[1]))
          continue;          // Skip for no Naked triplet Cell Clues in Unit other Cell positions
        int k[6] = {g[l[y][h[a][3]]], g[l[y][h[a][4]]], g[l[y][h[a][5]]],
                   g[l[y][h[a][6]]], g[l[y][h[a][7]]], g[l[y][h[a][8]]]};
                             // Backup and drop Naked triplet Cell Clues from Unit other Cell positions
        g[l[y][h[a][3]]] &= ~K[0];
        g[l[y][h[a][4]]] &= ~K[0];
        g[l[y][h[a][5]]] &= ~K[0];
        g[l[y][h[a][6]]] &= ~K[0];
        g[l[y][h[a][7]]] &= ~K[0];
        g[l[y][h[a][8]]] &= ~K[0];
#if RJ > 2
        printf ("%d) Found Naked triplet %s %d Cells %d %d %d drop Clues %d from Cells %d %d %d %d %d %d\n",
          p, y < 9 ? "Row" : y < 18 ? "Column" : "Box", y % 9 + 1,
          l[y][h[a][0]], l[y][h[a][1]], l[y][h[a][2]], b[K[0]], l[y][h[a][3]],
          l[y][h[a][4]], l[y][h[a][5]], l[y][h[a][6]], l[y][h[a][7]], l[y][h[a][8]]);
#endif
        if (solve (p))
          return 1;
#if RJ > 2
        printf ("%d) Restore Naked triplet %s %d Cells %d %d %d add Clues %d to Cells %d %d %d %d %d %d\n",
          p, y < 9 ? "Row" : y < 18 ? "Column" : "Box", y % 9 + 1,
          l[y][h[a][0]], l[y][h[a][1]], l[y][h[a][2]], b[K[0]], l[y][h[a][3]],
          l[y][h[a][4]], l[y][h[a][5]], l[y][h[a][6]], l[y][h[a][7]], l[y][h[a][8]]);
#endif
        g[l[y][h[a][3]]] = k[0];
        g[l[y][h[a][4]]] = k[1];
        g[l[y][h[a][5]]] = k[2];
        g[l[y][h[a][6]]] = k[3];
        g[l[y][h[a][7]]] = k[4];
        g[l[y][h[a][8]]] = k[5];
#if RJ > 3
        prn ();
#endif
        return 0;            // Restore Naked triplet Cell Clues to Unit other Cell positions
      }
      if (B[K[0] &= K[0] ^ K[1]] != 3)
        continue;            // Skip for no Hidden triplet Cell Clues in Unit triplet Cell positions
      int k[3] = {g[l[y][h[a][0]]], g[l[y][h[a][1]]], g[l[y][h[a][2]]]};
                             // Backup and drop other than Hidden triplet Cell Clues from Unit triplet Cell positions
      g[l[y][h[a][0]]] &= K[0];
      g[l[y][h[a][1]]] &= K[0];
      g[l[y][h[a][2]]] &= K[0];
#if RJ > 2
      printf ("%d) Found Hidden triplet %s %d Cells %d %d %d Clues %d\n",
        p, y < 9 ? "Row" : y < 18 ? "Column" : "Box", y % 9 + 1,
        l[y][h[a][0]], l[y][h[a][1]], l[y][h[a][2]], b[K[0]]);
#endif
      if (solve (p))
        return 1;
#if RJ > 2
      printf ("%d) Restore Hidden triplet %s %d Cells %d %d %d Clues %d\n",
        p, y < 9 ? "Row" : y < 18 ? "Column" : "Box", y % 9 + 1,
        l[y][h[a][0]], l[y][h[a][1]], l[y][h[a][2]], y, b[K[0]]);
#endif
      g[l[y][h[a][0]]] = k[0];
      g[l[y][h[a][1]]] = k[1];
      g[l[y][h[a][2]]] = k[2];
#if RJ > 3
      prn ();
#endif
      return 0;              // Restore other than Hidden triplet Cell Clues to Unit triplet Cell positions
    }
    if (Y > 2)
      continue;              // Skip quads for more than 2 solved Cell positions
    for (; a < 246; ++a)     // Search Naked/Hidden quad Cell Clues for each Unit 126 quad Cell positions
    {
      if (!g[l[y][h[a][0]]] || !g[l[y][h[a][1]]] || !g[l[y][h[a][2]]] || !g[l[y][h[a][3]]])
      {                      // Skip for no unsolved Cell positions
        if (!g[l[y][h[a][0]]])
        {
          int A[6] = {55,34,19, 9, 3, 0};

          a += A[h[a][0]];
        }
        else if (!g[l[y][h[a][1]]])
        {
          int A[7] = {27,20,14, 9, 5, 2, 0};

          a += A[h[a][1]];
        }
        else if (!g[l[y][h[a][2]]])
          a += 7 - h[a][2];
        continue;
      }
      int K[2] = {g[l[y][h[a][0]]] | g[l[y][h[a][1]]] | g[l[y][h[a][2]]] |
                 g[l[y][h[a][3]]], g[l[y][h[a][4]]] | g[l[y][h[a][5]]] |
                 g[l[y][h[a][6]]] | g[l[y][h[a][7]]] | g[l[y][h[a][8]]]};
                             // Assign Cell Clues in Unit quad Cell positions and Unit other Cell positions
      if (B[K[0]] == 4)      // Check Naked quad Cell Clues in Unit quad Cell positions
      {
        if (!(K[0] & K[1]))
          continue;          // Skip for no Naked quad Cell Clues in Unit other Cell positions
        int k[5] = {g[l[y][h[a][4]]], g[l[y][h[a][5]]], g[l[y][h[a][6]]],
                   g[l[y][h[a][7]]], g[l[y][h[a][8]]]};
                             // Backup and drop Naked quad Cell Clues from Unit other Cell positions
        g[l[y][h[a][4]]] &= ~K[0];
        g[l[y][h[a][5]]] &= ~K[0];
        g[l[y][h[a][6]]] &= ~K[0];
        g[l[y][h[a][7]]] &= ~K[0];
        g[l[y][h[a][8]]] &= ~K[0];
#if RJ > 2
        printf ("%d) Found Naked quad %s %d Cells %d %d %d %d drop Clues %d from Cells %d %d %d %d %d\n",
          p, y < 9 ? "Row" : y < 18 ? "Column" : "Box", y % 9 + 1,
          l[y][h[a][0]], l[y][h[a][1]], l[y][h[a][2]], l[y][h[a][3]], b[K[0]],
          l[y][h[a][4]], l[y][h[a][5]], l[y][h[a][6]], l[y][h[a][7]], l[y][h[a][8]]);
#endif
        if (solve (p))
          return 1;
#if RJ > 2
        printf ("%d) Restore Naked quad %s %d Cells %d %d %d %d add Clues %d to Cells %d %d %d %d\n",
          p, y < 9 ? "Row" : y < 18 ? "Column" : "Box", y % 9 + 1,
          l[y][h[a][0]], l[y][h[a][1]], l[y][h[a][2]], l[y][h[a][3]], b[K[0]],
          l[y][h[a][4]], l[y][h[a][5]], l[y][h[a][6]], l[y][h[a][7]], l[y][h[a][8]]);
#endif
        g[l[y][h[a][4]]] = k[0];
        g[l[y][h[a][5]]] = k[1];
        g[l[y][h[a][6]]] = k[2];
        g[l[y][h[a][7]]] = k[3];
        g[l[y][h[a][8]]] = k[4];
#if RJ > 3
        prn ();
#endif
        return 0;            // Restore Naked quad Cell Clues to Unit other Cell positions
      }
      if (B[K[0] &= K[0] ^ K[1]] != 4)
        continue;            // Skip for no Hidden quad Cell Clues in Unit quad Cell positions
      int k[4] = {g[l[y][h[a][0]]], g[l[y][h[a][1]]], g[l[y][h[a][2]]], g[l[y][h[a][3]]]};
                             // Backup and drop other than Hidden quad Cell Clues from Unit quad Cell positions
      g[l[y][h[a][0]]] &= K[0];
      g[l[y][h[a][1]]] &= K[0];
      g[l[y][h[a][2]]] &= K[0];
      g[l[y][h[a][3]]] &= K[0];
#if RJ > 2
      printf ("%d) Found Hidden quad %s %d Cells %d %d %d %d Clues %d\n",
        p, y < 9 ? "Row" : y < 18 ? "Column" : "Box", y % 9 + 1,
        l[y][h[a][0]], l[y][h[a][1]], l[y][h[a][2]], l[y][h[a][3]], b[K[0]]);
#endif
      if (solve (p))
        return 1;
#if RJ > 2
      printf ("%d) Restore Hidden quad %s %d Cells %d %d %d %d Clues %d\n",
        p, y < 9 ? "Row" : y < 18 ? "Column" : "Box", y % 9 + 1,
        l[y][h[a][0]], l[y][h[a][1]], l[y][h[a][2]], l[y][h[a][3]], b[K[0]]);
#endif
      g[l[y][h[a][0]]] = k[0];
      g[l[y][h[a][1]]] = k[1];
      g[l[y][h[a][2]]] = k[2];
      g[l[y][h[a][3]]] = k[3];
#if RJ > 3
      prn ();
#endif
      return 0;              // Restore other than Hidden quad Cell Clues to Unit quad Cell positions
    }
  }
  for (a = 0; a < 54; ++a)   // Search Intersection Removal for 54 Box-Line 3 Cell positions
    for (Y = g[j[a][0]] | g[j[a][1]] | g[j[a][2]]; y = Y & -Y; Y -= y)
    {                        // Search Box-Line 3 Cell positions for each Intersection Removal Clue
      if ((g[j[a][3]] | g[j[a][4]] | g[j[a][5]] | g[j[a][6]] | g[j[a][7]] | g[j[a][8]]) & y)
      {                      // Check Intersection Removal Clue in Line other Cell positions
        if ((g[j[a][9]] | g[j[a][10]] | g[j[a][11]] | g[j[a][12]] | g[j[a][13]] | g[j[a][14]]) & y)
          continue;          // Skip for Intersection Removal Clue in Box other Cell positions
        int k[6] = {g[j[a][3]], g[j[a][4]], g[j[a][5]], g[j[a][6]], g[j[a][7]], g[j[a][8]]};
                             // Backup and drop Intersection Removal Clue from Line other Cell positions
        g[j[a][3]] &= ~y;
        g[j[a][4]] &= ~y;
        g[j[a][5]] &= ~y;
        g[j[a][6]] &= ~y;
        g[j[a][7]] &= ~y;
        g[j[a][8]] &= ~y;
#if RJ > 2
        printf ("%d) Found Pointing and Claiming Intersection Removal Cells %d %d %d drop Clue %d from Cells %d %d %d %d %d %d\n",
          p, j[a][0], j[a][1], j[a][2], b[y], j[a][3], j[a][4], j[a][5], j[a][6], j[a][7], j[a][8]);
#endif
        if (solve (p))
          return 1;
#if RJ > 2
        printf ("%d) Restore Pointing and Claiming Intersection Removal Cells %d %d %d add Clue %d to Cells %d %d %d %d %d %d\n",
          p, j[a][0], j[a][1], j[a][2], b[y], j[a][3], j[a][4], j[a][5], j[a][6], j[a][7], j[a][8]);
#endif
        g[j[a][3]] = k[0];   // Restore Intersection Removal Clue to Line other Cell positions
        g[j[a][4]] = k[1];
        g[j[a][5]] = k[2];
        g[j[a][6]] = k[3];
        g[j[a][7]] = k[4];
        g[j[a][8]] = k[5];
#if RJ > 3
        prn ();
#endif
        return 0;
      }                      // No Intersection Removal Clue in Line other Cell positions
      if (~(g[j[a][9]] | g[j[a][10]] | g[j[a][11]] | g[j[a][12]] | g[j[a][13]] | g[j[a][14]]) & y)
        continue;            // Skip for no Intersection Removal Clue in Box other Cell positions
      int k[6] = {g[j[a][9]], g[j[a][10]], g[j[a][11]], g[j[a][12]], g[j[a][13]], g[j[a][14]]};
                             // Backup and drop Intersection Removal Clue from Box other Cell positions
      g[j[a][9]] &= ~y;
      g[j[a][10]] &= ~y;
      g[j[a][11]] &= ~y;
      g[j[a][12]] &= ~y;
      g[j[a][13]] &= ~y;
      g[j[a][14]] &= ~y;
#if RJ > 2
      printf ("%d) Found Box-Line Reduction Intersection Removal Cells %d %d %d drop Clue %d from Cells %d %d %d %d %d %d\n",
        p, j[a][0], j[a][1], j[a][2], b[y], j[a][9], j[a][10], j[a][11], j[a][12], j[a][13], j[a][14]);
#endif
      if (solve (p))
        return 1;
#if RJ > 2
      printf ("%d) Restore Box-Line Reduction Intersection Removal Cells %d %d %d add Clue %d to Cells %d %d %d %d %d %d\n",
        p, j[a][0], j[a][1], j[a][2], b[y], j[a][9], j[a][10], j[a][11], j[a][12], j[a][13], j[a][14]);
#endif
      g[j[a][9]] = k[0];     // Restore Intersection Removal Clue to Box other Cell positions
      g[j[a][10]] = k[1];
      g[j[a][11]] = k[2];
      g[j[a][12]] = k[3];
      g[j[a][13]] = k[4];
      g[j[a][14]] = k[5];
#if RJ > 3
      prn ();
#endif
      return 0;
    }
  for (Y = 0; Y < 10; Y += 9)// Search Basic Fishes Line wise
    for (y = 1; y < 257; y <<= 1)
    {                        // Search Basic Fishes for each digit
      int k[9];              // Backup Basic Fish Clue for each Line Cell positions

      for (a = Y; a < Y + 9; ++a)
        k[a - Y] = (g[l[a][0]] & y ? 1 : 0) | (g[l[a][1]] & y ? 2 : 0) |
          (g[l[a][2]] & y ? 4 : 0) | (g[l[a][3]] & y ? 8 : 0) |
          (g[l[a][4]] & y ? 16 : 0) | (g[l[a][5]] & y ? 32 : 0) |
          (g[l[a][6]] & y ? 64 : 0) | (g[l[a][7]] & y ? 128 : 0) |
          (g[l[a][8]] & y ? 256 : 0);
      for (a = 0; a < 36; ++a)
      {                      // Search X-Wing Clue for Line 36 pair Cell positions
        int A = k[h[a][0]],
            K[2],
            X[2] = {-1,-1},
            Z = -1;

        if (B[A] != 2 || A != k[h[a][1]])
        {                    // Skip for no X-Wing Clue in Lines pair Cell positions
          if (B[A] != 2)
            a += 7 - h[a][0];
          continue;
        }
        for (; K[++Z] = A & -A; A -= K[Z])
        {                    // Search opposite Line other Cell positions for X-Wing Clue
          if (~(k[h[a][2]] | k[h[a][3]] | k[h[a][4]] | k[h[a][5]] | k[h[a][6]] |
            k[h[a][7]] | k[h[a][8]]) & K[Z])
            continue;        // Skip for no X-Wing Clue in opposite Line other Cell positions
          X[Z] = b[K[Z]] - Y + 8;
          g[l[X[Z]][h[a][2]]] &= ~y;
          g[l[X[Z]][h[a][3]]] &= ~y;
          g[l[X[Z]][h[a][4]]] &= ~y;
          g[l[X[Z]][h[a][5]]] &= ~y;
          g[l[X[Z]][h[a][6]]] &= ~y;
          g[l[X[Z]][h[a][7]]] &= ~y;
          g[l[X[Z]][h[a][8]]] &= ~y;
        }                    // Drop X-Wing Clue from opposite Line other Cell positions
        if ((X[0] & X[1]) < 0)
          continue;          // Skip for no X-Wing Clue in opposite Lines other Cell positions
#if RJ > 2
        printf ("%d) Found %s wise X-Wing Cells r%d%dc%d%d Clue %d\n",
          p, Y ? "Column" : "Row", Y ? b[K[0]] : h[a][0] + 1, Y ? b[K[1]] : h[a][1] + 1,
          Y ? h[a][0] + 1 : b[K[0]], Y ? h[a][1] + 1 : b[K[1]], b[y]);
#endif
        if (solve (p))
          return 1;
#if RJ > 2
        printf ("%d) Restore %s wise X-Wing Cells r%d%dc%d%d Clue %d\n",
          p, Y ? "Column" : "Row", Y ? b[K[0]] : h[a][0] + 1, Y ? b[K[1]] : h[a][1] + 1,
          Y ? h[a][0] + 1 : b[K[0]], Y ? h[a][1] + 1 : b[K[1]], b[y]);
#endif
        for (Z = 0; Z < 2; ++Z)
        {                    // Restore X-Wing Clue to opposite Lines other Cell positions
          if (X[Z] < 0)
            continue;        // Skip for no X-Wing Clue in opposite Line other Cell positions
          g[l[X[Z]][h[a][2]]] |= k[h[a][2]] & K[Z] ? y : 0;
          g[l[X[Z]][h[a][3]]] |= k[h[a][3]] & K[Z] ? y : 0;
          g[l[X[Z]][h[a][4]]] |= k[h[a][4]] & K[Z] ? y : 0;
          g[l[X[Z]][h[a][5]]] |= k[h[a][5]] & K[Z] ? y : 0;
          g[l[X[Z]][h[a][6]]] |= k[h[a][6]] & K[Z] ? y : 0;
          g[l[X[Z]][h[a][7]]] |= k[h[a][7]] & K[Z] ? y : 0;
          g[l[X[Z]][h[a][8]]] |= k[h[a][8]] & K[Z] ? y : 0;
        }
#if RJ > 3
        prn ();
#endif
        return 0;
      }
      for (; a < 120; ++a)   // Search Sword Fish Clue in Line 84 triplet Cell positions
      {
        int A = k[h[a][0]] | k[h[a][1]] | k[h[a][2]],
            K[3],
            X[3] = {-1,-1,-1},
            Z = -1;

        if (!k[h[a][0]] || !k[h[a][1]] || !k[h[a][2]] || B[A] != 3)
        {                    // Skip for either no unsolved Cell positions; or no Sord Fish Clue in Lines triplet Cell positions
          if (!k[h[a][0]] || B[k[h[a][0]]] > 3)
          {
            int A[7] = {27,20,14, 9, 5, 2, 0};

            a += A[h[a][0]];
          }
          else if (!k[h[a][1]] || B[k[h[a][1]]] > 3)
            a += 7 - h[a][1];
          continue;
        }
        for (; K[++Z] = A & -A; A -= K[Z])
        {                    // Search opposite Line other Cell positions for Sword Fish Clue
          if (~(k[h[a][3]] | k[h[a][4]] | k[h[a][5]] | k[h[a][6]] | k[h[a][7]] |
            k[h[a][8]]) & K[Z])
            continue;        // Skip for no Sword Fish Clue in opposite Line other Cell positions
          X[Z] = b[K[Z]] - Y + 8;
          g[l[X[Z]][h[a][3]]] &= ~y;
          g[l[X[Z]][h[a][4]]] &= ~y;
          g[l[X[Z]][h[a][5]]] &= ~y;
          g[l[X[Z]][h[a][6]]] &= ~y;
          g[l[X[Z]][h[a][7]]] &= ~y;
          g[l[X[Z]][h[a][8]]] &= ~y;
        }                    // Drop Sword Fish Clue from opposite Line other Cell positions
        if ((X[0] & X[1] & X[2]) < 0)
          continue;          // Skip for no Sword Fish Clue in opposite Lines other Cell positions
#if RJ > 2
        printf ("%d) Found %s wise Sword Fish Cells r%d%d%dc%d%d%d Clue %d\n",
          p, Y ? "Column" : "Row", Y ? b[K[0]] : h[a][0] + 1, Y ? b[K[1]] : h[a][1] + 1,
          Y ? b[K[2]] : h[a][2] + 1, Y ? h[a][0] + 1 : b[K[0]], Y ? h[a][1] + 1 : b[K[1]],
          Y ? h[a][2] + 1 : b[K[2]], b[y]);
#endif
        if (solve (p))
          return 1;
#if RJ > 2
        printf ("%d) Restore %s wise Sword Fish Cells r%d%d%dc%d%d%d Clue %d\n",
          p, Y ? "Column" : "Row", Y ? b[K[0]] : h[a][0] + 1, Y ? b[K[1]] : h[a][1] + 1,
          Y ? b[K[2]] : h[a][2] + 1, Y ? h[a][0] + 1 : b[K[0]], Y ? h[a][1] + 1 : b[K[1]],
          Y ? h[a][2] + 1 : b[K[2]], b[y]);
#endif
        for (Z = 0; Z < 3; ++Z)
        {                    // Restore Sword Fish Clue to opposite Lines other Cell positions
          if (X[Z] < 0)
            continue;        // Skip for no Sword Fish Clue in opposite Line other Cell positions
          g[l[X[Z]][h[a][3]]] |= k[h[a][3]] & K[Z] ? y : 0;
          g[l[X[Z]][h[a][4]]] |= k[h[a][4]] & K[Z] ? y : 0;
          g[l[X[Z]][h[a][5]]] |= k[h[a][5]] & K[Z] ? y : 0;
          g[l[X[Z]][h[a][6]]] |= k[h[a][6]] & K[Z] ? y : 0;
          g[l[X[Z]][h[a][7]]] |= k[h[a][7]] & K[Z] ? y : 0;
          g[l[X[Z]][h[a][8]]] |= k[h[a][8]] & K[Z] ? y : 0;
        }
#if RJ > 3
        prn ();
#endif
        return 0;
      }
      for (; a < 246; ++a)   // Search Jelly Fish Clue in Line 126 quad Cell positions
      {
        int A = k[h[a][0]] | k[h[a][1]] | k[h[a][2]] | k[h[a][3]],
            K[4],
            X[4] = {-1,-1,-1,-1},
            Z = -1;

        if (!k[h[a][0]] || !k[h[a][1]] || !k[h[a][2]] || !k[h[a][3]] || B[A] != 4)
        {                    // Skip for either no unsolved Cell positions; or no Jelly Fish Clue in Line quad Cell positions
          if (!k[h[a][0]] || B[k[h[a][0]]] > 4)
          {
            int A[6] = {55,34,19, 9, 3, 0};

            a += A[h[a][0]];
          }
          else if (!k[h[a][1]] || B[k[h[a][1]]] > 4)
          {
            int A[7] = {27,20,14, 9, 5, 2, 0};

            a += A[h[a][1]];
          }
          else if (!k[h[a][2]] || B[k[h[a][2]]] > 4)
            a += 7 - h[a][2];
          continue;
        }
        for (; K[++Z] = A & -A; A -= K[Z])
        {                    // Search opposite Line other Cell positions for Jelly Fish Clue
          if (~(k[h[a][4]] | k[h[a][5]] | k[h[a][6]] | k[h[a][7]] | k[h[a][8]]) & K[Z])
            continue;        // Skip for no Jelly Fish Clue in opposite Line other Cell positions
          X[Z] = b[K[Z]] - Y + 8;
          g[l[X[Z]][h[a][4]]] &= ~y;
          g[l[X[Z]][h[a][5]]] &= ~y;
          g[l[X[Z]][h[a][6]]] &= ~y;
          g[l[X[Z]][h[a][7]]] &= ~y;
          g[l[X[Z]][h[a][8]]] &= ~y;
        }                    // Drop Jelly Fish Clue from opposite Line other Cell positions
        if ((X[0] & X[1] & X[2] & X[3]) < 0)
          continue;          // Skip for no Jelly Fish Clue in opposite Lines other Cell positions
#if RJ > 2
        printf ("%d) Found %s wise Jelly Fish Cells r%d%d%d%dc%d%d%d%d Clue %d\n",
          p, Y ? "Column" : "Row", Y ? b[K[0]] : h[a][0] + 1, Y ? b[K[1]] : h[a][1] + 1,
          Y ? b[K[2]] : h[a][2] + 1, Y ? b[K[3]] : h[a][3] + 1, Y ? h[a][0] + 1 : b[K[0]],
          Y ? h[a][1] + 1 : b[K[1]], Y ? h[a][2] + 1 : b[K[2]], Y ? h[a][3] + 1 : b[K[3]], b[y]);
#endif
        if (solve (p))
          return 1;
#if RJ > 2
        printf ("%d) Restore %s wise Jelly Fish Cells r%d%d%d%dc%d%d%d%d Clue %d\n",
          p, Y ? "Column" : "Row", Y ? b[K[0]] : h[a][0] + 1, Y ? b[K[1]] : h[a][1] + 1,
          Y ? b[K[2]] : h[a][2] + 1, Y ? b[K[3]] : h[a][3] + 1, Y ? h[a][0] + 1 : b[K[0]],
          Y ? h[a][1] + 1 : b[K[1]], Y ? h[a][2] + 1 : b[K[2]], Y ? h[a][3] + 1 : b[K[3]], b[y]);
#endif
        for (Z = 0; Z < 4; ++Z)
        {                    // Restore Jelly Fish Clue to opposite Lines other Cell positions
          if (X[Z] < 0)
            continue;        // Skip for no Jelly Fish Clue in opposite Line other Cell positions
          g[l[X[Z]][h[a][4]]] |= k[h[a][4]] & K[Z] ? y : 0;
          g[l[X[Z]][h[a][5]]] |= k[h[a][5]] & K[Z] ? y : 0;
          g[l[X[Z]][h[a][6]]] |= k[h[a][6]] & K[Z] ? y : 0;
          g[l[X[Z]][h[a][7]]] |= k[h[a][7]] & K[Z] ? y : 0;
          g[l[X[Z]][h[a][8]]] |= k[h[a][8]] & K[Z] ? y : 0;
        }
#if RJ > 3
        prn ();
#endif
        return 0;
      }
    }
  for (Y = 0; Y < 10; Y += 9)// Search Skyscraper and Grouped Skyscraper Line wise
    for (y = 1; y < 257; y <<= 1)
                             // Search Skyscraper and Grouped Skyscraper digit wise
      for (a = Y; a < Y + 6; ++a)
      {                      // Search first Strong Link within first and second chutes
        int X[7] = {0},      // First and second Strong Link Base and Cover Cell positions; and check for Grouped Cover Cell positions
            A;

        if ((X[6] = !(g[l[a][0]] & y) + !(g[l[a][1]] & y) + !(g[l[a][2]] & y)) == 2)
          X[0] = 1;          // Found first Strong Link Base Cell position
        else if (X[6] < 2)
          X[0] = X[2] = 1;   // Found first Strong Link Grouped Cover Cell positions
        if ((X[6] = !(g[l[a][3]] & y) + !(g[l[a][4]] & y) + !(g[l[a][5]] & y)) == 2)
          X[X[0]] = 2;       // Found first Strong Link either one Cover or Base Cell position
        else if (X[6] < 2)
        {                    // Found first Strong Link Grouped Cover Cell positions
          if (X[2])
            continue;        // Skip for Grouped Cover Cell positions already found
          X[X[0]] = X[2] = 2;
        }
        if (!X[0])
          continue;          // Skip for no first Strong Link Cell position
        if ((X[6] = !(g[l[a][6]] & y) + !(g[l[a][7]] & y) + !(g[l[a][8]] & y)) == 2)
        {                    // Found first Strong Link one Cover Cell position
          if (X[1])
            continue;        // Skip for first Strong Link Base and Cover Cell positions already found
          X[1] = 4;
        }
        else if (X[6] < 2)
        {                    // Found first Strong Link Grouped Cover Cell positions
          if (X[1] || X[2])
            continue;        // Skip for either first Strong Link Base and Cover Cell positions already found; or Grouped Cover Cell positions already found
          X[1] = X[2] = 4;
        }
        if (!X[1])
          continue;          // Skip for no first Strong Link Base and Cover Cell positions
        for (A = Y + (a < Y + 3 ? 3 : 6); A < Y + 9; ++A)
        {                    // Search second Strong Link within second and third chutes
          X[3] = X[4] = 0;
          X[5] = X[2];
          if ((X[6] = !(g[l[A][0]] & y) + !(g[l[A][1]] & y) + !(g[l[A][2]] & y)) == 2)
          {                  // Found second Strong Link Base Cell position
            if (~X[0] & 1)
              continue;      // Skip for first Strong Link Cell positions not in first mini-Line
            X[3] = 1;
          }
          else if (X[6] < 2)
          {                  // Found second Strong Link Grouped Cover Cell positions
            if (X[5] || ~X[0] & 1)
              continue;      // Skip for either Grouped Strong Link Cell positions already found; or first Strong Link Cell position not in first mini-Line
            X[3] = X[5] = 1;
          }
          if ((X[6] = !(g[l[A][3]] & y) + !(g[l[A][4]] & y) + !(g[l[A][5]] & y)) == 2)
          {                  // Found second Strong Link either one Cover or Base Cell position
            if (~(X[0] | X[1]) & 2)
              continue;      // Skip for no first Strong Link Cell positions in second mini-Line
            X[3 + X[3]] = 2;
          }
          else if (X[6] < 2)
          {                  // Found second Strong Link Grouped Cover Cell positions
            if (X[5] || ~(X[0] | X[1]) & 2)
              continue;      // Skip for either Grouped Cover Cell positions already found; or first Strong Link Cell positions not in second mini-Line
            X[3 + X[3]] = X[5] = 2;
          }
          if (!X[3])
            continue;        // Skip for no second Strong Link Cell position
          if ((X[6] = !(g[l[A][6]] & y) + !(g[l[A][7]] & y) + !(g[l[A][8]] & y)) == 2)
          {                  // Found second Strong Link either one Cover or Base Cell position
            if (X[4] || ~X[1] & 4)
              continue;      // Skip for either second Strong Link Base and Cover Cell positions already found; or first Strong Link Cover Cell positions not in third mini-Line
            X[4] = 4;
          }
          else if (X[6] < 2)
          {                  // Found second Strong Link Grouped Cover Cell positions
            if (X[4] || X[5] || ~(X[0] | X[1]) & 4)
              continue;      // Skip for either second Strong Link Base and Cover Cell positions already found; or Grouped Cover Cell positions already found; or first Strong Link Cover Cell positions not in third mini-Line
            X[4] = X[5] = 4;
          }
          if (!X[4])
            continue;        // Skip for no second Strong Link Base and Cover Cell positions
          X[6] = 0;          // Base Cell positions
          if ((X[0] & 1) && (!(g[l[a][0]] & y) | (!(g[l[a][1]] & y) << 1) | (!(g[l[a][2]] & y) << 2)) ==
            (!(g[l[A][0]] & y) | (!(g[l[A][1]] & y) << 1) | (!(g[l[A][2]] & y) << 2)))
            X[6] = 1;
          if (((X[0] | X[1]) & 2) && (!(g[l[a][3]] & y) | (!(g[l[a][4]] & y) << 1) | (!(g[l[a][5]] & y) << 2)) ==
            (!(g[l[A][3]] & y) | (!(g[l[A][4]] & y) << 1) | (!(g[l[A][5]] & y) << 2)))
            X[6] |= 2;
          if ((X[1] & 4) && (!(g[l[a][6]] & y) | (!(g[l[a][7]] & y) << 1) | (!(g[l[a][8]] & y) << 2)) ==
            (!(g[l[A][6]] & y) | (!(g[l[A][7]] & y) << 1) | (!(g[l[A][8]] & y) << 2)))
            X[6] |= 4;
          if (B[X[6]] != 1)
            continue;        // Skip for neither Skyscraper nor Grouped Skyscraper
          int K[12] = {-1,-1,-1,-1,
                      l[a][b[X[6]] * 3 - (g[l[a][b[X[6]] * 3 - 3]] & y ? 3 : g[l[a][b[X[6]] * 3 - 2]] & y ? 2 : 1)],
                      l[A][b[X[6]] * 3 - (g[l[A][b[X[6]] * 3 - 3]] & y ? 3 : g[l[A][b[X[6]] * 3 - 2]] & y ? 2 : 1)]},
              k[4] = {0};    // Backup Skyscraper and Grouped Skyscraper exclusion Cell positions

          X[6] = b[X[X[0] == X[6]]] * 3;
                             // Cover Cell positions
          K[6] = g[l[a][X[6] - 3]] & y ? l[a][X[6] - 3] : -1;
          K[7] = g[l[a][X[6] - 2]] & y ? l[a][X[6] - 2] : -1;
          K[8] = g[l[a][X[6] - 1]] & y ? l[a][X[6] - 1] : -1;
          K[9] = g[l[A][X[6] - 3]] & y ? l[A][X[6] - 3] : -1;
          K[10] = g[l[A][X[6] - 2]] & y ? l[A][X[6] - 2] : -1;
          K[11] = g[l[A][X[6] - 1]] & y ? l[A][X[6] - 1] : -1;
          if (!X[2])
          {                  // Found first Strong Link one Cover Cell position
            X[6] = K[K[6] + 1 ? 6 : K[7] + 1 ? 7 : 8] - K[4] + K[5];
            k[0] = g[K[0] = w[X[6]][W[3][!Y]]];
            k[1] = g[K[1] = w[X[6]][W[4][!Y]]];
          }
          if (X[2] || !X[5])
          {                  // Found second Strong Link one Cover Cell position
            X[6] = K[K[9] + 1 ? 9 : K[10] + 1 ? 10 : 11] - K[5] + K[4];
            k[2] = g[K[2] = w[X[6]][W[3][!Y]]];
            k[3] = g[K[3] = w[X[6]][W[4][!Y]]];
          }
          if (~(k[0] | k[1] | k[2] | k[3]) & y)
            continue;        // Skip for no Skyscraper and Grouped Skyscraper digit in exclusion Cell positions
          if (!X[2])
          {
            g[K[0]] &= ~y;
            g[K[1]] &= ~y;
          }
          if (X[2] || !X[5])
          {
            g[K[2]] &= ~y;
            g[K[3]] &= ~y;
          }
#if RJ > 2
          printf ("%d) Found%sSkyscraper %ss %d %d Base Cells %d %d Cover Cells",
            p, X[5] ? " Grouped " : " ", Y ? "Column" : "Row", a - Y + 1, A - Y + 1,
            K[4], K[5]);
          if (K[6] + 1)
            printf (" %d", K[6]);
          if (K[7] + 1)
            printf (" %d", K[7]);
          if (K[8] + 1)
            printf (" %d", K[8]);
          if (K[9] + 1)
            printf (" %d", K[9]);
          if (K[10] + 1)
            printf (" %d", K[10]);
          if (K[11] + 1)
            printf (" %d", K[11]);
          printf (" drop Clue %d from Cells", b[y]);
          if (!X[2])
            printf (" %d %d", K[0], K[1]);
          if (X[2] || !X[5])
            printf (" %d %d", K[2], K[3]);
          printf ("\n");
#endif
          if (solve (p))
            return 1;
#if RJ > 2
          printf ("%d) Restore%sSkyscraper %ss %d %d Base Cells %d %d Cover Cells",
            p, X[5] ? " Grouped " : " ", Y ? "Column" : "Row", a - Y + 1, A - Y + 1,
            K[4], K[5]);
          if (K[6] + 1)
            printf (" %d", K[6]);
          if (K[7] + 1)
            printf (" %d", K[7]);
          if (K[8] + 1)
            printf (" %d", K[8]);
          if (K[9] + 1)
            printf (" %d", K[9]);
          if (K[10] + 1)
            printf (" %d", K[10]);
          if (K[11] + 1)
            printf (" %d", K[11]);
          printf (" add Clue %d to Cells", b[y]);
          if (!X[2])
            printf (" %d %d", K[0], K[1]);
          if (X[2] || !X[5])
            printf (" %d %d", K[2], K[3]);
          printf ("\n");
#endif
          if (!X[2])
          {
            g[K[0]] = k[0];
            g[K[1]] = k[1];
          }
          if (X[2] || !X[5])
          {
            g[K[2]] = k[2];
            g[K[3]] = k[3];
          }
#if RJ > 3
          prn ();
#endif
          return 0;          // Restore Skyscraper and Grouped Skyscraper digit to excluding Cell positions
        }
      }
  for (a = 0; a < 81; ++a)   // Search 2-String Kite and Grouped 2-String Kite Grid wise
  {
    if (!(y = ~g[a] & (g[w[a][6]] | g[w[a][7]]) & (g[w[a][12]] | g[w[a][13]])))
      continue;              // Skip for either digit in ERI Cell; or not in mini-Row or mini-Column Cells
    int K[3];

    for (; Y = y & -y; y -= Y)
    {                        // Search 2-String Kite and Grouped 2-String Kite digit wise
      if (B[K[0] = !(g[w[a][0]] & Y) | (!(g[w[a][1]] & Y) << 1) | (!(g[w[a][2]] & Y) << 2) |
        (!(g[w[a][3]] & Y) << 3) | (!(g[w[a][4]] & Y) << 4) | (!(g[w[a][5]] & Y) << 5)] != 5 ||
        B[K[1] = !(g[w[a][14]] & Y) | (!(g[w[a][15]] & Y) << 1) | (!(g[w[a][16]] & Y) << 2) |
        (!(g[w[a][17]] & Y) << 3) | (!(g[w[a][18]] & Y) << 4) | (!(g[w[a][19]] & Y) << 5)] != 5 ||
        !(g[K[2] = w[a][b[~K[0] & 63] - 1] - a + w[a][13 + b[~K[1] & 63]]] & Y))
        continue;            // Skip for not digit in either five Row Cells; or five Column Cells; or no exclution
      g[K[2]] &= ~Y;         // Drop digit from exclusion Cell
#if RJ > 2
      printf ("%d) Found%s2-String Kite Strong Link Row %d between Cell",
        p, ((g[w[a][6]] & g[w[a][7]]) | (g[w[a][12]] & g[w[a][13]])) & Y ? " Grouped " : " ",
        b[(w[a][20] >> 18) & 511]);
      if (g[w[a][6]] & g[w[a][7]] & Y)
        printf ("s %d %d", w[a][6], w[a][7]);
      else
        printf (" %d", g[w[a][6]] & Y ? w[a][6] : w[a][7]);
      printf (" and Cell %d Column %d between Cell",
        w[a][b[~K[0] & 63] - 1], b[w[a][20] & 511]);
      if (g[w[a][12]] & g[w[a][13]] & Y)
        printf ("s %d %d", w[a][12], w[a][13]);
      else
        printf (" %d", g[w[a][12]] & Y ? w[a][12] : w[a][13]);
      printf (" and Cell %d drop Clue %d from Cell %d\n",
        w[a][13 + b[~K[1] & 63]], b[Y], K[2]);
#endif
      if (solve (p))
        return 1;
#if RJ > 2
      printf ("%d) Restore%s2-String Kite Strong Link Row %d between Cell",
        p, ((g[w[a][6]] & g[w[a][7]]) | (g[w[a][12]] & g[w[a][13]])) & Y ? " Grouped " : " ",
        b[(w[a][20] >> 18) & 511]);
      if (g[w[a][6]] & g[w[a][7]] & Y)
        printf ("s %d %d", w[a][6], w[a][7]);
      else
        printf (" %d", g[w[a][6]] & Y ? w[a][6] : w[a][7]);
      printf (" and Cell %d Column %d between Cell",
        w[a][b[~K[0] & 63] - 1], b[w[a][20] & 511]);
      if (g[w[a][12]] & g[w[a][13]] & Y)
        printf ("s %d %d", w[a][12], w[a][13]);
      else
        printf (" %d", g[w[a][12]] & Y ? w[a][12] : w[a][13]);
      printf (" and %d add Clue %d to Cell %d\n",
        w[a][13 + K[1]], b[Y], K[2]);
#endif
      g[K[2]] |= Y;
#if RJ > 3
      prn ();
#endif
      return 0;              // Restore 2-String Kite and Grouped 2-String Kite digit to excluding Cell position
    }
  }
  for (a = 0; a < 81; ++a)   // Search Empty Rectangle Intersection Cell position grid wise
  {
    int K[8] = {(g[a] | g[w[a][6]] | g[w[a][7]]) & (g[a] | g[w[a][12]] | g[w[a][13]]) &
               ~(g[w[a][8]] | g[w[a][9]] | g[w[a][10]] | g[w[a][11]])};
                             // Assign ERI Cell Clues
    for (; K[1] = K[0] & -K[0]; K[0] -= K[1])
                             // Search Strong Link ERI digit wise
      for (y = 0; y < 2; ++y)// Search Strong Link Line wise
        for (Y = W[1][!y]; Y < W[2][!y]; ++Y)
        {                    // Search Strong Link first Cell position Line wise
          if ((g[K[2] = w[a][Y]] & ~(g[w[K[2]][W[3][y]]] | g[w[K[2]][W[4][y]]]) & K[1]) &&
                             // Check ERI digit either in Strong Link first Cell Clues; and not in mini-Line Cells Clues; and
            B[K[3] = !(g[w[K[2]][W[1][y]]] & K[1]) | (!(g[w[K[2]][W[1][y] + 1]] & K[1]) << 1) |
            (!(g[w[K[2]][W[1][y] + 2]] & K[1]) << 2) | (!(g[w[K[2]][W[1][y] + 3]] & K[1]) << 3) |
            (!(g[w[K[2]][W[1][y] + 4]] & K[1]) << 4) | (!(g[w[K[2]][W[1][y] + 5]] & K[1]) << 5)] == 5)
          {                  // No ERI digit in five Line Cell positions
            K[4] = W[b[~K[3] & 63] < 4 ? 5 : 1][y];
            K[5] = W[Y < W[5][!y] ? 5 : 1][!y];
            K[6] = w[K[2]][W[1][y] + b[~K[3] & 63] - 1];
            if ((g[K[7] = w[a][W[1][y] + b[~K[3] & 63] - 1]] | g[w[K[7]][6]] | g[w[K[7]][7]]) &
              (g[K[7]] | g[w[K[7]][12]] | g[w[K[7]][13]]) &
              ~(g[w[K[7]][8]] | g[w[K[7]][9]] | g[w[K[7]][10]] | g[w[K[7]][11]]) &
                             // Check Dual Linked Empty Rectangle Intersection Cell Clues; and
              (g[K[7]] | g[w[K[7]][K[5]]] | g[w[K[7]][K[5] + 1]] | g[w[K[7]][K[5] + 2]] |
              g[a] | g[w[a][K[4]]] | g[w[a][K[4] + 1]] | g[w[a][K[4] + 2]] |
              g[w[a][K[5]]] | g[w[a][K[5] + 1]] | g[w[a][K[5] + 2]] |
              g[w[K[2]][W[3][!y]]] | g[w[K[2]][W[4][!y]]] |
              g[w[K[6]][W[3][!y]]] | g[w[K[6]][W[4][!y]]]) & K[1])
            {                // Dual Linked Empty Rectangle exclusions
              int k[16] = {g[K[7]], g[w[K[7]][K[5]]], g[w[K[7]][K[5] + 1]], g[w[K[7]][K[5] + 2]],
                          g[a], g[w[a][K[4]]], g[w[a][K[4] + 1]], g[w[a][K[4] + 2]],
                          g[w[a][K[5]]], g[w[a][K[5] + 1]], g[w[a][K[5] + 2]],
                          g[w[K[2]][W[3][!y]]], g[w[K[2]][W[4][!y]]],
                          g[w[K[6]][W[3][!y]]], g[w[K[6]][W[4][!y]]]};
                             // Backup Dual Linked Empty Rectangle exclusion Cells Clues and drop ERI digit
              g[K[7]] &= ~K[1];
              g[w[K[7]][K[5]]] &= ~K[1];
              g[w[K[7]][K[5] + 1]] &= ~K[1];
              g[w[K[7]][K[5] + 2]] &= ~K[1];
              g[a] &= ~K[1];
              g[w[a][K[4]]] &= ~K[1];
              g[w[a][K[4] + 1]] &= ~K[1];
              g[w[a][K[4] + 2]] &= ~K[1];
              g[w[a][K[5]]] &= ~K[1];
              g[w[a][K[5] + 1]] &= ~K[1];
              g[w[a][K[5] + 2]] &= ~K[1];
              g[w[K[2]][W[3][!y]]] &= ~K[1];
              g[w[K[2]][W[4][!y]]] &= ~K[1];
              g[w[K[6]][W[3][!y]]] &= ~K[1];
              g[w[K[6]][W[4][!y]]] &= ~K[1];
#if RJ > 2
              printf ("%d) Found Dual Linked Empty Rectangle Intersection Cells %d %d Strong Link %s %d between Cell %d and Cell %d drop Clue %d from Cells %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n",
                p, a, K[7], y ? "Column" : "Row", b[(y ? w[K[2]][20] : w[K[2]][20] >> 18) & 511],
                K[2], w[K[2]][W[1][y] + b[~K[3] & 63] - 1], b[K[1]],
                K[7], w[K[7]][K[5]], w[K[7]][K[5] + 1], w[K[7]][K[5] + 2],
                a, w[a][K[4]], w[a][K[4] + 1], w[a][K[4] + 2],
                w[a][K[5]], w[a][K[5] + 1], w[a][K[5] + 2], w[K[2]][W[3][!y]],
                w[K[2]][W[4][!y]], w[K[6]][W[3][!y]], w[K[6]][W[4][!y]]);
#endif
              if (solve (p))
                return 1;
#if RJ > 2
              printf ("%d) Restore Dual Linked Empty Rectangle Intersection Cells %d %d Strong Link %s %d between Cell %d and Cell %d add Clue %d to Cells %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n",
                p, a, K[7], y ? "Column" : "Row", b[(y ? w[K[2]][20] : w[K[2]][20] >> 18) & 511],
                K[2], w[K[2]][W[1][y] + b[~K[3] & 63] - 1], b[K[1]],
                K[7], w[K[7]][K[5]], w[K[7]][K[5] + 1], w[K[7]][K[5] + 2],
                a, w[a][K[4]], w[a][K[4] + 1], w[a][K[4] + 2],
                w[a][K[5]], w[a][K[5] + 1], w[a][K[5] + 2], w[K[2]][W[3][!y]],
                w[K[2]][W[4][!y]], w[K[6]][W[3][!y]], w[K[6]][W[4][!y]]);
#endif
              g[K[7]] = k[0];
              g[w[K[7]][K[5]]] = k[1];
              g[w[K[7]][K[5] + 1]] = k[2];
              g[w[K[7]][K[5] + 2]] = k[3];
              g[a] = k[4];
              g[w[a][K[4]]] = k[5];
              g[w[a][K[4] + 1]] = k[6];
              g[w[a][K[4] + 2]] = k[7];
              g[w[a][K[5]]] = k[8];
              g[w[a][K[5] + 1]] = k[9];
              g[w[a][K[5] + 2]] = k[10];
              g[w[K[2]][W[3][!y]]] = k[11];
              g[w[K[2]][W[4][!y]]] = k[12];
              g[w[K[6]][W[3][!y]]] = k[13];
              g[w[K[6]][W[4][!y]]] = k[14];
#if RJ > 3
              prn ();
#endif
              return 0;      // Restore Dual Linked Empty Rectangle exclusion Cell Clues
            }
            if (!(g[K[7]] & K[1]))
              continue;      // Skip for no Empty Rectangle exclusion
#if RJ > 2
            printf ("%d) Found Empty Rectangle Intersection Cell %d Strong Link %s %d between Cell %d and Cell %d drop Clue %d from Cell %d\n",
              p, a, y ? "Column" : "Row", b[(y ? w[K[2]][20] : w[K[2]][20] >> 18) & 511],
              K[2], w[K[2]][W[1][y] + b[~K[3] & 63] - 1], b[K[1]], K[7]);
            if (!(g[w[K[7]][W[3][!y]]] & K[1]) + !(g[w[K[7]][W[4][!y]]] & K[1]) +
              !(g[w[K[7]][W[1][!y]]] & K[1]) + !(g[w[K[7]][W[1][!y] + 1]] & K[1]) +
              !(g[w[K[7]][W[1][!y] + 2]] & K[1]) + !(g[w[K[7]][W[1][!y] + 3]] & K[1]) +
              !(g[w[K[7]][W[1][!y] + 4]] & K[1]) + !(g[w[K[7]][W[1][!y] + 5]] & K[1]) == 7)
            {                // Check one ERI digit in second Line Cell positions
              printf ("%d) Found Empty Rectangle Intersection Cell %d Strong Link %s %d between Cell %d and Cell %d drop Clue %d from Cell %d\n",
                p, a, y ? "Row" : "Column", b[(y ? w[K[7]][20] : w[K[7]][20] >> 18) & 511],
                K[7], w[K[2]][W[1][y] + b[~K[3] & 63] - 1], b[K[1]], K[2]);
              g[K[2]] &= ~K[1];
            }                // Drop ERI Strong Link digit from Line Cell position
#endif
            g[K[7]] &= ~K[1];// Drop ERI Strong Link digit from Line Cell position
            if (solve (p))
              return 1;
#if RJ > 2
            printf ("%d) Restore Empty Rectangle Intersection Cell %d Strong Link %s %d between Cell %d and Cell %d add Clue %d to Cell %d\n",
              p, a, y ? "Column" : "Row", b[(y ? w[K[2]][20] : w[K[2]][20] >> 18) & 511],
              K[2], w[K[2]][W[1][y] + b[~K[3] & 63] - 1], b[K[1]], K[7]);
            if (!(g[w[K[7]][W[3][!y]]] & K[1]) + !(g[w[K[7]][W[4][!y]]] & K[1]) +
              !(g[w[K[7]][W[1][!y]]] & K[1]) + !(g[w[K[7]][W[1][!y] + 1]] & K[1]) +
              !(g[w[K[7]][W[1][!y] + 2]] & K[1]) + !(g[w[K[7]][W[1][!y] + 3]] & K[1]) +
              !(g[w[K[7]][W[1][!y] + 4]] & K[1]) + !(g[w[K[7]][W[1][!y] + 5]] & K[1]) == 7)
            {                // Check one ERI digit in second Line Cell positions
              printf ("%d) Restore Empty Rectangle Intersection Cell %d Strong Link %s %d between Cell %d and Cell %d add Clue %d to Cell %d\n",
                p, a, y ? "Row" : "Column", b[(y ? w[K[7]][20] : w[K[7]][20] >> 18) & 511],
                K[7], w[K[2]][W[1][y] + b[~K[3] & 63] - 1], b[K[1]], K[2]);
              g[K[2]] |= K[1];
            }                // Restore ERI Strong Link digit to Line Cell position
#endif
            g[K[7]] |= K[1];
#if RJ > 3
            prn ();
#endif
            return 0;        // Restore ERI Strong Link digit to Line Cell position
          }
          if (!((g[K[2]] | g[w[K[2]][6]] | g[w[K[2]][7]]) &
            (g[K[2]] | g[w[K[2]][12]] | g[w[K[2]][13]]) &
            ~(g[w[K[2]][8]] | g[w[K[2]][9]] | g[w[K[2]][10]] | g[w[K[2]][11]]) & K[1]))
            continue;        // Skip for ERI digit not in Strong Link first ERI Cells
          for (K[3] = W[1][y]; K[3] < W[2][y]; ++K[3])
            if ((g[K[4] = w[K[2]][K[3]]] | g[w[K[4]][6]] | g[w[K[4]][7]]) &
              (g[K[4]] | g[w[K[4]][12]] | g[w[K[4]][13]]) &
              ~(g[w[K[4]][8]] | g[w[K[4]][9]] | g[w[K[4]][10]] | g[w[K[4]][11]]) & K[1])
              break;         // Check ERI digit in Strong Link second ERI Cells
          if (K[3] == W[2][y])
            continue;        // Skip for ERI digit not in Strong Link second ERI Cells
          K[5] = W[Y < W[5][!y] ? 5 : 1][!y];
          K[6] = W[K[3] < W[5][y] ? 5 : 1][y];
          if ((g[K[7] = a - K[2] + K[4]] | g[w[K[7]][6]] | g[w[K[7]][7]]) &
            (g[K[7]] | g[w[K[7]][12]] | g[w[K[7]][13]]) &
            ~(g[w[K[7]][8]] | g[w[K[7]][9]] | g[w[K[7]][10]] | g[w[K[7]][11]]) &
                             // Check Dual Linked Grouped Empty Rectangle Intersection Cell Clues; and
            (g[a] | g[w[a][K[5]]] | g[w[a][K[5] + 1]] | g[w[a][K[5] + 2]] |
            g[K[2]] | g[w[K[2]][K[6]]] | g[w[K[2]][K[6] + 1]] | g[w[K[2]][K[6] + 2]] |
            g[K[4]] | g[w[K[7]][K[5]]] | g[w[K[7]][K[5] + 1]] | g[w[K[7]][K[5] + 2]] |
            g[K[7]] | g[w[a][K[6]]] | g[w[a][K[6] + 1]] | g[w[a][K[6] + 2]]) & K[1])
          {                  // Dual Linked Grouped Empty Rectangle Intersection exclusions
            int k[17] = {g[a], g[w[a][K[5]]], g[w[a][K[5] + 1]], g[w[a][K[5] + 2]],
                        g[K[2]], g[w[K[2]][K[6]]], g[w[K[2]][K[6] + 1]], g[w[K[2]][K[6] + 2]],
                        g[K[4]], g[w[K[7]][K[5]]], g[w[K[7]][K[5] + 1]], g[w[K[7]][K[5] + 2]],
                        g[K[7]], g[w[a][K[6]]], g[w[a][K[6] + 1]], g[w[a][K[6] + 2]]};
                             // Backup Dual Linked Grouped Empty Rectangle exclusion Cells Clues and drop ERI digit
            g[a] &= ~K[1];
            g[w[a][K[5]]] &= ~K[1];
            g[w[a][K[5] + 1]] &= ~K[1];
            g[w[a][K[5] + 2]] &= ~K[1];
            g[K[2]] &= ~K[1];
            g[w[K[2]][K[6]]] &= ~K[1];
            g[w[K[2]][K[6] + 1]] &= ~K[1];
            g[w[K[2]][K[6] + 2]] &= ~K[1];
            g[K[4]] &= ~K[1];
            g[w[K[7]][K[5]]] &= ~K[1];
            g[w[K[7]][K[5] + 1]] &= ~K[1];
            g[w[K[7]][K[5] + 2]] &= ~K[1];
            g[K[7]] &= ~K[1];
            g[w[a][K[6]]] &= ~K[1];
            g[w[a][K[6] + 1]] &= ~K[1];
            g[w[a][K[6] + 2]] &= ~K[1];
#if RJ > 2
            printf ("%d) Found Dual Linked Grouped Empty Rectangle Intersection Cells %d %d Strong Link %s %d between ERI Cell %d and ERI Cell %d drop Clue %d from Cells %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n",
              p, a, K[7], y ? "Column" : "Row", b[(y ? w[K[2]][20] : w[K[2]][20] >> 18) & 511],
              K[2], K[4], b[K[1]], a, w[a][K[5]], w[a][K[5] + 1], w[a][K[5] + 2],
              K[2], w[K[2]][K[6]], w[K[2]][K[6] + 1], w[K[2]][K[6] + 2],
              K[4], w[K[7]][K[5]], w[K[7]][K[5] + 1], w[K[7]][K[5] + 2],
              K[7], w[a][K[6]], w[a][K[6] + 1], w[a][K[6] + 2]);
#endif
            if (solve (p))
              return 1;
#if RJ > 2
            printf ("%d) Restore Dual Linked Grouped Empty Rectangle Intersection Cells %d %d Strong Link %s %d between ERI Cell %d and ERI Cell %d add Clue %d to Cells %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n",
              p, a, K[7], y ? "Column" : "Row", b[(y ? w[K[2]][20] : w[K[2]][20] >> 18) & 511],
              K[2], K[4], b[K[1]], a, w[a][K[5]], w[a][K[5] + 1], w[a][K[5] + 2],
              K[2], w[K[2]][K[6]], w[K[2]][K[6] + 1], w[K[2]][K[6] + 2],
              K[4], w[K[7]][K[5]], w[K[7]][K[5] + 1], w[K[7]][K[5] + 2],
              K[7], w[a][K[6]], w[a][K[6] + 1], w[a][K[6] + 2]);
#endif
            g[a] = k[0];
            g[w[a][K[5]]] = k[1];
            g[w[a][K[5] + 1]] = k[2];
            g[w[a][K[5] + 2]] = k[3];
            g[K[2]] = k[4];
            g[w[K[2]][K[6]]] = k[5];
            g[w[K[2]][K[6] + 1]] = k[6];
            g[w[K[2]][K[6] + 2]] = k[7];
            g[K[4]] = k[8];
            g[w[K[7]][K[5]]] = k[9];
            g[w[K[7]][K[5] + 1]] = k[10];
            g[w[K[7]][K[5] + 2]] = k[11];
            g[K[7]] = k[12];
            g[w[a][K[6]]] = k[13];
            g[w[a][K[6] + 1]] = k[14];
            g[w[a][K[6] + 2]] = k[15];
#if RJ > 3
            prn ();
#endif
            return 0;        // Restore Dual Linked Grouped Empty Rectangle eliminaton Cell positions
          }
          if (!(g[K[7]] & K[1]))
            continue;        // Skip for no Grouped Empty Rectangle exclusion
          g[K[7]] &= ~K[1];  // Drop ERI Strong Link digit from Line Cell position
#if RJ > 2
          printf ("%d) Found Grouped Empty Rectangle Intersection Cell %d Strong Link %s %d between ERI Cell %d and ERI Cell %d drop Clue %d from Cell %d\n",
            p, a, y ? "Column" : "Row", b[(y ? w[K[2]][20] : w[K[2]][20] >> 18) & 511],
            K[2], K[4], b[K[1]], K[7]);
#endif
          if (solve (p))
            return 1;
#if RJ > 2
          printf ("%d) Restore Grouped Empty Rectangle Intersection Cell %d Strong Link %s %d between ERI Cell %d and ERI Cell %d add Clue %d to Cell %d\n",
            p, a, y ? "Column" : "Row", b[(y ? w[K[2]][20] : w[K[2]][20] >> 18) & 511],
            K[2], K[4], b[K[1]], K[7]);
#endif
          g[K[7]] |= K[1];
#if RJ > 3
          prn ();
#endif
          return 0;          // Restore ERI Strong Link digit to Line Cell position
        }
  }
  for (a = p; a < q; ++a)    // Search XY-Wings Type 1 and XY-Wings Type 1 Transport unsolved Cell position wise
  {
    if (B[g[r[a]]] > 2 ||    // Skip for unsolved Cell Clues more than two digits; or
      !(g[w[r[a]][0]] | g[w[r[a]][1]] | g[w[r[a]][2]] |
      g[w[r[a]][3]] | g[w[r[a]][4]] | g[w[r[a]][5]]) ||
      !(g[w[r[a]][14]] | g[w[r[a]][15]] | g[w[r[a]][16]] |
      g[w[r[a]][17]] | g[w[r[a]][18]] | g[w[r[a]][19]]))
      continue;              // No unsolved Cell position in either Apex Row or Column
    int K[9] = {r[a], 0};    // Assign Apex Cell position

    for (; K[1] < 6; ++K[1]) // Search first Wing Cell position Row wise
    {
      if (B[g[K[2] = w[K[0]][K[1]]]] != 2 || B[g[K[0]] | g[K[2]]] != 3)
        continue;            // Skip for either Row Wing Cell Clues not two digits; or Apex and Row Wing Cells Clues not three digits
      for (K[3] = 14; K[3] < 20; ++K[3])
      {                      // Search second Wing Cell position Column wise
        if (B[g[K[4] = w[K[0]][K[3]]]] != 2 || B[g[K[0]] | g[K[4]]] != 3 ||
                             // Skip for either Column Wing Cell Clues not two digits; or Apex and Column Wing Cells Clues not three digits; or
          B[K[5] = g[K[2]] & g[K[4]]] != 1 ||
                             // Wing Cells common Clue not one digit; or
          (g[K[0]] & K[5]))  // Wing Cells common Clue in Apex Cell Clues
          continue;
        if (g[K[6] = K[2] - K[0] + K[4]] & K[5])
        {                    // Check XY-Wings Type 1 exclusion Cell Clues
          g[K[6]] &= ~K[5];  // Drop Wing Cells common Clue from XY-Wings Type 1 exclusion Cell position
#if RJ > 2
          printf ("%d) Found XY-Wings Type 1 Cells %d %d %d Clues %d drop Clue %d from Cell %d\n",
            p, K[0], K[2], K[4], b[g[K[2]] | g[K[4]]], b[K[5]], K[6]);
#endif
          if (solve (p))
            return 1;
#if RJ > 2
          printf ("%d) Restore XY-Wings Type 1 Cells %d %d %d Clues %d add Clue %d to Cell %d\n",
            p, K[0], K[2], K[4], b[g[K[2]] | g[K[4]]], b[K[5]], K[6]);
#endif
          g[K[6]] |= K[5];   // Restore Wing Cells common Clue to XY-Wings Type 1 exclusion Cell Clues
#if RJ > 3
          prn ();
#endif
          return 0;
        }
                             // XY-Wings Type 1 Transport
        int k[39] = {-1,-1,-1,-1,-1,-1};
#if RJ > 2
        int X[2][4] = {{-1,-1,-1,-1}, {-1,-1,-1,-1}};
#endif

        K[7] = K[1] < 3 ? 3 : 0;
        K[8] = K[3] < 17 ? 17 : 14;
        if ((g[Y = w[K[0]][K[7]]] | g[w[Y][6]] | g[w[Y][7]]) & K[5])
        {                    // Check Wing Cells common Clue in Apex and first Wing common line but not box (01, 05, 09)
          if ((g[w[K[0]][y = 12]] & (g[w[Y][8]] | g[w[Y][9]] | g[w[Y][12]]) &
            ~(g[w[Y][10]] | g[w[Y][11]] | g[w[Y][13]]) & K[5]) ||
            (g[w[K[0]][++y]] & ~(g[w[Y][8]] | g[w[Y][9]] | g[w[Y][12]]) &
            (g[w[Y][10]] | g[w[Y][11]] | g[w[Y][13]]) & K[5]))
          {                  // Check Wing Cells common Clue in one line of box within chute neither Apex and first Wing common line nor box (05, 09)
            k[0] = w[K[0]][y];
#if RJ > 2
            X[0][0] = Y;     // (05, 09)
            X[0][1] = w[Y][6];
            X[0][2] = w[Y][7];
            if (y == 12)     // (09)
            {
              X[1][0] = w[Y][8];
              X[1][1] = w[Y][9];
              X[1][2] = w[Y][12];
            }
            else             // (09)
            {
              X[1][0] = w[Y][10];
              X[1][1] = w[Y][11];
              X[1][2] = w[Y][13];
            }
#endif
          }
          if ((g[Y - K[0] + K[4]] & (g[Y] | g[w[Y][12]] | g[w[Y][13]]) &
            ~(g[w[Y][8]] | g[w[Y][9]] | g[w[Y][10]] | g[w[Y][11]]) & K[5]) ||
            (g[++Y - K[0] + K[4]] & (g[Y] | g[w[Y][12]] | g[w[Y][13]]) &
            ~(g[w[Y][8]] | g[w[Y][9]] | g[w[Y][10]] | g[w[Y][11]]) & K[5]) ||
            (g[++Y - K[0] + K[4]] & (g[Y] | g[w[Y][12]] | g[w[Y][13]]) &
            ~(g[w[Y][8]] | g[w[Y][9]] | g[w[Y][10]] | g[w[Y][11]]) & K[5]))
          {                  // (01, 05)
            k[1] = Y - K[0] + K[4];
#if RJ > 2
            X[0][0] = Y;     // (01, 05)
            X[0][1] = w[Y][6];
            X[0][2] = w[Y][7];
            X[1][1] = -1;    // (05)
            if (~g[w[Y][12]] & K[5])
              X[1][0] = w[Y][13];
            else if (~g[w[Y][13]] & K[5])
              X[1][0] = w[Y][12];
            else
            {                // (01)
              X[1][0] = Y;
              X[1][1] = w[Y][12];
              X[1][2] = w[Y][13];
            }
#endif
          }
        }
if ((k[0] & k[1]) < 0)
{
        if ((g[Y = w[K[0]][K[8]]] | g[w[Y][12]] | g[w[Y][13]]) & K[5])
        {                    // Check Wing Cells common Clue in Apex and second Wing common line but not box (02, 06, 10)
          if ((g[w[K[0]][y = 6]] & (g[w[Y][6]] | g[w[Y][8]] | g[w[Y][10]]) &
            ~(g[w[Y][7]] | g[w[Y][9]] | g[w[Y][11]]) & K[5]) ||
            (g[w[K[0]][++y]] & ~(g[w[Y][6]] | g[w[Y][8]] | g[w[Y][10]]) &
            (g[w[Y][7]] | g[w[Y][9]] | g[w[Y][11]]) & K[5]))
          {                  // Check Wing Cells common Clue in one line of box within chute neither Apex and first Wing common line nor box (06, 10)
            k[0] = w[K[0]][y];
#if RJ > 2
            X[0][0] = Y;     // (06, 10)
            X[0][1] = w[Y][12];
            X[0][2] = w[Y][13];
            X[1][0] = w[Y][y];
            X[1][1] = w[Y][y + 2];
            X[1][2] = w[Y][y + 4];
#endif
          }
          if ((g[Y - K[0] + K[2]] & (g[Y] | g[w[Y][6]] | g[w[Y][7]]) &
            ~(g[w[Y][8]] | g[w[Y][9]] | g[w[Y][10]] | g[w[Y][11]]) & K[5]) ||
            (g[(Y += 9) - K[0] + K[2]] & (g[Y] | g[w[Y][6]] | g[w[Y][7]]) &
            ~(g[w[Y][8]] | g[w[Y][9]] | g[w[Y][10]] | g[w[Y][11]]) & K[5]) ||
            (g[(Y += 9) - K[0] + K[2]] & (g[Y] | g[w[Y][6]] | g[w[Y][7]]) &
            ~(g[w[Y][8]] | g[w[Y][9]] | g[w[Y][10]] | g[w[Y][11]]) & K[5]))
          {                  // (02, 06)
            k[1] = Y - K[0] + K[2];
#if RJ > 2
            X[0][0] = Y;     // (02, 06)
            X[0][1] = w[Y][12];
            X[0][2] = w[Y][13];
            X[1][1] = -1;    // (06)
            if (~g[w[Y][6]] & K[5])
              X[1][0] = w[Y][7];
            else if (~g[w[Y][7]] & K[5])
              X[1][0] = w[Y][6];
            else
            {                // (02)
              X[1][0] = Y;
              X[1][1] = w[Y][6];
              X[1][2] = w[Y][7];
            }
#endif
          }
        }
if ((k[0] & k[1]) < 0)
{
        if ((g[Y = w[K[4]][K[7]]] | g[w[Y][6]] | g[w[Y][7]]) & K[5])
        {                    // Check Wing Cells common Clue in second Wing and exclusion common line but not box (03, 07, 11)
          if ((g[w[K[6]][y = 12]] & (g[w[Y][8]] | g[w[Y][9]] | g[w[Y][12]]) &
            ~(g[w[Y][10]] | g[w[Y][11]] | g[w[Y][13]]) & K[5]) ||
            (g[w[K[6]][++y]] & ~(g[w[Y][8]] | g[w[Y][9]] | g[w[Y][12]]) &
            (g[w[Y][10]] | g[w[Y][11]] | g[w[Y][13]]) & K[5]))
          {                  // Check Wing Cells common Clue in one line of box within chute neither Apex and first Wing common line nor box (07, 11)
            k[0] = w[K[6]][y];
#if RJ > 2
            X[0][0] = Y;     // (07, 11)
            X[0][1] = w[Y][6];
            X[0][2] = w[Y][7];
            if (y == 12)     // (11)
            {
              X[1][0] = w[Y][8];
              X[1][1] = w[Y][9];
              X[1][2] = w[Y][12];
            }
            else             // (11)
            {
              X[1][0] = w[Y][10];
              X[1][1] = w[Y][11];
              X[1][2] = w[Y][13];
            }
#endif
          }
          if ((g[Y - K[4] + K[0]] & (g[Y] | g[w[Y][12]] | g[w[Y][13]]) &
            ~(g[w[Y][8]] | g[w[Y][9]] | g[w[Y][10]] | g[w[Y][11]]) & K[5]) ||
            (g[++Y - K[4] + K[0]] & (g[Y] | g[w[Y][12]] | g[w[Y][13]]) &
            ~(g[w[Y][8]] | g[w[Y][9]] | g[w[Y][10]] | g[w[Y][11]]) & K[5]) ||
            (g[++Y - K[4] + K[0]] & (g[Y] | g[w[Y][12]] | g[w[Y][13]]) &
            ~(g[w[Y][8]] | g[w[Y][9]] | g[w[Y][10]] | g[w[Y][11]]) & K[5]))
          {                  // (03, 07)
            k[1] = Y - K[4] + K[0];
#if RJ > 2
            X[0][0] = Y;     // (03, 07)
            X[0][1] = w[Y][12];
            X[0][2] = w[Y][13];
            X[1][1] = -1;    // (07)
            if (~g[w[Y][6]] & K[5])
              X[1][0] = w[Y][7];
            else if (~g[w[Y][7]] & K[5])
              X[1][0] = w[Y][6];
            else
            {                // (03)
              X[1][0] = Y;
              X[1][1] = w[Y][6];
              X[1][2] = w[Y][7];
            }
#endif
          }
        }
if ((k[0] & k[1]) < 0)
{
        if ((g[Y = w[K[2]][K[8]]] | g[w[Y][12]] | g[w[Y][13]]) & K[5])
        {                    // Check Wing Cells common Clue in first Wing and exclusion common line but not box (04, 08, 12)
          if ((g[w[K[6]][y = 6]] & (g[w[Y][6]] | g[w[Y][8]] | g[w[Y][10]]) &
            ~(g[w[Y][7]] | g[w[Y][9]] | g[w[Y][11]]) & K[5]) ||
            (g[w[K[6]][++y]] & ~(g[w[Y][6]] | g[w[Y][8]] | g[w[Y][10]]) &
            (g[w[Y][7]] | g[w[Y][9]] | g[w[Y][11]]) & K[5]))
          {                   // Check Wing Cells common Clue in one line of box within chute neither Apex and Wing common line nor box (08, 12)
            k[0] = w[K[6]][y];
#if RJ > 2
            X[0][0] = Y;     // (08, 12)
            X[0][1] = w[Y][12];
            X[0][2] = w[Y][13];
            X[1][0] = w[Y][y];
            X[1][1] = w[Y][y + 2];
            X[1][2] = w[Y][y + 4];
#endif
          }
          if ((g[Y - K[2] + K[0]] & (g[Y] | g[w[Y][6]] | g[w[Y][7]]) &
            ~(g[w[Y][8]] | g[w[Y][9]] | g[w[Y][10]] | g[w[Y][11]]) & K[5]) ||
            (g[(Y += 9) - K[2] + K[0]] & (g[Y] | g[w[Y][6]] | g[w[Y][7]]) &
            ~(g[w[Y][8]] | g[w[Y][9]] | g[w[Y][10]] | g[w[Y][11]]) & K[5]) ||
            (g[(Y += 9) - K[2] + K[0]] & (g[Y] | g[w[Y][6]] | g[w[Y][7]]) &
            ~(g[w[Y][8]] | g[w[Y][9]] | g[w[Y][10]] | g[w[Y][11]]) & K[5]))
          {                  // (04, 08)
            k[1] = Y - K[2] + K[0];
#if RJ > 2
            X[0][0] = Y;     // (04, 08)
            X[0][1] = w[Y][6];
            X[0][2] = w[Y][7];
            X[1][1] = -1;    // (08)
            if (~g[w[Y][12]] & K[5])
              X[1][0] = w[Y][13];
            else if (~g[w[Y][13]] & K[5])
              X[1][0] = w[Y][12];
            else
            {                // (04)
              X[1][0] = Y;
              X[1][1] = w[Y][12];
              X[1][2] = w[Y][13];
            }
#endif
          }
        }
}
}
}
        if ((k[0] & k[1]) + 1)
        {
          if (k[0] + 1)
            g[k[0]] &= ~K[5];
          if (k[1] + 1)
            g[k[1]] &= ~K[5];
#if RJ > 2
          printf ("%d) Found XY-Wings Type 1 Transport %s Cells %d %d %d %d Clues %d\nStrong Link Clue %d between Cells %d %d %d and Cell",
            p, (k[0] > -1) & (k[1] < 0) ? "Box" : (k[0] | k[1]) < 0 ? "ERI" : "Reduced ERI",
            K[0], K[2], K[4], K[6], b[g[K[2]] | g[K[4]]], b[K[5]], X[0][0], X[0][1], X[0][2]);
          if (X[1][1] + 1)
            printf ("s %d %d %d", X[1][0], X[1][1], X[1][2]);
          else
            printf (" %d", X[1][0]);
          printf (" drop Clue %d from Cell", b[K[5]]);
          if ((k[0] | k[1]) + 1)
            printf ("s %d %d\n", k[0], k[1]);
          else
            printf (" %d\n", k[0] + k[1] + 1);
#endif
          if (solve (p))
            return 1;
#if RJ > 2
          printf ("%d) Restore XY-Wings Type 1 Transport %s Cells %d %d %d %d Clues %d\nStrong Link between Cells %d %d %d and Cell",
            p, (k[0] > -1) & (k[1] < 0) ? "Box" : (k[0] | k[1]) < 0 ? "ERI" : "Reduced ERI",
            K[0], K[2], K[4], K[6], b[g[K[2]] | g[K[4]]], X[0][0], X[0][1], X[0][2]);
          if (X[1][1] + 1)
            printf ("s %d %d %d", X[1][0], X[1][1], X[1][2]);
          else
            printf (" %d", X[1][0]);
          printf (" add Clue %d to Cell", b[K[5]]);
          if ((k[0] | k[1]) + 1)
            printf ("s %d %d\n", k[0], k[1]);
          else
            printf (" %d\n", k[0] + k[1] + 1);
#endif
          if (k[0] + 1)
            g[k[0]] |= K[5];
          if (k[1] + 1)
            g[k[1]] |= K[5];
#if RJ > 3
          prn ();
#endif
          return 0;
        }
        k[35] = -1;
        if ((g[w[K[2]][8]] | g[w[K[2]][9]] | g[w[K[2]][12]]) & K[5])
        {                    // (13, 17, 21, 25)
#if RJ > 2
          X[0][0] = w[K[2]][8];
          X[0][1] = w[K[2]][9];
          X[0][2] = w[K[2]][12];
#endif
          if ((g[w[K[0]][8]] | g[w[K[0]][9]] | g[w[K[0]][12]]) & K[5])
          {
            if (~(g[Y = w[w[K[0]][12]][K[7]]] | g[w[Y][6]] | g[w[Y][7]]) & K[5])
            {
              if (g[w[K[0]][13]] & K[5])
              {              // (13, 17, 21)
                k[3] = w[K[0]][13];
#if RJ > 2
                X[1][0] = w[K[0]][8];
                X[1][1] = w[K[0]][9];
                X[1][2] = w[K[0]][12];
#endif
              }
              if (g[w[K[0]][12]] & K[5])
              {              // (17)
                if ((~(g[w[K[0]][8]] | g[w[K[0]][9]]) & K[5]) &&
                  (((g[y = w[K[0]][K[8]]] | g[w[y][12]] | g[w[y][13]] |
                  g[w[K[2]][6]] | g[w[K[2]][7]] | g[w[K[2]][10]] |
                  g[w[K[2]][11]] | g[w[K[4]][12]] | g[w[K[4]][13]]) & K[5]) ||
                  ((g[w[K[0]][6]] | g[w[K[0]][7]] | g[w[K[2]][6]] | g[w[K[2]][7]] |
                  g[Y = w[K[0]][K[7]]] | g[w[Y][6]] | g[w[Y][7]]) & g[K[0]] & g[K[2]]) ||
                  ((g[w[K[0]][12]] | g[w[K[0]][13]] | g[w[K[4]][12]] | g[w[K[4]][13]] |
                  g[Y = w[K[0]][K[8]]] | g[w[Y][12]] | g[w[Y][13]]) & g[K[0]] & g[K[4]])))
                {            // (17)
                  k[0] = y;
                  k[1] = w[y][12];
                  k[2] = w[y][13];
                  k[4] = w[K[2]][6];
                  k[6] = w[K[2]][7];
                  k[7] = w[K[2]][10];
                  k[8] = w[K[2]][11];
                  k[9] = w[K[4]][12];
                  k[10] = w[K[4]][13];
#if RJ > 2
                  X[1][0] = w[K[0]][12];
                  X[1][1] = -1;
#endif
                }
              }
              else if (((g[w[K[4]][y = 6]] | g[w[K[4]][8]] | g[w[K[4]][Y = 10]]) &
                g[w[K[0]][8]] & ~g[w[K[0]][9]] & K[5]) ||
                ((g[w[K[4]][++y]] | g[w[K[4]][9]] | g[w[K[4]][++Y]]) &
                ~g[w[K[0]][8]] & g[w[K[0]][9]] & K[5]))
              {              // (21)
                k[0] = w[K[4]][y];
                k[1] = w[K[4]][y + 2];
                k[2] = w[K[4]][Y];
#if RJ > 2
                X[1][0] = w[K[0]][y + 2];
                X[1][1] = -1;
#endif
              }
            }
          }
          else if ((g[y = w[K[4]][K[7]]] & g[Y = w[w[K[0]][12]][K[7]]] &
            ~(g[w[Y][6]] | g[w[Y][7]]) & K[5]) ||
            (g[++y] & g[++Y] & ~(g[w[Y][6]] | g[w[Y][7]]) & K[5]) ||
            (g[++y] & g[++Y] & ~(g[w[Y][6]] | g[w[Y][7]]) & K[5]))
          {                  // (25)
            k[3] = y;
#if RJ > 2
            X[1][0] = Y;
#endif
          }
        }
        else if ((g[y = w[K[0]][K[7]]] | g[w[y][6]] | g[w[y][7]]) &
          g[w[K[0]][12]] & ~(g[w[K[0]][8]] | g[w[K[0]][9]]) &
          (g[Y = w[w[K[0]][12]][K[7]]] | g[w[Y][6]] | g[w[Y][7]]) & K[5])
        {                    // (29)
          k[0] = y;
          k[1] = w[y][6];
          k[2] = w[y][7];
#if RJ > 2
          X[0][0] = Y;
          X[0][1] = w[Y][6];
          X[0][2] = w[Y][7];
          X[1][0] = w[K[0]][12];
#endif
        }
if ((k[2] & k[3]) < 0)
{
        if ((g[w[K[2]][10]] | g[w[K[2]][11]] | g[w[K[2]][13]]) & K[5])
        {                    // (13, 17, 21, 25)
#if RJ > 2
          X[0][0] = w[K[2]][10];
          X[0][1] = w[K[2]][11];
          X[0][2] = w[K[2]][13];
#endif
          if ((g[w[K[0]][10]] | g[w[K[0]][11]] | g[w[K[0]][13]]) & K[5])
          {
            if (~(g[Y = w[w[K[0]][13]][K[7]]] | g[w[Y][6]] | g[w[Y][7]]) & K[5])
            {
              if (g[w[K[0]][12]] & K[5])
              {              // (13, 17, 21)
                k[3] = w[K[0]][12];
#if RJ > 2
                X[1][0] = w[K[0]][10];
                X[1][1] = w[K[0]][11];
                X[1][2] = w[K[0]][13];
#endif
              }
              if (g[w[K[0]][13]] & K[5])
              {              // (17)
                if ((~(g[w[K[0]][10]] | g[w[K[0]][11]]) & K[5]) &&
                  (((g[y = w[K[0]][K[8]]] | g[w[y][12]] | g[w[y][13]] |
                  g[w[K[2]][6]] | g[w[K[2]][7]] | g[w[K[2]][8]] |
                  g[w[K[2]][9]] | g[w[K[4]][12]] | g[w[K[4]][13]]) & K[5]) ||
                  ((g[w[K[0]][6]] | g[w[K[0]][7]] | g[w[K[2]][6]] | g[w[K[2]][7]] |
                  g[Y = w[K[0]][K[7]]] | g[w[Y][6]] | g[w[Y][7]]) & g[K[0]] & g[K[2]]) ||
                  ((g[w[K[0]][12]] | g[w[K[0]][13]] | g[w[K[4]][12]] | g[w[K[4]][13]] |
                  g[Y = w[K[0]][K[8]]] | g[w[Y][12]] | g[w[Y][13]]) & g[K[0]] & g[K[4]])))
                {            // (17)
                  k[0] = y;
                  k[1] = w[y][12];
                  k[2] = w[y][13];
                  k[4] = w[K[2]][6];
                  k[6] = w[K[2]][7];
                  k[7] = w[K[2]][8];
                  k[8] = w[K[2]][9];
                  k[9] = w[K[4]][12];
                  k[10] = w[K[4]][13];
#if RJ > 2
                  X[1][0] = w[K[0]][13];
                  X[1][1] = -1;
#endif
                }
              }
              else if (((g[w[K[4]][y = 6]] | g[w[K[4]][8]] | g[w[K[4]][Y = 10]]) &
                g[w[K[0]][10]] & ~g[w[K[0]][11]] & K[5]) ||
                ((g[w[K[4]][++y]] | g[w[K[4]][9]] | g[w[K[4]][++Y]]) &
                ~g[w[K[0]][10]] & g[w[K[0]][11]] & K[5]))
              {              // (21)
                k[0] = w[K[4]][y];
                k[1] = w[K[4]][y + 2];
                k[2] = w[K[4]][Y];
#if RJ > 2
                X[1][0] = w[K[0]][Y];
                X[1][1] = -1;
#endif
              }
            }
          }
          else if ((g[y = w[K[4]][K[7]]] & g[Y = w[w[K[0]][13]][K[7]]] &
            ~(g[w[Y][6]] | g[w[Y][7]]) & K[5]) ||
            (g[++y] & g[++Y] & ~(g[w[Y][6]] | g[w[Y][7]]) & K[5]) ||
            (g[++y] & g[++Y] & ~(g[w[Y][6]] | g[w[Y][7]]) & K[5]))
          {                  // (25)
            k[3] = y;
#if RJ > 2
            X[1][0] = Y;
#endif
          }
        }
        else if ((g[y = w[K[0]][K[7]]] | g[w[y][6]] | g[w[y][7]]) &
          g[w[K[0]][13]] & ~(g[w[K[0]][10]] | g[w[K[0]][11]]) &
          (g[Y = w[w[K[0]][13]][K[7]]] | g[w[Y][6]] | g[w[Y][7]]) & K[5])
        {                    // (29)
          k[0] = y;
          k[1] = w[y][6];
          k[2] = w[y][7];
#if RJ > 2
          X[0][0] = Y;
          X[0][1] = w[Y][6];
          X[0][2] = w[Y][7];
          X[1][0] = w[K[0]][13];
#endif
        }
if ((k[2] & k[3]) < 0)
{
        if ((g[w[K[4]][6]] | g[w[K[4]][8]] | g[w[K[4]][10]]) & K[5])
        {                    // (14, 18, 22, 26)
#if RJ > 2
          X[0][0] = w[K[4]][6];
          X[0][1] = w[K[4]][8];
          X[0][2] = w[K[4]][10];
#endif
          if ((g[w[K[0]][6]] | g[w[K[0]][8]] | g[w[K[0]][10]]) & K[5])
          {
            if (~(g[Y = w[w[K[0]][6]][K[8]]] | g[w[Y][12]] | g[w[Y][13]]) & K[5])
            {
              if (g[w[K[0]][7]] & K[5])
              {              // (14, 18, 22)
                k[3] = w[K[0]][7];
#if RJ > 2
                X[1][0] = w[K[0]][6];
                X[1][1] = w[K[0]][8];
                X[1][2] = w[K[0]][10];
#endif
              }
              if (g[w[K[0]][6]] & K[5])
              {              // (18)
                if ((~(g[w[K[0]][8]] | g[w[K[0]][10]]) & K[5]) &&
                  (((g[y = w[K[0]][K[7]]] | g[w[y][6]] | g[w[y][7]] |
                  g[w[K[2]][6]] | g[w[K[2]][7]] | g[w[K[4]][9]] |
                  g[w[K[4]][11]] | g[w[K[4]][12]] | g[w[K[4]][13]]) & K[5]) ||
                  ((g[w[K[0]][6]] | g[w[K[0]][7]] | g[w[K[2]][6]] | g[w[K[2]][7]] |
                  g[Y = w[K[0]][K[7]]] | g[w[Y][6]] | g[w[Y][7]]) & g[K[0]] & g[K[2]]) ||
                  ((g[w[K[0]][12]] | g[w[K[0]][13]] | g[w[K[4]][12]] | g[w[K[4]][13]] |
                  g[Y = w[K[0]][K[8]]] | g[w[Y][12]] | g[w[Y][13]]) & g[K[0]] & g[K[4]])))
                {            // (18)
                  k[0] = y;
                  k[1] = w[y][6];
                  k[2] = w[y][7];
                  k[4] = w[K[2]][6];
                  k[6] = w[K[2]][7];
                  k[7] = w[K[4]][9];
                  k[8] = w[K[4]][11];
                  k[9] = w[K[4]][12];
                  k[10] = w[K[4]][13];
#if RJ > 2
                  X[1][0] = w[K[0]][6];
                  X[1][1] = -1;
#endif
                }
              }
              else if (((g[w[K[2]][y = 8]] | g[w[K[2]][9]] | g[w[K[2]][Y = 12]]) &
                g[w[K[0]][8]] & ~g[w[K[0]][10]] & K[5]) ||
                ((g[w[K[2]][y = 10]] | g[w[K[2]][11]] | g[w[K[2]][++Y]]) &
                ~g[w[K[0]][8]] & g[w[K[0]][10]] & K[5]))
              {              // (22)
                k[0] = w[K[2]][y];
                k[1] = w[K[2]][y + 1];
                k[2] = w[K[2]][Y];
#if RJ > 2
                X[1][0] = w[K[0]][y];
                X[1][1] = -1;
#endif
              }
            }
          }
          else if ((g[y = w[K[2]][K[8]]] & g[Y = w[w[K[0]][6]][K[8]]] &
            ~(g[w[Y][12]] | g[w[Y][13]]) & K[5]) ||
            (g[y += 9] & g[Y += 9] & ~(g[w[Y][12]] | g[w[Y][13]]) & K[5]) ||
            (g[y += 9] & g[Y += 9] & ~(g[w[Y][12]] | g[w[Y][13]]) & K[5]))
          {                  // (26)
            k[3] = y;
#if RJ > 2
            X[1][0] = Y;
#endif
          }
        }
        else if ((g[y = w[K[0]][K[8]]] | g[w[y][12]] | g[w[y][13]]) &
          g[w[K[0]][6]] & ~(g[w[K[0]][8]] | g[w[K[0]][10]]) &
          (g[Y = w[w[K[0]][6]][K[8]]] | g[w[Y][12]] | g[w[Y][13]]) & K[5])
        {                    // (30)
          k[0] = y;
          k[1] = w[y][12];
          k[2] = w[y][13];
#if RJ > 2
          X[0][0] = Y;
          X[0][1] = w[Y][12];
          X[0][2] = w[Y][13];
          X[1][0] = w[K[0]][6];
#endif
        }
if ((k[2] & k[3]) < 0)
{
        if ((g[w[K[4]][7]] | g[w[K[4]][9]] | g[w[K[4]][11]]) & K[5])
        {                    // (14, 18, 22, 26)
#if RJ > 2
          X[0][0] = w[K[4]][7];
          X[0][1] = w[K[4]][9];
          X[0][2] = w[K[4]][11];
#endif
          if ((g[w[K[0]][7]] | g[w[K[0]][9]] | g[w[K[0]][11]]) & K[5])
          {
            if (~(g[Y = w[w[K[0]][7]][K[8]]] | g[w[Y][12]] | g[w[Y][13]]) & K[5])
            {
              if (g[w[K[0]][6]] & K[5])
              {              // (14, 18, 22)
                k[3] = w[K[0]][6];
#if RJ > 2
                X[1][0] = w[K[0]][7];
                X[1][1] = w[K[0]][9];
                X[1][2] = w[K[0]][11];
#endif
              }
              if (g[w[K[0]][7]] & K[5])
              {              // (18)
                if ((~(g[w[K[0]][9]] | g[w[K[0]][11]]) & K[5]) &&
                  (((g[y = w[K[0]][K[7]]] | g[w[y][6]] | g[w[y][7]] |
                  g[w[K[2]][6]] | g[w[K[2]][7]] | g[w[K[4]][8]] |
                  g[w[K[4]][10]] | g[w[K[4]][12]] | g[w[K[4]][13]]) & K[5]) ||
                  ((g[w[K[0]][6]] | g[w[K[0]][7]] | g[w[K[2]][6]] | g[w[K[2]][7]] |
                  g[Y = w[K[0]][K[7]]] | g[w[Y][6]] | g[w[Y][7]]) & g[K[0]] & g[K[2]]) ||
                  ((g[w[K[0]][12]] | g[w[K[0]][13]] | g[w[K[4]][12]] | g[w[K[4]][13]] |
                  g[Y = w[K[0]][K[8]]] | g[w[Y][12]] | g[w[Y][13]]) & g[K[0]] & g[K[4]])))
                {            // (18)
                  k[0] = y;
                  k[1] = w[y][6];
                  k[2] = w[y][7];
                  k[4] = w[K[2]][6];
                  k[6] = w[K[2]][7];
                  k[7] = w[K[4]][8];
                  k[8] = w[K[4]][10];
                  k[9] = w[K[4]][12];
                  k[10] = w[K[4]][13];
#if RJ > 2
                  X[1][0] = w[K[0]][7];
                  X[1][1] = -1;
#endif
                }
              }
              else if (((g[w[K[2]][y = 8]] | g[w[K[2]][9]] | g[w[K[2]][Y = 12]]) &
                g[w[K[0]][9]] & ~g[w[K[0]][11]] & K[5]) ||
                ((g[w[K[2]][y = 10]] | g[w[K[2]][11]] | g[w[K[2]][++Y]]) &
                ~g[w[K[0]][9]] & g[w[K[0]][11]] & K[5]))
              {              // (22)
                k[0] = w[K[2]][y];
                k[1] = w[K[2]][y + 1];
                k[2] = w[K[2]][Y];
#if RJ > 2
                X[1][0] = w[K[0]][y + 1];
                X[1][1] = -1;
#endif
              }
            }
          }
          else if ((g[y = w[K[2]][K[8]]] & g[Y = w[w[K[0]][7]][K[8]]] &
            ~(g[w[Y][12]] | g[w[Y][13]]) & K[5]) ||
            (g[y += 9] & g[Y += 9] & ~(g[w[Y][12]] | g[w[Y][13]]) & K[5]) ||
            (g[y += 9] & g[Y += 9] & ~(g[w[Y][12]] | g[w[Y][13]]) & K[5]))
          {                  // (26)
            k[3] = y;
#if RJ > 2
            X[1][0] = Y;
#endif
          }
        }
        else if ((g[y = w[K[0]][K[8]]] | g[w[y][12]] | g[w[y][13]]) &
          g[w[K[0]][7]] & ~(g[w[K[0]][9]] | g[w[K[0]][11]]) &
          (g[Y = w[w[K[0]][7]][K[8]]] | g[w[Y][12]] | g[w[Y][13]]) & K[5])
        {                    // (30)
          k[0] = y;
          k[1] = w[y][12];
          k[2] = w[y][13];
#if RJ > 2
          X[0][0] = Y;
          X[0][1] = w[Y][12];
          X[0][2] = w[Y][13];
          X[1][0] = w[K[0]][7];
#endif
        }
if ((k[2] & k[3]) < 0)
{
        if ((g[w[K[4]][8]] | g[w[K[4]][9]] | g[w[K[4]][12]]) & K[5])
        {                    // (15, 19, 23, 27)
#if RJ > 2
          X[0][0] = w[K[4]][8];
          X[0][1] = w[K[4]][9];
          X[0][2] = w[K[4]][12];
#endif
          if ((g[w[K[6]][8]] | g[w[K[6]][9]] | g[w[K[6]][12]]) & K[5])
          {
            if (~(g[Y = w[w[K[4]][12]][K[7]]] | g[w[Y][6]] | g[w[Y][7]]) & K[5])
            {
              if (g[w[K[6]][13]] & K[5])
              {              // (15, 19, 23)
                k[3] = w[K[6]][13];
#if RJ > 2
                X[1][0] = w[K[6]][8];
                X[1][1] = w[K[6]][9];
                X[1][2] = w[K[6]][12];
#endif
              }
              if (g[w[K[6]][12]] & K[5])
              {              // (19)
                if ((~(g[w[K[6]][8]] | g[w[K[6]][9]]) & K[5]) &&
                  (((g[y = w[K[2]][K[8]]] | g[w[y][12]] | g[w[y][13]] |
                  g[w[K[4]][6]] | g[w[K[4]][7]] | g[w[K[4]][10]] |
                  g[w[K[4]][11]] | g[w[K[2]][12]] | g[w[K[2]][13]]) & K[5]) ||
                  ((g[w[K[0]][6]] | g[w[K[0]][7]] | g[w[K[2]][6]] | g[w[K[2]][7]] |
                  g[Y = w[K[0]][K[7]]] | g[w[Y][6]] | g[w[Y][7]]) & g[K[0]] & g[K[2]]) ||
                  ((g[w[K[0]][12]] | g[w[K[0]][13]] | g[w[K[4]][12]] | g[w[K[4]][13]] |
                  g[Y = w[K[0]][K[8]]] | g[w[Y][12]] | g[w[Y][13]]) & g[K[0]] & g[K[4]])))
                {            // (19)
                  k[0] = y;
                  k[1] = w[y][12];
                  k[2] = w[y][13];
                  k[4] = w[K[4]][6];
                  k[6] = w[K[4]][7];
                  k[7] = w[K[4]][10];
                  k[8] = w[K[4]][11];
                  k[9] = w[K[2]][12];
                  k[10] = w[K[2]][13];
#if RJ > 2
                  X[1][0] = w[K[6]][12];
                  X[1][1] = -1;
#endif
                }
              }
              else if (((g[w[K[2]][y = 6]] | g[w[K[2]][8]] | g[w[K[2]][Y = 10]]) &
                g[w[K[6]][8]] & ~g[w[K[6]][9]] & K[5]) ||
                ((g[w[K[2]][++y]] | g[w[K[2]][9]] | g[w[K[2]][++Y]]) &
                ~g[w[K[6]][8]] & g[w[K[6]][9]] & K[5]))
              {              // (23)
                k[0] = w[K[2]][y];
                k[1] = w[K[2]][y + 2];
                k[2] = w[K[2]][Y];
#if RJ > 2
                X[1][0] = w[K[6]][y + 2];
                X[1][1] = -1;
#endif
              }
            }
          }
          else if ((g[y = w[K[0]][K[7]]] & g[Y = w[w[K[4]][12]][K[7]]] &
            ~(g[w[Y][6]] | g[w[Y][7]]) & K[5]) ||
            (g[++y] & g[++Y] & ~(g[w[Y][6]] | g[w[Y][7]]) & K[5]) ||
            (g[++y] & g[++Y] & ~(g[w[Y][6]] | g[w[Y][7]]) & K[5]))
          {                  // (27)
            k[3] = y;
#if RJ > 2
            X[1][0] = Y;
#endif
          }
        }
        else if ((g[y = w[K[4]][K[7]]] | g[w[y][6]] | g[w[y][7]]) &
          g[w[K[6]][12]] & ~(g[w[K[6]][8]] | g[w[K[6]][9]]) &
          (g[Y = w[w[K[4]][12]][K[7]]] | g[w[Y][6]] | g[w[Y][7]]) & K[5])
        {                    // (31)
          k[0] = y;
          k[1] = w[y][6];
          k[2] = w[y][7];
#if RJ > 2
          X[0][0] = Y;
          X[0][1] = w[Y][6];
          X[0][2] = w[Y][7];
          X[1][0] = w[K[6]][12];
#endif
        }
if ((k[2] & k[3]) < 0)
{
        if ((g[w[K[4]][10]] | g[w[K[4]][11]] | g[w[K[4]][13]]) & K[5])
        {                    // (15, 19, 23, 27)
#if RJ > 2
          X[0][0] = w[K[4]][10];
          X[0][1] = w[K[4]][11];
          X[0][2] = w[K[4]][13];
#endif
          if ((g[w[K[6]][10]] | g[w[K[6]][11]] | g[w[K[6]][13]]) & K[5])
          {
            if (~(g[Y = w[w[K[4]][13]][K[7]]] | g[w[Y][6]] | g[w[Y][7]]) & K[5])
            {
              if (g[w[K[6]][12]] & K[5])
              {              // (15, 19, 23)
                k[3] = w[K[6]][12];
#if RJ > 2
                X[1][0] = w[K[6]][10];
                X[1][1] = w[K[6]][11];
                X[1][2] = w[K[6]][13];
#endif
              }
              if (g[w[K[6]][13]] & K[5])
              {              // (19)
                if ((~(g[w[K[6]][10]] | g[w[K[6]][11]]) & K[5]) &&
                  (((g[y = w[K[2]][K[8]]] | g[w[y][12]] | g[w[y][13]] |
                  g[w[K[4]][6]] | g[w[K[4]][7]] | g[w[K[4]][8]] |
                  g[w[K[4]][9]] | g[w[K[2]][12]] | g[w[K[2]][13]]) & K[5]) ||
                  ((g[w[K[0]][6]] | g[w[K[0]][7]] | g[w[K[2]][6]] | g[w[K[2]][7]] |
                  g[Y = w[K[0]][K[7]]] | g[w[Y][6]] | g[w[Y][7]]) & g[K[0]] & g[K[2]]) ||
                  ((g[w[K[0]][12]] | g[w[K[0]][13]] | g[w[K[4]][12]] | g[w[K[4]][13]] |
                  g[Y = w[K[0]][K[8]]] | g[w[Y][12]] | g[w[Y][13]]) & g[K[0]] & g[K[4]])))
                {            // (19)
                  k[0] = y;
                  k[1] = w[y][12];
                  k[2] = w[y][13];
                  k[4] = w[K[4]][6];
                  k[6] = w[K[4]][7];
                  k[7] = w[K[4]][8];
                  k[8] = w[K[4]][9];
                  k[9] = w[K[2]][12];
                  k[10] = w[K[2]][13];
#if RJ > 2
                  X[1][0] = w[K[6]][13];
                  X[1][1] = -1;
#endif
                }
              }
              else if (((g[w[K[2]][y = 6]] | g[w[K[2]][8]] | g[w[K[2]][Y = 10]]) &
                g[w[K[6]][10]] & ~g[w[K[6]][11]] & K[5]) ||
                ((g[w[K[2]][++y]] | g[w[K[2]][9]] | g[w[K[2]][++Y]]) &
                ~g[w[K[6]][10]] & g[w[K[6]][11]] & K[5]))
              {              // (23)
                k[0] = w[K[2]][y];
                k[1] = w[K[2]][y + 2];
                k[2] = w[K[2]][Y];
#if RJ > 2
                X[1][0] = w[K[6]][Y];
                X[1][1] = -1;
#endif
              }
            }
          }
          else if ((g[y = w[K[0]][K[7]]] & g[Y = w[w[K[4]][13]][K[7]]] &
            ~(g[w[Y][6]] | g[w[Y][7]]) & K[5]) ||
            (g[++y] & g[++Y] & ~(g[w[Y][6]] | g[w[Y][7]]) & K[5]) ||
            (g[++y] & g[++Y] & ~(g[w[Y][6]] | g[w[Y][7]]) & K[5]))
          {                  // (27)
            k[3] = y;
#if RJ > 2
            X[1][0] = Y;
#endif
          }
        }
        else if ((g[y = w[K[4]][K[7]]] | g[w[y][6]] | g[w[y][7]]) &
          g[w[K[6]][13]] & ~(g[w[K[6]][10]] | g[w[K[6]][11]]) &
          (g[Y = w[w[K[4]][13]][K[7]]] | g[w[Y][6]] | g[w[Y][7]]) & K[5])
        {                    // (31)
          k[0] = y;
          k[1] = w[y][6];
          k[2] = w[y][7];
#if RJ > 2
          X[0][0] = Y;
          X[0][1] = w[Y][6];
          X[0][2] = w[Y][7];
          X[1][0] = w[K[6]][13];
#endif
        }
if ((k[2] & k[3]) < 0)
{
        if ((g[w[K[2]][6]] | g[w[K[2]][8]] | g[w[K[2]][10]]) & K[5])
        {                    // (16, 20, 24, 28)
#if RJ > 2
          X[0][0] = w[K[2]][6];
          X[0][1] = w[K[2]][8];
          X[0][2] = w[K[2]][10];
#endif
          if ((g[w[K[6]][6]] | g[w[K[6]][8]] | g[w[K[6]][10]]) & K[5])
          {
            if (~(g[Y = w[w[K[2]][6]][K[8]]] | g[w[Y][12]] | g[w[Y][13]]) & K[5])
            {
              if (g[w[K[6]][7]] & K[5])
              {              // (16, 20, 24)
                k[3] = w[K[6]][7];
#if RJ > 2
                X[1][0] = w[K[6]][6];
                X[1][1] = w[K[6]][8];
                X[1][2] = w[K[6]][10];
#endif
              }
              if (g[w[K[6]][6]] & K[5])
              {              // (20)
                if ((~(g[w[K[6]][8]] | g[w[K[6]][10]]) & K[5]) &&
                  (((g[y = w[K[4]][K[7]]] | g[w[y][6]] | g[w[y][7]] |
                  g[w[K[4]][6]] | g[w[K[4]][7]] | g[w[K[2]][9]] |
                  g[w[K[2]][11]] | g[w[K[2]][12]] | g[w[K[2]][13]]) & K[5]) ||
                  ((g[w[K[0]][6]] | g[w[K[0]][7]] | g[w[K[2]][6]] | g[w[K[2]][7]] |
                  g[Y = w[K[0]][K[7]]] | g[w[Y][6]] | g[w[Y][7]]) & g[K[0]] & g[K[2]]) ||
                  ((g[w[K[0]][12]] | g[w[K[0]][13]] | g[w[K[4]][12]] | g[w[K[4]][13]] |
                  g[Y = w[K[0]][K[8]]] | g[w[Y][12]] | g[w[Y][13]]) & g[K[0]] & g[K[4]])))
                {            // (20)
                  k[0] = y;
                  k[1] = w[y][6];
                  k[2] = w[y][7];
                  k[4] = w[K[4]][6];
                  k[6] = w[K[4]][7];
                  k[7] = w[K[2]][9];
                  k[8] = w[K[2]][11];
                  k[9] = w[K[2]][12];
                  k[10] = w[K[2]][13];
#if RJ > 2
                  X[1][0] = w[K[6]][6];
                  X[1][1] = -1;
#endif
                }
              }
              else if (((g[w[K[4]][y = 8]] | g[w[K[4]][9]] | g[w[K[4]][Y = 12]]) &
                g[w[K[6]][8]] & ~g[w[K[6]][10]] & K[5]) ||
                ((g[w[K[4]][y = 10]] | g[w[K[4]][11]] | g[w[K[4]][++Y]]) &
                ~g[w[K[6]][8]] & g[w[K[6]][10]] & K[5]))
              {              // (24)
                k[0] = w[K[4]][y];
                k[1] = w[K[4]][y + 1];
                k[2] = w[K[4]][Y];
#if RJ > 2
                X[1][0] = w[K[6]][y];
                X[1][1] = -1;
#endif
              }
            }
          }
          else if ((g[y = w[K[0]][K[8]]] & g[Y = w[w[K[2]][6]][K[8]]] &
            ~(g[w[Y][12]] | g[w[Y][13]]) & K[5]) ||
            (g[y += 9] & g[Y += 9] & ~(g[w[Y][12]] | g[w[Y][13]]) & K[5]) ||
            (g[y += 9] & g[Y += 9] & ~(g[w[Y][12]] | g[w[Y][13]]) & K[5]))
          {                  // (28)
            k[3] = y;
#if RJ > 2
            X[1][0] = Y;
#endif
          }
        }
        else if ((g[y = w[K[2]][K[8]]] | g[w[y][12]] | g[w[y][13]]) &
          g[w[K[6]][6]] & ~(g[w[K[6]][8]] | g[w[K[6]][10]]) &
          (g[Y = w[w[K[2]][6]][K[8]]] | g[w[Y][12]] | g[w[Y][13]]) & K[5])
        {                    // (32)
          k[0] = y;
          k[1] = w[y][12];
          k[2] = w[y][13];
#if RJ > 2
          X[0][0] = Y;
          X[0][1] = w[Y][12];
          X[0][2] = w[Y][13];
          X[1][0] = w[K[6]][6];
#endif
        }
if ((k[2] & k[3]) < 0)
{
        if ((g[w[K[2]][7]] | g[w[K[2]][9]] | g[w[K[2]][11]]) & K[5])
        {                    // (16, 20, 24, 28)
#if RJ > 2
          X[0][0] = w[K[2]][7];
          X[0][1] = w[K[2]][9];
          X[0][2] = w[K[2]][11];
#endif
          if ((g[w[K[6]][7]] | g[w[K[6]][9]] | g[w[K[6]][11]]) & K[5])
          {
            if (~(g[Y = w[w[K[2]][7]][K[8]]] | g[w[Y][12]] | g[w[Y][13]]) & K[5])
            {
              if (g[w[K[6]][6]] & K[5])
              {              // (16, 20, 24)
                k[3] = w[K[6]][6];
#if RJ > 2
                X[1][0] = w[K[6]][7];
                X[1][1] = w[K[6]][9];
                X[1][2] = w[K[6]][11];
#endif
              }
              if (g[w[K[6]][7]] & K[5])
              {              // (20)
                if ((~(g[w[K[6]][9]] | g[w[K[6]][11]]) & K[5]) &&
                  (((g[y = w[K[4]][K[7]]] | g[w[y][6]] | g[w[y][7]] |
                  g[w[K[4]][6]] | g[w[K[4]][7]] | g[w[K[2]][8]] |
                  g[w[K[2]][10]] | g[w[K[2]][12]] | g[w[K[2]][13]]) & K[5]) ||
                  ((g[w[K[0]][6]] | g[w[K[0]][7]] | g[w[K[2]][6]] | g[w[K[2]][7]] |
                  g[Y = w[K[0]][K[7]]] | g[w[Y][6]] | g[w[Y][7]]) & g[K[0]] & g[K[2]]) ||
                  ((g[w[K[0]][12]] | g[w[K[0]][13]] | g[w[K[4]][12]] | g[w[K[4]][13]] |
                  g[Y = w[K[0]][K[8]]] | g[w[Y][12]] | g[w[Y][13]]) & g[K[0]] & g[K[4]])))
                {            // (20)
                  k[0] = y;
                  k[1] = w[y][6];
                  k[2] = w[y][7];
                  k[4] = w[K[4]][6];
                  k[6] = w[K[4]][7];
                  k[7] = w[K[2]][8];
                  k[8] = w[K[2]][10];
                  k[9] = w[K[2]][12];
                  k[10] = w[K[2]][13];
#if RJ > 2
                  X[1][0] = w[K[6]][7];
                  X[1][1] = -1;
#endif
                }
             }
              else if (((g[w[K[4]][y = 8]] | g[w[K[4]][9]] | g[w[K[4]][Y = 12]]) &
                g[w[K[6]][9]] & ~g[w[K[6]][11]] & K[5]) ||
                ((g[w[K[4]][y = 10]] | g[w[K[4]][11]] | g[w[K[4]][++Y]]) &
                ~g[w[K[6]][9]] & g[w[K[6]][11]] & K[5]))
              {              // (24)
                k[0] = w[K[4]][y];
                k[1] = w[K[4]][y + 1];
                k[2] = w[K[4]][Y];
#if RJ > 2
                X[1][0] = w[K[6]][y + 1];
                X[1][1] = -1;
#endif
              }
            }
          }
          else if ((g[y = w[K[0]][K[8]]] & g[Y = w[w[K[2]][7]][K[8]]] &
            ~(g[w[Y][12]] | g[w[Y][13]]) & K[5]) ||
            (g[y += 9] & g[Y += 9] & ~(g[w[Y][12]] | g[w[Y][13]]) & K[5]) ||
            (g[y += 9] & g[Y += 9] & ~(g[w[Y][12]] | g[w[Y][13]]) & K[5]))
          {                  // (28)
            k[3] = y;
#if RJ > 2
            X[1][0] = Y;
#endif
          }
        }
        else if ((g[y = w[K[2]][K[8]]] | g[w[y][12]] | g[w[y][13]]) &
          g[w[K[6]][7]] & ~(g[w[K[6]][9]] | g[w[K[6]][11]]) &
          (g[Y = w[w[K[2]][7]][K[8]]] | g[w[Y][12]] | g[w[Y][13]]) & K[5])
        {                    // (32)
          k[0] = y;
          k[1] = w[y][12];
          k[2] = w[y][13];
#if RJ > 2
          X[0][0] = Y;
          X[0][1] = w[Y][12];
          X[0][2] = w[Y][13];
          X[1][0] = w[K[6]][7];
#endif
        }
if ((k[2] & k[3]) < 0)
{
        if (((g[w[K[0]][6]] | g[w[K[0]][7]]) & (g[w[K[0]][12]] | g[w[K[0]][13]]) &
          ~(g[w[K[0]][8]] | g[w[K[0]][9]] | g[w[K[0]][10]] | g[w[K[0]][11]]) & K[5]) &&
          (((g[y = w[K[0]][K[7]]] | g[w[y][6]] | g[w[y][7]] | g[w[K[2]][6]] | g[w[K[2]][7]] |
          g[Y = w[K[0]][K[8]]] | g[w[Y][12]] | g[w[Y][13]] | g[w[K[4]][12]] | g[w[K[4]][13]]) & K[5]) ||
          ((g[w[K[0]][6]] | g[w[K[0]][7]] | g[y] | g[w[y][6]] | g[w[y][7]] |
          g[w[K[2]][6]] | g[w[K[2]][7]]) & g[K[0]] & g[K[2]]) ||
          ((g[w[K[0]][12]] | g[w[K[0]][13]] | g[Y] | g[w[Y][12]] | g[w[Y][13]] |
          g[w[K[4]][12]] | g[w[K[4]][13]]) & g[K[0]] & g[K[4]])))
        {                    // (ERI Ring 33)
          k[3] = y;
          k[0] = w[y][6];
          k[1] = w[y][7];
          k[2] = w[K[2]][6];
          k[4] = w[K[2]][7];
          k[5] = 0;
          k[6] = Y;
          k[7] = w[Y][12];
          k[8] = w[Y][13];
          k[9] = w[K[4]][12];
          k[10] = w[K[4]][13];
#if RJ > 2
          X[0][0] = w[K[0]][6];
          X[0][1] = w[K[0]][7];
          X[1][0] = w[K[0]][12];
          X[1][1] = w[K[0]][13];
#endif
        }
        else if (((g[w[K[6]][6]] | g[w[K[6]][7]]) & (g[w[K[6]][12]] | g[w[K[6]][13]]) &
          ~(g[w[K[6]][8]] | g[w[K[6]][9]] | g[w[K[6]][10]] | g[w[K[6]][11]]) & K[5]) &&
          (((g[w[K[4]][6]] | g[w[K[4]][7]] | g[y = w[K[4]][K[7]]] | g[w[y][6]] | g[w[y][7]] |
          g[w[K[2]][12]] | g[w[K[2]][13]] | g[Y = w[K[2]][K[8]]] | g[w[Y][12]] | g[w[Y][13]]) & K[5]) ||
          ((g[w[K[0]][6]] | g[w[K[0]][7]] | g[w[K[2]][6]] | g[w[K[2]][7]] |
          g[w[K[0]][K[7]]] | g[w[w[K[0]][K[7]]][6]] | g[w[w[K[0]][K[7]]][7]]) & g[K[0]] & g[K[2]]) ||
          ((g[w[K[0]][12]] | g[w[K[0]][13]] | g[w[K[4]][12]] | g[w[K[4]][13]] |
          g[w[K[0]][K[8]]] | g[w[w[K[0]][K[8]]][12]] | g[w[w[K[0]][K[8]]][13]]) & g[K[0]] & g[K[4]])))
        {                    // (ERI Ring 34)
          k[3] = w[K[4]][6];
          k[0] = w[K[4]][7];
          k[1] = y;
          k[2] = w[y][6];
          k[4] = w[y][7];
          k[5] = 0;
          k[6] = w[K[2]][12];
          k[7] = w[K[2]][13];
          k[8] = Y;
          k[9] = w[Y][12];
          k[10] = w[Y][13];
#if RJ > 2
          X[0][0] = w[K[6]][6];
          X[0][1] = w[K[6]][7];
          X[1][0] = w[K[6]][12];
          X[1][1] = w[K[6]][13];
#endif
        }
        else if (((g[y = w[K[0]][K[8]]] & g[Y = w[K[2]][K[8]]] &
          ~(g[w[y][6]] | g[w[y][7]] | g[w[Y][6]] | g[w[Y][7]] |
          g[w[y][K[7]]] | g[w[w[y][K[7]]][6]] | g[w[w[y][K[7]]][7]]) & K[5]) &&
          (((g[w[K[0]][12]] | g[w[K[0]][13]] | g[w[K[4]][12]] | g[w[K[4]][13]] |
          g[w[y][12]] | g[w[y][13]] | g[w[K[2]][12]] | g[w[K[2]][13]] |
          g[w[K[6]][12]] | g[w[K[6]][13]] | g[w[Y][12]] | g[w[Y][13]]) & K[5]) ||
          ((g[w[K[0]][6]] | g[w[K[0]][7]] | g[w[K[2]][6]] | g[w[K[2]][7]] |
          g[w[K[0]][K[7]]] | g[w[w[K[0]][K[7]]][6]] | g[w[w[K[0]][K[7]]][7]]) & g[K[0]] & g[K[2]]) ||
          ((g[w[K[0]][12]] | g[w[K[0]][13]] | g[w[K[4]][12]] | g[w[K[4]][13]] |
          g[w[K[0]][K[8]]] | g[w[w[K[0]][K[8]]][12]] | g[w[w[K[0]][K[8]]][13]]) & g[K[0]] & g[K[4]]))) ||
          ((g[y += 9] & g[Y += 9] & ~(g[w[y][6]] | g[w[y][7]] | g[w[Y][6]] | g[w[Y][7]] |
          g[w[y][K[7]]] | g[w[w[y][K[7]]][6]] | g[w[w[y][K[7]]][7]]) & K[5]) &&
          (((g[w[K[0]][12]] | g[w[K[0]][13]] | g[w[K[4]][12]] | g[w[K[4]][13]] |
          g[w[y][12]] | g[w[y][13]] | g[w[K[2]][12]] | g[w[K[2]][13]] |
          g[w[K[6]][12]] | g[w[K[6]][13]] | g[w[Y][12]] | g[w[Y][13]]) & K[5]) ||
          ((g[w[K[0]][6]] | g[w[K[0]][7]] | g[w[K[2]][6]] | g[w[K[2]][7]] |
          g[w[K[0]][K[7]]] | g[w[w[K[0]][K[7]]][6]] | g[w[w[K[0]][K[7]]][7]]) & g[K[0]] & g[K[2]]) ||
          ((g[w[K[0]][12]] | g[w[K[0]][13]] | g[w[K[4]][12]] | g[w[K[4]][13]] |
          g[w[K[0]][K[8]]] | g[w[w[K[0]][K[8]]][12]] | g[w[w[K[0]][K[8]]][13]]) & g[K[0]] & g[K[4]]))) ||
          ((g[y += 9] & g[Y += 9] & ~(g[w[y][6]] | g[w[y][7]] | g[w[Y][6]] | g[w[Y][7]] |
          g[w[y][K[7]]] | g[w[w[y][K[7]]][6]] | g[w[w[y][K[7]]][7]]) & K[5]) &&
          (((g[w[K[0]][12]] | g[w[K[0]][13]] | g[w[K[4]][12]] | g[w[K[4]][13]] |
          g[w[y][12]] | g[w[y][13]] | g[w[K[2]][12]] | g[w[K[2]][13]] |
          g[w[K[6]][12]] | g[w[K[6]][13]] | g[w[Y][12]] | g[w[Y][13]]) & K[5]) ||
          ((g[w[K[0]][6]] | g[w[K[0]][7]] | g[w[K[2]][6]] | g[w[K[2]][7]] |
          g[w[K[0]][K[7]]] | g[w[w[K[0]][K[7]]][6]] | g[w[w[K[0]][K[7]]][7]]) & g[K[0]] & g[K[2]]) ||
          ((g[w[K[0]][12]] | g[w[K[0]][13]] | g[w[K[4]][12]] | g[w[K[4]][13]] |
          g[w[K[0]][K[8]]] | g[w[w[K[0]][K[8]]][12]] | g[w[w[K[0]][K[8]]][13]]) & g[K[0]] & g[K[4]]))))
        {                    // (Line Ring 35)
          k[3] = w[K[0]][12];
          k[0] = w[K[0]][13];
          k[1] = w[K[4]][12];
          k[2] = w[K[4]][13];
          k[4] = w[y][12];
          k[5] = 1;
          k[6] = w[y][13];
          k[7] = w[K[2]][12];
          k[8] = w[K[2]][13];
          k[9] = w[K[6]][12];
          k[10] = w[K[6]][13];
          k[35] = w[Y][12];
          k[36] = w[Y][13];
#if RJ > 2
          X[0][0] = y;
          X[1][0] = Y;
#endif
        }
        else if (((g[y = w[K[0]][K[7]]] & g[Y = w[K[4]][K[7]]] &
          ~(g[w[y][12]] | g[w[y][13]] | g[w[Y][12]] | g[w[Y][13]] |
          g[w[y][K[8]]] | g[w[w[y][K[8]]][12]] | g[w[w[y][K[8]]][13]]) & K[5]) &&
          (((g[w[K[0]][6]] | g[w[K[0]][7]] | g[w[y][6]] | g[w[y][7]] |
          g[w[Y][6]] | g[w[Y][7]] | g[w[K[4]][6]] | g[w[K[4]][7]] |
          g[w[K[2]][6]] | g[w[K[2]][7]] | g[w[K[6]][6]] | g[w[K[6]][7]]) & K[5]) ||
          ((g[w[K[0]][6]] | g[w[K[0]][7]] | g[y] | g[w[y][6]] | g[w[y][7]] |
          g[w[K[2]][6]] | g[w[K[2]][7]]) & g[K[0]] & g[K[2]]) ||
          ((g[w[K[0]][12]] | g[w[K[0]][13]] | g[w[K[4]][12]] | g[w[K[4]][13]] |
          g[w[K[0]][K[8]]] | g[w[w[K[0]][K[8]]][12]] | g[w[w[K[0]][K[8]]][13]]) & g[K[0]] & g[K[4]]))) ||
          ((g[y += 1] & g[Y += 1] & ~(g[w[y][12]] | g[w[y][13]] | g[w[Y][12]] | g[w[Y][13]] |
          g[w[y][K[8]]] | g[w[w[y][K[8]]][12]] | g[w[w[y][K[8]]][13]]) & K[5]) &&
          (((g[w[K[0]][6]] | g[w[K[0]][7]] | g[w[y][6]] | g[w[y][7]] |
          g[w[Y][6]] | g[w[Y][7]] | g[w[K[4]][6]] | g[w[K[4]][7]] |
          g[w[K[2]][6]] | g[w[K[2]][7]] | g[w[K[6]][6]] | g[w[K[6]][7]]) & K[5]) ||
          ((g[w[K[0]][6]] | g[w[K[0]][7]] | g[y] | g[w[y][6]] | g[w[y][7]] |
          g[w[K[2]][6]] | g[w[K[2]][7]]) & g[K[0]] & g[K[2]]) ||
          ((g[w[K[0]][12]] | g[w[K[0]][13]] | g[w[K[4]][12]] | g[w[K[4]][13]] |
          g[w[K[0]][K[8]]] | g[w[w[K[0]][K[8]]][12]] | g[w[w[K[0]][K[8]]][13]]) & g[K[0]] & g[K[4]]))) ||
          ((g[y += 1] & g[Y += 1] & ~(g[w[y][12]] | g[w[y][13]] | g[w[Y][12]] | g[w[Y][13]] |
          g[w[y][K[8]]] | g[w[w[y][K[8]]][12]] | g[w[w[y][K[8]]][13]]) & K[5]) &&
          (((g[w[K[0]][6]] | g[w[K[0]][7]] | g[w[y][6]] | g[w[y][7]] |
          g[w[Y][6]] | g[w[Y][7]] | g[w[K[4]][6]] | g[w[K[4]][7]] |
          g[w[K[2]][6]] | g[w[K[2]][7]] | g[w[K[6]][6]] | g[w[K[6]][7]]) & K[5]) ||
          ((g[w[K[0]][6]] | g[w[K[0]][7]] | g[y] | g[w[y][6]] | g[w[y][7]] |
          g[w[K[2]][6]] | g[w[K[2]][7]]) & g[K[0]] & g[K[2]]) ||
          ((g[w[K[0]][12]] | g[w[K[0]][13]] | g[w[K[4]][12]] | g[w[K[4]][13]] |
          g[w[K[0]][K[8]]] | g[w[w[K[0]][K[8]]][12]] | g[w[w[K[0]][K[8]]][13]]) & g[K[0]] & g[K[4]]))))
        {                    // (Line Ring 36)
          k[3] = w[K[0]][6];
          k[0] = w[K[0]][7];
          k[1] = w[y][6];
          k[2] = w[y][7];
          k[4] = w[Y][6];
          k[5] = 1;
          k[6] = w[Y][7];
          k[7] = w[K[4]][6];
          k[8] = w[K[4]][7];
          k[9] = w[K[2]][6];
          k[10] = w[K[2]][7];
          k[35] = w[K[6]][6];
          k[36] = w[K[6]][7];
#if RJ > 2
          X[0][0] = y;
          X[1][0] = Y;
#endif
        }
}
}
}
}
}
}
}
}
        if ((k[2] & k[3]) + 1)
        {
          if (k[3] + 1)
          {
            k[11] = g[k[3]];
            g[k[3]] &= ~K[5];
          }
          if (k[2] + 1)
          {
            k[12] = g[k[0]];
            k[13] = g[k[1]];
            k[14] = g[k[2]];
            g[k[0]] &= ~K[5];
            g[k[1]] &= ~K[5];
            g[k[2]] &= ~K[5];
            if (k[4] + 1)
            {
              k[15] = g[k[4]];
              k[16] = g[k[6]];
              k[17] = g[k[7]];
              k[18] = g[k[8]];
              k[19] = g[k[9]];
              k[20] = g[k[10]];
              k[21] = g[w[K[0]][6]];
              k[22] = g[w[K[0]][7]];
              k[23] = g[w[K[0]][K[7]]];
              k[24] = g[w[w[K[0]][K[7]]][6]];
              k[25] = g[w[w[K[0]][K[7]]][7]];
              k[26] = g[w[K[2]][6]];
              k[27] = g[w[K[2]][7]];
              k[28] = g[w[K[0]][12]];
              k[29] = g[w[K[0]][13]];
              k[30] = g[w[K[0]][K[8]]];
              k[31] = g[w[w[K[0]][K[8]]][12]];
              k[32] = g[w[w[K[0]][K[8]]][13]];
              k[33] = g[w[K[4]][12]];
              k[34] = g[w[K[4]][13]];
              g[k[4]] &= ~K[5];
              g[k[6]] &= ~K[5];
              g[k[7]] &= ~K[5];
              g[k[8]] &= ~K[5];
              g[k[9]] &= ~K[5];
              g[k[10]] &= ~K[5];
              g[w[K[0]][6]] &= ~(y = g[K[0]] & g[K[2]]);
              g[w[K[0]][7]] &= ~y;
              g[w[K[0]][K[7]]] &= ~y;
              g[w[w[K[0]][K[7]]][6]] &= ~y;
              g[w[w[K[0]][K[7]]][7]] &= ~y;
              g[w[K[2]][6]] &= ~y;
              g[w[K[2]][7]] &= ~y;
              g[w[K[0]][12]] &= ~(Y = g[K[0]] & g[K[4]]);
              g[w[K[0]][13]] &= ~Y;
              g[w[K[0]][K[8]]] &= ~Y;
              g[w[w[K[0]][K[8]]][12]] &= ~Y;
              g[w[w[K[0]][K[8]]][13]] &= ~Y;
              g[w[K[4]][12]] &= ~Y;
              g[w[K[4]][13]] &= ~Y;
              if (k[35] + 1)
              {
                k[37] = g[k[35]];
                k[38] = g[k[36]];
                g[k[35]] &= ~K[5];
                g[k[36]] &= ~K[5];
              }
            }
          }
#if RJ > 2
          printf ("%d) Found XY-Wings Type 1 Transport %s Cells %d %d %d %d Clues %d\nStrong Link Clue %d between Cell%s%d",
            p, k[5] + 1 ? (k[5] ? "Line Ring" : "ERI Ring") : (k[4] + 1 ? "Line Ring" : "Line"),
            K[0], K[2], K[4], K[6], b[g[K[2]] | g[K[4]]], b[K[5]], X[0][1] + 1 ? "s " : " ", X[0][0]);
          if (X[0][1] + 1)
          {
            printf (" %d", X[0][1]);
            if (X[0][2] + 1)
              printf (" %d", X[0][2]);
          }
          printf (" and Cell%s%d", X[1][1] + 1 ? "s " : " ", X[1][0]);
          if (X[1][1] + 1)
          {
            printf (" %d", X[1][1]);
            if (X[1][2] + 1)
              printf (" %d", X[1][2]);
          }
          printf (" drop Clue %d from Cel%s", b[K[5]], k[2] + 1 ? "ls" : "l");
          if (k[3] + 1)
            printf (" %d", k[3]);
          if (k[2] + 1)
          {
            printf (" %d %d %d", k[0], k[1], k[2]);
            if (k[4] + 1)
            {
              printf (" %d %d %d %d %d %d", k[4], k[6], k[7], k[8], k[9], k[10]);
              if (k[35] + 1)
                printf (" %d %d", k[35], k[36]);
              printf ("\ndrop Clue %d from Cells %d %d %d %d %d %d %d drop Clue %d from Cells %d %d %d %d %d %d %d",
                b[y], w[K[0]][6], w[K[0]][7], w[K[0]][K[7]], w[w[K[0]][K[7]]][6], w[w[K[0]][K[7]]][7],
                w[K[2]][6], w[K[2]][7], b[Y], w[K[0]][12], w[K[0]][13], w[K[0]][K[8]],
                w[w[K[0]][K[8]]][12], w[w[K[0]][K[8]]][13], w[K[4]][12], w[K[4]][13]);
            }
          }
          printf ("\n");
#endif
          if (solve (p))
            return 1;
#if RJ > 2
          printf ("%d) Restore XY-Wings Type 1 Transport %s Cells %d %d %d %d Clues %d\nStrong Link Clue %d between Cell%s%d",
            p, k[5] + 1 ? (k[5] ? "Line Ring" : "ERI Ring") : (k[4] + 1 ? "Line Ring" : "Line"),
            K[0], K[2], K[4], K[6], b[g[K[2]] | g[K[4]]], b[K[5]], X[0][1] + 1 ? "s " : " ", X[0][0]);
          if (X[0][1] + 1)
          {
            printf (" %d", X[0][1]);
            if (X[0][2] + 1)
              printf (" %d", X[0][2]);
          }
          printf (" and Cell%s%d", X[1][1] + 1 ? "s " : " ", X[1][0]);
          if (X[1][1] + 1)
          {
            printf (" %d", X[1][1]);
            if (X[1][2] + 1)
              printf (" %d", X[1][2]);
          }
          printf (" add Clue %d to Cel%s", b[K[5]], k[2] + 1 ? "ls" : "l");
          if (k[3] + 1)
            printf (" %d", k[3]);
          if (k[2] + 1)
          {
            printf (" %d %d %d", k[0], k[1], k[2]);
            if (k[4] + 1)
            {
              printf (" %d %d %d %d %d %d", k[4], k[6], k[7], k[8], k[9], k[10]);
              if (k[35] + 1)
                printf (" %d %d", k[35], k[36]);
              printf ("\nadd Clue %d to Cells %d %d %d %d %d %d %d add Clue %d to Cells %d %d %d %d %d %d %d",
                b[y], w[K[0]][6], w[K[0]][7], w[K[0]][K[7]], w[w[K[0]][K[7]]][6], w[w[K[0]][K[7]]][7],
                w[K[2]][6], w[K[2]][7], b[Y], w[K[0]][12], w[K[0]][13], w[K[0]][K[8]],
                w[w[K[0]][K[8]]][12], w[w[K[0]][K[8]]][13], w[K[4]][12], w[K[4]][13]);
            }
          }
          printf ("\n");
#endif
          if (k[2] + 1)
          {
            if (k[4] + 1)
            {
              g[w[K[0]][6]] = k[21];
              g[w[K[0]][7]] = k[22];
              g[w[K[0]][K[7]]] = k[23];
              g[w[w[K[0]][K[7]]][6]] = k[24];
              g[w[w[K[0]][K[7]]][7]] = k[25];
              g[w[K[2]][6]] = k[26];
              g[w[K[2]][7]] = k[27];
              g[w[K[0]][12]] = k[28];
              g[w[K[0]][13]] = k[29];
              g[w[K[0]][K[8]]] = k[30];
              g[w[w[K[0]][K[8]]][12]] = k[31];
              g[w[w[K[0]][K[8]]][13]] = k[32];
              g[w[K[4]][12]] = k[33];
              g[w[K[4]][13]] = k[34];
              g[k[4]] = k[15];
              g[k[6]] = k[16];
              g[k[7]] = k[17];
              g[k[8]] = k[18];
              g[k[9]] = k[19];
              g[k[10]] = k[20];
              if (k[35] + 1)
              {
                g[k[35]] = k[37];
                g[k[36]] = k[38];
              }
            }
            g[k[0]] = k[12];
            g[k[1]] = k[13];
            g[k[2]] = k[14];
          }
          if (k[3] + 1)
            g[k[3]] = k[11];
#if RJ > 3
          prn ();
#endif
          return 0;
        }
      }
    }
  }
  for (a = p; a < q; ++a)    // Search XY-Wings Type 2, XYZ-Wings and XYZ-Wings Hybrid Type 1 and Type 2 unsolved Cell position wise
  {
    if (B[g[r[a]]] > 3)
      continue;              // Skip for unsolved Cell Clues more than three digits
    int K[5] = {r[a]};       // Assign Apex Cell position

    for (y = 0; y < 2; ++y)  // Search Wing Cells position Chute wise
    {
      if(!(g[w[r[a]][W[6][y]]] | g[w[r[a]][W[6][y] + 1]] | g[w[r[a]][W[6][y] + 2]] |
        g[w[r[a]][W[6][y] + 3]] | g[w[r[a]][W[6][y] + 4]] | g[w[r[a]][W[6][y] + 5]]) ||
        !(g[w[r[a]][W[1][y]]] | g[w[r[a]][W[1][y] + 1]] | g[w[r[a]][W[1][y] + 2]] |
        g[w[r[a]][W[1][y] + 3]] | g[w[r[a]][W[1][y] + 4]] | g[w[r[a]][W[1][y] + 5]]))
        continue;            // Skip for no unsolved Cell position in Apex either Box or Line
      for (K[1] = W[6][y]; K[1] < W[0][y]; ++K[1])
      {                      // Search first Wing Cell position Box wise
        if (!g[w[K[0]][K[1]]] || B[g[K[0]] | g[w[K[0]][K[1]]]] > 3)
          continue;          // Skip for either Box Wing Cell position not unsolved; or Apex and Box Wing Cells Clues more than three digits
        for (K[2] = W[1][y]; K[2] < W[2][y]; ++K[2])
        {                    // Search second Wing Cell position Line wise
          if (!g[w[K[0]][K[2]]] || B[g[K[0]] | g[w[K[0]][K[1]]] | g[w[K[0]][K[2]]]] > 3 ||
                             // Skip for either Line Wing Cell position not unsolved; or Apex Cell and Wing Cells Clues more than three digits; or
            B[K[4] = g[w[K[0]][K[1]]] & g[w[K[0]][K[2]]]] != 1)
            continue;        // Wing Cells common Clue not one digit
          K[3] = W[K[2] < W[5][y] ? 1 : 5][y];
                             // Assign Wing Cells common first exclusion Cell position
          int k[5] = {g[w[K[0]][W[3][y]]], g[w[K[0]][W[4][y]]]};
                             // Backup XY-Wings Type 2 and XYZ-Wings additionalexclusion Cells Clues
          if (~g[K[0]] & K[4])
          {                  // Check no Wing Cells common Clue in Apex Cell Clues for backup additional XY-Wings Type 2 exclusion Cells Clues
            k[2] = g[w[w[K[0]][K[1]]][K[3]]];
            k[3] = g[w[w[K[0]][K[1]]][K[3] + 1]];
            k[4] = g[w[w[K[0]][K[1]]][K[3] + 2]];
          }
          if ((k[0] | k[1] | k[2] | k[3] | k[4]) & K[4])
          {                  // Check Wing Cells common Clue in XY-Wings Type 2 and XYZ-Wings exclusion Cells Clues
                             // Drop Wing Cells common Clue from XYZ-Wings exclusion Cell positions
            g[w[K[0]][W[3][y]]] &= ~K[4];
            g[w[K[0]][W[4][y]]] &= ~K[4];
            if (~g[K[0]] & K[4])
            {                // Drop Wing Cells common Clue from XY-Wings Type 2 additional exclusion Cell positions
              g[w[w[K[0]][K[1]]][K[3]]] &= ~K[4];
              g[w[w[K[0]][K[1]]][K[3] + 1]] &= ~K[4];
              g[w[w[K[0]][K[1]]][K[3] + 2]] &= ~K[4];
            }
#if RJ > 2
            printf ("%d) Found XY%s Cells %d %d %d Clues %d drop Clue %d from Cells %d %d",
              p, g[K[0]] & K[4] ? "Z-Wings" : "-Wings Type 2", K[0], w[K[0]][K[1]], w[K[0]][K[2]],
              b[g[w[K[0]][K[1]]] | g[w[K[0]][K[2]]]], b[K[4]], w[K[0]][W[3][y]], w[K[0]][W[4][y]]);
            if (~g[K[0]] & K[4])
              printf (" %d %d %d", w[w[K[0]][K[1]]][K[3]], w[w[K[0]][K[1]]][K[3] + 1], w[w[K[0]][K[1]]][K[3] + 2]);
            printf ("\n");
#endif
              if (solve (p))
                return 1;
#if RJ > 2
            printf ("%d) Restore XY%s Cells %d %d %d Clues %d add Clue %d to Cells %d %d",
              p, g[K[0]] & K[4] ? "Z-Wings" : "-Wings Type 2", K[0], w[K[0]][K[1]], w[K[0]][K[2]],
              b[g[w[K[0]][K[1]]] | g[w[K[0]][K[2]]]], b[K[4]], w[K[0]][W[3][y]], w[K[0]][W[4][y]]);
            if (~g[K[0]] & K[4])
              printf (" %d %d %d", w[w[K[0]][K[1]]][K[3]], w[w[K[0]][K[1]]][K[3] + 1], w[w[K[0]][K[1]]][K[3] + 2]);
            printf ("\n");
#endif
            g[w[K[0]][W[3][y]]] = k[0];
            g[w[K[0]][W[4][y]]] = k[1];
            if (~g[K[0]] & K[4])
            {                // Restore Wing Cells common Clue to XY-Wings Type 2 additional exclusion Cell positions
              g[w[w[K[0]][K[1]]][K[3]]] = k[2];
              g[w[w[K[0]][K[1]]][K[3] + 1]] = k[3];
              g[w[w[K[0]][K[1]]][K[3] + 2]] = k[4];
            }
#if RJ > 3
            prn ();
#endif
            return 0;        // Restore XY-Wings Type 2 and XYZ-Wings exclusion Cells Clues
          }
// XY-Wings Type 2 Transport
          if (~g[K[0]] & K[4])
            continue;        // Skip for no Wing Cells common Clue in Apex Cell Clues
          for (Y = 0; Y < 2; ++Y)
          {                  // Search XYZ-Wings Hybrid Type wise
            int L,
                X[3],
                k[3];

            if (Y)
            {                // Search XYZ-Wings Hybrid Type 1
              X[0] = W[K[2] < W[5][y] ? 5 : 1][y];
              X[1] = X[0] + 1;
              X[2] = X[1] + 1;
            }
            else
            {                // Search XYZ-Wings Hybrid Type 2
              L = K[1] == W[6][y] || K[1] == W[7][y] || K[1] == W[8][y] ? 9 : 6;
              X[0] = W[L][y];
              X[1] = W[L + 1][y];
              X[2] = W[L + 2][y];
            }
            if ((g[w[K[0]][K[Y + 1]]] != g[w[w[K[0]][K[1]]][L = K[3]]] &&
              g[w[K[0]][K[Y + 1]]] != g[w[w[K[0]][K[1]]][++L]] &&
              g[w[K[0]][K[Y + 1]]] != g[w[w[K[0]][K[1]]][++L]]) ||
              (~(g[w[K[0]][X[0]]] | g[w[K[0]][X[1]]] | g[w[K[0]][X[2]]]) & K[4]))
              continue;      // Skip for either no XYZ-Wings Hybrid Cell position; or no exclusions
            k[0] = g[w[K[0]][X[0]]];
            k[1] = g[w[K[0]][X[1]]];
            k[2] = g[w[K[0]][X[2]]];
                             // Backup and drop Wing Cells common Clue from XYZ-Wings Hybrid Type 1 and Type 2 exclusion Cell positions
            g[w[K[0]][X[0]]] &= ~K[4];
            g[w[K[0]][X[1]]] &= ~K[4];
            g[w[K[0]][X[2]]] &= ~K[4];
#if RJ > 2
            printf ("%d) Found XYZ-Wings Hybrid Type %d Cells %d %d %d %d Clues %d drop Clue %d from Cells %d %d %d\n",
              p, 2 - Y, K[0], w[K[0]][K[1]], w[K[0]][K[2]], w[w[K[0]][K[1]]][L], b[g[K[0]]],
              b[K[4]], w[K[0]][X[0]], w[K[0]][X[1]], w[K[0]][X[2]]);
#endif
            if (solve (p))
              return 1;
#if RJ > 2
            printf ("%d) Restore XYZ-Wings Hybrid Type %d Cells %d %d %d %d Clues %d add Clue %d to Cells %d %d %d\n",
              p, 2 - Y, K[0], w[K[0]][K[1]], w[K[0]][K[2]], w[w[K[0]][K[1]]][L], b[g[K[0]]],
              b[K[4]], w[K[0]][X[0]], w[K[0]][X[1]], w[K[0]][X[2]]);
#endif
            g[w[K[0]][X[0]]] = k[0];
            g[w[K[0]][X[1]]] = k[1];
            g[w[K[0]][X[2]]] = k[2];
#if RJ > 3
            prn ();
#endif
            return 0;        // Restore XYZ-Wings Hybrid Type 1 and Type 2 exclusion Cells Clues
          }
// XYZ-Wings Transport
        }
      }
    }
  }
  for (y = p; y < q - 1; ++y)// Search W-Wings Type 1 and Type 2 first Cell position unsolved Cell position wise
  {
    if (B[g[r[y]]] != 2)
      continue;              // Skip for first Cell Clues not two digits
    for (Y = y + 1; Y < q; ++Y)
    {                        // Search W-Wings Type 1 and Type 2 second Cell position unsolved Cell position wise
      if ((w[r[y]][20] & w[r[Y]][20] & 134217727) || g[r[y]] != g[r[Y]])
        continue;            // Skip for first and second Cell positions in Unit; or Clues not same
      int K[10] = {r[y], r[Y], g[r[y]], r[y] - b[w[r[y]][20] & 511] + b[w[r[Y]][20] & 511],
                  r[Y] - b[w[r[Y]][20] & 511] + b[w[r[y]][20] & 511],-1},
          k[6] = {g[K[3]], g[K[4]]},
          X[3][2] = {{K[4] == w[K[0]][14] || K[4] == w[K[0]][15] || K[4] == w[K[0]][16] ? 17 : 14,
                    K[3] == w[K[0]][0] || K[3] == w[K[0]][1] || K[3] == w[K[0]][2] ? 3 : 0},
                    { 3, 3}, { 0, 1}},
          L,
          Z;

      X[1][0] += X[0][0];
      X[1][1] += X[0][1];
      if ((w[K[0]][20] & 1610612736) == (w[K[1]][20] & 1610612736) ||
        (w[K[0]][20] & 402653184) == (w[K[1]][20] & 402653184))
      {                      // Check first and second Cell positions either Band or Stack wise
        if ((w[K[0]][20] & 1610612736) == (w[K[1]][20] & 1610612736))
        {                    // Check first and second Cell positions Band wise
          X[1][0] = 20;
          X[2][1] = 0;
          L = w[w[K[0]][K[4] == w[K[0]][12] ? 13 : 12]][X[0][1]];
          K[5] = w[K[3]][6];
          K[6] = w[K[3]][7];
          K[7] = w[K[4]][6];
          K[8] = w[K[4]][7];
        }
        else
        {                    // First and second Cell positions Stack wise
          X[1][1] = 6;
          X[2][0] = 1;
          L = w[w[K[0]][K[3] == w[K[0]][6] ? 7 : 6]][X[0][0]];
          K[5] = w[K[3]][12];
          K[6] = w[K[3]][13];
          K[7] = w[K[4]][12];
          K[8] = w[K[4]][13];
        }
        k[2] = g[K[5]];
        k[3] = g[K[6]];
        k[4] = g[K[7]];
        k[5] = g[K[8]];
        if ((Z = ~(g[L] | g[w[L][W[3][X[2][0]]]] | g[w[L][W[4][X[2][0]]]]) &
          (g[w[L][a = W[1][X[2][0]]]] | g[w[L][a + 1]] | g[w[L][a + 2]] |
          g[w[L][a + 3]] | g[w[L][a + 4]] | g[w[L][a + 5]]) &
          (g[w[L][a = W[6][X[2][0]]]] | g[w[L][a + 1]] | g[w[L][a + 2]] |
          g[w[L][a + 3]] | g[w[L][a + 4]] | g[w[L][a + 5]]) & K[2]) &&
          ((k[0] | k[1] | k[2] | k[3] | k[4] | k[5]) & (K[2] - Z)))
        {                    // Check Strong Link Line wise
          K[2] -= Z;
          g[K[3]] &= ~K[2];
          g[K[4]] &= ~K[2];
          g[K[5]] &= ~K[2];
          g[K[6]] &= ~K[2];
          g[K[7]] &= ~K[2];
          g[K[8]] &= ~K[2];
#if RJ > 2
          printf ("%d) Found W-Wings Type 2 %s Cells %d %d Clues %d Strong Link Mini-%s Cells %d %d %d Clue %d drop Clue %d from Cells %d %d %d %d %d %d\n",
            p, X[2][0] ? "Stack" : "Band", K[0], K[1], b[g[K[0]]], X[2][0] ? "Column" : "Row",
            L, w[L][W[3][X[2][0]]], w[L][W[4][X[2][0]]], b[Z], b[g[K[0]] - Z], K[3], K[5], K[6], K[4], K[7], K[8]);
#endif
          if (solve (p))
            return 1;
#if RJ > 2
          printf ("%d) Restore W-Wings Type 2 %s Cells %d %d Clues %d Strong Link Mini-%s Cells %d %d %d Clue %d add Clue %d to Cells %d %d %d %d %d %d\n",
            p, X[2][0] ? "Stack" : "Band", K[0], K[1], b[g[K[0]]], X[2][0] ? "Column" : "Row",
            L, w[L][W[3][X[2][0]]], w[L][W[4][X[2][0]]], b[Z], b[g[K[0]] - Z], K[3], K[5], K[6], K[4], K[7], K[8]);
#endif
          g[K[3]] = k[0];
          g[K[4]] = k[1];
          g[K[5]] = k[2];
          g[K[6]] = k[3];
          g[K[7]] = k[4];
          g[K[8]] = k[5];
#if RJ > 3
          prn ();
#endif
          return 0;
        }
      }
      else                   // First and second Cell positions Grid wise
        for (a = 0; a < 2; ++a)
        {                    // Search W-Wings Type 1 Strong Link Line and ERI wise
          for (K[6] = 0; K[6] < 2; ++K[6])
            for (K[7] = 0; K[7] < 2; ++K[7])
              if ((Z = (g[K[8] = w[K[a]][W[3 + K[7]][!K[6]]]] |
                g[w[K[8]][W[3][K[6]]]] | g[w[K[8]][W[4][K[6]]]]) &
                g[K[9] = w[K[K[6] ? 4 - a : 3 + a]][W[3 + K[7]][!K[6]]]] & K[2]) &&
                !(g[w[K[8]][L = W[1][K[6]]]] & Z) + !(g[w[K[8]][L + 1]] & Z) +
                !(g[w[K[8]][L + 2]] & Z) + !(g[w[K[8]][L + 3]] & Z) +
                !(g[w[K[8]][L + 4]] & Z) + !(g[w[K[8]][L + 5]] & Z) > 4 &&
                ((k[0] | k[1]) & (K[2] - Z)))
              {              // Check Strong Link Line wise
                K[2] -= Z;
                g[K[3]] &= ~K[2];
                g[K[4]] &= ~K[2];
#if RJ > 2
                printf ("%d) Found W-Wings Type 1 Grid Cells %d %d Clues %d Strong Link Line between Cells %d %d %d and Cell %d Clue %d drop Clue %d from Cells %d %d\n",
                  p, K[0], K[1], b[g[K[0]]], K[8], w[K[8]][W[3][K[6]]], w[K[8]][W[4][K[6]]],
                  K[9], b[Z], b[g[K[0]] - Z], K[3], K[4]);
#endif
                if (solve (p))
                  return 1;
#if RJ > 2
                printf ("%d) Restore W-Wings Type 1 Grid Cells %d %d Clues %d Strong Link Line between Cells %d %d %d and Cell %d Clue %d add Clue %d to %d %d\n",
                  p, K[0], K[1], b[g[K[0]]], K[8], w[K[8]][W[3][K[6]]], w[K[8]][W[4][K[6]]],
                  K[9], b[Z], b[g[K[0]] - Z], K[3], K[4]);
#endif
                g[K[3]] = k[0];
                g[K[4]] = k[1];
#if RJ > 3
                prn ();
#endif
                return 0;
              }
          if ((Z = (g[L = K[3 + a]] | g[w[L][6]] | g[w[L][7]]) & (g[L] | g[w[L][12]] | g[w[L][13]]) &
            ~(g[w[L][8]] | g[w[L][9]] | g[w[L][10]] | g[w[L][11]]) & K[2]) &&
            ((k[0] | k[1]) & (K[2] - Z)))
          {                  // Check Strong Link ERI wise
            K[2] -= Z;
            g[K[3]] &= ~K[2];
            g[K[4]] &= ~K[2];
#if RJ > 2
            printf ("%d) Found W-Wings Type 1 Grid Cells %d %d Clues %d Strong Link ERI Cell %d Clue %d drop Clue %d from Cells %d %d\n",
              p, K[0], K[1], b[g[K[0]]], L, b[Z], b[g[K[0]] - Z], K[3], K[4]);
#endif
            if (solve (p))
              return 1;
#if RJ > 2
            printf ("%d) Restore W-Wings Type 1 Grid Cells %d %d Clues %d Strong Link ERI Cell %d Clue %d add Clue %d to %d %d\n",
              p, K[0], K[1], b[g[K[0]]], L, b[Z], b[g[K[0]] - Z], K[3], K[4]);
#endif
            g[K[3]] = k[0];
            g[K[4]] = k[1];
#if RJ > 3
            prn ();
#endif
            return 0;
          }
        }
      for (a = X[2][0]; a <= X[2][1]; ++a)
        for (L = X[0][a]; L < X[1][a]; ++L)
        {                    // Search W-Wings Type 1 and Type 2 Strong Link Line wise
          if ((Z = (g[w[K[0]][L]] & g[w[K[3 + a]][L]]) &
            ~(g[w[w[K[3 + a]][L]][W[3][a]]] | g[w[w[K[3 + a]][L]][W[4][a]]] |
            g[w[w[K[0]][L]][W[3][a]]] | g[w[w[K[0]][L]][W[4][a]]] | g[w[w[K[0]][L]][X[0][!a]]] |
            g[w[w[K[0]][L]][X[0][!a] + 1]] | g[w[w[K[0]][L]][X[0][!a] + 2]]) & K[2]) &&
            ((k[0] | k[1] | k[2] | k[3] | k[4] | k[5]) & (K[2] - Z)))
          {                  // Check Strong Link Line wise
            K[2] -= Z;
            g[K[3]] &= ~K[2];
            g[K[4]] &= ~K[2];
            if (K[5] + 1)
            {
              g[K[5]] &= ~K[2];
              g[K[6]] &= ~K[2];
              g[K[7]] &= ~K[2];
              g[K[8]] &= ~K[2];
            }
#if RJ > 2
            printf ("%d) Found W-Wings Type %s Cells %d %d Clues %d Strong Link Line between Cell %d and Cell %d Clue %d drop Clue %d from Cells %d ",
              p, X[2][0] != X[2][1] ? "1 Grid" : X[2][0] ? "2 Stack" : "2 Band",
              K[0], K[1], b[g[K[0]]], w[K[0]][L], w[K[3 + a]][L], b[Z], b[g[K[0]] - Z], K[3]);
            if (K[5] + 1)
              printf ("%d %d %d %d %d\n", K[5], K[6], K[4], K[7], K[8]);
            else
              printf ("%d\n", K[4]);
#endif
              if (solve (p))
                return 1;
#if RJ > 2
            printf ("%d) Restore W-Wings Type %s Cells %d %d Clues %d Strong Link Line between Cell %d and Cell %d Clue %d add Clue %d to %d ",
              p, X[2][0] != X[2][1] ? "1 Grid" : X[2][0] ? "2 Stack" : "2 Band",
              K[0], K[1], b[g[K[0]]], w[K[0]][L], w[K[3 + a]][L], b[Z], b[g[K[0]] - Z], K[3]);
            if (K[5] + 1)
              printf ("%d %d %d %d %d\n", K[5], K[6], K[4], K[7], K[8]);
            else
              printf ("%d\n", K[4]);
#endif
            g[K[3]] = k[0];
            g[K[4]] = k[1];
            if (K[5] + 1)
            {
              g[K[5]] = k[2];
              g[K[6]] = k[3];
              g[K[7]] = k[4];
              g[K[8]] = k[5];
            }
#if RJ > 3
            prn ();
#endif
            return 0;
          }
          if ((Z = (g[w[K[0]][L]] | g[w[w[K[0]][L]][6]] | g[w[w[K[0]][L]][7]]) &
            (g[w[K[0]][L]] | g[w[w[K[0]][L]][12]] | g[w[w[K[0]][L]][13]]) &
            ~(g[w[w[K[0]][L]][8]] | g[w[w[K[0]][L]][9]] | g[w[w[K[0]][L]][10]] |
            g[w[w[K[0]][L]][11]] | g[w[w[K[3 + a]][L]][12]] | g[w[w[K[3 + a]][L]][8]] |
            g[w[w[K[3 + a]][L]][9]] | g[w[w[K[3 + a]][L]][10]] | g[w[w[K[3 + a]][L]][11]] |
            g[w[w[K[3 + a]][L]][12]]) & (g[w[K[3 + a]][L]] | g[w[w[K[3 + a]][L]][6]] | g[w[w[K[3 + a]][L]][7]]) &
            (g[w[K[3 + a]][L]] | g[w[w[K[3 + a]][L]][12]] | g[w[w[K[3 + a]][L]][13]]) & K[2]) &&
            ((k[0] | k[1] | k[2] | k[3] | k[4] | k[5]) & (K[2] - Z)))
          {                  // Check Strong Link ERI wise
            K[2] -= Z;
            g[K[3]] &= ~K[2];
            g[K[4]] &= ~K[2];
            if (K[5] + 1)
            {
              g[K[5]] &= ~K[2];
              g[K[6]] &= ~K[2];
              g[K[7]] &= ~K[2];
              g[K[8]] &= ~K[2];
            }
#if RJ > 2
            printf ("%d) Found W-Wings Type %s Cells %d %d Clues %d Strong Link between ERI Cell %d and ERI Cell %d Clue %d drop Clue %d from Cells %d ",
              p, X[2][0] != X[2][1] ? "1 Grid" : X[2][0] ? "2 Stack" : "2 Band",
              K[0], K[1], b[g[K[0]]], w[K[0]][L], w[K[3 + a]][L], b[Z], b[g[K[0]] - Z], K[3]);
            if (K[5] + 1)
              printf ("%d %d %d %d %d\n", K[5], K[6], K[4], K[7], K[8]);
            else
              printf ("%d\n", K[4]);
#endif
            if (solve (p))
              return 1;
#if RJ > 2
            printf ("%d) Restore W-Wings Type %s Cells %d %d Clues %d Strong Link between ERI Cell %d and ERI Cell %d Clue %d add Clue %d to %d ",
              p, X[2][0] != X[2][1] ? "1 Grid" : X[2][0] ? "2 Stack" : "2 Band",
              K[0], K[1], b[g[K[0]]], w[K[0]][L], w[K[3 + a]][L], b[Z], b[g[K[0]] - Z], K[3]);
            if (K[5] + 1)
              printf ("%d %d %d %d %d\n", K[5], K[6], K[4], K[7], K[8]);
            else
              printf ("%d\n", K[4]);
#endif
            g[K[3]] = k[0];
            g[K[4]] = k[1];
            if (K[5] + 1)
            {
              g[K[5]] = k[2];
              g[K[6]] = k[3];
              g[K[7]] = k[4];
              g[K[8]] = k[5];
            }
#if RJ > 3
            prn ();
#endif
            return 0;
          }
        }
    }
  }
  for (a = p; a < q; ++a)    // Search WXYZ-Wings Type 1 unsolved Cell position wise
  {
    if (B[g[r[a]]] > 3 ||    // Skip for either unsolved Cell Clues more than three digits; or
      !(g[w[r[a]][0]] | g[w[r[a]][1]] | g[w[r[a]][2]] |
      g[w[r[a]][3]] | g[w[r[a]][4]] | g[w[r[a]][5]]) ||
      !(g[w[r[a]][14]] | g[w[r[a]][15]] | g[w[r[a]][16]] |
      g[w[r[a]][17]] | g[w[r[a]][18]] | g[w[r[a]][19]]))
      continue;              // No unsolved Cell position in Apex either Row or Column Cell Clues
    int K[6] = {r[a], 0};    // Assign Apex Cell position

    for (; K[1] < 8; ++K[1]) // Search first Wing Cell position Row wise
    {
      if (!g[w[K[0]][K[1]]] || B[g[K[0]] | g[w[K[0]][K[1]]]] > 4)
        continue;            // Skip for either Row Wing Cell position not unsolved; or Apex and Row Wing Cells Clues more than four digits
      for (K[2] = K[1] > 5 ? 14 : 12; K[2] < 20; ++K[2])
      {                      // Search second Wing Cell position Column wise
        if (!g[w[K[0]][K[2]]] || B[g[K[0]] | g[w[K[0]][K[1]]] | g[w[K[0]][K[2]]]] > 4)
          continue;          // Skip for either Column Wing Cell position not unsolved; or Apex, Row and Column Wings Cells Clues more than four digits
        for (y = 0; y < 2; ++y)
                             // Search third Wing Cell position Line wise
          for (K[3] = !y && K[1] > 5 ? 0 : K[1 + y] + (y && K[2] == 12) + 1; K[3] < W[2][y]; ++K[3])
          {                  // Search Line Wing Cell position
            if (!g[w[K[0]][K[3]]] || B[g[K[0]] | g[w[K[0]][K[1]]] | g[w[K[0]][K[2]]] | g[w[K[0]][K[3]]]] > 4 ||
                             // Skip for either Line Wing Cell position not unsolved; or Apex and Wings Cells Clues more than four digits; or
              B[g[w[K[0]][K[2 - y]]]] != 2 ||
                             // Column (or Row) Wing Cell Clues not two digits; or
              B[g[w[K[0]][K[1 + y]]] | g[w[K[0]][K[3]]]] != 3 ||
                             // Row (or Column) and Line Wing Cells Clues not three digits; or
              B[K[4] = g[w[K[0]][K[2 - y]]] & (g[w[K[0]][K[1 + y]]] | g[w[K[0]][K[3]]])] != 1 ||
                             // Wing Cells common Clue not one digit; or
              (g[K[0]] & K[4]) ||
                             // Wing Cells common Clue in Apex Cell Clues; or
              (g[w[K[0]][K[1 + y]]] & K[4]) == (g[w[K[0]][K[3]]] & K[4]))
              continue;      // Wing Cells common Clue in Both Row (or Column) and Line Wing Cells Clues
            if (g[K[5] = w[K[0]][K[g[w[K[0]][K[1]]] & K[4] ? 1 : 3]] - K[0] +
              w[K[0]][K[g[w[K[0]][K[2]]] & K[4] ? 2 : 3]]] & K[4])
            {                // Check no Wing Cells common Clue in WXYZ-Wings Type 1 exclusion Cell Clues
                             // Drop Wing Cells common Clue from WXYZ-Wings Type 1 exclusion Cell position
              g[K[5]] &= ~K[4];
#if RJ > 2
              printf ("%d) Found WXYZ-Wings Type 1 Cells %d %d %d %d Clues %d drop Clue %d from Cell %d\n",
                p, K[0], w[K[0]][K[1]], w[K[0]][K[2]], w[K[0]][K[3]],
                b[g[w[K[0]][K[1]]] | g[w[K[0]][K[2]]] | g[w[K[0]][K[3]]]], b[K[4]], K[5]);
#endif
              if (solve (p))
                return 1;
#if RJ > 2
              printf ("%d) Restore WXYZ-Wings Type 1 Cells %d %d %d %d Clues %d add Clue %d to Cell %d\n",
                p, K[0], w[K[0]][K[1]], w[K[0]][K[2]], w[K[0]][K[3]],
                b[g[w[K[0]][K[1]]] | g[w[K[0]][K[2]]] | g[w[K[0]][K[3]]]], b[K[4]], K[5]);
#endif
              g[K[5]] |= K[4];
#if RJ > 3
              prn ();
#endif
              return 0;      // Restore Wing Cells common Clue to WXYZ-Wings Type 1 exclusion Cell Clues
            }
// WXYZ-Wings Type 1 Transport
          }
      }
    }
  }
  for (a = p; a < q; ++a)    // Search WXYZ-Wings Type 2a, Type 2b, Type 3, Type 4a and Type 4b unsolved Cell position wise
  {
    if (B[g[r[a]]] > 4)      // Skip for unsolved Cell Clues more than four digits
      continue;
    int K[5] = {r[a]};       // Assign Apex Cell position

    for (y = 0; y < 2; ++y)  // Search Wing Cells position Chute wise
    {
      if(!(g[w[r[a]][W[6][y]]] | g[w[r[a]][W[6][y] + 1]] | g[w[r[a]][W[6][y] + 2]] |
        g[w[r[a]][W[6][y] + 3]] | g[w[r[a]][W[6][y] + 4]] | g[w[r[a]][W[6][y] + 5]]) ||
        !(g[w[r[a]][W[1][y]]] | g[w[r[a]][W[1][y] + 1]] | g[w[r[a]][W[1][y] + 2]] |
        g[w[r[a]][W[1][y] + 3]] | g[w[r[a]][W[1][y] + 4]] | g[w[r[a]][W[1][y] + 5]]))
        continue;            // Skip for no unsolved Cell position in either Apex Box or Line
      for (K[1] = W[6][y]; K[1] < W[0][y]; ++K[1])
      {                      // Search first Wing Cell position Box wise
        if (!g[w[K[0]][K[1]]] || B[g[K[0]] | g[w[K[0]][K[1]]]] > 4)
          continue;          // Skip for either Box Wing Cell position not unsolved; or Apex and Box Wing Cell Clues more than four digits
        for (K[2] = W[1][y]; K[2] < W[2][y]; ++K[2])
        {                    // Search second Wing Cell position Line wise
          if (!g[w[K[0]][K[2]]] || B[g[K[0]] | g[w[K[0]][K[1]]] | g[w[K[0]][K[2]]]] > 4)
            continue;        // Skip for either Line Wing Cell position not unsolved; or Apex, Box and Line Wings Cells Clues more than four digits
          for(K[3] = 3; K[3] < 5; ++K[3])
          {                  // Search second Apex Cell position mini-Line wise
            if (!g[w[K[0]][W[K[3]][y]]] ||
                             // Skip for either second Apex Cell position not unsolved; or
              B[g[K[0]] | g[w[K[0]][K[1]]] | g[w[K[0]][K[2]]] | g[w[K[0]][W[K[3]][y]]]] != 4 ||
                             // Apex Cells Clues and Wing Cells Clues not four digits; or
              !((g[K[0]] | g[w[K[0]][W[K[3]][y]]]) & g[w[K[0]][K[1]]]) ||
                             // No common Clue in Apex Cells and Box Wing Cell Clues; or
              !((g[K[0]] | g[w[K[0]][W[K[3]][y]]]) & g[w[K[0]][K[2]]]) ||
                             // No common Clue in Apex Cells and Line Wing Cell Clues; or
              B[K[4] = g[w[K[0]][K[1]]] & g[w[K[0]][K[2]]]] != 1)
              continue;      // Wing Cells common Clue not one digit
            int L = -1,
                k[4] = {g[w[K[0]][W[7 - K[3]][y]]]};
                             // Backup WXYZ-Wings Type 4b exclusion Cell position
            if (~(g[K[0]] | g[w[K[0]][W[K[3]][y]]]) & K[4])
            {                // Check no Wing Cells common Clue in Apex Cells Clues
              L = W[K[2] < W[5][y] ? 1 : 5][y];
                             // Assign Wing Cells common first exclusion Cell position
              k[1] = g[w[w[K[0]][K[1]]][L]];
              k[2] = g[w[w[K[0]][K[1]]][L + 1]];
              k[3] = g[w[w[K[0]][K[1]]][L + 2]];
            }                // Backup WXYZ-Wings Type 4a more exclusion Cell positions
            if ((k[0] | k[1] | k[2] | k[3]) & K[4])
            {                // Check WXYZ-Wings Type 4a and Type 4b exclusion Cells Clues
                             // Drop Wing Cells common Clue from WXYZ-Wings Type 4b exclusion Cell position
              g[w[K[0]][W[7 - K[3]][y]]] &= ~K[4];
              if (L + 1)
              {              // Drop Wing Cells common Clue from WXYZ-Wings Type 4a more exclusion Cell positions
                g[w[w[K[0]][K[1]]][L]] &= ~K[4];
                g[w[w[K[0]][K[1]]][L + 1]] &= ~K[4];
                g[w[w[K[0]][K[1]]][L + 2]] &= ~K[4];
              }
#if RJ > 2
              printf ("%d) Found WXYZ-Wings Type 4%c Cells %d %d %d %d Clues %d drop Clue %d from Cell",
                p, L + 1 ? 'a' : 'b', K[0], w[K[0]][W[K[3]][y]], w[K[0]][K[1]], w[K[0]][K[2]],
                b[g[K[0]] | g[w[K[0]][K[1]]] | g[w[K[0]][K[2]]] | g[w[K[0]][W[K[3]][y]]]], b[K[4]]);
              if (L + 1)
                printf ("s %d %d %d %d\n", w[K[0]][W[7 - K[3]][y]], w[w[K[0]][K[1]]][L], w[w[K[0]][K[1]]][L + 1], w[w[K[0]][K[1]]][L + 2]);
              else
                printf (" %d\n", w[K[0]][W[7 - K[3]][y]]);
#endif
              if (solve (p))
                return 1;
#if RJ > 2
              printf ("%d) Restore WXYZ-Wings Type 4%c Cells %d %d %d %d Clues %d add Clue %d to Cell",
                p, L + 1 ? 'a' : 'b', K[0], w[K[0]][W[K[3]][y]], w[K[0]][K[1]], w[K[0]][K[2]],
                b[g[K[0]] | g[w[K[0]][K[1]]] | g[w[K[0]][K[2]]] | g[w[K[0]][W[K[3]][y]]]], b[K[4]]);
              if (L + 1)
                printf ("x %d %d %d %d\n", w[K[0]][W[7 - K[3]][y]], w[w[K[0]][K[1]]][L], w[w[K[0]][K[1]]][L + 1], w[w[K[0]][K[1]]][L + 2]);
              else
                printf (" %d\n", w[K[0]][W[7 - K[3]][y]]);
#endif
              g[w[K[0]][W[7 - K[3]][y]]] = k[0];
              if (L + 1)
              {
                g[w[w[K[0]][K[1]]][L]] = k[1];
                g[w[w[K[0]][K[1]]][L + 1]] = k[2];
                g[w[w[K[0]][K[1]]][L + 2]] = k[3];
              }
#if RJ > 3
              prn ();
#endif
              return 0;      // Restore WXYZ-Wings Type 4a and Type 4b exclusion Cells Clues
            }
          }
          for (Y = 0; Y < 2; ++Y)
                             // Search third Wing Cell position Box and Line wise
            for (K[3] = K[1 + Y] + 1; K[3] < W[Y + Y][y]; ++K[3])
            {                // Search third Wing Cell position
              if (!g[w[K[0]][K[3]]] ||
                             // Skip for either third Wing Cell position not unsolved; or
                B[g[K[0]] | g[w[K[0]][K[1]]] | g[w[K[0]][K[2]]] | g[w[K[0]][K[3]]]] != 4 ||
                             // Apex and Wings Cells Clues not four digits; or
                !(g[K[0]] & g[w[K[0]][K[2 - Y]]]) ||
                             // No common Clue in Apex and Box (or Line) Wing Cells Clues; or
                !(g[K[0]] & (g[w[K[0]][K[1 + Y]]] | g[w[K[0]][K[3]]])) ||
                             // No common Clue in Apex and Line (or Box) or third Wings Cells Clues; or
                B[K[4] = g[w[K[0]][K[2 - Y]]] & (g[w[K[0]][K[1 + Y]]] | g[w[K[0]][K[3]]])] != 1)
                continue;    // Wing Cells common Clue not one digit
              int X[2] = {-1},
                  k[5] = {g[w[K[0]][W[3][y]]], g[w[K[0]][W[4][y]]]};
                             // Backup WXYZ-Wings Type 2b and Type 3 exclusion Cell positions
              if ((~g[K[0]] & K[4]) &&
                             // Check no Wing Cells common Clue in Apex Cell Clues; and
                (w[K[0]][K[3]] == w[w[K[0]][K[1 + Y]]][W[3][y]] ||
                w[K[0]][K[3]] == w[w[K[0]][K[1 + Y]]][W[4][y]] ||
                             // Third Wing Cell position within first (or second) Wing Cell position mini-Line; or
                (g[w[K[0]][K[1 + Y]]] & K[4]) != (g[w[K[0]][K[3]]] & K[4])))
              {              // Apex and first (or second) Wing Cells Clues not equals to Apex Cell Clues and third Wing Cell Clues
                X[0] = w[K[0]][K[g[w[K[0]][K[1]]] & g[w[K[0]][K[2 - Y]]] & (g[w[K[0]][K[1 + Y]]] | g[w[K[0]][K[3]]]) ? 1 : 3]];
                X[1] = W[K[g[w[K[0]][K[2]]] & g[w[K[0]][K[2 - Y]]] & (g[w[K[0]][K[1 + Y]]] | g[w[K[0]][K[3]]]) ? 2 : 3] < W[5][y] ? 1 : 5][y];
                k[2] = g[w[X[0]][X[1]]];
                k[3] = g[w[X[0]][X[1] + 1]];
                k[4] = g[w[X[0]][X[1] + 2]];
              }              // Backup WXYZ-Wings Type 2a more exclusion Cell positions
              if ((k[0] | k[1] | k[2] | k[3] | k[4]) & K[4])
              {              // Check WXYZ-Wings Type 2a, Type 2b and Type 3 exclusion Cells Clues
                             // Drop Wing Cells common Clue from WXYZ-Wings Type 2b and Type 3 exclusion Cell positions
                g[w[K[0]][W[3][y]]] &= ~K[4];
                g[w[K[0]][W[4][y]]] &= ~K[4];
                if (X[0] + 1)
                {            // Drop Wing Cells common Clue from WXYZ-Wings Type 2a more exclusion Cell positions
                  g[w[X[0]][X[1]]] &= ~K[4];
                  g[w[X[0]][X[1] + 1]] &= ~K[4];
                  g[w[X[0]][X[1] + 2]] &= ~K[4];
                }
#if RJ > 2
                if (X[0] + 1)
                  printf ("%d) Found WXYZ-Wings Type 2a Cells %d %d %d %d Clues %d drop Clue %d from Cells %d %d %d %d %d\n",
                    p, K[0], w[K[0]][K[1]], w[K[0]][K[2]], w[K[0]][K[3]], b[g[K[0]] | g[w[K[0]][K[1]]] | g[w[K[0]][K[2]]] | g[w[K[0]][K[3]]]],
                    b[K[4]], w[K[0]][W[3][y]], w[K[0]][W[4][y]], w[X[0]][X[1]], w[X[0]][X[1] + 1], w[X[0]][X[1] + 2]);
                else
                  printf ("%d) Found WXYZ-Wings Type %s Cells %d %d %d %d Clues %d drop Clue %d from Cells %d %d\n",
                    p, g[K[0]] & K[4] ? "3" : "2b", K[0], w[K[0]][K[1]], w[K[0]][K[2]], w[K[0]][K[3]],
                    b[g[K[0]] | g[w[K[0]][K[1]]] | g[w[K[0]][K[2]]] | g[w[K[0]][K[3]]]], b[K[4]], w[K[0]][W[3][y]], w[K[0]][W[4][y]]);
#endif
                if (solve (p))
                  return 1;
#if RJ > 2
                if (X[0] + 1)
                  printf ("%d) Restore WXYZ-Wings Type 2a Cells %d %d %d %d Clues %d add Clue %d to Cells %d %d %d %d %d\n",
                    p, K[0], w[K[0]][K[1]], w[K[0]][K[2]], w[K[0]][K[3]], b[g[K[0]] | g[w[K[0]][K[1]]] | g[w[K[0]][K[2]]] | g[w[K[0]][K[3]]]],
                    b[K[4]], w[K[0]][W[3][y]], w[K[0]][W[4][y]], w[X[0]][X[1]], w[X[0]][X[1] + 1], w[X[0]][X[1] + 2]);
                else
                  printf ("%d) Restore WXYZ-Wings Type %s Cells %d %d %d %d Clues %d add Clue %d to Cells %d %d\n",
                    p, g[K[0]] & K[4] ? "3" : "2b", K[0], w[K[0]][K[1]], w[K[0]][K[2]], w[K[0]][K[3]],
                    b[g[K[0]] | g[w[K[0]][K[1]]] | g[w[K[0]][K[2]]] | g[w[K[0]][K[3]]]], b[K[4]], w[K[0]][W[3][y]], w[K[0]][W[4][y]]);
#endif
                g[w[K[0]][W[3][y]]] = k[0];
                g[w[K[0]][W[4][y]]] = k[1];
                if (X[0] + 1)
                {
                  g[w[X[0]][X[1]]] = k[2];
                  g[w[X[0]][X[1] + 1]] = k[3];
                  g[w[X[0]][X[1] + 2]] = k[4];
                }
#if RJ > 3
                prn ();
#endif
                return 0;    // Restore WXYZ-Wings Type 2a, Type 2b and Type 3 exclusion Cells Clues
              }
// WXYZ-Wings Hybrid Type 1 and Type 2
// WXYZ-Wings Type 2a, Type 2b and Type 3 Transport
            }
        }
      }
    }
  }
  y = 2;                     // 2 Represent Guess
  if (++n[3] > n[4])
    ++n[4];
NHSCF:
  if (x > p)                 // Check current Cell position for sorting and excluding
  {
    a = r[p];
    r[p] = r[x];
    r[x] = a;
  }
  for (Y = g[r[p]], g[r[p]] = 0; s[r[p]] = z & -z; z -= s[r[p]])
  {                          // Backup and clear current Cell Clues and assign current Cell position to each current Cell Clue
    int k = 0;

    for (++n[y], a = 0; a < 20; ++a)
                             // Search 20 peer Cell positions
      if (g[w[r[p]][a]] & s[r[p]])
      {
        k |= 1 << a;         // Backup and drop current Cell Clue from 20 peer Cell positions
        g[w[r[p]][a]] &= ~s[r[p]];
      }
#if RJ > 2
    printf ("%d) Apply %s Cell %d Clue %d from Clues %d\n",
      p, y ? (y > 1 ? "Trial and Error" : "Hidden single") : "Naked single",
      r[p], b[s[r[p]]], b[Y]);
#endif
    if (p + 1 == q || solve (p + 1))
      return 1;              // Check either all Cell positions solved; or recursive solve for next unsolved Cell position
#if RJ > 2
    printf ("%d) Restore %s Cell %d Clue %d to Clues %d\n",
      p, y ? (y > 1 ? "Trial and Error" : "Hidden single") : "Naked single",
      r[p], b[s[r[p]]], b[Y]);
#endif
    while (a)                // Restore current Cell Clue to 20 peer Cell positions
      if (k & (1 << --a))
        g[w[r[p]][a]] |= s[r[p]];
#if RJ > 3
    g[r[p]] = Y;             // Restore current Cell Clues to current Cell position
    prn ();
    g[r[p]] = 0;             // Drop current Cell Clues from current Cell position
#endif
  }
  if (y == 2)
    --n[3];
  g[r[p]] = Y;               // Restore current Cell Clues to current Cell position
  return 0;
}

int check (int p, int q)
{
  if ((s[w[p][0]] | s[w[p][1]] | s[w[p][2]] | s[w[p][3]] | s[w[p][4]] |
    s[w[p][5]] | s[w[p][6]] | s[w[p][7]] | s[w[p][8]] | s[w[p][9]] |
    s[w[p][10]] | s[w[p][11]] | s[w[p][12]] | s[w[p][13]] | s[w[p][14]] |
    s[w[p][15]] | s[w[p][16]] | s[w[p][17]] | s[w[p][18]] | s[w[p][19]]) & q)
    return 0;                // Check duplicate Cell Clue in 20 peer Clue Cell positions
  return q;
}

int invalid (void)
{
  int a,
      p = 0;

  for (; p < 81; ++p)
  {
    g[p] = 0;                // Clear Cell Clues
    if (!s[p])               // Check unsolved Cell position
    {
      for (a = 1; a < 257; a <<= 1)
        g[p] |= check (p, a);// Check constraint and assign Cell Clue for unsolved Cell position digit wise
      if (!g[p])             // Check no Cell Clue assigned
        return 1;
      r[q++] = p;            // Assign unsolved Cell position for sorting and excluding
    }
    else if (!check (p, s[p]))
      return 1;              // Check constraint for clue Cell position
  }
  return 0;
}

int main (void)
{
  int a = -1,
      m,
      i = 0,
      t = 0,
      u = 0,
      v = 0,
      y = 0;

  float c,
        d = 0,
        e = 0,
        f = 0,
        k = 0;

  FILE *o = fopen ("sudoku.txt", "r");

  n[5] = n[6] = n[7] = 0;
  if (o == NULL)
    printf ("Error: Unable to open sudoku.txt file for read !!\n");
  else
    do
    {
      if ((m = fgetc (o)) != 10 && m != EOF && a < 80)
        s[++a] = m < 49 || m > 57 ? 0 : 1 << (m - 49);
                             // Assign given Cell positions
      else if (m == 10 || m == EOF)
      {
#if RJ > 1
        printf ("\n");
#endif
        q = n[0] = n[1] = n[2] = n[3] = n[4] = 0;
        c = clock ();
        while (a < 80)       // Clear remaining unsolved Cell positions
          s[++a] = 0;
        if (invalid ())
        {
          c = (clock () - c) / CLOCKS_PER_SEC;
          d += c;
          ++t;
          ++i;
#if RJ
          printf ("%ld) Error: Invalid Sudoku! # I%ld", t, i);
#endif
        }
        else if (!q)
        {
          c = (clock () - c) / CLOCKS_PER_SEC;
          k += c;
          ++t;
          ++y;
#if RJ
          printf ("%ld) Valid Sudoku # V%ld", t, y);
#endif
        }
        else if (solve (0))
        {
          c = (clock () - c) / CLOCKS_PER_SEC;
          e += c;
          ++t;
          ++v;
          if (!n[2])
            ++n[5];
          if (n[2] > n[6])
            n[6] = n[2];
          if (n[4] > n[7])
            n[7] = n[4];
#if RJ
          printf ("%ld) ", t);
          for (a = 0; a < 81; ++a)
            printf ("%d", b[s[a]]);
          printf (" # S%ld", v);
#endif
        }
        else
        {
          c = (clock () - c) / CLOCKS_PER_SEC;
          f += c;
          ++t;
          ++u;
#if RJ
          printf ("%ld) Error: Unsolvable Sudoku! # U%ld", t, u);
#endif
        }
#if RJ
        printf (" # C%d # N%ld # H%ld # G%ld # D%ld # %f\n", 81 - q, n[0], n[1], n[2], n[4], c);
#endif
        a = -1;
      }
#if RJ > 1
      if (m != 10 && m != 13 && m != EOF)
        printf ("%c", m);
#endif
    }
    while (m != EOF);
  printf ("=======================================\n");
  printf ("Total Sudoku puzzles read  : %ld\n", t);
  printf ("Total time for all puzzles : %f\n", d + k + e + f);
  printf ("Average time per puzzle    : %f\n", t ? (d + k + e + f) / t : 0);
  printf ("Number of valid puzzles    : %ld\n", y);
  printf ("Time for valid puzzles     : %f\n", k);
  printf ("Average time per valid     : %f\n", y ? k / y : 0);
  printf ("Number of invalid puzzles  : %ld\n", i);
  printf ("Time for invalid puzzles   : %f\n", d);
  printf ("Average time per invalid   : %f\n", i ? d / i : 0);
  printf ("Number of solved puzzles   : %ld\n", v);
  printf ("Time for solved puzzles    : %f\n", e);
  printf ("Average time per solved    : %f\n", v ? e / v : 0);
  printf ("Number of unsolved puzzle  : %ld\n", u);
  printf ("Time for unsolved puzzles  : %f\n", f);
  printf ("Average time per unsolved  : %f\n", u ? f / u : 0);
  printf ("Total solved without guess : %d\n", n[5]);
  printf ("Total solved with guess    : %d\n", v - n[5]);
  printf ("Maximum number of guess    : %d\n", n[6]);
  printf ("Maximum number of depth    : %d\n", n[7]);
  if (fclose (o) == EOF)
    printf ("Error: Unable to close sudoku.txt file !!");
}
