Exemple #1
0
 public ChaseHokan(numTaskInfo nti, int lastSegmentNo, string[] name,
                   string lvid, RecordingManager rm, Html5Recorder h5r)
 {
     this.nti           = nti;
     this.lastSegmentNo = lastSegmentNo;
     this.name          = name;
     this.lvid          = lvid;
     this.rm            = rm;
     this.h5r           = h5r;
 }
Exemple #2
0
        public DropSegmentProcess(DateTime _lastWroteSegmentDt, int _lastSegmentNo, Record rec, string recFolderFileOrigin, RecordFromUrl rfu, RecordingManager rm, Html5Recorder h5r)
        {
//			this.nti = s;
            this.lastWroteSegmentDt = _lastWroteSegmentDt;
            this.lastSegmentNo      = _lastSegmentNo;
            this.rec = rec;
            this.recFolderFileOrigin = recFolderFileOrigin;
            this.rfu = rfu;
            this.rm  = rm;
            this.h5r = h5r;
        }
Exemple #3
0
        WebSocketRecorder getWebsocketRecorder(string res)
        {
            try {
                var data = util.getRegGroup(res, "<script id=\"embedded-data\" data-props=\"([\\d\\D]+?)</script>");
                if (data == null)
                {
                    return(null);
                }
                data = System.Web.HttpUtility.HtmlDecode(data);
                var type             = util.getRegGroup(res, "\"content_type\":\"(.+?)\"");
                var webSocketRecInfo = Html5Recorder.getWebSocketInfo(data, false, true, true, rm.form, h5r.isFmp4);
                if (webSocketRecInfo == null)
                {
                    return(null);
                }


                //var a = recFolderFileInfo;
                //var segmentSaveType = rm.cfg.get("segmentSaveType");
                //var lastFile = util.getLastTimeshiftFileName(
                //	recFolderFileInfo[0], recFolderFileInfo[1], recFolderFileInfo[2], recFolderFileInfo[3], recFolderFileInfo[4], recFolderFileInfo[5], rm.cfg, openTime);
                //util.debugWriteLine("timeshift lastfile " + lastFile);
                //string[] lastFileTime = util.getLastTimeShiftFileTime(lastFile, segmentSaveType);
                //if (lastFileTime == null)
                //	util.debugWriteLine("timeshift lastfiletime " +
                //	                    ((lastFileTime == null) ? "null" : string.Join(" ", lastFileTime)));
                var n = nti;
                var lastWroteSecondsAgo = (int)(((TimeSpan)(DateTime.Now - nti.dt)).TotalSeconds + (int)((nti.no - lastSegmentNo) * nti.second) + 25) * -1;
                var endSecondsAgo       = (int)(((TimeSpan)(DateTime.Now - nti.dt)).TotalSeconds - 15) * -1;
                var tsConfig            = new TimeShiftConfig(0, 0, 0, lastWroteSecondsAgo, 0, 0, endSecondsAgo, false, false, "", false, 0, false, false, 1, 1, false, false, false);
                var recFolderFile       = new string[] { h5r.recFolderFile[0], name[1], null };

                /*
                 * var	recFolderFile = util.getRecFolderFilePath(recFolderFileInfo[0], recFolderFileInfo[1], recFolderFileInfo[2], recFolderFileInfo[3], recFolderFileInfo[4], recFolderFileInfo[5], rm.cfg, true, tsConfig, openTime, false);
                 * if (recFolderFile == null || recFolderFile[0] == null) {
                 *      //パスが長すぎ
                 *      rm.form.addLogText("パスに問題があります。 " + recFolderFile[1]);
                 *      util.debugWriteLine("too long path? " + recFolderFile[1]);
                 *      return null;
                 * }
                 */

                var userId    = util.getRegGroup(res, "\"user\"\\:\\{\"user_id\"\\:(.+?),");
                var isPremium = res.IndexOf("\"member_status\":\"premium\"") > -1;
                return(new WebSocketRecorder(webSocketRecInfo, container, recFolderFile, rm, rm.rfu, h5r, 0, true, lvid, tsConfig, userId, isPremium, TimeSpan.MaxValue, type, 0, false, false, true, false, false, null, 0));
            } catch (Exception e) {
                util.debugWriteLine(e.Message + e.Source + e.StackTrace + e.TargetSite);
                return(null);
            }
        }
 public ChaseLastRecord(string lvid,
                        CookieContainer container, RecordingManager rm,
                        string[] recFolderFileInfo, long openTime,
                        Html5Recorder h5r, TimeShiftConfig tsConfig, RecordFromUrl rfu)
 {
     this.lvid              = lvid;
     this.container         = container;
     this.rm                = rm;
     this.recFolderFileInfo = recFolderFileInfo;
     this.openTime          = openTime;
     this.h5r               = h5r;
     this.tsConfig          = tsConfig;
     this.rfu               = rfu;
 }
