A RetroSearch Logo

Home - News ( United States | United Kingdom | Italy | Germany ) - Football scores

Search Query:

Showing content from http://www.ncbi.nlm.nih.gov/IEB/ToolBox/CPP_DOC/doxyhtml/classCPSGS__ResolveBase.html below:

NCBI C++ ToolKit: CPSGS_ResolveBase Class Reference

Search Toolkit Book for CPSGS_ResolveBase

#include "resolve_base.hpp"
(Private to src/app/pubseq_gateway/server.)

  CPSGS_ResolveBase ()     CPSGS_ResolveBase (shared_ptr< CPSGS_Request > request, shared_ptr< CPSGS_Reply > reply, TSeqIdResolutionFinishedCB finished_cb, TSeqIdResolutionErrorCB error_cb, TSeqIdResolutionStartProcessingCB resolution_start_processing_cb)   virtual  ~CPSGS_ResolveBase ()   SBioseqResolution  ResolveTestInputSeqId (void)     CPSGS_AsyncResolveBase ()     CPSGS_AsyncResolveBase (shared_ptr< CPSGS_Request > request, shared_ptr< CPSGS_Reply > reply, TContinueResolveCB continue_resolve_cb, TSeqIdResolutionFinishedCB finished_cb, TSeqIdResolutionErrorCB error_cb, TSeqIdResolutionStartProcessingCB start_processing_cb)   virtual  ~CPSGS_AsyncResolveBase ()   void  Process (int16_t effective_version, int16_t effective_seq_id_type, list< string > &&secondary_id_list, string &&primary_seq_id, bool composed_ok, bool seq_id_resolve, SBioseqResolution &&bioseq_resolution)   void  x_OnBioseqInfo (vector< CBioseqInfoRecord > &&records)   void  x_OnBioseqInfoWithoutSeqIdType (vector< CBioseqInfoRecord > &&records)   void  x_OnBioseqInfoError (CRequestStatus::ECode status, int code, EDiagSev severity, const string &message)   void  x_OnSi2csiRecord (vector< CSI2CSIRecord > &&records)   void  x_OnSi2csiError (CRequestStatus::ECode status, int code, EDiagSev severity, const string &message)     CPSGS_CassProcessorBase ()     CPSGS_CassProcessorBase (shared_ptr< CPSGS_Request > request, shared_ptr< CPSGS_Reply > reply, TProcessorPriority priority)   virtual  ~CPSGS_CassProcessorBase ()   virtual void  Cancel (void) override   The infrastructure request to cancel processing. More...
  void  SignalFinishProcessing (void)   void  UnlockWaitingProcessor (void)   void  CallOnData (void)   string  GetVerboseFetches (void) const   void  EnforceWait (void) const     IPSGS_Processor ()   virtual  ~IPSGS_Processor ()   virtual bool  CanProcess (shared_ptr< CPSGS_Request > request, shared_ptr< CPSGS_Reply > reply) const   Tells if processor can process the given request. More...
  virtual vector< stringWhatCanProcess (shared_ptr< CPSGS_Request > request, shared_ptr< CPSGS_Reply > reply) const   Needs to be implemented only for the ID/get_na requests. More...
  virtual IPSGS_ProcessorCreateProcessor (shared_ptr< CPSGS_Request > request, shared_ptr< CPSGS_Reply > reply, TProcessorPriority priority) const =0   Create processor to fulfil PSG request using the data source. More...
  virtual void  Process (void)=0   Main processing function. More...
  virtual string  GetName (void) const =0   Tells the processor name (used in logging and tracing) More...
  virtual string  GetGroupName (void) const =0   Tells the processor group name. More...
  virtual void  ProcessEvent (void)   Called when an event happened which may require to have some processing. More...
  shared_ptr< CPSGS_RequestGetRequest (void) const   Provides the user request. More...
  shared_ptr< CPSGS_ReplyGetReply (void) const   Provides the reply wrapper. More...
  TProcessorPriority  GetPriority (void) const   Provides the processor priority. More...
  void  PostponeInvoke (CPSGS_UvLoopBinder::TProcessorCB cb, void *user_data)   The provided callback will be called from the libuv loop assigned to the processor. More...
  void  SetSocketCallback (int fd, CPSGS_SocketIOCallback::EPSGS_Event event, uint64_t timeout_millisec, void *user_data, CPSGS_SocketIOCallback::TEventCB event_cb, CPSGS_SocketIOCallback::TTimeoutCB timeout_cb, CPSGS_SocketIOCallback::TErrorCB error_cb)   The provided callbacks will be called from the libuv loop assigned to the processor when the corresponding event appeared on the provided socket. More...
  void  SetUVThreadId (uv_thread_t uv_thread_id)   Saves the libuv worker thread id which runs the processor. More...
  uv_thread_t  GetUVThreadId (void) const   Provides the libuv thread id which runs the processor. More...
  bool  IsUVThreadAssigned (void) const   Tells if a libuv thread id has been assigned to the processor. More...
  psg_time_point_t  GetProcessInvokeTimestamp (bool &is_valid) const   Provides the timestamp of when the Process() method was called. More...
  psg_time_point_t  GetSignalStartTimestamp (bool &is_valid) const   Provides the timestamp of when the processor called SignalStartProcessing() method. More...
  psg_time_point_t  GetSignalFinishTimestamp (bool &is_valid) const   Provides the timestamp of when the processor called SignalFinishProcessing() method. More...
  void  OnBeforeProcess (void)   Called just before the virtual Process() method is called. More...
  EPSGS_StartProcessing  SignalStartProcessing (void)   A processor should call the method when it decides that it successfully started processing the request. More...
  void  SignalFinishProcessing (void)   A processor should call this method when it decides that there is nothing else to be done. More...
  EPSGS_SeqIdParsingResult  ParseInputSeqId (objects::CSeq_id &seq_id, const string &request_seq_id, int request_seq_id_type, string *err_msg=nullptr)   Parse seq-id from a string and type representation. More...
    CPSGS_AsyncBioseqInfoBase ()     CPSGS_AsyncBioseqInfoBase (shared_ptr< CPSGS_Request > request, shared_ptr< CPSGS_Reply > reply, TSeqIdResolutionFinishedCB finished_cb, TSeqIdResolutionErrorCB error_cb)   virtual  ~CPSGS_AsyncBioseqInfoBase ()   void  ResolveInputSeqId (void)   void  ResolveInputSeqId (const string &seq_id, int16_t seq_id_type)   int16_t  GetEffectiveVersion (const CTextseq_id *text_seq_id)   SPSGS_ResolveRequest::TPSGS_BioseqIncludeData  GetBioseqInfoFields (void)   bool  NonKeyBioseqInfoFieldsRequested (void)   bool  CanSkipBioseqInfoRetrieval (const CBioseqInfoRecord &bioseq_info_record)   SPSGS_RequestBase::EPSGS_AccSubstitutioOption  GetAccessionSubstitutionOption (void)   EPSGS_AccessionAdjustmentResult  AdjustBioseqAccession (SBioseqResolution &bioseq_resolution)   void  SetupSeqIdToResolve (void)   void  SetupSeqIdToResolve (const string &seq_id, int16_t seq_id_type)   string  GetCouldNotResolveMessage (void) const   psg_time_point_t  GetAsyncResolutionStartTimestamp (void) const   void  SetAsyncResolutionStartTimestamp (const psg_time_point_t &ts)   bool  MoveToNextSeqId (void)   bool  GetSeqIdResolve (void)   bool  OptimizationPrecondition (const string &primary_id, int16_t effective_seq_id_type) const   IPSGS_Processor::EPSGS_Status  GetStatus (void) override   Tells the processor status (if it has finished or in progress) More...
  bool  AreAllFinishedRead (void) const   bool  IsMyNCBIFinished (void) const   void  UpdateOverallStatus (CRequestStatus::ECode status)   bool  IsCassandraProcessorEnabled (shared_ptr< CPSGS_Request > request) const   void  CancelLoaders (void)   SCass_BlobId  TranslateSatToKeyspace (CBioseqInfoRecord::TSat sat, CBioseqInfoRecord::TSatKey sat_key, const string &seq_id)   bool  IsTimeoutError (const string &msg) const   bool  IsTimeoutError (int code) const   bool  IsError (EDiagSev severity) const   CRequestStatus::ECode  CountError (CCassFetch *fetch_details, CRequestStatus::ECode status, int code, EDiagSev severity, const string &message, EPSGS_LoggingFlag logging_flag, EPSGS_StatusUpdateFlag status_update_flag)   EPSGS_MyNCBILookupResult  PopulateMyNCBIUser (TMyNCBIDataCB data_cb, TMyNCBIErrorCB error_cb)   void  ReportNoWebCubbyUser (void)   void  ReportExplicitIncludeHUPSetToNo (void)   void  ReportMyNCBIError (CRequestStatus::ECode status, const string &my_ncbi_message)   void  ReportMyNCBINotFound (void)   void  ReportSecureSatUnauthorized (const string &user_name)   void  ReportFailureToGetCassConnection (const string &message)   void  ReportFailureToGetCassConnection (void)   void  CleanupMyNCBICache (void)   bool  GetEffectiveSeqIdType (const objects::CSeq_id &parsed_seq_id, int request_seq_id_type, int16_t &eff_seq_id_type, bool need_trace)   void  MakeRequest (SBioseqResolution &&bioseq_resolution)   SPSGS_RequestBase::EPSGS_CacheAndDbUse  x_GetRequestUseCache (void)   bool  x_ComposeOSLT (CSeq_id &parsed_seq_id, int16_t &effective_seq_id_type, list< string > &secondary_id_list, string &primary_id)   EPSGS_CacheLookupResult  x_ResolvePrimaryOSLTInCache (const string &primary_id, int16_t effective_version, int16_t effective_seq_id_type, SBioseqResolution &bioseq_resolution)   EPSGS_CacheLookupResult  x_ResolveSecondaryOSLTInCache (const string &secondary_id, int16_t effective_seq_id_type, SBioseqResolution &bioseq_resolution)   EPSGS_CacheLookupResult  x_ResolveAsIsInCache (SBioseqResolution &bioseq_resolution)   void  x_OptimizedResolutionInCache (CSeq_id &parsed_seq_id, const string &primary_id, int16_t effective_seq_id_type, SBioseqResolution &bioseq_resolution)   void  x_ResolveViaComposeOSLTInCache (CSeq_id &parsed_seq_id, int16_t effective_seq_id_type, const list< string > &secondary_id_list, const string &primary_id, SBioseqResolution &bioseq_resolution)   void  x_ResolveSeqId (void)   void  x_OnResolutionGoodData (void)   void  x_OnSeqIdResolveError (CRequestStatus::ECode status, int code, EDiagSev severity, const string &message, EPSGS_LoggingFlag loging_flag=ePSGS_NeedLogging)   void  x_OnAsyncBioseqInfoResolveError (CRequestStatus::ECode status, int code, EDiagSev severity, const string &message, EPSGS_LoggingFlag loging_flag=ePSGS_NeedLogging)   void  x_OnSeqIdResolveFinished (SBioseqResolution &&bioseq_resolution)   void  x_RegisterSuccessTiming (const SBioseqResolution &bioseq_resolution)   void  x_OptimizedNotFound (const string &err_msg)   enum   EPSGS_Status {
  ePSGS_InProgress , ePSGS_Done , ePSGS_NotFound , ePSGS_Canceled ,
  ePSGS_Timeout , ePSGS_Error , ePSGS_Unauthorized
}   The GetStatus() method returns a processor current status. More...
  enum   EPSGS_StartProcessing { ePSGS_Proceed , ePSGS_Cancel }   Tells wether to continue or not after a processor called SignalStartProcessing() method. More...
  static string  StatusToString (EPSGS_Status status)   Converts the processor status to a string for tracing and logging purposes. More...
  static string  StatusToProgressMessage (EPSGS_Status status)   Converts the processor status to a string for protocol message. More...
  enum   EPSGS_MyNCBILookupResult {
  ePSGS_IncludeHUPSetToNo , ePSGS_FoundInOKCache , ePSGS_FoundInErrorCache , ePSGS_FoundInNotFoundCache ,
  ePSGS_CookieNotPresent , ePSGS_RequestInitiated , ePSGS_AddedToWaitlist
}   TContinueResolveCB  m_ContinueResolveCB   TSeqIdResolutionFinishedCB  m_FinishedCB   TSeqIdResolutionErrorCB  m_ErrorCB   TSeqIdResolutionStartProcessingCB  m_StartProcessingCB   EPSGS_ResolveStage  m_ResolveStage   bool  m_ComposedOk   bool  m_SeqIdResolve   string  m_PrimarySeqId   int16_t  m_EffectiveVersion   int16_t  m_EffectiveSeqIdType   size_t  m_SecondaryIndex   list< stringm_SecondaryIdList   SBioseqResolution  m_BioseqResolution   CCassFetchm_CurrentFetch   CCassFetchm_NoSeqIdTypeFetch   CBioseqInfoRecord::TAccession  m_BioseqInfoRequestedAccession   CBioseqInfoRecord::TVersion  m_BioseqInfoRequestedVersion   CBioseqInfoRecord::TSeqIdType  m_BioseqInfoRequestedSeqIdType   CBioseqInfoRecord::TGI  m_BioseqInfoRequestedGI   psg_time_point_t  m_BioseqInfoStart   psg_time_point_t  m_Si2csiStart   psg_time_point_t  m_AsyncCassResolutionStart   bool  m_StartProcessingCalled   list< SPSGSeqIdm_SeqIdsToResolve   list< SPSGSeqId >::const_iterator  m_CurrentSeqIdToResolve   CPSGSResolveErrors  m_ResolveErrors   list< unique_ptr< CCassFetch > >  m_FetchDetails   bool  m_Canceled   bool  m_Unlocked   CRequestStatus::ECode  m_Status   optional< stringm_UserName   shared_ptr< CPSG_MyNCBIRequest_WhoAmIm_WhoAmIRequest   optional< stringm_MyNCBICookie   shared_ptr< CPSGS_Requestm_Request   shared_ptr< CPSGS_Replym_Reply   TProcessorPriority  m_Priority   bool  m_FinishSignalled   uv_thread_t  m_UVThreadId  

