        //read.cgiからのレスポンスをdatに変換 by mukiyu

        //メール欄デコード関数・・・もう呼ばなくしたので意味はない
        var email_decode = function (str){
                var s, r, c = "email-protection#"; //エンコードを示す目印              
                if (str.indexOf(c) == 0) {
                    str = str.substring(c.length, str.length); //エンコード部分を取り出す
                    s = '';
                    //以下はお約束（最初2バイトとそれ以降をxorを取る）
                    r = parseInt(str.substr(0, 2), 16);
                    for (var i = 2; str.length - i; i += 2) {
                        s += String.fromCharCode(parseInt(str.substr(i, 2), 16) ^ r);
                    }
                    return s;
                }else{
                    return str;
                }
        }

        if (!oSession["htmltodat"]) return;
        if (oSession.responseCode != 200) return;
        if (oSession.url.match(/(?:\.[25]ch\.net|\.bbspink\.com)(?:\:\d+)?\/test\/read/)) 
        {
            //gzip圧縮やチャンクエンコーディングがある場合にプレーンデータに変換
            oSession.utilDecodeResponse();
            //"text/html"を受け付けてくれないブラウザへの対応
            oSession.oResponse["Content-Type"] = "text/plain; charset=Shift_JIS";
            //以下1行はレスポンス内容を取得するお約束のようだ
            var oBody = oSession.GetResponseBodyAsString();
            //UTF8のサイトから取得するときは以下1行を使うのかな？文字化けするんで当面コメントアウト
            //oBody = System.Text.Encoding.UTF8.GetString(oSession.responseBodyBytes);
            //datが存在しないなどまっとうなレスポンスでない場合404を返して抜ける（ここはまだ要検討） v2.20でちょっと変更
            if (oBody.match(/<dl /)||oBody.match(/(<div|span) class="number">/)){
            }else{
                oSession.responseCode = 404;
                return;
            }   
            //スレのタイトルを取得
            var title = oBody.match(/<title.*?>(.*?)\s*?<\/title>/mi); //read.cgi 06対応、v2.25で read.cgi 07の仕様変更に対応

            //前後の不要な部分をカット（前処理）→bbspinkの新read.cgiではうまくいかないので冗長だが分岐のそれぞれに分けるよう変更（v2.15より）
            //oBody = oBody.replace(/^(.|\s)*?<(dl|div) class="thread".*?>\n?/, ""); //read.cgi 06対応
            //名前・メール欄内の余計なAタグ除去（前処理）
            oBody = oBody.replace(/(<b><a href="mailto:)(.+?)(<\/a><\/b>)/g, function(aStr, aTag1, aMailName, aTag2) {
                    var mailname = aMailName.replace(/<\/?a[^>]*?>/g, '');
                    return aTag1 + mailname + aTag2;
                });
            
            //メール欄デコードの前処理
            //oBody = oBody.replace(/(<a href=")\/cdn-cgi\/l\/(email-protection#.*?">)/ig,"$1mailto:$2");

            //htmltodat変換
            if (oBody.match(/<div class="number">/)){ //read.cgi 06用
                oBody = oBody.replace(/^(.|\s)*?<(dl|div) class="thread".*?>\n?/, ""); //前の不要な部分をカット
                oBody = oBody.replace(/<\/div><div class="cLength">(.|\s)*$/,""); //後ろの不要な部分をカット
                oBody = oBody.replace(/<div id="banner"[\s\S]*?(?=(<div class="post"|$))/,""); //バナー広告削除
                oBody = oBody.replace(/<\/div><div><div class="js--ad--bottom"[\s\S]*$/,""); //最終レス後の広告を削除
                // htmltodat変換メイン レス番号($1)は最終的なdatには必要ないが透明あぼーんのチェックのためここではデータに含めておく（v2.16より）
                oBody = oBody.replace(/<div class="post".*?><div class="number">(\d+).*?<\/div><div class="name"><b>(?:<a href="mailto:(.*?)">)?(.*?)(?:<\/a>)?<\/b><\/div><div class="date">(.*?)<\/div><div class="message">(.*?)<\/div><\/div>/ig,"$1<>$3<>$2<>$4<>$5<>\n");
                // BE周りの処理 若干他の場合とかぶってしまうが仕方ない 何かあったら合わせて修正する
                oBody = oBody.replace(/<\/div><div class="be .*?><a href=".*?\/\/be\.[25]ch\.net\/user\/(\d+).*?>\?(.*?)<\/a>/ig," BE:$1-$2");
                oBody = oBody.replace(/<img src=".*?\/\/(img\.[25]ch\.net\/.+?)">/ig,"sssp://$1");
                //oBody = oBody.replace(/<a href="http:\/\/jump\.2ch\.net.*?>(.*?)<\/a>/ig,"$1"); //これは必要か？後で検討
                // レスアンカーに対するフルパスを相対パスに変換（やらなくても問題ないかもしれないが一応昔の仕様に合わせる）→昔の仕様に戻ったようなのでコメントアウト
                //oBody = oBody.replace(/<a href="http:\/\/.*?\.2ch\.net\/(test\/read\.cgi\/.*?\/\d+\/\d+)/ig,"<a href=\"../$1");

            }else if (oBody.match(/<dl class="post".*?<span class="number">/)){ //bbspinkの新read.cgi用 v2.15より
                oBody = oBody.replace(/^(.|\s)*?<\/h1>/, ""); //前の不要な部分をカット                
                oBody = oBody.replace(/<\/section><div>(.|\s)*$/,""); //後ろの不要な部分をカット
                oBody = oBody.replace(/<\/section>.*?(?=<dl class="post")/,""); //バナー広告削除
                // htmltodat変換メイン
                oBody = oBody.replace(/<dl class="post".*?><dt class=""><span class="number">(\d+).*?<\/span><span class="name"><b>(?:<a href="mailto:(.*?)">)?(.*?)(?:<\/a>)?<\/b><\/span><span class="date">(.*?)<\/dt><dd class="thread_in">(.*?)<\/dd><\/dl>/ig,"$1<>$3<>$2<>$4<>$5<>\n");
                // 名前欄のfontタグ除去
                oBody = oBody.replace(/<font color="green">(.*?)<\/font>/ig,"$1");
                // BE周りの処理
                oBody = oBody.replace(/<\/span><div class="be .*?><a href=".*?\/\/be\.[25]ch\.net\/user\/(\d+).*?>\?(.*?)<\/a><\/div>/ig," BE:$1-$2");
                oBody = oBody.replace(/<\/span><>/ig,"<>"); // BE周り処理との絡みでゴミが残るので除去
                oBody = oBody.replace(/<img src=".*?\/\/(img\.[25]ch\.net\/.+?)">/ig,"sssp://$1");

            }else if (oBody.match(/<div class="post".*?<span class="number">/)){ //read.cgi 07用 v2.20より
                oBody = oBody.replace(/^(.|\s)*?<div class="thread">/, ""); //前の不要な部分をカット                
                oBody = oBody.replace(/(<\/div><div class="push">)?<\/div><div class="pagestats">(.|\s)*$/,""); //後ろの不要な部分をカット
                oBody = oBody.replace(/<\/div><div><div class="js--ad--bottom".*$/,""); //bbspinkの一部鯖がread.cgi 07系に移る際に追加されたバナー広告削除 v2.26より
                oBody = oBody.replace(/<div id="banner"[\s\S]*?(?=(<div class="post"|$))/,""); //バナー広告削除
                // htmltodat変換メイン
                oBody = oBody.replace(/<div class="post".*?><div class="meta"><span class="number">(\d+).*?<\/span><span class="name"><b>(?:<a href="mailto:(.*?)">)?(.*?)(?:<\/a>)?<\/b><\/span><span class="date">(.*?)<\/span><\/div><div class="message"><span class="escaped">(.*?)<\/span><\/div><\/div><br>/ig,"$1<>$3<>$2<>$4<>$5<>\n");
                // BE周りの処理
                oBody = oBody.replace(/<\/span><span class="be .*?><a href=".*?\/\/be\.[25]ch\.net\/user\/(\d+).*?>\?(.*?)<\/a>/ig," BE:$1-$2");
                oBody = oBody.replace(/<img src=".*?\/\/(img\.[25]ch\.net\/.+?)">/ig,"sssp://$1");
                //read.cgi 07.0.1 からIDの前に付くようになったタグを除去
                oBody = oBody.replace(/<\/span><span class="uid">/ig," ");

            }else{ //read.cgi 05用
                oBody = oBody.replace(/^(.|\s)*?<(dl|div) class="thread".*?>\n?/, ""); //前の不要な部分をカット
                oBody = oBody.replace(/(<\/dd>)?<\/dl>(.|\s)*$/,""); //後ろの不要な部分をカット
                oBody = oBody.replace(/<div.*? class="banner"[\s\S]*?(?=(<dt>|$))/,""); //バナー広告削除
                // htmltodat変換メイン
                oBody = oBody.replace(/<dt.*?>(\d+).+?(?:"mailto:(.+?)">)?<b>(.+?)<\/b>(?:<\/font>|<\/a>)\s?：(.*?)<dd>(.*?)<br><br>\n/ig,"$1<>$3<>$2<>$4<>$5<>\n");
                oBody = oBody.replace(/<a href=.?javascript:be\((.+)(?:,\d+)?\).*?>\?(.*?)<\/a>/ig,"BE:$1-$2");
                oBody = oBody.replace(/<img src=".*?\/\/(img\.[25]ch\.net\/.+?)">/ig,"sssp://$1");
            }
            // お絵かき機能やEmoticonのimgタグを除去。dat上では除去されてるのでそれに従ったがブラウザによってはなくてもいいかもしれない
            oBody = oBody.replace(/<img src=".*?(\/\/.*?)">/ig,"sssp:$1");
            //後処理
            //アンカータグ削除（レスアンカーに対するタグは削除しない）
            oBody = oBody.replace(/<a href="http.*?>(.*?)<\/a>/g,"$1");
            //半角スペースの連続を除去（read.cgiの挙動不審に対応）
            oBody = oBody.replace(/  +/g," ");
            

            //メール欄デコード処理・・・不要になったのでとりあえず削除
            /*var arr1 = oBody.split("\n"); //各行にばらす
            for (var i = 0; i < arr1.length; i++){
            if (arr1[i] == "") continue;
            var arr2 = arr1[i].split("<>"); //各フィールドにばらす
            arr2[1] = email_decode(arr2[1]); //メール欄を変換関数にかける
            arr1[i] = arr2.join("<>");
            }
            oBody = arr1.join("\n");*/

            // 透明あぼーんのチェック v2.16より
            var abnres = "透明あぼ～ん<>透明あぼ～ん<>透明あぼ～ん ID:DELETED<>透明あぼ～ん<>";
            var d = [], prev_resno = 0;
            var s = oBody.split("\n"); //各行にばらす
            for (var i=0; i<s.length; i++) {
                var resno = parseInt(s[i].replace(/^(\d+).+$/, "$1"),10);
                if ( resno == 0 ) continue;
                for ( ; resno - prev_resno > 1; prev_resno++ ) { d.push(abnres); } // レス番号が飛んでいるとき透明あぼーんレスの挿入
                s[i] = s[i].replace(/^.+?<>(.+)$/, "$1"); // 最終的なdatにレス番号は必要ないのでここで削除
                d.push(s[i]);
                prev_resno = resno;
            }
            oBody = d.join("\n");

            //変換後の１レス目にタイトルを付加 もともと後処理の位置でやっていたがレス番0を削除する処理を入れてしまったのでその後にやらないとまずい v2.17より
            oBody = oBody.replace(/^(.*?<>.*?<>.*?<>.*?<>$)/m,"$1" + title[1]);

            //差分取得処理・・・http://anago.2ch.net/test/read.cgi/software/1424147714/19さんのほぼパクリ
            var hm;
            oBody = System.Text.Encoding.GetEncoding("shift-jis").GetBytes(oBody);
            if (oSession["HeaderRange"] && (hm = oSession["HeaderRange"].match(/bytes=(\d+)-/))) {
                var bodylength = oBody.length;
                var sbyte = parseInt(hm[1], 10);
                //FiddlerObject.log(sbyte+"/"+bodylength);
                  
                if (sbyte == bodylength) {
                    oSession.responseCode = 304;
                    oSession.oResponse.headers.Remove("Content-Type");
                    oSession.ResponseBody = [];
                    return;
                } else
                    if (sbyte > bodylength){
                    oSession.responseCode = 416;
                    oSession.oResponse.headers.Remove("Content-Type");
                    oSession.ResponseBody = [];
                    return;
                } else {
                    oSession.responseCode = 206;
                    oBody = oBody.slice(sbyte);
                    oSession.oResponse.headers("Content-Range") = "bytes " + sbyte + "-" + (bodylength - 1) + "/" + bodylength;
                }
            }

            //以下1行もレスポンス内容を弄った結果を返すお約束のようだ（Content-Lengthとかをいい感じに修正してくれるんだと思う）
            //oSession.utilSetResponseBody(oBody);
            // SJISへの変換を自力でやる場合は以下を使わないとサイズが合わなくなる
            oSession.ResponseBody = oBody;

            //ブラウザによってはLast-Modifiedヘッダがないと不都合が起きるのでその対応
            if (!oSession.oResponse["Last-Modified"])
                oSession.oResponse["Last-Modified"] = oSession.oResponse["Date"];
        }
        //ここまで
