@Override
  public void update() {
    if (--remainingDelay > 0) return;

    IInventory real = inventoryProvider().getInventory();
    int side = inventoryProvider().getInterfacedSide();
    if (real == null || side < 0) return;

    InventoryWrapper inv = InventoryWrapper.wrapInventory(real).setSlotsFromSide(side);
    InventoryWrapper filt = InventoryWrapper.wrapInventory(filter).setSlotsAll();

    List<ItemKey> checked = new ArrayList<ItemKey>(9);

    boolean requestAttempted = false;
    boolean requestedSomething = false;

    for (int i = 0; i < filter.getSizeInventory(); i++) {
      ItemKeyStack keyStack = ItemKeyStack.get(filter.getStackInSlot(i));

      if (keyStack == null || checked.contains(keyStack.key())) continue;

      int toRequest = filt.getItemCount(keyStack.key());
      int inInventory = inv.getItemCount(keyStack.key()) + getEnroute(keyStack.key());
      int missing = toRequest - inInventory;

      if (missing <= 0 || (requestWhenEmpty && inInventory > 0)) continue;

      RequestConsole req = new RequestConsole().setDestination(routeLayer().getRequester());
      req.setCrafting(true).setPulling(true).setPartials(true);
      ItemKeyStack request = ItemKeyStack.get(keyStack.key(), missing);
      req.makeRequest(request);

      requestAttempted = true;

      if (req.requested() > 0) {
        addToRequestList(request.key(), req.requested());
        requestedSomething = true;
      }
    }
    if (requestAttempted)
      RouteFX.spawnType1(
          RouteFX.color_request, 8, routeLayer().getCoords(), routeLayer().getWorld());

    if (requestAttempted && requestedSomething) operationsWithoutRequest = 0;
    else operationsWithoutRequest++;

    remainingDelay = operationDelay() + throttleDelay();
  }
  public CollectionPathFinder collect() {
    Map<ItemKey, Integer> collected = new HashMap<ItemKey, Integer>();
    for (StartEndPath l : requester.getRouter().getRoutesByCost()) {
      Router r = l.end;
      IWorldRouter wr = r.getParent();
      if (wr instanceof IWorldCrafter && collectCrafts) {
        IWorldCrafter c = (IWorldCrafter) wr;
        c.getBroadcastedItems(collected);
        List<ItemKeyStack> list = c.getCraftedItems();
        if (list != null)
          for (ItemKeyStack stack : list)
            if (!collected.containsKey(stack.key())) collected.put(stack.key(), null);
      } else if (wr instanceof IWorldBroadcaster && collectBroadcasts) {
        IWorldBroadcaster b = (IWorldBroadcaster) wr;
        b.getBroadcastedItems(collected);
      }
    }

    this.collected = collected;
    return this;
  }
 @Override
 public void trackedItemReceived(ItemKeyStack s) {
   removeFromRequestList(s.key(), s.stackSize);
 }