Definition at line 56 of file resolve_base.hpp.

◆ CPSGS_ResolveBase() [1/2] ◆ CPSGS_ResolveBase() [2/2] ◆ ~CPSGS_ResolveBase() CPSGS_ResolveBase::~CPSGS_ResolveBase ( ) virtual

Definition at line 85 of file resolve_base.cpp.

◆ ResolveInputSeqId() [1/2] ◆ ResolveInputSeqId() [2/2] void CPSGS_ResolveBase::ResolveInputSeqId ( void  ) protected ◆ ResolveTestInputSeqId()

Definition at line 557 of file resolve_base.cpp.

References ePSGS_ParsedOK, SResolveInputSeqIdError::HasError(), SBioseqResolution::IsValid(), CPSGS_AsyncResolveBase::m_CurrentSeqIdToResolve, SBioseqResolution::m_Error, SResolveInputSeqIdError::m_ErrorMessage, IPSGS_Processor::ParseInputSeqId(), CPSGS_AsyncResolveBase::SetupSeqIdToResolve(), x_ComposeOSLT(), x_ResolveAsIsInCache(), and x_ResolveViaComposeOSLTInCache().

◆ x_ComposeOSLT() bool CPSGS_ResolveBase::x_ComposeOSLT ( CSeq_idparsed_seq_id, int16_teffective_seq_id_type, list< string > &  secondary_id_list, stringprimary_id  ) private ◆ x_GetRequestUseCache() ◆ x_OnAsyncBioseqInfoResolveError() ◆ x_OnResolutionGoodData() void CPSGS_ResolveBase::x_OnResolutionGoodData ( void  ) private ◆ x_OnSeqIdResolveError()

