qr_code.htm

戻る

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML LANG="ja">

<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html;charset=Shift_JIS">
<TITLE>QR コード作成</TITLE>
</HEAD>

<BODY BGCOLOR="#CCFFFF">
<CENTER>
<BR>
<B>QR コード作成</B>
<BR><BR>

<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=20 BGCOLOR="#FFFFFF"><TR><TD>
<DIV ID="vis" STYLE="position:relative">
<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0>

<SCRIPT LANGUAGE="JavaScript1.2" TYPE="text/javascript">
<!--
  MAX_VER = 10;
  MAX_MOD = 17 + MAX_VER * 4;

  for(i = 0; i < MAX_MOD; i++) {
    document.write("<TR>");
    for(j = 0; j < MAX_MOD; j += 4)
      document.write("<TD><IMG NAME='M", i.toString(16), "_", j.toString(16), "' SRC='images/qr_m0.gif' WIDTH=12 HEIGHT=3></TD>");
    document.writeln("</TR>");
  }
//-->
</SCRIPT>

</TABLE>
</DIV>
</TD></TR></TABLE>

<BR>

<FORM>
誤り訂正レベル
<SELECT NAME="level">
<OPTION SELECTED>L
<OPTION>M
<OPTION>Q
<OPTION>H
</SELECT>
<BR><BR>
データ<BR>
<TEXTAREA NAME="data" ROWS=6 COLS=40></TEXTAREA>
<BR><BR>
<INPUT TYPE=BUTTON VALUE="作成" onClick="QR_encoding()">
</FORM>

<DIV ID="msg" STYLE="visibility:hidden">処理中...</DIV>

</CENTER>

<SCRIPT LANGUAGE="JavaScript1.2" TYPE="text/javascript">
<!--
//dummy  ******** この行がないと Opera 6 でエラーが出る.何で???

// エンコード
function QR_encoding() {
  data = document.forms[0].data.value;  // データ
  if(!data.length)
    return;
  level = document.forms[0].level.selectedIndex;  // 誤り訂正レベル

  document.getElementById("vis").style.visibility = "hidden";
  document.getElementById("msg").style.visibility = "visible";

  setTimeout("QR_encoding_body(); QR_encoding_end()", 0);
}

function QR_encoding_end() {
  if(data)  // エラー以外
    document.getElementById("vis").style.visibility = "visible";
  document.getElementById("msg").style.visibility = "hidden";
}

