docs: private static List<String> loadChains(Map<String, String[]> chains, boolean start, boolean restart) {
          final boolean bTrace = TraceComponent.isAnyTracingEnabled();
          final ChannelFramework cf = ChannelFrameworkFactory.getChannelFramework();
          List<String> createdChains = new ArrayList<String>(chains.size());
  
          String key, value;
          for (Entry<String, String[]> entry : chains.entrySet()) {
              String chain = entry.getKey();
              FlowType flow = FlowType.INBOUND;
              boolean enable = true;
              boolean missingChannels = false;
              String[] chanList = null;
              for (String prop : entry.getValue()) {
                  key = extractKey(prop);
                  value = extractValue(prop);
                  if ("enable".equalsIgnoreCase(key)) {
                      enable = Boolean.parseBoolean(value);
                  } else if ("channels".equalsIgnoreCase(key)) {
                      // parse the channel list
                      chanList = extractList(value, ',');
                      for (String channel : chanList) {
                          if (null == cf.getChannel(channel)) {
                              if (bTrace && tc.isEventEnabled()) {
                                  Tr.event(tc, "Chain contains missing channel: " + channel);
                              }
                              chanList = null;
                              missingChannels = true;
                              break; // out of channel check loop
                          }
                      }
                  } else if ("flow".equalsIgnoreCase(key)) {
                      flow = "inbound".equalsIgnoreCase(value) ? FlowType.INBOUND : FlowType.OUTBOUND;
                  }
              }
              if (null == chanList) {
                  // chain either had no channels configured or it has channels
                  // that are waiting on their providers
                  if (!missingChannels) {
                      if (bTrace && tc.isEventEnabled()) {
                          Tr.event(tc, "Chain had no channels; " + chain);
                      }
                      continue;
                  }
                  if (bTrace && tc.isEventEnabled()) {
                      Tr.event(tc, "Delay; chain missing channels; " + chain);
                  }
                  if (start) {
                      delayedStarts.put(chain, Boolean.valueOf(restart));
                  }
                  delayedConfig.put(CHAIN_PREFIX + chain, entry.getValue());
                  createdChains.add(chain);
                  continue;
              }
              try {
                  ChainData cd = cf.getChain(chain);
                  if (null == cd) {
                      cd = cf.addChain(chain, flow, chanList);
                  } else {
                      cd = cf.updateChain(chain, chanList);
                  }
                  cd.setEnabled(enable);
                  createdChains.add(chain);
              } catch (Exception e) {
                  FFDCFilter.processException(e, "ChannelUtils.loadChains",
                                              "create", new Object[] { entry, cf });
                  if (bTrace && tc.isEventEnabled()) {
                      Tr.event(tc, "Unable to add chain " + chain + "; " + e);
                  }
              }
          } // end-chains
  
          return createdChains;
      }