# GD::Barcode::QRcode 1.20 Edited (^^;;; by Hippo2000
#    based on QRcode image CGI    version 0.50   (C)2000-2002,Y.Swetake
use strict;
package GD::Barcode::QRcode;

BEGIN{eval {require 'GD.pm';};};
require Exporter;
use vars qw($VERSION @ISA $errStr);
@ISA = qw(GD::Barcode Exporter);
$VERSION=0.01;
#Prototype
sub _calcVersion($$$);
sub _calcMask($$$);
sub _cnv8bit($$$$);
sub _cnvAlphaNumeric($$$$);
sub _cnvNumeric($$$$);
sub _calcFrm($$$);

#------------------------------------------------------------------------------
# new (for GD::Barcode::QR)
#------------------------------------------------------------------------------
sub new($$;$) {
  my($sClass, $sTxt, $rhPrm) = @_;
  $errStr ='';
  my $oSelf = {};
  bless $oSelf;
  return undef if($errStr = $oSelf->init($sTxt, $rhPrm));
  return $oSelf;
}
#------------------------------------------------------------------------------
# init (for GD::Barcode::QR)
#------------------------------------------------------------------------------
sub init($$$){
    my($oSelf, $sTxt, $rhPrm) =@_;

#CalcCd
    $oSelf->{text} = $sTxt;
    $oSelf->{Ecc} = $rhPrm->{Ecc} || ' ';
    $oSelf->{Ecc} =~ tr/LMHQ/M/c;    #Not /LMQH/ => M
    $oSelf->{Version} = $rhPrm->{Version} || 1;
    $oSelf->{ModuleSize} = $rhPrm->{ModuleSize} || 1;
    $oSelf->{ModuleSize} = int($oSelf->{ModuleSize});

    my $iDatCnt = 0;
    my @aDatVal;
    my @aDatBit;
    my $raPlusWords;
    my $iWordsPos;
    $aDatBit[$iDatCnt]=4;
    # Determin Data Type(8Bit, AlphaNumeric, Numeric .. not supported Kanji-Mode)
    if ($oSelf->{text} =~ /\D/) {
        if ($oSelf->{text} =~ /[^0-9A-Z \$\*\%\+\-\.\/\:]/) {
         # --- 8bit byte mode
            ($iDatCnt, $raPlusWords) =
                $oSelf->_cnv8bit($iDatCnt, \@aDatVal, \@aDatBit,);
        }
        else {
         # ---- alphanumeric mode
            ($iDatCnt, $raPlusWords) =
                $oSelf->_cnvAlphaNumeric($iDatCnt, \@aDatVal, \@aDatBit);
        }
    }
    else {
     # ---- numeric mode
        ($iDatCnt, $raPlusWords) =
            $oSelf->_cnvNumeric($iDatCnt, \@aDatVal, \@aDatBit);
    }
    my $iTotalBits = 0;
    for(my $i=0;$i<$iDatCnt;++$i){
        $iTotalBits += $aDatBit[$i];
    }

    # Calc version(=Size)
    my ($iMaxDatBits, $iCdNumPlus, $iMaxCodeWords, $iRemainBits);
    ($iMaxDatBits, $iCdNumPlus, $iMaxCodeWords, $iRemainBits) = 
        $oSelf->_calcVersion($iTotalBits, $raPlusWords);
    $iTotalBits += $iCdNumPlus;

    $aDatBit[$oSelf->{WordsPos}] += $iCdNumPlus;
    $oSelf->{MaxModules}  = 17 + ($oSelf->{Version} * 4);
    my $iBitCnt = ($iMaxCodeWords * 8) + $iRemainBits;
    my $iMaxDatWords=($iMaxDatBits / 8);

    # ---- read version ECC data file.
    my ($sMatX, $sMatY, $sMasks, $sFmtInfX2, $sFmtInfY2, $sRsEccCodeWord, $sRso);
    my $sRec = do ('GD/Barcode/QRcode/qrv' . 
                    sprintf('%02d', $oSelf->{Version}) . $oSelf->{Ecc} . '.dat');

    ($sMatX, $sMatY, $sMasks, $sFmtInfX2, $sFmtInfY2, $sRsEccCodeWord, $sRso) = 
        unpack(("a$iBitCnt" x 3) . ('a15' x 2) . 'a1a128', pack('H*', $sRec));

    my $iRsEccWords = ord($sRsEccCodeWord);
    my @aMatrixX    = unpack("C*", $sMatX);
    my @aMatrixY    = unpack("C*", $sMatY);
    my @aMask       = unpack("C*", $sMasks);
    my @aRsBlockOrder  = unpack("C*", $sRso);
    my @aFmtInfX2      = unpack("C*", $sFmtInfX2);
    my @aFmtInfY2      = unpack("C*", $sFmtInfY2);

    $sRec = do ('GD/Barcode/QRcode/rsc' . sprintf('%02d', $iRsEccWords) . '.dat');
    my @aRsCalTbl = unpack("a$iRsEccWords" x 256, pack('H*', $sRec));

    # ----  set teminator 
    if ($iTotalBits <= ($iMaxDatBits-4)){
        $aDatVal[$iDatCnt] = 0;
        $aDatBit[$iDatCnt] = 4;
    } 
    elsif ($iTotalBits < $iMaxDatBits){
        $aDatVal[$iDatCnt] = 0;
        $aDatBit[$iDatCnt] = $iMaxDatBits-$iTotalBits;
    }
    elsif ($iTotalBits > $iMaxDatBits){
        die "Overflow error. version $oSelf->{Version}\n" . 
            "total bits: $iTotalBits  max bits: $iMaxDatBits\n";
    }
    # 8ƒrƒbƒg’PˆÊ‚É•ªŠ„
    my $iCodeWords=0;
    my @aCodeWords;
    $aCodeWords[0]=0;
    my $iRestBits = 8;
    for(my $i=0;$i <= $iDatCnt; ++$i) {
        my $sBuff    = $aDatVal[$i];
        my $iBuffBit = $aDatBit[$i];

        my $iFlg=1;
        while ($iFlg) {
            if ($iRestBits > $iBuffBit) {
                $aCodeWords[$iCodeWords]=(($aCodeWords[$iCodeWords] << $iBuffBit) | $sBuff);
                $iRestBits -= $iBuffBit;
                $iFlg=0;
            }
            else {
                $iBuffBit -= $iRestBits;
                $aCodeWords[$iCodeWords]=(($aCodeWords[$iCodeWords] << $iRestBits) | ($sBuff >> $iBuffBit));
                if ($iBuffBit==0) {
                    $iFlg=0;
                }
                else {
                    $sBuff= ($sBuff & ((1 << $iBuffBit) -1 ));
                    $iFlg=1;   
                } 
                $iCodeWords++;
                if ($iCodeWords<$iMaxDatWords-1){
                    $aCodeWords[$iCodeWords]=0;
                }
                $iRestBits = 8;
            }
        }
    }
    if ($iRestBits != 8) {
        $aCodeWords[$iCodeWords] <<= $iRestBits;
    }
    else {
        --$iCodeWords;
    }
    # Padding data
    if ($iCodeWords < $iMaxDatWords - 1 ){
        my $iFlg=1;
        while ($iCodeWords < ($iMaxDatWords-1)){
            $aCodeWords[++$iCodeWords] = ($iFlg==1)? 0xEC : 0x11;
            $iFlg *= -1;
        }
    }

    # ----  RS-ECC prepare
    my $iRsBlock=0;
    my @aRsTmp=();
    my $j=0;
    # Divide RS-Blocks
    for(my $i = 0; $i < $iMaxDatWords; ++$i) {
        $aRsTmp[$iRsBlock] .= chr($aCodeWords[$i]);
        if (++$j >= $aRsBlockOrder[$iRsBlock]-$iRsEccWords){
            $j=0;
            ++$iRsBlock;
        }
    }
    # RS-ECC main
    for($iRsBlock=0; $iRsBlock <= scalar(@aRsBlockOrder); $iRsBlock++) {
        my $sRsCodeWords = $aRsBlockOrder[$iRsBlock];
        $sRsCodeWords ||= 0;
        $sRsCodeWords =~ s/\n//g;
        my $sRsTmp = ($aRsTmp[$iRsBlock] || ''). (chr(0) x $iRsEccWords);

        for($j = ($sRsCodeWords - $iRsEccWords); $j>0; $j--) {
            my $iFirst = ord(substr($sRsTmp, 0, 1));
            if ($iFirst != 0){
                $sRsTmp = substr($sRsTmp, 1) ^ $aRsCalTbl[$iFirst];
            }
            else {
                $sRsTmp = substr($sRsTmp, 1);
            }
        }
        push(@aCodeWords, unpack("C*", $sRsTmp));
    }
    # ---- put data
    # ---- flash matrix
    my @aCont;
    $oSelf->{Cont} = \@aCont;
    for(my $i=0;$i<$oSelf->{MaxModules};$i++) {
        $aCont[$i] = [ (0) x $oSelf->{MaxModules}];
    }
    for(my $i=0; $i<$iMaxCodeWords; $i++) {
        my $iCodeWord = $aCodeWords[$i];
        for(my $j = 7; $j >= 0; $j--) {
            my $iCodeWordBitNum = ($i * 8)+$j;
            $aCont[$aMatrixX[$iCodeWordBitNum] ][ $aMatrixY[$iCodeWordBitNum]]
                = ((255*($iCodeWord & 1)) ^ $aMask[$iCodeWordBitNum]); 
            $iCodeWord >>= 1;
        }
    }
    for(my $iMatrixRemain = $iRemainBits; $iMatrixRemain; $iMatrixRemain--) {
        my $iRemainBitTmp = $iMatrixRemain + ($iMaxCodeWords * 8);
        $aCont[$aMatrixX[$iRemainBitTmp]][$aMatrixY[$iRemainBitTmp]]  
            = (255 ^ $aMask[$iRemainBitTmp] );
    }

    # ---- mask select
    my $sHorMst='';
    my $sVerMst='';
    for(my $i=0; $i < $oSelf->{MaxModules}; ++$i) {
        for($j=0 ; $j < $oSelf->{MaxModules}; ++$j){
            $sHorMst .= chr($aCont[$j][$i]);
            $sVerMst .= chr($aCont[$i][$j]);
       }
    }
    my $iMask = $oSelf->_calcMask($sHorMst, $sVerMst);
    $oSelf->{MaskCont} = (1 << $iMask);

    # ---- format information
    my %hFmtInf =(
        'M' => [
          '101010000010010', '101000100100101', '101111001111100', '101101101001011',
          '100010111111001', '100000011001110', '100111110010111', '100101010100000',],
        'L' => [
          '111011111000100', '111001011110011', '111110110101010', '111100010011101',
          '110011000101111', '110001100011000', '110110001000001', '110100101110110',],
        'H' =>[
          '001011010001001', '001001110111110', '001110011100111', '001100111010000',
          '000011101100010', '000001001010101', '000110100001100', '000100000111011',],
        'Q' => [
          '011010101011111', '011000001101000', '011111100110001', '011101000000110',
          '010010010110100', '010000110000011', '010111011011010', '010101111101101',],
    );
    my @aFmtInfX1=( 0, 1, 2, 3, 4, 5, 7, 8, 8, 8, 8, 8, 8, 8, 8);
    my @aFmtInfY1=( 8, 8, 8, 8, 8, 8, 8, 8, 7, 5, 4, 3, 2, 1, 0);
    my @aContWk = split //, $hFmtInf{$oSelf->{Ecc}}->[$iMask];
    for(my $i = 0; $i < 15; ++$i) {
        $aCont[$aFmtInfX1[$i]][$aFmtInfY1[$i]] = $aContWk[$i] * 255;
        $aCont[$aFmtInfX2[$i]][$aFmtInfY2[$i]] = $aContWk[$i] * 255;
    }
    return '';
}
#------------------------------------------------------------------------------
# barcode (for GD::Barcode::QR)
#------------------------------------------------------------------------------
sub barcode($) {
    my ($oSelf) = @_;
    my $sBarL;
    my $iModSize = $oSelf->{ModuleSize};
    my $sBlack = '1' x $iModSize;
    my $sWhite = '0' x $iModSize;

    my $sPtn = '';
    $sPtn = (($sWhite x ($oSelf->{MaxModules} + 8)) . "\n") x (4 * $iModSize);
    my @aCont = @{$oSelf->{Cont}};

    for(my $iY=0; $iY < $oSelf->{MaxModules}; ++$iY) {
        $sBarL = $sWhite x 4;
        for(my $iX=0; $iX < $oSelf->{MaxModules}; ++$iX) {
            $sBarL .= ((_calcFrm($oSelf->{Version}, $iY, $iX)) || 
                     (($aCont[$iX][$iY] & $oSelf->{MaskCont})))? $sBlack : $sWhite;
        }
        $sBarL .= ($sWhite x 4) . "\n";
        $sPtn  .= $sBarL x $iModSize;
    }
    $sPtn .= ($sWhite x ($oSelf->{MaxModules}+8) . "\n") x (4 * $iModSize);
    return $sPtn;
}
#------------------------------------------------------------------------------
# plot (for GD::Barcode::QRcode)
#------------------------------------------------------------------------------
sub plot($;%) {
    my($oSelf, %hParam) =@_;
    my $iUnitSize = $oSelf->{ModuleSize};
    my $oOutImg = GD::Image->new(
            ($oSelf->{MaxModules} + 8) * $iUnitSize, 
            ($oSelf->{MaxModules} + 8) * $iUnitSize);
    my $cWhite = $oOutImg->colorAllocate(255, 255,255); #For BackColor
    my $cBlack = $oOutImg->colorAllocate(  0,   0,  0);
    my @aCont = @{$oSelf->{Cont}};
    for(my $iY=0; $iY < $oSelf->{MaxModules}; ++$iY){
        for(my $iX=0; $iX < $oSelf->{MaxModules}; ++$iX){
            if((_calcFrm($oSelf->{Version}, $iY, $iX)) || (($aCont[$iX][$iY] & $oSelf->{MaskCont}))) {
                if($oSelf->{ModuleSize} <= 1) {
                    $oOutImg->setPixel($iX+4, $iY+4, $cBlack)
                }
                else {
                    $oOutImg->filledRectangle(
                            ($iX+4)*$iUnitSize, ($iY+4)*$iUnitSize,
                            ($iX+4+1)*$oSelf->{ModuleSize} - 1,
                            ($iY+4+1)*$oSelf->{ModuleSize} - 1,
                            $cBlack);
                }
            }
        }
    }
    return $oOutImg;
}