Exemple #5
0
        WebSocketRecorder getWebsocketRecorder(string res)
        {
            try {
                var data = util.getRegGroup(res, "<script id=\"embedded-data\" data-props=\"([\\d\\D]+?)</script>");
                if (data == null)
                {
                    return(null);
                }
                data = System.Web.HttpUtility.HtmlDecode(data);
                var type             = util.getRegGroup(res, "\"content_type\":\"(.+?)\"");
                var webSocketRecInfo = Html5Recorder.getWebSocketInfo(data, false, false, true, rm.form, h5r.isFmp4);
                if (webSocketRecInfo == null)
                {
                    return(null);
                }

                //var a = recFolderFileInfo;
                var segmentSaveType = rm.cfg.get("segmentSaveType");
                var lastFile        = util.getLastTimeshiftFileName(
                    recFolderFileInfo[0], recFolderFileInfo[1], recFolderFileInfo[2], recFolderFileInfo[3], recFolderFileInfo[4], recFolderFileInfo[5], rm.cfg, openTime, h5r.isFmp4);
                util.debugWriteLine("timeshift lastfile " + lastFile);
                string[] lastFileTime = util.getLastTimeShiftFileTime(lastFile, segmentSaveType, h5r.isFmp4);
                if (lastFileTime == null)
                {
                    util.debugWriteLine("timeshift lastfiletime " +
                                        ((lastFileTime == null) ? "null" : string.Join(" ", lastFileTime)));
                }
                var tsConfig = new TimeShiftConfig(1, int.Parse(lastFileTime[0]), int.Parse(lastFileTime[1]), int.Parse(lastFileTime[2]), 0, 0, 0, true, false, "", false, 0, false, false, 2, 0, false, false, this.tsConfig.isDeletePosTime);
                tsConfig.endTimeMode    = this.tsConfig.endTimeMode;
                tsConfig.endTimeSeconds = this.tsConfig.endTimeSeconds;
                tsConfig.lastSegmentNo  = lastSegmentNo;
                var recFolderFile = util.getRecFolderFilePath(recFolderFileInfo[0], recFolderFileInfo[1], recFolderFileInfo[2], recFolderFileInfo[3], recFolderFileInfo[4], recFolderFileInfo[5], rm.cfg, true, tsConfig, openTime, false, h5r.isFmp4);
                if (recFolderFile == null || recFolderFile[0] == null)
                {
                    //パスが長すぎ
                    rm.form.addLogText("パスに問題があります。 " + recFolderFile[1]);
                    util.debugWriteLine("too long path? " + recFolderFile[1]);
                    return(null);
                }

                var userId    = util.getRegGroup(res, "\"user\"\\:\\{\"user_id\"\\:(.+?),");
                var isPremium = res.IndexOf("\"member_status\":\"premium\"") > -1;
                return(new WebSocketRecorder(webSocketRecInfo, container, recFolderFile, rm, rm.rfu, h5r, openTime, true, lvid, tsConfig, userId, isPremium, TimeSpan.MaxValue, type, openTime, false, false, false, false, false, null, 0));
            } catch (Exception e) {
                util.debugWriteLine(e.Message + e.Source + e.StackTrace + e.TargetSite);
                return(null);
            }
        }