function QR_encoding_body() {
  var code1;
  var n1, n2;
  var b1, b2;
  var x, y;
  var i, j, k;

  // モード判定
  var mode;  // モード
  var data_len = 0;  // 入力データ長
  var f_num, f_alpha, f_kanji;
  f_num = f_alpha = f_kanji = 1;
  for(i = 0; i < data.length; i++) {
    var c = data.charAt(i);
    code1 = c.charCodeAt(0);
    if(code1 < 0x80 || code1 == 0xa5 || code1 == 0x203e) {  // ASCII
      data_len++;
      f_kanji = 0;
      if(c < "0" || c > "9") {
        f_num = 0;
        if(c < "A" || c > "Z") {
          switch(c) {
          case " ":
          case "$":
          case "%":
          case "*":
          case "+":
          case "-":
          case ".":
          case "/":
          case ":":
            break;
          default:
            f_alpha = 0;
          }
        }
      }
    }
    else {
      if(code1 >= 0xff61 && code1 <= 0xff9f) {  // 半角カナ
        data_len++;
        f_num = f_alpha = f_kanji = 0;
      }
      else {
        if(shift_jis(c)) {  // 漢字
          data_len += 2;
          f_num = f_alpha = 0;
        }
        else {
          alert("エンコードできない文字があります!");
          data = null;
          return;
        }
      }
    }
  }
  if     (f_num)
    mode = 0;  // 数字モード
  else if(f_alpha)
    mode = 1;  // 英数字モード
  else if(f_kanji)
    mode = 3;  // 漢字モード
  else
    mode = 2;  // 8 ビット バイト モード

  var version;  // 型番
  var len_bits;  // 文字数指示子ビット数
  var data_cws;  // データ コード語数
  var max_chars;  // 最大格納文字数

  i_code = 0;
  reg = 0;
  reg_bits = 0;
  switch(mode) {
  case 0:  // 数字モード
    // 型番決定
    for(version = 1; version <= MAX_VER; version++) {
      if     (version <= 9)
        len_bits = 10;
      else if(version <= 26)
        len_bits = 12;
      else
        len_bits = 14;
      n1 = (data_cws = get_data_cws(version, level)) * 8 - 4 - len_bits;
      max_chars = Math.floor(n1 / 10) * 3;
      n1 %= 10;
      if(n1 >= 4) {
        if(n1 >= 7)
          max_chars += 2;
        else
          max_chars++;
      }
      if(data_len <= max_chars)
        break;
    }
    if(version > MAX_VER) {
      alert("データが長すぎます!");
      data = null;
      return;
    }
    // データ コード語作成
    // モード指示子,文字数指示子
    put_code(0x1, 4);
    put_code(data_len, len_bits);
    // データ
    for(i = 0; ; ) {
      if(i + 2 < data_len) {
        put_code(Number(data.substr(i, 3)), 10);
        if((i += 3) == data_len)
          break;
      }
      else {
        if     (i + 1 < data_len)
          put_code(Number(data.substr(i, 2)), 7);
        else if(i < data_len)
          put_code(Number(data.charAt(i)), 4);
        break;
      }
    }
    break;

  case 1:  // 英数字モード
    // 型番決定
    for(version = 1; version <= MAX_VER; version++) {
      if     (version <= 9)
        len_bits = 9;
      else if(version <= 26)
        len_bits = 11;
      else
        len_bits = 13;
      n1 = (data_cws = get_data_cws(version, level)) * 8 - 4 - len_bits;
      max_chars = Math.floor(n1 / 11) * 2;
      if(n1 % 11 >= 6)
        max_chars++;
      if(data_len <= max_chars)
        break;
    }
    if(version > MAX_VER) {
      alert("データが長すぎます!");
      data = null;
      return;
    }
    // データ コード語作成
    // モード指示子,文字数指示子
    put_code(0x2, 4);
    put_code(data_len, len_bits);
    // データ
    for(i = 0; ; ) {
      if(i + 1 < data_len) {
        put_code(alpha_val(data.charAt(i)) * 45 + alpha_val(data.charAt(i + 1)), 11);
        if((i += 2) == data_len)
          break;
      }
      else {
        put_code(alpha_val(data.charAt(i)), 6);
        break;
      }
    }
    break;

  case 2:  // 8 ビット バイト モード
    // 型番決定
    for(version = 1; version <= MAX_VER; version++) {
      if     (version <= 9)
        len_bits = 8;
      else
        len_bits = 16;
      max_chars = Math.floor(((data_cws = get_data_cws(version, level)) * 8 - 4 - len_bits) / 8);
      if(data_len <= max_chars)
        break;
    }
    if(version > MAX_VER) {
      alert("データが長すぎます!");
      data = null;
      return;
    }
    // データ コード語作成
    // モード指示子,文字数指示子
    put_code(0x4, 4);
    put_code(data_len, len_bits);
    // データ
    for(i = 0; i < data.length; i++) {
      code1 = data.charCodeAt(i);
      if     (code1 < 0x80)  // ASCII
        put_code(code1, 8);
      else if(code1 == 0xa5)  // 円記号
        put_code(0x5c, 8);
      else if(code1 == 0x203e)  // オーバライン
        put_code(0x7e, 8);
      else if(code1 >= 0xff61 && code1 <= 0xff9f)  // 半角カナ
        put_code(code1 - 0xfec0, 8);
      else  // 漢字
        put_code(shift_jis(data.charAt(i)), 16);
    }
    break;

  case 3:  // 漢字モード
    data_len = data.length;
    // 型番決定
    for(version = 1; version <= MAX_VER; version++) {
      if     (version <= 9)
        len_bits = 8;
      else if(version <= 26)
        len_bits = 10;
      else
        len_bits = 12;
      max_chars = Math.floor(((data_cws = get_data_cws(version, level)) * 8 - 4 - len_bits) / 13);
      if(data_len <= max_chars)
        break;
    }
    if(version > MAX_VER) {
      alert("データが長すぎます!");
      data = null;
      return;
    }
    // データ コード語作成
    // モード指示子,文字数指示子
    put_code(0x8, 4);
    put_code(data_len, len_bits);
    // データ
    for(i = 0; i < data_len; i++) {
      code1 = shift_jis(data.charAt(i));
      if(code1 < 0xe000)
        code1 -= 0x8140;
      else
        code1 -= 0xc140;
      put_code((code1 >> 8) * 0xc0 + (code1 & 0xff), 13);
    }
    break;
  }

  // 終端パターン“0000”付加
  if(i_code < data_cws - 1 || i_code < data_cws && !reg_bits)
    put_code(0x0, 4);
  // フラッシュ
  if(reg_bits)
    code[i_code++] = (reg << (8 - reg_bits)) & 0xff;
  // パディング
  for(; ; ) {
    if(i_code == data_cws)
      break;
    code[i_code++] = 0xec;
    if(i_code == data_cws)
      break;
    code[i_code++] = 0x11;
  }

  var n_blocks = rs_blocks[version - 1][level];  // RS ブロック数
  var n_ec = ec_codewords[version - 1][level];  // 誤り訂正コード語数
  var g_exp = g_exp_t[n_ec - 1];  // 誤り訂正コード α指数

  // 誤り訂正コード作成
  var i_data = 0;
  var i_ec = data_cws;
  n1 = Math.floor(data_cws / n_blocks);
  n2 = n_blocks - data_cws % n_blocks;
  for(i_block = 0; i_block < n_blocks; i_block++) {
    if(i_block == n2)
      n1++;
    var data_ec = code.slice(i_data, i_data + n1);
    data_ec.length = n1 + n_ec;
    for(i = 0; i < n_ec; i++)
      data_ec[n1 + i] = 0;
    for(i = 0; i < n1; i++) {
      if(data_ec[i]) {
        var exp1 = n_exp[data_ec[i]];
        for(j = 0; j < n_ec; j++)
          data_ec[i + 1 + j] ^= exp_n[(g_exp[j] + exp1) % 255];
      }
    }
    for(i = 0; i < n_ec; i++)
      code[i_ec + i] = data_ec[n1 + i];
    i_data += n1;
    i_ec += n_ec;
  }

  var n_modules1 = 21 + (version - 1) * 4;  // 1 辺のモジュール数

  for(i = 0; i < n_modules1; i++) {
    for(j = 0; j < n_modules1; j++)
      module1[i][j] = 0;
  }
  // 位置検出パターン & 分離パターン & 形式情報位置予約(一部)& 固定暗モジュール
  for(i = 0; i < 8; i++) {
    for(j = 0; j < 9; j++)  // 左上
      module1[i][j] = finder_pat[i + 1][1 + j];
    for(j = 0; j < 8; j++)  // 右上
      module1[i][n_modules1 - 8 + j] = finder_pat[i + 1][j];
    for(j = 0; j < 9; j++)  // 左下
      module1[n_modules1 - 8 + i][j] = finder_pat[i][1 + j];
  }
  // 形式情報位置予約
  module1[8].splice(0,              9, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40);
  module1[8].splice(n_modules1 - 8, 8, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40);
  // 型番情報位置予約
  if(version >= 7) {
    for(i = 11; i >= 9; i--)  // 左下
      module1[n_modules1 - i].splice(0, 6, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40);
    for(i = 0; i <= 5; i++)  // 右上
      module1[i].splice(n_modules1 - 11, 3, 0x40, 0x40, 0x40);
  }
  // タイミング パターン
  for(i = 8; i < n_modules1 - 9; i += 2) {
    module1[6][i    ] = module1[i    ][6] = 0x81;
    module1[6][i + 1] = module1[i + 1][6] = 0x80;
  }
  module1[6][i] = module1[i][6] = 0x81;
  // 位置合せパターン
  n1 = align_pos[version - 1].length;
  for(i = 0; i < n1; i++) {
    y = align_pos[version - 1][i];
    for(j = 0; j < n1; j++) {
      if(i == 0 && j == 0 || i == 0 && j == n1 - 1 || i == n1 - 1 && j == 0)
        continue;
      x = align_pos[version - 1][j];
      module1[y - 2].splice(x - 2, 5, 0x81, 0x81, 0x81, 0x81, 0x81);
      module1[y - 1].splice(x - 2, 5, 0x81, 0x80, 0x80, 0x80, 0x81);
      module1[y    ].splice(x - 2, 5, 0x81, 0x80, 0x81, 0x80, 0x81);
      module1[y + 1].splice(x - 2, 5, 0x81, 0x80, 0x80, 0x80, 0x81);
      module1[y + 2].splice(x - 2, 5, 0x81, 0x81, 0x81, 0x81, 0x81);
    }
  }

  // シンボル キャラクタ配置
  n1 = Math.floor(data_cws / n_blocks);
  n2 = n_blocks - data_cws % n_blocks;
  i_block = 0;
  i_code = 0;
  code1 = code[0];
  b1 = 0x80;
  i = j = n_modules1 - 1;
  var dir = 0;  // 走査方向
  var l_r = 0;  // 右/左
  for(; ; ) {
    if(!module1[i][j]) {  // 空き
      module1[i][j] = (code1 & b1) ? 1 : 0;
      if(!(b1 >>= 1)) {
        // 次のコード語
        if(++i_block == n_blocks) {
          i_block = 0;
          i_code++;
          if(n1) {  // データ コード
            if     (i_code == n1) {  // 短い方のデータ コードの長さ分終了
              if(n2 == n_blocks) {  // データ コードの長さがすべて等しい → 誤り訂正コードへ
                n1 = 0;
                i_code = 0;
              }
              else {  // 余り分
                i_block = n2;
              }
            }
            else if(i_code > n1) {  // データ コード終了 → 誤り訂正コードへ
              n1 = 0;
              i_code = 0;
            }
          }
          else {  // 誤り訂正コード
            if(i_code == n_ec)  // 終了
              break;
          }
        }
        if(n1) {  // データ コード
          k = i_block * n1;
          if(i_block > n2)
            k += i_block - n2;
        }
        else {  // 誤り訂正コード
          k = data_cws + i_block * n_ec;
        }
        code1 = code[k + i_code];
        b1 = 0x80;
      }
    }
    if(l_r) {  // 左
      if(dir) {  // 下方向
        if(i < n_modules1 - 1) {
          i++;
          j++;
        }
        else {
          dir = 0;  // 反転
          if(--j == 6)
            j = 5;
        }
      }
      else {  // 上方向
        if(i) {
          i--;
          j++;
        }
        else {
          dir = 1;  // 反転
          if(--j == 6)
            j = 5;
        }
      }
      l_r = 0;
    }
    else {  // 右
      j--;
      l_r = 1;
    }
  }

  // マスク パターン決定
  var mask;  // マスク パターン
  var min_penalty = 0x7fffffff;  // 最小失点
  var m;
  for(m = 0x0; m <= 0x7; m++) {
    masking(n_modules1, m);  // マスク

    // 失点計算
    var penalty = 0;  // 失点

    // 同色の隣接モジュール
    for(i = 0; i < n_modules1; i++) {
      // 行
      b1 = module2[i][0];
      n1 = 1;
      // 列
      b2 = module2[0][i];
      n2 = 1;
      for(j = 1; j < n_modules1; j++) {
        // 行
        if(module2[i][j] == b1) {
          n1++;
        }
        else {
          if(n1 >= 5)
            penalty += 3 + (n1 - 5);
          b1 = module2[i][j];
          n1 = 1;
        }
        // 列
        if(module2[j][i] == b2) {
          n2++;
        }
        else {
          if(n2 >= 5)
            penalty += 3 + (n2 - 5);
          b2 = module2[j][i];
          n2 = 1;
        }
      }
      // 行
      if(n1 >= 5)
        penalty += 3 + (n1 - 5);
      // 列
      if(n2 >= 5)
        penalty += 3 + (n2 - 5);
    }

    // 2×2 のモジュール ブロック
    for(i = 0; i < n_modules1 - 1; i++) {
      for(j = 0; j < n_modules1 - 1; j++) {
        b1 = module2[i][j];
        if(module2[i][j + 1] == b1 && module2[i + 1][j] == b1 && module2[i + 1][j + 1] == b1)
          penalty += 3;
      }
    }

    // 1:1:3:1:1 比率のパターン
    var cnt = new Array();
    cnt.length = 7;
    // 行
    for(i = 0; i < n_modules1; i++) {
      k = 0;
      for(j = 0; ; ) {
        // 同色モジュール数カウント
        for(; k < 7; k++) {
          x = j;
          for(; j < n_modules1; j++) {
            if(module2[i][j] ^ (k & 0x01))  // k = 0,2,4,6 -- 暗?,k = 1,3,5 -- 明?
              break;
          }
          cnt[k] = j - x;  // モジュール数
          if(j == n_modules1)
            break;
        }
        if(k >= 5) {
          if(k == 5)
            cnt[6] = 0;
          if(cnt[2] == cnt[1] && cnt[3] == cnt[1] * 3 && cnt[4] == cnt[1] && cnt[5] == cnt[1]
               && (cnt[0] >= cnt[1] * 4 || cnt[6] >= cnt[1] * 4)) {  // 1:1:3:1:1 & 4 以上の明
            penalty += 40;
            if(j < n_modules1) {  // 終端でない
              // 続きをチェック
              cnt[0] = cnt[4];
              cnt[1] = cnt[5];
              cnt[2] = cnt[6];
              k = 3;
              continue;
            }
          }
        }
        if(j == n_modules1)
          break;
        // 続きをチェック
        cnt[0] = cnt[2];
        cnt[1] = cnt[3];
        cnt[2] = cnt[4];
        cnt[3] = cnt[5];
        cnt[4] = cnt[6];
        k = 5;
      }
    }
    // 列
    for(j = 0; j < n_modules1; j++) {
      k = 0;
      for(i = 0; ; ) {
        // 同色モジュール数カウント
        for(; k < 7; k++) {
          y = i;
          for(; i < n_modules1; i++) {
            if(module2[i][j] ^ (k & 0x01))  // k = 0,2,4,6 -- 暗?,k = 1,3,5 -- 明?
              break;
          }
          cnt[k] = i - y;  // モジュール数
          if(i == n_modules1)
            break;
        }
        if(k >= 5) {
          if(k == 5)
            cnt[6] = 0;
          if(cnt[2] == cnt[1] && cnt[3] == cnt[1] * 3 && cnt[4] == cnt[1] && cnt[5] == cnt[1]
               && (cnt[0] >= cnt[1] * 4 || cnt[6] >= cnt[1] * 4)) {  // 1:1:3:1:1 & 4 以上の明
            penalty += 40;
            if(i < n_modules1) {  // 終端でない
              // 続きをチェック
              cnt[0] = cnt[4];
              cnt[1] = cnt[5];
              cnt[2] = cnt[6];
              k = 3;
              continue;
            }
          }
        }
        if(i == n_modules1)
          break;
        // 続きをチェック
        cnt[0] = cnt[2];
        cnt[1] = cnt[3];
        cnt[2] = cnt[4];
        cnt[3] = cnt[5];
        cnt[4] = cnt[6];
        k = 5;
      }
    }

    // 暗モジュール比率
    // 2004年改正 JIS X 0510 では「参考」にある例が「評価条件」と矛盾している.
    n1 = 0;
    for(i = 0; i < n_modules1; i++) {
      for(j = 0; j < n_modules1; j++) {
        if(module2[i][j])  // 暗
          n1++;
      }
    }
    n2 = n_modules1 * n_modules1;
    if((n1 = Math.floor((Math.abs(n1 * 2 - n2) * 20 + (n2 * 2) - 1) / (n2 * 2))) > 1)
      penalty += 10 * (n1 - 1);

    if(penalty < min_penalty) {
      mask = m;
      min_penalty = penalty;
    }
  }

  masking(n_modules1, mask);  // 採用したマスク パターンでマスク

  // 固定暗モジュール
  // 固定暗モジュール配置はマスク判定の前か後か?
  module2[n_modules1 - 8][8] = 1;
  // 形式情報
  code1 = format_info[level][mask];
  b1 = 0x4000;
  for(i = 0; i < 7; i++) {
    module2[8][(i < 6) ? i : i + 1] = module2[n_modules1 - 1 - i][8] = (code1 & b1) ? 1 : 0;
    b1 >>= 1;
  }
  for(i = 7; i >= 0; i--) {
    module2[(i < 6) ? i : i + 1][8] = module2[8][n_modules1 - 1 - i] = (code1 & b1) ? 1 : 0;
    b1 >>= 1;
  }
  // 型番情報
  if(version >= 7) {
    code1 = version_info[version - 7];
    b1 = 0x20000;
    for(i = 0; i < 18; i++) {
      y = n_modules1 - 9 - i % 3;
      x = 5 - Math.floor(i / 3);
      module2[y][x] = module2[x][y] = (code1 & b1) ? 1 : 0;
      b1 >>= 1;
    }
  }

  // 表示
  for(i = 0; i < n_modules1; i++) {
    for(j = 0; j < n_modules1; j += 4) {
      k = (module2[i][j]) ? 0x8 : 0;
      if(j + 1 < n_modules1)
        k |= (module2[i][j + 1]) ? 0x4 : 0;
      if(j + 2 < n_modules1)
        k |= (module2[i][j + 2]) ? 0x2 : 0;
      if(j + 3 < n_modules1)
        k |= (module2[i][j + 3]) ? 0x1 : 0;
      document.images["M" + i.toString(16) + "_" + j.toString(16)].src = img_m[k].src;
    }
    for(; j < MAX_MOD; j += 4)
      document.images["M" + i.toString(16) + "_" + j.toString(16)].src = img_m[0].src;
  }
  for(; i < MAX_MOD; i++) {
    for(j = 0; j < MAX_MOD; j += 4)
      document.images["M" + i.toString(16) + "_" + j.toString(16)].src = img_m[0].src;
  }
}