Definition at line 602 of file resolve_base.cpp.

References CRequestStatus::e404_NotFound, eOpStatusNotFound, eResolutionCass, eResolutionError, eResolutionLmdb, eResolutionNotFound, CPSGS_AsyncResolveBase::GetAsyncResolutionStartTimestamp(), CPubseqGatewayApp::GetInstance(), m_AsyncStarted, m_FinalErrorCB, and IPSGS_Processor::m_Request.

Referenced by x_OnAsyncBioseqInfoResolveError(), x_OnSeqIdResolveFinished(), x_OptimizedNotFound(), and x_ResolveSeqId().

◆ x_OnSeqIdResolveFinished() void CPSGS_ResolveBase::x_OnSeqIdResolveFinished ( SBioseqResolution &&  bioseq_resolution ) private

Definition at line 656 of file resolve_base.cpp.

References CPSGSResolveErrors::AppendError(), CPSGS_AsyncResolveBase::CanSkipBioseqInfoRetrieval(), CRequestStatus::e502_BadGateway, eDiag_Error, ePSGS_BioseqCache, ePSGS_CacheHit, SPSGS_RequestBase::ePSGS_CacheOnly, ePSGS_NoBioseqInfo, ePSGS_Si2csiCache, ePSGS_Si2csiDB, CPSGSResolveErrors::GetCombinedErrorCode(), CPSGSResolveErrors::GetCombinedErrorMessage(), CPSGS_AsyncResolveBase::GetCouldNotResolveMessage(), CPSGCache::LookupBioseqInfo(), m_AsyncStarted, CPSGS_AsyncResolveBase::m_CurrentSeqIdToResolve, m_FinalFinishedCB, IPSGS_Processor::m_Reply, IPSGS_Processor::m_Request, CPSGS_AsyncResolveBase::m_ResolveErrors, CPSGS_AsyncResolveBase::m_SeqIdsToResolve, CPSGS_AsyncBioseqInfoBase::MakeRequest(), CPSGS_AsyncResolveBase::MoveToNextSeqId(), CPSGS_AsyncResolveBase::SetAsyncResolutionStartTimestamp(), x_GetRequestUseCache(), x_OnResolutionGoodData(), x_OnSeqIdResolveError(), x_RegisterSuccessTiming(), and x_ResolveSeqId().

