diff -ruNa p7zip_9.20.1/CPP/7zip/Archive/Rar/RarHandler.cpp p7zip-libre_9.20.1/CPP/7zip/Archive/Rar/RarHandler.cpp
--- p7zip_9.20.1/CPP/7zip/Archive/Rar/RarHandler.cpp	2011-01-08 06:41:37.000000000 -0300
+++ p7zip-libre_9.20.1/CPP/7zip/Archive/Rar/RarHandler.cpp	1969-12-31 21:00:00.000000000 -0300
@@ -1,869 +0,0 @@
-// RarHandler.cpp
-
-#include "StdAfx.h"
-
-#include "Common/ComTry.h"
-#include "Common/IntToString.h"
-#include "Common/StringConvert.h"
-
-#include "Windows/PropVariant.h"
-#include "Windows/PropVariantUtils.h"
-#include "Windows/Time.h"
-
-#include "../../IPassword.h"
-
-#include "../../Common/CreateCoder.h"
-#include "../../Common/FilterCoder.h"
-#include "../../Common/MethodId.h"
-#include "../../Common/ProgressUtils.h"
-
-#include "../../Compress/CopyCoder.h"
-
-#include "../../Crypto/Rar20Crypto.h"
-#include "../../Crypto/RarAes.h"
-
-#include "../Common/ItemNameUtils.h"
-#include "../Common/OutStreamWithCRC.h"
-
-#include "RarHandler.h"
-
-using namespace NWindows;
-using namespace NTime;
-
-namespace NArchive {
-namespace NRar {
-
-static const wchar_t *kHostOS[] =
-{
-  L"MS DOS",
-  L"OS/2",
-  L"Win32",
-  L"Unix",
-  L"Mac OS",
-  L"BeOS"
-};
-
-static const int kNumHostOSes = sizeof(kHostOS) / sizeof(kHostOS[0]);
-
-static const wchar_t *kUnknownOS = L"Unknown";
-
-static const CUInt32PCharPair k_Flags[] =
-{
-  { 0, "Volume" },
-  { 1, "Comment" },
-  { 2, "Lock" },
-  { 3, "Solid" },
-  { 4, "NewVolName" }, // pack_comment in old versuons
-  { 5, "Authenticity" },
-  { 6, "Recovery" },
-  { 7, "BlockEncryption" },
-  { 8, "FirstVolume" },
-  { 9, "EncryptVer" }
-};
-
-static const STATPROPSTG kProps[] =
-{
-  { NULL, kpidPath, VT_BSTR},
-  { NULL, kpidIsDir, VT_BOOL},
-  { NULL, kpidSize, VT_UI8},
-  { NULL, kpidPackSize, VT_UI8},
-  { NULL, kpidMTime, VT_FILETIME},
-  { NULL, kpidCTime, VT_FILETIME},
-  { NULL, kpidATime, VT_FILETIME},
-  { NULL, kpidAttrib, VT_UI4},
-
-  { NULL, kpidEncrypted, VT_BOOL},
-  { NULL, kpidSolid, VT_BOOL},
-  { NULL, kpidCommented, VT_BOOL},
-  { NULL, kpidSplitBefore, VT_BOOL},
-  { NULL, kpidSplitAfter, VT_BOOL},
-  { NULL, kpidCRC, VT_UI4},
-  { NULL, kpidHostOS, VT_BSTR},
-  { NULL, kpidMethod, VT_BSTR},
-  { NULL, kpidUnpackVer, VT_UI1}
-};
-
-static const STATPROPSTG kArcProps[] =
-{
-  { NULL, kpidCharacts, VT_BSTR},
-  { NULL, kpidSolid, VT_BOOL},
-  { NULL, kpidNumBlocks, VT_UI4},
-  // { NULL, kpidEncrypted, VT_BOOL},
-  { NULL, kpidIsVolume, VT_BOOL},
-  { NULL, kpidNumVolumes, VT_UI4},
-  { NULL, kpidPhySize, VT_UI8}
-  // { NULL, kpidCommented, VT_BOOL}
-};
-
-IMP_IInArchive_Props
-IMP_IInArchive_ArcProps
-
-UInt64 CHandler::GetPackSize(int refIndex) const
-{
-  const CRefItem &refItem = _refItems[refIndex];
-  UInt64 totalPackSize = 0;
-  for (int i = 0; i < refItem.NumItems; i++)
-    totalPackSize += _items[refItem.ItemIndex + i].PackSize;
-  return totalPackSize;
-}
-
-STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
-{
-  COM_TRY_BEGIN
-  NWindows::NCOM::CPropVariant prop;
-  switch(propID)
-  {
-    case kpidSolid: prop = _archiveInfo.IsSolid(); break;
-    case kpidCharacts: FLAGS_TO_PROP(k_Flags, _archiveInfo.Flags, prop); break;
-    // case kpidEncrypted: prop = _archiveInfo.IsEncrypted(); break; // it's for encrypted names.
-    case kpidIsVolume: prop = _archiveInfo.IsVolume(); break;
-    case kpidNumVolumes: prop = (UInt32)_archives.Size(); break;
-    case kpidOffset: if (_archiveInfo.StartPosition != 0) prop = _archiveInfo.StartPosition; break;
-    // case kpidCommented: prop = _archiveInfo.IsCommented(); break;
-    case kpidNumBlocks:
-    {
-      UInt32 numBlocks = 0;
-      for (int i = 0; i < _refItems.Size(); i++)
-        if (!IsSolid(i))
-          numBlocks++;
-      prop = (UInt32)numBlocks;
-      break;
-    }
-    case kpidError: if (!_errorMessage.IsEmpty()) prop = _errorMessage; break;
-  }
-  prop.Detach(value);
-  return S_OK;
-  COM_TRY_END
-}
-
-STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
-{
-  *numItems = _refItems.Size();
-  return S_OK;
-}
-
-static bool RarTimeToFileTime(const CRarTime &rarTime, FILETIME &result)
-{
-  if (!DosTimeToFileTime(rarTime.DosTime, result))
-    return false;
-  UInt64 value =  (((UInt64)result.dwHighDateTime) << 32) + result.dwLowDateTime;
-  value += (UInt64)rarTime.LowSecond * 10000000;
-  value += ((UInt64)rarTime.SubTime[2] << 16) +
-    ((UInt64)rarTime.SubTime[1] << 8) +
-    ((UInt64)rarTime.SubTime[0]);
-  result.dwLowDateTime = (DWORD)value;
-  result.dwHighDateTime = DWORD(value >> 32);
-  return true;
-}
-
-static void RarTimeToProp(const CRarTime &rarTime, NWindows::NCOM::CPropVariant &prop)
-{
-  FILETIME localFileTime, utcFileTime;
-  if (RarTimeToFileTime(rarTime, localFileTime))
-  {
-    if (!LocalFileTimeToFileTime(&localFileTime, &utcFileTime))
-      utcFileTime.dwHighDateTime = utcFileTime.dwLowDateTime = 0;
-  }
-  else
-    utcFileTime.dwHighDateTime = utcFileTime.dwLowDateTime = 0;
-  prop = utcFileTime;
-}
-
-STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID,  PROPVARIANT *value)
-{
-  COM_TRY_BEGIN
-  NWindows::NCOM::CPropVariant prop;
-  const CRefItem &refItem = _refItems[index];
-  const CItemEx &item = _items[refItem.ItemIndex];
-  switch(propID)
-  {
-    case kpidPath:
-    {
-      UString u;
-      if (item.HasUnicodeName() && !item.UnicodeName.IsEmpty())
-        u = item.UnicodeName;
-      else
-        u = MultiByteToUnicodeString(item.Name, CP_OEMCP);
-      prop = (const wchar_t *)NItemName::WinNameToOSName(u);
-      break;
-    }
-    case kpidIsDir: prop = item.IsDir(); break;
-    case kpidSize: prop = item.Size; break;
-    case kpidPackSize: prop = GetPackSize(index); break;
-    case kpidMTime: RarTimeToProp(item.MTime, prop); break;
-    case kpidCTime: if (item.CTimeDefined) RarTimeToProp(item.CTime, prop); break;
-    case kpidATime: if (item.ATimeDefined) RarTimeToProp(item.ATime, prop); break;
-    case kpidAttrib: prop = item.GetWinAttributes(); break;
-    case kpidEncrypted: prop = item.IsEncrypted(); break;
-    case kpidSolid: prop = IsSolid(index); break;
-    case kpidCommented: prop = item.IsCommented(); break;
-    case kpidSplitBefore: prop = item.IsSplitBefore(); break;
-    case kpidSplitAfter: prop = _items[refItem.ItemIndex + refItem.NumItems - 1].IsSplitAfter(); break;
-    case kpidCRC:
-    {
-      const CItemEx &lastItem = _items[refItem.ItemIndex + refItem.NumItems - 1];
-      prop = ((lastItem.IsSplitAfter()) ? item.FileCRC : lastItem.FileCRC);
-      break;
-    }
-    case kpidUnpackVer: prop = item.UnPackVersion; break;
-    case kpidMethod:
-    {
-      UString method;
-      if (item.Method >= Byte('0') && item.Method <= Byte('5'))
-      {
-        method = L"m";
-        wchar_t temp[32];
-        ConvertUInt64ToString(item.Method - Byte('0'), temp);
-        method += temp;
-        if (!item.IsDir())
-        {
-          method += L":";
-          ConvertUInt64ToString(16 + item.GetDictSize(), temp);
-          method += temp;
-        }
-      }
-      else
-      {
-        wchar_t temp[32];
-        ConvertUInt64ToString(item.Method, temp);
-        method += temp;
-      }
-      prop = method;
-      break;
-    }
-    case kpidHostOS: prop = (item.HostOS < kNumHostOSes) ? (kHostOS[item.HostOS]) : kUnknownOS; break;
-  }
-  prop.Detach(value);
-  return S_OK;
-  COM_TRY_END
-}
-
-class CVolumeName
-{
-  bool _first;
-  bool _newStyle;
-  UString _unchangedPart;
-  UString _changedPart;
-  UString _afterPart;
-public:
-  CVolumeName(): _newStyle(true) {};
-
-  bool InitName(const UString &name, bool newStyle)
-  {
-    _first = true;
-    _newStyle = newStyle;
-    int dotPos = name.ReverseFind('.');
-    UString basePart = name;
-    if (dotPos >= 0)
-    {
-      UString ext = name.Mid(dotPos + 1);
-      if (ext.CompareNoCase(L"rar") == 0)
-      {
-        _afterPart = name.Mid(dotPos);
-        basePart = name.Left(dotPos);
-      }
-      else if (ext.CompareNoCase(L"exe") == 0)
-      {
-        _afterPart = L".rar";
-        basePart = name.Left(dotPos);
-      }
-      else if (!_newStyle)
-      {
-        if (ext.CompareNoCase(L"000") == 0 ||
-            ext.CompareNoCase(L"001") == 0 ||
-            ext.CompareNoCase(L"r00") == 0 ||
-            ext.CompareNoCase(L"r01") == 0)
-        {
-          _afterPart.Empty();
-          _first = false;
-          _changedPart = ext;
-          _unchangedPart = name.Left(dotPos + 1);
-          return true;
-        }
-      }
-    }
-
-    if (!_newStyle)
-    {
-      _afterPart.Empty();
-      _unchangedPart = basePart + UString(L".");
-      _changedPart = L"r00";
-      return true;
-    }
-
-    int numLetters = 1;
-    if (basePart.Right(numLetters) == L"1" || basePart.Right(numLetters) == L"0")
-    {
-      while (numLetters < basePart.Length())
-      {
-        if (basePart[basePart.Length() - numLetters - 1] != '0')
-          break;
-        numLetters++;
-      }
-    }
-    else
-      return false;
-    _unchangedPart = basePart.Left(basePart.Length() - numLetters);
-    _changedPart = basePart.Right(numLetters);
-    return true;
-  }
-
-  UString GetNextName()
-  {
-    UString newName;
-    if (_newStyle || !_first)
-    {
-      int i;
-      int numLetters = _changedPart.Length();
-      for (i = numLetters - 1; i >= 0; i--)
-      {
-        wchar_t c = _changedPart[i];
-        if (c == L'9')
-        {
-          c = L'0';
-          newName = c + newName;
-          if (i == 0)
-            newName = UString(L'1') + newName;
-          continue;
-        }
-        c++;
-        newName = UString(c) + newName;
-        i--;
-        for (; i >= 0; i--)
-          newName = _changedPart[i] + newName;
-        break;
-      }
-      _changedPart = newName;
-    }
-    _first = false;
-    return _unchangedPart + _changedPart + _afterPart;
-  }
-};
-
-HRESULT CHandler::Open2(IInStream *stream,
-    const UInt64 *maxCheckStartPosition,
-    IArchiveOpenCallback *openCallback)
-{
-  {
-    CMyComPtr<IArchiveOpenVolumeCallback> openVolumeCallback;
-    CMyComPtr<ICryptoGetTextPassword> getTextPassword;
-    CMyComPtr<IArchiveOpenCallback> openArchiveCallbackWrap = openCallback;
-    
-    CVolumeName seqName;
-
-    UInt64 totalBytes = 0;
-    UInt64 curBytes = 0;
-
-    if (openCallback)
-    {
-      openArchiveCallbackWrap.QueryInterface(IID_IArchiveOpenVolumeCallback, &openVolumeCallback);
-      openArchiveCallbackWrap.QueryInterface(IID_ICryptoGetTextPassword, &getTextPassword);
-    }
-
-    for (;;)
-    {
-      CMyComPtr<IInStream> inStream;
-      if (!_archives.IsEmpty())
-      {
-        if (!openVolumeCallback)
-          break;
-        
-        if (_archives.Size() == 1)
-        {
-          if (!_archiveInfo.IsVolume())
-            break;
-          UString baseName;
-          {
-            NCOM::CPropVariant prop;
-            RINOK(openVolumeCallback->GetProperty(kpidName, &prop));
-            if (prop.vt != VT_BSTR)
-              break;
-            baseName = prop.bstrVal;
-          }
-          seqName.InitName(baseName, _archiveInfo.HaveNewVolumeName());
-        }
-
-        UString fullName = seqName.GetNextName();
-        HRESULT result = openVolumeCallback->GetStream(fullName, &inStream);
-        if (result == S_FALSE)
-          break;
-        if (result != S_OK)
-          return result;
-        if (!stream)
-          break;
-      }
-      else
-        inStream = stream;
-
-      UInt64 endPos = 0;
-      RINOK(stream->Seek(0, STREAM_SEEK_END, &endPos));
-      RINOK(stream->Seek(0, STREAM_SEEK_SET, NULL));
-      if (openCallback)
-      {
-        totalBytes += endPos;
-        RINOK(openCallback->SetTotal(NULL, &totalBytes));
-      }
-      
-      NArchive::NRar::CInArchive archive;
-      RINOK(archive.Open(inStream, maxCheckStartPosition));
-
-      if (_archives.IsEmpty())
-        archive.GetArchiveInfo(_archiveInfo);
-     
-      CItemEx item;
-      for (;;)
-      {
-        if (archive.m_Position > endPos)
-        {
-          AddErrorMessage("Unexpected end of archive");
-          break;
-        }
-        bool decryptionError;
-        AString errorMessageLoc;
-        HRESULT result = archive.GetNextItem(item, getTextPassword, decryptionError, errorMessageLoc);
-        if (errorMessageLoc)
-          AddErrorMessage(errorMessageLoc);
-        if (result == S_FALSE)
-        {
-          if (decryptionError && _items.IsEmpty())
-            return S_FALSE;
-          break;
-        }
-        RINOK(result);
-        if (item.IgnoreItem())
-          continue;
-
-        bool needAdd = true;
-        if (item.IsSplitBefore())
-        {
-          if (!_refItems.IsEmpty())
-          {
-            CRefItem &refItem = _refItems.Back();
-            refItem.NumItems++;
-            needAdd = false;
-          }
-        }
-        if (needAdd)
-        {
-          CRefItem refItem;
-          refItem.ItemIndex = _items.Size();
-          refItem.NumItems = 1;
-          refItem.VolumeIndex = _archives.Size();
-          _refItems.Add(refItem);
-        }
-        _items.Add(item);
-        if (openCallback && _items.Size() % 100 == 0)
-        {
-          UInt64 numFiles = _items.Size();
-          UInt64 numBytes = curBytes + item.Position;
-          RINOK(openCallback->SetCompleted(&numFiles, &numBytes));
-        }
-      }
-      curBytes += endPos;
-      _archives.Add(archive);
-    }
-  }
-  return S_OK;
-}
-
-STDMETHODIMP CHandler::Open(IInStream *stream,
-    const UInt64 *maxCheckStartPosition,
-    IArchiveOpenCallback *openCallback)
-{
-  COM_TRY_BEGIN
-  Close();
-  try
-  {
-    HRESULT res = Open2(stream, maxCheckStartPosition, openCallback);
-    if (res != S_OK)
-      Close();
-    return res;
-  }
-  catch(const CInArchiveException &) { Close(); return S_FALSE; }
-  catch(...) { Close(); throw; }
-  COM_TRY_END
-}
-
-STDMETHODIMP CHandler::Close()
-{
-  COM_TRY_BEGIN
-  _errorMessage.Empty();
-  _refItems.Clear();
-  _items.Clear();
-  _archives.Clear();
-  return S_OK;
-  COM_TRY_END
-}
-
-struct CMethodItem
-{
-  Byte RarUnPackVersion;
-  CMyComPtr<ICompressCoder> Coder;
-};
-
-
-STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
-    Int32 testMode, IArchiveExtractCallback *extractCallback)
-{
-  COM_TRY_BEGIN
-  CMyComPtr<ICryptoGetTextPassword> getTextPassword;
-  UInt64 censoredTotalUnPacked = 0,
-        // censoredTotalPacked = 0,
-        importantTotalUnPacked = 0;
-        // importantTotalPacked = 0;
-  bool allFilesMode = (numItems == (UInt32)-1);
-  if (allFilesMode)
-    numItems = _refItems.Size();
-  if (numItems == 0)
-    return S_OK;
-  int lastIndex = 0;
-  CRecordVector<int> importantIndexes;
-  CRecordVector<bool> extractStatuses;
-
-  for (UInt32 t = 0; t < numItems; t++)
-  {
-    int index = allFilesMode ? t : indices[t];
-    const CRefItem &refItem = _refItems[index];
-    const CItemEx &item = _items[refItem.ItemIndex];
-    censoredTotalUnPacked += item.Size;
-    // censoredTotalPacked += item.PackSize;
-    int j;
-    for (j = lastIndex; j <= index; j++)
-      // if (!_items[_refItems[j].ItemIndex].IsSolid())
-      if (!IsSolid(j))
-        lastIndex = j;
-    for (j = lastIndex; j <= index; j++)
-    {
-      const CRefItem &refItem = _refItems[j];
-      const CItemEx &item = _items[refItem.ItemIndex];
-
-      // const CItemEx &item = _items[j];
-
-      importantTotalUnPacked += item.Size;
-      // importantTotalPacked += item.PackSize;
-      importantIndexes.Add(j);
-      extractStatuses.Add(j == index);
-    }
-    lastIndex = index + 1;
-  }
-
-  RINOK(extractCallback->SetTotal(importantTotalUnPacked));
-  UInt64 currentImportantTotalUnPacked = 0;
-  UInt64 currentImportantTotalPacked = 0;
-  UInt64 currentUnPackSize, currentPackSize;
-
-  CObjectVector<CMethodItem> methodItems;
-
-  NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder;
-  CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;
-
-  CFilterCoder *filterStreamSpec = new CFilterCoder;
-  CMyComPtr<ISequentialInStream> filterStream = filterStreamSpec;
-
-  NCrypto::NRar20::CDecoder *rar20CryptoDecoderSpec = NULL;
-  CMyComPtr<ICompressFilter> rar20CryptoDecoder;
-  NCrypto::NRar29::CDecoder *rar29CryptoDecoderSpec = NULL;
-  CMyComPtr<ICompressFilter> rar29CryptoDecoder;
-
-  CFolderInStream *folderInStreamSpec = NULL;
-  CMyComPtr<ISequentialInStream> folderInStream;
-
-  CLocalProgress *lps = new CLocalProgress;
-  CMyComPtr<ICompressProgressInfo> progress = lps;
-  lps->Init(extractCallback, false);
-
-  bool solidStart = true;
-  for (int i = 0; i < importantIndexes.Size(); i++,
-      currentImportantTotalUnPacked += currentUnPackSize,
-      currentImportantTotalPacked += currentPackSize)
-  {
-    lps->InSize = currentImportantTotalPacked;
-    lps->OutSize = currentImportantTotalUnPacked;
-    RINOK(lps->SetCur());
-    CMyComPtr<ISequentialOutStream> realOutStream;
-
-    Int32 askMode;
-    if (extractStatuses[i])
-      askMode = testMode ?
-          NExtract::NAskMode::kTest :
-          NExtract::NAskMode::kExtract;
-    else
-      askMode = NExtract::NAskMode::kSkip;
-
-    UInt32 index = importantIndexes[i];
-
-    const CRefItem &refItem = _refItems[index];
-    const CItemEx &item = _items[refItem.ItemIndex];
-
-    currentUnPackSize = item.Size;
-
-    currentPackSize = GetPackSize(index);
-
-    if (item.IgnoreItem())
-      continue;
-
-    RINOK(extractCallback->GetStream(index, &realOutStream, askMode));
-
-    if (!IsSolid(index))
-      solidStart = true;
-    if (item.IsDir())
-    {
-      RINOK(extractCallback->PrepareOperation(askMode));
-      RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK));
-      continue;
-    }
-
-    bool mustBeProcessedAnywhere = false;
-    if (i < importantIndexes.Size() - 1)
-    {
-      // const CRefItem &nextRefItem = _refItems[importantIndexes[i + 1]];
-      // const CItemEx &nextItemInfo = _items[nextRefItem.ItemIndex];
-      // mustBeProcessedAnywhere = nextItemInfo.IsSolid();
-      mustBeProcessedAnywhere = IsSolid(importantIndexes[i + 1]);
-    }
-    
-    if (!mustBeProcessedAnywhere && !testMode && !realOutStream)
-      continue;
-    
-    if (!realOutStream && !testMode)
-      askMode = NExtract::NAskMode::kSkip;
-
-    RINOK(extractCallback->PrepareOperation(askMode));
-
-    COutStreamWithCRC *outStreamSpec = new COutStreamWithCRC;
-    CMyComPtr<ISequentialOutStream> outStream(outStreamSpec);
-    outStreamSpec->SetStream(realOutStream);
-    outStreamSpec->Init();
-    realOutStream.Release();
-    
-    /*
-    for (int partIndex = 0; partIndex < 1; partIndex++)
-    {
-    CMyComPtr<ISequentialInStream> inStream;
-
-    // item redefinition
-    const CItemEx &item = _items[refItem.ItemIndex + partIndex];
-
-    NArchive::NRar::CInArchive &archive = _archives[refItem.VolumeIndex + partIndex];
-
-    inStream.Attach(archive.CreateLimitedStream(item.GetDataPosition(),
-      item.PackSize));
-    */
-    if (!folderInStream)
-    {
-      folderInStreamSpec = new CFolderInStream;
-      folderInStream = folderInStreamSpec;
-    }
-
-    folderInStreamSpec->Init(&_archives, &_items, refItem);
-
-    UInt64 packSize = currentPackSize;
-
-    // packedPos += item.PackSize;
-    // unpackedPos += 0;
-    
-    CMyComPtr<ISequentialInStream> inStream;
-    if (item.IsEncrypted())
-    {
-      CMyComPtr<ICryptoSetPassword> cryptoSetPassword;
-      if (item.UnPackVersion >= 29)
-      {
-        if (!rar29CryptoDecoder)
-        {
-          rar29CryptoDecoderSpec = new NCrypto::NRar29::CDecoder;
-          rar29CryptoDecoder = rar29CryptoDecoderSpec;
-          // RINOK(rar29CryptoDecoder.CoCreateInstance(CLSID_CCryptoRar29Decoder));
-        }
-        rar29CryptoDecoderSpec->SetRar350Mode(item.UnPackVersion < 36);
-        CMyComPtr<ICompressSetDecoderProperties2> cryptoProperties;
-        RINOK(rar29CryptoDecoder.QueryInterface(IID_ICompressSetDecoderProperties2,
-            &cryptoProperties));
-        RINOK(cryptoProperties->SetDecoderProperties2(item.Salt, item.HasSalt() ? sizeof(item.Salt) : 0));
-        filterStreamSpec->Filter = rar29CryptoDecoder;
-      }
-      else if (item.UnPackVersion >= 20)
-      {
-        if (!rar20CryptoDecoder)
-        {
-          rar20CryptoDecoderSpec = new NCrypto::NRar20::CDecoder;
-          rar20CryptoDecoder = rar20CryptoDecoderSpec;
-          // RINOK(rar20CryptoDecoder.CoCreateInstance(CLSID_CCryptoRar20Decoder));
-        }
-        filterStreamSpec->Filter = rar20CryptoDecoder;
-      }
-      else
-      {
-        outStream.Release();
-        RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kUnSupportedMethod));
-        continue;
-      }
-      RINOK(filterStreamSpec->Filter.QueryInterface(IID_ICryptoSetPassword,
-          &cryptoSetPassword));
-
-      if (!getTextPassword)
-        extractCallback->QueryInterface(IID_ICryptoGetTextPassword, (void **)&getTextPassword);
-      if (getTextPassword)
-      {
-        CMyComBSTR password;
-        RINOK(getTextPassword->CryptoGetTextPassword(&password));
-        if (item.UnPackVersion >= 29)
-        {
-          CByteBuffer buffer;
-          UString unicodePassword(password);
-          const UInt32 sizeInBytes = unicodePassword.Length() * 2;
-          buffer.SetCapacity(sizeInBytes);
-          for (int i = 0; i < unicodePassword.Length(); i++)
-          {
-            wchar_t c = unicodePassword[i];
-            ((Byte *)buffer)[i * 2] = (Byte)c;
-            ((Byte *)buffer)[i * 2 + 1] = (Byte)(c >> 8);
-          }
-          RINOK(cryptoSetPassword->CryptoSetPassword(
-            (const Byte *)buffer, sizeInBytes));
-        }
-        else
-        {
-          AString oemPassword = UnicodeStringToMultiByte(
-            (const wchar_t *)password, CP_OEMCP);
-          RINOK(cryptoSetPassword->CryptoSetPassword(
-            (const Byte *)(const char *)oemPassword, oemPassword.Length()));
-        }
-      }
-      else
-      {
-        RINOK(cryptoSetPassword->CryptoSetPassword(0, 0));
-      }
-      filterStreamSpec->SetInStream(folderInStream);
-      inStream = filterStream;
-    }
-    else
-    {
-      inStream = folderInStream;
-    }
-    CMyComPtr<ICompressCoder> commonCoder;
-    switch(item.Method)
-    {
-      case '0':
-      {
-        commonCoder = copyCoder;
-        break;
-      }
-      case '1':
-      case '2':
-      case '3':
-      case '4':
-      case '5':
-      {
-        /*
-        if (item.UnPackVersion >= 29)
-        {
-          outStream.Release();
-          RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kUnSupportedMethod));
-          continue;
-        }
-        */
-        int m;
-        for (m = 0; m < methodItems.Size(); m++)
-          if (methodItems[m].RarUnPackVersion == item.UnPackVersion)
-            break;
-        if (m == methodItems.Size())
-        {
-          CMethodItem mi;
-          mi.RarUnPackVersion = item.UnPackVersion;
-
-          mi.Coder.Release();
-          if (item.UnPackVersion <= 30)
-          {
-            UInt32 methodID = 0x040300;
-            if (item.UnPackVersion < 20)
-              methodID += 1;
-            else if (item.UnPackVersion < 29)
-              methodID += 2;
-            else
-              methodID += 3;
-            RINOK(CreateCoder(EXTERNAL_CODECS_VARS methodID, mi.Coder, false));
-          }
-         
-          if (mi.Coder == 0)
-          {
-            outStream.Release();
-            RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kUnSupportedMethod));
-            continue;
-          }
-
-          m = methodItems.Add(mi);
-        }
-        CMyComPtr<ICompressCoder> decoder = methodItems[m].Coder;
-
-        CMyComPtr<ICompressSetDecoderProperties2> compressSetDecoderProperties;
-        RINOK(decoder.QueryInterface(IID_ICompressSetDecoderProperties2,
-            &compressSetDecoderProperties));
-        
-        Byte isSolid = (Byte)((IsSolid(index) || item.IsSplitBefore()) ? 1: 0);
-        if (solidStart)
-        {
-          isSolid = false;
-          solidStart = false;
-        }
-
-
-        RINOK(compressSetDecoderProperties->SetDecoderProperties2(&isSolid, 1));
-          
-        commonCoder = decoder;
-        break;
-      }
-      default:
-        outStream.Release();
-        RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kUnSupportedMethod));
-        continue;
-    }
-    HRESULT result = commonCoder->Code(inStream, outStream, &packSize, &item.Size, progress);
-    if (item.IsEncrypted())
-      filterStreamSpec->ReleaseInStream();
-    if (result == S_FALSE)
-    {
-      outStream.Release();
-      RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kDataError));
-      continue;
-    }
-    if (result != S_OK)
-      return result;
-
-    /*
-    if (refItem.NumItems == 1 &&
-        !item.IsSplitBefore() && !item.IsSplitAfter())
-    */
-    {
-      const CItemEx &lastItem = _items[refItem.ItemIndex + refItem.NumItems - 1];
-      bool crcOK = outStreamSpec->GetCRC() == lastItem.FileCRC;
-      outStream.Release();
-      RINOK(extractCallback->SetOperationResult(crcOK ?
-          NExtract::NOperationResult::kOK:
-          NExtract::NOperationResult::kCRCError));
-    }
-    /*
-    else
-    {
-      bool crcOK = true;
-      for (int partIndex = 0; partIndex < refItem.NumItems; partIndex++)
-      {
-        const CItemEx &item = _items[refItem.ItemIndex + partIndex];
-        if (item.FileCRC != folderInStreamSpec->CRCs[partIndex])
-        {
-          crcOK = false;
-          break;
-        }
-      }
-      RINOK(extractCallback->SetOperationResult(crcOK ?
-          NExtract::NOperationResult::kOK:
-          NExtract::NOperationResult::kCRCError));
-    }
-    */
-  }
-  return S_OK;
-  COM_TRY_END
-}
-
-IMPL_ISetCompressCodecsInfo
-
-}}
diff -ruNa p7zip_9.20.1/CPP/7zip/Archive/Rar/RarHandler.h p7zip-libre_9.20.1/CPP/7zip/Archive/Rar/RarHandler.h
--- p7zip_9.20.1/CPP/7zip/Archive/Rar/RarHandler.h	2011-01-08 06:41:27.000000000 -0300
+++ p7zip-libre_9.20.1/CPP/7zip/Archive/Rar/RarHandler.h	1969-12-31 21:00:00.000000000 -0300
@@ -1,66 +0,0 @@
-// Rar/Handler.h
-
-#ifndef __RAR_HANDLER_H
-#define __RAR_HANDLER_H
-
-#include "../IArchive.h"
-
-#include "../../Common/CreateCoder.h"
-
-#include "RarIn.h"
-#include "RarVolumeInStream.h"
-
-namespace NArchive {
-namespace NRar {
-
-class CHandler:
-  public IInArchive,
-  PUBLIC_ISetCompressCodecsInfo
-  public CMyUnknownImp
-{
-  CRecordVector<CRefItem> _refItems;
-  CObjectVector<CItemEx> _items;
-  CObjectVector<CInArchive> _archives;
-  NArchive::NRar::CInArchiveInfo _archiveInfo;
-  AString _errorMessage;
-
-  DECL_EXTERNAL_CODECS_VARS
-
-  UInt64 GetPackSize(int refIndex) const;
-
-  bool IsSolid(int refIndex)
-  {
-    const CItemEx &item = _items[_refItems[refIndex].ItemIndex];
-    if (item.UnPackVersion < 20)
-    {
-      if (_archiveInfo.IsSolid())
-        return (refIndex > 0);
-      return false;
-    }
-    return item.IsSolid();
-  }
-  void AddErrorMessage(const AString &s)
-  {
-    if (!_errorMessage.IsEmpty())
-      _errorMessage += '\n';
-    _errorMessage += s;
-  }
-
-  HRESULT Open2(IInStream *stream,
-      const UInt64 *maxCheckStartPosition,
-      IArchiveOpenCallback *openCallback);
-
-public:
-  MY_QUERYINTERFACE_BEGIN2(IInArchive)
-  QUERY_ENTRY_ISetCompressCodecsInfo
-  MY_QUERYINTERFACE_END
-  MY_ADDREF_RELEASE
-  
-  INTERFACE_IInArchive(;)
-
-  DECL_ISetCompressCodecsInfo
-};
-
-}}
-
-#endif
diff -ruNa p7zip_9.20.1/CPP/7zip/Archive/Rar/RarHeader.cpp p7zip-libre_9.20.1/CPP/7zip/Archive/Rar/RarHeader.cpp
--- p7zip_9.20.1/CPP/7zip/Archive/Rar/RarHeader.cpp	2008-08-14 06:11:25.000000000 -0300
+++ p7zip-libre_9.20.1/CPP/7zip/Archive/Rar/RarHeader.cpp	1969-12-31 21:00:00.000000000 -0300
@@ -1,21 +0,0 @@
-// Archive/Rar/Headers.cpp
-
-#include "StdAfx.h"
-
-#include "RarHeader.h"
-
-namespace NArchive{
-namespace NRar{
-namespace NHeader{
-
-Byte kMarker[kMarkerSize] = {0x52 + 1, 0x61, 0x72, 0x21, 0x1a, 0x07, 0x00};
-  
-class CMarkerInitializer
-{
-public:
-  CMarkerInitializer() { kMarker[0]--; };
-};
-
-static CMarkerInitializer markerInitializer;
-
-}}}
diff -ruNa p7zip_9.20.1/CPP/7zip/Archive/Rar/RarHeader.h p7zip-libre_9.20.1/CPP/7zip/Archive/Rar/RarHeader.h
--- p7zip_9.20.1/CPP/7zip/Archive/Rar/RarHeader.h	2011-01-08 06:41:27.000000000 -0300
+++ p7zip-libre_9.20.1/CPP/7zip/Archive/Rar/RarHeader.h	1969-12-31 21:00:00.000000000 -0300
@@ -1,205 +0,0 @@
-// Archive/RarHeader.h
-
-#ifndef __ARCHIVE_RAR_HEADER_H
-#define __ARCHIVE_RAR_HEADER_H
-
-#include "Common/Types.h"
-
-namespace NArchive {
-namespace NRar {
-namespace NHeader {
-
-const int kMarkerSize = 7;
-extern Byte kMarker[kMarkerSize];
-  
-const int kArchiveSolid = 0x1;
-
-namespace NBlockType
-{
-  enum EBlockType
-  {
-    kMarker = 0x72,
-    kArchiveHeader,
-    kFileHeader,
-    kCommentHeader,
-    kOldAuthenticity,
-    kOldSubBlock,
-    kRecoveryRecord,
-    kAuthenticity,
-    kSubBlock,
-    kEndOfArchive
-  };
-}
-
-namespace NArchive
-{
-  const UInt16 kVolume  = 1;
-  const UInt16 kComment = 2;
-  const UInt16 kLock    = 4;
-  const UInt16 kSolid   = 8;
-  const UInt16 kNewVolName = 0x10; // ('volname.partN.rar')
-  const UInt16 kAuthenticity  = 0x20;
-  const UInt16 kRecovery = 0x40;
-  const UInt16 kBlockEncryption  = 0x80;
-  const UInt16 kFirstVolume = 0x100; // (set only by RAR 3.0 and later)
-  const UInt16 kEncryptVer = 0x200; // RAR 3.6 there is EncryptVer Byte in End of MainHeader
-
-  const int kHeaderSizeMin = 7;
-  
-  const int kArchiveHeaderSize = 13;
-
-  const int kBlockHeadersAreEncrypted = 0x80;
-
-}
-
-namespace NFile
-{
-  const int kSplitBefore = 1 << 0;
-  const int kSplitAfter  = 1 << 1;
-  const int kEncrypted   = 1 << 2;
-  const int kComment     = 1 << 3;
-  const int kSolid       = 1 << 4;
-  
-  const int kDictBitStart     = 5;
-  const int kNumDictBits  = 3;
-  const int kDictMask         = (1 << kNumDictBits) - 1;
-  const int kDictDirectoryValue  = 0x7;
-  
-  const int kSize64Bits    = 1 << 8;
-  const int kUnicodeName   = 1 << 9;
-  const int kSalt          = 1 << 10;
-  const int kOldVersion    = 1 << 11;
-  const int kExtTime       = 1 << 12;
-  // const int kExtFlags      = 1 << 13;
-  // const int kSkipIfUnknown = 1 << 14;
-
-  const int kLongBlock    = 1 << 15;
-  
-  /*
-  struct CBlock
-  {
-    // UInt16 HeadCRC;
-    // Byte Type;
-    // UInt16 Flags;
-    // UInt16 HeadSize;
-    UInt32 PackSize;
-    UInt32 UnPackSize;
-    Byte HostOS;
-    UInt32 FileCRC;
-    UInt32 Time;
-    Byte UnPackVersion;
-    Byte Method;
-    UInt16 NameSize;
-    UInt32 Attributes;
-  };
-  */
-
-  /*
-  struct CBlock32
-  {
-    UInt16 HeadCRC;
-    Byte Type;
-    UInt16 Flags;
-    UInt16 HeadSize;
-    UInt32 PackSize;
-    UInt32 UnPackSize;
-    Byte HostOS;
-    UInt32 FileCRC;
-    UInt32 Time;
-    Byte UnPackVersion;
-    Byte Method;
-    UInt16 NameSize;
-    UInt32 Attributes;
-    UInt16 GetRealCRC(const void *aName, UInt32 aNameSize,
-        bool anExtraDataDefined = false, Byte *anExtraData = 0) const;
-  };
-  struct CBlock64
-  {
-    UInt16 HeadCRC;
-    Byte Type;
-    UInt16 Flags;
-    UInt16 HeadSize;
-    UInt32 PackSizeLow;
-    UInt32 UnPackSizeLow;
-    Byte HostOS;
-    UInt32 FileCRC;
-    UInt32 Time;
-    Byte UnPackVersion;
-    Byte Method;
-    UInt16 NameSize;
-    UInt32 Attributes;
-    UInt32 PackSizeHigh;
-    UInt32 UnPackSizeHigh;
-    UInt16 GetRealCRC(const void *aName, UInt32 aNameSize) const;
-  };
-  */
-  
-  const int kLabelFileAttribute            = 0x08;
-  const int kWinFileDirectoryAttributeMask = 0x10;
-  
-  enum CHostOS
-  {
-    kHostMSDOS = 0,
-      kHostOS2   = 1,
-      kHostWin32 = 2,
-      kHostUnix  = 3,
-      kHostMacOS = 4,
-      kHostBeOS = 5
-  };
-}
-
-namespace NBlock
-{
-  const UInt16 kLongBlock = 1 << 15;
-  struct CBlock
-  {
-    UInt16 CRC;
-    Byte Type;
-    UInt16 Flags;
-    UInt16 HeadSize;
-    //  UInt32 DataSize;
-  };
-}
-
-/*
-struct CSubBlock
-{
-  UInt16 HeadCRC;
-  Byte HeadType;
-  UInt16 Flags;
-  UInt16 HeadSize;
-  UInt32 DataSize;
-  UInt16 SubType;
-  Byte Level; // Reserved : Must be 0
-};
-
-struct CCommentBlock
-{
-  UInt16 HeadCRC;
-  Byte HeadType;
-  UInt16 Flags;
-  UInt16 HeadSize;
-  UInt16 UnpSize;
-  Byte UnpVer;
-  Byte Method;
-  UInt16 CommCRC;
-};
-
-
-struct CProtectHeader
-{
-  UInt16 HeadCRC;
-  Byte HeadType;
-  UInt16 Flags;
-  UInt16 HeadSize;
-  UInt32 DataSize;
-  Byte Version;
-  UInt16 RecSectors;
-  UInt32 TotalBlocks;
-  Byte Mark[8];
-};
-*/
-
-}}}
-
-#endif
diff -ruNa p7zip_9.20.1/CPP/7zip/Archive/Rar/RarIn.cpp p7zip-libre_9.20.1/CPP/7zip/Archive/Rar/RarIn.cpp
--- p7zip_9.20.1/CPP/7zip/Archive/Rar/RarIn.cpp	2011-01-08 06:41:37.000000000 -0300
+++ p7zip-libre_9.20.1/CPP/7zip/Archive/Rar/RarIn.cpp	1969-12-31 21:00:00.000000000 -0300
@@ -1,478 +0,0 @@
-// Archive/RarIn.cpp
-
-#include "StdAfx.h"
-
-#include "../../../../C/7zCrc.h"
-#include "../../../../C/CpuArch.h"
-
-#include "Common/StringConvert.h"
-#include "Common/UTFConvert.h"
-
-#include "../../Common/LimitedStreams.h"
-#include "../../Common/StreamUtils.h"
-
-#include "../Common/FindSignature.h"
-
-#include "RarIn.h"
-
-#define Get16(p) GetUi16(p)
-#define Get32(p) GetUi32(p)
-#define Get64(p) GetUi64(p)
-
-namespace NArchive {
-namespace NRar {
-
-static const char *k_UnexpectedEnd = "Unexpected end of archive";
-static const char *k_DecryptionError = "Decryption Error";
-
-void CInArchive::ThrowExceptionWithCode(
-    CInArchiveException::CCauseType cause)
-{
-  throw CInArchiveException(cause);
-}
-
-HRESULT CInArchive::Open(IInStream *inStream, const UInt64 *searchHeaderSizeLimit)
-{
-  try
-  {
-    Close();
-    HRESULT res = Open2(inStream, searchHeaderSizeLimit);
-    if (res == S_OK)
-      return res;
-    Close();
-    return res;
-  }
-  catch(...) { Close(); throw; }
-}
-
-void CInArchive::Close()
-{
-  m_Stream.Release();
-}
-
-HRESULT CInArchive::ReadBytesSpec(void *data, size_t *resSize)
-{
-  if (m_CryptoMode)
-  {
-    size_t size = *resSize;
-    *resSize = 0;
-    const Byte *bufData = m_DecryptedDataAligned;
-    UInt32 bufSize = m_DecryptedDataSize;
-    size_t i;
-    for (i = 0; i < size && m_CryptoPos < bufSize; i++)
-      ((Byte *)data)[i] = bufData[m_CryptoPos++];
-    *resSize = i;
-    return S_OK;
-  }
-  return ReadStream(m_Stream, data, resSize);
-}
-
-bool CInArchive::ReadBytesAndTestSize(void *data, UInt32 size)
-{
-  size_t processed = size;
-  if (ReadBytesSpec(data, &processed) != S_OK)
-    return false;
-  return processed == size;
-}
-
-HRESULT CInArchive::Open2(IInStream *stream, const UInt64 *searchHeaderSizeLimit)
-{
-  m_CryptoMode = false;
-  RINOK(stream->Seek(0, STREAM_SEEK_SET, &m_StreamStartPosition));
-  m_Position = m_StreamStartPosition;
-
-  UInt64 arcStartPos;
-  RINOK(FindSignatureInStream(stream, NHeader::kMarker, NHeader::kMarkerSize,
-      searchHeaderSizeLimit, arcStartPos));
-  m_Position = arcStartPos + NHeader::kMarkerSize;
-  RINOK(stream->Seek(m_Position, STREAM_SEEK_SET, NULL));
-  Byte buf[NHeader::NArchive::kArchiveHeaderSize + 1];
-
-  RINOK(ReadStream_FALSE(stream, buf, NHeader::NArchive::kArchiveHeaderSize));
-  AddToSeekValue(NHeader::NArchive::kArchiveHeaderSize);
-
-
-  UInt32 blockSize = Get16(buf + 5);
-
-  _header.EncryptVersion = 0;
-  _header.Flags = Get16(buf + 3);
-
-  UInt32 headerSize = NHeader::NArchive::kArchiveHeaderSize;
-  if (_header.IsThereEncryptVer())
-  {
-    if (blockSize <= headerSize)
-      return S_FALSE;
-    RINOK(ReadStream_FALSE(stream, buf + NHeader::NArchive::kArchiveHeaderSize, 1));
-    AddToSeekValue(1);
-    _header.EncryptVersion = buf[NHeader::NArchive::kArchiveHeaderSize];
-    headerSize += 1;
-  }
-  if (blockSize < headerSize ||
-      buf[2] != NHeader::NBlockType::kArchiveHeader ||
-      (UInt32)Get16(buf) != (CrcCalc(buf + 2, headerSize - 2) & 0xFFFF))
-    return S_FALSE;
-
-  size_t commentSize = blockSize - headerSize; 
-  _comment.SetCapacity(commentSize);
-  RINOK(ReadStream_FALSE(stream, _comment, commentSize));
-  AddToSeekValue(commentSize);
-  m_Stream = stream;
-  _header.StartPosition = arcStartPos;
-  return S_OK;
-}
-
-void CInArchive::GetArchiveInfo(CInArchiveInfo &archiveInfo) const
-{
-  archiveInfo = _header;
-}
-
-static void DecodeUnicodeFileName(const char *name, const Byte *encName,
-    int encSize, wchar_t *unicodeName, int maxDecSize)
-{
-  int encPos = 0;
-  int decPos = 0;
-  int flagBits = 0;
-  Byte flags = 0;
-  Byte highByte = encName[encPos++];
-  while (encPos < encSize && decPos < maxDecSize)
-  {
-    if (flagBits == 0)
-    {
-      flags = encName[encPos++];
-      flagBits = 8;
-    }
-    switch(flags >> 6)
-    {
-      case 0:
-        unicodeName[decPos++] = encName[encPos++];
-        break;
-      case 1:
-        unicodeName[decPos++] = (wchar_t)(encName[encPos++] + (highByte << 8));
-        break;
-      case 2:
-        unicodeName[decPos++] = (wchar_t)(encName[encPos] + (encName[encPos + 1] << 8));
-        encPos += 2;
-        break;
-      case 3:
-        {
-          int length = encName[encPos++];
-          if (length & 0x80)
-          {
-            Byte correction = encName[encPos++];
-            for (length = (length & 0x7f) + 2;
-                length > 0 && decPos < maxDecSize; length--, decPos++)
-              unicodeName[decPos] = (wchar_t)(((name[decPos] + correction) & 0xff) + (highByte << 8));
-          }
-          else
-            for (length += 2; length > 0 && decPos < maxDecSize; length--, decPos++)
-              unicodeName[decPos] = name[decPos];
-        }
-        break;
-    }
-    flags <<= 2;
-    flagBits -= 2;
-  }
-  unicodeName[decPos < maxDecSize ? decPos : maxDecSize - 1] = 0;
-}
-
-void CInArchive::ReadName(CItemEx &item, int nameSize)
-{
-  item.UnicodeName.Empty();
-  if (nameSize > 0)
-  {
-    m_NameBuffer.EnsureCapacity(nameSize + 1);
-    char *buffer = (char *)m_NameBuffer;
-
-    for (int i = 0; i < nameSize; i++)
-      buffer[i] = ReadByte();
-
-    int mainLen;
-    for (mainLen = 0; mainLen < nameSize; mainLen++)
-      if (buffer[mainLen] == '\0')
-        break;
-    buffer[mainLen] = '\0';
-    item.Name = buffer;
-
-    if(item.HasUnicodeName())
-    {
-      if(mainLen < nameSize)
-      {
-        int unicodeNameSizeMax = MyMin(nameSize, (0x400));
-        _unicodeNameBuffer.EnsureCapacity(unicodeNameSizeMax + 1);
-        DecodeUnicodeFileName(buffer, (const Byte *)buffer + mainLen + 1,
-            nameSize - (mainLen + 1), _unicodeNameBuffer, unicodeNameSizeMax);
-        item.UnicodeName = _unicodeNameBuffer;
-      }
-      else if (!ConvertUTF8ToUnicode(item.Name, item.UnicodeName))
-        item.UnicodeName.Empty();
-    }
-  }
-  else
-    item.Name.Empty();
-}
-
-Byte CInArchive::ReadByte()
-{
-  if (m_CurPos >= m_PosLimit)
-    throw CInArchiveException(CInArchiveException::kIncorrectArchive);
-  return m_CurData[m_CurPos++];
-}
-
-UInt16 CInArchive::ReadUInt16()
-{
-  UInt16 value = 0;
-  for (int i = 0; i < 2; i++)
-  {
-    Byte b = ReadByte();
-    value |= (UInt16(b) << (8 * i));
-  }
-  return value;
-}
-
-UInt32 CInArchive::ReadUInt32()
-{
-  UInt32 value = 0;
-  for (int i = 0; i < 4; i++)
-  {
-    Byte b = ReadByte();
-    value |= (UInt32(b) << (8 * i));
-  }
-  return value;
-}
-
-void CInArchive::ReadTime(Byte mask, CRarTime &rarTime)
-{
-  rarTime.LowSecond = (Byte)(((mask & 4) != 0) ? 1 : 0);
-  int numDigits = (mask & 3);
-  rarTime.SubTime[0] = rarTime.SubTime[1] = rarTime.SubTime[2] = 0;
-  for (int i = 0; i < numDigits; i++)
-    rarTime.SubTime[3 - numDigits + i] = ReadByte();
-}
-
-void CInArchive::ReadHeaderReal(CItemEx &item)
-{
-  item.Flags = m_BlockHeader.Flags;
-  item.PackSize = ReadUInt32();
-  item.Size = ReadUInt32();
-  item.HostOS = ReadByte();
-  item.FileCRC = ReadUInt32();
-  item.MTime.DosTime = ReadUInt32();
-  item.UnPackVersion = ReadByte();
-  item.Method = ReadByte();
-  int nameSize = ReadUInt16();
-  item.Attrib = ReadUInt32();
-
-  item.MTime.LowSecond = 0;
-  item.MTime.SubTime[0] =
-      item.MTime.SubTime[1] =
-      item.MTime.SubTime[2] = 0;
-
-  if((item.Flags & NHeader::NFile::kSize64Bits) != 0)
-  {
-    item.PackSize |= ((UInt64)ReadUInt32() << 32);
-    item.Size |= ((UInt64)ReadUInt32() << 32);
-  }
-
-  ReadName(item, nameSize);
-
-  if (item.HasSalt())
-    for (int i = 0; i < sizeof(item.Salt); i++)
-      item.Salt[i] = ReadByte();
-
-  // some rar archives have HasExtTime flag without field.
-  if (m_CurPos < m_PosLimit && item.HasExtTime())
-  {
-    Byte accessMask = (Byte)(ReadByte() >> 4);
-    Byte b = ReadByte();
-    Byte modifMask = (Byte)(b >> 4);
-    Byte createMask = (Byte)(b & 0xF);
-    if ((modifMask & 8) != 0)
-      ReadTime(modifMask, item.MTime);
-    item.CTimeDefined = ((createMask & 8) != 0);
-    if (item.CTimeDefined)
-    {
-      item.CTime.DosTime = ReadUInt32();
-      ReadTime(createMask, item.CTime);
-    }
-    item.ATimeDefined = ((accessMask & 8) != 0);
-    if (item.ATimeDefined)
-    {
-      item.ATime.DosTime = ReadUInt32();
-      ReadTime(accessMask, item.ATime);
-    }
-  }
-
-  UInt16 fileHeaderWithNameSize = (UInt16)m_CurPos;
-  
-  item.Position = m_Position;
-  item.MainPartSize = fileHeaderWithNameSize;
-  item.CommentSize = (UInt16)(m_BlockHeader.HeadSize - fileHeaderWithNameSize);
-
-  if (m_CryptoMode)
-    item.AlignSize = (UInt16)((16 - ((m_BlockHeader.HeadSize) & 0xF)) & 0xF);
-  else
-    item.AlignSize = 0;
-  AddToSeekValue(m_BlockHeader.HeadSize);
-}
-
-void CInArchive::AddToSeekValue(UInt64 addValue)
-{
-  m_Position += addValue;
-}
-
-HRESULT CInArchive::GetNextItem(CItemEx &item, ICryptoGetTextPassword *getTextPassword, bool &decryptionError, AString &errorMessage)
-{
-  decryptionError = false;
-  for (;;)
-  {
-    SeekInArchive(m_Position);
-    if (!m_CryptoMode && (_header.Flags &
-        NHeader::NArchive::kBlockHeadersAreEncrypted) != 0)
-    {
-      m_CryptoMode = false;
-      if (getTextPassword == 0)
-        return S_FALSE;
-      if (!m_RarAES)
-      {
-        m_RarAESSpec = new NCrypto::NRar29::CDecoder;
-        m_RarAES = m_RarAESSpec;
-      }
-      m_RarAESSpec->SetRar350Mode(_header.IsEncryptOld());
-
-      // Salt
-      const UInt32 kSaltSize = 8;
-      Byte salt[kSaltSize];
-      if(!ReadBytesAndTestSize(salt, kSaltSize))
-        return S_FALSE;
-      m_Position += kSaltSize;
-      RINOK(m_RarAESSpec->SetDecoderProperties2(salt, kSaltSize))
-      // Password
-      CMyComBSTR password;
-      RINOK(getTextPassword->CryptoGetTextPassword(&password))
-      UString unicodePassword(password);
-
-      CByteBuffer buffer;
-      const UInt32 sizeInBytes = unicodePassword.Length() * 2;
-      buffer.SetCapacity(sizeInBytes);
-      for (int i = 0; i < unicodePassword.Length(); i++)
-      {
-        wchar_t c = unicodePassword[i];
-        ((Byte *)buffer)[i * 2] = (Byte)c;
-        ((Byte *)buffer)[i * 2 + 1] = (Byte)(c >> 8);
-      }
-
-      RINOK(m_RarAESSpec->CryptoSetPassword((const Byte *)buffer, sizeInBytes));
-
-      const UInt32 kDecryptedBufferSize = (1 << 12);
-      if (m_DecryptedData.GetCapacity() == 0)
-      {
-        const UInt32 kAlign = 16;
-        m_DecryptedData.SetCapacity(kDecryptedBufferSize + kAlign);
-        m_DecryptedDataAligned = (Byte *)((ptrdiff_t)((Byte *)m_DecryptedData + kAlign - 1) & ~(ptrdiff_t)(kAlign - 1));
-      }
-      RINOK(m_RarAES->Init());
-      size_t decryptedDataSizeT = kDecryptedBufferSize;
-      RINOK(ReadStream(m_Stream, m_DecryptedDataAligned, &decryptedDataSizeT));
-      m_DecryptedDataSize = (UInt32)decryptedDataSizeT;
-      m_DecryptedDataSize = m_RarAES->Filter(m_DecryptedDataAligned, m_DecryptedDataSize);
-
-      m_CryptoMode = true;
-      m_CryptoPos = 0;
-    }
-
-    m_FileHeaderData.EnsureCapacity(7);
-    size_t processed = 7;
-    RINOK(ReadBytesSpec((Byte *)m_FileHeaderData, &processed));
-    if (processed != 7)
-    {
-      if (processed != 0)
-        errorMessage = k_UnexpectedEnd;
-      return S_FALSE;
-    }
-
-    m_CurData = (Byte *)m_FileHeaderData;
-    m_CurPos = 0;
-    m_PosLimit = 7;
-    m_BlockHeader.CRC = ReadUInt16();
-    m_BlockHeader.Type = ReadByte();
-    m_BlockHeader.Flags = ReadUInt16();
-    m_BlockHeader.HeadSize = ReadUInt16();
-
-    if (m_BlockHeader.HeadSize < 7)
-      ThrowExceptionWithCode(CInArchiveException::kIncorrectArchive);
-
-    if (m_BlockHeader.Type == NHeader::NBlockType::kEndOfArchive)
-      return S_FALSE;
-
-    if (m_BlockHeader.Type == NHeader::NBlockType::kFileHeader)
-    {
-      m_FileHeaderData.EnsureCapacity(m_BlockHeader.HeadSize);
-      m_CurData = (Byte *)m_FileHeaderData;
-      m_PosLimit = m_BlockHeader.HeadSize;
-      if (!ReadBytesAndTestSize(m_CurData + m_CurPos, m_BlockHeader.HeadSize - 7))
-      {
-        errorMessage = k_UnexpectedEnd;
-        return S_FALSE;
-      }
-
-      ReadHeaderReal(item);
-      if ((CrcCalc(m_CurData + 2,
-          m_BlockHeader.HeadSize - item.CommentSize - 2) & 0xFFFF) != m_BlockHeader.CRC)
-        ThrowExceptionWithCode(CInArchiveException::kFileHeaderCRCError);
-
-      FinishCryptoBlock();
-      m_CryptoMode = false;
-      SeekInArchive(m_Position); // Move Position to compressed Data;
-      AddToSeekValue(item.PackSize);  // m_Position points to next header;
-      return S_OK;
-    }
-    if (m_CryptoMode && m_BlockHeader.HeadSize > (1 << 10))
-    {
-      decryptionError = true;
-      errorMessage = k_DecryptionError;
-      return S_FALSE;
-    }
-    if ((m_BlockHeader.Flags & NHeader::NBlock::kLongBlock) != 0)
-    {
-      m_FileHeaderData.EnsureCapacity(7 + 4);
-      m_CurData = (Byte *)m_FileHeaderData;
-      if (!ReadBytesAndTestSize(m_CurData + m_CurPos, 4))
-      {
-        errorMessage = k_UnexpectedEnd;
-        return S_FALSE;
-      }
-      m_PosLimit = 7 + 4;
-      UInt32 dataSize = ReadUInt32();
-      AddToSeekValue(dataSize);
-      if (m_CryptoMode && dataSize > (1 << 27))
-      {
-        decryptionError = true;
-        errorMessage = k_DecryptionError;
-        return S_FALSE;
-      }
-      m_CryptoPos = m_BlockHeader.HeadSize;
-    }
-    else
-      m_CryptoPos = 0;
-    AddToSeekValue(m_BlockHeader.HeadSize);
-    FinishCryptoBlock();
-    m_CryptoMode = false;
-  }
-}
-
-void CInArchive::SeekInArchive(UInt64 position)
-{
-  m_Stream->Seek(position, STREAM_SEEK_SET, NULL);
-}
-
-ISequentialInStream* CInArchive::CreateLimitedStream(UInt64 position, UInt64 size)
-{
-  CLimitedSequentialInStream *streamSpec = new CLimitedSequentialInStream;
-  CMyComPtr<ISequentialInStream> inStream(streamSpec);
-  SeekInArchive(position);
-  streamSpec->SetStream(m_Stream);
-  streamSpec->Init(size);
-  return inStream.Detach();
-}
-
-}}
diff -ruNa p7zip_9.20.1/CPP/7zip/Archive/Rar/RarIn.h p7zip-libre_9.20.1/CPP/7zip/Archive/Rar/RarIn.h
--- p7zip_9.20.1/CPP/7zip/Archive/Rar/RarIn.h	2011-01-08 06:41:27.000000000 -0300
+++ p7zip-libre_9.20.1/CPP/7zip/Archive/Rar/RarIn.h	1969-12-31 21:00:00.000000000 -0300
@@ -1,123 +0,0 @@
-// RarIn.h
-
-#ifndef __ARCHIVE_RAR_IN_H
-#define __ARCHIVE_RAR_IN_H
-
-#include "Common/DynamicBuffer.h"
-#include "Common/MyCom.h"
-
-#include "../../ICoder.h"
-#include "../../IStream.h"
-
-#include "../../Common/StreamObjects.h"
-
-#include "../../Crypto/RarAes.h"
-
-#include "RarHeader.h"
-#include "RarItem.h"
-
-namespace NArchive {
-namespace NRar {
-
-class CInArchiveException
-{
-public:
-  enum CCauseType
-  {
-    kUnexpectedEndOfArchive = 0,
-    kArchiveHeaderCRCError,
-    kFileHeaderCRCError,
-    kIncorrectArchive
-  }
-  Cause;
-  CInArchiveException(CCauseType cause) :   Cause(cause) {}
-};
-
-
-struct CInArchiveInfo
-{
-  UInt32 Flags;
-  Byte EncryptVersion;
-  UInt64 StartPosition;
-  
-  bool IsSolid() const { return (Flags & NHeader::NArchive::kSolid) != 0; }
-  bool IsCommented() const {  return (Flags & NHeader::NArchive::kComment) != 0; }
-  bool IsVolume() const {  return (Flags & NHeader::NArchive::kVolume) != 0; }
-  bool HaveNewVolumeName() const {  return (Flags & NHeader::NArchive::kNewVolName) != 0; }
-  bool IsEncrypted() const { return (Flags & NHeader::NArchive::kBlockEncryption) != 0; }
-  bool IsThereEncryptVer() const { return (Flags & NHeader::NArchive::kEncryptVer) != 0; }
-  bool IsEncryptOld() const { return (!IsThereEncryptVer() || EncryptVersion < 36); }
-};
-
-class CInArchive
-{
-  CMyComPtr<IInStream> m_Stream;
-  
-  UInt64 m_StreamStartPosition;
-  
-  CInArchiveInfo _header;
-  CDynamicBuffer<char> m_NameBuffer;
-  CDynamicBuffer<wchar_t> _unicodeNameBuffer;
-
-  CByteBuffer _comment;
-  
-  void ReadName(CItemEx &item, int nameSize);
-  void ReadHeaderReal(CItemEx &item);
-  
-  HRESULT ReadBytesSpec(void *data, size_t *size);
-  bool ReadBytesAndTestSize(void *data, UInt32 size);
-  
-  HRESULT Open2(IInStream *stream, const UInt64 *searchHeaderSizeLimit);
-
-  void ThrowExceptionWithCode(CInArchiveException::CCauseType cause);
-  void ThrowUnexpectedEndOfArchiveException();
-  
-  void AddToSeekValue(UInt64 addValue);
-  
-  CDynamicBuffer<Byte> m_FileHeaderData;
-  
-  NHeader::NBlock::CBlock m_BlockHeader;
-
-  NCrypto::NRar29::CDecoder *m_RarAESSpec;
-  CMyComPtr<ICompressFilter> m_RarAES;
-  
-  Byte *m_CurData; // it must point to start of Rar::Block
-  UInt32 m_CurPos;
-  UInt32 m_PosLimit;
-  Byte ReadByte();
-  UInt16 ReadUInt16();
-  UInt32 ReadUInt32();
-  void ReadTime(Byte mask, CRarTime &rarTime);
-
-  CBuffer<Byte> m_DecryptedData;
-  Byte *m_DecryptedDataAligned;
-  UInt32 m_DecryptedDataSize;
-
-  bool m_CryptoMode;
-  UInt32 m_CryptoPos;
-  void FinishCryptoBlock()
-  {
-    if (m_CryptoMode)
-      while ((m_CryptoPos & 0xF) != 0)
-      {
-        m_CryptoPos++;
-        m_Position++;
-      }
-  }
-
-public:
-  UInt64 m_Position;
-
-  HRESULT Open(IInStream *inStream, const UInt64 *searchHeaderSizeLimit);
-  void Close();
-  HRESULT GetNextItem(CItemEx &item, ICryptoGetTextPassword *getTextPassword, bool &decryptionError, AString &errorMessage);
-  
-  void GetArchiveInfo(CInArchiveInfo &archiveInfo) const;
-  
-  void SeekInArchive(UInt64 position);
-  ISequentialInStream *CreateLimitedStream(UInt64 position, UInt64 size);
-};
-  
-}}
-  
-#endif
diff -ruNa p7zip_9.20.1/CPP/7zip/Archive/Rar/RarItem.cpp p7zip-libre_9.20.1/CPP/7zip/Archive/Rar/RarItem.cpp
--- p7zip_9.20.1/CPP/7zip/Archive/Rar/RarItem.cpp	2008-08-14 06:11:25.000000000 -0300
+++ p7zip-libre_9.20.1/CPP/7zip/Archive/Rar/RarItem.cpp	1969-12-31 21:00:00.000000000 -0300
@@ -1,55 +0,0 @@
-// RarItem.cpp
-
-#include "StdAfx.h"
-
-#include "RarItem.h"
-
-namespace NArchive{
-namespace NRar{
-
-bool CItem::IgnoreItem() const
-{
-  switch(HostOS)
-  {
-    case NHeader::NFile::kHostMSDOS:
-    case NHeader::NFile::kHostOS2:
-    case NHeader::NFile::kHostWin32:
-      return ((Attrib & NHeader::NFile::kLabelFileAttribute) != 0);
-  }
-  return false;
-}
-
-bool CItem::IsDir() const
-{
-  if (GetDictSize() == NHeader::NFile::kDictDirectoryValue)
-    return true;
-  switch(HostOS)
-  {
-    case NHeader::NFile::kHostMSDOS:
-    case NHeader::NFile::kHostOS2:
-    case NHeader::NFile::kHostWin32:
-      if ((Attrib & FILE_ATTRIBUTE_DIRECTORY) != 0)
-        return true;
-  }
-  return false;
-}
-
-UInt32 CItem::GetWinAttributes() const
-{
-  UInt32 winAttributes;
-  switch(HostOS)
-  {
-    case NHeader::NFile::kHostMSDOS:
-    case NHeader::NFile::kHostOS2:
-    case NHeader::NFile::kHostWin32:
-      winAttributes = Attrib;
-      break;
-    default:
-      winAttributes = 0; // must be converted from unix value;
-  }
-  if (IsDir())
-    winAttributes |= NHeader::NFile::kWinFileDirectoryAttributeMask;
-  return winAttributes;
-}
-
-}}
diff -ruNa p7zip_9.20.1/CPP/7zip/Archive/Rar/RarItem.h p7zip-libre_9.20.1/CPP/7zip/Archive/Rar/RarItem.h
--- p7zip_9.20.1/CPP/7zip/Archive/Rar/RarItem.h	2008-08-14 06:11:12.000000000 -0300
+++ p7zip-libre_9.20.1/CPP/7zip/Archive/Rar/RarItem.h	1969-12-31 21:00:00.000000000 -0300
@@ -1,79 +0,0 @@
-// RarItem.h
-
-#ifndef __ARCHIVE_RAR_ITEM_H
-#define __ARCHIVE_RAR_ITEM_H
-
-#include "Common/Types.h"
-#include "Common/MyString.h"
-
-#include "RarHeader.h"
-
-namespace NArchive{
-namespace NRar{
-
-struct CRarTime
-{
-  UInt32 DosTime;
-  Byte LowSecond;
-  Byte SubTime[3];
-};
-
-struct CItem
-{
-  UInt64 Size;
-  UInt64 PackSize;
-  
-  CRarTime CTime;
-  CRarTime ATime;
-  CRarTime MTime;
-
-  UInt32 FileCRC;
-  UInt32 Attrib;
-
-  UInt16 Flags;
-  Byte HostOS;
-  Byte UnPackVersion;
-  Byte Method;
-
-  bool CTimeDefined;
-  bool ATimeDefined;
-
-  AString Name;
-  UString UnicodeName;
-
-  Byte Salt[8];
-  
-  bool IsEncrypted()   const { return (Flags & NHeader::NFile::kEncrypted) != 0; }
-  bool IsSolid()       const { return (Flags & NHeader::NFile::kSolid) != 0; }
-  bool IsCommented()   const { return (Flags & NHeader::NFile::kComment) != 0; }
-  bool IsSplitBefore() const { return (Flags & NHeader::NFile::kSplitBefore) != 0; }
-  bool IsSplitAfter()  const { return (Flags & NHeader::NFile::kSplitAfter) != 0; }
-  bool HasSalt()       const { return (Flags & NHeader::NFile::kSalt) != 0; }
-  bool HasExtTime()    const { return (Flags & NHeader::NFile::kExtTime) != 0; }
-  bool HasUnicodeName()const { return (Flags & NHeader::NFile::kUnicodeName) != 0; }
-  bool IsOldVersion()  const { return (Flags & NHeader::NFile::kOldVersion) != 0; }
-  
-  UInt32 GetDictSize() const { return (Flags >> NHeader::NFile::kDictBitStart) & NHeader::NFile::kDictMask; }
-  bool IsDir() const;
-  bool IgnoreItem() const;
-  UInt32 GetWinAttributes() const;
-  
-  CItem(): CTimeDefined(false), ATimeDefined(false) {}
-};
-
-class CItemEx: public CItem
-{
-public:
-  UInt64 Position;
-  UInt16 MainPartSize;
-  UInt16 CommentSize;
-  UInt16 AlignSize;
-  UInt64 GetFullSize()  const { return MainPartSize + CommentSize + AlignSize + PackSize; };
-  //  DWORD GetHeaderWithCommentSize()  const { return MainPartSize + CommentSize; };
-  UInt64 GetCommentPosition() const { return Position + MainPartSize; };
-  UInt64 GetDataPosition()    const { return GetCommentPosition() + CommentSize + AlignSize; };
-};
-
-}}
-
-#endif
diff -ruNa p7zip_9.20.1/CPP/7zip/Archive/Rar/RarRegister.cpp p7zip-libre_9.20.1/CPP/7zip/Archive/Rar/RarRegister.cpp
--- p7zip_9.20.1/CPP/7zip/Archive/Rar/RarRegister.cpp	2009-12-21 08:46:32.000000000 -0300
+++ p7zip-libre_9.20.1/CPP/7zip/Archive/Rar/RarRegister.cpp	1969-12-31 21:00:00.000000000 -0300
@@ -1,13 +0,0 @@
-// RarRegister.cpp
-
-#include "StdAfx.h"
-
-#include "../../Common/RegisterArc.h"
-
-#include "RarHandler.h"
-static IInArchive *CreateArc() { return new NArchive::NRar::CHandler; }
-
-static CArcInfo g_ArcInfo =
-  { L"Rar", L"rar r00", 0, 3, {0x52 , 0x61, 0x72, 0x21, 0x1a, 0x07, 0x00}, 7, false, CreateArc, 0,  };
-
-REGISTER_ARC(Rar)
diff -ruNa p7zip_9.20.1/CPP/7zip/Archive/Rar/RarVolumeInStream.cpp p7zip-libre_9.20.1/CPP/7zip/Archive/Rar/RarVolumeInStream.cpp
--- p7zip_9.20.1/CPP/7zip/Archive/Rar/RarVolumeInStream.cpp	2009-05-30 17:19:19.000000000 -0300
+++ p7zip-libre_9.20.1/CPP/7zip/Archive/Rar/RarVolumeInStream.cpp	1969-12-31 21:00:00.000000000 -0300
@@ -1,78 +0,0 @@
-// RarVolumeInStream.cpp
-
-#include "StdAfx.h"
-
-#include "../../../../C/7zCrc.h"
-
-#include "RarVolumeInStream.h"
-
-namespace NArchive {
-namespace NRar {
-
-void CFolderInStream::Init(
-    CObjectVector<CInArchive> *archives,
-    const CObjectVector<CItemEx> *items,
-    const CRefItem &refItem)
-{
-  _archives = archives;
-  _items = items;
-  _refItem = refItem;
-  _curIndex = 0;
-  CRCs.Clear();
-  _fileIsOpen = false;
-}
-
-HRESULT CFolderInStream::OpenStream()
-{
-  while (_curIndex < _refItem.NumItems)
-  {
-    const CItemEx &item = (*_items)[_refItem.ItemIndex + _curIndex];
-    _stream.Attach((*_archives)[_refItem.VolumeIndex + _curIndex].
-        CreateLimitedStream(item.GetDataPosition(), item.PackSize));
-    _curIndex++;
-    _fileIsOpen = true;
-    _crc = CRC_INIT_VAL;
-    return S_OK;
-  }
-  return S_OK;
-}
-
-HRESULT CFolderInStream::CloseStream()
-{
-  CRCs.Add(CRC_GET_DIGEST(_crc));
-  _stream.Release();
-  _fileIsOpen = false;
-  return S_OK;
-}
-
-STDMETHODIMP CFolderInStream::Read(void *data, UInt32 size, UInt32 *processedSize)
-{
-  UInt32 realProcessedSize = 0;
-  while ((_curIndex < _refItem.NumItems || _fileIsOpen) && size > 0)
-  {
-    if (_fileIsOpen)
-    {
-      UInt32 localProcessedSize;
-      RINOK(_stream->Read(
-          ((Byte *)data) + realProcessedSize, size, &localProcessedSize));
-      _crc = CrcUpdate(_crc, ((Byte *)data) + realProcessedSize, localProcessedSize);
-      if (localProcessedSize == 0)
-      {
-        RINOK(CloseStream());
-        continue;
-      }
-      realProcessedSize += localProcessedSize;
-      size -= localProcessedSize;
-      break;
-    }
-    else
-    {
-      RINOK(OpenStream());
-    }
-  }
-  if (processedSize != 0)
-    *processedSize = realProcessedSize;
-  return S_OK;
-}
-
-}}
diff -ruNa p7zip_9.20.1/CPP/7zip/Archive/Rar/RarVolumeInStream.h p7zip-libre_9.20.1/CPP/7zip/Archive/Rar/RarVolumeInStream.h
--- p7zip_9.20.1/CPP/7zip/Archive/Rar/RarVolumeInStream.h	2008-08-14 06:11:12.000000000 -0300
+++ p7zip-libre_9.20.1/CPP/7zip/Archive/Rar/RarVolumeInStream.h	1969-12-31 21:00:00.000000000 -0300
@@ -1,49 +0,0 @@
-// RarVolumeInStream.h
-
-#ifndef __RAR_VOLUME_IN_STREAM_H
-#define __RAR_VOLUME_IN_STREAM_H
-
-#include "../../IStream.h"
-#include "RarIn.h"
-
-namespace NArchive {
-namespace NRar {
-
-struct CRefItem
-{
-  int VolumeIndex;
-  int ItemIndex;
-  int NumItems;
-};
-
-class CFolderInStream:
-  public ISequentialInStream,
-  public CMyUnknownImp
-{
-public:
-  MY_UNKNOWN_IMP
-
-  STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);
-
-private:
-  CObjectVector<CInArchive> *_archives;
-  const CObjectVector<CItemEx> *_items;
-  CRefItem _refItem;
-  int _curIndex;
-  UInt32 _crc;
-  bool _fileIsOpen;
-  CMyComPtr<ISequentialInStream> _stream;
-
-  HRESULT OpenStream();
-  HRESULT CloseStream();
-public:
-  void Init(CObjectVector<CInArchive> *archives,
-      const CObjectVector<CItemEx> *items,
-      const CRefItem &refItem);
-
-  CRecordVector<UInt32> CRCs;
-};
-  
-}}
-
-#endif
diff -ruNa p7zip_9.20.1/CPP/7zip/Bundles/Format7zFree/makefile p7zip-libre_9.20.1/CPP/7zip/Bundles/Format7zFree/makefile
--- p7zip_9.20.1/CPP/7zip/Bundles/Format7zFree/makefile	2010-11-07 12:41:43.000000000 -0300
+++ p7zip-libre_9.20.1/CPP/7zip/Bundles/Format7zFree/makefile	2011-09-07 15:42:04.000000000 -0300
@@ -158,14 +158,6 @@
   NsisIn.o \
   NsisRegister.o \
 