// データ コード語数
function get_data_cws(version, level) {
  var n_modules;
  var n;

  n_modules = 21 + (version - 1) * 4;  // 1 辺のモジュール数
  n_modules = n_modules * n_modules  // 総モジュール数
                - 3 * (8 * 8)              // 位置検出パターン & 分離パターン
                - 2 * (n_modules - 2 * 8)  // タイミング パターン
                - 1                        // 固定暗モジュール
                - 2 * 15;                  // 形式情報
  // 位置合せパターン
  n = align_pos[version - 1].length;
  if(n) {  // n > 0
    n_modules -= (n * n - 3) * (5 * 5);
    if(n > 2)
      n_modules += 2 * (n - 2) * 5;  // タイミング パターンと重なる分
  }
  // 型番情報
  if(version >= 7)
    n_modules -= 2 * 18;

  return (n_modules >> 3) - rs_blocks[version - 1][level] * ec_codewords[version - 1][level];
}

// コード登録
function put_code(code1, code1_bits) {
  reg = (reg << code1_bits) | code1;
  reg_bits += code1_bits;
  while(reg_bits >= 8) {
    code[i_code++] = (reg >> (reg_bits - 8)) & 0xff;
    reg_bits -= 8;
  }
}

// 英数字モード 文字値
function alpha_val(c) {
  switch(c) {
  case " ":
    return 36;
  case "$":
    return 37;
  case "%":
    return 38;
  case "*":
    return 39;
  case "+":
    return 40;
  case "-":
    return 41;
  case ".":
    return 42;
  case "/":
    return 43;
  case ":":
    return 44;
  }
  if(c <= "9")
    return c.charCodeAt(0) - "0".charCodeAt(0);
  return c.charCodeAt(0) - "A".charCodeAt(0) + 10;
}

// マスク処理
function masking(n_modules1, mask) {
  var i, j;

  for(i = 0; i < n_modules1; i++) {
    for(j = 0; j < n_modules1; j++) {
      module2[i][j] = module1[i][j] & 0x1;
      if(!(module1[i][j] & 0xc0)) {  // 機能パターン,形式情報,型番情報を除く
        switch(mask) {
        case 0:  // (i+j)mod 2=0
          if((i + j) % 2)
            continue;
          break;
        case 1:  // i mod 2=0
          if(i % 2)
            continue;
          break;
        case 2:  // j mod 3=0
          if(j % 3)
            continue;
          break;
        case 3:  // (i+j)mod 3=0
          if((i + j) % 3)
            continue;
          break;
        case 4:  // ((i div 2)+(j div 3))mod 2=0
          if((Math.floor(i / 2) + Math.floor(j / 3)) % 2)
            continue;
          break;
        case 5:  // (i j)mod 2+(i j)mod 3=0
          if(i * j % 2 + i * j % 3)
            continue;
          break;
        case 6:  // ((i j)mod 2+(i j)mod 3)mod 2=0
          if((i * j % 2 + i * j % 3) % 2)
            continue;
          break;
        case 7:  // ((i j)mod 3+(i+j)mod 2)mod 2=0
          if((i * j % 3 + (i + j) % 2) % 2)
            continue;
          break;
        }
        module2[i][j] ^= 1;  // 反転
      }
    }
  }
}