Referenced by x_ResolveSeqId().

◆ x_OptimizedNotFound() void CPSGS_ResolveBase::x_OptimizedNotFound ( const stringerr_msg ) private

Definition at line 530 of file resolve_base.cpp.

References CPSGSResolveErrors::AppendError(), CRequestStatus::e404_NotFound, eDiag_Error, CPSGSCounters::ePSGS_InputSeqIdNotResolved, ePSGS_SkipLogging, ePSGS_UnresolvedSeqId, CPSGSResolveErrors::GetCombinedErrorCode(), CPSGSResolveErrors::GetCombinedErrorMessage(), CPSGS_AsyncResolveBase::GetCouldNotResolveMessage(), CPubseqGatewayApp::GetInstance(), IPSGS_Processor::m_Reply, IPSGS_Processor::m_Request, CPSGS_AsyncResolveBase::m_ResolveErrors, CPSGS_AsyncResolveBase::m_SeqIdsToResolve, and x_OnSeqIdResolveError().

Referenced by x_ResolveSeqId().

◆ x_OptimizedResolutionInCache() ◆ x_RegisterSuccessTiming() ◆ x_ResolveAsIsInCache()

Definition at line 222 of file resolve_base.cpp.

References CRequestStatus::e500_InternalServerError, ePSGS_CacheFailure, CPSGS_AsyncResolveBase::m_CurrentSeqIdToResolve, SBioseqResolution::m_Error, SResolveInputSeqIdError::m_ErrorCode, SResolveInputSeqIdError::m_ErrorMessage, SBioseqResolution::Reset(), NStr::ToUpper(), and x_ResolveSecondaryOSLTInCache().

