docs: public static void throwCompensationEvent(List<EventSubscriptionEntity> eventSubscriptions, ActivityExecution execution, boolean async) {
  
      // first spawn the compensating executions
      for (EventSubscriptionEntity eventSubscription : eventSubscriptions) {
        // check whether compensating execution is already created
        // (which is the case when compensating an embedded subprocess,
        // where the compensating execution is created when leaving the subprocess
        // and holds snapshot data).
        ExecutionEntity compensatingExecution = getCompensatingExecution(eventSubscription);
        if (compensatingExecution != null) {
          if (compensatingExecution.getParent() != execution) {
            // move the compensating execution under this execution if this is not the case yet
            compensatingExecution.setParent((PvmExecutionImpl) execution);
          }
  
          compensatingExecution.setEventScope(false);
        } else {
          compensatingExecution = (ExecutionEntity) execution.createExecution();
          eventSubscription.setConfiguration(compensatingExecution.getId());
        }
        compensatingExecution.setConcurrent(true);
      }
  
      // signal compensation events in REVERSE order of their 'created' timestamp
      Collections.sort(eventSubscriptions, new Comparator<EventSubscriptionEntity>() {
        @Override
        public int compare(EventSubscriptionEntity o1, EventSubscriptionEntity o2) {
          return o2.getCreated().compareTo(o1.getCreated());
        }
      });
  
      for (EventSubscriptionEntity compensateEventSubscriptionEntity : eventSubscriptions) {
        compensateEventSubscriptionEntity.eventReceived(null, async);
      }
    }