Exemple #6
0
        public WebSocketRecorder(string[] webSocketInfo,
                                 CookieContainer container, string[] recFolderFile,
                                 RecordingManager rm, RecordFromUrl rfu,
                                 Html5Recorder h5r, long openTime,
                                 int lastSegmentNo, bool isTimeShift, string lvid,
                                 TimeShiftConfig tsConfig, string userId,
                                 bool isPremium, TimeSpan programTime,
                                 string programType, long _openTime, bool isSub, bool isRtmp,
                                 string latency
                                 )
        {
            this.webSocketInfo = webSocketInfo;
            this.container     = container;
            this.recFolderFile = recFolderFile;
            this.rm            = rm;
            this.rfu           = rfu;
            this.h5r           = h5r;
            this.openTime      = openTime;
            this.lastSegmentNo = lastSegmentNo;
            this.isTimeShift   = isTimeShift;
            this.lvid          = lvid;
            this.tsConfig      = tsConfig;
            this.userId        = userId;
            this.isPremium     = isPremium;
            this.programTime   = programTime;
            isJikken           = false;
            this.programType   = programType;
            this._openTime     = _openTime;
            this.isSub         = isSub;
            this.isRtmp        = isRtmp;

            this.qualityRank     = rm.cfg.get("qualityRank");
            this.isGetComment    = rm.cfg.get("IsgetComment");
            this.isGetCommentXml = rm.cfg.get("IsgetcommentXml");
            this.engineMode      = rm.cfg.get("EngineMode");
            selectLatency        = latency;
        }
