private void playEvents() {
    up2date = true;
    int currentC = curChunk.get();
    int currentI = nextTop.get();
    //        long time = -System.nanoTime();
    //        long count = 0;
    for (int chunk = 0; chunk <= currentC; chunk++) {
      int to = (chunk == currentC ? currentI : CHUNK_SIZE);
      for (int cell = 0; cell < to; cell++) {
        IntVar var = varChunks[chunk][cell];
        EventType etype = masChunks[chunk][cell];
        ICause cause = cauChunks[chunk][cell];
        int one = val1Chunks[chunk][cell];
        int two = val2Chunks[chunk][cell];
        int three = val3Chunks[chunk][cell];
        //                System.out.printf("%s %s %d %d %d - %s\n", var, etype, one, two, three,
        // cause);
        //                count++;
        switch (etype) {
          case REMOVE:
            super.removeValue(var, one, cause);
            break;
          case INSTANTIATE:
            super.instantiateTo(var, one, cause, two, three);
            break;
          case INCLOW:
            super.updateLowerBound(var, one, two, cause);
            break;
          case DECUPP:
            super.updateUpperBound(var, one, two, cause);
            break;
          case FULL_PROPAGATION:
            Propagator prop = (Propagator) cause;
            BoolVar bVar = (BoolVar) var;
            super.activePropagator(bVar, prop);
            break;
          default:
            throw new UnsupportedOperationException("Unknown type " + etype);
        }
      }
    }
    //        time += System.nanoTime();
    //        System.out.printf("depth %d, lazy %.3f ", count, time / (1000 * 1000f));

  }
 private void pushEvent(IntVar var, ICause cause, EventType mask, int one, int two, int three) {
   assert cause != Cause.Null : "cause null";
   int currentC = curChunk.get();
   int currentI = nextTop.add(1);
   if (currentI > CHUNK_SIZE) {
     currentC = curChunk.add(1);
     int l = varChunks.length;
     if (currentC == l) {
       increase(l);
     }
     nextTop.set(1);
     currentI = 0;
   } else {
     currentI--;
   }
   varChunks[currentC][currentI] = var;
   cauChunks[currentC][currentI] = cause;
   masChunks[currentC][currentI] = mask;
   val1Chunks[currentC][currentI] = one;
   val2Chunks[currentC][currentI] = two;
   val3Chunks[currentC][currentI] = three;
   up2date = false;
 }