public bool CheckStage(modelSpiderSiteRecord wRecord, spiderObjectiveSolutionSet oSet, spiderTask task)
        {
            bool okToLeave = false;

            if (task.Count() == 0)
            {
                wRecord.logBuilder.log("> Spider task [i:" + task.iteration + "] have no tasks defined. Aborting the stage loop.");
                okToLeave = true;
                return(okToLeave);
            }

            // <----------------------------- OBJECTIVE SOLUTION SET
            okToLeave = operation_executeObjectiveSolutionSet(oSet, wRecord);
            if (okToLeave)
            {
                return(okToLeave);
            }

            // <----------------------------- SPIDER LIMITS OVERRIDERS ---------------|
            if (stageIteration > wRecord.tRecord.instance.settings.limitIterations)
            {
                wRecord.log("> Spider settings (limit iterations) trigered abort at [" + stageIteration + "] Aborting the stage loop.");
                okToLeave = true;
                return(okToLeave);
            }
            // <----------------------------------------------------------------------|

            // <----------------------------- SPIDER LIMITS OVERRIDERS ---------------|
            if (wRecord.web.webPages.Count() > wRecord.tRecord.instance.settings.limitTotalPageLoad)
            {
                wRecord.log("> Spider settings (limit pages load) trigered abort at [" + wRecord.web.webPages.Count() + "] Aborting the stage loop.");
                okToLeave = true;
                return(okToLeave);
            }
            // <----------------------------------------------------------------------|



            if (stageIteration > stageIterationLimit)
            {
                wRecord.logBuilder.log("> Stage [" + name + "] iteration limit reached [ " + stageIterationLimit + " ] -- aborting [" + objectives.Count + "] objectives and move on");
                okToLeave = true;
                return(okToLeave);
            }

            if (stageIteration > GLOBAL_stageIterationLimit)
            {
                Exception ex = new aceGeneralException("spiderStage [" + name + "] reached the " + nameof(GLOBAL_stageIterationLimit) + "(" + GLOBAL_stageIterationLimit.ToString() + ")");
                throw ex;
            }

            stageIteration++;



            return(okToLeave);
        }
        public bool operation_executeObjectiveSolutionSet(spiderObjectiveSolutionSet solutionSet, modelSpiderSiteRecord wRecord)
        {
            bool leave = false;

            foreach (spiderObjectiveSolution sol in solutionSet)
            {
                if (sol.status != spiderObjectiveStatus.unknown)
                {
                    switch (sol.type)
                    {
                    case spiderObjectiveType.dropOutControl:

                        break;

                    case spiderObjectiveType.flowControl:

                        List <spiderObjectiveEnum> targets = sol.targetedObjective.getEnumListFromFlags <spiderObjectiveEnum>();
                        foreach (spiderObjectiveEnum target in targets)
                        {
                            spiderObjective selObjective = objectives.FirstOrDefault <spiderObjective>(x => x.tag == target);
                            if (selObjective != null)
                            {
                                resolveObjective(selObjective, sol, wRecord);
                            }
                        }
                        break;
                    }
                }
            }

            leave = true;

            foreach (spiderObjective obj in objectives)
            {
                if (obj.status == spiderObjectiveStatus.notSolved)
                {
                    leave = false;
                }
            }
            if (leave)
            {
                wRecord.logBuilder.log("All objectives solved/avoided/aborted. Leaving the stage [" + name + "]");
            }

            return(leave);
        }