Referenced by ResolveTestInputSeqId(), x_ResolveSeqId(), and x_ResolveViaComposeOSLTInCache().

◆ x_ResolvePrimaryOSLTInCache()

Definition at line 162 of file resolve_base.cpp.

References ePSGS_BioseqCache, ePSGS_CacheHit, ePSGS_CacheNotHit, CPSGCache::LookupBioseqInfo(), IPSGS_Processor::m_Reply, IPSGS_Processor::m_Request, SBioseqResolution::m_ResolutionResult, SBioseqResolution::Reset(), CBioseqInfoRecord::SetAccession(), SBioseqResolution::SetBioseqInfo(), CBioseqInfoRecord::SetSeqIdType(), and CBioseqInfoRecord::SetVersion().

Referenced by x_OptimizedResolutionInCache(), and x_ResolveViaComposeOSLTInCache().

◆ x_ResolveSecondaryOSLTInCache()

Definition at line 194 of file resolve_base.cpp.

References ePSGS_CacheFailure, ePSGS_CacheHit, ePSGS_CacheNotHit, ePSGS_Si2csiCache, CPSGCache::LookupSi2csi(), IPSGS_Processor::m_Reply, IPSGS_Processor::m_Request, SBioseqResolution::m_ResolutionResult, SBioseqResolution::Reset(), CBioseqInfoRecord::SetAccession(), SBioseqResolution::SetBioseqInfo(), and CBioseqInfoRecord::SetSeqIdType().

