docs: private boolean restoreFanOut(
                                    MessageItemReference ref,
                                    boolean commitInsert)
                      throws
                      SIDiscriminatorSyntaxException, SIResourceException
      {
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
              SibTr.entry(
                          tc,
                          "restoreFanOut",
                          new Object[] { ref, new Boolean(commitInsert) });
  
          boolean keepReference = true;
          MessageItem msg = null;
          try
          {
              msg = (MessageItem) ref.getReferredItem();
          } catch (MessageStoreException e)
          {
              // FFDC
              FFDCFilter.processException(
                                          e,
                                          "com.ibm.ws.sib.processor.impl.PubSubInputHandler.restoreFanOut",
                                          "1:2102:1.329.1.1",
                                          this);
  
              SibTr.exception(tc, e);
  
              if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
                  SibTr.exit(tc, "restoreFanOut", e);
  
              throw new SIResourceException(e);
          }
  
          //Find matching output handlers    
          MessageProcessorSearchResults searchResults = matchMessage(msg);
  
          String topic = msg.getMessage().getDiscriminator();
  
          // cycle through the Neighbouring ME's
          List matchingPubsubOutputHandlers = searchResults.getPubSubOutputHandlers(topic);
  
          // Check to see if we have any matching Neighbours
          if (matchingPubsubOutputHandlers != null &&
              matchingPubsubOutputHandlers.size() > 0)
          {
              HashMap allPubSubOutputHandlers = _destination.getAllPubSubOutputHandlers();
              try
              {
                  Iterator itr = allPubSubOutputHandlers.values().iterator();
  
                  while (itr.hasNext())
                  {
                      PubSubOutputHandler handler = (PubSubOutputHandler) itr.next();
                      if (handler.okToForward(msg))
                      {
                          if (matchingPubsubOutputHandlers.contains(handler))
                          {
                              // Put the message to the Neighbour.
                              handler.putInsert(msg, commitInsert);
                          }
                          else
                          {
                              // Put Completed into stream
                              // Set "create" to true in case this is the first time
                              // this stream has seen a tick.
                              handler.putSilence(msg);
                          }
                      }
                      //else
                      //{
                      // defect 260440: 
                      // 601 used to now remove this OH from 
                      // the set of matching outputhandlers, but it is cheaper
                      // instead to merely repeat the 'okToForward' check later on
                      //}
                  }
              } finally
              {
                  // unlock as the getAllPubSubOutputHandlers locks it.
                  _destination.unlockPubsubOutputHandlers();
              }
          }
          else
          // no matching Neighbours, mark itemReference to be removed from referenceStream
          {
              keepReference = false;
          }
  
          // If we have OutputHandlers to deliver this to, and ref is indoubt,
          // then we keep searchResults for use in the eventPostAdd() callback
          if (keepReference && !commitInsert)
          {
              ref.setSearchResults(searchResults);
          }
  
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
              SibTr.exit(tc, "restoreFanOut");
  
          return keepReference;
      }