// シフト JIS 変換初期化
function shift_jis_init() {
  // 変換範囲
  range_linear = [[0x824f, 10, 0xff10],   // 数字
                  [0x8260, 26, 0xff21],   // 英大文字
                  [0x8281, 26, 0xff41],   // 英小文字
                  [0x829f, 83, 0x3041],   // ひらがな
                  [0x8340, 86, 0x30a1],   // カタカナ
                  [0x839f, 17, 0x0391],   // ギリシャ文字 大文字 1
                  [0x83b0,  7, 0x03a3],   //                     2
                  [0x83bf, 17, 0x03b1],   // ギリシャ文字 小文字 1
                  [0x83d0,  7, 0x03c3],   //                     2
                  [0x8440,  6, 0x0410],   // ロシア文字 大文字 1
                  [0x8446,  1, 0x0401],   //                   2
                  [0x8447, 26, 0x0416],   //                   3
                  [0x8470,  6, 0x0430],   // ロシア文字 小文字 1
                  [0x8476,  1, 0x0451],   //                   2
                  [0x8477, 26, 0x0436]];  //                   3
  range_table = [[0x8140,  108,    0],
                 [0x81b8,    8,  108],
                 [0x81c8,    7,  116],
                 [0x81da,   15,  124],
                 [0x81f0,    8,  140],
                 [0x81fc,    1,  148],
                 [0x849f,   32,  150],
                 [0x889f, 2966,  182],
                 [0x989f, 1410, 3148],
                 [0xe040, 1980, 4558]];
  // ASCII 化変換テーブル
  unicode_enc =
  // 8140 〜 81AC
    "7LCl47L^>gz{oicz}8v^z}g>H7]rjl(;Bjs(:*we{<`3K7hCf07^.vp7La027Lr4>7M.C72BO)8z{w1>7OB9U{.4bv2D64P2BtAH"
  + "2CJPnz{AGv7N`]S{*xIl{.>Bi7M@LF7MRXJ7MeeN7MwqR7N;Cu2yiud(>y<Mz}LAsz}K,c3,h+:2{,xj4A7,L(:lZ+2Ea6J{<r>h"
  + "(9@PozzzL0z{-R8z}gCE4:jm*44P]d44lo_43y>04/tXr41mq842sFf7N<Vt2kus72l;Zv"
  // 81B8 〜 81BF
  + "2xeH*305A{3/g)s2|Dkk"
  // 81C8 〜 81CE
  + "2|)Xg(:GFt2s5d@2x5nM"
  // 81DA 〜 81E8
  + "2{?023?08,2x[C*3*[^)3-?HG3(G2r2}SWx2|Uew"
  // 81F0 〜 81F7
  + "2a2bp4E|<Q4EMaN2Cfhv"
  // 81FC 〜 81FC
  + "48Ao="
  // 849F 〜 84BE
  + "3tn;u3v0/93wGxI3wm:f3x`kv3{:PZ3u3N/3vpYK3w>rW3z=p|3{1KN3x;Rm3y/-}3{Ucz3yx^s3zl9B"
  // 889F 〜 9872
  + "A>WC)Dx/.[C<BweGrsSYVC[G*R3n9=G-lgyKJ-teRW*p<Z2]OaD(yYXG_E^HDr^vTY5Wn@PK999GT`FhSxx[MFMD?SH{c8,X3n<U"
  + "I9BAiAJ@ttAY|CYCy@IWDs+]]EYDnyG8XlkHmZsfL;]7nMhB`.PIGylQHc+TSo}ELVI,IoBhliEA?T,SQFs@XNrmI4DYoA.VEyWH"
  + "R50E7Z8lh1BnNfSC?ou@Dw9WGY5E2cQL9K@XDF6(XJ{[HC(}`zEKP8KQ,fwcXR^>kZXxRWA/gh>Qk.J;Cb)oEJL?1PZ:.u?BtV^N"
  + "MWU5ICfRXKVG|w8R9>uKBzShjEB7L/Hn|f_IL_49K)KRuMIhy7OB@piR/;a+TPB^>K=mBjN7=<tG-HpgUQi)3Iwb3wB964jDE:tN"
  + "EP>h8FuwUiH2`[WKdY6ULE:JyLYn2xPRE,KR+nADVJ;<]ZQ|cMHdBpgM`@wdDaCqoFc}TDGgFARJ2D(OJ]H6GQ-4|IZSoCH[*Du4"
  + "JuRf*B+A3{GJJi3IXmL0A7JIpBoBdiKJRu4Xp1zcBdq4zARA8YAZJY1BW=|_C`KvEE6DMVEU.s[Hy|*pIDBZSJxZ/zM9L:fO2vZm"
  + "Odc:`R,svdR=T|ARGE[nTY+?:U9^o)VHB3hS<QlMEr3_6LhuUOQh^R{SHu5PXNw>1YMW.]AL*0TCw4yUDU`|PFoK0SG+N-5GM6Oz"
  + "GiQcOYuJ`}I_}E|L3eyvN/|LnQ}2>}X-JzoU8Lq@BZO@SC:wn?Ew+rfIvJ:1NhGJ)SnePZWNisbK6E_DSDwa.IL1g:Vy/IICmr__"
  + "FPUIIHGbH@IR7mEM0tUAOEHH2TA5I(Uz|S9X/{a7XaIb@ElQ4uXyhzJH)5nnJ2M,RI``LFKlXJgCSuUAGlPyvKFs/3RUr@LV+tg_"
  + "Z9rVHIkJmQXd@+,B4dMjR`4hyWKqVOZSH5yR1FwgP-7fOR*TqwA;E}sB;y5HBG=DZB_pFgCSY*EDtzyPEM?`SFF7G|G-,4WGAUhc"
  + "H/|Y/IG8IsIgtS5JR*,UKf.2lKimkWM^wBfN>6h{OgNo8POk<EQ25}bQvIa3T=q0hU9z,vWauf7X.,F2XDbL:Y;1a/A3t:.Em)/h"
  + "M6iD^NCI47Q1_/,XNQy*XzRN[AID=+BnWo4CjWZ9Dc}c-EQ{l5F;A5pFl1+QI7.^]HhGELIbs04J7|A+J_812JroN]N|B5SO9zFv"
  + "FjTB_TH^BbUOfL3U}i^PYSanSA;X6pB*rigEMe5]G`z)]JOFS6MkozEQ*Z<*TZ2rlH*|D1Xg>AiC(45+IU6gRTR(mnI=InrBnt=C"
  + "QQ{?EV@ZN{A5>x}AK+VQC-m1jFWFnvHWu0.JlTzaJ}eQbM@Fq;OLT[*P9cT;PAl.YLi0QZE`gzfGidhKGq@63S7IOpUZ[kuKbW4d"
  + "Yx-YkA@54sAYj5XA{q48OT8:]BE1xnBf*/pB{YNjDN.tBF[9DiFvaviF}@IyHXhjGJz/66Lxd0EQNDc(QlG.1VZD{|XqLP[Y[hQ]"
  + "BBNQ6HyDb<E`9wtIu)RYITi04AzXEvD,FXyW@{sAJLu]`MEZ?wO2mW|PLP6WRF[5+T4t7+V:{1BC+5@YA7ocZBzxyDLvEH}NUrgH"
  + "Ur)srYL8nLB7XMmS7ltiOFzK9ESZc/XH-.pJE;u=Eb)h{H(pZ>Ju8:4V/(G>LQo.CP)O*QP_6{|WHM5nC*fVtTH/R?Uu:cLBmJqH"
  + "N{W=JAynoEB22KgD)ZSaD3]:aF`lHyG(3v+GA{*QH+[_2HZj{{IS=ZTMg<ygP6HDkPG<V_Py{bOR8fuJTFw0STm?)QXtBU^R)4tm"
  + "Z1:j1GU[4<Kvyc3IS3P_JLYNEKkK,0P?NgjTIkiEAH5SLAi[)TB80?+BPhg0C|HJAE7SDSGI{EAGm;0TIkSsALlg}7M)^dVNe6)]"
  + "N>@*+T9Y@7U?ntNVJVQ{XFvw}YT9@BB2)@ZBu[m_FYIa7KUQxuM?oZ[QqHWmTah_?A6;]vBzow1Cz3|OEGg,7FL>LdGX>xnICX9Y"
  + "Lu[:^Sx^e2QKt5TS61^eU[kUiXO3H1[2i|iA=QIfBj7sbC.MQDFe?FkG,^38J=(JENg/iKTWX6ZVk_DLZ-vM+AVN{HAh:/MB2`_+"
  + "BW4r|Bb@]hBzfopC)BwjD-L,vDiiSYEF|OwF73H[F9,bTFG}YXFMV?aFzJL3GcJX^H*Lu)HkkY:I/[gXIOg-]J(8D)K/@JAKK3u}"
  + "Mad3yNdpcrP3RK^P9PIDPImBBQ48E1QFib0Q_NJ;R9YT(Sok9dU8}A6VUUe5W-ag9W<S[GXB1gTYG7TzZUIgYBXLirC(b]^Gm`o("
  + "U3)Kd[)5esBLPqTCzPE7Vi(G/[+pcQKcJ}=M^6(bG2y.QLvkanJSqm>ACO_3D/NMPE+ECPGL9{rHl9x6I`0MRMs/v+Qw>-LA>N+]"
  + "Bwz*KF*V+9F80H-JunIlNXUj(WLy+fD-C<+Gs8IhAwuUYI0swXDJ35IEOpPRGZSG2IRf4WKF|:7VqTRuNZWOTO*>3XP<+C6Sz*3a"
  + "XJJkgD),e`Pyry@B>.JsX>E}|Iw>NQC:nlED?cC5Zjk3mBN.wOH:V[YI3*)VOH+_NP:Vs5IV,,6O[E)IB9Z>8ETqwhHFRQ1I5cw8"
  + "RzSIkN1-:LGvh.rZ*fgPHtBH8Auj8}EeM7?HCST=IVEkHM:?^TOfI9<S=ccSU?.QEY8Uz9H}nf1AD_2pAOKA+BLGjVB|CzRCvoiI"
  + "Dr.{qDw^e-EaZU2F>[J>FthgfHT>>uHbwcaHi(k|JS^/2Jg/Z]N|LA|P6-24P;RqIQOJKwT:i+1TQ>zcTU(NdU<xv;XOahwJT}|2"
  + "AO^M;B3JP}EWgk(Gnf85JLc[DJyMfVMT9pONmvalQ54ziQi5wXV5S6iZx|0`TkkU*OT_b{EL2{>A.;NjD?3qWE78(LG*?kUKc/F}"
  + "U@`_ERhOQ`Aqf;GQ|=5[RpFm?Ql|aNEXmWTUMtitLNo,kP9GKBTePq*VKenvVR03(Bar_bI9hj{Le-|XVq_gAR-x;YFZW{iA49K1"
  + "EKXheI628bLx>b.O>rjiUTK^=YFodgByM}hEX?9pJ3xfKXU8/FBxQF]EM6ZSF6HIMG7.rAK04JWO4A^-PZNDFQiQ,9R[T(bT6vU@"
  + "UkfD?VE9srVgoF.Vlw8fAQ`p^BiMkZGSl-*JlKyOM/@aNVr7-HBy2ynEQN,-O(WsVP,2<mLT+30Sn@I/A_kzEHoTb-OR7Z{YR+5/"
  + "FhPe/ItGlKKDga9Km2,rP9*}NVLOdGXr4MTBI@;:H{+eaKHtqqPMC]kI0,/hS,oR)BX:]QDhcw8FedayW9yxEAy.AKB^j>wBj.lX"
  + "C@YDVCHGTrDgS{WE(4*{EY)MKEZ8:bFH0`IFQw87G`prFGjaJVG{BTqHlq@.Hx5o@I^R<hJ3RpFK9C.@KOSuGLG3cCMqZd3Nc<Yy"
  + "O)K@rOQr3fP-KIXQCsqDRZ|V]SoEq5TIGfCTO*PZU2,d,Vmm5WWJHh<XJVB6A.{h,A116:B:|8)D:iw0DUr|vF?}F:HO+;TI:-sB"
  + "Lro2:ODT_CTnVzqW@CudD>pubGlYsDJY6}4P[8qHQwbg8Y3Cc(V7TyVAO966A]V84D{5-1EUwT;G?ABkHc*kEIf[[/K7[xnMam7U"
  + "N@B1AO77U9QhKFkRz](7TL=k}V59;lVstF6AAi:ABFS+KDY@@*M_2SQQWT/7V9cKxXap.yT]5`yVfgHgBtNkwC-v+:F={1cJk+1o"
  + "NGEt_Q0O4,VG*/6W>_wxXI43wYh-QAF)uspIB8IiXQ<vmI8bm[REr9wXNHD]KpTaPEWSz6L,O4BHpY+)BKyN;Drxh6FunJxHU{iQ"
  + "Hns_3Ig*oWJSg<kLkXALN9,KaQ=*mHT*L7cTW3qrT[g0,Vkt-6X_cu^O;NR8XMoO[G33:7Haq}XI@>F6OB6kePXqBqU:-)SU[*v0"
  + "NkDYNGjN>nH:{iuTJr53OjjUFXRquHQllL2AE-R?Bi`QsENNM0EZf_+GVEWZHFegdIQiWPK26A`IGJl/LKJT,HewJSOhggTPZ31o"
  + "Q]9vmQqZVfTQmI}U^6I`VLbsqW10*fZ+*`hCQ<@TLHoc4O,oePQc@iSCgX]uEkB6;I0bLGIr3X8Mk]c1Nv32*O6M)@P:Cz2S.UZu"
  + "X@88A[44|vBRaxfBz]]cCU@7pDdr.+EKth{Be[@2G5Yt<G|Z?]H,X@zHi1p-F6waKJ-TzjL[RzWMu;0LOI_i=PM(E:Q>;/,R::mJ"
  + "Ra:+@SzNFuV@/NcWM,]]YT-OJDP:O^QfeC8UCs]oA_+)UBMib3F}RVOI;*V4UV2eoAa6q`U=<g`PGD0;SuJveH-KTXEHPPUH5C7R"
  + "VIjX:D_8LuJqN?6CIiT)Dn*UyG[4x]Qq5>IX@fs^YVJ{8D@h)6Q5W|rF?*bEFu-tUGWpe{K)0F(QIqfyR,3]>U;DzSVDtq^[,nip"
  + "AF3AID`ZWPVkEh,Zjc7bL+vYgCJJ-MG[c19Gin5nK{yktTHTSAKw,E8R6khsSH;f;B{G/PVHyAMDghSIF9e1>V9*HfU-WmWZ;PI`"
  + "TXnq@Bku.0D/axdH)uW{JQQi1KOp/fNV@gMOhKT2Q:HN-SCNPEWF^0QDUDk;HbeY8J;S14Mb<9}AiJ?OD)u}*F|LyzJogK`O<g@U"
  + "Qj;f>VGEZKOkfK?OTTvjRb-zhO7R`CR6XwtNCmv[AGg^_Fn<K3Hq{gzK(=]pSr2gCVd^09YM*cjL+n_]R.5moU:E|_B2DM2CQ|0Z"
  + "F<Fr.FGkN|FZ}92FiV?;GpLDPI3|w5Lh5+GNC8>zQU?A2SUdXqT^V9MU]zD,X+?Z{ZL:anGwurNI33=DM:[beWOS:uK.hBZIj)s+"
  + "V?a@9Msg}zDIeHEH+n|PAPI,VIGz@_RlT<[WEt=dKnHkuDZO*UP;[JoC(vkQZcB5wAQVgsAr*b.U8V(EDCy2EF=1GBFLPX5FX_c>"
  + "Gf[e3H.mvuJlC=*O-l8aPNnePTF?c|UfZ{IVS]L0VsF@@J}w97HL,7JKa621OX6-dWS;@bCA`K3HEN?dV=z0}B7b9aD`l[]FJ3V2"
  + "PbQ]sU;j98X{;VFALD<kKuDMDXT`UZC)U5pDIHa3Ec]x,H`G,>KI`8TRH^`[VB1n[WE4@QN_Qi-FKflNDhm+iAgO_6B=:`EBF7e5"
  + "DI-J0DedouEs^OeG/e{=H8gN=ISFPNIe)(jKAqhLK;ERgLXKRkMsJ|hO^-XhO_*>IPBz5DRVefTS*m2+Tbm}5U`y:YVAYXvXFQ_P"
  + "YWA*bA{KvoC)0s8EYs9FHDl_bNP0^_QMvR|VHpCzEqB5`Bi;_]FiM]ELlBsDO3)fmJ`Y>qTXSVwJ88(>OGekmEaAVcR.X`cVd.S<"
  + "Cl>snG0tprJtMC^VFw=PC0P?QVx|WjVQEc3A62]URxlq6L14]zWDw^(YJ,KNMi+jkIrk|aXR0lmA<qMFFW-AgBbgx1QBR*2FU;[}"
  + "A:7@KDj@uJXoY_NDk4Z9TU0X<O1KY.EUfbbM)B>?FFIXPG{gi[LWu7sA5-GkA5vcKCpi(+Kw=};QNs+[QdY?VT:q{uF8g[hHFJeK"
  + "I=Z8VK1L-)N^qZvP{+GMYI7:]FNo>5H(8K0I<g|9LgT*4QGflrVdQ`eD?F+gIZJ6HLMi2oU;9xcU?])AVB_p.O6{9;RPRdTBPzl8"
  + "Gi6X:J{+xSOf-wJQq?D@V=fL=Ker.0PU1xFYKNQtBEsrONeQ6GQB?QIJFZ};QBm^QMfZ.fW,-CnN.eABYl1bcPzQsmO^ex.ZL`/*"
  + "DI]JEXMx(TBJ*8<BxH>yF:`xsH_f^[Jl0b8Lg/<ZM>)1SPY6XAS+DWyOk9-lLNAlXY5)UQHvkJ-N:(vxRo]]gBf|fJC+sj*FHKu?"
  + "G.`=<G`9MhH_]e_J{>,4N4=/WO5cWoP{=MESwbLKU;a8+X`=.=J/*KRAusXWFhv+{Ja:glN=zjb[7+e5O<ISFMk9f]Fa;scRJVQb"
  + "F[ge>MfndmVFG9pDuR>dP8]YUTg,b{Fa`CvJkF?=MX5YbSpTbNU4ZimH.eBAO5,BzWA9]jR]lmiZ8Yf^FarB;K4^*xU9T_hXwms["
  + "MZ?ODADza2Da(bnERn{JF:DU/Ft(:xH[yfhHwBP.Le6>sQWfwlQ{pV,U8k4tUOJP2XA2UVHF7R`QneZYRskg<EXQWBY-NciRqg,d"
  + "BR*xHFAHR@O-uU,T+QttKDy=WG[G=ZAD(zxZ(+aYC.24-DS9N:G_+7/Dh6^KP3@?rXSQPGQ=s|oAUeU_DFx9-FF@OdIElVtRn|e`"
  + "XCZh`Xq],dDTe6eNk2MkNN](1OdWFuD]I2DOkSX}V8SK,VH6UkB[_0sFUOSyAao]DW:X1UGwcBaM`zA.U|kv3B^|[FG@+jKI(3xw"
  + "OxC?QAi?l9Bc+3qDECzTEMn+oErszPFJ*.1Gy[GAHc}MeJ|:GdLBDh=PVn{1R(]2DRfDOyT,acyU/[96W8*hzZMhAnA6D_aAtZGY"
  + "D,b^wF@TbQFmQuXI(k8qIG/EFB:OEUQF)8(TbHexU</V0X?9KfXv96WA|?RSDR*k@I6M`HNGt5rVtnXbJva`(D@0b+DeI*jQ3C2,"
  + "N6m.3Nr/^z[)H/PDp63tIAC^eC@d3TFC0XOI@m{lIL)L(IV2I8AbNIxGg+3,Jwh_?A[e/g[)m*1GAM30Kg+T[C40d,Yuo_ZOf5rB"
  + "ER9MCKN*[7O</w@Dlia{JgAs=B^E8{LF[G7NTHO:ZYO;FE/@euB<P<+C56FoN9QH[W1pl:DuJ+<K[3PPIbadBPP1B7[)?O_J1H:9"
  + "DjS(lJaUvSN;S.mQ6Cu3B09k;[,ZB[I;DlDY7FpGGXZ{lU:OB`G//PsX,9l=A8+t3D_KOJQ9_W?FY@x]BpZT.P7E?1TKS@WX_Gjr"
  + "R{+aDG7xFQJy;fmT`FOiCH54MB/EQiBx6JHFGF;ZGDq)FI1q<0KQ1oMM*Q/}MaZ6CS|5ITVGs]{VZ2x`SX3MVA<KdRA/L6CV+I(J"
  + "Ax)-VDlLA-FM`T(H3@hWI-,0uJ)Y?8KYVWSM`^YEP}?i^RSxrDT8SY5U`JsbXG<65GDKcQJNRfaK78@VQ3M7(P|hbpT)s]wRCfm2"
  + "XT<<?PA>ltVgY`9Bn}HIJIZZHS(EF/T<V=*C)L<MI9:4DM@bqEMtQ<.S}MRFXR):[Fe6}dOO]|AH)c{]BTn=^KVjm[Meq{0P+7mT"
  + "OQN4WA]`dSHe@J6A<9UOA|manB@_?;H`Y;gK>rx:N(fK[O<yDyQwFVxVM:9AXFHX:BVh1fAj3Q:IA(QaLY?mhQhz5LXK@{VZ|J2;"
  + "DG+mtP;x{wAF<96AX-0bBY.UDFt`=vN{+e4V}6R=XT4`WZ{X.aH}@FkBH_=2L=1rWFOOZQGFEJWLJsVHPPz-5RfVxOWA[c)YzC-r"
  + "L6IVrU]U9pBYI]vFOX]`I3E@7IxCPSKd+s|LzAAVQ3|8SSQ1hZB6TvoO,ff2WB?+OAjEa1TR1LOU<]?WG1z^cZiwVKA>5VgTQPxf"
  + "RsW7*KSXp{QX9cT"
  // 989F 〜 EAA4
  + "FV[cGA04TYA33S,A4B@@A4ye^A7A?JA<2`IA<`_@FVejrA>j;XA>|G^A@cS)AACxJACkWWAC+-NADq>|AG8o=AH>UrARoVQARx^*"
  + "ARSDfAUnUqAXQBDAVEtVAU71tAU.+hAY;qxA`q8|A`9joAaZcuAaQ]sAbWD<AhC5aAgbg]AiQxHAL:8/Ai-`iAj<LHAcg1tAf7hh"
  + "Am35*An]DoAm;KlAnfK6ArEnmAu|;>Axi.0Az}W^Ax`(?A|HQ)A}|VGA}jJFB*1zdB+o0*B+.[8B-0yIB-_A[B1,X<B1>eBB1YwJ"
  + "B3]>jB3oK,OTJFVB66{NB8TTyCvS@5B9Q69B:DgEB:j)LB<G.lB<4xmB=(RwB={40B=r..B>7@>B?tKZBB;|2S6p2?BD5=TBE(nk"
  + "BF[t1BHC)DBJEFtBK/r.BL>_UBMMK]BN@|xBO4W6BRWnUBRNhkBSTO-BU|/IBR<[rBUc+DV6Nu_BX_r7BYRLDB]-2sB^sD:B_iH="
  + "B_/PLBaCzgBai<yBcGT1BctaABd0mHBe?YbBgT./BgyF:BiD?UBirM|Bj@vfBAdbWBme7QD^|/iBo96tBrSG[Bt:RqBu...Buw_I"
  + "OsTi}BzB:jL]OkvB{>7PB}7NwC.D9NC,T(*C.;3;C-Ye0C*vy<C7/)+C6{xjC3steC3jo)C4yZxC4K<wC78/=C=,|;C;Nw/C:7.B"
  + "C=6,BC:.(?C9CS4C;t9gC@>1HCDh/KCBnmiCA1beC?xvCCI{WwCK=JMCLzUuCLC2+CI1}>CM-]uCPm-WCQrmRCP>gxCSFl`CUeES"
  + "CQ2BUCQVZXCZJOtCZxnxCZ]]?CYj,hC^RU7C_=){CbE.>CgkctLZrmYCe:}=CeM3yCj3<iCj|nVCmia1Cn7yUCo=`NCq-r)Crt-@"
  + "Ct5vTCt,pZCsyj_CuMivCu|2+Cxr*iCzkB+C{9Z9C{^s?C|6;LC}E(ZCXH6dD(p(4D*i?^D+.QRD-9v:D9>uvD/37cD3J)ID5q`+"
  + "D6?w|D7WkKD9vDsD;88(DA64dD=(IrDBj:eDL>SmDJWI1DL--sDHq=iDM)*-DSpW2DREX?DWl6tDSgQ@DU2JsDVJ>-DW=o6DXUbF"
  + "DXL[HDY[HoDZb/zDZ}B)D[^g<D^2f[I^vwaDa1e4Dai3EDc,6cDeQ]+Ddh2.Demo@DfaIMDgy<[Di;0*Dm6ExA[P_vDoK9TDu7*K"
  + "DkOZBDsc,1D{+wcDzfeWDzSY7E->H=D}IQHE,8bTE26`4E6)8hE6MP^E9znCE:@*XE8XuYE<TT;E>;`UEBIJ6EAUq?ECb>aEDKie"
  + "EEd]0EFa=?EGp*XEI(mnEIV5xH^iXAEJey8ENj_>EQrckERS2(ES=]?EU[6SETh[NEV3TgEWBAuEXvGBEY;YKEZJFjE](L+E_E|R"
  + "E`B]iEadV-Eavc+EI1viEe1BNEe{G|EhBxTEi6IdEk^3HEllvTElu|_Em`PhEpUIOEtGy/Erao]ErE[-Evx_eF(Sa_EwY-eEvoXo"
  + "EwO}lEw=rGE}M{.E|dPEF*{AxF-0fDF,XG^F/N@-F1>QOF.-G+F2iPjF4Xc/F51+7F6-bUF8TAwF;8.`F<c-eF<u:6F?t8aFA6+i"
  + "FBDo5FB|=CFDP<VFAZDLFF[a+[)QIbFK/_GFNf+qFP:+0FPqOJFQZzHFQHnNFR*<ZFRsmgFSgGvFS^AvFTPs2FU``HF`>*KFVS:X"
  + "FWb}|FZ3^LF]?+qF^Mo,FZEjhF_SU?F_ohLFa{5sFc*s7Fd9`>Fe-:OFemeUFg8^uFfW9vFh>E=FjIi{Fq2:sFpm(}Fmw2zFqVS_"
  + "F{uGcFsFexFs4Y(FtUQoFv<^:Fs=`2F{=z/F|{/vF{lB=Fy2U}F|:Z:F|Ca:F}7;lF{4toG*dY_G)^r]G)gx_G+a9mG+;wyG*QMV"
  + "G/@^-G26TrFoyPAG0k[fG2dufG9:9[G5v)-G6{f4G6DA=G:R,]G5Ga>G8Of@G=Z1QG;3Q]G=d7gG;apKG=Q+kG>;VMGCb4fG@P*I"
  + "GBIAvGBnYkGC*fgG@uBFGCO)OGF|E_GICv,GGJ^fGFN((GIV,gGLU+*GQD:VGKkUvGJnurP{NQPGOT)aGQ;52GQ))5GQ{`;GR.f@"
  + "GS4LSGSbk[GTL?rGUQ},GVjpEGWK>OGWgPbGZ]IDG]qsVG]UaaG`T`AGavXJGbs9iGcARXGa?4ZGj<0AGg=1yGnRw_HJW07GjjNA"
  + "Ghq6{GhTzPGhh1oGlcfyGrjinGoOX;GmM<4Gu;I{H6w0[H(]^jG|?.qG{9G_G}s3^H)Y?DGz*YoH,tPBH-0[wH0p/GH/)tdH-Tuv"
  + "H9Po+H5zR*H9d(EH6Hk0H5U:hH?k),H<=dkHCodpHEUp@HBMl6HK8ZIHHz1)HGtJ0HH^uPHLZVUHKp)_Ge`3*HMM/dHN7Y2HMiA4"
  + "HO=@EHQm|}HOk_rHR|jAHTl{]HU27aHU;o1HVxI<HXCB@HX_TTHY6snH],lCH^<v}H`l?.HbRJVHe-1(HdpzzHf)h=Hg]mSHh55a"
  + "Hi{KYHl_3WHk+2eHq;7aHq21EHt(*3HsF[*Hu[/[Hv<SlHvalhHv*GsHyVeVHzfQcHy`khH|CWTI)BUyI)ptqI*QBsI,JZQI-P?k"
  + "I.1fqI/7M1I/wxRI3<3+I4y>DX[6^8I7]*mI7o6qI6iOuI:w;aI:Hs_I;Wa:I<pSgI>2F3I?oQeIB[D?I?/(4IJIRFIJ.@BIIi.D"
  + "II:ffIHP;cIJ@LJIFs67IIV+)IOJp^IPY]cITL5yITU=PIPlj(IVjg)IYienI[Oq6I](9+I]hcnJ@K=dIXYxyI^@,TIj2uAIY``z"
  + "Ibj*xId>*JIlYUWIimd)IcogaIcxn[IjN2gId4y`IlPOoIe1YuIllcMIkAd8Il,77IuMLAIrEG{IsyLfIu{k=In[uSIo+7<Im`>7"
  + "IrWSbIv@}<I{TO]J(fZ6I}2U;I|mC3EUnmKJ*1S?I}DagJ2i;gIy[88IxLKEJ*:YnJ.-3pJ-gz]J-0R=J+7;>I{KJwJ+n`SJ+[SG"
  + "J/j@|J1YP3J50mMJ:)-PJ:`QhJ8AxdJ8g:VJ3nzWJ=:8qJ>wCxJ?3PCJ={asJAm<}JBVgyJ@yb^JEUfXJE_l2JE1MnJH^kTS02W*"
  + "JK/J}Ysdd*JO40oN94rvY4vhcJPBt6JQdmSJR3/YJSArkJU{_FJVf3TJW=Q]JX:2{JY-d3JZaiNJ[K=ZJ]5hdJ]>nkJ^;O-J_oTI"
  + "JazxwJc<l4Jccs6JfDprJg]d0JiCoHJoSx`Joy:yJsFQgJuw7sJv*=qJpY`2Ju-]zJzJ6cJ|(;=J|LSIJ}-x8JxGnrJyDOBK(}9v"
  + "K(NrbSm^gLK/IOlK0kHTK0O6lK,fcwK5GMOK5PRmK7e}+K9zP}KzjjpKEH-iKG8=oK@+T]K>MO-KC}3zK@XsdKA:AFKEQ3-KC3Xi"
  + "KCk(2KJwiKKK*nLKR@_,KLgygKQV3FKRevtKILihKLBb8KI{4)KI:]ZKS}k2KVEDhKY`U;KZ@ysK[+M}K]hYZKUHd:KZoAhKiHAY"
  + "L/s7@KaZ3RKi658Kgb5}Kgk;ZKi-/XKaQ//KoOEOKp9p_Kn@W}K|GuiKpBv[KkoyCKqv|[KmCxwKsp=LKsyCfKwXfyKz<RhK{^Kt"
  + "KyR(}K{pW}L(fPsK}2KjK}rvoK}VdxL*UaAL*qu>L+.+XL.H;zL0JYiL8/c5L:M=UL:2*oL:rTlL?W_`L?ERlLD+]gLF-{@LMr3q"
  + "LQZ]OLMUweLL>.yLRE3ALQ6D{LU(taLZ*:GLWFNGLXU;TLY-YfL]>e5L^;ESL^`^ZL`l,*Lb@+PLd9BgLdTTpLedB/Lf2Z7Lfs/I"
  + "LhlG/Llq,dLm6>lLn|P6Lpc[WLs4;zLt9yBLtC)KLun(nLwA}{Ly{jTAg5]hL{k|5L}-oBM*>ysM)06^M+DaFM-6JcM.(L|M/n_="
  + "M1TjRM1p|ZM:-M6M:drDM99saM>232MQCrdMKt>PM?7q;MF;TKMFisZMIUeVMIqx,MK}E:MKEwGMMQDqMPu[WMUZfVMVaJ,MWy@+"
  + "MXck8MYM?HMY`KIMZR|WM[kopM[tuzM]qV.M^[+;M_WbWMa,a|Mc]GOMd=lQMf-}`Mezx,Mg*_4Mgk3AMi6,WMja+wMhgjhMj|=u"
  + "Ml5+BMm1bVMmi0zMoO<5MobH1Mo}Z3Mo=0=Mqvr[MsSw|Mt,@FMwX]fMwki[Mw+>VMv@jiMy-]+Mz|t[M{/zVM{B0[M};GzM}{sB"
  + "N)FlNN+R9uN,*X.N,k-<N,}9<N-9EGN-pjSN.Q8`N/DioN08D)N0oi:N1G1BN21[aN4tN-N5Km4N6HMPN8SqjN9GL+N:1w8N:`n?"
  + "N<OPpN=hCxNAGgeN@8zZNA,TXNBrg1NDXrdNH09@NFe@-NJVokNIvJuNKoc4NN.6VNOkB)NPgy;NQ-5<NPz/ENRsFhNT>?zNU:w?"
  + "NWtcwNZ<@RN[g?eN`bsBNed8jNfVj0Nh=uINl^lzNk}HENnN(VNox}WNmHAFNns@|Nq{E1NtBubNuH]4NvNCENyD;sN{O`gN}w?}"
  + "O(<QvN}R(>O,81{O/I<a[8iP7O19N(O2H;:O4/FfO7@QEO6`-6O:mo2O<SzNO=GT]O,A9yO@=MAO?o5BOC<KiODB36OE7)IOEv8]"
  + "OGA1yOJ-zJOJ7*LOK}<:OLgg/ON|:RONEWwOO8FZOOokfOPcErOQ1^}OQUw2OR.?<OS=,QOUQV0OVE1/OZf(kOWy6VOZx4}O[+;P"
  + "OcA*HO^QpxO^Hk[ObicOOb`]POb;DVOam,OOg*TUOg<aLOfwNVOe1==OeUTbOf[=/Ojs.XOlG-NOkJLoOo3vqOsfyqOne_gOqZV("
  + "Os]s}Op^v/Or|NzOuD)lOv.SkOwOM.Ox0rUOxh@dOz*3[Oz39uO{g?:Ozj_2O}28XP)Xo5P-05tP,t)pP,jylP.d;2P.Q/,P/D`C"
  + "P0/4RP0A@hP2(K|P3f^_P50PYP5^ocP6?=yP72oAP956BP>?X_P;ny.P=_4BP>H`2P@/jsPC.iSPB`P6PAPdpPEUH^PF6n0PGNaz"
  + "PIQ(vPJ;SKPK/.7PXh2YPIZ/ZPJVe|PId5WPNRE;PN[KSPPgoMPRj74PU{AjPT50iPUV)MPSJ[RPYdk}PXU(@PXBrLPX0f9PXKxr"
  + "P]5K.P]>Q2P[p9NP^VDNP`O[sPa:/(P`Y@cP`ko-PaqU;Pbn6HPbw<MPc<NJPcjm^PtTxDPuvqdPvjKnPw/^tPw]||Pwy94PxljE"
  + "PyiJMP{FOxP|qO1P}-[7P}QtHQ)K5dQ(|sfQ+;G4Q,A.:Q+{rATnM=kQ-b}dQ/@,}Q0WvEQ1KPZQ33QmQ4SU3Q5+tFQ6LmZQ6r/g"
  + "Q83y;Q:6@YQ;E-mQ=>E1Q>(p@Q>{PZQ@+7bQ@OOoQA9z|QAzO4QB-UJQCWTWQFBd8QF;A]QLBD>QKNiwQK3W0QP4syQMZ87QSX4x"
  + "QT9YPXHfBhQUm_hQWo{yQ[==aQY{JLQ[XOyQ^dt>Q]qC.Qa>YbQacrtQYC|tQb;;0QcS.JQco@LQdbqYQd+LZQf-jvQgE^3QeUKz"
  + "Qg},AQhp]dQj|*|Qk]O0Ql+h9QlY0DQm:TSQotA,QqQFCQrDwrQtu^8Qu1j<Qv7PIQv[iUQvwzrQwXIlQxBtzQzWHMQ}iRyR)O_@"
  + "R-TDHR-B85R/VblR082hR14h-R0/*[R1OygR1l5gR6Q@CR37/xR6-(KR6vXdR88KNR5KXrR3I<xRA>MuRAllrR@p4>R?|ZER?WB6"
  + "RD4EXR=BoER?N<bRJro8RIv7?RKoO1RGspjREL:>RLu5nRJ`c0ROk.tRD}x|Ri193RWkHtRRVztRZ<*-RWX>JRWtOxRWF16RPplx"
  + "RY-<5Rbd{_R`tkUR^1yURc*8fRdK22RahEeRc|oTRk}4SRg7{>Rk*SxRkk(hRj[;CRoAF,Rqr,)RoJMxRpP3)Rv2tXRv|NMRw8Zg"
  + "Rt0V5Ry(meRvsHWRu6=)Rwp*8R|B}iR|9wiS)8v<S*v+KS-+O8S/nASS-Xn-S.LH^S0Wm*S4SKmA7(+QS7wcQS9p{:S?7S-S?w}l"
  + "S<fsyS@OFTSBv|WSC<<zS@+.aSEPcSSF{bWSE5PVSK*GOSIza?SILB5SJwAQSJR)=SJ6mvSOoWXSOJ?BSMP}{SSEuLSUvZQSQL^O"
  + "SRI>LSTptTSQz|CSTK^RSZIXzSV|BjS_jPlS^ZdtXPfptS_)|ZS_E8qS^-F8Scx<aSg*AUSe:0-SdO[>S`S|rSgjleSi,_}Sj`eK"
  + "SkS?DSkfKdSlOvySnwVFSot7]Ss8H9Sv@LMSrj0mSqZC.SuUxdSw}X,SveejSvwr9SymjUSz<,mS|,><S|Y]FT)}t6T*C0+T(7bk"
  + "T+6aKT+n/XT1u2GT.d(5T/DLRT2(8fT0S9TT2qiOT4}7OT5^[[T6H0iT6Z<uT7Mn1T8faGT9P5YT:{4vT<kF6T=0XBT=g}ST>vjd"
  + "T?;},TB:{KTCIhnTE9z8THK.dTGEGeTI5Y*TKoE`TOj{@TMUPwTSAA}TQZ6bTT=yETT4skTW<wqTWb:4TVRL|TZ|J{TZj?0T`46s"
  + "T_et`T`k[DT^{IVTaL)jT^M+|Tc35aT_.P6Td/lgTelx=XhO*sTf{eSTf`RSTjR,0Tje8,TkWiFTk}+ZTlTIaTn;TyTofT=TqCYZ"
  + "Tq{(fTrI@pTrnZkU._JmU/Hv+U0*D5U0joNU3;N|U4fN>U6CSPU6LYYU6qreU4xZVGUJL7U9pqTU:dKRU:?3QU=+{wU@*z`U>{=p"
  + "UBHT8UCN;LUD/`TUD^(`UDgf_UE,?yUE5FnUN)<nUO.z(UPl/_UWfcpUVs2yUZ@IJUXlJAUXcDOU]0ZeU[=*zU`8`VU_<)bUbV9t"
  + "Ub`@QUd}pUUdtjoUfw2+UgNP7Ug*8<Uj)6`Uco.(UhK1gUkS64Um1;NUmUSOUn6x[Uo*RkUo3XtUqQ3<Uqd?MUtP1iUs]VuUtc>/"
  + "Uve[ZUz;y>UxKh0U{fxVU|ueoU}C}tU}`:-U}V3oV(ewKV*zJgV,*1zV+?]}V,NJ,V,|iBV.Ph[V/;<eV5B@.V6,kCV7D^YV;wb^"
  + "V<k<kV>67kV>dTBV?;s<VAlXpVCRdxVC7R(VA54|VEh8`VF-I{VHJ{>VH^1BVAPGKVFZj3VIG[UVK.gwVLXyoVL4N>VMC;HVM_MT"
  + "VN[.cVQv?LVRrv[VX0HgGY}]?V[S``V^{@AVaKvqVeP[OVfrTjVgRz(VhOZIVjw:WVmY}DVn{vPVo]DaVp4crVpu8,Vqzu=Vs3bW"
  + "VtBN_Vw8G>VvVybVwSYaV|Bj9VyLrhW*un?W)JoPW)Aj+W(E2-W*5D:W1^?xW25^CW7eC,W54^DW>UqXWD8[mW?[X5W?e_7WC2uj"
  + "WC;|<WG7[,WHbYjWOf>WWOJ,<WPbv5WSt*fWUH)dWQh]FWS3U>WU>zOWZIEyWXY4[WY{.BW]p|]W[k?WW`8V:W`SiFWcRgjWc@Zp"
  + "V{}_>Weh;>WfZl)WfQfLWg*.RX,N@^X-AqsX.Ye-X.uw8X0R|NX1+DiX2UCtX2qV2K|eP=X4N[CX5B6SX5K<]X6Z)qX6d0XX>6,V"
  + "X>vVrXB([FXAuUnXCegfXCnmhXDkN.XEKsOXJ1}.XJ(wBXKf,YXLtodXM0{lXMU=sXOsnEXOEOBT2{BsXV[?9XTOrTXUqkfXW<dy"
  + "XW*WxXWWw1XY,vPXZDilX[fc(X]P77X]uO7X^(URX`O5rXa0Y|B]]vPXb?GBXdJkYXc|RSXdSqjXePQxXfrKGXgx2LXiC+kXk*77"
  + "XkWUAXmcyx[98oLOQj/gXpFf^XrnFHXuH,IXwJIyXy(ODXyUnfX}HG9X}ZS?X}m`xY.9ufY.zJ*Y0EC9Y4J)/Y76qhY8jw,Y9KE?"
  + "Y9ydAY:d8JY;ViaY=F{,Y=uC<Y>:UFY>qzMY?[NOY?wbHYG.KDYIBucYJv{MYN;5kYMuy[YP4M8YPXf@YQ_LPYR?qnYRe3DYTpWL"
  + "YX+c/YY:O5YYCU4Y[<mUY[t;fY]BSuY]yx}Y^H;2Y^QAvYez=vYgaICYiPZXYilmgYj{YvYkIs(Ylbf9YlX`AYltrGYmzXaYq,^<"
  + "Yqm2KYr;JRYr`cYYrro^YsJ7hYsoP+Yu_bGYveHPYw3a_Yzs4hY|P9uZ(RW8Z)O8JZ*KohZ,|U@Z,<+5Z.YZVZ.umlZ0[x}Z/1yl"
  + "Z:(68Z2:(BZ6,W5Z4je(Z5/vtZ4a^|Z4sjpZ8fCUZ7icUZ7DJ^Z;I00Z;@*;Z=KMrZ>mG?Z@]YmZL}l?ZP/puZLtfQZOj_>ZS7w9"
  + "ZRrcPZVI)hZQ,QbZUqb6ZV[6GZY,luZYm@oZWascZ[A@`Z^UkAZZ|.MZ`X2MZb67kZe,0?Zd/O-Zc|I:Zf:sKZg@YgZjZkCZiL(A"
  + "Zk33}ZnD>IZwx_TZxl9eZyz|zZzI?/Z{Ev7Z|9PSZ}QCsZ}ZIiX`XR7[+LyY[+`/a[,wxw[-+(z[-tY4[.z@J[/dkT[0)}[[0E9a"
  + "[1S|wN5;/a[4@o`[7HtE[9TAd[;DS*[;)A)[;`f5[<A4>[=OwQ[=Fqt[AKVODE2J6VIOc@BBF6b";

  unicode = "";
  var ik = 0;
  var i;
  for(i = 0; i < 6538; i++) {
    var n = 0;
    var cnt;
    for(cnt = 5; cnt; cnt--) {
      var c = unicode_enc.charCodeAt(ik++) - 0x28;
      if(c > 52)
        c--;
      n = n * 85 + c;
    }
    unicode += String.fromCharCode((n & 0xffff0000) >> 16);
    unicode += String.fromCharCode(n & 0xffff);
  }
}