Referenced by x_ResolveAsIsInCache(), and x_ResolveViaComposeOSLTInCache().

◆ x_ResolveSeqId() void CPSGS_ResolveBase::x_ResolveSeqId ( void  ) private

Definition at line 326 of file resolve_base.cpp.

References CPSGS_AsyncResolveBase::AdjustBioseqAccession(), CPSGSResolveErrors::AppendError(), CPSGS_AsyncResolveBase::CanSkipBioseqInfoRetrieval(), CRequestStatus::e404_NotFound, eDiag_Error, ePSGS_BioseqCache, ePSGS_CacheHit, SPSGS_RequestBase::ePSGS_CacheOnly, SPSGS_RequestBase::ePSGS_DbOnly, CPSGSCounters::ePSGS_InputSeqIdNotResolved, ePSGS_LogicError, ePSGS_ParsedOK, ePSGS_ParseFailed, ePSGS_SeqIdsEmpty, ePSGS_Si2csiCache, ePSGS_SkipLogging, ePSGS_UnresolvedSeqId, SBioseqResolution::GetBioseqInfo(), CPSGSResolveErrors::GetCombinedErrorCode(), CPSGSResolveErrors::GetCombinedErrorMessage(), CPSGS_AsyncResolveBase::GetCouldNotResolveMessage(), CPSGS_AsyncResolveBase::GetEffectiveVersion(), CPubseqGatewayApp::GetInstance(), CPSGS_AsyncResolveBase::GetSeqIdResolve(), CSeq_id::GetTextseq_Id(), SResolveInputSeqIdError::HasError(), SBioseqResolution::IsValid(), CPSGCache::LookupBioseqInfo(), m_AsyncStarted, CPSGS_AsyncResolveBase::m_CurrentSeqIdToResolve, SBioseqResolution::m_Error, SResolveInputSeqIdError::m_ErrorCode, SResolveInputSeqIdError::m_ErrorMessage, IPSGS_Processor::m_Reply, IPSGS_Processor::m_Request, SBioseqResolution::m_ResolutionResult, CPSGS_AsyncResolveBase::m_ResolveErrors, CPSGS_AsyncResolveBase::m_SeqIdsToResolve, CPSGS_AsyncResolveBase::MoveToNextSeqId(), CPSGS_AsyncResolveBase::OptimizationPrecondition(), IPSGS_Processor::ParseInputSeqId(), IPSGS_Processor::Process(), SBioseqResolution::Reset(), x_ComposeOSLT(), x_GetRequestUseCache(), x_OnSeqIdResolveError(), x_OnSeqIdResolveFinished(), x_OptimizedNotFound(), x_OptimizedResolutionInCache(), x_ResolveAsIsInCache(), and x_ResolveViaComposeOSLTInCache().

Referenced by ResolveInputSeqId(), x_OnAsyncBioseqInfoResolveError(), and x_OnSeqIdResolveFinished().

◆ x_ResolveViaComposeOSLTInCache()

Definition at line 245 of file resolve_base.cpp.

References CRequestStatus::e500_InternalServerError, ePSGS_CacheFailure, ePSGS_CacheHit, ePSGS_CacheNotHit, CPSGS_AsyncResolveBase::GetEffectiveVersion(), CSeq_id::GetTextseq_Id(), CPSGS_AsyncResolveBase::m_CurrentSeqIdToResolve, SBioseqResolution::m_Error, SResolveInputSeqIdError::m_ErrorCode, SResolveInputSeqIdError::m_ErrorMessage, SBioseqResolution::Reset(), NStr::ToUpper(), x_ResolveAsIsInCache(), x_ResolvePrimaryOSLTInCache(), and x_ResolveSecondaryOSLTInCache().

Referenced by ResolveTestInputSeqId(), and x_ResolveSeqId().

◆ m_AsyncStarted bool CPSGS_ResolveBase::m_AsyncStarted private ◆ m_FinalErrorCB ◆ m_FinalFinishedCB ◆ m_FinalStartProcessingCB

The documentation for this class was generated from the following files:


RetroSearch is an open source project built by @garambo | Open a GitHub Issue

Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo

HTML: 3.2 | Encoding: UTF-8 | Version: 0.7.4