code: public static Set<TZID> getPreferredIDs(
          Locale locale,
          boolean smart,
          String provider
      ) {
  
          ZoneModelProvider zp = getProvider(provider);
  
          if (zp == null) {
              return Collections.emptySet();
          }
  
          ZoneNameProvider np = zp.getSpecificZoneNameRepository();
  
          if (np == null) {
              np = NAME_PROVIDER;
          }
  
          Set<TZID> p = new HashSet<>();
  
          for (String id : np.getPreferredIDs(locale, smart)) {
              p.add(resolve(id));
          }
  
          return Collections.unmodifiableSet(p);
  
      }
docs: /*[deutsch]
  <p>Liefert die f&uuml;r einen gegebenen ISO-3166-L&auml;ndercode
  und {@code ZoneNameProvider} bevorzugten Zeitzonenkennungen. </p>
  
  <p>Diese Information ist f&uuml;r die Interpretation von Zeitzonennamen
  notwendig. Wenn das Argument {@code provider} keinen registrierten {@code ZoneModelProvider}
  referenziert, liefert diese Methode eine leere Menge. Wenn das Argument gleich
  &quot;DEFAULT&quot; ist, dann wird der Standard-{@code ZoneNameProvider}
  abgefragt. </p>
  
  @param   locale      ISO-3166-alpha-2-country to be evaluated
  @param   smart       if {@code true} then try to select zone ids such
  that there is only one preferred id per zone name
  @param   provider    the registered zone model provider whose preferred ids are queried
  @return  unmodifiable set of preferred timezone ids
  @throws  IllegalArgumentException if the provider argument is empty
  @since   2.2
  @see     ZoneModelProvider#getSpecificZoneNameRepository()
  @see     ZoneNameProvider#getPreferredIDs(Locale, boolean)