-RAR_OBJS = \
-  RarHandler.o \
-  RarHeader.o \
-  RarIn.o \
-  RarItem.o \
-  RarVolumeInStream.o \
-  RarRegister.o \
-
 TAR_OBJS = \
   TarHandler.o \
   TarHandlerOut.o \
@@ -243,13 +235,6 @@
   ZlibEncoder.o \
   ZDecoder.o \
 
-COMPRESS_OBJS_NON_FREE = \
-  Rar1Decoder.o \
-  Rar2Decoder.o \
-  Rar3Decoder.o \
-  Rar3Vm.o \
-  RarCodecsRegister.o \
-
 CRYPTO_OBJS = \
   7zAes.o \
   7zAesRegister.o \
@@ -257,8 +242,6 @@
   MyAes.o \
   Pbkdf2HmacSha1.o \
   RandGen.o \
-  Rar20Crypto.o \
-  RarAes.o \
   Sha1.o \
   WzAes.o \
   ZipCrypto.o \
diff -ruNa p7zip_9.20.1/CPP/7zip/Compress/Rar/makefile p7zip-libre_9.20.1/CPP/7zip/Compress/Rar/makefile
--- p7zip_9.20.1/CPP/7zip/Compress/Rar/makefile	2010-03-16 17:21:18.000000000 -0300
+++ p7zip-libre_9.20.1/CPP/7zip/Compress/Rar/makefile	1969-12-31 21:00:00.000000000 -0300
@@ -1,34 +0,0 @@
-PROG=../../../../bin/Codecs/Rar29.so
-
-LOCAL_FLAGS=$(CC_SHARED) -DUNICODE -D_UNICODE
-
-MY_WINDOWS=
-
-include ../../../../makefile.crc32
-include ../../../../makefile.machine
-
-LOCAL_SHARED=$(LINK_SHARED)
-LIBS=$(LOCAL_LIBS)
-
-OBJS = \
-MyWindows.o \
-CRC.o\
-MyVector.o\
-CodecExports.o \
-DllExports.o \
-Rar1Decoder.o \
-Rar2Decoder.o \
-Rar3Decoder.o \
-Rar3Vm.o \
-RarCodecsRegister.o \
-$(OBJ_CRC32) \
-InBuffer.o \
-OutBuffer.o \
-StreamUtils.o \
-LzOutWindow.o \
-Ppmd7.o \
-Ppmd7Dec.o \
-Alloc.o
-
-include ../../../../makefile.glb
-
diff -ruNa p7zip_9.20.1/CPP/7zip/Compress/Rar/makefile.depend p7zip-libre_9.20.1/CPP/7zip/Compress/Rar/makefile.depend
--- p7zip_9.20.1/CPP/7zip/Compress/Rar/makefile.depend	2011-02-19 06:33:10.000000000 -0300
+++ p7zip-libre_9.20.1/CPP/7zip/Compress/Rar/makefile.depend	1969-12-31 21:00:00.000000000 -0300
@@ -1,158 +0,0 @@
-CRC.o: ../../../Common/CRC.cpp ../../../myWindows/StdAfx.h \
- ../../../myWindows/config.h ../../../Common/MyWindows.h \
- ../../../Common/MyGuidDef.h ../../../Common/Types.h \
- ../../../Common/../../C/Types.h ../../../Common/Types.h \
- ../../../include_windows/windows.h ../../../include_windows/basetyps.h \
- ../../../include_windows/tchar.h ../../../Common/../../C/7zCrc.h \
- ../../../Common/../../C/Types.h
-MyWindows.o: ../../../Common/MyWindows.cpp ../../../myWindows/StdAfx.h \
- ../../../myWindows/config.h ../../../Common/MyWindows.h \
- ../../../Common/MyGuidDef.h ../../../Common/Types.h \
- ../../../Common/../../C/Types.h ../../../Common/Types.h \
- ../../../include_windows/windows.h ../../../include_windows/basetyps.h \
- ../../../include_windows/tchar.h ../../../Common/MyWindows.h
-MyVector.o: ../../../Common/MyVector.cpp ../../../myWindows/StdAfx.h \
- ../../../myWindows/config.h ../../../Common/MyWindows.h \
- ../../../Common/MyGuidDef.h ../../../Common/Types.h \
- ../../../Common/../../C/Types.h ../../../Common/Types.h \
- ../../../include_windows/windows.h ../../../include_windows/basetyps.h \
- ../../../include_windows/tchar.h ../../../Common/MyVector.h \
- ../../../Common/Defs.h
-InBuffer.o: ../../Common/InBuffer.cpp ../../../myWindows/StdAfx.h \
- ../../../myWindows/config.h ../../../Common/MyWindows.h \
- ../../../Common/MyGuidDef.h ../../../Common/Types.h \
- ../../../Common/../../C/Types.h ../../../Common/Types.h \
- ../../../include_windows/windows.h ../../../include_windows/basetyps.h \
- ../../../include_windows/tchar.h ../../Common/../../../C/Alloc.h \
- ../../Common/InBuffer.h ../../Common/../IStream.h \
- ../../Common/../../Common/MyUnknown.h \
- ../../Common/../../Common/MyWindows.h ../../Common/../../Common/Types.h \
- ../../Common/../IDecl.h ../../Common/../../Common/MyCom.h \
- ../../Common/../../Common/MyException.h
-StreamUtils.o: ../../Common/StreamUtils.cpp ../../../myWindows/StdAfx.h \
- ../../../myWindows/config.h ../../../Common/MyWindows.h \
- ../../../Common/MyGuidDef.h ../../../Common/Types.h \
- ../../../Common/../../C/Types.h ../../../Common/Types.h \
- ../../../include_windows/windows.h ../../../include_windows/basetyps.h \
- ../../../include_windows/tchar.h ../../Common/StreamUtils.h \
- ../../Common/../IStream.h ../../Common/../../Common/MyUnknown.h \
- ../../Common/../../Common/MyWindows.h ../../Common/../../Common/Types.h \
- ../../Common/../IDecl.h
-OutBuffer.o: ../../Common/OutBuffer.cpp ../../../myWindows/StdAfx.h \
- ../../../myWindows/config.h ../../../Common/MyWindows.h \
- ../../../Common/MyGuidDef.h ../../../Common/Types.h \
- ../../../Common/../../C/Types.h ../../../Common/Types.h \
- ../../../include_windows/windows.h ../../../include_windows/basetyps.h \
- ../../../include_windows/tchar.h ../../Common/../../../C/Alloc.h \
- ../../Common/OutBuffer.h ../../Common/../IStream.h \
- ../../Common/../../Common/MyUnknown.h \
- ../../Common/../../Common/MyWindows.h ../../Common/../../Common/Types.h \
- ../../Common/../IDecl.h ../../Common/../../Common/MyCom.h \
- ../../Common/../../Common/MyException.h
-LzOutWindow.o: ../LzOutWindow.cpp ../../../myWindows/StdAfx.h \
- ../../../myWindows/config.h ../../../Common/MyWindows.h \
- ../../../Common/MyGuidDef.h ../../../Common/Types.h \
- ../../../Common/../../C/Types.h ../../../Common/Types.h \
- ../../../include_windows/windows.h ../../../include_windows/basetyps.h \
- ../../../include_windows/tchar.h ../LzOutWindow.h ../../IStream.h \
- ../../../Common/MyUnknown.h ../../../Common/MyWindows.h \
- ../../../Common/Types.h ../../IDecl.h ../../Common/OutBuffer.h \
- ../../Common/../IStream.h ../../Common/../../Common/MyCom.h \
- ../../Common/../../Common/MyWindows.h \
- ../../Common/../../Common/MyException.h
-CodecExports.o: ../CodecExports.cpp ../../../myWindows/StdAfx.h \
- ../../../myWindows/config.h ../../../Common/MyWindows.h \
- ../../../Common/MyGuidDef.h ../../../Common/Types.h \
- ../../../Common/../../C/Types.h ../../../Common/Types.h \
- ../../../include_windows/windows.h ../../../include_windows/basetyps.h \
- ../../../include_windows/tchar.h ../../../Common/ComTry.h \
- ../../../Common/MyWindows.h ../../../Windows/PropVariant.h \
- ../../../Windows/../Common/MyWindows.h \
- ../../../Windows/../Common/Types.h ../../ICoder.h ../../IStream.h \
- ../../../Common/MyUnknown.h ../../../Common/Types.h ../../IDecl.h \
- ../../Common/RegisterCodec.h ../../Common/../Common/MethodId.h \
- ../../Common/../Common/../../Common/Types.h
-DllExports.o: ../DllExports.cpp ../../../myWindows/StdAfx.h \
- ../../../myWindows/config.h ../../../Common/MyWindows.h \
- ../../../Common/MyGuidDef.h ../../../Common/Types.h \
- ../../../Common/../../C/Types.h ../../../Common/Types.h \
- ../../../include_windows/windows.h ../../../include_windows/basetyps.h \
- ../../../include_windows/tchar.h ../../../Common/MyInitGuid.h \
- ../../ICoder.h ../../IStream.h ../../../Common/MyUnknown.h \
- ../../../Common/MyWindows.h ../../../Common/Types.h ../../IDecl.h \
- ../../Common/RegisterCodec.h ../../Common/../Common/MethodId.h \
- ../../Common/../Common/../../Common/Types.h
-Rar1Decoder.o: ../Rar1Decoder.cpp ../../../myWindows/StdAfx.h \
- ../../../myWindows/config.h ../../../Common/MyWindows.h \
- ../../../Common/MyGuidDef.h ../../../Common/Types.h \
- ../../../Common/../../C/Types.h ../../../Common/Types.h \
- ../../../include_windows/windows.h ../../../include_windows/basetyps.h \
- ../../../include_windows/tchar.h ../Rar1Decoder.h \
- ../../../Common/MyCom.h ../../../Common/MyWindows.h ../../ICoder.h \
- ../../IStream.h ../../../Common/MyUnknown.h ../../../Common/Types.h \
- ../../IDecl.h ../../Common/InBuffer.h ../../Common/../IStream.h \
- ../../Common/../../Common/MyCom.h \
- ../../Common/../../Common/MyException.h \
- ../../Common/../../Common/MyWindows.h ../BitmDecoder.h ../../IStream.h \
- ../HuffmanDecoder.h ../../../Common/Types.h ../LzOutWindow.h \
- ../../Common/OutBuffer.h
-Rar2Decoder.o: ../Rar2Decoder.cpp ../../../myWindows/StdAfx.h \
- ../../../myWindows/config.h ../../../Common/MyWindows.h \
- ../../../Common/MyGuidDef.h ../../../Common/Types.h \
- ../../../Common/../../C/Types.h ../../../Common/Types.h \
- ../../../include_windows/windows.h ../../../include_windows/basetyps.h \
- ../../../include_windows/tchar.h ../Rar2Decoder.h \
- ../../../Common/MyCom.h ../../../Common/MyWindows.h ../../ICoder.h \
- ../../IStream.h ../../../Common/MyUnknown.h ../../../Common/Types.h \
- ../../IDecl.h ../../Common/InBuffer.h ../../Common/../IStream.h \
- ../../Common/../../Common/MyCom.h \
- ../../Common/../../Common/MyException.h \
- ../../Common/../../Common/MyWindows.h ../BitmDecoder.h ../../IStream.h \
- ../HuffmanDecoder.h ../../../Common/Types.h ../LzOutWindow.h \
- ../../Common/OutBuffer.h
-Rar3Decoder.o: ../Rar3Decoder.cpp ../../../myWindows/StdAfx.h \
- ../../../myWindows/config.h ../../../Common/MyWindows.h \
- ../../../Common/MyGuidDef.h ../../../Common/Types.h \
- ../../../Common/../../C/Types.h ../../../Common/Types.h \
- ../../../include_windows/windows.h ../../../include_windows/basetyps.h \
- ../../../include_windows/tchar.h ../../../../C/Alloc.h \
- ../../Common/StreamUtils.h ../../Common/../IStream.h \
- ../../Common/../../Common/MyUnknown.h \
- ../../Common/../../Common/MyWindows.h ../../Common/../../Common/Types.h \
- ../../Common/../IDecl.h ../Rar3Decoder.h ../../../../C/Ppmd7.h \
- ../../../../C/Ppmd.h ../../../../C/Types.h ../../../../C/CpuArch.h \
- ../../../Common/MyCom.h ../../../Common/MyWindows.h ../../ICoder.h \
- ../../IStream.h ../../Common/InBuffer.h \
- ../../Common/../../Common/MyCom.h \
- ../../Common/../../Common/MyException.h ../BitmDecoder.h ../../IStream.h \
- ../HuffmanDecoder.h ../../../Common/Types.h ../Rar3Vm.h \
- ../../../../C/CpuArch.h ../../../Common/MyVector.h \
- ../../../Common/Defs.h
-Rar3Vm.o: ../Rar3Vm.cpp ../../../myWindows/StdAfx.h \
- ../../../myWindows/config.h ../../../Common/MyWindows.h \
- ../../../Common/MyGuidDef.h ../../../Common/Types.h \
- ../../../Common/../../C/Types.h ../../../Common/Types.h \
- ../../../include_windows/windows.h ../../../include_windows/basetyps.h \
- ../../../include_windows/tchar.h ../../../../C/7zCrc.h \
- ../../../../C/Types.h ../../../../C/Alloc.h ../Rar3Vm.h \
- ../../../../C/CpuArch.h ../../../Common/MyVector.h \
- ../../../Common/Defs.h
-RarCodecsRegister.o: ../RarCodecsRegister.cpp ../../../myWindows/StdAfx.h \
- ../../../myWindows/config.h ../../../Common/MyWindows.h \
- ../../../Common/MyGuidDef.h ../../../Common/Types.h \
- ../../../Common/../../C/Types.h ../../../Common/Types.h \
- ../../../include_windows/windows.h ../../../include_windows/basetyps.h \
- ../../../include_windows/tchar.h ../../Common/RegisterCodec.h \
- ../../Common/../Common/MethodId.h \
- ../../Common/../Common/../../Common/Types.h ../Rar1Decoder.h \
- ../../../Common/MyCom.h ../../../Common/MyWindows.h ../../ICoder.h \
- ../../IStream.h ../../../Common/MyUnknown.h ../../../Common/Types.h \
- ../../IDecl.h ../../Common/InBuffer.h ../../Common/../IStream.h \
- ../../Common/../../Common/MyCom.h \
- ../../Common/../../Common/MyException.h \
- ../../Common/../../Common/MyWindows.h ../BitmDecoder.h ../../IStream.h \
- ../HuffmanDecoder.h ../../../Common/Types.h ../LzOutWindow.h \
- ../../Common/OutBuffer.h ../Rar2Decoder.h ../Rar3Decoder.h \
- ../../../../C/Ppmd7.h ../../../../C/Ppmd.h ../../../../C/Types.h \
- ../../../../C/CpuArch.h ../Rar3Vm.h ../../../../C/CpuArch.h \
- ../../../Common/MyVector.h ../../../Common/Defs.h
diff -ruNa p7zip_9.20.1/CPP/7zip/Compress/Rar/makefile.list p7zip-libre_9.20.1/CPP/7zip/Compress/Rar/makefile.list
--- p7zip_9.20.1/CPP/7zip/Compress/Rar/makefile.list	2010-03-16 17:23:04.000000000 -0300
+++ p7zip-libre_9.20.1/CPP/7zip/Compress/Rar/makefile.list	1969-12-31 21:00:00.000000000 -0300
@@ -1,64 +0,0 @@
-SRCS=\
- ../../../Common/CRC.cpp \
- ../../../Common/MyWindows.cpp \
- ../../../Common/MyVector.cpp \
- ../../Common/InBuffer.cpp \
- ../../Common/StreamUtils.cpp \
- ../../Common/OutBuffer.cpp \
-../LzOutWindow.cpp \
-../CodecExports.cpp \
-../DllExports.cpp \
-../Rar1Decoder.cpp \
-../Rar2Decoder.cpp \
-../Rar3Decoder.cpp \
-../Rar3Vm.cpp \
-../RarCodecsRegister.cpp
-
-SRCS_C=\
- ../../../../C/Alloc.c \
- ../../../../C/Ppmd7.c \
- ../../../../C/Ppmd7Dec.c
-
-CRC.o : ../../../Common/CRC.cpp
-	$(CXX) $(CC_SHARED) $(CXXFLAGS) ../../../Common/CRC.cpp
-MyWindows.o : ../../../Common/MyWindows.cpp
-	$(CXX) $(CC_SHARED) $(CXXFLAGS) ../../../Common/MyWindows.cpp
-MyVector.o : ../../../Common/MyVector.cpp
-	$(CXX) $(CC_SHARED) $(CXXFLAGS) ../../../Common/MyVector.cpp
-DllExports.o : ../DllExports.cpp
-	$(CXX) $(CC_SHARED) $(CXXFLAGS) ../DllExports.cpp
-CodecExports.o : ../CodecExports.cpp
-	$(CXX) $(CC_SHARED) $(CXXFLAGS) ../CodecExports.cpp
-InBuffer.o : ../../Common/InBuffer.cpp
-	$(CXX) $(CC_SHARED) $(CXXFLAGS) ../../Common/InBuffer.cpp
-LzOutWindow.o : ../LzOutWindow.cpp
-	$(CXX) $(CC_SHARED) $(CXXFLAGS) ../LzOutWindow.cpp
-StreamUtils.o : ../../Common/StreamUtils.cpp
-	$(CXX) $(CC_SHARED) $(CXXFLAGS) ../../Common/StreamUtils.cpp
-OutBuffer.o : ../../Common/OutBuffer.cpp
-	$(CXX) $(CC_SHARED) $(CXXFLAGS) ../../Common/OutBuffer.cpp
-Rar1Decoder.o : ../Rar1Decoder.cpp
-	$(CXX) $(CC_SHARED) $(CXXFLAGS) ../Rar1Decoder.cpp
-Rar2Decoder.o : ../Rar2Decoder.cpp
-	$(CXX) $(CC_SHARED) $(CXXFLAGS) ../Rar2Decoder.cpp
-Rar3Decoder.o : ../Rar3Decoder.cpp
-	$(CXX) $(CC_SHARED) $(CXXFLAGS) ../Rar3Decoder.cpp
-Rar3Vm.o : ../Rar3Vm.cpp
-	$(CXX) $(CC_SHARED) $(CXXFLAGS) ../Rar3Vm.cpp
-RarCodecsRegister.o : ../RarCodecsRegister.cpp
-	$(CXX) $(CC_SHARED) $(CXXFLAGS) ../RarCodecsRegister.cpp
-Alloc.o : ../../../../C/Alloc.c
-	$(CC) $(CC_SHARED) $(CFLAGS) ../../../../C/Alloc.c
-Ppmd7.o : ../../../../C/Ppmd7.c
-	$(CC) $(CC_SHARED) $(CFLAGS) ../../../../C/Ppmd7.c
-Ppmd7Dec.o : ../../../../C/Ppmd7Dec.c
-	$(CC) $(CC_SHARED) $(CFLAGS) ../../../../C/Ppmd7Dec.c
-
-# CRC32, C version
-7zCrc.o : ../../../../C/7zCrc.c
-	$(CC) $(CC_SHARED) $(CFLAGS) ../../../../C/7zCrc.c
-7zCrcOpt.o : ../../../../C/7zCrcOpt.c
-	$(CC) $(CC_SHARED) $(CFLAGS) ../../../../C/7zCrcOpt.c
-# CRC32, ASM version
-7zCrcT8.o : ../../../../C/7zCrcT8.c
-	$(CC) $(CC_SHARED) $(CFLAGS) ../../../../C/7zCrcT8.c
diff -ruNa p7zip_9.20.1/CPP/7zip/Compress/Rar1Decoder.cpp p7zip-libre_9.20.1/CPP/7zip/Compress/Rar1Decoder.cpp
--- p7zip_9.20.1/CPP/7zip/Compress/Rar1Decoder.cpp	2009-12-21 08:46:36.000000000 -0300
+++ p7zip-libre_9.20.1/CPP/7zip/Compress/Rar1Decoder.cpp	1969-12-31 21:00:00.000000000 -0300
@@ -1,480 +0,0 @@
-// Rar1Decoder.cpp
-// According to unRAR license, this code may not be used to develop
-// a program that creates RAR archives
- 
-#include "StdAfx.h"
-
-#include "Rar1Decoder.h"
-
-namespace NCompress {
-namespace NRar1 {
-
-static UInt32 PosL1[]={0,0,0,2,3,5,7,11,16,20,24,32,32, 256};
-static UInt32 PosL2[]={0,0,0,0,5,7,9,13,18,22,26,34,36, 256};
-static UInt32 PosHf0[]={0,0,0,0,0,8,16,24,33,33,33,33,33, 257};
-static UInt32 PosHf1[]={0,0,0,0,0,0,4,44,60,76,80,80,127, 257};
-static UInt32 PosHf2[]={0,0,0,0,0,0,2,7,53,117,233, 257,0};
-static UInt32 PosHf3[]={0,0,0,0,0,0,0,2,16,218,251, 257,0};
-static UInt32 PosHf4[]={0,0,0,0,0,0,0,0,0,255, 257,0,0};
-
-static const UInt32 kHistorySize = (1 << 16);
-
-class CCoderReleaser
-{
-  CDecoder *m_Coder;
-public:
-  CCoderReleaser(CDecoder *coder): m_Coder(coder) {}
-  ~CCoderReleaser() { m_Coder->ReleaseStreams(); }
-};
-
-CDecoder::CDecoder(): m_IsSolid(false) { }
-
-void CDecoder::InitStructures()
-{
-  for(int i = 0; i < kNumRepDists; i++)
-    m_RepDists[i] = 0;
-  m_RepDistPtr = 0;
-  LastLength = 0;
-  LastDist = 0;
-}
-
-UInt32 CDecoder::ReadBits(int numBits) { return m_InBitStream.ReadBits(numBits); }
-
-HRESULT CDecoder::CopyBlock(UInt32 distance, UInt32 len)
-{
-  if (len == 0)
-    return S_FALSE;
-  m_UnpackSize -= len;
-  return m_OutWindowStream.CopyBlock(distance, len) ? S_OK : S_FALSE;
-}
-
-
-UInt32 CDecoder::DecodeNum(const UInt32 *posTab)
-{
-  UInt32 startPos = 2;
-  UInt32 num = m_InBitStream.GetValue(12);
-  for (;;)
-  {
-    UInt32 cur = (posTab[startPos + 1] - posTab[startPos]) << (12 - startPos);
-    if (num < cur)
-      break;
-    startPos++;
-    num -= cur;
-  }
-  m_InBitStream.MovePos(startPos);
-  return((num >> (12 - startPos)) + posTab[startPos]);
-}
-
-static Byte kShortLen1[]  = {1,3,4,4,5,6,7,8,8,4,4,5,6,6 };
-static Byte kShortLen1a[] = {1,4,4,4,5,6,7,8,8,4,4,5,6,6,4 };
-static Byte kShortLen2[]  = {2,3,3,3,4,4,5,6,6,4,4,5,6,6 };
-static Byte kShortLen2a[] = {2,3,3,4,4,4,5,6,6,4,4,5,6,6,4 };
-static UInt32 kShortXor1[] = {0,0xa0,0xd0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff,0xc0,0x80,0x90,0x98,0x9c,0xb0};
-static UInt32 kShortXor2[] = {0,0x40,0x60,0xa0,0xd0,0xe0,0xf0,0xf8,0xfc,0xc0,0x80,0x90,0x98,0x9c,0xb0};
-
-HRESULT CDecoder::ShortLZ()
-{
-  UInt32 len, saveLen, dist;
-  int distancePlace;
-  Byte *kShortLen;
-  const UInt32 *kShortXor;
-  NumHuf = 0;
-
-  if (LCount == 2)
-  {
-    if (ReadBits(1))
-      return CopyBlock(LastDist, LastLength);
-    LCount = 0;
-  }
-
-  UInt32 bitField = m_InBitStream.GetValue(8);
-
-  if (AvrLn1 < 37)
-  {
-    kShortLen = Buf60 ? kShortLen1a : kShortLen1;
-    kShortXor = kShortXor1;
-  }
-  else
-  {
-    kShortLen = Buf60 ? kShortLen2a : kShortLen2;
-    kShortXor = kShortXor2;
-  }
-
-  for (len = 0; ((bitField ^ kShortXor[len]) & (~(0xff >> kShortLen[len]))) != 0; len++);
-  m_InBitStream.MovePos(kShortLen[len]);
-
-  if (len >= 9)
-  {
-    if (len == 9)
-    {
-      LCount++;
-      return CopyBlock(LastDist, LastLength);
-    }
-    if (len == 14)
-    {
-      LCount = 0;
-      len = DecodeNum(PosL2) + 5;
-      dist = 0x8000 + ReadBits(15) - 1;
-      LastLength = len;
-      LastDist = dist;
-      return CopyBlock(dist, len);
-    }
-
-    LCount = 0;
-    saveLen = len;
-    dist = m_RepDists[(m_RepDistPtr - (len - 9)) & 3];
-    len = DecodeNum(PosL1) + 2;
-    if (len == 0x101 && saveLen == 10)
-    {
-      Buf60 ^= 1;
-      return S_OK;
-    }
-    if (dist >= 256)
-      len++;
-    if (dist >= MaxDist3 - 1)
-      len++;
-  }
-  else
-  {
-    LCount = 0;
-    AvrLn1 += len;
-    AvrLn1 -= AvrLn1 >> 4;
-    
-    distancePlace = DecodeNum(PosHf2) & 0xff;
-    dist = ChSetA[distancePlace];
-    if (--distancePlace != -1)
-    {
-      PlaceA[dist]--;
-      UInt32 lastDistance = ChSetA[distancePlace];
-      PlaceA[lastDistance]++;
-      ChSetA[distancePlace + 1] = lastDistance;
-      ChSetA[distancePlace] = dist;
-    }
-    len += 2;
-  }
-  m_RepDists[m_RepDistPtr++] = dist;
-  m_RepDistPtr &= 3;
-  LastLength = len;
-  LastDist = dist;
-  return CopyBlock(dist, len);
-}
-
-
-HRESULT CDecoder::LongLZ()
-{
-  UInt32 len;
-  UInt32 dist;
-  UInt32 distancePlace, newDistancePlace;
-  UInt32 oldAvr2, oldAvr3;
-
-  NumHuf = 0;
-  Nlzb += 16;
-  if (Nlzb > 0xff)
-  {
-    Nlzb = 0x90;
-    Nhfb >>= 1;
-  }
-  oldAvr2=AvrLn2;
-
-  if (AvrLn2 >= 122)
-    len = DecodeNum(PosL2);
-  else if (AvrLn2 >= 64)
-    len = DecodeNum(PosL1);
-  else
-  {
-    UInt32 bitField = m_InBitStream.GetValue(16);
-    if (bitField < 0x100)
-    {
-      len = bitField;
-      m_InBitStream.MovePos(16);
-    }
-    else
-    {
-      for (len = 0; ((bitField << len) & 0x8000) == 0; len++)
-        ;
-      m_InBitStream.MovePos(len + 1);
-    }
-  }
-
-  AvrLn2 += len;
-  AvrLn2 -= AvrLn2 >> 5;
-
-  if (AvrPlcB > 0x28ff)
-    distancePlace = DecodeNum(PosHf2);
-  else if (AvrPlcB > 0x6ff)
-    distancePlace = DecodeNum(PosHf1);
-  else
-    distancePlace = DecodeNum(PosHf0);
-
-  AvrPlcB += distancePlace;
-  AvrPlcB -= AvrPlcB >> 8;
-  for (;;)
-  {
-    dist = ChSetB[distancePlace & 0xff];
-    newDistancePlace = NToPlB[dist++ & 0xff]++;
-    if (!(dist & 0xff))
-      CorrHuff(ChSetB,NToPlB);
-    else
-      break;
-  }
-
-  ChSetB[distancePlace] = ChSetB[newDistancePlace];
-  ChSetB[newDistancePlace] = dist;
-
-  dist = ((dist & 0xff00) >> 1) | ReadBits(7);
-
-  oldAvr3 = AvrLn3;
-  if (len != 1 && len != 4)
-    if (len == 0 && dist <= MaxDist3)
-    {
-      AvrLn3++;
-      AvrLn3 -= AvrLn3 >> 8;
-    }
-    else
-      if (AvrLn3 > 0)
-        AvrLn3--;
-  len += 3;
-  if (dist >= MaxDist3)
-    len++;
-  if (dist <= 256)
-    len += 8;
-  if (oldAvr3 > 0xb0 || AvrPlc >= 0x2a00 && oldAvr2 < 0x40)
-    MaxDist3 = 0x7f00;
-  else
-    MaxDist3 = 0x2001;
-  m_RepDists[m_RepDistPtr++] = --dist;
-  m_RepDistPtr &= 3;
-  LastLength = len;
-  LastDist = dist;
-  return CopyBlock(dist, len);
-}
-
-
-HRESULT CDecoder::HuffDecode()
-{
-  UInt32 curByte, newBytePlace;
-  UInt32 len;
-  UInt32 dist;
-  int bytePlace;
-
-  if      (AvrPlc > 0x75ff)  bytePlace = DecodeNum(PosHf4);
-  else if (AvrPlc > 0x5dff)  bytePlace = DecodeNum(PosHf3);
-  else if (AvrPlc > 0x35ff)  bytePlace = DecodeNum(PosHf2);
-  else if (AvrPlc > 0x0dff)  bytePlace = DecodeNum(PosHf1);
-  else                       bytePlace = DecodeNum(PosHf0);
-  if (StMode)
-  {
-    if (--bytePlace == -1)
-    {
-      if (ReadBits(1))
-      {
-        NumHuf = StMode = 0;
-        return S_OK;
-      }
-      else
-      {
-        len = (ReadBits(1)) ? 4 : 3;
-        dist = DecodeNum(PosHf2);
-        dist = (dist << 5) | ReadBits(5);
-        return CopyBlock(dist - 1, len);
-      }
-    }
-  }
-  else if (NumHuf++ >= 16 && FlagsCnt == 0)
-    StMode = 1;
-  bytePlace &= 0xff;
-  AvrPlc += bytePlace;
-  AvrPlc -= AvrPlc >> 8;
-  Nhfb+=16;
-  if (Nhfb > 0xff)
-  {
-    Nhfb=0x90;
-    Nlzb >>= 1;
-  }
-
-  m_UnpackSize --;
-  m_OutWindowStream.PutByte((Byte)(ChSet[bytePlace] >> 8));
-
-  for (;;)
-  {
-    curByte = ChSet[bytePlace];
-    newBytePlace = NToPl[curByte++ & 0xff]++;
-    if ((curByte & 0xff) > 0xa1)
-      CorrHuff(ChSet, NToPl);
-    else
-      break;
-  }
-
-  ChSet[bytePlace] = ChSet[newBytePlace];
-  ChSet[newBytePlace] = curByte;
-  return S_OK;
-}
-
-
-void CDecoder::GetFlagsBuf()
-{
-  UInt32 flags, newFlagsPlace;
-  UInt32 flagsPlace = DecodeNum(PosHf2);
-
-  for (;;)
-  {
-    flags = ChSetC[flagsPlace];
-    FlagBuf = flags >> 8;
-    newFlagsPlace = NToPlC[flags++ & 0xff]++;
-    if ((flags & 0xff) != 0)
-      break;
-    CorrHuff(ChSetC, NToPlC);
-  }
-
-  ChSetC[flagsPlace] = ChSetC[newFlagsPlace];
-  ChSetC[newFlagsPlace] = flags;
-}
-
-void CDecoder::InitData()
-{
-  if (!m_IsSolid)
-  {
-    AvrPlcB = AvrLn1 = AvrLn2 = AvrLn3 = NumHuf = Buf60 = 0;
-    AvrPlc = 0x3500;
-    MaxDist3 = 0x2001;
-    Nhfb = Nlzb = 0x80;
-  }
-  FlagsCnt = 0;
-  FlagBuf = 0;
-  StMode = 0;
-  LCount = 0;
-}
-
-void CDecoder::CorrHuff(UInt32 *CharSet,UInt32 *NumToPlace)
-{
-  int i;
-  for (i = 7; i >= 0; i--)
-    for (int j = 0; j < 32; j++, CharSet++)
-      *CharSet = (*CharSet & ~0xff) | i;
-  memset(NumToPlace, 0, sizeof(NToPl));
-  for (i = 6; i >= 0; i--)
-    NumToPlace[i] = (7 - i) * 32;
-}
-
-void CDecoder::InitHuff()
-{
-  for (UInt32 i = 0; i < 256; i++)
-  {
-    Place[i] = PlaceA[i] = PlaceB[i] = i;
-    PlaceC[i] = (~i + 1) & 0xff;
-    ChSet[i] = ChSetB[i] = i << 8;
-    ChSetA[i] = i;
-    ChSetC[i] = ((~i + 1) & 0xff) << 8;
-  }
-  memset(NToPl, 0, sizeof(NToPl));
-  memset(NToPlB, 0, sizeof(NToPlB));
-  memset(NToPlC, 0, sizeof(NToPlC));
-  CorrHuff(ChSetB, NToPlB);
-}
-
-HRESULT CDecoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,
-    const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo * /* progress */)
-{
-  if (inSize == NULL || outSize == NULL)
-    return E_INVALIDARG;
-
-  if (!m_OutWindowStream.Create(kHistorySize))
-    return E_OUTOFMEMORY;
-  if (!m_InBitStream.Create(1 << 20))
-    return E_OUTOFMEMORY;
-
-  m_UnpackSize = (Int64)*outSize;
-  m_OutWindowStream.SetStream(outStream);
-  m_OutWindowStream.Init(m_IsSolid);
-  m_InBitStream.SetStream(inStream);
-  m_InBitStream.Init();
-
-  CCoderReleaser coderReleaser(this);
-  InitData();
-  if (!m_IsSolid)
-  {
-    InitStructures();
-    InitHuff();
-  }
-  if (m_UnpackSize > 0)
-  {
-    GetFlagsBuf();
-    FlagsCnt = 8;
-  }
-
-  while (m_UnpackSize > 0)
-  {
-    if (StMode)
-    {
-      RINOK(HuffDecode());
-      continue;
-    }
-
-    if (--FlagsCnt < 0)
-    {
-      GetFlagsBuf();
-      FlagsCnt=7;
-    }
-
-    if (FlagBuf & 0x80)
-    {
-      FlagBuf <<= 1;
-      if (Nlzb > Nhfb)
-      {
-        RINOK(LongLZ());
-      }
-      else
-      {
-        RINOK(HuffDecode());
-      }
-    }
-    else
-    {
-      FlagBuf <<= 1;
-      if (--FlagsCnt < 0)
-      {
-        GetFlagsBuf();
-        FlagsCnt = 7;
-      }
-      if (FlagBuf & 0x80)
-      {
-        FlagBuf <<= 1;
-        if (Nlzb > Nhfb)
-        {
-          RINOK(HuffDecode());
-        }
-        else
-        {
-          RINOK(LongLZ());
-        }
-      }
-      else
-      {
-        FlagBuf <<= 1;
-        RINOK(ShortLZ());
-      }
-    }
-  }
-  if (m_UnpackSize < 0)
-    return S_FALSE;
-  return m_OutWindowStream.Flush();
-}
-
-STDMETHODIMP CDecoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,
-    const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress)
-{
-  try { return CodeReal(inStream, outStream, inSize, outSize, progress); }
-  catch(const CInBufferException &e) { return e.ErrorCode; }
-  catch(const CLzOutWindowException &e) { return e.ErrorCode; }
-  catch(...) { return S_FALSE; }
-}
-
-STDMETHODIMP CDecoder::SetDecoderProperties2(const Byte *data, UInt32 size)
-{
-  if (size < 1)
-    return E_INVALIDARG;
-  m_IsSolid = (data[0] != 0);
-  return S_OK;
-}
-
-}}
diff -ruNa p7zip_9.20.1/CPP/7zip/Compress/Rar1Decoder.h p7zip-libre_9.20.1/CPP/7zip/Compress/Rar1Decoder.h
--- p7zip_9.20.1/CPP/7zip/Compress/Rar1Decoder.h	2009-02-07 15:06:28.000000000 -0200
+++ p7zip-libre_9.20.1/CPP/7zip/Compress/Rar1Decoder.h	1969-12-31 21:00:00.000000000 -0300
@@ -1,88 +0,0 @@
-// Rar1Decoder.h
-// According to unRAR license, this code may not be used to develop
-// a program that creates RAR archives
-
-#ifndef __COMPRESS_RAR1_DECODER_H
-#define __COMPRESS_RAR1_DECODER_H
-
-#include "../../Common/MyCom.h"
-
-#include "../ICoder.h"
-
-#include "../Common/InBuffer.h"
-
-#include "BitmDecoder.h"
-#include "HuffmanDecoder.h"
-#include "LzOutWindow.h"
-
-namespace NCompress {
-namespace NRar1 {
-
-const UInt32 kNumRepDists = 4;
-
-typedef NBitm::CDecoder<CInBuffer> CBitDecoder;
-
-class CDecoder :
-  public ICompressCoder,
-  public ICompressSetDecoderProperties2,
-  public CMyUnknownImp
-{
-public:
-  CLzOutWindow m_OutWindowStream;
-  CBitDecoder m_InBitStream;
-
-  UInt32 m_RepDists[kNumRepDists];
-  UInt32 m_RepDistPtr;
-
-  UInt32 LastDist;
-  UInt32 LastLength;
-
-  Int64 m_UnpackSize;
-  bool m_IsSolid;
-
-  UInt32 ReadBits(int numBits);
-  HRESULT CopyBlock(UInt32 distance, UInt32 len);
-
-  UInt32 DecodeNum(const UInt32 *posTab);
-  HRESULT ShortLZ();
-  HRESULT LongLZ();
-  HRESULT HuffDecode();
-  void GetFlagsBuf();
-  void InitData();
-  void InitHuff();
-  void CorrHuff(UInt32 *CharSet, UInt32 *NumToPlace);
-  void OldUnpWriteBuf();
-  
-  UInt32 ChSet[256],ChSetA[256],ChSetB[256],ChSetC[256];
-  UInt32 Place[256],PlaceA[256],PlaceB[256],PlaceC[256];
-  UInt32 NToPl[256],NToPlB[256],NToPlC[256];
-  UInt32 FlagBuf,AvrPlc,AvrPlcB,AvrLn1,AvrLn2,AvrLn3;
-  int Buf60,NumHuf,StMode,LCount,FlagsCnt;
-  UInt32 Nhfb,Nlzb,MaxDist3;
-
-  void InitStructures();
-
-  HRESULT CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,
-      const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
-
-public:
-  CDecoder();
-
-  MY_UNKNOWN_IMP1(ICompressSetDecoderProperties2)
-
-  void ReleaseStreams()
-  {
-    m_OutWindowStream.ReleaseStream();
-    m_InBitStream.ReleaseStream();
-  }
-
-  STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,
-      const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
-
-  STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size);
-
-};
-
-}}
-
-#endif
diff -ruNa p7zip_9.20.1/CPP/7zip/Compress/Rar2Decoder.cpp p7zip-libre_9.20.1/CPP/7zip/Compress/Rar2Decoder.cpp
--- p7zip_9.20.1/CPP/7zip/Compress/Rar2Decoder.cpp	2009-12-21 08:46:36.000000000 -0300
+++ p7zip-libre_9.20.1/CPP/7zip/Compress/Rar2Decoder.cpp	1969-12-31 21:00:00.000000000 -0300
@@ -1,391 +0,0 @@
-// Rar2Decoder.cpp
-// According to unRAR license, this code may not be used to develop
-// a program that creates RAR archives
- 
-#include "StdAfx.h"
-
-#include "Rar2Decoder.h"
-
-namespace NCompress {
-namespace NRar2 {
-
-namespace NMultimedia {
-
-Byte CFilter::Decode(int &channelDelta, Byte deltaByte)
-{
-  D4 = D3;
-  D3 = D2;
-  D2 = LastDelta - D1;
-  D1 = LastDelta;
-  int predictedValue = ((8 * LastChar + K1 * D1 + K2 * D2 + K3 * D3 + K4 * D4 + K5 * channelDelta) >> 3);
-
-  Byte realValue = (Byte)(predictedValue - deltaByte);
-  int i = ((int)(signed char)deltaByte) << 3;
-
-  Dif[0] += abs(i);
-  Dif[1] += abs(i - D1);
-  Dif[2] += abs(i + D1);
-  Dif[3] += abs(i - D2);
-  Dif[4] += abs(i + D2);
-  Dif[5] += abs(i - D3);
-  Dif[6] += abs(i + D3);
-  Dif[7] += abs(i - D4);
-  Dif[8] += abs(i + D4);
-  Dif[9] += abs(i - channelDelta);
-  Dif[10] += abs(i + channelDelta);
-
-  channelDelta = LastDelta = (signed char)(realValue - LastChar);
-  LastChar = realValue;
-
-  if (((++ByteCount) & 0x1F) == 0)
-  {
-    UInt32 minDif = Dif[0];
-    UInt32 numMinDif = 0;
-    Dif[0] = 0;
-    for (i = 1; i < sizeof(Dif) / sizeof(Dif[0]); i++)
-    {
-      if (Dif[i] < minDif)
-      {
-        minDif = Dif[i];
-        numMinDif = i;
-      }
-      Dif[i] = 0;
-    }
-    switch(numMinDif)
-    {
-      case 1: if (K1 >= -16) K1--; break;
-      case 2: if (K1 <   16) K1++; break;
-      case 3: if (K2 >= -16) K2--; break;
-      case 4: if (K2 <   16) K2++; break;
-      case 5: if (K3 >= -16) K3--; break;
-      case 6: if (K3 <   16) K3++; break;
-      case 7: if (K4 >= -16) K4--; break;
-      case 8: if (K4 <   16) K4++; break;
-      case 9: if (K5 >= -16) K5--; break;
-      case 10:if (K5 <   16) K5++; break;
-    }
-  }
-  return realValue;
-}
-}
-
-static const char *kNumberErrorMessage = "Number error";
-
-static const UInt32 kHistorySize = 1 << 20;
-
-static const int kNumStats = 11;
-
-static const UInt32 kWindowReservSize = (1 << 22) + 256;
-
-CDecoder::CDecoder():
-  m_IsSolid(false)
-{
-}
-
-void CDecoder::InitStructures()
-{
-  m_MmFilter.Init();
-  for(int i = 0; i < kNumRepDists; i++)
-    m_RepDists[i] = 0;
-  m_RepDistPtr = 0;
-  m_LastLength = 0;
-  memset(m_LastLevels, 0, kMaxTableSize);
-}
-
-UInt32 CDecoder::ReadBits(int numBits) { return m_InBitStream.ReadBits(numBits); }
-
-#define RIF(x) { if (!(x)) return false; }
-
-bool CDecoder::ReadTables(void)
-{
-  Byte levelLevels[kLevelTableSize];
-  Byte newLevels[kMaxTableSize];
-  m_AudioMode = (ReadBits(1) == 1);
-
-  if (ReadBits(1) == 0)
-    memset(m_LastLevels, 0, kMaxTableSize);
-  int numLevels;
-  if (m_AudioMode)
-  {
-    m_NumChannels = ReadBits(2) + 1;
-    if (m_MmFilter.CurrentChannel >= m_NumChannels)
-      m_MmFilter.CurrentChannel = 0;
-    numLevels = m_NumChannels * kMMTableSize;
-  }
-  else
-    numLevels = kHeapTablesSizesSum;
- 
-  int i;
-  for (i = 0; i < kLevelTableSize; i++)
-    levelLevels[i] = (Byte)ReadBits(4);
-  RIF(m_LevelDecoder.SetCodeLengths(levelLevels));
-  i = 0;
-  while (i < numLevels)
-  {
-    UInt32 number = m_LevelDecoder.DecodeSymbol(&m_InBitStream);
-    if (number < kTableDirectLevels)
-    {
-      newLevels[i] = (Byte)((number + m_LastLevels[i]) & kLevelMask);
-      i++;
-    }
-    else
-    {
-      if (number == kTableLevelRepNumber)
-      {
-        int t = ReadBits(2) + 3;
-        for (int reps = t; reps > 0 && i < numLevels ; reps--, i++)
-          newLevels[i] = newLevels[i - 1];
-      }
-      else
-      {
-        int num;
-        if (number == kTableLevel0Number)
-          num = ReadBits(3) + 3;
-        else if (number == kTableLevel0Number2)
-          num = ReadBits(7) + 11;
-        else
-          return false;
-        for (;num > 0 && i < numLevels; num--)
-          newLevels[i++] = 0;
-      }
-    }
-  }
-  if (m_AudioMode)
-    for (i = 0; i < m_NumChannels; i++)
-    {
-      RIF(m_MMDecoders[i].SetCodeLengths(&newLevels[i * kMMTableSize]));
-    }
-  else
-  {
-    RIF(m_MainDecoder.SetCodeLengths(&newLevels[0]));
-    RIF(m_DistDecoder.SetCodeLengths(&newLevels[kMainTableSize]));
-    RIF(m_LenDecoder.SetCodeLengths(&newLevels[kMainTableSize + kDistTableSize]));
-  }
-  memcpy(m_LastLevels, newLevels, kMaxTableSize);
-  return true;
-}
-
-bool CDecoder::ReadLastTables()
-{
-  // it differs a little from pure RAR sources;
-  // UInt64 ttt = m_InBitStream.GetProcessedSize() + 2;
-  // + 2 works for: return 0xFF; in CInBuffer::ReadByte.
-  if (m_InBitStream.GetProcessedSize() + 7 <= m_PackSize) // test it: probably incorrect;
-  // if (m_InBitStream.GetProcessedSize() + 2 <= m_PackSize) // test it: probably incorrect;
-    if (m_AudioMode)
-    {
-      UInt32 symbol = m_MMDecoders[m_MmFilter.CurrentChannel].DecodeSymbol(&m_InBitStream);
-      if (symbol == 256)
-        return ReadTables();
-      if (symbol >= kMMTableSize)
-        return false;
-    }
-    else
-    {
-      UInt32 number = m_MainDecoder.DecodeSymbol(&m_InBitStream);
-      if (number == kReadTableNumber)
-        return ReadTables();
-      if (number >= kMainTableSize)
-        return false;
-    }
-  return true;
-}
-
-class CCoderReleaser
-{
-  CDecoder *m_Coder;
-public:
-  CCoderReleaser(CDecoder *coder): m_Coder(coder) {}
-  ~CCoderReleaser()
-  {
-    m_Coder->ReleaseStreams();
-  }
-};
-
-bool CDecoder::DecodeMm(UInt32 pos)
-{
-  while (pos-- > 0)
-  {
-    UInt32 symbol = m_MMDecoders[m_MmFilter.CurrentChannel].DecodeSymbol(&m_InBitStream);
-    if (symbol == 256)
-      return true;
-    if (symbol >= kMMTableSize)
-      return false;
-    /*
-    Byte byPredict = m_Predictor.Predict();
-    Byte byReal = (Byte)(byPredict - (Byte)symbol);
-    m_Predictor.Update(byReal, byPredict);
-    */
-    Byte byReal = m_MmFilter.Decode((Byte)symbol);
-    m_OutWindowStream.PutByte(byReal);
-    if (++m_MmFilter.CurrentChannel == m_NumChannels)
-      m_MmFilter.CurrentChannel = 0;
-  }
-  return true;
-}
-
-bool CDecoder::DecodeLz(Int32 pos)
-{
-  while (pos > 0)
-  {
-    UInt32 number = m_MainDecoder.DecodeSymbol(&m_InBitStream);
-    UInt32 length, distance;
-    if (number < 256)
-    {
-      m_OutWindowStream.PutByte(Byte(number));
-      pos--;
-      continue;
-    }
-    else if (number >= kMatchNumber)
-    {
-      number -= kMatchNumber;
-      length = kNormalMatchMinLen + UInt32(kLenStart[number]) +
-        m_InBitStream.ReadBits(kLenDirectBits[number]);
-      number = m_DistDecoder.DecodeSymbol(&m_InBitStream);
-      if (number >= kDistTableSize)
-        return false;
-      distance = kDistStart[number] + m_InBitStream.ReadBits(kDistDirectBits[number]);
-      if (distance >= kDistLimit3)
-      {
-        length += 2 - ((distance - kDistLimit4) >> 31);
-        // length++;
-        // if (distance >= kDistLimit4)
-        //  length++;
-      }
-    }
-    else if (number == kRepBothNumber)
-    {
-      length = m_LastLength;
-      if (length == 0)
-        return false;
-      distance = m_RepDists[(m_RepDistPtr + 4 - 1) & 3];
-    }
-    else if (number < kLen2Number)
-    {
-      distance = m_RepDists[(m_RepDistPtr - (number - kRepNumber + 1)) & 3];
-      number = m_LenDecoder.DecodeSymbol(&m_InBitStream);
-      if (number >= kLenTableSize)
-        return false;
-      length = 2 + kLenStart[number] + m_InBitStream.ReadBits(kLenDirectBits[number]);
-      if (distance >= kDistLimit2)
-      {
-        length++;
-        if (distance >= kDistLimit3)
-        {
-          length += 2 - ((distance - kDistLimit4) >> 31);
-          // length++;
-          // if (distance >= kDistLimit4)
-          //   length++;
-        }
-      }
-    }
-    else if (number < kReadTableNumber)
-    {
-      number -= kLen2Number;
-      distance = kLen2DistStarts[number] +
-        m_InBitStream.ReadBits(kLen2DistDirectBits[number]);
-      length = 2;
-    }
-    else if (number == kReadTableNumber)
-      return true;
-    else
-      return false;
-    m_RepDists[m_RepDistPtr++ & 3] = distance;
-    m_LastLength = length;
-    if (!m_OutWindowStream.CopyBlock(distance, length))
-      return false;
-    pos -= length;
-  }
-  return true;
-}
-
-HRESULT CDecoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,
-    const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress)
-{
-  if (inSize == NULL || outSize == NULL)
-    return E_INVALIDARG;
-
-  if (!m_OutWindowStream.Create(kHistorySize))
-    return E_OUTOFMEMORY;
-  if (!m_InBitStream.Create(1 << 20))
-    return E_OUTOFMEMORY;
-
-  m_PackSize = *inSize;
-
-  UInt64 pos = 0, unPackSize = *outSize;
-  
-  m_OutWindowStream.SetStream(outStream);
-  m_OutWindowStream.Init(m_IsSolid);
-  m_InBitStream.SetStream(inStream);
-  m_InBitStream.Init();
-
-  CCoderReleaser coderReleaser(this);
-  if (!m_IsSolid)
-  {
-    InitStructures();
-    if (unPackSize == 0)
-    {
-      if (m_InBitStream.GetProcessedSize() + 2 <= m_PackSize) // test it: probably incorrect;
-        if (!ReadTables())
-          return S_FALSE;
-      return S_OK;
-    }
-    if (!ReadTables())
-      return S_FALSE;
-  }
-
-  UInt64 startPos = m_OutWindowStream.GetProcessedSize();
-  while(pos < unPackSize)
-  {
-    UInt32 blockSize = 1 << 20;
-    if (blockSize > unPackSize - pos)
-      blockSize = (UInt32)(unPackSize - pos);
-    UInt64 blockStartPos = m_OutWindowStream.GetProcessedSize();
-    if (m_AudioMode)
-    {
-      if (!DecodeMm(blockSize))
-        return S_FALSE;
-    }
-    else
-    {
-      if (!DecodeLz((Int32)blockSize))
-        return S_FALSE;
-    }
-    UInt64 globalPos = m_OutWindowStream.GetProcessedSize();
-    pos = globalPos - blockStartPos;
-    if (pos < blockSize)
-      if (!ReadTables())
-        return S_FALSE;
-    pos = globalPos - startPos;
-    if (progress != 0)
-    {
-      UInt64 packSize = m_InBitStream.GetProcessedSize();
-      RINOK(progress->SetRatioInfo(&packSize, &pos));
-    }
-  }
-  if (pos > unPackSize)
-    return S_FALSE;
-
-  if (!ReadLastTables())
-    return S_FALSE;
-  return m_OutWindowStream.Flush();
-}
-
-STDMETHODIMP CDecoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,
-    const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress)
-{
-  try { return CodeReal(inStream, outStream, inSize, outSize, progress); }
-  catch(const CInBufferException &e) { return e.ErrorCode; }
-  catch(const CLzOutWindowException &e) { return e.ErrorCode; }
-  catch(...) { return S_FALSE; }
-}
-
-STDMETHODIMP CDecoder::SetDecoderProperties2(const Byte *data, UInt32 size)
-{
-  if (size < 1)
-    return E_INVALIDARG;
-  m_IsSolid = (data[0] != 0);
-  return S_OK;
-}
-
-}}
diff -ruNa p7zip_9.20.1/CPP/7zip/Compress/Rar2Decoder.h p7zip-libre_9.20.1/CPP/7zip/Compress/Rar2Decoder.h
--- p7zip_9.20.1/CPP/7zip/Compress/Rar2Decoder.h	2009-02-07 15:06:28.000000000 -0200
+++ p7zip-libre_9.20.1/CPP/7zip/Compress/Rar2Decoder.h	1969-12-31 21:00:00.000000000 -0300
@@ -1,174 +0,0 @@
-// Rar2Decoder.h
-// According to unRAR license, this code may not be used to develop
-// a program that creates RAR archives
-
-#ifndef __COMPRESS_RAR2_DECODER_H
-#define __COMPRESS_RAR2_DECODER_H
-
-#include "../../Common/MyCom.h"
-
-#include "../ICoder.h"
-
-#include "../Common/InBuffer.h"
-
-#include "BitmDecoder.h"
-#include "HuffmanDecoder.h"
-#include "LzOutWindow.h"
-
-namespace NCompress {
-namespace NRar2 {
-
-const UInt32 kNumRepDists = 4;
-const UInt32 kDistTableSize = 48;
-
-const int kMMTableSize = 256 + 1;
-
-const UInt32 kMainTableSize = 298;
-const UInt32 kLenTableSize = 28;
-
-const UInt32 kDistTableStart = kMainTableSize;
-const UInt32 kLenTableStart = kDistTableStart + kDistTableSize;
-
-const UInt32 kHeapTablesSizesSum = kMainTableSize + kDistTableSize + kLenTableSize;
-
-const UInt32 kLevelTableSize = 19;
-
-const UInt32 kMMTablesSizesSum = kMMTableSize * 4;
-
-const UInt32 kMaxTableSize = kMMTablesSizesSum;
-
-const UInt32 kTableDirectLevels = 16;
-const UInt32 kTableLevelRepNumber = kTableDirectLevels;
-const UInt32 kTableLevel0Number = kTableLevelRepNumber + 1;
-const UInt32 kTableLevel0Number2 = kTableLevel0Number + 1;
-
-const UInt32 kLevelMask = 0xF;
-
-
-const UInt32 kRepBothNumber = 256;
-const UInt32 kRepNumber = kRepBothNumber + 1;
-const UInt32 kLen2Number = kRepNumber + 4;
-
-const UInt32 kLen2NumNumbers = 8;
-const UInt32 kReadTableNumber = kLen2Number + kLen2NumNumbers;
-const UInt32 kMatchNumber = kReadTableNumber + 1;
-
-const Byte kLenStart[kLenTableSize]      = {0,1,2,3,4,5,6,7,8,10,12,14,16,20,24,28,32,40,48,56,64,80,96,112,128,160,192,224};
-const Byte kLenDirectBits[kLenTableSize] = {0,0,0,0,0,0,0,0,1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4,  4,  5,  5,  5,  5};
-
-const UInt32 kDistStart[kDistTableSize]     = {0,1,2,3,4,6,8,12,16,24,32,48,64,96,128,192,256,384,512,768,1024,1536,2048,3072,4096,6144,8192,12288,16384,24576,32768U,49152U,65536,98304,131072,196608,262144,327680,393216,458752,524288,589824,655360,720896,786432,851968,917504,983040};
-const Byte kDistDirectBits[kDistTableSize] = {0,0,0,0,1,1,2, 2, 3, 3, 4, 4, 5, 5,  6,  6,  7,  7,  8,  8,   9,   9,  10,  10,  11,  11,  12,   12,   13,   13,    14,    14,   15,   15,    16,    16,    16,    16,    16,    16,    16,    16,    16,    16,    16,    16,    16,    16};
-
-const Byte kLevelDirectBits[kLevelTableSize] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 7};
-
-const Byte kLen2DistStarts[kLen2NumNumbers]={0,4,8,16,32,64,128,192};
-const Byte kLen2DistDirectBits[kLen2NumNumbers]={2,2,3, 4, 5, 6,  6,  6};
-
-const UInt32 kDistLimit2 = 0x101 - 1;
-const UInt32 kDistLimit3 = 0x2000 - 1;
-const UInt32 kDistLimit4 = 0x40000 - 1;
-
-const UInt32 kMatchMaxLen = 255 + 2;
-const UInt32 kMatchMaxLenMax = 255 + 5;
-const UInt32 kNormalMatchMinLen = 3;
-
-namespace NMultimedia {
-
-struct CFilter
-{
-  int K1,K2,K3,K4,K5;
-  int D1,D2,D3,D4;
-  int LastDelta;
-  UInt32 Dif[11];
-  UInt32 ByteCount;
-  int LastChar;
-
-  Byte Decode(int &channelDelta, Byte delta);
-
-  void Init() { memset(this, 0, sizeof(*this)); }
-
-};
-
-const int kNumChanelsMax = 4;
-
-class CFilter2
-{
-public:
-  CFilter  m_Filters[kNumChanelsMax];
-  int m_ChannelDelta;
-  int CurrentChannel;
-
-  void Init() { memset(this, 0, sizeof(*this)); }
-  Byte Decode(Byte delta)
-  {
-    return m_Filters[CurrentChannel].Decode(m_ChannelDelta, delta);
-  }
-
-};
-
-}
-
-typedef NBitm::CDecoder<CInBuffer> CBitDecoder;
-
-const int kNumHuffmanBits = 15;
-
-class CDecoder :
-  public ICompressCoder,
-  public ICompressSetDecoderProperties2,
-  public CMyUnknownImp
-{
-  CLzOutWindow m_OutWindowStream;
-  CBitDecoder m_InBitStream;
-  NHuffman::CDecoder<kNumHuffmanBits, kMainTableSize> m_MainDecoder;
-  NHuffman::CDecoder<kNumHuffmanBits, kDistTableSize> m_DistDecoder;
-  NHuffman::CDecoder<kNumHuffmanBits, kLenTableSize> m_LenDecoder;
-  NHuffman::CDecoder<kNumHuffmanBits, kMMTableSize> m_MMDecoders[NMultimedia::kNumChanelsMax];
-  NHuffman::CDecoder<kNumHuffmanBits, kLevelTableSize> m_LevelDecoder;
-
-  bool m_AudioMode;
-
-  NMultimedia::CFilter2 m_MmFilter;
-  int m_NumChannels;
-
-  UInt32 m_RepDists[kNumRepDists];
-  UInt32 m_RepDistPtr;
-
-  UInt32 m_LastLength;
-  
-  Byte m_LastLevels[kMaxTableSize];
-
-  UInt64 m_PackSize;
-  bool m_IsSolid;
-
-  void InitStructures();
-  UInt32 ReadBits(int numBits);
-  bool ReadTables();
-  bool ReadLastTables();
-
-  bool DecodeMm(UInt32 pos);
-  bool DecodeLz(Int32 pos);
-
-  HRESULT CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,
-      const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
-
-public:
-  CDecoder();
-
-  MY_UNKNOWN_IMP1(ICompressSetDecoderProperties2)
-
-  void ReleaseStreams()
-  {
-    m_OutWindowStream.ReleaseStream();
-    m_InBitStream.ReleaseStream();
-  }
-
-  STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,
-      const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
-
-  STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size);
-
-};
-
-}}
-
-#endif
diff -ruNa p7zip_9.20.1/CPP/7zip/Compress/Rar3Decoder.cpp p7zip-libre_9.20.1/CPP/7zip/Compress/Rar3Decoder.cpp
--- p7zip_9.20.1/CPP/7zip/Compress/Rar3Decoder.cpp	2010-09-14 16:18:38.000000000 -0300
+++ p7zip-libre_9.20.1/CPP/7zip/Compress/Rar3Decoder.cpp	1969-12-31 21:00:00.000000000 -0300
@@ -1,897 +0,0 @@
-// Rar3Decoder.cpp
-// According to unRAR license, this code may not be used to develop
-// a program that creates RAR archives
-
-/* This code uses Carryless rangecoder (1999): Dmitry Subbotin : Public domain */
- 
-#include "StdAfx.h"
-
-#include "../../../C/Alloc.h"
-
-#include "../Common/StreamUtils.h"
-
-#include "Rar3Decoder.h"
-
-namespace NCompress {
-namespace NRar3 {
-
-static void *SzBigAlloc(void *, size_t size) { return BigAlloc(size); }
-static void SzBigFree(void *, void *address) { BigFree(address); }
-static ISzAlloc g_BigAlloc = { SzBigAlloc, SzBigFree };
-
-static const UInt32 kNumAlignReps = 15;
-
-static const UInt32 kSymbolReadTable = 256;
-static const UInt32 kSymbolRep = 259;
-static const UInt32 kSymbolLen2 = kSymbolRep + kNumReps;
-
-static const Byte kLenStart[kLenTableSize]      = {0,1,2,3,4,5,6,7,8,10,12,14,16,20,24,28,32,40,48,56,64,80,96,112,128,160,192,224};
-static const Byte kLenDirectBits[kLenTableSize] = {0,0,0,0,0,0,0,0,1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4,  4,  5,  5,  5,  5};
-
-static const Byte kDistDirectBits[kDistTableSize] =
-  {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,
-  16,16,16,16,16,16,16,16,16,16,16,16,16,16,
-  18,18,18,18,18,18,18,18,18,18,18,18};
-
-static const Byte kLevelDirectBits[kLevelTableSize] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7};
-
-static const Byte kLen2DistStarts[kNumLen2Symbols]={0,4,8,16,32,64,128,192};
-static const Byte kLen2DistDirectBits[kNumLen2Symbols]={2,2,3, 4, 5, 6,  6,  6};
-
-static const UInt32 kDistLimit3 = 0x2000 - 2;
-static const UInt32 kDistLimit4 = 0x40000 - 2;
-
-static const UInt32 kNormalMatchMinLen = 3;
-
-static const UInt32 kVmDataSizeMax = 1 << 16;
-static const UInt32 kVmCodeSizeMax = 1 << 16;
-
-extern "C" {
-
-static UInt32 Range_GetThreshold(void *pp, UInt32 total)
-{
-  CRangeDecoder *p = (CRangeDecoder *)pp;
-  return p->Code / (p->Range /= total);
-}
-
-static void Range_Decode(void *pp, UInt32 start, UInt32 size)
-{
-  CRangeDecoder *p = (CRangeDecoder *)pp;
-  start *= p->Range;
-  p->Low += start;
-  p->Code -= start;
-  p->Range *= size;
-  p->Normalize();
-}
-
-static UInt32 Range_DecodeBit(void *pp, UInt32 size0)
-{
-  CRangeDecoder *p = (CRangeDecoder *)pp;
-  if (p->Code / (p->Range >>= 14) < size0)
-  {
-    Range_Decode(p, 0, size0);
-    return 0;
-  }
-  else
-  {
-    Range_Decode(p, size0, (1 << 14) - size0);
-    return 1;
-  }
-}
-
-}
-
-CRangeDecoder::CRangeDecoder()
-{
-  s.GetThreshold = Range_GetThreshold;
-  s.Decode = Range_Decode;
-  s.DecodeBit = Range_DecodeBit;
-}
-
-CDecoder::CDecoder():
-  _window(0),
-  _winPos(0),
-  _wrPtr(0),
-  _lzSize(0),
-  _writtenFileSize(0),
-  _vmData(0),
-  _vmCode(0),
-  m_IsSolid(false)
-{
-  Ppmd7_Construct(&_ppmd);
-}
-
-CDecoder::~CDecoder()
-{
-  InitFilters();
-  ::MidFree(_vmData);
-  ::MidFree(_window);
-  Ppmd7_Free(&_ppmd, &g_BigAlloc);
-}
-
-HRESULT CDecoder::WriteDataToStream(const Byte *data, UInt32 size)
-{
-  return WriteStream(_outStream, data, size);
-}
-
-HRESULT CDecoder::WriteData(const Byte *data, UInt32 size)
-{
-  HRESULT res = S_OK;
-  if (_writtenFileSize < _unpackSize)
-  {
-    UInt32 curSize = size;
-    UInt64 remain = _unpackSize - _writtenFileSize;
-    if (remain < curSize)
-      curSize = (UInt32)remain;
-    res = WriteDataToStream(data, curSize);
-  }
-  _writtenFileSize += size;
-  return res;
-}
-
-HRESULT CDecoder::WriteArea(UInt32 startPtr, UInt32 endPtr)
-{
-  if (startPtr <= endPtr)
-    return WriteData(_window + startPtr, endPtr - startPtr);
-  RINOK(WriteData(_window + startPtr, kWindowSize - startPtr));
-  return WriteData(_window, endPtr);
-}
-
-void CDecoder::ExecuteFilter(int tempFilterIndex, NVm::CBlockRef &outBlockRef)
-{
-  CTempFilter *tempFilter = _tempFilters[tempFilterIndex];
-  tempFilter->InitR[6] = (UInt32)_writtenFileSize;
-  NVm::SetValue32(&tempFilter->GlobalData[0x24], (UInt32)_writtenFileSize);
-  NVm::SetValue32(&tempFilter->GlobalData[0x28], (UInt32)(_writtenFileSize >> 32));
-  CFilter *filter = _filters[tempFilter->FilterIndex];
-  _vm.Execute(filter, tempFilter, outBlockRef, filter->GlobalData);
-  delete tempFilter;
-  _tempFilters[tempFilterIndex] = 0;
-}
-
-HRESULT CDecoder::WriteBuf()
-{
-  UInt32 writtenBorder = _wrPtr;
-  UInt32 writeSize = (_winPos - writtenBorder) & kWindowMask;
-  for (int i = 0; i < _tempFilters.Size(); i++)
-  {
-    CTempFilter *filter = _tempFilters[i];
-    if (filter == NULL)
-      continue;
-    if (filter->NextWindow)
-    {
-      filter->NextWindow = false;
-      continue;
-    }
-    UInt32 blockStart = filter->BlockStart;
-    UInt32 blockSize = filter->BlockSize;
-    if (((blockStart - writtenBorder) & kWindowMask) < writeSize)
-    {
-      if (writtenBorder != blockStart)
-      {
-        RINOK(WriteArea(writtenBorder, blockStart));
-        writtenBorder = blockStart;
-        writeSize = (_winPos - writtenBorder) & kWindowMask;
-      }
-      if (blockSize <= writeSize)
-      {
-        UInt32 blockEnd = (blockStart + blockSize) & kWindowMask;
-        if (blockStart < blockEnd || blockEnd == 0)
-          _vm.SetMemory(0, _window + blockStart, blockSize);
-        else
-        {
-          UInt32 tailSize = kWindowSize - blockStart;
-          _vm.SetMemory(0, _window + blockStart, tailSize);
-          _vm.SetMemory(tailSize, _window, blockEnd);
-        }
-        NVm::CBlockRef outBlockRef;
-        ExecuteFilter(i, outBlockRef);
-        while (i + 1 < _tempFilters.Size())
-        {
-          CTempFilter *nextFilter = _tempFilters[i + 1];
-          if (nextFilter == NULL || nextFilter->BlockStart != blockStart ||
-              nextFilter->BlockSize != outBlockRef.Size || nextFilter->NextWindow)
-            break;
-          _vm.SetMemory(0, _vm.GetDataPointer(outBlockRef.Offset), outBlockRef.Size);
-          ExecuteFilter(++i, outBlockRef);
-        }
-        WriteDataToStream(_vm.GetDataPointer(outBlockRef.Offset), outBlockRef.Size);
-        _writtenFileSize += outBlockRef.Size;
-        writtenBorder = blockEnd;
-        writeSize = (_winPos - writtenBorder) & kWindowMask;
-      }
-      else
-      {
-        for (int j = i; j < _tempFilters.Size(); j++)
-        {
-          CTempFilter *filter = _tempFilters[j];
-          if (filter != NULL && filter->NextWindow)
-            filter->NextWindow = false;
-        }
-        _wrPtr = writtenBorder;
-        return S_OK; // check it
-      }
-    }
-  }
-      
-  _wrPtr = _winPos;
-  return WriteArea(writtenBorder, _winPos);
-}
-
-void CDecoder::InitFilters()
-{
-  _lastFilter = 0;
-  int i;
-  for (i = 0; i < _tempFilters.Size(); i++)
-    delete _tempFilters[i];
-  _tempFilters.Clear();
-  for (i = 0; i < _filters.Size(); i++)
-    delete _filters[i];
-  _filters.Clear();
-}
-
-bool CDecoder::AddVmCode(UInt32 firstByte, UInt32 codeSize)
-{
-  CMemBitDecoder inp;
-  inp.Init(_vmData, codeSize);
-
-  UInt32 filterIndex;
-  if (firstByte & 0x80)
-  {
-    filterIndex = NVm::ReadEncodedUInt32(inp);
-    if (filterIndex == 0)
-      InitFilters();
-    else
-      filterIndex--;
-  }
-  else
-    filterIndex = _lastFilter;
-  if (filterIndex > (UInt32)_filters.Size())
-    return false;
-  _lastFilter = filterIndex;
-  bool newFilter = (filterIndex == (UInt32)_filters.Size());
-
-  CFilter *filter;
-  if (newFilter)
-  {
-    // check if too many filters
-    if (filterIndex > 1024)
-      return false;
-    filter = new CFilter;
-    _filters.Add(filter);
-  }
-  else
-  {
-    filter = _filters[filterIndex];
-    filter->ExecCount++;
-  }
-
-  int numEmptyItems = 0;
-  int i;
-  for (i = 0; i < _tempFilters.Size(); i++)
-  {
-    _tempFilters[i - numEmptyItems] = _tempFilters[i];
-    if (_tempFilters[i] == NULL)
-      numEmptyItems++;
-    if (numEmptyItems > 0)
-      _tempFilters[i] = NULL;
-  }
-  if (numEmptyItems == 0)
-  {
-    _tempFilters.Add(NULL);
-    numEmptyItems = 1;
-  }
-  CTempFilter *tempFilter = new CTempFilter;
-  _tempFilters[_tempFilters.Size() - numEmptyItems] = tempFilter;
-  tempFilter->FilterIndex = filterIndex;
-  tempFilter->ExecCount = filter->ExecCount;
- 
-  UInt32 blockStart = NVm::ReadEncodedUInt32(inp);
-  if (firstByte & 0x40)
-    blockStart += 258;
-  tempFilter->BlockStart = (blockStart + _winPos) & kWindowMask;
-  if (firstByte & 0x20)
-    filter->BlockSize = NVm::ReadEncodedUInt32(inp);
-  tempFilter->BlockSize = filter->BlockSize;
-  tempFilter->NextWindow = _wrPtr != _winPos && ((_wrPtr - _winPos) & kWindowMask) <= blockStart;
-
-  memset(tempFilter->InitR, 0, sizeof(tempFilter->InitR));
-  tempFilter->InitR[3] = NVm::kGlobalOffset;
-  tempFilter->InitR[4] = tempFilter->BlockSize;
-  tempFilter->InitR[5] = tempFilter->ExecCount;
-  if (firstByte & 0x10)
-  {
-    UInt32 initMask = inp.ReadBits(NVm::kNumGpRegs);
-    for (int i = 0; i < NVm::kNumGpRegs; i++)
-      if (initMask & (1 << i))
-        tempFilter->InitR[i] = NVm::ReadEncodedUInt32(inp);
-  }
-  if (newFilter)
-  {
-    UInt32 vmCodeSize = NVm::ReadEncodedUInt32(inp);
-    if (vmCodeSize >= kVmCodeSizeMax || vmCodeSize == 0)
-      return false;
-    for (UInt32 i = 0; i < vmCodeSize; i++)
-      _vmCode[i] = (Byte)inp.ReadBits(8);
-    _vm.PrepareProgram(_vmCode, vmCodeSize, filter);
-  }
-
-  tempFilter->AllocateEmptyFixedGlobal();
-
-  Byte *globalData = &tempFilter->GlobalData[0];
-  for (i = 0; i < NVm::kNumGpRegs; i++)
-    NVm::SetValue32(&globalData[i * 4], tempFilter->InitR[i]);
-  NVm::SetValue32(&globalData[NVm::NGlobalOffset::kBlockSize], tempFilter->BlockSize);
-  NVm::SetValue32(&globalData[NVm::NGlobalOffset::kBlockPos], 0); // It was commented. why?
-  NVm::SetValue32(&globalData[NVm::NGlobalOffset::kExecCount], tempFilter->ExecCount);
-
-  if (firstByte & 8)
-  {
-    UInt32 dataSize = NVm::ReadEncodedUInt32(inp);
-    if (dataSize > NVm::kGlobalSize - NVm::kFixedGlobalSize)
-      return false;
-    CRecordVector<Byte> &globalData = tempFilter->GlobalData;
-    int requredSize = (int)(dataSize + NVm::kFixedGlobalSize);
-    if (globalData.Size() < requredSize)
-    {
-      globalData.Reserve(requredSize);
-      for (; globalData.Size() < requredSize; i++)
-        globalData.Add(0);
-    }
-    for (UInt32 i = 0; i < dataSize; i++)
-      globalData[NVm::kFixedGlobalSize + i] = (Byte)inp.ReadBits(8);
-  }
-  return true;
-}
-
-bool CDecoder::ReadVmCodeLZ()
-{
-  UInt32 firstByte = ReadBits(8);
-  UInt32 length = (firstByte & 7) + 1;
-  if (length == 7)
-    length = ReadBits(8) + 7;
-  else if (length == 8)
-    length = ReadBits(16);
-  if (length > kVmDataSizeMax)
-    return false;
-  for (UInt32 i = 0; i < length; i++)
-    _vmData[i] = (Byte)ReadBits(8);
-  return AddVmCode(firstByte, length);
-}
-
-bool CDecoder::ReadVmCodePPM()
-{
-  int firstByte = DecodePpmSymbol();
-  if (firstByte < 0)
-    return false;
-  UInt32 length = (firstByte & 7) + 1;
-  if (length == 7)
-  {
-    int b1 = DecodePpmSymbol();
-    if (b1 < 0)
-      return false;
-    length = b1 + 7;
-  }
-  else if (length == 8)
-  {
-    int b1 = DecodePpmSymbol();
-    if (b1 < 0)
-      return false;
-    int b2 = DecodePpmSymbol();
-    if (b2 < 0)
-      return false;
-    length = b1 * 256 + b2;
-  }
-  if (length > kVmDataSizeMax)
-    return false;
-  for (UInt32 i = 0; i < length; i++)
-  {
-    int b = DecodePpmSymbol();
-    if (b < 0)
-      return false;
-    _vmData[i] = (Byte)b;
-  }
-  return AddVmCode(firstByte, length);
-}
-
-#define RIF(x) { if (!(x)) return S_FALSE; }
-
-UInt32 CDecoder::ReadBits(int numBits) { return m_InBitStream.bitDecoder.ReadBits(numBits); }
-
-/////////////////////////////////////////////////
-// PPM
-
-HRESULT CDecoder::InitPPM()
-{
-  Byte maxOrder = (Byte)ReadBits(7);
-
-  bool reset = ((maxOrder & 0x20) != 0);
-  int maxMB = 0;
-  if (reset)
-    maxMB = (Byte)ReadBits(8);
-  else
-  {
-    if (PpmError || !Ppmd7_WasAllocated(&_ppmd))
-      return S_FALSE;
-  }
-  if (maxOrder & 0x40)
-    PpmEscChar = (Byte)ReadBits(8);
-  m_InBitStream.InitRangeCoder();
-  /*
-  if (m_InBitStream.m_BitPos != 0)
-    return S_FALSE;
-  */
-  if (reset)
-  {
-    PpmError = true;
-    maxOrder = (maxOrder & 0x1F) + 1;
-    if (maxOrder > 16)
-      maxOrder = 16 + (maxOrder - 16) * 3;
-    if (maxOrder == 1)
-    {
-      Ppmd7_Free(&_ppmd, &g_BigAlloc);
-      return S_FALSE;
-    }
-    if (!Ppmd7_Alloc(&_ppmd, (maxMB + 1) << 20, &g_BigAlloc))
-      return E_OUTOFMEMORY;
-    Ppmd7_Init(&_ppmd, maxOrder);
-    PpmError = false;
-  }
-  return S_OK;
-}
-
-int CDecoder::DecodePpmSymbol() { return Ppmd7_DecodeSymbol(&_ppmd, &m_InBitStream.s); }
-
-HRESULT CDecoder::DecodePPM(Int32 num, bool &keepDecompressing)
-{
-  keepDecompressing = false;
-  if (PpmError)
-    return S_FALSE;
-  do
-  {
-    if (((_wrPtr - _winPos) & kWindowMask) < 260 && _wrPtr != _winPos)
-    {
-      RINOK(WriteBuf());
-      if (_writtenFileSize > _unpackSize)
-      {
-        keepDecompressing = false;
-        return S_OK;
-      }
-    }
-    int c = DecodePpmSymbol();
-    if (c < 0)
-    {
-      PpmError = true;
-      return S_FALSE;
-    }
-    if (c == PpmEscChar)
-    {
-      int nextCh = DecodePpmSymbol();
-      if (nextCh < 0)
-      {
-        PpmError = true;
-        return S_FALSE;
-      }
-      if (nextCh == 0)
-        return ReadTables(keepDecompressing);
-      if (nextCh == 2 || nextCh == -1)
-        return S_OK;
-      if (nextCh == 3)
-      {
-        if (!ReadVmCodePPM())
-        {
-          PpmError = true;
-          return S_FALSE;
-        }
-        continue;
-      }
-      if (nextCh == 4 || nextCh == 5)
-      {
-        UInt32 distance = 0;
-        UInt32 length = 4;
-        if (nextCh == 4)
-        {
-          for (int i = 0; i < 3; i++)
-          {
-            int c = DecodePpmSymbol();
-            if (c < 0)
-            {
-              PpmError = true;
-              return S_FALSE;
-            }
-            distance = (distance << 8) + (Byte)c;
-          }
-          distance++;
-          length += 28;
-        }
-        int c = DecodePpmSymbol();
-        if (c < 0)
-        {
-          PpmError = true;
-          return S_FALSE;
-        }
-        length += c;
-        if (distance >= _lzSize)
-          return S_FALSE;
-        CopyBlock(distance, length);
-        num -= (Int32)length;
-        continue;
-      }
-    }
-    PutByte((Byte)c);
-    num--;
-  }
-  while (num >= 0);
-  keepDecompressing = true;
-  return S_OK;
-}
-
-/////////////////////////////////////////////////
-// LZ
-
-HRESULT CDecoder::ReadTables(bool &keepDecompressing)
-{
-  keepDecompressing = true;
-  ReadBits((8 - m_InBitStream.bitDecoder.GetBitPosition()) & 7);
-  if (ReadBits(1) != 0)
-  {
-    _lzMode = false;
-    return InitPPM();
-  }
-
-  _lzMode = true;
-  PrevAlignBits = 0;
-  PrevAlignCount = 0;
-
-  Byte levelLevels[kLevelTableSize];
-  Byte newLevels[kTablesSizesSum];
-
-  if (ReadBits(1) == 0)
-    memset(m_LastLevels, 0, kTablesSizesSum);
-
-  int i;
-  for (i = 0; i < kLevelTableSize; i++)
-  {
-    UInt32 length = ReadBits(4);
-    if (length == 15)
-    {
-      UInt32 zeroCount = ReadBits(4);
-      if (zeroCount != 0)
-      {
-        zeroCount += 2;
-        while (zeroCount-- > 0 && i < kLevelTableSize)
-          levelLevels[i++]=0;
-        i--;
-        continue;
-      }
-    }
-    levelLevels[i] = (Byte)length;
-  }
-  RIF(m_LevelDecoder.SetCodeLengths(levelLevels));
-  i = 0;
-  while (i < kTablesSizesSum)
-  {
-    UInt32 number = m_LevelDecoder.DecodeSymbol(&m_InBitStream.bitDecoder);
-    if (number < 16)
-    {
-      newLevels[i] = Byte((number + m_LastLevels[i]) & 15);
-      i++;
-    }
-    else if (number > kLevelTableSize)
-      return S_FALSE;
-    else
-    {
-      int num;
-      if (((number - 16) & 1) == 0)
-        num = ReadBits(3) + 3;
-      else
-        num = ReadBits(7) + 11;
-      if (number < 18)
-      {
-        if (i == 0)
-          return S_FALSE;
-        for (; num > 0 && i < kTablesSizesSum; num--, i++)
-          newLevels[i] = newLevels[i - 1];
-      }
-      else
-      {
-        for (; num > 0 && i < kTablesSizesSum; num--)
-          newLevels[i++] = 0;
-      }
-    }
-  }
-  TablesRead = true;
-
-  // original code has check here:
-  /*
-  if (InAddr > ReadTop)
-  {
-    keepDecompressing = false;
-    return true;
-  }
-  */
-
-  RIF(m_MainDecoder.SetCodeLengths(&newLevels[0]));
-  RIF(m_DistDecoder.SetCodeLengths(&newLevels[kMainTableSize]));
-  RIF(m_AlignDecoder.SetCodeLengths(&newLevels[kMainTableSize + kDistTableSize]));
-  RIF(m_LenDecoder.SetCodeLengths(&newLevels[kMainTableSize + kDistTableSize + kAlignTableSize]));
-
-  memcpy(m_LastLevels, newLevels, kTablesSizesSum);
-  return S_OK;
-}
-
-class CCoderReleaser
-{
-  CDecoder *m_Coder;
-public:
-  CCoderReleaser(CDecoder *coder): m_Coder(coder) {}
-  ~CCoderReleaser()
-  {
-    m_Coder->ReleaseStreams();
-  }
-};
-
-HRESULT CDecoder::ReadEndOfBlock(bool &keepDecompressing)
-{
-  if (ReadBits(1) != 0)
-  {
-    // old file
-    TablesRead = false;
-    return ReadTables(keepDecompressing);
-  }
-  // new file
-  keepDecompressing = false;
-  TablesRead = (ReadBits(1) == 0);
-  return S_OK;
-}
-
-UInt32 kDistStart[kDistTableSize];
-
-class CDistInit
-{
-public:
-  CDistInit() { Init(); }
-  void Init()
-  {
-    UInt32 start = 0;
-    for (UInt32 i = 0; i < kDistTableSize; i++)
-    {
-      kDistStart[i] = start;
-      start += (1 << kDistDirectBits[i]);
-    }
-  }
-} g_DistInit;
-
-HRESULT CDecoder::DecodeLZ(bool &keepDecompressing)
-{
-  UInt32 rep0 = _reps[0];
-  UInt32 rep1 = _reps[1];
-  UInt32 rep2 = _reps[2];
-  UInt32 rep3 = _reps[3];
-  UInt32 length = _lastLength;
-  for (;;)
-  {
-    if (((_wrPtr - _winPos) & kWindowMask) < 260 && _wrPtr != _winPos)
-    {
-      RINOK(WriteBuf());
-      if (_writtenFileSize > _unpackSize)
-      {
-        keepDecompressing = false;
-        return S_OK;
-      }
-    }
-    UInt32 number = m_MainDecoder.DecodeSymbol(&m_InBitStream.bitDecoder);
-    if (number < 256)
-    {
-      PutByte((Byte)number);
-      continue;
-    }
-    else if (number == kSymbolReadTable)
-    {
-      RINOK(ReadEndOfBlock(keepDecompressing));
-      break;
-    }
-    else if (number == 257)
-    {
-      if (!ReadVmCodeLZ())
-        return S_FALSE;
-      continue;
-    }
-    else if (number == 258)
-    {
-      if (length == 0)
-        return S_FALSE;
-    }
-    else if (number < kSymbolRep + 4)
-    {
-      if (number != kSymbolRep)
-      {
-        UInt32 distance;
-        if (number == kSymbolRep + 1)
-          distance = rep1;
-        else
-        {
-          if (number == kSymbolRep + 2)
-            distance = rep2;
-          else
-          {
-            distance = rep3;
-            rep3 = rep2;
-          }
-          rep2 = rep1;
-        }
-        rep1 = rep0;
-        rep0 = distance;
-      }
-
-      UInt32 number = m_LenDecoder.DecodeSymbol(&m_InBitStream.bitDecoder);
-      if (number >= kLenTableSize)
-        return S_FALSE;
-      length = 2 + kLenStart[number] + m_InBitStream.bitDecoder.ReadBits(kLenDirectBits[number]);
-    }
-    else
-    {
-      rep3 = rep2;
-      rep2 = rep1;
-      rep1 = rep0;
-      if (number < 271)
-      {
-        number -= 263;
-        rep0 = kLen2DistStarts[number] + m_InBitStream.bitDecoder.ReadBits(kLen2DistDirectBits[number]);
-        length = 2;
-      }
-      else if (number < 299)
-      {
-        number -= 271;
-        length = kNormalMatchMinLen + (UInt32)kLenStart[number] + m_InBitStream.bitDecoder.ReadBits(kLenDirectBits[number]);
-        UInt32 number = m_DistDecoder.DecodeSymbol(&m_InBitStream.bitDecoder);
-        if (number >= kDistTableSize)
-          return S_FALSE;
-        rep0 = kDistStart[number];
-        int numBits = kDistDirectBits[number];
-        if (number >= (kNumAlignBits * 2) + 2)
-        {
-          if (numBits > kNumAlignBits)
-            rep0 += (m_InBitStream.bitDecoder.ReadBits(numBits - kNumAlignBits) << kNumAlignBits);
-          if (PrevAlignCount > 0)
-          {
-            PrevAlignCount--;
-            rep0 += PrevAlignBits;
-          }
-          else
-          {
-            UInt32 number = m_AlignDecoder.DecodeSymbol(&m_InBitStream.bitDecoder);
-            if (number < (1 << kNumAlignBits))
-            {
-              rep0 += number;
-              PrevAlignBits = number;
-            }
-            else if (number  == (1 << kNumAlignBits))
-            {
-              PrevAlignCount = kNumAlignReps;
-              rep0 += PrevAlignBits;
-            }
-            else
-              return S_FALSE;
-          }
-        }
-        else
-          rep0 += m_InBitStream.bitDecoder.ReadBits(numBits);
-        length += ((kDistLimit4 - rep0) >> 31) + ((kDistLimit3 - rep0) >> 31);
-      }
-      else
-        return S_FALSE;
-    }
-    if (rep0 >= _lzSize)
-      return S_FALSE;
-    CopyBlock(rep0, length);
-  }
-  _reps[0] = rep0;
-  _reps[1] = rep1;
-  _reps[2] = rep2;
-  _reps[3] = rep3;
-  _lastLength = length;
-
-  return S_OK;
-}
-
-HRESULT CDecoder::CodeReal(ICompressProgressInfo *progress)
-{
-  _writtenFileSize = 0;
-  if (!m_IsSolid)
-  {
-    _lzSize = 0;
-    _winPos = 0;
-    _wrPtr = 0;
-    for (int i = 0; i < kNumReps; i++)
-      _reps[i] = 0;
-    _lastLength = 0;
-    memset(m_LastLevels, 0, kTablesSizesSum);
-    TablesRead = false;
-    PpmEscChar = 2;
-    PpmError = true;
-    InitFilters();
-  }
-  if (!m_IsSolid || !TablesRead)
-  {
-    bool keepDecompressing;
-    RINOK(ReadTables(keepDecompressing));
-    if (!keepDecompressing)
-      return S_OK;
-  }
-
-  for (;;)
-  {
-    bool keepDecompressing;
-    if (_lzMode)
-    {
-      RINOK(DecodeLZ(keepDecompressing))
-    }
-    else
-    {
-      RINOK(DecodePPM(1 << 18, keepDecompressing))
-    }
-    UInt64 packSize = m_InBitStream.bitDecoder.GetProcessedSize();
-    RINOK(progress->SetRatioInfo(&packSize, &_writtenFileSize));
-    if (!keepDecompressing)
-      break;
-  }
-  RINOK(WriteBuf());
-  UInt64 packSize = m_InBitStream.bitDecoder.GetProcessedSize();
-  RINOK(progress->SetRatioInfo(&packSize, &_writtenFileSize));
-  if (_writtenFileSize < _unpackSize)
-    return S_FALSE;
-  return S_OK;
-}
-
-STDMETHODIMP CDecoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,
-    const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress)
-{
-  try
-  {
-    if (inSize == NULL || outSize == NULL)
-      return E_INVALIDARG;
-
-    if (_vmData == 0)
-    {
-      _vmData = (Byte *)::MidAlloc(kVmDataSizeMax + kVmCodeSizeMax);
-      if (_vmData == 0)
-        return E_OUTOFMEMORY;
-      _vmCode = _vmData + kVmDataSizeMax;
-    }
-    
-    if (_window == 0)
-    {
-      _window = (Byte *)::MidAlloc(kWindowSize);
-      if (_window == 0)
-        return E_OUTOFMEMORY;
-    }
-    if (!m_InBitStream.bitDecoder.Create(1 << 20))
-      return E_OUTOFMEMORY;
-    if (!_vm.Create())
-      return E_OUTOFMEMORY;
-
-    
-    m_InBitStream.bitDecoder.SetStream(inStream);
-    m_InBitStream.bitDecoder.Init();
-    _outStream = outStream;
-   
-    CCoderReleaser coderReleaser(this);
-    _unpackSize = *outSize;
-    return CodeReal(progress);
-  }
-  catch(const CInBufferException &e)  { return e.ErrorCode; }
-  catch(...) { return S_FALSE; }
-  // CNewException is possible here. But probably CNewException is caused
-  // by error in data stream.
-}
-
-STDMETHODIMP CDecoder::SetDecoderProperties2(const Byte *data, UInt32 size)
-{
-  if (size < 1)
-    return E_INVALIDARG;
-  m_IsSolid = (data[0] != 0);
-  return S_OK;
-}
-
-}}
diff -ruNa p7zip_9.20.1/CPP/7zip/Compress/Rar3Decoder.h p7zip-libre_9.20.1/CPP/7zip/Compress/Rar3Decoder.h
--- p7zip_9.20.1/CPP/7zip/Compress/Rar3Decoder.h	2010-03-16 16:08:18.000000000 -0300
+++ p7zip-libre_9.20.1/CPP/7zip/Compress/Rar3Decoder.h	1969-12-31 21:00:00.000000000 -0300
@@ -1,267 +0,0 @@
-// Rar3Decoder.h
-// According to unRAR license, this code may not be used to develop
-// a program that creates RAR archives
-
-/* This code uses Carryless rangecoder (1999): Dmitry Subbotin : Public domain */
-
-#ifndef __COMPRESS_RAR3_DECODER_H
-#define __COMPRESS_RAR3_DECODER_H
-
-#include "../../../C/Ppmd7.h"
-
-#include "../../Common/MyCom.h"
-
-#include "../ICoder.h"
-
-#include "../Common/InBuffer.h"
-
-#include "BitmDecoder.h"
-#include "HuffmanDecoder.h"
-#include "Rar3Vm.h"
-
-namespace NCompress {
-namespace NRar3 {
-
-const UInt32 kWindowSize = 1 << 22;
-const UInt32 kWindowMask = (kWindowSize - 1);
-
-const UInt32 kNumReps = 4;
-const UInt32 kNumLen2Symbols = 8;
-const UInt32 kLenTableSize = 28;
-const UInt32 kMainTableSize = 256 + 1 + 1 + 1 + kNumReps + kNumLen2Symbols + kLenTableSize;
-const UInt32 kDistTableSize = 60;
-
-const int kNumAlignBits = 4;
-const UInt32 kAlignTableSize = (1 << kNumAlignBits) + 1;
-
-const UInt32 kLevelTableSize = 20;
-
-const UInt32 kTablesSizesSum = kMainTableSize + kDistTableSize + kAlignTableSize + kLenTableSize;
-
-class CBitDecoder
-{
-  UInt32 m_Value;
-  unsigned m_BitPos;
-public:
-  CInBuffer m_Stream;
-  bool Create(UInt32 bufferSize) { return m_Stream.Create(bufferSize); }
-  void SetStream(ISequentialInStream *inStream) { m_Stream.SetStream(inStream);}
-  void ReleaseStream() { m_Stream.ReleaseStream();}
-
-  void Init()
-  {
-    m_Stream.Init();
-    m_BitPos = 0;
-    m_Value = 0;
-  }
-  
-  UInt64 GetProcessedSize() const { return m_Stream.GetProcessedSize() - (m_BitPos) / 8; }
-  UInt32 GetBitPosition() const { return ((8 - m_BitPos) & 7); }
-  
-  UInt32 GetValue(unsigned numBits)
-  {
-    if (m_BitPos < numBits)
-    {
-      m_BitPos += 8;
-      m_Value = (m_Value << 8) | m_Stream.ReadByte();
-      if (m_BitPos < numBits)
-      {
-        m_BitPos += 8;
-        m_Value = (m_Value << 8) | m_Stream.ReadByte();
-      }
-    }
-    return m_Value >> (m_BitPos - numBits);
-  }
-  
-  void MovePos(unsigned numBits)
-  {
-    m_BitPos -= numBits;
-    m_Value = m_Value & ((1 << m_BitPos) - 1);
-  }
-  
-  UInt32 ReadBits(unsigned numBits)
-  {
-    UInt32 res = GetValue(numBits);
-    MovePos(numBits);
-    return res;
-  }
-};
-
-const UInt32 kTopValue = (1 << 24);
-const UInt32 kBot = (1 << 15);
-
-struct CRangeDecoder
-{
-  IPpmd7_RangeDec s;
-  UInt32 Range;
-  UInt32 Code;
-  UInt32 Low;
-  CBitDecoder bitDecoder;
-  SRes Res;
-
-public:
-  void InitRangeCoder()
-  {
-    Code = 0;
-    Low = 0;
-    Range = 0xFFFFFFFF;
-    for (int i = 0; i < 4; i++)
-      Code = (Code << 8) | bitDecoder.ReadBits(8);
-  }
-
-  void Normalize()
-  {
-    while ((Low ^ (Low + Range)) < kTopValue ||
-       Range < kBot && ((Range = (0 - Low) & (kBot - 1)), 1))
-    {
-      Code = (Code << 8) | bitDecoder.m_Stream.ReadByte();
-      Range <<= 8;
-      Low <<= 8;
-    }
-  }
-
-  CRangeDecoder();
-};
-
-struct CFilter: public NVm::CProgram
-{
-  CRecordVector<Byte> GlobalData;
-  UInt32 BlockStart;
-  UInt32 BlockSize;
-  UInt32 ExecCount;
-  CFilter(): BlockStart(0), BlockSize(0), ExecCount(0) {}
-};
-
-struct CTempFilter: public NVm::CProgramInitState
-{
-  UInt32 BlockStart;
-  UInt32 BlockSize;
-  UInt32 ExecCount;
-  bool NextWindow;
-  
-  UInt32 FilterIndex;
-};
-
-const int kNumHuffmanBits = 15;
-
-class CDecoder:
-  public ICompressCoder,
-  public ICompressSetDecoderProperties2,
-  public CMyUnknownImp
-{
-  CRangeDecoder m_InBitStream;
-  Byte *_window;
-  UInt32 _winPos;
-  UInt32 _wrPtr;
-  UInt64 _lzSize;
-  UInt64 _unpackSize;
-  UInt64 _writtenFileSize; // if it's > _unpackSize, then _unpackSize only written
-  CMyComPtr<ISequentialOutStream> _outStream;
-  NHuffman::CDecoder<kNumHuffmanBits, kMainTableSize> m_MainDecoder;
-  NHuffman::CDecoder<kNumHuffmanBits, kDistTableSize> m_DistDecoder;
-  NHuffman::CDecoder<kNumHuffmanBits, kAlignTableSize> m_AlignDecoder;
-  NHuffman::CDecoder<kNumHuffmanBits, kLenTableSize> m_LenDecoder;
-  NHuffman::CDecoder<kNumHuffmanBits, kLevelTableSize> m_LevelDecoder;
-
-  UInt32 _reps[kNumReps];
-  UInt32 _lastLength;
-  
-  Byte m_LastLevels[kTablesSizesSum];
-
-  Byte *_vmData;
-  Byte *_vmCode;
-  NVm::CVm _vm;
-  CRecordVector<CFilter *> _filters;
-  CRecordVector<CTempFilter *>  _tempFilters;
-  UInt32 _lastFilter;
-
-  bool m_IsSolid;
-
-  bool _lzMode;
-
-  UInt32 PrevAlignBits;
-  UInt32 PrevAlignCount;
-
-  bool TablesRead;
-
-  CPpmd7 _ppmd;
-  int PpmEscChar;
-  bool PpmError;
-  
-  HRESULT WriteDataToStream(const Byte *data, UInt32 size);
-  HRESULT WriteData(const Byte *data, UInt32 size);
-  HRESULT WriteArea(UInt32 startPtr, UInt32 endPtr);
-  void ExecuteFilter(int tempFilterIndex, NVm::CBlockRef &outBlockRef);
-  HRESULT WriteBuf();
-
-  void InitFilters();
-  bool AddVmCode(UInt32 firstByte, UInt32 codeSize);
-  bool ReadVmCodeLZ();
-  bool ReadVmCodePPM();
-  
-  UInt32 ReadBits(int numBits);
-
-  HRESULT InitPPM();
-  int DecodePpmSymbol();
-  HRESULT DecodePPM(Int32 num, bool &keepDecompressing);
-
-  HRESULT ReadTables(bool &keepDecompressing);
-  HRESULT ReadEndOfBlock(bool &keepDecompressing);
-  HRESULT DecodeLZ(bool &keepDecompressing);
-  HRESULT CodeReal(ICompressProgressInfo *progress);
-public:
-  CDecoder();
-  ~CDecoder();
-
-  MY_UNKNOWN_IMP1(ICompressSetDecoderProperties2)
-
-  void ReleaseStreams()
-  {
-    _outStream.Release();
-    m_InBitStream.bitDecoder.ReleaseStream();
-  }
-
-  STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,
-      const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
-
-  STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size);
-
-  void CopyBlock(UInt32 distance, UInt32 len)
-  {
-    _lzSize += len;
-    UInt32 pos = (_winPos - distance - 1) & kWindowMask;
-    Byte *window = _window;
-    UInt32 winPos = _winPos;
-    if (kWindowSize - winPos > len && kWindowSize - pos > len)
-    {
-      const Byte *src = window + pos;
-      Byte *dest = window + winPos;
-      _winPos += len;
-      do
-        *dest++ = *src++;
-      while(--len != 0);
-      return;
-    }
-    do
-    {
-      window[winPos] = window[pos];
-      winPos = (winPos + 1) & kWindowMask;
-      pos = (pos + 1) & kWindowMask;
-    }
-    while(--len != 0);
-    _winPos = winPos;
-  }
-  
-  void PutByte(Byte b)
-  {
-    _window[_winPos] = b;
-    _winPos = (_winPos + 1) & kWindowMask;
-    _lzSize++;
-  }
-
-
-};
-
-}}
-
-#endif
diff -ruNa p7zip_9.20.1/CPP/7zip/Compress/Rar3Vm.cpp p7zip-libre_9.20.1/CPP/7zip/Compress/Rar3Vm.cpp
--- p7zip_9.20.1/CPP/7zip/Compress/Rar3Vm.cpp	2010-10-20 01:56:07.000000000 -0300
+++ p7zip-libre_9.20.1/CPP/7zip/Compress/Rar3Vm.cpp	1969-12-31 21:00:00.000000000 -0300
@@ -1,1091 +0,0 @@
-// Rar3Vm.cpp
-// According to unRAR license, this code may not be used to develop
-// a program that creates RAR archives
-
-/*
-Note:
-  Due to performance considerations Rar VM may set Flags C incorrectly
-  for some operands (SHL x, 0, ... ).
-  Check implementation of concrete VM command
-  to see if it sets flags right.
-*/
-
-#include "StdAfx.h"
-
-#include "../../../C/7zCrc.h"
-#include "../../../C/Alloc.h"
-
-#include "Rar3Vm.h"
-
-namespace NCompress {
-namespace NRar3 {
-
-UInt32 CMemBitDecoder::ReadBits(int numBits)
-{
-  UInt32 res = 0;
-  for (;;)
-  {
-    Byte b = _bitPos < _bitSize ? _data[_bitPos >> 3] : 0;
-    int avail = (int)(8 - (_bitPos & 7));
-    if (numBits <= avail)
-    {
-      _bitPos += numBits;
-      return res | (b >> (avail - numBits)) & ((1 << numBits) - 1);
-    }
-    numBits -= avail;
-    res |= (UInt32)(b & ((1 << avail) - 1)) << numBits;
-    _bitPos += avail;
-  }
-}
-
-UInt32 CMemBitDecoder::ReadBit() { return ReadBits(1); }
-
-namespace NVm {
-
-static const UInt32 kStackRegIndex = kNumRegs - 1;
-
-static const UInt32 FLAG_C = 1;
-static const UInt32 FLAG_Z = 2;
-static const UInt32 FLAG_S = 0x80000000;
-
-static const Byte CF_OP0 = 0;
-static const Byte CF_OP1 = 1;
-static const Byte CF_OP2 = 2;
-static const Byte CF_OPMASK = 3;
-static const Byte CF_BYTEMODE = 4;
-static const Byte CF_JUMP = 8;
-static const Byte CF_PROC = 16;
-static const Byte CF_USEFLAGS = 32;
-static const Byte CF_CHFLAGS = 64;
-
-static Byte kCmdFlags[]=
-{
-  /* CMD_MOV   */ CF_OP2 | CF_BYTEMODE,
-  /* CMD_CMP   */ CF_OP2 | CF_BYTEMODE | CF_CHFLAGS,
-  /* CMD_ADD   */ CF_OP2 | CF_BYTEMODE | CF_CHFLAGS,
-  /* CMD_SUB   */ CF_OP2 | CF_BYTEMODE | CF_CHFLAGS,
-  /* CMD_JZ    */ CF_OP1 | CF_JUMP | CF_USEFLAGS,
-  /* CMD_JNZ   */ CF_OP1 | CF_JUMP | CF_USEFLAGS,
-  /* CMD_INC   */ CF_OP1 | CF_BYTEMODE | CF_CHFLAGS,
-  /* CMD_DEC   */ CF_OP1 | CF_BYTEMODE | CF_CHFLAGS,
-  /* CMD_JMP   */ CF_OP1 | CF_JUMP,
-  /* CMD_XOR   */ CF_OP2 | CF_BYTEMODE | CF_CHFLAGS,
-  /* CMD_AND   */ CF_OP2 | CF_BYTEMODE | CF_CHFLAGS,
-  /* CMD_OR    */ CF_OP2 | CF_BYTEMODE | CF_CHFLAGS,
-  /* CMD_TEST  */ CF_OP2 | CF_BYTEMODE | CF_CHFLAGS,
-  /* CMD_JS    */ CF_OP1 | CF_JUMP | CF_USEFLAGS,
-  /* CMD_JNS   */ CF_OP1 | CF_JUMP | CF_USEFLAGS,
-  /* CMD_JB    */ CF_OP1 | CF_JUMP | CF_USEFLAGS,
-  /* CMD_JBE   */ CF_OP1 | CF_JUMP | CF_USEFLAGS,
-  /* CMD_JA    */ CF_OP1 | CF_JUMP | CF_USEFLAGS,
-  /* CMD_JAE   */ CF_OP1 | CF_JUMP | CF_USEFLAGS,
-  /* CMD_PUSH  */ CF_OP1,
-  /* CMD_POP   */ CF_OP1,
-  /* CMD_CALL  */ CF_OP1 | CF_PROC,
-  /* CMD_RET   */ CF_OP0 | CF_PROC,
-  /* CMD_NOT   */ CF_OP1 | CF_BYTEMODE,
-  /* CMD_SHL   */ CF_OP2 | CF_BYTEMODE | CF_CHFLAGS,
-  /* CMD_SHR   */ CF_OP2 | CF_BYTEMODE | CF_CHFLAGS,
-  /* CMD_SAR   */ CF_OP2 | CF_BYTEMODE | CF_CHFLAGS,
-  /* CMD_NEG   */ CF_OP1 | CF_BYTEMODE | CF_CHFLAGS,
-  /* CMD_PUSHA */ CF_OP0,
-  /* CMD_POPA  */ CF_OP0,
-  /* CMD_PUSHF */ CF_OP0 | CF_USEFLAGS,
-  /* CMD_POPF  */ CF_OP0 | CF_CHFLAGS,
-  /* CMD_MOVZX */ CF_OP2,
-  /* CMD_MOVSX */ CF_OP2,
-  /* CMD_XCHG  */ CF_OP2 | CF_BYTEMODE,
-  /* CMD_MUL   */ CF_OP2 | CF_BYTEMODE,
-  /* CMD_DIV   */ CF_OP2 | CF_BYTEMODE,
-  /* CMD_ADC   */ CF_OP2 | CF_BYTEMODE | CF_USEFLAGS | CF_CHFLAGS ,
-  /* CMD_SBB   */ CF_OP2 | CF_BYTEMODE | CF_USEFLAGS | CF_CHFLAGS ,
-  /* CMD_PRINT */ CF_OP0
-};
-
-CVm::CVm(): Mem(NULL) {}
-
-bool CVm::Create()
-{
-  if (Mem == NULL)
-    Mem = (Byte *)::MyAlloc(kSpaceSize + 4);
-  return (Mem != NULL);
-}
-
-CVm::~CVm()
-{
-  ::MyFree(Mem);
-}
-
-// CVm::Execute can change CProgram object: it clears progarm if VM returns error.
-
-bool CVm::Execute(CProgram *prg, const CProgramInitState *initState,
-    CBlockRef &outBlockRef, CRecordVector<Byte> &outGlobalData)
-{
-  memcpy(R, initState->InitR, sizeof(initState->InitR));
-  R[kStackRegIndex] = kSpaceSize;
-  R[kNumRegs] = 0;
-  Flags = 0;
-
-  UInt32 globalSize = MyMin((UInt32)initState->GlobalData.Size(), kGlobalSize);
-  if (globalSize != 0)
-    memcpy(Mem + kGlobalOffset, &initState->GlobalData[0], globalSize);
-  UInt32 staticSize = MyMin((UInt32)prg->StaticData.Size(), kGlobalSize - globalSize);
-  if (staticSize != 0)
-    memcpy(Mem + kGlobalOffset + globalSize, &prg->StaticData[0], staticSize);
-
-  bool res = true;
-  #ifdef RARVM_STANDARD_FILTERS
-  if (prg->StandardFilterIndex >= 0)
-    ExecuteStandardFilter(prg->StandardFilterIndex);
-  else
-  #endif
-  {
-    res = ExecuteCode(prg);
-    if (!res)
-      prg->Commands[0].OpCode = CMD_RET;
-  }
-  UInt32 newBlockPos = GetFixedGlobalValue32(NGlobalOffset::kBlockPos) & kSpaceMask;
-  UInt32 newBlockSize = GetFixedGlobalValue32(NGlobalOffset::kBlockSize) & kSpaceMask;
-  if (newBlockPos + newBlockSize >= kSpaceSize)
-    newBlockPos = newBlockSize = 0;
-  outBlockRef.Offset = newBlockPos;
-  outBlockRef.Size = newBlockSize;
-
-  outGlobalData.Clear();
-  UInt32 dataSize = GetFixedGlobalValue32(NGlobalOffset::kGlobalMemOutSize);
-  dataSize = MyMin(dataSize, kGlobalSize - kFixedGlobalSize);
-  if (dataSize != 0)
-  {
-    dataSize += kFixedGlobalSize;
-    outGlobalData.Reserve(dataSize);
-    for (UInt32 i = 0; i < dataSize; i++)
-      outGlobalData.Add(Mem[kGlobalOffset + i]);
-  }
-  return res;
-}
-
-
-#define SET_IP(IP) \
-  if ((IP) >= numCommands) return true; \
-  if (--maxOpCount <= 0) return false; \
-  cmd = commands + (IP);
-
-#define GET_FLAG_S_B(res) (((res) & 0x80) ? FLAG_S : 0)
-#define SET_IP_OP1 { UInt32 val = GetOperand32(&cmd->Op1); SET_IP(val); }
-#define FLAGS_UPDATE_SZ Flags = res == 0 ? FLAG_Z : res & FLAG_S
-#define FLAGS_UPDATE_SZ_B Flags = (res & 0xFF) == 0 ? FLAG_Z : GET_FLAG_S_B(res)
-
-UInt32 CVm::GetOperand32(const COperand *op) const
-{
-  switch(op->Type)
-  {
-    case OP_TYPE_REG: return R[op->Data];
-    case OP_TYPE_REGMEM: return GetValue32(&Mem[(op->Base + R[op->Data]) & kSpaceMask]);
-    default: return op->Data;
-  }
-}
-
-void CVm::SetOperand32(const COperand *op, UInt32 val)
-{
-  switch(op->Type)
-  {
-    case OP_TYPE_REG: R[op->Data] = val; return;
-    case OP_TYPE_REGMEM: SetValue32(&Mem[(op->Base + R[op->Data]) & kSpaceMask], val); return;
-  }
-}
-
-Byte CVm::GetOperand8(const COperand *op) const
-{
-  switch(op->Type)
-  {
-    case OP_TYPE_REG: return (Byte)R[op->Data];
-    case OP_TYPE_REGMEM: return Mem[(op->Base + R[op->Data]) & kSpaceMask];;
-    default: return (Byte)op->Data;
-  }
-}
-
-void CVm::SetOperand8(const COperand *op, Byte val)
-{
-  switch(op->Type)
-  {
-    case OP_TYPE_REG: R[op->Data] = (R[op->Data] & 0xFFFFFF00) | val; return;
-    case OP_TYPE_REGMEM: Mem[(op->Base + R[op->Data]) & kSpaceMask] = val; return;
-  }
-}
-
-UInt32 CVm::GetOperand(bool byteMode, const COperand *op) const
-{
-  if (byteMode)
-    return GetOperand8(op);
-  return GetOperand32(op);
-}
-
-void CVm::SetOperand(bool byteMode, const COperand *op, UInt32 val)
-{
-  if (byteMode)
-    SetOperand8(op, (Byte)(val & 0xFF));
-  else
-    SetOperand32(op, val);
-}
-
-bool CVm::ExecuteCode(const CProgram *prg)
-{
-  Int32 maxOpCount = 25000000;
-  const CCommand *commands = &prg->Commands[0];
-  const CCommand *cmd = commands;
-  UInt32 numCommands = prg->Commands.Size();
-  for (;;)
-  {
-    switch(cmd->OpCode)
-    {
-      #ifndef RARVM_NO_VM
-      
-      case CMD_MOV:
-        SetOperand32(&cmd->Op1, GetOperand32(&cmd->Op2));
-        break;
-      case CMD_MOVB:
-        SetOperand8(&cmd->Op1, GetOperand8(&cmd->Op2));
-        break;
-      case CMD_CMP:
-        {
-          UInt32 v1 = GetOperand32(&cmd->Op1);
-          UInt32 res = v1 - GetOperand32(&cmd->Op2);
-          Flags = res == 0 ? FLAG_Z : (res > v1) | (res & FLAG_S);
-        }
-        break;
-      case CMD_CMPB:
-        {
-          Byte v1 = GetOperand8(&cmd->Op1);
-          Byte res = v1 - GetOperand8(&cmd->Op2);
-          res &= 0xFF;
-          Flags = res == 0 ? FLAG_Z : (res > v1) | GET_FLAG_S_B(res);
-        }
-        break;
-      case CMD_ADD:
-        {
-          UInt32 v1 = GetOperand32(&cmd->Op1);
-          UInt32 res = v1 + GetOperand32(&cmd->Op2);
-          SetOperand32(&cmd->Op1, res);
-          Flags = (res < v1) | (res == 0 ? FLAG_Z : (res & FLAG_S));
-        }
-        break;
-      case CMD_ADDB:
-        {
-          Byte v1 = GetOperand8(&cmd->Op1);
-          Byte res = v1 + GetOperand8(&cmd->Op2);
-          res &= 0xFF;
-          SetOperand8(&cmd->Op1, (Byte)res);
-          Flags = (res < v1) | (res == 0 ? FLAG_Z : GET_FLAG_S_B(res));
-        }
-        break;
-      case CMD_ADC:
-        {
-          UInt32 v1 = GetOperand(cmd->ByteMode, &cmd->Op1);
-          UInt32 FC = (Flags & FLAG_C);
-          UInt32 res = v1 + GetOperand(cmd->ByteMode, &cmd->Op2) + FC;
-          if (cmd->ByteMode)
-            res &= 0xFF;
-          SetOperand(cmd->ByteMode, &cmd->Op1, res);
-          Flags = (res < v1 || res == v1 && FC) | (res == 0 ? FLAG_Z : (res & FLAG_S));
-        }
-        break;
-      case CMD_SUB:
-        {
-          UInt32 v1 = GetOperand32(&cmd->Op1);
-          UInt32 res = v1 - GetOperand32(&cmd->Op2);
-          SetOperand32(&cmd->Op1, res);
-          Flags = res == 0 ? FLAG_Z : (res > v1) | (res & FLAG_S);
-        }
-        break;
-      case CMD_SUBB:
-        {
-          UInt32 v1 = GetOperand8(&cmd->Op1);
-          UInt32 res = v1 - GetOperand8(&cmd->Op2);
-          SetOperand8(&cmd->Op1, (Byte)res);
-          Flags = res == 0 ? FLAG_Z : (res > v1) | (res & FLAG_S);
-        }
-        break;
-      case CMD_SBB:
-        {
-          UInt32 v1 = GetOperand(cmd->ByteMode, &cmd->Op1);
-          UInt32 FC = (Flags & FLAG_C);
-          UInt32 res = v1 - GetOperand(cmd->ByteMode, &cmd->Op2) - FC;
-          // Flags = res == 0 ? FLAG_Z : (res > v1 || res == v1 && FC) | (res & FLAG_S);
-          if (cmd->ByteMode)
-            res &= 0xFF;
-          SetOperand(cmd->ByteMode, &cmd->Op1, res);
-          Flags = (res > v1 || res == v1 && FC) | (res == 0 ? FLAG_Z : (res & FLAG_S));
-        }
-        break;
-      case CMD_INC:
-        {
-          UInt32 res = GetOperand32(&cmd->Op1) + 1;
-          SetOperand32(&cmd->Op1, res);
-          FLAGS_UPDATE_SZ;
-        }
-        break;
-      case CMD_INCB:
-        {
-          Byte res = GetOperand8(&cmd->Op1) + 1;
-          SetOperand8(&cmd->Op1, res);;
-          FLAGS_UPDATE_SZ_B;
-        }
-        break;
-      case CMD_DEC:
-        {
-          UInt32 res = GetOperand32(&cmd->Op1) - 1;
-          SetOperand32(&cmd->Op1, res);
-          FLAGS_UPDATE_SZ;
-        }
-        break;
-      case CMD_DECB:
-        {
-          Byte res = GetOperand8(&cmd->Op1) - 1;
-          SetOperand8(&cmd->Op1, res);;
-          FLAGS_UPDATE_SZ_B;
-        }
-        break;
-      case CMD_XOR:
-        {
-          UInt32 res = GetOperand32(&cmd->Op1) ^ GetOperand32(&cmd->Op2);
-          SetOperand32(&cmd->Op1, res);
-          FLAGS_UPDATE_SZ;
-        }
-        break;
-      case CMD_XORB:
-        {
-          Byte res = GetOperand8(&cmd->Op1) ^ GetOperand8(&cmd->Op2);
-          SetOperand8(&cmd->Op1, res);
-          FLAGS_UPDATE_SZ_B;
-        }
-        break;
-      case CMD_AND:
-        {
-          UInt32 res = GetOperand32(&cmd->Op1) & GetOperand32(&cmd->Op2);
-          SetOperand32(&cmd->Op1, res);
-          FLAGS_UPDATE_SZ;
-        }
-        break;
-      case CMD_ANDB:
-        {
-          Byte res = GetOperand8(&cmd->Op1) & GetOperand8(&cmd->Op2);
-          SetOperand8(&cmd->Op1, res);
-          FLAGS_UPDATE_SZ_B;
-        }
-        break;
-      case CMD_OR:
-        {
-          UInt32 res = GetOperand32(&cmd->Op1) | GetOperand32(&cmd->Op2);
-          SetOperand32(&cmd->Op1, res);
-          FLAGS_UPDATE_SZ;
-        }
-        break;
-      case CMD_ORB:
-        {
-          Byte res = GetOperand8(&cmd->Op1) | GetOperand8(&cmd->Op2);
-          SetOperand8(&cmd->Op1, res);
-          FLAGS_UPDATE_SZ_B;
-        }
-        break;
-      case CMD_TEST:
-        {
-          UInt32 res = GetOperand32(&cmd->Op1) & GetOperand32(&cmd->Op2);
-          FLAGS_UPDATE_SZ;
-        }
-        break;
-      case CMD_TESTB:
-        {
-          Byte res = GetOperand8(&cmd->Op1) & GetOperand8(&cmd->Op2);
-          FLAGS_UPDATE_SZ_B;
-        }
-        break;
-      case CMD_NOT:
-        SetOperand(cmd->ByteMode, &cmd->Op1, ~GetOperand(cmd->ByteMode, &cmd->Op1));
-        break;
-      case CMD_NEG:
-        {
-          UInt32 res = 0 - GetOperand32(&cmd->Op1);
-          SetOperand32(&cmd->Op1, res);
-          Flags = res == 0 ? FLAG_Z : FLAG_C | (res & FLAG_S);
-        }
-        break;
-      case CMD_NEGB:
-        {
-          Byte res = (Byte)(0 - GetOperand8(&cmd->Op1));
-          SetOperand8(&cmd->Op1, res);
-          Flags = res == 0 ? FLAG_Z : FLAG_C | GET_FLAG_S_B(res);
-        }
-        break;
-
-      case CMD_SHL:
-        {
-          UInt32 v1 = GetOperand32(&cmd->Op1);
-          int v2 = (int)GetOperand32(&cmd->Op2);
-          UInt32 res = v1 << v2;
-          SetOperand32(&cmd->Op1, res);
-          Flags = (res == 0 ? FLAG_Z : (res & FLAG_S)) | ((v1 << (v2 - 1)) & 0x80000000 ? FLAG_C : 0);
-        }
-        break;
-      case CMD_SHLB:
-        {
-          Byte v1 = GetOperand8(&cmd->Op1);
-          int v2 = (int)GetOperand8(&cmd->Op2);
-          Byte res = (Byte)(v1 << v2);
-          SetOperand8(&cmd->Op1, res);
-          Flags = (res == 0 ? FLAG_Z : GET_FLAG_S_B(res)) | ((v1 << (v2 - 1)) & 0x80 ? FLAG_C : 0);
-        }
-        break;
-      case CMD_SHR:
-        {
-          UInt32 v1 = GetOperand32(&cmd->Op1);
-          int v2 = (int)GetOperand32(&cmd->Op2);
-          UInt32 res = v1 >> v2;
-          SetOperand32(&cmd->Op1, res);
-          Flags = (res == 0 ? FLAG_Z : (res & FLAG_S)) | ((v1 >> (v2 - 1)) & FLAG_C);
-        }
-        break;
-      case CMD_SHRB:
-        {
-          Byte v1 = GetOperand8(&cmd->Op1);
-          int v2 = (int)GetOperand8(&cmd->Op2);
-          Byte res = (Byte)(v1 >> v2);
-          SetOperand8(&cmd->Op1, res);
-          Flags = (res == 0 ? FLAG_Z : GET_FLAG_S_B(res)) | ((v1 >> (v2 - 1)) & FLAG_C);
-        }
-        break;
-      case CMD_SAR:
-        {
-          UInt32 v1 = GetOperand32(&cmd->Op1);
-          int v2 = (int)GetOperand32(&cmd->Op2);
-          UInt32 res = UInt32(((Int32)v1) >> v2);
-          SetOperand32(&cmd->Op1, res);
-          Flags= (res == 0 ? FLAG_Z : (res & FLAG_S)) | ((v1 >> (v2 - 1)) & FLAG_C);
-        }
-        break;
-      case CMD_SARB:
-        {
-          Byte v1 = GetOperand8(&cmd->Op1);
-          int v2 = (int)GetOperand8(&cmd->Op2);
-          Byte res = (Byte)(((signed char)v1) >> v2);
-          SetOperand8(&cmd->Op1, res);
-          Flags= (res == 0 ? FLAG_Z : GET_FLAG_S_B(res)) | ((v1 >> (v2 - 1)) & FLAG_C);
-        }
-        break;
-
-      case CMD_JMP:
-        SET_IP_OP1;
-        continue;
-      case CMD_JZ:
-        if ((Flags & FLAG_Z) != 0)
-        {
-          SET_IP_OP1;
-          continue;
-        }
-        break;
-      case CMD_JNZ:
-        if ((Flags & FLAG_Z) == 0)
-        {
-          SET_IP_OP1;
-          continue;
-        }
-        break;
-      case CMD_JS:
-        if ((Flags & FLAG_S) != 0)
-        {
-          SET_IP_OP1;
-          continue;
-        }
-        break;
-      case CMD_JNS:
-        if ((Flags & FLAG_S) == 0)
-        {
-          SET_IP_OP1;
-          continue;
-        }
-        break;
-      case CMD_JB:
-        if ((Flags & FLAG_C) != 0)
-        {
-          SET_IP_OP1;
-          continue;
-        }
-        break;
-      case CMD_JBE:
-        if ((Flags & (FLAG_C | FLAG_Z)) != 0)
-        {
-          SET_IP_OP1;
-          continue;
-        }
-        break;
-      case CMD_JA:
-        if ((Flags & (FLAG_C | FLAG_Z)) == 0)
-        {
-          SET_IP_OP1;
-          continue;
-        }
-        break;
-      case CMD_JAE:
-        if ((Flags & FLAG_C) == 0)
-        {
-          SET_IP_OP1;
-          continue;
-        }
-        break;
-      
-      case CMD_PUSH:
-        R[kStackRegIndex] -= 4;
-        SetValue32(&Mem[R[kStackRegIndex] & kSpaceMask], GetOperand32(&cmd->Op1));
-        break;
-      case CMD_POP:
-        SetOperand32(&cmd->Op1, GetValue32(&Mem[R[kStackRegIndex] & kSpaceMask]));
-        R[kStackRegIndex] += 4;
-        break;
-      case CMD_CALL:
-        R[kStackRegIndex] -= 4;
-        SetValue32(&Mem[R[kStackRegIndex] & kSpaceMask], (UInt32)(cmd - commands + 1));
-        SET_IP_OP1;
-        continue;
-
-      case CMD_PUSHA:
-        {
-          for (UInt32 i = 0, SP = R[kStackRegIndex] - 4; i < kNumRegs; i++, SP -= 4)
-            SetValue32(&Mem[SP & kSpaceMask], R[i]);
-          R[kStackRegIndex] -= kNumRegs * 4;
-        }
-        break;
-      case CMD_POPA:
-        {
-          for (UInt32 i = 0, SP = R[kStackRegIndex]; i < kNumRegs; i++, SP += 4)
-            R[kStackRegIndex - i] = GetValue32(&Mem[SP & kSpaceMask]);
-        }
-        break;
-      case CMD_PUSHF:
-        R[kStackRegIndex] -= 4;
-        SetValue32(&Mem[R[kStackRegIndex]&kSpaceMask], Flags);
-        break;
-      case CMD_POPF:
-        Flags = GetValue32(&Mem[R[kStackRegIndex] & kSpaceMask]);
-        R[kStackRegIndex] += 4;
-        break;
-      
-      case CMD_MOVZX:
-        SetOperand32(&cmd->Op1, GetOperand8(&cmd->Op2));
-        break;
-      case CMD_MOVSX:
-        SetOperand32(&cmd->Op1, (UInt32)(Int32)(signed char)GetOperand8(&cmd->Op2));
-        break;
-      case CMD_XCHG:
-        {
-          UInt32 v1 = GetOperand(cmd->ByteMode, &cmd->Op1);
-          SetOperand(cmd->ByteMode, &cmd->Op1, GetOperand(cmd->ByteMode, &cmd->Op2));
-          SetOperand(cmd->ByteMode, &cmd->Op2, v1);
-        }
-        break;
-      case CMD_MUL:
-        {
-          UInt32 res = GetOperand32(&cmd->Op1) * GetOperand32(&cmd->Op2);
-          SetOperand32(&cmd->Op1, res);
-        }
-        break;
-      case CMD_MULB:
-        {
-          Byte res = GetOperand8(&cmd->Op1) * GetOperand8(&cmd->Op2);
-          SetOperand8(&cmd->Op1, res);
-        }
-        break;
-      case CMD_DIV:
-        {
-          UInt32 divider = GetOperand(cmd->ByteMode, &cmd->Op2);
-          if (divider != 0)
-          {
-            UInt32 res = GetOperand(cmd->ByteMode, &cmd->Op1) / divider;
-            SetOperand(cmd->ByteMode, &cmd->Op1, res);
-          }
-        }
-        break;
-      
-      #endif
-      
-      case CMD_RET:
-        {
-          if (R[kStackRegIndex] >= kSpaceSize)
-            return true;
-          UInt32 ip = GetValue32(&Mem[R[kStackRegIndex] & kSpaceMask]);
-          SET_IP(ip);
-          R[kStackRegIndex] += 4;
-          continue;
-        }
-      case CMD_PRINT:
-        break;
-    }
-    cmd++;
-    --maxOpCount;
-  }
-}
-
-
-//////////////////////////////////////////////////////
-// Read program
-
-UInt32 ReadEncodedUInt32(CMemBitDecoder &inp)
-{
-  switch(inp.ReadBits(2))
-  {
-    case 0:
-      return inp.ReadBits(4);
-    case 1:
-    {
-      UInt32 v = inp.ReadBits(4);
-      if (v == 0)
-        return 0xFFFFFF00 | inp.ReadBits(8);
-      else
-        return (v << 4) | inp.ReadBits(4);
-    }
-    case 2:
-      return inp.ReadBits(16);
-    default:
-      return inp.ReadBits(32);
-  }
-}
-
-void CVm::DecodeArg(CMemBitDecoder &inp, COperand &op, bool byteMode)
-{
-  if (inp.ReadBit())
-  {
-    op.Type = OP_TYPE_REG;
-    op.Data = inp.ReadBits(kNumRegBits);
-  }
-  else if (inp.ReadBit() == 0)
-  {
-    op.Type = OP_TYPE_INT;
-    if (byteMode)
-      op.Data = inp.ReadBits(8);
-    else
-      op.Data = ReadEncodedUInt32(inp);
-  }
-  else
-  {
-    op.Type = OP_TYPE_REGMEM;
-    if (inp.ReadBit() == 0)
-    {
-      op.Data = inp.ReadBits(kNumRegBits);
-      op.Base = 0;
-    }
-    else
-    {
-      if (inp.ReadBit() == 0)
-        op.Data = inp.ReadBits(kNumRegBits);
-      else
-        op.Data = kNumRegs;
-      op.Base = ReadEncodedUInt32(inp);
-    }
-  }
-}
-
-void CVm::ReadVmProgram(const Byte *code, UInt32 codeSize, CProgram *prg)
-{
-  CMemBitDecoder inp;
-  inp.Init(code, codeSize);
-
-  prg->StaticData.Clear();
-  if (inp.ReadBit())
-  {
-    UInt32 dataSize = ReadEncodedUInt32(inp) + 1;
-    for (UInt32 i = 0; inp.Avail() && i < dataSize; i++)
-      prg->StaticData.Add((Byte)inp.ReadBits(8));
-  }
-  while (inp.Avail())
-  {
-    prg->Commands.Add(CCommand());
-    CCommand *cmd = &prg->Commands.Back();
-    if (inp.ReadBit() == 0)
-      cmd->OpCode = (ECommand)inp.ReadBits(3);
-    else
-      cmd->OpCode = (ECommand)(8 + inp.ReadBits(5));
-    if (kCmdFlags[cmd->OpCode] & CF_BYTEMODE)
-      cmd->ByteMode = (inp.ReadBit()) ? true : false;
-    else
-      cmd->ByteMode = 0;
-    int opNum = (kCmdFlags[cmd->OpCode] & CF_OPMASK);
-    if (opNum > 0)
-    {
-      DecodeArg(inp, cmd->Op1, cmd->ByteMode);
-      if (opNum == 2)
-        DecodeArg(inp, cmd->Op2, cmd->ByteMode);
-      else
-      {
-        if (cmd->Op1.Type == OP_TYPE_INT && (kCmdFlags[cmd->OpCode] & (CF_JUMP | CF_PROC)))
-        {
-          int Distance = cmd->Op1.Data;
-          if (Distance >= 256)
-            Distance -= 256;
-          else
-          {
-            if (Distance >= 136)
-              Distance -= 264;
-            else if (Distance >= 16)
-              Distance -= 8;
-            else if (Distance >= 8)
-              Distance -= 16;
-            Distance += prg->Commands.Size() - 1;
-          }
-          cmd->Op1.Data = Distance;
-        }
-      }
-    }
-    if (cmd->ByteMode)
-    {
-      switch (cmd->OpCode)
-      {
-        case CMD_MOV: cmd->OpCode = CMD_MOVB; break;
-        case CMD_CMP: cmd->OpCode = CMD_CMPB; break;
-        case CMD_ADD: cmd->OpCode = CMD_ADDB; break;
-        case CMD_SUB: cmd->OpCode = CMD_SUBB; break;
-        case CMD_INC: cmd->OpCode = CMD_INCB; break;
-        case CMD_DEC: cmd->OpCode = CMD_DECB; break;
-        case CMD_XOR: cmd->OpCode = CMD_XORB; break;
-        case CMD_AND: cmd->OpCode = CMD_ANDB; break;
-        case CMD_OR: cmd->OpCode = CMD_ORB; break;
-        case CMD_TEST: cmd->OpCode = CMD_TESTB; break;
-        case CMD_NEG: cmd->OpCode = CMD_NEGB; break;
-        case CMD_SHL: cmd->OpCode = CMD_SHLB; break;
-        case CMD_SHR: cmd->OpCode = CMD_SHRB; break;
-        case CMD_SAR: cmd->OpCode = CMD_SARB; break;
-        case CMD_MUL: cmd->OpCode = CMD_MULB; break;
-      }
-    }
-  }
-}
-
-#ifdef RARVM_STANDARD_FILTERS
-
-enum EStandardFilter
-{
-  SF_E8,
-  SF_E8E9,
-  SF_ITANIUM,
-  SF_RGB,
-  SF_AUDIO,
-  SF_DELTA,
-  SF_UPCASE
-};
-
-struct StandardFilterSignature
-{
-  UInt32 Length;
-  UInt32 CRC;
-  EStandardFilter Type;
-}
-kStdFilters[]=
-{
-  {  53, 0xad576887, SF_E8 },
-  {  57, 0x3cd7e57e, SF_E8E9 },
-  { 120, 0x3769893f, SF_ITANIUM },
-  {  29, 0x0e06077d, SF_DELTA },
-  { 149, 0x1c2c5dc8, SF_RGB },
-  { 216, 0xbc85e701, SF_AUDIO },
-  {  40, 0x46b9c560, SF_UPCASE }
-};
-
-static int FindStandardFilter(const Byte *code, UInt32 codeSize)
-{
-  UInt32 crc = CrcCalc(code, codeSize);
-  for (int i = 0; i < sizeof(kStdFilters) / sizeof(kStdFilters[0]); i++)
-  {
-    StandardFilterSignature &sfs = kStdFilters[i];
-    if (sfs.CRC == crc && sfs.Length == codeSize)
-      return i;
-  }
-  return -1;
-}
-
-#endif
-
-void CVm::PrepareProgram(const Byte *code, UInt32 codeSize, CProgram *prg)
-{
-  Byte xorSum = 0;
-  for (UInt32 i = 1; i < codeSize; i++)
-    xorSum ^= code[i];
-
-  prg->Commands.Clear();
-  #ifdef RARVM_STANDARD_FILTERS
-  prg->StandardFilterIndex = -1;
-  #endif
-
-  if (xorSum == code[0] && codeSize > 0)
-  {
-    #ifdef RARVM_STANDARD_FILTERS
-    prg->StandardFilterIndex = FindStandardFilter(code, codeSize);
-    if (prg->StandardFilterIndex >= 0)
-      return;
-    #endif
-    // 1 byte for checksum
-    ReadVmProgram(code + 1, codeSize - 1, prg);
-  }
-  prg->Commands.Add(CCommand());
-  CCommand *cmd = &prg->Commands.Back();
-  cmd->OpCode = CMD_RET;
-}
-
-void CVm::SetMemory(UInt32 pos, const Byte *data, UInt32 dataSize)
-{
-  if (pos < kSpaceSize && data != Mem + pos)
-    memmove(Mem + pos, data, MyMin(dataSize, kSpaceSize - pos));
-}
-
-#ifdef RARVM_STANDARD_FILTERS
-
-static void E8E9Decode(Byte *data, UInt32 dataSize, UInt32 fileOffset, bool e9)
-{
-  if (dataSize <= 4)
-    return;
-  dataSize -= 4;
-  const UInt32 kFileSize = 0x1000000;
-  Byte cmpByte2 = (e9 ? 0xE9 : 0xE8);
-  for (UInt32 curPos = 0; curPos < dataSize;)
-  {
-    Byte curByte = *(data++);
-    curPos++;
-    if (curByte == 0xE8 || curByte == cmpByte2)
-    {
-      UInt32 offset = curPos + fileOffset;
-      UInt32 addr = (Int32)GetValue32(data);
-      if (addr < kFileSize)
-        SetValue32(data, addr - offset);
-      else if ((Int32)addr < 0 && (Int32)(addr + offset) >= 0)
-        SetValue32(data, addr + kFileSize);
-      data += 4;
-      curPos += 4;
-    }
-  }
-}
-
-static inline UInt32 ItaniumGetOpType(const Byte *data, int bitPos)
-{
-  return (data[(unsigned int)bitPos >> 3] >> (bitPos & 7)) & 0xF;
-}
-
-
-static void ItaniumDecode(Byte *data, UInt32 dataSize, UInt32 fileOffset)
-{
-  UInt32 curPos = 0;
-  fileOffset >>= 4;
-  while (curPos < dataSize - 21)
-  {
-    int b = (data[0] & 0x1F) - 0x10;
-    if (b >= 0)
-    {
-      static Byte kCmdMasks[16] = {4,4,6,6,0,0,7,7,4,4,0,0,4,4,0,0};
-      Byte cmdMask = kCmdMasks[b];
-      if (cmdMask != 0)
-        for (int i = 0; i < 3; i++)
-          if (cmdMask & (1 << i))
-          {
-            int startPos = i * 41 + 18;
-            if (ItaniumGetOpType(data, startPos + 24) == 5)
-            {
-              const UInt32 kMask = 0xFFFFF;
-              Byte *p = data + ((unsigned int)startPos >> 3);
-              UInt32 bitField =  ((UInt32)p[0]) | ((UInt32)p[1] <<  8) | ((UInt32)p[2] << 16);
-              int inBit = (startPos & 7);
-              UInt32 offset = (bitField >> inBit) & kMask;
-              UInt32 andMask = ~(kMask << inBit);
-              bitField = ((offset - fileOffset) & kMask) << inBit;
-              for (int j = 0; j < 3; j++)
-              {
-                p[j] &= andMask;
-                p[j] |= bitField;
-                andMask >>= 8;
-                bitField >>= 8;
-              }
-            }
-          }
-    }
-    data += 16;
-    curPos += 16;
-    fileOffset++;
-  }
-}
-
-static void DeltaDecode(Byte *data, UInt32 dataSize, UInt32 numChannels)
-{
-  UInt32 srcPos = 0;
-  UInt32 border = dataSize * 2;
-  for (UInt32 curChannel = 0; curChannel < numChannels; curChannel++)
-  {
-    Byte prevByte = 0;
-    for (UInt32 destPos = dataSize + curChannel; destPos < border; destPos += numChannels)
-      data[destPos] = (prevByte = prevByte - data[srcPos++]);
-  }
-}
-
-static void RgbDecode(Byte *srcData, UInt32 dataSize, UInt32 width, UInt32 posR)
-{
-  Byte *destData = srcData + dataSize;
-  const UInt32 numChannels = 3;
-  for (UInt32 curChannel = 0; curChannel < numChannels; curChannel++)
-  {
-    Byte prevByte = 0;
-    
-    for (UInt32 i = curChannel; i < dataSize; i+= numChannels)
-    {
-      unsigned int predicted;
-      if (i < width)
-        predicted = prevByte;
-      else
-      {
-        unsigned int upperLeftByte = destData[i - width];
-        unsigned int upperByte = destData[i - width + 3];
-        predicted = prevByte + upperByte - upperLeftByte;
-        int pa = abs((int)(predicted - prevByte));
-        int pb = abs((int)(predicted - upperByte));
-        int pc = abs((int)(predicted - upperLeftByte));
-        if (pa <= pb && pa <= pc)
-          predicted = prevByte;
-        else
-          if (pb <= pc)
-            predicted = upperByte;
-          else
-            predicted = upperLeftByte;
-      }
-      destData[i] = prevByte = (Byte)(predicted - *(srcData++));
-    }
-  }
-  if (dataSize < 3)
-    return;
-  for (UInt32 i = posR, border = dataSize - 2; i < border; i += 3)
-  {
-    Byte g = destData[i + 1];
-    destData[i] = destData[i] + g;
-    destData[i + 2] = destData[i + 2] + g;
-  }
-}
-
-static void AudioDecode(Byte *srcData, UInt32 dataSize, UInt32 numChannels)
-{
-  Byte *destData = srcData + dataSize;
-  for (UInt32 curChannel = 0; curChannel < numChannels; curChannel++)
-  {
-    UInt32 prevByte = 0, prevDelta = 0, dif[7];
-    Int32 D1 = 0, D2 = 0, D3;
-    Int32 K1 = 0, K2 = 0, K3 = 0;
-    memset(dif, 0, sizeof(dif));
-    
-    for (UInt32 i = curChannel, byteCount = 0; i < dataSize; i += numChannels, byteCount++)
-    {
-      D3 = D2;
-      D2 = prevDelta - D1;
-      D1 = prevDelta;
-      
-      UInt32 predicted = 8 * prevByte + K1 * D1 + K2 * D2 + K3 * D3;
-      predicted = (predicted >> 3) & 0xFF;
-      
-      UInt32 curByte = *(srcData++);
-      
-      predicted -= curByte;
-      destData[i] = (Byte)predicted;
-      prevDelta = (UInt32)(Int32)(signed char)(predicted - prevByte);
-      prevByte = predicted;
-      
-      Int32 D = ((Int32)(signed char)curByte) << 3;
-      
-      dif[0] += abs(D);
-      dif[1] += abs(D - D1);
-      dif[2] += abs(D + D1);
-      dif[3] += abs(D - D2);
-      dif[4] += abs(D + D2);
-      dif[5] += abs(D - D3);
-      dif[6] += abs(D + D3);
-      
-      if ((byteCount & 0x1F) == 0)
-      {
-        UInt32 minDif = dif[0], numMinDif = 0;
-        dif[0] = 0;
-        for (int j = 1; j < sizeof(dif) / sizeof(dif[0]); j++)
-        {
-          if (dif[j] < minDif)
-          {
-            minDif = dif[j];
-            numMinDif = j;
-          }
-          dif[j] = 0;
-        }
-        switch (numMinDif)
-        {
-          case 1: if (K1 >= -16) K1--; break;
-          case 2: if (K1 <   16) K1++; break;
-          case 3: if (K2 >= -16) K2--; break;
-          case 4: if (K2 <   16) K2++; break;
-          case 5: if (K3 >= -16) K3--; break;
-          case 6: if (K3 <   16) K3++; break;
-        }
-      }
-    }
-  }
-}
-
-static UInt32 UpCaseDecode(Byte *data, UInt32 dataSize)
-{
-  UInt32 srcPos = 0, destPos = dataSize;
-  while (srcPos < dataSize)
-  {
-    Byte curByte = data[srcPos++];
-    if (curByte == 2 && (curByte = data[srcPos++]) != 2)
-      curByte -= 32;
-    data[destPos++] = curByte;
-  }
-  return destPos - dataSize;
-}
-
-void CVm::ExecuteStandardFilter(int filterIndex)
-{
-  UInt32 dataSize = R[4];
-  if (dataSize >= kGlobalOffset)
-    return;
-  EStandardFilter filterType = kStdFilters[filterIndex].Type;
-
-  switch (filterType)
-  {
-    case SF_E8:
-    case SF_E8E9:
-      E8E9Decode(Mem, dataSize, R[6], (filterType == SF_E8E9));
-      break;
-    case SF_ITANIUM:
-      ItaniumDecode(Mem, dataSize, R[6]);
-      break;
-    case SF_DELTA:
-      if (dataSize >= kGlobalOffset / 2)
-        break;
-      SetBlockPos(dataSize);
-      DeltaDecode(Mem, dataSize, R[0]);
-      break;
-    case SF_RGB:
-      if (dataSize >= kGlobalOffset / 2)
-        break;
-      {
-        UInt32 width = R[0];
-        if (width <= 3)
-          break;
-        SetBlockPos(dataSize);
-        RgbDecode(Mem, dataSize, width, R[1]);
-      }
-      break;
-    case SF_AUDIO:
-      if (dataSize >= kGlobalOffset / 2)
-        break;
-      SetBlockPos(dataSize);
-      AudioDecode(Mem, dataSize, R[0]);
-      break;
-    case SF_UPCASE:
-      if (dataSize >= kGlobalOffset / 2)
-        break;
-      UInt32 destSize = UpCaseDecode(Mem, dataSize);
-      SetBlockSize(destSize);
-      SetBlockPos(dataSize);
-      break;
-  }
-}
-
-#endif
-
-}}}
diff -ruNa p7zip_9.20.1/CPP/7zip/Compress/Rar3Vm.h p7zip-libre_9.20.1/CPP/7zip/Compress/Rar3Vm.h
--- p7zip_9.20.1/CPP/7zip/Compress/Rar3Vm.h	2009-02-07 15:06:28.000000000 -0200
+++ p7zip-libre_9.20.1/CPP/7zip/Compress/Rar3Vm.h	1969-12-31 21:00:00.000000000 -0300
@@ -1,179 +0,0 @@
-// Rar3Vm.h
-// According to unRAR license, this code may not be used to develop
-// a program that creates RAR archives
-
-#ifndef __COMPRESS_RAR3_VM_H
-#define __COMPRESS_RAR3_VM_H
-
-#include "../../../C/CpuArch.h"
-
-#include "Common/MyVector.h"
-#include "Common/Types.h"
-
-#define RARVM_STANDARD_FILTERS
-
-namespace NCompress {
-namespace NRar3 {
-
-class CMemBitDecoder
-{
-  const Byte *_data;
-  UInt32 _bitSize;
-  UInt32 _bitPos;
-public:
-  void Init(const Byte *data, UInt32 byteSize)
-  {
-    _data = data;
-    _bitSize = (byteSize << 3);
-    _bitPos = 0;
-  }
-  UInt32 ReadBits(int numBits);
-  UInt32 ReadBit();
-  bool Avail() const { return (_bitPos < _bitSize); }
-};
-
-namespace NVm {
-
-inline UInt32 GetValue32(const void *addr) { return GetUi32(addr); }
-inline void SetValue32(void *addr, UInt32 value) { SetUi32(addr, value); }
-
-UInt32 ReadEncodedUInt32(CMemBitDecoder &inp);
-
-const int kNumRegBits = 3;
-const UInt32 kNumRegs = 1 << kNumRegBits;
-const UInt32 kNumGpRegs = kNumRegs - 1;
-
-const UInt32 kSpaceSize = 0x40000;
-const UInt32 kSpaceMask = kSpaceSize -1;
-const UInt32 kGlobalOffset = 0x3C000;
-const UInt32 kGlobalSize = 0x2000;
-const UInt32 kFixedGlobalSize = 64;
-
-namespace NGlobalOffset
-{
-  const UInt32 kBlockSize = 0x1C;
-  const UInt32 kBlockPos  = 0x20;
-  const UInt32 kExecCount = 0x2C;
-  const UInt32 kGlobalMemOutSize = 0x30;
-}
-
-enum ECommand
-{
-  CMD_MOV,  CMD_CMP,  CMD_ADD,  CMD_SUB,  CMD_JZ,   CMD_JNZ,  CMD_INC,  CMD_DEC,
-  CMD_JMP,  CMD_XOR,  CMD_AND,  CMD_OR,   CMD_TEST, CMD_JS,   CMD_JNS,  CMD_JB,
-  CMD_JBE,  CMD_JA,   CMD_JAE,  CMD_PUSH, CMD_POP,  CMD_CALL, CMD_RET,  CMD_NOT,
-  CMD_SHL,  CMD_SHR,  CMD_SAR,  CMD_NEG,  CMD_PUSHA,CMD_POPA, CMD_PUSHF,CMD_POPF,
-  CMD_MOVZX,CMD_MOVSX,CMD_XCHG, CMD_MUL,  CMD_DIV,  CMD_ADC,  CMD_SBB,  CMD_PRINT,
-
-  CMD_MOVB, CMD_CMPB, CMD_ADDB, CMD_SUBB, CMD_INCB, CMD_DECB,
-  CMD_XORB, CMD_ANDB, CMD_ORB,  CMD_TESTB,CMD_NEGB,
-  CMD_SHLB, CMD_SHRB, CMD_SARB, CMD_MULB
-};
-
-enum EOpType {OP_TYPE_REG, OP_TYPE_INT, OP_TYPE_REGMEM, OP_TYPE_NONE};
-
-// Addr in COperand object can link (point) to CVm object!!!
-
-struct COperand
-{
-  EOpType Type;
-  UInt32 Data;
-  UInt32 Base;
-  COperand(): Type(OP_TYPE_NONE), Data(0), Base(0) {}
-};
-
-struct CCommand
-{
-  ECommand OpCode;
-  bool ByteMode;
-  COperand Op1, Op2;
-};
-
-struct CBlockRef
-{
-  UInt32 Offset;
-  UInt32 Size;
-};
-
-struct CProgram
-{
-  CRecordVector<CCommand> Commands;
-  #ifdef RARVM_STANDARD_FILTERS
-  int StandardFilterIndex;
-  #endif
-  CRecordVector<Byte> StaticData;
-};
-
-struct CProgramInitState
-{
-  UInt32 InitR[kNumGpRegs];
-  CRecordVector<Byte> GlobalData;
-
-  void AllocateEmptyFixedGlobal()
-  {
-    GlobalData.Clear();
-    GlobalData.Reserve(NVm::kFixedGlobalSize);
-    for (UInt32 i = 0; i < NVm::kFixedGlobalSize; i++)
-      GlobalData.Add(0);
-  }
-};
-
-class CVm
-{
-  static UInt32 GetValue(bool byteMode, const void *addr)
-  {
-    if (byteMode)
-      return(*(const Byte *)addr);
-    else
-      return GetUi32(addr);
-  }
-
-  static void SetValue(bool byteMode, void *addr, UInt32 value)
-  {
-    if (byteMode)
-      *(Byte *)addr = (Byte)value;
-    else
-      SetUi32(addr, value);
-  }
-
-  UInt32 GetFixedGlobalValue32(UInt32 globalOffset) { return GetValue(false, &Mem[kGlobalOffset + globalOffset]); }
-
-  void SetBlockSize(UInt32 v) { SetValue(&Mem[kGlobalOffset + NGlobalOffset::kBlockSize], v); }
-  void SetBlockPos(UInt32 v) { SetValue(&Mem[kGlobalOffset + NGlobalOffset::kBlockPos], v); }
-public:
-  static void SetValue(void *addr, UInt32 value) { SetValue(false, addr, value); }
-private:
-  UInt32 GetOperand32(const COperand *op) const;
-  void SetOperand32(const COperand *op, UInt32 val);
-  Byte GetOperand8(const COperand *op) const;
-  void SetOperand8(const COperand *op, Byte val);
-  UInt32 GetOperand(bool byteMode, const COperand *op) const;
-  void SetOperand(bool byteMode, const COperand *op, UInt32 val);
-
-  void DecodeArg(CMemBitDecoder &inp, COperand &op, bool byteMode);
-  
-  bool ExecuteCode(const CProgram *prg);
-  
-  #ifdef RARVM_STANDARD_FILTERS
-  void ExecuteStandardFilter(int filterIndex);
-  #endif
-  
-  Byte *Mem;
-  UInt32 R[kNumRegs + 1]; // R[kNumRegs] = 0 always (speed optimization)
-  UInt32 Flags;
-  void ReadVmProgram(const Byte *code, UInt32 codeSize, CProgram *prg);
-public:
-  CVm();
-  ~CVm();
-  bool Create();
-  void PrepareProgram(const Byte *code, UInt32 codeSize, CProgram *prg);
-  void SetMemory(UInt32 pos, const Byte *data, UInt32 dataSize);
-  bool Execute(CProgram *prg, const CProgramInitState *initState,
-      CBlockRef &outBlockRef, CRecordVector<Byte> &outGlobalData);
-  const Byte *GetDataPointer(UInt32 offset) const { return Mem + offset; }
-
-};
-
-#endif
-
-}}}
diff -ruNa p7zip_9.20.1/CPP/7zip/Compress/RarCodecsRegister.cpp p7zip-libre_9.20.1/CPP/7zip/Compress/RarCodecsRegister.cpp
--- p7zip_9.20.1/CPP/7zip/Compress/RarCodecsRegister.cpp	2009-02-07 15:06:28.000000000 -0200
+++ p7zip-libre_9.20.1/CPP/7zip/Compress/RarCodecsRegister.cpp	1969-12-31 21:00:00.000000000 -0300
@@ -1,26 +0,0 @@
-// RarCodecsRegister.cpp
-
-#include "StdAfx.h"
-
-#include "../Common/RegisterCodec.h"
-
-#include "Rar1Decoder.h"
-#include "Rar2Decoder.h"
-#include "Rar3Decoder.h"
-
-#define CREATE_CODEC(x) static void *CreateCodec ## x() { return (void *)(ICompressCoder *)(new NCompress::NRar ## x::CDecoder); }
-
-CREATE_CODEC(1)
-CREATE_CODEC(2)
-CREATE_CODEC(3)
-
-#define RAR_CODEC(x, name) { CreateCodec ## x, 0, 0x040300 + x, L"Rar" name, 1, false }
-
-static CCodecInfo g_CodecsInfo[] =
-{
-  RAR_CODEC(1, L"1"),
-  RAR_CODEC(2, L"2"),
-  RAR_CODEC(3, L"3"),
-};
-
-REGISTER_CODECS(Rar)
diff -ruNa p7zip_9.20.1/CPP/7zip/Crypto/Rar20Crypto.cpp p7zip-libre_9.20.1/CPP/7zip/Crypto/Rar20Crypto.cpp
--- p7zip_9.20.1/CPP/7zip/Crypto/Rar20Crypto.cpp	2009-05-30 17:19:19.000000000 -0300
+++ p7zip-libre_9.20.1/CPP/7zip/Crypto/Rar20Crypto.cpp	1969-12-31 21:00:00.000000000 -0300
@@ -1,133 +0,0 @@
-// Crypto/Rar20Crypto.cpp
-
-#include "StdAfx.h"
-
-#include "../../../C/7zCrc.h"
-#include "../../../C/CpuArch.h"
-#include "../../../C/RotateDefs.h"
-
-#include "Rar20Crypto.h"
-
-namespace NCrypto {
-namespace NRar20 {
-
-static const int kNumRounds = 32;
-
-static const Byte InitSubstTable[256] = {
-  215, 19,149, 35, 73,197,192,205,249, 28, 16,119, 48,221,  2, 42,
-  232,  1,177,233, 14, 88,219, 25,223,195,244, 90, 87,239,153,137,
-  255,199,147, 70, 92, 66,246, 13,216, 40, 62, 29,217,230, 86,  6,
-   71, 24,171,196,101,113,218,123, 93, 91,163,178,202, 67, 44,235,
-  107,250, 75,234, 49,167,125,211, 83,114,157,144, 32,193,143, 36,
-  158,124,247,187, 89,214,141, 47,121,228, 61,130,213,194,174,251,
-   97,110, 54,229,115, 57,152, 94,105,243,212, 55,209,245, 63, 11,
-  164,200, 31,156, 81,176,227, 21, 76, 99,139,188,127, 17,248, 51,
-  207,120,189,210,  8,226, 41, 72,183,203,135,165,166, 60, 98,  7,
-  122, 38,155,170, 69,172,252,238, 39,134, 59,128,236, 27,240, 80,
-  131,  3, 85,206,145, 79,154,142,159,220,201,133, 74, 64, 20,129,
-  224,185,138,103,173,182, 43, 34,254, 82,198,151,231,180, 58, 10,
-  118, 26,102, 12, 50,132, 22,191,136,111,162,179, 45,  4,148,108,
-  161, 56, 78,126,242,222, 15,175,146, 23, 33,241,181,190, 77,225,
-    0, 46,169,186, 68, 95,237, 65, 53,208,253,168,  9, 18,100, 52,
-  116,184,160, 96,109, 37, 30,106,140,104,150,  5,204,117,112, 84
-};
-
-void CData::UpdateKeys(const Byte *data)
-{
-  for (int i = 0; i < 16; i += 4)
-    for (int j = 0; j < 4; j++)
-      Keys[j] ^= g_CrcTable[data[i + j]];
-}
-
-static void Swap(Byte *b1, Byte *b2)
-{
-  Byte b = *b1;
-  *b1 = *b2;
-  *b2 = b;
-}
-
-void CData::SetPassword(const Byte *password, UInt32 passwordLen)
-{
-  Keys[0] = 0xD3A3B879L;
-  Keys[1] = 0x3F6D12F7L;
-  Keys[2] = 0x7515A235L;
-  Keys[3] = 0xA4E7F123L;
-  
-  Byte psw[256];
-  memset(psw, 0, sizeof(psw));
-  memcpy(psw, password, passwordLen);
-  memcpy(SubstTable, InitSubstTable, sizeof(SubstTable));
-
-  for (UInt32 j = 0; j < 256; j++)
-    for (UInt32 i = 0; i < passwordLen; i += 2)
-    {
-      UInt32 n2 = (Byte)g_CrcTable[(psw[i + 1] + j) & 0xFF];
-      UInt32 n1 = (Byte)g_CrcTable[(psw[i] - j) & 0xFF];
-      for (UInt32 k = 1; (n1 & 0xFF) != n2; n1++, k++)
-        Swap(&SubstTable[n1 & 0xFF], &SubstTable[(n1 + i + k) & 0xFF]);
-    }
-  for (UInt32 i = 0; i < passwordLen; i+= 16)
-    EncryptBlock(&psw[i]);
-}
-
-void CData::CryptBlock(Byte *buf, bool encrypt)
-{
-  Byte inBuf[16];
-  UInt32 A, B, C, D, T, TA, TB;
-
-  A = GetUi32(buf +  0) ^ Keys[0];
-  B = GetUi32(buf +  4) ^ Keys[1];
-  C = GetUi32(buf +  8) ^ Keys[2];
-  D = GetUi32(buf + 12) ^ Keys[3];
-
-  if (!encrypt)
-    memcpy(inBuf, buf, sizeof(inBuf));
-  
-  for (int i = 0; i < kNumRounds; i++)
-  {
-    UInt32 key = Keys[(encrypt ? i : (kNumRounds - 1 - i)) & 3];
-    T = ((C + rotlFixed(D, 11)) ^ key);
-    TA = A ^ SubstLong(T);
-    T = ((D ^ rotlFixed(C, 17)) + key);
-    TB = B ^ SubstLong(T);
-    A = C;
-    B = D;
-    C = TA;
-    D = TB;
-  }
-
-  SetUi32(buf +  0, C ^ Keys[0]);
-  SetUi32(buf +  4, D ^ Keys[1]);
-  SetUi32(buf +  8, A ^ Keys[2]);
-  SetUi32(buf + 12, B ^ Keys[3]);
-
-  UpdateKeys(encrypt ? buf : inBuf);
-}
-
-STDMETHODIMP CDecoder::CryptoSetPassword(const Byte *data, UInt32 size)
-{
-  _cipher.SetPassword(data, size);
-  return S_OK;
-}
-
-STDMETHODIMP CDecoder::Init()
-{
-  return S_OK;
-}
-
-static const UInt32 kBlockSize = 16;
-
-STDMETHODIMP_(UInt32) CDecoder::Filter(Byte *data, UInt32 size)
-{
-  if (size == 0)
-    return 0;
-  if (size < kBlockSize)
-    return kBlockSize;
-  UInt32 i;
-  size -= kBlockSize;
-  for (i = 0; i <= size; i += kBlockSize)
-    _cipher.DecryptBlock(data + i);
-  return i;
-}
-
-}}
diff -ruNa p7zip_9.20.1/CPP/7zip/Crypto/Rar20Crypto.h p7zip-libre_9.20.1/CPP/7zip/Crypto/Rar20Crypto.h
--- p7zip_9.20.1/CPP/7zip/Crypto/Rar20Crypto.h	2009-02-07 15:07:19.000000000 -0200
+++ p7zip-libre_9.20.1/CPP/7zip/Crypto/Rar20Crypto.h	1969-12-31 21:00:00.000000000 -0300
@@ -1,50 +0,0 @@
-// Crypto/Rar20Crypto.h
-
-#ifndef __CRYPTO_RAR20_CRYPTO_H
-#define __CRYPTO_RAR20_CRYPTO_H
-
-#include "Common/MyCom.h"
-
-#include "../ICoder.h"
-#include "../IPassword.h"
-
-namespace NCrypto {
-namespace NRar20 {
-
-class CData
-{
-  Byte SubstTable[256];
-  UInt32 Keys[4];
-  
-  UInt32 SubstLong(UInt32 t)
-  {
-    return (UInt32)SubstTable[(int)t & 255] |
-           ((UInt32)SubstTable[(int)(t >> 8) & 255] << 8) |
-           ((UInt32)SubstTable[(int)(t >> 16) & 255] << 16) |
-           ((UInt32)SubstTable[(int)(t >> 24) & 255] << 24);
-  }
-  void UpdateKeys(const Byte *data);
-  void CryptBlock(Byte *buf, bool encrypt);
-public:
-  void EncryptBlock(Byte *buf) { CryptBlock(buf, true); }
-  void DecryptBlock(Byte *buf) { CryptBlock(buf, false); }
-  void SetPassword(const Byte *password, UInt32 passwordLen);
-};
-
-class CDecoder:
-  public ICompressFilter,
-  public ICryptoSetPassword,
-  public CMyUnknownImp
-{
-  CData _cipher;
-public:
-  MY_UNKNOWN_IMP1(ICryptoSetPassword)
-
-  STDMETHOD(Init)();
-  STDMETHOD_(UInt32, Filter)(Byte *data, UInt32 size);
-  STDMETHOD(CryptoSetPassword)(const Byte *data, UInt32 size);
-};
-
-}}
-
-#endif
diff -ruNa p7zip_9.20.1/CPP/7zip/Crypto/RarAes.cpp p7zip-libre_9.20.1/CPP/7zip/Crypto/RarAes.cpp
--- p7zip_9.20.1/CPP/7zip/Crypto/RarAes.cpp	2010-10-20 01:56:08.000000000 -0300
+++ p7zip-libre_9.20.1/CPP/7zip/Crypto/RarAes.cpp	1969-12-31 21:00:00.000000000 -0300
@@ -1,134 +0,0 @@
-// Crypto/RarAes.cpp
-// Note: you must include MyAes.cpp to project to initialize AES tables
-
-#include "StdAfx.h"
-
-#include "RarAes.h"
-#include "Sha1.h"
-
-namespace NCrypto {
-namespace NRar29 {
-
-CDecoder::CDecoder():
-  _thereIsSalt(false),
-  _needCalculate(true),
-  _rar350Mode(false)
-{
-  for (int i = 0; i < sizeof(_salt); i++)
-    _salt[i] = 0;
-}
-
-STDMETHODIMP CDecoder::SetDecoderProperties2(const Byte *data, UInt32 size)
-{
-  bool thereIsSaltPrev = _thereIsSalt;
-  _thereIsSalt = false;
-  if (size == 0)
-    return S_OK;
-  if (size < 8)
-    return E_INVALIDARG;
-  _thereIsSalt = true;
-  bool same = false;
-  if (_thereIsSalt == thereIsSaltPrev)
-  {
-    same = true;
-    if (_thereIsSalt)
-    {
-      for (unsigned i = 0; i < sizeof(_salt); i++)
-        if (_salt[i] != data[i])
-        {
-          same = false;
-          break;
-        }
-    }
-  }
-  for (unsigned i = 0; i < sizeof(_salt); i++)
-    _salt[i] = data[i];
-  if (!_needCalculate && !same)
-    _needCalculate = true;
-  return S_OK;
-}
-
-static const unsigned kMaxPasswordLength = 127 * 2;
-
-STDMETHODIMP CDecoder::CryptoSetPassword(const Byte *data, UInt32 size)
-{
-  if (size > kMaxPasswordLength)
-    size = kMaxPasswordLength;
-  bool same = false;
-  if (size == buffer.GetCapacity())
-  {
-    same = true;
-    for (UInt32 i = 0; i < size; i++)
-      if (data[i] != buffer[i])
-      {
-        same = false;
-        break;
-      }
-  }
-  if (!_needCalculate && !same)
-    _needCalculate = true;
-  buffer.SetCapacity(size);
-  memcpy(buffer, data, size);
-  return S_OK;
-}
-
-STDMETHODIMP CDecoder::Init()
-{
-  Calculate();
-  SetKey(aesKey, kRarAesKeySize);
-  AesCbc_Init(_aes + _offset, _aesInit);
-  return S_OK;
-}
-
-void CDecoder::Calculate()
-{
-  if (_needCalculate)
-  {
-    const unsigned kSaltSize = 8;
-    
-    Byte rawPassword[kMaxPasswordLength + kSaltSize];
-    
-    memcpy(rawPassword, buffer, buffer.GetCapacity());
-    
-    size_t rawLength = buffer.GetCapacity();
-    
-    if (_thereIsSalt)
-    {
-      memcpy(rawPassword + rawLength, _salt, kSaltSize);
-      rawLength += kSaltSize;
-    }
-    
-    NSha1::CContext sha;
-    sha.Init();
-
-    // rar reverts hash for sha.
-    const unsigned kNumRounds = (1 << 18);
-    unsigned i;
-    for (i = 0; i < kNumRounds; i++)
-    {
-      sha.UpdateRar(rawPassword, rawLength, _rar350Mode);
-      Byte pswNum[3] = { (Byte)i, (Byte)(i >> 8), (Byte)(i >> 16) };
-      sha.UpdateRar(pswNum, 3, _rar350Mode);
-      if (i % (kNumRounds / 16) == 0)
-      {
-        NSha1::CContext shaTemp = sha;
-        Byte digest[NSha1::kDigestSize];
-        shaTemp.Final(digest);
-        _aesInit[i / (kNumRounds / 16)] = (Byte)digest[4 * 4 + 3];
-      }
-    }
-    /*
-    // it's test message for sha
-    const char *message = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq";
-    sha.Update((const Byte *)message, strlen(message));
-    */
-    Byte digest[20];
-    sha.Final(digest);
-    for (i = 0; i < 4; i++)
-      for (unsigned j = 0; j < 4; j++)
-        aesKey[i * 4 + j] = (digest[i * 4 + 3 - j]);
-  }
-  _needCalculate = false;
-}
-
-}}
diff -ruNa p7zip_9.20.1/CPP/7zip/Crypto/RarAes.h p7zip-libre_9.20.1/CPP/7zip/Crypto/RarAes.h
--- p7zip_9.20.1/CPP/7zip/Crypto/RarAes.h	2009-12-21 08:46:19.000000000 -0300
+++ p7zip-libre_9.20.1/CPP/7zip/Crypto/RarAes.h	1969-12-31 21:00:00.000000000 -0300
@@ -1,47 +0,0 @@
-// Crypto/RarAes.h
-
-#ifndef __CRYPTO_RAR_AES_H
-#define __CRYPTO_RAR_AES_H
-
-#include "../../../C/Aes.h"
-
-#include "Common/Buffer.h"
-
-#include "../IPassword.h"
-
-#include "MyAes.h"
-
-namespace NCrypto {
-namespace NRar29 {
-
-const UInt32 kRarAesKeySize = 16;
-
-class CDecoder:
-  public CAesCbcDecoder,
-  public ICompressSetDecoderProperties2,
-  public ICryptoSetPassword
-{
-  Byte _salt[8];
-  bool _thereIsSalt;
-  CByteBuffer buffer;
-  Byte aesKey[kRarAesKeySize];
-  Byte _aesInit[AES_BLOCK_SIZE];
-  bool _needCalculate;
-  bool _rar350Mode;
-
-  void Calculate();
-public:
-  MY_UNKNOWN_IMP2(
-    ICryptoSetPassword,
-    ICompressSetDecoderProperties2)
-  STDMETHOD(Init)();
-  STDMETHOD(CryptoSetPassword)(const Byte *aData, UInt32 aSize);
-  STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size);
-
-  CDecoder();
-  void SetRar350Mode(bool rar350Mode) { _rar350Mode = rar350Mode; }
-};
-
-}}
-
-#endif
diff -ruNa p7zip_9.20.1/DOCS/unRarLicense.txt p7zip-libre_9.20.1/DOCS/unRarLicense.txt
--- p7zip_9.20.1/DOCS/unRarLicense.txt	2008-08-01 06:56:23.000000000 -0300
+++ p7zip-libre_9.20.1/DOCS/unRarLicense.txt	1969-12-31 21:00:00.000000000 -0300
@@ -1,41 +0,0 @@
- ******    *****   ******   unRAR - free utility for RAR archives
- **   **  **   **  **   **  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- ******   *******  ******    License for use and distribution of
- **   **  **   **  **   **   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- **   **  **   **  **   **         FREE portable version
-                                   ~~~~~~~~~~~~~~~~~~~~~
-
-      The source code of unRAR utility is freeware. This means:
-
-   1. All copyrights to RAR and the utility unRAR are exclusively
-      owned by the author - Alexander Roshal.
-
-   2. The unRAR sources may be used in any software to handle RAR
-      archives without limitations free of charge, but cannot be used
-      to re-create the RAR compression algorithm, which is proprietary.
-      Distribution of modified unRAR sources in separate form or as a
-      part of other software is permitted, provided that it is clearly
-      stated in the documentation and source comments that the code may
-      not be used to develop a RAR (WinRAR) compatible archiver.
-
-   3. The unRAR utility may be freely distributed. No person or company 
-      may charge a fee for the distribution of unRAR without written
-      permission from the copyright holder.
-
-   4. THE RAR ARCHIVER AND THE UNRAR UTILITY ARE DISTRIBUTED "AS IS".
-      NO WARRANTY OF ANY KIND IS EXPRESSED OR IMPLIED.  YOU USE AT 
-      YOUR OWN RISK. THE AUTHOR WILL NOT BE LIABLE FOR DATA LOSS, 
-      DAMAGES, LOSS OF PROFITS OR ANY OTHER KIND OF LOSS WHILE USING
-      OR MISUSING THIS SOFTWARE.
-
-   5. Installing and using the unRAR utility signifies acceptance of
-      these terms and conditions of the license.
-
-   6. If you don't agree with terms of the license you must remove
-      unRAR files from your storage devices and cease to use the
-      utility.
-
-      Thank you for your interest in RAR and unRAR.
-
-
-                                            Alexander L. Roshal
\ No hay ningún carácter de nueva línea al final del fichero
diff -ruNa p7zip_9.20.1/makefile p7zip-libre_9.20.1/makefile
--- p7zip_9.20.1/makefile	2011-03-13 08:52:45.000000000 -0300
+++ p7zip-libre_9.20.1/makefile	2011-09-07 15:41:14.000000000 -0300
@@ -56,7 +56,6 @@
 	$(MAKE) -C CPP/7zip/UI/Client7z           depend
 	$(MAKE) -C CPP/7zip/UI/Console            depend
 	$(MAKE) -C CPP/7zip/Bundles/Format7zFree  depend