Exemple #7
0
        private int _rec(string url)
        {
            JikkenRecorder jr = null;
            //RtmpRecorder rr = null;
            var             isRtmp = isRtmpMain;
            CookieContainer cc;

            var pageType = this.getPageType(url, true, ref jr, out cc);

            if (pageType == -1)
            {
                return(2);
            }

            util.debugWriteLine("pagetype " + pageType + " container " + cc);
            if (cc == null || cc == null)
            {
                rm.form.addLogText("ログインに失敗しました。");
                if (bool.Parse(rm.cfg.get("IsmessageBox")) && util.isShowWindow)
                {
                    rm.form.formAction(() =>
                                       MessageBox.Show("ログインに失敗しました。\n" + lvid, "", MessageBoxButtons.OK, MessageBoxIcon.None), false);
                }
                if (bool.Parse(rm.cfg.get("IsfailExit")))
                {
                    rm.rfu = null;
                    rm.form.close();
                }
                return(2);
            }

            util.debugWriteLine("pagetype " + pageType);

            while (this == rm.rfu)
            {
                util.debugWriteLine("pagetype " + pageType);
                if (pageType == 0 || pageType == 7)
                {
                    var isJikken  = res.IndexOf("siteId&quot;:&quot;nicocas") > -1;
                    int recResult = 0;

                    if (isPlayOnlyMode && pageType == 7 && isRtmp)
                    {
                        isRtmp = false;
                    }

                    if (isJikken)
                    {
                        //実験放送 なくし
                        //recResult = jr.record(res, isRtmp);
                    }
                    else
                    {
                        var isTimeShift = pageType == 7;

                        h5r       = new Html5Recorder(url, cc, lvid, rm, this, isTimeShift);
                        recResult = h5r.record(res, isRtmp, pageType);
                    }

                    util.debugWriteLine("recresult " + recResult);
                    return(recResult);
                }
                else if (pageType == 1)
                {
                    rm.form.addLogText("満員です。");
                    if (bool.Parse(rm.cfg.get("Isretry")))
                    {
                        System.Threading.Thread.Sleep(10000);

                        while (this == rm.rfu)
                        {
                            try {
                                res      = util.getPageSource(url, cc);
                                isJikken = res.IndexOf("siteId&quot;:&quot;nicocas") > -1;
                                //var _pageType = (isJikken) ? getJikkenPageType(res, out jr, cc) : util.getPageType(res);
                                var _pageType = (isJikken) ? 0 : util.getPageType(res);
                                util.debugWriteLine(_pageType);
                                if (pageType != 1)
                                {
                                    continue;
                                }

                                System.Threading.Thread.Sleep(5000);
                            } catch (Exception e) {
                                util.debugWriteLine(e.Message + " " + e.StackTrace + " ");
                            }
                        }
                        continue;
                    }
                    else
                    {
                        return(2);
                    }
                }
                else if (pageType == 5)
                {
                    if (bool.Parse(rm.cfg.get("Isretry")))
                    {
                        rm.form.addLogText("接続エラー。10秒後リトライします。");
                        System.Threading.Thread.Sleep(10000);

                        try {
                            pageType = getPageType(url, false, ref jr, out cc);
                            util.debugWriteLine("pagetype_ " + pageType);
                        } catch (Exception e) {
                            util.debugWriteLine(e.Message + " " + e.StackTrace + " ");
                        }
                        continue;
                    }
                    else
                    {
                        rm.form.addLogText("接続エラー");
                        return(2);
                    }
                }
                else if (pageType == 6)
                {
                    util.debugWriteLine("pagetype 6 process");
                    System.Threading.Thread.Sleep(3000);
                    try {
                        pageType = getPageType(url, false, ref jr, out cc);
                        util.debugWriteLine("pagetype_ " + pageType);
                    } catch (Exception e) {
                        util.debugWriteLine(e.Message + " " + e.StackTrace + " ");
                        rm.form.addLogText(e.Message + " " + e.StackTrace + " ");
                    }
                    continue;
                }
                else if (pageType == 4)
                {
                    rm.form.addLogText("require_community_member");

                    util.debugWriteLine(rm.cfg.get("IsautoFollowComgen"));
                    if (bool.Parse(rm.cfg.get("IsautoFollowComgen")))
                    {
                        var isFollow = new FollowCommunity().followCommunity(res, cc, rm.form, rm.cfg, isPlayOnlyMode);
                        util.debugWriteLine("isfollow " + isFollow);
                        if (isFollow)
                        {
                            pageType = getPageAfterFollow(url, lvid, ref jr, out cc);
                            util.debugWriteLine("pagetype_ " + pageType);
                            continue;
                        }
                    }
                    if (bool.Parse(rm.cfg.get("IsmessageBox")) && util.isShowWindow)
                    {
                        var ret = rm.form.formAction(() =>
                                                     MessageBox.Show("コミュニティに入る必要があります:\nrequire_community_member/" + lvid, "", MessageBoxButtons.OK, MessageBoxIcon.None), false);
                        if (!ret)
                        {
                            return(2);
                        }
                    }
                    if (bool.Parse(rm.cfg.get("IsfailExit")))
                    {
                        rm.rfu = null;
                        rm.form.close();
                    }
                    return(2);
                }
                else if (pageType == 8)
                {
                    rm.form.addLogText("この番組の視聴にはシリアル番号が必要です。");
                    return(2);
                }
                else if (pageType == 9)
                {
                    rm.form.addLogText("この番組の視聴には予約が必要です。");

                    DialogResult isYoyakuRes    = DialogResult.None;
                    var          reserveMessage = rm.cfg.get("reserveMessage");
                    if (reserveMessage != "ダイアログで確認")
                    {
                        isYoyakuRes = reserveMessage == "常に予約する" ? DialogResult.Yes : DialogResult.No;
                    }
                    else
                    {
                        rm.form.formAction(() => {
                            isYoyakuRes = MessageBox.Show(rm.form, "この番組の視聴には予約が必要です。予約しますか?", "", MessageBoxButtons.YesNo);
                        }, false);
                    }
                    if (isYoyakuRes == DialogResult.No)
                    {
                        return(2);
                    }


                    var r = new Reservation(cc, lvid);
                    //var reserveRet = r.reserve();
                    var reserveRet = r.live2Reserve();
                    if (reserveRet == "ok")
                    {
                        rm.form.addLogText("予約しました");
                        pageType = getPageType(url, false, ref jr, out cc);
                        continue;
                    }
                    else
                    {
                        rm.form.addLogText(reserveRet);
                        rm.form.addLogText("予約できませんでした");
                        if (reserveRet == "予約リストが一杯です。")
                        {
                            //DialogResult isOpenMypageRes = DialogResult.None;
                            rm.form.formAction(() => {
                                var isOpenMypageRes = MessageBox.Show(rm.form, "予約リストが一杯です。マイページを開きますか?", "", MessageBoxButtons.YesNo);
                                if (isOpenMypageRes == DialogResult.Yes)
                                {
                                    System.Diagnostics.Process.Start("https://live.nicovideo.jp/my");
                                }
                            }, false);
                        }
                        return(2);
                    }
                }
                else if (pageType == 10)
                {
                    var r = new Reservation(cc, lvid).useLive2Reserve();
                    if (!r)
                    {
                        rm.form.addLogText("この番組のチケットを正常に使用できませんでした。");
                        return(2);
                    }
                    pageType = getPageType(url, false, ref jr, out cc);
                    util.debugWriteLine("pagetype 10_ " + pageType);
                    continue;
                }
                else if (pageType == 11)
                {
                    rm.form.addLogText("この番組は有料チケットが必要です。");
                    return(2);
                }
                else
                {
                    var mes = "";
                    if (pageType == 2 || pageType == 3)
                    {
                        mes = "この放送は終了しています。";
                    }
                    rm.form.addLogText(mes);
                    util.debugWriteLine("pagetype " + pageType + " 終了");

                    if (bool.Parse(rm.cfg.get("IsdeleteExit")))
                    {
                        rm.rfu = null;
                        rm.form.close();
                    }
                    return(2);
                }
            }
            return(2);
        }
