code: @Override
      protected List<byte[]> mate(byte[] parent1,
                                  byte[] parent2,
                                  int numberOfCrossoverPoints,
                                  Random rng)
      {
          if (parent1.length != parent2.length)
          {
              throw new IllegalArgumentException("Cannot perform cross-over with different length parents.");
          }
          byte[] offspring1 = new byte[parent1.length];
          System.arraycopy(parent1, 0, offspring1, 0, parent1.length);
          byte[] offspring2 = new byte[parent2.length];
          System.arraycopy(parent2, 0, offspring2, 0, parent2.length);
          // Apply as many cross-overs as required.
          byte[] temp = new byte[parent1.length];
          for (int i = 0; i < numberOfCrossoverPoints; i++)
          {
              // Cross-over index is always greater than zero and less than
              // the length of the parent so that we always pick a point that
              // will result in a meaningful cross-over.
              int crossoverIndex = (1 + rng.nextInt(parent1.length - 1));
              System.arraycopy(offspring1, 0, temp, 0, crossoverIndex);
              System.arraycopy(offspring2, 0, offspring1, 0, crossoverIndex);
              System.arraycopy(temp, 0, offspring2, 0, crossoverIndex);
          }
          List<byte[]> result = new ArrayList<byte[]>(2);
          result.add(offspring1);
          result.add(offspring2);
          return result;
      }
docs: {@inheritDoc}