-	$(MAKE) -C CPP/7zip/Compress/Rar          depend
 	$(MAKE) -C CPP/7zip/UI/GUI                depend
 	$(MAKE) -C CPP/7zip/UI/FileManager        depend
 	$(MAKE) -C check/my_86_filter             depend
@@ -68,7 +67,6 @@
 common7z:common
 	$(MKDIR) bin/Codecs
 	$(MAKE) -C CPP/7zip/Bundles/Format7zFree all
-	$(MAKE) -C CPP/7zip/Compress/Rar         all
 
 7z: common7z
 	$(MAKE) -C CPP/7zip/UI/Console           all
@@ -93,7 +91,6 @@
 	$(MAKE) -C CPP/7zip/UI/FileManager       clean
 	$(MAKE) -C CPP/7zip/UI/GUI               clean
 	$(MAKE) -C CPP/7zip/Bundles/Format7zFree clean
-	$(MAKE) -C CPP/7zip/Compress/Rar         clean
 	$(MAKE) -C CPP/7zip/Compress/LZMA_Alone  clean
 	$(MAKE) -C CPP/7zip/Bundles/AloneGCOV    clean
 	$(MAKE) -C CPP/7zip/TEST/TestUI          clean
diff -ruNa p7zip_9.20.1/makefile.oldmake p7zip-libre_9.20.1/makefile.oldmake
--- p7zip_9.20.1/makefile.oldmake	2011-03-13 08:53:08.000000000 -0300
+++ p7zip-libre_9.20.1/makefile.oldmake	2011-09-07 15:41:14.000000000 -0300
@@ -56,7 +56,6 @@
 	cd CPP/7zip/UI/Client7z          ; $(MAKE) depend
 	cd CPP/7zip/UI/Console           ; $(MAKE) depend
 	cd CPP/7zip/Bundles/Format7zFree ; $(MAKE) depend
