anchor.diff:  interface
   
   uses
  -  Classes, contnrs;
  +  Classes, contnrs, syncobjs;
   
   type
     IPerformedOperationResults = interface
  
positive.code:     procedure GetMessagesAsStrings(aMessages : TStringList);
      function Count : integer;
      procedure Get (const aIndex : integer; out aLevel, aMessage : String; out aTime : TDateTime);
  
      property Messages : TStrings read GetMessages;
      property PerformedOperations : TPerformedOperations read FPerformedOperations;
  
negative.code:   FResults.Free;
    FMessages.Free;
    FPerformedOperations.Free;
    FCriticalSection.Free;
    inherited Destroy;
  end;
  
  procedure TPerformedOperationResultsAsLog.Clear;
  begin
    if FThreadSafe then
      FCriticalSection.Acquire;
    try
      FErrors.Clear;
      FWarnings.Clear;
      FInfos.Clear;
      FResults.Clear;
      FMessages.Clear;
      FPerformedOperations.Clear;
    finally
      if FThreadSafe then
        FCriticalSection.Leave;
    end;
  end;
  
  procedure TPerformedOperationResultsAsLog.AddError(const aMessage: String; const aMustBeValidated : boolean = false);
  begin
    if FThreadSafe then
      FCriticalSection.Acquire;
    try
      FMessages.Append('['+ TPerformedOperation.ERROR + '] ' + aMessage);
      FErrors.Add(TPerformedOperation.Create(aMessage, TPerformedOperation.ERROR, aMustBeValidated));
      FPerformedOperations.Add(TPerformedOperation.Create(aMessage, TPerformedOperation.ERROR, aMustBeValidated));
    finally
      if FThreadSafe then
        FCriticalSection.Leave;
    end;
  end;
  
  procedure TPerformedOperationResultsAsLog.AddWarning(const aMessage: String; const aMustBeValidated : boolean = false);
  begin
    if FThreadSafe then
      FCriticalSection.Acquire;
    try
      FMessages.Append ('[' + TPerformedOperation.WARNING + '] ' + aMessage);
      FWarnings.Add(TPerformedOperation.Create(aMessage, TPerformedOperation.WARNING, aMustBeValidated));
      FPerformedOperations.Add(TPerformedOperation.Create(aMessage, TPerformedOperation.WARNING, aMustBeValidated));
    finally
      if FThreadSafe then
        FCriticalSection.Leave;
    end;
  end;
  
  procedure TPerformedOperationResultsAsLog.AddInfo(const aMessage: String; const aMustBeValidated : boolean = false);
  begin
    if FThreadSafe then
      FCriticalSection.Acquire;
    try
      FMessages.Append ('[' + TPerformedOperation.INFO + '] ' + aMessage);
      FInfos.Add(TPerformedOperation.Create(aMessage, TPerformedOperation.INFO, aMustBeValidated));
      FPerformedOperations.Add(TPerformedOperation.Create(aMessage, TPerformedOperation.INFO, aMustBeValidated));
    finally
      if FThreadSafe then
        FCriticalSection.Leave;
    end;
  end;
  
  procedure TPerformedOperationResultsAsLog.AddResult(const aMessage: String; const aMustBeValidated : boolean = false);
  begin
    if FThreadSafe then
      FCriticalSection.Acquire;
    try
      FMessages.Append('[' + TPerformedOperation.RESULT + '] ' + aMessage);
      FResults.Add(TPerformedOperation.Create(aMessage, TPerformedOperation.RESULT, aMustBeValidated));
      FPerformedOperations.Add(TPerformedOperation.Create(aMessage, TPerformedOperation.RESULT, aMustBeValidated));
    finally
      if FThreadSafe then
        FCriticalSection.Leave;
    end;
  end;
  
  procedure TPerformedOperationResultsAsLog.GetMessagesAsStrings(aMessages: TStringList);
  begin
    if FThreadSafe then
      FCriticalSection.Acquire;
    try
      aMessages.Clear;
      aMessages.AddStrings(FMessages);
    finally
      if FThreadSafe then
        FCriticalSection.Leave;
    end;
  end;
  
  function TPerformedOperationResultsAsLog.Count: integer;
  