// シフト JIS 変換
function shift_jis(c) {
  var i_range;
  var i_code = unicode.indexOf(c);
  var s_code;
  if(i_code == -1) {  // テーブルにない
    var code = c.charCodeAt(0);
    for(i_range = 0; i_range < range_linear.length; i_range++) {
      if(code >= range_linear[i_range][2]
           && code < range_linear[i_range][2] + range_linear[i_range][1]) {
        s_code = range_linear[i_range][0] + (code - range_linear[i_range][2]);
        // 第 2 バイト 7F スキップ
        if((s_code & 0xff) >= 0x7f) {
          if((range_linear[i_range][0] & 0xff) < 0x7f)
            s_code++;
        }
        return s_code;
      }
    }
    // 他のマッピングの対応
    switch(code) {
    case 0xff3c:
      return 0x815f;
    case 0xff5e:
      return 0x8160;
    case 0x2225:
      return 0x8161;
    case 0xff0d:
      return 0x817c;
    case 0xffe0:
      return 0x8191;
    case 0xffe1:
      return 0x8192;
    case 0xffe2:
      return 0x81ca;
    }
    return 0;  // 変換不能
  }
  for(i_range = 0; i_range < range_table.length; i_range++) {
    if(i_code >= range_table[i_range][2]
         && i_code < range_table[i_range][2] + range_table[i_range][1]) {
      i_code -= range_table[i_range][2];
      var st = range_table[i_range][0];
      if((st & 0xff) > 0x7f)
        st--;
      s_code = st + i_code + Math.floor((i_code + ((st & 0xff) - 0x40)) / 188) * 68;
      // 第 2 バイト 7F スキップ
      if((s_code & 0xff) >= 0x7f)
        s_code++;
      return s_code;
    }
  }
}