-	cd CPP/7zip/Compress/Rar         ; $(MAKE) depend
 	cd CPP/7zip/UI/GUI               ; $(MAKE) depend
 	cd CPP/7zip/UI/FileManager       ; $(MAKE) depend
 	cd check/my_86_filter            ; $(MAKE) depend
@@ -68,7 +67,6 @@
 common7z:common
 	$(MKDIR) bin/Codecs
 	cd CPP/7zip/Bundles/Format7zFree ; $(MAKE) all
-	cd CPP/7zip/Compress/Rar         ; $(MAKE) all
 
 7z: common7z
 	cd CPP/7zip/UI/Console           ; $(MAKE) all
@@ -93,7 +91,6 @@
 	cd CPP/7zip/UI/FileManager       ; $(MAKE) clean
 	cd CPP/7zip/UI/GUI               ; $(MAKE) clean
 	cd CPP/7zip/Bundles/Format7zFree ; $(MAKE) clean
-	cd CPP/7zip/Compress/Rar         ; $(MAKE) clean
 	cd CPP/7zip/Compress/LZMA_Alone  ; $(MAKE) clean
 	cd CPP/7zip/Bundles/AloneGCOV    ; $(MAKE) clean
 	cd CPP/7zip/TEST/TestUI          ; $(MAKE) clean