Exemple #8
0
        private int _rec(string url, bool isSub)
        {
            JikkenRecorder  jr     = null;
            RtmpRecorder    rr     = null;
            var             isRtmp = !isSubAccountHokan && (isRtmpMain || isSub);
            CookieContainer cc     = null;

            var pageType = wssUrl == null?
                           this.getPageType(url, true, isSub, ref jr, out cc) :
                               0;

            container = cc;
            if (pageType == -2 && isSub)
            {
                return(2);
            }
            if (pageType == -1)
            {
                return(2);
            }

            //var ccInd = (isSub) ? 1 : 0;
            var ccInd = 0;

            util.debugWriteLine("pagetype " + pageType + " container " + cc + " isSub " + isSub);
            if ((cc == null || cc == null) && wssUrl == null)
            {
                rm.form.addLogText("ログインに失敗しました。");
                if (bool.Parse(rm.cfg.get("IsmessageBox")) && util.isShowWindow)
                {
                    if (rm.form.IsDisposed)
                    {
                        return(2);
                    }
                    try {
                        rm.form.Invoke((MethodInvoker) delegate() {
                            MessageBox.Show("ログインに失敗しました。(" + util.getMainSubStr(isSub) + ")\n" + lvid, "", MessageBoxButtons.OK, MessageBoxIcon.None);
                        });
                    } catch (Exception e) {
                        util.debugWriteLine(e.Message + " " + e.StackTrace + " " + e.Source + " " + e.TargetSite);
                    }
                }
                if (bool.Parse(rm.cfg.get("IsfailExit")) && false)
                {
                    rm.rfu = null;
                    if (util.isShowWindow)
                    {
                        try {
                            rm.form.Invoke((MethodInvoker) delegate() {
                                try { rm.form.Close(); }
                                catch (Exception e) {
                                    util.debugWriteLine(e.Message + " " + e.StackTrace + " " + e.Source + " " + e.TargetSite);
                                }
                            });
                        } catch (Exception e) {
                            util.debugWriteLine(e.Message + " " + e.StackTrace + " " + e.Source + " " + e.TargetSite);
                        }
                    }
                }

                return(2);
            }

            util.debugWriteLine("pagetype " + pageType);

            while (true && this == rm.rfu)
            {
                util.debugWriteLine("pagetype " + pageType);
                if (pageType == 0 || pageType == 7)
                {
                    if (wssUrl != null)
                    {
                        res = "";
                    }
                    var isJikken  = res.IndexOf("siteId&quot;:&quot;nicocas") > -1;
                    int recResult = 0;

                    if (rm.isPlayOnlyMode && pageType == 7 && isRtmp)
                    {
                        isRtmp = false;
                    }

                    if (isJikken)
                    {
                        if (!jr.isLive && isSub)
                        {
                            return(2);
                        }
                        recResult = jr.record(res, isRtmp);
                    }
                    else
                    {
                        var isTimeShift = pageType == 7;
                        if (isTimeShift && isSub)
                        {
                            return(2);
                        }

                        var h5r = new Html5Recorder(url, cc, lvid, rm, this, isTimeShift, isSub);
                        recResult = h5r.record(res, isRtmp, pageType);
                    }

                    util.debugWriteLine("recresult " + recResult);
                    return(recResult);
                }
                else if (pageType == 1)
                {
                    rm.form.addLogText("満員です。");
                    if (bool.Parse(rm.cfg.get("Isretry")))
                    {
                        System.Threading.Thread.Sleep(10000);

                        while (this == rm.rfu)
                        {
                            try {
                                var wc = new WebHeaderCollection();
                                res = util.getPageSource(url, ref wc, cc);

                                isJikken = res.IndexOf("siteId&quot;:&quot;nicocas") > -1;
                                var _pageType = (isJikken) ? getJikkenPageType(res, isSub, out jr, cc) : util.getPageType(res);
                                util.debugWriteLine(_pageType);
                                if (pageType != 1)
                                {
                                    continue;
                                }

                                System.Threading.Thread.Sleep(5000);
                            } catch (Exception e) {
                                util.debugWriteLine(e.Message + " " + e.StackTrace + " ");
                            }
                        }

                        continue;
                    }
                    else
                    {
                        return(2);
                    }
                }
                else if (pageType == 5)
                {
                    if (bool.Parse(rm.cfg.get("Isretry")))
                    {
                        rm.form.addLogText("接続エラー。10秒後リトライします。");
                        System.Threading.Thread.Sleep(10000);

                        try {
//							var wc = new WebHeaderCollection();
//							res = util.getPageSource(url, ref wc, container);
//							pageType = util.getPageType(res);
                            pageType  = getPageType(url, false, isSub, ref jr, out cc);
                            container = cc;
                            util.debugWriteLine("pagetype_ " + pageType);
                        } catch (Exception e) {
                            util.debugWriteLine(e.Message + " " + e.StackTrace + " ");
//							rm.form.addLogText(e.Message + " " + e.StackTrace + " ");
                        }
                        continue;
                    }
                    else
                    {
                        rm.form.addLogText("接続エラー");
                        return(2);
                    }
                }
                else if (pageType == 6)
                {
                    util.debugWriteLine("pagetype6process");
                    System.Threading.Thread.Sleep(3000);
                    try {
                        pageType  = getPageType(url, false, isSub, ref jr, out cc);
                        container = cc;
                        util.debugWriteLine("pagetype_ " + pageType);
                    } catch (Exception e) {
                        util.debugWriteLine(e.Message + " " + e.StackTrace + " ");
                        rm.form.addLogText(e.Message + " " + e.StackTrace + " ");
                    }
                    continue;
                }
                else if (pageType == 4)
                {
                    rm.form.addLogText("require_community_menber");
//					rm.form.addLogText(res);


                    if (true && false)
                    {
                        rm.rfu = null;
                        if (util.isShowWindow)
                        {
                            try {
                                rm.form.Invoke((MethodInvoker) delegate() {
                                    try { rm.form.Close(); }
                                    catch (Exception e) {
                                        util.debugWriteLine(e.Message + " " + e.StackTrace + " " + e.Source + " " + e.TargetSite);
                                    }
                                });
                            } catch (Exception e) {
                                util.debugWriteLine(e.Message + " " + e.StackTrace + " " + e.Source + " " + e.TargetSite);
                            }
                        }
                    }
                    return(2);
                }
                else if (pageType == 8)
                {
                    rm.form.addLogText("この番組の視聴にはシリアル番号が必要です。");
                    return(2);
                }
                else if (pageType == 9)
                {
                    if (isSub)
                    {
                        return(2);
                    }

                    rm.form.addLogText("この番組の視聴には予約が必要です。");
                    return(2);
                }
                else
                {
                    var mes = "";
                    if (pageType == 2)
                    {
                        mes = "この放送は終了しています。";
                    }
                    if (pageType == 3)
                    {
                        mes = "この放送は終了しています。";
                    }
                    if (pageType == 7)
                    {
                        mes = "この放送は終了しています。";
                    }
                    rm.form.addLogText(mes);
                    util.debugWriteLine("pagetype " + pageType + " 終了");

                    if (bool.Parse(rm.cfg.get("IsdeleteExit")) && false)
                    {
                        rm.rfu = null;
                        if (util.isShowWindow)
                        {
                            try {
                                rm.form.Invoke((MethodInvoker) delegate() {
                                    try { rm.form.Close(); }
                                    catch (Exception e) {
                                        util.debugWriteLine(e.Message + " " + e.StackTrace + " " + e.Source + " " + e.TargetSite);
                                    }
                                });
                            } catch (Exception e) {
                                util.debugWriteLine(e.Message + " " + e.StackTrace + " " + e.Source + " " + e.TargetSite);
                            }
                        }
                    }
                    return(2);
                    //var nh5r = new NotHtml5Recorder(url, container, lvid, rm, this);
                    //nh5r.record(res);
                }
            }
            return(2);
        }