def parse_cfgstr_list2(cfgstr_list, named_defaults_dict=None, cfgtype=None,
                       alias_keys=None, valid_keys=None, expand_nested=True,
                       strict=True, special_join_dict=None, is_nestedcfgtype=False,
                       metadata=None):
    r
    import utool as ut
    cfg_combos_list = []
    cfgstr_list_ = []
    dyndef_named_defaults = {}
    for cfgstr in cfgstr_list:
        if cfgstr.find('=:') > -1:
            cfgname, cfgopt_strs, subx = parse_cfgstr_name_options(cfgstr)
            assert cfgname.endswith('=')
            cfgname = cfgname[:-1]
            base_cfg_list = lookup_base_cfg_list(cfgname,
                                                 named_defaults_dict,
                                                 metadata=metadata)
            cfg_options = noexpand_parse_cfgstrs(cfgopt_strs)
            dyndef_named_defaults[cfgname] = cfg_options
        else:
            cfgstr_list_.append(cfgstr)
    if len(dyndef_named_defaults) > 0 and named_defaults_dict is None:
        named_defaults_dict = dyndef_named_defaults
    for cfgstr in cfgstr_list_:
        cfg_combos = []
        if cfgstr.find('::') > -1:
            special_cfgstr_list = cfgstr.split('::')
            special_combo_list = parse_cfgstr_list2(
                special_cfgstr_list,
                named_defaults_dict=named_defaults_dict, cfgtype=cfgtype,
                alias_keys=alias_keys, valid_keys=valid_keys,
                strict=strict, expand_nested=expand_nested,
                is_nestedcfgtype=False, metadata=metadata)
            if special_join_dict is not None:
                for special_combo in special_combo_list:
                    for cfg in special_combo:
                        cfg.update(special_join_dict)
            if is_nestedcfgtype:
                cfg_combo = tuple([combo for combo in special_combo_list])
            else:
                cfg_combo = special_combo_list
            if expand_nested:
                cfg_combos.extend(cfg_combo)
            else:
                cfg_combos_list.append(cfg_combo)
        else:
            cfgname, cfgopt_strs, subx = parse_cfgstr_name_options(cfgstr)
            try:
                base_cfg_list = lookup_base_cfg_list(cfgname,
                                                     named_defaults_dict,
                                                     metadata=metadata)
            except Exception as ex:
                ut.printex(ex, keys=['cfgstr_list', 'cfgstr_list_'])
                raise
            for base_cfg in base_cfg_list:
                print('cfgname = %r' % (cfgname,))
                print('cfgopt_strs = %r' % (cfgopt_strs,))
                print('base_cfg = %r' % (base_cfg,))
                print('alias_keys = %r' % (alias_keys,))
                print('cfgtype = %r' % (cfgtype,))
                print('offset = %r' % (len(cfg_combos),))
                print('valid_keys = %r' % (valid_keys,))
                print('strict = %r' % (strict,))
                cfg_combo = customize_base_cfg(
                    cfgname, cfgopt_strs, base_cfg, cfgtype, alias_keys,
                    valid_keys, strict=strict, offset=len(cfg_combos))
                if is_nestedcfgtype:
                    cfg_combo = [cfg_combo]
                if expand_nested:
                    cfg_combos.extend(cfg_combo)
                else:
                    cfg_combos_list.append(cfg_combo)
        if expand_nested:
            cfg_combos_list.append(cfg_combos)
    return cfg_combos_list