sub _calcVersion($$$) {
    my ($oSelf, $iTtlBits, $raPlusWords) = @_;

    my %hMaxDatBits= (
        'M' =>[ 0,
          128,   224,   352,   512,   688,   864,   992,  1232,  1456,  1728,
         2032,  2320,  2672,  2920,  3320,  3624,  4056,  4504,  5016,  5352,
         5712,  6256,  6880,  7312,  8000,  8496,  9024,  9544, 10136, 10984,
        11640, 12328, 13048, 13800, 14496, 15312, 15936, 16816, 17728, 18672, ],
        'L' =>[ 0,
          152,   272,   440,   640,   864,  1088,  1248,  1552,  1856,  2192,
         2592,  2960,  3424,  3688,  4184,  4712,  5176,  5768,  6360,  6888,
         7456,  8048,  8752,  9392, 10208, 10960, 11744, 12248, 13048, 13880,
        14744, 15640, 16568, 17528, 18448, 19472, 20528, 21616, 22496, 23648, ],
        'H' => [ 0,
           72,   128,   208,   288,   368,   480,   528,   688,   800,   976,
         1120,  1264,  1440,  1576,  1784,  2024,  2264,  2504,  2728,  3080,
         3248,  3536,  3712,  4112,  4304,  4768,  5024,  5288,  5608,  5960,
         6344,  6760,  7208,  7688,  7888,  8432,  8768,  9136,  9776, 10208, ],
        'Q' =>[ 0,
          104,   176,   272,   384,   496,   608,   704,   880,  1056,  1232,
         1440,  1648,  1952,  2088,  2360,  2600,  2936,  3176,  3560,  3880,
         4096,  4544,  4912,  5312,  5744,  6032,  6464,  6968,  7288,  7880,
         8264,  8920,  9368,  9848, 10288, 10832, 11408, 12016, 12656, 13328,],
    );
    my @aMaxCodeWords=(
       0,
      26,   44,   70,  100,  134,  172,  196,  242,  292,  346,
     404,  466,  532,  581,  655,  733,  815,  901,  991, 1085,
    1156, 1258, 1364, 1474, 1588, 1706, 1828, 1921, 2051, 2185,
    2323, 2465, 2611, 2761, 2876, 3034, 3196, 3362, 3532, 3706 );

    my @aRemainBits=(
        0,
        0, 7, 7, 7, 7, 7, 0, 0, 0, 0,
        0, 0, 0, 3, 3, 3, 3, 3, 3, 3,
        4, 4, 4, 4, 4, 4, 4, 3, 3, 3,
        3, 3, 3, 3, 0, 0, 0, 0, 0, 0);

    if (!$oSelf->{Version}){        #--- auto version select
        for($oSelf->{Version}=1; $oSelf->{Version} <= 40; ++$oSelf->{Version}) {
            last if ($hMaxDatBits{$oSelf->{Ecc}}->[$oSelf->{Version}] 
                        >= $iTtlBits + $raPlusWords->[$oSelf->{Version}]);
        }
    }
    return( $hMaxDatBits{$oSelf->{Ecc}}->[$oSelf->{Version}], 
            $raPlusWords->[$oSelf->{Version}], 
            $aMaxCodeWords[$oSelf->{Version}], 
            $aRemainBits[$oSelf->{Version}],
        );
}
sub _calcMask($$$) {
    my($oSelf, $sHorMst, $sVerMst) = @_;
use constant SPCHAR => "\xAA";

    my $iMinDtmScore = 0;
    my $iAllMatrix   = $oSelf->{MaxModules} * $oSelf->{MaxModules};
    my $iMask = 0;
    for(my $i=0; $i < 8; ++$i){
        my $iBit  = 1 << $i;
        my $iBitR = (~$iBit) & 0xFF;

        my $iBitMask = chr($iBit) x $iAllMatrix;
        my $iHor = $sHorMst & $iBitMask;
        my $iVer = $sVerMst & $iBitMask;

        my $iVerAnd = ((SPCHAR x $oSelf->{MaxModules}) . $iVer) & ($iVer . (SPCHAR x $oSelf->{MaxModules}));
        my $iVerOr  = ((SPCHAR x $oSelf->{MaxModules}) . $iVer) | ($iVer . (SPCHAR x $oSelf->{MaxModules}));

        $iHor = ~$iHor;
        $iVer = ~$iVer;
        $iVerAnd = ~$iVerAnd;
        $iVerOr  = ~$iVerOr;

        substr($iVerAnd, $iAllMatrix, 0)  = SPCHAR;
        substr($iVerOr,  $iAllMatrix, 0)  = SPCHAR;
        for(my $k = ($oSelf->{MaxModules} - 1); $k > 0 ; $k--) {
            substr($iHor,    $k * $oSelf->{MaxModules}, 0) = SPCHAR;
            substr($iVer,    $k * $oSelf->{MaxModules}, 0) = SPCHAR;
            substr($iVerAnd, $k * $oSelf->{MaxModules}, 0) = SPCHAR;
            substr($iVerOr,  $k * $oSelf->{MaxModules}, 0) = SPCHAR;
        }

        $iHor .= (SPCHAR . $iVer);
        my $iN1Srch  = (chr(255) x 5) . "+|" . (chr($iBitR) x 5) . "+";
        my $iN2Srch1 = chr($iBitR).chr($iBitR)."+";
        my $iN2Srch2 = chr(255).chr(255)."+";
        my $iN3Srch  = chr($iBitR) . chr(255) . 
                      chr($iBitR) . chr($iBitR) . chr($iBitR) . chr(255) . chr($iBitR);
        my $iN4Srch  = chr($iBitR);

        my $iHorTmp = $iHor;
        my $iDemeritN3 = ( $iHorTmp =~ s/$iN3Srch//g ) * 40;
        my $iDemeritN4 = int(abs(((100* ( ($iVer=~s/$iN4Srch//g)/($iAllMatrix)))-50)/5))*10;

        my $iMatchBeforeNum = length($iVerAnd) + length($iVerOr);
        my $iMatchNum    = ($iVerAnd =~ s/$iN2Srch1//g ) + ($iVerOr =~ s/$iN2Srch2//g );
        my $iMatchAftNum =length($iVerAnd)+length($iVerOr);
        my $iDemeritN2=($iMatchBeforeNum-$iMatchAftNum-$iMatchNum)*3;

        my $iMatchBfrNum = length($iHor);
        $iMatchNum    = ( $iHor =~ s/$iN1Srch//g );
        $iMatchAftNum = length($iHor);
        my $iDemeritN1   = $iMatchBfrNum - $iMatchAftNum - ($iMatchNum * 2);

        my $iDemeritScore = $iDemeritN1 + $iDemeritN2 + $iDemeritN3 + $iDemeritN4;

        if ($iDemeritScore <= $iMinDtmScore || $i==0){
            $iMask  = $i;
            $iMinDtmScore = $iDemeritScore;
        }
    }
    return $iMask;
}
sub _cnv8bit($$$$) {
    my($oSelf, $iDatCnt, $raDatVal, $raDatBit) = @_;

    my $iDatLen = length($oSelf->{text});
    $raDatVal->[$iDatCnt]=4;   # 8bit byte mode
    ++$iDatCnt;
    $raDatBit->[$iDatCnt]=8;   # version 1-9
    $raDatVal->[$iDatCnt] =$iDatLen;
    $oSelf->{WordsPos}   =$iDatCnt;

    $iDatCnt++;
    for(my $i=0; $i < $iDatLen; ++$i) {
        $raDatVal->[$iDatCnt] = ord(substr($oSelf->{text},$i,1));
        $raDatBit->[$iDatCnt] = 8;
        $iDatCnt++;
    }
    return (
        $iDatCnt,
        [
            0,
            0, 0, 0, 0, 0, 0, 0, 0, 0, 8,
            8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
            8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
            8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
        ]);
}
sub _cnvAlphaNumeric($$$$) {
    my($oSelf, $iDatCnt, $raDatVal, $raDatBit) = @_;

    my $iDatLen = length($oSelf->{text});
    $raDatVal->[$iDatCnt]=2;            # alpha numeric mode
    $iDatCnt++;
    $raDatVal->[$iDatCnt] = $iDatLen;
    $raDatBit->[$iDatCnt] = 9;            #version 1-9
    $oSelf->{WordsPos}   = $iDatCnt;
    my %hAlphanumeric=(
            '0'=> 0, '1'=> 1, '2'=> 2, '3'=> 3, '4'=> 4,
            '5'=> 5, '6'=> 6, '7'=> 7, '8'=> 8, '9'=> 9,
            'A'=>10, 'B'=>11, 'C'=>12, 'D'=>13, 'E'=>14,
            'F'=>15, 'G'=>16, 'H'=>17, 'I'=>18, 'J'=>19,
            'K'=>20, 'L'=>21, 'M'=>22, 'N'=>23, 'O'=>24,
            'P'=>25, 'Q'=>26, 'R'=>27, 'S'=>28, 'T'=>29,
            'U'=>30, 'V'=>31, 'W'=>32, 'X'=>33, 'Y'=>34,
            'Z'=>35, ' '=>36, '$'=>37, '%'=>38, '*'=>39,
            '+'=>40, '-'=>41, '.'=>42, '/'=>43, ':'=>44);
    $iDatCnt++;
    for(my $i=0 ; $i < $iDatLen; ++$i){
        if (($i % 2)==0){
            $raDatVal->[$iDatCnt] = $hAlphanumeric{substr($oSelf->{text},$i,1)};
            $raDatBit->[$iDatCnt] = 6;
        }
        else {
            $raDatVal->[$iDatCnt] = $raDatVal->[$iDatCnt] * 45 +
                                     $hAlphanumeric{substr($oSelf->{text}, $i, 1)};
            $raDatBit->[$iDatCnt] = 11;
            $iDatCnt++;
        }
    }
    ++$iDatCnt if(($raDatBit->[$iDatCnt] || 0) > 0);
    return (
        $iDatCnt, 
        [   0,
            0, 0, 0, 0, 0, 0, 0, 0, 0, 2,
            2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
            2, 2, 2, 2, 2, 2, 4, 4, 4, 4,
            4, 4, 4, 4, 4, 4, 4, 4, 4, 4, ]
    );
}
sub _cnvNumeric($$$$) {
    my($oSelf, $iDatCnt, $raDatVal, $raDatBit) = @_;

    my $iDatLen = length($oSelf->{text});
    $raDatVal->[$iDatCnt] = 1;              # numeric mode
    $iDatCnt++;
    $raDatVal->[$iDatCnt] = $iDatLen;   # length
    $raDatBit->[$iDatCnt] = 10;             # version 1-9
    $oSelf->{WordsPos} = $iDatCnt;

    $iDatCnt++;
    for(my $i=0;$i < $iDatLen; ++$i){
        if (($i % 3)==0){
            $raDatVal->[$iDatCnt] = substr($oSelf->{text},$i,1);
            $raDatBit->[$iDatCnt] = 4;
        }
        else {
            $raDatVal->[$iDatCnt] = $raDatVal->[$iDatCnt] * 10 + 
                                    substr($oSelf->{text},$i,1);
            if (($i % 3)==1){
                $raDatBit->[$iDatCnt] = 7;
            }
            else {
                $raDatBit->[$iDatCnt] =10;
                $iDatCnt++;
            }
        }
    }
    ++$iDatCnt if(defined($raDatBit->[$iDatCnt]) && ($raDatBit->[$iDatCnt] > 0));
    return (
        $iDatCnt,
        [ 0,
          0, 0, 0, 0, 0, 0, 0, 0, 0, 2,
          2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
          2, 2, 2, 2, 2, 2, 4, 4, 4, 4,
          4, 4, 4, 4, 4, 4, 4, 4, 4, 4]);
}
sub _calcFrm($$$) {
    my($iV, $iR, $iC) = @_;
    my $iPosR = $iV*4+10;
    if($iR==0) {
        return 1 if(
            (($iC >= 0)      and ($iC <= 6)) or 
            (($iC >= $iPosR) and ($iC <= ($iPosR + 6))));
    }
    elsif($iR==6) {
        return 1 if(
            (($iC % 2)==0) or
            (($iC >= 0)      and ($iC <= 6)) or 
            (($iC >= $iPosR) and ($iC <= ($iPosR + 6))));
    }
    elsif(($iR == 1) or ($iR == 5)) {
        return 1 
            if (($iC == 0) or ($iC == 6) or
                ($iC == $iPosR) or ($iC == $iPosR+6));
    }
    elsif(($iR >= 2) and ($iR <= 4)) {
        return 1 
             if(($iC == 0) or 
                (($iC >= 2) and ($iC <= 4))or
                ($iC == 6) or
                ($iC == $iPosR) or 
                (($iC >= ($iPosR+2)) and ($iC <= ($iPosR+4))) or
                ($iC == $iPosR+6));
    }
    elsif(($iR == ($iPosR-2))) {
        return 1 if($iC == 6);
        if($iV > 1) {
            return 1 if(($iC>=($iPosR-2)) and 
                        ($iC<=($iPosR+2)));
        }
    }
    elsif(($iR == ($iPosR-1))) {
        return 1 if($iC == 8);
        if($iV > 1) {
            return 1 if(($iC==($iPosR-2)) or 
                        ($iC==($iPosR+2)));
        }
    }
    elsif ($iR == $iPosR) {
        return 1 if((($iC >= 0) and ($iC <= 6)));
        if($iV > 1) {
            return 1 if(($iC==($iPosR-2)) or 
                        ($iC== $iPosR )   or
                        ($iC==($iPosR+2)));
        }
    }
    elsif ($iR == ($iPosR+1)) {
        return 1 if(($iC == 0) or ($iC == 6));
        if($iV > 1) {
            return 1 if(($iC==($iPosR-2)) or 
                        ($iC==($iPosR+2)));
        }
    }
    elsif ($iR == ($iPosR+2)) {
        return 1 if(($iC == 0) or 
                  (($iC >= 2) and ($iC <= 4))or
                  ($iC == 6));
        if($iV > 1) {
            return 1 if(($iC>=($iPosR-2)) and 
                        ($iC<=($iPosR+2)));
        }
    }
    elsif(($iR > ($iPosR+2)) and ($iR <= ($iPosR+4))) {
        return 1 
            if (($iC == 0) or 
                (($iC >= 2) and ($iC <= 4))or
                ($iC == 6));
    }
    elsif($iR == ($iPosR+5)) {
        return 1 
            if(($iC == 0) or ($iC == 6));
    }
    elsif($iR == ($iPosR+6)) {
        return 1 if(($iC >= 0) and ($iC <= 6));
    }
    else {
        return 1 if((($iR % 2)==0) and ($iC ==6));
    }
  #2. Depend on Version
    return 0 if(($iV >= 1) and ($iV <= 6));
    if($iV == 7) {
        if($iR==35){
            return ((($iC >= 1) and ($iC <= 4)))? 1 : 0;
        }
        elsif($iR==3){
            return ((($iC >= 35) and ($iC <= 36)))? 1 : 0;
        }
        elsif($iR==36){
            return (($iC == 0) or (($iC >= 3) and ($iC <= 4)) or (($iC >= 20) and ($iC <= 24)))? 1 : 0;
        }
        elsif($iR==4){
            return ((($iC >= 20) and ($iC <= 24)) or (($iC >= 34) and ($iC <= 36)))? 1 : 0;
        }
        elsif($iR==38){
            return (($iC == 20) or ($iC == 22) or ($iC == 24))? 1 : 0;
        }
        elsif($iR==22){
            return (($iC == 4) or ($iC == 8) or ($iC == 20) or ($iC == 22) or ($iC == 24) or ($iC == 36) or ($iC == 38) or ($iC == 40))? 1 : 0;
        }
        elsif($iR==34){
            return (($iC == 4))? 1 : 0;
        }
        elsif($iR==0){
            return (($iC == 36))? 1 : 0;
        }
        elsif(($iR==8) or ($iR==40)){
            return ((($iC >= 20) and ($iC <= 24)))? 1 : 0;
        }
        elsif(($iR==21) or ($iR==23)){
            return (($iC == 4) or ($iC == 8) or ($iC == 20) or ($iC == 24) or ($iC == 36) or ($iC == 40))? 1 : 0;
        }
        elsif(($iR==1) or ($iR==2)){
            return (($iC == 35))? 1 : 0;
        }
        elsif(($iR==20) or ($iR==24)){
            return ((($iC >= 4) and ($iC <= 5)) or (($iC >= 7) and ($iC <= 8)) or (($iC >= 20) and ($iC <= 24)) or (($iC >= 36) and ($iC <= 40)))? 1 : 0;
        }
        elsif(($iR==5) or ($iR==7) or ($iR==37) or ($iR==39)){
            return (($iC == 20) or ($iC == 24))? 1 : 0;
        }
        return 0;
    }
    elsif($iV == 8) {
        if($iR==40){
            return ((($iC >= 0) and ($iC <= 2)) or (($iC >= 22) and ($iC <= 26)))? 1 : 0;
        }
        elsif($iR==0){
            return (($iC == 40))? 1 : 0;
        }
        elsif($iR==38){
            return (($iC == 1) or ($iC == 5))? 1 : 0;
        }
        elsif($iR==5){
            return (($iC == 22) or ($iC == 26) or ($iC == 38))? 1 : 0;
        }
        elsif($iR==24){
            return (($iC == 4) or ($iC == 8) or ($iC == 22) or ($iC == 24) or ($iC == 26) or ($iC == 40) or ($iC == 42) or ($iC == 44))? 1 : 0;
        }
        elsif($iR==39){
            return ((($iC >= 1) and ($iC <= 3)))? 1 : 0;
        }
        elsif($iR==1){
            return ((($iC >= 38) and ($iC <= 40)))? 1 : 0;
        }
        elsif($iR==2){
            return ((($iC >= 39) and ($iC <= 40)))? 1 : 0;
        }
        elsif($iR==42){
            return (($iC == 22) or ($iC == 24) or ($iC == 26))? 1 : 0;
        }
        elsif($iR==3){
            return (($iC == 39))? 1 : 0;
        }
        elsif(($iR==23) or ($iR==25)){
            return (($iC == 4) or ($iC == 8) or ($iC == 22) or ($iC == 26) or ($iC == 40) or ($iC == 44))? 1 : 0;
        }
        elsif(($iR==22) or ($iR==26)){
            return ((($iC >= 4) and ($iC <= 5)) or (($iC >= 7) and ($iC <= 8)) or (($iC >= 22) and ($iC <= 26)) or (($iC >= 40) and ($iC <= 44)))? 1 : 0;
        }
        elsif(($iR==7) or ($iR==41) or ($iR==43)){
            return (($iC == 22) or ($iC == 26))? 1 : 0;
        }
        elsif(($iR==4) or ($iR==8) or ($iR==44)){
            return ((($iC >= 22) and ($iC <= 26)))? 1 : 0;
        }
        return 0;
    }
    elsif($iV == 9) {
        if($iR==26){
            return (($iC == 4) or ($iC == 8) or ($iC == 24) or ($iC == 26) or ($iC == 28) or ($iC == 44) or ($iC == 46) or ($iC == 48))? 1 : 0;
        }
        elsif($iR==46){
            return (($iC == 24) or ($iC == 26) or ($iC == 28))? 1 : 0;
        }
        elsif($iR==44){
            return (($iC == 3) or (($iC >= 24) and ($iC <= 28)))? 1 : 0;
        }
        elsif($iR==5){
            return (($iC == 24) or ($iC == 28) or ($iC == 42))? 1 : 0;
        }
        elsif($iR==0){
            return (($iC == 42))? 1 : 0;
        }
        elsif($iR==1){
            return ((($iC >= 42) and ($iC <= 43)))? 1 : 0;
        }
        elsif($iR==2){
            return (($iC == 43))? 1 : 0;
        }
        elsif($iR==43){
            return ((($iC >= 1) and ($iC <= 2)))? 1 : 0;
        }
        elsif($iR==4){
            return ((($iC >= 24) and ($iC <= 28)) or ($iC == 42))? 1 : 0;
        }
        elsif($iR==3){
            return (($iC == 42) or ($iC == 44))? 1 : 0;
        }
        elsif($iR==42){
            return ((($iC >= 0) and ($iC <= 1)) or (($iC >= 3) and ($iC <= 5)))? 1 : 0;
        }
        elsif(($iR==24) or ($iR==28)){
            return ((($iC >= 4) and ($iC <= 5)) or (($iC >= 7) and ($iC <= 8)) or (($iC >= 24) and ($iC <= 28)) or (($iC >= 44) and ($iC <= 48)))? 1 : 0;
        }
        elsif(($iR==25) or ($iR==27)){
            return (($iC == 4) or ($iC == 8) or ($iC == 24) or ($iC == 28) or ($iC == 44) or ($iC == 48))? 1 : 0;
        }
        elsif(($iR==8) or ($iR==48)){
            return ((($iC >= 24) and ($iC <= 28)))? 1 : 0;
        }
        elsif(($iR==7) or ($iR==45) or ($iR==47)){
            return (($iC == 24) or ($iC == 28))? 1 : 0;
        }
        return 0;
    }
    elsif($iV == 10) {
        if($iR==28){
            return (($iC == 4) or ($iC == 8) or ($iC == 26) or ($iC == 28) or ($iC == 30) or ($iC == 48) or ($iC == 50) or ($iC == 52))? 1 : 0;
        }
        elsif($iR==5){
            return (($iC == 26) or ($iC == 30) or ($iC == 46))? 1 : 0;
        }
        elsif($iR==46){
            return (($iC == 0) or ($iC == 2) or ($iC == 5))? 1 : 0;
        }
        elsif($iR==50){
            return (($iC == 26) or ($iC == 28) or ($iC == 30))? 1 : 0;
        }
        elsif($iR==4){
            return ((($iC >= 26) and ($iC <= 30)) or ($iC == 47))? 1 : 0;
        }
        elsif($iR==47){
            return ((($iC >= 0) and ($iC <= 4)))? 1 : 0;
        }
        elsif(($iR==27) or ($iR==29)){
            return (($iC == 4) or ($iC == 8) or ($iC == 26) or ($iC == 30) or ($iC == 48) or ($iC == 52))? 1 : 0;
        }
        elsif(($iR==0) or ($iR==2)){
            return ((($iC >= 46) and ($iC <= 47)))? 1 : 0;
        }
        elsif(($iR==1) or ($iR==3)){
            return (($iC == 47))? 1 : 0;
        }
        elsif(($iR==26) or ($iR==30)){
            return ((($iC >= 4) and ($iC <= 5)) or (($iC >= 7) and ($iC <= 8)) or (($iC >= 26) and ($iC <= 30)) or (($iC >= 48) and ($iC <= 52)))? 1 : 0;
        }
        elsif(($iR==7) or ($iR==49) or ($iR==51)){
            return (($iC == 26) or ($iC == 30))? 1 : 0;
        }
        elsif(($iR==8) or ($iR==48) or ($iR==52)){
            return ((($iC >= 26) and ($iC <= 30)))? 1 : 0;
        }
        return 0;
    }
    elsif($iV == 11) {
        if($iR==50){
            return ((($iC >= 2) and ($iC <= 5)))? 1 : 0;
        }
        elsif($iR==52){
            return ((($iC >= 0) and ($iC <= 3)) or (($iC >= 28) and ($iC <= 32)))? 1 : 0;
        }
        elsif($iR==2){
            return ((($iC >= 50) and ($iC <= 52)))? 1 : 0;
        }
        elsif($iR==30){
            return (($iC == 4) or ($iC == 8) or ($iC == 28) or ($iC == 30) or ($iC == 32) or ($iC == 52) or ($iC == 54) or ($iC == 56))? 1 : 0;
        }
        elsif($iR==54){
            return (($iC == 28) or ($iC == 30) or ($iC == 32))? 1 : 0;
        }
        elsif($iR==4){
            return ((($iC >= 28) and ($iC <= 32)) or (($iC >= 50) and ($iC <= 51)))? 1 : 0;
        }
        elsif($iR==51){
            return ((($iC >= 0) and ($iC <= 2)) or ($iC == 4))? 1 : 0;
        }
        elsif($iR==5){
            return (($iC == 28) or ($iC == 32) or ($iC == 50))? 1 : 0;
        }
        elsif($iR==3){
            return (($iC == 50) or ($iC == 52))? 1 : 0;
        }
        elsif(($iR==0) or ($iR==1)){
            return ((($iC >= 51) and ($iC <= 52)))? 1 : 0;
        }
        elsif(($iR==29) or ($iR==31)){
            return (($iC == 4) or ($iC == 8) or ($iC == 28) or ($iC == 32) or ($iC == 52) or ($iC == 56))? 1 : 0;
        }
        elsif(($iR==28) or ($iR==32)){
            return ((($iC >= 4) and ($iC <= 5)) or (($iC >= 7) and ($iC <= 8)) or (($iC >= 28) and ($iC <= 32)) or (($iC >= 52) and ($iC <= 56)))? 1 : 0;
        }
        elsif(($iR==8) or ($iR==56)){
            return ((($iC >= 28) and ($iC <= 32)))? 1 : 0;
        }
        elsif(($iR==7) or ($iR==53) or ($iR==55)){
            return (($iC == 28) or ($iC == 32))? 1 : 0;
        }
        return 0;
    }
    elsif($iV == 12) {
        if($iR==55){
            return (($iC == 0) or ($iC == 3))? 1 : 0;
        }
        elsif($iR==56){
            return ((($iC >= 1) and ($iC <= 2)) or ($iC == 4) or (($iC >= 30) and ($iC <= 34)))? 1 : 0;
        }
        elsif($iR==5){
            return (($iC == 30) or ($iC == 34) or ($iC == 54))? 1 : 0;
        }
        elsif($iR==1){
            return (($iC == 56))? 1 : 0;
        }
        elsif($iR==32){
            return (($iC == 4) or ($iC == 8) or ($iC == 30) or ($iC == 32) or ($iC == 34) or ($iC == 56) or ($iC == 58) or ($iC == 60))? 1 : 0;
        }
        elsif($iR==4){
            return ((($iC >= 30) and ($iC <= 34)) or ($iC == 56))? 1 : 0;
        }
        elsif($iR==3){
            return ((($iC >= 54) and ($iC <= 55)))? 1 : 0;
        }
        elsif($iR==2){
            return (($iC == 54) or ($iC == 56))? 1 : 0;
        }
        elsif($iR==54){
            return ((($iC >= 2) and ($iC <= 3)) or ($iC == 5))? 1 : 0;
        }
        elsif($iR==0){
            return (($iC == 55))? 1 : 0;
        }
        elsif($iR==58){
            return (($iC == 30) or ($iC == 32) or ($iC == 34))? 1 : 0;
        }
        elsif(($iR==30) or ($iR==34)){
            return ((($iC >= 4) and ($iC <= 5)) or (($iC >= 7) and ($iC <= 8)) or (($iC >= 30) and ($iC <= 34)) or (($iC >= 56) and ($iC <= 60)))? 1 : 0;
        }
        elsif(($iR==8) or ($iR==60)){
            return ((($iC >= 30) and ($iC <= 34)))? 1 : 0;
        }
        elsif(($iR==31) or ($iR==33)){
            return (($iC == 4) or ($iC == 8) or ($iC == 30) or ($iC == 34) or ($iC == 56) or ($iC == 60))? 1 : 0;
        }
        elsif(($iR==7) or ($iR==57) or ($iR==59)){
            return (($iC == 30) or ($iC == 34))? 1 : 0;
        }
        return 0;
    }
    elsif($iV == 13) {
        if($iR==3){
            return (($iC == 60))? 1 : 0;
        }
        elsif($iR==58){
            return (($iC == 0) or ($iC == 2) or (($iC >= 4) and ($iC <= 5)))? 1 : 0;
        }
        elsif($iR==2){
            return (($iC == 58))? 1 : 0;
        }
        elsif($iR==62){
            return (($iC == 32) or ($iC == 34) or ($iC == 36))? 1 : 0;
        }
        elsif($iR==60){
            return (($iC == 0) or (($iC >= 3) and ($iC <= 4)) or (($iC >= 32) and ($iC <= 36)))? 1 : 0;
        }
        elsif($iR==34){
            return (($iC == 4) or ($iC == 8) or ($iC == 32) or ($iC == 34) or ($iC == 36) or ($iC == 60) or ($iC == 62) or ($iC == 64))? 1 : 0;
        }
        elsif($iR==0){
            return ((($iC >= 58) and ($iC <= 60)))? 1 : 0;
        }
        elsif($iR==4){
            return ((($iC >= 32) and ($iC <= 36)) or ($iC == 58) or ($iC == 60))? 1 : 0;
        }
        elsif($iR==59){
            return (($iC == 0))? 1 : 0;
        }
        elsif($iR==5){
            return (($iC == 32) or ($iC == 36) or ($iC == 58))? 1 : 0;
        }
        elsif(($iR==32) or ($iR==36)){
            return ((($iC >= 4) and ($iC <= 5)) or (($iC >= 7) and ($iC <= 8)) or (($iC >= 32) and ($iC <= 36)) or (($iC >= 60) and ($iC <= 64)))? 1 : 0;
        }
        elsif(($iR==33) or ($iR==35)){
            return (($iC == 4) or ($iC == 8) or ($iC == 32) or ($iC == 36) or ($iC == 60) or ($iC == 64))? 1 : 0;
        }
        elsif(($iR==8) or ($iR==64)){
            return ((($iC >= 32) and ($iC <= 36)))? 1 : 0;
        }
        elsif(($iR==7) or ($iR==61) or ($iR==63)){
            return (($iC == 32) or ($iC == 36))? 1 : 0;
        }
        return 0;
    }
    elsif($iV == 14) {
        if($iR==63){
            return ((($iC >= 3) and ($iC <= 4)))? 1 : 0;
        }
        elsif($iR==4){
            return ((($iC >= 24) and ($iC <= 28)) or (($iC >= 44) and ($iC <= 48)) or (($iC >= 63) and ($iC <= 64)))? 1 : 0;
        }
        elsif($iR==66){
            return (($iC == 24) or ($iC == 26) or ($iC == 28) or ($iC == 44) or ($iC == 46) or ($iC == 48))? 1 : 0;
        }
        elsif($iR==3){
            return ((($iC >= 62) and ($iC <= 63)))? 1 : 0;
        }
        elsif($iR==64){
            return (($iC == 0) or ($iC == 4) or (($iC >= 24) and ($iC <= 28)) or (($iC >= 44) and ($iC <= 48)))? 1 : 0;
        }
        elsif($iR==5){
            return (($iC == 24) or ($iC == 28) or ($iC == 44) or ($iC == 48) or ($iC == 62))? 1 : 0;
        }
        elsif($iR==0){
            return (($iC == 62) or ($iC == 64))? 1 : 0;
        }
        elsif($iR==1){
            return (($iC == 62))? 1 : 0;
        }
        elsif($iR==62){
            return ((($iC >= 0) and ($iC <= 1)) or ($iC == 3) or ($iC == 5))? 1 : 0;
        }
        elsif(($iR==8) or ($iR==68)){
            return ((($iC >= 24) and ($iC <= 28)) or (($iC >= 44) and ($iC <= 48)))? 1 : 0;
        }
        elsif(($iR==26) or ($iR==46)){
            return (($iC == 4) or ($iC == 8) or ($iC == 24) or ($iC == 26) or ($iC == 28) or ($iC == 44) or ($iC == 46) or ($iC == 48) or ($iC == 64) or ($iC == 66) or ($iC == 68))? 1 : 0;
        }
        elsif(($iR==7) or ($iR==65) or ($iR==67)){
            return (($iC == 24) or ($iC == 28) or ($iC == 44) or ($iC == 48))? 1 : 0;
        }
        elsif(($iR==25) or ($iR==27) or ($iR==45) or ($iR==47)){
            return (($iC == 4) or ($iC == 8) or ($iC == 24) or ($iC == 28) or ($iC == 44) or ($iC == 48) or ($iC == 64) or ($iC == 68))? 1 : 0;
        }
        elsif(($iR==24) or ($iR==28) or ($iR==44) or ($iR==48)){
            return ((($iC >= 4) and ($iC <= 5)) or (($iC >= 7) and ($iC <= 8)) or (($iC >= 24) and ($iC <= 28)) or (($iC >= 44) and ($iC <= 48)) or (($iC >= 64) and ($iC <= 68)))? 1 : 0;
        }
        return 0;
    }
    elsif($iV == 15) {
        if($iR==66){
            return (($iC == 1) or (($iC >= 4) and ($iC <= 5)))? 1 : 0;
        }
        elsif($iR==4){
            return ((($iC >= 24) and ($iC <= 28)) or (($iC >= 46) and ($iC <= 50)) or (($iC >= 66) and ($iC <= 68)))? 1 : 0;
        }
        elsif($iR==68){
            return ((($iC >= 1) and ($iC <= 4)) or (($iC >= 24) and ($iC <= 28)) or (($iC >= 46) and ($iC <= 50)))? 1 : 0;
        }
        elsif($iR==67){
            return (($iC == 4))? 1 : 0;
        }
        elsif($iR==1){
            return (($iC == 66) or ($iC == 68))? 1 : 0;
        }
        elsif($iR==70){
            return (($iC == 24) or ($iC == 26) or ($iC == 28) or ($iC == 46) or ($iC == 48) or ($iC == 50))? 1 : 0;
        }
        elsif($iR==5){
            return (($iC == 24) or ($iC == 28) or ($iC == 46) or ($iC == 50) or ($iC == 66))? 1 : 0;
        }
        elsif(($iR==2) or ($iR==3)){
            return (($iC == 68))? 1 : 0;
        }
        elsif(($iR==8) or ($iR==72)){
            return ((($iC >= 24) and ($iC <= 28)) or (($iC >= 46) and ($iC <= 50)))? 1 : 0;
        }
        elsif(($iR==26) or ($iR==48)){
            return (($iC == 4) or ($iC == 8) or ($iC == 24) or ($iC == 26) or ($iC == 28) or ($iC == 46) or ($iC == 48) or ($iC == 50) or ($iC == 68) or ($iC == 70) or ($iC == 72))? 1 : 0;
        }
        elsif(($iR==7) or ($iR==69) or ($iR==71)){
            return (($iC == 24) or ($iC == 28) or ($iC == 46) or ($iC == 50))? 1 : 0;
        }
        elsif(($iR==24) or ($iR==28) or ($iR==46) or ($iR==50)){
            return ((($iC >= 4) and ($iC <= 5)) or (($iC >= 7) and ($iC <= 8)) or (($iC >= 24) and ($iC <= 28)) or (($iC >= 46) and ($iC <= 50)) or (($iC >= 68) and ($iC <= 72)))? 1 : 0;
        }
        elsif(($iR==25) or ($iR==27) or ($iR==47) or ($iR==49)){
            return (($iC == 4) or ($iC == 8) or ($iC == 24) or ($iC == 28) or ($iC == 46) or ($iC == 50) or ($iC == 68) or ($iC == 72))? 1 : 0;
        }
        return 0;
    }
    elsif($iV == 16) {
        if($iR==74){
            return (($iC == 24) or ($iC == 26) or ($iC == 28) or ($iC == 48) or ($iC == 50) or ($iC == 52))? 1 : 0;
        }
        elsif($iR==70){
            return ((($iC >= 1) and ($iC <= 3)))? 1 : 0;
        }
        elsif($iR==72){
            return ((($iC >= 1) and ($iC <= 3)) or (($iC >= 24) and ($iC <= 28)) or (($iC >= 48) and ($iC <= 52)))? 1 : 0;
        }
        elsif($iR==1){
            return ((($iC >= 70) and ($iC <= 72)))? 1 : 0;
        }
        elsif($iR==71){
            return (($iC == 1) or ($iC == 5))? 1 : 0;
        }
        elsif($iR==5){
            return (($iC == 24) or ($iC == 28) or ($iC == 48) or ($iC == 52) or ($iC == 71))? 1 : 0;
        }
        elsif(($iR==26) or ($iR==50)){
            return (($iC == 4) or ($iC == 8) or ($iC == 24) or ($iC == 26) or ($iC == 28) or ($iC == 48) or ($iC == 50) or ($iC == 52) or ($iC == 72) or ($iC == 74) or ($iC == 76))? 1 : 0;
        }
        elsif(($iR==2) or ($iR==3)){
            return (($iC == 70) or ($iC == 72))? 1 : 0;
        }
        elsif(($iR==4) or ($iR==8) or ($iR==76)){
            return ((($iC >= 24) and ($iC <= 28)) or (($iC >= 48) and ($iC <= 52)))? 1 : 0;
        }
        elsif(($iR==7) or ($iR==73) or ($iR==75)){
            return (($iC == 24) or ($iC == 28) or ($iC == 48) or ($iC == 52))? 1 : 0;
        }
        elsif(($iR==24) or ($iR==28) or ($iR==48) or ($iR==52)){
            return ((($iC >= 4) and ($iC <= 5)) or (($iC >= 7) and ($iC <= 8)) or (($iC >= 24) and ($iC <= 28)) or (($iC >= 48) and ($iC <= 52)) or (($iC >= 72) and ($iC <= 76)))? 1 : 0;
        }
        elsif(($iR==25) or ($iR==27) or ($iR==49) or ($iR==51)){
            return (($iC == 4) or ($iC == 8) or ($iC == 24) or ($iC == 28) or ($iC == 48) or ($iC == 52) or ($iC == 72) or ($iC == 76))? 1 : 0;
        }
        return 0;
    }
    elsif($iV == 17) {
        if($iR==2){
            return (($iC == 74))? 1 : 0;
        }
        elsif($iR==3){
            return (($iC == 75))? 1 : 0;
        }
        elsif($iR==0){
            return (($iC == 74) or ($iC == 76))? 1 : 0;
        }
        elsif($iR==4){
            return ((($iC >= 28) and ($iC <= 32)) or (($iC >= 52) and ($iC <= 56)) or ($iC == 74))? 1 : 0;
        }
        elsif($iR==5){
            return (($iC == 28) or ($iC == 32) or ($iC == 52) or ($iC == 56) or ($iC == 75))? 1 : 0;
        }
        elsif($iR==74){
            return ((($iC >= 0) and ($iC <= 2)) or ($iC == 4))? 1 : 0;
        }
        elsif($iR==78){
            return (($iC == 28) or ($iC == 30) or ($iC == 32) or ($iC == 52) or ($iC == 54) or ($iC == 56))? 1 : 0;
        }
        elsif($iR==1){
            return ((($iC >= 74) and ($iC <= 75)))? 1 : 0;
        }
        elsif($iR==76){
            return (($iC == 0) or (($iC >= 28) and ($iC <= 32)) or (($iC >= 52) and ($iC <= 56)))? 1 : 0;
        }
        elsif($iR==75){
            return (($iC == 1) or ($iC == 3) or ($iC == 5))? 1 : 0;
        }
        elsif(($iR==30) or ($iR==54)){
            return (($iC == 4) or ($iC == 8) or ($iC == 28) or ($iC == 30) or ($iC == 32) or ($iC == 52) or ($iC == 54) or ($iC == 56) or ($iC == 76) or ($iC == 78) or ($iC == 80))? 1 : 0;
        }
        elsif(($iR==8) or ($iR==80)){
            return ((($iC >= 28) and ($iC <= 32)) or (($iC >= 52) and ($iC <= 56)))? 1 : 0;
        }
        elsif(($iR==7) or ($iR==77) or ($iR==79)){
            return (($iC == 28) or ($iC == 32) or ($iC == 52) or ($iC == 56))? 1 : 0;
        }
        elsif(($iR==29) or ($iR==31) or ($iR==53) or ($iR==55)){
            return (($iC == 4) or ($iC == 8) or ($iC == 28) or ($iC == 32) or ($iC == 52) or ($iC == 56) or ($iC == 76) or ($iC == 80))? 1 : 0;
        }
        elsif(($iR==28) or ($iR==32) or ($iR==52) or ($iR==56)){
            return ((($iC >= 4) and ($iC <= 5)) or (($iC >= 7) and ($iC <= 8)) or (($iC >= 28) and ($iC <= 32)) or (($iC >= 52) and ($iC <= 56)) or (($iC >= 76) and ($iC <= 80)))? 1 : 0;
        }
        return 0;
    }
    elsif($iV == 18) {
        if($iR==79){
            return ((($iC >= 0) and ($iC <= 1)) or (($iC >= 4) and ($iC <= 5)))? 1 : 0;
        }
        elsif($iR==78){
            return (($iC == 0) or ($iC == 3))? 1 : 0;
        }
        elsif($iR==3){
            return (($iC == 78) or ($iC == 80))? 1 : 0;
        }
        elsif($iR==80){
            return (($iC == 0) or ($iC == 3) or (($iC >= 28) and ($iC <= 32)) or (($iC >= 54) and ($iC <= 58)))? 1 : 0;
        }
        elsif($iR==82){
            return (($iC == 28) or ($iC == 30) or ($iC == 32) or ($iC == 54) or ($iC == 56) or ($iC == 58))? 1 : 0;
        }
        elsif($iR==5){
            return (($iC == 28) or ($iC == 32) or ($iC == 54) or ($iC == 58) or ($iC == 79))? 1 : 0;
        }
        elsif($iR==0){
            return ((($iC >= 78) and ($iC <= 80)))? 1 : 0;
        }
        elsif($iR==1){
            return (($iC == 79))? 1 : 0;
        }
        elsif($iR==4){
            return ((($iC >= 28) and ($iC <= 32)) or (($iC >= 54) and ($iC <= 58)) or ($iC == 79))? 1 : 0;
        }
        elsif(($iR==8) or ($iR==84)){
            return ((($iC >= 28) and ($iC <= 32)) or (($iC >= 54) and ($iC <= 58)))? 1 : 0;
        }
        elsif(($iR==30) or ($iR==56)){
            return (($iC == 4) or ($iC == 8) or ($iC == 28) or ($iC == 30) or ($iC == 32) or ($iC == 54) or ($iC == 56) or ($iC == 58) or ($iC == 80) or ($iC == 82) or ($iC == 84))? 1 : 0;
        }
        elsif(($iR==7) or ($iR==81) or ($iR==83)){
            return (($iC == 28) or ($iC == 32) or ($iC == 54) or ($iC == 58))? 1 : 0;
        }
        elsif(($iR==29) or ($iR==31) or ($iR==55) or ($iR==57)){
            return (($iC == 4) or ($iC == 8) or ($iC == 28) or ($iC == 32) or ($iC == 54) or ($iC == 58) or ($iC == 80) or ($iC == 84))? 1 : 0;
        }
        elsif(($iR==28) or ($iR==32) or ($iR==54) or ($iR==58)){
            return ((($iC >= 4) and ($iC <= 5)) or (($iC >= 7) and ($iC <= 8)) or (($iC >= 28) and ($iC <= 32)) or (($iC >= 54) and ($iC <= 58)) or (($iC >= 80) and ($iC <= 84)))? 1 : 0;
        }
        return 0;
    }
    elsif($iV == 19) {
        if($iR==1){
            return ((($iC >= 83) and ($iC <= 84)))? 1 : 0;
        }
        elsif($iR==4){
            return ((($iC >= 28) and ($iC <= 32)) or (($iC >= 56) and ($iC <= 60)) or (($iC >= 82) and ($iC <= 83)))? 1 : 0;
        }
        elsif($iR==84){
            return ((($iC >= 1) and ($iC <= 2)) or (($iC >= 28) and ($iC <= 32)) or (($iC >= 56) and ($iC <= 60)))? 1 : 0;
        }
        elsif($iR==83){
            return ((($iC >= 0) and ($iC <= 1)) or (($iC >= 3) and ($iC <= 5)))? 1 : 0;
        }
        elsif($iR==2){
            return (($iC == 84))? 1 : 0;
        }
        elsif($iR==86){
            return (($iC == 28) or ($iC == 30) or ($iC == 32) or ($iC == 56) or ($iC == 58) or ($iC == 60))? 1 : 0;
        }
        elsif($iR==82){
            return (($iC == 4))? 1 : 0;
        }
        elsif($iR==5){
            return (($iC == 28) or ($iC == 32) or ($iC == 56) or ($iC == 60) or ($iC == 83))? 1 : 0;
        }
        elsif(($iR==0) or ($iR==3)){
            return (($iC == 83))? 1 : 0;
        }
        elsif(($iR==30) or ($iR==58)){
            return (($iC == 4) or ($iC == 8) or ($iC == 28) or ($iC == 30) or ($iC == 32) or ($iC == 56) or ($iC == 58) or ($iC == 60) or ($iC == 84) or ($iC == 86) or ($iC == 88))? 1 : 0;
        }
        elsif(($iR==8) or ($iR==88)){
            return ((($iC >= 28) and ($iC <= 32)) or (($iC >= 56) and ($iC <= 60)))? 1 : 0;
        }
        elsif(($iR==7) or ($iR==85) or ($iR==87)){
            return (($iC == 28) or ($iC == 32) or ($iC == 56) or ($iC == 60))? 1 : 0;
        }
        elsif(($iR==29) or ($iR==31) or ($iR==57) or ($iR==59)){
            return (($iC == 4) or ($iC == 8) or ($iC == 28) or ($iC == 32) or ($iC == 56) or ($iC == 60) or ($iC == 84) or ($iC == 88))? 1 : 0;
        }
        elsif(($iR==28) or ($iR==32) or ($iR==56) or ($iR==60)){
            return ((($iC >= 4) and ($iC <= 5)) or (($iC >= 7) and ($iC <= 8)) or (($iC >= 28) and ($iC <= 32)) or (($iC >= 56) and ($iC <= 60)) or (($iC >= 84) and ($iC <= 88)))? 1 : 0;
        }
        return 0;
    }
    elsif($iV == 20) {
        if($iR==4){
            return ((($iC >= 32) and ($iC <= 36)) or (($iC >= 60) and ($iC <= 64)) or ($iC == 88))? 1 : 0;
        }
        elsif($iR==87){
            return (($iC == 0) or ($iC == 2) or ($iC == 5))? 1 : 0;
        }
        elsif($iR==88){
            return ((($iC >= 0) and ($iC <= 4)) or (($iC >= 32) and ($iC <= 36)) or (($iC >= 60) and ($iC <= 64)))? 1 : 0;
        }
        elsif($iR==90){
            return (($iC == 32) or ($iC == 34) or ($iC == 36) or ($iC == 60) or ($iC == 62) or ($iC == 64))? 1 : 0;
        }
        elsif($iR==5){
            return (($iC == 32) or ($iC == 36) or ($iC == 60) or ($iC == 64) or ($iC == 87))? 1 : 0;
        }
        elsif(($iR==1) or ($iR==3)){
            return (($iC == 88))? 1 : 0;
        }
        elsif(($iR==0) or ($iR==2)){
            return ((($iC >= 87) and ($iC <= 88)))? 1 : 0;
        }
        elsif(($iR==34) or ($iR==62)){
            return (($iC == 4) or ($iC == 8) or ($iC == 32) or ($iC == 34) or ($iC == 36) or ($iC == 60) or ($iC == 62) or ($iC == 64) or ($iC == 88) or ($iC == 90) or ($iC == 92))? 1 : 0;
        }
        elsif(($iR==8) or ($iR==92)){
            return ((($iC >= 32) and ($iC <= 36)) or (($iC >= 60) and ($iC <= 64)))? 1 : 0;
        }
        elsif(($iR==7) or ($iR==89) or ($iR==91)){
            return (($iC == 32) or ($iC == 36) or ($iC == 60) or ($iC == 64))? 1 : 0;
        }
        elsif(($iR==32) or ($iR==36) or ($iR==60) or ($iR==64)){
            return ((($iC >= 4) and ($iC <= 5)) or (($iC >= 7) and ($iC <= 8)) or (($iC >= 32) and ($iC <= 36)) or (($iC >= 60) and ($iC <= 64)) or (($iC >= 88) and ($iC <= 92)))? 1 : 0;
        }
        elsif(($iR==33) or ($iR==35) or ($iR==61) or ($iR==63)){
            return (($iC == 4) or ($iC == 8) or ($iC == 32) or ($iC == 36) or ($iC == 60) or ($iC == 64) or ($iC == 88) or ($iC == 92))? 1 : 0;
        }
        return 0;
    }
    elsif($iV == 21) {
        if($iR==90){
            return (($iC == 0) or (($iC >= 3) and ($iC <= 4)))? 1 : 0;
        }
        elsif($iR==2){
            return (($iC == 91))? 1 : 0;
        }
        elsif($iR==91){
            return (($iC == 0) or (($iC >= 2) and ($iC <= 3)) or ($iC == 5))? 1 : 0;
        }
        elsif($iR==94){
            return (($iC == 26) or ($iC == 28) or ($iC == 30) or ($iC == 48) or ($iC == 50) or ($iC == 52) or ($iC == 70) or ($iC == 72) or ($iC == 74))? 1 : 0;
        }
        elsif($iR==92){
            return (($iC == 4) or (($iC >= 26) and ($iC <= 30)) or (($iC >= 48) and ($iC <= 52)) or (($iC >= 70) and ($iC <= 74)))? 1 : 0;
        }
        elsif($iR==5){
            return (($iC == 26) or ($iC == 30) or ($iC == 48) or ($iC == 52) or ($iC == 70) or ($iC == 74) or ($iC == 91))? 1 : 0;
        }
        elsif($iR==4){
            return ((($iC >= 26) and ($iC <= 30)) or (($iC >= 48) and ($iC <= 52)) or (($iC >= 70) and ($iC <= 74)) or ($iC == 90) or ($iC == 92))? 1 : 0;
        }
        elsif(($iR==0) or ($iR==3)){
            return ((($iC >= 90) and ($iC <= 91)))? 1 : 0;
        }
        elsif(($iR==8) or ($iR==96)){
            return ((($iC >= 26) and ($iC <= 30)) or (($iC >= 48) and ($iC <= 52)) or (($iC >= 70) and ($iC <= 74)))? 1 : 0;
        }
        elsif(($iR==7) or ($iR==93) or ($iR==95)){
            return (($iC == 26) or ($iC == 30) or ($iC == 48) or ($iC == 52) or ($iC == 70) or ($iC == 74))? 1 : 0;
        }
        elsif(($iR==28) or ($iR==50) or ($iR==72)){
            return (($iC == 4) or ($iC == 8) or ($iC == 26) or ($iC == 28) or ($iC == 30) or ($iC == 48) or ($iC == 50) or ($iC == 52) or ($iC == 70) or ($iC == 72) or ($iC == 74) or ($iC == 92) or ($iC == 94) or ($iC == 96))? 1 : 0;
        }
        elsif(($iR==27) or ($iR==29) or ($iR==49) or ($iR==51) or ($iR==71) or ($iR==73)){
            return (($iC == 4) or ($iC == 8) or ($iC == 26) or ($iC == 30) or ($iC == 48) or ($iC == 52) or ($iC == 70) or ($iC == 74) or ($iC == 92) or ($iC == 96))? 1 : 0;
        }
        elsif(($iR==26) or ($iR==30) or ($iR==48) or ($iR==52) or ($iR==70) or ($iR==74)){
            return ((($iC >= 4) and ($iC <= 5)) or (($iC >= 7) and ($iC <= 8)) or (($iC >= 26) and ($iC <= 30)) or (($iC >= 48) and ($iC <= 52)) or (($iC >= 70) and ($iC <= 74)) or (($iC >= 92) and ($iC <= 96)))? 1 : 0;
        }
        return 0;
    }
    elsif($iV == 22) {
        if($iR==98){
            return (($iC == 24) or ($iC == 26) or ($iC == 28) or ($iC == 48) or ($iC == 50) or ($iC == 52) or ($iC == 72) or ($iC == 74) or ($iC == 76))? 1 : 0;
        }
        elsif($iR==95){
            return (($iC == 2) or (($iC >= 4) and ($iC <= 5)))? 1 : 0;
        }
        elsif($iR==3){
            return (($iC == 96))? 1 : 0;
        }
        elsif($iR==96){
            return ((($iC >= 3) and ($iC <= 4)) or (($iC >= 24) and ($iC <= 28)) or (($iC >= 48) and ($iC <= 52)) or (($iC >= 72) and ($iC <= 76)))? 1 : 0;
        }
        elsif($iR==94){
            return ((($iC >= 0) and ($iC <= 2)))? 1 : 0;
        }
        elsif($iR==4){
            return ((($iC >= 24) and ($iC <= 28)) or (($iC >= 48) and ($iC <= 52)) or (($iC >= 72) and ($iC <= 76)) or (($iC >= 95) and ($iC <= 96)))? 1 : 0;
        }
        elsif($iR==5){
            return (($iC == 24) or ($iC == 28) or ($iC == 48) or ($iC == 52) or ($iC == 72) or ($iC == 76) or ($iC == 95))? 1 : 0;
        }
        elsif($iR==2){
            return ((($iC >= 94) and ($iC <= 95)))? 1 : 0;
        }
        elsif(($iR==8) or ($iR==100)){
            return ((($iC >= 24) and ($iC <= 28)) or (($iC >= 48) and ($iC <= 52)) or (($iC >= 72) and ($iC <= 76)))? 1 : 0;
        }
        elsif(($iR==0) or ($iR==1)){
            return (($iC == 94))? 1 : 0;
        }
        elsif(($iR==26) or ($iR==50) or ($iR==74)){
            return (($iC == 4) or ($iC == 8) or ($iC == 24) or ($iC == 26) or ($iC == 28) or ($iC == 48) or ($iC == 50) or ($iC == 52) or ($iC == 72) or ($iC == 74) or ($iC == 76) or ($iC == 96) or ($iC == 98) or ($iC == 100))? 1 : 0;
        }
        elsif(($iR==7) or ($iR==97) or ($iR==99)){
            return (($iC == 24) or ($iC == 28) or ($iC == 48) or ($iC == 52) or ($iC == 72) or ($iC == 76))? 1 : 0;
        }
        elsif(($iR==24) or ($iR==28) or ($iR==48) or ($iR==52) or ($iR==72) or ($iR==76)){
            return ((($iC >= 4) and ($iC <= 5)) or (($iC >= 7) and ($iC <= 8)) or (($iC >= 24) and ($iC <= 28)) or (($iC >= 48) and ($iC <= 52)) or (($iC >= 72) and ($iC <= 76)) or (($iC >= 96) and ($iC <= 100)))? 1 : 0;
        }
        elsif(($iR==25) or ($iR==27) or ($iR==49) or ($iR==51) or ($iR==73) or ($iR==75)){
            return (($iC == 4) or ($iC == 8) or ($iC == 24) or ($iC == 28) or ($iC == 48) or ($iC == 52) or ($iC == 72) or ($iC == 76) or ($iC == 96) or ($iC == 100))? 1 : 0;
        }
        return 0;
    }
    elsif($iV == 23) {
        if($iR==3){
            return ((($iC >= 98) and ($iC <= 99)))? 1 : 0;
        }
        elsif($iR==2){
            return ((($iC >= 98) and ($iC <= 100)))? 1 : 0;
        }
        elsif($iR==1){
            return (($iC == 98) or ($iC == 100))? 1 : 0;
        }
        elsif($iR==5){
            return (($iC == 28) or ($iC == 32) or ($iC == 52) or ($iC == 56) or ($iC == 76) or ($iC == 80) or ($iC == 99))? 1 : 0;
        }
        elsif($iR==100){
            return ((($iC >= 0) and ($iC <= 2)) or ($iC == 4) or (($iC >= 28) and ($iC <= 32)) or (($iC >= 52) and ($iC <= 56)) or (($iC >= 76) and ($iC <= 80)))? 1 : 0;
        }
        elsif($iR==99){
            return ((($iC >= 2) and ($iC <= 5)))? 1 : 0;
        }
        elsif($iR==4){
            return ((($iC >= 28) and ($iC <= 32)) or (($iC >= 52) and ($iC <= 56)) or (($iC >= 76) and ($iC <= 80)) or (($iC >= 98) and ($iC <= 100)))? 1 : 0;
        }
        elsif($iR==102){
            return (($iC == 28) or ($iC == 30) or ($iC == 32) or ($iC == 52) or ($iC == 54) or ($iC == 56) or ($iC == 76) or ($iC == 78) or ($iC == 80))? 1 : 0;
        }
        elsif($iR==0){
            return (($iC == 100))? 1 : 0;
        }
        elsif($iR==98){
            return ((($iC >= 1) and ($iC <= 4)))? 1 : 0;
        }
        elsif(($iR==8) or ($iR==104)){
            return ((($iC >= 28) and ($iC <= 32)) or (($iC >= 52) and ($iC <= 56)) or (($iC >= 76) and ($iC <= 80)))? 1 : 0;
        }
        elsif(($iR==7) or ($iR==101) or ($iR==103)){
            return (($iC == 28) or ($iC == 32) or ($iC == 52) or ($iC == 56) or ($iC == 76) or ($iC == 80))? 1 : 0;
        }
        elsif(($iR==30) or ($iR==54) or ($iR==78)){
            return (($iC == 4) or ($iC == 8) or ($iC == 28) or ($iC == 30) or ($iC == 32) or ($iC == 52) or ($iC == 54) or ($iC == 56) or ($iC == 76) or ($iC == 78) or ($iC == 80) or ($iC == 100) or ($iC == 102) or ($iC == 104))? 1 : 0;
        }
        elsif(($iR==28) or ($iR==32) or ($iR==52) or ($iR==56) or ($iR==76) or ($iR==80)){
            return ((($iC >= 4) and ($iC <= 5)) or (($iC >= 7) and ($iC <= 8)) or (($iC >= 28) and ($iC <= 32)) or (($iC >= 52) and ($iC <= 56)) or (($iC >= 76) and ($iC <= 80)) or (($iC >= 100) and ($iC <= 104)))? 1 : 0;
        }
        elsif(($iR==29) or ($iR==31) or ($iR==53) or ($iR==55) or ($iR==77) or ($iR==79)){
            return (($iC == 4) or ($iC == 8) or ($iC == 28) or ($iC == 32) or ($iC == 52) or ($iC == 56) or ($iC == 76) or ($iC == 80) or ($iC == 100) or ($iC == 104))? 1 : 0;
        }
        return 0;
    }
    elsif($iV == 24) {
        if($iR==0){
            return (($iC == 104))? 1 : 0;
        }
        elsif($iR==106){
            return (($iC == 26) or ($iC == 28) or ($iC == 30) or ($iC == 52) or ($iC == 54) or ($iC == 56) or ($iC == 78) or ($iC == 80) or ($iC == 82))? 1 : 0;
        }
        elsif($iR==3){
            return ((($iC >= 102) and ($iC <= 104)))? 1 : 0;
        }
        elsif($iR==2){
            return ((($iC >= 102) and ($iC <= 103)))? 1 : 0;
        }
        elsif($iR==104){
            return (($iC == 0) or ($iC == 3) or (($iC >= 26) and ($iC <= 30)) or (($iC >= 52) and ($iC <= 56)) or (($iC >= 78) and ($iC <= 82)))? 1 : 0;
        }
        elsif($iR==5){
            return (($iC == 26) or ($iC == 30) or ($iC == 52) or ($iC == 56) or ($iC == 78) or ($iC == 82) or (($iC >= 102) and ($iC <= 103)))? 1 : 0;
        }
        elsif(($iR==102) or ($iR==103)){
            return ((($iC >= 2) and ($iC <= 3)) or ($iC == 5))? 1 : 0;
        }
        elsif(($iR==4) or ($iR==8) or ($iR==108)){
            return ((($iC >= 26) and ($iC <= 30)) or (($iC >= 52) and ($iC <= 56)) or (($iC >= 78) and ($iC <= 82)))? 1 : 0;
        }
        elsif(($iR==7) or ($iR==105) or ($iR==107)){
            return (($iC == 26) or ($iC == 30) or ($iC == 52) or ($iC == 56) or ($iC == 78) or ($iC == 82))? 1 : 0;
        }
        elsif(($iR==28) or ($iR==54) or ($iR==80)){
            return (($iC == 4) or ($iC == 8) or ($iC == 26) or ($iC == 28) or ($iC == 30) or ($iC == 52) or ($iC == 54) or ($iC == 56) or ($iC == 78) or ($iC == 80) or ($iC == 82) or ($iC == 104) or ($iC == 106) or ($iC == 108))? 1 : 0;
        }
        elsif(($iR==26) or ($iR==30) or ($iR==52) or ($iR==56) or ($iR==78) or ($iR==82)){
            return ((($iC >= 4) and ($iC <= 5)) or (($iC >= 7) and ($iC <= 8)) or (($iC >= 26) and ($iC <= 30)) or (($iC >= 52) and ($iC <= 56)) or (($iC >= 78) and ($iC <= 82)) or (($iC >= 104) and ($iC <= 108)))? 1 : 0;
        }
        elsif(($iR==27) or ($iR==29) or ($iR==53) or ($iR==55) or ($iR==79) or ($iR==81)){
            return (($iC == 4) or ($iC == 8) or ($iC == 26) or ($iC == 30) or ($iC == 52) or ($iC == 56) or ($iC == 78) or ($iC == 82) or ($iC == 104) or ($iC == 108))? 1 : 0;
        }
        return 0;
    }
    elsif($iV == 25) {
        if($iR==1){
            return (($iC == 108))? 1 : 0;
        }
        elsif($iR==106){
            return (($iC == 0) or ($iC == 2) or (($iC >= 4) and ($iC <= 5)))? 1 : 0;
        }
        elsif($iR==108){
            return ((($iC >= 1) and ($iC <= 2)) or (($iC >= 30) and ($iC <= 34)) or (($iC >= 56) and ($iC <= 60)) or (($iC >= 82) and ($iC <= 86)))? 1 : 0;
        }
        elsif($iR==5){
            return (($iC == 30) or ($iC == 34) or ($iC == 56) or ($iC == 60) or ($iC == 82) or ($iC == 86) or (($iC >= 106) and ($iC <= 107)))? 1 : 0;
        }
        elsif($iR==110){
            return (($iC == 30) or ($iC == 32) or ($iC == 34) or ($iC == 56) or ($iC == 58) or ($iC == 60) or ($iC == 82) or ($iC == 84) or ($iC == 86))? 1 : 0;
        }
        elsif($iR==107){
            return (($iC == 2) or ($iC == 5))? 1 : 0;
        }
        elsif($iR==2){
            return ((($iC >= 106) and ($iC <= 108)))? 1 : 0;
        }
        elsif($iR==0){
            return (($iC == 106))? 1 : 0;
        }
        elsif($iR==4){
            return ((($iC >= 30) and ($iC <= 34)) or (($iC >= 56) and ($iC <= 60)) or (($iC >= 82) and ($iC <= 86)) or ($iC == 106))? 1 : 0;
        }
        elsif(($iR==8) or ($iR==112)){
            return ((($iC >= 30) and ($iC <= 34)) or (($iC >= 56) and ($iC <= 60)) or (($iC >= 82) and ($iC <= 86)))? 1 : 0;
        }
        elsif(($iR==7) or ($iR==109) or ($iR==111)){
            return (($iC == 30) or ($iC == 34) or ($iC == 56) or ($iC == 60) or ($iC == 82) or ($iC == 86))? 1 : 0;
        }
        elsif(($iR==32) or ($iR==58) or ($iR==84)){
            return (($iC == 4) or ($iC == 8) or ($iC == 30) or ($iC == 32) or ($iC == 34) or ($iC == 56) or ($iC == 58) or ($iC == 60) or ($iC == 82) or ($iC == 84) or ($iC == 86) or ($iC == 108) or ($iC == 110) or ($iC == 112))? 1 : 0;
        }
        elsif(($iR==31) or ($iR==33) or ($iR==57) or ($iR==59) or ($iR==83) or ($iR==85)){
            return (($iC == 4) or ($iC == 8) or ($iC == 30) or ($iC == 34) or ($iC == 56) or ($iC == 60) or ($iC == 82) or ($iC == 86) or ($iC == 108) or ($iC == 112))? 1 : 0;
        }
        elsif(($iR==30) or ($iR==34) or ($iR==56) or ($iR==60) or ($iR==82) or ($iR==86)){
            return ((($iC >= 4) and ($iC <= 5)) or (($iC >= 7) and ($iC <= 8)) or (($iC >= 30) and ($iC <= 34)) or (($iC >= 56) and ($iC <= 60)) or (($iC >= 82) and ($iC <= 86)) or (($iC >= 108) and ($iC <= 112)))? 1 : 0;
        }
        return 0;
    }
    elsif($iV == 26) {
        if($iR==112){
            return ((($iC >= 1) and ($iC <= 3)) or (($iC >= 28) and ($iC <= 32)) or (($iC >= 56) and ($iC <= 60)) or (($iC >= 84) and ($iC <= 88)))? 1 : 0;
        }
        elsif($iR==0){
            return ((($iC >= 110) and ($iC <= 111)))? 1 : 0;
        }
        elsif($iR==1){
            return (($iC == 110) or ($iC == 112))? 1 : 0;
        }
        elsif($iR==4){
            return ((($iC >= 28) and ($iC <= 32)) or (($iC >= 56) and ($iC <= 60)) or (($iC >= 84) and ($iC <= 88)) or ($iC == 111))? 1 : 0;
        }
        elsif($iR==3){
            return ((($iC >= 110) and ($iC <= 112)))? 1 : 0;
        }
        elsif($iR==110){
            return ((($iC >= 0) and ($iC <= 1)) or ($iC == 3) or ($iC == 5))? 1 : 0;
        }
        elsif($iR==114){
            return (($iC == 28) or ($iC == 30) or ($iC == 32) or ($iC == 56) or ($iC == 58) or ($iC == 60) or ($iC == 84) or ($iC == 86) or ($iC == 88))? 1 : 0;
        }
        elsif($iR==2){
            return ((($iC >= 111) and ($iC <= 112)))? 1 : 0;
        }
        elsif($iR==5){
            return (($iC == 28) or ($iC == 32) or ($iC == 56) or ($iC == 60) or ($iC == 84) or ($iC == 88) or (($iC >= 110) and ($iC <= 111)))? 1 : 0;
        }
        elsif($iR==111){
            return (($iC == 0) or (($iC >= 2) and ($iC <= 5)))? 1 : 0;
        }
        elsif(($iR==8) or ($iR==116)){
            return ((($iC >= 28) and ($iC <= 32)) or (($iC >= 56) and ($iC <= 60)) or (($iC >= 84) and ($iC <= 88)))? 1 : 0;
        }
        elsif(($iR==7) or ($iR==113) or ($iR==115)){
            return (($iC == 28) or ($iC == 32) or ($iC == 56) or ($iC == 60) or ($iC == 84) or ($iC == 88))? 1 : 0;
        }
        elsif(($iR==30) or ($iR==58) or ($iR==86)){
            return (($iC == 4) or ($iC == 8) or ($iC == 28) or ($iC == 30) or ($iC == 32) or ($iC == 56) or ($iC == 58) or ($iC == 60) or ($iC == 84) or ($iC == 86) or ($iC == 88) or ($iC == 112) or ($iC == 114) or ($iC == 116))? 1 : 0;
        }
        elsif(($iR==29) or ($iR==31) or ($iR==57) or ($iR==59) or ($iR==85) or ($iR==87)){
            return (($iC == 4) or ($iC == 8) or ($iC == 28) or ($iC == 32) or ($iC == 56) or ($iC == 60) or ($iC == 84) or ($iC == 88) or ($iC == 112) or ($iC == 116))? 1 : 0;
        }
        elsif(($iR==28) or ($iR==32) or ($iR==56) or ($iR==60) or ($iR==84) or ($iR==88)){
            return ((($iC >= 4) and ($iC <= 5)) or (($iC >= 7) and ($iC <= 8)) or (($iC >= 28) and ($iC <= 32)) or (($iC >= 56) and ($iC <= 60)) or (($iC >= 84) and ($iC <= 88)) or (($iC >= 112) and ($iC <= 116)))? 1 : 0;
        }
        return 0;
    }
    elsif($iV == 27) {
        if($iR==116){
            return (($iC == 0) or (($iC >= 32) and ($iC <= 36)) or (($iC >= 60) and ($iC <= 64)) or (($iC >= 88) and ($iC <= 92)))? 1 : 0;
        }
        elsif($iR==114){
            return (($iC == 1) or (($iC >= 4) and ($iC <= 5)))? 1 : 0;
        }
        elsif($iR==118){
            return (($iC == 32) or ($iC == 34) or ($iC == 36) or ($iC == 60) or ($iC == 62) or ($iC == 64) or ($iC == 88) or ($iC == 90) or ($iC == 92))? 1 : 0;
        }
        elsif($iR==115){
            return (($iC == 0) or ($iC == 2) or (($iC >= 4) and ($iC <= 5)))? 1 : 0;
        }
        elsif($iR==1){
            return (($iC == 114))? 1 : 0;
        }
        elsif($iR==0){
            return ((($iC >= 115) and ($iC <= 116)))? 1 : 0;
        }
        elsif($iR==5){
            return (($iC == 32) or ($iC == 36) or ($iC == 60) or ($iC == 64) or ($iC == 88) or ($iC == 92) or (($iC >= 114) and ($iC <= 115)))? 1 : 0;
        }
        elsif($iR==2){
            return (($iC == 115))? 1 : 0;
        }
        elsif($iR==4){
            return ((($iC >= 32) and ($iC <= 36)) or (($iC >= 60) and ($iC <= 64)) or (($iC >= 88) and ($iC <= 92)) or (($iC >= 114) and ($iC <= 115)))? 1 : 0;
        }
        elsif(($iR==8) or ($iR==120)){
            return ((($iC >= 32) and ($iC <= 36)) or (($iC >= 60) and ($iC <= 64)) or (($iC >= 88) and ($iC <= 92)))? 1 : 0;
        }
        elsif(($iR==34) or ($iR==62) or ($iR==90)){
            return (($iC == 4) or ($iC == 8) or ($iC == 32) or ($iC == 34) or ($iC == 36) or ($iC == 60) or ($iC == 62) or ($iC == 64) or ($iC == 88) or ($iC == 90) or ($iC == 92) or ($iC == 116) or ($iC == 118) or ($iC == 120))? 1 : 0;
        }
        elsif(($iR==7) or ($iR==117) or ($iR==119)){
            return (($iC == 32) or ($iC == 36) or ($iC == 60) or ($iC == 64) or ($iC == 88) or ($iC == 92))? 1 : 0;
        }
        elsif(($iR==33) or ($iR==35) or ($iR==61) or ($iR==63) or ($iR==89) or ($iR==91)){
            return (($iC == 4) or ($iC == 8) or ($iC == 32) or ($iC == 36) or ($iC == 60) or ($iC == 64) or ($iC == 88) or ($iC == 92) or ($iC == 116) or ($iC == 120))? 1 : 0;
        }
        elsif(($iR==32) or ($iR==36) or ($iR==60) or ($iR==64) or ($iR==88) or ($iR==92)){
            return ((($iC >= 4) and ($iC <= 5)) or (($iC >= 7) and ($iC <= 8)) or (($iC >= 32) and ($iC <= 36)) or (($iC >= 60) and ($iC <= 64)) or (($iC >= 88) and ($iC <= 92)) or (($iC >= 116) and ($iC <= 120)))? 1 : 0;
        }
        return 0;
    }
    elsif($iV == 28) {
        if($iR==122){
            return (($iC == 24) or ($iC == 26) or ($iC == 28) or ($iC == 48) or ($iC == 50) or ($iC == 52) or ($iC == 72) or ($iC == 74) or ($iC == 76) or ($iC == 96) or ($iC == 98) or ($iC == 100))? 1 : 0;
        }
        elsif($iR==120){
            return ((($iC >= 3) and ($iC <= 4)) or (($iC >= 24) and ($iC <= 28)) or (($iC >= 48) and ($iC <= 52)) or (($iC >= 72) and ($iC <= 76)) or (($iC >= 96) and ($iC <= 100)))? 1 : 0;
        }
        elsif($iR==5){
            return (($iC == 24) or ($iC == 28) or ($iC == 48) or ($iC == 52) or ($iC == 72) or ($iC == 76) or ($iC == 96) or ($iC == 100) or (($iC >= 118) and ($iC <= 119)))? 1 : 0;
        }
        elsif($iR==3){
            return ((($iC >= 119) and ($iC <= 120)))? 1 : 0;
        }
        elsif($iR==118){
            return (($iC == 1) or ($iC == 5))? 1 : 0;
        }
        elsif($iR==1){
            return ((($iC >= 118) and ($iC <= 119)))? 1 : 0;
        }
        elsif($iR==119){
            return ((($iC >= 0) and ($iC <= 1)) or ($iC == 3) or ($iC == 5))? 1 : 0;
        }
        elsif($iR==4){
            return ((($iC >= 24) and ($iC <= 28)) or (($iC >= 48) and ($iC <= 52)) or (($iC >= 72) and ($iC <= 76)) or (($iC >= 96) and ($iC <= 100)) or ($iC == 120))? 1 : 0;
        }
        elsif($iR==0){
            return (($iC == 119))? 1 : 0;
        }
        elsif(($iR==8) or ($iR==124)){
            return ((($iC >= 24) and ($iC <= 28)) or (($iC >= 48) and ($iC <= 52)) or (($iC >= 72) and ($iC <= 76)) or (($iC >= 96) and ($iC <= 100)))? 1 : 0;
        }
        elsif(($iR==7) or ($iR==121) or ($iR==123)){
            return (($iC == 24) or ($iC == 28) or ($iC == 48) or ($iC == 52) or ($iC == 72) or ($iC == 76) or ($iC == 96) or ($iC == 100))? 1 : 0;
        }
        elsif(($iR==26) or ($iR==50) or ($iR==74) or ($iR==98)){
            return (($iC == 4) or ($iC == 8) or ($iC == 24) or ($iC == 26) or ($iC == 28) or ($iC == 48) or ($iC == 50) or ($iC == 52) or ($iC == 72) or ($iC == 74) or ($iC == 76) or ($iC == 96) or ($iC == 98) or ($iC == 100) or ($iC == 120) or ($iC == 122) or ($iC == 124))? 1 : 0;
        }
        elsif(($iR==24) or ($iR==28) or ($iR==48) or ($iR==52) or ($iR==72) or ($iR==76) or ($iR==96) or ($iR==100)){
            return ((($iC >= 4) and ($iC <= 5)) or (($iC >= 7) and ($iC <= 8)) or (($iC >= 24) and ($iC <= 28)) or (($iC >= 48) and ($iC <= 52)) or (($iC >= 72) and ($iC <= 76)) or (($iC >= 96) and ($iC <= 100)) or (($iC >= 120) and ($iC <= 124)))? 1 : 0;
        }
        elsif(($iR==25) or ($iR==27) or ($iR==49) or ($iR==51) or ($iR==73) or ($iR==75) or ($iR==97) or ($iR==99)){
            return (($iC == 4) or ($iC == 8) or ($iC == 24) or ($iC == 28) or ($iC == 48) or ($iC == 52) or ($iC == 72) or ($iC == 76) or ($iC == 96) or ($iC == 100) or ($iC == 120) or ($iC == 124))? 1 : 0;
        }
        return 0;
    }
    elsif($iV == 29) {
        if($iR==123){
            return ((($iC >= 0) and ($iC <= 1)) or ($iC == 5))? 1 : 0;
        }
        elsif($iR==122){
            return ((($iC >= 0) and ($iC <= 1)) or (($iC >= 3) and ($iC <= 5)))? 1 : 0;
        }
        elsif($iR==4){
            return ((($iC >= 28) and ($iC <= 32)) or (($iC >= 52) and ($iC <= 56)) or (($iC >= 76) and ($iC <= 80)) or (($iC >= 100) and ($iC <= 104)) or ($iC == 122) or ($iC == 124))? 1 : 0;
        }
        elsif($iR==126){
            return (($iC == 28) or ($iC == 30) or ($iC == 32) or ($iC == 52) or ($iC == 54) or ($iC == 56) or ($iC == 76) or ($iC == 78) or ($iC == 80) or ($iC == 100) or ($iC == 102) or ($iC == 104))? 1 : 0;
        }
        elsif($iR==3){
            return (($iC == 122))? 1 : 0;
        }
        elsif($iR==5){
            return (($iC == 28) or ($iC == 32) or ($iC == 52) or ($iC == 56) or ($iC == 76) or ($iC == 80) or ($iC == 100) or ($iC == 104) or (($iC >= 122) and ($iC <= 123)))? 1 : 0;
        }
        elsif($iR==124){
            return ((($iC >= 0) and ($iC <= 2)) or ($iC == 4) or (($iC >= 28) and ($iC <= 32)) or (($iC >= 52) and ($iC <= 56)) or (($iC >= 76) and ($iC <= 80)) or (($iC >= 100) and ($iC <= 104)))? 1 : 0;
        }
        elsif($iR==2){
            return (($iC == 124))? 1 : 0;
        }
        elsif(($iR==8) or ($iR==128)){
            return ((($iC >= 28) and ($iC <= 32)) or (($iC >= 52) and ($iC <= 56)) or (($iC >= 76) and ($iC <= 80)) or (($iC >= 100) and ($iC <= 104)))? 1 : 0;
        }
        elsif(($iR==0) or ($iR==1)){
            return ((($iC >= 122) and ($iC <= 124)))? 1 : 0;
        }
        elsif(($iR==7) or ($iR==125) or ($iR==127)){
            return (($iC == 28) or ($iC == 32) or ($iC == 52) or ($iC == 56) or ($iC == 76) or ($iC == 80) or ($iC == 100) or ($iC == 104))? 1 : 0;
        }
        elsif(($iR==30) or ($iR==54) or ($iR==78) or ($iR==102)){
            return (($iC == 4) or ($iC == 8) or ($iC == 28) or ($iC == 30) or ($iC == 32) or ($iC == 52) or ($iC == 54) or ($iC == 56) or ($iC == 76) or ($iC == 78) or ($iC == 80) or ($iC == 100) or ($iC == 102) or ($iC == 104) or ($iC == 124) or ($iC == 126) or ($iC == 128))? 1 : 0;
        }
        elsif(($iR==29) or ($iR==31) or ($iR==53) or ($iR==55) or ($iR==77) or ($iR==79) or ($iR==101) or ($iR==103)){
            return (($iC == 4) or ($iC == 8) or ($iC == 28) or ($iC == 32) or ($iC == 52) or ($iC == 56) or ($iC == 76) or ($iC == 80) or ($iC == 100) or ($iC == 104) or ($iC == 124) or ($iC == 128))? 1 : 0;
        }
        elsif(($iR==28) or ($iR==32) or ($iR==52) or ($iR==56) or ($iR==76) or ($iR==80) or ($iR==100) or ($iR==104)){
            return ((($iC >= 4) and ($iC <= 5)) or (($iC >= 7) and ($iC <= 8)) or (($iC >= 28) and ($iC <= 32)) or (($iC >= 52) and ($iC <= 56)) or (($iC >= 76) and ($iC <= 80)) or (($iC >= 100) and ($iC <= 104)) or (($iC >= 124) and ($iC <= 128)))? 1 : 0;
        }
        return 0;
    }
    elsif($iV == 30) {
        if($iR==4){
            return ((($iC >= 24) and ($iC <= 28)) or (($iC >= 50) and ($iC <= 54)) or (($iC >= 76) and ($iC <= 80)) or (($iC >= 102) and ($iC <= 106)) or (($iC >= 127) and ($iC <= 128)))? 1 : 0;
        }
        elsif($iR==128){
            return ((($iC >= 0) and ($iC <= 4)) or (($iC >= 24) and ($iC <= 28)) or (($iC >= 50) and ($iC <= 54)) or (($iC >= 76) and ($iC <= 80)) or (($iC >= 102) and ($iC <= 106)))? 1 : 0;
        }
        elsif($iR==127){
            return (($iC == 1) or (($iC >= 3) and ($iC <= 5)))? 1 : 0;
        }
        elsif($iR==5){
            return (($iC == 24) or ($iC == 28) or ($iC == 50) or ($iC == 54) or ($iC == 76) or ($iC == 80) or ($iC == 102) or ($iC == 106) or (($iC >= 126) and ($iC <= 127)))? 1 : 0;
        }
        elsif($iR==130){
            return (($iC == 24) or ($iC == 26) or ($iC == 28) or ($iC == 50) or ($iC == 52) or ($iC == 54) or ($iC == 76) or ($iC == 78) or ($iC == 80) or ($iC == 102) or ($iC == 104) or ($iC == 106))? 1 : 0;
        }
        elsif($iR==126){
            return (($iC == 0) or ($iC == 2) or ($iC == 5))? 1 : 0;
        }
        elsif(($iR==8) or ($iR==132)){
            return ((($iC >= 24) and ($iC <= 28)) or (($iC >= 50) and ($iC <= 54)) or (($iC >= 76) and ($iC <= 80)) or (($iC >= 102) and ($iC <= 106)))? 1 : 0;
        }
        elsif(($iR==0) or ($iR==2)){
            return (($iC == 126) or ($iC == 128))? 1 : 0;
        }
        elsif(($iR==1) or ($iR==3)){
            return ((($iC >= 127) and ($iC <= 128)))? 1 : 0;
        }
        elsif(($iR==7) or ($iR==129) or ($iR==131)){
            return (($iC == 24) or ($iC == 28) or ($iC == 50) or ($iC == 54) or ($iC == 76) or ($iC == 80) or ($iC == 102) or ($iC == 106))? 1 : 0;
        }
        elsif(($iR==26) or ($iR==52) or ($iR==78) or ($iR==104)){
            return (($iC == 4) or ($iC == 8) or ($iC == 24) or ($iC == 26) or ($iC == 28) or ($iC == 50) or ($iC == 52) or ($iC == 54) or ($iC == 76) or ($iC == 78) or ($iC == 80) or ($iC == 102) or ($iC == 104) or ($iC == 106) or ($iC == 128) or ($iC == 130) or ($iC == 132))? 1 : 0;
        }
        elsif(($iR==25) or ($iR==27) or ($iR==51) or ($iR==53) or ($iR==77) or ($iR==79) or ($iR==103) or ($iR==105)){
            return (($iC == 4) or ($iC == 8) or ($iC == 24) or ($iC == 28) or ($iC == 50) or ($iC == 54) or ($iC == 76) or ($iC == 80) or ($iC == 102) or ($iC == 106) or ($iC == 128) or ($iC == 132))? 1 : 0;
        }
        elsif(($iR==24) or ($iR==28) or ($iR==50) or ($iR==54) or ($iR==76) or ($iR==80) or ($iR==102) or ($iR==106)){
            return ((($iC >= 4) and ($iC <= 5)) or (($iC >= 7) and ($iC <= 8)) or (($iC >= 24) and ($iC <= 28)) or (($iC >= 50) and ($iC <= 54)) or (($iC >= 76) and ($iC <= 80)) or (($iC >= 102) and ($iC <= 106)) or (($iC >= 128) and ($iC <= 132)))? 1 : 0;
        }
        return 0;
    }
    elsif($iV == 31) {
        if($iR==131){
            return (($iC == 1) or (($iC >= 4) and ($iC <= 5)))? 1 : 0;
        }
        elsif($iR==134){
            return (($iC == 28) or ($iC == 30) or ($iC == 32) or ($iC == 54) or ($iC == 56) or ($iC == 58) or ($iC == 80) or ($iC == 82) or ($iC == 84) or ($iC == 106) or ($iC == 108) or ($iC == 110))? 1 : 0;
        }
        elsif($iR==5){
            return (($iC == 28) or ($iC == 32) or ($iC == 54) or ($iC == 58) or ($iC == 80) or ($iC == 84) or ($iC == 106) or ($iC == 110) or (($iC >= 130) and ($iC <= 131)))? 1 : 0;
        }
        elsif($iR==130){
            return ((($iC >= 2) and ($iC <= 5)))? 1 : 0;
        }
        elsif($iR==132){
            return (($iC == 4) or (($iC >= 28) and ($iC <= 32)) or (($iC >= 54) and ($iC <= 58)) or (($iC >= 80) and ($iC <= 84)) or (($iC >= 106) and ($iC <= 110)))? 1 : 0;
        }
        elsif($iR==4){
            return ((($iC >= 28) and ($iC <= 32)) or (($iC >= 54) and ($iC <= 58)) or (($iC >= 80) and ($iC <= 84)) or (($iC >= 106) and ($iC <= 110)) or (($iC >= 130) and ($iC <= 132)))? 1 : 0;
        }
        elsif($iR==1){
            return (($iC == 131))? 1 : 0;
        }
        elsif(($iR==8) or ($iR==136)){
            return ((($iC >= 28) and ($iC <= 32)) or (($iC >= 54) and ($iC <= 58)) or (($iC >= 80) and ($iC <= 84)) or (($iC >= 106) and ($iC <= 110)))? 1 : 0;
        }
        elsif(($iR==2) or ($iR==3)){
            return (($iC == 130))? 1 : 0;
        }
        elsif(($iR==7) or ($iR==133) or ($iR==135)){
            return (($iC == 28) or ($iC == 32) or ($iC == 54) or ($iC == 58) or ($iC == 80) or ($iC == 84) or ($iC == 106) or ($iC == 110))? 1 : 0;
        }
        elsif(($iR==30) or ($iR==56) or ($iR==82) or ($iR==108)){
            return (($iC == 4) or ($iC == 8) or ($iC == 28) or ($iC == 30) or ($iC == 32) or ($iC == 54) or ($iC == 56) or ($iC == 58) or ($iC == 80) or ($iC == 82) or ($iC == 84) or ($iC == 106) or ($iC == 108) or ($iC == 110) or ($iC == 132) or ($iC == 134) or ($iC == 136))? 1 : 0;
        }
        elsif(($iR==29) or ($iR==31) or ($iR==55) or ($iR==57) or ($iR==81) or ($iR==83) or ($iR==107) or ($iR==109)){
            return (($iC == 4) or ($iC == 8) or ($iC == 28) or ($iC == 32) or ($iC == 54) or ($iC == 58) or ($iC == 80) or ($iC == 84) or ($iC == 106) or ($iC == 110) or ($iC == 132) or ($iC == 136))? 1 : 0;
        }
        elsif(($iR==28) or ($iR==32) or ($iR==54) or ($iR==58) or ($iR==80) or ($iR==84) or ($iR==106) or ($iR==110)){
            return ((($iC >= 4) and ($iC <= 5)) or (($iC >= 7) and ($iC <= 8)) or (($iC >= 28) and ($iC <= 32)) or (($iC >= 54) and ($iC <= 58)) or (($iC >= 80) and ($iC <= 84)) or (($iC >= 106) and ($iC <= 110)) or (($iC >= 132) and ($iC <= 136)))? 1 : 0;
        }
        return 0;
    }
    elsif($iV == 32) {
        if($iR==134){
            return (($iC == 0) or ($iC == 2))? 1 : 0;
        }
        elsif($iR==5){
            return (($iC == 32) or ($iC == 36) or ($iC == 58) or ($iC == 62) or ($iC == 84) or ($iC == 88) or ($iC == 110) or ($iC == 114) or ($iC == 136))? 1 : 0;
        }
        elsif($iR==0){
            return (($iC == 134) or ($iC == 136))? 1 : 0;
        }
        elsif($iR==138){
            return (($iC == 32) or ($iC == 34) or ($iC == 36) or ($iC == 58) or ($iC == 60) or ($iC == 62) or ($iC == 84) or ($iC == 86) or ($iC == 88) or ($iC == 110) or ($iC == 112) or ($iC == 114))? 1 : 0;
        }
        elsif($iR==2){
            return ((($iC >= 134) and ($iC <= 136)))? 1 : 0;
        }
        elsif($iR==135){
            return ((($iC >= 1) and ($iC <= 2)))? 1 : 0;
        }
        elsif($iR==1){
            return (($iC == 135))? 1 : 0;
        }
        elsif($iR==136){
            return (($iC == 0) or (($iC >= 2) and ($iC <= 3)) or ($iC == 5) or (($iC >= 32) and ($iC <= 36)) or (($iC >= 58) and ($iC <= 62)) or (($iC >= 84) and ($iC <= 88)) or (($iC >= 110) and ($iC <= 114)))? 1 : 0;
        }
        elsif($iR==3){
            return (($iC == 136))? 1 : 0;
        }
        elsif(($iR==4) or ($iR==8) or ($iR==140)){
            return ((($iC >= 32) and ($iC <= 36)) or (($iC >= 58) and ($iC <= 62)) or (($iC >= 84) and ($iC <= 88)) or (($iC >= 110) and ($iC <= 114)))? 1 : 0;
        }
        elsif(($iR==7) or ($iR==137) or ($iR==139)){
            return (($iC == 32) or ($iC == 36) or ($iC == 58) or ($iC == 62) or ($iC == 84) or ($iC == 88) or ($iC == 110) or ($iC == 114))? 1 : 0;
        }
        elsif(($iR==34) or ($iR==60) or ($iR==86) or ($iR==112)){
            return (($iC == 4) or ($iC == 8) or ($iC == 32) or ($iC == 34) or ($iC == 36) or ($iC == 58) or ($iC == 60) or ($iC == 62) or ($iC == 84) or ($iC == 86) or ($iC == 88) or ($iC == 110) or ($iC == 112) or ($iC == 114) or ($iC == 136) or ($iC == 138) or ($iC == 140))? 1 : 0;
        }
        elsif(($iR==33) or ($iR==35) or ($iR==59) or ($iR==61) or ($iR==85) or ($iR==87) or ($iR==111) or ($iR==113)){
            return (($iC == 4) or ($iC == 8) or ($iC == 32) or ($iC == 36) or ($iC == 58) or ($iC == 62) or ($iC == 84) or ($iC == 88) or ($iC == 110) or ($iC == 114) or ($iC == 136) or ($iC == 140))? 1 : 0;
        }
        elsif(($iR==32) or ($iR==36) or ($iR==58) or ($iR==62) or ($iR==84) or ($iR==88) or ($iR==110) or ($iR==114)){
            return ((($iC >= 4) and ($iC <= 5)) or (($iC >= 7) and ($iC <= 8)) or (($iC >= 32) and ($iC <= 36)) or (($iC >= 58) and ($iC <= 62)) or (($iC >= 84) and ($iC <= 88)) or (($iC >= 110) and ($iC <= 114)) or (($iC >= 136) and ($iC <= 140)))? 1 : 0;
        }
        return 0;
    }
    elsif($iV == 33) {
        if($iR==142){
            return (($iC == 28) or ($iC == 30) or ($iC == 32) or ($iC == 56) or ($iC == 58) or ($iC == 60) or ($iC == 84) or ($iC == 86) or ($iC == 88) or ($iC == 112) or ($iC == 114) or ($iC == 116))? 1 : 0;
        }
        elsif($iR==4){
            return ((($iC >= 28) and ($iC <= 32)) or (($iC >= 56) and ($iC <= 60)) or (($iC >= 84) and ($iC <= 88)) or (($iC >= 112) and ($iC <= 116)) or ($iC == 138))? 1 : 0;
        }
        elsif($iR==138){
            return ((($iC >= 2) and ($iC <= 4)))? 1 : 0;
        }
        elsif($iR==140){
            return (($iC == 1) or ($iC == 5) or (($iC >= 28) and ($iC <= 32)) or (($iC >= 56) and ($iC <= 60)) or (($iC >= 84) and ($iC <= 88)) or (($iC >= 112) and ($iC <= 116)))? 1 : 0;
        }
        elsif($iR==139){
            return ((($iC >= 1) and ($iC <= 3)))? 1 : 0;
        }
        elsif($iR==1){
            return ((($iC >= 139) and ($iC <= 140)))? 1 : 0;
        }
        elsif($iR==5){
            return (($iC == 28) or ($iC == 32) or ($iC == 56) or ($iC == 60) or ($iC == 84) or ($iC == 88) or ($iC == 112) or ($iC == 116) or ($iC == 140))? 1 : 0;
        }
        elsif(($iR==8) or ($iR==144)){
            return ((($iC >= 28) and ($iC <= 32)) or (($iC >= 56) and ($iC <= 60)) or (($iC >= 84) and ($iC <= 88)) or (($iC >= 112) and ($iC <= 116)))? 1 : 0;
        }
        elsif(($iR==2) or ($iR==3)){
            return ((($iC >= 138) and ($iC <= 139)))? 1 : 0;
        }
        elsif(($iR==7) or ($iR==141) or ($iR==143)){
            return (($iC == 28) or ($iC == 32) or ($iC == 56) or ($iC == 60) or ($iC == 84) or ($iC == 88) or ($iC == 112) or ($iC == 116))? 1 : 0;
        }
        elsif(($iR==30) or ($iR==58) or ($iR==86) or ($iR==114)){
            return (($iC == 4) or ($iC == 8) or ($iC == 28) or ($iC == 30) or ($iC == 32) or ($iC == 56) or ($iC == 58) or ($iC == 60) or ($iC == 84) or ($iC == 86) or ($iC == 88) or ($iC == 112) or ($iC == 114) or ($iC == 116) or ($iC == 140) or ($iC == 142) or ($iC == 144))? 1 : 0;
        }
        elsif(($iR==28) or ($iR==32) or ($iR==56) or ($iR==60) or ($iR==84) or ($iR==88) or ($iR==112) or ($iR==116)){
            return ((($iC >= 4) and ($iC <= 5)) or (($iC >= 7) and ($iC <= 8)) or (($iC >= 28) and ($iC <= 32)) or (($iC >= 56) and ($iC <= 60)) or (($iC >= 84) and ($iC <= 88)) or (($iC >= 112) and ($iC <= 116)) or (($iC >= 140) and ($iC <= 144)))? 1 : 0;
        }
        elsif(($iR==29) or ($iR==31) or ($iR==57) or ($iR==59) or ($iR==85) or ($iR==87) or ($iR==113) or ($iR==115)){
            return (($iC == 4) or ($iC == 8) or ($iC == 28) or ($iC == 32) or ($iC == 56) or ($iC == 60) or ($iC == 84) or ($iC == 88) or ($iC == 112) or ($iC == 116) or ($iC == 140) or ($iC == 144))? 1 : 0;
        }
        return 0;
    }
    elsif($iV == 34) {
        if($iR==4){
            return ((($iC >= 32) and ($iC <= 36)) or (($iC >= 60) and ($iC <= 64)) or (($iC >= 88) and ($iC <= 92)) or (($iC >= 116) and ($iC <= 120)) or ($iC == 143))? 1 : 0;
        }
        elsif($iR==142){
            return (($iC == 1))? 1 : 0;
        }
        elsif($iR==5){
            return (($iC == 32) or ($iC == 36) or ($iC == 60) or ($iC == 64) or ($iC == 88) or ($iC == 92) or ($iC == 116) or ($iC == 120) or ($iC == 144))? 1 : 0;
        }
        elsif($iR==146){
            return (($iC == 32) or ($iC == 34) or ($iC == 36) or ($iC == 60) or ($iC == 62) or ($iC == 64) or ($iC == 88) or ($iC == 90) or ($iC == 92) or ($iC == 116) or ($iC == 118) or ($iC == 120))? 1 : 0;
        }
        elsif($iR==144){
            return (($iC == 1) or ($iC == 3) or ($iC == 5) or (($iC >= 32) and ($iC <= 36)) or (($iC >= 60) and ($iC <= 64)) or (($iC >= 88) and ($iC <= 92)) or (($iC >= 116) and ($iC <= 120)))? 1 : 0;
        }
        elsif($iR==143){
            return ((($iC >= 0) and ($iC <= 2)) or ($iC == 4))? 1 : 0;
        }
        elsif($iR==3){
            return (($iC == 144))? 1 : 0;
        }
        elsif($iR==1){
            return ((($iC >= 142) and ($iC <= 144)))? 1 : 0;
        }
        elsif(($iR==8) or ($iR==148)){
            return ((($iC >= 32) and ($iC <= 36)) or (($iC >= 60) and ($iC <= 64)) or (($iC >= 88) and ($iC <= 92)) or (($iC >= 116) and ($iC <= 120)))? 1 : 0;
        }
        elsif(($iR==0) or ($iR==2)){
            return (($iC == 143))? 1 : 0;
        }
        elsif(($iR==7) or ($iR==145) or ($iR==147)){
            return (($iC == 32) or ($iC == 36) or ($iC == 60) or ($iC == 64) or ($iC == 88) or ($iC == 92) or ($iC == 116) or ($iC == 120))? 1 : 0;
        }
        elsif(($iR==34) or ($iR==62) or ($iR==90) or ($iR==118)){
            return (($iC == 4) or ($iC == 8) or ($iC == 32) or ($iC == 34) or ($iC == 36) or ($iC == 60) or ($iC == 62) or ($iC == 64) or ($iC == 88) or ($iC == 90) or ($iC == 92) or ($iC == 116) or ($iC == 118) or ($iC == 120) or ($iC == 144) or ($iC == 146) or ($iC == 148))? 1 : 0;
        }
        elsif(($iR==32) or ($iR==36) or ($iR==60) or ($iR==64) or ($iR==88) or ($iR==92) or ($iR==116) or ($iR==120)){
            return ((($iC >= 4) and ($iC <= 5)) or (($iC >= 7) and ($iC <= 8)) or (($iC >= 32) and ($iC <= 36)) or (($iC >= 60) and ($iC <= 64)) or (($iC >= 88) and ($iC <= 92)) or (($iC >= 116) and ($iC <= 120)) or (($iC >= 144) and ($iC <= 148)))? 1 : 0;
        }
        elsif(($iR==33) or ($iR==35) or ($iR==61) or ($iR==63) or ($iR==89) or ($iR==91) or ($iR==117) or ($iR==119)){
            return (($iC == 4) or ($iC == 8) or ($iC == 32) or ($iC == 36) or ($iC == 60) or ($iC == 64) or ($iC == 88) or ($iC == 92) or ($iC == 116) or ($iC == 120) or ($iC == 144) or ($iC == 148))? 1 : 0;
        }
        return 0;
    }
    elsif($iV == 35) {
        if($iR==146){
            return ((($iC >= 0) and ($iC <= 1)) or (($iC >= 3) and ($iC <= 4)))? 1 : 0;
        }
        elsif($iR==5){
            return (($iC == 28) or ($iC == 32) or ($iC == 52) or ($iC == 56) or ($iC == 76) or ($iC == 80) or ($iC == 100) or ($iC == 104) or ($iC == 124) or ($iC == 128) or ($iC == 148))? 1 : 0;
        }
        elsif($iR==4){
            return ((($iC >= 28) and ($iC <= 32)) or (($iC >= 52) and ($iC <= 56)) or (($iC >= 76) and ($iC <= 80)) or (($iC >= 100) and ($iC <= 104)) or (($iC >= 124) and ($iC <= 128)) or (($iC >= 146) and ($iC <= 147)))? 1 : 0;
        }
        elsif($iR==148){
            return (($iC == 0) or ($iC == 2) or ($iC == 5) or (($iC >= 28) and ($iC <= 32)) or (($iC >= 52) and ($iC <= 56)) or (($iC >= 76) and ($iC <= 80)) or (($iC >= 100) and ($iC <= 104)) or (($iC >= 124) and ($iC <= 128)))? 1 : 0;
        }
        elsif($iR==2){
            return ((($iC >= 147) and ($iC <= 148)))? 1 : 0;
        }
        elsif($iR==0){
            return ((($iC >= 146) and ($iC <= 148)))? 1 : 0;
        }
        elsif($iR==147){
            return ((($iC >= 0) and ($iC <= 4)))? 1 : 0;
        }
        elsif($iR==150){
            return (($iC == 28) or ($iC == 30) or ($iC == 32) or ($iC == 52) or ($iC == 54) or ($iC == 56) or ($iC == 76) or ($iC == 78) or ($iC == 80) or ($iC == 100) or ($iC == 102) or ($iC == 104) or ($iC == 124) or ($iC == 126) or ($iC == 128))? 1 : 0;
        }
        elsif(($iR==1) or ($iR==3)){
            return ((($iC >= 146) and ($iC <= 147)))? 1 : 0;
        }
        elsif(($iR==8) or ($iR==152)){
            return ((($iC >= 28) and ($iC <= 32)) or (($iC >= 52) and ($iC <= 56)) or (($iC >= 76) and ($iC <= 80)) or (($iC >= 100) and ($iC <= 104)) or (($iC >= 124) and ($iC <= 128)))? 1 : 0;
        }
        elsif(($iR==7) or ($iR==149) or ($iR==151)){
            return (($iC == 28) or ($iC == 32) or ($iC == 52) or ($iC == 56) or ($iC == 76) or ($iC == 80) or ($iC == 100) or ($iC == 104) or ($iC == 124) or ($iC == 128))? 1 : 0;
        }
        elsif(($iR==30) or ($iR==54) or ($iR==78) or ($iR==102) or ($iR==126)){
            return (($iC == 4) or ($iC == 8) or ($iC == 28) or ($iC == 30) or ($iC == 32) or ($iC == 52) or ($iC == 54) or ($iC == 56) or ($iC == 76) or ($iC == 78) or ($iC == 80) or ($iC == 100) or ($iC == 102) or ($iC == 104) or ($iC == 124) or ($iC == 126) or ($iC == 128) or ($iC == 148) or ($iC == 150) or ($iC == 152))? 1 : 0;
        }
        elsif(($iR==29) or ($iR==31) or ($iR==53) or ($iR==55) or ($iR==77) or ($iR==79) or ($iR==101) or ($iR==103) or ($iR==125) or ($iR==127)){
            return (($iC == 4) or ($iC == 8) or ($iC == 28) or ($iC == 32) or ($iC == 52) or ($iC == 56) or ($iC == 76) or ($iC == 80) or ($iC == 100) or ($iC == 104) or ($iC == 124) or ($iC == 128) or ($iC == 148) or ($iC == 152))? 1 : 0;
        }
        elsif(($iR==28) or ($iR==32) or ($iR==52) or ($iR==56) or ($iR==76) or ($iR==80) or ($iR==100) or ($iR==104) or ($iR==124) or ($iR==128)){
            return ((($iC >= 4) and ($iC <= 5)) or (($iC >= 7) and ($iC <= 8)) or (($iC >= 28) and ($iC <= 32)) or (($iC >= 52) and ($iC <= 56)) or (($iC >= 76) and ($iC <= 80)) or (($iC >= 100) and ($iC <= 104)) or (($iC >= 124) and ($iC <= 128)) or (($iC >= 148) and ($iC <= 152)))? 1 : 0;
        }
        return 0;
    }
    elsif($iV == 36) {
        if($iR==5){
            return (($iC == 22) or ($iC == 26) or ($iC == 48) or ($iC == 52) or ($iC == 74) or ($iC == 78) or ($iC == 100) or ($iC == 104) or ($iC == 126) or ($iC == 130) or ($iC == 152))? 1 : 0;
        }
        elsif($iR==4){
            return ((($iC >= 22) and ($iC <= 26)) or (($iC >= 48) and ($iC <= 52)) or (($iC >= 74) and ($iC <= 78)) or (($iC >= 100) and ($iC <= 104)) or (($iC >= 126) and ($iC <= 130)) or ($iC == 152))? 1 : 0;
        }
        elsif($iR==154){
            return (($iC == 22) or ($iC == 24) or ($iC == 26) or ($iC == 48) or ($iC == 50) or ($iC == 52) or ($iC == 74) or ($iC == 76) or ($iC == 78) or ($iC == 100) or ($iC == 102) or ($iC == 104) or ($iC == 126) or ($iC == 128) or ($iC == 130))? 1 : 0;
        }
        elsif($iR==150){
            return ((($iC >= 0) and ($iC <= 1)) or ($iC == 3))? 1 : 0;
        }
        elsif($iR==0){
            return ((($iC >= 150) and ($iC <= 151)))? 1 : 0;
        }
        elsif($iR==151){
            return (($iC == 0))? 1 : 0;
        }
        elsif($iR==1){
            return (($iC == 150))? 1 : 0;
        }
        elsif($iR==152){
            return ((($iC >= 2) and ($iC <= 5)) or (($iC >= 22) and ($iC <= 26)) or (($iC >= 48) and ($iC <= 52)) or (($iC >= 74) and ($iC <= 78)) or (($iC >= 100) and ($iC <= 104)) or (($iC >= 126) and ($iC <= 130)))? 1 : 0;
        }
        elsif($iR==3){
            return (($iC == 150) or ($iC == 152))? 1 : 0;
        }
        elsif($iR==2){
            return (($iC == 152))? 1 : 0;
        }
        elsif(($iR==8) or ($iR==156)){
            return ((($iC >= 22) and ($iC <= 26)) or (($iC >= 48) and ($iC <= 52)) or (($iC >= 74) and ($iC <= 78)) or (($iC >= 100) and ($iC <= 104)) or (($iC >= 126) and ($iC <= 130)))? 1 : 0;
        }
        elsif(($iR==7) or ($iR==153) or ($iR==155)){
            return (($iC == 22) or ($iC == 26) or ($iC == 48) or ($iC == 52) or ($iC == 74) or ($iC == 78) or ($iC == 100) or ($iC == 104) or ($iC == 126) or ($iC == 130))? 1 : 0;
        }
        elsif(($iR==24) or ($iR==50) or ($iR==76) or ($iR==102) or ($iR==128)){
            return (($iC == 4) or ($iC == 8) or ($iC == 22) or ($iC == 24) or ($iC == 26) or ($iC == 48) or ($iC == 50) or ($iC == 52) or ($iC == 74) or ($iC == 76) or ($iC == 78) or ($iC == 100) or ($iC == 102) or ($iC == 104) or ($iC == 126) or ($iC == 128) or ($iC == 130) or ($iC == 152) or ($iC == 154) or ($iC == 156))? 1 : 0;
        }
        elsif(($iR==22) or ($iR==26) or ($iR==48) or ($iR==52) or ($iR==74) or ($iR==78) or ($iR==100) or ($iR==104) or ($iR==126) or ($iR==130)){
            return ((($iC >= 4) and ($iC <= 5)) or (($iC >= 7) and ($iC <= 8)) or (($iC >= 22) and ($iC <= 26)) or (($iC >= 48) and ($iC <= 52)) or (($iC >= 74) and ($iC <= 78)) or (($iC >= 100) and ($iC <= 104)) or (($iC >= 126) and ($iC <= 130)) or (($iC >= 152) and ($iC <= 156)))? 1 : 0;
        }
        elsif(($iR==23) or ($iR==25) or ($iR==49) or ($iR==51) or ($iR==75) or ($iR==77) or ($iR==101) or ($iR==103) or ($iR==127) or ($iR==129)){
            return (($iC == 4) or ($iC == 8) or ($iC == 22) or ($iC == 26) or ($iC == 48) or ($iC == 52) or ($iC == 74) or ($iC == 78) or ($iC == 100) or ($iC == 104) or ($iC == 126) or ($iC == 130) or ($iC == 152) or ($iC == 156))? 1 : 0;
        }
        return 0;
    }
    elsif($iV == 37) {
        if($iR==0){
            return ((($iC >= 155) and ($iC <= 156)))? 1 : 0;
        }
        elsif($iR==1){
            return (($iC == 154) or ($iC == 156))? 1 : 0;
        }
        elsif($iR==155){
            return (($iC == 0) or ($iC == 3))? 1 : 0;
        }
        elsif($iR==158){
            return (($iC == 26) or ($iC == 28) or ($iC == 30) or ($iC == 52) or ($iC == 54) or ($iC == 56) or ($iC == 78) or ($iC == 80) or ($iC == 82) or ($iC == 104) or ($iC == 106) or ($iC == 108) or ($iC == 130) or ($iC == 132) or ($iC == 134))? 1 : 0;
        }
        elsif($iR==3){
            return (($iC == 155))? 1 : 0;
        }
        elsif($iR==154){
            return (($iC == 1) or ($iC == 4))? 1 : 0;
        }
        elsif($iR==4){
            return ((($iC >= 26) and ($iC <= 30)) or (($iC >= 52) and ($iC <= 56)) or (($iC >= 78) and ($iC <= 82)) or (($iC >= 104) and ($iC <= 108)) or (($iC >= 130) and ($iC <= 134)) or ($iC == 154) or ($iC == 156))? 1 : 0;
        }
        elsif($iR==5){
            return (($iC == 26) or ($iC == 30) or ($iC == 52) or ($iC == 56) or ($iC == 78) or ($iC == 82) or ($iC == 104) or ($iC == 108) or ($iC == 130) or ($iC == 134) or ($iC == 156))? 1 : 0;
        }
        elsif($iR==156){
            return ((($iC >= 0) and ($iC <= 1)) or (($iC >= 4) and ($iC <= 5)) or (($iC >= 26) and ($iC <= 30)) or (($iC >= 52) and ($iC <= 56)) or (($iC >= 78) and ($iC <= 82)) or (($iC >= 104) and ($iC <= 108)) or (($iC >= 130) and ($iC <= 134)))? 1 : 0;
        }
        elsif(($iR==8) or ($iR==160)){
            return ((($iC >= 26) and ($iC <= 30)) or (($iC >= 52) and ($iC <= 56)) or (($iC >= 78) and ($iC <= 82)) or (($iC >= 104) and ($iC <= 108)) or (($iC >= 130) and ($iC <= 134)))? 1 : 0;
        }
        elsif(($iR==7) or ($iR==157) or ($iR==159)){
            return (($iC == 26) or ($iC == 30) or ($iC == 52) or ($iC == 56) or ($iC == 78) or ($iC == 82) or ($iC == 104) or ($iC == 108) or ($iC == 130) or ($iC == 134))? 1 : 0;
        }
        elsif(($iR==28) or ($iR==54) or ($iR==80) or ($iR==106) or ($iR==132)){
            return (($iC == 4) or ($iC == 8) or ($iC == 26) or ($iC == 28) or ($iC == 30) or ($iC == 52) or ($iC == 54) or ($iC == 56) or ($iC == 78) or ($iC == 80) or ($iC == 82) or ($iC == 104) or ($iC == 106) or ($iC == 108) or ($iC == 130) or ($iC == 132) or ($iC == 134) or ($iC == 156) or ($iC == 158) or ($iC == 160))? 1 : 0;
        }
        elsif(($iR==27) or ($iR==29) or ($iR==53) or ($iR==55) or ($iR==79) or ($iR==81) or ($iR==105) or ($iR==107) or ($iR==131) or ($iR==133)){
            return (($iC == 4) or ($iC == 8) or ($iC == 26) or ($iC == 30) or ($iC == 52) or ($iC == 56) or ($iC == 78) or ($iC == 82) or ($iC == 104) or ($iC == 108) or ($iC == 130) or ($iC == 134) or ($iC == 156) or ($iC == 160))? 1 : 0;
        }
        elsif(($iR==26) or ($iR==30) or ($iR==52) or ($iR==56) or ($iR==78) or ($iR==82) or ($iR==104) or ($iR==108) or ($iR==130) or ($iR==134)){
            return ((($iC >= 4) and ($iC <= 5)) or (($iC >= 7) and ($iC <= 8)) or (($iC >= 26) and ($iC <= 30)) or (($iC >= 52) and ($iC <= 56)) or (($iC >= 78) and ($iC <= 82)) or (($iC >= 104) and ($iC <= 108)) or (($iC >= 130) and ($iC <= 134)) or (($iC >= 156) and ($iC <= 160)))? 1 : 0;
        }
        return 0;
    }
    elsif($iV == 38) {
        if($iR==3){
            return (($iC == 158) or ($iC == 160))? 1 : 0;
        }
        elsif($iR==4){
            return ((($iC >= 30) and ($iC <= 34)) or (($iC >= 56) and ($iC <= 60)) or (($iC >= 82) and ($iC <= 86)) or (($iC >= 108) and ($iC <= 112)) or (($iC >= 134) and ($iC <= 138)) or (($iC >= 159) and ($iC <= 160)))? 1 : 0;
        }
        elsif($iR==160){
            return ((($iC >= 0) and ($iC <= 1)) or (($iC >= 3) and ($iC <= 5)) or (($iC >= 30) and ($iC <= 34)) or (($iC >= 56) and ($iC <= 60)) or (($iC >= 82) and ($iC <= 86)) or (($iC >= 108) and ($iC <= 112)) or (($iC >= 134) and ($iC <= 138)))? 1 : 0;
        }
        elsif($iR==159){
            return (($iC == 4))? 1 : 0;
        }
        elsif($iR==5){
            return (($iC == 30) or ($iC == 34) or ($iC == 56) or ($iC == 60) or ($iC == 82) or ($iC == 86) or ($iC == 108) or ($iC == 112) or ($iC == 134) or ($iC == 138) or ($iC == 160))? 1 : 0;
        }
        elsif($iR==2){
            return (($iC == 158))? 1 : 0;
        }
        elsif($iR==162){
            return (($iC == 30) or ($iC == 32) or ($iC == 34) or ($iC == 56) or ($iC == 58) or ($iC == 60) or ($iC == 82) or ($iC == 84) or ($iC == 86) or ($iC == 108) or ($iC == 110) or ($iC == 112) or ($iC == 134) or ($iC == 136) or ($iC == 138))? 1 : 0;
        }
        elsif($iR==158){
            return ((($iC >= 2) and ($iC <= 3)))? 1 : 0;
        }
        elsif(($iR==8) or ($iR==164)){
            return ((($iC >= 30) and ($iC <= 34)) or (($iC >= 56) and ($iC <= 60)) or (($iC >= 82) and ($iC <= 86)) or (($iC >= 108) and ($iC <= 112)) or (($iC >= 134) and ($iC <= 138)))? 1 : 0;
        }
        elsif(($iR==0) or ($iR==1)){
            return (($iC == 160))? 1 : 0;
        }
        elsif(($iR==7) or ($iR==161) or ($iR==163)){
            return (($iC == 30) or ($iC == 34) or ($iC == 56) or ($iC == 60) or ($iC == 82) or ($iC == 86) or ($iC == 108) or ($iC == 112) or ($iC == 134) or ($iC == 138))? 1 : 0;
        }
        elsif(($iR==32) or ($iR==58) or ($iR==84) or ($iR==110) or ($iR==136)){
            return (($iC == 4) or ($iC == 8) or ($iC == 30) or ($iC == 32) or ($iC == 34) or ($iC == 56) or ($iC == 58) or ($iC == 60) or ($iC == 82) or ($iC == 84) or ($iC == 86) or ($iC == 108) or ($iC == 110) or ($iC == 112) or ($iC == 134) or ($iC == 136) or ($iC == 138) or ($iC == 160) or ($iC == 162) or ($iC == 164))? 1 : 0;
        }
        elsif(($iR==31) or ($iR==33) or ($iR==57) or ($iR==59) or ($iR==83) or ($iR==85) or ($iR==109) or ($iR==111) or ($iR==135) or ($iR==137)){
            return (($iC == 4) or ($iC == 8) or ($iC == 30) or ($iC == 34) or ($iC == 56) or ($iC == 60) or ($iC == 82) or ($iC == 86) or ($iC == 108) or ($iC == 112) or ($iC == 134) or ($iC == 138) or ($iC == 160) or ($iC == 164))? 1 : 0;
        }
        elsif(($iR==30) or ($iR==34) or ($iR==56) or ($iR==60) or ($iR==82) or ($iR==86) or ($iR==108) or ($iR==112) or ($iR==134) or ($iR==138)){
            return ((($iC >= 4) and ($iC <= 5)) or (($iC >= 7) and ($iC <= 8)) or (($iC >= 30) and ($iC <= 34)) or (($iC >= 56) and ($iC <= 60)) or (($iC >= 82) and ($iC <= 86)) or (($iC >= 108) and ($iC <= 112)) or (($iC >= 134) and ($iC <= 138)) or (($iC >= 160) and ($iC <= 164)))? 1 : 0;
        }
        return 0;
    }
    elsif($iV == 39) {
        if($iR==162){
            return (($iC == 0) or ($iC == 2) or ($iC == 4))? 1 : 0;
        }
        elsif($iR==0){
            return (($iC == 162))? 1 : 0;
        }
        elsif($iR==163){
            return ((($iC >= 3) and ($iC <= 4)))? 1 : 0;
        }
        elsif($iR==3){
            return (($iC == 163))? 1 : 0;
        }
        elsif($iR==5){
            return (($iC == 24) or ($iC == 28) or ($iC == 52) or ($iC == 56) or ($iC == 80) or ($iC == 84) or ($iC == 108) or ($iC == 112) or ($iC == 136) or ($iC == 140) or ($iC == 164))? 1 : 0;
        }
        elsif($iR==164){
            return (($iC == 2) or (($iC >= 4) and ($iC <= 5)) or (($iC >= 24) and ($iC <= 28)) or (($iC >= 52) and ($iC <= 56)) or (($iC >= 80) and ($iC <= 84)) or (($iC >= 108) and ($iC <= 112)) or (($iC >= 136) and ($iC <= 140)))? 1 : 0;
        }
        elsif($iR==2){
            return (($iC == 162) or ($iC == 164))? 1 : 0;
        }
        elsif($iR==166){
            return (($iC == 24) or ($iC == 26) or ($iC == 28) or ($iC == 52) or ($iC == 54) or ($iC == 56) or ($iC == 80) or ($iC == 82) or ($iC == 84) or ($iC == 108) or ($iC == 110) or ($iC == 112) or ($iC == 136) or ($iC == 138) or ($iC == 140))? 1 : 0;
        }
        elsif($iR==4){
            return ((($iC >= 24) and ($iC <= 28)) or (($iC >= 52) and ($iC <= 56)) or (($iC >= 80) and ($iC <= 84)) or (($iC >= 108) and ($iC <= 112)) or (($iC >= 136) and ($iC <= 140)) or (($iC >= 162) and ($iC <= 164)))? 1 : 0;
        }
        elsif(($iR==8) or ($iR==168)){
            return ((($iC >= 24) and ($iC <= 28)) or (($iC >= 52) and ($iC <= 56)) or (($iC >= 80) and ($iC <= 84)) or (($iC >= 108) and ($iC <= 112)) or (($iC >= 136) and ($iC <= 140)))? 1 : 0;
        }
        elsif(($iR==7) or ($iR==165) or ($iR==167)){
            return (($iC == 24) or ($iC == 28) or ($iC == 52) or ($iC == 56) or ($iC == 80) or ($iC == 84) or ($iC == 108) or ($iC == 112) or ($iC == 136) or ($iC == 140))? 1 : 0;
        }
        elsif(($iR==26) or ($iR==54) or ($iR==82) or ($iR==110) or ($iR==138)){
            return (($iC == 4) or ($iC == 8) or ($iC == 24) or ($iC == 26) or ($iC == 28) or ($iC == 52) or ($iC == 54) or ($iC == 56) or ($iC == 80) or ($iC == 82) or ($iC == 84) or ($iC == 108) or ($iC == 110) or ($iC == 112) or ($iC == 136) or ($iC == 138) or ($iC == 140) or ($iC == 164) or ($iC == 166) or ($iC == 168))? 1 : 0;
        }
        elsif(($iR==25) or ($iR==27) or ($iR==53) or ($iR==55) or ($iR==81) or ($iR==83) or ($iR==109) or ($iR==111) or ($iR==137) or ($iR==139)){
            return (($iC == 4) or ($iC == 8) or ($iC == 24) or ($iC == 28) or ($iC == 52) or ($iC == 56) or ($iC == 80) or ($iC == 84) or ($iC == 108) or ($iC == 112) or ($iC == 136) or ($iC == 140) or ($iC == 164) or ($iC == 168))? 1 : 0;
        }
        elsif(($iR==24) or ($iR==28) or ($iR==52) or ($iR==56) or ($iR==80) or ($iR==84) or ($iR==108) or ($iR==112) or ($iR==136) or ($iR==140)){
            return ((($iC >= 4) and ($iC <= 5)) or (($iC >= 7) and ($iC <= 8)) or (($iC >= 24) and ($iC <= 28)) or (($iC >= 52) and ($iC <= 56)) or (($iC >= 80) and ($iC <= 84)) or (($iC >= 108) and ($iC <= 112)) or (($iC >= 136) and ($iC <= 140)) or (($iC >= 164) and ($iC <= 168)))? 1 : 0;
        }
        return 0;
    }
    elsif($iV == 40) {
        if($iR==1){
            return (($iC == 166) or ($iC == 168))? 1 : 0;
        }
        elsif($iR==5){
            return (($iC == 28) or ($iC == 32) or ($iC == 56) or ($iC == 60) or ($iC == 84) or ($iC == 88) or ($iC == 112) or ($iC == 116) or ($iC == 140) or ($iC == 144) or ($iC == 166) or ($iC == 168))? 1 : 0;
        }
        elsif($iR==3){
            return ((($iC >= 167) and ($iC <= 168)))? 1 : 0;
        }
        elsif($iR==168){
            return (($iC == 1) or ($iC == 3) or ($iC == 5) or (($iC >= 28) and ($iC <= 32)) or (($iC >= 56) and ($iC <= 60)) or (($iC >= 84) and ($iC <= 88)) or (($iC >= 112) and ($iC <= 116)) or (($iC >= 140) and ($iC <= 144)))? 1 : 0;
        }
        elsif($iR==167){
            return (($iC == 3))? 1 : 0;
        }
        elsif($iR==166){
            return ((($iC >= 0) and ($iC <= 2)) or ($iC == 5))? 1 : 0;
        }
        elsif($iR==170){
            return (($iC == 28) or ($iC == 30) or ($iC == 32) or ($iC == 56) or ($iC == 58) or ($iC == 60) or ($iC == 84) or ($iC == 86) or ($iC == 88) or ($iC == 112) or ($iC == 114) or ($iC == 116) or ($iC == 140) or ($iC == 142) or ($iC == 144))? 1 : 0;
        }
        elsif(($iR==0) or ($iR==2)){
            return (($iC == 166))? 1 : 0;
        }
        elsif(($iR==7) or ($iR==169) or ($iR==171)){
            return (($iC == 28) or ($iC == 32) or ($iC == 56) or ($iC == 60) or ($iC == 84) or ($iC == 88) or ($iC == 112) or ($iC == 116) or ($iC == 140) or ($iC == 144))? 1 : 0;
        }
        elsif(($iR==4) or ($iR==8) or ($iR==172)){
            return ((($iC >= 28) and ($iC <= 32)) or (($iC >= 56) and ($iC <= 60)) or (($iC >= 84) and ($iC <= 88)) or (($iC >= 112) and ($iC <= 116)) or (($iC >= 140) and ($iC <= 144)))? 1 : 0;
        }
        elsif(($iR==30) or ($iR==58) or ($iR==86) or ($iR==114) or ($iR==142)){
            return (($iC == 4) or ($iC == 8) or ($iC == 28) or ($iC == 30) or ($iC == 32) or ($iC == 56) or ($iC == 58) or ($iC == 60) or ($iC == 84) or ($iC == 86) or ($iC == 88) or ($iC == 112) or ($iC == 114) or ($iC == 116) or ($iC == 140) or ($iC == 142) or ($iC == 144) or ($iC == 168) or ($iC == 170) or ($iC == 172))? 1 : 0;
        }
        elsif(($iR==28) or ($iR==32) or ($iR==56) or ($iR==60) or ($iR==84) or ($iR==88) or ($iR==112) or ($iR==116) or ($iR==140) or ($iR==144)){
            return ((($iC >= 4) and ($iC <= 5)) or (($iC >= 7) and ($iC <= 8)) or (($iC >= 28) and ($iC <= 32)) or (($iC >= 56) and ($iC <= 60)) or (($iC >= 84) and ($iC <= 88)) or (($iC >= 112) and ($iC <= 116)) or (($iC >= 140) and ($iC <= 144)) or (($iC >= 168) and ($iC <= 172)))? 1 : 0;
        }
        elsif(($iR==29) or ($iR==31) or ($iR==57) or ($iR==59) or ($iR==85) or ($iR==87) or ($iR==113) or ($iR==115) or ($iR==141) or ($iR==143)){
            return (($iC == 4) or ($iC == 8) or ($iC == 28) or ($iC == 32) or ($iC == 56) or ($iC == 60) or ($iC == 84) or ($iC == 88) or ($iC == 112) or ($iC == 116) or ($iC == 140) or ($iC == 144) or ($iC == 168) or ($iC == 172))? 1 : 0;
        }
        return 0;
    }
}
1;
__END__

=head1 NAME

GD::Barcode::QRcode - Create QRcode barcode image with GD

=head1 SYNOPSIS

I<ex. CGI>

  use GD::Barcode::QRcode;
  binmode(STDOUT);
  print "Content-Type: image/png\n\n";
  print GD::Barcode::QRcode->new('1234567')->plot->png;

I<with UnitSize, ECC settings>

  my $oGdBar = GD::Barcode::QRcode->new('123456789', 
                            { Ecc => 'L', Version=>2, ModuleSize => 2}
                        );


=head1 DESCRIPTION

GD::Barcode::QRcode is a subclass of GD::Barcode and allows you to
create QRcode barcode image with GD.
This module based on "QRcode image CGI version 0.50 (C)2000-2002,Y.Swetake".

=head2 new

I<$oGdBar> = GD::Barcode::QRcode->new(I<$sTxt>, 
                    { Ecc => I<Ecc Mode>,
                      Version => I<Version>,
                      ModuleSize => I<Size of 1 modlue>,
                    });

Constructor. Creates a GD::Barcode::QRcode object for I<$sTxt>.

Parameters:

=over 4

=item Ecc

Ecc mode. Select 'M', 'L', 'H' or 'Q' (Default = 'M').

=item Version

Version ie. size of barcode image (Default = auto select).

=item ModuleSize

Size of modules(barcode unit)  (Default = 1).

=back

=head2 plot()

I<$oGd> = $oGdBar->plot([Height => I<$iHeight>, NoText => I<0 | 1>]);

creates GD object with barcode image for the I<$sTxt> specified at L<new> method.
I<$iHeight> is height of the image. If I<NoText> is 1, the image has no text image of I<$sTxt>.

 ex.
  my $oGdB = GD::Barcode::QRcode->new('1234567');
  my $oGD = $oGdB->plot();
  # $sGD is a GD image with Height=>20 pixels, with no text.

=head2 barcode()

I<$sPtn> = $oGdBar->barcode();

returns a barcode pattern in string with '1' and '0'. 
'1' means black, '0' means white.

 ex.
  my $oGdB = GD::Barcode::QRcode->new('1234567');
  my $sPtn = $oGdB->barcode();

=head2 $errStr

$GD::Barcode::QRcode::errStr

has error message.

=head2 $text

$oGdBar->{$text}

has barcode text based on I<$sTxt> specified in L<new> method.

=head1 AUTHOR

Kawai Takanori GCD00051@nifty.ne.jp

=head1 COPYRIGHT

The GD::Barocde::QRcode module is Copyright (c) 2003 Kawai Takanori. Japan.
All rights reserved.

You may distribute under the terms of either the GNU General Public
License or the Artistic License, as specified in the Perl README file.

=head1 SEE ALSO

GD::Barcode

=cut