text: /*
   * @project: TERA
   * @version: Development (beta)
   * @license: MIT (not for evil)
   * @copyright: Yuriy Ivanov (Vtools) 2017-2019 [progr76@gmail.com]
   * Web: https://terafoundation.org
   * Twitter: https://twitter.com/terafoundation
   * Telegram:  https://t.me/terafoundation
  */
  
  global.PROCESS_NAME = "POW";
  global.POWPROCESS = 1;
  require("../core/library");
  require("../core/crypto-library");
  require("../core/terahashmining");
  var PROCESS = process;
  if(process.send && !global.DEBUGPROCESS)
  {
      process.send({cmd:"online", message:"OK"});
  }
  else
  {
      PROCESS = global.DEBUGPROCESS;
  }
  var LastAlive = Date.now();
  setInterval(CheckAlive, 1000);
  var idInterval = undefined;
  var Block = {};
  PROCESS.on('message', function (msg)
  {
      LastAlive = Date.now();
      if(msg.cmd === "FastCalcBlock")
      {
          var FastBlock = msg;
          StartHashPump(FastBlock);
          FastBlock.RunCount = 0;
          try
          {
              if(CreatePOWVersionX(FastBlock))
                  process.send({cmd:"POW", BlockNum:FastBlock.BlockNum, SeqHash:FastBlock.SeqHash, Hash:FastBlock.Hash, PowHash:FastBlock.PowHash,
                      AddrHash:FastBlock.AddrHash, Num:FastBlock.Num});
          }
          catch(e)
          {
              ToError(e);
          }
      }
      else
          if(msg.cmd === "Alive")
          {
          }
          else
              if(msg.cmd === "Exit")
              {
                  PROCESS.exit(0);
              }
  }
  );
  function CheckAlive()
  {
      if(global.NOALIVE)
          return ;
      var Delta = Date.now() - LastAlive;
      if(Math.abs(Delta) > CHECK_STOP_CHILD_PROCESS)
      {
          PROCESS.exit(0);
          return ;
      }
  }
  function CalcPOWHash()
  {
      if(!Block.SeqHash)
          return ;
      if(new Date() - Block.Time > Block.Period)
      {
          clearInterval(idInterval);
          idInterval = undefined;
          return ;
      }
      try
      {
          if(CreatePOWVersionX(Block))
              process.send({cmd:"POW", BlockNum:Block.BlockNum, SeqHash:Block.SeqHash, Hash:Block.Hash, PowHash:Block.PowHash, AddrHash:Block.AddrHash,
                  Num:Block.Num});
      }
      catch(e)
      {
          ToError(e);
      }
  }
  global.BlockPump = undefined;
  var idIntervalPump = undefined;
  function StartHashPump(SetBlock)
  {
      if(!BlockPump || BlockPump.BlockNum < SetBlock.BlockNum || BlockPump.MinerID !== SetBlock.MinerID || BlockPump.Percent !== SetBlock.Percent)
      {
          global.BlockPump = {BlockNum:SetBlock.BlockNum, RunCount:SetBlock.RunCount, MinerID:SetBlock.MinerID, Percent:SetBlock.Percent,
              LastNonce:0, };
      }
      if(!idIntervalPump)
      {
          idIntervalPump = setInterval(PumpHash, global.POWRunPeriod);
      }
  }
  var StartTime = 1;
  var EndTime = 0;
  function PumpHash()
  {
      if(!BlockPump)
          return ;
      var CurTime = Date.now();
      if(StartTime > EndTime)
      {
          var Delta = CurTime - StartTime;
          var PeriodPercent = 100 * Delta / CONSENSUS_PERIOD_TIME;
          if(PeriodPercent >= BlockPump.Percent)
          {
              EndTime = CurTime;
              return ;
          }
          CreatePOWVersionX(BlockPump, 1);
      }
      else
      {
          var Delta = CurTime - EndTime;
          var PeriodPercent = 100 * Delta / CONSENSUS_PERIOD_TIME;
          if(PeriodPercent > 100 - BlockPump.Percent)
          {
              StartTime = CurTime;
          }
      }
  }
  