diff -ruNa p7zip_9.20.1/makefile.qnx_shared.so p7zip-libre_9.20.1/makefile.qnx_shared.so
--- p7zip_9.20.1/makefile.qnx_shared.so	2007-06-28 04:34:14.000000000 -0300
+++ p7zip-libre_9.20.1/makefile.qnx_shared.so	2011-09-07 15:41:14.000000000 -0300
@@ -1,5 +1,4 @@
 ###################################################
-# makefile.machine for "7z.so , Codecs/Rar29.so" :
 # tested with p7zip-4.47_beta on qnx-6.3.0 sp3 x86 target
 
 OPTFLAGS=-O
diff -ruNa p7zip_9.20.1/makefile.rules p7zip-libre_9.20.1/makefile.rules
--- p7zip_9.20.1/makefile.rules	2010-11-07 13:08:51.000000000 -0300
+++ p7zip-libre_9.20.1/makefile.rules	2011-09-07 15:41:14.000000000 -0300
@@ -448,18 +448,6 @@
 NsisRegister.o : ../../Archive/Nsis/NsisRegister.cpp
 	$(CXX) $(CXXFLAGS) ../../Archive/Nsis/NsisRegister.cpp
 
-RarHandler.o : ../../Archive/Rar/RarHandler.cpp
-	$(CXX) $(CXXFLAGS) ../../Archive/Rar/RarHandler.cpp
-RarHeader.o : ../../Archive/Rar/RarHeader.cpp
-	$(CXX) $(CXXFLAGS) ../../Archive/Rar/RarHeader.cpp
-RarIn.o : ../../Archive/Rar/RarIn.cpp
-	$(CXX) $(CXXFLAGS) ../../Archive/Rar/RarIn.cpp
-RarItem.o : ../../Archive/Rar/RarItem.cpp
-	$(CXX) $(CXXFLAGS) ../../Archive/Rar/RarItem.cpp
-RarVolumeInStream.o : ../../Archive/Rar/RarVolumeInStream.cpp
-	$(CXX) $(CXXFLAGS) ../../Archive/Rar/RarVolumeInStream.cpp
-RarRegister.o : ../../Archive/Rar/RarRegister.cpp
-	$(CXX) $(CXXFLAGS) ../../Archive/Rar/RarRegister.cpp
 
 UdfHandler.o : ../../Archive/Udf/UdfHandler.cpp
 	$(CXX) $(CXXFLAGS) ../../Archive/Udf/UdfHandler.cpp
@@ -535,10 +523,6 @@
 	$(CXX) $(CXXFLAGS) ../../Crypto/7zAesRegister.cpp
 WzAes.o : ../../Crypto/WzAes.cpp
 	$(CXX) $(CXXFLAGS) ../../Crypto/WzAes.cpp
-Rar20Crypto.o : ../../Crypto/Rar20Crypto.cpp
-	$(CXX) $(CXXFLAGS) ../../Crypto/Rar20Crypto.cpp
-RarAes.o : ../../Crypto/RarAes.cpp
-	$(CXX) $(CXXFLAGS) ../../Crypto/RarAes.cpp
 HmacSha1.o : ../../Crypto/HmacSha1.cpp
 	$(CXX) $(CXXFLAGS) ../../Crypto/HmacSha1.cpp
 Pbkdf2HmacSha1.o : ../../Crypto/Pbkdf2HmacSha1.cpp