//----------------------------------------------------------

  // モジュール表示用画像
  img_m = new Array();
  img_m.length = 16;
  for(i = 0; i < 16; i++) {
    img_m[i] = new Image(12, 3);
    img_m[i].src = "images/qr_m" + i.toString(16) + ".gif";
  }

  code = new Array();  // コード語作成ワーク
  code.length = 3706;
  var i_code;  // コード語インデックス
  var reg;
  var reg_bits;

  // 誤り訂正コード語数
  ec_codewords = [
  // 誤り訂正レベル
  // L   M   Q   H       型番
    [ 7, 10, 13, 17],  //  1
    [10, 16, 22, 28],  //  2
    [15, 26, 18, 22],  //  3
    [20, 18, 26, 16],  //  4
    [26, 24, 18, 22],  //  5
    [18, 16, 24, 28],  //  6
    [20, 18, 18, 26],  //  7
    [24, 22, 22, 26],  //  8
    [30, 22, 20, 24],  //  9
    [18, 26, 24, 28],  // 10
    [20, 30, 28, 24],  // 11
    [24, 22, 26, 28],  // 12
    [26, 22, 24, 22],  // 13
    [30, 24, 20, 24],  // 14
    [22, 24, 30, 24],  // 15
    [24, 28, 24, 30],  // 16
    [28, 28, 28, 28],  // 17
    [30, 26, 28, 28],  // 18
    [28, 26, 26, 26],  // 19
    [28, 26, 30, 28],  // 20
    [28, 26, 28, 30],  // 21
    [28, 28, 30, 24],  // 22
    [30, 28, 30, 30],  // 23
    [30, 28, 30, 30],  // 24
    [26, 28, 30, 30],  // 25
    [28, 28, 28, 30],  // 26
    [30, 28, 30, 30],  // 27
    [30, 28, 30, 30],  // 28
    [30, 28, 30, 30],  // 29
    [30, 28, 30, 30],  // 30
    [30, 28, 30, 30],  // 31
    [30, 28, 30, 30],  // 32
    [30, 28, 30, 30],  // 33
    [30, 28, 30, 30],  // 34
    [30, 28, 30, 30],  // 35
    [30, 28, 30, 30],  // 36
    [30, 28, 30, 30],  // 37
    [30, 28, 30, 30],  // 38
    [30, 28, 30, 30],  // 39
    [30, 28, 30, 30]   // 40
  ];

  // RS ブロック数
  rs_blocks = [
  // 誤り訂正レベル
  // L   M   Q   H       型番
    [ 1,  1,  1,  1],  //  1
    [ 1,  1,  1,  1],  //  2
    [ 1,  1,  2,  2],  //  3
    [ 1,  2,  2,  4],  //  4
    [ 1,  2,  4,  4],  //  5
    [ 2,  4,  4,  4],  //  6
    [ 2,  4,  6,  5],  //  7
    [ 2,  4,  6,  6],  //  8
    [ 2,  5,  8,  8],  //  9
    [ 4,  5,  8,  8],  // 10
    [ 4,  5,  8, 11],  // 11
    [ 4,  8, 10, 11],  // 12
    [ 4,  9, 12, 16],  // 13
    [ 4,  9, 16, 16],  // 14
    [ 6, 10, 12, 18],  // 15
    [ 6, 10, 17, 16],  // 16
    [ 6, 11, 16, 19],  // 17
    [ 6, 13, 18, 21],  // 18
    [ 7, 14, 21, 25],  // 19
    [ 8, 16, 20, 25],  // 20
    [ 8, 17, 23, 25],  // 21
    [ 9, 17, 23, 34],  // 22
    [ 9, 18, 25, 30],  // 23
    [10, 20, 27, 32],  // 24
    [12, 21, 29, 35],  // 25
    [12, 23, 34, 37],  // 26
    [12, 25, 34, 40],  // 27
    [13, 26, 35, 42],  // 28
    [14, 28, 38, 45],  // 29
    [15, 29, 40, 48],  // 30
    [16, 31, 43, 51],  // 31
    [17, 33, 45, 54],  // 32
    [18, 35, 48, 57],  // 33
    [19, 37, 51, 60],  // 34
    [19, 38, 53, 63],  // 35
    [20, 40, 56, 66],  // 36
    [21, 43, 59, 70],  // 37
    [22, 45, 62, 74],  // 38
    [24, 47, 65, 77],  // 39
    [25, 49, 68, 81]   // 40
  ];

  // 誤り訂正コード 生成多項式係数 α指数
  g_exp_t = new Array();
  g_exp_t.length = 30;
  g_exp_t[ 6] = [87, 229, 146, 149, 238, 102, 21];
  g_exp_t[ 9] = [251, 67, 46, 61, 118, 70, 64, 94, 32, 45];
  g_exp_t[12] = [74, 152, 176, 100, 86, 100, 106, 104, 130, 218, 206, 140, 78];
  g_exp_t[14] = [8, 183, 61, 91, 202, 37, 51, 58, 58, 237, 140, 124, 5, 99, 105];
  g_exp_t[15] = [120, 104, 107, 109, 102, 161, 76, 3, 91, 191, 147, 169, 182, 194, 225, 120];
  g_exp_t[16] = [43, 139, 206, 78, 43, 239, 123, 206, 214, 147, 24, 99, 150, 39, 243, 163, 136];
  g_exp_t[17] = [215, 234, 158, 94, 184, 97, 118, 170, 79, 187, 152, 148, 252, 179, 5, 98, 96, 153];
  g_exp_t[19] = [17, 60, 79, 50, 61, 163, 26, 187, 202, 180, 221, 225, 83, 239, 156, 164, 212, 212, 188, 190];
  g_exp_t[21] = [210, 171, 247, 242, 93, 230, 14, 109, 221, 53, 200, 74, 8, 172, 98, 80, 219, 134, 160, 105, 165, 231];
  g_exp_t[23] = [229, 121, 135, 48, 211, 117, 251, 126, 159, 180, 169, 152, 192, 226, 228, 218, 111, 0, 117, 232, 87, 96, 227, 21];
  g_exp_t[25] = [173, 125, 158, 2, 103, 182, 118, 17, 145, 201, 111, 28, 165, 53,161, 21, 245, 142, 13, 102, 48, 227, 153, 145, 218, 70];
  g_exp_t[27] = [168, 223, 200, 104, 224, 234, 108, 180, 110, 190, 195, 147, 205, 27, 232, 201, 21, 43, 245, 87, 42, 195, 212, 119, 242, 37, 9, 123];
  g_exp_t[29] = [41, 173, 145, 152, 216, 31, 179, 182, 50, 48, 110, 86, 239, 96, 222, 125, 42, 173, 226, 193, 224, 130, 156, 37, 251, 216, 238, 40, 192, 180];

  // 位置検出パターン & 分離パターン & 形式情報位置予約(一部)& 固定暗モジュール用データ
  finder_pat = [
//  [0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x41],
    [0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x40],
    [0x80, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x80, 0x40],
    [0x80, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, 0x80, 0x40],
    [0x80, 0x81, 0x80, 0x81, 0x81, 0x81, 0x80, 0x81, 0x80, 0x40],
    [0x80, 0x81, 0x80, 0x81, 0x81, 0x81, 0x80, 0x81, 0x80, 0x40],
    [0x80, 0x81, 0x80, 0x81, 0x81, 0x81, 0x80, 0x81, 0x80, 0x40],
    [0x80, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, 0x80, 0x40],
    [0x80, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x80, 0x40],
    [0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x40]
  ];

  // 位置合せパターン座標
  align_pos = [
  //                                        型番
    [],                                   //  1
    [  6,  18],                           //  2
    [  6,  22],                           //  3
    [  6,  26],                           //  4
    [  6,  30],                           //  5
    [  6,  34],                           //  6
    [  6,  22,  38],                      //  7
    [  6,  24,  42],                      //  8
    [  6,  26,  46],                      //  9
    [  6,  28,  50],                      // 10
    [  6,  30,  54],                      // 11
    [  6,  32,  58],                      // 12
    [  6,  34,  62],                      // 13
    [  6,  26,  46,  66],                 // 14
    [  6,  26,  48,  70],                 // 15
    [  6,  26,  50,  74],                 // 16
    [  6,  30,  54,  78],                 // 17
    [  6,  30,  56,  82],                 // 18
    [  6,  30,  58,  86],                 // 19
    [  6,  34,  62,  90],                 // 20
    [  6,  28,  50,  72,  94],            // 21
    [  6,  26,  50,  74,  98],            // 22
    [  6,  30,  54,  78, 102],            // 23
    [  6,  28,  54,  80, 106],            // 24
    [  6,  32,  58,  84, 110],            // 25
    [  6,  30,  58,  86, 114],            // 26
    [  6,  34,  62,  90, 118],            // 27
    [  6,  26,  50,  74,  98, 122],       // 28
    [  6,  30,  54,  78, 102, 126],       // 29
    [  6,  26,  52,  78, 104, 130],       // 30
    [  6,  30,  56,  82, 108, 134],       // 31
    [  6,  34,  60,  86, 112, 138],       // 32
    [  6,  30,  58,  86, 114, 142],       // 33
    [  6,  34,  62,  90, 118, 146],       // 34
    [  6,  30,  54,  78, 102, 126, 150],  // 35
    [  6,  24,  50,  76, 102, 128, 154],  // 36
    [  6,  28,  54,  80, 106, 132, 158],  // 37
    [  6,  32,  58,  84, 110, 136, 162],  // 38
    [  6,  26,  54,  82, 110, 138, 166],  // 39
    [  6,  30,  58,  86, 114, 142, 170]   // 40
  ];

  // 形式情報
  format_info = [
  //          Level + Mask BCH 符号(マスク前)
    [0x77c4,   // L + 000  0x23d6
     0x72f3,   // L + 001  0x26e1
     0x7daa,   // L + 010  0x29b8
     0x789d,   // L + 011  0x2c8f
     0x662f,   // L + 100  0x323d
     0x6318,   // L + 101  0x370a
     0x6c41,   // L + 110  0x3853
     0x6976],  // L + 111  0x3d64
    [0x5412,   // M + 000  0x0000
     0x5125,   // M + 001  0x0537
     0x5e7c,   // M + 010  0x0a6e
     0x5b4b,   // M + 011  0x0f59
     0x45f9,   // M + 100  0x11eb
     0x40ce,   // M + 101  0x14dc
     0x4f97,   // M + 110  0x1b85
     0x4aa0],  // M + 111  0x1eb2
    [0x355f,   // Q + 000  0x614d
     0x3068,   // Q + 001  0x647a
     0x3f31,   // Q + 010  0x6b23
     0x3a06,   // Q + 011  0x6e14
     0x24b4,   // Q + 100  0x70a6
     0x2183,   // Q + 101  0x7591
     0x2eda,   // Q + 110  0x7ac8
     0x2bed],  // Q + 111  0x7fff
    [0x1689,   // H + 000  0x429b
     0x13be,   // H + 001  0x47ac
     0x1ce7,   // H + 010  0x48f5
     0x19d0,   // H + 011  0x4dc2
     0x0762,   // H + 100  0x5370
     0x0255,   // H + 101  0x5647
     0x0d0c,   // H + 110  0x591e
     0x083b]   // H + 111  0x5c29
  ];

  // 型番情報
  //                           型番
  version_info = [0x07c94,   //  7
                  0x085bc,   //  8
                  0x09a99,   //  9
                  0x0a4d3,   // 10
                  0x0bbf6,   // 11
                  0x0c762,   // 12
                  0x0d847,   // 13
                  0x0e60d,   // 14
                  0x0f928,   // 15
                  0x10b78,   // 16
                  0x1145d,   // 17
                  0x12a17,   // 18
                  0x13532,   // 19
                  0x149a6,   // 20
                  0x15683,   // 21
                  0x168c9,   // 22
                  0x177ec,   // 23
                  0x18ec4,   // 24
                  0x191e1,   // 25
                  0x1afab,   // 26
                  0x1b08e,   // 27
                  0x1cc1a,   // 28
                  0x1d33f,   // 29
                  0x1ed75,   // 30
                  0x1f250,   // 31
                  0x209d5,   // 32
                  0x216f0,   // 33
                  0x228ba,   // 34
                  0x2379f,   // 35
                  0x24b0b,   // 36
                  0x2542e,   // 37
                  0x26a64,   // 38
                  0x27541,   // 39
                  0x28c69];  // 40

  exp_n = new Array();  // α指数 → 数値 変換テーブル
  exp_n.length = 255;
  n_exp = new Array();  // 数値 → α指数 変換テーブル([0] は使用しない)
  n_exp.length = 256;
  // α指数 ― 数値 変換テーブル作成
  n = 0x01;
  for(i = 0; i < 255; i++) {
    exp_n[i] = n;
    n_exp[n] = i;

    n <<= 1;
    if(n & 0x100)
      n = n & 0xff ^ 0x1d;
  }

  module1 = new Array();  // シンボル領域
  module1.length = MAX_MOD;
  module2 = new Array();  // マスク後シンボル領域
  module2.length = MAX_MOD;
  for(i = 0; i < MAX_MOD; i++) {
    module1[i] = new Array();
    module1[i].length = MAX_MOD;
    module2[i] = new Array();
    module2[i].length = MAX_MOD;
  }

  shift_jis_init();  // シフト JIS 変換初期化

//-->
</SCRIPT>

</BODY>

</HTML>