diff --git a/CMakeLists.txt b/CMakeLists.txt index 803912dc0b0da9573e133a774b9a27d6a56fbb78..c4df5d42475b87867d61a6b5b28897e066b4611e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -93,4 +93,7 @@ if(WITH_MKLDNN) endif() add_subdirectory(bsl) +add_subdirectory(ullib) +add_subdirectory(spreg) +add_subdirectory(configure) add_subdirectory(predictor) diff --git a/bsl/CMakeLists.txt b/bsl/CMakeLists.txt index fb697d1b3b8e30f6beb36579c47660efb03b7e1c..3d048dcfeb178b53593beb4253968bd821aa4c23 100644 --- a/bsl/CMakeLists.txt +++ b/bsl/CMakeLists.txt @@ -7,8 +7,13 @@ add_custom_command(TARGET copy_bsl_headers # COMMAND mkdir -p ${CMAKE_CURRENT_BINARY_DIR}/include/bsl/containers && cp ${CMAKE_CURRENT_LIST_DIR}/containers/*.h ${CMAKE_CURRENT_BINARY_DIR}/include/bsl/containers COMMAND mkdir -p ${CMAKE_CURRENT_BINARY_DIR}/include/bsl/check_cast && cp ${CMAKE_CURRENT_LIST_DIR}/check_cast/*.h ${CMAKE_CURRENT_BINARY_DIR}/include/bsl/check_cast COMMAND mkdir -p ${CMAKE_CURRENT_BINARY_DIR}/include/bsl/ResourcePool && cp ${CMAKE_CURRENT_LIST_DIR}/ResourcePool/*.h ${CMAKE_CURRENT_BINARY_DIR}/include/bsl/ResourcePool + COMMAND mkdir -p ${CMAKE_CURRENT_BINARY_DIR}/include/bsl/var/ && cp ${CMAKE_CURRENT_LIST_DIR}/var/utils/*.h ${CMAKE_CURRENT_BINARY_DIR}/include/bsl/var/ + COMMAND cp ${CMAKE_CURRENT_LIST_DIR}/var/interface/*.h ${CMAKE_CURRENT_BINARY_DIR}/include/bsl/var/ + COMMAND cp ${CMAKE_CURRENT_LIST_DIR}/var/implement/*.h ${CMAKE_CURRENT_BINARY_DIR}/include/bsl/var/ COMMAND cp ${CMAKE_CURRENT_LIST_DIR}/check_cast/*.h ${CMAKE_CURRENT_BINARY_DIR}/include/bsl + COMMAND cp ${CMAKE_CURRENT_LIST_DIR}/ResourcePool/*.h ${CMAKE_CURRENT_BINARY_DIR}/include/bsl/ ) +include_directories(${CMAKE_CURRENT_BINARY_DIR}/include) add_subdirectory(utils) add_subdirectory(alloc) add_subdirectory(archive) @@ -21,3 +26,6 @@ add_subdirectory(ResourcePool) add_subdirectory(var/interface) add_subdirectory(var/utils) add_subdirectory(var/implement) +add_custom_target(bsl) +add_dependencies(bsl utils alloc archive containers pool buffer exception + check_cast ResourcePool interface var_utils implement) diff --git a/bsl/alloc/CMakeLists.txt b/bsl/alloc/CMakeLists.txt index fa87827e2663f0b56d002331f8e510907577e7be..2bdd443daf3a9160c1ab94c29c4f12ad0b84ec1b 100644 --- a/bsl/alloc/CMakeLists.txt +++ b/bsl/alloc/CMakeLists.txt @@ -1 +1,2 @@ INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}) +add_custom_target(alloc) diff --git a/bsl/containers/CMakeLists.txt b/bsl/containers/CMakeLists.txt index 50b82bbdd3f4c4e1c31986b62102d09383fb5efb..0e77b65c3f0a57e1184a3e0b624b607712bd30b6 100644 --- a/bsl/containers/CMakeLists.txt +++ b/bsl/containers/CMakeLists.txt @@ -4,3 +4,4 @@ add_subdirectory(hash) add_subdirectory(list) add_subdirectory(slist) add_subdirectory(string) +add_custom_target(containers) diff --git a/bsl/var/interface/CMakeLists.txt b/bsl/var/interface/CMakeLists.txt index 3d0c2997243c7ff472ee9d6344f103b76098bf26..18f1dd6d2877fda91b41b9532a44301078cd4f0d 100644 --- a/bsl/var/interface/CMakeLists.txt +++ b/bsl/var/interface/CMakeLists.txt @@ -1 +1,2 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR}) +add_custom_target(interface) diff --git a/cmake/paddlepaddle.cmake b/cmake/paddlepaddle.cmake index e18b66f332d5787d5385d93d9eef21036d277079..1457f8097cd4a0b0ec386bc4f9babccfd3f7dfd2 100644 --- a/cmake/paddlepaddle.cmake +++ b/cmake/paddlepaddle.cmake @@ -57,7 +57,7 @@ ExternalProject_Add( -DCMAKE_INSTALL_LIBDIR:PATH=${PADDLE_INSTALL_DIR}/lib -DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=ON -DCMAKE_BUILD_TYPE:STRING=${THIRD_PARTY_BUILD_TYPE} - BUILD_COMMAND make && make inference_lib_dist + INSTALL_COMMAND make inference_lib_dist ) ADD_LIBRARY(paddle_fluid STATIC IMPORTED GLOBAL) SET_PROPERTY(TARGET paddle_fluid PROPERTY IMPORTED_LOCATION ${PADDLE_LIBRARIES}) diff --git a/configure/BCLOUD b/configure/BCLOUD new file mode 100644 index 0000000000000000000000000000000000000000..b62974a041ab8a8307d762dfb1c263b13a7c7a1d --- /dev/null +++ b/configure/BCLOUD @@ -0,0 +1,53 @@ +#edit-mode: -*- python -*- +#coding:gbk + +#工作路径. +WORKROOT('../../') +CC('g++') + +#C预处理器参数. +#CPPFLAGS('-D_GNU_SOURCE -D__STDC_LIMIT_MACROS -DVERSION=\\\"1.9.8.7\\\"') + +#C编译参数. +CFLAGS('-pipe -fsigned-char -Wall -W -g -fPIC -Woverloaded-virtual') + +#C++编译参数. +CXXFLAGS('-pipe -fsigned-char -Wall -W -g -fPIC -Woverloaded-virtual') + +#IDL编译参数 +#IDLFLAGS('--compack') + +#UBRPC编译参数 +#UBRPCFLAGS('--compack') + +#头文件路径. +INCPATHS('. compiler/src') + +#使用库 +#LIBS('./libconfigure.a') + +#链接参数. +#LDFLAGS('-lpthread -lcrypto -lrt') + +#依赖模块 +CONFIGS('lib2-64/bsl@bsl_1-1-8-0_PD_BL') +CONFIGS('lib2-64/ullib@ullib_3-1-43-2_PD_BL') +CONFIGS('public/spreg@spreg_1-0-3-0_PD_BL') +CONFIGS('third-64/pcre@pcre_7-7-0-0_PD_BL') + +user_sources='FileReloader.cpp ConfigReloader.cpp CmdOption.cpp ConfigError.cpp ConfigGroup.cpp ConfigUnit.cpp Configure.cpp constraint/Constraint.cpp constraint/ConstraintFunction.cpp constraint/cc_default.cpp reader/RawData.cpp reader/Reader.cpp utils/init.cpp utils/trans.cpp cfgext.cpp cfgflag.cpp compiler/src/idl.c compiler/src/idl_lex.c compiler/src/idl_gram.c' +user_headers='ConfigGroup.h Configure.h ConfigReloader.h ConfigArray.h cfgext.h CmdOption.h ConfigUnit.h ConfigError.h FileReloader.h EnvGet.h cfgflag.h' + +HEADERS('utils/*.h', '$INC/utils') +HEADERS('constraint/*.h', '$INC/constraint') +HEADERS('compiler/src/idl_conf_if.h', '$INC') +#可执行文件 +#Application('configure',Sources(user_sources)) +#静态库 +StaticLibrary('config',Sources(user_sources),HeaderFiles(user_headers)) +#共享库 +#SharedLibrary('configure',Sources(user_sources),HeaderFiles(user_headers)) +#子目录 +#Directory('demo') + + diff --git a/configure/CMakeLists.txt b/configure/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..02bb426de3ff7e6faaafc85cd2e2d360ae5e0281 --- /dev/null +++ b/configure/CMakeLists.txt @@ -0,0 +1,30 @@ +LIST(APPEND configure_srcs + ${CMAKE_CURRENT_LIST_DIR}/FileReloader.cpp + ${CMAKE_CURRENT_LIST_DIR}/ConfigReloader.cpp + ${CMAKE_CURRENT_LIST_DIR}/CmdOption.cpp + ${CMAKE_CURRENT_LIST_DIR}/ConfigError.cpp + ${CMAKE_CURRENT_LIST_DIR}/ConfigGroup.cpp + ${CMAKE_CURRENT_LIST_DIR}/ConfigUnit.cpp + ${CMAKE_CURRENT_LIST_DIR}/Configure.cpp + ${CMAKE_CURRENT_LIST_DIR}/constraint/Constraint.cpp + ${CMAKE_CURRENT_LIST_DIR}/constraint/ConstraintFunction.cpp + ${CMAKE_CURRENT_LIST_DIR}/constraint/cc_default.cpp + ${CMAKE_CURRENT_LIST_DIR}/reader/RawData.cpp + ${CMAKE_CURRENT_LIST_DIR}/reader/Reader.cpp + # ${CMAKE_CURRENT_LIST_DIR}/utils/init.cpp + ${CMAKE_CURRENT_LIST_DIR}/utils/trans.cpp + ${CMAKE_CURRENT_LIST_DIR}/cfgext.cpp + ${CMAKE_CURRENT_LIST_DIR}/cfgflag.cpp + ${CMAKE_CURRENT_LIST_DIR}/compiler/src/idl.c + ${CMAKE_CURRENT_LIST_DIR}/compiler/src/idl_lex.c + ${CMAKE_CURRENT_LIST_DIR}/compiler/src/idl_gram.c +) + +add_library(configure ${configure_srcs}) +add_dependencies(configure bsl brpc ullib spreg) +target_include_directories(configure PUBLIC + ${CMAKE_CURRENT_LIST_DIR}/ + ${CMAKE_CURRENT_LIST_DIR}/compiler/src + ${CMAKE_CURRENT_LIST_DIR}/../ullib/include + ${CMAKE_CURRENT_LIST_DIR}/../spreg/ + ${CMAKE_CURRENT_BINARY_DIR}/../bsl/include) diff --git a/configure/ChangeLog b/configure/ChangeLog new file mode 100755 index 0000000000000000000000000000000000000000..d72f84f898f4cdb404f94623f69f3a61f34eb840 --- /dev/null +++ b/configure/ChangeLog @@ -0,0 +1,37 @@ +1.2.0 + * add configUnit的写支持。add_unit/copy_unit/del_unit/set_value + +1.1.0 + * add 增加热加载支持. ConfigReloader/FileReloader + +1.0.7 + * fix 消除多线程so使用中析构两次error_unit的问题 + +1.0.6 + * fix loadIVar时不给非特殊字符串增加引号 + * add 支持对configure对象进行约束检查. configure.check_once + +1.0.5 + * fix 解决configure和idlcompiler的命名冲突问题 + * fix Configure::loadIVar中,整数和浮点类型的IVar转成的字符串中去掉双引号 + * fix 将int32等类型定义改成带comcfg_前缀的命名,避免和别处的定义冲突。 + * fix error unit改成单例模式 + * fix 解决-Woverloaded-virtual编译参数引起编译warning的问题 + * add 增加遍历接口get_sub_unit(),配合size()和selfType()可以完成对configure的遍历 + * add 增加接口get_key_name(),获取key的名字 + +1.0.4 + * fix getErrKeyPath方法增加const修饰,并从Configure中移到ConfigUnit中。 + * add 抛出的Exception中增加出错路径信息 + * add 增加NOSUCHKEY以外的各种读配置错误的具体路径信息。包括:1). + OUTOFRANGE 超出范围;2). FORMATERROR 格式错误;3). NULLVALUE 值为空;4). + NULLBUFFER 传出参数指针为NULL;5). GROUPTOUNIT 使用group的取值方法 + +1.0.3.1 nsfw 2009/08/07 + * fix 修复autoConfigGen函数中的内存泄露 + * fix autoConfigGen()对数组改成只生成一份配置,一份注释的配置 + * add 增加Configure::getErrKeyPath()接口,获取不存在的key失败时,返回导致出错的key具体路径。 + * add 增加to_xxx系列提供默认值的重载函数 + * add 增加ConfigUnit::deepGet()接口,长路径的直接获取 + * add 增加读取环境变量的宏 + diff --git a/configure/CmdOption.cpp b/configure/CmdOption.cpp new file mode 100644 index 0000000000000000000000000000000000000000..0a3c3e7d7ff1a299cc3e61ef512bfd75b7c8f293 --- /dev/null +++ b/configure/CmdOption.cpp @@ -0,0 +1,197 @@ +/*************************************************************************** + * + * Copyright (c) 2008 Baidu.com, Inc. All Rights Reserved + * $Id: CmdOption.cpp,v 1.6 2009/11/10 04:50:30 scmpf Exp $ + * + **************************************************************************/ + + + +/** + * @file CmdOption.cpp + * @author yingxiang(com@baidu.com) + * @date 2008/12/29 21:50:42 + * @version $Revision: 1.6 $ + * @brief + * + **/ + +#include "CmdOption.h" +#include "ConfigUnit.h" +#include "utils/cc_utils.h" +#include + +namespace comcfg{ + CmdOption :: CmdOption(){ + } + + int CmdOption :: setOptString(const char * p){ + int ret = 0; + const char *prev = NULL; + memset(ch, 0, sizeof(ch)); + while(*p != '\0'){ + if(*p == ':'){ + if(prev == NULL || ch[(unsigned char)(*prev)] == CMD_OPT2){ + ret = -1; + break; + } + else{ + ++ ch[(unsigned char)(*prev)]; + } + } + else{ + if(ch[(unsigned char)(*p)]){ + ret = -1; + break; + } + ch[(unsigned char)(*p)] = CMD_OPT0; + } + prev = p; + ++p; + } + return ret; + } + + int CmdOption :: init(int argc, char * const * argv, const char * optstring){ + if(argv == NULL || optstring == NULL){ + LOG(WARNING) << "Null pointer in CmdOption::init....."; + return -1; + } + if(setOptString(optstring) != 0){ + LOG(WARNING) << "optstring error."; + return -1; + } + int ret = 0; + //反序处理 + try{ + for(int i = argc - 1; i >= 0; --i){ + if(argv[i][0] == '-'){ + str_t key, value; + //option + if(argv[i][1] == '-'){ + //long option + key = argv[i] + 2; + size_t sz;// = key.find('=', 0); + for(sz = 0; sz < key.size(); ++sz){ + if(key[sz] == '='){ + break; + } + } + if(sz != key.size()){ + value = key.substr(sz+1); + key = key.substr(0, sz); + LOG(INFO) << "[CmdOption init - long opt] key=" << key.c_str() << " value=" << value.c_str(); + } + if( push(key, new ConfigUnit(key, value, NULL, this)) ){ + ret = -1; + } + } + + else if(ch[(unsigned char)(argv[i][1])] == CMD_OPT0){ + //opt 0 + key = ""; + key.push_back(argv[i][1]); + if( push(key, new ConfigUnit(key, value, NULL, this)) ){ + ret = -1; + } + } + + else if(ch[(unsigned char)(argv[i][1])] == CMD_OPT1){ + //opt 1 + key = ""; + key.push_back(argv[i][1]); + value = argv[i] + 2; + if(value.size() == 0){ + if(arg.size() == 0){ + LOG(WARNING) << "Option [-" << argv[i][1] << ":] without any argument."; + ret = -1; + } + else{ + value = arg[arg.size() - 1]; + arg.pop_back(); + } + } + if( push(key, new ConfigUnit(key, value, NULL, this)) ){ + ret = -1; + } + } + + else if(ch[(unsigned char)(argv[i][1])] == CMD_OPT2){ + //opt 2 + key = ""; + key.push_back(argv[i][1]); + value = argv[i] + 2; + if(value.size() == 0){ + LOG(WARNING) << "Option [-" << argv[i][1] << "::] without any argument."; + ret = -1; + } + if( push(key, new ConfigUnit(key, value, NULL, this)) ){ + ret = -1; + } + } + else{ + LOG(WARNING) << "Option [-" << argv[i][1] << "] unknown."; + ret = -1; + } + } + else{ + arg.push_back(str_t(argv[i])); + } + } + } + catch(...){ + LOG(WARNING) << "Option error.."; + ret = -1; + } + return ret; + } + + bool CmdOption :: hasOption(const char * s) const { + return (*this)[s].selfType() != CONFIG_ERROR_TYPE; + } + size_t CmdOption :: argSize() const { + return arg.size(); + } + const char * CmdOption :: getArg(int n) const { + if(n >= (int)arg.size()){ + return NULL; + } + //反序的 + return arg[(int)arg.size() - n - 1].c_str(); + } + int CmdOption :: registHook(const char * option, hook_t hook){ + pair_t p; + p.first = str_t(option); + p.second = hook; + hkmap.insert(p); + return 0; + } + int CmdOption :: runHook(){ + itr_t itr; + for(itr = fieldMap.begin(); itr != fieldMap.end(); ++itr){ + hk_pair_t p = hkmap.equal_range(itr->first); + for(hkitr_t hkitr = p.first; hkitr != p.second; ++hkitr){ + (hkitr->second)(this); + } + } + return 0; + } +} + + + + + + + + + + + + + + + + + +/* vim: set ts=4 sw=4 sts=4 tw=100 */ diff --git a/configure/CmdOption.h b/configure/CmdOption.h new file mode 100644 index 0000000000000000000000000000000000000000..ea39aef137ecdbac9b753ff35e275157508f80d1 --- /dev/null +++ b/configure/CmdOption.h @@ -0,0 +1,143 @@ +/*************************************************************************** + * + * Copyright (c) 2008 Baidu.com, Inc. All Rights Reserved + * $Id: CmdOption.h,v 1.6 2010/04/13 09:59:41 scmpf Exp $ + * + **************************************************************************/ + + + +/** + * @file CmdOption.h + * @author yingxiang(com@baidu.com) + * @date 2008/12/29 21:47:53 + * @version $Revision: 1.6 $ + * @brief + * + **/ + + +#ifndef __CMDOPTION_H_ +#define __CMDOPTION_H_ + +#include "ConfigGroup.h" +#include "utils/cc_utils.h" + +namespace comcfg{ + /** + * @brief 与getopt行为不一致的地方: + * 如果optstring = "a:b:" + * 当:./run -a -b c d + * optstring会把 -b作为-a的参数 + * 而CmdOption会把c, d堆栈处理,把c给-b,把d给-a + * + */ + class CmdOption : public ConfigGroup{ + public: + /** + * @brief 命令行参数初始化(不可以重复调用) + * + * @param [in] argc : int 参数个数 + * @param [in] argv : char* const* 参数 + * @param [in] optstring : const char* 选项信息,与getopt相同 + * @return int 0为成功,其它为失败 + * @retval + * @see + * @author yingxiang + * @date 2008/12/30 01:47:13 + **/ + int init(int argc, char * const * argv, const char * optstring); + /** + * @brief 命令行参数中是否存在某个选项 + * + * @return bool + * @retval + * @see + * @author yingxiang + * @date 2008/12/30 01:48:08 + **/ + bool hasOption(const char *) const; + /** + * @brief 末尾参数个数(注意:不是总的参数个数) + * 如:argc = 5, argv = {"./run", "-a", "xxx", "-h", "yyy", "zzz"}, optstring = "a:h" + * 那么这里的argSize = 3 (分别是./run, yyy和zzz),其中xxx是-a的参数 + * + * @return size_t 参数个数 + * @retval + * @see + * @author yingxiang + * @date 2008/12/30 01:49:16 + **/ + size_t argSize() const; + /** + * @brief 获取第n个参数 + * + * @param [in] n : int 参数位置(0 ~ argSize-1) + * @return const char* + * @retval + * @see + * @author yingxiang + * @date 2008/12/30 01:51:34 + **/ + const char * getArg(int n) const; + + typedef int (*hook_t)(CmdOption * ); + /** + * @brief 注册参数钩子,如果存在option参数,runHook时就执行相应的钩子 + * 一个option可注册多个钩子 + * + * @param [in] option : const char* + * @param [in] hook : hook_t + * @return int + * @retval + * @see + * @author yingxiang + * @date 2008/12/30 01:52:09 + **/ + int registHook(const char * option, hook_t hook); + /** + * @brief 运行钩子 + * + * @return int 无意义(runHook不管钩子的运行结果) + * 如关心钩子的运行结果,请在钩子中以异常抛出,自行处理 + * @retval + * @see + * @author yingxiang + * @date 2008/12/30 01:52:53 + **/ + int runHook(); + virtual ConfigUnit & operator= (ConfigUnit & unit) { + return ConfigUnit::operator=(unit); + } + CmdOption(); + protected: + static const int CHAR_TABLE_SIZE = 256; + char ch[CHAR_TABLE_SIZE]; + static const char CMD_NONE = 0; + static const char CMD_OPT0 = 1; + static const char CMD_OPT1 = 2; + static const char CMD_OPT2 = 3; + std::vector arg; + std::multimap hkmap; + typedef std::pair pair_t; + typedef std::multimap :: iterator hkitr_t; + typedef std::pair hk_pair_t; + + int setOptString(const char *); + }; +} + + + + + + + + + + + + +#endif //__CMDOPTION_H_ + +/* vim: set ts=4 sw=4 sts=4 tw=100 */ diff --git a/configure/ConfigArray.h b/configure/ConfigArray.h new file mode 100644 index 0000000000000000000000000000000000000000..3f7c6f34b2266db7753bf0f67db7d12eda5e7ffe --- /dev/null +++ b/configure/ConfigArray.h @@ -0,0 +1,242 @@ +/*************************************************************************** + * + * Copyright (c) 2008 Baidu.com, Inc. All Rights Reserved + * $Id: ConfigArray.h,v 1.11 2010/04/13 09:59:41 scmpf Exp $ + * + **************************************************************************/ + + + +/** + * @file ConfigArray.h + * @author yingxiang(com@baidu.com) + * @date 2008/12/24 10:49:08 + * @version $Revision: 1.11 $ + * @brief + * + **/ + + +#ifndef __CONFIGARRAY_H_ +#define __CONFIGARRAY_H_ + +#include "ConfigGroup.h" +#include "bsl/var/Array.h" +namespace comcfg{ + class ConfigArray : public ConfigGroup{ + public: + virtual int push(str_t key, ConfigUnit* unit){ + LOG(INFO) << "[" << getFather() << "]ConfigArray[" << this << "] [" << key.c_str() << "].push"; + vec.push_back(unit); + return 0; + } + ConfigArray(const char * __name, ConfigGroup * __father=NULL){ + if(*__name == '@'){ + ++__name; + } + create(__name, __father); + } + virtual int selfType() const{ + return CONFIG_ARRAY_TYPE; + } + virtual bsl::var::IVar& to_IVar(bsl::ResourcePool * vpool, ErrCode* errCode = NULL)const{ + if(vpool == NULL){ + LOG(INFO) << "Configure: visit ConfigArray.to_IVar() failed : NULLBUFFER"; + setErrorKeyPath(this->_name); + popError(errCode, NULLBUFFER); + return bsl::var::Null::null; + } + bsl::var::Array &arr = vpool->create(); + for(int i = 0; i < (int)vec.size(); ++i){ + arr.set( i, vec[i]->to_IVar(vpool, errCode) ); + } + return arr; + } + + void print(int indent = 0) const{ + pindent(indent); + printf("Array--------[%s] : {\n", getName()); + for(int i = 0; i < (int)vec.size(); ++i){ + vec[i]->print(indent+1); + } + pindent(indent); + printf("}\n"); + } + + const ConfigUnit & operator[] (int idx) const{ + if(idx < (int)vec.size()){ + return *vec[idx]; + } + LOG(INFO) << "Configure: visit element not exist ConfigArray[int] : " << _name.c_str() << "[" << idx << "]"; + str_t tmp=this->_name; + char tmpid[64]; + snprintf(tmpid,64, "%d",idx); + tmp.append("[").append(tmpid).append("]"); + setErrorKeyPath(tmp); + return *get_err_unit(); + } + const ConfigUnit & operator[] (const char *str) const { + LOG(INFO) << "Configure: visit ConfigArray[char *] : " << _name.c_str() << "[" << str << "]"; + str_t tmp=this->_name; + tmp.append(".").append(str); + setErrorKeyPath(tmp); + return *get_err_unit(); + } + const ConfigUnit & operator[] (const str_t &str) const{ + LOG(INFO) << "Configure: visit ConfigArray[str_t] : " << _name.c_str() << "[" << str.c_str() << "]"; + str_t tmp=this->_name; + tmp.append(".").append(str); + setErrorKeyPath(tmp); + return *get_err_unit(); + } + ConfigUnit & operator[] (int idx) { + if(idx < (int)vec.size()){ + return *vec[idx]; + } + LOG(INFO) << "Configure: visit element not exist ConfigArray[int] : " << _name.c_str() << "[" << idx << "]"; + str_t tmp=this->_name; + char tmpid[64]; + snprintf(tmpid,64, "%d",idx); + tmp.append("[").append(tmpid).append("]"); + setErrorKeyPath(tmp); + return *get_err_unit(); + } + ConfigUnit & operator[] (const char *str) { + LOG(INFO) << "Configure: visit ConfigArray[char *] : " << _name.c_str() << "[" << str << "]"; + str_t tmp=this->_name; + tmp.append(".").append(str); + setErrorKeyPath(tmp); + return *get_err_unit(); + } + ConfigUnit & operator[] (const str_t &str) { + LOG(INFO) << "Configure: visit ConfigArray[str_t] : " << _name.c_str() << "[" << str.c_str() << "]"; + str_t tmp=this->_name; + tmp.append(".").append(str); + setErrorKeyPath(tmp); + return *get_err_unit(); + } + virtual ConfigUnit & operator= (ConfigUnit & unit) { + return ConfigUnit::operator=(unit); + } + virtual ~ConfigArray(){ + for(int i = 0; i < (int)vec.size(); ++i){ + delete vec[i]; + } + } + + virtual size_t size()const{ + return vec.size(); + } + + const ConfigUnit & get_sub_unit(int index) const { + if ((0<=index) && (index < (int)vec.size())){ + return *vec[index]; + } + return *get_err_unit(); + } + /** + * @brief 比较是否相等 + * + * @return int 0表示相等 -1不相等 + * @author zhang_rui + **/ + virtual int equals(const ConfigUnit & conf) const { + try { + for(int i = 0; i < (int)vec.size(); ++i){ + if (0 != vec[i]->equals(conf[i])) { + return -1; + } + } + return 0; + } catch (bsl::Exception) { + return -1; + } + return -1; + } + /** + * @brief 增加一个unit + * + * @return int 0 成功,其他是错误号 + * @author zhang_rui + **/ + virtual int add_unit(const bsl_string & key, const bsl_string& value, + const int objtype, int except, ConfigUnit ** ref){ + ConfigUnit * tmp=NULL; + if (0 < vec.size() && objtype != vec[0]->selfType()) { + goto adderr; + } + tmp = create_unit(key, value, objtype, this->getFather()); + if (NULL == tmp){ + goto adderr; + } + this->push(key,tmp); + if (NULL != ref) { + *ref = tmp; + } + return 0; + adderr: + if (except) { + popError(NULL, CONFIG_ERROR); + } + return CONFIG_ERROR; + } + /** + * @brief 删除一个unit + * + * @return int 0 成功,其他是错误号 + * @author zhang_rui + **/ + virtual int del_unit(const bsl_string & key, int except) { + long long val; + int ret = Trans :: str2int64(key, &val); + long long sz = vec.size(); + if (0 == ret && 0 <= val && sz > val) { + ConfigUnit * delu = NULL; + std::vector :: iterator iter; + iter = vec.begin(); + iter += val; + delu = *iter; + vec.erase(iter); + if (delu) { + delete delu; + } + return 0; + } else { + if (except) { + if (0 != ul_seterrbuf("%s", "")) { + LOG(WARNING) << "Configure: failed to write error buffer"; + } + popError(NULL, NOSUCHKEY); + } + return NOSUCHKEY; + } + return 0; + } + protected: + std::vector vec; + + /** + * @brief 清除内容 + * + * @return void + * @author zhang_rui + **/ + virtual void clear() { + for(int i = 0; i < (int)vec.size(); ++i){ + delete vec[i]; + } + vec.clear(); + } + }; +} + + + + + + + + +#endif //__CONFIGARRAY_H_ + +/* vim: set ts=4 sw=4 sts=4 tw=100 */ diff --git a/configure/ConfigError.cpp b/configure/ConfigError.cpp new file mode 100644 index 0000000000000000000000000000000000000000..212f2e520f7f7c8e22e620620ab41be975068b92 --- /dev/null +++ b/configure/ConfigError.cpp @@ -0,0 +1,367 @@ +/*************************************************************************** + * + * Copyright (c) 2008 Baidu.com, Inc. All Rights Reserved + * $Id: ConfigError.cpp,v 1.9 2010/04/13 09:59:41 scmpf Exp $ + * + **************************************************************************/ + + + +/** + * @file ConfigError.cpp + * @author yingxiang(com@baidu.com) + * @date 2008/12/24 14:22:03 + * @version $Revision: 1.9 $ + * @brief + * + **/ +#include "ConfigError.h" + +namespace comcfg{ + + char ConfigError :: to_char(ErrCode * errCode)const{ + popError(errCode, NOSUCHKEY); + return char(); + } + + unsigned char ConfigError :: to_uchar(ErrCode * errCode)const{ + popError(errCode, NOSUCHKEY); + return (unsigned char)(0); + } + + int16_t ConfigError :: to_int16(ErrCode * errCode)const{ + popError(errCode, NOSUCHKEY); + return int16_t(); + } + + u_int16_t ConfigError :: to_uint16(ErrCode * errCode)const{ + popError(errCode, NOSUCHKEY); + return u_int16_t(); + } + + int ConfigError :: to_int32(ErrCode * errCode)const{ + popError(errCode, NOSUCHKEY); + return int(); + } + + u_int32_t ConfigError :: to_uint32(ErrCode * errCode)const{ + popError(errCode, NOSUCHKEY); + return u_int32_t(); + } + + long long ConfigError :: to_int64(ErrCode * errCode)const{ + popError(errCode, NOSUCHKEY); + return (long long)(0); + } + + unsigned long long ConfigError :: to_uint64(ErrCode * errCode)const{ + popError(errCode, NOSUCHKEY); + return (unsigned long long)(0); + } + + float ConfigError :: to_float(ErrCode * errCode)const{ + popError(errCode, NOSUCHKEY); + return float(); + } + + double ConfigError :: to_double(ErrCode * errCode)const{ + popError(errCode, NOSUCHKEY); + return double(); + } +#if 1 + bsl_string ConfigError :: to_bsl_string(ErrCode * errCode)const{ + popError(errCode, NOSUCHKEY); + return bsl_string(); + } +#endif +#if 0 + std_string ConfigError :: to_std_string(ErrCode * errCode)const{ + popError(errCode, NOSUCHKEY); + return std_string(); + } +#endif + str_t ConfigError :: to_raw_string(ErrCode * errCode)const{ + popError(errCode, NOSUCHKEY); + return str_t(); + } + const char * ConfigError :: to_cstr(ErrCode * errCode)const{ + popError(errCode, NOSUCHKEY); + return NULL; + } + + + //----------------to_xxx with default value + char ConfigError :: to_char(ErrCode * errCode, const char & def)const { + if(errCode){ + *errCode = NOSUCHKEY; + } + return def; + } + unsigned char ConfigError :: to_uchar(ErrCode * errCode, const unsigned char & def)const{ + if(errCode){ + *errCode = NOSUCHKEY; + } + return def; + } + int16_t ConfigError :: to_int16(ErrCode * errCode, const int16_t & def)const{ + if(errCode){ + *errCode = NOSUCHKEY; + } + return def; + } + u_int16_t ConfigError :: to_uint16(ErrCode * errCode, const u_int16_t & def)const{ + if(errCode){ + *errCode = NOSUCHKEY; + } + return def; + } + int ConfigError :: to_int32(ErrCode * errCode, const int & def)const{ + if(errCode){ + *errCode = NOSUCHKEY; + } + return def; + } + u_int32_t ConfigError :: to_uint32(ErrCode * errCode, const u_int32_t & def)const{ + if(errCode){ + *errCode = NOSUCHKEY; + } + return def; + } + long long ConfigError :: to_int64(ErrCode * errCode, const long long & def)const{ + if(errCode){ + *errCode = NOSUCHKEY; + } + return def; + } + unsigned long long ConfigError :: to_uint64(ErrCode * errCode, const unsigned long long & def)const{ + if(errCode){ + *errCode = NOSUCHKEY; + } + return def; + } + float ConfigError :: to_float(ErrCode * errCode, const float & def)const{ + if(errCode){ + *errCode = NOSUCHKEY; + } + return def; + } + double ConfigError :: to_double(ErrCode * errCode, const double & def)const{ + if(errCode){ + *errCode = NOSUCHKEY; + } + return def; + } + bsl_string ConfigError :: to_bsl_string(ErrCode * errCode, const bsl_string & def)const{ + if(errCode){ + *errCode = NOSUCHKEY; + } + return def; + } + str_t ConfigError :: to_raw_string(ErrCode * errCode, const str_t & def)const{ + if(errCode){ + *errCode = NOSUCHKEY; + } + return def; + } + //获取C风格的字符串(常量) + const char * ConfigError :: to_cstr(ErrCode * errCode, const char * def)const{ + if(errCode){ + *errCode = NOSUCHKEY; + } + return def; + } + + ErrCode ConfigError :: get_char(char * /*valueBuf*/)const{ + return NOSUCHKEY; + } + + ErrCode ConfigError :: get_uchar(unsigned char * /*valueBuf*/)const{ + return NOSUCHKEY; + } + + ErrCode ConfigError :: get_int16(int16_t * /*valueBuf*/)const{ + return NOSUCHKEY; + } + + ErrCode ConfigError :: get_uint16(u_int16_t * /*valueBuf*/)const{ + return NOSUCHKEY; + } + + ErrCode ConfigError :: get_int32(int * /*valueBuf*/)const{ + return NOSUCHKEY; + } + + ErrCode ConfigError :: get_uint32(u_int32_t * /*valueBuf*/)const{ + return NOSUCHKEY; + } + + ErrCode ConfigError :: get_int64(long long * /*valueBuf*/)const{ + return NOSUCHKEY; + } + + ErrCode ConfigError :: get_uint64(unsigned long long * /*valueBuf*/)const{ + return NOSUCHKEY; + } + + ErrCode ConfigError :: get_float(float * /*valueBuf*/)const{ + return NOSUCHKEY; + } + + ErrCode ConfigError :: get_double(double * /*valueBuf*/)const{ + return NOSUCHKEY; + } +#if 1 + ErrCode ConfigError :: get_bsl_string(bsl_string * /*valueBuf*/)const{ + return NOSUCHKEY; + } +#endif +#if 0 + ErrCode ConfigError :: get_std_string(std_string * /*valueBuf*/)const{ + return NOSUCHKEY; + } +#endif + ErrCode ConfigError :: get_raw_string(str_t * /*valueBuf*/)const{ + return NOSUCHKEY; + } + ErrCode ConfigError :: get_cstr(char * /*valueBuf*/, size_t /*len*/)const{ + return NOSUCHKEY; + } + + //--------------get_xx with default----------- + + ErrCode ConfigError :: get_char(char * valueBuf, const char & def)const{ + if (valueBuf) { + *valueBuf = def; + } + return NOSUCHKEY; + } + + ErrCode ConfigError :: get_uchar(unsigned char * valueBuf, const unsigned char & def)const{ + if (valueBuf) { + *valueBuf = def; + } + return NOSUCHKEY; + } + + ErrCode ConfigError :: get_int16(int16_t * valueBuf, const int16_t & def)const{ + if (valueBuf) { + *valueBuf = def; + } + return NOSUCHKEY; + } + + ErrCode ConfigError :: get_uint16(u_int16_t * valueBuf, const u_int16_t & def)const{ + if (valueBuf) { + *valueBuf = def; + } + return NOSUCHKEY; + } + + ErrCode ConfigError :: get_int32(int * valueBuf, const int & def)const{ + if (valueBuf) { + *valueBuf = def; + } + return NOSUCHKEY; + } + + ErrCode ConfigError :: get_uint32(u_int32_t * valueBuf, const u_int32_t & def)const{ + if (valueBuf) { + *valueBuf = def; + } + return NOSUCHKEY; + } + + ErrCode ConfigError :: get_int64(long long * valueBuf, const long long & def)const{ + if (valueBuf) { + *valueBuf = def; + } + return NOSUCHKEY; + } + + ErrCode ConfigError :: get_uint64(unsigned long long * valueBuf, const unsigned long long & def)const{ + if (valueBuf) { + *valueBuf = def; + } + return NOSUCHKEY; + } + + ErrCode ConfigError :: get_float(float * valueBuf, const float & def)const{ + if (valueBuf) { + *valueBuf = def; + } + return NOSUCHKEY; + } + + ErrCode ConfigError :: get_double(double * valueBuf, const double & def)const{ + if (valueBuf) { + *valueBuf = def; + } + return NOSUCHKEY; + } + + ErrCode ConfigError :: get_bsl_string(bsl_string * valueBuf, const bsl_string & def)const{ + if (valueBuf) { + *valueBuf = def; + } + return NOSUCHKEY; + } + + ErrCode ConfigError :: get_raw_string(str_t * valueBuf, const str_t & def)const{ + if (valueBuf) { + *valueBuf = def; + } + return NOSUCHKEY; + } + + ErrCode ConfigError :: get_cstr(char * valueBuf, size_t len, const char * def)const{ + if (valueBuf) { + snprintf(valueBuf, len, "%s", def); + } + return NOSUCHKEY; + } + + bsl::var::IVar& ConfigError :: to_IVar(bsl::ResourcePool * /*vpool*/, ErrCode* errCode)const{ + popError(errCode, NOSUCHKEY); + return bsl::var::Null::null; + } + + int ConfigError :: equals(const ConfigUnit & conf) const { + if (CONFIG_ERROR_TYPE == conf.selfType()) { + return 0; + } else { + return -1; + } + return -1; + } + + int ConfigError :: set_value(const bsl_string & /*value*/, int except){ + if (except) { + if (0 != ul_seterrbuf("%s", "")) { + LOG(WARNING) << "ConfigUnit: failed to write error buffer"; + } + popError(NULL, NOSUCHKEY); + } + return NOSUCHKEY; + } + int ConfigError :: copy_unit(const ConfigUnit & /*unit*/, int except) { + if (except) { + popError(NULL, NOSUCHKEY); + } + return ERROR; + } +} + + + + + + + + + + + + + + +/* vim: set ts=4 sw=4 sts=4 tw=100 */ diff --git a/configure/ConfigError.h b/configure/ConfigError.h new file mode 100644 index 0000000000000000000000000000000000000000..202bc8fc5861a539c6205a35e0ab34a8bfb9e199 --- /dev/null +++ b/configure/ConfigError.h @@ -0,0 +1,166 @@ +/*************************************************************************** + * + * Copyright (c) 2008 Baidu.com, Inc. All Rights Reserved + * $Id: ConfigError.h,v 1.11 2010/04/13 09:59:41 scmpf Exp $ + * + **************************************************************************/ + + + +/** + * @file ConfigUnit.h + * @author yingxiang(com@baidu.com) + * @date 2008/11/26 20:53:09 + * @version $Revision: 1.11 $ + * @brief + * + **/ + + +#ifndef __CONFIGERROR_H_ +#define __CONFIGERROR_H_ + +#include "utils/cc_utils.h" +#include "ConfigUnit.h" +namespace comcfg{ + + class ConfigError : public ConfigUnit{ + public: + + virtual ~ConfigError(){}; + + virtual char to_char(ErrCode * errCode = NULL)const; + virtual unsigned char to_uchar(ErrCode * errCode = NULL)const; + virtual int16_t to_int16(ErrCode * errCode = NULL)const; + virtual u_int16_t to_uint16(ErrCode * errCode = NULL)const; + virtual int to_int32(ErrCode * errCode = NULL)const; + virtual u_int32_t to_uint32(ErrCode * errCode = NULL)const; + virtual long long to_int64(ErrCode * errCode = NULL)const; + virtual unsigned long long to_uint64(ErrCode * errCode = NULL)const; + virtual float to_float(ErrCode * errCode = NULL)const; + virtual double to_double(ErrCode * errCode = NULL)const; + virtual bsl_string to_bsl_string(ErrCode * errCode = NULL)const; + //virtual std_string to_std_string(ErrCode * errCode = NULL)const; + virtual str_t to_raw_string(ErrCode * errCode = NULL)const; + virtual const char * to_cstr(ErrCode * errCode = NULL)const; + + /** + * @brief 带有默认值的to_XXX系列函数 + * 返回值与to_xxx系列完全相同。 + * 唯一的不同是:当errCode不为0(即发生错误), 返回def默认值 + * + * @param [out] errCode : ErrCode* 出错信息 + * @param [in] def : const & 默认值 + * @return + **/ + virtual char to_char(ErrCode * errCode, const char & def)const; + virtual unsigned char to_uchar(ErrCode * errCode, const unsigned char & def)const; + virtual int16_t to_int16(ErrCode * errCode, const int16_t & def)const; + virtual u_int16_t to_uint16(ErrCode * errCode, const u_int16_t & def)const; + virtual int to_int32(ErrCode * errCode, const int & def)const; + virtual u_int32_t to_uint32(ErrCode * errCode, const u_int32_t & def)const; + virtual long long to_int64(ErrCode * errCode, const long long & def)const; + virtual unsigned long long to_uint64(ErrCode * errCode, const unsigned long long & def)const; + virtual float to_float(ErrCode * errCode, const float & def)const; + virtual double to_double(ErrCode * errCode, const double & def)const; + virtual bsl_string to_bsl_string(ErrCode * errCode, const bsl_string & def)const; + virtual str_t to_raw_string(ErrCode * errCode, const str_t & def)const; + //获取C风格的字符串(常量) + virtual const char * to_cstr(ErrCode * errCode, const char * def)const; + + virtual ErrCode get_char(char * valueBuf)const; + virtual ErrCode get_uchar(unsigned char * valueBuf)const; + virtual ErrCode get_int16(int16_t * valueBuf)const; + virtual ErrCode get_uint16(u_int16_t * valueBuf)const; + virtual ErrCode get_int32(int * valueBuf)const; + virtual ErrCode get_uint32(u_int32_t * valueBuf)const; + virtual ErrCode get_int64(long long * valueBuf)const; + virtual ErrCode get_uint64(unsigned long long * valueBuf)const; + virtual ErrCode get_float(float * valueBuf)const; + virtual ErrCode get_double(double * valueBuf)const; + virtual ErrCode get_bsl_string(bsl_string * valueBuf)const; + //virtual ErrCode get_std_string(std_string * valueBuf)const; + virtual ErrCode get_raw_string(str_t * valueBuf) const; + virtual ErrCode get_cstr(char * valueBuf, size_t len) const; + + /** + * @brief 带有默认值的ge_XXX系列函数 + * 返回值与get_xxx系列完全相同。 + * 唯一的不同是:当返回值不为0(即发生错误)valueBuf中使用def默认值 + * + * @param [out] valueBuf : char* 传出的值 + * @param [in] def : const char& 默认值 + * @return ErrCode + * @retval + * @see + **/ + virtual ErrCode get_char(char * valueBuf, const char & def)const; + virtual ErrCode get_uchar(unsigned char * valueBuf, const unsigned char & def)const; + virtual ErrCode get_int16(int16_t * valueBuf, const int16_t & def)const; + virtual ErrCode get_uint16(u_int16_t * valueBuf, const u_int16_t & def)const; + virtual ErrCode get_int32(int * valueBuf, const int & def)const; + virtual ErrCode get_uint32(u_int32_t * valueBuf, const u_int32_t & def)const; + virtual ErrCode get_int64(long long * valueBuf, const long long & def)const; + virtual ErrCode get_uint64(unsigned long long * valueBuf, const unsigned long long & def)const; + virtual ErrCode get_float(float * valueBuf, const float & def)const; + virtual ErrCode get_double(double * valueBuf, const double & def)const; + virtual ErrCode get_bsl_string(bsl_string * valueBuf, const bsl_string & def)const; + virtual ErrCode get_raw_string(str_t * valueBuf, const str_t & def)const; + virtual ErrCode get_cstr(char * valueBuf, size_t len, const char * def)const; + + virtual bsl::var::IVar& to_IVar(bsl::ResourcePool* vpool, ErrCode* errCode = NULL)const; + + virtual int selfType() const{ + return CONFIG_ERROR_TYPE; + } + virtual size_t size()const{ + return 0; + } + + virtual str_t info() const{ + return str_t("[Error: No such key.]"); + } + /** + * @brief 比较是否相等 + * + * @return int 0表示相等 -1不相等 + * @author zhang_rui + **/ + virtual int equals(const ConfigUnit & conf) const; + /** + * @brief 删除一个unit + * + * @return int 0 成功,其他是错误号 + * @author zhang_rui + **/ + virtual int set_value(const bsl_string & value, int except=0); + /** + * @brief 复制一个unit, 深拷贝 + * + * 将unit的内容复制到本对象。 + * 类型需要匹配,只能从group复制到group,array复制到array + * @return int 0 成功,其他是错误号 + * @author zhang_rui + **/ + virtual int copy_unit(const ConfigUnit & unit, int except=0); + virtual ConfigUnit & operator= (ConfigUnit & unit){ + return ConfigUnit::operator=(unit); + } + protected: + //str_t key; + //str_t value; + }; + +} + + + + + + + + + +#endif //__CONFIGERROR_H_ + +/* vim: set ts=4 sw=4 sts=4 tw=100 */ diff --git a/configure/ConfigGroup.cpp b/configure/ConfigGroup.cpp new file mode 100644 index 0000000000000000000000000000000000000000..4acf1c54686974e971c0e675c9961e5302da22fb --- /dev/null +++ b/configure/ConfigGroup.cpp @@ -0,0 +1,813 @@ +/*************************************************************************** + * + * Copyright (c) 2008 Baidu.com, Inc. All Rights Reserved + * $Id: ConfigGroup.cpp,v 1.15 2010/04/13 09:59:41 scmpf Exp $ + * + **************************************************************************/ + + + +/** + * @file ConfigGroup.cpp + * @author yingxiang(com@baidu.com) + * @date 2008/12/21 18:10:28 + * @version $Revision: 1.15 $ + * @brief + * + **/ + +#include "ConfigGroup.h" +#include "ConfigArray.h" +#include "Configure.h" +#include "utils/cc_utils.h" +#include "bsl/var/Dict.h" + +namespace comcfg{ + ConfigUnit * ConfigGroup :: relativeSection(ConfigUnit *globalSec, str_t str, int *depth){ + LOG(INFO) << "Config : [relativeSection]Current section : [" << getName() << "] depth[" << *depth << "]"; + if(str == ""){ + return this; + } + str_t child; + size_t global_len = strlen(CONFIG_GLOBAL); + if(str.substr(0, global_len) == str_t(CONFIG_GLOBAL) && + (str.size() == global_len || str[global_len] == '.')){ + ConfigGroup * sec = this; + while(sec->getFather()){ + sec = sec->getFather(); + } + (*depth) = 0; + str = str.size() > global_len ? str.substr(global_len+1) : ""; + LOG(INFO) << "Config : switch to global [" << sec->getName() << "] <-- This must be GLOBAL"; + return sec->relativeSection(globalSec, str, depth); + } + for(int i = 0; i < (int)str.size(); ++i){ + if(str[i] == '.'){ + child = str.substr(0, i); + str = str.substr(i+1); + ptr_t ptr = fieldMap.find(child); + if(NULL == ptr){ + LOG(WARNING) << "Configure : No previous section named [" << child.c_str() << "]"; + throw ConfigException(); + } + ++(*depth); + return (ptr->second)->relativeSection(globalSec, str, depth); + } + } + ConfigGroup *gSec = (ConfigGroup *)globalSec; + ptr_t ptr = fieldMap.find(str); + if(NULL == ptr){ + ConfigGroup * tmp = new ConfigGroup(str.c_str(), this); + + if((str[0] != '@') && !( (GROUP_DUP_LEVEL0 == gSec->_dupLevel) || (GROUP_DUP_LEVEL1==gSec->_dupLevel && 1<*depth))){ + struct dup_position dpos = {gSec->_at_file, gSec->_at_line,}; + dup_vector dvec; + dvec.push_back(dpos); + gSec->_dupMap.set(tmp, dvec, 1); + } + + ++(*depth); + push(str, tmp); + return tmp; + } + else{ + ++(*depth); + if((ptr->second)->selfType() != CONFIG_GROUP_TYPE){ + LOG(WARNING) << "Config : Duplicate key or group name [" << str.c_str() << "]"; + throw ConfigException(); + } + else if(!( (GROUP_DUP_LEVEL0 == gSec->_dupLevel) || (GROUP_DUP_LEVEL1==gSec->_dupLevel && 1<*depth))){ + dup_ptr dtr = gSec->_dupMap.find(ptr->second); + if(NULL == dtr){ + LOG(WARNING) << "Config : dup-map failed to find [" << str.c_str() << "]"; + throw ConfigException(); + } + struct dup_position dpos = {gSec->_at_file, gSec->_at_line,}; + (dtr->second).push_back(dpos); + } + + return ptr->second; + } + } + void ConfigGroup :: create(const char * __name, ConfigGroup * __father){ + const char *p = __name; + if(*p == '@'){ + ++p; + } + while(*p != 0){ + if((!isalpha(*p)) && (!isdigit(*p)) && *p != '_'){ + LOG(WARNING) << "Configure : Unsupport _name [" << __name << "]"; + throw ConfigException(); + //throw ConfigException("Unsupport section _name"); + } + ++p; + } + LOG(INFO) << "Config: this=" << this << ", Set _name = " << __name << ", _father = " << __father << "[" << __father->getName() <<"]"; + _name = __name; + _father = __father; + fieldMap.create(256); + if(_father){ + _level = _father->getLevel() + 1; + } + else{ + _level = 0; + } + } + + int ConfigGroup :: push(const str_t& key, ConfigUnit* unit){ + LOG(INFO) << "Configure : Push key [" << key.c_str() << "] to [" << getName() << "]"; + if(key[0] != '@'){ + if(NULL == fieldMap.find(key)){ + fieldMap.set(key, unit, 1); + fieldList.push_back(key); + } + else{ + LOG(WARNING) << "Configure : [" << getName() << "] Duplicate key [" << key.c_str() << "]"; + throw ConfigException(); + return -1; + } + } + else{ + ptr_t ptr = fieldMap.find(key.substr(1)); + if(NULL != ptr){ + if(ptr->second->selfType() == CONFIG_ARRAY_TYPE){ + ((ConfigArray*)(ptr->second))->push(key, unit); + } + else{ + LOG(WARNING) << "Configure : ambiguity key [" << key.c_str() << "]"; + throw ConfigException(); + return -1; + } + } + else{ + ConfigArray * array = new ConfigArray(key.c_str() + 1, this); + if(this->push(key.substr(1), array) == 0){ + //fieldList.push_back(key.substr(1)); + LOG(INFO) << "Config : we have new array [" << key.c_str() + 1 << "]"; + array->push(key, unit); + } + } + } + return 0; + } + + const ConfigUnit & ConfigGroup :: operator[] (const char * str) const{ + return (*this)[str_t(str)]; + } + const ConfigUnit & ConfigGroup :: operator[] (const str_t & str) const{ + ptr_t ptr = fieldMap.find(str); + if(NULL != ptr){ + return *(ptr->second); + } + LOG(INFO) << "Configure: visiting key not found: ConfigGroup[str_t] : " << _name.c_str() << "[" << str.c_str() << "]"; + str_t tmp = this->_name; + if (tmp == CONFIG_GLOBAL){ + tmp = str; + } else { + tmp.append(".").append(str); + } + setErrorKeyPath(tmp); + return *get_err_unit(); + } + const ConfigUnit & ConfigGroup :: operator[] (int idx) const{ + LOG(WARNING) << "Configure: visit ConfigGroup[int] : " << _name.c_str() << "[" << idx << "]"; + str_t tmp=this->_name; + char tmpid[64]; + snprintf(tmpid,64, "%d",idx); + tmp.append("[").append(tmpid).append("]");; + setErrorKeyPath(tmp); + return *get_err_unit(); + } + ConfigUnit & ConfigGroup :: operator[] (const char * str) { + return (*this)[str_t(str)]; + } + ConfigUnit & ConfigGroup :: operator[] (const str_t & str) { + ptr_t ptr = fieldMap.find(str); + if(NULL != ptr){ + return *(ptr->second); + } + LOG(INFO) << "Configure: visiting key not found: ConfigGroup[str_t] : " << _name.c_str() << "[" << str.c_str() << "]"; + str_t tmp = this->_name; + if (tmp == CONFIG_GLOBAL){ + tmp = str; + } else { + tmp.append(".").append(str); + } + setErrorKeyPath(tmp); + return *get_err_unit(); + } + ConfigUnit & ConfigGroup :: operator[] (int idx) { + LOG(WARNING) << "Configure: visit ConfigGroup[int] : "<< _name.c_str() << "[" << idx << "]"; + str_t tmp=this->_name; + char tmpid[64]; + snprintf(tmpid,64, "%d",idx); + tmp.append("[").append(tmpid).append("]");; + setErrorKeyPath(tmp); + return *get_err_unit(); + } + ConfigGroup :: ~ConfigGroup(){ + clear(); + if(0 != fieldMap.destroy()) + LOG(WARNING) << "Configure::~CofigGroup() : fieldMap.destory() failed "; + } + void ConfigGroup :: print(int indent) const{//for debug + str_t sec; + get_full_path(sec); + pindent(indent); + printf("Section-------[%s]\n", sec.c_str()); + for(int i = 0; i < (int)fieldList.size(); ++i){ + if(fieldMap.find(fieldList[i])-> second -> selfType() == CONFIG_UNIT_TYPE){ + fieldMap.find(fieldList[i]) -> second -> print(indent + 1); + } + } + for(int i = 0; i < (int)fieldList.size(); ++i){ + if(fieldMap.find(fieldList[i]) -> second -> selfType() == CONFIG_ARRAY_TYPE){ + fieldMap.find(fieldList[i]) -> second -> print(indent + 1); + } + } + for(int i = 0; i < (int)fieldList.size(); ++i){ + if(fieldMap.find(fieldList[i]) -> second -> selfType() == CONFIG_GROUP_TYPE){ + fieldMap.find(fieldList[i]) -> second -> print(indent + 1); + } + } + } + + bsl::var::IVar& ConfigGroup :: to_IVar(bsl::ResourcePool * vpool, ErrCode* errCode)const{ + if(vpool == NULL){ + LOG(WARNING) << "Configure: visit ConfigGroup.to_IVar() failed : NULLBUFFER"; + setErrorKeyPath(this->_name); + popError(errCode, NULLBUFFER); + return bsl::var::Null::null; + } + bsl::var::Dict & dict = vpool->create(); + for(int i = 0; i < (int)fieldList.size(); ++i){ + ConfigUnit * p = fieldMap.find(fieldList[i]) -> second; + bsl::var::IVar & son = p->to_IVar(vpool, errCode); + dict.set( fieldList[i], son ); + } + return dict; + } + + char ConfigGroup :: to_char(ErrCode * errCode)const{ + setErrorKeyPath(this->_name); + popError(errCode, GROUPTOUNIT); + return char(); + } + + unsigned char ConfigGroup :: to_uchar(ErrCode * errCode)const{ + setErrorKeyPath(this->_name); + popError(errCode, GROUPTOUNIT); + return (unsigned char)(0); + } + + int16_t ConfigGroup :: to_int16(ErrCode * errCode)const{ + setErrorKeyPath(this->_name); + popError(errCode, GROUPTOUNIT); + return int16_t(); + } + + u_int16_t ConfigGroup :: to_uint16(ErrCode * errCode)const{ + setErrorKeyPath(this->_name); + popError(errCode, GROUPTOUNIT); + return u_int16_t(); + } + + int ConfigGroup :: to_int32(ErrCode * errCode)const{ + setErrorKeyPath(this->_name); + popError(errCode, GROUPTOUNIT); + return int(); + } + + u_int32_t ConfigGroup :: to_uint32(ErrCode * errCode)const{ + setErrorKeyPath(this->_name); + popError(errCode, GROUPTOUNIT); + return u_int32_t(); + } + + long long ConfigGroup :: to_int64(ErrCode * errCode)const{ + setErrorKeyPath(this->_name); + popError(errCode, GROUPTOUNIT); + return (long long)(0); + } + + unsigned long long ConfigGroup :: to_uint64(ErrCode * errCode)const{ + setErrorKeyPath(this->_name); + popError(errCode, GROUPTOUNIT); + return (unsigned long long)(0); + } + + float ConfigGroup :: to_float(ErrCode * errCode)const{ + setErrorKeyPath(this->_name); + popError(errCode, GROUPTOUNIT); + return float(); + } + + double ConfigGroup :: to_double(ErrCode * errCode)const{ + setErrorKeyPath(this->_name); + popError(errCode, GROUPTOUNIT); + return double(); + } +#if 1 + bsl_string ConfigGroup :: to_bsl_string(ErrCode * errCode)const{ + setErrorKeyPath(this->_name); + popError(errCode, GROUPTOUNIT); + return bsl_string(); + } +#endif + str_t ConfigGroup :: to_raw_string(ErrCode * errCode)const{ + setErrorKeyPath(this->_name); + popError(errCode, GROUPTOUNIT); + return str_t(); + } + const char * ConfigGroup :: to_cstr(ErrCode * errCode)const{ + setErrorKeyPath(this->_name); + popError(errCode, GROUPTOUNIT); + return NULL; + } + + //----------------to_xxx with default value + char ConfigGroup :: to_char(ErrCode * errCode, const char & def)const { + if(errCode){ + *errCode = GROUPTOUNIT; + } + setErrorKeyPath(this->_name); + return def; + } + unsigned char ConfigGroup :: to_uchar(ErrCode * errCode, const unsigned char & def)const{ + setErrorKeyPath(this->_name); + if(errCode){ + *errCode = GROUPTOUNIT; + } + return def; + } + int16_t ConfigGroup :: to_int16(ErrCode * errCode, const int16_t & def)const{ + setErrorKeyPath(this->_name); + if(errCode){ + *errCode = GROUPTOUNIT; + } + return def; + } + u_int16_t ConfigGroup :: to_uint16(ErrCode * errCode, const u_int16_t & def)const{ + setErrorKeyPath(this->_name); + if(errCode){ + *errCode = GROUPTOUNIT; + } + return def; + } + int ConfigGroup :: to_int32(ErrCode * errCode, const int & def)const{ + setErrorKeyPath(this->_name); + if(errCode){ + *errCode = GROUPTOUNIT; + } + return def; + } + u_int32_t ConfigGroup :: to_uint32(ErrCode * errCode, const u_int32_t & def)const{ + setErrorKeyPath(this->_name); + if(errCode){ + *errCode = GROUPTOUNIT; + } + return def; + } + long long ConfigGroup :: to_int64(ErrCode * errCode, const long long & def)const{ + setErrorKeyPath(this->_name); + if(errCode){ + *errCode = GROUPTOUNIT; + } + return def; + } + unsigned long long ConfigGroup :: to_uint64(ErrCode * errCode, const unsigned long long & def)const{ + setErrorKeyPath(this->_name); + if(errCode){ + *errCode = GROUPTOUNIT; + } + return def; + } + float ConfigGroup :: to_float(ErrCode * errCode, const float & def)const{ + setErrorKeyPath(this->_name); + if(errCode){ + *errCode = GROUPTOUNIT; + } + return def; + } + double ConfigGroup :: to_double(ErrCode * errCode, const double & def)const{ + setErrorKeyPath(this->_name); + if(errCode){ + *errCode = GROUPTOUNIT; + } + return def; + } + bsl_string ConfigGroup :: to_bsl_string(ErrCode * errCode, const bsl_string & def)const{ + setErrorKeyPath(this->_name); + if(errCode){ + *errCode = GROUPTOUNIT; + } + return def; + } + str_t ConfigGroup :: to_raw_string(ErrCode * errCode, const str_t & def)const{ + setErrorKeyPath(this->_name); + if(errCode){ + *errCode = GROUPTOUNIT; + } + return def; + } + //获取C风格的字符串(常量) + const char * ConfigGroup :: to_cstr(ErrCode * errCode, const char * def)const{ + setErrorKeyPath(this->_name); + if(errCode){ + *errCode = GROUPTOUNIT; + } + return def; + } + + ErrCode ConfigGroup :: get_char(char * /*valueBuf*/)const{ + setErrorKeyPath(this->_name); + return GROUPTOUNIT; + } + + ErrCode ConfigGroup :: get_uchar(unsigned char * /*valueBuf*/)const{ + setErrorKeyPath(this->_name); + return GROUPTOUNIT; + } + + ErrCode ConfigGroup :: get_int16(int16_t * /*valueBuf*/)const{ + setErrorKeyPath(this->_name); + return GROUPTOUNIT; + } + + ErrCode ConfigGroup :: get_uint16(u_int16_t * /*valueBuf*/)const{ + setErrorKeyPath(this->_name); + return GROUPTOUNIT; + } + + ErrCode ConfigGroup :: get_int32(int * /*valueBuf*/)const{ + setErrorKeyPath(this->_name); + return GROUPTOUNIT; + } + + ErrCode ConfigGroup :: get_uint32(u_int32_t * /*valueBuf*/)const{ + setErrorKeyPath(this->_name); + return GROUPTOUNIT; + } + + ErrCode ConfigGroup :: get_int64(long long * /*valueBuf*/)const{ + setErrorKeyPath(this->_name); + return GROUPTOUNIT; + } + + ErrCode ConfigGroup :: get_uint64(unsigned long long * /*valueBuf*/)const{ + setErrorKeyPath(this->_name); + return GROUPTOUNIT; + } + + ErrCode ConfigGroup :: get_float(float * /*valueBuf*/)const{ + setErrorKeyPath(this->_name); + return GROUPTOUNIT; + } + + ErrCode ConfigGroup :: get_double(double * /*valueBuf*/)const{ + setErrorKeyPath(this->_name); + return GROUPTOUNIT; + } +#if 1 + ErrCode ConfigGroup :: get_bsl_string(bsl_string * /*valueBuf*/)const{ + setErrorKeyPath(this->_name); + return GROUPTOUNIT; + } +#endif + ErrCode ConfigGroup :: get_raw_string(str_t * /*valueBuf*/)const{ + setErrorKeyPath(this->_name); + return GROUPTOUNIT; + } + ErrCode ConfigGroup :: get_cstr(char * /*valueBuf*/, size_t /*len*/)const{ + setErrorKeyPath(this->_name); + return GROUPTOUNIT; + } + + //--------------get_xx with default----------- + + ErrCode ConfigGroup :: get_char(char * valueBuf, const char & def)const{ + setErrorKeyPath(this->_name); + if (valueBuf) { + *valueBuf = def; + } + return GROUPTOUNIT; + } + + ErrCode ConfigGroup :: get_uchar(unsigned char * valueBuf, const unsigned char & def)const{ + setErrorKeyPath(this->_name); + if (valueBuf) { + *valueBuf = def; + } + return GROUPTOUNIT; + } + + ErrCode ConfigGroup :: get_int16(int16_t * valueBuf, const int16_t & def)const{ + setErrorKeyPath(this->_name); + if (valueBuf) { + *valueBuf = def; + } + return GROUPTOUNIT; + } + + ErrCode ConfigGroup :: get_uint16(u_int16_t * valueBuf, const u_int16_t & def)const{ + setErrorKeyPath(this->_name); + if (valueBuf) { + *valueBuf = def; + } + return GROUPTOUNIT; + } + + ErrCode ConfigGroup :: get_int32(int * valueBuf, const int & def)const{ + setErrorKeyPath(this->_name); + if (valueBuf) { + *valueBuf = def; + } + return GROUPTOUNIT; + } + + ErrCode ConfigGroup :: get_uint32(u_int32_t * valueBuf, const u_int32_t & def)const{ + setErrorKeyPath(this->_name); + if (valueBuf) { + *valueBuf = def; + } + return GROUPTOUNIT; + } + + ErrCode ConfigGroup :: get_int64(long long * valueBuf, const long long & def)const{ + setErrorKeyPath(this->_name); + if (valueBuf) { + *valueBuf = def; + } + return GROUPTOUNIT; + } + + ErrCode ConfigGroup :: get_uint64(unsigned long long * valueBuf, const unsigned long long & def)const{ + setErrorKeyPath(this->_name); + if (valueBuf) { + *valueBuf = def; + } + return GROUPTOUNIT; + } + + ErrCode ConfigGroup :: get_float(float * valueBuf, const float & def)const{ + setErrorKeyPath(this->_name); + if (valueBuf) { + *valueBuf = def; + } + return GROUPTOUNIT; + } + + ErrCode ConfigGroup :: get_double(double * valueBuf, const double & def)const{ + setErrorKeyPath(this->_name); + if (valueBuf) { + *valueBuf = def; + } + return GROUPTOUNIT; + } + + ErrCode ConfigGroup :: get_bsl_string(bsl_string * valueBuf, const bsl_string & def)const{ + setErrorKeyPath(this->_name); + if (valueBuf) { + *valueBuf = def; + } + return GROUPTOUNIT; + } + + ErrCode ConfigGroup :: get_raw_string(str_t * valueBuf, const str_t & def)const{ + setErrorKeyPath(this->_name); + if (valueBuf) { + *valueBuf = def; + } + return GROUPTOUNIT; + } + + ErrCode ConfigGroup :: get_cstr(char * valueBuf, size_t len, const char * def)const{ + setErrorKeyPath(this->_name); + if (valueBuf) { + snprintf(valueBuf, len, "%s", def); + } + return GROUPTOUNIT; + } + + const ConfigUnit & ConfigGroup :: get_sub_unit(int index) const { + int susize = (int) fieldMap.size(); + if ((0 > index) || (index >= susize)) { + return *get_err_unit(); + } + ConfigUnit * p = fieldMap.find(fieldList[index]) -> second; + if (NULL == p) { + return *get_err_unit(); + } + return *p; + } + + int ConfigGroup :: equals(const ConfigUnit & conf) const { + try { + const_itr_t itr; + for (itr = fieldMap.begin();itr != fieldMap.end(); ++itr) { + if (0 != itr->second->equals(conf[itr->first])) { + return -1; + } + } + return 0; + } catch (bsl::Exception) { + return -1; + } + return -1; + } + + int ConfigGroup :: add_unit(const bsl_string & key, const bsl_string& value, + const int objtype, int except, ConfigUnit ** ref) { + if (CONFIG_ERROR_TYPE == (*this)[key].selfType()) { + ConfigUnit * tmp = create_unit(key, value, objtype, this); + if (NULL == tmp){ + if (except) { + popError(NULL, CONFIG_ERROR); + } + return CONFIG_ERROR; + } + this->push(key,tmp); + if (NULL != ref) { + *ref = tmp; + } + } else { + if (except) { + if (0 != ul_seterrbuf("%s", "")) { + LOG(WARNING) << "Configure: failed to write error buffer"; + } + popError(NULL, DUPLICATED_KEY); + } + return DUPLICATED_KEY; + } + return 0; + } + int ConfigGroup :: del_unit(const bsl_string & key, int except) { + if (CONFIG_ERROR_TYPE != (*this)[key].selfType()) { + std::vector :: iterator iter; + for ( iter = fieldList.begin(); iter != fieldList.end(); ) + { + if ( *iter == key ) + { + iter = fieldList.erase( iter ); + break; + } + iter++; + } + ConfigUnit * delu = NULL; + ptr_t ptr = fieldMap.find(key); + if(NULL != ptr){ + delu = ptr->second; + fieldMap.erase(ptr->first); + } + if (delu) { + delete delu; + } + } else { + if (except) { + if (0 != ul_seterrbuf("%s", "")) { + LOG(WARNING) << "Configure: failed to write error buffer"; + } + popError(NULL, NOSUCHKEY); + } + return NOSUCHKEY; + } + return 0; + } + int ConfigGroup :: _append_unit(const ConfigUnit & unit,int check, int except) { + int ret = 0; + int i; + int size; + if (this->selfType()!= unit.selfType()) { + ret = ERROR; + goto cpend; + } + size = unit.size(); + + if (check) { + for (i=0; i< size; ++i) { + const comcfg::ConfigUnit & su = unit.get_sub_unit(i); + if (CONFIG_ERROR_TYPE == su.selfType()) { + ret = ERROR; + goto cpend; + } + if (CONFIG_ERROR_TYPE != (*this)[su.get_key_name()].selfType()) { + bsl_string ep = this->_name; + ep.append(su.get_key_name()); + setErrorKeyPath(ep); + ret = DUPLICATED_KEY; + goto cpend; + } + } + } + + for (i=0; i< size; ++i) { + const comcfg::ConfigUnit & subunit = unit.get_sub_unit(i); + switch (subunit.selfType()) { + case comcfg :: CONFIG_ERROR_TYPE: + ret = ERROR; + break; + case comcfg :: CONFIG_ARRAY_TYPE: + case comcfg :: CONFIG_GROUP_TYPE: + ConfigUnit * adu; + ret = add_unit(subunit.get_key_name(), "", subunit.selfType(), 0, &adu); + if (0 == ret) { + ret = adu->_append_unit(subunit,0, except); + } + if (0 != ret) { + goto cpend; + } + break; + case comcfg :: CONFIG_UNIT_TYPE: + ret = add_unit(subunit.get_key_name(), subunit.to_raw_string(), subunit.selfType()); + if (0 != ret) { + goto cpend; + } + break; + default: + ret = ERROR; + break; + } + if (0 != ret) { + break; + } + } + + cpend: + if (except && (0 != ret)) { + if (0 != ul_seterrbuf("%s", "")) { + LOG(WARNING) << "ConfigUnit: failed to write error buffer"; + } + popError(NULL, ERROR); + } + return ret; + } + + void ConfigGroup :: clear() { + itr_t itr = fieldMap.begin(); + while(itr != fieldMap.end()){ + delete itr->second; + ++itr; + } + fieldMap.clear(); + fieldList.clear(); + } + + int ConfigGroup :: copy_unit(const ConfigUnit & unit, int except){ + int ret =0; + if (this->selfType()!= unit.selfType()) { + ret = ERROR; + goto cpend; + } + clear(); + return _append_unit(unit, 1, except); + cpend: + if (except && (0 != ret)) { + if (0 != ul_seterrbuf("%s", "")) { + LOG(WARNING) << "ConfigUnit: failed to write error buffer"; + } + popError(NULL, ERROR); + } + return ret; + } + int ConfigGroup::printGroup(){ + if(_dupLevel == GROUP_DUP_LEVEL0){ + return 0; + } + size_t threshold = 2; + if(_dupLevel == GROUP_DUP_LEVEL3){ + threshold = 1; + } + int dupNum = 0; + for(dup_itr itr=_dupMap.begin(); itr!=_dupMap.end(); itr++){ + if(itr->second.size() >= threshold){ + ++ dupNum ; + } + } + LOG(INFO) << "ConfigGroup: There are " << dupNum << " (duplicate) group names in total:"; + for(dup_itr itr=_dupMap.begin(); itr!=_dupMap.end(); itr++){ + const char *groupName = ((ConfigGroup*)itr->first)->getName(); + const int groupDepth = ((ConfigGroup *)itr->first)->getLevel(); + dup_vector &dvec = itr->second; + if(dvec.size() >= threshold){ + for(size_t i=0; i_name; + } + + /** + * @brief 比较是否相等 + * + * @return int 0表示相等 -1不相等 + * @author zhang_rui + **/ + virtual int equals(const ConfigUnit & conf) const; + /** + * @brief 增加一个子unit + * + * @return int 0 成功,其他是错误号 + * @author zhang_rui + **/ + virtual int add_unit(const bsl_string & key, const bsl_string& value, + const int objtype=CONFIG_UNIT_TYPE,int except=0, ConfigUnit ** ref=NULL); + + /** + * @brief 删除一个unit + * + * @return int 0 成功,其他是错误号 + * @author zhang_rui + **/ + virtual int del_unit(const bsl_string & key, int except=0); + /** + * @brief 复制一个unit, 深拷贝 + * + * 将unit的内容复制到本对象。 + * 类型需要匹配,只能从group复制到group,array复制到array + * @return int 0 成功,其他是错误号 + * @author zhang_rui + **/ + virtual int copy_unit(const ConfigUnit & unit, int except=0); + protected: + friend class Reader; + friend class Constraint; + friend class Configure; + friend class ConfigUnit; + friend class CFdefault; + void create(const char * __name, ConfigGroup * __father = NULL); + ConfigUnit * relativeSection(ConfigUnit *globalSec, str_t str, int * depth); + int push(const str_t& key, ConfigUnit* unit); + const char * getName() const{ + return _name.c_str(); + } + virtual int selfType() const{ + return CONFIG_GROUP_TYPE; + } + int getLevel() const{ + return _level; + } + + int _level; + + //ConfigGroup * _father; + str_t _name; + std::vector fieldList; + typedef bsl::hashmap :: iterator itr_t; + typedef bsl::hashmap :: const_iterator const_itr_t; + typedef bsl::hashmap :: _Pair * ptr_t; + bsl::hashmap fieldMap; + + /** + * @brief 清除内容 + * + * @return void + * @author zhang_rui + **/ + virtual void clear(); + + /* + * @brief 根据_dupLevel允许的重名等级打印group名 + * + * @return 0,正常;DUPLICATED_GROUP,存在重名的group + 在_dupLevel为GROUP_DUP_LEVEL0或GROUP_DUP_LEVEL3时,返回0 + * @author Lin_jieqiong + */ + int printGroup(); + struct dup_position{ + str_t file; + int line; + }; + typedef std::vector dup_vector; + typedef bsl::hashmap :: iterator dup_itr; + typedef bsl::hashmap :: _Pair * dup_ptr; + + bsl::hashmap _dupMap; + int _dupLevel; + public: + /** + * @brief 复制一个group的子unit, 深拷贝 + * + * @return int 0 成功,其他是错误号 + * @author zhang_rui + **/ + virtual int _append_unit(const ConfigUnit & unit,int check=1, int except=0); + + }; + +} + + + + + + + + + + + + + + + + +#endif //__CONFIGGROUP_H_ + +/* vim: set ts=4 sw=4 sts=4 tw=100 */ diff --git a/configure/ConfigReloader.cpp b/configure/ConfigReloader.cpp new file mode 100644 index 0000000000000000000000000000000000000000..a118c0039f017dbb079224479044c368e45b223e --- /dev/null +++ b/configure/ConfigReloader.cpp @@ -0,0 +1,521 @@ +/*************************************************************************** + * + * Copyright (c) 2010 Baidu.com, Inc. All Rights Reserved + * + **************************************************************************/ + + + +/** + * @file ConfigReloader.cpp + * @author zhang_rui(com@baidu.com) + * @date 2010-1-21 + * @brief + * + **/ + + +#include "ConfigReloader.h" +#include +#include + +static const int hashmap_bitems = 256; + +namespace comcfg { + +#define COMCFG_SAFEFREE(obj) do {if (NULL != (obj)) { delete (obj); (obj)=NULL; }} while(0) + +ConfigReloader :: ConfigReloader() : _finit(0), _last_modify(0) { + _config[0] = 0; + _config[1] = 0; + _config_curid = 0; + _load_param.filename = ""; + _load_param.rangename = ""; + _load_param.path = ""; + _load_param.version = CONFIG_VERSION_1_0; + + _chrcbmap.create(hashmap_bitems); + _strcbmap.create(hashmap_bitems); + _intcbmap.create(hashmap_bitems); + _uint64cbmap.create(hashmap_bitems); + _floatcbmap.create(hashmap_bitems); + _groupcbmap.create(hashmap_bitems); +} + +/** + * @brief 设定要监控的配置文件 + * + * @param [in] path : const char* 配置文件的路径 + * @param [in] conf : const char* 配置文件名 + * @param [in] range : const char* 约束文件,约束文件不进行更新检查 + * @param [in] version : int 文件格式的版本(暂未使用) + * @return int 0表示成功,其余为失败 + **/ +int ConfigReloader :: init(const char * path, const char * conf, + const char * range, int version) { + if(path == NULL || conf == NULL){ + LOG(WARNING) << "ConfigReloader.init : path or filename error..."; + return -1; + } + if (_finit) { + LOG(WARNING) << "ConfigReloader.init : already init. Can not init twice."; + return -1; + } + _load_param.filename = conf; + if (NULL != range) { + _load_param.rangename = range; + } else { + _load_param.rangename = ""; + } + _load_param.path = path; + _load_param.version = version; + int ret=0; + _config[_config_curid] = new comcfg::Configure; + ret = _config[_config_curid]->load(path, conf,range,version); + if (0 != ret) { + COMCFG_SAFEFREE(_config[_config_curid]); + return ret; + } + _last_modify = _config[_config_curid]->lastConfigModify(); + if (0 == _last_modify) { + LOG(WARNING) << "ConfigReloader.init : get last modify time error..."; + COMCFG_SAFEFREE(_config[_config_curid]); + return -1; + } + if (0 == ret) { + _finit = 1; + } + return ret; +} + +int ConfigReloader :: _add_key_monitor(config_monmap_t * map, const char * key, + key_change_cb_t proc, void * prm) { + if(key == NULL || NULL == proc){ + LOG(WARNING) << "ConfigReloader._add_key_monitor : NULL key or callback"; + return -1; + } + bsl::string kstr = key; + config_monitor_t * pmon = new config_monitor_t; + pmon->callback = proc; + pmon->param = prm; + config_monmap_pr_t ptr; + ptr = map->find(kstr); + if(NULL != ptr) { + if (NULL != ptr->second) { + delete ptr->second; + } + map->erase(ptr->first); + LOG(WARNING) << "ConfigReloader._add_key_monitor : " + "same key exist, update callback("<< proc << "), param(" << prm << ")"; + } + (*map).set(kstr, pmon, 1); + return 0; +} + +int ConfigReloader :: reload() { + int nextid = (_config_curid + 1) % 2; + COMCFG_SAFEFREE(_config[nextid]); + _config[nextid] = new comcfg :: Configure; + int ret = _config[nextid]->load(_load_param.path.c_str(), _load_param.filename.c_str(), + _load_param.rangename.c_str(), _load_param.version); + if (0 != ret) { + COMCFG_SAFEFREE(_config[nextid]); + return -1; + } + _config_curid = nextid; + return ret; +} + +int ConfigReloader :: check() { + int oldid = (_config_curid + 1) % 2; + try { + int ret = 0; + bsl::hashmap :: iterator itr; + //先检查合法 + for(itr = _chrcbmap.begin(); itr != _chrcbmap.end(); ++itr){ + _config[_config_curid]->deepGet(itr->first).to_char(); + } + for (itr = _strcbmap.begin(); itr != _strcbmap.end(); ++itr) { + _config[_config_curid]->deepGet(itr->first).to_bsl_string(); + } + for (itr = _intcbmap.begin(); itr != _intcbmap.end(); ++itr) { + _config[_config_curid]->deepGet(itr->first).to_int64(); + } + for (itr = _uint64cbmap.begin(); itr != _uint64cbmap.end(); ++itr) { + _config[_config_curid]->deepGet(itr->first).to_uint64(); + } + for (itr = _floatcbmap.begin(); itr != _floatcbmap.end(); ++itr) { + _config[_config_curid]->deepGet(itr->first).to_double(); + } + for (itr = _groupcbmap.begin(); itr != _groupcbmap.end(); ++itr) { + int ty = _config[_config_curid]->deepGet(itr->first).selfType(); + if (CONFIG_GROUP_TYPE != ty && CONFIG_ARRAY_TYPE != ty) { + LOG(WARNING) << "ConfigReloader.add_group_monitor :" + " (" << itr->first.c_str() << ") is not group or array"; + return -1; + } + } + + + //再检查数据是否改变 + for(itr = _chrcbmap.begin(); itr != _chrcbmap.end(); ++itr){ + if (NULL != itr->second) { + config_monitor_t * pmon = (config_monitor_t *) (itr->second); + if (_config[_config_curid]->deepGet(itr->first).to_char() != + _config[oldid]->deepGet(itr->first).to_char()) { + pmon->callback(_config[oldid]->deepGet(itr->first), + _config[_config_curid]->deepGet(itr->first), pmon->param); + ++ret; + } + } + } + for (itr = _strcbmap.begin(); itr != _strcbmap.end(); ++itr) { + if (NULL != itr->second) { + config_monitor_t * pmon = (config_monitor_t *) (itr->second); + if (_config[_config_curid]->deepGet(itr->first).to_bsl_string() + != _config[oldid]->deepGet(itr->first).to_bsl_string()) { + pmon->callback(_config[oldid]->deepGet(itr->first), + _config[_config_curid]->deepGet(itr->first), + pmon->param); + ++ret; + } + } + } + for (itr = _intcbmap.begin(); itr != _intcbmap.end(); ++itr) { + if (NULL != itr->second) { + config_monitor_t * pmon = (config_monitor_t *) (itr->second); + if (_config[_config_curid]->deepGet(itr->first).to_int64() + != _config[oldid]->deepGet(itr->first).to_int64()) { + pmon->callback(_config[oldid]->deepGet(itr->first), + _config[_config_curid]->deepGet(itr->first), + pmon->param); + ++ret; + } + } + } + for (itr = _uint64cbmap.begin(); itr != _uint64cbmap.end(); ++itr) { + if (NULL != itr->second) { + config_monitor_t * pmon = (config_monitor_t *) (itr->second); + if (_config[_config_curid]->deepGet(itr->first).to_uint64() + != _config[oldid]->deepGet(itr->first).to_uint64()) { + pmon->callback(_config[oldid]->deepGet(itr->first), + _config[_config_curid]->deepGet(itr->first), + pmon->param); + ++ret; + } + } + } + for (itr = _floatcbmap.begin(); itr != _floatcbmap.end(); ++itr) { + if (NULL != itr->second) { + config_monitor_t * pmon = (config_monitor_t *) (itr->second); + if (_config[_config_curid]->deepGet(itr->first).to_double() + != _config[oldid]->deepGet(itr->first).to_double()) { + pmon->callback(_config[oldid]->deepGet(itr->first), + _config[_config_curid]->deepGet(itr->first), + pmon->param); + ++ret; + } + } + } + for (itr = _groupcbmap.begin(); itr != _groupcbmap.end(); ++itr) { + if (NULL != itr->second) { + config_monitor_t * pmon = (config_monitor_t *) (itr->second); + if (0 != _config[_config_curid]->deepGet(itr->first) + .equals(_config[oldid]->deepGet(itr->first)) ) { + pmon->callback(_config[oldid]->deepGet(itr->first), + _config[_config_curid]->deepGet(itr->first), + pmon->param); + ++ret; + } + } + } + for(int i = 0; i < (int)_filecblist.size(); ++i){ + config_monitor_t * pmon = _filecblist[i]; + if (NULL != pmon && NULL!= pmon->callback) { + pmon->callback(*(_config[oldid]), *(_config[_config_curid]), pmon->param); + ++ret; + } + } + return ret; + } catch (bsl::Exception &e) { + LOG(WARNING) << "ConfigReloader.check : error(" << e.what() << ")"; + return -1; + } catch (...) { + LOG(WARNING) << "ConfigReloader.check : unknown error"; + return -1; + } + LOG(WARNING) << "ConfigReloader.check : unknown error, the codes lost road."; + return -1; +} + +/** + * @brief 检查配置文件是否发生变化。 + * + * @return int 0表示配置没有不安化,1表示配置发生了变化并进行了通知,-1表示更新后的配置内容错误或约束错误。 + * -2表示其他错误 + **/ +int ConfigReloader :: monitor() { + if (NULL == _config[_config_curid]) { + LOG(WARNING) << "ConfigReloader.monitor : NULL config(" << _config_curid << "), init failed?"; + return -2; + } + time_t modtime = _config[_config_curid]->lastConfigModify(); + if (modtime > _last_modify) { + if (0 != reload()) { + LOG(WARNING) << "ConfigReloader.monitor : reload error("<< _load_param.filename.c_str() << ")"; + return -1; + } + int ret = check(); + if (-1 == ret) { + LOG(WARNING) << "ConfigReloader.monitor : check error(" << _load_param.filename.c_str() << ")"; + int oldid = _config_curid; + _config_curid = (_config_curid + 1) % 2; + + COMCFG_SAFEFREE(_config[oldid]); + return -2; + } + _last_modify = modtime; + return ret; + } else { + return 0; + } + LOG(WARNING) << "ConfigReloader.monitor : unknown error(" << _load_param.filename.c_str() << ")"; + return -2; +} +/** + * @brief 增加要监控的整数key + * + * @param [in] key : const char* 配置项的全路径 + * @param [in] proc : key_change_cb_t 处理回调函数 + * @return int 0表示成功,-1为失败 + **/ +int ConfigReloader :: add_key_int(const char * key, key_change_cb_t proc, void * prm) { + try { + if (NULL == key) { + LOG(WARNING) << "ConfigReloader.add_key_int : NULL key."; + return -1; + } + if (NULL == _config[_config_curid]) { + LOG(WARNING) << "ConfigReloader.add_key_int : NULL config. init failed?"; + return -1; + } + _config[_config_curid]->deepGet(key).to_int64(); + } catch (bsl::Exception &e) { + LOG(WARNING) << "ConfigReloader.add_key_int : error(" << e.what() << ")"; + return -1; + } catch (...) { + LOG(WARNING) << "ConfigReloader.add_key_int : unknown error"; + return -1; + } + return _add_key_monitor(&_intcbmap, key, proc, prm); +} +/** + * @brief 增加要监控的uint64 key + * + * @param [in] key : const char* 配置项的全路径 + * @param [in] proc : key_change_cb_t 处理回调函数 + * @return int 0表示成功,-1为失败 + **/ +int ConfigReloader :: add_key_uint64(const char * key, key_change_cb_t proc, void * prm) { + try { + if (NULL == key) { + LOG(WARNING) << "ConfigReloader.add_key_uint64 : NULL key."; + return -1; + } + if (NULL == _config[_config_curid]) { + LOG(WARNING) << "ConfigReloader.add_key_uint64 : NULL config. init failed?"; + return -1; + } + _config[_config_curid]->deepGet(key).to_uint64(); + } catch (bsl::Exception &e) { + LOG(WARNING) << "ConfigReloader.add_key_uint64 : error(" << e.what() << ")"; + return -1; + } catch (...) { + LOG(WARNING) << "ConfigReloader.add_key_uint64 : unknown error"; + return -1; + } + return _add_key_monitor(&_uint64cbmap, key, proc, prm); +} +/** + * @brief 增加要监控的浮点类型key + * + * @param [in] key : const char* 配置项的全路径 + * @param [in] proc : key_change_cb_t 处理回调函数 + * @return int 0表示成功,-1为失败 + **/ +int ConfigReloader :: add_key_float(const char * key, key_change_cb_t proc, void * prm) { + try { + if (NULL == key) { + LOG(WARNING) << "ConfigReloader.add_key_float : NULL key."; + return -1; + } + if (NULL == _config[_config_curid]) { + LOG(WARNING) << "ConfigReloader.add_key_float : NULL config. init failed?"; + return -1; + } + _config[_config_curid]->deepGet(key).to_double(); + } catch (bsl::Exception &e) { + LOG(WARNING) << "ConfigReloader.add_key_float : error(" << e.what() << ")"; + return -1; + } catch (...) { + LOG(WARNING) << "ConfigReloader.add_key_float : unknown error"; + return -1; + } + return _add_key_monitor(&_floatcbmap, key, proc, prm); +} +/** + * @brief 增加要监控的字符key + * + * @param [in] key : const char* 配置项的全路径 + * @param [in] proc : key_change_cb_t 处理回调函数 + * @return int 0表示成功,-1为失败 + **/ +int ConfigReloader :: add_key_char(const char * key, key_change_cb_t proc, void * prm) { + try { + if (NULL == key) { + LOG(WARNING) << "ConfigReloader.add_key_char : NULL key."; + return -1; + } + if (NULL == _config[_config_curid]) { + LOG(WARNING) << "ConfigReloader.add_key_char : NULL config. init failed?"; + return -1; + } + _config[_config_curid]->deepGet(key).to_char(); + } catch (bsl::Exception &e) { + LOG(WARNING) << "ConfigReloader.add_key_char : error(" << e.what() << ")"; + return -1; + } catch (...) { + LOG(WARNING) << "ConfigReloader.add_key_char : unknown error"; + return -1; + } + return _add_key_monitor(&_chrcbmap, key, proc, prm); +} +/** + * @brief 增加要监控的字符串key + * + * @param [in] key : const char* 配置项的全路径 + * @param [in] proc : key_change_cb_t 处理回调函数 + * @return int 0表示成功,-1为失败 + **/ +int ConfigReloader :: add_key_string(const char * key, key_change_cb_t proc, void * prm) { + try { + if (NULL == key) { + LOG(WARNING) << "ConfigReloader.add_key_string : NULL key."; + return -1; + } + if (NULL == _config[_config_curid]) { + LOG(WARNING) << "ConfigReloader.add_key_string : NULL config. init failed?"; + return -1; + } + _config[_config_curid]->deepGet(key).to_bsl_string(); + } catch (bsl::Exception &e) { + LOG(WARNING) << "ConfigReloader.add_key_string : error(" << e.what() << ")"; + return -1; + } catch (...) { + LOG(WARNING) << "ConfigReloader.add_key_string : unknown error"; + return -1; + } + return _add_key_monitor(&_strcbmap, key, proc, prm); +} +/** + * @brief 增加监控[group]的回调 + * + * @param [in] group : const char* 配置项的全路径 + * @param [in] proc : key_change_cb_t 处理回调函数 + * @return int 0表示成功,-1为失败 + **/ +int ConfigReloader :: add_group_monitor(const char * group, key_change_cb_t proc, void * prm) { + try { + if (NULL == group) { + LOG(WARNING) << "ConfigReloader.add_group_monitor : NULL key."; + return -1; + } + if (NULL == _config[_config_curid]) { + LOG(WARNING) << "ConfigReloader.add_group_monitor : NULL config. init failed?"; + return -1; + } + int ty =_config[_config_curid]->deepGet(group).selfType(); + if (CONFIG_GROUP_TYPE != ty && CONFIG_ARRAY_TYPE != ty) { + LOG(WARNING) << "ConfigReloader.add_group_monitor :" + " (" << group << ") is not group or array"; + return -1; + } + } catch (bsl::Exception &e) { + LOG(WARNING) << "ConfigReloader.add_group_monitor : error(" << e.what() << ")"; + return -1; + } catch (...) { + LOG(WARNING) << "ConfigReloader.add_group_monitor : unknown error"; + return -1; + } + return _add_key_monitor(&_groupcbmap, group, proc, prm); +} +/** + * @brief 增加监控整个文件的回调 + * + * @param [in] proc : key_change_cb_t 处理回调函数 + * @return int 0表示成功,-1为失败 + **/ +int ConfigReloader :: add_file_monitor(key_change_cb_t proc, void * prm) { + if (NULL == _config[_config_curid]) { + LOG(WARNING) << "ConfigReloader.add_file_monitor : NULL config. init failed?"; + return -1; + } + if(NULL == proc) { + LOG(WARNING) << "ConfigReloader.add_file_monitor : NULL callback"; + return -1; + } + + for(int i = 0; i < (int)_filecblist.size(); ++i){ + config_monitor_t * pmon = _filecblist[i]; + if (NULL != pmon && proc == pmon->callback) { + pmon->param = prm; + LOG(WARNING) << "ConfigReloader.add_file_monitor : " + "same callback exist, updated param to " << prm; + return -1; + } + } + + config_monitor_t * pmon = new config_monitor_t; + pmon->callback = proc; + pmon->param = prm; + _filecblist.push_back(pmon); + return 0; +} + +Configure * ConfigReloader :: get_config() { + return _config[_config_curid]; +} + + +void ConfigReloader :: _free_map(bsl::hashmap *map) { + bsl::hashmap::iterator itr; + for(itr = map->begin(); itr != map->end(); ++itr) { + if (NULL != itr->second) { + delete itr->second; + } + } + if(0 != map->destroy()) + LOG(WARNING) << "ConfigReloader._free_map : " + "map->destory() failed "; +} + +void ConfigReloader :: _free_list(std::vector *list) { + for(int i = 0; i < (int)list->size(); ++i){ + if (NULL != (*list)[i]) { + delete (*list)[i]; + } + } +} +ConfigReloader :: ~ConfigReloader() { + _free_map(&_chrcbmap); + _free_map(&_strcbmap); + _free_map(&_intcbmap); + _free_map(&_uint64cbmap); + _free_map(&_floatcbmap); + _free_map(&_groupcbmap); + _free_list(&_filecblist); + COMCFG_SAFEFREE(_config[0]); + COMCFG_SAFEFREE(_config[1]); +} + +}//namespace comcfg diff --git a/configure/ConfigReloader.h b/configure/ConfigReloader.h new file mode 100644 index 0000000000000000000000000000000000000000..edda8b08720ed456e3661c399376a78cbf2ad255 --- /dev/null +++ b/configure/ConfigReloader.h @@ -0,0 +1,179 @@ +/*************************************************************************** + * + * Copyright (c) 2010 Baidu.com, Inc. All Rights Reserved + * + **************************************************************************/ + + + +/** + * @file ConfigReloader.h + * @author zhang_rui(com@baidu.com) + * @date 2010-1-21 + * @brief + * + **/ + + +#ifndef CONFIGRELOADER_H_ +#define CONFIGRELOADER_H_ + +#include "Configure.h" + +namespace comcfg { + +typedef int (*key_change_cb_t)(const ConfigUnit &keyold, \ + const ConfigUnit &keynew, void * prm); /**< 处理配置项变更的回调函数类型 */ + +typedef struct _load_param_t { + bsl::string path; /**< 路径 */ + bsl::string filename; /**< 配置文件 */ + bsl::string rangename; /**< 约束文件 */ + int version; /**< 版本 */ +}load_param_t ; + +typedef struct _config_monitor_t { + key_change_cb_t callback; + void * param; +} config_monitor_t; + +class ConfigReloader { + typedef bsl::hashmap config_monmap_t; + typedef bsl::hashmap :: iterator config_monmap_itr_t; + typedef bsl::hashmap :: _Pair* config_monmap_pr_t; +private: + int _finit; /**< 初始化标志 */ + load_param_t _load_param; /**< load 参数 */ + Configure * _config[2]; /**< configure对象,原文件和更新文件 */ + int _config_curid; /**< load 参数 */ + time_t _last_modify; /**< 最近修改时间 */ + std::vector _filecblist; /**< 处理文件变更的回调 */ + bsl::hashmap _chrcbmap; /**< 存储监控的字符key和回调 */ + bsl::hashmap _strcbmap; /**< 存储监控的字符串key和回调 */ + bsl::hashmap _intcbmap; /**< 存储监控的整数key和回调 */ + bsl::hashmap _uint64cbmap; /**< 存储监控的浮点key和回调 */ + bsl::hashmap _floatcbmap; /**< 存储监控的浮点key和回调 */ + bsl::hashmap _groupcbmap; /**< 存储监控的group和回调 */ + + /** + * @brief 增加一个监控回调到map中 + * + * @param [in] key : const char* 配置项的全路径 + * @param [in] proc : key_change_cb_t 处理回调函数 + * @param [in] prm : 参数 + * @return int 0表示成功,-1为失败 + **/ + int _add_key_monitor(config_monmap_t * map, const char * key, key_change_cb_t proc, void * prm); + /** + * @brief 释放存储的数据 + * + * @param [in] map : bsl::hashmap + * @return void + **/ + void _free_map(bsl::hashmap *map); + /** + * @brief 释放存储的数据 + * + * @param [in] map : bsl::hashmap + * @return void + **/ + void _free_list(std::vector *list); + + /** + * @brief 重新载入configure文件 + * @return int 0表示成功 其他失败 + **/ + int reload(); + /** + * @brief 检查各个监控值。 + * @return int 0表示配置没有检查项,>=1表示配置发生了变化并进行了通知,-1表示错误。 + **/ + int check(); +public : + /** + * @brief 设定要监控的配置文件 + * + * @param [in] path : const char* 配置文件的路径 + * @param [in] conf : const char* 配置文件名 + * @param [in] range : const char* 约束文件,约束文件不进行更新检查 + * @param [in] version : int 文件格式的版本(暂未使用) + * @return int 0表示成功,其余为失败 + **/ + int init(const char * path, const char * conf, const char * range = NULL, int version = CONFIG_VERSION_1_0); + /** + * @brief 检查配置文件是否发生变化。 + * + * @return int 0表示配置没有不安化,正数表示配置发生了变化并进行了通知的回调个数,-1表示更新后的配置内容错误或约束错误。 + * -2表示其他错误 + **/ + int monitor(); + /** + * @brief 增加要监控的整数key + * + * @param [in] key : const char* 配置项的全路径 + * @param [in] proc : key_change_cb_t 处理回调函数 + * @return int 0表示成功,-1为失败 + **/ + int add_key_int(const char * key, key_change_cb_t proc, void * prm); + /** + * @brief 增加要监控的uint64 key + * + * @param [in] key : const char* 配置项的全路径 + * @param [in] proc : key_change_cb_t 处理回调函数 + * @return int 0表示成功,-1为失败 + **/ + int add_key_uint64(const char * key, key_change_cb_t proc, void * prm); + /** + * @brief 增加要监控的浮点类型key + * + * @param [in] key : const char* 配置项的全路径 + * @param [in] proc : key_change_cb_t 处理回调函数 + * @return int 0表示成功,-1为失败 + **/ + int add_key_float(const char * key, key_change_cb_t proc, void * prm); + /** + * @brief 增加要监控的字符key + * + * @param [in] key : const char* 配置项的全路径 + * @param [in] proc : key_change_cb_t 处理回调函数 + * @return int 0表示成功,-1为失败 + **/ + int add_key_char(const char * key, key_change_cb_t proc, void * prm); + /** + * @brief 增加要监控的字符串key + * + * @param [in] key : const char* 配置项的全路径 + * @param [in] proc : key_change_cb_t 处理回调函数 + * @return int 0表示成功,-1为失败 + **/ + int add_key_string(const char * key, key_change_cb_t proc, void * prm); + /** + * @brief 增加监控[group]的回调 + * + * @param [in] group : const char* 配置项的全路径 + * @param [in] proc : key_change_cb_t 处理回调函数 + * @return int 0表示成功,-1为失败 + **/ + int add_group_monitor(const char * group, key_change_cb_t proc, void * prm); + /** + * @brief 增加监控整个文件的回调 + * + * @param [in] proc : key_change_cb_t 处理回调函数 + * @return int 0表示成功,-1为失败 + **/ + int add_file_monitor(key_change_cb_t proc, void * prm); + /** + * @brief 获取当前的configure + **/ + Configure * get_config(); + + ConfigReloader(); + ~ConfigReloader(); +}; + + + +}//namespace comcfg + + +#endif /* CONFIGRELOADER_H_ */ diff --git a/configure/ConfigUnit.cpp b/configure/ConfigUnit.cpp new file mode 100644 index 0000000000000000000000000000000000000000..2808ae8ea96f9e0530c0414f90da9664088f420a --- /dev/null +++ b/configure/ConfigUnit.cpp @@ -0,0 +1,1017 @@ +/*************************************************************************** + * + * Copyright (c) 2008 Baidu.com, Inc. All Rights Reserved + * $Id: ConfigUnit.cpp,v 1.16 2010/04/13 09:59:41 scmpf Exp $ + * + **************************************************************************/ + + + +/** + * @file ConfigUnit.cpp + * @author yingxiang(com@baidu.com) + * @date 2008/12/21 20:26:57 + * @version $Revision: 1.16 $ + * @brief + * + **/ + +#include "ConfigUnit.h" +#include "ConfigError.h" +#include "ConfigArray.h" + +#include "utils/cc_utils.h" +#include "reader/Reader.h" +#include "bsl/var/String.h" +namespace comcfg{ + + ConfigUnit * ConfigUnit :: get_err_unit() { + static ConfigUnit* g_err_unit = NULL; + if (NULL == g_err_unit) { + g_err_unit = new ConfigError(); + } + return g_err_unit; + } + + class ErrorUnitControl { + private: + static int _needfree; + public: + ErrorUnitControl() { + ConfigUnit :: get_err_unit(); + } + ~ErrorUnitControl() { + if (_needfree) { + _needfree =0; + ConfigUnit *eu = ConfigUnit :: get_err_unit(); + delete eu; + } + } + }; + + int ErrorUnitControl::_needfree = 1; + + static ErrorUnitControl err_unit_control; + + //Reader * g_cur_reader = NULL; + //str_t ConfigUnit :: g_unknown = "Unknown"; + + const ConfigUnit & ConfigUnit :: operator[] (const char * str) const { + if (selfType() == CONFIG_UNIT_TYPE) { + LOG(INFO) << "Configure: visit ConfigUnit[char *] : " << _key.c_str() << "[" << str << "]"; + str_t tmp=this->_key; + tmp.append(".").append(str); + setErrorKeyPath(tmp); + } + return *get_err_unit(); + } + const ConfigUnit & ConfigUnit :: operator[] (const str_t & str) const{ + if (selfType() == CONFIG_UNIT_TYPE) { + LOG(INFO) << "Configure: visit ConfigUnit[str_t] : " << _key.c_str() << "[" << str.c_str() << "]"; + str_t tmp=this->_key; + tmp.append(".").append(str); + setErrorKeyPath(tmp); + } + return *get_err_unit(); + } + const ConfigUnit & ConfigUnit :: operator[] (int idx) const{ + if (selfType() == CONFIG_UNIT_TYPE) { + LOG(INFO) << "Configure: visit ConfigUnit[int] : " << _key.c_str() << "[" << idx << "]"; + str_t tmp=this->_key; + char tmpid[64]; + snprintf(tmpid,64, "%d",idx); + tmp.append("[").append(tmpid).append("]");; + setErrorKeyPath(tmp); + } + return *get_err_unit(); + } + ConfigUnit & ConfigUnit :: operator[] (const char * str) { + if (selfType() == CONFIG_UNIT_TYPE) { + LOG(INFO) << "Configure: visit ConfigUnit[char *] : " << _key.c_str() << "[" << str << "]"; + str_t tmp=this->_key; + tmp.append(".").append(str); + setErrorKeyPath(tmp); + } + return *get_err_unit(); + } + ConfigUnit & ConfigUnit :: operator[] (const str_t & str) { + if (selfType() == CONFIG_UNIT_TYPE) { + LOG(INFO) << "Configure: visit ConfigUnit[str_t] : " << _key.c_str() << "[" << str.c_str() << "]"; + str_t tmp=this->_key; + tmp.append(".").append(str); + setErrorKeyPath(tmp); + } + return *get_err_unit(); + } + ConfigUnit & ConfigUnit :: operator[] (int idx) { + if (selfType() == CONFIG_UNIT_TYPE) { + LOG(INFO) << "Configure: visit ConfigUnit[int] : " << _key.c_str() << "[" << idx << "]"; + str_t tmp=this->_key; + char tmpid[64]; + snprintf(tmpid,64, "%d",idx); + tmp.append("[").append(tmpid).append("]");; + setErrorKeyPath(tmp); + } + return *get_err_unit(); + } + + ConfigUnit & ConfigUnit :: operator= (ConfigUnit & unit) { + copy_unit(unit, 1); + return *this; + } + ConfigUnit :: ConfigUnit(): _key(""), _at_file ("NULL"), _at_line(-1), _father(NULL), _bConstrainted(false) { + } + ConfigUnit :: ConfigUnit(const str_t& __key, const str_t& __value, const Reader * __cur_reader, ConfigGroup * father) + : _at_file("NULL"), _at_line(-1){ + for(int i = 0; i < (int)__key.size(); ++i){ + if(i == 0 && __key[i] == '@'){ + continue; + } + if((!isalpha(__key[i])) && (!isdigit(__key[i])) && __key[i] != '_'){ + LOG(WARNING) << "Unsupport _key format [" << __key.c_str() << "]"; + throw ConfigException(); + } + } + _key = __key; + _value = __value; + _cstr = _value; + _cstr_err = 0; + _father = father; + _bConstrainted = false; + if(__cur_reader != NULL){ + //如果这个reader被释放了,_at_file就会指向非法内存片 + setFilePosition(__cur_reader->_cur_file.c_str(), __cur_reader->_cur_line); + } + if(_value.size() > 0 && _value[0] == '"'){ + _cstr_err = Trans :: str2str(_value, &_cstr); + if(_cstr_err){ + LOG(WARNING) << "Config : Error format : _key[" << _key.c_str() << "] _value[" << _value.c_str() << "]"; + } + } + } + + const char * ConfigUnit :: seeError(const ErrCode & err)const{ + switch(err){ + case ERROR : + return "Something error"; + case OK : + return "OK"; + case FORMATERROR : + return "Format error"; + case OUTOFRANGE : + return "Out of range"; + case NULLVALUE : + return "Value is null"; + case NULLBUFFER : + return "Given buffer is null"; + case NOSUCHKEY : + return "No such _key"; + case CONSTRAINT_ERROR : + return "Constraint error"; + case CONFIG_ERROR : + return "config error"; + case GROUPTOUNIT : + return "use group as key"; + case DUPLICATED_KEY : + return "duplicated key"; + case UNKNOWN : + default: + return "Unknown error"; + } + return "Unknown error"; + } + void ConfigUnit :: popError(ErrCode * err, ErrCode code)const{ + if(err){ + *err = code; + } + else{ + ConfigThrower::throwException(code); + } + } + + void ConfigUnit :: setErrorKeyPath(str_t str)const{ + str_t errkeypath = str; //this->_key; + //errkeypath.append(".").append(str); + const ConfigGroup * top = this->_father; + for (;NULL != top; top = top->_father){ + if (top->_name == CONFIG_GLOBAL){ + break; + } else { + errkeypath = str_t(top->_name).append(".").append(errkeypath); + } + } + if (0 != ul_seterrbuf("%s", errkeypath.c_str())) { + LOG(WARNING) << "Configure: failed to write Error key path to error buffer"; + } + } + + ConfigUnit :: ~ConfigUnit(){} + char ConfigUnit :: to_char(ErrCode * errCode)const{ + char tmp; + popError(errCode, get_char(&tmp)); + return tmp; + } + + unsigned char ConfigUnit :: to_uchar(ErrCode * errCode)const{ + unsigned char tmp; + popError(errCode, get_uchar(&tmp)); + return tmp; + } + + int16_t ConfigUnit :: to_int16(ErrCode * errCode)const{ + int16_t tmp; + popError(errCode, get_int16(&tmp)); + return tmp; + } + + u_int16_t ConfigUnit :: to_uint16(ErrCode * errCode)const{ + u_int16_t tmp; + popError(errCode, get_uint16(&tmp)); + return tmp; + } + + int ConfigUnit :: to_int32(ErrCode * errCode)const{ + int tmp; + popError(errCode, this->get_int32(&tmp)); + return tmp; + } + + u_int32_t ConfigUnit :: to_uint32(ErrCode * errCode)const{ + u_int32_t tmp; + popError(errCode, get_uint32(&tmp)); + return tmp; + } + + long long ConfigUnit :: to_int64(ErrCode * errCode)const{ + long long tmp; + popError(errCode, get_int64(&tmp)); + return tmp; + } + + unsigned long long ConfigUnit :: to_uint64(ErrCode * errCode)const{ + unsigned long long tmp; + popError(errCode, get_uint64(&tmp)); + return tmp; + } + + float ConfigUnit :: to_float(ErrCode * errCode)const{ + float tmp; + popError(errCode, get_float(&tmp)); + return tmp; + } + + double ConfigUnit :: to_double(ErrCode * errCode)const{ + double tmp; + popError(errCode, get_double(&tmp)); + return tmp; + } +#if 1 + bsl_string ConfigUnit :: to_bsl_string(ErrCode * errCode)const{ + bsl_string tmp; + popError(errCode, get_bsl_string(&tmp)); + return tmp; + } +#endif +#if 0 + std_string ConfigUnit :: to_std_string(ErrCode * errCode)const{ + std_string tmp; + popError(errCode, get_std_string(&tmp)); + return tmp; + } +#endif + str_t ConfigUnit :: to_raw_string(ErrCode * errCode)const{ + str_t tmp; + popError(errCode, get_raw_string(&tmp)); + return tmp; + } +#if 1 + const char * ConfigUnit :: to_cstr(ErrCode * errCode)const{ + if (_cstr_err) { + LOG(INFO) << "Configure: visit ConfigUnit.to_cstr() failed"; + setErrorKeyPath(this->_key); + } + popError(errCode, _cstr_err); + return _cstr.c_str(); + } +#endif + + //----------------to_xxx with default value + char ConfigUnit :: to_char(ErrCode * errCode, const char & def)const { + char ret; + *errCode = get_char(&ret, def); + return ret; + } + unsigned char ConfigUnit :: to_uchar(ErrCode * errCode, const unsigned char & def)const{ + unsigned char ret; + *errCode = get_uchar(&ret, def); + return ret; + } + int16_t ConfigUnit :: to_int16(ErrCode * errCode, const int16_t & def)const{ + int16_t ret; + *errCode = get_int16(&ret, def); + return ret; + } + u_int16_t ConfigUnit :: to_uint16(ErrCode * errCode, const u_int16_t & def)const{ + u_int16_t ret; + *errCode = get_uint16(&ret, def); + return ret; + } + int ConfigUnit :: to_int32(ErrCode * errCode, const int & def)const{ + int ret; + *errCode = get_int32(&ret, def); + return ret; + } + u_int32_t ConfigUnit :: to_uint32(ErrCode * errCode, const u_int32_t & def)const{ + u_int32_t ret; + *errCode = get_uint32(&ret, def); + return ret; + } + long long ConfigUnit :: to_int64(ErrCode * errCode, const long long & def)const{ + long long ret; + *errCode = get_int64(&ret, def); + return ret; + } + unsigned long long ConfigUnit :: to_uint64(ErrCode * errCode, const unsigned long long & def)const{ + unsigned long long ret; + *errCode = get_uint64(&ret, def); + return ret; + } + float ConfigUnit :: to_float(ErrCode * errCode, const float & def)const{ + float ret; + *errCode = get_float(&ret, def); + return ret; + } + double ConfigUnit :: to_double(ErrCode * errCode, const double & def)const{ + double ret; + *errCode = get_double(&ret, def); + return ret; + } + bsl_string ConfigUnit :: to_bsl_string(ErrCode * errCode, const bsl_string & def)const{ + bsl_string ret; + *errCode = get_bsl_string(&ret, def); + return ret; + } + str_t ConfigUnit :: to_raw_string(ErrCode * errCode, const str_t & def)const{ + str_t ret; + *errCode = get_raw_string(&ret, def); + return ret; + } + //获取C风格的字符串(常量) + const char * ConfigUnit :: to_cstr(ErrCode * errCode, const char * def)const{ + str_t str; + *errCode = get_bsl_string(&str); + if (0 != *errCode){ + return def; + } + return _cstr.c_str(); + } + + + ErrCode ConfigUnit :: get_char(char * valueBuf)const{ + LOG(INFO) << "Config : Get char from _key [" << _key.c_str() << "]"; + if(valueBuf == NULL){ + LOG(INFO) << "Configure: visit ConfigUnit.get_char() failed : NULLBUFFER"; + setErrorKeyPath(this->_key); + return NULLBUFFER; + } + str_t buf; + int ret = Trans :: str2str(_value, &buf); + if(ret){ + LOG(INFO) << "Configure: visit ConfigUnit.get_char() failed"; + setErrorKeyPath(this->_key); + return ret; + } + if(buf.size()){ + *valueBuf = char(buf[0]); + } + else{ + LOG(INFO) << "Configure: visit ConfigUnit.get_char() failed: NULLVALUE"; + setErrorKeyPath(this->_key); + return NULLVALUE; + } + return 0; + } + ErrCode ConfigUnit :: get_uchar(unsigned char * valueBuf)const{ + LOG(INFO) << "Config : Get uchar from _key [" << _key.c_str() << "]"; + if(valueBuf == NULL){ + LOG(INFO) << "Configure: visit ConfigUnit.get_uchar() failed : NULLBUFFER"; + setErrorKeyPath(this->_key); + return NULLBUFFER; + } + str_t buf; + int ret = Trans :: str2str(_value, &buf); + if(ret){ + LOG(INFO) << "Configure: visit ConfigUnit.get_uchar() failed"; + setErrorKeyPath(this->_key); + return ret; + } + if(buf.size()){ + *valueBuf = (unsigned char)(buf[0]); + } + else{ + LOG(INFO) << "Configure: visit ConfigUnit.get_uchar() failed: NULLVALUE"; + setErrorKeyPath(this->_key); + return NULLVALUE; + } + return 0; + } + + ErrCode ConfigUnit :: get_int16(int16_t * valueBuf)const{ + LOG(INFO) << "Config : Get int16 from _key [" << _key.c_str() << "]"; + if(valueBuf == NULL){ + LOG(INFO) << "Configure: visit ConfigUnit.get_int16() failed : NULLBUFFER"; + setErrorKeyPath(this->_key); + return NULLBUFFER; + } + long long val; + int ret = Trans :: str2int64(_value, &val); + if(ret) { + LOG(INFO) << "Configure: visit ConfigUnit.get_int16() failed"; + setErrorKeyPath(this->_key); + return ret; + } + if( val > (long long)0x7fff || val < -(long long)0x8000 ) { + LOG(WARNING) << "Config : Get [" << _key.c_str() << "] : out of range."; + setErrorKeyPath(this->_key); + return OUTOFRANGE; + } + *valueBuf = (int16_t)val; + return 0; + } + + ErrCode ConfigUnit :: get_uint16(u_int16_t * valueBuf)const{ + LOG(INFO) << "Config : Get uint16 from _key [" << _key.c_str() << "]"; + if(valueBuf == NULL){ + LOG(INFO) << "Configure: visit ConfigUnit.get_uint16() failed : NULLBUFFER"; + setErrorKeyPath(this->_key); + return NULLBUFFER; + } + unsigned long long val; + int ret = Trans :: str2uint64(_value, &val); + if(ret) { + LOG(INFO) << "Configure: visit ConfigUnit.get_uint16() failed"; + setErrorKeyPath(this->_key); + return ret; + } + if( val > (unsigned long long)0xffff ) { + LOG(WARNING) << "Config : Get [" << _key.c_str() << "] : out of range."; + setErrorKeyPath(this->_key); + return OUTOFRANGE; + } + *valueBuf = (u_int16_t)val; + return 0; + } + + ErrCode ConfigUnit :: get_int32(int * valueBuf)const{ + LOG(INFO) << "Config : Get int32 from _key [" << _key.c_str() << "]"; + if(valueBuf == NULL){ + LOG(INFO) << "Configure: visit ConfigUnit.get_int32() failed : NULLBUFFER"; + setErrorKeyPath(this->_key); + return NULLBUFFER; + } + long long val; + int ret = Trans :: str2int64(_value, &val); + if(ret) { + LOG(INFO) << "Configure: visit ConfigUnit.get_int32() failed"; + setErrorKeyPath(this->_key); + return ret; + } + if( val > (long long)0x7fffffff || val < -(long long)0x80000000 ) { + LOG(WARNING) << "Config : Get [" << _key.c_str() << "] : out of range."; + setErrorKeyPath(this->_key); + return OUTOFRANGE; + } + *valueBuf = (int)val; + return 0; + } + + ErrCode ConfigUnit :: get_uint32(u_int32_t * valueBuf)const{ + LOG(INFO) << "Config : Get uint32 from _key [" << _key.c_str() << "]"; + if(valueBuf == NULL){ + LOG(INFO) << "Configure: visit ConfigUnit.get_uint32() failed : NULLBUFFER"; + setErrorKeyPath(this->_key); + return NULLBUFFER; + } + unsigned long long val; + int ret = Trans :: str2uint64(_value, &val); + if(ret) { + LOG(INFO) << "Configure: visit ConfigUnit.get_uint32() failed"; + setErrorKeyPath(this->_key); + return ret; + } + if( val > (unsigned long long)0xffffffff ) { + LOG(WARNING) << "Config : Get [" << _key.c_str() << "] : out of range."; + setErrorKeyPath(this->_key); + return OUTOFRANGE; + } + *valueBuf = (u_int32_t)val; + return 0; + } + + ErrCode ConfigUnit :: get_int64(long long * valueBuf)const{ + LOG(INFO) << "Config : Get int64 from _key [" << _key.c_str() << "]"; + if(valueBuf == NULL){ + LOG(INFO) << "Configure: visit ConfigUnit.get_int64() failed : NULLBUFFER"; + setErrorKeyPath(this->_key); + return NULLBUFFER; + } + long long val; + int ret = Trans :: str2int64(_value, &val); + if(ret) { + LOG(INFO) << "Configure: visit ConfigUnit.get_int64() failed"; + setErrorKeyPath(this->_key); + return ret; + } + *valueBuf = val; + return 0; + } + + ErrCode ConfigUnit :: get_uint64(unsigned long long * valueBuf)const{ + LOG(INFO) << "Config : Get uint64 from _key [" << _key.c_str() << "]"; + if(valueBuf == NULL){ + LOG(INFO) << "Configure: visit ConfigUnit.get_uint64() failed : NULLBUFFER"; + setErrorKeyPath(this->_key); + return NULLBUFFER; + } + unsigned long long val; + int ret = Trans :: str2uint64(_value, &val); + if(ret) { + LOG(INFO) << "Configure: visit ConfigUnit.get_uint64() failed"; + setErrorKeyPath(this->_key); + return ret; + } + *valueBuf = val; + return 0; + } + + + ErrCode ConfigUnit :: get_float(float * valueBuf)const{ + LOG(INFO) << "Config : Get float from _key [" << _key.c_str() << "]"; + if(valueBuf == NULL){ + LOG(INFO) << "Configure: visit ConfigUnit.get_float() failed : NULLBUFFER"; + setErrorKeyPath(this->_key); + return NULLBUFFER; + } + double buf = 0.0; + int ret = Trans :: str2double(_value, &buf); + if(ret) { + LOG(INFO) << "Configure: visit ConfigUnit.get_float() failed"; + setErrorKeyPath(this->_key); + } + *valueBuf = float(buf); + return ret; + } + ErrCode ConfigUnit :: get_double(double * valueBuf)const{ + LOG(INFO) << "Config : Get double from _key [" << _key.c_str() << "]"; + if(valueBuf == NULL){ + LOG(INFO) << "Configure: visit ConfigUnit.get_double() failed : NULLBUFFER"; + setErrorKeyPath(this->_key); + return NULLBUFFER; + } + int ret = Trans :: str2double(_value, valueBuf); + if(ret) { + LOG(INFO) << "Configure: visit ConfigUnit.get_double() failed"; + setErrorKeyPath(this->_key); + } + return ret; + } +#if 0 + ErrCode ConfigUnit :: get_std_string(std_string * valueBuf) const{ + LOG(INFO) << "Config : Get std::string from _key [%s]", _key.c_str()); + if(valueBuf == NULL){ + return NULLBUFFER; + } + return Trans :: str2str(_value, valueBuf); + } +#endif + ErrCode ConfigUnit :: get_bsl_string(bsl_string * valueBuf) const{ + LOG(INFO) << "Config : Get std::string from _key [" << _key.c_str() << "]"; + if(valueBuf == NULL){ + LOG(INFO) << "Configure: visit ConfigUnit.get_bsl_string() failed : NULLBUFFER"; + setErrorKeyPath(this->_key); + return NULLBUFFER; + } + int ret = Trans :: str2str(_value, valueBuf); + if(ret) { + LOG(INFO) <<"Configure: visit ConfigUnit.get_bsl_string() failed"; + setErrorKeyPath(this->_key); + } + return ret; + } + ErrCode ConfigUnit :: get_raw_string(str_t * valueBuf) const{ + LOG(INFO) << "Config : Get raw string from _key [" << _key.c_str() << "]"; + if(valueBuf == NULL){ + LOG(INFO) << "Configure: visit ConfigUnit.get_raw_string() failed : NULLBUFFER"; + setErrorKeyPath(this->_key); + return NULLBUFFER; + } + *valueBuf = _value; + return 0; + } + ErrCode ConfigUnit :: get_cstr(char * valueBuf, size_t len) const{ + LOG(INFO) << "Config : Get c style string from _key [" << _key.c_str() << "]"; + if(valueBuf == NULL){ + LOG(INFO) << "Configure: visit ConfigUnit.get_cstr() failed : NULLBUFFER"; + setErrorKeyPath(this->_key); + return NULLBUFFER; + } + str_t str; + int ret = get_bsl_string(&str); + if(ret == 0){ + snprintf(valueBuf, len, "%s", str.c_str()); + } else { + LOG(INFO) << "Configure: visit ConfigUnit.get_cstr() failed"; + setErrorKeyPath(this->_key); + } + return ret; + } + //--------------get_xx with default----------- + + ErrCode ConfigUnit :: get_char(char * valueBuf, const char & def)const{ + ErrCode ret = get_char(valueBuf); + if(ret != 0){ + *valueBuf = def; + } + return ret; + } + + ErrCode ConfigUnit :: get_uchar(unsigned char * valueBuf, const unsigned char & def)const{ + ErrCode ret = get_uchar(valueBuf); + if(ret != 0){ + *valueBuf = def; + } + return ret; + } + + ErrCode ConfigUnit :: get_int16(int16_t * valueBuf, const int16_t & def)const{ + ErrCode ret = get_int16(valueBuf); + if(ret != 0){ + *valueBuf = def; + } + return ret; + } + + ErrCode ConfigUnit :: get_uint16(u_int16_t * valueBuf, const u_int16_t & def)const{ + ErrCode ret = get_uint16(valueBuf); + if(ret != 0){ + *valueBuf = def; + } + return ret; + } + + ErrCode ConfigUnit :: get_int32(int * valueBuf, const int & def)const{ + ErrCode ret = get_int32(valueBuf); + if(ret != 0){ + *valueBuf = def; + } + return ret; + } + + ErrCode ConfigUnit :: get_uint32(u_int32_t * valueBuf, const u_int32_t & def)const{ + ErrCode ret = get_uint32(valueBuf); + if(ret != 0){ + *valueBuf = def; + } + return ret; + } + + ErrCode ConfigUnit :: get_int64(long long * valueBuf, const long long & def)const{ + ErrCode ret = get_int64(valueBuf); + if(ret != 0){ + *valueBuf = def; + } + return ret; + } + + ErrCode ConfigUnit :: get_uint64(unsigned long long * valueBuf, const unsigned long long & def)const{ + ErrCode ret = get_uint64(valueBuf); + if(ret != 0){ + *valueBuf = def; + } + return ret; + } + + ErrCode ConfigUnit :: get_float(float * valueBuf, const float & def)const{ + ErrCode ret = get_float(valueBuf); + if(ret != 0){ + *valueBuf = def; + } + return ret; + } + + ErrCode ConfigUnit :: get_double(double * valueBuf, const double & def)const{ + ErrCode ret = get_double(valueBuf); + if(ret != 0){ + *valueBuf = def; + } + return ret; + } + + ErrCode ConfigUnit :: get_bsl_string(bsl_string * valueBuf, const bsl_string & def)const{ + ErrCode ret = get_bsl_string(valueBuf); + if(ret != 0){ + *valueBuf = def; + } + return ret; + } + + ErrCode ConfigUnit :: get_raw_string(str_t * valueBuf, const str_t & def)const{ + ErrCode ret = get_raw_string(valueBuf); + if(ret != 0){ + *valueBuf = def; + } + return ret; + } + + ErrCode ConfigUnit :: get_cstr(char * valueBuf, size_t len, const char * def)const{ + ErrCode ret = get_cstr(valueBuf, len); + if(ret != 0){ + snprintf(valueBuf, len, "%s", def); + } + return ret; + } + + //-------------------to_IVar------------------ + bsl::var::IVar& ConfigUnit :: to_IVar(bsl::ResourcePool * vpool, ErrCode* errCode)const{ + if(vpool == NULL){ + LOG(INFO) << "Configure: visit ConfigUnit.to_IVar() failed : NULLBUFFER"; + setErrorKeyPath(this->_key); + popError(errCode, NULLBUFFER); + return bsl::var::Null::null; + } + if (_cstr_err) { + setErrorKeyPath(this->_key); + } + popError(errCode, _cstr_err); + bsl::var::IVar & var = vpool->create(_cstr); + return var; + } + + const ConfigUnit & ConfigUnit :: deepGet(const str_t path) const{ + for (int i=0; i<(int)path.size(); ++i){ + if ('.' == path[i]){ + str_t first = path.substr(0,i); + str_t sub = path.substr(i+1); + return deepGetSegment(first).deepGet(sub); + } + } + return deepGetSegment(path); + } + + const ConfigUnit & ConfigUnit :: deepGetSegment(const str_t segment) const { + int idleft=0; + int idright=-1; + for (int i=0; i<(int)segment.size(); ++i){ + if ('['==segment[i]){ + idleft = i+1; + } else if (']' == segment[i]) { + idright = i-1; + } + } + if (idright >= idleft) { + str_t arrid = segment.substr(idleft, idright-idleft+1); + if (Trans::isInteger(arrid)) { + return (*this)[segment.substr(0,idleft-1)][atoi(arrid.c_str())]; + } else { + return (*this)[segment.substr(0,idleft-1)][arrid]; + } + } else { + return (*this)[segment]; + } + } + + const char * ConfigUnit :: getErrKeyPath() const{ + return ul_geterrbuf(); + } + + const ConfigUnit & ConfigUnit :: get_sub_unit(int /*index*/) const { + return *get_err_unit(); + } + + void ConfigUnit :: get_full_path(bsl::string &path, const int get_global)const { + path = get_key_name(); + ConfigGroup * tmp = getFather(); + if(get_global){ + while(tmp != NULL){ + const char * group_name = tmp->get_key_name().c_str(); + str_t app = path; + path.setf("%s.%s", group_name, app.c_str()); + tmp = tmp->getFather(); + } + } + else{ + while(tmp != NULL){ + const char * group_name = tmp->get_key_name().c_str(); + if(strcmp(group_name, CONFIG_GLOBAL)){ //ignore CONFIG_GLOBAL + str_t app = path; + path.setf("%s.%s", group_name, app.c_str()); + } + tmp = tmp->getFather(); + } + } + } + + int ConfigUnit :: equals(const ConfigUnit & conf) const { + try { + if (conf.to_bsl_string() == to_bsl_string()) { + return 0; + } + return -1; + } catch (bsl::Exception) { + return -1; + } + return -1; + } + + int ConfigUnit :: add_unit(const bsl_string & /*key*/, const bsl_string& /*value*/, + const int /*objtype*/, int except, ConfigUnit ** /*ref*/) { + if (except) { + if (0 != ul_seterrbuf("%s", "")) { + LOG(WARNING) << "ConfigUnit: failed to write error buffer"; + } + popError(NULL, ERROR); + } + return ERROR; + } + + int ConfigUnit :: _append_unit(const ConfigUnit & /*unit*/,int /*check*/, int except) { + if (except) { + if (0 != ul_seterrbuf("%s", "")) { + LOG(WARNING) << "ConfigUnit: failed to write error buffer"; + } + popError(NULL, ERROR); + } + return ERROR; + } + + int ConfigUnit :: append_unit(const ConfigUnit & unit, int except) { + return _append_unit(unit, 1, except); + } + + int ConfigUnit :: copy_unit(const ConfigUnit & unit, int except) { + int ret = 0; + if (this->selfType()!= unit.selfType()) { + ret = ERROR; + goto cpend; + } + /* + if (NULL != this->_father && CONFIG_ERROR_TYPE == (*_father)[unit._key].selfType()) { + ret = init_unit(unit._key, unit._value); + } else { + ret = DUPLICATED_KEY; + } + */ + ret = init_unit(unit._key, unit._value); + return ret; + cpend: + if (except && (0 != ret)) { + if (0 != ul_seterrbuf("%s", "")) { + LOG(WARNING) << "ConfigUnit: failed to write error buffer"; + } + popError(NULL, ERROR); + } + return ret; + } + int ConfigUnit :: del_unit(const bsl_string & /*key*/, int except) { + if (except) { + if (0 != ul_seterrbuf("%s", "")) { + LOG(WARNING) << "ConfigUnit: failed to write error buffer"; + } + popError(NULL, NOSUCHKEY); + } + return NOSUCHKEY; + } + + int ConfigUnit :: set_value(const bsl_string & value, int /*except*/){ + _value = value; + _cstr = _value; + if(_value.size() > 0 && _value[0] == '"'){ + _cstr_err = Trans :: str2str(_value, &_cstr); + if(_cstr_err){ + LOG(WARNING) << "Config : Error format : _key[" << _key.c_str() << "] _value[" << _value.c_str() << "]"; + } + } + return 0; + } + int ConfigUnit :: traverse_unit(cb_tr cb_fn, void *cb_arg) + { + for(size_t i=0; isize(); ++i){ + ConfigUnit & subunit = const_cast(this->get_sub_unit(i)); + int ret = cb_fn(&subunit, cb_arg); + if(ret != 0){ + return ret; + } + switch (subunit.selfType()) { + case CONFIG_UNIT_TYPE: + case CONFIG_ERROR_TYPE: + break; + case CONFIG_ARRAY_TYPE: + case CONFIG_GROUP_TYPE: + ret = subunit.traverse_unit(cb_fn, cb_arg); + if(ret != 0){ + return ret; + } + break; + } + } + return 0; + } + int ConfigUnit :: traverse_unit_order(cb_tr cb_fn, void *cb_arg) + { + return traverse_sub_type(cb_fn, cb_arg, CONFIG_ERROR_TYPE) + || traverse_sub_type(cb_fn, cb_arg, CONFIG_UNIT_TYPE) + || traverse_sub_type(cb_fn, cb_arg, CONFIG_ARRAY_TYPE) + || traverse_sub_type(cb_fn, cb_arg, CONFIG_GROUP_TYPE); + } + int ConfigUnit :: traverse_sub_type(cb_tr cb_fn, void *cb_arg, const int type) + { + int ret = 0; + for(size_t i=0; isize() && !ret; ++i){ + ConfigUnit & subunit = const_cast(this->get_sub_unit(i)); + if(subunit.selfType() != type){ + continue; + } + int ret = cb_fn(&subunit, cb_arg); + if(type == CONFIG_GROUP_TYPE || type == CONFIG_ARRAY_TYPE){ + ret = ret || subunit.traverse_unit_order(cb_fn, cb_arg); + } + } + return ret; + } + ConfigUnit * ConfigUnit :: create_unit(const bsl_string & key, const bsl_string& value, + int objtype, ConfigGroup * father) { + ConfigUnit * tmp=NULL; + try { + switch (objtype) { + case CONFIG_UNIT_TYPE : + tmp = new ConfigUnit(key, value, NULL, father); + return tmp; + break; + case CONFIG_GROUP_TYPE : + tmp = new ConfigGroup(key.c_str(), father); + return tmp; + break; + case CONFIG_ARRAY_TYPE : + tmp = new ConfigArray(key.c_str(), father); + return tmp; + break; + default : + break; + } + } catch (...) { + if (tmp) { + delete tmp; + } + return NULL; + } + return NULL; + } + + void ConfigUnit :: clear() { + return; + } + + int ConfigUnit :: init_unit(const str_t& /*__key*/, const str_t& __value) { + /* + for(int i = 0; i < (int)__key.size(); ++i){ + if(i == 0 && __key[i] == '@'){ + continue; + } + if((!isalpha(__key[i])) && (!isdigit(__key[i])) && __key[i] != '_'){ + ul_writelog(Log::warning(), "Unsupport _key format [%s]", __key.c_str()); + return FORMATERROR; + } + } + _key = __key; + */ + _value = __value; + _cstr = _value; + _cstr_err = 0; + if(_value.size() > 0 && _value[0] == '"'){ + _cstr_err = Trans :: str2str(_value, &_cstr); + if(_cstr_err){ + LOG(WARNING) << "Config : Error format : _key[" << _key.c_str() << "] _value[" << _value.c_str() << "]"; + } + } + return 0; + } + + +}; + + + + + + + + + + + + + + + + +/* vim: set ts=4 sw=4 sts=4 tw=100 */ diff --git a/configure/ConfigUnit.h b/configure/ConfigUnit.h new file mode 100644 index 0000000000000000000000000000000000000000..fe153cd4cdc6e12bb75afba7f71b369ac1535a63 --- /dev/null +++ b/configure/ConfigUnit.h @@ -0,0 +1,463 @@ +/*************************************************************************** + * + * Copyright (c) 2008 Baidu.com, Inc. All Rights Reserved + * $Id: ConfigUnit.h,v 1.19 2010/04/13 09:59:41 scmpf Exp $ + * + **************************************************************************/ + + + +/** + * @file ConfigUnit.h + * @author yingxiang(com@baidu.com) + * @date 2008/11/26 20:53:09 + * @version $Revision: 1.19 $ + * @brief + * + **/ + + +#ifndef __CONFIGUNIT_H_ +#define __CONFIGUNIT_H_ + +#include "utils/cc_utils.h" +#include "bsl/var/IVar.h" +#include "bsl/var/Ref.h" +#include "bsl/ResourcePool.h" +#include "bsl/containers/hash/bsl_hashmap.h" +#include + +namespace comcfg{ + enum{ + CONFIG_UNIT_TYPE = 0, + CONFIG_GROUP_TYPE, + CONFIG_ARRAY_TYPE, + CONFIG_ERROR_TYPE + }; + class Reader; + class ConfigGroup; + class ConfigUnit{ + public: + /** + * @brief 方括号重载(三个函数),支持以方括号获取相应字段 + * 支持字符串、bsl::string和int下标。int下标Array专用。 + * 如果出错,返回一个ConfigError类型的常量 + * 可以用 conf[""].selfType() != CONFIG_ERROR_TYPE来判断 + * + * @return const ConfigUnit& [] + * @retval + * @see + * @author yingxiang + * @date 2008/12/30 01:18:13 + **/ + virtual const ConfigUnit & operator[] (const char *) const; + virtual const ConfigUnit & operator[] (const str_t &) const; + virtual const ConfigUnit & operator[] (int) const; + + virtual ConfigUnit & operator[] (const char *) ; + virtual ConfigUnit & operator[] (const str_t &) ; + virtual ConfigUnit & operator[] (int) ; + virtual ConfigUnit & operator= (ConfigUnit & unit) ; + + /** + * @brief 将一个ErrCode转化为一个对应的字符串信息 + * ErrCode内部就是一个int, 0为OK,非0为出错信息 + * + * @return const char* + * @retval + * @see + * @author yingxiang + * @date 2008/12/30 01:21:07 + **/ + virtual const char * seeError(const ErrCode &) const; + virtual ~ConfigUnit(); + + /** + * @brief 从一个字段中获取特定类型的数据 + * XXX to_XXX() 表示以XXX类型获取该配置项 + * + * @param [out] errCode : ErrCode* 出错信息 + * errCode不为NULL时,错误号将会写入*errCode + * 当此处errCode为默认值NULL时,出错将会以异常的形式抛出 + * 抛出的异常为:ConfigException或其子类 + * @return char + * @retval + * @see + * @author yingxiang + * @date 2008/12/30 01:22:07 + **/ + virtual char to_char(ErrCode * errCode = NULL)const; + virtual unsigned char to_uchar(ErrCode * errCode = NULL)const; + virtual int16_t to_int16(ErrCode * errCode = NULL)const; + virtual u_int16_t to_uint16(ErrCode * errCode = NULL)const; + virtual int to_int32(ErrCode * errCode = NULL)const; + virtual u_int32_t to_uint32(ErrCode * errCode = NULL)const; + virtual long long to_int64(ErrCode * errCode = NULL)const; + virtual unsigned long long to_uint64(ErrCode * errCode = NULL)const; + virtual float to_float(ErrCode * errCode = NULL)const; + virtual double to_double(ErrCode * errCode = NULL)const; + virtual bsl_string to_bsl_string(ErrCode * errCode = NULL)const; + //to_std_string : 返回值为std::string,如果是双引号开头的串,这里的字符串是经过转义的,\'\x41\' -> 'A' + //virtual std_string to_std_string(ErrCode * errCode = NULL)const; + //to_raw_string : 未经过转义处理的字符串 + virtual str_t to_raw_string(ErrCode * errCode = NULL)const; + //获取C风格的字符串(常量) + virtual const char * to_cstr(ErrCode * errCode = NULL)const; + + /** + * @brief 带有默认值的to_XXX系列函数 + * 返回值与to_xxx系列完全相同。 + * 唯一的不同是:当errCode不为0(即发生错误), 返回def默认值 + * + * @param [out] errCode : ErrCode* 出错信息 + * @param [in] def : const & 默认值 + * @return + * @author zhang_rui + * @date 2009/03/11 22:37:46 + **/ + virtual char to_char(ErrCode * errCode, const char & def)const; + virtual unsigned char to_uchar(ErrCode * errCode, const unsigned char & def)const; + virtual int16_t to_int16(ErrCode * errCode, const int16_t & def)const; + virtual u_int16_t to_uint16(ErrCode * errCode, const u_int16_t & def)const; + virtual int to_int32(ErrCode * errCode, const int & def)const; + virtual u_int32_t to_uint32(ErrCode * errCode, const u_int32_t & def)const; + virtual long long to_int64(ErrCode * errCode, const long long & def)const; + virtual unsigned long long to_uint64(ErrCode * errCode, const unsigned long long & def)const; + virtual float to_float(ErrCode * errCode, const float & def)const; + virtual double to_double(ErrCode * errCode, const double & def)const; + virtual bsl_string to_bsl_string(ErrCode * errCode, const bsl_string & def)const; + virtual str_t to_raw_string(ErrCode * errCode, const str_t & def)const; + //获取C风格的字符串(常量) + virtual const char * to_cstr(ErrCode * errCode, const char * def)const; + + + + /** + * @brief 与to_XXX功能相同的函数。不过get_XXX系列为C风格 + * 传入为用于放值的buffer,返回值是错误号 + * + * @param [out] valueBuf : char* + * @return ErrCode + * @retval + * @see + * @author yingxiang + * @date 2008/12/30 01:25:52 + **/ + virtual ErrCode get_char(char * valueBuf)const; + virtual ErrCode get_uchar(unsigned char * valueBuf)const; + virtual ErrCode get_int16(int16_t * valueBuf)const; + virtual ErrCode get_uint16(u_int16_t * valueBuf)const; + virtual ErrCode get_int32(int * valueBuf)const; + virtual ErrCode get_uint32(u_int32_t * valueBuf)const; + virtual ErrCode get_int64(long long * valueBuf)const; + virtual ErrCode get_uint64(unsigned long long * valueBuf)const; + virtual ErrCode get_float(float * valueBuf)const; + virtual ErrCode get_double(double * valueBuf)const; + virtual ErrCode get_bsl_string(bsl_string * valueBuf)const; + //virtual ErrCode get_std_string(std_string * valueBuf) const; + virtual ErrCode get_raw_string(str_t * valueBuf) const; + //获取C风格的字符串,将字符串填入valueBuf,len是valueBuf长度,自动补0,最多填充len-1个字符 + virtual ErrCode get_cstr(char * valueBuf, size_t len) const; + + + /** + * @brief 带有默认值的ge_XXX系列函数 + * 返回值与get_xxx系列完全相同。 + * 唯一的不同是:当返回值不为0(即发生错误)valueBuf中使用def默认值 + * + * @param [out] valueBuf : char* 传出的值 + * @param [in] def : const char& 默认值 + * @return ErrCode + * @retval + * @see + * @author yingxiang + * @date 2009/03/11 22:37:46 + **/ + virtual ErrCode get_char(char * valueBuf, const char & def)const; + virtual ErrCode get_uchar(unsigned char * valueBuf, const unsigned char & def)const; + virtual ErrCode get_int16(int16_t * valueBuf, const int16_t & def)const; + virtual ErrCode get_uint16(u_int16_t * valueBuf, const u_int16_t & def)const; + virtual ErrCode get_int32(int * valueBuf, const int & def)const; + virtual ErrCode get_uint32(u_int32_t * valueBuf, const u_int32_t & def)const; + virtual ErrCode get_int64(long long * valueBuf, const long long & def)const; + virtual ErrCode get_uint64(unsigned long long * valueBuf, const unsigned long long & def)const; + virtual ErrCode get_float(float * valueBuf, const float & def)const; + virtual ErrCode get_double(double * valueBuf, const double & def)const; + virtual ErrCode get_bsl_string(bsl_string * valueBuf, const bsl_string & def)const; + virtual ErrCode get_raw_string(str_t * valueBuf, const str_t & def)const; + virtual ErrCode get_cstr(char * valueBuf, size_t len, const char * def)const; + + /** + * @brief 将自身转化为一个IVar + * + * 会抛异常 + * + * @param [in/out] vpool : VarPool* IVar句柄表,所以新分配的IVar都注册到VarPool + * 当需要销毁我创建的IVar时,只需要vpool->destroy(); + * @param [in] errCode : ErrCode* 错误号,0为正确,其余表示出错 + * @return IVar& + * @retval + * @see + * @author yingxiang + * @date 2009/03/11 22:00:48 + **/ + virtual bsl::var::IVar& to_IVar(bsl::ResourcePool* vpool, ErrCode* errCode = NULL)const; + /** + * @brief 获取自己的类型 + * + * @return int + * @retval + * @see + * @author yingxiang + * @date 2008/12/30 01:35:27 + **/ + virtual int selfType()const{ + return CONFIG_UNIT_TYPE; + } + + /** + * @brief 获取元素个数 + * + * @return size_t 个数 + * @retval + * @see + * @author yingxiang + * @date 2008/12/30 02:00:28 + **/ + virtual size_t size()const{ + return 1; + } + + /** + * @brief 长路径Unit的直接获取 + * + * @param [in] path : const str_t 长路径,例如 group.sub.key + * @return const ConfigUnit& 长路径获取的ConfigUnit + * @date 2009/07/16 15:50:47 + **/ + virtual const ConfigUnit & deepGet(const str_t path) const; + + /** + * @brief 访问不存在的key后,给出不存在的key的具体路径。比如 group.sub.nokey + * + * @return const char* 不存在的key的路径 + * @author zhang_rui + * @date 2009/07/17 10:20:09 + **/ + const char * getErrKeyPath() const; + + /** + * @brief 获取子unit。ConfigUnit直接返回error unit + * + * @return ConfigUnit & + * @author zhang_rui + **/ + virtual const ConfigUnit & get_sub_unit(int index) const; + /** + * @brief 比较是否相等 + * + * @return int 0表示相等 -1不相等 + * @author zhang_rui + **/ + virtual int equals(const ConfigUnit & conf) const; + + //以下函数的参数中,except为0则用错误号表示错误, + //except为1则用异常表示错误 + /** + * @brief 增加一个unit, 连接到子unit,不做深拷贝 + * + * @param [in] key : 新增unit的key + * @param [in] value : 新增unit的value + * @param [in] objtype : unit类型。 + * CONFIG_UNIT_TYPE表示unit; + * CONFIG_GROUP_TYPE表示group; + * CONFIG_ARRAY_TYPE表示array; + * @return int 0 成功,其他是错误号 + * @author zhang_rui + **/ + virtual int add_unit(const bsl_string & key, const bsl_string& value, + const int objtype=CONFIG_UNIT_TYPE, int except=0, ConfigUnit ** ref=NULL); + + /** + * @brief 复制一个unit, 深拷贝 + * + * 将unit的内容追加到本对象下面。 + * 类型需要匹配,只能从group复制到group,array复制到array + * group要检查key是否重复,不重复则追加 + * array直接追加 + * @return int 0 成功,其他是错误号 + * @author zhang_rui + **/ + virtual int append_unit(const ConfigUnit & unit, int except=0); + + /** + * @brief 复制一个unit, 深拷贝 + * + * 将unit的内容复制到本对象。 + * 类型需要匹配,只能从group复制到group,array复制到array + * @return int 0 成功,其他是错误号 + * @author zhang_rui + **/ + virtual int copy_unit(const ConfigUnit & unit, int except=0); + + /** + * @brief 删除一个unit + * + * key : 要删除的unit的key + * @return int 0 成功,其他是错误号 + * @author zhang_rui + **/ + virtual int del_unit(const bsl_string & key, int except=0); + /** + * @brief 修改unit中value的值 + * + * @return int 0 成功,其他是错误号 + * @author zhang_rui + **/ + virtual int set_value(const bsl_string & value, int except=0); + /** + * @brief 遍历load()完成后的comcfg::Configure结构,使用用户提供的callback函数对每个unit进行操作 + * @note 深度优先搜索,子节点的访问无先后顺序 + * @param [in] cb_fn: 用户提供的callback函数 + * @param [in] cb_arg: 用户callback函数所需要的参数 + * + * @return int 0 成功,其他是错误号 + * @author linjieqiong + **/ + typedef int (* cb_tr)(ConfigUnit *, void *); + virtual int traverse_unit(cb_tr cb_fn, void *cb_arg); + /** + * @brief 类似于traverse_unit(),区别是遍历一个group时按照CONFIG_ERROR_TYPE, CONFIG_UNIT_TYPE, CONFIG_ARRAY_TYPE, CONFIG_GROUP_TYPE的顺序访问子节点 + * + * @param [in] cb_fn: 用户提供的callback函数 + * @param [in] cb_arg: 用户callback函数所需要的参数 + * + * @return int 0 成功,其他是错误号 + * + * @version 1.2.9 + * @author linjieqiong + * @date 2013/04/28 16:25:47 + */ + virtual int traverse_unit_order(cb_tr cb_fn, void *cb_arg); + + //-----------------从这里往下的东西用户不需要关心----------------- + + //构造函数, + ConfigUnit(); + ConfigUnit(const str_t& __key, const str_t& __value, const Reader * __cur_reader = NULL, ConfigGroup * father = NULL); + + //调试打印时用,缩进 + void pindent(int ind)const{ + while(ind--){ + printf(" "); + } + } + //打印 + virtual void print(int indent = 0)const{ + pindent(indent); + printf("=[%s], _value=[%s]\n", _key.c_str(), _value.c_str()); + } + + + //for debug or writelog + virtual str_t info() const{ + //const int INFO_BUF_SIZE = 256; + //char buf[INFO_BUF_SIZE] = ""; + str_t buf; + buf.appendf("[File:%s Line:%d Key:%s Value:%s]", + _at_file ? _at_file : "NULL", _at_line, _key.c_str(), _value.c_str()); + return buf; + } + //for child class + virtual ConfigUnit * relativeSection(ConfigUnit *, str_t, int* ){ + return NULL; + } + inline const char * getFileName(){ + return _at_file; + } + inline int getFileLine(){ + return _at_line; + } + inline void setConstrainted(const bool bCons){ + _bConstrainted = bCons; + } + inline bool getConstrainted()const{ + return _bConstrainted; + } + static ConfigUnit* get_err_unit(); + virtual void get_full_path(bsl::string &path, const int get_global = 0) const; + inline virtual const bsl::string & get_key_name() const{ + return _key; + } + inline ConfigGroup * getFather()const{ + return _father; + } + protected: + inline void setFilePosition(const char *cur_file = "NULL", const int cur_line = -1){ + _at_file = cur_file; + _at_line = cur_line; + } + inline void setFileLine(const int cur_line = -1){ + _at_line = cur_line; + } + virtual void popError(ErrCode *, ErrCode) const; + void setErrorKeyPath(str_t str)const; + #if __GNUC__ == 4 && __GNUC_MINOR__ >= 4 + const ConfigUnit & deepGetSegment(const str_t segment) const; + #else + const ConfigUnit & ConfigUnit :: deepGetSegment(const str_t segment) const; + #endif + + static const str_t g_unknown; + str_t _key; + str_t _value; + str_t _cstr; //专门的一个被解析后的string,只有当value以"为开头时才起作用 + int _cstr_err; + str_t _vstring; + const char * _at_file; + int _at_line; + ConfigGroup * _father; + bool _bConstrainted; + //mutable str_t _to_def_str; + ConfigUnit * create_unit(const bsl_string & key, const bsl_string& value, + int objtype, ConfigGroup * father); + + /** + * @brief 清除内容 + * + * @return void + * @author zhang_rui + **/ + virtual void clear(); + + public: + /** + * @brief 复制一个unit, 深拷贝 + * + * 将unit的内容复制到本对象下面。 + * 类型需要匹配,只能从group复制到group,array复制到array + * group要检查key是否重复,不重复则追加 + * array直接追加 + * @return int 0 成功,其他是错误号 + * @author zhang_rui + **/ + virtual int _append_unit(const ConfigUnit & unit,int check=1, int except=0); + private: + int init_unit(const str_t& __key, const str_t& __value); + //访问类型为type的子节点,如果子节点是group/array,递归访问 + int traverse_sub_type(cb_tr cb_fn, void *cv_arg, const int type); + }; + +} + + + + + + + + + +#endif //__CONFIGUNIT_H_ + +/* vim: set ts=4 sw=4 sts=4 tw=100 */ diff --git a/configure/Configure.cpp b/configure/Configure.cpp new file mode 100644 index 0000000000000000000000000000000000000000..6b9a958fdfb277f728486d86d57b2a979c004b28 --- /dev/null +++ b/configure/Configure.cpp @@ -0,0 +1,734 @@ +/*************************************************************************** + * + * Copyright (c) 2008 Baidu.com, Inc. All Rights Reserved +<<<<<<< Configure.cpp + * $Id: Configure.cpp,v 1.21 2010/04/13 09:59:41 scmpf Exp $ +======= + * $Id: Configure.cpp,v 1.21 2010/04/13 09:59:41 scmpf Exp $ +>>>>>>> 1.18 + * + **************************************************************************/ + + + +/** + * @file Configure.cpp + * @author yingxiang(com@baidu.com) + * @date 2008/12/21 18:09:35 +<<<<<<< Configure.cpp + * @version $Revision: 1.21 $ +======= + * @version $Revision: 1.21 $ +>>>>>>> 1.18 + * @brief + * + **/ + +#include "Configure.h" +#include "reader/Reader.h" +#include "constraint/Constraint.h" +#include "utils/cc_utils.h" +#include "idl_conf_if.h" +#include "bsl/var/Dict.h" +#include "bsl/var/Array.h" + +namespace comcfg{ + + using bsl::var::IVar; + + //extern Reader * g_cur_reader; + int Configure :: load(const char * path, const char * conf, const char * range, int /*version*/){ + return load_1_0(path, conf, range); + } + + int Configure :: load_ex(const char * path, const char * conf, const char * range, + int dupLevel, int /*version*/) + { + if(dupLevel < GROUP_DUP_LEVEL0 || dupLevel > GROUP_DUP_LEVEL3){ + LOG(WARNING) << "Configure.load_ex : parameter @dupLevel is wrong."; + return ERROR; + } + _dupLevel = dupLevel; + if(_dupLevel != GROUP_DUP_LEVEL0 ){ + _dupMap.create(256); + } + int ret = load_1_0(path, conf, range); + return ret!=0 ? ret : printGroup(); + } + + int Configure :: load_ex2(const char * path, const char * conf, const char * range, int /*version*/) + { + int ret = load_1_0(path, conf, range); + if(ret == 0 && range != NULL && *range != 0){ + return checkConstraint(); + } + return ret; + } + + int Configure :: load_1_0(const char * path, const char * conf, const char *range){ + int ret = 0; + if(path == NULL || (conf == NULL && range == NULL)){ + LOG(WARNING) << "Configure.load : path or filename error..."; + return ERROR; + } + if(0 == strcmp(path, "")) { + _path = "."; //set as current dir + } + else { + _path = path; + } + if(_readers.size() != 0){ + LOG(WARNING) << "Configure.load : Configure can't be reused, create a new object for load."; + return ERROR; + } +#if 0 + if(conf != NULL){ + Reader * reader = new Reader(); + _cur_reader = reader; + _cur_level = 0; + _readers.push_back(reader); + ret = reader->read(conf, this); + _cur_reader = NULL; + } +#endif + size_t idx = 0; + pushSubReader(conf, 0);//config文件进入队列,因为可能有$include,按广度优先处理 + while(idx < _readers.size()){ + ReaderNode & r = (*_readers[idx]); + _cur_reader = r.reader; + _cur_level = r.level; + _section = this;//切换到GLOBAL + _depth = 0; + _at_file = r.filename.c_str(); + ret = r.reader->read(_at_file, this); + if(ret != 0){ + LOG(WARNING) << "Reader configure file [" << r.filename.c_str() << "] error. Stop."; + return CONFIG_ERROR; + } + ++idx; + } + + if(range != NULL && 0 != *range){ + str_t range_file; + range_file.append(_path).append("/").append(range); + if(check_once(range_file.c_str()) != 0){ + return CONSTRAINT_ERROR; + } + } + if(ConstraintLibrary :: getInstance() -> checkGlobalConstraint(this) != 0){ + return CONSTRAINT_ERROR; + } + return 0; + } + void Configure :: pushSubReader(const char * conf, int level){ + if(conf == NULL){ + return; + } + if(level < 0){ + level = _cur_level + 1; + } + LOG(INFO) << "Config $include : " << conf << ", MAX_DEPTH=" << MAX_INCLUDE_DEPTH << ", level=" << level; + if(level > MAX_INCLUDE_DEPTH){ + LOG(WARNING) << "Config error: Max $include level is " << MAX_INCLUDE_DEPTH << " [" << _cur_reader->_cur_file.c_str() << ":" << _cur_reader->_cur_line << "]"; + return; + } + ReaderNode * newNode = new ReaderNode(); + _readers.push_back(newNode); + ReaderNode & r = *(_readers[_readers.size() - 1]); + r.reader = new Reader(); + r.filename.append(_path).append("/").append(conf); + r.level = level; + LOG(INFO) << "Config : $include : " << r.filename.c_str() << ", level=" << r.level; + } + + char * Configure :: getRebuildBuffer(size_t __size){ + if(_readers.size() == 0){ + _path = "."; + pushSubReader(REBUILD_CONF, 0); + } + else{ + LOG(WARNING) << "getRebuildBuffer : This Configure Object can't be re-used. Create a new one."; + return NULL; + } + if(_readers.size() == 0){ + return NULL; + } + //return _readers[0].reader->getRebuildBuffer(__size); + return _readers[0]->reader->getRebuildBuffer(__size); + } + + int Configure :: rebuild(){ + if(_readers.size() == 0){ + return -1; + } + //_cur_reader = _readers[0].reader; + _cur_reader = _readers[0]->reader; + _cur_level = 0; + int ret = _cur_reader->rebuild(this); + _cur_reader = NULL; + return ret; + } + + char * Configure :: dump(size_t * __size){ + //多个子文件合并的时候,需要在子文件的头部添加 [GLOBAL] + const char * global = "\n[" CONFIG_GLOBAL "]\n"; + size_t len = strlen(global); + if(_dump_buffer != NULL){ + if(__size){ + *__size = _dump_size; + } + return _dump_buffer; + } + if(_readers.size() == 0){ + return NULL; + } + _dump_size = 0; + std::vector bufs; + std::vector rsize; + for(size_t i = 0; i < _readers.size(); ++i){ + size_t tmpsize = 0; + //char * p = _readers[i].reader->dump(&tmpsize); + char * p = _readers[i]->reader->dump(&tmpsize); + rsize.push_back(tmpsize); + bufs.push_back(p); + //LOG(INFO) << "dump file : %s, size=%zu", _readers[i].filename.c_str(), tmpsize); + LOG(INFO) << "dump file : " << _readers[i]->filename.c_str() << ", size=" << tmpsize; + if(p == NULL){ + return NULL; + } + _dump_size += tmpsize; + if(i){ + _dump_size += len; + } + } + + size_t bufsize = ((_dump_size >> 12) + 1) << 12; + _dump_buffer = (char *)malloc(bufsize); + if(_dump_buffer == NULL){ + LOG(WARNING) << "Can't build dump buffer"; + return NULL; + } + + size_t pos = 0; + for(size_t i = 0; i < _readers.size(); ++i){ + if(i){ + memcpy(_dump_buffer + pos, global, len); + pos += len; + } + memcpy(_dump_buffer + pos, bufs[i], rsize[i]); + pos += rsize[i]; + } + if(_dump_size != pos){ + LOG(WARNING) << "What's wrong??? _dump_size(" << _dump_size << ") != real size("<< pos << ")"; + return NULL; + } + _dump_buffer[_dump_size] = '\0'; + if(__size){ + *__size = _dump_size; + } + return _dump_buffer; + } + + struct dump_conf{ + enum{ + RC_COMMENT = 0, + RC_NO_COMMENT, + RC_POSITION, + }; + int rc_type; + std::vector *files; + void *father; + str_t dumpedstr; + }; + + int cb_dumpConf(ConfigUnit *unit, void * dumpconf){ + int unit_type = unit->selfType(); + //以下两类节点是在内存中新建的,在配置文件中无对应节点 + if(unit_type == CONFIG_ARRAY_TYPE || unit_type == CONFIG_ERROR_TYPE){ + return 0; + } + struct dump_conf * conf = static_cast(dumpconf); + str_t group_path; + + //父节点发生变化,重新获取其路径 + if(unit_type == CONFIG_UNIT_TYPE && conf->father != unit->getFather()){ + conf->father = unit->getFather(); + unit->getFather()->get_full_path(group_path); + conf->dumpedstr.appendf("[%s]\n", group_path.c_str()); + } + //从当前配置行往上获取该配置的注释信息 + if(conf->rc_type != dump_conf :: RC_NO_COMMENT){ + str_t comment; + std::vector & ReaderNodes = *conf->files; + for(size_t i=0; igetFileName(), ReaderNodes[i]->filename.c_str())){ + continue; + } + Reader * & rd = ReaderNodes[i]->reader; + //该配置行的注释在原配置文件中的起始行号 + int line = unit->getFileLine() - 2; + rd->getCommentUpwards(comment, line); + } + conf->dumpedstr.append(comment); + } + //dump该配置的在原配置文件中的位置 + if(conf->rc_type == dump_conf :: RC_POSITION){ + conf->dumpedstr.appendf("#[%s:%d]\n", unit->getFileName(), unit->getFileLine()); + } + //dump该配置项 + if(unit_type == CONFIG_UNIT_TYPE){ + conf->dumpedstr.appendf("%s : %s\n", unit->get_key_name().c_str(), unit->to_cstr()); + } + else{//CONFIG_GROUP_TYPE, traverse_unit()是深搜, 接下来会遍历子节点 + conf->father = unit; + unit->get_full_path(group_path); + conf->dumpedstr.appendf("[%s]\n", group_path.c_str()); + } + return 0; + } + + int Configure :: dump_ex(char *buf, const size_t bufsize, const int restoreComment){ + if(buf == NULL || bufsize <= 0 || restoreComment < 0 || restoreComment > 2){ + LOG(WARNING) << "wrong parameter(s) of dump_ex()."; + return -1; + } + struct dump_conf conf = {restoreComment, &_readers, this, str_t(),}; + conf.dumpedstr.reserve(bufsize); + + traverse_unit_order(cb_dumpConf, &conf); + + size_t rsize = conf.dumpedstr.size() + 1; + if(rsize > bufsize){ + LOG(WARNING) << "@bufsize is too small. at least " << rsize << " is required."; + return 0 - rsize; + } + memcpy(buf, conf.dumpedstr.c_str(), rsize); + return rsize; + } + + void Configure :: changeSection(str_t str){ + LOG(INFO) << "Configure: This is [" << this->getName() << "], current section[" << _section->getName() << "], depth=" << _depth << ", father[" << (_section->getFather()?_section->getFather()->getName():"NULL") << "]"; + if(str[0] != '.'){ + _section = this; + _depth = 0; + } + else{ + int i; + for(i = 0; i < (int)str.size(); ++i){ + if(str[i] != '.'){ + break; + } + } + + if((int)i > _depth){ + LOG(WARNING) << "Configure : Section Error [" << str.c_str() << "] Ignored."; + throw ConfigException(); + } + str = str.substr(i); + //--i; + i = _depth - i; + while(i > 0){ + _section = (ConfigGroup *)_section->getFather(); + _depth--; + i--; + } + } + + ConfigGroup * _bak_section = _section; + LOG(INFO) << "Config : set Section: New[" << str.c_str() << "] -> Father[" << _section->getName() << "]"; + _section = (ConfigGroup *)_section->relativeSection(this, str, &_depth); + if(_section == NULL){ + _section = _bak_section; + } + if(_section && _cur_reader){ + _section->setFilePosition(_cur_reader->_cur_file.c_str(), _cur_reader->_cur_line); + } + LOG(INFO) << "Config : Now _section in : [" << (_section?_section->getName():"NULL") << "]"; + } + + void Configure :: pushPair(const str_t& key, const str_t& value){ + ConfigUnit * tmp = new ConfigUnit(key, value, _cur_reader, _section); + if(_section && (_section->push(key, tmp) != 0)){ + delete tmp; + free(tmp); + throw ConfigException(); + } + } + + time_t Configure :: lastConfigModify(){ + time_t t = time_t(0); + struct stat st; + for(int i = 0; i < (int)_readers.size(); ++i){ + //if(_readers[i].level <= MAX_INCLUDE_DEPTH){ + if(_readers[i]->level <= MAX_INCLUDE_DEPTH){ + //const char * f = _readers[i].filename.c_str(); + const char * f = _readers[i]->filename.c_str(); + if(stat(f, &st) == 0){ + if(t < st.st_mtime){ + t = st.st_mtime; + } + } + else{ + LOG(WARNING) << "Check lastConfigModify : I can't stat file [" << f << "]"; + //有一个特例: + //如果A文件include了B,运行中,我在A中去掉了$include : B,并且删除了B文件,导致我stat失败 + //此时,按理是合法的,配置文件可以被重新读取,lastConfigModify只要返回A的更新时间就可以了 + //不过建议还是不要删除B文件 + //我选择的是返回0,表示有一个文件无法被stat + return time_t(0); + } + } + } + return t; + } + + + enum _VarType{ + VAR_ARRAY = 0, + VAR_DICT, + VAR_UNIT + }; + + int varType(const IVar& ivar){ + if(ivar.is_array()){ + return VAR_ARRAY; + } + else if(ivar.is_dict()){ + return VAR_DICT; + } + return VAR_UNIT; + } + + //----------loadIVar------------- + str_t seeVarUnit(const IVar & ivar, const char * key, bool isArray); + str_t seeVarDict(const IVar & ivar, str_t * section); + str_t seeVar(const IVar & ivar, str_t * section, const char * key = ""); + + bool isVarUnit(const IVar & a, int dep = 1){ + if(dep < 0){ + throw ConfigException() << BSL_EARG << "Multi-dimension array is not supported."; + } + if(a.is_array()){ + return isVarUnit(a[0], dep-1); + } + if(a.is_dict()){ + return false; + } + return true; + } + + str_t seeVarUnit(const IVar & ivar, const char * key, bool isArray){ + //把一个基本的IVar转化为config文本 Key : value + str_t ret; + str_t value = ivar.to_string(); + str_t tmp; + if (ivar.is_int32() || ivar.is_int64() || ivar.is_double()) { + tmp = value; + } else { + str_t strcontent=""; + int yinhao = 0; + + for(int i = 0; i < (int)value.size(); ++i){ + //特殊字符 + if(value[i] < 32 || value[i] >= 127 || value[i] == '\"' || value[i] == '\'' || value[i] == '\\'){ + strcontent.appendf("\\x%02x", value[i]); + yinhao =1; + } + else{ + strcontent.appendf("%c", value[i]); + } + } + if (yinhao) { + tmp = "\""; + tmp.append(strcontent); + tmp.append("\""); + } else { + tmp = strcontent; + } + } + ret.appendf("%s%s : %s\n", isArray?"@":"", key, tmp.c_str()); + return ret; + } + + str_t nextSectionName(const str_t section, const char * key, bool isArray = false){ + str_t nsec; + if(section == str_t(CONFIG_GLOBAL)){ + nsec = ""; + nsec.appendf("%s%s", isArray ? "@" : "", key); + } + else if(strstr(section.c_str(), "@") != NULL){ + nsec = "."; + for(int i = 0; i < (int)section.size(); ++i){ + if(section[i] == '.'){ + nsec.appendf("."); + } + } + nsec.appendf("%s%s", isArray ? "@" : "", key); + } + else{ + nsec = section; + nsec.appendf("%s%s%s", nsec.size() == 0 ? "" : ".", isArray ? "@" : "", key); + } + return nsec; + } + + + str_t seeVarDict(const IVar & ivar, str_t * section){ + //把一个Dict转化为config文本 + LOG(INFO) << "Var " << ivar.to_string().c_str() << " is dict."; + const IVar & dict = ivar; // no dynamic cast + bsl::var::Dict::dict_const_iterator iter = dict.dict_begin(); + bsl::var::Dict::dict_const_iterator end = dict.dict_end(); + str_t bak_section = *section; + str_t ret; + ret.appendf("[%s]\n", section->c_str()); + for(; iter != end; ++ iter ){ + if( isVarUnit(iter->value()) ){ + ret.append( seeVar(iter->value(), section, iter->key().c_str()) ); + } + } + for(iter = dict.dict_begin(); iter != end; ++ iter ){ + if(! isVarUnit(iter->value()) ){ + ret.append( seeVar(iter->value(), section, iter->key().c_str()) ); + if(*section != bak_section){ + *section = bak_section; + } + } + } + return ret; + } + + + str_t seeVar(const IVar & ivar, str_t * section, const char * key){ + //把一个IVar类型转为config文本 + str_t ret; + //str_t bak_section = *section; + if(varType(ivar) == VAR_ARRAY){ + // 先判断是否为数组 + LOG(INFO) << "Var " << ivar.to_string().c_str() << " is array."; + if(varType(ivar[0]) == VAR_DICT ){ + *section = nextSectionName(*section, key, true); + } + for(int i = 0; i < (int)ivar.size(); ++i){ + if(varType(ivar[i]) == VAR_ARRAY){ + throw ConfigException() << BSL_EARG << "Multi-dimension array is not supported."; + } + if(varType(ivar[i]) != varType(ivar[0])){ + throw ConfigException() << BSL_EARG << "array elements should be the same type."; + } + if(varType(ivar[i]) == VAR_DICT){ + ret.append( seeVarDict(ivar[i], section) ); + } + else{ + ret.append( seeVarUnit(ivar[i], key, true) ); + } + } + } + else if(varType(ivar) == VAR_DICT){ + *section = nextSectionName(*section, key); + ret.append( seeVarDict(ivar, section) ); + } + else{ + ret.append( seeVarUnit(ivar, key, false) ); + } + //*section = bak_section; + return ret; + } + + + int Configure :: loadIVar(const IVar & ivar){ +#if 0 + if(ivar == NULL){ + LOG(WARNING) << "loadIVar : ivar = NULL"); + return -1; + } +#endif + try{ + if( ! ivar.is_dict()){ + LOG(WARNING) << "loadIVar : ivar should be a dict!"; + return -1; + } + + str_t section = ""; + str_t s = seeVar(ivar, §ion, CONFIG_GLOBAL); + //printf("====result===== \n%s", s.c_str()); + char * dest = getRebuildBuffer(s.size()); + if(dest == NULL){ + throw ConfigException() << BSL_EARG << "No memory???"; + } + strcpy(dest, s.c_str()); + return rebuild(); + }catch(bsl::Exception e){ + LOG(WARNING) << "loadIVar : catch exception : [" << e.file() << ":" << e.line() << "]" << e.what(); + return -1; + }catch(...){ + LOG(WARNING) << "loadIVar : other err..."; + return -1; + } + return 0; + } + + + Configure :: Configure(){ + create(CONFIG_GLOBAL); + _section = this; + _depth = 0; + _idl = NULL; + _cur_reader = NULL; + _cur_level = -1; + _dump_buffer = NULL; + //get_err_unit(); + } + + Configure :: ~Configure(){ + for(size_t i = 0; i < _readers.size(); ++i){ + delete _readers[i]->reader; + delete _readers[i]; + } + if(_idl){ + free_idl(_idl); + } + if(_dump_buffer){ + free(_dump_buffer); + } + } + + //callback函数cb_sgConstraint()的参数 + struct cb_cons_arg{ + enum{ + SG_TYPE_SET = 0, //set _bConstrainted,此处为将其置为false + SG_TYPE_GET, //get _bConstrainted,存入vector,为打印做准备 + }; + int sg_type; + void *arg; //callback函数需要的参数,根据作用类型有不同 + }; + //callback函数,用于set/get _bConstrainted + int cb_sgConstraint(ConfigUnit * unit, void *arg) + { + struct cb_cons_arg * cons_arg = (struct cb_cons_arg *)arg; + if(cons_arg->sg_type == cb_cons_arg::SG_TYPE_SET){ + unit->setConstrainted(*(bool *)cons_arg->arg); + } + else if(cons_arg->sg_type == cb_cons_arg::SG_TYPE_GET) + { + if(unit->selfType() == CONFIG_UNIT_TYPE && unit->getConstrainted() == false){ + std::vector *units = (std::vector *)cons_arg->arg; + units->push_back(unit); + } + } + return 0; + } + + int Configure :: check_once(const char * range, int /*version*/) { + if(range == NULL){ + LOG(WARNING) << "Configure.check_once : range filename error..."; + return ERROR; + } + bool bClear = false; + struct cb_cons_arg cons_arg = {cb_cons_arg::SG_TYPE_SET, &bClear}; + traverse_unit(cb_sgConstraint, (void *)&cons_arg); + + if(_idl){ + free_idl(_idl); + _idl = NULL; + } + _idl = confIDL::alloc_idl(); + load_idl(range, _idl); + Constraint cons; + int ret = cons.run(_idl, this); + return ret==0 ? OK : CONSTRAINT_ERROR; + } + + int Configure :: checkConstraint() + { + std::vector unconstraintedUnits; + struct cb_cons_arg cons_arg = {cb_cons_arg::SG_TYPE_GET, &unconstraintedUnits}; + traverse_unit(cb_sgConstraint, (void *)&cons_arg); + + int ret=0, errcode=0; + for(size_t i=0; iget_key_name().c_str() << " : " << unconstraintedUnits[i]->to_cstr(&errcode, "ERROR") << "]"; + ret = CONSTRAINT_ERROR; + } + return ret; + } + + int Configure :: printKeyConstraint(const char *key_path, const char *range) + { + if(range != NULL){ + int ret = check_once(range); + if(ret != 0){ + return ret; + } + } + if(_idl == NULL){ + LOG(WARNING) << + "Configure.printKeyConstraint: conf not constrainted, please check_once() or specify a range file"; + return CONSTRAINT_ERROR; + } + + str_t key = str_t(key_path); + int key_depth = 0; + confIDL :: group_t *cur_group = NULL; + for(size_t i = 0; i < key.length();){ + if(key[i] != '.'){ + ++ i; + continue; + } + if(i == 0){ + LOG(WARNING) << + "Configure.printKeyConstraint: key_path[" << key_path << "] is not well formatted!"; + return CONSTRAINT_ERROR; + } + str_t group_var = key.substr(0, i); + key = key.substr(i+1); + i = 0; + ++ key_depth; + + confIDL :: var_map_t * vmap = (key_depth == 1) ? &_idl->var_map : &cur_group->var_map; + confIDL :: var_map_t :: iterator vitr = vmap->find(group_var); + if(vitr == vmap->end()){ + LOG(WARNING) << + "Configure.printKeyConstraint: var[" << group_var.c_str() << "] in key_path[" << key_path << "] is not found or not constrainted!"; + return CONSTRAINT_ERROR; + } + + str_t group_type = vitr->second->type.data; + confIDL :: group_map_t :: iterator gitr = _idl->group_map.find(group_type); + if(gitr == _idl->group_map.end()){ + LOG(WARNING) << + "Configure.printKeyConstraint: type[" << group_type.c_str() << "] of var[" << group_var.c_str() << "] in key_path[" << key_path << "] is not found!"; + return CONSTRAINT_ERROR; + } + cur_group = gitr->second; + } + + confIDL :: var_map_t * vmap = (key_depth == 0) ? &_idl->var_map : &cur_group->var_map; + confIDL :: var_map_t :: iterator itr = vmap->find(key); + if(itr == vmap->end()){ + LOG(WARNING) << + "Configure.printKeyConstraint: var[" << key.c_str() << "] in key_path[" << key_path << "] is not found or not constrainted!"; + return CONSTRAINT_ERROR; + } + + LOG(INFO) << "Configure.printKeyConstraint: the constraints of key[" << key_path << "]:"; + confIDL :: cf_list_t &cf_list = itr->second->cf_list; + confIDL :: cf_list_t :: iterator cf_it; + for(cf_it=cf_list.begin(); cf_it!=cf_list.end(); ++cf_it){ + confIDL :: cf_t &cf = **cf_it; + LOG(INFO) << "\t\t\tconstraint function: " << cf.func.data.c_str() << "()"; + confIDL :: meta_list_t &arg_list=cf.arg_list; + confIDL :: meta_list_t :: iterator arg_it; + for(arg_it=arg_list.begin();arg_it!=arg_list.end();++arg_it){ + confIDL :: meta_t &arg=**arg_it; + LOG(INFO) << "\t\t\t\tfunction argument: " << arg.data.c_str(); + } + } + return 0; + } +} + + + + + diff --git a/configure/Configure.h b/configure/Configure.h new file mode 100644 index 0000000000000000000000000000000000000000..46e0a8dd4b7aacc4d865e7759c895f3b55bf9161 --- /dev/null +++ b/configure/Configure.h @@ -0,0 +1,279 @@ +/*************************************************************************** + * + * Copyright (c) 2008 Baidu.com, Inc. All Rights Reserved + * $Id: Configure.h,v 1.15 2010/04/13 09:59:41 scmpf Exp $ + * + **************************************************************************/ + + + +/** + * @file Configure.h + * @author yingxiang(com@baidu.com) + * @date 2008/12/21 17:59:12 + * @version $Revision: 1.15 $ + * @brief 新的Configure库 + * 更多资料请参见: + * http://com.baidu.com/twiki/bin/view/Main/LibConfig + * + **/ + + +#ifndef __CONFIGURE_H_ +#define __CONFIGURE_H_ + +#include "ConfigGroup.h" +#include "sys/uio.h" +#include + +#define CONFIG_GLOBAL "GLOBAL" +#define CONFIG_INCLUDE "$include" + +namespace confIDL{ + struct idl_t; +} +namespace comcfg{ + const int MAX_INCLUDE_DEPTH = 1; + class Reader; + enum{ + CONFIG_VERSION_1_0, //Config Version 1.0 + }; + /** + * @brief 配置句柄,其实是一个全局的[GLOBAL]配置组 + * + * Configure是immutable的,即:无法修改,无法复用 + * 所以load, rebuild, loadIVar三个接口互斥 + * 要重新load,必须创建一个新的Configure句柄进行操作 + * + */ + class Configure : public ConfigGroup{ + public: + /** + * @brief 从指定的文件中载入配置文件和约束文件 + * + * @param [in] path : const char* 配置文件的路径 + * @param [in] conf : const char* 配置文件名 + * @param [in] range : const char* 约束文件 + * @param [in] version : int 文件格式的版本(暂未使用) + * @return int 0表示成功,其余为失败 + * bsl::CONSTRAINT_ERROR 约束检查错误(如果不关心约束,可无视此错误) + * bsl::CONFIG_ERROR 配置文件解析错误 + * bsl::ERROR 其它错误 + * @retval + * @see + * @author yingxiang + * @date 2008/12/30 01:36:54 + **/ + int load(const char * path, const char * conf, const char * range = NULL, int version = CONFIG_VERSION_1_0); + /** + * @brief 从指定的文件中载入配置文件和约束文件,并检查是否有group重名情况,最后打印到日志 + * 默认行为与load()接口相同 + * + * @param [in] path : const char* 配置文件的路径 + * @param [in] conf : const char* 配置文件名 + * @param [in] range : const char* 约束文件 + * @param [in] dupLevel : enum GROUP_DUP_LEVEL 指定的重名等级,下列值之一 + * 0: GROUP_DUP_LEVEL0 不检测是否有重名,与原接口行为相同,不打印 + * 1: GROUP_DUP_LEVEL1 检测第一级group是否重名 + * 2: GROUP_DUP_LEVEL2 检测所有深度下group是否重名 + * 3: GROUP_DUP_LEVEL3 记录所有group名 + * @param [in] version : int 文件格式的版本(暂未使用) + * @return int 0表示成功,其他值为失败 + * bsl::CONSTRAINT_ERROR 约束检查错误(如果不关心约束,可无视此错误) + * bsl::CONFIG_ERROR 配置文件解析错误 + * bsl::ERROR 其它错误 + * DUPLICATED_GROUP 有组重名,在GROUP_DUP_LEVEL0和GROUP_DUP_LEVEL3下,正常则返回0 + * @retval + * @see + * @author linjieqiong + * @date 20012/12/28 11:36:54 + **/ + int load_ex(const char * path, const char * conf, const char * range = NULL, + int dupLevel = GROUP_DUP_LEVEL0, int version = CONFIG_VERSION_1_0); + /** + * @brief 从指定的文件中载入配置文件和约束文件,如果存在未被约束的配置项,则打印并报错 + * + * @param [in] path : const char* 配置文件的路径 + * @param [in] conf : const char* 配置文件名 + * @param [in] range : const char* 约束文件,如果指定了约束文件,则会在会后打印出未被约束的配置项 + * @param [in] version : int 文件格式的版本(暂未使用) + * @return int 0表示成功,其余为失败 + * bsl::CONSTRAINT_ERROR 约束检查错误(不满足约束,存在未被约束的配置项)(如果不关心约束,可无视此错误) + * bsl::CONFIG_ERROR 配置文件解析错误 + * bsl::ERROR 其它错误 + * @retval + * @see + * @author linjieqiong + * @date 2013/01/06 21:36:54 + **/ + int load_ex2(const char * path, const char * conf, const char * range = NULL, int version = CONFIG_VERSION_1_0); + /** + * @brief 将数据串行化到一个字节流,可以发网网络 + * 如果将这个字节流直接写入磁盘文件,不可以直接load回来,而需要读取后再rebuild + * @note 本api只能序列化原始配置文件镜像或ivar,不能反映在内存中对configure对象的修改 + * 如需序列化实时内容,请使用dump_ex() + * + * @param [out] size_t * : 输出的字节流长度 + * @return char* 输出的字节流 + * @retval + * @see + * @author yingxiang + * @date 2008/12/30 01:38:35 + **/ + char * dump(size_t *); + + /** + * @brief 序列化configure对象的实时内存内容 + * + * @param [in] buf : dump_ex()输出的位置 + * @param [in] bufsize : buf的长度 + * @param [in] restoreComment : const int + * 0 RC_COMMENT 还原配置文件中的注释到输出 + * 1 RC_NO_COMMENT 不还原配置文件中的注释内容到输出 + * 2 RC_POSITION 还原的同时标记配置项在配置文件中的位置,格式: + * #this is the original comment + * #[FILE:LINE] + * [group] + * #[FILE:LINE] + * key : value + * + * @return int 写入buf的数据长度 + * 如果发生错误,返回-1 + * 如果buf不够,返回实际长度的相反数 + * 自动添加\0 + * + * @author linjieqiong + * @version 1.2.9 + * @date 2013/04/24 14:56:31 + */ + int dump_ex(char *buf, const size_t bufsize, const int restoreComment = 0); + + /** + * @brief 根据dump的字节流创建Configure + * 根据字节流重建一个Configure的步骤是: + * 1,getRebuildBuffer(size) 获取一个内部缓冲区 + * 2,将字节流中的数据拷贝到这个缓冲区 + * 3,调用rebuild重建数据 + * + * 调用本接口会清空现有的数据。 + * + * @param [in] size : size_t 字节流长度 + * @return char* 缓冲区 + * @retval + * @see + * @author yingxiang + * @date 2008/12/30 01:39:38 + **/ + char * getRebuildBuffer(size_t size); + /** + * @brief 根据获得的字节流重建Configure数据 + * + * @return int 0为成功,其他为失败 + * @retval + * @see + * @author yingxiang + * @date 2008/12/30 01:43:05 + **/ + int rebuild(); + /** + * @brief 检查所有配置文件的最后更新时间(包括被$include)的配置文件 + * $include 限制层数为:MAX_INCLUDE_DEPTH + * 在执行lastConfigModify(),应确保原来的配置文件都没有被删除 + * + * @return time_t 所有配置文件中的最后更新时间 + * 返回0表示出错 + * @retval + * @see + * @author yingxiang + * @date 2009/03/10 14:23:47 + **/ + time_t lastConfigModify(); + /** + * @brief 从一个IVar载入配置文件的数据 + * 本接口与load/rebuild互斥 + * 这个IVar必须是一个Dict类型 + * + * @return int 0成功,其余失败 + * @retval + * @see + * @author yingxiang + * @date 2009/03/11 17:29:56 + **/ + int loadIVar(const bsl::var::IVar & ); + /** + * @brief 用约束文件检查一次 + * @param [in] range : const char* 约束文件 + * @param [in] version : int 文件格式的版本(暂未使用) + * @return int 0表示成功,其余为失败 + * bsl::CONSTRAINT_ERROR 约束检查错误 + * bsl::ERROR 其它错误 + **/ + int check_once(const char * range, int version = CONFIG_VERSION_1_0); + /** + * @brief 检查conf文件中所有unit是否被约束,如果存在未被约束的项,则打印并返回错误 + * + * @return int 0 成功,其他是错误号 + * bsl::CONSTRAINT_ERROR 约束检查错误 + * @author linjieqiong + * @date 2013/01/07 17:32:10 + **/ + int checkConstraint(); + /** + * @brief 获取一个key的约束函数列表,注意group和array类型的约束函数是无作用的 + * @param [in] key_path : const char* 该key在conf文件中的完整路径 + * @param [in] range : const char* 约束文件, + * 如果非空,先进行约束检查; + * 如果为空,将使用最近一次load类函数或check_once()函数所使用的约束文件 + * + * @return int 0 成功,其他是错误号 + * bsl::CONSTRAINT_ERROR 约束检查错误 + * bsl::ERROR 其它错误 + * + * @author linjieqiong + * @date 2013/01/10 10:50:00 + **/ + int printKeyConstraint(const char *key_path, const char *range = NULL); + + virtual ConfigUnit & operator= (ConfigUnit & unit) { + return ConfigUnit::operator=(unit); + } + + Configure(); + ~Configure(); + protected: + + int load_1_0(const char * path, const char * conf, const char *range); + void pushSubReader(const char * conf, int level = -1); + friend class Reader; + friend class Constraint; + friend class ConfigGroup; + friend class ConfigUnit; + friend struct dump_conf; + friend int cb_dumpConf(ConfigUnit *, void *); + + struct ReaderNode{//每一个conf文件 + str_t filename; + Reader * reader; + int level; + }; + std::vector _readers; + str_t _path; + Reader * _cur_reader;//当前在处理的文件 + int _cur_level;//当前文件的深度($include的层次) + char * _dump_buffer; + size_t _dump_size; + confIDL::idl_t * _idl; + void changeSection(str_t str); + void pushPair(const str_t& key, const str_t& value); + + ConfigGroup* _section; + //depth是一个调试变量 + int _depth; + }; +} + + + +#endif //__CONFIGURE_H_ + +/* vim: set ts=4 sw=4 sts=4 tw=100 */ diff --git a/configure/EnvGet.h b/configure/EnvGet.h new file mode 100644 index 0000000000000000000000000000000000000000..4b9310667596752bf86d432b6339bf39bb31143d --- /dev/null +++ b/configure/EnvGet.h @@ -0,0 +1,73 @@ +/*************************************************************************** + * + * Copyright (c) 2009 Baidu.com, Inc. All Rights Reserved + * EnvGet.h 2009/07/17 14:24:22 zhang_rui Exp + * + **************************************************************************/ + + + +/** + * @file EnvGet.h + * @author zhang_rui(com@baidu.com) + * @date 2009/07/17 14:24:22 + * @brief + * + **/ + + + +#ifndef __ENVGET_H_ +#define __ENVGET_H_ + +#include "utils/cc_struct.h" +#define ENV_CHAR_DECL(envstr, deft) \ + static const char g_char_##envstr = (NULL == getenv(#envstr))? \ + deft : getenv(#envstr)[0] +#define ENV_UCHAR_DECL(envstr, deft) \ + static const unsigned char g_uchar_##envstr = (NULL == getenv(#envstr))? \ + deft : (unsigned char)getenv(#envstr)[0] + +#define ENV_INT16_DECL(envstr, deft) \ + static const int16_t g_int16_##envstr = (NULL == getenv(#envstr))? \ + deft : (int16_t)strtoll(getenv(#envstr), NULL, 0) +#define ENV_UINT16_DECL(envstr, deft) \ + static const u_int16_t g_uint16_##envstr = (NULL == getenv(#envstr))? \ + deft : (u_int16_t)strtoll(getenv(#envstr), NULL, 0) + +#define ENV_INT32_DECL(envstr, deft) \ + static const int g_int32_##envstr = (NULL == getenv(#envstr))? \ + deft : (int)strtoll(getenv(#envstr), NULL, 0) + +#define ENV_UINT32_DECL(envstr, deft) \ + static const u_int32_t g_uint32_##envstr = (NULL == getenv(#envstr))? \ + deft : (u_int32_t)strtoll(getenv(#envstr), NULL, 0) + +#define ENV_INT64_DECL(envstr, deft) \ + static const long long g_int64_##envstr = (NULL == getenv(#envstr))? \ + deft : (long long)strtoll(getenv(#envstr), NULL, 0) +#define ENV_UINT64_DECL(envstr, deft) \ + static const unsigned long long g_uint64_##envstr = (NULL == getenv(#envstr))? \ + deft : (unsigned long long)strtoull(getenv(#envstr), NULL, 0) + +#define ENV_FLOAT_DECL(envstr, deft) \ + static const float g_float_##envstr = (NULL == getenv(#envstr))? \ + deft : (float)strtod(getenv(#envstr), NULL) +#define ENV_DOUBLE_DECL(envstr, deft) \ + static const float g_double_##envstr = (NULL == getenv(#envstr))? \ + deft : (double)strtod(getenv(#envstr), NULL) + +#define ENV_BSLSTR_DECL(envstr, deft) \ + static const bsl_string g_bslstr_##envstr = (NULL == getenv(#envstr))? \ + deft : bsl_string(getenv(#envstr)) + + + + + + + + +#endif //__ENVGET_H_ + +/* vim: set ts=4 sw=4 sts=4 tw=100 */ diff --git a/configure/FileReloader.cpp b/configure/FileReloader.cpp new file mode 100644 index 0000000000000000000000000000000000000000..35b18e3ffeff000caf44d8cfb45cf0ee1a86fb8a --- /dev/null +++ b/configure/FileReloader.cpp @@ -0,0 +1,111 @@ +/*************************************************************************** + * + * Copyright (c) 2010 Baidu.com, Inc. All Rights Reserved + * + **************************************************************************/ + + + +/** + * @file FileReloader.cpp + * @author zhang_rui(com@baidu.com) + * @date 2010-2-1 + * @brief + * + **/ + +#include "FileReloader.h" +#include +#include +#include +#include + +namespace comcfg { + +static time_t get_file_time(const char * filename) { + + if (NULL == filename) { + LOG(WARNING) << "FileReloader.add_file_monitor : NULL filename"; + return -1; + } + time_t t = time_t(0); + struct stat st; + if(stat(filename, &st) == 0){ + if(t < st.st_mtime){ + t = st.st_mtime; + } + } else { + LOG(WARNING) << "FileReloader add_file_monitor : Can not stat file " << filename; + return -1; + } + return t; +} + +int FileReloader :: monitor() { + int ret = 0; + bsl::hashmap :: iterator itr; + for(itr = _filemap.begin(); itr != _filemap.end(); ++itr){ + config_filemonitor_t * fm = itr->second; + time_t tnow = get_file_time(itr->first.c_str()); + if (tnow<0) { + return -1; + } + if (tnow > fm->_last_modify) { + fm->_last_modify = tnow; + fm->callback(itr->first.c_str(), fm->param); + ++ret; + } + } + return ret; +} + +int FileReloader :: add_file_monitor(const char * filename, file_change_cb_t proc, void * prm) { + if (NULL == filename) { + LOG(WARNING) << "FileReloader.add_file_monitor : NULL filename"; + return -1; + } + if (NULL == proc) { + LOG(WARNING) << "FileReloader.add_file_monitor : NULL callback"; + return -1; + } + if (!_filemap.is_created()) + { + LOG(WARNING) << "Initial FileReloader : create filemap"; + _filemap.create(256); + } + time_t t = get_file_time(filename); + if (0 > t) { + return -1; + } + + config_filemonitor_t * pmon = new config_filemonitor_t; + pmon->callback = proc; + pmon->param = prm; + pmon->_last_modify = t; + + bsl::string kstr = filename; + bsl::hashmap :: _Pair *itr; + itr = _filemap.find(kstr); + if(NULL != itr) { + if (NULL != itr->second){ + delete itr->second; + } + LOG(WARNING) << "FileReloader.add_file_monitor : same file("<< filename << ") exist, update callback(" << proc << "), param(" << prm << ")"; + } + _filemap.set(kstr,pmon,1); + return 0; +} + +FileReloader :: ~FileReloader() { + bsl::hashmap::iterator itr; + for(itr = _filemap.begin(); itr != _filemap.end(); ++itr) { + if (NULL != itr->second) { + delete itr->second; + } + } + if(0 != _filemap.destroy()){ + LOG(WARNING) << "FileReloader.~FileReloader : _filemap.destory() failed "; + } +} + +}//namespace comcfg diff --git a/configure/FileReloader.h b/configure/FileReloader.h new file mode 100644 index 0000000000000000000000000000000000000000..76e3cbf9f3ab4269ba3b352546c42f4b1d796f7b --- /dev/null +++ b/configure/FileReloader.h @@ -0,0 +1,70 @@ +/*************************************************************************** + * + * Copyright (c) 2010 Baidu.com, Inc. All Rights Reserved + * + **************************************************************************/ + + + +/** + * @file FileReloader.h + * @author zhang_rui(com@baidu.com) + * @date 2010-2-1 + * @brief + * + **/ + + +#ifndef FILERELOADER_H_ +#define FILERELOADER_H_ + +#include +#include "butil/logging.h" +#include "bsl/containers/string/bsl_string.h" +#include "bsl/containers/hash/bsl_hashmap.h" + +namespace comcfg { + +typedef int (*file_change_cb_t)(const char * filename, void * prm); /**< 处理文件变更的回调函数类型 */ + +typedef struct _config_filemonitor_t { + file_change_cb_t callback; /**< 处理文件变更的回调函数 */ + void * param; /**< 参数 */ + time_t _last_modify; /**< 最近修改时间 */ +} config_filemonitor_t; + +class FileReloader { + typedef bsl::hashmap config_filemonmap_t; +private : + config_filemonmap_t _filemap; +public : + /** + * @brief 检查配置文件是否发生变化。 + * + * @return int 0表示没有不安化,1表示配置发生了变化并进行了通知,-1表示文件stat失败,可能被删除。 + **/ + int monitor(); + /** + * @brief 增加监控整个文件的回调 + * + * @param [in] proc : file_change_cb_t 处理回调函数 + * @return int 0表示成功,-1为失败 + **/ + int add_file_monitor(const char * filename, file_change_cb_t proc, void * prm); + + /** + * @brief 构造函数 + **/ + FileReloader(){ + _filemap.create(256); + } + + /** + * @brief 析构函数 + **/ + ~FileReloader(); +}; + +}//namespace comcfg + +#endif /* FILERELOADER_H_ */ diff --git a/configure/Makefile b/configure/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..226de6720425f9f3d208c248f99136f4062b9b81 --- /dev/null +++ b/configure/Makefile @@ -0,0 +1,202 @@ +########################################################################### +# Automatically generated by comake (1.0.0) # +########################################################################### + +#################设计系统参数####################################### +WORKROOT ?= ../../ +IDLCC := $(WORKROOT)/public/idlcompiler/output/bin/mcy +RPCCC := $(WORKROOT)/public/ubrpc/servlet/ubrpcgen +CC := g++ +CXX := g++ +LEX := flex +YACC := yacc +CFLAGS := -pipe -fsigned-char -Wall -W -g -fPIC +CXXFLAGS := -pipe -fsigned-char -Wall -W -g -fPIC +LEXFLAGS := +YACCFLAGS := +IDLFLAGS := +LINKFLAGS := -rdynamic +LINK := g++ +AR := ar cqs +RANLIB := +COMAKE := comake + +###############baidu lib 的32位 64位支持################# +HARDWARE_PLATFORM := $(shell uname -m) +ifeq ($(HARDWARE_PLATFORM),x86_64) + lib2=lib2-64 + third=third-64 +else + lib2=lib2-arm32 + third=third-arm32 +endif +########################################## + +# 编译参数 +DEP_INCPATH = -I$(WORKROOT)/public/spreg/output//include/ -I$(WORKROOT)/$(lib2)/ullib//include/ -I$(WORKROOT)/$(third)/pcre//include/ -I$(WORKROOT)/$(lib2)/bsl//include/ +DEP_LDFLAGS = -L$(WORKROOT)/$(lib2)/bsl//lib/ -L$(WORKROOT)/$(third)/pcre//lib/ -L$(WORKROOT)/$(lib2)/ullib//lib/ -L$(WORKROOT)/public/spreg/output//lib/ +DEP_LDLIBS = -lspreg -lpcre -lpcrecpp -lpcreposix -lbsl -lullib +INCPATH = -I. -Icompiler/src +MAKDEP = Makefile.dep + + +#start target +first : all + +############# 默认推到公式 +.SUFFIXES: .c .cpp .cc .cxx .C .idl .des +.PRECIOUS: %.cpp + +.cpp.o: + $(CXX) -c -o $@ $< $(CXXFLAGS) $(CPPFLAGS) $(INCPATH) + +.cc.o: + $(CXX) -c -o $@ $< $(CXXFLAGS) $(CPPFLAGS) $(INCPATH) + +.cxx.o: + $(CXX) -c -o $@ $< $(CXXFLAGS) $(CPPFLAGS) $(INCPATH) + +.C.o: + $(CXX) -c -o $@ $< $(CXXFLAGS) $(CPPFLAGS) $(INCPATH) + +.c.o: + $(CC) -c -o $@ $< $(CFLAGS) $(CPPFLAGS) $(INCPATH) + +.idl.cpp: + $(IDLCC) --ns=$(*F) -o $* $< $(CPPFLAGS) $(INCPATH) $(IDLFLAGS) + +############# +###cpp 支持 +%info : % + ccp $< +############# + + +#__$MAKEFILE_RULES$__ + + + +###############编译目标 +all : target output +.PHONY : all clean test output comake src conf + +target : libconfig.a +#target : rpcidl libconfig.a +#target : +#__$target_CMDLINE$__ + +rpcidl : + +clean_rpcidl : + + +test : + + +comake : + -make clean + -comake + +#-include $(MAKDEP) +-include $(MAKDEP) + +#----------------build target : libconfig.a-------------------- + +libconfig.a : CC := g++ +libconfig.a : CXX := g++ +libconfig.a : CXXFLAGS := -pipe -fsigned-char -Wall -W -g -fPIC -Woverloaded-virtual +libconfig.a : CPPFLAGS := +libconfig.a : IDLFLAGS := +libconfig.a : CFLAGS := -pipe -fsigned-char -Wall -W -g -fPIC +libconfig.a : INCPATH := -I. -Icompiler/src $(DEP_INCPATH) +libconfig.a : LDLIBS := -lm -lpthread $(DEP_LDLIBS) +libconfig.a : LDFLAGS := $(DEP_LDFLAGS) +libconfig.a : LINKFLAGS := -rdynamic + +libconfig_a_SOURCES := $(wildcard comake_autogen.cpp FileReloader.cpp ConfigReloader.cpp CmdOption.cpp ConfigError.cpp ConfigGroup.cpp ConfigUnit.cpp Configure.cpp constraint/Constraint.cpp constraint/ConstraintFunction.cpp constraint/cc_default.cpp reader/RawData.cpp reader/Reader.cpp utils/init.cpp utils/trans.cpp cfgext.cpp cfgflag.cpp compiler/src/idl.c compiler/src/idl_lex.c compiler/src/idl_gram.c) +#libconfig_a_HEADERS := $(wildcard *.h) +libconfig_a_HEADERS := *.h +libconfig_a_IDLSRC := $(wildcard __$IDLSRC_VALUE$__) +libconfig_a_IDLSRCCPP := $(patsubst %.idl,%.cpp, $(libconfig_a_IDLSRC)) +libconfig_a_IDLSRCH := $(patsubst %.idl,%.h, $(libconfig_a_IDLSRC)) +libconfig_a_CONFDES := $(wildcard __$CONFDES$_VALUE$__ libconfig.a.des) +libconfig_a_CONFRANGE := $(patsubst %.des,%.range, $(libconfig_a_CONFDES)) +libconfig_a_OBJS := $(libconfig_a_IDLSRC:.idl=.o) +libconfig_a_OBJS += $(libconfig_a_SOURCES:.c=.o) +libconfig_a_OBJS := $(libconfig_a_OBJS:.cc=.o) +libconfig_a_OBJS := $(libconfig_a_OBJS:.cpp=.o) +libconfig_a_OBJS := $(libconfig_a_OBJS:.cxx=.o) +libconfig_a_OBJS := $(libconfig_a_OBJS:.C=.o) +libconfig_a_OBJS := $(libconfig_a_OBJS:.idl=.o) +libconfig_a_OBJS := $(libconfig_a_OBJS:.yacc=.o) +libconfig_a_OBJS := $(libconfig_a_OBJS:.lex=.o) +libconfig.a : $(libconfig_a_OBJS) + rm -f $@ || echo + ar cr $@ $^ + + +define libconfig_a_output + mkdir -p output output/lib output/include output/include/utils output/include/constraint + cp -rf *.h output/include/ + cp -rf utils/*.h output/include/utils/ + cp -rf constraint/*.h output/include/constraint/ + cp -rf compiler/src/idl_conf_if.h output/include/ + cp libconfig.a output/lib +endef + + +define libconfig_a_clean + -rm -rf $(libconfig_a_OBJS) $(libconfig_a_IDLSRCCPP) $(libconfig_a_IDLSRCH) libconfig.a.range conf/libconfig.a.range + -rm -rf libconfig.a + -rm -rf output + -rm -rf ccp_output.error ccp_output_scm.xml ccp_output.xml ccp_output.pclint ccp_output.txt +endef + + +define libconfig_a_ccpc + ccp $(libconfig_a_SOURCES) --formatter vim +endef + + +define libconfig_a_cov + +endef + + + + +#---------------------end build target : libconfig.a------------------ + +define _output + $(libconfig_a_output) +endef + + +define _clean + $(libconfig_a_clean) +endef + + +ccpc : + $(libconfig_a_ccpc) + +cov : + cov01 -1 + make clean + make + cov01 -0 + + + +output : libconfig.a + $(_output) + rm -rf $(MAKDEP) + +$(MAKDEP) : $(wildcard comake_autogen.cpp FileReloader.cpp ConfigReloader.cpp CmdOption.cpp ConfigError.cpp ConfigGroup.cpp ConfigUnit.cpp Configure.cpp constraint/Constraint.cpp constraint/ConstraintFunction.cpp constraint/cc_default.cpp reader/RawData.cpp reader/Reader.cpp utils/init.cpp utils/trans.cpp cfgext.cpp cfgflag.cpp compiler/src/idl.c compiler/src/idl_lex.c compiler/src/idl_gram.c) + -$(CC) -MG -MM $(CPPFLAGS) $(INCPATH) $(DEP_INCPATH) $^ > $@ + +clean: + $(_clean) + rm -rf $(MAKDEP) + + diff --git a/configure/README b/configure/README new file mode 100644 index 0000000000000000000000000000000000000000..ffcf42e86d64a756ec69f6532206407082f07e7a --- /dev/null +++ b/configure/README @@ -0,0 +1,6 @@ +1 鎵嬪姩缂栬瘧鏈簱鐨勬柟寮忥細 +make clean +export MAC=64 +make + +2 configure瀵硅薄涓嶆敮鎸佹嫹璐濊涔夛紝璇峰嬁浣跨敤浼犲兼柟寮忎紶閫抍onfigure瀵硅薄 diff --git a/configure/build.sh b/configure/build.sh new file mode 100644 index 0000000000000000000000000000000000000000..ff507a277c7554164dbc1bf91730742fad45204a --- /dev/null +++ b/configure/build.sh @@ -0,0 +1,25 @@ +cd ../../ +#rm -r lib2/bsl -f +cvs co lib2/bsl + +#rm -r lib2-64/bsl -f +cvs co lib2-64/bsl + +#rm -r lib2-64/ullib -f +cvs co lib2-64/ullib + +#rm -r lib2/ullib -f +cvs co lib2/ullib + +#rm -r third/pcre -f +cvs co third/pcre + +#rm -r third-64/pcre -f +cvs co third-64/pcre + +#rm -r public/spreg -f +cvs co public/spreg +make -C public/spreg + +cd public/configure +make diff --git a/configure/build_force.sh b/configure/build_force.sh new file mode 100644 index 0000000000000000000000000000000000000000..29081d8e3b56774129dedf660ee433538077d838 --- /dev/null +++ b/configure/build_force.sh @@ -0,0 +1,25 @@ +cd ../../ +rm -r lib2/bsl -f +cvs co lib2/bsl + +rm -r lib2-64/bsl -f +cvs co lib2-64/bsl + +rm -r lib2-64/ullib -f +cvs co lib2-64/ullib + +rm -r lib2/ullib -f +cvs co lib2/ullib + +rm -r third/pcre -f +cvs co third/pcre + +rm -r third-64/pcre -f +cvs co third-64/pcre + +rm -r public/spreg -f +cvs co public/spreg +make -C public/spreg + +cd public/configure +make diff --git a/configure/cfgext.cpp b/configure/cfgext.cpp new file mode 100644 index 0000000000000000000000000000000000000000..09210f22faefd028d500997a9c2295efade9ad01 --- /dev/null +++ b/configure/cfgext.cpp @@ -0,0 +1,202 @@ +/*************************************************************************** + * + * Copyright (c) 2009 Baidu.com, Inc. All Rights Reserved + * $Id: cfgext.cpp,v 1.4 2009/11/10 04:50:30 scmpf Exp $ + * + **************************************************************************/ + + + +/** + * @file cfgext.cpp + * @author yingxiang(com@baidu.com) + * @date 2009/03/10 21:48:10 + * @version $Revision: 1.4 $ + * @brief + * + **/ + +#include "cfgext.h" +#include "idl_conf_if.h" +#include "Configure.h" + +#define ARRAY_FUNC "array" +#define COMMENT_FUNC "comment" +#define DEFAULT_FUNC "default" + +namespace comcfg{ + + // is basic type + // in constraint/Constraint.cpp + extern bool isBaseType(const str_t & s); + + void printBaseType(confIDL::idl_t * idl, confIDL::var_t * var, str_t * conf, str_t * section, bool isArray); + void printGroup(confIDL::idl_t * idl, confIDL::var_t * var, str_t * conf, str_t * section, bool isArray); + void printVar(confIDL::idl_t * idl, confIDL::var_t * var, str_t * conf, str_t * section); + + void printBaseType(confIDL::idl_t * /*idl*/, confIDL::var_t * var, str_t * conf, str_t * /*section*/, bool isArray){ + //comment + confIDL::cf_map_t::iterator cfitr = var->cf_map.find(str_t(COMMENT_FUNC)); + if(cfitr != var->cf_map.end() && cfitr->second->arg_list.size() > 0){ + conf->appendf("#%s\n", cfitr->second->arg_vec[0]->data.c_str()); + } + //key + conf->appendf("%s%s : ", isArray?"@":"", var->name.data.c_str()); + + //default value + cfitr = var->cf_map.find(str_t(DEFAULT_FUNC)); + if(cfitr != var->cf_map.end() && cfitr->second->arg_list.size() > 0){ + conf->appendf("%s", cfitr->second->arg_vec[0]->data.c_str()); + } + //end of line + conf->append("\n"); + } + + void printGroup(confIDL::idl_t * idl, confIDL::var_t * var, str_t * conf, str_t * section, bool isArray){ + confIDL::group_map_t::iterator gitr = idl->group_map.find(var->type.data); + if(gitr == idl->group_map.end()){ + throw ConfigException() << BSL_EARG << "Unknown type : " << var->type.data.c_str() << " [ " + << var->type.file.c_str() << " : " << var->type.lineno << " }"; + } + if(*section == str_t(CONFIG_GLOBAL)){ + *section = ""; + section->appendf("%s%s", isArray?"@":"", var->name.data.c_str()); + } + else{ + if(strstr(section->c_str(), "@") != NULL){ + //前面的已经有数组了,只能使用相对位置 + str_t tmp; + for(int i = 0; i < (int)section->size(); ++i){ + if((*section)[i] == '.'){ + tmp.append("."); + } + } + *section = tmp; + } + section->appendf(".%s%s", isArray?"@":"", var->name.data.c_str()); + } + conf->appendf("\n[%s]\n", section->c_str()); + confIDL::var_list_t::iterator vitr; + str_t bak_section = *section; + for(vitr = gitr->second->var_list.begin(); vitr != gitr->second->var_list.end(); ++vitr){ + if(isBaseType((*vitr)->type.data)){ + printVar(idl, *vitr, conf, section); + } + } + for(vitr = gitr->second->var_list.begin(); vitr != gitr->second->var_list.end(); ++vitr){ + if(! isBaseType((*vitr)->type.data)){ + if(*section != bak_section){ + *section = bak_section; + //conf->appendf("\n[%s]\n", section->c_str()); + } + printVar(idl, *vitr, conf, section); + } + } + } + + + + void printVar(confIDL::idl_t * idl, confIDL::var_t * var, str_t * conf, str_t * section){ + bool isArray = false; + int arrSize = 1; + + confIDL::cf_map_t::iterator cfitr = var->cf_map.find(str_t(ARRAY_FUNC)); + if(cfitr != var->cf_map.end()){ + isArray = true; + unsigned long long s; + if(cfitr->second->arg_list.size() > 0){ + if(Trans::str2uint64(cfitr->second->arg_vec[0]->data, &s) == 0){ + arrSize = (int)s; + } + } + } + + if(arrSize <= 0){ + arrSize = 1; + } + + str_t bak_section = *section; + //*section = bak_section; + if(isBaseType(var->type.data)){ + printBaseType(idl, var, conf, section, isArray); + } + else{ + printGroup(idl, var, conf, section, isArray); + } + //增加注释的元素 + if (1 < arrSize) + { + //把数组元素的配置字符串写到cmt中 + str_t cmt = ""; + str_t cmted = ""; + *section = bak_section; + if(isBaseType(var->type.data)){ + printBaseType(idl, var, &cmt, section, isArray); + } + else{ + cmted.append("\n"); + printGroup(idl, var, &cmt, section, isArray); + } + cmt.append("\n"); + //对cmt中每行字符串前面增加#,改写到cmted中 + int prelinehead = 0; + for (int i=0; i<(int) cmt.size(); ++i) + { + if ('\n'==cmt[i]) + { + if (i>prelinehead){ + cmted.append("#").append(cmt.substr(prelinehead, i - prelinehead + 1)); + } + prelinehead = i+1; + } + } + //将注释的配置字符串cmted加到conf中 + conf->append(cmted); + } + } + + + str_t autoConfigGen(const char * range_file){ + confIDL::idl_t * idl; + idl = confIDL::alloc_idl(); + + load_idl(range_file, idl); + if(idl->retval != 0){ + confIDL:: err_list_t :: iterator itr; + ConfigException e; + e << range_file << ": Read File Error\n"; + for(itr = idl->err_list.begin(); itr != idl->err_list.end(); ++itr){ + e << itr->file.c_str() << ":" << itr->lineno << " " << itr->data.c_str() << "\n"; + } + free_idl(idl); + throw e; + } + + confIDL :: var_list_t :: iterator vitr; + str_t conf; + str_t section = CONFIG_GLOBAL; + for(vitr = idl->var_list.begin(); vitr != idl->var_list.end(); ++vitr){ + if(isBaseType((*vitr)->type.data) && section != CONFIG_GLOBAL){ + conf.append("\n[" CONFIG_GLOBAL "]\n"); + } + section = CONFIG_GLOBAL; + printVar(idl, *vitr, &conf, §ion); + } + free_idl(idl); + return conf; + } + + + + + + + + + + + + +}//namespace comcfg + +/* vim: set ts=4 sw=4 sts=4 tw=100 */ diff --git a/configure/cfgext.h b/configure/cfgext.h new file mode 100644 index 0000000000000000000000000000000000000000..5db9436e0a394a519d52d3d6576639b48817a036 --- /dev/null +++ b/configure/cfgext.h @@ -0,0 +1,59 @@ +/*************************************************************************** + * + * Copyright (c) 2009 Baidu.com, Inc. All Rights Reserved + * $Id: cfgext.h,v 1.2 2009/03/23 03:14:52 yingxiang Exp $ + * + **************************************************************************/ + + + +/** + * @file cfgext.h + * @author yingxiang(com@baidu.com) + * @date 2009/03/10 21:39:54 + * @version $Revision: 1.2 $ + * @brief + * + **/ + + +#ifndef __CFGEXT_H_ +#define __CFGEXT_H_ + +#include "utils/cc_utils.h" + +namespace comcfg{ +/** + * @brief 根据一个约束文件,自动生成一个空配置文件 + * 线下使用,便于RD生成一份配置文件模板 + * + * @param [in] range_file : const char* 约束文件地址 + * @return bsl::string 返回配置文件的文本内容。直接write到某个文件即可。 + * + * 当出错时抛出ConfigException异常 + * + * @retval + * @see + * @author yingxiang + * @date 2009/03/10 21:42:44 +**/ +bsl::string autoConfigGen(const char * range_file); + + + + + + + + + +}//namespace comcfg + + + + + + +#endif //__CFGEXT_H_ + +/* vim: set ts=4 sw=4 sts=4 tw=100 */ diff --git a/configure/cfgflag.cpp b/configure/cfgflag.cpp new file mode 100644 index 0000000000000000000000000000000000000000..3fa38c07a41c669b8cc6d0fbaa32c711ff10f882 --- /dev/null +++ b/configure/cfgflag.cpp @@ -0,0 +1,269 @@ +/*************************************************************************** + * + * Copyright (c) 2009 Baidu.com, Inc. All Rights Reserved + * $Id: cfgflag.cpp,v 1.3 2009/11/10 04:50:30 scmpf Exp $ + * + **************************************************************************/ + + + +/** + * @file init.cpp + * @author xiaowei(com@baidu.com) + * @date 2009/02/12 13:57:10 + * @version $Revision: 1.3 $ + * @brief + * + **/ + +#include "cfgflag.h" +#include "cfgext.h" + +namespace comcfg +{ + +const char *DEFHELP = + " -d: conf_dir\n" + " -f: conf_file\n" + " -r: range_file\n" + " -h: show this help page\n" + " -t: check config file syntax\n" + " -g: generate config sample file\n" + " -v: show version infomation\n "; + +void Flag::default_version() +{ + std::cout<<"call default_version function, you must reload it"<=0 && s[z] != flag); + return z; +} + +Flag::Flag(fun_t ver, fun_t help) +{ + _modname = ""; + _cfpath = ""; + _cffile = ""; + _cfrange = ""; + _version = ver; + _help = help; +} + +Flag::~Flag() +{ +} + +bsl::string Flag::get_defrange(const bsl::string &file) +{ + bsl::string str=file; + if (file.size() > 5 && file.substr(file.size()-5) == ".conf") { + str = file.substr(0,file.size()-5); + } + str.append(".range"); + return str; +} + +bsl::string Flag::get_defconf(const bsl::string &mod) +{ + int pos = comcfg::rfind(mod.c_str(), '/'); + bsl::string cf; + if (pos < 0) { + cf = bsl::string(mod.c_str()).append(".conf"); + } else { + cf = bsl::string(mod.c_str()+pos+1).append(".conf"); + } + return bsl::string("conf/").append(cf); +} + +int Flag::init(int argc, char **argv, const char *optstr) +{ + int ret = 0; + try { + if (optstr == NULL) { + ret = _opt.init(argc, argv, bsl::string("f:d:r:gtvh").c_str()); + } else { + ret = _opt.init(argc, argv, bsl::string("f:d:r:gtvh").append(optstr).c_str()); + } + if (ret != 0) return ret; + + _modname = argv[0]; + + if (_opt.hasOption("d")) { + _cfpath = _opt["d"].to_cstr(); + } else if (_opt.hasOption("dir")) { + _cfpath = _opt["dir"].to_cstr(); + } else { + _cfpath = ""; + } + + if (_opt.hasOption("f")) { + _cffile = _opt["f"].to_cstr(); + } else if (_opt.hasOption("conf")) { + _cffile = _opt["conf"].to_cstr(); + } else { + _cffile = ""; + } + + if (_opt.hasOption("r")) { + _cfrange = _opt["r"].to_cstr(); + } else { + _cfrange = ""; + } + + if (_opt.hasOption("v") || _opt.hasOption("version")) { + _version(); + exit (0); + } + if (_opt.hasOption("h") || _opt.hasOption("help")) { + _help(); + exit (0); + } + if (_opt.hasOption("t")) { + ret = 0; + try { + ret = this->loadconfig(); + } catch (bsl::Exception &e) { + LOG(WARNING) << "check configure error : exception " << e.what() << ", at " << e.stack(); + ret = -1; + } + if (ret != 0) { + LOG(WARNING) << "check configure[" << this->_cfpath.c_str() << "/" << this->_cffile.c_str() << "] error"; + } else { + LOG(INFO) << "check configure[" << _cfpath.c_str() << "/" << _cffile.c_str() << "] success"; + } + exit (0); + } + if (_opt.hasOption("g")) { + bsl::string file = ""; + try { + auto_def(); + file = comcfg::autoConfigGen(fullpath(_cfpath, _cfrange).c_str()); + } catch (bsl::Exception &e) { + LOG(WARNING) << "auto gen configure error for " << _cfpath.c_str() << "/" << _cffile.c_str() << ":\nExp " << e.what() << ", " << e.name() << ", " << e.stack(); + exit(0); + } + bsl::string path = _cfpath; + path.append("/").append(_cffile); + FILE *fp = fopen(path.c_str(), "w"); + if (fp == NULL) { + LOG(WARNING) << "auto gen configure error for can't open file [" << path.c_str() << "]"; + exit(0); + } + fwrite(file.c_str(), 1, file.size(), fp); + fclose(fp); + LOG(INFO) << "auto configure " << path.c_str() << " success"; + exit (0); + } + + return 0; + } catch (bsl::Exception &e) { + return -1; + } +} + +bsl::string Flag::fullpath(const bsl::string &path, const bsl::string &file) +{ + bsl::string full = path; + return full.append("/").append(file); +} + +bool Flag::file_exist(const char *fn) +{ + FILE *fp = fopen(fn, "r"); + if (fp) { + fclose(fp); + return true; + } + return false; +} + +int Flag::loadconfig() +{ + try { + auto_def(); + const char *r = NULL; + if (file_exist(fullpath(_cfpath, _cfrange).c_str())) { + r = _cfrange.c_str(); + } + if (r != NULL) { + LOG(INFO) << "configure.load(" << _cfpath.c_str() << ", " << _cffile.c_str() << ", " << r << "); check range: " << _cfrange.c_str() << " exist"; + } else { + LOG(INFO) << "configure.load(" << _cfpath.c_str() << ", " << _cffile.c_str() << ", NULL); check range: " << _cfrange.c_str() << " noexist"; + } + int ret = _cfg.load(_cfpath.c_str(), _cffile.c_str(), r); + if (ret != 0) { + return ret; + } + } catch (bsl::Exception &e) { + return -1; + } + return 0; +} + +int Flag::loadconfig(const char *path, const char *conf) +{ + if (path == NULL) { + _cfpath = ""; + } else { + _cfpath = path; + } + if (conf == NULL) { + _cffile = ""; + } else { + _cffile = conf; + } + return loadconfig(); +} + +void Flag::set_confpath(const char *path, const char *file, const char *range) +{ + if (path) { + set_cfpath(path); + } else { + set_cfpath(""); + } + if (file) { + set_cffile(file); + } else { + set_cffile(""); + } + if (range) { + set_cfrange(range); + } else { + set_cfrange(""); + } +} + +void Flag::auto_def() +{ + if (_cffile.size() == 0) { + _cffile = get_defconf(_modname); + } + if (_cfpath.size() == 0) { + int pos = rfind(_cffile.c_str(), '/'); + if (pos >= 0) { + _cfpath = _cffile.substr(0, pos+1); + _cffile = _cffile.substr(pos+1); + } else { + _cfpath = "./"; + } + } + if (_cfrange.size() == 0) { + _cfrange = get_defrange(_cffile); + } +} + +} + +/* vim: set ts=4 sw=4 sts=4 tw=100 noet: */ diff --git a/configure/cfgflag.h b/configure/cfgflag.h new file mode 100644 index 0000000000000000000000000000000000000000..3bdc2d296054d26b69508b7d455d6aa48f2441e3 --- /dev/null +++ b/configure/cfgflag.h @@ -0,0 +1,290 @@ +/*************************************************************************** + * + * Copyright (c) 2009 Baidu.com, Inc. All Rights Reserved + * $Id: cfgflag.h,v 1.3 2009/08/13 07:23:01 scmpf Exp $ + * + **************************************************************************/ + + + +/** + * @file init.h + * @author xiaowei(com@baidu.com) + * @date 2009/02/12 13:57:53 + * @version $Revision: 1.3 $ + * @brief + * + **/ + + +#ifndef __XAUTOFRAME_H_ +#define __XAUTOFRAME_H_ + +#include +#include "Configure.h" +#include "CmdOption.h" + +namespace comcfg +{ + +extern const char *DEFHELP; + +class Flag +{ + + typedef void (*fun_t)(); + + bsl::string _modname; + bsl::string _cfpath; + bsl::string _cffile; + bsl::string _cfrange; + + comcfg::CmdOption _opt; + comcfg::Configure _cfg; + + fun_t _version; + fun_t _help; +public: + /** + * @brief 初始化类 + * + * @param [in/out] ver : fun_t 显示版本的函数 + * @param [in/out] help : fun_t 显示帮助的函数 + * @see + * @author xiaowei + * @date 2009/03/09 15:26:51 + **/ + Flag(fun_t ver=Flag::default_version, fun_t help=Flag::default_help); + + virtual ~Flag(); + + /** + * @brief 根据void main(int argc, void **argv)初始化flag + * + * @param [in/out] argc : int + * @param [in/out] argv : char** + * @param [in/out] optstr : const char* 与CmdOption的第三个参数一致 + * @return int 成功返回0,其他失败 + * @retval + * @see + * @author xiaowei + * @date 2009/03/09 15:28:22 + **/ + virtual int init(int argc, char **argv, const char *optstr=NULL); + + /** + * @brief 返回获取命令行参数的控制句柄 + * + * @return const comcfg::CmdOption& + * @retval + * @see + * @author xiaowei + * @date 2009/03/09 15:29:36 + **/ + inline const comcfg::CmdOption & opt() const { return _opt; } + /** + * @brief 返回获取命令行参数的控制句柄 + * + * @return comcfg::CmdOption& + * @retval + * @see + * @author xiaowei + * @date 2009/03/09 15:30:23 + **/ + inline comcfg::CmdOption & opt() { return _opt; } + /** + * @brief 根据key返回这个key对应的命令行参数值 + * + * @param [in/out] str : const char* 指定的key + * @return const comcfg::ConfigUnit& + * @retval + * @see + * @author xiaowei + * @date 2009/03/09 15:31:41 + **/ + inline const comcfg::ConfigUnit & opt(const char *str) const { return _opt[str]; } + + /** + * @brief 返回配置文件句柄 + * + * @return const comcfg::Configure& + * @retval + * @see + * @author xiaowei + * @date 2009/03/09 15:30:42 + **/ + inline const comcfg::Configure & cfg() const { return _cfg; } + /** + * @brief 返回配置文件句柄 + * + * @return comcfg::Configure& + * @retval + * @see + * @author xiaowei + * @date 2009/03/09 15:31:16 + **/ + inline comcfg::Configure & cfg() { return _cfg; } + + /** + * @brief 根据key返回指定的配置文件项目 + * + * @param [in/out] str : const char* + * @return const comcfg::ConfigUnit& + * @retval + * @see + * @author xiaowei + * @date 2009/03/09 15:32:25 + **/ + inline const comcfg::ConfigUnit & cfg(const char *str) const { return _cfg[str]; } + + /** + * @brief 设置配置路径 + * + * @param [in/out] cfpath : const bsl::string& + * @return void + * @retval + * @see + * @author xiaowei + * @date 2009/03/09 15:43:21 + **/ + inline void set_cfpath(const bsl::string &__cfpath) { _cfpath = __cfpath; } + /** + * @brief 返回配置路径 + * + * @return const char* + * @retval + * @see + * @author xiaowei + * @date 2009/03/09 15:43:34 + **/ + inline const char * cfpath() const { return _cfpath.c_str(); } + + /** + * @brief 设置配置文件名 + * + * @param [in/out] cffile : const bsl::string& + * @return void + * @retval + * @see + * @author xiaowei + * @date 2009/03/09 15:43:42 + **/ + inline void set_cffile(const bsl::string &__cffile) { _cffile = __cffile; } + /** + * @brief 返回配置文件名 + * + * @return const char* + * @retval + * @see + * @author xiaowei + * @date 2009/03/09 15:43:50 + **/ + inline const char * cffile() const { return _cffile.c_str(); } + + /** + * @brief 设置约束文件名 + * + * @param [in/out] cfrange : const bsl::string& + * @return void + * @retval + * @see + * @author xiaowei + * @date 2009/03/09 15:44:00 + **/ + inline void set_cfrange(const bsl::string &__cfrange) { _cfrange = __cfrange; } + /** + * @brief 返回约束文件名 + * + * @return const char* + * @retval + * @see + * @author xiaowei + * @date 2009/03/09 15:44:13 + **/ + inline const char *cfrange() const { return _cfrange.c_str(); } + + /** + * @brief 设置配置文件信息 + * + * @param [in/out] path : const char* 配置文件路径 + * @param [in/out] file : const char* 配置文件名 + * @param [in/out] range : const char* 约束文件名 + * @return void + * @retval + * @see + * @author xiaowei + * @date 2009/03/09 15:44:23 + **/ + void set_confpath(const char *path, const char *file, const char *range=NULL); + + /** + * @brief 设置显示版本函数 + * + * @param [in/out] fun : fun_t + * @return void + * @retval + * @see + * @author xiaowei + * @date 2009/03/09 15:50:01 + **/ + inline void set_version(fun_t fun) { _version = fun; } + /** + * @brief 设置显示帮助函数 + * + * @param [in/out] fun : fun_t + * @return void + * @retval + * @see + * @author xiaowei + * @date 2009/03/09 15:50:13 + **/ + inline void set_help(fun_t fun) { _help = fun; } + + /** + * @brief 读取配置 + * + * @return int 成功返回0,其他失败 + * @retval + * @see + * @author xiaowei + * @date 2009/03/09 15:50:21 + **/ + virtual int loadconfig(); + /** + * @brief 根据指定的配置文件名读取配置 + * + * @param [in/out] path : const char* 配置路径 + * @param [in/out] conf : const char* 配置文件名 + * @return int + * @retval + * @see + * @author xiaowei + * @date 2009/03/09 15:51:05 + **/ + virtual int loadconfig(const char *path, const char *conf); + +protected: + static void default_version(); + static void default_help(); + + /** + * @brief 根据配置文件名,获取默认的约束文件名 + * + * @param [in/out] file : const bsl::string& + * @return bsl::string + * @retval + * @see + * @author xiaowei + * @date 2009/03/09 15:52:10 + **/ + bsl::string get_defrange(const bsl::string &file); + bsl::string get_defconf(const bsl::string &mod); + void auto_def(); + bool file_exist(const char *fn); + bsl::string fullpath(const bsl::string &path, const bsl::string &file); +}; +} + +#endif //__XAUTOFRAME_H_ + +/* vim: set ts=4 sw=4 sts=4 tw=100 noet: */ diff --git a/configure/compiler/Makefile b/configure/compiler/Makefile new file mode 100755 index 0000000000000000000000000000000000000000..d502051848ad5c267c95eb6f0420404bbf146111 --- /dev/null +++ b/configure/compiler/Makefile @@ -0,0 +1,21 @@ +#* -*- makefile -*- +# copy[write] by dirlt(zhang_yan@baidu.com) +# date time:Mon Nov 17 22:44:02 CST 2008 +# file name:Makefile +all: + make -C ./src +clean: + make -C ./src clean + make -C ./demo clean + rm -rf output +test: + make -C ./testcase +mydemo: + make -C ./demo +output: + mkdir ./output + cp -r ./include ./output + cp -r ./lib ./output +dist: + tar czvf ../idlcompiler.tar.gz ../idlcompiler + diff --git a/configure/compiler/demo/Makefile b/configure/compiler/demo/Makefile new file mode 100755 index 0000000000000000000000000000000000000000..66149c22c2d646334071035acdcc5bd90b794ec9 --- /dev/null +++ b/configure/compiler/demo/Makefile @@ -0,0 +1,30 @@ +#* -*- makefile -*- +# copy[write] by dirlt(zhang_yan@baidu.com) +# date time:Mon Nov 17 22:52:18 CST 2008 +# file name:Makefile +CC=g++ +OBJS=main.o +CPPFLAGS=-fsigned-char -Wall -W -pipe -Wno-unused-parameter -g +LDFLAGS=-lpthread -lm -lidlcompiler +INCLUDES=-I../output/include +LDPATH=-L../output/lib +LIB= #create the lib +TARGET=main #create the exe file + +#32-biit and 64-bit platforms +ifeq ($(MAC),64) +else +endif + +all:$(TARGET) +$(TARGET):clean $(OBJS) + $(CC) $(CPPFLAGS) -o $@ $(OBJS) $(LDPATH) $(LDFLAGS) +$(LIB):$(OBJS) + ar cr $(LIB) $(OBJS) +%.o:%.cpp + $(CC) $(INCLUDES) $(CPPFLAGS) -o $@ -c $< +clean: + rm -rf $(OBJS) $(TARGET) $(LIBS) + rm -rf *~ +test: + valgrind ./main `ls ../testcase/*.def` diff --git a/configure/compiler/demo/main.cpp b/configure/compiler/demo/main.cpp new file mode 100755 index 0000000000000000000000000000000000000000..42af024b19622e473671e6264d561fa1e69b7153 --- /dev/null +++ b/configure/compiler/demo/main.cpp @@ -0,0 +1,29 @@ +/* -*- c++ -*- + copy[write] by dirlt(zhang_yan@baidu.com) + date time:Mon Nov 17 17:08:24 CST 2008 + file name:main.cpp */ + +#include +#include +#include "idl_interface.h" +using namespace IDL; + +int main(int argc,char **argv) +{ + int i; + char *file; + idl_t *idl_data; + for(i=1;i -> { } + * -> << | >> + * -> { } + * -> + | - + * -> { } + * -> * | \ + * -> ( ) | number + * number -> [0-9]*.[0-9]* + * + */ + +#include + +#define __expr__error(fmt, arg...) \ +{ \ + fprintf(stdout, "%s:%d "fmt"\n", __FILE__, __LINE__, ##arg); \ +} + +namespace xarthop +{ + +struct int_t {}; +struct double_t {}; + +template +struct traits +{ + typedef int_t type; +}; + +template<> +struct traits +{ + typedef double_t type; +}; + +template <> +struct traits +{ + typedef double_t type; +}; + +template +int exp(const char *, int *, type_t *); + +char xget(const char *str, int *pos) +{ + return str[++(*pos)]; +} + +char xatskip(const char *str, int *pos) +{ + char token = str[*pos]; + while (' ' == token || '\t' == token) { + token = xget(str, pos); + } + return token; +} + +template +inline type_t number(type_t, int_t) +{ + return 0; +} + +template +inline type_t number(type_t t, double_t) +{ + return t; +} + + +template +int number(const char *str, int *pos, type_t *val) +{ + char token = xatskip(str, pos); + type_t temp = 0; + if (token < '0' || token > '9') { + __expr__error ("get factor __expr__error from \"%s\" at pos[%d] __expr__error", str, *pos); + return -1; + } + + while (token >= '0' && token <='9') { + temp = temp * 10 + token - '0'; + token = xget(str, pos); + } + + *val = temp; + + if ('.' == token) { + token = xget(str, pos); + if (token < '0' || token > '9') { + __expr__error ("get factor __expr__error from \"%s\" at pos[%d] __expr__error", str, *pos); + return -1; + } + type_t cnt = 1; + temp = 0; + while (token >= '0' && token <='9') { + temp = (token - '0') + temp * 10; + cnt = cnt * 10; + token = xget(str, pos); + } + typedef typename traits::type type; + *val += number(temp/cnt, type()); + } + + return 0; +} + +template +int factor(const char *str, int *pos, type_t *val) +{ + type_t temp = 0; + char token = xatskip(str, pos); + if (token == 0) { + __expr__error ("get factor err from \"%s\" %d", str, *pos); + return -1; + } + if (token == '(') { + xget(str, pos); + if (exp(str, pos, &temp) != 0) { + return -1; + } + *val = temp; + token = xatskip(str, pos); + if (token != ')') { + __expr__error ("get exp ) from \"%s\" at pos[%d] __expr__error", str, *pos); + return -1; + } + xget(str, pos); + return 0; + } + + if (number(str, pos, &temp) != 0) { + return -1; + } + + *val = temp; + return 0; +} + +template +int term(const char *str, int *pos, type_t *val) +{ + type_t temp = 0; + if (factor(str, pos, &temp) != 0) { + return -1; + } + *val = temp; + char token = xatskip(str, pos); + while ('*' == token || '/' == token) { + xget(str, pos); + if (factor(str, pos, &temp) != 0) { + return -1; + } + switch (token) { + case '*': + *val *= temp; + break; + case '/': + *val /= temp; + } + token = xatskip(str, pos); + } + return 0; +} + +template +int movter(const char *str, int *pos, type_t *val) +{ + type_t temp = 0; + if (term(str, pos, &temp) != 0) { + return -1; + } + *val = temp; + char token = xatskip(str, pos); + while ( ('+' == token) || ('-' == token) ) { + xget(str, pos); + if (term(str, pos, &temp) != 0) { + return -1; + } + switch (token) { + case '+': + *val += temp; + break; + case '-': + *val -= temp; + break; + } + token = xatskip(str, pos); + } + return 0; +} + +template +int exp_ini(const char *str, int *pos, type_t *val, char token, double_t) +{ + __expr__error("double can't use << | >> operation from \"%s\" from pos[%d] __expr__error", str, *pos); + return -1; +} + +template +int exp_ini(const char *str, int *pos, type_t *val, char token, int_t) +{ + type_t temp; + if (token == '<') { + token = xget(str, pos); + if (token != '<') { + __expr__error("get term from \"%s\" from pos[%d] __expr__error", str, *pos); + return -1; + } + xget(str, pos); + if (movter(str, pos, &temp) != 0) { + return -1; + } + *val = (*val) << temp; + } else if (token == '>') { + token = xget(str, pos); + if (token != '>') { + __expr__error("get term from \"%s\" from pos[%d] __expr__error", str, *pos); + return -1; + } + xget(str, pos); + if (movter(str, pos, &temp) != 0) { + return -1; + } + *val = (*val) >> temp; + } + return 0; +} + +template +int exp(const char *str, int *pos, type_t *val) +{ + typedef typename traits::type type; + type_t temp = 0; + if (movter(str, pos, &temp) != 0) { + return -1; + } + *val = temp; + char token = xatskip(str, pos); + while (token == '<' || token == '>') { + if (exp_ini(str, pos, val, token, type())) { + return -1; + } + token = xatskip(str, pos); + } + return 0; +} + + +/** + * @brief + * + * @param [in/out] str : const char* 表达式 + * @param [in/out] val : type_t* 返回值 + * @return int 0 表示计算成功, -1 表示失败 + * @retval + * @see + * @note + * @author xiaowei + * @date 2008/11/21 17:25:38 +**/ +template +int calc (const char *str, type_t *val) +{ + if (str == NULL || val == NULL) { + __expr__error("invalid param"); + return -1; + } + if (str[0] == 0) { + __expr__error("invalid exp in str\n"); + return -1; + } + int pos = 0; + int ret = exp(str, &pos, val); + if (ret != 0) { + return -1; + } + char token = xatskip(str, &pos); + if (token != 0 && token != '\n') { + __expr__error("invalid exp in \"%s\", at pos[%d] %c", str, pos, token); + return -1; + } + return 0; +} + +}; + + +#endif //__EXPR_H_ + +/* vim: set ts=4 sw=4 sts=4 tw=100 noet: */ diff --git a/configure/compiler/src/flex.32 b/configure/compiler/src/flex.32 new file mode 100755 index 0000000000000000000000000000000000000000..d401026e634559198a67871d4041840a12640795 Binary files /dev/null and b/configure/compiler/src/flex.32 differ diff --git a/configure/compiler/src/flex.64 b/configure/compiler/src/flex.64 new file mode 100755 index 0000000000000000000000000000000000000000..c0bcc7369b1d942bc6ad3d027bad180a00042bc3 Binary files /dev/null and b/configure/compiler/src/flex.64 differ diff --git a/configure/compiler/src/flex.arm32 b/configure/compiler/src/flex.arm32 new file mode 100755 index 0000000000000000000000000000000000000000..88ed52919b630fa95a7f337ef4a1578991a340f4 Binary files /dev/null and b/configure/compiler/src/flex.arm32 differ diff --git a/configure/compiler/src/idl.c b/configure/compiler/src/idl.c new file mode 100755 index 0000000000000000000000000000000000000000..2be4cf81c88562168304d3d0c4c318f4f321ac10 --- /dev/null +++ b/configure/compiler/src/idl.c @@ -0,0 +1,516 @@ +/* -*- c++ -*- + copy[write] by dirlt(zhang_yan@baidu.com) + date time:Wed Nov 19 23:43:27 CST 2008 + file name:idl.c */ + + +/** + * @file idl.c + * @author zhang_yan@baidu.com + * @date Wed Nov 19 23:43:27 CST 2008 + * @version + * @brief the implementation of internal IDL compiler,contains some basic routines + */ + +#include +#include +#include "idl_conf_if.h" +#include "idl.h" +#include "idl_lex.h" +/* the already known keywords */ +const int ECHO_BUFF_SIZE = 2048; +static const char *type_keywords[]={ + "raw", + "char", + "uchar", + "int8_t", + "uint8_t", + "int16_t", + "uint16_t", + "int32_t", + "uint32_t", + "int64_t", + "uint64_t", + "float", + "double", + "string", +}; +int is_keyword_type(meta_t &type) +{ + int size=sizeof(type_keywords)/sizeof(const char*); + int i; + for(i=0;irc_meta_list.push_back(meta); + return meta; +} +cf_t *alloc_cf(idl_t *idl) +{ + assert(idl!=NULL); + cf_t *cf=new cf_t; + idl->rc_cf_list.push_back(cf); + return cf; +} +var_t *alloc_var(idl_t *idl) +{ + assert(idl!=NULL); + var_t *var=new var_t; + idl->rc_var_list.push_back(var); + return var; +} +group_t *alloc_group(idl_t *idl) +{ + assert(idl!=NULL); + group_t *group=new group_t; + idl->rc_group_list.push_back(group); + return group; +} + +void add_idl_error(idl_t *idl,meta_t &errinfo) +{ + assert(idl!=NULL); + idl->err_list.push_back(errinfo); + return ; +} + +void add_idl_var(idl_t *idl,var_t *var) +{ + assert(idl!=NULL); + if(var==NULL)return ; + + meta_t &name=var->name; + meta_t &type=var->type; + var_map_t &var_map=idl->var_map; + var_list_t &var_list=idl->var_list; + group_map_t &group_map=idl->group_map; + + /* 1.we have to assure the var doesn't exist in + the config right now */ + if(var_map.find(name.data)!=var_map.end()){/* exists */ + meta_t errinfo; + char tmp[ECHO_BUFF_SIZE]; + errinfo.file=name.file; + errinfo.lineno=name.lineno; + + var_t *before=var_map.find(name.data)->second; + snprintf(tmp,sizeof(tmp),"var '%s' already exists at %s:%d", + name.data.c_str(), + before->name.file.c_str(), + before->name.lineno); + errinfo.data=tmp; + add_idl_error(idl,errinfo); + return ; + } + + /* 2.we have to assure the if the typename is not + keyword type,it should exist in the idl */ + if(!is_keyword_type(type) && + group_map.find(type.data)==group_map.end()){ + meta_t errinfo; + char tmp[ECHO_BUFF_SIZE]; + errinfo.file=type.file; + errinfo.lineno=type.lineno; + snprintf(tmp,sizeof(tmp),"type '%s' doesn't exist", + type.data.c_str()); + errinfo.data=tmp; + add_idl_error(idl,errinfo); + } + var_map[name.data]=var; + var_list.push_back(var); + return ; +} + +void add_idl_group(idl_t *idl,group_t *grp) +{ + assert(idl!=NULL); + if(grp==NULL)return ; + + meta_t &name=grp->name; + group_map_t &group_map=idl->group_map; + group_list_t &group_list=idl->group_list; + /* 1.the group has already exists in the idl */ + if(group_map.find(name.data)!=group_map.end()){ + group_t *group=group_map.find(name.data)->second; + meta_t &before=group->name; + + meta_t errinfo; + char tmp[ECHO_BUFF_SIZE]; + errinfo.file=name.file; + errinfo.lineno=name.lineno; + snprintf(tmp,sizeof(tmp),"groups '%s' already exists at %s:%d", + name.data.c_str(), + before.file.c_str(), + before.lineno); + errinfo.data=tmp; + add_idl_error(idl,errinfo); + return ; + } + group_map[(grp->name).data]=grp; + group_list.push_back(grp); + return ; +} + + +void assemble_idl_cf(cf_t *cf,meta_t *fn,meta_list_t *arg_list) +{ + assert(cf!=NULL); + meta_vec_t arg_vec; + cf->func=(*fn); + cf->arg_list=(*arg_list); + meta_list_t::iterator arg_it; + for(arg_it=arg_list->begin();arg_it!=arg_list->end();++arg_it){ + arg_vec.push_back(*arg_it); + } + cf->arg_vec=arg_vec; + return ; +} + +void assemble_idl_var(idl_t *idl,var_t *var,meta_t *id,meta_t *type,cf_list_t *cf_list) +{ + assert(idl!=NULL); + assert(var!=NULL); + assert(id!=NULL); + assert(type!=NULL); + assert(cf_list!=NULL); + + cf_map_t cf_map; + var->name=(*id); + var->type=(*type); + var->cf_list=(*cf_list); + cf_list_t::iterator cf_it; + for(cf_it=cf_list->begin();cf_it!=cf_list->end();++cf_it){ + cf_t *cf=*cf_it; + if(cf_map.find(cf->func.data)!=cf_map.end()){ + char tmp[ECHO_BUFF_SIZE]; + meta_t errinfo; + cf_t *before_cf=cf_map[cf->func.data]; + errinfo.file=cf->func.file; + errinfo.lineno=cf->func.lineno; + snprintf(tmp,sizeof(tmp),"constraint function '%s' has declared before at %s:%d", + before_cf->func.data.c_str(), + before_cf->func.file.c_str(), + before_cf->func.lineno); + errinfo.data=tmp; + add_idl_error(idl,errinfo); + }else{ + cf_map[cf->func.data]=cf; + } + } + var->cf_map=cf_map; + return ; +} + +void assemble_idl_group(idl_t *idl,group_t *group,meta_t *id,var_list_t *var_list) +{ + assert(idl!=NULL); + assert(group!=NULL); + assert(id!=NULL); + assert(var_list!=NULL); + + group_map_t &group_map=idl->group_map; + group->name=(*id); + group->parent_name=(*id); + group->var_list=(*var_list); + + var_map_t &var_map=group->var_map; + var_list_t::iterator it; + for(it=var_list->begin();it!=var_list->end();++it){ + var_t *each_var=*it; + /* 1. if the filed in the group + is duplicate */ + if(var_map.find((each_var->name).data)!=var_map.end()){ + var_t *before=var_map.find((each_var->name).data)->second; + meta_t errinfo; + char tmp[ECHO_BUFF_SIZE]; + errinfo.file=each_var->name.file; + errinfo.lineno=each_var->name.lineno; + snprintf(tmp,sizeof(tmp),"field '%s' already exists group '%s' at %s:%d", + (each_var->name).data.c_str(), + (id->data).c_str(), + before->name.file.c_str(), + before->name.lineno); + errinfo.data=tmp; + add_idl_error(idl,errinfo); + continue; + } + + meta_t type=each_var->type; + /* 2.we have to assure the if the typename is not + keyword type,it should exist in the idl */ + if(!is_keyword_type(type) && + group_map.find(type.data)==group_map.end()){ + meta_t errinfo; + char tmp[ECHO_BUFF_SIZE]; + errinfo.file=type.file; + errinfo.lineno=type.lineno; + snprintf(tmp,sizeof(tmp),"type '%s' doesn't exist", + type.data.c_str()); + errinfo.data=tmp; + add_idl_error(idl,errinfo); + continue; + } + var_map[(each_var->name).data]=each_var; + } + return ; +} + +void overwrite_idl_group(idl_t *idl,group_t *group,meta_t *new_id,meta_t *old_id,var_list_t *var_list) +{ + assert(idl!=NULL); + assert(group!=NULL); + assert(new_id!=NULL); + assert(old_id!=NULL); + assert(var_list!=NULL); + + group_map_t &group_map=idl->group_map; + + /* 1. if the old id doesn't exist in group, + we make a group by calling 'assmeble_idl_group' */ + if(group_map.find(old_id->data)==group_map.end()){ + meta_t errinfo; + char tmp[ECHO_BUFF_SIZE]; + errinfo.file=old_id->file; + errinfo.lineno=old_id->lineno; + snprintf(tmp,sizeof(tmp),"group '%s' to be overwrited doesn't exist", + old_id->data.c_str()); + errinfo.data=tmp; + add_idl_error(idl,errinfo); + return assemble_idl_group(idl,group,new_id,var_list); + }else{ + /* copy the old conf cons */ + (*group)=(*group_map[old_id->data]); + group->name=(*new_id); + + /* find the topest parent */ + meta_t *tmp_id=old_id; + while(!((tmp_id->data)==(group_map[tmp_id->data]->name.data))){ + tmp_id=&(group_map[tmp_id->data]->name); + } + group->parent_name=(*tmp_id); + + /* set the map */ + var_map_t &var_map=group->var_map; + var_list_t::iterator it; + for(it=var_list->begin();it!=var_list->end();++it){ + var_t *each_var=*it; + if(var_map.find((each_var->name).data)==var_map.end()){ + /* 2. should overwrite the old_id group fileds */ + meta_t errinfo; + char tmp[ECHO_BUFF_SIZE]; + errinfo.file=each_var->name.file; + errinfo.lineno=each_var->name.lineno; + snprintf(tmp,sizeof(tmp),"field '%s' doesn't exist in group '%s'", + each_var->name.data.c_str(), + old_id->data.c_str()); + errinfo.data=tmp; + add_idl_error(idl,errinfo); + continue; + } + + + meta_t type=each_var->type; + /* 2.we have to assure the if the typename is not + keyword type,it should exist in the idl */ + if(!is_keyword_type(type) && + group_map.find(type.data)==group_map.end()){ + meta_t errinfo; + char tmp[ECHO_BUFF_SIZE]; + errinfo.file=type.file; + errinfo.lineno=type.lineno; + snprintf(tmp,sizeof(tmp),"type '%s' doesn't exist", + type.data.c_str()); + errinfo.data=tmp; + add_idl_error(idl,errinfo); + continue; + } + + var_t *new_var=alloc_var(idl); + (*new_var)=(*each_var); + var_map[(each_var->name).data]=new_var; + } + + /* reorganize the var list */ + var_list_t old_var_list=group->var_list; + var_list_t new_var_list; + for(it=old_var_list.begin();it!=old_var_list.end();++it){ + var_t *each_var=*it; + if(var_map.find((each_var->name).data)!=var_map.end()){ + var_t *new_var=var_map[(each_var->name).data]; + new_var_list.push_back(new_var); + } + } + group->var_list=new_var_list; + return ; + } +} + +extern int cfgidlparse(yyscan_t scanner,meta_t *loc,idl_t *idl); +namespace confIDL{ +/* the inteface provied to the user */ +void print_idl(idl_t *idl) +{ + assert(idl!=NULL); + group_list_t &group_list=idl->group_list; + group_list_t::iterator group_it; + + printf("idl groups:\n"); + for(group_it=group_list.begin();group_it!=group_list.end();++group_it){ + group_t &group=**group_it; + printf("\tgroup:%s,overwrited from %s\n",\ + group.name.data.c_str(),\ + group.parent_name.data.c_str()); + + var_list_t &var_list=group.var_list; + var_list_t::iterator var_it; + for(var_it=var_list.begin();var_it!=var_list.end();++var_it){ + var_t &var=**var_it; + printf("\t\tvar:%s,type:%s\n",var.name.data.c_str(),\ + var.type.data.c_str()); + + cf_list_t &cf_list=var.cf_list; + cf_list_t::iterator cf_it; + for(cf_it=cf_list.begin();cf_it!=cf_list.end();++cf_it){ + cf_t &cf=**cf_it; + printf("\t\t\tfunc:%s\n",cf.func.data.c_str()); + + meta_list_t &arg_list=cf.arg_list; + meta_list_t::iterator arg_it; + for(arg_it=arg_list.begin();arg_it!=arg_list.end();++arg_it){ + meta_t &arg=**arg_it; + printf("\t\t\t\targ:%s\n",arg.data.c_str()); + } + } + } + } + + printf("idl vars:\n"); + var_list_t &var_list=idl->var_list; + var_list_t::iterator var_it; + for(var_it=var_list.begin();var_it!=var_list.end();++var_it){ + var_t &var=**var_it; + printf("\tvar:%s,type:%s\n",var.name.data.c_str(),\ + var.type.data.c_str()); + + cf_list_t &cf_list=var.cf_list; + cf_list_t::iterator cf_it; + for(cf_it=cf_list.begin();cf_it!=cf_list.end();++cf_it){ + cf_t &cf=**cf_it; + printf("\t\tfunc:%s\n",cf.func.data.c_str()); + + meta_list_t &arg_list=cf.arg_list; + meta_list_t::iterator arg_it; + for(arg_it=arg_list.begin();arg_it!=arg_list.end();++arg_it){ + meta_t &arg=**arg_it; + printf("\t\t\targ:%s\n",arg.data.c_str()); + } + } + } + + printf("idl error:\n"); + err_list_t &err_list=idl->err_list; + err_list_t::iterator err_it; + for(err_it=err_list.begin();err_it!=err_list.end();++err_it){ + meta_t &err=*err_it; + printf("\t%s:%d:%s\n", + err.file.c_str(), + err.lineno, + err.data.c_str()); + } + return ; +} + +idl_t *alloc_idl() +{ + idl_t *idl = new idl_t; + idl->cmdreserve = 0; + return idl; +} +void free_idl(idl_t *idl) +{ + if(idl==NULL)return ; + meta_list_t &rc_meta_list=idl->rc_meta_list; + meta_list_t::iterator meta_it; + for(meta_it=rc_meta_list.begin();meta_it!=rc_meta_list.end();++meta_it) + delete *meta_it; + + cf_list_t &rc_cf_list=idl->rc_cf_list; + cf_list_t::iterator cf_it; + for(cf_it=rc_cf_list.begin();cf_it!=rc_cf_list.end();++cf_it) + delete *cf_it; + + var_list_t &rc_var_list=idl->rc_var_list; + var_list_t::iterator var_it; + for(var_it=rc_var_list.begin();var_it!=rc_var_list.end();++var_it) + delete *var_it; + + group_list_t &rc_grp_list=idl->rc_group_list; + group_list_t::iterator grp_it; + for(grp_it=rc_grp_list.begin();grp_it!=rc_grp_list.end();++grp_it) + delete *grp_it; + + cf_list_p &cflp=idl->parse_list; + cf_list_p::iterator cflp_it; + for(cflp_it=cflp.begin();cflp_it!=cflp.end();++cflp_it) + delete *cflp_it; + + var_list_p &varlp=idl->parse_var_list; + var_list_p::iterator varlp_it; + for(varlp_it=varlp.begin();varlp_it!=varlp.end();++varlp_it) + delete *varlp_it; + + meta_list_p &mtlp=idl->parse_meta_list; + meta_list_p::iterator mtlp_it; + for(mtlp_it=mtlp.begin();mtlp_it!=mtlp.end();++mtlp_it) + delete *mtlp_it; + + delete idl; + return ; +} + +void load_idl(const char *file, + idl_t *idl) +{ + meta_t loc; + FILE *fin; + yyscan_t scanner; + + /* haven't allocate the space */ + if(idl==NULL) + return ; + /* init the lexical process */ + loc.file=file; + loc.lineno=1; + + fin=fopen(file,"r"); + if(fin==NULL){ + /* can't open the file */ + meta_t errinfo; + char tmp[ECHO_BUFF_SIZE]; + snprintf(tmp,sizeof(tmp),"can't open file '%s'",file); + errinfo.file=file; + errinfo.lineno=0; + errinfo.data=tmp; + add_idl_error(idl,errinfo); + idl->retval=1; + return ; + } + + cfgidllex_init(&scanner); + cfgidlset_in(fin,scanner); + cfgidlparse(scanner,&loc,idl); + cfgidllex_destroy(scanner); + fclose(fin); + + /* set the return value */ + idl->retval=((idl->err_list).empty())?0:1; + return ; +} +}; diff --git a/configure/compiler/src/idl.gcno b/configure/compiler/src/idl.gcno new file mode 100644 index 0000000000000000000000000000000000000000..4751eda30262b03255669e682f4570ba21f7bbf2 Binary files /dev/null and b/configure/compiler/src/idl.gcno differ diff --git a/configure/compiler/src/idl.gram b/configure/compiler/src/idl.gram new file mode 100755 index 0000000000000000000000000000000000000000..b30373bcd74ad25de96a2456f883a72d5dcb4b51 --- /dev/null +++ b/configure/compiler/src/idl.gram @@ -0,0 +1,342 @@ +/* -*- c++ -*- + copy[write] by dirlt(zhang_yan@baidu.com) + date time:Mon Nov 17 12:06:46 CST 2008 + file name:idl.gram */ +%{ +#include +#include +#include "idl.h" +/* to cancel the flex internal definition of idllex:-) */ +#define YY_DECL +#include "idl_gram.h" +#include "idl_lex.h" + extern int cfgidllex(YYSTYPE* yylval,yyscan_t scanner, + meta_t *loc,idl_t *idl); + static void cfgidlerror(yyscan_t scanner,meta_t *loc, + idl_t *idl,char *msg); +%} + +/* generate the header file */ +%defines +/* the output file is idl_gram.c and idl_gram.h */ +%output="idl_gram.c" +/* we want the name prefix */ +%name-prefix="cfgidl" +/* we want to get the much more detail error message */ +%error-verbose +/* lex-param */ +%lex-param{yyscan_t scanner} +%lex-param{meta_t *loc} +%lex-param{idl_t *idl} +/* parse param */ +%parse-param {yyscan_t scanner} +%parse-param{meta_t *loc} +%parse-param {idl_t *idl} + +/* reentrant parser */ +%pure-parser +/* generate the output file */ +%verbose +%union{ + meta_t *meta; + var_t *var; + group_t *grp; + cf_list_t *cf_list; + meta_list_t *meta_list; + var_list_t *var_list; + cf_t *cf; +} + + +%token KW_OVERWRITE KW_STRUCT +%token KW_RAW +%token KW_CHAR KW_UCHAR +%token KW_INT8 KW_UINT8 +%token KW_INT16 KW_UINT16 +%token KW_INT32 KW_UINT32 +%token KW_INT64 KW_UINT64 +%token KW_FLOAT KW_DOUBLE +%token KW_STRING INTEGER ID LITERAL_STRING DOUBLE +%token VAR_CMD + +%type variable +%type variable_list +%type group +%type optional_array +%type optional_cmd +%type optional_constraint constraint_list +%type constraint_function +%type constraint_function_param_list +%type type_name cons_func_param + +/* designate the start symbol */ +%start program + +%% +program +:program variable +{ + add_idl_var(idl,$2); +} +|program group +{ + add_idl_group(idl,$2); +} +| +; + +variable +:type_name ID optional_array optional_constraint ';' optional_cmd +{ + meta_t *type=$1,*id=$2; + meta_list_t *array_size_list=$3; + meta_list_t *cmdval = $6; + cf_list_t *cf_list=$4; + cf_t *cf; + + var_t *var=alloc_var(idl); + + //allocate the necessary space + if(cf_list==NULL) { + cf_list=new cf_list_t; + idl->parse_list.push_back(cf_list); + } + if(array_size_list==NULL) { + array_size_list=new meta_list_t; + idl->parse_meta_list.push_back(array_size_list); + } + + if(array_size_list->size()!=0){ + /* the arary size list does exist */ + cf=alloc_cf(idl); + + meta_t func; + func.data="array"; + func.file=id->file; + func.lineno=id->lineno; + assemble_idl_cf(cf,&func,array_size_list); + + cf_list->push_back(cf); + } + if (cmdval != NULL) { + meta_t func ; + func.data = "comment"; + func.file = id->file; + func.lineno = id->lineno; + cf_t *cf = alloc_cf(idl); + assemble_idl_cf(cf, &func, cmdval); + cf_list->push_back(cf); + + //delete cmdval; + } + assemble_idl_var(idl,var,id,type,cf_list); + //delete cf_list; + //delete array_size_list; + + + + $$=var; +} +; +optional_cmd +:VAR_CMD +{ + meta_list_t *lst = new meta_list_t; + idl->parse_meta_list.push_back(lst); + lst->push_back($1); + idl->cmdreserve = 0; + $$ = lst; +} +| +{ + idl->cmdreserve = 0; + $$ = NULL; +} +; + +optional_array +:optional_array '[' INTEGER ']' +{ + meta_list_t *array_size_list=$1; + meta_t *array_tag=$3; + int array_size=atoi(array_tag->data.c_str()); + /* we have to validate here */ + if(array_size<=0){ + char tmpstr[2048]; + meta_t errinfo; + snprintf(tmpstr,sizeof(tmpstr),"array size %d is invalid",array_size); + errinfo.data=tmpstr; + errinfo.file=array_tag->file; + errinfo.lineno=array_tag->lineno; + add_idl_error(idl,errinfo); + array_tag->data="0"; + } + array_size_list->push_back(array_tag); + $$=array_size_list; +} +| optional_array '[' ']' +{ + meta_list_t *array_size_list=$1; + meta_t *array_size=alloc_meta(idl); + array_size->data="0"; + array_size->file=loc->file; + array_size->lineno=loc->lineno; + array_size_list->push_back(array_size); + $$=array_size_list; +} +| + { + meta_list_t *array_size_list=new meta_list_t; + idl->parse_meta_list.push_back(array_size_list); + $$=array_size_list; + } +; + +type_name +:KW_RAW {$$=$1;} +|KW_CHAR {$$=$1;} +|KW_UCHAR {$$=$1;} +|KW_INT8 {$$=$1;} +|KW_UINT8 {$$=$1;} +|KW_INT16 {$$=$1;} +|KW_UINT16 {$$=$1;} +|KW_INT32 {$$=$1;} +|KW_UINT32 {$$=$1;} +|KW_INT64 {$$=$1;} +|KW_UINT64 {$$=$1;} +|KW_FLOAT {$$=$1;} +|KW_DOUBLE {$$=$1;} +|KW_STRING {$$=$1;} +|ID {$$=$1;} +; + +optional_constraint +:'=' constraint_list +{ + $$=$2; + idl->cmdreserve = 1; +} +| +{ + $$=NULL; + idl->cmdreserve = 1; +} +; + +constraint_list +:constraint_list ',' constraint_function +{ + cf_list_t *cf_list=$1; + cf_t *cf=$3; + cf_list->push_back(cf); + $$=cf_list; +} +| constraint_function +{ + cf_list_t *cf_list=new cf_list_t; + idl->parse_list.push_back(cf_list); + cf_t *cf=$1; + cf_list->push_back(cf); + $$=cf_list; +} +; + +constraint_function +:ID '(' constraint_function_param_list ')' +{ + meta_t *func=$1; + meta_list_t *arg_list=$3; + cf_t *cf=alloc_cf(idl); + assemble_idl_cf(cf,func,arg_list); + //delete arg_list; + $$=cf; +} +|ID '(' ')' +{ + meta_t *func=$1; + meta_list_t *arg_list=new meta_list_t; + cf_t *cf=alloc_cf(idl); + assemble_idl_cf(cf,func,arg_list); + delete arg_list; + $$=cf; +} +; + +constraint_function_param_list +:constraint_function_param_list ',' cons_func_param +{ + meta_list_t *param_list=$1; + meta_t *param=$3; + param_list->push_back(param); + $$=param_list; +} +| cons_func_param +{ + meta_list_t *param_list=new meta_list_t; + idl->parse_meta_list.push_back(param_list); + meta_t *param=$1; + param_list->push_back(param); + $$=param_list; +} +; + +cons_func_param +:LITERAL_STRING {$$=$1;} +|ID {$$=$1;} +|INTEGER {$$=$1;} +|DOUBLE {$$=$1;} +; + +group +:KW_STRUCT ID '{' variable_list '}' ';' +{ + meta_t *id=$2; + var_list_t *var_list=$4; + group_t *grp; + grp=alloc_group(idl); + assemble_idl_group(idl,grp,id,var_list); + //delete var_list; + $$=grp; +} +|ID KW_OVERWRITE ID '{' variable_list '}' ';' +{ + meta_t *new_id=$1,*old_id=$3; + var_list_t *var_list=$5; + group_t *grp; + grp=alloc_group(idl); + overwrite_idl_group(idl,grp,new_id,old_id,var_list); + //delete var_list; + $$=grp; +} +; + +variable_list +:variable_list variable +{ + var_list_t *var_list=$1; + var_t *var=$2; + var_list->push_back(var); + $$=var_list; +} +| +{ + var_list_t *var_list=new var_list_t; + idl->parse_var_list.push_back(var_list); + $$=var_list; +} +; + +%% +void cfgidlerror(yyscan_t scanner,meta_t *loc,idl_t *idl,char *msg) +{ + char tmp[2048]; + meta_t errinfo; + errinfo.file=loc->file; + errinfo.lineno=loc->lineno; + snprintf(tmp,sizeof(tmp),"%s before char:'%c'", + msg, + cfgidlget_text(scanner)[0]); + errinfo.data=tmp; + add_idl_error(idl,errinfo); + return ; +} diff --git a/configure/compiler/src/idl.h b/configure/compiler/src/idl.h new file mode 100755 index 0000000000000000000000000000000000000000..394a13a3f1f5db33b2a32c5e57ece448a5b5fd69 --- /dev/null +++ b/configure/compiler/src/idl.h @@ -0,0 +1,140 @@ +/* -*- c++ -*- + copy[write] by dirlt(zhang_yan@baidu.com) + date time:Wed Nov 19 23:33:00 CST 2008 + file name:idl.h */ + +#ifndef _IDL_H_ +#define _IDL_H_ + +/** + * @file idl.h + * @author zhang_yan@baidu.com + * @date Wed Nov 19 23:33:00 CST 2008 + * @version + * @brief the interface of internal implementation + */ + +#include "idl_conf_if.h" +using namespace confIDL; + +/** + * @brief allocated a meta struct from IDL resource pool + * @param idl the IDL on which the meta is allocated + * @return meta allocated + * @author zhang_yan@baidu.com + * @date Wed Nov 19 23:33:40 CST 2008 +*/ +extern meta_t *alloc_meta(idl_t *idl); + +/** + * @brief allocated a constraint function struct from IDL resource pool + * @param idl the IDL on which the constraint function is allocated + * @return constraint function allocated + * @author zhang_yan@baidu.com + * @date Wed Nov 19 23:33:40 CST 2008 +*/ +extern cf_t *alloc_cf(idl_t *idl); + +/** + * @brief allocated a variable struct from IDL resource pool + * @param idl the IDL on which the variable is allocated + * @return variable allocated + * @author zhang_yan@baidu.com + * @date Wed Nov 19 23:33:40 CST 2008 +*/ +extern var_t *alloc_var(idl_t *idl); + +/** + * @brief allocated a group struct from IDL resource pool + * @param idl the IDL on which the group is allocated + * @return group allocated + * @author zhang_yan@baidu.com + * @date Wed Nov 19 23:33:40 CST 2008 +*/ + +extern group_t *alloc_group(idl_t *idl); + + +/** + * @brief add the error information to the IDL error messages queue + * @param idl the IDL struct which contains the message queue + * @param errinfo the error message information + * @author zhang_yan@baidu.com + * @date Wed Nov 19 23:36:39 CST 2008 +*/ +extern void add_idl_error(idl_t *idl,meta_t &errinfo); + +/** + * @brief add the variable struct to the IDL + * @param idl the IDL struct which contains all variables which described in the IDL file + * @param var the variable to be added + * @author zhang_yan@baidu.com + * @date Wed Nov 19 23:36:39 CST 2008 +*/ +extern void add_idl_var(idl_t *idl,var_t *var); + +/** + * @brief add the group struct to the IDL + * @param idl the IDL struct which contains all groups which described in the IDL file + * @param grp the group to be added + * @author zhang_yan@baidu.com + * @date Wed Nov 19 23:36:39 CST 2008 +*/ +extern void add_idl_group(idl_t *idl,group_t *grp); + +/** + * @brief assemble the constraint function + * @param cf the constraint function struct + * @param fn the constraint function function name + * @param arg_list argument list + * @see + * @note + * @author zhang_yan@baidu.com + * @date Tue Dec 2 11:01:04 CST 2008 +*/ +extern void assemble_idl_cf(cf_t *cf,meta_t *fn,meta_list_t *arg_list); + +/** + * @brief assemble the variable + * @param idl the idl struct + * @param var the variable which to be assembled + * @param id the variable id + * @param type the variable type + * @param cf_list the list of constraint function + * @note + * @author zhang_yan@baidu.com + * @date Tue Dec 2 11:02:10 CST 2008 +*/ +extern void assemble_idl_var(idl_t *idl,var_t *var,meta_t *id,meta_t *type,cf_list_t *cf_list); + + +/** + * @brief assmeble a group with specific id and fields in it + * @param idl the IDL struct which contains all groups + * @param group the group to be assembles + * @param idl the group name information + * @param varlist the fields in the group + * @author zhang_yan@baidu.com + * @date Wed Nov 19 23:39:26 CST 2008 +*/ + +extern void assemble_idl_group(idl_t *idl,group_t *group,meta_t *id,\ + var_list_t *varlist); + +/** + * @brief overwrite a old group to generate a new group + * @param idl the IDL struct which contains all groups + * @param group the group to be generated by overwriting + * @param new_id the new group name information + * @param old_id the old group name information,which will be overwrited + * @param varlist the fields to be overwrited + * @author zhang_yan@baidu.com + * @date Wed Nov 19 23:40:59 CST 2008 +*/ +extern void overwrite_idl_group(idl_t *idl,group_t *group,\ + meta_t *new_id,meta_t *old_id,\ + var_list_t *varlist); + + +#endif + diff --git a/configure/compiler/src/idl.lex b/configure/compiler/src/idl.lex new file mode 100755 index 0000000000000000000000000000000000000000..55c39fcc3861f9c276809ab6b8b1723bd68b6411 --- /dev/null +++ b/configure/compiler/src/idl.lex @@ -0,0 +1,197 @@ +/* -*- c++ -*- + copy[write] by dirlt(zhang_yan@baidu.com) + date time:Mon Nov 17 12:06:46 CST 2008 + file name:idl.lex */ +%{ +#include +#include +#include +#include "idl.h" +#include "idl_gram.h" + +#define MAX_TEMP_BUFFER 2048 + +#define YY_DECL int cfgidllex(YYSTYPE *yylval,yyscan_t yyscanner,meta_t *loc,idl_t *idl) + static void do_keyword(YYSTYPE *yylval,yyscan_t cfgidlscanner,meta_t *loc,idl_t *idl); + static int do_special_cmd(YYSTYPE *yylval,yyscan_t cfgidlscanner,meta_t *loc,idl_t *idl); + static void do_meta_data(YYSTYPE *yylval,yyscan_t cfgidlscanner,meta_t *loc,idl_t *idl); + static void do_comment(yyscan_t cfgidlscanner,meta_t *loc); + static void update(yyscan_t cfgidlscanner,meta_t *loc, idl_t *idl); +%} + +/* we don't need to handle file more than one */ +%option noyywrap +/* give out warnings */ +%option warn +/* using 8 bit a character */ +%option 8bit + +/* we want idllex this class */ +%option prefix="cfgidl" +/* output file is idl_lex.c */ +%option outfile="idl_lex.c" +/* header file is idl_lex.h */ +%option header-file="idl_lex.h" +%option reentrant + +/* the letter is so generous except + (),whitespace and ; */ +letter [a-zA-Z_] +digit [0-9] + +%% + +"#" {do_comment(yyscanner,loc);} +"raw" {do_keyword(yylval,yyscanner,loc,idl);return KW_RAW;} +"char" {do_keyword(yylval,yyscanner,loc,idl);return KW_CHAR;} +"uchar" {do_keyword(yylval,yyscanner,loc,idl);return KW_UCHAR;} +"int8_t" {do_keyword(yylval,yyscanner,loc,idl);return KW_INT8;} +"uint8_t" {do_keyword(yylval,yyscanner,loc,idl);return KW_UINT8;} +"int16_t" {do_keyword(yylval,yyscanner,loc,idl);return KW_INT16;} +"uint16_t" {do_keyword(yylval,yyscanner,loc,idl);return KW_UINT16;} +"int32_t" {do_keyword(yylval,yyscanner,loc,idl);return KW_INT32;} +"uint32_t" {do_keyword(yylval,yyscanner,loc,idl);return KW_UINT32;} +"int64_t" {do_keyword(yylval,yyscanner,loc,idl);return KW_INT64;} +"uint64_t" {do_keyword(yylval,yyscanner,loc,idl);return KW_UINT64;} +"float" {do_keyword(yylval,yyscanner,loc,idl);return KW_FLOAT;} +"double" {do_keyword(yylval,yyscanner,loc,idl);return KW_DOUBLE;} +"string" {do_keyword(yylval,yyscanner,loc,idl);return KW_STRING;} +"struct" {do_keyword(yylval,yyscanner,loc,idl);return KW_STRUCT;} +"overwrite" {do_keyword(yylval,yyscanner,loc,idl);return KW_OVERWRITE;} + +\/\/[^\n]* { + if (do_special_cmd(yylval,yyscanner,loc,idl) != 0) { + return VAR_CMD; + } +} +\"[^\"]*\" {do_meta_data(yylval,yyscanner,loc,idl);return LITERAL_STRING;} +[+-]?({digit})+ {do_meta_data(yylval,yyscanner,loc,idl);return INTEGER;} +[+-]?((({digit})+)|(\.({digit})+)|((({digit})+)\.(({digit})+)))([Ee]({digit})+)? {do_meta_data(yylval,yyscanner,loc,idl);return DOUBLE;} +{letter}({letter}|{digit})* {do_meta_data(yylval,yyscanner,loc,idl);return ID;} +[ \t\n\f]+ {update(yyscanner,loc, idl);} +. {return yytext[0];} + +%% +void do_keyword(YYSTYPE *yylval,yyscan_t scanner,meta_t *loc,idl_t *idl) +{ + char *text=cfgidlget_text(scanner); +#ifdef DEBUG + printf("call %s,%s\n",__func__,text); +#endif + meta_t *meta=alloc_meta(idl); + meta->file=loc->file; + meta->lineno=loc->lineno; + meta->data=text; + yylval->meta=meta; +} + +void do_meta_data(YYSTYPE *yylval,yyscan_t scanner,meta_t *loc,idl_t *idl) +{ + char *text=cfgidlget_text(scanner); + int leng=cfgidlget_leng(scanner); +#ifdef DEBUG + printf("call %s,%s\n",__func__,text); +#endif + meta_t *meta=alloc_meta(idl); + meta->file=loc->file; + meta->lineno=loc->lineno; + meta->data=cfgidlget_text(scanner); + yylval->meta=meta; + + int i; + for(i=0;ilineno++; + } + return ; +} + +int do_special_cmd(YYSTYPE *yylval,yyscan_t scanner,meta_t *loc,idl_t *idl) +{ + char *text = cfgidlget_text(scanner); + meta_t *meta=alloc_meta(idl); + meta->file=loc->file; + meta->lineno=loc->lineno; + meta->data=text; + yylval->meta=meta; + + loc->lineno++; + + int ret = idl->cmdreserve; + idl->cmdreserve = 0; + return ret; +} + + +static int cdirective(char *tmp,int *lineno,char **filename) +{ + int i,j; + if(tmp[0]!='#' || tmp[1]!=' ' || !isdigit(tmp[2]))return 0; + i=2; + while(isdigit(tmp[i]))i++; + tmp[i++]=0; + *lineno=atoi(tmp+2); + + j=i+1; + if(tmp[i]!='"')return 0; + i++; + while(tmp[i]!='"')i++; + tmp[i]=0; + *filename=tmp+j; + + return 1; +} + +void do_comment(yyscan_t scanner,meta_t *loc) +{ + char ch; + char tmp[MAX_TEMP_BUFFER]; + int i; + + i=0; + if(cfgidlget_text(scanner)[0]=='#'){ + tmp[0]='#'; + i=1; + } + while(1){ + ch=yyinput(scanner); + if(ch=='\n' || ch==EOF)break; + if(i < (int)sizeof(tmp) - 1) { + tmp[i++]=ch; + } + } + tmp[i]=0; + loc->lineno++; + + char *tmp_file; + int tmp_lineno; + if(cdirective(tmp,&tmp_lineno,&tmp_file)==1){ + loc->lineno=tmp_lineno; + loc->file=tmp_file; +#ifdef DEBUG + printf("new file:%s,lineno:%d\n", + loc->file.c_str(), + loc->lineno); +#endif + } + return ; +} + +void update(yyscan_t scanner,meta_t *loc, idl_t *idl) +{ + int i; + int leng=cfgidlget_leng(scanner); + char *text=cfgidlget_text(scanner); + int cnt = 0; + for(i=0;ilineno++; + //printf("update[%d]: %c\n", i, text[i]); + ++ cnt; + } + } + if (cnt > 0) { + idl->cmdreserve = 0; + } + return ; +} diff --git a/configure/compiler/src/idl_conf_if.h b/configure/compiler/src/idl_conf_if.h new file mode 100755 index 0000000000000000000000000000000000000000..def3fa340bf9c2aa5c0bbb278dd5bff55fd8a563 --- /dev/null +++ b/configure/compiler/src/idl_conf_if.h @@ -0,0 +1,150 @@ +/* -*- c++ -*- + copy[write] by dirlt(zhang_yan@baidu.com) + date time:Wed Nov 19 23:22:32 CST 2008 + file name:idl_conf_if.h */ + +#ifndef _IDL_CONF_IF_H_ +#define _IDL_CONF_IF_H_ + +/** + * @file idl_conf_if.h + * @author zhang_yan@baidu.com + * @date Wed Nov 19 23:22:32 CST 2008 + * @version + * @brief the IDL conf_if provided to the user + */ + +#include +#include +#include +#include +#include "bsl/containers/string/bsl_string.h" + +namespace confIDL{ +/** +* @brief the meta data structure +*/ + typedef bsl::string idl_str_t; + struct meta_t + { + idl_str_t file;/**< the meta data in which file */ + int lineno;/**< the meta data in which line */ + idl_str_t data;/**< what is the data in it?? */ + }; + typedef std::list meta_list_t; + typedef std::vectormeta_vec_t; + typedef std::list err_list_t; + +/** +* @brief constraint function structure +* detail using it to describe the constraint function +*/ + struct cons_func_t{ + meta_t func;/**< constraint function name */ + meta_list_t arg_list;/**< constraint function arguments(in idl_str_t form) */ + meta_vec_t arg_vec;/**< constraint function arguments(in idl_str_t form) */ + }; + typedef cons_func_t cf_t; + typedef std::list cf_list_t; + typedef std::mapcf_map_t; + + typedef std::list cf_list_p; + typedef std::list meta_list_p; + +/** +* @brief variable structure +* detail using it to descibel the variable or the fields in the class +*/ + struct var_t{ + meta_t name; + meta_t type; + cf_list_t cf_list; + cf_map_t cf_map; + }; + typedef std::listvar_list_t; + typedef std::mapvar_map_t; + + typedef std::list var_list_p; + +/** +* @brief struct structure +* detail using it to describle the class or the strucut or some +* complex object +*/ + struct group_t{ + meta_t name;/**< the struct name */ + meta_t parent_name;/**< the struct which this struct is overwrited from */ + var_list_t var_list; + var_map_t var_map; + }; + typedef std::mapgroup_map_t; + typedef std::listgroup_list_t; +/** +* @brief IDL struct +* detail contain all the information collected from the IDL file +* also including the resource pool +*/ + struct idl_t + { + group_map_t group_map;/**< structs in the IDL */ + var_map_t var_map;/**< the variables in the IDL */ + group_list_t group_list; + var_list_t var_list; + + /* resource pool */ + meta_list_t rc_meta_list;/**< the allocated meta data */ + cf_list_t rc_cf_list;/**< the allocated constraint functions */ + var_list_t rc_var_list;/**< the allocated variables */ + group_list_t rc_group_list;/**< the allocated groups*/ + + int cmdreserve; + int retval;/**< return value of parsing the IDL file */ + err_list_t err_list;/**< the generated detail error messages when we parse the IDL file */ + + cf_list_p parse_list; /**< the allocated cflist in parsing*/ + meta_list_p parse_meta_list; /**< the allocated metalist in parsing*/ + var_list_p parse_var_list; /**< the allocated varlist in parsing*/ + }; + + + /** + * @brief allocated a IDL struct + * @return return the allocated IDL struct + * @see idl_t + * @author zhang_yan@baidu.com + * @date Wed Nov 19 23:28:47 CST 2008 + */ + extern confIDL::idl_t *alloc_idl(); + + /** + * @brief deallocated the IDL struct + * @param idl the IDl struct allocated by alloc_idl() this function + * @see alloc_idl + * @author zhang_yan@baidu.com + * @date Wed Nov 19 23:29:36 CST 2008 + */ + extern void free_idl(confIDL::idl_t *idl); + + /** + * @brief load the IDL structu from the file + * @param file the IDL file + * @param idl the IDL strucut we want to load into + * @see alloc_idl free_idl + * @author zhang_yan@baidu.com + * @date Wed Nov 19 23:30:52 CST 2008 + */ + extern void load_idl(const char *file,confIDL::idl_t *idl); + + /** + * @brief print the IDL struct in the indented form + * @param idl the IDL struct to be printed + * @see load_idl + * @author zhang_yan@baidu.com + * @date Wed Nov 19 23:30:55 CST 2008 + */ + extern void print_idl(confIDL::idl_t *idl); + +}; + +#endif + diff --git a/configure/compiler/src/idl_gram.c b/configure/compiler/src/idl_gram.c new file mode 100644 index 0000000000000000000000000000000000000000..d738c235db41a3768dcaa6ddfc92260ca18b5269 --- /dev/null +++ b/configure/compiler/src/idl_gram.c @@ -0,0 +1,1704 @@ +/* A Bison parser, made by GNU Bison 1.875c. */ + +/* Skeleton parser for Yacc-like parsing with Bison, + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* As a special exception, when this file is copied by Bison into a + Bison output file, you may use that output file without restriction. + This special exception was added by the Free Software Foundation + in version 1.24 of Bison. */ + +/* Written by Richard Stallman by simplifying the original so called + ``semantic'' parser. */ + +/* All symbols defined below should begin with yy or YY, to avoid + infringing on user name space. This should be done even for local + variables, as they might otherwise be expanded by user macros. + There are some unavoidable exceptions within include files to + define necessary library symbols; they are noted "INFRINGES ON + USER NAME SPACE" below. */ + +/* Identify Bison output. */ +#define YYBISON 1 + +/* Skeleton name. */ +#define YYSKELETON_NAME "yacc.c" + +/* Pure parsers. */ +#define YYPURE 1 + +/* Using locations. */ +#define YYLSP_NEEDED 0 + +/* If NAME_PREFIX is specified substitute the variables and functions + names. */ +#define yyparse cfgidlparse +#define yylex cfgidllex +#define yyerror cfgidlerror +#define yylval cfgidllval +#define yychar cfgidlchar +#define yydebug cfgidldebug +#define yynerrs cfgidlnerrs + + +/* Tokens. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + KW_OVERWRITE = 258, + KW_STRUCT = 259, + KW_RAW = 260, + KW_CHAR = 261, + KW_UCHAR = 262, + KW_INT8 = 263, + KW_UINT8 = 264, + KW_INT16 = 265, + KW_UINT16 = 266, + KW_INT32 = 267, + KW_UINT32 = 268, + KW_INT64 = 269, + KW_UINT64 = 270, + KW_FLOAT = 271, + KW_DOUBLE = 272, + KW_STRING = 273, + INTEGER = 274, + ID = 275, + LITERAL_STRING = 276, + DOUBLE = 277, + VAR_CMD = 278 + }; +#endif +#define KW_OVERWRITE 258 +#define KW_STRUCT 259 +#define KW_RAW 260 +#define KW_CHAR 261 +#define KW_UCHAR 262 +#define KW_INT8 263 +#define KW_UINT8 264 +#define KW_INT16 265 +#define KW_UINT16 266 +#define KW_INT32 267 +#define KW_UINT32 268 +#define KW_INT64 269 +#define KW_UINT64 270 +#define KW_FLOAT 271 +#define KW_DOUBLE 272 +#define KW_STRING 273 +#define INTEGER 274 +#define ID 275 +#define LITERAL_STRING 276 +#define DOUBLE 277 +#define VAR_CMD 278 + + + + +/* Copy the first part of user declarations. */ +#line 5 "idl.gram" + +#include +#include +#include "idl.h" +/* to cancel the flex internal definition of idllex:-) */ +#define YY_DECL +#include "idl_gram.h" +#include "idl_lex.h" + extern int cfgidllex(YYSTYPE* yylval,yyscan_t scanner, + meta_t *loc,idl_t *idl); + static void cfgidlerror(yyscan_t scanner,meta_t *loc, + idl_t *idl,char *msg); + + +/* Enabling traces. */ +#ifndef YYDEBUG +# define YYDEBUG 0 +#endif + +/* Enabling verbose error messages. */ +#ifdef YYERROR_VERBOSE +# undef YYERROR_VERBOSE +# define YYERROR_VERBOSE 1 +#else +# define YYERROR_VERBOSE 1 +#endif + +#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) +#line 40 "idl.gram" +typedef union YYSTYPE { + meta_t *meta; + var_t *var; + group_t *grp; + cf_list_t *cf_list; + meta_list_t *meta_list; + var_list_t *var_list; + cf_t *cf; +} YYSTYPE; +/* Line 191 of yacc.c. */ +#line 155 "idl_gram.c" +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +# define YYSTYPE_IS_DECLARED 1 +# define YYSTYPE_IS_TRIVIAL 1 +#endif + + + +/* Copy the second part of user declarations. */ + + +/* Line 214 of yacc.c. */ +#line 167 "idl_gram.c" + +#if ! defined (yyoverflow) || YYERROR_VERBOSE + +# ifndef YYFREE +# define YYFREE free +# endif +# ifndef YYMALLOC +# define YYMALLOC malloc +# endif + +/* The parser invokes alloca or malloc; define the necessary symbols. */ + +# ifdef YYSTACK_USE_ALLOCA +# if YYSTACK_USE_ALLOCA +# define YYSTACK_ALLOC alloca +# endif +# else +# if defined (alloca) || defined (_ALLOCA_H) +# define YYSTACK_ALLOC alloca +# else +# ifdef __GNUC__ +# define YYSTACK_ALLOC __builtin_alloca +# endif +# endif +# endif + +# ifdef YYSTACK_ALLOC + /* Pacify GCC's `empty if-body' warning. */ +# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) +# else +# if defined (__STDC__) || defined (__cplusplus) +# include /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +# endif +# define YYSTACK_ALLOC YYMALLOC +# define YYSTACK_FREE YYFREE +# endif +#endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */ + + +#if (! defined (yyoverflow) \ + && (! defined (__cplusplus) \ + || (defined (YYSTYPE_IS_TRIVIAL) && YYSTYPE_IS_TRIVIAL))) + +/* A type that is properly aligned for any stack member. */ +union yyalloc +{ + short yyss; + YYSTYPE yyvs; + }; + +/* The size of the maximum gap between one aligned stack and the next. */ +# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) + +/* The size of an array large to enough to hold all stacks, each with + N elements. */ +# define YYSTACK_BYTES(N) \ + ((N) * (sizeof (short) + sizeof (YYSTYPE)) \ + + YYSTACK_GAP_MAXIMUM) + +/* Copy COUNT objects from FROM to TO. The source and destination do + not overlap. */ +# ifndef YYCOPY +# if defined (__GNUC__) && 1 < __GNUC__ +# define YYCOPY(To, From, Count) \ + __builtin_memcpy (To, From, (Count) * sizeof (*(From))) +# else +# define YYCOPY(To, From, Count) \ + do \ + { \ + register YYSIZE_T yyi; \ + for (yyi = 0; yyi < (Count); yyi++) \ + (To)[yyi] = (From)[yyi]; \ + } \ + while (0) +# endif +# endif + +/* Relocate STACK from its old location to the new one. The + local variables YYSIZE and YYSTACKSIZE give the old and new number of + elements in the stack, and YYPTR gives the new location of the + stack. Advance YYPTR to a properly aligned location for the next + stack. */ +# define YYSTACK_RELOCATE(Stack) \ + do \ + { \ + YYSIZE_T yynewbytes; \ + YYCOPY (&yyptr->Stack, Stack, yysize); \ + Stack = &yyptr->Stack; \ + yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ + yyptr += yynewbytes / sizeof (*yyptr); \ + } \ + while (0) + +#endif + +#if defined (__STDC__) || defined (__cplusplus) + typedef signed char yysigned_char; +#else + typedef short yysigned_char; +#endif + +/* YYFINAL -- State number of the termination state. */ +#define YYFINAL 2 +/* YYLAST -- Last index in YYTABLE. */ +#define YYLAST 84 + +/* YYNTOKENS -- Number of terminals. */ +#define YYNTOKENS 33 +/* YYNNTS -- Number of nonterminals. */ +#define YYNNTS 13 +/* YYNRULES -- Number of rules. */ +#define YYNRULES 41 +/* YYNRULES -- Number of states. */ +#define YYNSTATES 62 + +/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ +#define YYUNDEFTOK 2 +#define YYMAXUTOK 278 + +#define YYTRANSLATE(YYX) \ + ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) + +/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ +static const unsigned char yytranslate[] = +{ + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 29, 30, 2, 2, 28, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 24, + 2, 27, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 25, 2, 26, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 31, 2, 32, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, + 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23 +}; + +#if YYDEBUG +/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in + YYRHS. */ +static const unsigned char yyprhs[] = +{ + 0, 0, 3, 6, 9, 10, 17, 19, 20, 25, + 29, 30, 32, 34, 36, 38, 40, 42, 44, 46, + 48, 50, 52, 54, 56, 58, 60, 63, 64, 68, + 70, 75, 79, 83, 85, 87, 89, 91, 93, 100, + 108, 111 +}; + +/* YYRHS -- A `-1'-separated list of the rules' RHS. */ +static const yysigned_char yyrhs[] = +{ + 34, 0, -1, 34, 35, -1, 34, 44, -1, -1, + 38, 20, 37, 39, 24, 36, -1, 23, -1, -1, + 37, 25, 19, 26, -1, 37, 25, 26, -1, -1, + 5, -1, 6, -1, 7, -1, 8, -1, 9, -1, + 10, -1, 11, -1, 12, -1, 13, -1, 14, -1, + 15, -1, 16, -1, 17, -1, 18, -1, 20, -1, + 27, 40, -1, -1, 40, 28, 41, -1, 41, -1, + 20, 29, 42, 30, -1, 20, 29, 30, -1, 42, + 28, 43, -1, 43, -1, 21, -1, 20, -1, 19, + -1, 22, -1, 4, 20, 31, 45, 32, 24, -1, + 20, 3, 20, 31, 45, 32, 24, -1, 45, 35, + -1, -1 +}; + +/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ +static const unsigned short yyrline[] = +{ + 0, 77, 77, 81, 85, 89, 142, 151, 158, 177, + 188, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 214, 220, 227, 234, + 245, 254, 266, 273, 284, 285, 286, 287, 291, 301, + 314, 322 +}; +#endif + +#if YYDEBUG || YYERROR_VERBOSE +/* YYTNME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. + First, the terminals, then, starting at YYNTOKENS, nonterminals. */ +static const char *const yytname[] = +{ + "$end", "error", "$undefined", "KW_OVERWRITE", "KW_STRUCT", "KW_RAW", + "KW_CHAR", "KW_UCHAR", "KW_INT8", "KW_UINT8", "KW_INT16", "KW_UINT16", + "KW_INT32", "KW_UINT32", "KW_INT64", "KW_UINT64", "KW_FLOAT", + "KW_DOUBLE", "KW_STRING", "INTEGER", "ID", "LITERAL_STRING", "DOUBLE", + "VAR_CMD", "';'", "'['", "']'", "'='", "','", "'('", "')'", "'{'", "'}'", + "$accept", "program", "variable", "optional_cmd", "optional_array", + "type_name", "optional_constraint", "constraint_list", + "constraint_function", "constraint_function_param_list", + "cons_func_param", "group", "variable_list", 0 +}; +#endif + +# ifdef YYPRINT +/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to + token YYLEX-NUM. */ +static const unsigned short yytoknum[] = +{ + 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 59, 91, 93, 61, 44, 40, + 41, 123, 125 +}; +# endif + +/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ +static const unsigned char yyr1[] = +{ + 0, 33, 34, 34, 34, 35, 36, 36, 37, 37, + 37, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 39, 39, 40, 40, + 41, 41, 42, 42, 43, 43, 43, 43, 44, 44, + 45, 45 +}; + +/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ +static const unsigned char yyr2[] = +{ + 0, 2, 2, 2, 0, 6, 1, 0, 4, 3, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 2, 0, 3, 1, + 4, 3, 3, 1, 1, 1, 1, 1, 6, 7, + 2, 0 +}; + +/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state + STATE-NUM when YYTABLE doesn't specify something else to do. Zero + means the default is an error. */ +static const unsigned char yydefact[] = +{ + 4, 0, 1, 0, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 2, + 0, 3, 0, 0, 10, 41, 0, 27, 0, 41, + 0, 0, 0, 25, 0, 40, 0, 0, 9, 0, + 26, 29, 7, 38, 0, 8, 0, 0, 6, 5, + 39, 36, 35, 34, 37, 31, 0, 33, 28, 0, + 30, 32 +}; + +/* YYDEFGOTO[NTERM-NUM]. */ +static const yysigned_char yydefgoto[] = +{ + -1, 1, 35, 49, 27, 20, 32, 40, 41, 56, + 57, 21, 28 +}; + +/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing + STATE-NUM. */ +#define YYPACT_NINF -7 +static const yysigned_char yypact[] = +{ + -7, 52, -7, -6, -7, -7, -7, -7, -7, -7, + -7, -7, -7, -7, -7, -7, -7, -7, 18, -7, + 2, -7, 15, 5, -7, -7, 16, -1, -5, -7, + -3, 25, 24, -7, 26, -7, 23, 27, -7, 20, + 43, -7, 28, -7, 30, -7, 54, 25, -7, -7, + -7, -7, -7, -7, -7, -7, 14, -7, -7, -2, + -7, -7 +}; + +/* YYPGOTO[NTERM-NUM]. */ +static const yysigned_char yypgoto[] = +{ + -7, -7, 76, -7, -7, -7, -7, -7, 31, -7, + 21, -7, 50 +}; + +/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If + positive, shift that token. If negative, reduce the rule which + number is the opposite. If zero, do what YYDEFACT says. + If YYTABLE_NINF, syntax error. */ +#define YYTABLE_NINF -1 +static const unsigned char yytable[] = +{ + 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, + 14, 15, 16, 17, 22, 33, 37, 51, 52, 53, + 54, 23, 24, 38, 30, 26, 31, 34, 4, 5, + 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 59, 33, 60, 39, 25, 29, 42, 46, + 43, 48, 2, 45, 50, 44, 3, 4, 5, 6, + 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 47, 18, 51, 52, 53, 54, 19, 58, 36, + 61, 0, 0, 0, 55 +}; + +static const yysigned_char yycheck[] = +{ + 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 20, 20, 19, 19, 20, 21, + 22, 3, 20, 26, 25, 20, 27, 32, 5, 6, + 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 28, 20, 30, 20, 31, 31, 24, 29, + 24, 23, 0, 26, 24, 32, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, + 18, 28, 20, 19, 20, 21, 22, 1, 47, 29, + 59, -1, -1, -1, 30 +}; + +/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing + symbol of state STATE-NUM. */ +static const unsigned char yystos[] = +{ + 0, 34, 0, 4, 5, 6, 7, 8, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 18, 20, 35, + 38, 44, 20, 3, 20, 31, 20, 37, 45, 31, + 25, 27, 39, 20, 32, 35, 45, 19, 26, 20, + 40, 41, 24, 24, 32, 26, 29, 28, 23, 36, + 24, 19, 20, 21, 22, 30, 42, 43, 41, 28, + 30, 43 +}; + +#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__) +# define YYSIZE_T __SIZE_TYPE__ +#endif +#if ! defined (YYSIZE_T) && defined (size_t) +# define YYSIZE_T size_t +#endif +#if ! defined (YYSIZE_T) +# if defined (__STDC__) || defined (__cplusplus) +# include /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +# endif +#endif +#if ! defined (YYSIZE_T) +# define YYSIZE_T unsigned int +#endif + +#define yyerrok (yyerrstatus = 0) +#define yyclearin (yychar = YYEMPTY) +#define YYEMPTY (-2) +#define YYEOF 0 + +#define YYACCEPT goto yyacceptlab +#define YYABORT goto yyabortlab +#define YYERROR goto yyerrorlab + + +/* Like YYERROR except do call yyerror. This remains here temporarily + to ease the transition to the new meaning of YYERROR, for GCC. + Once GCC version 2 has supplanted version 1, this can go. */ + +#define YYFAIL goto yyerrlab + +#define YYRECOVERING() (!!yyerrstatus) + +#define YYBACKUP(Token, Value) \ +do \ + if (yychar == YYEMPTY && yylen == 1) \ + { \ + yychar = (Token); \ + yylval = (Value); \ + yytoken = YYTRANSLATE (yychar); \ + YYPOPSTACK; \ + goto yybackup; \ + } \ + else \ + { \ + yyerror (scanner, loc, idl, "syntax error: cannot back up");\ + YYERROR; \ + } \ +while (0) + +#define YYTERROR 1 +#define YYERRCODE 256 + +/* YYLLOC_DEFAULT -- Compute the default location (before the actions + are run). */ + +#ifndef YYLLOC_DEFAULT +# define YYLLOC_DEFAULT(Current, Rhs, N) \ + ((Current).first_line = (Rhs)[1].first_line, \ + (Current).first_column = (Rhs)[1].first_column, \ + (Current).last_line = (Rhs)[N].last_line, \ + (Current).last_column = (Rhs)[N].last_column) +#endif + +/* YYLEX -- calling `yylex' with the right arguments. */ + +#ifdef YYLEX_PARAM +# define YYLEX yylex (&yylval, YYLEX_PARAM) +#else +# define YYLEX yylex (&yylval, scanner, loc, idl) +#endif + +/* Enable debugging if requested. */ +#if YYDEBUG + +# ifndef YYFPRINTF +# include /* INFRINGES ON USER NAME SPACE */ +# define YYFPRINTF fprintf +# endif + +# define YYDPRINTF(Args) \ +do { \ + if (yydebug) \ + YYFPRINTF Args; \ +} while (0) + +# define YYDSYMPRINT(Args) \ +do { \ + if (yydebug) \ + yysymprint Args; \ +} while (0) + +# define YYDSYMPRINTF(Title, Token, Value, Location) \ +do { \ + if (yydebug) \ + { \ + YYFPRINTF (stderr, "%s ", Title); \ + yysymprint (stderr, \ + Token, Value); \ + YYFPRINTF (stderr, "\n"); \ + } \ +} while (0) + +/*------------------------------------------------------------------. +| yy_stack_print -- Print the state stack from its BOTTOM up to its | +| TOP (included). | +`------------------------------------------------------------------*/ + +#if defined (__STDC__) || defined (__cplusplus) +static void +yy_stack_print (short *bottom, short *top) +#else +static void +yy_stack_print (bottom, top) + short *bottom; + short *top; +#endif +{ + YYFPRINTF (stderr, "Stack now"); + for (/* Nothing. */; bottom <= top; ++bottom) + YYFPRINTF (stderr, " %d", *bottom); + YYFPRINTF (stderr, "\n"); +} + +# define YY_STACK_PRINT(Bottom, Top) \ +do { \ + if (yydebug) \ + yy_stack_print ((Bottom), (Top)); \ +} while (0) + + +/*------------------------------------------------. +| Report that the YYRULE is going to be reduced. | +`------------------------------------------------*/ + +#if defined (__STDC__) || defined (__cplusplus) +static void +yy_reduce_print (int yyrule) +#else +static void +yy_reduce_print (yyrule) + int yyrule; +#endif +{ + int yyi; + unsigned int yylno = yyrline[yyrule]; + YYFPRINTF (stderr, "Reducing stack by rule %d (line %u), ", + yyrule - 1, yylno); + /* Print the symbols being reduced, and their result. */ + for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++) + YYFPRINTF (stderr, "%s ", yytname [yyrhs[yyi]]); + YYFPRINTF (stderr, "-> %s\n", yytname [yyr1[yyrule]]); +} + +# define YY_REDUCE_PRINT(Rule) \ +do { \ + if (yydebug) \ + yy_reduce_print (Rule); \ +} while (0) + +/* Nonzero means print parse trace. It is left uninitialized so that + multiple parsers can coexist. */ +int yydebug; +#else /* !YYDEBUG */ +# define YYDPRINTF(Args) +# define YYDSYMPRINT(Args) +# define YYDSYMPRINTF(Title, Token, Value, Location) +# define YY_STACK_PRINT(Bottom, Top) +# define YY_REDUCE_PRINT(Rule) +#endif /* !YYDEBUG */ + + +/* YYINITDEPTH -- initial size of the parser's stacks. */ +#ifndef YYINITDEPTH +# define YYINITDEPTH 200 +#endif + +/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only + if the built-in stack extension method is used). + + Do not make this value too large; the results are undefined if + SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH) + evaluated with infinite-precision integer arithmetic. */ + +#if defined (YYMAXDEPTH) && YYMAXDEPTH == 0 +# undef YYMAXDEPTH +#endif + +#ifndef YYMAXDEPTH +# define YYMAXDEPTH 10000 +#endif + + + +#if YYERROR_VERBOSE + +# ifndef yystrlen +# if defined (__GLIBC__) && defined (_STRING_H) +# define yystrlen strlen +# else +/* Return the length of YYSTR. */ +static YYSIZE_T +# if defined (__STDC__) || defined (__cplusplus) +yystrlen (const char *yystr) +# else +yystrlen (yystr) + const char *yystr; +# endif +{ + register const char *yys = yystr; + + while (*yys++ != '\0') + continue; + + return yys - yystr - 1; +} +# endif +# endif + +# ifndef yystpcpy +# if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE) +# define yystpcpy stpcpy +# else +/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in + YYDEST. */ +static char * +# if defined (__STDC__) || defined (__cplusplus) +yystpcpy (char *yydest, const char *yysrc) +# else +yystpcpy (yydest, yysrc) + char *yydest; + const char *yysrc; +# endif +{ + register char *yyd = yydest; + register const char *yys = yysrc; + + while ((*yyd++ = *yys++) != '\0') + continue; + + return yyd - 1; +} +# endif +# endif + +#endif /* !YYERROR_VERBOSE */ + + + +#if YYDEBUG +/*--------------------------------. +| Print this symbol on YYOUTPUT. | +`--------------------------------*/ + +#if defined (__STDC__) || defined (__cplusplus) +static void +yysymprint (FILE *yyoutput, int yytype, YYSTYPE *yyvaluep) +#else +static void +yysymprint (yyoutput, yytype, yyvaluep) + FILE *yyoutput; + int yytype; + YYSTYPE *yyvaluep; +#endif +{ + /* Pacify ``unused variable'' warnings. */ + (void) yyvaluep; + + if (yytype < YYNTOKENS) + { + YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); +# ifdef YYPRINT + YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); +# endif + } + else + YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); + + switch (yytype) + { + default: + break; + } + YYFPRINTF (yyoutput, ")"); +} + +#endif /* ! YYDEBUG */ +/*-----------------------------------------------. +| Release the memory associated to this symbol. | +`-----------------------------------------------*/ + +#if defined (__STDC__) || defined (__cplusplus) +static void +yydestruct (int yytype, YYSTYPE *yyvaluep) +#else +static void +yydestruct (yytype, yyvaluep) + int yytype; + YYSTYPE *yyvaluep; +#endif +{ + /* Pacify ``unused variable'' warnings. */ + (void) yyvaluep; + + switch (yytype) + { + + default: + break; + } +} + + +/* Prevent warnings from -Wmissing-prototypes. */ + +#ifdef YYPARSE_PARAM +# if defined (__STDC__) || defined (__cplusplus) +int yyparse (void *YYPARSE_PARAM); +# else +int yyparse (); +# endif +#else /* ! YYPARSE_PARAM */ +#if defined (__STDC__) || defined (__cplusplus) +int yyparse (yyscan_t scanner, meta_t *loc, idl_t *idl); +#else +int yyparse (); +#endif +#endif /* ! YYPARSE_PARAM */ + + + + + + +/*----------. +| yyparse. | +`----------*/ + +#ifdef YYPARSE_PARAM +# if defined (__STDC__) || defined (__cplusplus) +int yyparse (void *YYPARSE_PARAM) +# else +int yyparse (YYPARSE_PARAM) + void *YYPARSE_PARAM; +# endif +#else /* ! YYPARSE_PARAM */ +#if defined (__STDC__) || defined (__cplusplus) +int +yyparse (yyscan_t scanner, meta_t *loc, idl_t *idl) +#else +int +yyparse (scanner, loc, idl) + yyscan_t scanner; + meta_t *loc; + idl_t *idl; +#endif +#endif +{ + /* The lookahead symbol. */ +int yychar; + +/* The semantic value of the lookahead symbol. */ +YYSTYPE yylval; + +/* Number of syntax errors so far. */ +int yynerrs; + + register int yystate; + register int yyn; + int yyresult; + /* Number of tokens to shift before error messages enabled. */ + int yyerrstatus; + /* Lookahead token as an internal (translated) token number. */ + int yytoken = 0; + + /* Three stacks and their tools: + `yyss': related to states, + `yyvs': related to semantic values, + `yyls': related to locations. + + Refer to the stacks thru separate pointers, to allow yyoverflow + to reallocate them elsewhere. */ + + /* The state stack. */ + short yyssa[YYINITDEPTH]; + short *yyss = yyssa; + register short *yyssp; + + /* The semantic value stack. */ + YYSTYPE yyvsa[YYINITDEPTH]; + YYSTYPE *yyvs = yyvsa; + register YYSTYPE *yyvsp; + + + +#define YYPOPSTACK (yyvsp--, yyssp--) + + YYSIZE_T yystacksize = YYINITDEPTH; + + /* The variables used to return semantic value and location from the + action routines. */ + YYSTYPE yyval; + + + /* When reducing, the number of symbols on the RHS of the reduced + rule. */ + int yylen; + + YYDPRINTF ((stderr, "Starting parse\n")); + + yystate = 0; + yyerrstatus = 0; + yynerrs = 0; + yychar = YYEMPTY; /* Cause a token to be read. */ + + /* Initialize stack pointers. + Waste one element of value and location stack + so that they stay on the same level as the state stack. + The wasted elements are never initialized. */ + + yyssp = yyss; + yyvsp = yyvs; + + goto yysetstate; + +/*------------------------------------------------------------. +| yynewstate -- Push a new state, which is found in yystate. | +`------------------------------------------------------------*/ + yynewstate: + /* In all cases, when you get here, the value and location stacks + have just been pushed. so pushing a state here evens the stacks. + */ + yyssp++; + + yysetstate: + *yyssp = yystate; + + if (yyss + yystacksize - 1 <= yyssp) + { + /* Get the current used size of the three stacks, in elements. */ + YYSIZE_T yysize = yyssp - yyss + 1; + +#ifdef yyoverflow + { + /* Give user a chance to reallocate the stack. Use copies of + these so that the &'s don't force the real ones into + memory. */ + YYSTYPE *yyvs1 = yyvs; + short *yyss1 = yyss; + + + /* Each stack pointer address is followed by the size of the + data in use in that stack, in bytes. This used to be a + conditional around just the two extra args, but that might + be undefined if yyoverflow is a macro. */ + yyoverflow ("parser stack overflow", + &yyss1, yysize * sizeof (*yyssp), + &yyvs1, yysize * sizeof (*yyvsp), + + &yystacksize); + + yyss = yyss1; + yyvs = yyvs1; + } +#else /* no yyoverflow */ +# ifndef YYSTACK_RELOCATE + goto yyoverflowlab; +# else + /* Extend the stack our own way. */ + if (YYMAXDEPTH <= yystacksize) + goto yyoverflowlab; + yystacksize *= 2; + if (YYMAXDEPTH < yystacksize) + yystacksize = YYMAXDEPTH; + + { + short *yyss1 = yyss; + union yyalloc *yyptr = + (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); + if (! yyptr) + goto yyoverflowlab; + YYSTACK_RELOCATE (yyss); + YYSTACK_RELOCATE (yyvs); + +# undef YYSTACK_RELOCATE + if (yyss1 != yyssa) + YYSTACK_FREE (yyss1); + } +# endif +#endif /* no yyoverflow */ + + yyssp = yyss + yysize - 1; + yyvsp = yyvs + yysize - 1; + + + YYDPRINTF ((stderr, "Stack size increased to %lu\n", + (unsigned long int) yystacksize)); + + if (yyss + yystacksize - 1 <= yyssp) + YYABORT; + } + + YYDPRINTF ((stderr, "Entering state %d\n", yystate)); + + goto yybackup; + +/*-----------. +| yybackup. | +`-----------*/ +yybackup: + +/* Do appropriate processing given the current state. */ +/* Read a lookahead token if we need one and don't already have one. */ +/* yyresume: */ + + /* First try to decide what to do without reference to lookahead token. */ + + yyn = yypact[yystate]; + if (yyn == YYPACT_NINF) + goto yydefault; + + /* Not known => get a lookahead token if don't already have one. */ + + /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */ + if (yychar == YYEMPTY) + { + YYDPRINTF ((stderr, "Reading a token: ")); + yychar = YYLEX; + } + + if (yychar <= YYEOF) + { + yychar = yytoken = YYEOF; + YYDPRINTF ((stderr, "Now at end of input.\n")); + } + else + { + yytoken = YYTRANSLATE (yychar); + YYDSYMPRINTF ("Next token is", yytoken, &yylval, &yylloc); + } + + /* If the proper action on seeing token YYTOKEN is to reduce or to + detect an error, take that action. */ + yyn += yytoken; + if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) + goto yydefault; + yyn = yytable[yyn]; + if (yyn <= 0) + { + if (yyn == 0 || yyn == YYTABLE_NINF) + goto yyerrlab; + yyn = -yyn; + goto yyreduce; + } + + if (yyn == YYFINAL) + YYACCEPT; + + /* Shift the lookahead token. */ + YYDPRINTF ((stderr, "Shifting token %s, ", yytname[yytoken])); + + /* Discard the token being shifted unless it is eof. */ + if (yychar != YYEOF) + yychar = YYEMPTY; + + *++yyvsp = yylval; + + + /* Count tokens shifted since error; after three, turn off error + status. */ + if (yyerrstatus) + yyerrstatus--; + + yystate = yyn; + goto yynewstate; + + +/*-----------------------------------------------------------. +| yydefault -- do the default action for the current state. | +`-----------------------------------------------------------*/ +yydefault: + yyn = yydefact[yystate]; + if (yyn == 0) + goto yyerrlab; + goto yyreduce; + + +/*-----------------------------. +| yyreduce -- Do a reduction. | +`-----------------------------*/ +yyreduce: + /* yyn is the number of a rule to reduce with. */ + yylen = yyr2[yyn]; + + /* If YYLEN is nonzero, implement the default value of the action: + `$$ = $1'. + + Otherwise, the following line sets YYVAL to garbage. + This behavior is undocumented and Bison + users should not rely upon it. Assigning to YYVAL + unconditionally makes the parser a bit smaller, and it avoids a + GCC warning that YYVAL may be used uninitialized. */ + yyval = yyvsp[1-yylen]; + + + YY_REDUCE_PRINT (yyn); + switch (yyn) + { + case 2: +#line 78 "idl.gram" + { + add_idl_var(idl,yyvsp[0].var); +;} + break; + + case 3: +#line 82 "idl.gram" + { + add_idl_group(idl,yyvsp[0].grp); +;} + break; + + case 5: +#line 90 "idl.gram" + { + meta_t *type=yyvsp[-5].meta,*id=yyvsp[-4].meta; + meta_list_t *array_size_list=yyvsp[-3].meta_list; + meta_list_t *cmdval = yyvsp[0].meta_list; + cf_list_t *cf_list=yyvsp[-2].cf_list; + cf_t *cf; + + var_t *var=alloc_var(idl); + + //allocate the necessary space + if(cf_list==NULL) { + cf_list=new cf_list_t; + idl->parse_list.push_back(cf_list); + } + if(array_size_list==NULL) { + array_size_list=new meta_list_t; + idl->parse_meta_list.push_back(array_size_list); + } + + if(array_size_list->size()!=0){ + /* the arary size list does exist */ + cf=alloc_cf(idl); + + meta_t func; + func.data="array"; + func.file=id->file; + func.lineno=id->lineno; + assemble_idl_cf(cf,&func,array_size_list); + + cf_list->push_back(cf); + } + if (cmdval != NULL) { + meta_t func ; + func.data = "comment"; + func.file = id->file; + func.lineno = id->lineno; + cf_t *cf = alloc_cf(idl); + assemble_idl_cf(cf, &func, cmdval); + cf_list->push_back(cf); + + //delete cmdval; + } + assemble_idl_var(idl,var,id,type,cf_list); + //delete cf_list; + //delete array_size_list; + + + + yyval.var=var; +;} + break; + + case 6: +#line 143 "idl.gram" + { + meta_list_t *lst = new meta_list_t; + idl->parse_meta_list.push_back(lst); + lst->push_back(yyvsp[0].meta); + idl->cmdreserve = 0; + yyval.meta_list = lst; +;} + break; + + case 7: +#line 151 "idl.gram" + { + idl->cmdreserve = 0; + yyval.meta_list = NULL; +;} + break; + + case 8: +#line 159 "idl.gram" + { + meta_list_t *array_size_list=yyvsp[-3].meta_list; + meta_t *array_tag=yyvsp[-1].meta; + int array_size=atoi(array_tag->data.c_str()); + /* we have to validate here */ + if(array_size<=0){ + char tmpstr[2048]; + meta_t errinfo; + snprintf(tmpstr,sizeof(tmpstr),"array size %d is invalid",array_size); + errinfo.data=tmpstr; + errinfo.file=array_tag->file; + errinfo.lineno=array_tag->lineno; + add_idl_error(idl,errinfo); + array_tag->data="0"; + } + array_size_list->push_back(array_tag); + yyval.meta_list=array_size_list; +;} + break; + + case 9: +#line 178 "idl.gram" + { + meta_list_t *array_size_list=yyvsp[-2].meta_list; + meta_t *array_size=alloc_meta(idl); + array_size->data="0"; + array_size->file=loc->file; + array_size->lineno=loc->lineno; + array_size_list->push_back(array_size); + yyval.meta_list=array_size_list; +;} + break; + + case 10: +#line 188 "idl.gram" + { + meta_list_t *array_size_list=new meta_list_t; + idl->parse_meta_list.push_back(array_size_list); + yyval.meta_list=array_size_list; + ;} + break; + + case 11: +#line 196 "idl.gram" + {yyval.meta=yyvsp[0].meta;;} + break; + + case 12: +#line 197 "idl.gram" + {yyval.meta=yyvsp[0].meta;;} + break; + + case 13: +#line 198 "idl.gram" + {yyval.meta=yyvsp[0].meta;;} + break; + + case 14: +#line 199 "idl.gram" + {yyval.meta=yyvsp[0].meta;;} + break; + + case 15: +#line 200 "idl.gram" + {yyval.meta=yyvsp[0].meta;;} + break; + + case 16: +#line 201 "idl.gram" + {yyval.meta=yyvsp[0].meta;;} + break; + + case 17: +#line 202 "idl.gram" + {yyval.meta=yyvsp[0].meta;;} + break; + + case 18: +#line 203 "idl.gram" + {yyval.meta=yyvsp[0].meta;;} + break; + + case 19: +#line 204 "idl.gram" + {yyval.meta=yyvsp[0].meta;;} + break; + + case 20: +#line 205 "idl.gram" + {yyval.meta=yyvsp[0].meta;;} + break; + + case 21: +#line 206 "idl.gram" + {yyval.meta=yyvsp[0].meta;;} + break; + + case 22: +#line 207 "idl.gram" + {yyval.meta=yyvsp[0].meta;;} + break; + + case 23: +#line 208 "idl.gram" + {yyval.meta=yyvsp[0].meta;;} + break; + + case 24: +#line 209 "idl.gram" + {yyval.meta=yyvsp[0].meta;;} + break; + + case 25: +#line 210 "idl.gram" + {yyval.meta=yyvsp[0].meta;;} + break; + + case 26: +#line 215 "idl.gram" + { + yyval.cf_list=yyvsp[0].cf_list; + idl->cmdreserve = 1; +;} + break; + + case 27: +#line 220 "idl.gram" + { + yyval.cf_list=NULL; + idl->cmdreserve = 1; +;} + break; + + case 28: +#line 228 "idl.gram" + { + cf_list_t *cf_list=yyvsp[-2].cf_list; + cf_t *cf=yyvsp[0].cf; + cf_list->push_back(cf); + yyval.cf_list=cf_list; +;} + break; + + case 29: +#line 235 "idl.gram" + { + cf_list_t *cf_list=new cf_list_t; + idl->parse_list.push_back(cf_list); + cf_t *cf=yyvsp[0].cf; + cf_list->push_back(cf); + yyval.cf_list=cf_list; +;} + break; + + case 30: +#line 246 "idl.gram" + { + meta_t *func=yyvsp[-3].meta; + meta_list_t *arg_list=yyvsp[-1].meta_list; + cf_t *cf=alloc_cf(idl); + assemble_idl_cf(cf,func,arg_list); + //delete arg_list; + yyval.cf=cf; +;} + break; + + case 31: +#line 255 "idl.gram" + { + meta_t *func=yyvsp[-2].meta; + meta_list_t *arg_list=new meta_list_t; + cf_t *cf=alloc_cf(idl); + assemble_idl_cf(cf,func,arg_list); + delete arg_list; + yyval.cf=cf; +;} + break; + + case 32: +#line 267 "idl.gram" + { + meta_list_t *param_list=yyvsp[-2].meta_list; + meta_t *param=yyvsp[0].meta; + param_list->push_back(param); + yyval.meta_list=param_list; +;} + break; + + case 33: +#line 274 "idl.gram" + { + meta_list_t *param_list=new meta_list_t; + idl->parse_meta_list.push_back(param_list); + meta_t *param=yyvsp[0].meta; + param_list->push_back(param); + yyval.meta_list=param_list; +;} + break; + + case 34: +#line 284 "idl.gram" + {yyval.meta=yyvsp[0].meta;;} + break; + + case 35: +#line 285 "idl.gram" + {yyval.meta=yyvsp[0].meta;;} + break; + + case 36: +#line 286 "idl.gram" + {yyval.meta=yyvsp[0].meta;;} + break; + + case 37: +#line 287 "idl.gram" + {yyval.meta=yyvsp[0].meta;;} + break; + + case 38: +#line 292 "idl.gram" + { + meta_t *id=yyvsp[-4].meta; + var_list_t *var_list=yyvsp[-2].var_list; + group_t *grp; + grp=alloc_group(idl); + assemble_idl_group(idl,grp,id,var_list); + //delete var_list; + yyval.grp=grp; +;} + break; + + case 39: +#line 302 "idl.gram" + { + meta_t *new_id=yyvsp[-6].meta,*old_id=yyvsp[-4].meta; + var_list_t *var_list=yyvsp[-2].var_list; + group_t *grp; + grp=alloc_group(idl); + overwrite_idl_group(idl,grp,new_id,old_id,var_list); + //delete var_list; + yyval.grp=grp; +;} + break; + + case 40: +#line 315 "idl.gram" + { + var_list_t *var_list=yyvsp[-1].var_list; + var_t *var=yyvsp[0].var; + var_list->push_back(var); + yyval.var_list=var_list; +;} + break; + + case 41: +#line 322 "idl.gram" + { + var_list_t *var_list=new var_list_t; + idl->parse_var_list.push_back(var_list); + yyval.var_list=var_list; +;} + break; + + + } + +/* Line 1000 of yacc.c. */ +#line 1465 "idl_gram.c" + + yyvsp -= yylen; + yyssp -= yylen; + + + YY_STACK_PRINT (yyss, yyssp); + + *++yyvsp = yyval; + + + /* Now `shift' the result of the reduction. Determine what state + that goes to, based on the state we popped back to and the rule + number reduced by. */ + + yyn = yyr1[yyn]; + + yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; + if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) + yystate = yytable[yystate]; + else + yystate = yydefgoto[yyn - YYNTOKENS]; + + goto yynewstate; + + +/*------------------------------------. +| yyerrlab -- here on detecting error | +`------------------------------------*/ +yyerrlab: + /* If not already recovering from an error, report this error. */ + if (!yyerrstatus) + { + ++yynerrs; +#if YYERROR_VERBOSE + yyn = yypact[yystate]; + + if (YYPACT_NINF < yyn && yyn < YYLAST) + { + YYSIZE_T yysize = 0; + int yytype = YYTRANSLATE (yychar); + const char* yyprefix; + char *yymsg; + int yyx; + + /* Start YYX at -YYN if negative to avoid negative indexes in + YYCHECK. */ + int yyxbegin = yyn < 0 ? -yyn : 0; + + /* Stay within bounds of both yycheck and yytname. */ + int yychecklim = YYLAST - yyn; + int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; + int yycount = 0; + + yyprefix = ", expecting "; + for (yyx = yyxbegin; yyx < yyxend; ++yyx) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) + { + yysize += yystrlen (yyprefix) + yystrlen (yytname [yyx]); + yycount += 1; + if (yycount == 5) + { + yysize = 0; + break; + } + } + yysize += (sizeof ("syntax error, unexpected ") + + yystrlen (yytname[yytype])); + yymsg = (char *) YYSTACK_ALLOC (yysize); + if (yymsg != 0) + { + char *yyp = yystpcpy (yymsg, "syntax error, unexpected "); + yyp = yystpcpy (yyp, yytname[yytype]); + + if (yycount < 5) + { + yyprefix = ", expecting "; + for (yyx = yyxbegin; yyx < yyxend; ++yyx) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) + { + yyp = yystpcpy (yyp, yyprefix); + yyp = yystpcpy (yyp, yytname[yyx]); + yyprefix = " or "; + } + } + yyerror (scanner, loc, idl, yymsg); + YYSTACK_FREE (yymsg); + } + else + yyerror (scanner, loc, idl, "syntax error; also virtual memory exhausted"); + } + else +#endif /* YYERROR_VERBOSE */ + yyerror (scanner, loc, idl, "syntax error"); + } + + + + if (yyerrstatus == 3) + { + /* If just tried and failed to reuse lookahead token after an + error, discard it. */ + + if (yychar <= YYEOF) + { + /* If at end of input, pop the error token, + then the rest of the stack, then return failure. */ + if (yychar == YYEOF) + for (;;) + { + YYPOPSTACK; + if (yyssp == yyss) + YYABORT; + YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp); + yydestruct (yystos[*yyssp], yyvsp); + } + } + else + { + YYDSYMPRINTF ("Error: discarding", yytoken, &yylval, &yylloc); + yydestruct (yytoken, &yylval); + yychar = YYEMPTY; + + } + } + + /* Else will try to reuse lookahead token after shifting the error + token. */ + goto yyerrlab1; + + +/*---------------------------------------------------. +| yyerrorlab -- error raised explicitly by YYERROR. | +`---------------------------------------------------*/ +yyerrorlab: + +#ifdef __GNUC__ + /* Pacify GCC when the user code never invokes YYERROR and the label + yyerrorlab therefore never appears in user code. */ + if (0) + goto yyerrorlab; +#endif + + yyvsp -= yylen; + yyssp -= yylen; + yystate = *yyssp; + goto yyerrlab1; + + +/*-------------------------------------------------------------. +| yyerrlab1 -- common code for both syntax error and YYERROR. | +`-------------------------------------------------------------*/ +yyerrlab1: + yyerrstatus = 3; /* Each real token shifted decrements this. */ + + for (;;) + { + yyn = yypact[yystate]; + if (yyn != YYPACT_NINF) + { + yyn += YYTERROR; + if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) + { + yyn = yytable[yyn]; + if (0 < yyn) + break; + } + } + + /* Pop the current state because it cannot handle the error token. */ + if (yyssp == yyss) + YYABORT; + + YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp); + yydestruct (yystos[yystate], yyvsp); + YYPOPSTACK; + yystate = *yyssp; + YY_STACK_PRINT (yyss, yyssp); + } + + if (yyn == YYFINAL) + YYACCEPT; + + YYDPRINTF ((stderr, "Shifting error token, ")); + + *++yyvsp = yylval; + + + yystate = yyn; + goto yynewstate; + + +/*-------------------------------------. +| yyacceptlab -- YYACCEPT comes here. | +`-------------------------------------*/ +yyacceptlab: + yyresult = 0; + goto yyreturn; + +/*-----------------------------------. +| yyabortlab -- YYABORT comes here. | +`-----------------------------------*/ +yyabortlab: + yyresult = 1; + goto yyreturn; + +#ifndef yyoverflow +/*----------------------------------------------. +| yyoverflowlab -- parser overflow comes here. | +`----------------------------------------------*/ +yyoverflowlab: + yyerror (scanner, loc, idl, "parser stack overflow"); + yyresult = 2; + /* Fall through. */ +#endif + +yyreturn: +#ifndef yyoverflow + if (yyss != yyssa) + YYSTACK_FREE (yyss); +#endif + return yyresult; +} + + +#line 329 "idl.gram" + +void cfgidlerror(yyscan_t scanner,meta_t *loc,idl_t *idl,char *msg) +{ + char tmp[2048]; + meta_t errinfo; + errinfo.file=loc->file; + errinfo.lineno=loc->lineno; + snprintf(tmp,sizeof(tmp),"%s before char:'%c'", + msg, + cfgidlget_text(scanner)[0]); + errinfo.data=tmp; + add_idl_error(idl,errinfo); + return ; +} + diff --git a/configure/compiler/src/idl_gram.gcno b/configure/compiler/src/idl_gram.gcno new file mode 100644 index 0000000000000000000000000000000000000000..a50763f436d5fdc6d77464c663dbd12fb68736de Binary files /dev/null and b/configure/compiler/src/idl_gram.gcno differ diff --git a/configure/compiler/src/idl_gram.h b/configure/compiler/src/idl_gram.h new file mode 100644 index 0000000000000000000000000000000000000000..806ca2434bf747bb6d8913031e2f7315e8e0f672 --- /dev/null +++ b/configure/compiler/src/idl_gram.h @@ -0,0 +1,101 @@ +/* A Bison parser, made by GNU Bison 1.875c. */ + +/* Skeleton parser for Yacc-like parsing with Bison, + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* As a special exception, when this file is copied by Bison into a + Bison output file, you may use that output file without restriction. + This special exception was added by the Free Software Foundation + in version 1.24 of Bison. */ + +/* Tokens. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + KW_OVERWRITE = 258, + KW_STRUCT = 259, + KW_RAW = 260, + KW_CHAR = 261, + KW_UCHAR = 262, + KW_INT8 = 263, + KW_UINT8 = 264, + KW_INT16 = 265, + KW_UINT16 = 266, + KW_INT32 = 267, + KW_UINT32 = 268, + KW_INT64 = 269, + KW_UINT64 = 270, + KW_FLOAT = 271, + KW_DOUBLE = 272, + KW_STRING = 273, + INTEGER = 274, + ID = 275, + LITERAL_STRING = 276, + DOUBLE = 277, + VAR_CMD = 278 + }; +#endif +#define KW_OVERWRITE 258 +#define KW_STRUCT 259 +#define KW_RAW 260 +#define KW_CHAR 261 +#define KW_UCHAR 262 +#define KW_INT8 263 +#define KW_UINT8 264 +#define KW_INT16 265 +#define KW_UINT16 266 +#define KW_INT32 267 +#define KW_UINT32 268 +#define KW_INT64 269 +#define KW_UINT64 270 +#define KW_FLOAT 271 +#define KW_DOUBLE 272 +#define KW_STRING 273 +#define INTEGER 274 +#define ID 275 +#define LITERAL_STRING 276 +#define DOUBLE 277 +#define VAR_CMD 278 + + + + +#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) +#line 40 "idl.gram" +typedef union YYSTYPE { + meta_t *meta; + var_t *var; + group_t *grp; + cf_list_t *cf_list; + meta_list_t *meta_list; + var_list_t *var_list; + cf_t *cf; +} YYSTYPE; +/* Line 1275 of yacc.c. */ +#line 93 "idl_gram.h" +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +# define YYSTYPE_IS_DECLARED 1 +# define YYSTYPE_IS_TRIVIAL 1 +#endif + + + + + diff --git a/configure/compiler/src/idl_lex.c b/configure/compiler/src/idl_lex.c new file mode 100644 index 0000000000000000000000000000000000000000..0274222a0d9120cbe5548523af177a4debded09a --- /dev/null +++ b/configure/compiler/src/idl_lex.c @@ -0,0 +1,2251 @@ +#line 2 "idl_lex.c" + +#line 4 "idl_lex.c" + +#define YY_INT_ALIGNED short int + +/* A lexical scanner generated by flex */ + +#define FLEX_SCANNER +#define YY_FLEX_MAJOR_VERSION 2 +#define YY_FLEX_MINOR_VERSION 5 +#define YY_FLEX_SUBMINOR_VERSION 35 +#if YY_FLEX_SUBMINOR_VERSION > 0 +#define FLEX_BETA +#endif + +/* First, we deal with platform-specific or compiler-specific issues. */ + +/* begin standard C headers. */ +#include +#include +#include +#include + +/* end standard C headers. */ + +/* flex integer type definitions */ + +#ifndef FLEXINT_H +#define FLEXINT_H + +/* C99 systems have . Non-C99 systems may or may not. */ + +#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + +/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, + * if you want the limit (max/min) macros for int types. + */ +#ifndef __STDC_LIMIT_MACROS +#define __STDC_LIMIT_MACROS 1 +#endif + +#include +typedef int8_t flex_int8_t; +typedef uint8_t flex_uint8_t; +typedef int16_t flex_int16_t; +typedef uint16_t flex_uint16_t; +typedef int32_t flex_int32_t; +typedef uint32_t flex_uint32_t; +#else +typedef signed char flex_int8_t; +typedef short int flex_int16_t; +typedef int flex_int32_t; +typedef unsigned char flex_uint8_t; +typedef unsigned short int flex_uint16_t; +typedef unsigned int flex_uint32_t; +#endif /* ! C99 */ + +/* Limits of integral types. */ +#ifndef INT8_MIN +#define INT8_MIN (-128) +#endif +#ifndef INT16_MIN +#define INT16_MIN (-32767-1) +#endif +#ifndef INT32_MIN +#define INT32_MIN (-2147483647-1) +#endif +#ifndef INT8_MAX +#define INT8_MAX (127) +#endif +#ifndef INT16_MAX +#define INT16_MAX (32767) +#endif +#ifndef INT32_MAX +#define INT32_MAX (2147483647) +#endif +#ifndef UINT8_MAX +#define UINT8_MAX (255U) +#endif +#ifndef UINT16_MAX +#define UINT16_MAX (65535U) +#endif +#ifndef UINT32_MAX +#define UINT32_MAX (4294967295U) +#endif + +#endif /* ! FLEXINT_H */ + +#ifdef __cplusplus + +/* The "const" storage-class-modifier is valid. */ +#define YY_USE_CONST + +#else /* ! __cplusplus */ + +/* C99 requires __STDC__ to be defined as 1. */ +#if defined (__STDC__) + +#define YY_USE_CONST + +#endif /* defined (__STDC__) */ +#endif /* ! __cplusplus */ + +#ifdef YY_USE_CONST +#define yyconst const +#else +#define yyconst +#endif + +/* Returned upon end-of-file. */ +#define YY_NULL 0 + +/* Promotes a possibly negative, possibly signed char to an unsigned + * integer for use as an array index. If the signed char is negative, + * we want to instead treat it as an 8-bit unsigned char, hence the + * double cast. + */ +#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) + +/* An opaque pointer. */ +#ifndef YY_TYPEDEF_YY_SCANNER_T +#define YY_TYPEDEF_YY_SCANNER_T +typedef void* yyscan_t; +#endif + +/* For convenience, these vars (plus the bison vars far below) + are macros in the reentrant scanner. */ +#define yyin yyg->yyin_r +#define yyout yyg->yyout_r +#define yyextra yyg->yyextra_r +#define yyleng yyg->yyleng_r +#define yytext yyg->yytext_r +#define yylineno (YY_CURRENT_BUFFER_LVALUE->yy_bs_lineno) +#define yycolumn (YY_CURRENT_BUFFER_LVALUE->yy_bs_column) +#define yy_flex_debug yyg->yy_flex_debug_r + +/* Enter a start condition. This macro really ought to take a parameter, + * but we do it the disgusting crufty way forced on us by the ()-less + * definition of BEGIN. + */ +#define BEGIN yyg->yy_start = 1 + 2 * + +/* Translate the current start state into a value that can be later handed + * to BEGIN to return to the state. The YYSTATE alias is for lex + * compatibility. + */ +#define YY_START ((yyg->yy_start - 1) / 2) +#define YYSTATE YY_START + +/* Action number for EOF rule of a given start state. */ +#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) + +/* Special action meaning "start processing a new file". */ +#define YY_NEW_FILE cfgidlrestart(yyin ,yyscanner ) + +#define YY_END_OF_BUFFER_CHAR 0 + +/* Size of default input buffer. */ +#ifndef YY_BUF_SIZE +#define YY_BUF_SIZE 16384 +#endif + +/* The state buf must be large enough to hold one state per character in the main buffer. + */ +#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) + +#ifndef YY_TYPEDEF_YY_BUFFER_STATE +#define YY_TYPEDEF_YY_BUFFER_STATE +typedef struct yy_buffer_state *YY_BUFFER_STATE; +#endif + +#define EOB_ACT_CONTINUE_SCAN 0 +#define EOB_ACT_END_OF_FILE 1 +#define EOB_ACT_LAST_MATCH 2 + + #define YY_LESS_LINENO(n) + +/* Return all but the first "n" matched characters back to the input stream. */ +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + int yyless_macro_arg = (n); \ + YY_LESS_LINENO(yyless_macro_arg);\ + *yy_cp = yyg->yy_hold_char; \ + YY_RESTORE_YY_MORE_OFFSET \ + yyg->yy_c_buf_p = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ + YY_DO_BEFORE_ACTION; /* set up yytext again */ \ + } \ + while ( 0 ) + +#define unput(c) yyunput( c, yyg->yytext_ptr , yyscanner ) + +#ifndef YY_TYPEDEF_YY_SIZE_T +#define YY_TYPEDEF_YY_SIZE_T +typedef size_t yy_size_t; +#endif + +#ifndef YY_STRUCT_YY_BUFFER_STATE +#define YY_STRUCT_YY_BUFFER_STATE +struct yy_buffer_state + { + FILE *yy_input_file; + + char *yy_ch_buf; /* input buffer */ + char *yy_buf_pos; /* current position in input buffer */ + + /* Size of input buffer in bytes, not including room for EOB + * characters. + */ + yy_size_t yy_buf_size; + + /* Number of characters read into yy_ch_buf, not including EOB + * characters. + */ + int yy_n_chars; + + /* Whether we "own" the buffer - i.e., we know we created it, + * and can realloc() it to grow it, and should free() it to + * delete it. + */ + int yy_is_our_buffer; + + /* Whether this is an "interactive" input source; if so, and + * if we're using stdio for input, then we want to use getc() + * instead of fread(), to make sure we stop fetching input after + * each newline. + */ + int yy_is_interactive; + + /* Whether we're considered to be at the beginning of a line. + * If so, '^' rules will be active on the next match, otherwise + * not. + */ + int yy_at_bol; + + int yy_bs_lineno; /**< The line count. */ + int yy_bs_column; /**< The column count. */ + + /* Whether to try to fill the input buffer when we reach the + * end of it. + */ + int yy_fill_buffer; + + int yy_buffer_status; + +#define YY_BUFFER_NEW 0 +#define YY_BUFFER_NORMAL 1 + /* When an EOF's been seen but there's still some text to process + * then we mark the buffer as YY_EOF_PENDING, to indicate that we + * shouldn't try reading from the input source any more. We might + * still have a bunch of tokens to match, though, because of + * possible backing-up. + * + * When we actually see the EOF, we change the status to "new" + * (via cfgidlrestart()), so that the user can continue scanning by + * just pointing yyin at a new input file. + */ +#define YY_BUFFER_EOF_PENDING 2 + + }; +#endif /* !YY_STRUCT_YY_BUFFER_STATE */ + +/* We provide macros for accessing buffer states in case in the + * future we want to put the buffer states in a more general + * "scanner state". + * + * Returns the top of the stack, or NULL. + */ +#define YY_CURRENT_BUFFER ( yyg->yy_buffer_stack \ + ? yyg->yy_buffer_stack[yyg->yy_buffer_stack_top] \ + : NULL) + +/* Same as previous macro, but useful when we know that the buffer stack is not + * NULL or when we need an lvalue. For internal use only. + */ +#define YY_CURRENT_BUFFER_LVALUE yyg->yy_buffer_stack[yyg->yy_buffer_stack_top] + +void cfgidlrestart (FILE *input_file ,yyscan_t yyscanner ); +void cfgidl_switch_to_buffer (YY_BUFFER_STATE new_buffer ,yyscan_t yyscanner ); +YY_BUFFER_STATE cfgidl_create_buffer (FILE *file,int size ,yyscan_t yyscanner ); +void cfgidl_delete_buffer (YY_BUFFER_STATE b ,yyscan_t yyscanner ); +void cfgidl_flush_buffer (YY_BUFFER_STATE b ,yyscan_t yyscanner ); +void cfgidlpush_buffer_state (YY_BUFFER_STATE new_buffer ,yyscan_t yyscanner ); +void cfgidlpop_buffer_state (yyscan_t yyscanner ); + +static void cfgidlensure_buffer_stack (yyscan_t yyscanner ); +static void cfgidl_load_buffer_state (yyscan_t yyscanner ); +static void cfgidl_init_buffer (YY_BUFFER_STATE b,FILE *file ,yyscan_t yyscanner ); + +#define YY_FLUSH_BUFFER cfgidl_flush_buffer(YY_CURRENT_BUFFER ,yyscanner) + +YY_BUFFER_STATE cfgidl_scan_buffer (char *base,yy_size_t size ,yyscan_t yyscanner ); +YY_BUFFER_STATE cfgidl_scan_string (yyconst char *yy_str ,yyscan_t yyscanner ); +YY_BUFFER_STATE cfgidl_scan_bytes (yyconst char *bytes,int len ,yyscan_t yyscanner ); + +void *cfgidlalloc (yy_size_t ,yyscan_t yyscanner ); +void *cfgidlrealloc (void *,yy_size_t ,yyscan_t yyscanner ); +void cfgidlfree (void * ,yyscan_t yyscanner ); + +#define yy_new_buffer cfgidl_create_buffer + +#define yy_set_interactive(is_interactive) \ + { \ + if ( ! YY_CURRENT_BUFFER ){ \ + cfgidlensure_buffer_stack (yyscanner); \ + YY_CURRENT_BUFFER_LVALUE = \ + cfgidl_create_buffer(yyin,YY_BUF_SIZE ,yyscanner); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ + } + +#define yy_set_bol(at_bol) \ + { \ + if ( ! YY_CURRENT_BUFFER ){\ + cfgidlensure_buffer_stack (yyscanner); \ + YY_CURRENT_BUFFER_LVALUE = \ + cfgidl_create_buffer(yyin,YY_BUF_SIZE ,yyscanner); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ + } + +#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) + +/* Begin user sect3 */ + +#define cfgidlwrap(n) 1 +#define YY_SKIP_YYWRAP + +typedef unsigned char YY_CHAR; + +typedef int yy_state_type; + +#define yytext_ptr yytext_r + +static yy_state_type yy_get_previous_state (yyscan_t yyscanner ); +static yy_state_type yy_try_NUL_trans (yy_state_type current_state ,yyscan_t yyscanner); +static int yy_get_next_buffer (yyscan_t yyscanner ); +static void yy_fatal_error (yyconst char msg[] ,yyscan_t yyscanner ); + +/* Done after the current pattern has been matched and before the + * corresponding action - sets up yytext. + */ +#define YY_DO_BEFORE_ACTION \ + yyg->yytext_ptr = yy_bp; \ + yyleng = (size_t) (yy_cp - yy_bp); \ + yyg->yy_hold_char = *yy_cp; \ + *yy_cp = '\0'; \ + yyg->yy_c_buf_p = yy_cp; + +#define YY_NUM_RULES 25 +#define YY_END_OF_BUFFER 26 +/* This struct is not used in this scanner, + but its presence is necessary. */ +struct yy_trans_info + { + flex_int32_t yy_verify; + flex_int32_t yy_nxt; + }; +static yyconst flex_int16_t yy_accept[105] = + { 0, + 0, 0, 26, 24, 23, 23, 24, 1, 24, 24, + 24, 20, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 23, 0, 19, 0, 20, 21, 18, 0, 0, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 18, 21, 21, 22, 22, 22, 22, 22, 2, 22, + 22, 22, 3, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 13, 22, 22, 22, 22, + 22, 22, 22, 4, 22, 22, 22, 22, 14, 22, + 22, 22, 5, 22, 15, 16, 22, 22, 22, 22, + 7, 9, 11, 22, 22, 22, 22, 6, 22, 8, + + 10, 12, 17, 0 + } ; + +static yyconst flex_int32_t yy_ec[256] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, + 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 2, 1, 4, 5, 1, 1, 1, 1, 1, + 1, 1, 6, 1, 6, 7, 8, 9, 10, 11, + 12, 13, 9, 14, 9, 15, 9, 1, 1, 1, + 1, 1, 1, 1, 16, 16, 16, 16, 17, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 1, 1, 1, 1, 18, 1, 19, 20, 21, 22, + + 23, 24, 25, 26, 27, 16, 16, 28, 16, 29, + 30, 16, 16, 31, 32, 33, 34, 35, 36, 16, + 16, 16, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1 + } ; + +static yyconst flex_int32_t yy_meta[37] = + { 0, + 1, 1, 2, 1, 1, 1, 3, 1, 4, 4, + 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5 + } ; + +static yyconst flex_int16_t yy_base[112] = + { 0, + 0, 0, 139, 140, 35, 37, 134, 140, 130, 0, + 128, 34, 0, 109, 104, 105, 103, 96, 111, 96, + 21, 41, 124, 140, 0, 0, 29, 0, 0, 0, + 0, 108, 92, 95, 91, 100, 86, 90, 94, 90, + 0, 30, 0, 87, 97, 97, 44, 84, 0, 28, + 95, 80, 0, 84, 78, 96, 98, 95, 89, 70, + 76, 83, 72, 51, 79, 0, 83, 82, 81, 65, + 66, 71, 62, 0, 80, 82, 79, 73, 0, 57, + 56, 55, 0, 60, 0, 0, 68, 67, 66, 50, + 0, 0, 0, 49, 48, 44, 31, 0, 37, 0, + + 0, 0, 0, 140, 66, 69, 46, 70, 75, 45, + 41 + } ; + +static yyconst flex_int16_t yy_def[112] = + { 0, + 104, 1, 104, 104, 104, 104, 105, 104, 106, 107, + 104, 106, 108, 108, 108, 108, 108, 108, 108, 108, + 108, 104, 105, 104, 107, 12, 107, 109, 110, 111, + 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, + 109, 110, 111, 108, 108, 108, 108, 108, 108, 108, + 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, + 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, + 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, + 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, + 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, + + 108, 108, 108, 0, 104, 104, 104, 104, 104, 104, + 104 + } ; + +static yyconst flex_int16_t yy_nxt[177] = + { 0, + 4, 5, 6, 7, 8, 9, 10, 11, 12, 12, + 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, + 14, 15, 13, 16, 13, 13, 17, 13, 13, 18, + 19, 20, 13, 21, 13, 13, 22, 22, 22, 22, + 29, 39, 22, 22, 43, 30, 30, 40, 42, 27, + 30, 30, 30, 56, 61, 57, 30, 58, 59, 103, + 75, 62, 76, 102, 77, 78, 23, 23, 23, 23, + 23, 26, 26, 31, 31, 41, 101, 41, 41, 41, + 100, 99, 98, 97, 96, 95, 94, 93, 92, 91, + 90, 89, 88, 87, 86, 85, 84, 83, 82, 81, + + 80, 79, 74, 73, 72, 71, 70, 69, 68, 67, + 66, 65, 64, 63, 60, 55, 54, 53, 52, 51, + 50, 49, 48, 47, 46, 45, 44, 24, 38, 37, + 36, 35, 34, 33, 32, 28, 25, 24, 104, 3, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104 + } ; + +static yyconst flex_int16_t yy_chk[177] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 5, 5, 6, 6, + 12, 21, 22, 22, 111, 27, 42, 21, 110, 107, + 12, 27, 42, 47, 50, 47, 12, 47, 47, 99, + 64, 50, 64, 97, 64, 64, 105, 105, 105, 105, + 105, 106, 106, 108, 108, 109, 96, 109, 109, 109, + 95, 94, 90, 89, 88, 87, 84, 82, 81, 80, + 78, 77, 76, 75, 73, 72, 71, 70, 69, 68, + + 67, 65, 63, 62, 61, 60, 59, 58, 57, 56, + 55, 54, 52, 51, 48, 46, 45, 44, 40, 39, + 38, 37, 36, 35, 34, 33, 32, 23, 20, 19, + 18, 17, 16, 15, 14, 11, 9, 7, 3, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104 + } ; + +/* The intent behind this definition is that it'll catch + * any uses of REJECT which flex missed. + */ +#define REJECT reject_used_but_not_detected +#define yymore() yymore_used_but_not_detected +#define YY_MORE_ADJ 0 +#define YY_RESTORE_YY_MORE_OFFSET +#line 1 "idl.lex" +/* -*- c++ -*- + copy[write] by dirlt(zhang_yan@baidu.com) + date time:Mon Nov 17 12:06:46 CST 2008 + file name:idl.lex */ +#line 6 "idl.lex" +#include +#include +#include +#include "idl.h" +#include "idl_gram.h" + +#define MAX_TEMP_BUFFER 2048 + +#define YY_DECL int cfgidllex(YYSTYPE *yylval,yyscan_t yyscanner,meta_t *loc,idl_t *idl) + static void do_keyword(YYSTYPE *yylval,yyscan_t cfgidlscanner,meta_t *loc,idl_t *idl); + static int do_special_cmd(YYSTYPE *yylval,yyscan_t cfgidlscanner,meta_t *loc,idl_t *idl); + static void do_meta_data(YYSTYPE *yylval,yyscan_t cfgidlscanner,meta_t *loc,idl_t *idl); + static void do_comment(yyscan_t cfgidlscanner,meta_t *loc); + static void update(yyscan_t cfgidlscanner,meta_t *loc, idl_t *idl); +/* we don't need to handle file more than one */ +/* give out warnings */ +/* using 8 bit a character */ +/* we want idllex this class */ +/* output file is idl_lex.c */ +/* header file is idl_lex.h */ +/* the letter is so generous except + (),whitespace and ; */ +#line 533 "idl_lex.c" + +#define INITIAL 0 + +#ifndef YY_NO_UNISTD_H +/* Special case for "unistd.h", since it is non-ANSI. We include it way + * down here because we want the user's section 1 to have been scanned first. + * The user has a chance to override it with an option. + */ +#include +#endif + +#ifndef YY_EXTRA_TYPE +#define YY_EXTRA_TYPE void * +#endif + +/* Holds the entire state of the reentrant scanner. */ +struct yyguts_t + { + + /* User-defined. Not touched by flex. */ + YY_EXTRA_TYPE yyextra_r; + + /* The rest are the same as the globals declared in the non-reentrant scanner. */ + FILE *yyin_r, *yyout_r; + size_t yy_buffer_stack_top; /**< index of top of stack. */ + size_t yy_buffer_stack_max; /**< capacity of stack. */ + YY_BUFFER_STATE * yy_buffer_stack; /**< Stack as an array. */ + char yy_hold_char; + int yy_n_chars; + int yyleng_r; + char *yy_c_buf_p; + int yy_init; + int yy_start; + int yy_did_buffer_switch_on_eof; + int yy_start_stack_ptr; + int yy_start_stack_depth; + int *yy_start_stack; + yy_state_type yy_last_accepting_state; + char* yy_last_accepting_cpos; + + int yylineno_r; + int yy_flex_debug_r; + + char *yytext_r; + int yy_more_flag; + int yy_more_len; + + }; /* end struct yyguts_t */ + +static int yy_init_globals (yyscan_t yyscanner ); + +int cfgidllex_init (yyscan_t* scanner); + +int cfgidllex_init_extra (YY_EXTRA_TYPE user_defined,yyscan_t* scanner); + +/* Accessor methods to globals. + These are made visible to non-reentrant scanners for convenience. */ + +int cfgidllex_destroy (yyscan_t yyscanner ); + +int cfgidlget_debug (yyscan_t yyscanner ); + +void cfgidlset_debug (int debug_flag ,yyscan_t yyscanner ); + +YY_EXTRA_TYPE cfgidlget_extra (yyscan_t yyscanner ); + +void cfgidlset_extra (YY_EXTRA_TYPE user_defined ,yyscan_t yyscanner ); + +FILE *cfgidlget_in (yyscan_t yyscanner ); + +void cfgidlset_in (FILE * in_str ,yyscan_t yyscanner ); + +FILE *cfgidlget_out (yyscan_t yyscanner ); + +void cfgidlset_out (FILE * out_str ,yyscan_t yyscanner ); + +int cfgidlget_leng (yyscan_t yyscanner ); + +char *cfgidlget_text (yyscan_t yyscanner ); + +int cfgidlget_lineno (yyscan_t yyscanner ); + +void cfgidlset_lineno (int line_number ,yyscan_t yyscanner ); + +/* Macros after this point can all be overridden by user definitions in + * section 1. + */ + +#ifndef YY_SKIP_YYWRAP +#ifdef __cplusplus +extern "C" int cfgidlwrap (yyscan_t yyscanner ); +#else +extern int cfgidlwrap (yyscan_t yyscanner ); +#endif +#endif + + static void yyunput (int c,char *buf_ptr ,yyscan_t yyscanner); + +#ifndef yytext_ptr +static void yy_flex_strncpy (char *,yyconst char *,int ,yyscan_t yyscanner); +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen (yyconst char * ,yyscan_t yyscanner); +#endif + +#ifndef YY_NO_INPUT + +#ifdef __cplusplus +static int yyinput (yyscan_t yyscanner ); +#else +static int input (yyscan_t yyscanner ); +#endif + +#endif + +/* Amount of stuff to slurp up with each read. */ +#ifndef YY_READ_BUF_SIZE +#define YY_READ_BUF_SIZE 8192 +#endif + +/* Copy whatever the last rule matched to the standard output. */ +#ifndef ECHO +/* This used to be an fputs(), but since the string might contain NUL's, + * we now use fwrite(). + */ +#define ECHO fwrite( yytext, yyleng, 1, yyout ) +#endif + +/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, + * is returned in "result". + */ +#ifndef YY_INPUT +#define YY_INPUT(buf,result,max_size) \ + if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ + { \ + int c = '*'; \ + int n; \ + for ( n = 0; n < max_size && \ + (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ + buf[n] = (char) c; \ + if ( c == '\n' ) \ + buf[n++] = (char) c; \ + if ( c == EOF && ferror( yyin ) ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + result = n; \ + } \ + else \ + { \ + errno=0; \ + while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \ + { \ + if( errno != EINTR) \ + { \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + break; \ + } \ + errno=0; \ + clearerr(yyin); \ + } \ + }\ +\ + +#endif + +/* No semi-colon after return; correct usage is to write "yyterminate();" - + * we don't want an extra ';' after the "return" because that will cause + * some compilers to complain about unreachable statements. + */ +#ifndef yyterminate +#define yyterminate() return YY_NULL +#endif + +/* Number of entries by which start-condition stack grows. */ +#ifndef YY_START_STACK_INCR +#define YY_START_STACK_INCR 25 +#endif + +/* Report a fatal error. */ +#ifndef YY_FATAL_ERROR +#define YY_FATAL_ERROR(msg) yy_fatal_error( msg , yyscanner) +#endif + +/* end tables serialization structures and prototypes */ + +/* Default declaration of generated scanner - a define so the user can + * easily add parameters. + */ +#ifndef YY_DECL +#define YY_DECL_IS_OURS 1 + +extern int cfgidllex (yyscan_t yyscanner); + +#define YY_DECL int cfgidllex (yyscan_t yyscanner) +#endif /* !YY_DECL */ + +/* Code executed at the beginning of each rule, after yytext and yyleng + * have been set up. + */ +#ifndef YY_USER_ACTION +#define YY_USER_ACTION +#endif + +/* Code executed at the end of each rule. */ +#ifndef YY_BREAK +#define YY_BREAK break; +#endif + +#define YY_RULE_SETUP \ + YY_USER_ACTION + +/** The main scanner function which does all the work. + */ +YY_DECL +{ + register yy_state_type yy_current_state; + register char *yy_cp, *yy_bp; + register int yy_act; + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + +#line 42 "idl.lex" + + +#line 757 "idl_lex.c" + + if ( !yyg->yy_init ) + { + yyg->yy_init = 1; + +#ifdef YY_USER_INIT + YY_USER_INIT; +#endif + + if ( ! yyg->yy_start ) + yyg->yy_start = 1; /* first start state */ + + if ( ! yyin ) + yyin = stdin; + + if ( ! yyout ) + yyout = stdout; + + if ( ! YY_CURRENT_BUFFER ) { + cfgidlensure_buffer_stack (yyscanner); + YY_CURRENT_BUFFER_LVALUE = + cfgidl_create_buffer(yyin,YY_BUF_SIZE ,yyscanner); + } + + cfgidl_load_buffer_state(yyscanner ); + } + + while ( 1 ) /* loops until end-of-file is reached */ + { + yy_cp = yyg->yy_c_buf_p; + + /* Support of yytext. */ + *yy_cp = yyg->yy_hold_char; + + /* yy_bp points to the position in yy_ch_buf of the start of + * the current run. + */ + yy_bp = yy_cp; + + yy_current_state = yyg->yy_start; +yy_match: + do + { + register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; + if ( yy_accept[yy_current_state] ) + { + yyg->yy_last_accepting_state = yy_current_state; + yyg->yy_last_accepting_cpos = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 105 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + ++yy_cp; + } + while ( yy_base[yy_current_state] != 140 ); + +yy_find_action: + yy_act = yy_accept[yy_current_state]; + if ( yy_act == 0 ) + { /* have to back up */ + yy_cp = yyg->yy_last_accepting_cpos; + yy_current_state = yyg->yy_last_accepting_state; + yy_act = yy_accept[yy_current_state]; + } + + YY_DO_BEFORE_ACTION; + +do_action: /* This label is used only to access EOF actions. */ + + switch ( yy_act ) + { /* beginning of action switch */ + case 0: /* must back up */ + /* undo the effects of YY_DO_BEFORE_ACTION */ + *yy_cp = yyg->yy_hold_char; + yy_cp = yyg->yy_last_accepting_cpos; + yy_current_state = yyg->yy_last_accepting_state; + goto yy_find_action; + +case 1: +YY_RULE_SETUP +#line 44 "idl.lex" +{do_comment(yyscanner,loc);} + YY_BREAK +case 2: +YY_RULE_SETUP +#line 45 "idl.lex" +{do_keyword(yylval,yyscanner,loc,idl);return KW_RAW;} + YY_BREAK +case 3: +YY_RULE_SETUP +#line 46 "idl.lex" +{do_keyword(yylval,yyscanner,loc,idl);return KW_CHAR;} + YY_BREAK +case 4: +YY_RULE_SETUP +#line 47 "idl.lex" +{do_keyword(yylval,yyscanner,loc,idl);return KW_UCHAR;} + YY_BREAK +case 5: +YY_RULE_SETUP +#line 48 "idl.lex" +{do_keyword(yylval,yyscanner,loc,idl);return KW_INT8;} + YY_BREAK +case 6: +YY_RULE_SETUP +#line 49 "idl.lex" +{do_keyword(yylval,yyscanner,loc,idl);return KW_UINT8;} + YY_BREAK +case 7: +YY_RULE_SETUP +#line 50 "idl.lex" +{do_keyword(yylval,yyscanner,loc,idl);return KW_INT16;} + YY_BREAK +case 8: +YY_RULE_SETUP +#line 51 "idl.lex" +{do_keyword(yylval,yyscanner,loc,idl);return KW_UINT16;} + YY_BREAK +case 9: +YY_RULE_SETUP +#line 52 "idl.lex" +{do_keyword(yylval,yyscanner,loc,idl);return KW_INT32;} + YY_BREAK +case 10: +YY_RULE_SETUP +#line 53 "idl.lex" +{do_keyword(yylval,yyscanner,loc,idl);return KW_UINT32;} + YY_BREAK +case 11: +YY_RULE_SETUP +#line 54 "idl.lex" +{do_keyword(yylval,yyscanner,loc,idl);return KW_INT64;} + YY_BREAK +case 12: +YY_RULE_SETUP +#line 55 "idl.lex" +{do_keyword(yylval,yyscanner,loc,idl);return KW_UINT64;} + YY_BREAK +case 13: +YY_RULE_SETUP +#line 56 "idl.lex" +{do_keyword(yylval,yyscanner,loc,idl);return KW_FLOAT;} + YY_BREAK +case 14: +YY_RULE_SETUP +#line 57 "idl.lex" +{do_keyword(yylval,yyscanner,loc,idl);return KW_DOUBLE;} + YY_BREAK +case 15: +YY_RULE_SETUP +#line 58 "idl.lex" +{do_keyword(yylval,yyscanner,loc,idl);return KW_STRING;} + YY_BREAK +case 16: +YY_RULE_SETUP +#line 59 "idl.lex" +{do_keyword(yylval,yyscanner,loc,idl);return KW_STRUCT;} + YY_BREAK +case 17: +YY_RULE_SETUP +#line 60 "idl.lex" +{do_keyword(yylval,yyscanner,loc,idl);return KW_OVERWRITE;} + YY_BREAK +case 18: +YY_RULE_SETUP +#line 62 "idl.lex" +{ + if (do_special_cmd(yylval,yyscanner,loc,idl) != 0) { + return VAR_CMD; + } +} + YY_BREAK +case 19: +/* rule 19 can match eol */ +YY_RULE_SETUP +#line 67 "idl.lex" +{do_meta_data(yylval,yyscanner,loc,idl);return LITERAL_STRING;} + YY_BREAK +case 20: +YY_RULE_SETUP +#line 68 "idl.lex" +{do_meta_data(yylval,yyscanner,loc,idl);return INTEGER;} + YY_BREAK +case 21: +YY_RULE_SETUP +#line 69 "idl.lex" +{do_meta_data(yylval,yyscanner,loc,idl);return DOUBLE;} + YY_BREAK +case 22: +YY_RULE_SETUP +#line 70 "idl.lex" +{do_meta_data(yylval,yyscanner,loc,idl);return ID;} + YY_BREAK +case 23: +/* rule 23 can match eol */ +YY_RULE_SETUP +#line 71 "idl.lex" +{update(yyscanner,loc, idl);} + YY_BREAK +case 24: +YY_RULE_SETUP +#line 72 "idl.lex" +{return yytext[0];} + YY_BREAK +case 25: +YY_RULE_SETUP +#line 74 "idl.lex" +ECHO; + YY_BREAK +#line 971 "idl_lex.c" +case YY_STATE_EOF(INITIAL): + yyterminate(); + + case YY_END_OF_BUFFER: + { + /* Amount of text matched not including the EOB char. */ + int yy_amount_of_matched_text = (int) (yy_cp - yyg->yytext_ptr) - 1; + + /* Undo the effects of YY_DO_BEFORE_ACTION. */ + *yy_cp = yyg->yy_hold_char; + YY_RESTORE_YY_MORE_OFFSET + + if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) + { + /* We're scanning a new file or input source. It's + * possible that this happened because the user + * just pointed yyin at a new source and called + * cfgidllex(). If so, then we have to assure + * consistency between YY_CURRENT_BUFFER and our + * globals. Here is the right place to do so, because + * this is the first action (other than possibly a + * back-up) that will match for the new input source. + */ + yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; + } + + /* Note that here we test for yy_c_buf_p "<=" to the position + * of the first EOB in the buffer, since yy_c_buf_p will + * already have been incremented past the NUL character + * (since all states make transitions on EOB to the + * end-of-buffer state). Contrast this with the test + * in input(). + */ + if ( yyg->yy_c_buf_p <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] ) + { /* This was really a NUL. */ + yy_state_type yy_next_state; + + yyg->yy_c_buf_p = yyg->yytext_ptr + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state( yyscanner ); + + /* Okay, we're now positioned to make the NUL + * transition. We couldn't have + * yy_get_previous_state() go ahead and do it + * for us because it doesn't know how to deal + * with the possibility of jamming (and we don't + * want to build jamming into it because then it + * will run more slowly). + */ + + yy_next_state = yy_try_NUL_trans( yy_current_state , yyscanner); + + yy_bp = yyg->yytext_ptr + YY_MORE_ADJ; + + if ( yy_next_state ) + { + /* Consume the NUL. */ + yy_cp = ++yyg->yy_c_buf_p; + yy_current_state = yy_next_state; + goto yy_match; + } + + else + { + yy_cp = yyg->yy_c_buf_p; + goto yy_find_action; + } + } + + else switch ( yy_get_next_buffer( yyscanner ) ) + { + case EOB_ACT_END_OF_FILE: + { + yyg->yy_did_buffer_switch_on_eof = 0; + + if ( cfgidlwrap(yyscanner ) ) + { + /* Note: because we've taken care in + * yy_get_next_buffer() to have set up + * yytext, we can now set up + * yy_c_buf_p so that if some total + * hoser (like flex itself) wants to + * call the scanner after we return the + * YY_NULL, it'll still work - another + * YY_NULL will get returned. + */ + yyg->yy_c_buf_p = yyg->yytext_ptr + YY_MORE_ADJ; + + yy_act = YY_STATE_EOF(YY_START); + goto do_action; + } + + else + { + if ( ! yyg->yy_did_buffer_switch_on_eof ) + YY_NEW_FILE; + } + break; + } + + case EOB_ACT_CONTINUE_SCAN: + yyg->yy_c_buf_p = + yyg->yytext_ptr + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state( yyscanner ); + + yy_cp = yyg->yy_c_buf_p; + yy_bp = yyg->yytext_ptr + YY_MORE_ADJ; + goto yy_match; + + case EOB_ACT_LAST_MATCH: + yyg->yy_c_buf_p = + &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars]; + + yy_current_state = yy_get_previous_state( yyscanner ); + + yy_cp = yyg->yy_c_buf_p; + yy_bp = yyg->yytext_ptr + YY_MORE_ADJ; + goto yy_find_action; + } + break; + } + + default: + YY_FATAL_ERROR( + "fatal flex scanner internal error--no action found" ); + } /* end of action switch */ + } /* end of scanning one token */ +} /* end of cfgidllex */ + +/* yy_get_next_buffer - try to read in a new buffer + * + * Returns a code representing an action: + * EOB_ACT_LAST_MATCH - + * EOB_ACT_CONTINUE_SCAN - continue scanning from current position + * EOB_ACT_END_OF_FILE - end of file + */ +static int yy_get_next_buffer (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; + register char *source = yyg->yytext_ptr; + register int number_to_move, i; + int ret_val; + + if ( yyg->yy_c_buf_p > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1] ) + YY_FATAL_ERROR( + "fatal flex scanner internal error--end of buffer missed" ); + + if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) + { /* Don't try to fill the buffer, so this is an EOF. */ + if ( yyg->yy_c_buf_p - yyg->yytext_ptr - YY_MORE_ADJ == 1 ) + { + /* We matched a single character, the EOB, so + * treat this as a final EOF. + */ + return EOB_ACT_END_OF_FILE; + } + + else + { + /* We matched some text prior to the EOB, first + * process it. + */ + return EOB_ACT_LAST_MATCH; + } + } + + /* Try to read more data. */ + + /* First move last chars to start of buffer. */ + number_to_move = (int) (yyg->yy_c_buf_p - yyg->yytext_ptr) - 1; + + for ( i = 0; i < number_to_move; ++i ) + *(dest++) = *(source++); + + if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) + /* don't do the read, it's not guaranteed to return an EOF, + * just force an EOF + */ + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars = 0; + + else + { + int num_to_read = + YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; + + while ( num_to_read <= 0 ) + { /* Not enough room in the buffer - grow it. */ + + /* just a shorter name for the current buffer */ + YY_BUFFER_STATE b = YY_CURRENT_BUFFER; + + int yy_c_buf_p_offset = + (int) (yyg->yy_c_buf_p - b->yy_ch_buf); + + if ( b->yy_is_our_buffer ) + { + int new_size = b->yy_buf_size * 2; + + if ( new_size <= 0 ) + b->yy_buf_size += b->yy_buf_size / 8; + else + b->yy_buf_size *= 2; + + b->yy_ch_buf = (char *) + /* Include room in for 2 EOB chars. */ + cfgidlrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ,yyscanner ); + } + else + /* Can't grow it, we don't own it. */ + b->yy_ch_buf = 0; + + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( + "fatal error - scanner input buffer overflow" ); + + yyg->yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset]; + + num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - + number_to_move - 1; + + } + + if ( num_to_read > YY_READ_BUF_SIZE ) + num_to_read = YY_READ_BUF_SIZE; + + /* Read in more data. */ + YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), + yyg->yy_n_chars, (size_t) num_to_read ); + + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars; + } + + if ( yyg->yy_n_chars == 0 ) + { + if ( number_to_move == YY_MORE_ADJ ) + { + ret_val = EOB_ACT_END_OF_FILE; + cfgidlrestart(yyin ,yyscanner); + } + + else + { + ret_val = EOB_ACT_LAST_MATCH; + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = + YY_BUFFER_EOF_PENDING; + } + } + + else + ret_val = EOB_ACT_CONTINUE_SCAN; + + if ((yy_size_t) (yyg->yy_n_chars + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { + /* Extend the array by 50%, plus the number we really need. */ + yy_size_t new_size = yyg->yy_n_chars + number_to_move + (yyg->yy_n_chars >> 1); + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) cfgidlrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ,yyscanner ); + if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); + } + + yyg->yy_n_chars += number_to_move; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] = YY_END_OF_BUFFER_CHAR; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR; + + yyg->yytext_ptr = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; + + return ret_val; +} + +/* yy_get_previous_state - get the state just before the EOB char was reached */ + + static yy_state_type yy_get_previous_state (yyscan_t yyscanner) +{ + register yy_state_type yy_current_state; + register char *yy_cp; + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + yy_current_state = yyg->yy_start; + + for ( yy_cp = yyg->yytext_ptr + YY_MORE_ADJ; yy_cp < yyg->yy_c_buf_p; ++yy_cp ) + { + register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); + if ( yy_accept[yy_current_state] ) + { + yyg->yy_last_accepting_state = yy_current_state; + yyg->yy_last_accepting_cpos = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 105 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + } + + return yy_current_state; +} + +/* yy_try_NUL_trans - try to make a transition on the NUL character + * + * synopsis + * next_state = yy_try_NUL_trans( current_state ); + */ + static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state , yyscan_t yyscanner) +{ + register int yy_is_jam; + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; /* This var may be unused depending upon options. */ + register char *yy_cp = yyg->yy_c_buf_p; + + register YY_CHAR yy_c = 1; + if ( yy_accept[yy_current_state] ) + { + yyg->yy_last_accepting_state = yy_current_state; + yyg->yy_last_accepting_cpos = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 105 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + yy_is_jam = (yy_current_state == 104); + + return yy_is_jam ? 0 : yy_current_state; +} + + static void yyunput (int c, register char * yy_bp , yyscan_t yyscanner) +{ + register char *yy_cp; + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + yy_cp = yyg->yy_c_buf_p; + + /* undo effects of setting up yytext */ + *yy_cp = yyg->yy_hold_char; + + if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) + { /* need to shift things up to make room */ + /* +2 for EOB chars. */ + register int number_to_move = yyg->yy_n_chars + 2; + register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ + YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; + register char *source = + &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; + + while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) + *--dest = *--source; + + yy_cp += (int) (dest - source); + yy_bp += (int) (dest - source); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = + yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_buf_size; + + if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) + YY_FATAL_ERROR( "flex scanner push-back overflow" ); + } + + *--yy_cp = (char) c; + + yyg->yytext_ptr = yy_bp; + yyg->yy_hold_char = *yy_cp; + yyg->yy_c_buf_p = yy_cp; +} + +#ifndef YY_NO_INPUT +#ifdef __cplusplus + static int yyinput (yyscan_t yyscanner) +#else + static int input (yyscan_t yyscanner) +#endif + +{ + int c; + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + *yyg->yy_c_buf_p = yyg->yy_hold_char; + + if ( *yyg->yy_c_buf_p == YY_END_OF_BUFFER_CHAR ) + { + /* yy_c_buf_p now points to the character we want to return. + * If this occurs *before* the EOB characters, then it's a + * valid NUL; if not, then we've hit the end of the buffer. + */ + if ( yyg->yy_c_buf_p < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] ) + /* This was really a NUL. */ + *yyg->yy_c_buf_p = '\0'; + + else + { /* need more input */ + int offset = yyg->yy_c_buf_p - yyg->yytext_ptr; + ++yyg->yy_c_buf_p; + + switch ( yy_get_next_buffer( yyscanner ) ) + { + case EOB_ACT_LAST_MATCH: + /* This happens because yy_g_n_b() + * sees that we've accumulated a + * token and flags that we need to + * try matching the token before + * proceeding. But for input(), + * there's no matching to consider. + * So convert the EOB_ACT_LAST_MATCH + * to EOB_ACT_END_OF_FILE. + */ + + /* Reset buffer status. */ + cfgidlrestart(yyin ,yyscanner); + + /*FALLTHROUGH*/ + + case EOB_ACT_END_OF_FILE: + { + if ( cfgidlwrap(yyscanner ) ) + return EOF; + + if ( ! yyg->yy_did_buffer_switch_on_eof ) + YY_NEW_FILE; +#ifdef __cplusplus + return yyinput(yyscanner); +#else + return input(yyscanner); +#endif + } + + case EOB_ACT_CONTINUE_SCAN: + yyg->yy_c_buf_p = yyg->yytext_ptr + offset; + break; + } + } + } + + c = *(unsigned char *) yyg->yy_c_buf_p; /* cast for 8-bit char's */ + *yyg->yy_c_buf_p = '\0'; /* preserve yytext */ + yyg->yy_hold_char = *++yyg->yy_c_buf_p; + + return c; +} +#endif /* ifndef YY_NO_INPUT */ + +/** Immediately switch to a different input stream. + * @param input_file A readable stream. + * @param yyscanner The scanner object. + * @note This function does not reset the start condition to @c INITIAL . + */ + void cfgidlrestart (FILE * input_file , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + if ( ! YY_CURRENT_BUFFER ){ + cfgidlensure_buffer_stack (yyscanner); + YY_CURRENT_BUFFER_LVALUE = + cfgidl_create_buffer(yyin,YY_BUF_SIZE ,yyscanner); + } + + cfgidl_init_buffer(YY_CURRENT_BUFFER,input_file ,yyscanner); + cfgidl_load_buffer_state(yyscanner ); +} + +/** Switch to a different input buffer. + * @param new_buffer The new input buffer. + * @param yyscanner The scanner object. + */ + void cfgidl_switch_to_buffer (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + /* TODO. We should be able to replace this entire function body + * with + * cfgidlpop_buffer_state(); + * cfgidlpush_buffer_state(new_buffer); + */ + cfgidlensure_buffer_stack (yyscanner); + if ( YY_CURRENT_BUFFER == new_buffer ) + return; + + if ( YY_CURRENT_BUFFER ) + { + /* Flush out information for old buffer. */ + *yyg->yy_c_buf_p = yyg->yy_hold_char; + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = yyg->yy_c_buf_p; + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars; + } + + YY_CURRENT_BUFFER_LVALUE = new_buffer; + cfgidl_load_buffer_state(yyscanner ); + + /* We don't actually know whether we did this switch during + * EOF (cfgidlwrap()) processing, but the only time this flag + * is looked at is after cfgidlwrap() is called, so it's safe + * to go ahead and always set it. + */ + yyg->yy_did_buffer_switch_on_eof = 1; +} + +static void cfgidl_load_buffer_state (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + yyg->yytext_ptr = yyg->yy_c_buf_p = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; + yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; + yyg->yy_hold_char = *yyg->yy_c_buf_p; +} + +/** Allocate and initialize an input buffer state. + * @param file A readable stream. + * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. + * @param yyscanner The scanner object. + * @return the allocated buffer state. + */ + YY_BUFFER_STATE cfgidl_create_buffer (FILE * file, int size , yyscan_t yyscanner) +{ + YY_BUFFER_STATE b; + + b = (YY_BUFFER_STATE) cfgidlalloc(sizeof( struct yy_buffer_state ) ,yyscanner ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in cfgidl_create_buffer()" ); + + b->yy_buf_size = size; + + /* yy_ch_buf has to be 2 characters longer than the size given because + * we need to put in 2 end-of-buffer characters. + */ + b->yy_ch_buf = (char *) cfgidlalloc(b->yy_buf_size + 2 ,yyscanner ); + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in cfgidl_create_buffer()" ); + + b->yy_is_our_buffer = 1; + + cfgidl_init_buffer(b,file ,yyscanner); + + return b; +} + +/** Destroy the buffer. + * @param b a buffer created with cfgidl_create_buffer() + * @param yyscanner The scanner object. + */ + void cfgidl_delete_buffer (YY_BUFFER_STATE b , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + if ( ! b ) + return; + + if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ + YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; + + if ( b->yy_is_our_buffer ) + cfgidlfree((void *) b->yy_ch_buf ,yyscanner ); + + cfgidlfree((void *) b ,yyscanner ); +} + +#ifndef __cplusplus +extern int isatty (int ); +#endif /* __cplusplus */ + +/* Initializes or reinitializes a buffer. + * This function is sometimes called more than once on the same buffer, + * such as during a cfgidlrestart() or at EOF. + */ + static void cfgidl_init_buffer (YY_BUFFER_STATE b, FILE * file , yyscan_t yyscanner) + +{ + int oerrno = errno; + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + cfgidl_flush_buffer(b ,yyscanner); + + b->yy_input_file = file; + b->yy_fill_buffer = 1; + + /* If b is the current buffer, then cfgidl_init_buffer was _probably_ + * called from cfgidlrestart() or through yy_get_next_buffer. + * In that case, we don't want to reset the lineno or column. + */ + if (b != YY_CURRENT_BUFFER){ + b->yy_bs_lineno = 1; + b->yy_bs_column = 0; + } + + b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; + + errno = oerrno; +} + +/** Discard all buffered characters. On the next scan, YY_INPUT will be called. + * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. + * @param yyscanner The scanner object. + */ + void cfgidl_flush_buffer (YY_BUFFER_STATE b , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + if ( ! b ) + return; + + b->yy_n_chars = 0; + + /* We always need two end-of-buffer characters. The first causes + * a transition to the end-of-buffer state. The second causes + * a jam in that state. + */ + b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; + b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; + + b->yy_buf_pos = &b->yy_ch_buf[0]; + + b->yy_at_bol = 1; + b->yy_buffer_status = YY_BUFFER_NEW; + + if ( b == YY_CURRENT_BUFFER ) + cfgidl_load_buffer_state(yyscanner ); +} + +/** Pushes the new state onto the stack. The new state becomes + * the current state. This function will allocate the stack + * if necessary. + * @param new_buffer The new state. + * @param yyscanner The scanner object. + */ +void cfgidlpush_buffer_state (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + if (new_buffer == NULL) + return; + + cfgidlensure_buffer_stack(yyscanner); + + /* This block is copied from cfgidl_switch_to_buffer. */ + if ( YY_CURRENT_BUFFER ) + { + /* Flush out information for old buffer. */ + *yyg->yy_c_buf_p = yyg->yy_hold_char; + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = yyg->yy_c_buf_p; + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars; + } + + /* Only push if top exists. Otherwise, replace top. */ + if (YY_CURRENT_BUFFER) + yyg->yy_buffer_stack_top++; + YY_CURRENT_BUFFER_LVALUE = new_buffer; + + /* copied from cfgidl_switch_to_buffer. */ + cfgidl_load_buffer_state(yyscanner ); + yyg->yy_did_buffer_switch_on_eof = 1; +} + +/** Removes and deletes the top of the stack, if present. + * The next element becomes the new top. + * @param yyscanner The scanner object. + */ +void cfgidlpop_buffer_state (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + if (!YY_CURRENT_BUFFER) + return; + + cfgidl_delete_buffer(YY_CURRENT_BUFFER ,yyscanner); + YY_CURRENT_BUFFER_LVALUE = NULL; + if (yyg->yy_buffer_stack_top > 0) + --yyg->yy_buffer_stack_top; + + if (YY_CURRENT_BUFFER) { + cfgidl_load_buffer_state(yyscanner ); + yyg->yy_did_buffer_switch_on_eof = 1; + } +} + +/* Allocates the stack if it does not exist. + * Guarantees space for at least one push. + */ +static void cfgidlensure_buffer_stack (yyscan_t yyscanner) +{ + int num_to_alloc; + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + if (!yyg->yy_buffer_stack) { + + /* First allocation is just for 2 elements, since we don't know if this + * scanner will even need a stack. We use 2 instead of 1 to avoid an + * immediate realloc on the next call. + */ + num_to_alloc = 1; + yyg->yy_buffer_stack = (struct yy_buffer_state**)cfgidlalloc + (num_to_alloc * sizeof(struct yy_buffer_state*) + , yyscanner); + if ( ! yyg->yy_buffer_stack ) + YY_FATAL_ERROR( "out of dynamic memory in cfgidlensure_buffer_stack()" ); + + memset(yyg->yy_buffer_stack, 0, num_to_alloc * sizeof(struct yy_buffer_state*)); + + yyg->yy_buffer_stack_max = num_to_alloc; + yyg->yy_buffer_stack_top = 0; + return; + } + + if (yyg->yy_buffer_stack_top >= (yyg->yy_buffer_stack_max) - 1){ + + /* Increase the buffer to prepare for a possible push. */ + int grow_size = 8 /* arbitrary grow size */; + + num_to_alloc = yyg->yy_buffer_stack_max + grow_size; + yyg->yy_buffer_stack = (struct yy_buffer_state**)cfgidlrealloc + (yyg->yy_buffer_stack, + num_to_alloc * sizeof(struct yy_buffer_state*) + , yyscanner); + if ( ! yyg->yy_buffer_stack ) + YY_FATAL_ERROR( "out of dynamic memory in cfgidlensure_buffer_stack()" ); + + /* zero only the new slots.*/ + memset(yyg->yy_buffer_stack + yyg->yy_buffer_stack_max, 0, grow_size * sizeof(struct yy_buffer_state*)); + yyg->yy_buffer_stack_max = num_to_alloc; + } +} + +/** Setup the input buffer state to scan directly from a user-specified character buffer. + * @param base the character buffer + * @param size the size in bytes of the character buffer + * @param yyscanner The scanner object. + * @return the newly allocated buffer state object. + */ +YY_BUFFER_STATE cfgidl_scan_buffer (char * base, yy_size_t size , yyscan_t yyscanner) +{ + YY_BUFFER_STATE b; + + if ( size < 2 || + base[size-2] != YY_END_OF_BUFFER_CHAR || + base[size-1] != YY_END_OF_BUFFER_CHAR ) + /* They forgot to leave room for the EOB's. */ + return 0; + + b = (YY_BUFFER_STATE) cfgidlalloc(sizeof( struct yy_buffer_state ) ,yyscanner ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in cfgidl_scan_buffer()" ); + + b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ + b->yy_buf_pos = b->yy_ch_buf = base; + b->yy_is_our_buffer = 0; + b->yy_input_file = 0; + b->yy_n_chars = b->yy_buf_size; + b->yy_is_interactive = 0; + b->yy_at_bol = 1; + b->yy_fill_buffer = 0; + b->yy_buffer_status = YY_BUFFER_NEW; + + cfgidl_switch_to_buffer(b ,yyscanner ); + + return b; +} + +/** Setup the input buffer state to scan a string. The next call to cfgidllex() will + * scan from a @e copy of @a str. + * @param yystr a NUL-terminated string to scan + * @param yyscanner The scanner object. + * @return the newly allocated buffer state object. + * @note If you want to scan bytes that may contain NUL values, then use + * cfgidl_scan_bytes() instead. + */ +YY_BUFFER_STATE cfgidl_scan_string (yyconst char * yystr , yyscan_t yyscanner) +{ + + return cfgidl_scan_bytes(yystr,strlen(yystr) ,yyscanner); +} + +/** Setup the input buffer state to scan the given bytes. The next call to cfgidllex() will + * scan from a @e copy of @a bytes. + * @param bytes the byte buffer to scan + * @param len the number of bytes in the buffer pointed to by @a bytes. + * @param yyscanner The scanner object. + * @return the newly allocated buffer state object. + */ +YY_BUFFER_STATE cfgidl_scan_bytes (yyconst char * yybytes, int _yybytes_len , yyscan_t yyscanner) +{ + YY_BUFFER_STATE b; + char *buf; + yy_size_t n; + int i; + + /* Get memory for full buffer, including space for trailing EOB's. */ + n = _yybytes_len + 2; + buf = (char *) cfgidlalloc(n ,yyscanner ); + if ( ! buf ) + YY_FATAL_ERROR( "out of dynamic memory in cfgidl_scan_bytes()" ); + + for ( i = 0; i < _yybytes_len; ++i ) + buf[i] = yybytes[i]; + + buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; + + b = cfgidl_scan_buffer(buf,n ,yyscanner); + if ( ! b ) + YY_FATAL_ERROR( "bad buffer in cfgidl_scan_bytes()" ); + + /* It's okay to grow etc. this buffer, and we should throw it + * away when we're done. + */ + b->yy_is_our_buffer = 1; + + return b; +} + +#ifndef YY_EXIT_FAILURE +#define YY_EXIT_FAILURE 2 +#endif + +static void yy_fatal_error (yyconst char* msg , yyscan_t yyscanner) +{ + (void) fprintf( stderr, "%s\n", msg ); + exit( YY_EXIT_FAILURE ); +} + +/* Redefine yyless() so it works in section 3 code. */ + +#undef yyless +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + int yyless_macro_arg = (n); \ + YY_LESS_LINENO(yyless_macro_arg);\ + yytext[yyleng] = yyg->yy_hold_char; \ + yyg->yy_c_buf_p = yytext + yyless_macro_arg; \ + yyg->yy_hold_char = *yyg->yy_c_buf_p; \ + *yyg->yy_c_buf_p = '\0'; \ + yyleng = yyless_macro_arg; \ + } \ + while ( 0 ) + +/* Accessor methods (get/set functions) to struct members. */ + +/** Get the user-defined data for this scanner. + * @param yyscanner The scanner object. + */ +YY_EXTRA_TYPE cfgidlget_extra (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + return yyextra; +} + +/** Get the current line number. + * @param yyscanner The scanner object. + */ +int cfgidlget_lineno (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + if (! YY_CURRENT_BUFFER) + return 0; + + return yylineno; +} + +/** Get the current column number. + * @param yyscanner The scanner object. + */ +int cfgidlget_column (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + if (! YY_CURRENT_BUFFER) + return 0; + + return yycolumn; +} + +/** Get the input stream. + * @param yyscanner The scanner object. + */ +FILE *cfgidlget_in (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + return yyin; +} + +/** Get the output stream. + * @param yyscanner The scanner object. + */ +FILE *cfgidlget_out (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + return yyout; +} + +/** Get the length of the current token. + * @param yyscanner The scanner object. + */ +int cfgidlget_leng (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + return yyleng; +} + +/** Get the current token. + * @param yyscanner The scanner object. + */ + +char *cfgidlget_text (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + return yytext; +} + +/** Set the user-defined data. This data is never touched by the scanner. + * @param user_defined The data to be associated with this scanner. + * @param yyscanner The scanner object. + */ +void cfgidlset_extra (YY_EXTRA_TYPE user_defined , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + yyextra = user_defined ; +} + +/** Set the current line number. + * @param line_number + * @param yyscanner The scanner object. + */ +void cfgidlset_lineno (int line_number , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + /* lineno is only valid if an input buffer exists. */ + if (! YY_CURRENT_BUFFER ) + yy_fatal_error( "cfgidlset_lineno called with no buffer" , yyscanner); + + yylineno = line_number; +} + +/** Set the current column. + * @param line_number + * @param yyscanner The scanner object. + */ +void cfgidlset_column (int column_no , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + /* column is only valid if an input buffer exists. */ + if (! YY_CURRENT_BUFFER ) + yy_fatal_error( "cfgidlset_column called with no buffer" , yyscanner); + + yycolumn = column_no; +} + +/** Set the input stream. This does not discard the current + * input buffer. + * @param in_str A readable stream. + * @param yyscanner The scanner object. + * @see cfgidl_switch_to_buffer + */ +void cfgidlset_in (FILE * in_str , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + yyin = in_str ; +} + +void cfgidlset_out (FILE * out_str , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + yyout = out_str ; +} + +int cfgidlget_debug (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + return yy_flex_debug; +} + +void cfgidlset_debug (int bdebug , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + yy_flex_debug = bdebug ; +} + +/* Accessor methods for yylval and yylloc */ + +/* User-visible API */ + +/* cfgidllex_init is special because it creates the scanner itself, so it is + * the ONLY reentrant function that doesn't take the scanner as the last argument. + * That's why we explicitly handle the declaration, instead of using our macros. + */ + +int cfgidllex_init(yyscan_t* ptr_yy_globals) + +{ + if (ptr_yy_globals == NULL){ + errno = EINVAL; + return 1; + } + + *ptr_yy_globals = (yyscan_t) cfgidlalloc ( sizeof( struct yyguts_t ), NULL ); + + if (*ptr_yy_globals == NULL){ + errno = ENOMEM; + return 1; + } + + /* By setting to 0xAA, we expose bugs in yy_init_globals. Leave at 0x00 for releases. */ + memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t)); + + return yy_init_globals ( *ptr_yy_globals ); +} + +/* cfgidllex_init_extra has the same functionality as cfgidllex_init, but follows the + * convention of taking the scanner as the last argument. Note however, that + * this is a *pointer* to a scanner, as it will be allocated by this call (and + * is the reason, too, why this function also must handle its own declaration). + * The user defined value in the first argument will be available to cfgidlalloc in + * the yyextra field. + */ + +int cfgidllex_init_extra(YY_EXTRA_TYPE yy_user_defined,yyscan_t* ptr_yy_globals ) + +{ + struct yyguts_t dummy_yyguts; + + cfgidlset_extra (yy_user_defined, &dummy_yyguts); + + if (ptr_yy_globals == NULL){ + errno = EINVAL; + return 1; + } + + *ptr_yy_globals = (yyscan_t) cfgidlalloc ( sizeof( struct yyguts_t ), &dummy_yyguts ); + + if (*ptr_yy_globals == NULL){ + errno = ENOMEM; + return 1; + } + + /* By setting to 0xAA, we expose bugs in + yy_init_globals. Leave at 0x00 for releases. */ + memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t)); + + cfgidlset_extra (yy_user_defined, *ptr_yy_globals); + + return yy_init_globals ( *ptr_yy_globals ); +} + +static int yy_init_globals (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + /* Initialization is the same as for the non-reentrant scanner. + * This function is called from cfgidllex_destroy(), so don't allocate here. + */ + + yyg->yy_buffer_stack = 0; + yyg->yy_buffer_stack_top = 0; + yyg->yy_buffer_stack_max = 0; + yyg->yy_c_buf_p = (char *) 0; + yyg->yy_init = 0; + yyg->yy_start = 0; + + yyg->yy_start_stack_ptr = 0; + yyg->yy_start_stack_depth = 0; + yyg->yy_start_stack = NULL; + +/* Defined in main.c */ +#ifdef YY_STDINIT + yyin = stdin; + yyout = stdout; +#else + yyin = (FILE *) 0; + yyout = (FILE *) 0; +#endif + + /* For future reference: Set errno on error, since we are called by + * cfgidllex_init() + */ + return 0; +} + +/* cfgidllex_destroy is for both reentrant and non-reentrant scanners. */ +int cfgidllex_destroy (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + /* Pop the buffer stack, destroying each element. */ + while(YY_CURRENT_BUFFER){ + cfgidl_delete_buffer(YY_CURRENT_BUFFER ,yyscanner ); + YY_CURRENT_BUFFER_LVALUE = NULL; + cfgidlpop_buffer_state(yyscanner); + } + + /* Destroy the stack itself. */ + cfgidlfree(yyg->yy_buffer_stack ,yyscanner); + yyg->yy_buffer_stack = NULL; + + /* Destroy the start condition stack. */ + cfgidlfree(yyg->yy_start_stack ,yyscanner ); + yyg->yy_start_stack = NULL; + + /* Reset the globals. This is important in a non-reentrant scanner so the next time + * cfgidllex() is called, initialization will occur. */ + yy_init_globals( yyscanner); + + /* Destroy the main struct (reentrant only). */ + cfgidlfree ( yyscanner , yyscanner ); + yyscanner = NULL; + return 0; +} + +/* + * Internal utility routines. + */ + +#ifndef yytext_ptr +static void yy_flex_strncpy (char* s1, yyconst char * s2, int n , yyscan_t yyscanner) +{ + register int i; + for ( i = 0; i < n; ++i ) + s1[i] = s2[i]; +} +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen (yyconst char * s , yyscan_t yyscanner) +{ + register int n; + for ( n = 0; s[n]; ++n ) + ; + + return n; +} +#endif + +void *cfgidlalloc (yy_size_t size , yyscan_t yyscanner) +{ + return (void *) malloc( size ); +} + +void *cfgidlrealloc (void * ptr, yy_size_t size , yyscan_t yyscanner) +{ + /* The cast to (char *) in the following accommodates both + * implementations that use char* generic pointers, and those + * that use void* generic pointers. It works with the latter + * because both ANSI C and C++ allow castless assignment from + * any pointer type to void*, and deal with argument conversions + * as though doing an assignment. + */ + return (void *) realloc( (char *) ptr, size ); +} + +void cfgidlfree (void * ptr , yyscan_t yyscanner) +{ + free( (char *) ptr ); /* see cfgidlrealloc() for (char *) cast */ +} + +#define YYTABLES_NAME "yytables" + +#line 74 "idl.lex" + + +void do_keyword(YYSTYPE *yylval,yyscan_t scanner,meta_t *loc,idl_t *idl) +{ + char *text=cfgidlget_text(scanner); +#ifdef DEBUG + printf("call %s,%s\n",__func__,text); +#endif + meta_t *meta=alloc_meta(idl); + meta->file=loc->file; + meta->lineno=loc->lineno; + meta->data=text; + yylval->meta=meta; +} + +void do_meta_data(YYSTYPE *yylval,yyscan_t scanner,meta_t *loc,idl_t *idl) +{ + char *text=cfgidlget_text(scanner); + int leng=cfgidlget_leng(scanner); +#ifdef DEBUG + printf("call %s,%s\n",__func__,text); +#endif + meta_t *meta=alloc_meta(idl); + meta->file=loc->file; + meta->lineno=loc->lineno; + meta->data=cfgidlget_text(scanner); + yylval->meta=meta; + + int i; + for(i=0;ilineno++; + } + return ; +} + +int do_special_cmd(YYSTYPE *yylval,yyscan_t scanner,meta_t *loc,idl_t *idl) +{ + char *text = cfgidlget_text(scanner); + meta_t *meta=alloc_meta(idl); + meta->file=loc->file; + meta->lineno=loc->lineno; + meta->data=text; + yylval->meta=meta; + + loc->lineno++; + + int ret = idl->cmdreserve; + idl->cmdreserve = 0; + return ret; +} + + +static int cdirective(char *tmp,int *lineno,char **filename) +{ + int i,j; + if(tmp[0]!='#' || tmp[1]!=' ' || !isdigit(tmp[2]))return 0; + i=2; + while(isdigit(tmp[i]))i++; + tmp[i++]=0; + *lineno=atoi(tmp+2); + + j=i+1; + if(tmp[i]!='"')return 0; + i++; + while(tmp[i]!='"')i++; + tmp[i]=0; + *filename=tmp+j; + + return 1; +} + +void do_comment(yyscan_t scanner,meta_t *loc) +{ + char ch; + char tmp[MAX_TEMP_BUFFER]; + int i; + + i=0; + if(cfgidlget_text(scanner)[0]=='#'){ + tmp[0]='#'; + i=1; + } + while(1){ + ch=yyinput(scanner); + if(ch=='\n' || ch==EOF)break; + if(i < (int)sizeof(tmp) - 1) { + tmp[i++]=ch; + } + } + tmp[i]=0; + loc->lineno++; + + char *tmp_file; + int tmp_lineno; + if(cdirective(tmp,&tmp_lineno,&tmp_file)==1){ + loc->lineno=tmp_lineno; + loc->file=tmp_file; +#ifdef DEBUG + printf("new file:%s,lineno:%d\n", + loc->file.c_str(), + loc->lineno); +#endif + } + return ; +} + +void update(yyscan_t scanner,meta_t *loc, idl_t *idl) +{ + int i; + int leng=cfgidlget_leng(scanner); + char *text=cfgidlget_text(scanner); + int cnt = 0; + for(i=0;ilineno++; + //printf("update[%d]: %c\n", i, text[i]); + ++ cnt; + } + } + if (cnt > 0) { + idl->cmdreserve = 0; + } + return ; +} + diff --git a/configure/compiler/src/idl_lex.gcno b/configure/compiler/src/idl_lex.gcno new file mode 100644 index 0000000000000000000000000000000000000000..b0d54a8959d0b49d50b6599f294aee205889e23f Binary files /dev/null and b/configure/compiler/src/idl_lex.gcno differ diff --git a/configure/compiler/src/idl_lex.h b/configure/compiler/src/idl_lex.h new file mode 100644 index 0000000000000000000000000000000000000000..b3ee4a0754c6f58ba2ea1908d7c916d6fd2973a4 --- /dev/null +++ b/configure/compiler/src/idl_lex.h @@ -0,0 +1,335 @@ +#ifndef cfgidlHEADER_H +#define cfgidlHEADER_H 1 +#define cfgidlIN_HEADER 1 + +#line 6 "idl_lex.h" + +#line 8 "idl_lex.h" + +#define YY_INT_ALIGNED short int + +/* A lexical scanner generated by flex */ + +#define FLEX_SCANNER +#define YY_FLEX_MAJOR_VERSION 2 +#define YY_FLEX_MINOR_VERSION 5 +#define YY_FLEX_SUBMINOR_VERSION 35 +#if YY_FLEX_SUBMINOR_VERSION > 0 +#define FLEX_BETA +#endif + +/* First, we deal with platform-specific or compiler-specific issues. */ + +/* begin standard C headers. */ +#include +#include +#include +#include + +/* end standard C headers. */ + +/* flex integer type definitions */ + +#ifndef FLEXINT_H +#define FLEXINT_H + +/* C99 systems have . Non-C99 systems may or may not. */ + +#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + +/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, + * if you want the limit (max/min) macros for int types. + */ +#ifndef __STDC_LIMIT_MACROS +#define __STDC_LIMIT_MACROS 1 +#endif + +#include +typedef int8_t flex_int8_t; +typedef uint8_t flex_uint8_t; +typedef int16_t flex_int16_t; +typedef uint16_t flex_uint16_t; +typedef int32_t flex_int32_t; +typedef uint32_t flex_uint32_t; +#else +typedef signed char flex_int8_t; +typedef short int flex_int16_t; +typedef int flex_int32_t; +typedef unsigned char flex_uint8_t; +typedef unsigned short int flex_uint16_t; +typedef unsigned int flex_uint32_t; +#endif /* ! C99 */ + +/* Limits of integral types. */ +#ifndef INT8_MIN +#define INT8_MIN (-128) +#endif +#ifndef INT16_MIN +#define INT16_MIN (-32767-1) +#endif +#ifndef INT32_MIN +#define INT32_MIN (-2147483647-1) +#endif +#ifndef INT8_MAX +#define INT8_MAX (127) +#endif +#ifndef INT16_MAX +#define INT16_MAX (32767) +#endif +#ifndef INT32_MAX +#define INT32_MAX (2147483647) +#endif +#ifndef UINT8_MAX +#define UINT8_MAX (255U) +#endif +#ifndef UINT16_MAX +#define UINT16_MAX (65535U) +#endif +#ifndef UINT32_MAX +#define UINT32_MAX (4294967295U) +#endif + +#endif /* ! FLEXINT_H */ + +#ifdef __cplusplus + +/* The "const" storage-class-modifier is valid. */ +#define YY_USE_CONST + +#else /* ! __cplusplus */ + +/* C99 requires __STDC__ to be defined as 1. */ +#if defined (__STDC__) + +#define YY_USE_CONST + +#endif /* defined (__STDC__) */ +#endif /* ! __cplusplus */ + +#ifdef YY_USE_CONST +#define yyconst const +#else +#define yyconst +#endif + +/* An opaque pointer. */ +#ifndef YY_TYPEDEF_YY_SCANNER_T +#define YY_TYPEDEF_YY_SCANNER_T +typedef void* yyscan_t; +#endif + +/* For convenience, these vars (plus the bison vars far below) + are macros in the reentrant scanner. */ +#define yyin yyg->yyin_r +#define yyout yyg->yyout_r +#define yyextra yyg->yyextra_r +#define yyleng yyg->yyleng_r +#define yytext yyg->yytext_r +#define yylineno (YY_CURRENT_BUFFER_LVALUE->yy_bs_lineno) +#define yycolumn (YY_CURRENT_BUFFER_LVALUE->yy_bs_column) +#define yy_flex_debug yyg->yy_flex_debug_r + +/* Size of default input buffer. */ +#ifndef YY_BUF_SIZE +#define YY_BUF_SIZE 16384 +#endif + +#ifndef YY_TYPEDEF_YY_BUFFER_STATE +#define YY_TYPEDEF_YY_BUFFER_STATE +typedef struct yy_buffer_state *YY_BUFFER_STATE; +#endif + +#ifndef YY_TYPEDEF_YY_SIZE_T +#define YY_TYPEDEF_YY_SIZE_T +typedef size_t yy_size_t; +#endif + +#ifndef YY_STRUCT_YY_BUFFER_STATE +#define YY_STRUCT_YY_BUFFER_STATE +struct yy_buffer_state + { + FILE *yy_input_file; + + char *yy_ch_buf; /* input buffer */ + char *yy_buf_pos; /* current position in input buffer */ + + /* Size of input buffer in bytes, not including room for EOB + * characters. + */ + yy_size_t yy_buf_size; + + /* Number of characters read into yy_ch_buf, not including EOB + * characters. + */ + int yy_n_chars; + + /* Whether we "own" the buffer - i.e., we know we created it, + * and can realloc() it to grow it, and should free() it to + * delete it. + */ + int yy_is_our_buffer; + + /* Whether this is an "interactive" input source; if so, and + * if we're using stdio for input, then we want to use getc() + * instead of fread(), to make sure we stop fetching input after + * each newline. + */ + int yy_is_interactive; + + /* Whether we're considered to be at the beginning of a line. + * If so, '^' rules will be active on the next match, otherwise + * not. + */ + int yy_at_bol; + + int yy_bs_lineno; /**< The line count. */ + int yy_bs_column; /**< The column count. */ + + /* Whether to try to fill the input buffer when we reach the + * end of it. + */ + int yy_fill_buffer; + + int yy_buffer_status; + + }; +#endif /* !YY_STRUCT_YY_BUFFER_STATE */ + +void cfgidlrestart (FILE *input_file ,yyscan_t yyscanner ); +void cfgidl_switch_to_buffer (YY_BUFFER_STATE new_buffer ,yyscan_t yyscanner ); +YY_BUFFER_STATE cfgidl_create_buffer (FILE *file,int size ,yyscan_t yyscanner ); +void cfgidl_delete_buffer (YY_BUFFER_STATE b ,yyscan_t yyscanner ); +void cfgidl_flush_buffer (YY_BUFFER_STATE b ,yyscan_t yyscanner ); +void cfgidlpush_buffer_state (YY_BUFFER_STATE new_buffer ,yyscan_t yyscanner ); +void cfgidlpop_buffer_state (yyscan_t yyscanner ); + +YY_BUFFER_STATE cfgidl_scan_buffer (char *base,yy_size_t size ,yyscan_t yyscanner ); +YY_BUFFER_STATE cfgidl_scan_string (yyconst char *yy_str ,yyscan_t yyscanner ); +YY_BUFFER_STATE cfgidl_scan_bytes (yyconst char *bytes,int len ,yyscan_t yyscanner ); + +void *cfgidlalloc (yy_size_t ,yyscan_t yyscanner ); +void *cfgidlrealloc (void *,yy_size_t ,yyscan_t yyscanner ); +void cfgidlfree (void * ,yyscan_t yyscanner ); + +/* Begin user sect3 */ + +#define cfgidlwrap(n) 1 +#define YY_SKIP_YYWRAP + +#define yytext_ptr yytext_r + +#ifdef YY_HEADER_EXPORT_START_CONDITIONS +#define INITIAL 0 + +#endif + +#ifndef YY_NO_UNISTD_H +/* Special case for "unistd.h", since it is non-ANSI. We include it way + * down here because we want the user's section 1 to have been scanned first. + * The user has a chance to override it with an option. + */ +#include +#endif + +#ifndef YY_EXTRA_TYPE +#define YY_EXTRA_TYPE void * +#endif + +int cfgidllex_init (yyscan_t* scanner); + +int cfgidllex_init_extra (YY_EXTRA_TYPE user_defined,yyscan_t* scanner); + +/* Accessor methods to globals. + These are made visible to non-reentrant scanners for convenience. */ + +int cfgidllex_destroy (yyscan_t yyscanner ); + +int cfgidlget_debug (yyscan_t yyscanner ); + +void cfgidlset_debug (int debug_flag ,yyscan_t yyscanner ); + +YY_EXTRA_TYPE cfgidlget_extra (yyscan_t yyscanner ); + +void cfgidlset_extra (YY_EXTRA_TYPE user_defined ,yyscan_t yyscanner ); + +FILE *cfgidlget_in (yyscan_t yyscanner ); + +void cfgidlset_in (FILE * in_str ,yyscan_t yyscanner ); + +FILE *cfgidlget_out (yyscan_t yyscanner ); + +void cfgidlset_out (FILE * out_str ,yyscan_t yyscanner ); + +int cfgidlget_leng (yyscan_t yyscanner ); + +char *cfgidlget_text (yyscan_t yyscanner ); + +int cfgidlget_lineno (yyscan_t yyscanner ); + +void cfgidlset_lineno (int line_number ,yyscan_t yyscanner ); + +/* Macros after this point can all be overridden by user definitions in + * section 1. + */ + +#ifndef YY_SKIP_YYWRAP +#ifdef __cplusplus +extern "C" int cfgidlwrap (yyscan_t yyscanner ); +#else +extern int cfgidlwrap (yyscan_t yyscanner ); +#endif +#endif + +#ifndef yytext_ptr +static void yy_flex_strncpy (char *,yyconst char *,int ,yyscan_t yyscanner); +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen (yyconst char * ,yyscan_t yyscanner); +#endif + +#ifndef YY_NO_INPUT + +#endif + +/* Amount of stuff to slurp up with each read. */ +#ifndef YY_READ_BUF_SIZE +#define YY_READ_BUF_SIZE 8192 +#endif + +/* Number of entries by which start-condition stack grows. */ +#ifndef YY_START_STACK_INCR +#define YY_START_STACK_INCR 25 +#endif + +/* Default declaration of generated scanner - a define so the user can + * easily add parameters. + */ +#ifndef YY_DECL +#define YY_DECL_IS_OURS 1 + +extern int cfgidllex (yyscan_t yyscanner); + +#define YY_DECL int cfgidllex (yyscan_t yyscanner) +#endif /* !YY_DECL */ + +/* yy_get_previous_state - get the state just before the EOB char was reached */ + +#undef YY_NEW_FILE +#undef YY_FLUSH_BUFFER +#undef yy_set_bol +#undef yy_new_buffer +#undef yy_set_interactive +#undef YY_DO_BEFORE_ACTION + +#ifdef YY_DECL_IS_OURS +#undef YY_DECL_IS_OURS +#undef YY_DECL +#endif + +#line 74 "idl.lex" + + +#line 334 "idl_lex.h" +#undef cfgidlIN_HEADER +#endif /* cfgidlHEADER_H */ diff --git a/configure/compiler/testcase/Makefile b/configure/compiler/testcase/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..d5e15658517eb58f3075bff625a18f9dad37649e --- /dev/null +++ b/configure/compiler/testcase/Makefile @@ -0,0 +1,188 @@ +########################################################################### +# Automatically generated by comake (1.0.0) # +########################################################################### + +#################设计系统参数####################################### +WORKROOT ?= ../../../../ +IDLCC ?= $(WORKROOT)/public/idlcompiler/output/bin/mcy +CC ?= gcc +CXX ?= g++ +LEX ?= flex +YACC ?= yacc +CFLAGS ?= -pipe -fsigned-char -Wall -W -g -fPIC +CXXFLAGS ?= -pipe -fsigned-char -Wall -W -g -fPIC +LEXFLAGS ?= +YACCFLAGS ?= +LINKFLAGS ?= -rdynamic +LINK ?= g++ +AR ?= ar cqs +RANLIB ?= +COMAKE ?= comake + +###############baidu lib 的32位 64位支持################# +ifeq ($(MAC), 64) + lib2=lib2-64 + third=third-64 +else + lib2=lib2 + third=third +endif +ifeq ($(MAC),ARM32) + lib2=lib2-arm32 + third=third-arm32 +endif +########################################## + +# 编译参数 +DEP_INCPATH = -I$(WORKROOT)/$(lib2)/bsl//include/ +DEP_LDFLAGS = -L$(WORKROOT)/$(lib2)/bsl//lib/ +DEP_LDLIBS = -lbsl_archive -lbsl_exception -lbsl_pool -lbsl_utils -lbsl -lbsl_ResourcePool -lbsl_check_cast -lbsl_var -lbsl_var_implement +MAKDEP = Makefile.dep + + +#start target +first : all + +############# 默认推到公式 +.SUFFIXES: .c .cpp .cc .cxx .C .idl .des + +.cpp.o: + $(CXX) -c -o $@ $< $(CXXFLAGS) $(CPPFLAGS) $(INCPATH) + +.cc.o: + $(CXX) -c -o $@ $< $(CXXFLAGS) $(CPPFLAGS) $(INCPATH) + +.cxx.o: + $(CXX) -c -o $@ $< $(CXXFLAGS) $(CPPFLAGS) $(INCPATH) + +.C.o: + $(CXX) -c -o $@ $< $(CXXFLAGS) $(CPPFLAGS) $(INCPATH) + +.c.o: + $(CC) -c -o $@ $< $(CFLAGS) $(CPPFLAGS) $(INCPATH) + +.idl.cpp: + $(IDLCC) --ns=$(*F) -o $* $< $(CPPFLAGS) $(INCPATH) + +############# +###cpp 支持 +%info : % + ccp $< +############# + + +#__$MAKEFILE_RULES$__ + + +###############编译目标 +all : target output +.PHONY : all clean main + +target : main + +test : + `for x in ;do ./$$x;done` + +comake : + -make clean + -comake + +#-include $(MAKDEP) + +#----------------build target : main-------------------- + +main : CC := gcc +main : CXX := g++ +main : CXXFLAGS := -pipe -fsigned-char -Wall -W -g -fPIC +main : CPPFLAGS := +main : CFLAGS := -pipe -fsigned-char -Wall -W -g -fPIC +main : INCPATH := -I. -I../output/include $(DEP_INCPATH) +main : LDLIBS := -lidlcompiler $(DEP_LDLIBS) +main : LDFLAGS := -L../output/lib $(DEP_LDFLAGS) +main : LINKFLAGS := -rdynamic + +main_SOURCES := $(wildcard comake_autogen.cpp main.cpp) +#main_HEADERS := $(wildcard *.h) +main_HEADERS := *.h +main_IDLSRC := $(wildcard __$IDLSRC_VALUE$__) +main_IDLSRCCPP := $(patsubst %.idl,%.cpp, $(main_IDLSRC)) +main_IDLSRCH := $(patsubst %.idl,%.h, $(main_IDLSRC)) +main_CONFDES := $(wildcard __$CONFDES$_VALUE$__ main.des) +main_CONFRANGE := $(patsubst %.des,%.range, $(main_CONFDES)) +main_OBJS := $(main_IDLSRC:.idl=.o) +main_OBJS += $(main_SOURCES:.c=.o) +main_OBJS := $(main_OBJS:.cc=.o) +main_OBJS := $(main_OBJS:.cpp=.o) +main_OBJS := $(main_OBJS:.cxx=.o) +main_OBJS := $(main_OBJS:.C=.o) +main_OBJS := $(main_OBJS:.idl=.o) +main_OBJS := $(main_OBJS:.yacc=.o) +main_OBJS := $(main_OBJS:.lex=.o) +main : $(main_OBJS) + `for x in $(main_CONFDES);do cpp -C -o main.range $$x $(CPPFLAGS) $(INCPATH);mkdir -p conf;cp main.range conf/; done` + $(LINK) $^ -o $@ -Xlinker "-(" $(LDFLAGS) $(LDLIBS) $(LINKFLAGS) -Xlinker "-)" + + +define main_output + mkdir -p output + cp -rf main output + `if [ -e "conf" ];then cp -rf conf output/ ;fi` + +endef + + +define main_clean + -rm -rf $(main_OBJS) $(main_IDLSRCCPP) $(main_IDLSRCH) main.range conf/main.range + -rm -rf main + -rm -rf output + -rm -rf ccp_output.error ccp_output_scm.xml ccp_output.xml ccp_output.pclint ccp_output.txt +endef + + +define main_ccpc + ccp $(main_SOURCES) --formatter vim +endef + + +define main_cov + +endef + + + + +#---------------------end build target : main------------------ + +define _output + $(main_output) +endef + + +define _clean + $(main_clean) +endef + + +ccpc : + $(main_ccpc) + +cov : + cov01 -1 + make clean + make + cov01 -0 + + + +output : main + $(_output) + +$(MAKDEP) : comake_autogen.cpp main.cpp + -$(CC) -MG -MM $(CPPFLAGS) $(INCPATH) $(DEP_INCPATH) $^ > $@ + + +clean: + $(_clean) + rm -rf $(MAKDEP) + + diff --git a/configure/compiler/testcase/abnor_array b/configure/compiler/testcase/abnor_array new file mode 100755 index 0000000000000000000000000000000000000000..8d34e06ada80783a52bf6a394f94b83774dc6921 Binary files /dev/null and b/configure/compiler/testcase/abnor_array differ diff --git a/configure/compiler/testcase/abnor_array.cpp b/configure/compiler/testcase/abnor_array.cpp new file mode 100644 index 0000000000000000000000000000000000000000..d8ac4d74d6b60568cb47f996b68ce7b3da5ba744 --- /dev/null +++ b/configure/compiler/testcase/abnor_array.cpp @@ -0,0 +1,31 @@ +/* Generated file, do not edit */ + +#ifndef CXXTEST_RUNNING +#define CXXTEST_RUNNING +#endif + +#define _CXXTEST_HAVE_STD +#define _CXXTEST_HAVE_EH +#include +#include +#include +#include +#include + +int main() { + return CxxTest::ErrorPrinter().run(); +} +#include "abnor_array.h" + +static TestAbnorArray suite_TestAbnorArray; + +static CxxTest::List Tests_TestAbnorArray = { 0, 0 }; +CxxTest::StaticSuiteDescription suiteDescription_TestAbnorArray( "abnor_array.h", 19, "TestAbnorArray", suite_TestAbnorArray, Tests_TestAbnorArray ); + +static class TestDescription_TestAbnorArray_test_abnor_array : public CxxTest::RealTestDescription { +public: + TestDescription_TestAbnorArray_test_abnor_array() : CxxTest::RealTestDescription( Tests_TestAbnorArray, suiteDescription_TestAbnorArray, 22, "test_abnor_array" ) {} + void runTest() { suite_TestAbnorArray.test_abnor_array(); } +} testDescription_TestAbnorArray_test_abnor_array; + +#include diff --git a/configure/compiler/testcase/abnor_group.cpp b/configure/compiler/testcase/abnor_group.cpp new file mode 100644 index 0000000000000000000000000000000000000000..80bcabab94c937d127521462ad085693efba177a --- /dev/null +++ b/configure/compiler/testcase/abnor_group.cpp @@ -0,0 +1,31 @@ +/* Generated file, do not edit */ + +#ifndef CXXTEST_RUNNING +#define CXXTEST_RUNNING +#endif + +#define _CXXTEST_HAVE_STD +#define _CXXTEST_HAVE_EH +#include +#include +#include +#include +#include + +int main() { + return CxxTest::ErrorPrinter().run(); +} +#include "abnor_group.h" + +static TestAbnorGroup suite_TestAbnorGroup; + +static CxxTest::List Tests_TestAbnorGroup = { 0, 0 }; +CxxTest::StaticSuiteDescription suiteDescription_TestAbnorGroup( "abnor_group.h", 20, "TestAbnorGroup", suite_TestAbnorGroup, Tests_TestAbnorGroup ); + +static class TestDescription_TestAbnorGroup_test_abnor_group : public CxxTest::RealTestDescription { +public: + TestDescription_TestAbnorGroup_test_abnor_group() : CxxTest::RealTestDescription( Tests_TestAbnorGroup, suiteDescription_TestAbnorGroup, 23, "test_abnor_group" ) {} + void runTest() { suite_TestAbnorGroup.test_abnor_group(); } +} testDescription_TestAbnorGroup_test_abnor_group; + +#include diff --git a/configure/compiler/testcase/abnor_var.cpp b/configure/compiler/testcase/abnor_var.cpp new file mode 100644 index 0000000000000000000000000000000000000000..1edb59fa602e3c9edad8dfa273cd00455be4de70 --- /dev/null +++ b/configure/compiler/testcase/abnor_var.cpp @@ -0,0 +1,31 @@ +/* Generated file, do not edit */ + +#ifndef CXXTEST_RUNNING +#define CXXTEST_RUNNING +#endif + +#define _CXXTEST_HAVE_STD +#define _CXXTEST_HAVE_EH +#include +#include +#include +#include +#include + +int main() { + return CxxTest::ErrorPrinter().run(); +} +#include "abnor_var.h" + +static TestAbnorVar suite_TestAbnorVar; + +static CxxTest::List Tests_TestAbnorVar = { 0, 0 }; +CxxTest::StaticSuiteDescription suiteDescription_TestAbnorVar( "abnor_var.h", 20, "TestAbnorVar", suite_TestAbnorVar, Tests_TestAbnorVar ); + +static class TestDescription_TestAbnorVar_test_abnor_var : public CxxTest::RealTestDescription { +public: + TestDescription_TestAbnorVar_test_abnor_var() : CxxTest::RealTestDescription( Tests_TestAbnorVar, suiteDescription_TestAbnorVar, 23, "test_abnor_var" ) {} + void runTest() { suite_TestAbnorVar.test_abnor_var(); } +} testDescription_TestAbnorVar_test_abnor_var; + +#include diff --git a/configure/compiler/testcase/cmd.def b/configure/compiler/testcase/cmd.def new file mode 100644 index 0000000000000000000000000000000000000000..65b59340b5c33e1a7efecc41e043050b4796a475 --- /dev/null +++ b/configure/compiler/testcase/cmd.def @@ -0,0 +1,7 @@ +struct a //asdfasdfsadf +{ + int32_t ab = range(0);//adsf + int32_t c = a(); //adf + int32_t def; + //dasdf +}; diff --git a/configure/compiler/testcase/create_bak.sh b/configure/compiler/testcase/create_bak.sh new file mode 100755 index 0000000000000000000000000000000000000000..d9b3a9c391bc9e04c673f8809980797631e248a8 --- /dev/null +++ b/configure/compiler/testcase/create_bak.sh @@ -0,0 +1,14 @@ +#!/bin/bash +if [ $# -eq 1 ] +then + i=$1 + bak=${i%%.def}.bak + ./main $i 1>$bak +else + for i in *.def + do + bak=${i%%.def}.bak + ./main $i 1>$bak + done +fi + diff --git a/configure/compiler/testcase/error.bak b/configure/compiler/testcase/error.bak new file mode 100644 index 0000000000000000000000000000000000000000..208ef99727c829991e86fbc2f224b8a8567b777e --- /dev/null +++ b/configure/compiler/testcase/error.bak @@ -0,0 +1,14 @@ +idl groups: + group:a_t,overwrited from a_t +idl vars: + var:a,type:int32_t + func:array + arg:0 + var:b,type:int32_t + var:c,type:nonetype +idl error: + error.def:2:array size -10 is invalid + error.def:6:var 'b' already exists at error.def:5 + error.def:9:type 'nonetype' doesn't exist + error.def:15:groups 'a_t' already exists at error.def:12 + error.def:20:syntax error, unexpected ID, expecting INTEGER or LITERAL_STRING before char:'a' diff --git a/configure/compiler/testcase/error.def b/configure/compiler/testcase/error.def new file mode 100644 index 0000000000000000000000000000000000000000..28fdf899483e88c7a9d4b62506783ec208c6a36b --- /dev/null +++ b/configure/compiler/testcase/error.def @@ -0,0 +1,45 @@ +#negative num for array +int32_t a[-10]; + +#duplicate var name +int32_t b; +double b; + +#no type +nonetype c; + +#duplicate struct name +struct a_t +{ +}; +struct a_t +{ +}; + +#duplicate cf +int32_t d=fn(a),fn(b); + +#duplicate struct field +struct b_t +{ + int32_t a; + int32_t a; +}; + +#duplicate struct field with non type +struct c_t +{ + nonetype a; +}; + +#overwrite +d_t overwrite nonestruct +{ +}; + +#overwrite non field +e_t overwrite a_t +{ + int32_t a; +}; + diff --git a/configure/compiler/testcase/gen b/configure/compiler/testcase/gen new file mode 100755 index 0000000000000000000000000000000000000000..ddcf5c714c2a17849708ac62db8b8a7f8dac88d5 Binary files /dev/null and b/configure/compiler/testcase/gen differ diff --git a/configure/compiler/testcase/gen.c b/configure/compiler/testcase/gen.c new file mode 100644 index 0000000000000000000000000000000000000000..7cbb2096e40513ebb20b0f68fc4502f43305319e --- /dev/null +++ b/configure/compiler/testcase/gen.c @@ -0,0 +1,87 @@ +/*************************************************************************** + * + * Copyright (c) 2008 Baidu.com, Inc. All Rights Reserved + * $Id: gen.c,v 1.1 2008/12/30 03:39:55 yingxiang Exp $ + * + **************************************************************************/ + + + +/** + * @file gen.cpp + * @author xiaowei(com@baidu.com) + * @date 2008/11/21 18:22:15 + * @version $Revision: 1.1 $ + * @brief + * + **/ + +#include +#include +#include + +int main() +{ + std::cout<<"#include "<"< -1e5 )"<>2)<<1+3<<2*(1<<2)" + }; + std::vector vec(vecs, vecs+sizeof(vecs)/sizeof(vecs[0])); + + std::vector type; + type.push_back("int"); + type.push_back("long"); + //type.push_back("char"); + type.push_back("unsigned int"); + type.push_back("unsigned long"); + type.push_back("long long"); + type.push_back("unsigned long long"); + + for (int tp=0; tp<(int)type.size(); ++tp) { + for (int i=0; i<(int)vec.size(); ++i) { + std::cout<<"\t"<<"void test" <<"_case"< +#include +#include +#include +#include + +int main() { + return CxxTest::ErrorPrinter().run(); +} +#include "gen.h" + +static test_expr_suit suite_test_expr_suit; + +static CxxTest::List Tests_test_expr_suit = { 0, 0 }; +CxxTest::StaticSuiteDescription suiteDescription_test_expr_suit( "gen.h", 5, "test_expr_suit", suite_test_expr_suit, Tests_test_expr_suit ); + +static class TestDescription_test_expr_suit_test_case0 : public CxxTest::RealTestDescription { +public: + TestDescription_test_expr_suit_test_case0() : CxxTest::RealTestDescription( Tests_test_expr_suit, suiteDescription_test_expr_suit, 8, "test_case0" ) {} + void runTest() { suite_test_expr_suit.test_case0(); } +} testDescription_test_expr_suit_test_case0; + +static class TestDescription_test_expr_suit_test_case1 : public CxxTest::RealTestDescription { +public: + TestDescription_test_expr_suit_test_case1() : CxxTest::RealTestDescription( Tests_test_expr_suit, suiteDescription_test_expr_suit, 13, "test_case1" ) {} + void runTest() { suite_test_expr_suit.test_case1(); } +} testDescription_test_expr_suit_test_case1; + +static class TestDescription_test_expr_suit_test_case2 : public CxxTest::RealTestDescription { +public: + TestDescription_test_expr_suit_test_case2() : CxxTest::RealTestDescription( Tests_test_expr_suit, suiteDescription_test_expr_suit, 18, "test_case2" ) {} + void runTest() { suite_test_expr_suit.test_case2(); } +} testDescription_test_expr_suit_test_case2; + +static class TestDescription_test_expr_suit_test_case0 : public CxxTest::RealTestDescription { +public: + TestDescription_test_expr_suit_test_case0() : CxxTest::RealTestDescription( Tests_test_expr_suit, suiteDescription_test_expr_suit, 23, "test_case0" ) {} + void runTest() { suite_test_expr_suit.test_case0(); } +} testDescription_test_expr_suit_test_case0; + +static class TestDescription_test_expr_suit_test_case1 : public CxxTest::RealTestDescription { +public: + TestDescription_test_expr_suit_test_case1() : CxxTest::RealTestDescription( Tests_test_expr_suit, suiteDescription_test_expr_suit, 28, "test_case1" ) {} + void runTest() { suite_test_expr_suit.test_case1(); } +} testDescription_test_expr_suit_test_case1; + +static class TestDescription_test_expr_suit_test_case2 : public CxxTest::RealTestDescription { +public: + TestDescription_test_expr_suit_test_case2() : CxxTest::RealTestDescription( Tests_test_expr_suit, suiteDescription_test_expr_suit, 33, "test_case2" ) {} + void runTest() { suite_test_expr_suit.test_case2(); } +} testDescription_test_expr_suit_test_case2; + +static class TestDescription_test_expr_suit_test_case0 : public CxxTest::RealTestDescription { +public: + TestDescription_test_expr_suit_test_case0() : CxxTest::RealTestDescription( Tests_test_expr_suit, suiteDescription_test_expr_suit, 38, "test_case0" ) {} + void runTest() { suite_test_expr_suit.test_case0(); } +} testDescription_test_expr_suit_test_case0; + +static class TestDescription_test_expr_suit_test_case1 : public CxxTest::RealTestDescription { +public: + TestDescription_test_expr_suit_test_case1() : CxxTest::RealTestDescription( Tests_test_expr_suit, suiteDescription_test_expr_suit, 43, "test_case1" ) {} + void runTest() { suite_test_expr_suit.test_case1(); } +} testDescription_test_expr_suit_test_case1; + +static class TestDescription_test_expr_suit_test_case2 : public CxxTest::RealTestDescription { +public: + TestDescription_test_expr_suit_test_case2() : CxxTest::RealTestDescription( Tests_test_expr_suit, suiteDescription_test_expr_suit, 48, "test_case2" ) {} + void runTest() { suite_test_expr_suit.test_case2(); } +} testDescription_test_expr_suit_test_case2; + +static class TestDescription_test_expr_suit_test_case0 : public CxxTest::RealTestDescription { +public: + TestDescription_test_expr_suit_test_case0() : CxxTest::RealTestDescription( Tests_test_expr_suit, suiteDescription_test_expr_suit, 53, "test_case0" ) {} + void runTest() { suite_test_expr_suit.test_case0(); } +} testDescription_test_expr_suit_test_case0; + +static class TestDescription_test_expr_suit_test_case1 : public CxxTest::RealTestDescription { +public: + TestDescription_test_expr_suit_test_case1() : CxxTest::RealTestDescription( Tests_test_expr_suit, suiteDescription_test_expr_suit, 58, "test_case1" ) {} + void runTest() { suite_test_expr_suit.test_case1(); } +} testDescription_test_expr_suit_test_case1; + +static class TestDescription_test_expr_suit_test_case2 : public CxxTest::RealTestDescription { +public: + TestDescription_test_expr_suit_test_case2() : CxxTest::RealTestDescription( Tests_test_expr_suit, suiteDescription_test_expr_suit, 63, "test_case2" ) {} + void runTest() { suite_test_expr_suit.test_case2(); } +} testDescription_test_expr_suit_test_case2; + +static class TestDescription_test_expr_suit_test_case0 : public CxxTest::RealTestDescription { +public: + TestDescription_test_expr_suit_test_case0() : CxxTest::RealTestDescription( Tests_test_expr_suit, suiteDescription_test_expr_suit, 68, "test_case0" ) {} + void runTest() { suite_test_expr_suit.test_case0(); } +} testDescription_test_expr_suit_test_case0; + +static class TestDescription_test_expr_suit_test_case1 : public CxxTest::RealTestDescription { +public: + TestDescription_test_expr_suit_test_case1() : CxxTest::RealTestDescription( Tests_test_expr_suit, suiteDescription_test_expr_suit, 73, "test_case1" ) {} + void runTest() { suite_test_expr_suit.test_case1(); } +} testDescription_test_expr_suit_test_case1; + +static class TestDescription_test_expr_suit_test_case2 : public CxxTest::RealTestDescription { +public: + TestDescription_test_expr_suit_test_case2() : CxxTest::RealTestDescription( Tests_test_expr_suit, suiteDescription_test_expr_suit, 78, "test_case2" ) {} + void runTest() { suite_test_expr_suit.test_case2(); } +} testDescription_test_expr_suit_test_case2; + +static class TestDescription_test_expr_suit_test_case0 : public CxxTest::RealTestDescription { +public: + TestDescription_test_expr_suit_test_case0() : CxxTest::RealTestDescription( Tests_test_expr_suit, suiteDescription_test_expr_suit, 83, "test_case0" ) {} + void runTest() { suite_test_expr_suit.test_case0(); } +} testDescription_test_expr_suit_test_case0; + +static class TestDescription_test_expr_suit_test_case1 : public CxxTest::RealTestDescription { +public: + TestDescription_test_expr_suit_test_case1() : CxxTest::RealTestDescription( Tests_test_expr_suit, suiteDescription_test_expr_suit, 88, "test_case1" ) {} + void runTest() { suite_test_expr_suit.test_case1(); } +} testDescription_test_expr_suit_test_case1; + +static class TestDescription_test_expr_suit_test_case2 : public CxxTest::RealTestDescription { +public: + TestDescription_test_expr_suit_test_case2() : CxxTest::RealTestDescription( Tests_test_expr_suit, suiteDescription_test_expr_suit, 93, "test_case2" ) {} + void runTest() { suite_test_expr_suit.test_case2(); } +} testDescription_test_expr_suit_test_case2; + +static class TestDescription_test_expr_suit_test_case0 : public CxxTest::RealTestDescription { +public: + TestDescription_test_expr_suit_test_case0() : CxxTest::RealTestDescription( Tests_test_expr_suit, suiteDescription_test_expr_suit, 98, "test_case0" ) {} + void runTest() { suite_test_expr_suit.test_case0(); } +} testDescription_test_expr_suit_test_case0; + +static class TestDescription_test_expr_suit_test_case1 : public CxxTest::RealTestDescription { +public: + TestDescription_test_expr_suit_test_case1() : CxxTest::RealTestDescription( Tests_test_expr_suit, suiteDescription_test_expr_suit, 103, "test_case1" ) {} + void runTest() { suite_test_expr_suit.test_case1(); } +} testDescription_test_expr_suit_test_case1; + +static class TestDescription_test_expr_suit_test_case2 : public CxxTest::RealTestDescription { +public: + TestDescription_test_expr_suit_test_case2() : CxxTest::RealTestDescription( Tests_test_expr_suit, suiteDescription_test_expr_suit, 108, "test_case2" ) {} + void runTest() { suite_test_expr_suit.test_case2(); } +} testDescription_test_expr_suit_test_case2; + +#include diff --git a/configure/compiler/testcase/group.cpp b/configure/compiler/testcase/group.cpp new file mode 100644 index 0000000000000000000000000000000000000000..4a210899dbb46efb4bb9cee152354453d3cdc1f3 --- /dev/null +++ b/configure/compiler/testcase/group.cpp @@ -0,0 +1,31 @@ +/* Generated file, do not edit */ + +#ifndef CXXTEST_RUNNING +#define CXXTEST_RUNNING +#endif + +#define _CXXTEST_HAVE_STD +#define _CXXTEST_HAVE_EH +#include +#include +#include +#include +#include + +int main() { + return CxxTest::ErrorPrinter().run(); +} +#include "group.h" + +static TestGroup suite_TestGroup; + +static CxxTest::List Tests_TestGroup = { 0, 0 }; +CxxTest::StaticSuiteDescription suiteDescription_TestGroup( "group.h", 20, "TestGroup", suite_TestGroup, Tests_TestGroup ); + +static class TestDescription_TestGroup_testgroup : public CxxTest::RealTestDescription { +public: + TestDescription_TestGroup_testgroup() : CxxTest::RealTestDescription( Tests_TestGroup, suiteDescription_TestGroup, 23, "testgroup" ) {} + void runTest() { suite_TestGroup.testgroup(); } +} testDescription_TestGroup_testgroup; + +#include diff --git a/configure/compiler/testcase/main.cpp b/configure/compiler/testcase/main.cpp new file mode 100755 index 0000000000000000000000000000000000000000..e9c61a58c1921388814065bc8d88b356505505b8 --- /dev/null +++ b/configure/compiler/testcase/main.cpp @@ -0,0 +1,29 @@ +/* -*- c++ -*- + copy[write] by dirlt(zhang_yan@baidu.com) + date time:Mon Nov 17 17:08:24 CST 2008 + file name:main.cpp */ + +#include +#include +#include "idl_conf_if.h" +using namespace confIDL; + +int main(int argc,char **argv) +{ + int i; + char *file; + idl_t *idl_data; + for(i=1;i +#include +#include +#include +#include + +int main() { + return CxxTest::ErrorPrinter().run(); +} +#include diff --git a/configure/compiler/testcase/syntax.bak b/configure/compiler/testcase/syntax.bak new file mode 100644 index 0000000000000000000000000000000000000000..6573a66e564b09a99856a89ead5deb4c3e91b2c2 --- /dev/null +++ b/configure/compiler/testcase/syntax.bak @@ -0,0 +1,52 @@ +idl groups: + group:a_t,overwrited from a_t + group:b_t,overwrited from b_t + var:a,type:int32_t + group:c_t,overwrited from b_t + var:a,type:double + func:fn + arg:1 +idl vars: + var:myraw,type:raw + var:a,type:char + var:b,type:uchar + var:c,type:int8_t + var:d,type:uint8_t + var:e,type:int16_t + var:f,type:uint16_t + var:g,type:int32_t + var:h,type:uint32_t + var:i,type:int64_t + var:j,type:uint64_t + var:k,type:int32_t + func:array + arg:0 + var:l,type:int32_t + func:array + arg:2 + var:o,type:int32_t + func:array + arg:50 + arg:50 + var:p,type:int32_t + func:array + arg:0 + arg:50 + var:r,type:int32_t + func:fn + var:s,type:int32_t + func:fn + arg:"a" + var:t,type:int32_t + func:fn + arg:"a" + func:fn1 + arg:"b" + var:u,type:int32_t + func:fn + arg:"a" + arg:"b" + var:w,type:string + func:default + arg:"hello,world" +idl error: diff --git a/configure/compiler/testcase/syntax.def b/configure/compiler/testcase/syntax.def new file mode 100644 index 0000000000000000000000000000000000000000..55bdd8d3736c76128e2e6e769be333c6ef8f1170 --- /dev/null +++ b/configure/compiler/testcase/syntax.def @@ -0,0 +1,55 @@ +///* variable type */ +raw myraw; +char a; +uchar b; + +int8_t c; +uint8_t d; + +int16_t e; +uint16_t f; + +int32_t g; +uint32_t h; + +int64_t i; +uint64_t j; + +///* variable array */ +int32_t k[]; +int32_t l[2]; + +///* multi array */ +int32_t o[50][50]; +int32_t p[][50]; + +///* constraint32_t function */ +int32_t r=fn(); +int32_t s=fn("a");//lala +//adsfsadf + +///* multi constraint32_t function */ +int32_t t=fn("a"),fn1("b"); +//adsf + +///* multi param */ +int32_t u=fn("a","b"); + +string w=default("hello,world"); + +///group +struct a_t +{ +}; +struct b_t +{ + int32_t a; +}; + +///group overwrite +c_t overwrite b_t +{ + double a=fn(1); #comment test here +}; + +#comment test here diff --git a/configure/compiler/testcase/test.sh b/configure/compiler/testcase/test.sh new file mode 100755 index 0000000000000000000000000000000000000000..741f34560a97a9d0b3aadf2c73ce697b06284b5d --- /dev/null +++ b/configure/compiler/testcase/test.sh @@ -0,0 +1,14 @@ +#!/bin/bash +for i in *.def +do + bak=${i%%.def}.bak + ./main $i 1>$bak.2 + diff $bak $bak.2 1>/dev/null 2>/dev/null + if [ $? -ne 0 ] + then + echo "$i doesn't make the ccheck++ pass" + else + rm -rf $bak.2 + fi +done + diff --git a/configure/compiler/testcase/test_expr.cpp b/configure/compiler/testcase/test_expr.cpp new file mode 100644 index 0000000000000000000000000000000000000000..8dd341268a0d66bab75f98fcc6544b4908b82a47 --- /dev/null +++ b/configure/compiler/testcase/test_expr.cpp @@ -0,0 +1,61 @@ +/* Generated file, do not edit */ + +#ifndef CXXTEST_RUNNING +#define CXXTEST_RUNNING +#endif + +#define _CXXTEST_HAVE_STD +#define _CXXTEST_HAVE_EH +#include +#include +#include +#include +#include + +int main() { + return CxxTest::ErrorPrinter().run(); +} +#include "test_expr.h" + +static test_normal suite_test_normal; + +static CxxTest::List Tests_test_normal = { 0, 0 }; +CxxTest::StaticSuiteDescription suiteDescription_test_normal( "test_expr.h", 29, "test_normal", suite_test_normal, Tests_test_normal ); + +static class TestDescription_test_normal_test_test1 : public CxxTest::RealTestDescription { +public: + TestDescription_test_normal_test_test1() : CxxTest::RealTestDescription( Tests_test_normal, suiteDescription_test_normal, 32, "test_test1" ) {} + void runTest() { suite_test_normal.test_test1(); } +} testDescription_test_normal_test_test1; + +static class TestDescription_test_normal_test_test2 : public CxxTest::RealTestDescription { +public: + TestDescription_test_normal_test_test2() : CxxTest::RealTestDescription( Tests_test_normal, suiteDescription_test_normal, 45, "test_test2" ) {} + void runTest() { suite_test_normal.test_test2(); } +} testDescription_test_normal_test_test2; + +static class TestDescription_test_normal_test_test3 : public CxxTest::RealTestDescription { +public: + TestDescription_test_normal_test_test3() : CxxTest::RealTestDescription( Tests_test_normal, suiteDescription_test_normal, 56, "test_test3" ) {} + void runTest() { suite_test_normal.test_test3(); } +} testDescription_test_normal_test_test3; + +static class TestDescription_test_normal_test_test4 : public CxxTest::RealTestDescription { +public: + TestDescription_test_normal_test_test4() : CxxTest::RealTestDescription( Tests_test_normal, suiteDescription_test_normal, 67, "test_test4" ) {} + void runTest() { suite_test_normal.test_test4(); } +} testDescription_test_normal_test_test4; + +static class TestDescription_test_normal_test_fail : public CxxTest::RealTestDescription { +public: + TestDescription_test_normal_test_fail() : CxxTest::RealTestDescription( Tests_test_normal, suiteDescription_test_normal, 83, "test_fail" ) {} + void runTest() { suite_test_normal.test_fail(); } +} testDescription_test_normal_test_fail; + +static class TestDescription_test_normal_test_double2 : public CxxTest::RealTestDescription { +public: + TestDescription_test_normal_test_double2() : CxxTest::RealTestDescription( Tests_test_normal, suiteDescription_test_normal, 95, "test_double2" ) {} + void runTest() { suite_test_normal.test_double2(); } +} testDescription_test_normal_test_double2; + +#include diff --git a/configure/compiler/testcase/test_expr.h b/configure/compiler/testcase/test_expr.h new file mode 100644 index 0000000000000000000000000000000000000000..83d5b6c35bec848542efb9e66ce9fd2e3336486a --- /dev/null +++ b/configure/compiler/testcase/test_expr.h @@ -0,0 +1,110 @@ +/*************************************************************************** + * + * Copyright (c) 2008 Baidu.com, Inc. All Rights Reserved + * $Id: test_expr.h,v 1.1 2008/12/30 03:39:55 yingxiang Exp $ + * + **************************************************************************/ + + + +/** + * @file normal.h + * @author xiaowei(com@baidu.com) + * @date 2008/11/21 14:11:44 + * @version $Revision: 1.1 $ + * @brief + * + **/ + + +#ifndef __NORMAL_H_ +#define __NORMAL_H_ + +#include +#include "../src/expr.h" +#include + +#define DEQ(x, y) ( ((x)-(y)) < 1e5 || ((x)-(y)) > -1e5 ) + +class test_normal : public CxxTest::TestSuite +{ +public: + void test_test1() + { + int val = 0; + TSM_ASSERT("", xarthop::calc("1+1", &val) == 0); + TSM_ASSERT("", val == 1+1); + + TSM_ASSERT("", xarthop::calc(" 1+ 1 ", &val) == 0); + TSM_ASSERT("", val == 1+1); + + TSM_ASSERT("", xarthop::calc(" 1 + 3 - 2 ", &val) == 0); + TSM_ASSERT("", val == 1+3-2); + } + + void test_test2() + { + int val = 0; + TSM_ASSERT("", xarthop::calc("1+2/3-2*4", &val) == 0); + //std::cout<<"-------"<>3", &val) == 0); + //std::cout<<"---------------"<<(324/(1<<2)+234>>3)<<" = "<>3); + + TSM_ASSERT("", xarthop::calc("1<<2>>3<<4>>3<<3", &val) == 0); + //std::cout<<"-----------------"<<(1<<2>>4<<4>>3<<3)<<"------"<>4<<4>>3<<3); + + TSM_ASSERT("", xarthop::calc("1*23+3*(23+23/2)+1/325", &val) == 0); + TSM_ASSERT("", val == 1*23+3*(23+23/2)+1/325); + } + + + void test_fail() + { + double val = 0; + TSM_ASSERT("", xarthop::calc("324/(1<<2)+234>>3", &val) != 0); + TSM_ASSERT("", xarthop::calc("1<<2>>3<<4>>3<<3", &val) != 0); + TSM_ASSERT("", xarthop::calc("", &val) != 0); + TSM_ASSERT("", xarthop::calc("adsfsdf", &val) != 0); + TSM_ASSERT("", xarthop::calc("123124..123", &val) != 0); + TSM_ASSERT("", xarthop::calc("123a+234", &val) != 0); + TSM_ASSERT("", xarthop::calc("1231+(123)+2", &val) == 0); + } + + void test_double2() + { + double val = 0; + TSM_ASSERT("", xarthop::calc("32.23 / 1.23 + 28 * (23.2+32) + 3-2 /21", &val) == 0); + TSM_ASSERT("", DEQ(val, 32.23 / 1.23 + 28 * (23.2+32) + 3-2 /21)); + + TSM_ASSERT("", xarthop::calc("32.2/1.32+(23.1-23.4)*6+13.2", &val) == 0); + TSM_ASSERT("", DEQ(val, 32.2/1.32+(23.1-23.4)*6+13.2)); + } +}; + + + +#endif //__NORMAL_H_ + +/* vim: set ts=4 sw=4 sts=4 tw=100 noet: */ diff --git a/configure/compiler/testcase/test_gen.cpp b/configure/compiler/testcase/test_gen.cpp new file mode 100644 index 0000000000000000000000000000000000000000..5b7f64292d3191e134fde31b3f8b8f5995f30836 --- /dev/null +++ b/configure/compiler/testcase/test_gen.cpp @@ -0,0 +1,313 @@ +/* Generated file, do not edit */ + +#ifndef CXXTEST_RUNNING +#define CXXTEST_RUNNING +#endif + +#define _CXXTEST_HAVE_STD +#define _CXXTEST_HAVE_EH +#include +#include +#include +#include +#include + +int main() { + return CxxTest::ErrorPrinter().run(); +} +#include "test_gen.h" + +static test_expr_suit suite_test_expr_suit; + +static CxxTest::List Tests_test_expr_suit = { 0, 0 }; +CxxTest::StaticSuiteDescription suiteDescription_test_expr_suit( "test_gen.h", 5, "test_expr_suit", suite_test_expr_suit, Tests_test_expr_suit ); + +static class TestDescription_test_expr_suit_test_case0_0 : public CxxTest::RealTestDescription { +public: + TestDescription_test_expr_suit_test_case0_0() : CxxTest::RealTestDescription( Tests_test_expr_suit, suiteDescription_test_expr_suit, 8, "test_case0_0" ) {} + void runTest() { suite_test_expr_suit.test_case0_0(); } +} testDescription_test_expr_suit_test_case0_0; + +static class TestDescription_test_expr_suit_test_case1_0 : public CxxTest::RealTestDescription { +public: + TestDescription_test_expr_suit_test_case1_0() : CxxTest::RealTestDescription( Tests_test_expr_suit, suiteDescription_test_expr_suit, 13, "test_case1_0" ) {} + void runTest() { suite_test_expr_suit.test_case1_0(); } +} testDescription_test_expr_suit_test_case1_0; + +static class TestDescription_test_expr_suit_test_case2_0 : public CxxTest::RealTestDescription { +public: + TestDescription_test_expr_suit_test_case2_0() : CxxTest::RealTestDescription( Tests_test_expr_suit, suiteDescription_test_expr_suit, 18, "test_case2_0" ) {} + void runTest() { suite_test_expr_suit.test_case2_0(); } +} testDescription_test_expr_suit_test_case2_0; + +static class TestDescription_test_expr_suit_test_case3_0 : public CxxTest::RealTestDescription { +public: + TestDescription_test_expr_suit_test_case3_0() : CxxTest::RealTestDescription( Tests_test_expr_suit, suiteDescription_test_expr_suit, 23, "test_case3_0" ) {} + void runTest() { suite_test_expr_suit.test_case3_0(); } +} testDescription_test_expr_suit_test_case3_0; + +static class TestDescription_test_expr_suit_test_case4_0 : public CxxTest::RealTestDescription { +public: + TestDescription_test_expr_suit_test_case4_0() : CxxTest::RealTestDescription( Tests_test_expr_suit, suiteDescription_test_expr_suit, 28, "test_case4_0" ) {} + void runTest() { suite_test_expr_suit.test_case4_0(); } +} testDescription_test_expr_suit_test_case4_0; + +static class TestDescription_test_expr_suit_test_case5_0 : public CxxTest::RealTestDescription { +public: + TestDescription_test_expr_suit_test_case5_0() : CxxTest::RealTestDescription( Tests_test_expr_suit, suiteDescription_test_expr_suit, 33, "test_case5_0" ) {} + void runTest() { suite_test_expr_suit.test_case5_0(); } +} testDescription_test_expr_suit_test_case5_0; + +static class TestDescription_test_expr_suit_test_case6_0 : public CxxTest::RealTestDescription { +public: + TestDescription_test_expr_suit_test_case6_0() : CxxTest::RealTestDescription( Tests_test_expr_suit, suiteDescription_test_expr_suit, 38, "test_case6_0" ) {} + void runTest() { suite_test_expr_suit.test_case6_0(); } +} testDescription_test_expr_suit_test_case6_0; + +static class TestDescription_test_expr_suit_test_case7_0 : public CxxTest::RealTestDescription { +public: + TestDescription_test_expr_suit_test_case7_0() : CxxTest::RealTestDescription( Tests_test_expr_suit, suiteDescription_test_expr_suit, 43, "test_case7_0" ) {} + void runTest() { suite_test_expr_suit.test_case7_0(); } +} testDescription_test_expr_suit_test_case7_0; + +static class TestDescription_test_expr_suit_test_case0_1 : public CxxTest::RealTestDescription { +public: + TestDescription_test_expr_suit_test_case0_1() : CxxTest::RealTestDescription( Tests_test_expr_suit, suiteDescription_test_expr_suit, 48, "test_case0_1" ) {} + void runTest() { suite_test_expr_suit.test_case0_1(); } +} testDescription_test_expr_suit_test_case0_1; + +static class TestDescription_test_expr_suit_test_case1_1 : public CxxTest::RealTestDescription { +public: + TestDescription_test_expr_suit_test_case1_1() : CxxTest::RealTestDescription( Tests_test_expr_suit, suiteDescription_test_expr_suit, 53, "test_case1_1" ) {} + void runTest() { suite_test_expr_suit.test_case1_1(); } +} testDescription_test_expr_suit_test_case1_1; + +static class TestDescription_test_expr_suit_test_case2_1 : public CxxTest::RealTestDescription { +public: + TestDescription_test_expr_suit_test_case2_1() : CxxTest::RealTestDescription( Tests_test_expr_suit, suiteDescription_test_expr_suit, 58, "test_case2_1" ) {} + void runTest() { suite_test_expr_suit.test_case2_1(); } +} testDescription_test_expr_suit_test_case2_1; + +static class TestDescription_test_expr_suit_test_case3_1 : public CxxTest::RealTestDescription { +public: + TestDescription_test_expr_suit_test_case3_1() : CxxTest::RealTestDescription( Tests_test_expr_suit, suiteDescription_test_expr_suit, 63, "test_case3_1" ) {} + void runTest() { suite_test_expr_suit.test_case3_1(); } +} testDescription_test_expr_suit_test_case3_1; + +static class TestDescription_test_expr_suit_test_case4_1 : public CxxTest::RealTestDescription { +public: + TestDescription_test_expr_suit_test_case4_1() : CxxTest::RealTestDescription( Tests_test_expr_suit, suiteDescription_test_expr_suit, 68, "test_case4_1" ) {} + void runTest() { suite_test_expr_suit.test_case4_1(); } +} testDescription_test_expr_suit_test_case4_1; + +static class TestDescription_test_expr_suit_test_case5_1 : public CxxTest::RealTestDescription { +public: + TestDescription_test_expr_suit_test_case5_1() : CxxTest::RealTestDescription( Tests_test_expr_suit, suiteDescription_test_expr_suit, 73, "test_case5_1" ) {} + void runTest() { suite_test_expr_suit.test_case5_1(); } +} testDescription_test_expr_suit_test_case5_1; + +static class TestDescription_test_expr_suit_test_case6_1 : public CxxTest::RealTestDescription { +public: + TestDescription_test_expr_suit_test_case6_1() : CxxTest::RealTestDescription( Tests_test_expr_suit, suiteDescription_test_expr_suit, 78, "test_case6_1" ) {} + void runTest() { suite_test_expr_suit.test_case6_1(); } +} testDescription_test_expr_suit_test_case6_1; + +static class TestDescription_test_expr_suit_test_case7_1 : public CxxTest::RealTestDescription { +public: + TestDescription_test_expr_suit_test_case7_1() : CxxTest::RealTestDescription( Tests_test_expr_suit, suiteDescription_test_expr_suit, 83, "test_case7_1" ) {} + void runTest() { suite_test_expr_suit.test_case7_1(); } +} testDescription_test_expr_suit_test_case7_1; + +static class TestDescription_test_expr_suit_test_case0_2 : public CxxTest::RealTestDescription { +public: + TestDescription_test_expr_suit_test_case0_2() : CxxTest::RealTestDescription( Tests_test_expr_suit, suiteDescription_test_expr_suit, 88, "test_case0_2" ) {} + void runTest() { suite_test_expr_suit.test_case0_2(); } +} testDescription_test_expr_suit_test_case0_2; + +static class TestDescription_test_expr_suit_test_case1_2 : public CxxTest::RealTestDescription { +public: + TestDescription_test_expr_suit_test_case1_2() : CxxTest::RealTestDescription( Tests_test_expr_suit, suiteDescription_test_expr_suit, 93, "test_case1_2" ) {} + void runTest() { suite_test_expr_suit.test_case1_2(); } +} testDescription_test_expr_suit_test_case1_2; + +static class TestDescription_test_expr_suit_test_case2_2 : public CxxTest::RealTestDescription { +public: + TestDescription_test_expr_suit_test_case2_2() : CxxTest::RealTestDescription( Tests_test_expr_suit, suiteDescription_test_expr_suit, 98, "test_case2_2" ) {} + void runTest() { suite_test_expr_suit.test_case2_2(); } +} testDescription_test_expr_suit_test_case2_2; + +static class TestDescription_test_expr_suit_test_case3_2 : public CxxTest::RealTestDescription { +public: + TestDescription_test_expr_suit_test_case3_2() : CxxTest::RealTestDescription( Tests_test_expr_suit, suiteDescription_test_expr_suit, 103, "test_case3_2" ) {} + void runTest() { suite_test_expr_suit.test_case3_2(); } +} testDescription_test_expr_suit_test_case3_2; + +static class TestDescription_test_expr_suit_test_case4_2 : public CxxTest::RealTestDescription { +public: + TestDescription_test_expr_suit_test_case4_2() : CxxTest::RealTestDescription( Tests_test_expr_suit, suiteDescription_test_expr_suit, 108, "test_case4_2" ) {} + void runTest() { suite_test_expr_suit.test_case4_2(); } +} testDescription_test_expr_suit_test_case4_2; + +static class TestDescription_test_expr_suit_test_case5_2 : public CxxTest::RealTestDescription { +public: + TestDescription_test_expr_suit_test_case5_2() : CxxTest::RealTestDescription( Tests_test_expr_suit, suiteDescription_test_expr_suit, 113, "test_case5_2" ) {} + void runTest() { suite_test_expr_suit.test_case5_2(); } +} testDescription_test_expr_suit_test_case5_2; + +static class TestDescription_test_expr_suit_test_case6_2 : public CxxTest::RealTestDescription { +public: + TestDescription_test_expr_suit_test_case6_2() : CxxTest::RealTestDescription( Tests_test_expr_suit, suiteDescription_test_expr_suit, 118, "test_case6_2" ) {} + void runTest() { suite_test_expr_suit.test_case6_2(); } +} testDescription_test_expr_suit_test_case6_2; + +static class TestDescription_test_expr_suit_test_case7_2 : public CxxTest::RealTestDescription { +public: + TestDescription_test_expr_suit_test_case7_2() : CxxTest::RealTestDescription( Tests_test_expr_suit, suiteDescription_test_expr_suit, 123, "test_case7_2" ) {} + void runTest() { suite_test_expr_suit.test_case7_2(); } +} testDescription_test_expr_suit_test_case7_2; + +static class TestDescription_test_expr_suit_test_case0_3 : public CxxTest::RealTestDescription { +public: + TestDescription_test_expr_suit_test_case0_3() : CxxTest::RealTestDescription( Tests_test_expr_suit, suiteDescription_test_expr_suit, 128, "test_case0_3" ) {} + void runTest() { suite_test_expr_suit.test_case0_3(); } +} testDescription_test_expr_suit_test_case0_3; + +static class TestDescription_test_expr_suit_test_case1_3 : public CxxTest::RealTestDescription { +public: + TestDescription_test_expr_suit_test_case1_3() : CxxTest::RealTestDescription( Tests_test_expr_suit, suiteDescription_test_expr_suit, 133, "test_case1_3" ) {} + void runTest() { suite_test_expr_suit.test_case1_3(); } +} testDescription_test_expr_suit_test_case1_3; + +static class TestDescription_test_expr_suit_test_case2_3 : public CxxTest::RealTestDescription { +public: + TestDescription_test_expr_suit_test_case2_3() : CxxTest::RealTestDescription( Tests_test_expr_suit, suiteDescription_test_expr_suit, 138, "test_case2_3" ) {} + void runTest() { suite_test_expr_suit.test_case2_3(); } +} testDescription_test_expr_suit_test_case2_3; + +static class TestDescription_test_expr_suit_test_case3_3 : public CxxTest::RealTestDescription { +public: + TestDescription_test_expr_suit_test_case3_3() : CxxTest::RealTestDescription( Tests_test_expr_suit, suiteDescription_test_expr_suit, 143, "test_case3_3" ) {} + void runTest() { suite_test_expr_suit.test_case3_3(); } +} testDescription_test_expr_suit_test_case3_3; + +static class TestDescription_test_expr_suit_test_case4_3 : public CxxTest::RealTestDescription { +public: + TestDescription_test_expr_suit_test_case4_3() : CxxTest::RealTestDescription( Tests_test_expr_suit, suiteDescription_test_expr_suit, 148, "test_case4_3" ) {} + void runTest() { suite_test_expr_suit.test_case4_3(); } +} testDescription_test_expr_suit_test_case4_3; + +static class TestDescription_test_expr_suit_test_case5_3 : public CxxTest::RealTestDescription { +public: + TestDescription_test_expr_suit_test_case5_3() : CxxTest::RealTestDescription( Tests_test_expr_suit, suiteDescription_test_expr_suit, 153, "test_case5_3" ) {} + void runTest() { suite_test_expr_suit.test_case5_3(); } +} testDescription_test_expr_suit_test_case5_3; + +static class TestDescription_test_expr_suit_test_case6_3 : public CxxTest::RealTestDescription { +public: + TestDescription_test_expr_suit_test_case6_3() : CxxTest::RealTestDescription( Tests_test_expr_suit, suiteDescription_test_expr_suit, 158, "test_case6_3" ) {} + void runTest() { suite_test_expr_suit.test_case6_3(); } +} testDescription_test_expr_suit_test_case6_3; + +static class TestDescription_test_expr_suit_test_case7_3 : public CxxTest::RealTestDescription { +public: + TestDescription_test_expr_suit_test_case7_3() : CxxTest::RealTestDescription( Tests_test_expr_suit, suiteDescription_test_expr_suit, 163, "test_case7_3" ) {} + void runTest() { suite_test_expr_suit.test_case7_3(); } +} testDescription_test_expr_suit_test_case7_3; + +static class TestDescription_test_expr_suit_test_case0_4 : public CxxTest::RealTestDescription { +public: + TestDescription_test_expr_suit_test_case0_4() : CxxTest::RealTestDescription( Tests_test_expr_suit, suiteDescription_test_expr_suit, 168, "test_case0_4" ) {} + void runTest() { suite_test_expr_suit.test_case0_4(); } +} testDescription_test_expr_suit_test_case0_4; + +static class TestDescription_test_expr_suit_test_case1_4 : public CxxTest::RealTestDescription { +public: + TestDescription_test_expr_suit_test_case1_4() : CxxTest::RealTestDescription( Tests_test_expr_suit, suiteDescription_test_expr_suit, 173, "test_case1_4" ) {} + void runTest() { suite_test_expr_suit.test_case1_4(); } +} testDescription_test_expr_suit_test_case1_4; + +static class TestDescription_test_expr_suit_test_case2_4 : public CxxTest::RealTestDescription { +public: + TestDescription_test_expr_suit_test_case2_4() : CxxTest::RealTestDescription( Tests_test_expr_suit, suiteDescription_test_expr_suit, 178, "test_case2_4" ) {} + void runTest() { suite_test_expr_suit.test_case2_4(); } +} testDescription_test_expr_suit_test_case2_4; + +static class TestDescription_test_expr_suit_test_case3_4 : public CxxTest::RealTestDescription { +public: + TestDescription_test_expr_suit_test_case3_4() : CxxTest::RealTestDescription( Tests_test_expr_suit, suiteDescription_test_expr_suit, 183, "test_case3_4" ) {} + void runTest() { suite_test_expr_suit.test_case3_4(); } +} testDescription_test_expr_suit_test_case3_4; + +static class TestDescription_test_expr_suit_test_case4_4 : public CxxTest::RealTestDescription { +public: + TestDescription_test_expr_suit_test_case4_4() : CxxTest::RealTestDescription( Tests_test_expr_suit, suiteDescription_test_expr_suit, 188, "test_case4_4" ) {} + void runTest() { suite_test_expr_suit.test_case4_4(); } +} testDescription_test_expr_suit_test_case4_4; + +static class TestDescription_test_expr_suit_test_case5_4 : public CxxTest::RealTestDescription { +public: + TestDescription_test_expr_suit_test_case5_4() : CxxTest::RealTestDescription( Tests_test_expr_suit, suiteDescription_test_expr_suit, 193, "test_case5_4" ) {} + void runTest() { suite_test_expr_suit.test_case5_4(); } +} testDescription_test_expr_suit_test_case5_4; + +static class TestDescription_test_expr_suit_test_case6_4 : public CxxTest::RealTestDescription { +public: + TestDescription_test_expr_suit_test_case6_4() : CxxTest::RealTestDescription( Tests_test_expr_suit, suiteDescription_test_expr_suit, 198, "test_case6_4" ) {} + void runTest() { suite_test_expr_suit.test_case6_4(); } +} testDescription_test_expr_suit_test_case6_4; + +static class TestDescription_test_expr_suit_test_case7_4 : public CxxTest::RealTestDescription { +public: + TestDescription_test_expr_suit_test_case7_4() : CxxTest::RealTestDescription( Tests_test_expr_suit, suiteDescription_test_expr_suit, 203, "test_case7_4" ) {} + void runTest() { suite_test_expr_suit.test_case7_4(); } +} testDescription_test_expr_suit_test_case7_4; + +static class TestDescription_test_expr_suit_test_case0_5 : public CxxTest::RealTestDescription { +public: + TestDescription_test_expr_suit_test_case0_5() : CxxTest::RealTestDescription( Tests_test_expr_suit, suiteDescription_test_expr_suit, 208, "test_case0_5" ) {} + void runTest() { suite_test_expr_suit.test_case0_5(); } +} testDescription_test_expr_suit_test_case0_5; + +static class TestDescription_test_expr_suit_test_case1_5 : public CxxTest::RealTestDescription { +public: + TestDescription_test_expr_suit_test_case1_5() : CxxTest::RealTestDescription( Tests_test_expr_suit, suiteDescription_test_expr_suit, 213, "test_case1_5" ) {} + void runTest() { suite_test_expr_suit.test_case1_5(); } +} testDescription_test_expr_suit_test_case1_5; + +static class TestDescription_test_expr_suit_test_case2_5 : public CxxTest::RealTestDescription { +public: + TestDescription_test_expr_suit_test_case2_5() : CxxTest::RealTestDescription( Tests_test_expr_suit, suiteDescription_test_expr_suit, 218, "test_case2_5" ) {} + void runTest() { suite_test_expr_suit.test_case2_5(); } +} testDescription_test_expr_suit_test_case2_5; + +static class TestDescription_test_expr_suit_test_case3_5 : public CxxTest::RealTestDescription { +public: + TestDescription_test_expr_suit_test_case3_5() : CxxTest::RealTestDescription( Tests_test_expr_suit, suiteDescription_test_expr_suit, 223, "test_case3_5" ) {} + void runTest() { suite_test_expr_suit.test_case3_5(); } +} testDescription_test_expr_suit_test_case3_5; + +static class TestDescription_test_expr_suit_test_case4_5 : public CxxTest::RealTestDescription { +public: + TestDescription_test_expr_suit_test_case4_5() : CxxTest::RealTestDescription( Tests_test_expr_suit, suiteDescription_test_expr_suit, 228, "test_case4_5" ) {} + void runTest() { suite_test_expr_suit.test_case4_5(); } +} testDescription_test_expr_suit_test_case4_5; + +static class TestDescription_test_expr_suit_test_case5_5 : public CxxTest::RealTestDescription { +public: + TestDescription_test_expr_suit_test_case5_5() : CxxTest::RealTestDescription( Tests_test_expr_suit, suiteDescription_test_expr_suit, 233, "test_case5_5" ) {} + void runTest() { suite_test_expr_suit.test_case5_5(); } +} testDescription_test_expr_suit_test_case5_5; + +static class TestDescription_test_expr_suit_test_case6_5 : public CxxTest::RealTestDescription { +public: + TestDescription_test_expr_suit_test_case6_5() : CxxTest::RealTestDescription( Tests_test_expr_suit, suiteDescription_test_expr_suit, 238, "test_case6_5" ) {} + void runTest() { suite_test_expr_suit.test_case6_5(); } +} testDescription_test_expr_suit_test_case6_5; + +static class TestDescription_test_expr_suit_test_case7_5 : public CxxTest::RealTestDescription { +public: + TestDescription_test_expr_suit_test_case7_5() : CxxTest::RealTestDescription( Tests_test_expr_suit, suiteDescription_test_expr_suit, 243, "test_case7_5" ) {} + void runTest() { suite_test_expr_suit.test_case7_5(); } +} testDescription_test_expr_suit_test_case7_5; + +#include diff --git a/configure/compiler/testcase/test_gen.h b/configure/compiler/testcase/test_gen.h new file mode 100644 index 0000000000000000000000000000000000000000..f6c2db91793a1c65ba965e7379d9b2d2e588d917 --- /dev/null +++ b/configure/compiler/testcase/test_gen.h @@ -0,0 +1,248 @@ +#include +#include "../src/expr.h" +#include +#define DEQ(x, y) ( ((x)-(y)) < 1e5 || ((x)-(y)) > -1e5 ) +class test_expr_suit : public CxxTest::TestSuite +{ +public: + void test_case0_0() { + int val = 0; + TSM_ASSERT ("", xarthop::calc("1+1", &val) == 0); + TSM_ASSERT ("", val == (int)(1+1)); + } + void test_case1_0() { + int val = 0; + TSM_ASSERT ("", xarthop::calc("123124+32", &val) == 0); + TSM_ASSERT ("", val == (int)(123124+32)); + } + void test_case2_0() { + int val = 0; + TSM_ASSERT ("", xarthop::calc("1*234/32+23*(1+23)", &val) == 0); + TSM_ASSERT ("", val == (int)(1*234/32+23*(1+23))); + } + void test_case3_0() { + int val = 0; + TSM_ASSERT ("", xarthop::calc("1+2/3-2*4", &val) == 0); + TSM_ASSERT ("", val == (int)(1+2/3-2*4)); + } + void test_case4_0() { + int val = 0; + TSM_ASSERT ("", xarthop::calc("1+3234234/2348*34+2", &val) == 0); + TSM_ASSERT ("", val == (int)(1+3234234/2348*34+2)); + } + void test_case5_0() { + int val = 0; + TSM_ASSERT ("", xarthop::calc("23/(234/23+3242*(3423+2)/234+1)*23+2342+23*32/23", &val) == 0); + TSM_ASSERT ("", val == (int)(23/(234/23+3242*(3423+2)/234+1)*23+2342+23*32/23)); + } + void test_case6_0() { + int val = 0; + TSM_ASSERT ("", xarthop::calc("23.2/234.2+234.2", &val) == 0); + TSM_ASSERT ("", val == (int)(23.2/234.2+234.2)); + } + void test_case7_0() { + int val = 0; + TSM_ASSERT ("", xarthop::calc("1+23*(1+32/2-23)+232-111<<2+32+(1>>23)<<1+3<<2*(1<<2)", &val) == 0); + TSM_ASSERT ("", val == (int)(1+23*(1+32/2-23)+232-111<<2+32+(1>>23)<<1+3<<2*(1<<2))); + } + void test_case0_1() { + long val = 0; + TSM_ASSERT ("", xarthop::calc("1+1", &val) == 0); + TSM_ASSERT ("", val == (long)(1+1)); + } + void test_case1_1() { + long val = 0; + TSM_ASSERT ("", xarthop::calc("123124+32", &val) == 0); + TSM_ASSERT ("", val == (long)(123124+32)); + } + void test_case2_1() { + long val = 0; + TSM_ASSERT ("", xarthop::calc("1*234/32+23*(1+23)", &val) == 0); + TSM_ASSERT ("", val == (long)(1*234/32+23*(1+23))); + } + void test_case3_1() { + long val = 0; + TSM_ASSERT ("", xarthop::calc("1+2/3-2*4", &val) == 0); + TSM_ASSERT ("", val == (long)(1+2/3-2*4)); + } + void test_case4_1() { + long val = 0; + TSM_ASSERT ("", xarthop::calc("1+3234234/2348*34+2", &val) == 0); + TSM_ASSERT ("", val == (long)(1+3234234/2348*34+2)); + } + void test_case5_1() { + long val = 0; + TSM_ASSERT ("", xarthop::calc("23/(234/23+3242*(3423+2)/234+1)*23+2342+23*32/23", &val) == 0); + TSM_ASSERT ("", val == (long)(23/(234/23+3242*(3423+2)/234+1)*23+2342+23*32/23)); + } + void test_case6_1() { + long val = 0; + TSM_ASSERT ("", xarthop::calc("23.2/234.2+234.2", &val) == 0); + TSM_ASSERT ("", val == (long)(23.2/234.2+234.2)); + } + void test_case7_1() { + long val = 0; + TSM_ASSERT ("", xarthop::calc("1+23*(1+32/2-23)+232-111<<2+32+(1>>23)<<1+3<<2*(1<<2)", &val) == 0); + TSM_ASSERT ("", val == (long)(1+23*(1+32/2-23)+232-111<<2+32+(1>>23)<<1+3<<2*(1<<2))); + } + void test_case0_2() { + unsigned int val = 0; + TSM_ASSERT ("", xarthop::calc("1+1", &val) == 0); + TSM_ASSERT ("", val == (unsigned int)(1+1)); + } + void test_case1_2() { + unsigned int val = 0; + TSM_ASSERT ("", xarthop::calc("123124+32", &val) == 0); + TSM_ASSERT ("", val == (unsigned int)(123124+32)); + } + void test_case2_2() { + unsigned int val = 0; + TSM_ASSERT ("", xarthop::calc("1*234/32+23*(1+23)", &val) == 0); + TSM_ASSERT ("", val == (unsigned int)(1*234/32+23*(1+23))); + } + void test_case3_2() { + unsigned int val = 0; + TSM_ASSERT ("", xarthop::calc("1+2/3-2*4", &val) == 0); + TSM_ASSERT ("", val == (unsigned int)(1+2/3-2*4)); + } + void test_case4_2() { + unsigned int val = 0; + TSM_ASSERT ("", xarthop::calc("1+3234234/2348*34+2", &val) == 0); + TSM_ASSERT ("", val == (unsigned int)(1+3234234/2348*34+2)); + } + void test_case5_2() { + unsigned int val = 0; + TSM_ASSERT ("", xarthop::calc("23/(234/23+3242*(3423+2)/234+1)*23+2342+23*32/23", &val) == 0); + TSM_ASSERT ("", val == (unsigned int)(23/(234/23+3242*(3423+2)/234+1)*23+2342+23*32/23)); + } + void test_case6_2() { + unsigned int val = 0; + TSM_ASSERT ("", xarthop::calc("23.2/234.2+234.2", &val) == 0); + TSM_ASSERT ("", val == (unsigned int)(23.2/234.2+234.2)); + } + void test_case7_2() { + unsigned int val = 0; + TSM_ASSERT ("", xarthop::calc("1+23*(1+32/2-23)+232-111<<2+32+(1>>23)<<1+3<<2*(1<<2)", &val) == 0); + TSM_ASSERT ("", val == (unsigned int)(1+23*(1+32/2-23)+232-111<<2+32+(1>>23)<<1+3<<2*(1<<2))); + } + void test_case0_3() { + unsigned long val = 0; + TSM_ASSERT ("", xarthop::calc("1+1", &val) == 0); + TSM_ASSERT ("", val == (unsigned long)(1+1)); + } + void test_case1_3() { + unsigned long val = 0; + TSM_ASSERT ("", xarthop::calc("123124+32", &val) == 0); + TSM_ASSERT ("", val == (unsigned long)(123124+32)); + } + void test_case2_3() { + unsigned long val = 0; + TSM_ASSERT ("", xarthop::calc("1*234/32+23*(1+23)", &val) == 0); + TSM_ASSERT ("", val == (unsigned long)(1*234/32+23*(1+23))); + } + void test_case3_3() { + unsigned long val = 0; + TSM_ASSERT ("", xarthop::calc("1+2/3-2*4", &val) == 0); + TSM_ASSERT ("", val == (unsigned long)(1+2/3-2*4)); + } + void test_case4_3() { + unsigned long val = 0; + TSM_ASSERT ("", xarthop::calc("1+3234234/2348*34+2", &val) == 0); + TSM_ASSERT ("", val == (unsigned long)(1+3234234/2348*34+2)); + } + void test_case5_3() { + unsigned long val = 0; + TSM_ASSERT ("", xarthop::calc("23/(234/23+3242*(3423+2)/234+1)*23+2342+23*32/23", &val) == 0); + TSM_ASSERT ("", val == (unsigned long)(23/(234/23+3242*(3423+2)/234+1)*23+2342+23*32/23)); + } + void test_case6_3() { + unsigned long val = 0; + TSM_ASSERT ("", xarthop::calc("23.2/234.2+234.2", &val) == 0); + TSM_ASSERT ("", val == (unsigned long)(23.2/234.2+234.2)); + } + void test_case7_3() { + unsigned long val = 0; + TSM_ASSERT ("", xarthop::calc("1+23*(1+32/2-23)+232-111<<2+32+(1>>23)<<1+3<<2*(1<<2)", &val) == 0); + TSM_ASSERT ("", val == (unsigned long)(1+23*(1+32/2-23)+232-111<<2+32+(1>>23)<<1+3<<2*(1<<2))); + } + void test_case0_4() { + long long val = 0; + TSM_ASSERT ("", xarthop::calc("1+1", &val) == 0); + TSM_ASSERT ("", val == (long long)(1+1)); + } + void test_case1_4() { + long long val = 0; + TSM_ASSERT ("", xarthop::calc("123124+32", &val) == 0); + TSM_ASSERT ("", val == (long long)(123124+32)); + } + void test_case2_4() { + long long val = 0; + TSM_ASSERT ("", xarthop::calc("1*234/32+23*(1+23)", &val) == 0); + TSM_ASSERT ("", val == (long long)(1*234/32+23*(1+23))); + } + void test_case3_4() { + long long val = 0; + TSM_ASSERT ("", xarthop::calc("1+2/3-2*4", &val) == 0); + TSM_ASSERT ("", val == (long long)(1+2/3-2*4)); + } + void test_case4_4() { + long long val = 0; + TSM_ASSERT ("", xarthop::calc("1+3234234/2348*34+2", &val) == 0); + TSM_ASSERT ("", val == (long long)(1+3234234/2348*34+2)); + } + void test_case5_4() { + long long val = 0; + TSM_ASSERT ("", xarthop::calc("23/(234/23+3242*(3423+2)/234+1)*23+2342+23*32/23", &val) == 0); + TSM_ASSERT ("", val == (long long)(23/(234/23+3242*(3423+2)/234+1)*23+2342+23*32/23)); + } + void test_case6_4() { + long long val = 0; + TSM_ASSERT ("", xarthop::calc("23.2/234.2+234.2", &val) == 0); + TSM_ASSERT ("", val == (long long)(23.2/234.2+234.2)); + } + void test_case7_4() { + long long val = 0; + TSM_ASSERT ("", xarthop::calc("1+23*(1+32/2-23)+232-111<<2+32+(1>>23)<<1+3<<2*(1<<2)", &val) == 0); + TSM_ASSERT ("", val == (long long)(1+23*(1+32/2-23)+232-111<<2+32+(1>>23)<<1+3<<2*(1<<2))); + } + void test_case0_5() { + unsigned long long val = 0; + TSM_ASSERT ("", xarthop::calc("1+1", &val) == 0); + TSM_ASSERT ("", val == (unsigned long long)(1+1)); + } + void test_case1_5() { + unsigned long long val = 0; + TSM_ASSERT ("", xarthop::calc("123124+32", &val) == 0); + TSM_ASSERT ("", val == (unsigned long long)(123124+32)); + } + void test_case2_5() { + unsigned long long val = 0; + TSM_ASSERT ("", xarthop::calc("1*234/32+23*(1+23)", &val) == 0); + TSM_ASSERT ("", val == (unsigned long long)(1*234/32+23*(1+23))); + } + void test_case3_5() { + unsigned long long val = 0; + TSM_ASSERT ("", xarthop::calc("1+2/3-2*4", &val) == 0); + TSM_ASSERT ("", val == (unsigned long long)(1+2/3-2*4)); + } + void test_case4_5() { + unsigned long long val = 0; + TSM_ASSERT ("", xarthop::calc("1+3234234/2348*34+2", &val) == 0); + TSM_ASSERT ("", val == (unsigned long long)(1+3234234/2348*34+2)); + } + void test_case5_5() { + unsigned long long val = 0; + TSM_ASSERT ("", xarthop::calc("23/(234/23+3242*(3423+2)/234+1)*23+2342+23*32/23", &val) == 0); + TSM_ASSERT ("", val == (unsigned long long)(23/(234/23+3242*(3423+2)/234+1)*23+2342+23*32/23)); + } + void test_case6_5() { + unsigned long long val = 0; + TSM_ASSERT ("", xarthop::calc("23.2/234.2+234.2", &val) == 0); + TSM_ASSERT ("", val == (unsigned long long)(23.2/234.2+234.2)); + } + void test_case7_5() { + unsigned long long val = 0; + TSM_ASSERT ("", xarthop::calc("1+23*(1+32/2-23)+232-111<<2+32+(1>>23)<<1+3<<2*(1<<2)", &val) == 0); + TSM_ASSERT ("", val == (unsigned long long)(1+23*(1+32/2-23)+232-111<<2+32+(1>>23)<<1+3<<2*(1<<2))); + } +}; diff --git a/configure/compiler/testcase/testcase.deps b/configure/compiler/testcase/testcase.deps new file mode 100644 index 0000000000000000000000000000000000000000..9455a814a6ad20b86688fa987e0498be44abd87d --- /dev/null +++ b/configure/compiler/testcase/testcase.deps @@ -0,0 +1,2 @@ +lib2/bsl bsl_1-0-2-5_PD_BL +lib2-64/bsl bsl_1-0-2-5_PD_BL \ No newline at end of file diff --git a/configure/compiler/testcase/testcase.prj b/configure/compiler/testcase/testcase.prj new file mode 100644 index 0000000000000000000000000000000000000000..b31faa80ad5843b48af6ff3b39f50612121667fa --- /dev/null +++ b/configure/compiler/testcase/testcase.prj @@ -0,0 +1,18 @@ +########################################################################### +# Automatically generated by comake (1.0.0) 2009-03-05 13:56:58 # +########################################################################### +WORKROOT = ../../../../ +INCPATH = . ../output/include +LDFLAGS = ../output/lib +LDLIBS = -lidlcompiler +CONFIG = lib2/bsl +SOURCES += + + +target(main) +{ +SOURCES += \ + main.cpp +} + + diff --git a/configure/compiler/testcase/var.cpp b/configure/compiler/testcase/var.cpp new file mode 100644 index 0000000000000000000000000000000000000000..1dfa422dbfedca7a4632c5c2f552d86bb0aeb1a1 --- /dev/null +++ b/configure/compiler/testcase/var.cpp @@ -0,0 +1,31 @@ +/* Generated file, do not edit */ + +#ifndef CXXTEST_RUNNING +#define CXXTEST_RUNNING +#endif + +#define _CXXTEST_HAVE_STD +#define _CXXTEST_HAVE_EH +#include +#include +#include +#include +#include + +int main() { + return CxxTest::ErrorPrinter().run(); +} +#include "var.h" + +static TestVar suite_TestVar; + +static CxxTest::List Tests_TestVar = { 0, 0 }; +CxxTest::StaticSuiteDescription suiteDescription_TestVar( "var.h", 20, "TestVar", suite_TestVar, Tests_TestVar ); + +static class TestDescription_TestVar_testvar : public CxxTest::RealTestDescription { +public: + TestDescription_TestVar_testvar() : CxxTest::RealTestDescription( Tests_TestVar, suiteDescription_TestVar, 23, "testvar" ) {} + void runTest() { suite_TestVar.testvar(); } +} testDescription_TestVar_testvar; + +#include diff --git a/configure/configure.prj b/configure/configure.prj new file mode 100644 index 0000000000000000000000000000000000000000..598c3c9e9e8f0288ed7aa5a64b05f9b1592fa545 --- /dev/null +++ b/configure/configure.prj @@ -0,0 +1,43 @@ +########################################################################### +# Automatically generated by comake (1.0.0) 2009-03-09 16:54:08 # +########################################################################### +WORKROOT = ../../ +INCPATH = . compiler/src +CONFIG = public/spreg lib2/bsl lib2/ullib +CONFIG += MAKDEP +CC=g++ +SOURCES += \ + FileReloader.cpp\ + ConfigReloader.cpp\ + CmdOption.cpp\ + ConfigError.cpp\ + ConfigGroup.cpp\ + ConfigUnit.cpp\ + Configure.cpp\ + constraint/Constraint.cpp\ + constraint/ConstraintFunction.cpp\ + constraint/cc_default.cpp\ + reader/RawData.cpp\ + reader/Reader.cpp\ + utils/init.cpp\ + utils/trans.cpp\ + cfgext.cpp\ + cfgflag.cpp\ + compiler/src/idl.c\ + compiler/src/idl_lex.c\ + compiler/src/idl_gram.c\ + +target(config) +{ +TEMPLATE = lib +CXXFLAGS += -Woverloaded-virtual +all(output) { +SHELL=mkdir -p output output/lib output/include output/include/utils output/include/constraint +SHELL+=cp -rf *.h output/include/ +SHELL+=cp -rf utils/*.h output/include/utils/ +SHELL+=cp -rf constraint/*.h output/include/constraint/ +SHELL+=cp -rf compiler/src/idl_conf_if.h output/include/ +SHELL+=cp libconfig.a output/lib +} +} + diff --git a/configure/constraint/Constraint.cpp b/configure/constraint/Constraint.cpp new file mode 100644 index 0000000000000000000000000000000000000000..70c9803e910360092b0e43312b6efa16c20632cf --- /dev/null +++ b/configure/constraint/Constraint.cpp @@ -0,0 +1,374 @@ +/*************************************************************************** + * + * Copyright (c) 2008 Baidu.com, Inc. All Rights Reserved + * $Id: Constraint.cpp,v 1.14 2009/11/10 04:50:30 scmpf Exp $ + * + **************************************************************************/ + + + +/** + * @file Constraint.cpp + * @author yingxiang(com@baidu.com) + * @date 2008/12/28 21:17:07 + * @version $Revision: 1.14 $ + * @brief + * + **/ +#include +#include "Constraint.h" +#include "ConstraintFunction.h" +#include "utils/cc_utils.h" +#include "idl_conf_if.h" + +#define ARRAY_FUNC "array" +#define CONSTRAINT_FUNC "constraint" +namespace comcfg{ + static const str_t baseType[] = { + CC_CHAR, + CC_UCHAR, + CC_INT16, + CC_UINT16, + CC_INT32, + CC_UINT32, + CC_INT64, + CC_UINT64, + CC_FLOAT, + CC_DOUBLE, + CC_STRING + }; + static std::set baseSet(baseType, baseType + (sizeof(baseType)/sizeof(baseType[0]))); + + //also used by other *.cpp + //like : cfgext.cpp + bool isBaseType(const str_t & s){ + return baseSet.find(s) != baseSet.end(); + } + + //约束函数需要有序执行,这个是比较函数 + class CF_cmp_t{ + public: + int operator()(const confIDL::cons_func_t * a, const confIDL::cons_func_t * b)const{ + return ConstraintLibrary :: getLevel_static(a->func.data) < + ConstraintLibrary :: getLevel_static(b->func.data); + } + }; + + str_t showIDLMsg(const confIDL::meta_t& meta){ + str_t s; + s.appendf("[File:%s Line:%d]=[%s]", meta.file.c_str(), meta.lineno, meta.data.c_str()); + return s; + } + + int Constraint :: printError(){ + if(idl == NULL){ + return -1; + } + LOG(WARNING) << " =========== We have error in Constraint file, see below ============"; + confIDL:: err_list_t :: iterator itr; + for(itr = idl->err_list.begin(); itr != idl->err_list.end(); ++itr){ + LOG(WARNING) << "Constraint Error : " << showIDLMsg((*itr)).c_str(); + } + return 0; + } + + int Constraint :: run(confIDL::idl_t * __idl, Configure * __conf){ + idl = __idl; + conf = __conf; + + if(idl == NULL || conf == NULL){ + return -1; + } + if(idl->retval != 0){ + printError(); + return -1; + } + + confIDL:: var_list_t :: iterator itr; + //=== init === + //排序,保证约束函数有序执行 + for(itr = idl->rc_var_list.begin(); itr != idl->rc_var_list.end(); ++itr){ + (*itr)->cf_list.sort(CF_cmp_t()); + } + + //check all variables + int result = 0; + for(itr = idl->var_list.begin(); itr != idl->var_list.end(); ++itr){ + try{ + if( runVar(*itr, conf) != 0 ){ + throw ConfigException(); + } + } + catch(...){ + result = -1; + } + } + return result; + } + + int Constraint :: runVar(confIDL::var_t* var, ConfigGroup * father, ConfigUnit * self){ + int ret = 0; + + //constraint()约束,重新约束 + confIDL :: cf_map_t :: iterator cfitr = var->cf_map.find(str_t(CONSTRAINT_FUNC)); + if(cfitr != var->cf_map.end() && cfitr->second->arg_vec.size() > 0 ){ + LOG(INFO) << "Re-constraint " << showIDLMsg(var->name).c_str() << " to " << cfitr->second->arg_vec[0]->data.c_str(); + var->type.data = cfitr->second->arg_vec[0]->data; + } + confIDL:: cf_list_t :: const_iterator itr = var->cf_list.begin(); + str_t plog; + for(itr = var->cf_list.begin(); itr != var->cf_list.end(); ++itr){ + plog.append((*itr)->func.data).append("();"); + } + LOG(INFO) << "Config : var[" << showIDLMsg(var->name).c_str() << "], func[" << plog.c_str() << "]"; + for(itr=var->cf_list.begin(); itr != var->cf_list.end(); ++itr){ + if( (*itr)->func.data == str_t(ARRAY_FUNC)){ + try{ + LOG(INFO) << "Pre-process array constraint : " << showIDLMsg(var->name).c_str(); + ret = ConstraintLibrary :: getInstance() -> check(*(*itr), *var, father, self); + }catch(ConfigException){ + //... + LOG(WARNING) << "Pre-process Array error..."; + return -1; + } + if(ret){ + return ret; + } + break; + } + } +#if 1 + const ConfigUnit & myref = (self == NULL) ? (*father)[var->name.data] : *self; + //array + if(myref.selfType() == CONFIG_ARRAY_TYPE){ + const ConfigUnit & arr = myref; + LOG(INFO) << "Constraint : check array elements[" << arr.size() << "]"; + confIDL::var_t xvar = *var; + if(xvar.cf_map.find(str_t(ARRAY_FUNC)) == xvar.cf_map.end()){ + LOG(WARNING) << "Constraint : " << arr[0].info().c_str() << " should not be array! " << showIDLMsg(xvar.name).c_str(); + return -1; + } + xvar.cf_map.erase(str_t(ARRAY_FUNC)); + //xvar.cf_list.erase(xvar.cf_list.begin());//第一个一定是array + for(confIDL::cf_list_t::iterator arritr = xvar.cf_list.begin(); arritr != xvar.cf_list.end(); ++arritr){ + if((*arritr)->func.data == str_t(ARRAY_FUNC)){ + xvar.cf_list.erase(arritr); + break; + } + } + for(int i = 0; i < (int)arr.size(); ++i){ + ConfigUnit * unit = const_cast(&arr[i]); + try{ + if( runVar(&xvar, NULL, unit) != 0 ){ + ret = -1; + } + }catch(...){ + LOG(WARNING) << "Constaint : invalid value " << unit->info().c_str() << " : " << showIDLMsg(xvar.name).c_str(); + ret = -1; + } + } + } +#endif + else { + if( isBaseType(var->type.data) ){ + ret = runKey(var, father, self); + } + else{ + ret = runGroup(var, father, self); + } + } + return ret; + } + + int Constraint :: runGroup(confIDL::var_t* var, ConfigGroup * father, ConfigUnit * self){ + LOG(INFO) << "Constaint : working as group : " << showIDLMsg(var->name).c_str() << " [type:" << var->type.data.c_str() << "]"; +#if 0 + if(father != NULL){ + printf("----father----\n"); + father->print(); + } + if(self != NULL){ + printf("----self----\n"); + self->print(); + } +#endif + confIDL:: group_map_t :: iterator mpitr = idl->group_map.find(var->type.data); + int ret = 0; + if( mpitr == idl->group_map.end() ){ // No such type + LOG(WARNING) << "Constraint : error constraint type : " << showIDLMsg(var->type).c_str(); + throw ConfigException(); + } + else{ + //group + ConfigUnit * gunit; + if(father == NULL){ // is an element of array + LOG(INFO) << var->name.data.c_str() << " is one of group array"; + gunit = self; + } + else{ + gunit = const_cast (&((*father)[var->name.data])); + } + + if(gunit == NULL || gunit->selfType() == CONFIG_ERROR_TYPE){ + LOG(INFO) << "No such section in config : " << showIDLMsg(var->name).c_str() << ". try to create."; + gunit = new ConfigGroup(var->name.data.c_str(), father); + father->push(var->name.data, gunit); + } + if(gunit->selfType() != CONFIG_GROUP_TYPE){ + LOG(WARNING) << var->name.data.c_str() << " should be a Group type."; + return -1; + } + confIDL:: var_list_t :: iterator gitr; + for(gitr = mpitr->second->var_list.begin(); gitr != mpitr->second->var_list.end(); ++gitr){ + try{//run constraints for every fields of the group + if( runVar(*gitr, (ConfigGroup *)gunit, NULL) != 0){ + throw ConfigException(); + } + } + catch(...){ + ret = -1; + } + } + } + return ret; + } + + int Constraint :: runKey(confIDL::var_t* var, ConfigGroup * father, ConfigUnit * self){ + //run一开始有对约束函数排序,然后逐一执行 + LOG(INFO) << "Constaint : working as simple type : " << showIDLMsg(var->name).c_str(); +#if 0 + if(father != NULL){ + printf("----father----\n"); + father->print(); + } + if(self != NULL){ + printf("----self----\n"); + self->print(); + } +#endif + int ret = 0; + confIDL:: cf_list_t :: const_iterator itr; + for(itr = var->cf_list.begin(); itr != var->cf_list.end(); ++itr){ + if(var->cf_map.find((*itr)->func.data) == var->cf_map.end()){ + continue; + } + try{ + LOG(INFO) << "Constaint : " << (*itr)->func.data.c_str(); + ret = ConstraintLibrary :: getInstance() -> check(*(*itr), *var, father, self); + if(ret){ + return ret; + } + + ConfigUnit & gunit = const_cast((self == NULL) ? (*father)[var->name.data] : *self); + if(gunit.selfType() == CONFIG_UNIT_TYPE){ + gunit.setConstrainted(true); + } + }catch(ConfigException){ + const ConfigUnit *unit = self; + if(unit == NULL){ + unit = &(*father)[var->name.data]; + } + LOG(WARNING) << "Constaint : invalid value " << unit->info().c_str() << " : " << showIDLMsg(var->name).c_str(); + ret = -1; + } + catch(...){ + LOG(WARNING) << "Constaint : Unknown exception"; + ret = -1; + } + + } + if(ret){ + return ret; + } + const ConfigUnit *unit = self; + if(unit == NULL){ + unit = &(*father)[var->name.data]; + } + ret = runType(var->type.data, *unit); + if(ret){ + LOG(WARNING) << "Constaint : Value is not a valid [" << var->type.data.c_str() << "]type " << unit->info().c_str() << " : " << showIDLMsg(var->name).c_str(); + } + return ret; + } + + + int Constraint :: runType(const str_t& type, const ConfigUnit & unit){ + try{ + if(strcmp(type.c_str(), CC_CHAR) == 0){ + unit.to_char(); + return 0; + } + + if(strcmp(type.c_str(), CC_UCHAR) == 0){ + unit.to_uchar(); + return 0; + } + + if(strcmp(type.c_str(), CC_INT16) == 0){ + unit.to_int16(); + return 0; + } + + if(strcmp(type.c_str(), CC_UINT16) == 0){ + unit.to_uint16(); + return 0; + } + + if(strcmp(type.c_str(), CC_INT32) == 0){ + unit.to_int32(); + return 0; + } + + if(strcmp(type.c_str(), CC_UINT32) == 0){ + unit.to_uint32(); + return 0; + } + + if(strcmp(type.c_str(), CC_INT64) == 0){ + unit.to_int64(); + return 0; + } + + if(strcmp(type.c_str(), CC_UINT64) == 0){ + unit.to_uint64(); + return 0; + } + + if(strcmp(type.c_str(), CC_FLOAT) == 0){ + unit.to_float(); + return 0; + } + + if(strcmp(type.c_str(), CC_DOUBLE) == 0){ + unit.to_double(); + return 0; + } + + if(strcmp(type.c_str(), CC_STRING) == 0){ + unit.to_bsl_string(); + return 0; + } + } + catch(...){ + return -1; + } + return -1; + } +} + + + + + + + + + + + + + + + + +/* vim: set ts=4 sw=4 sts=4 tw=100 */ diff --git a/configure/constraint/Constraint.h b/configure/constraint/Constraint.h new file mode 100644 index 0000000000000000000000000000000000000000..596e4442a8375daaba9e522cbf204768c240f0a1 --- /dev/null +++ b/configure/constraint/Constraint.h @@ -0,0 +1,69 @@ +/*************************************************************************** + * + * Copyright (c) 2008 Baidu.com, Inc. All Rights Reserved + * $Id: Constraint.h,v 1.7 2009/02/27 10:14:00 yingxiang Exp $ + * + **************************************************************************/ + + + +/** + * @file Constraint.h + * @author yingxiang(com@baidu.com) + * @date 2008/12/28 20:35:35 + * @version $Revision: 1.7 $ + * @brief + * + **/ + + +#ifndef __CONSTRAINT_H_ +#define __CONSTRAINT_H_ + +#include "Configure.h" +#include "ConstraintFunction.h" + +namespace comcfg{ + class Constraint{ + public: + /** + * @brief 检查约束信息 + * + * @param [in] __idl : confIDL::idl_t* 约束信息 + * @param [in/out] __conf : Configure* 配置信息 + * @return int + * @retval + * @see + * @author yingxiang + * @date 2008/12/29 01:40:40 + **/ + int run(confIDL::idl_t * __idl, Configure * __conf); + protected: + int printError(); + int runGroup(confIDL::var_t* var, ConfigGroup * father, ConfigUnit * self = NULL); + int runKey(confIDL::var_t* var, ConfigGroup * father, ConfigUnit * self = NULL); + int runVar(confIDL::var_t* var, ConfigGroup * father, ConfigUnit * self = NULL); + int runType(const str_t& type, const ConfigUnit & unit); + Configure * conf; + confIDL::idl_t * idl; + }; +} + + + + + + + + + + + + + + + + +#endif //__CONSTRAINT_H_ + +/* vim: set ts=4 sw=4 sts=4 tw=100 */ diff --git a/configure/constraint/ConstraintFunction.cpp b/configure/constraint/ConstraintFunction.cpp new file mode 100644 index 0000000000000000000000000000000000000000..c512ae9a900cc3518409c2168506c1f0b88a3215 --- /dev/null +++ b/configure/constraint/ConstraintFunction.cpp @@ -0,0 +1,194 @@ +/*************************************************************************** + * + * Copyright (c) 2008 Baidu.com, Inc. All Rights Reserved + * $Id: ConstraintFunction.cpp,v 1.7 2010/01/08 03:24:38 scmpf Exp $ + * + **************************************************************************/ + + + +/** + * @file ConstraintFunction.cpp + * @author yingxiang(com@baidu.com) + * @date 2008/12/28 23:17:51 + * @version $Revision: 1.7 $ + * @brief + * + **/ + +#include "ConstraintFunction.h" +#include "cc_default.h" + +static const int hashmap_bitems = 256; + +namespace comcfg{ + class ConsUnitControl { + private: + static int _needfree; + public: + ConsUnitControl() { + ConfigUnit :: get_err_unit(); + } + ~ConsUnitControl() { + if (_needfree) { + _needfree =0; + ConstraintLibrary* cu = ConstraintLibrary :: getInstance(); + delete cu; + } + } + }; + int ConsUnitControl::_needfree = 1; + + static ConsUnitControl cons_unit_control; + + + + ConstraintLibrary * ConstraintLibrary :: lib = NULL; + + //=======ConstraintFunction Methods + int ConstraintFunction :: check(const confIDL::cons_func_t&, const confIDL::var_t &, ConfigGroup*, ConfigUnit*){ + LOG(WARNING) << "Unknown function : calling virtual method"; + return 0; + }; + + void ConstraintFunction :: setLevel(int lv){ + _level = lv; + } + int ConstraintFunction :: getLevel(){ + return _level; + } + + //=======ConstraintLibrary Methods + ConstraintLibrary :: ConstraintLibrary(){ + cfMap.create(hashmap_bitems); + registConstraint(str_t("comment"), CFdefault :: cons_do_nothing, CF_VALUE); + registConstraint(str_t("array"), CFdefault :: cons_array, CF_STRUCT); + registConstraint(str_t("default"), CFdefault :: cons_default, CF_KEY); + registConstraint(str_t("ip"), CFdefault :: cons_ip, CF_VALUE); + registConstraint(str_t("length"), CFdefault :: cons_length, CF_VALUE); + registConstraint(str_t("regexp"), CFdefault :: cons_regexp, CF_VALUE); + registConstraint(str_t("enum"), CFdefault :: cons_enum, CF_VALUE); + registConstraint(str_t("range"), CFdefault :: cons_range, CF_VALUE); + }; + ConstraintLibrary :: ~ConstraintLibrary(){ + CFMAP_T::iterator itr; + for(itr = cfMap.begin(); itr != cfMap.end(); ++itr) { + if (NULL != itr->second) { + delete itr->second; + } + } + cfMap.destroy(); + } + ConstraintLibrary* ConstraintLibrary :: getInstance(){ + if(lib == NULL){ + lib = new ConstraintLibrary(); + } + return lib; + } + void ConstraintLibrary :: destroyInstance(){ + if(lib != NULL){ + delete lib; + lib = NULL; + } + } + int ConstraintLibrary :: getLevel(const str_t& function){ + CFMAP_T::_Pair * ptr = cfMap.find(function); + if(NULL != ptr && NULL != ptr->second){ + return ptr->second->getLevel(); + } + return CF_DEFAULT; + } + int ConstraintLibrary :: getLevel_static(const str_t& function){ + return getInstance() -> getLevel(function); + } + int ConstraintLibrary :: check(const confIDL::cons_func_t& func, + const confIDL::var_t& param, ConfigGroup* father, ConfigUnit * self){ + CFMAP_T::_Pair * ptr = cfMap.find(func.func.data); + if(NULL != ptr && NULL != ptr->second){ + return ptr->second->check(func, param, father, self); + } + LOG(WARNING) << "Unknown function : [File:" << func.func.file.c_str() << ", Line:" << func.func.lineno << "]=[" << func.func.data.c_str() << "]"; + return -1; + } + + int ConstraintLibrary :: checkGlobalConstraint(ConfigUnit *conf) + { + GCFLIST_T :: iterator itr = _gcfList.begin(); + for(; itr != _gcfList.end(); ++itr){ + if(itr->type() == typeid(GlobalConsFun)){ + GlobalConsFun *gcf = gcf_any_cast >(&*itr); + LOG(INFO) << "Now checking with global constraint function: " << gcf->_name.c_str() << "()"; + if(0 != gcf->_gcf(gcf->_arg, conf)){ + return -1; + } + } + else if(itr->type() == typeid(GlobalConsFun)){ + GlobalConsFun *gcf = gcf_any_cast >(&*itr); + LOG(INFO) << "Now checking with global constraint function: " << gcf->_name.c_str() << "()"; + if(0 != gcf->_gcf(gcf->_arg, conf)){ + return -1; + } + } + else if(itr->type() == typeid(GlobalConsFun)){ + GlobalConsFun *gcf = gcf_any_cast >(&*itr); + LOG(INFO) << "Now checking with global constraint function: " << gcf->_name.c_str() << "()"; + if(0 != gcf->_gcf(gcf->_arg, conf)){ + return -1; + } + } + else if(itr->type() == typeid(GlobalConsFun)){ + GlobalConsFun *gcf = gcf_any_cast >(&*itr); + LOG(INFO) << "Now checking with global constraint function: " << gcf->_name.c_str() << "()"; + if(0 != gcf->_gcf(gcf->_arg, conf)){ + return -1; + } + } + else{ + LOG(WARNING) << "An unrecognizable global constraint function is set."; + return -1; + } + } + return 0; + } + + int ConstraintLibrary :: registConstraint(const str_t& fname, ConstraintFunction* cons, bool overwrite) + { + CFMAP_T::_Pair * ptr = cfMap.find(fname); + if(false == overwrite && NULL != ptr){ + return -1; + } + if(NULL != ptr && NULL != ptr->second) { + delete ptr->second; + } + cfMap.set(fname,cons,1); + return 0; + } + + int ConstraintLibrary :: registConstraint(const str_t& fname, CF_T cf, int cfLevel, bool overwrite){ + WrapFunction * wf = new WrapFunction(); + wf->setCF(cf); + wf->setLevel(cfLevel); + return registConstraint(fname, wf, overwrite); + } + +} + + + + + + + + + + + + + + + + + + + +/* vim: set ts=4 sw=4 sts=4 tw=100 */ diff --git a/configure/constraint/ConstraintFunction.h b/configure/constraint/ConstraintFunction.h new file mode 100644 index 0000000000000000000000000000000000000000..7357524ef8ec024e7ecf06faead74b64486f2e1f --- /dev/null +++ b/configure/constraint/ConstraintFunction.h @@ -0,0 +1,253 @@ +/*************************************************************************** + * + * Copyright (c) 2008 Baidu.com, Inc. All Rights Reserved + * $Id: ConstraintFunction.h,v 1.9 2010/01/08 03:24:38 scmpf Exp $ + * + **************************************************************************/ + + + +/** + * @file ConstraintFunction.h + * @author yingxiang(com@baidu.com) + * @date 2008/12/10 18:15:58 + * @version $Revision: 1.9 $ + * @brief + * + **/ + + +#ifndef __CONSTRAINTFUNCTION_H_ +#define __CONSTRAINTFUNCTION_H_ + +#include +#include +#include +#include "Configure.h" +#include "ConfigGroup.h" +#include "ConfigUnit.h" +#include "GlobalConsFun.h" + +namespace confIDL{ + struct cons_func_t; + struct var_t; + struct idl_t; +} + +namespace comcfg{ + //typedef std::string str_t; + typedef std::list param_list_t; + + //Constraint function pointer + typedef int (* CF_T)(const confIDL::cons_func_t&, const confIDL::var_t &, ConfigGroup *, ConfigUnit*); + + enum CFLevel{ + CF_STRUCT = 0, //最高级别的约束,必须最早执行,如array,约束某个字段的类型 + CF_KEY, //字段约束,如default,约束某个字段的基本情况 + CF_TYPE, //类型约束,int16, int32, int64...,也是一种值的约束(CF_VALUE) + CF_VALUE, //普通级别的约束,如ip(), length()等,约束某个字段值的内容 + CF_DEFAULT, + }; + + class ConstraintFunction{ + int _level; + public: + virtual int check(const confIDL::cons_func_t&, const confIDL::var_t &, ConfigGroup*, ConfigUnit*); + void setLevel(int lv); + int getLevel(); + virtual ~ConstraintFunction(); + }; + typedef bsl::hashmap CFMAP_T; + + //Constraint Library is Singleton + class ConstraintLibrary{ + ConstraintLibrary(); + ~ConstraintLibrary(); + + static ConstraintLibrary * lib; + public: + /** + * @brief 获取Library的实例 + * @note 该实例在用户程序的整个生命周期都存在 + * 【用户不用关心本接口】 + * @return ConstraintLibrary* + * @retval + * @see + * @author yingxiang + * @date 2008/12/28 23:26:14 + **/ + static ConstraintLibrary* getInstance(); + /** + * @brief 删除Library的实例,回收内存 + * @note 在不再需要该实例,或者需要重新生成实例时,先删除原有实例 + * @return + * @retval + * @see + * @author linjieqiong + * @date 2013/01/22 16:26:14 + **/ + static void destroyInstance(); + /** + * @brief 获取某个函数的级别,对不存在的函数返回default + * 【用户不用关心本接口】 + * + * @param [in] function : const str_t& + * @return int + * @retval + * @see + * @author yingxiang + * @date 2008/12/28 23:26:28 + **/ + int getLevel(const str_t& function); + static int getLevel_static(const str_t& function); + /** + * @brief 根据函数检查一个内容 + * 内容以父节点的形式传入(因为被检查的字段不一定存在,如default就是在父节点下新建子结点) + * 【用户不用关心本接口】 + * + * @param [in] function : const str_t& 约束函数名 + * @param [in] : const confIDL::var_t& 约束信息 + * @param [in] : ConfigGroup * 传入的父节点 + * @return int + * @retval + * @see + * @author yingxiang + * @date 2008/12/28 23:26:42 + **/ + int check(const confIDL::cons_func_t&, const confIDL::var_t &, ConfigGroup*, ConfigUnit*); + + /** + * @brief 使用用户注册的全局约束函数检查所有key-value配置项, + * 默认将该key-value标记为被约束的,即如果进行了全局约束检查,则所有项都是被约束的 + * 用户不用关心本接口 + * + * @param [in] conf : ConfigUnit * 读入配置文件后建立的configure结构的根 + * @return int : 0, 所有key-value均满足约束,其他,不满足约束或其他错误发生 + * @retval + * @see + * @author linjieqiong + * @date 2013/01/15 23:29:50 + **/ + int checkGlobalConstraint(ConfigUnit *conf); + + /** + * @brief 注册一个约束函数 【用于用户的扩展】 + * + * @param [in] fname : const str_t& 约束函数的名字 + * @param [in] cons : const ConstraintFunction& 约束函数实体,相当于仿函数 + * 【注意】请new出来再传进去,然后ConstraintLibrary会delete之 + * @param [in] overwrite : bool 是否覆盖同名的函数 + * @return int + * @retval + * @see + * @author yingxiang + * @date 2008/12/28 23:29:50 + **/ + int registConstraint(const str_t& fname, ConstraintFunction* cons, bool overwrite = false); + + int registConstraint(const str_t& fname, CF_T cf, bool overwrite = false){ + return registConstraint(fname, cf, CF_VALUE, overwrite); + } + + /** + * @brief 注册一个全局约束函数 【用于用户的扩展】 + * + * @param [in] fname : const str_t& 约束函数的名字 + * @param [in] gcf_t : int (*gcf_t)(const std::vector &, ConfigUnit *) 约束函数的函数指针 + * @param [in] arg_vec : const std::vector & 约束函数的参数 + * @return int + * @retval + * @see + * @author linjieqiong + * @date 2013/01/15 10:00:00 + **/ + template + int registGlobalConstraint(const str_t& fname, + int (*gcf_t)(const std::vector &, ConfigUnit *), + const std::vector &arg_vec) + { + GlobalConsFun gFun(fname, gcf_t, arg_vec); + return registGlobalConstraint(gFun); + } + + /** + * @brief 注册一个全局约束函数 【用于用户的扩展】 + * 带可变参数的函数的调用一定要慎重,尽量确保传入参数类型正确 + * + * @param [in] fname : const str_t& 约束函数的名字 + * @param [in] gcf_t : int (*gcf_t)(const std::vector &, ConfigUnit *) 约束函数的函数指针 + * @param [in] argnum : size_t 约束函数的参数个数 + * @param [in] ... : 可变参数,表示每一个约束参数 + * @return int + * @retval + * @see + * @author linjieqiong + * @date 2013/01/15 10:00:00 + **/ + template + int registGlobalConstraint(const str_t& fname, + int (*gcf_t)(const std::vector &, ConfigUnit *), + size_t argnum, ...) + { + std::vector arg_vec; + va_list argp; + va_start(argp, argnum); + while(argnum > 0) + { + T arg = va_arg(argp, T); + arg_vec.push_back(arg); + -- argnum; + } + va_end(argp); + + return registGlobalConstraint(fname, gcf_t, arg_vec); + } + + + /** + * @brief 注册一个全局约束函数 【用于用户的扩展】 + * + * @param [in] GlobalConsFun: 该全局约束函数的描述信息 + * @return int + * @retval + * @see + * @author linjieqiong + * @date 2013/01/15 10:00:00 + **/ + template + int registGlobalConstraint(const GlobalConsFun& gFun) + { + _gcfList.push_back(gFun); + return 0; + } + + private: + friend class Constraint; + friend class ConsUnitControl; + int registConstraint(const str_t& fname, CF_T cf, int cfLevel, bool overwrite = false); + protected: + GCFLIST_T _gcfList; + CFMAP_T cfMap; + class WrapFunction : public ConstraintFunction{ + public: + virtual int check(const confIDL::cons_func_t& cons, + const confIDL::var_t& param, ConfigGroup* father, ConfigUnit* self){ + return _cf(cons, param, father, self); + } + void setCF(CF_T cf){ + _cf = cf; + } + WrapFunction(){} + virtual ~WrapFunction(); + protected: + CF_T _cf; + }; + }; +} + + + + +#endif //__CONSTRAINTFUNCTION_H_ + +/* vim: set ts=4 sw=4 sts=4 tw=100 */ diff --git a/configure/constraint/GlobalConsFun.h b/configure/constraint/GlobalConsFun.h new file mode 100644 index 0000000000000000000000000000000000000000..3f4d46a2d40344f4f978b107cb905390df69a649 --- /dev/null +++ b/configure/constraint/GlobalConsFun.h @@ -0,0 +1,104 @@ +/*************************************************************************** + * + * Copyright (c) 2013 Baidu.com, Inc. All Rights Reserved + * $Id: GlobalConsFun.h,v 1.6 2013/01/16 11:14:52 linjieqiong Exp $ + * + **************************************************************************/ + + + +/** + * @file GlobalConsFun.h + * @author linjieqiong(sat@baidu.com) + * @date 2013/01/16 01:04:16 + * @version $Revision: 1.6 $ + * @brief global constraint function framework + * + **/ + + +#ifndef __GLOBALCONSFUN_H_ +#define __GLOBALCONSFUN_H_ + +#include +#include +#include + +namespace comcfg{ + //脙猫脢枚脪禄赂枚脠芦戮脰脭录脢酶潞炉脢媒碌脛陆谩鹿鹿脤氓拢卢掳眉脌篓拢潞潞炉脢媒脙没拢卢碌脴脰路潞脥虏脦脢媒脕脨卤铆 + //陆谩鹿鹿脤氓脢脟脛拢掳氓拢卢脢碌脌媒禄炉潞贸脢么脫脷虏禄脥卢卤盲脕驴脌脿脨脥 + template + struct GlobalConsFun{ + typedef int (* GCF_T)(const std::vector &arg_vec, ConfigUnit *); + GlobalConsFun() : _gcf(NULL){} + GlobalConsFun(const str_t & name, const GCF_T & gcf) + : _name(name), _gcf(gcf){} + GlobalConsFun(const str_t & name, const GCF_T & gcf, const std::vector & arg) + : _name(name), _gcf(gcf), _arg(arg){} + + str_t _name; + GCF_T _gcf; + std::vector _arg; + }; + + //陆芦脡脧脙忙虏禄脥卢脌脿脨脥碌脛陆谩鹿鹿脤氓掳眉脳掳鲁脡any露脭脧贸拢卢脪脭卤茫脫脷麓忙路脜脭脷list陆谩鹿鹿脰脨拢卢脢碌脧脰路陆路篓虏脦脮脮boost::any + class gcf_any{ + public: + class gcf_placeholder; + template + gcf_any(const ValueType &value) + : content(new gcf_holder(value)){} + gcf_any(const gcf_any & other) + : content(other.content ? other.content->clone() : 0){} + ~gcf_any() + { + delete content; + } + const std::type_info & type()const + { + return content ? content->type() : typeid(void); + } + + class gcf_placeholder + { + public: + virtual ~gcf_placeholder(){} + virtual const std::type_info &type()const = 0; + virtual gcf_placeholder * clone()const = 0; + }; + + template + class gcf_holder : public gcf_placeholder + { + public: + gcf_holder(const ValueType &value) : held(value){} + virtual const std::type_info &type()const + { + return typeid(ValueType); + } + virtual gcf_placeholder * clone()const + { + return new gcf_holder(held); + } + + ValueType held; + }; + + private: + template + friend ValueType * gcf_any_cast(gcf_any *); + + gcf_placeholder *content; + }; + + template + ValueType * gcf_any_cast(gcf_any * operand) + { + return operand && operand->type() == typeid(ValueType) + ? &static_cast *>(operand->content)->held : 0; + } + + typedef std::list GCFLIST_T; +} + +#endif diff --git a/configure/constraint/cc_default.cpp b/configure/constraint/cc_default.cpp new file mode 100644 index 0000000000000000000000000000000000000000..f73a3c994c19675fed38aa0b46bca40ac6d2946c --- /dev/null +++ b/configure/constraint/cc_default.cpp @@ -0,0 +1,443 @@ +/*************************************************************************** + * + * Copyright (c) 2008 Baidu.com, Inc. All Rights Reserved + * $Id: cc_default.cpp,v 1.13 2009/11/10 04:50:30 scmpf Exp $ + * + **************************************************************************/ + + + +/** + * @file cc_default.cpp + * @author yingxiang(com@baidu.com) + * @date 2008/12/29 01:43:14 + * @version $Revision: 1.13 $ + * @brief + * + **/ + +#include "cc_default.h" +#include "utils/cc_utils.h" +#include "Configure.h" +#include "ConfigUnit.h" +#include "ConfigGroup.h" +#include "ConfigArray.h" +#include "spreg.h" +namespace comcfg{ + + extern str_t showIDLMsg(const confIDL::meta_t& meta); + + int CFdefault :: cons_do_nothing(const confIDL::cons_func_t& /*func*/, const confIDL::var_t & /*var*/, ConfigGroup * /*father*/, ConfigUnit * /*self*/){ + return 0; + } + int CFdefault :: cons_array(const confIDL::cons_func_t& func, const confIDL::var_t & var, ConfigGroup * father, ConfigUnit * self){ + LOG(INFO) << "In constraint function array(), var is " << showIDLMsg(var.name).c_str(); + if(func.arg_list.size() > 1){ + LOG(WARNING) << "Constraint : Too many args for array(), in " << showIDLMsg(var.name).c_str(); + return -1; + } + const ConfigUnit * unit = self; + if(unit == NULL){ + unit = & (*father)[var.name.data]; + } + if(unit->selfType() == CONFIG_ERROR_TYPE){ + if(father == NULL){ + LOG(WARNING) << "Constraint : Unknown error in array(). " << showIDLMsg(var.name).c_str(); + return -1; + } + father->push(var.name.data, new ConfigArray(var.name.data.c_str(), father)); + LOG(INFO) << "Constraint : create array, in " << showIDLMsg(var.name).c_str(); + } + else if(unit->selfType() != CONFIG_ARRAY_TYPE){ + LOG(WARNING) << "Constraint : variable exists but is not array. " << showIDLMsg(var.name).c_str(); + return -1; + } + else{ + if(func.arg_list.size() == 0){ + return 0; + } + unsigned long long asize; + if(Trans::str2uint64(func.arg_vec[0]->data, &asize) != 0 ){ + LOG(WARNING) << "Constraint : array size is invalid. Ignored! " << showIDLMsg(var.name).c_str(); + return -1; + } + else{ + if(asize == 0){ + return 0; + } + if(asize < unit->size()){ + LOG(WARNING) << "Constraint : array has too many elements! " << showIDLMsg(var.name).c_str() << " [MaxSize=" << asize << "][We have " << unit->size() << " elements]"; + return -1; + } + } + } + return 0; + } + + int CFdefault :: cons_default(const confIDL::cons_func_t& func, const confIDL::var_t & var, ConfigGroup * father, ConfigUnit * self){ + LOG(INFO) << "In constraint function default(), var is " << showIDLMsg(var.name).c_str(); + if(func.arg_list.size() != 1){ + LOG(WARNING) << "Constraint : wrong args for default(), in " << showIDLMsg(var.name).c_str(); + return -1; + } + const ConfigUnit * unit = self; + if(unit == NULL){ + unit = & (*father)[var.name.data]; + } + if(unit->selfType() == CONFIG_ERROR_TYPE){ + if(father == NULL){ + LOG(WARNING) << "Constraint : Unknown error in default(). " << showIDLMsg(var.name).c_str(); + return -1; + } + father->push(var.name.data, new ConfigUnit(var.name.data.c_str(), func.arg_vec[0]->data, NULL, father)); + LOG(INFO) << "Constraint : create default key, use " << showIDLMsg(var.name).c_str(); + return 0; + } + return 0; + } + + int CFdefault :: cons_length(const confIDL::cons_func_t& func, const confIDL::var_t & var, ConfigGroup * father, ConfigUnit * self){ + LOG(INFO) << "In constraint function length(), var is " << showIDLMsg(var.name).c_str(); + if(func.arg_list.size() != 1){ + LOG(WARNING) << "Constraint : wrong args for length(), in " << showIDLMsg(var.name).c_str(); + return -1; + } + unsigned long long asize; + if(Trans::str2uint64(func.arg_vec[0]->data, &asize) != 0 ){ + LOG(WARNING) << "Constraint : wrong args for length(). " << showIDLMsg(var.name).c_str(); + return -1; + } + const ConfigUnit * unit = self; + if(unit == NULL){ + unit = & (*father)[var.name.data]; + } + if(unit->selfType() == CONFIG_UNIT_TYPE){ + str_t ref = unit->to_bsl_string(); + if( ref.size() > asize){ + LOG(WARNING) << "Constraint : length() : value is too long. " << unit->info().c_str() << " : " << showIDLMsg(var.name).c_str(); + return -1; + } + } + return 0; + } + + int CFdefault :: cons_enum(const confIDL::cons_func_t& func, const confIDL::var_t & var, ConfigGroup * father, ConfigUnit * self){ + LOG(INFO) << "In constraint function enum(), var is " << showIDLMsg(var.name).c_str(); + const ConfigUnit * unit = self; + if(unit == NULL){ + unit = & (*father)[var.name.data]; + } + if(unit->selfType() == CONFIG_UNIT_TYPE){ + str_t str = unit->to_bsl_string(); + str_t buf; + for( int i = 0; i < (int)func.arg_vec.size(); ++i){ + //printf("ENUM: %s\n", func.arg_vec[i]->data.c_str()); + if( Trans::str2str(func.arg_vec[i]->data, &buf) != 0 ){ + buf = func.arg_vec[i]->data; + } + if(str == buf){ + return 0; + } + } + } + LOG(WARNING) << "Constraint : key not in enum. " << unit->info().c_str() << " : " << showIDLMsg(var.name).c_str(); + return -1; + } + + int CFdefault :: cons_regexp(const confIDL::cons_func_t& func, const confIDL::var_t & var, ConfigGroup * father, ConfigUnit * self){ + LOG(INFO) << "In constraint function regexp(), var is " << showIDLMsg(var.name).c_str(); + if(func.arg_list.size() != 1){ + LOG(WARNING) << "Constraint : wrong args for regexp(), in " << showIDLMsg(var.name).c_str(); + return -1; + } + char const * err; + str_t reg; + spreg_t *re; + int ret = Trans::str2str(func.arg_vec[0]->data, ®); + re = spreg_init(reg.c_str(), &err); + if(ret != 0 || err != NULL){ + LOG(WARNING) << "Constraint : wrong args for regexp(). " << showIDLMsg(var.name).c_str(); + return -1; // init failed, do not need to destroy spreg_t + } + + const ConfigUnit * unit = self; + if(unit == NULL){ + unit = & (*father)[var.name.data]; + } + if(unit->selfType() == CONFIG_UNIT_TYPE){ + str_t str = unit->to_bsl_string(); + if( spreg_match(re, str.c_str(), str.size()) > 0){ + ret = 0; + goto end; + } + else{ + LOG(WARNING) << "Constraint : key not match regexp(). " << unit->info().c_str() << " : " << showIDLMsg(var.name).c_str(); + ret = -1; + goto end; + } + } + ret = 0; +end: + spreg_destroy(re); + return ret; + } + + int CFdefault :: cons_range(const confIDL::cons_func_t& func, const confIDL::var_t & var, ConfigGroup * father, ConfigUnit * self){ + LOG(INFO) << "In constraint function range(), var is " << showIDLMsg(var.name).c_str() << ", type=" << var.type.data.c_str(); + if(func.arg_list.size() != 2){ + LOG(WARNING) << "Constraint : wrong args for range(), in " << showIDLMsg(var.name).c_str(); + return -1; + } + const ConfigUnit * unit = self; + if(unit == NULL){ + unit = & (*father)[var.name.data]; + } + if(unit->selfType() == CONFIG_UNIT_TYPE){ + if(var.type.data == CC_FLOAT || var.type.data == CC_DOUBLE){ + double val = unit->to_double(); + double buf1, buf2; + if( Trans::str2double(func.arg_vec[0]->data, &buf1) || + Trans::str2double(func.arg_vec[1]->data, &buf2)){ + LOG(WARNING) << "Constraint : wrong args in range(), in " << showIDLMsg(var.name).c_str(); + return -1; + } + if(val < buf1 || val > buf2){ + LOG(WARNING) << "Constraint : Key not in range(), in " << unit->info().c_str() << " : " << showIDLMsg(var.name).c_str(); + return -1; + } + } + else if(var.type.data == CC_UINT64){ + unsigned long long val = unit->to_uint64(); + unsigned long long buf1, buf2; + if( Trans::str2uint64(func.arg_vec[0]->data, &buf1) || + Trans::str2uint64(func.arg_vec[1]->data, &buf2)){ + LOG(WARNING) << "Constraint : wrong args in range(), in " << showIDLMsg(var.name).c_str(); + return -1; + } + if(val < buf1 || val > buf2){ + LOG(WARNING) << "Constraint : Key not in range(), in " << unit->info().c_str() << " : " << showIDLMsg(var.name).c_str(); + return -1; + } + } + else if(var.type.data == CC_STRING){ + LOG(WARNING) << "Constraint : wrong usage of range(), in " << showIDLMsg(var.name).c_str(); + return -1; + } + else{// use int64 is enough + long long val = unit->to_int64(); + long long buf1, buf2; + if( Trans::str2int64(func.arg_vec[0]->data, &buf1) || + Trans::str2int64(func.arg_vec[1]->data, &buf2)){ + LOG(WARNING) << "Constraint : wrong args in range(), in " << showIDLMsg(var.name).c_str(); + return -1; + } + if(val < buf1 || val > buf2){ + LOG(WARNING) << "Constraint : Key not in range(), in " << unit->info().c_str() << " : " << showIDLMsg(var.name).c_str(); + return -1; + } + } + } + return 0; + } + + + + //ip : ***.***.***.*** + //status: 0 1 2 3 4 5 6 7 + static bool check_ip(const str_t& str, int pos, int status, int val){ + if(status > 7){ + return false; + } + if(pos == (int)str.size()){ + return status == 7; + } + if(str[pos] == '.'){ + if(status % 2 == 0){ + LOG(WARNING) << "Unexpected '.' in ip [" << str.c_str() << "]"; + return false; + } + return check_ip(str, pos+1, status+1, 0); + } + else if (isdigit(str[pos])){ + if(status % 2 == 0){ + return check_ip(str, pos+1, status+1, str[pos] - '0'); + } + else{ + val = val * 10 + str[pos] - '0'; + if(val > 255) { + LOG(WARNING) << "Unexpected digits in ip [" << str.c_str() << "]"; + return false; + } + return check_ip(str, pos+1, status, val); + } + } + else{ + LOG(WARNING) << "Unexpected char '" <selfType() == CONFIG_UNIT_TYPE){ + str_t str = unit->to_bsl_string(); + if(check_ip(str, 0, 0, 0)){ + return 0; + } + LOG(WARNING) << "Constraint : Key is not ip(), in " << unit->info().c_str() << " : " << showIDLMsg(var.name).c_str(); + return -1; + } + return 0; + } + + int CFdefault :: gcons_regexp(const std::vector &arg_vec, ConfigUnit *conf) + { + int cb_check_regexp(ConfigUnit *, void *); + if(arg_vec.size() != 1){ + LOG(WARNING) << + "Constraint: wrong arg number " << arg_vec.size() << " for global constraint gcons_regexp(), 1 arg is required."; + return -1; + } + str_t reg = arg_vec[0]; + char const *err; + spreg_t *re = spreg_init(reg.c_str(), &err); + if(err != NULL){ + LOG(WARNING) << "Constraint: wrong args for gcons_regexp(): " << reg.c_str(); + return -1; + } + int ret = conf->traverse_unit(cb_check_regexp, &re); + spreg_destroy(re); + return ret; + } + + int CFdefault :: gcons_ip(const std::vector &arg_vec, ConfigUnit *conf) + { + int cb_check_ip(ConfigUnit *, void *); + if(arg_vec.size() != 0){ + LOG(WARNING) << + "Constraint: wrong arg number " << arg_vec.size() << " for global constraint gcons_ip(), no arg is required."; + return -1; + } + return conf->traverse_unit(cb_check_ip, NULL); + } + + int CFdefault :: gcons_length(const std::vector &arg_vec, ConfigUnit *conf) + { + std::vector long_vec(arg_vec.begin(), arg_vec.end()); + return gcons_length(long_vec, conf); + } + + int CFdefault :: gcons_length(const std::vector &arg_vec, ConfigUnit *conf) + { + int cb_check_length(ConfigUnit *, void *); + if(arg_vec.size() != 1){ + LOG(WARNING) << + "Constraint: wrong arg number " << arg_vec.size() << " for global constraint gcons_length(), 1 arg is required."; + return -1; + } + long long len_limit = arg_vec[0]; + return conf->traverse_unit(cb_check_length, &len_limit); + } + + int cb_check_regexp(ConfigUnit *unit, void *reg) + { + unit->setConstrainted(true); + if(unit->selfType() != CONFIG_UNIT_TYPE){ + return 0; + } + str_t str = unit->to_bsl_string(); + if(spreg_match(*(spreg_t **)reg, str.c_str(), str.size()) > 0){ + return 0; + } + int errcode = 0; + LOG(WARNING) << + "Constraint: gcons_regexp() [key : value]:[" << unit->get_key_name().c_str() << " : " << unit->to_cstr(&errcode, "ERROR") << "]: value does not match regexp."; + return -1; + } + + int cb_check_ip(ConfigUnit *unit, void *) + { + unit->setConstrainted(true); + if(unit->selfType() != CONFIG_UNIT_TYPE){ + return 0; + } + str_t str = unit->to_bsl_string(); + if(check_ip(str, 0, 0, 0)){ + return 0; + } + int errcode = 0; + LOG(WARNING) << + "Constraint: gcons_ip() [key : value]:[" << unit->get_key_name().c_str() << " : " << unit->to_cstr(&errcode, "ERROR") << "]: value is not an IP string."; + return -1; + } + + int cb_check_default(ConfigUnit *unit, void *def_value) + { + unit->setConstrainted(true); + if(unit->selfType() != CONFIG_UNIT_TYPE || !unit->to_bsl_string().empty()){ + return 0; + } + if(unit->set_value(*(str_t *)def_value) != 0){ + int errcode = 0; + LOG(WARNING) << + "Constraint: gcons_default() [key : value]:[" << unit->get_key_name().c_str() << " : " << unit->to_cstr(&errcode, "ERROR") << "]: value is illegal."; + return -1; + } + return 0; + } + + int cb_check_length(ConfigUnit *unit, void *limit) + { + unit->setConstrainted(true); + if(unit->selfType() == CONFIG_UNIT_TYPE + && (long long)(unit->to_bsl_string().size()) > *(long long*)(limit)){ + int errcode = 0; + LOG(WARNING) << + "Constraint: gcons_length() [key : value]:[" << unit->get_key_name().c_str() << " : " << unit->to_cstr(&errcode, "ERROR") << "]: value length exceeds limit."; + return -1; + } + return 0; + } + + int cb_check_enum(ConfigUnit *unit, void *enum_vec) + { + unit->setConstrainted(true); + if(unit->selfType() != CONFIG_UNIT_TYPE){ + return 0; + } + std::vector &vec = *(std::vector *)enum_vec; + for(size_t i=0; ito_bsl_string() == vec[i]){ + return 0; + } + } + int errcode = 0; + LOG(WARNING) << + "Constraint: gcons_enum() [key : value]:[" << unit->get_key_name().c_str() << " : " <to_cstr(&errcode, "ERROR") << "]: value not in enum."; + return -1; + } +} + + + + + + + + + + + + + + + +/* vim: set ts=4 sw=4 sts=4 tw=100 */ diff --git a/configure/constraint/cc_default.h b/configure/constraint/cc_default.h new file mode 100644 index 0000000000000000000000000000000000000000..033c21d89aa6de23350c3d33c3faac0ff103a429 --- /dev/null +++ b/configure/constraint/cc_default.h @@ -0,0 +1,163 @@ +/*************************************************************************** + * + * Copyright (c) 2008 Baidu.com, Inc. All Rights Reserved + * $Id: cc_default.h,v 1.6 2009/03/23 03:14:52 yingxiang Exp $ + * + **************************************************************************/ + + + +/** + * @file cc_default.h + * @author yingxiang(com@baidu.com) + * @date 2008/12/29 01:04:16 + * @version $Revision: 1.6 $ + * @brief + * + **/ + + +#ifndef __CC_DEFAULT_H_ +#define __CC_DEFAULT_H_ + +#include "Constraint.h" +#include "../compiler/src/idl_conf_if.h" +#include "ConstraintFunction.h" + +namespace comcfg{ + class CFdefault{ + public: + static int cons_array(const confIDL::cons_func_t&, const confIDL::var_t &, ConfigGroup *, ConfigUnit *); + static int cons_default(const confIDL::cons_func_t&, const confIDL::var_t &, ConfigGroup *, ConfigUnit *); + static int cons_length(const confIDL::cons_func_t&, const confIDL::var_t &, ConfigGroup *, ConfigUnit *); + static int cons_enum(const confIDL::cons_func_t&, const confIDL::var_t &, ConfigGroup *, ConfigUnit *); + static int cons_regexp(const confIDL::cons_func_t&, const confIDL::var_t &, ConfigGroup *, ConfigUnit *); + static int cons_range(const confIDL::cons_func_t&, const confIDL::var_t &, ConfigGroup *, ConfigUnit *); + static int cons_ip(const confIDL::cons_func_t&, const confIDL::var_t &, ConfigGroup *, ConfigUnit *); + static int cons_do_nothing(const confIDL::cons_func_t&, const confIDL::var_t &, ConfigGroup *, ConfigUnit *); + + static int gcons_regexp(const std::vector &arg_vec, ConfigUnit *conf); + static int gcons_ip(const std::vector &arg_vec, ConfigUnit *conf); + static int gcons_length(const std::vector &arg_vec, ConfigUnit *conf); + static int gcons_length(const std::vector &arg_vec, ConfigUnit *conf); + + template + static int gcons_default(const std::vector &arg_vec, ConfigUnit *conf) + { + int cb_check_default(ConfigUnit *, void *); + if(arg_vec.size() != 1){ + LOG(WARNING) << "Constraint: wrong arg number " << arg_vec.size() << " for global constraint gcons_default(), 1 arg is required."; + return -1; + } + str_t def_value; + if(typeid(T) == typeid(int)){ + def_value.setf("%d", *reinterpret_cast(&arg_vec[0])); + } + else if(typeid(T) == typeid(str_t)){ + def_value = *reinterpret_cast(&arg_vec[0]); + } + else if(typeid(T) == typeid(long long)){ + def_value.setf("%lld", *reinterpret_cast(&arg_vec[0])); + } + else if(typeid(T) == typeid(double)){ + def_value.setf("%lf", *reinterpret_cast(&arg_vec[0])); + } + return conf->traverse_unit(cb_check_default, &def_value); + } + + template + static int gcons_enum(const std::vector &arg_vec, ConfigUnit *conf) + { + int cb_check_enum(ConfigUnit *, void *); + std::vector enum_vec; + str_t enum_str; + if(typeid(T) == typeid(int)){ + for(size_t i=0; i(&arg_vec[i])); + enum_vec.push_back(enum_str); + } + } + else if(typeid(T) == typeid(str_t)){ + for(size_t i=0; i(&arg_vec[i])); + } + } + else if(typeid(T) == typeid(long long)){ + for(size_t i=0; i(&arg_vec[i])); + enum_vec.push_back(enum_str); + } + } + else if(typeid(T) == typeid(double)){ + for(size_t i=0; i(&arg_vec[i])); + enum_vec.push_back(enum_str); + } + } + if(arg_vec.size() == 0){ + LOG(WARNING) << "Constraint: wrong arg number 0 for global constraint gcons_enum(), at least 1 arg is required."; + return -1; + } + return conf->traverse_unit(cb_check_enum, &enum_vec); + } + + template + static int gcons_range(const std::vector &arg_vec, ConfigUnit *conf) + { + if(typeid(T) == typeid(str_t)){ + LOG(WARNING) << "Constraint: gcons_range() does not support str_t type constraint"; + return -1; + } + if(arg_vec.size() != 2){ + LOG(WARNING) << "Constraint: wrong arg number " << arg_vec.size() << " for global constraint gcons_range(), 2 args are required."; + return -1; + } + void *arg = &const_cast &>(arg_vec); + return conf->traverse_unit(cb_check_range, arg); + } + + template + static int cb_check_range(ConfigUnit *unit, void *range_vec) + { + unit->setConstrainted(true); + if(unit->selfType() != CONFIG_UNIT_TYPE){ + return 0; + } + std::vector &rvec = *static_cast *>(range_vec); + if(typeid(T) != typeid(double)){ + long long val = unit->to_int64(); + if(val >= rvec[0] && val <= rvec[1]){ + return 0; + } + } + else{ + double val = unit->to_double(); + if(val >= rvec[0] && val <= rvec[1]){ + return 0; + } + } + int errcode = 0; + LOG(WARNING) << "Constraint: gcons_range() [key : value]:[" << unit->get_key_name().c_str() << " : " << unit->to_cstr(&errcode, "ERROR") << "]: value not in range."; + return -1; + } + }; +} + + + + + + + + + + + + + + + + +#endif //__CC_DEFAULT_H_ + +/* vim: set ts=4 sw=4 sts=4 tw=100 */ diff --git a/configure/reader/RawData.cpp b/configure/reader/RawData.cpp new file mode 100644 index 0000000000000000000000000000000000000000..cf0458963034bfa35d48a2608ae08dec1ab2c265 --- /dev/null +++ b/configure/reader/RawData.cpp @@ -0,0 +1,201 @@ +/*************************************************************************** + * + * Copyright (c) 2008 Baidu.com, Inc. All Rights Reserved + * $Id: RawData.cpp,v 1.11 2010/01/08 03:24:38 scmpf Exp $ + * + **************************************************************************/ + + + +/** + * @file RawData.cpp + * @author yingxiang(com@baidu.com) + * @date 2008/12/21 20:49:06 + * @version $Revision: 1.11 $ + * @brief + * + **/ + +#include "RawData.h" +#include + +namespace comcfg{ + size_t RawData :: lineNum(){ + return _lnum; + } + + size_t RawData :: size(){ + return _fsize; + } + + const char * RawData :: getLine(int idx){ + if(idx < 0 || (size_t)idx >= lineNum()){ + return NULL; + } + return (const char *)(_file + _line[idx]); + } + + RawData :: RawData(){ + _file = NULL; + _file_original = NULL; + _lnum = 0; + _fsize = 0; + _bufsize = 0; + } + RawData :: ~RawData(){ + if(_file){ + free(_file); + } + if(_file_original){ + free(_file_original); + } + } + + int RawData :: load(const char * filename){ + LOG(INFO) << "Config : RawData read file [" << filename << "]"; + struct stat st; + if( stat(filename, &st) != 0 ){ + LOG(WARNING) << "I can't stat [" << filename << "]"; + return -1; + } + + int fd = open(filename, O_RDONLY); + if(-1 == fd){ + LOG(WARNING) << "I can't open [" << filename << "]"; + return -1; + } + if(_file){ + free(_file); + _file = NULL; + } + _fsize = (size_t)st.st_size; + _bufsize = ((_fsize >> 12) + 1) << 12;//以4K为单位上取整 + + _file = (char *)malloc(_bufsize); + if(NULL == _file){ + LOG(WARNING) << "malloc failed."; + close(fd); + return -1; + } + + if( read(fd, _file, _fsize) != (ssize_t)_fsize ){ + LOG(WARNING) << "Read file " << filename << " error..."; + free(_file); + _file = NULL; + close(fd); + return -1; + } + + close(fd); + return rebuild(); +#if 0 + _line.clear(); + + try{ + _file = (char *)malloc(_bufsize); + if(NULL == _file){ + ul_writelog(Log::warning(), "malloc failed...I can't load [%s]", filename); + throw ConfigException("Malloc failed"); + } + size_t cur_pos = 0; + + while(fgets(_file + cur_pos, _bufsize - cur_pos, fd) != NULL){ + _line.push_back(cur_pos); + cur_pos += strlen(_file + cur_pos); + if(cur_pos <= 0 || _file[cur_pos - 1] != '\n'){ + ul_writelog(Log::warning(), "Unrecognized end of line. file:[%s] line:[%d]", + filename, (int)_line.size()); + } + _file[cur_pos - 1] = '\0'; + } + _lnum = _line.size(); + _line.push_back(cur_pos); + _line.push_back(cur_pos);//保护 + if(cur_pos != size()){ + ul_writelog(Log::warning(), "[%s] file size = %llu bytes, But I only read = %llu bytes", + filename, (unsigned long long)size(), (unsigned long long)cur_pos); + } + + }catch(...){ + if(_file){ + free(_file); + _file = NULL; + } + _line.clear(); + _fsize = _bufsize = 0; + _lnum = 0; + return -1; + } + return 0; +#endif + } + + char * RawData :: getRebuildBuffer(size_t __size){ + if(_file){ + free(_file); + _file = NULL; + } + _line.clear(); + _lnum = 0; + _fsize = __size; + _bufsize = ((_fsize >> 12) + 1) << 12;//以4K为单位上取整 + _file = (char *)malloc(_bufsize); + return _file; + } + + int RawData :: rebuild(){ + if(_fsize == 0){ + LOG(WARNING) << "The rebuild buffer is empty."; + return -1; + } + if(_file_original != NULL){ + free(_file_original); + _file_original = NULL; + } + _file_original = (char *)malloc(_bufsize); + if(_file_original != NULL){ + memcpy(_file_original, _file, _bufsize); + } + else{ + LOG(INFO) << "Failed to create a copy of file."; + //so I can't dump it. But it's OK to go on. + } + _line.clear(); + _line.push_back(0); + for(size_t i = 0; i < _fsize; ++i){ + if(_file[i] == '\n' || _file[i] == '\r' || _file[i] == '\0'){ + _file[i] = '\0'; + _line.push_back(i+1); + } + } + _file[_fsize] = '\0'; + _lnum = _line.size(); + _line.push_back(_fsize);//多余的一行的位置,便于计算最后一行的长度 + return 0; + } + + char * RawData :: dump(size_t * __size){ + *__size = _fsize; + return _file_original; + } + +} + + + + + + + + + + + + + + + + + + +/* vim: set ts=4 sw=4 sts=4 tw=100 */ diff --git a/configure/reader/RawData.h b/configure/reader/RawData.h new file mode 100644 index 0000000000000000000000000000000000000000..24a8d9922c2e31bb4ecb448fd4bd44eb7c97b8b6 --- /dev/null +++ b/configure/reader/RawData.h @@ -0,0 +1,70 @@ +/*************************************************************************** + * + * Copyright (c) 2008 Baidu.com, Inc. All Rights Reserved + * $Id: RawData.h,v 1.4 2009/02/13 15:25:31 yingxiang Exp $ + * + **************************************************************************/ + + + +/** + * @file RawData.h + * @author yingxiang(com@baidu.com) + * @date 2008/12/18 22:52:32 + * @version $Revision: 1.4 $ + * @brief + * + **/ + + +#ifndef __RAWDATA_H_ +#define __RAWDATA_H_ + +#include +#include +#include +#include +#include "utils/cc_exception.h" +#include "butil/logging.h" + +namespace comcfg{ + class RawData{ + public: + + int load(const char * filename); + char * getRebuildBuffer(size_t size); + int rebuild(); + char * dump(size_t *); + size_t lineNum(); + size_t size(); + const char * getLine(int idx); + RawData(); + ~RawData(); + protected: + std::vector _line; + size_t _lnum; + char * _file; + char * _file_original; + size_t _fsize; + size_t _bufsize; + }; +} + + + + + + + + + + + + + + + + +#endif //__RAWDATA_H_ + +/* vim: set ts=4 sw=4 sts=4 tw=100 */ diff --git a/configure/reader/Reader.cpp b/configure/reader/Reader.cpp new file mode 100644 index 0000000000000000000000000000000000000000..972949128b8af5b3e104d339d6a8c18ebf812377 --- /dev/null +++ b/configure/reader/Reader.cpp @@ -0,0 +1,258 @@ +/*************************************************************************** + * + * Copyright (c) 2008 Baidu.com, Inc. All Rights Reserved + * $Id: Reader.cpp,v 1.8 2009/03/23 03:14:52 yingxiang Exp $ + * + **************************************************************************/ + + + +/** + * @file reader/Reader.cpp + * @author yingxiang(com@baidu.com) + * @date 2008/12/21 18:49:01 + * @version $Revision: 1.8 $ + * @brief + * + **/ + +#include +#include "utils/cc_utils.h" +#include "reader/Reader.h" + +namespace comcfg{ + Reader :: Reader(){ + _isRebuild = false; + } + + str_t get_middle(const str_t& str){ + int i, j; + if(str.size() == 0){ + return str; + } + for(i = 0; i < (int)str.size(); ++i){ + if(! isspace(str[i])){ + break; + } + } + for(j = (int)str.size() - 1; j >= 0; --j){ + if(! isspace(str[j])){ + break; + } + } + return str.substr(i, j+1-i); + } + + int Reader::read(const char * file, Configure * cfg){ + if( _fd.load(file) != 0 ){ + return -1; + } + _cur_file = file; + return build(cfg); + } + int Reader :: build(Configure *cfg){ + int ret = 0; + for(size_t i = 0; i < _fd.lineNum(); ++i){ + _cur_line = i+1; + cfg->setFileLine(_cur_line); + size_t length; + if(i != _fd.lineNum() - 1){ + length = (size_t)_fd.getLine(i+1) - (size_t)_fd.getLine(i); + } + else{ + length = (size_t)_fd.size() - (size_t)_fd.getLine(i); + } + if(push(cfg, _fd.getLine(i), length) != 0){ + LOG(WARNING) << "Error [File:" << _cur_file.c_str() << ", Line:" << i + 1 << "] " << _fd.getLine(i); + ret = -1; + } + } + _cur_line = -1; + return ret; + } + + int Reader::push(Configure * cfg, const char * buf, size_t length){ + const char *p = buf; + while(*p != 0 && isspace(*p)){ + ++p; + } + try{ + if(*p == '#' || *p == 0){ //is comment or blank line + return 0; + } + else if (*p == '['){ //must be section + str_t str; + if( sectionParser(p, length, &str) != 0 ){ + return -1; + } + LOG(INFO) << "Configure Reader: Change section to : [" << str.c_str() << "]"; + cfg->changeSection(str); + } + else{ // is config key-value pair + pair_t pair; + if( keyParser(p, length, &pair) != 0 ){ + return -1; + } + if(strcmp(pair.key.c_str(), CONFIG_INCLUDE) == 0){ + //$include : filename + //Sub Configure file + LOG(INFO) << "Configure Reader: read $include : " << pair.value.c_str(); + if(_isRebuild){ + LOG(INFO) << "Configure : I am rebuilding, $include is ignored."; + }else{ + str_t realfile; + Trans::str2str(pair.value, &realfile); + cfg->pushSubReader(realfile.c_str()); + } + } + else{ + LOG(INFO) << "Configure Reader: read key[" << pair.key.c_str() << "] value[" << pair.value.c_str() <<"]"; + cfg->pushPair(pair.key, pair.value); + } + } + } + catch(ConfigException){ + return -1; + } + catch(...){ + LOG(WARNING) << "Configure Reader: Unknown exception."; + return -1; + } + return 0; + } + + int Reader::sectionParser(const char * buf, size_t /*length*/, str_t * str){ + const char *p = buf; + const char *end = buf; + while(*end != 0 && *end != ']'){ + ++end; + } + if(0 == *end || p+1 >= end){ + return -1; + } + if(getWord(p+1, end, str) != 0){ + return -1; + } + ++end; + //检查末尾没有多余字符 + while(*end){ + if(*end == '#'){ + return 0; + } + if(! isspace(*end)){ + return -1; + } + ++end; + } + return 0; + } + + + int Reader::keyParser(const char * buf, size_t /*length*/, pair_t * pair){ + const char *p = buf; + while(*p != 0 && *p != ':'){ + ++p; + } + if(0 == *p || p == buf){ //到达末尾或在开头 + return -1; + } + if( getWord(buf, p, &(pair->key)) != 0 ){ + return -1; + } + + pair->value = p+1; + //ul_writelog(Log::debug(), "Configure Reader : key=[%s] whole value=[%s]", pair->key.c_str(), pair->value.c_str()); + pair->value = get_middle(pair->value); + //value : 引号转义? + return 0; + } + + + int Reader::getWord(const char * from, const char * to, str_t * str){ + //左闭右开区间[from, to) + int status = 0; //空格0->字符串1->空格2 + const char *f1 = from; + const char *f2 = to; + for(const char *i = from; i < to; ++i){ + if(isspace(*i)){ + if(status == 1){ + f2 = i; + status = 2; + } + } + else{ + if(status == 0){ + status = 1; + f1 = i; + } + else if(status == 2){ + return -1; + } + } + } + if(f1 >= f2){ + return -1; + } + //如果先clear str,再str->append(f1, f2-f1)的话: + //这里是有风险的,如果传入的是 getWord(str.begin(), str.end(), &str) 会挂 + //但是bsl::string不支持assign接口,只能先clear再append + //如果创建一个新对象,再copy回来,成本又太高,bsl::string不是copy-on-write + //还是copy一次吧: + str_t tmp; + tmp.append(f1, f2-f1); + *str = tmp; + return 0; + } + + void Reader::getCommentUpwards(str_t &comment, int line){ + const char * conf_line = _fd.getLine(line); + while(isCommentLine(conf_line)){ + str_t comment_line = conf_line; + comment_line.append("\n"); + comment_line.append(comment); + comment = comment_line; + --line; + conf_line = _fd.getLine(line); + } + } + + int Reader::isCommentLine(const char *line){ + if(line == NULL){ + return 0; + } + while(*line != 0 && isspace(*line)){ + ++ line; + } + if(*line == '#' || *line == 0){ + return 1; + } + return 0; + } + + char * Reader :: getRebuildBuffer(size_t size){ + return _fd.getRebuildBuffer(size); + } + int Reader :: rebuild(Configure * cfg){ + _isRebuild = true; + if( _fd.rebuild() != 0 ){ + return -1; + } + _cur_file = "./"REBUILD_CONF; + return build(cfg); + } + char * Reader :: dump(size_t * size){ + return _fd.dump(size); + } +} + + + + + + + + + + + +/* vim: set ts=4 sw=4 sts=4 tw=100 */ diff --git a/configure/reader/Reader.h b/configure/reader/Reader.h new file mode 100644 index 0000000000000000000000000000000000000000..dbf5772f6a5d542d356ec4b55c954f1914772b6b --- /dev/null +++ b/configure/reader/Reader.h @@ -0,0 +1,76 @@ +/*************************************************************************** + * + * Copyright (c) 2008 Baidu.com, Inc. All Rights Reserved + * $Id: Reader.h,v 1.5 2009/02/13 15:25:31 yingxiang Exp $ + * + **************************************************************************/ + + + +/** + * @file Reader.h + * @author yingxiang(com@baidu.com) + * @date 2008/12/21 16:09:58 + * @version $Revision: 1.5 $ + * @brief + * + **/ + + +#ifndef __READER_H_ +#define __READER_H_ + +#include "RawData.h" +#include "Configure.h" +#include + +namespace comcfg{ +#define REBUILD_CONF "REBUILD_CONF" + class Reader{ + RawData _fd; + public: + int read(const char * file, Configure * cfg); + char * getRebuildBuffer(size_t size); + int rebuild(Configure * cfg); + char * dump(size_t *); + Reader(); + private: + int build(Configure * cfg); + int push(Configure * cfg, const char * buf, size_t length); + struct pair_t{ + str_t key; + str_t value; + }; + int sectionParser(const char * buf, size_t length, str_t * str); + int keyParser(const char * buf, size_t length, pair_t * pair); + int getWord(const char * from, const char * to, str_t * str); + void getCommentUpwards(str_t &comment, int line); + int isCommentLine(const char *);//comment line or blank line + friend class ConfigUnit; + friend class Configure; + friend class ConfigGroup; + friend int cb_dumpConf(ConfigUnit *, void *); + str_t _cur_file; + int _cur_line; + bool _isRebuild; + }; +} + + + + + + + + + + + + + + + + +#endif //__READER_H_ + +/* vim: set ts=4 sw=4 sts=4 tw=100 */ diff --git a/configure/run.sh b/configure/run.sh new file mode 100644 index 0000000000000000000000000000000000000000..d5508e00c25aa92b24b87eea394447bff590e651 --- /dev/null +++ b/configure/run.sh @@ -0,0 +1,2 @@ +for i in FileReloader.cpp ConfigReloader.cpp CmdOption.cpp ConfigError.cpp ConfigGroup.cpp ConfigUnit.cpp Configure.cpp constraint/Constraint.cpp constraint/ConstraintFunction.cpp constraint/cc_default.cpp reader/RawData.cpp reader/Reader.cpp utils/init.cpp utils/trans.cpp cfgext.cpp cfgflag.cpp compiler/src/idl.c compiler/src/idl_lex.c compiler/src/idl_gram.c ; do echo -e "\${CMAKE_CURRENT_LIST_DIR}/$i"; done + diff --git a/configure/test/Makefile b/configure/test/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..02bd5b2ac8ba02af995804332f09f8d7a328c8a9 --- /dev/null +++ b/configure/test/Makefile @@ -0,0 +1,2054 @@ +########################################################################### +# Automatically generated by comake (1.0.0) # +########################################################################### + +#################设计系统参数####################################### +WORKROOT ?= ../../../ +IDLCC := $(WORKROOT)/public/idlcompiler/output/bin/mcy +RPCCC := $(WORKROOT)/public/ubrpc/output/bin/ubrpcgen +CC := gcc +CXX := g++ +LEX := flex +YACC := yacc +CFLAGS := -pipe -fsigned-char -Wall -W -g -fPIC +CXXFLAGS := -pipe -fsigned-char -Wall -W -g -fPIC +LEXFLAGS := +YACCFLAGS := +IDLFLAGS := +LINKFLAGS := -rdynamic +LINK := g++ +AR := ar cqs +RANLIB := +COMAKE := comake + +###############baidu lib 的32位 64位支持################# +HARDWARE_PLATFORM := $(shell uname -m) +ifeq ($(HARDWARE_PLATFORM),x86_64) + lib2=lib2-64 + third=third-64 +else + lib2=lib2 + third=third +endif +ifeq ($(MAC),ARM32) + lib2=lib2-arm32 + third=third-arm32 +endif + +########################################## + +# 编译参数 +DEP_INCPATH = -I$(WORKROOT)/public/spreg/output//include/ -I$(WORKROOT)/$(lib2)/ullib//include/ -I$(WORKROOT)/$(third)/pcre//include/ -I$(WORKROOT)/$(lib2)/bsl//include/ -I../output//include/ +DEP_LDFLAGS = -L../output//lib/ -L$(WORKROOT)/$(lib2)/bsl//lib/ -L$(WORKROOT)/$(third)/pcre//lib/ -L$(WORKROOT)/$(lib2)/ullib//lib/ -L$(WORKROOT)/public/spreg/output//lib/ +DEP_LDLIBS = -lconfig -lspreg -lpcre -lpcrecpp -lpcreposix -lbsl -lullib +INCPATH = -I. -I.. +MAKDEP = Makefile.dep + + +#start target +first : all + +############# 默认推到公式 +.SUFFIXES: .c .cpp .cc .cxx .C .idl .des +.PRECIOUS: %.cpp + +.cpp.o: + $(CXX) -c -o $@ $< $(CXXFLAGS) $(CPPFLAGS) $(INCPATH) + +.cc.o: + $(CXX) -c -o $@ $< $(CXXFLAGS) $(CPPFLAGS) $(INCPATH) + +.cxx.o: + $(CXX) -c -o $@ $< $(CXXFLAGS) $(CPPFLAGS) $(INCPATH) + +.C.o: + $(CXX) -c -o $@ $< $(CXXFLAGS) $(CPPFLAGS) $(INCPATH) + +.c.o: + $(CC) -c -o $@ $< $(CFLAGS) $(CPPFLAGS) $(INCPATH) + +.idl.cpp: + $(IDLCC) --ns=$(*F) -o $* $< $(CPPFLAGS) $(INCPATH) $(IDLFLAGS) + +############# +###cpp 支持 +%info : % + ccp $< +############# + + +#__$MAKEFILE_RULES$__ + + + +###############编译目标 +all : target output +.PHONY : all clean test output comake src conf + +target : test_get_default test_1010new test_ivar test_auto test_cfg test_conf test_demo test_err test_get_value test_option test_rawdata test_reader test_rebuild test_str test_t1 test_trans_float test_trans_str2str test_xiaowei test_cfg2 test_cfg3 test_zr test_to_default test_checkone test_reloader test_sigreload test_filereload test_setvalue +#target : rpcidl test_get_default test_1010new test_ivar test_auto test_cfg test_conf test_demo test_err test_get_value test_option test_rawdata test_reader test_rebuild test_str test_t1 test_trans_float test_trans_str2str test_xiaowei test_cfg2 test_cfg3 test_zr test_to_default test_checkone test_reloader test_sigreload test_filereload test_setvalue +#target : +#__$target_CMDLINE$__ + +rpcidl : + +clean_rpcidl : + + +test : + + +comake : + -make clean + -comake + +#-include $(MAKDEP) + + +#----------------build target : test_get_default-------------------- + +test_get_default : CC := gcc +test_get_default : CXX := g++ +test_get_default : CXXFLAGS := -pipe -fsigned-char -Wall -W -g -fPIC +test_get_default : CPPFLAGS := +test_get_default : IDLFLAGS := +test_get_default : CFLAGS := -pipe -fsigned-char -Wall -W -g -fPIC +test_get_default : INCPATH := -I. -I.. $(DEP_INCPATH) +test_get_default : LDLIBS := -lcrypto -lm -lpthread $(DEP_LDLIBS) +test_get_default : LDFLAGS := $(DEP_LDFLAGS) +test_get_default : LINKFLAGS := -rdynamic + +test_get_default_SOURCES := $(wildcard comake_autogen.cpp test_get_default.cpp) +#test_get_default_HEADERS := $(wildcard *.h) +test_get_default_HEADERS := *.h +test_get_default_IDLSRC := $(wildcard __$IDLSRC_VALUE$__) +test_get_default_IDLSRCCPP := $(patsubst %.idl,%.cpp, $(test_get_default_IDLSRC)) +test_get_default_IDLSRCH := $(patsubst %.idl,%.h, $(test_get_default_IDLSRC)) +test_get_default_CONFDES := $(wildcard __$CONFDES$_VALUE$__ test_get_default.des) +test_get_default_CONFRANGE := $(patsubst %.des,%.range, $(test_get_default_CONFDES)) +test_get_default_OBJS := $(test_get_default_IDLSRC:.idl=.o) +test_get_default_OBJS += $(test_get_default_SOURCES:.c=.o) +test_get_default_OBJS := $(test_get_default_OBJS:.cc=.o) +test_get_default_OBJS := $(test_get_default_OBJS:.cpp=.o) +test_get_default_OBJS := $(test_get_default_OBJS:.cxx=.o) +test_get_default_OBJS := $(test_get_default_OBJS:.C=.o) +test_get_default_OBJS := $(test_get_default_OBJS:.idl=.o) +test_get_default_OBJS := $(test_get_default_OBJS:.yacc=.o) +test_get_default_OBJS := $(test_get_default_OBJS:.lex=.o) +test_get_default : $(test_get_default_OBJS) + @echo "force_clean" + $(foreach n, $(wildcard ), $(if ifeq($(suffix $(n)), .c), $(CC) -c -o $(basename $(n)).o $(n) $(CXXFLAGS) $(CPPFLAGS) $(INCPATH); , $(CXX) -c -o $(basename $(n)).o $(n) $(CXXFLAGS) $(CPPFLAGS) $(INCPATH); )) + @`for x in $(test_get_default_CONFDES);do cpp -C -o test_get_default.range $$x $(CPPFLAGS) $(INCPATH);mkdir -p conf;cp test_get_default.range conf/; done` + $(LINK) $^ -o $@ -Xlinker "-(" $(LDFLAGS) $(LDLIBS) $(LINKFLAGS) -Xlinker "-)" + + +define test_get_default_output + mkdir -p output + mkdir -p output/bin + cp -rf test_get_default output/bin + `if [ -e "conf" ];then cp -rf conf output/ ;fi` + +endef + + +define test_get_default_clean + -rm -rf $(test_get_default_OBJS) $(test_get_default_IDLSRCCPP) $(test_get_default_IDLSRCH) test_get_default.range conf/test_get_default.range + -rm -rf test_get_default + -rm -rf output + -rm -rf ccp_output.error ccp_output_scm.xml ccp_output.xml ccp_output.pclint ccp_output.txt +endef + + +define test_get_default_ccpc + ccp $(test_get_default_SOURCES) --formatter vim +endef + + +define test_get_default_cov + +endef + + + + +#---------------------end build target : test_get_default------------------ + +#----------------build target : test_1010new-------------------- + +test_1010new : CC := gcc +test_1010new : CXX := g++ +test_1010new : CXXFLAGS := -pipe -fsigned-char -Wall -W -g -fPIC +test_1010new : CPPFLAGS := +test_1010new : IDLFLAGS := +test_1010new : CFLAGS := -pipe -fsigned-char -Wall -W -g -fPIC +test_1010new : INCPATH := -I. -I.. $(DEP_INCPATH) +test_1010new : LDLIBS := -lcrypto -lm -lpthread $(DEP_LDLIBS) +test_1010new : LDFLAGS := $(DEP_LDFLAGS) +test_1010new : LINKFLAGS := -rdynamic + +test_1010new_SOURCES := $(wildcard comake_autogen.cpp test_1010new.cpp) +#test_1010new_HEADERS := $(wildcard *.h) +test_1010new_HEADERS := *.h +test_1010new_IDLSRC := $(wildcard __$IDLSRC_VALUE$__) +test_1010new_IDLSRCCPP := $(patsubst %.idl,%.cpp, $(test_1010new_IDLSRC)) +test_1010new_IDLSRCH := $(patsubst %.idl,%.h, $(test_1010new_IDLSRC)) +test_1010new_CONFDES := $(wildcard __$CONFDES$_VALUE$__ test_1010new.des) +test_1010new_CONFRANGE := $(patsubst %.des,%.range, $(test_1010new_CONFDES)) +test_1010new_OBJS := $(test_1010new_IDLSRC:.idl=.o) +test_1010new_OBJS += $(test_1010new_SOURCES:.c=.o) +test_1010new_OBJS := $(test_1010new_OBJS:.cc=.o) +test_1010new_OBJS := $(test_1010new_OBJS:.cpp=.o) +test_1010new_OBJS := $(test_1010new_OBJS:.cxx=.o) +test_1010new_OBJS := $(test_1010new_OBJS:.C=.o) +test_1010new_OBJS := $(test_1010new_OBJS:.idl=.o) +test_1010new_OBJS := $(test_1010new_OBJS:.yacc=.o) +test_1010new_OBJS := $(test_1010new_OBJS:.lex=.o) +test_1010new : $(test_1010new_OBJS) + @echo "force_clean" + $(foreach n, $(wildcard ), $(if ifeq($(suffix $(n)), .c), $(CC) -c -o $(basename $(n)).o $(n) $(CXXFLAGS) $(CPPFLAGS) $(INCPATH); , $(CXX) -c -o $(basename $(n)).o $(n) $(CXXFLAGS) $(CPPFLAGS) $(INCPATH); )) + @`for x in $(test_1010new_CONFDES);do cpp -C -o test_1010new.range $$x $(CPPFLAGS) $(INCPATH);mkdir -p conf;cp test_1010new.range conf/; done` + $(LINK) $^ -o $@ -Xlinker "-(" $(LDFLAGS) $(LDLIBS) $(LINKFLAGS) -Xlinker "-)" + + +define test_1010new_output + mkdir -p output + mkdir -p output/bin + cp -rf test_1010new output/bin + `if [ -e "conf" ];then cp -rf conf output/ ;fi` + +endef + + +define test_1010new_clean + -rm -rf $(test_1010new_OBJS) $(test_1010new_IDLSRCCPP) $(test_1010new_IDLSRCH) test_1010new.range conf/test_1010new.range + -rm -rf test_1010new + -rm -rf output + -rm -rf ccp_output.error ccp_output_scm.xml ccp_output.xml ccp_output.pclint ccp_output.txt +endef + + +define test_1010new_ccpc + ccp $(test_1010new_SOURCES) --formatter vim +endef + + +define test_1010new_cov + +endef + + + + +#---------------------end build target : test_1010new------------------ + +#----------------build target : test_ivar-------------------- + +test_ivar : CC := gcc +test_ivar : CXX := g++ +test_ivar : CXXFLAGS := -pipe -fsigned-char -Wall -W -g -fPIC +test_ivar : CPPFLAGS := +test_ivar : IDLFLAGS := +test_ivar : CFLAGS := -pipe -fsigned-char -Wall -W -g -fPIC +test_ivar : INCPATH := -I. -I.. $(DEP_INCPATH) +test_ivar : LDLIBS := -lcrypto -lm -lpthread $(DEP_LDLIBS) +test_ivar : LDFLAGS := $(DEP_LDFLAGS) +test_ivar : LINKFLAGS := -rdynamic + +test_ivar_SOURCES := $(wildcard comake_autogen.cpp test_ivar.cpp) +#test_ivar_HEADERS := $(wildcard *.h) +test_ivar_HEADERS := *.h +test_ivar_IDLSRC := $(wildcard __$IDLSRC_VALUE$__) +test_ivar_IDLSRCCPP := $(patsubst %.idl,%.cpp, $(test_ivar_IDLSRC)) +test_ivar_IDLSRCH := $(patsubst %.idl,%.h, $(test_ivar_IDLSRC)) +test_ivar_CONFDES := $(wildcard __$CONFDES$_VALUE$__ test_ivar.des) +test_ivar_CONFRANGE := $(patsubst %.des,%.range, $(test_ivar_CONFDES)) +test_ivar_OBJS := $(test_ivar_IDLSRC:.idl=.o) +test_ivar_OBJS += $(test_ivar_SOURCES:.c=.o) +test_ivar_OBJS := $(test_ivar_OBJS:.cc=.o) +test_ivar_OBJS := $(test_ivar_OBJS:.cpp=.o) +test_ivar_OBJS := $(test_ivar_OBJS:.cxx=.o) +test_ivar_OBJS := $(test_ivar_OBJS:.C=.o) +test_ivar_OBJS := $(test_ivar_OBJS:.idl=.o) +test_ivar_OBJS := $(test_ivar_OBJS:.yacc=.o) +test_ivar_OBJS := $(test_ivar_OBJS:.lex=.o) +test_ivar : $(test_ivar_OBJS) + @echo "force_clean" + $(foreach n, $(wildcard ), $(if ifeq($(suffix $(n)), .c), $(CC) -c -o $(basename $(n)).o $(n) $(CXXFLAGS) $(CPPFLAGS) $(INCPATH); , $(CXX) -c -o $(basename $(n)).o $(n) $(CXXFLAGS) $(CPPFLAGS) $(INCPATH); )) + @`for x in $(test_ivar_CONFDES);do cpp -C -o test_ivar.range $$x $(CPPFLAGS) $(INCPATH);mkdir -p conf;cp test_ivar.range conf/; done` + $(LINK) $^ -o $@ -Xlinker "-(" $(LDFLAGS) $(LDLIBS) $(LINKFLAGS) -Xlinker "-)" + + +define test_ivar_output + mkdir -p output + mkdir -p output/bin + cp -rf test_ivar output/bin + `if [ -e "conf" ];then cp -rf conf output/ ;fi` + +endef + + +define test_ivar_clean + -rm -rf $(test_ivar_OBJS) $(test_ivar_IDLSRCCPP) $(test_ivar_IDLSRCH) test_ivar.range conf/test_ivar.range + -rm -rf test_ivar + -rm -rf output + -rm -rf ccp_output.error ccp_output_scm.xml ccp_output.xml ccp_output.pclint ccp_output.txt +endef + + +define test_ivar_ccpc + ccp $(test_ivar_SOURCES) --formatter vim +endef + + +define test_ivar_cov + +endef + + + + +#---------------------end build target : test_ivar------------------ + +#----------------build target : test_auto-------------------- + +test_auto : CC := gcc +test_auto : CXX := g++ +test_auto : CXXFLAGS := -pipe -fsigned-char -Wall -W -g -fPIC +test_auto : CPPFLAGS := +test_auto : IDLFLAGS := +test_auto : CFLAGS := -pipe -fsigned-char -Wall -W -g -fPIC +test_auto : INCPATH := -I. -I.. $(DEP_INCPATH) +test_auto : LDLIBS := -lcrypto -lm -lpthread $(DEP_LDLIBS) +test_auto : LDFLAGS := $(DEP_LDFLAGS) +test_auto : LINKFLAGS := -rdynamic + +test_auto_SOURCES := $(wildcard comake_autogen.cpp test_auto.cpp) +#test_auto_HEADERS := $(wildcard *.h) +test_auto_HEADERS := *.h +test_auto_IDLSRC := $(wildcard __$IDLSRC_VALUE$__) +test_auto_IDLSRCCPP := $(patsubst %.idl,%.cpp, $(test_auto_IDLSRC)) +test_auto_IDLSRCH := $(patsubst %.idl,%.h, $(test_auto_IDLSRC)) +test_auto_CONFDES := $(wildcard __$CONFDES$_VALUE$__ test_auto.des) +test_auto_CONFRANGE := $(patsubst %.des,%.range, $(test_auto_CONFDES)) +test_auto_OBJS := $(test_auto_IDLSRC:.idl=.o) +test_auto_OBJS += $(test_auto_SOURCES:.c=.o) +test_auto_OBJS := $(test_auto_OBJS:.cc=.o) +test_auto_OBJS := $(test_auto_OBJS:.cpp=.o) +test_auto_OBJS := $(test_auto_OBJS:.cxx=.o) +test_auto_OBJS := $(test_auto_OBJS:.C=.o) +test_auto_OBJS := $(test_auto_OBJS:.idl=.o) +test_auto_OBJS := $(test_auto_OBJS:.yacc=.o) +test_auto_OBJS := $(test_auto_OBJS:.lex=.o) +test_auto : $(test_auto_OBJS) + @echo "force_clean" + $(foreach n, $(wildcard ), $(if ifeq($(suffix $(n)), .c), $(CC) -c -o $(basename $(n)).o $(n) $(CXXFLAGS) $(CPPFLAGS) $(INCPATH); , $(CXX) -c -o $(basename $(n)).o $(n) $(CXXFLAGS) $(CPPFLAGS) $(INCPATH); )) + @`for x in $(test_auto_CONFDES);do cpp -C -o test_auto.range $$x $(CPPFLAGS) $(INCPATH);mkdir -p conf;cp test_auto.range conf/; done` + $(LINK) $^ -o $@ -Xlinker "-(" $(LDFLAGS) $(LDLIBS) $(LINKFLAGS) -Xlinker "-)" + + +define test_auto_output + mkdir -p output + mkdir -p output/bin + cp -rf test_auto output/bin + `if [ -e "conf" ];then cp -rf conf output/ ;fi` + +endef + + +define test_auto_clean + -rm -rf $(test_auto_OBJS) $(test_auto_IDLSRCCPP) $(test_auto_IDLSRCH) test_auto.range conf/test_auto.range + -rm -rf test_auto + -rm -rf output + -rm -rf ccp_output.error ccp_output_scm.xml ccp_output.xml ccp_output.pclint ccp_output.txt +endef + + +define test_auto_ccpc + ccp $(test_auto_SOURCES) --formatter vim +endef + + +define test_auto_cov + +endef + + + + +#---------------------end build target : test_auto------------------ + +#----------------build target : test_cfg-------------------- + +test_cfg : CC := gcc +test_cfg : CXX := g++ +test_cfg : CXXFLAGS := -pipe -fsigned-char -Wall -W -g -fPIC +test_cfg : CPPFLAGS := +test_cfg : IDLFLAGS := +test_cfg : CFLAGS := -pipe -fsigned-char -Wall -W -g -fPIC +test_cfg : INCPATH := -I. -I.. $(DEP_INCPATH) +test_cfg : LDLIBS := -lcrypto -lm -lpthread $(DEP_LDLIBS) +test_cfg : LDFLAGS := $(DEP_LDFLAGS) +test_cfg : LINKFLAGS := -rdynamic + +test_cfg_SOURCES := $(wildcard comake_autogen.cpp test_cfg.cpp) +#test_cfg_HEADERS := $(wildcard *.h) +test_cfg_HEADERS := *.h +test_cfg_IDLSRC := $(wildcard __$IDLSRC_VALUE$__) +test_cfg_IDLSRCCPP := $(patsubst %.idl,%.cpp, $(test_cfg_IDLSRC)) +test_cfg_IDLSRCH := $(patsubst %.idl,%.h, $(test_cfg_IDLSRC)) +test_cfg_CONFDES := $(wildcard __$CONFDES$_VALUE$__ test_cfg.des) +test_cfg_CONFRANGE := $(patsubst %.des,%.range, $(test_cfg_CONFDES)) +test_cfg_OBJS := $(test_cfg_IDLSRC:.idl=.o) +test_cfg_OBJS += $(test_cfg_SOURCES:.c=.o) +test_cfg_OBJS := $(test_cfg_OBJS:.cc=.o) +test_cfg_OBJS := $(test_cfg_OBJS:.cpp=.o) +test_cfg_OBJS := $(test_cfg_OBJS:.cxx=.o) +test_cfg_OBJS := $(test_cfg_OBJS:.C=.o) +test_cfg_OBJS := $(test_cfg_OBJS:.idl=.o) +test_cfg_OBJS := $(test_cfg_OBJS:.yacc=.o) +test_cfg_OBJS := $(test_cfg_OBJS:.lex=.o) +test_cfg : $(test_cfg_OBJS) + @echo "force_clean" + $(foreach n, $(wildcard ), $(if ifeq($(suffix $(n)), .c), $(CC) -c -o $(basename $(n)).o $(n) $(CXXFLAGS) $(CPPFLAGS) $(INCPATH); , $(CXX) -c -o $(basename $(n)).o $(n) $(CXXFLAGS) $(CPPFLAGS) $(INCPATH); )) + @`for x in $(test_cfg_CONFDES);do cpp -C -o test_cfg.range $$x $(CPPFLAGS) $(INCPATH);mkdir -p conf;cp test_cfg.range conf/; done` + $(LINK) $^ -o $@ -Xlinker "-(" $(LDFLAGS) $(LDLIBS) $(LINKFLAGS) -Xlinker "-)" + + +define test_cfg_output + mkdir -p output + mkdir -p output/bin + cp -rf test_cfg output/bin + `if [ -e "conf" ];then cp -rf conf output/ ;fi` + +endef + + +define test_cfg_clean + -rm -rf $(test_cfg_OBJS) $(test_cfg_IDLSRCCPP) $(test_cfg_IDLSRCH) test_cfg.range conf/test_cfg.range + -rm -rf test_cfg + -rm -rf output + -rm -rf ccp_output.error ccp_output_scm.xml ccp_output.xml ccp_output.pclint ccp_output.txt +endef + + +define test_cfg_ccpc + ccp $(test_cfg_SOURCES) --formatter vim +endef + + +define test_cfg_cov + +endef + + + + +#---------------------end build target : test_cfg------------------ + +#----------------build target : test_conf-------------------- + +test_conf : CC := gcc +test_conf : CXX := g++ +test_conf : CXXFLAGS := -pipe -fsigned-char -Wall -W -g -fPIC +test_conf : CPPFLAGS := +test_conf : IDLFLAGS := +test_conf : CFLAGS := -pipe -fsigned-char -Wall -W -g -fPIC +test_conf : INCPATH := -I. -I.. $(DEP_INCPATH) +test_conf : LDLIBS := -lcrypto -lm -lpthread $(DEP_LDLIBS) +test_conf : LDFLAGS := $(DEP_LDFLAGS) +test_conf : LINKFLAGS := -rdynamic + +test_conf_SOURCES := $(wildcard comake_autogen.cpp test_conf.cpp) +#test_conf_HEADERS := $(wildcard *.h) +test_conf_HEADERS := *.h +test_conf_IDLSRC := $(wildcard __$IDLSRC_VALUE$__) +test_conf_IDLSRCCPP := $(patsubst %.idl,%.cpp, $(test_conf_IDLSRC)) +test_conf_IDLSRCH := $(patsubst %.idl,%.h, $(test_conf_IDLSRC)) +test_conf_CONFDES := $(wildcard __$CONFDES$_VALUE$__ test_conf.des) +test_conf_CONFRANGE := $(patsubst %.des,%.range, $(test_conf_CONFDES)) +test_conf_OBJS := $(test_conf_IDLSRC:.idl=.o) +test_conf_OBJS += $(test_conf_SOURCES:.c=.o) +test_conf_OBJS := $(test_conf_OBJS:.cc=.o) +test_conf_OBJS := $(test_conf_OBJS:.cpp=.o) +test_conf_OBJS := $(test_conf_OBJS:.cxx=.o) +test_conf_OBJS := $(test_conf_OBJS:.C=.o) +test_conf_OBJS := $(test_conf_OBJS:.idl=.o) +test_conf_OBJS := $(test_conf_OBJS:.yacc=.o) +test_conf_OBJS := $(test_conf_OBJS:.lex=.o) +test_conf : $(test_conf_OBJS) + @echo "force_clean" + $(foreach n, $(wildcard ), $(if ifeq($(suffix $(n)), .c), $(CC) -c -o $(basename $(n)).o $(n) $(CXXFLAGS) $(CPPFLAGS) $(INCPATH); , $(CXX) -c -o $(basename $(n)).o $(n) $(CXXFLAGS) $(CPPFLAGS) $(INCPATH); )) + @`for x in $(test_conf_CONFDES);do cpp -C -o test_conf.range $$x $(CPPFLAGS) $(INCPATH);mkdir -p conf;cp test_conf.range conf/; done` + $(LINK) $^ -o $@ -Xlinker "-(" $(LDFLAGS) $(LDLIBS) $(LINKFLAGS) -Xlinker "-)" + + +define test_conf_output + mkdir -p output + mkdir -p output/bin + cp -rf test_conf output/bin + `if [ -e "conf" ];then cp -rf conf output/ ;fi` + +endef + + +define test_conf_clean + -rm -rf $(test_conf_OBJS) $(test_conf_IDLSRCCPP) $(test_conf_IDLSRCH) test_conf.range conf/test_conf.range + -rm -rf test_conf + -rm -rf output + -rm -rf ccp_output.error ccp_output_scm.xml ccp_output.xml ccp_output.pclint ccp_output.txt +endef + + +define test_conf_ccpc + ccp $(test_conf_SOURCES) --formatter vim +endef + + +define test_conf_cov + +endef + + + + +#---------------------end build target : test_conf------------------ + +#----------------build target : test_demo-------------------- + +test_demo : CC := gcc +test_demo : CXX := g++ +test_demo : CXXFLAGS := -pipe -fsigned-char -Wall -W -g -fPIC +test_demo : CPPFLAGS := +test_demo : IDLFLAGS := +test_demo : CFLAGS := -pipe -fsigned-char -Wall -W -g -fPIC +test_demo : INCPATH := -I. -I.. $(DEP_INCPATH) +test_demo : LDLIBS := -lcrypto -lm -lpthread $(DEP_LDLIBS) +test_demo : LDFLAGS := $(DEP_LDFLAGS) +test_demo : LINKFLAGS := -rdynamic + +test_demo_SOURCES := $(wildcard comake_autogen.cpp test_demo.cpp) +#test_demo_HEADERS := $(wildcard *.h) +test_demo_HEADERS := *.h +test_demo_IDLSRC := $(wildcard __$IDLSRC_VALUE$__) +test_demo_IDLSRCCPP := $(patsubst %.idl,%.cpp, $(test_demo_IDLSRC)) +test_demo_IDLSRCH := $(patsubst %.idl,%.h, $(test_demo_IDLSRC)) +test_demo_CONFDES := $(wildcard __$CONFDES$_VALUE$__ test_demo.des) +test_demo_CONFRANGE := $(patsubst %.des,%.range, $(test_demo_CONFDES)) +test_demo_OBJS := $(test_demo_IDLSRC:.idl=.o) +test_demo_OBJS += $(test_demo_SOURCES:.c=.o) +test_demo_OBJS := $(test_demo_OBJS:.cc=.o) +test_demo_OBJS := $(test_demo_OBJS:.cpp=.o) +test_demo_OBJS := $(test_demo_OBJS:.cxx=.o) +test_demo_OBJS := $(test_demo_OBJS:.C=.o) +test_demo_OBJS := $(test_demo_OBJS:.idl=.o) +test_demo_OBJS := $(test_demo_OBJS:.yacc=.o) +test_demo_OBJS := $(test_demo_OBJS:.lex=.o) +test_demo : $(test_demo_OBJS) + @echo "force_clean" + $(foreach n, $(wildcard ), $(if ifeq($(suffix $(n)), .c), $(CC) -c -o $(basename $(n)).o $(n) $(CXXFLAGS) $(CPPFLAGS) $(INCPATH); , $(CXX) -c -o $(basename $(n)).o $(n) $(CXXFLAGS) $(CPPFLAGS) $(INCPATH); )) + @`for x in $(test_demo_CONFDES);do cpp -C -o test_demo.range $$x $(CPPFLAGS) $(INCPATH);mkdir -p conf;cp test_demo.range conf/; done` + $(LINK) $^ -o $@ -Xlinker "-(" $(LDFLAGS) $(LDLIBS) $(LINKFLAGS) -Xlinker "-)" + + +define test_demo_output + mkdir -p output + mkdir -p output/bin + cp -rf test_demo output/bin + `if [ -e "conf" ];then cp -rf conf output/ ;fi` + +endef + + +define test_demo_clean + -rm -rf $(test_demo_OBJS) $(test_demo_IDLSRCCPP) $(test_demo_IDLSRCH) test_demo.range conf/test_demo.range + -rm -rf test_demo + -rm -rf output + -rm -rf ccp_output.error ccp_output_scm.xml ccp_output.xml ccp_output.pclint ccp_output.txt +endef + + +define test_demo_ccpc + ccp $(test_demo_SOURCES) --formatter vim +endef + + +define test_demo_cov + +endef + + + + +#---------------------end build target : test_demo------------------ + +#----------------build target : test_err-------------------- + +test_err : CC := gcc +test_err : CXX := g++ +test_err : CXXFLAGS := -pipe -fsigned-char -Wall -W -g -fPIC +test_err : CPPFLAGS := +test_err : IDLFLAGS := +test_err : CFLAGS := -pipe -fsigned-char -Wall -W -g -fPIC +test_err : INCPATH := -I. -I.. $(DEP_INCPATH) +test_err : LDLIBS := -lcrypto -lm -lpthread $(DEP_LDLIBS) +test_err : LDFLAGS := $(DEP_LDFLAGS) +test_err : LINKFLAGS := -rdynamic + +test_err_SOURCES := $(wildcard comake_autogen.cpp test_err.cpp) +#test_err_HEADERS := $(wildcard *.h) +test_err_HEADERS := *.h +test_err_IDLSRC := $(wildcard __$IDLSRC_VALUE$__) +test_err_IDLSRCCPP := $(patsubst %.idl,%.cpp, $(test_err_IDLSRC)) +test_err_IDLSRCH := $(patsubst %.idl,%.h, $(test_err_IDLSRC)) +test_err_CONFDES := $(wildcard __$CONFDES$_VALUE$__ test_err.des) +test_err_CONFRANGE := $(patsubst %.des,%.range, $(test_err_CONFDES)) +test_err_OBJS := $(test_err_IDLSRC:.idl=.o) +test_err_OBJS += $(test_err_SOURCES:.c=.o) +test_err_OBJS := $(test_err_OBJS:.cc=.o) +test_err_OBJS := $(test_err_OBJS:.cpp=.o) +test_err_OBJS := $(test_err_OBJS:.cxx=.o) +test_err_OBJS := $(test_err_OBJS:.C=.o) +test_err_OBJS := $(test_err_OBJS:.idl=.o) +test_err_OBJS := $(test_err_OBJS:.yacc=.o) +test_err_OBJS := $(test_err_OBJS:.lex=.o) +test_err : $(test_err_OBJS) + @echo "force_clean" + $(foreach n, $(wildcard ), $(if ifeq($(suffix $(n)), .c), $(CC) -c -o $(basename $(n)).o $(n) $(CXXFLAGS) $(CPPFLAGS) $(INCPATH); , $(CXX) -c -o $(basename $(n)).o $(n) $(CXXFLAGS) $(CPPFLAGS) $(INCPATH); )) + @`for x in $(test_err_CONFDES);do cpp -C -o test_err.range $$x $(CPPFLAGS) $(INCPATH);mkdir -p conf;cp test_err.range conf/; done` + $(LINK) $^ -o $@ -Xlinker "-(" $(LDFLAGS) $(LDLIBS) $(LINKFLAGS) -Xlinker "-)" + + +define test_err_output + mkdir -p output + mkdir -p output/bin + cp -rf test_err output/bin + `if [ -e "conf" ];then cp -rf conf output/ ;fi` + +endef + + +define test_err_clean + -rm -rf $(test_err_OBJS) $(test_err_IDLSRCCPP) $(test_err_IDLSRCH) test_err.range conf/test_err.range + -rm -rf test_err + -rm -rf output + -rm -rf ccp_output.error ccp_output_scm.xml ccp_output.xml ccp_output.pclint ccp_output.txt +endef + + +define test_err_ccpc + ccp $(test_err_SOURCES) --formatter vim +endef + + +define test_err_cov + +endef + + + + +#---------------------end build target : test_err------------------ + +#----------------build target : test_get_value-------------------- + +test_get_value : CC := gcc +test_get_value : CXX := g++ +test_get_value : CXXFLAGS := -pipe -fsigned-char -Wall -W -g -fPIC +test_get_value : CPPFLAGS := +test_get_value : IDLFLAGS := +test_get_value : CFLAGS := -pipe -fsigned-char -Wall -W -g -fPIC +test_get_value : INCPATH := -I. -I.. $(DEP_INCPATH) +test_get_value : LDLIBS := -lcrypto -lm -lpthread $(DEP_LDLIBS) +test_get_value : LDFLAGS := $(DEP_LDFLAGS) +test_get_value : LINKFLAGS := -rdynamic + +test_get_value_SOURCES := $(wildcard comake_autogen.cpp test_get_value.cpp) +#test_get_value_HEADERS := $(wildcard *.h) +test_get_value_HEADERS := *.h +test_get_value_IDLSRC := $(wildcard __$IDLSRC_VALUE$__) +test_get_value_IDLSRCCPP := $(patsubst %.idl,%.cpp, $(test_get_value_IDLSRC)) +test_get_value_IDLSRCH := $(patsubst %.idl,%.h, $(test_get_value_IDLSRC)) +test_get_value_CONFDES := $(wildcard __$CONFDES$_VALUE$__ test_get_value.des) +test_get_value_CONFRANGE := $(patsubst %.des,%.range, $(test_get_value_CONFDES)) +test_get_value_OBJS := $(test_get_value_IDLSRC:.idl=.o) +test_get_value_OBJS += $(test_get_value_SOURCES:.c=.o) +test_get_value_OBJS := $(test_get_value_OBJS:.cc=.o) +test_get_value_OBJS := $(test_get_value_OBJS:.cpp=.o) +test_get_value_OBJS := $(test_get_value_OBJS:.cxx=.o) +test_get_value_OBJS := $(test_get_value_OBJS:.C=.o) +test_get_value_OBJS := $(test_get_value_OBJS:.idl=.o) +test_get_value_OBJS := $(test_get_value_OBJS:.yacc=.o) +test_get_value_OBJS := $(test_get_value_OBJS:.lex=.o) +test_get_value : $(test_get_value_OBJS) + @echo "force_clean" + $(foreach n, $(wildcard ), $(if ifeq($(suffix $(n)), .c), $(CC) -c -o $(basename $(n)).o $(n) $(CXXFLAGS) $(CPPFLAGS) $(INCPATH); , $(CXX) -c -o $(basename $(n)).o $(n) $(CXXFLAGS) $(CPPFLAGS) $(INCPATH); )) + @`for x in $(test_get_value_CONFDES);do cpp -C -o test_get_value.range $$x $(CPPFLAGS) $(INCPATH);mkdir -p conf;cp test_get_value.range conf/; done` + $(LINK) $^ -o $@ -Xlinker "-(" $(LDFLAGS) $(LDLIBS) $(LINKFLAGS) -Xlinker "-)" + + +define test_get_value_output + mkdir -p output + mkdir -p output/bin + cp -rf test_get_value output/bin + `if [ -e "conf" ];then cp -rf conf output/ ;fi` + +endef + + +define test_get_value_clean + -rm -rf $(test_get_value_OBJS) $(test_get_value_IDLSRCCPP) $(test_get_value_IDLSRCH) test_get_value.range conf/test_get_value.range + -rm -rf test_get_value + -rm -rf output + -rm -rf ccp_output.error ccp_output_scm.xml ccp_output.xml ccp_output.pclint ccp_output.txt +endef + + +define test_get_value_ccpc + ccp $(test_get_value_SOURCES) --formatter vim +endef + + +define test_get_value_cov + +endef + + + + +#---------------------end build target : test_get_value------------------ + +#----------------build target : test_option-------------------- + +test_option : CC := gcc +test_option : CXX := g++ +test_option : CXXFLAGS := -pipe -fsigned-char -Wall -W -g -fPIC +test_option : CPPFLAGS := +test_option : IDLFLAGS := +test_option : CFLAGS := -pipe -fsigned-char -Wall -W -g -fPIC +test_option : INCPATH := -I. -I.. $(DEP_INCPATH) +test_option : LDLIBS := -lcrypto -lm -lpthread $(DEP_LDLIBS) +test_option : LDFLAGS := $(DEP_LDFLAGS) +test_option : LINKFLAGS := -rdynamic + +test_option_SOURCES := $(wildcard comake_autogen.cpp test_option.cpp) +#test_option_HEADERS := $(wildcard *.h) +test_option_HEADERS := *.h +test_option_IDLSRC := $(wildcard __$IDLSRC_VALUE$__) +test_option_IDLSRCCPP := $(patsubst %.idl,%.cpp, $(test_option_IDLSRC)) +test_option_IDLSRCH := $(patsubst %.idl,%.h, $(test_option_IDLSRC)) +test_option_CONFDES := $(wildcard __$CONFDES$_VALUE$__ test_option.des) +test_option_CONFRANGE := $(patsubst %.des,%.range, $(test_option_CONFDES)) +test_option_OBJS := $(test_option_IDLSRC:.idl=.o) +test_option_OBJS += $(test_option_SOURCES:.c=.o) +test_option_OBJS := $(test_option_OBJS:.cc=.o) +test_option_OBJS := $(test_option_OBJS:.cpp=.o) +test_option_OBJS := $(test_option_OBJS:.cxx=.o) +test_option_OBJS := $(test_option_OBJS:.C=.o) +test_option_OBJS := $(test_option_OBJS:.idl=.o) +test_option_OBJS := $(test_option_OBJS:.yacc=.o) +test_option_OBJS := $(test_option_OBJS:.lex=.o) +test_option : $(test_option_OBJS) + @echo "force_clean" + $(foreach n, $(wildcard ), $(if ifeq($(suffix $(n)), .c), $(CC) -c -o $(basename $(n)).o $(n) $(CXXFLAGS) $(CPPFLAGS) $(INCPATH); , $(CXX) -c -o $(basename $(n)).o $(n) $(CXXFLAGS) $(CPPFLAGS) $(INCPATH); )) + @`for x in $(test_option_CONFDES);do cpp -C -o test_option.range $$x $(CPPFLAGS) $(INCPATH);mkdir -p conf;cp test_option.range conf/; done` + $(LINK) $^ -o $@ -Xlinker "-(" $(LDFLAGS) $(LDLIBS) $(LINKFLAGS) -Xlinker "-)" + + +define test_option_output + mkdir -p output + mkdir -p output/bin + cp -rf test_option output/bin + `if [ -e "conf" ];then cp -rf conf output/ ;fi` + +endef + + +define test_option_clean + -rm -rf $(test_option_OBJS) $(test_option_IDLSRCCPP) $(test_option_IDLSRCH) test_option.range conf/test_option.range + -rm -rf test_option + -rm -rf output + -rm -rf ccp_output.error ccp_output_scm.xml ccp_output.xml ccp_output.pclint ccp_output.txt +endef + + +define test_option_ccpc + ccp $(test_option_SOURCES) --formatter vim +endef + + +define test_option_cov + +endef + + + + +#---------------------end build target : test_option------------------ + +#----------------build target : test_rawdata-------------------- + +test_rawdata : CC := gcc +test_rawdata : CXX := g++ +test_rawdata : CXXFLAGS := -pipe -fsigned-char -Wall -W -g -fPIC +test_rawdata : CPPFLAGS := +test_rawdata : IDLFLAGS := +test_rawdata : CFLAGS := -pipe -fsigned-char -Wall -W -g -fPIC +test_rawdata : INCPATH := -I. -I.. $(DEP_INCPATH) +test_rawdata : LDLIBS := -lcrypto -lm -lpthread $(DEP_LDLIBS) +test_rawdata : LDFLAGS := $(DEP_LDFLAGS) +test_rawdata : LINKFLAGS := -rdynamic + +test_rawdata_SOURCES := $(wildcard comake_autogen.cpp test_rawdata.cpp) +#test_rawdata_HEADERS := $(wildcard *.h) +test_rawdata_HEADERS := *.h +test_rawdata_IDLSRC := $(wildcard __$IDLSRC_VALUE$__) +test_rawdata_IDLSRCCPP := $(patsubst %.idl,%.cpp, $(test_rawdata_IDLSRC)) +test_rawdata_IDLSRCH := $(patsubst %.idl,%.h, $(test_rawdata_IDLSRC)) +test_rawdata_CONFDES := $(wildcard __$CONFDES$_VALUE$__ test_rawdata.des) +test_rawdata_CONFRANGE := $(patsubst %.des,%.range, $(test_rawdata_CONFDES)) +test_rawdata_OBJS := $(test_rawdata_IDLSRC:.idl=.o) +test_rawdata_OBJS += $(test_rawdata_SOURCES:.c=.o) +test_rawdata_OBJS := $(test_rawdata_OBJS:.cc=.o) +test_rawdata_OBJS := $(test_rawdata_OBJS:.cpp=.o) +test_rawdata_OBJS := $(test_rawdata_OBJS:.cxx=.o) +test_rawdata_OBJS := $(test_rawdata_OBJS:.C=.o) +test_rawdata_OBJS := $(test_rawdata_OBJS:.idl=.o) +test_rawdata_OBJS := $(test_rawdata_OBJS:.yacc=.o) +test_rawdata_OBJS := $(test_rawdata_OBJS:.lex=.o) +test_rawdata : $(test_rawdata_OBJS) + @echo "force_clean" + $(foreach n, $(wildcard ), $(if ifeq($(suffix $(n)), .c), $(CC) -c -o $(basename $(n)).o $(n) $(CXXFLAGS) $(CPPFLAGS) $(INCPATH); , $(CXX) -c -o $(basename $(n)).o $(n) $(CXXFLAGS) $(CPPFLAGS) $(INCPATH); )) + @`for x in $(test_rawdata_CONFDES);do cpp -C -o test_rawdata.range $$x $(CPPFLAGS) $(INCPATH);mkdir -p conf;cp test_rawdata.range conf/; done` + $(LINK) $^ -o $@ -Xlinker "-(" $(LDFLAGS) $(LDLIBS) $(LINKFLAGS) -Xlinker "-)" + + +define test_rawdata_output + mkdir -p output + mkdir -p output/bin + cp -rf test_rawdata output/bin + `if [ -e "conf" ];then cp -rf conf output/ ;fi` + +endef + + +define test_rawdata_clean + -rm -rf $(test_rawdata_OBJS) $(test_rawdata_IDLSRCCPP) $(test_rawdata_IDLSRCH) test_rawdata.range conf/test_rawdata.range + -rm -rf test_rawdata + -rm -rf output + -rm -rf ccp_output.error ccp_output_scm.xml ccp_output.xml ccp_output.pclint ccp_output.txt +endef + + +define test_rawdata_ccpc + ccp $(test_rawdata_SOURCES) --formatter vim +endef + + +define test_rawdata_cov + +endef + + + + +#---------------------end build target : test_rawdata------------------ + +#----------------build target : test_reader-------------------- + +test_reader : CC := gcc +test_reader : CXX := g++ +test_reader : CXXFLAGS := -pipe -fsigned-char -Wall -W -g -fPIC +test_reader : CPPFLAGS := +test_reader : IDLFLAGS := +test_reader : CFLAGS := -pipe -fsigned-char -Wall -W -g -fPIC +test_reader : INCPATH := -I. -I.. $(DEP_INCPATH) +test_reader : LDLIBS := -lcrypto -lm -lpthread $(DEP_LDLIBS) +test_reader : LDFLAGS := $(DEP_LDFLAGS) +test_reader : LINKFLAGS := -rdynamic + +test_reader_SOURCES := $(wildcard comake_autogen.cpp test_reader.cpp) +#test_reader_HEADERS := $(wildcard *.h) +test_reader_HEADERS := *.h +test_reader_IDLSRC := $(wildcard __$IDLSRC_VALUE$__) +test_reader_IDLSRCCPP := $(patsubst %.idl,%.cpp, $(test_reader_IDLSRC)) +test_reader_IDLSRCH := $(patsubst %.idl,%.h, $(test_reader_IDLSRC)) +test_reader_CONFDES := $(wildcard __$CONFDES$_VALUE$__ test_reader.des) +test_reader_CONFRANGE := $(patsubst %.des,%.range, $(test_reader_CONFDES)) +test_reader_OBJS := $(test_reader_IDLSRC:.idl=.o) +test_reader_OBJS += $(test_reader_SOURCES:.c=.o) +test_reader_OBJS := $(test_reader_OBJS:.cc=.o) +test_reader_OBJS := $(test_reader_OBJS:.cpp=.o) +test_reader_OBJS := $(test_reader_OBJS:.cxx=.o) +test_reader_OBJS := $(test_reader_OBJS:.C=.o) +test_reader_OBJS := $(test_reader_OBJS:.idl=.o) +test_reader_OBJS := $(test_reader_OBJS:.yacc=.o) +test_reader_OBJS := $(test_reader_OBJS:.lex=.o) +test_reader : $(test_reader_OBJS) + @echo "force_clean" + $(foreach n, $(wildcard ), $(if ifeq($(suffix $(n)), .c), $(CC) -c -o $(basename $(n)).o $(n) $(CXXFLAGS) $(CPPFLAGS) $(INCPATH); , $(CXX) -c -o $(basename $(n)).o $(n) $(CXXFLAGS) $(CPPFLAGS) $(INCPATH); )) + @`for x in $(test_reader_CONFDES);do cpp -C -o test_reader.range $$x $(CPPFLAGS) $(INCPATH);mkdir -p conf;cp test_reader.range conf/; done` + $(LINK) $^ -o $@ -Xlinker "-(" $(LDFLAGS) $(LDLIBS) $(LINKFLAGS) -Xlinker "-)" + + +define test_reader_output + mkdir -p output + mkdir -p output/bin + cp -rf test_reader output/bin + `if [ -e "conf" ];then cp -rf conf output/ ;fi` + +endef + + +define test_reader_clean + -rm -rf $(test_reader_OBJS) $(test_reader_IDLSRCCPP) $(test_reader_IDLSRCH) test_reader.range conf/test_reader.range + -rm -rf test_reader + -rm -rf output + -rm -rf ccp_output.error ccp_output_scm.xml ccp_output.xml ccp_output.pclint ccp_output.txt +endef + + +define test_reader_ccpc + ccp $(test_reader_SOURCES) --formatter vim +endef + + +define test_reader_cov + +endef + + + + +#---------------------end build target : test_reader------------------ + +#----------------build target : test_rebuild-------------------- + +test_rebuild : CC := gcc +test_rebuild : CXX := g++ +test_rebuild : CXXFLAGS := -pipe -fsigned-char -Wall -W -g -fPIC +test_rebuild : CPPFLAGS := +test_rebuild : IDLFLAGS := +test_rebuild : CFLAGS := -pipe -fsigned-char -Wall -W -g -fPIC +test_rebuild : INCPATH := -I. -I.. $(DEP_INCPATH) +test_rebuild : LDLIBS := -lcrypto -lm -lpthread $(DEP_LDLIBS) +test_rebuild : LDFLAGS := $(DEP_LDFLAGS) +test_rebuild : LINKFLAGS := -rdynamic + +test_rebuild_SOURCES := $(wildcard comake_autogen.cpp test_rebuild.cpp) +#test_rebuild_HEADERS := $(wildcard *.h) +test_rebuild_HEADERS := *.h +test_rebuild_IDLSRC := $(wildcard __$IDLSRC_VALUE$__) +test_rebuild_IDLSRCCPP := $(patsubst %.idl,%.cpp, $(test_rebuild_IDLSRC)) +test_rebuild_IDLSRCH := $(patsubst %.idl,%.h, $(test_rebuild_IDLSRC)) +test_rebuild_CONFDES := $(wildcard __$CONFDES$_VALUE$__ test_rebuild.des) +test_rebuild_CONFRANGE := $(patsubst %.des,%.range, $(test_rebuild_CONFDES)) +test_rebuild_OBJS := $(test_rebuild_IDLSRC:.idl=.o) +test_rebuild_OBJS += $(test_rebuild_SOURCES:.c=.o) +test_rebuild_OBJS := $(test_rebuild_OBJS:.cc=.o) +test_rebuild_OBJS := $(test_rebuild_OBJS:.cpp=.o) +test_rebuild_OBJS := $(test_rebuild_OBJS:.cxx=.o) +test_rebuild_OBJS := $(test_rebuild_OBJS:.C=.o) +test_rebuild_OBJS := $(test_rebuild_OBJS:.idl=.o) +test_rebuild_OBJS := $(test_rebuild_OBJS:.yacc=.o) +test_rebuild_OBJS := $(test_rebuild_OBJS:.lex=.o) +test_rebuild : $(test_rebuild_OBJS) + @echo "force_clean" + $(foreach n, $(wildcard ), $(if ifeq($(suffix $(n)), .c), $(CC) -c -o $(basename $(n)).o $(n) $(CXXFLAGS) $(CPPFLAGS) $(INCPATH); , $(CXX) -c -o $(basename $(n)).o $(n) $(CXXFLAGS) $(CPPFLAGS) $(INCPATH); )) + @`for x in $(test_rebuild_CONFDES);do cpp -C -o test_rebuild.range $$x $(CPPFLAGS) $(INCPATH);mkdir -p conf;cp test_rebuild.range conf/; done` + $(LINK) $^ -o $@ -Xlinker "-(" $(LDFLAGS) $(LDLIBS) $(LINKFLAGS) -Xlinker "-)" + + +define test_rebuild_output + mkdir -p output + mkdir -p output/bin + cp -rf test_rebuild output/bin + `if [ -e "conf" ];then cp -rf conf output/ ;fi` + +endef + + +define test_rebuild_clean + -rm -rf $(test_rebuild_OBJS) $(test_rebuild_IDLSRCCPP) $(test_rebuild_IDLSRCH) test_rebuild.range conf/test_rebuild.range + -rm -rf test_rebuild + -rm -rf output + -rm -rf ccp_output.error ccp_output_scm.xml ccp_output.xml ccp_output.pclint ccp_output.txt +endef + + +define test_rebuild_ccpc + ccp $(test_rebuild_SOURCES) --formatter vim +endef + + +define test_rebuild_cov + +endef + + + + +#---------------------end build target : test_rebuild------------------ + +#----------------build target : test_str-------------------- + +test_str : CC := gcc +test_str : CXX := g++ +test_str : CXXFLAGS := -pipe -fsigned-char -Wall -W -g -fPIC +test_str : CPPFLAGS := +test_str : IDLFLAGS := +test_str : CFLAGS := -pipe -fsigned-char -Wall -W -g -fPIC +test_str : INCPATH := -I. -I.. $(DEP_INCPATH) +test_str : LDLIBS := -lcrypto -lm -lpthread $(DEP_LDLIBS) +test_str : LDFLAGS := $(DEP_LDFLAGS) +test_str : LINKFLAGS := -rdynamic + +test_str_SOURCES := $(wildcard comake_autogen.cpp test_str.cpp) +#test_str_HEADERS := $(wildcard *.h) +test_str_HEADERS := *.h +test_str_IDLSRC := $(wildcard __$IDLSRC_VALUE$__) +test_str_IDLSRCCPP := $(patsubst %.idl,%.cpp, $(test_str_IDLSRC)) +test_str_IDLSRCH := $(patsubst %.idl,%.h, $(test_str_IDLSRC)) +test_str_CONFDES := $(wildcard __$CONFDES$_VALUE$__ test_str.des) +test_str_CONFRANGE := $(patsubst %.des,%.range, $(test_str_CONFDES)) +test_str_OBJS := $(test_str_IDLSRC:.idl=.o) +test_str_OBJS += $(test_str_SOURCES:.c=.o) +test_str_OBJS := $(test_str_OBJS:.cc=.o) +test_str_OBJS := $(test_str_OBJS:.cpp=.o) +test_str_OBJS := $(test_str_OBJS:.cxx=.o) +test_str_OBJS := $(test_str_OBJS:.C=.o) +test_str_OBJS := $(test_str_OBJS:.idl=.o) +test_str_OBJS := $(test_str_OBJS:.yacc=.o) +test_str_OBJS := $(test_str_OBJS:.lex=.o) +test_str : $(test_str_OBJS) + @echo "force_clean" + $(foreach n, $(wildcard ), $(if ifeq($(suffix $(n)), .c), $(CC) -c -o $(basename $(n)).o $(n) $(CXXFLAGS) $(CPPFLAGS) $(INCPATH); , $(CXX) -c -o $(basename $(n)).o $(n) $(CXXFLAGS) $(CPPFLAGS) $(INCPATH); )) + @`for x in $(test_str_CONFDES);do cpp -C -o test_str.range $$x $(CPPFLAGS) $(INCPATH);mkdir -p conf;cp test_str.range conf/; done` + $(LINK) $^ -o $@ -Xlinker "-(" $(LDFLAGS) $(LDLIBS) $(LINKFLAGS) -Xlinker "-)" + + +define test_str_output + mkdir -p output + mkdir -p output/bin + cp -rf test_str output/bin + `if [ -e "conf" ];then cp -rf conf output/ ;fi` + +endef + + +define test_str_clean + -rm -rf $(test_str_OBJS) $(test_str_IDLSRCCPP) $(test_str_IDLSRCH) test_str.range conf/test_str.range + -rm -rf test_str + -rm -rf output + -rm -rf ccp_output.error ccp_output_scm.xml ccp_output.xml ccp_output.pclint ccp_output.txt +endef + + +define test_str_ccpc + ccp $(test_str_SOURCES) --formatter vim +endef + + +define test_str_cov + +endef + + + + +#---------------------end build target : test_str------------------ + +#----------------build target : test_t1-------------------- + +test_t1 : CC := gcc +test_t1 : CXX := g++ +test_t1 : CXXFLAGS := -pipe -fsigned-char -Wall -W -g -fPIC +test_t1 : CPPFLAGS := +test_t1 : IDLFLAGS := +test_t1 : CFLAGS := -pipe -fsigned-char -Wall -W -g -fPIC +test_t1 : INCPATH := -I. -I.. $(DEP_INCPATH) +test_t1 : LDLIBS := -lcrypto -lm -lpthread $(DEP_LDLIBS) +test_t1 : LDFLAGS := $(DEP_LDFLAGS) +test_t1 : LINKFLAGS := -rdynamic + +test_t1_SOURCES := $(wildcard comake_autogen.cpp test_t1.cpp) +#test_t1_HEADERS := $(wildcard *.h) +test_t1_HEADERS := *.h +test_t1_IDLSRC := $(wildcard __$IDLSRC_VALUE$__) +test_t1_IDLSRCCPP := $(patsubst %.idl,%.cpp, $(test_t1_IDLSRC)) +test_t1_IDLSRCH := $(patsubst %.idl,%.h, $(test_t1_IDLSRC)) +test_t1_CONFDES := $(wildcard __$CONFDES$_VALUE$__ test_t1.des) +test_t1_CONFRANGE := $(patsubst %.des,%.range, $(test_t1_CONFDES)) +test_t1_OBJS := $(test_t1_IDLSRC:.idl=.o) +test_t1_OBJS += $(test_t1_SOURCES:.c=.o) +test_t1_OBJS := $(test_t1_OBJS:.cc=.o) +test_t1_OBJS := $(test_t1_OBJS:.cpp=.o) +test_t1_OBJS := $(test_t1_OBJS:.cxx=.o) +test_t1_OBJS := $(test_t1_OBJS:.C=.o) +test_t1_OBJS := $(test_t1_OBJS:.idl=.o) +test_t1_OBJS := $(test_t1_OBJS:.yacc=.o) +test_t1_OBJS := $(test_t1_OBJS:.lex=.o) +test_t1 : $(test_t1_OBJS) + @echo "force_clean" + $(foreach n, $(wildcard ), $(if ifeq($(suffix $(n)), .c), $(CC) -c -o $(basename $(n)).o $(n) $(CXXFLAGS) $(CPPFLAGS) $(INCPATH); , $(CXX) -c -o $(basename $(n)).o $(n) $(CXXFLAGS) $(CPPFLAGS) $(INCPATH); )) + @`for x in $(test_t1_CONFDES);do cpp -C -o test_t1.range $$x $(CPPFLAGS) $(INCPATH);mkdir -p conf;cp test_t1.range conf/; done` + $(LINK) $^ -o $@ -Xlinker "-(" $(LDFLAGS) $(LDLIBS) $(LINKFLAGS) -Xlinker "-)" + + +define test_t1_output + mkdir -p output + mkdir -p output/bin + cp -rf test_t1 output/bin + `if [ -e "conf" ];then cp -rf conf output/ ;fi` + +endef + + +define test_t1_clean + -rm -rf $(test_t1_OBJS) $(test_t1_IDLSRCCPP) $(test_t1_IDLSRCH) test_t1.range conf/test_t1.range + -rm -rf test_t1 + -rm -rf output + -rm -rf ccp_output.error ccp_output_scm.xml ccp_output.xml ccp_output.pclint ccp_output.txt +endef + + +define test_t1_ccpc + ccp $(test_t1_SOURCES) --formatter vim +endef + + +define test_t1_cov + +endef + + + + +#---------------------end build target : test_t1------------------ + +#----------------build target : test_trans_float-------------------- + +test_trans_float : CC := gcc +test_trans_float : CXX := g++ +test_trans_float : CXXFLAGS := -pipe -fsigned-char -Wall -W -g -fPIC +test_trans_float : CPPFLAGS := +test_trans_float : IDLFLAGS := +test_trans_float : CFLAGS := -pipe -fsigned-char -Wall -W -g -fPIC +test_trans_float : INCPATH := -I. -I.. $(DEP_INCPATH) +test_trans_float : LDLIBS := -lcrypto -lm -lpthread $(DEP_LDLIBS) +test_trans_float : LDFLAGS := $(DEP_LDFLAGS) +test_trans_float : LINKFLAGS := -rdynamic + +test_trans_float_SOURCES := $(wildcard comake_autogen.cpp test_trans_float.cpp) +#test_trans_float_HEADERS := $(wildcard *.h) +test_trans_float_HEADERS := *.h +test_trans_float_IDLSRC := $(wildcard __$IDLSRC_VALUE$__) +test_trans_float_IDLSRCCPP := $(patsubst %.idl,%.cpp, $(test_trans_float_IDLSRC)) +test_trans_float_IDLSRCH := $(patsubst %.idl,%.h, $(test_trans_float_IDLSRC)) +test_trans_float_CONFDES := $(wildcard __$CONFDES$_VALUE$__ test_trans_float.des) +test_trans_float_CONFRANGE := $(patsubst %.des,%.range, $(test_trans_float_CONFDES)) +test_trans_float_OBJS := $(test_trans_float_IDLSRC:.idl=.o) +test_trans_float_OBJS += $(test_trans_float_SOURCES:.c=.o) +test_trans_float_OBJS := $(test_trans_float_OBJS:.cc=.o) +test_trans_float_OBJS := $(test_trans_float_OBJS:.cpp=.o) +test_trans_float_OBJS := $(test_trans_float_OBJS:.cxx=.o) +test_trans_float_OBJS := $(test_trans_float_OBJS:.C=.o) +test_trans_float_OBJS := $(test_trans_float_OBJS:.idl=.o) +test_trans_float_OBJS := $(test_trans_float_OBJS:.yacc=.o) +test_trans_float_OBJS := $(test_trans_float_OBJS:.lex=.o) +test_trans_float : $(test_trans_float_OBJS) + @echo "force_clean" + $(foreach n, $(wildcard ), $(if ifeq($(suffix $(n)), .c), $(CC) -c -o $(basename $(n)).o $(n) $(CXXFLAGS) $(CPPFLAGS) $(INCPATH); , $(CXX) -c -o $(basename $(n)).o $(n) $(CXXFLAGS) $(CPPFLAGS) $(INCPATH); )) + @`for x in $(test_trans_float_CONFDES);do cpp -C -o test_trans_float.range $$x $(CPPFLAGS) $(INCPATH);mkdir -p conf;cp test_trans_float.range conf/; done` + $(LINK) $^ -o $@ -Xlinker "-(" $(LDFLAGS) $(LDLIBS) $(LINKFLAGS) -Xlinker "-)" + + +define test_trans_float_output + mkdir -p output + mkdir -p output/bin + cp -rf test_trans_float output/bin + `if [ -e "conf" ];then cp -rf conf output/ ;fi` + +endef + + +define test_trans_float_clean + -rm -rf $(test_trans_float_OBJS) $(test_trans_float_IDLSRCCPP) $(test_trans_float_IDLSRCH) test_trans_float.range conf/test_trans_float.range + -rm -rf test_trans_float + -rm -rf output + -rm -rf ccp_output.error ccp_output_scm.xml ccp_output.xml ccp_output.pclint ccp_output.txt +endef + + +define test_trans_float_ccpc + ccp $(test_trans_float_SOURCES) --formatter vim +endef + + +define test_trans_float_cov + +endef + + + + +#---------------------end build target : test_trans_float------------------ + +#----------------build target : test_trans_str2str-------------------- + +test_trans_str2str : CC := gcc +test_trans_str2str : CXX := g++ +test_trans_str2str : CXXFLAGS := -pipe -fsigned-char -Wall -W -g -fPIC +test_trans_str2str : CPPFLAGS := +test_trans_str2str : IDLFLAGS := +test_trans_str2str : CFLAGS := -pipe -fsigned-char -Wall -W -g -fPIC +test_trans_str2str : INCPATH := -I. -I.. $(DEP_INCPATH) +test_trans_str2str : LDLIBS := -lcrypto -lm -lpthread $(DEP_LDLIBS) +test_trans_str2str : LDFLAGS := $(DEP_LDFLAGS) +test_trans_str2str : LINKFLAGS := -rdynamic + +test_trans_str2str_SOURCES := $(wildcard comake_autogen.cpp test_trans_str2str.cpp) +#test_trans_str2str_HEADERS := $(wildcard *.h) +test_trans_str2str_HEADERS := *.h +test_trans_str2str_IDLSRC := $(wildcard __$IDLSRC_VALUE$__) +test_trans_str2str_IDLSRCCPP := $(patsubst %.idl,%.cpp, $(test_trans_str2str_IDLSRC)) +test_trans_str2str_IDLSRCH := $(patsubst %.idl,%.h, $(test_trans_str2str_IDLSRC)) +test_trans_str2str_CONFDES := $(wildcard __$CONFDES$_VALUE$__ test_trans_str2str.des) +test_trans_str2str_CONFRANGE := $(patsubst %.des,%.range, $(test_trans_str2str_CONFDES)) +test_trans_str2str_OBJS := $(test_trans_str2str_IDLSRC:.idl=.o) +test_trans_str2str_OBJS += $(test_trans_str2str_SOURCES:.c=.o) +test_trans_str2str_OBJS := $(test_trans_str2str_OBJS:.cc=.o) +test_trans_str2str_OBJS := $(test_trans_str2str_OBJS:.cpp=.o) +test_trans_str2str_OBJS := $(test_trans_str2str_OBJS:.cxx=.o) +test_trans_str2str_OBJS := $(test_trans_str2str_OBJS:.C=.o) +test_trans_str2str_OBJS := $(test_trans_str2str_OBJS:.idl=.o) +test_trans_str2str_OBJS := $(test_trans_str2str_OBJS:.yacc=.o) +test_trans_str2str_OBJS := $(test_trans_str2str_OBJS:.lex=.o) +test_trans_str2str : $(test_trans_str2str_OBJS) + @echo "force_clean" + $(foreach n, $(wildcard ), $(if ifeq($(suffix $(n)), .c), $(CC) -c -o $(basename $(n)).o $(n) $(CXXFLAGS) $(CPPFLAGS) $(INCPATH); , $(CXX) -c -o $(basename $(n)).o $(n) $(CXXFLAGS) $(CPPFLAGS) $(INCPATH); )) + @`for x in $(test_trans_str2str_CONFDES);do cpp -C -o test_trans_str2str.range $$x $(CPPFLAGS) $(INCPATH);mkdir -p conf;cp test_trans_str2str.range conf/; done` + $(LINK) $^ -o $@ -Xlinker "-(" $(LDFLAGS) $(LDLIBS) $(LINKFLAGS) -Xlinker "-)" + + +define test_trans_str2str_output + mkdir -p output + mkdir -p output/bin + cp -rf test_trans_str2str output/bin + `if [ -e "conf" ];then cp -rf conf output/ ;fi` + +endef + + +define test_trans_str2str_clean + -rm -rf $(test_trans_str2str_OBJS) $(test_trans_str2str_IDLSRCCPP) $(test_trans_str2str_IDLSRCH) test_trans_str2str.range conf/test_trans_str2str.range + -rm -rf test_trans_str2str + -rm -rf output + -rm -rf ccp_output.error ccp_output_scm.xml ccp_output.xml ccp_output.pclint ccp_output.txt +endef + + +define test_trans_str2str_ccpc + ccp $(test_trans_str2str_SOURCES) --formatter vim +endef + + +define test_trans_str2str_cov + +endef + + + + +#---------------------end build target : test_trans_str2str------------------ + +#----------------build target : test_xiaowei-------------------- + +test_xiaowei : CC := gcc +test_xiaowei : CXX := g++ +test_xiaowei : CXXFLAGS := -pipe -fsigned-char -Wall -W -g -fPIC +test_xiaowei : CPPFLAGS := +test_xiaowei : IDLFLAGS := +test_xiaowei : CFLAGS := -pipe -fsigned-char -Wall -W -g -fPIC +test_xiaowei : INCPATH := -I. -I.. $(DEP_INCPATH) +test_xiaowei : LDLIBS := -lcrypto -lm -lpthread $(DEP_LDLIBS) +test_xiaowei : LDFLAGS := $(DEP_LDFLAGS) +test_xiaowei : LINKFLAGS := -rdynamic + +test_xiaowei_SOURCES := $(wildcard comake_autogen.cpp test_xiaowei.cpp) +#test_xiaowei_HEADERS := $(wildcard *.h) +test_xiaowei_HEADERS := *.h +test_xiaowei_IDLSRC := $(wildcard __$IDLSRC_VALUE$__) +test_xiaowei_IDLSRCCPP := $(patsubst %.idl,%.cpp, $(test_xiaowei_IDLSRC)) +test_xiaowei_IDLSRCH := $(patsubst %.idl,%.h, $(test_xiaowei_IDLSRC)) +test_xiaowei_CONFDES := $(wildcard __$CONFDES$_VALUE$__ test_xiaowei.des) +test_xiaowei_CONFRANGE := $(patsubst %.des,%.range, $(test_xiaowei_CONFDES)) +test_xiaowei_OBJS := $(test_xiaowei_IDLSRC:.idl=.o) +test_xiaowei_OBJS += $(test_xiaowei_SOURCES:.c=.o) +test_xiaowei_OBJS := $(test_xiaowei_OBJS:.cc=.o) +test_xiaowei_OBJS := $(test_xiaowei_OBJS:.cpp=.o) +test_xiaowei_OBJS := $(test_xiaowei_OBJS:.cxx=.o) +test_xiaowei_OBJS := $(test_xiaowei_OBJS:.C=.o) +test_xiaowei_OBJS := $(test_xiaowei_OBJS:.idl=.o) +test_xiaowei_OBJS := $(test_xiaowei_OBJS:.yacc=.o) +test_xiaowei_OBJS := $(test_xiaowei_OBJS:.lex=.o) +test_xiaowei : $(test_xiaowei_OBJS) + @echo "force_clean" + $(foreach n, $(wildcard ), $(if ifeq($(suffix $(n)), .c), $(CC) -c -o $(basename $(n)).o $(n) $(CXXFLAGS) $(CPPFLAGS) $(INCPATH); , $(CXX) -c -o $(basename $(n)).o $(n) $(CXXFLAGS) $(CPPFLAGS) $(INCPATH); )) + @`for x in $(test_xiaowei_CONFDES);do cpp -C -o test_xiaowei.range $$x $(CPPFLAGS) $(INCPATH);mkdir -p conf;cp test_xiaowei.range conf/; done` + $(LINK) $^ -o $@ -Xlinker "-(" $(LDFLAGS) $(LDLIBS) $(LINKFLAGS) -Xlinker "-)" + + +define test_xiaowei_output + mkdir -p output + mkdir -p output/bin + cp -rf test_xiaowei output/bin + `if [ -e "conf" ];then cp -rf conf output/ ;fi` + +endef + + +define test_xiaowei_clean + -rm -rf $(test_xiaowei_OBJS) $(test_xiaowei_IDLSRCCPP) $(test_xiaowei_IDLSRCH) test_xiaowei.range conf/test_xiaowei.range + -rm -rf test_xiaowei + -rm -rf output + -rm -rf ccp_output.error ccp_output_scm.xml ccp_output.xml ccp_output.pclint ccp_output.txt +endef + + +define test_xiaowei_ccpc + ccp $(test_xiaowei_SOURCES) --formatter vim +endef + + +define test_xiaowei_cov + +endef + + + + +#---------------------end build target : test_xiaowei------------------ + +#----------------build target : test_cfg2-------------------- + +test_cfg2 : CC := gcc +test_cfg2 : CXX := g++ +test_cfg2 : CXXFLAGS := -pipe -fsigned-char -Wall -W -g -fPIC +test_cfg2 : CPPFLAGS := +test_cfg2 : IDLFLAGS := +test_cfg2 : CFLAGS := -pipe -fsigned-char -Wall -W -g -fPIC +test_cfg2 : INCPATH := -I. -I.. $(DEP_INCPATH) +test_cfg2 : LDLIBS := -lcrypto -lm -lpthread $(DEP_LDLIBS) +test_cfg2 : LDFLAGS := $(DEP_LDFLAGS) +test_cfg2 : LINKFLAGS := -rdynamic + +test_cfg2_SOURCES := $(wildcard comake_autogen.cpp test_cfg2.cpp) +#test_cfg2_HEADERS := $(wildcard *.h) +test_cfg2_HEADERS := *.h +test_cfg2_IDLSRC := $(wildcard __$IDLSRC_VALUE$__) +test_cfg2_IDLSRCCPP := $(patsubst %.idl,%.cpp, $(test_cfg2_IDLSRC)) +test_cfg2_IDLSRCH := $(patsubst %.idl,%.h, $(test_cfg2_IDLSRC)) +test_cfg2_CONFDES := $(wildcard __$CONFDES$_VALUE$__ test_cfg2.des) +test_cfg2_CONFRANGE := $(patsubst %.des,%.range, $(test_cfg2_CONFDES)) +test_cfg2_OBJS := $(test_cfg2_IDLSRC:.idl=.o) +test_cfg2_OBJS += $(test_cfg2_SOURCES:.c=.o) +test_cfg2_OBJS := $(test_cfg2_OBJS:.cc=.o) +test_cfg2_OBJS := $(test_cfg2_OBJS:.cpp=.o) +test_cfg2_OBJS := $(test_cfg2_OBJS:.cxx=.o) +test_cfg2_OBJS := $(test_cfg2_OBJS:.C=.o) +test_cfg2_OBJS := $(test_cfg2_OBJS:.idl=.o) +test_cfg2_OBJS := $(test_cfg2_OBJS:.yacc=.o) +test_cfg2_OBJS := $(test_cfg2_OBJS:.lex=.o) +test_cfg2 : $(test_cfg2_OBJS) + @echo "force_clean" + $(foreach n, $(wildcard ), $(if ifeq($(suffix $(n)), .c), $(CC) -c -o $(basename $(n)).o $(n) $(CXXFLAGS) $(CPPFLAGS) $(INCPATH); , $(CXX) -c -o $(basename $(n)).o $(n) $(CXXFLAGS) $(CPPFLAGS) $(INCPATH); )) + @`for x in $(test_cfg2_CONFDES);do cpp -C -o test_cfg2.range $$x $(CPPFLAGS) $(INCPATH);mkdir -p conf;cp test_cfg2.range conf/; done` + $(LINK) $^ -o $@ -Xlinker "-(" $(LDFLAGS) $(LDLIBS) $(LINKFLAGS) -Xlinker "-)" + + +define test_cfg2_output + mkdir -p output + mkdir -p output/bin + cp -rf test_cfg2 output/bin + `if [ -e "conf" ];then cp -rf conf output/ ;fi` + +endef + + +define test_cfg2_clean + -rm -rf $(test_cfg2_OBJS) $(test_cfg2_IDLSRCCPP) $(test_cfg2_IDLSRCH) test_cfg2.range conf/test_cfg2.range + -rm -rf test_cfg2 + -rm -rf output + -rm -rf ccp_output.error ccp_output_scm.xml ccp_output.xml ccp_output.pclint ccp_output.txt +endef + + +define test_cfg2_ccpc + ccp $(test_cfg2_SOURCES) --formatter vim +endef + + +define test_cfg2_cov + +endef + + + + +#---------------------end build target : test_cfg2------------------ + +#----------------build target : test_cfg3-------------------- + +test_cfg3 : CC := gcc +test_cfg3 : CXX := g++ +test_cfg3 : CXXFLAGS := -pipe -fsigned-char -Wall -W -g -fPIC +test_cfg3 : CPPFLAGS := +test_cfg3 : IDLFLAGS := +test_cfg3 : CFLAGS := -pipe -fsigned-char -Wall -W -g -fPIC +test_cfg3 : INCPATH := -I. -I.. $(DEP_INCPATH) +test_cfg3 : LDLIBS := -lcrypto -lm -lpthread $(DEP_LDLIBS) +test_cfg3 : LDFLAGS := $(DEP_LDFLAGS) +test_cfg3 : LINKFLAGS := -rdynamic + +test_cfg3_SOURCES := $(wildcard comake_autogen.cpp test_cfg3.cpp) +#test_cfg3_HEADERS := $(wildcard *.h) +test_cfg3_HEADERS := *.h +test_cfg3_IDLSRC := $(wildcard __$IDLSRC_VALUE$__) +test_cfg3_IDLSRCCPP := $(patsubst %.idl,%.cpp, $(test_cfg3_IDLSRC)) +test_cfg3_IDLSRCH := $(patsubst %.idl,%.h, $(test_cfg3_IDLSRC)) +test_cfg3_CONFDES := $(wildcard __$CONFDES$_VALUE$__ test_cfg3.des) +test_cfg3_CONFRANGE := $(patsubst %.des,%.range, $(test_cfg3_CONFDES)) +test_cfg3_OBJS := $(test_cfg3_IDLSRC:.idl=.o) +test_cfg3_OBJS += $(test_cfg3_SOURCES:.c=.o) +test_cfg3_OBJS := $(test_cfg3_OBJS:.cc=.o) +test_cfg3_OBJS := $(test_cfg3_OBJS:.cpp=.o) +test_cfg3_OBJS := $(test_cfg3_OBJS:.cxx=.o) +test_cfg3_OBJS := $(test_cfg3_OBJS:.C=.o) +test_cfg3_OBJS := $(test_cfg3_OBJS:.idl=.o) +test_cfg3_OBJS := $(test_cfg3_OBJS:.yacc=.o) +test_cfg3_OBJS := $(test_cfg3_OBJS:.lex=.o) +test_cfg3 : $(test_cfg3_OBJS) + @echo "force_clean" + $(foreach n, $(wildcard ), $(if ifeq($(suffix $(n)), .c), $(CC) -c -o $(basename $(n)).o $(n) $(CXXFLAGS) $(CPPFLAGS) $(INCPATH); , $(CXX) -c -o $(basename $(n)).o $(n) $(CXXFLAGS) $(CPPFLAGS) $(INCPATH); )) + @`for x in $(test_cfg3_CONFDES);do cpp -C -o test_cfg3.range $$x $(CPPFLAGS) $(INCPATH);mkdir -p conf;cp test_cfg3.range conf/; done` + $(LINK) $^ -o $@ -Xlinker "-(" $(LDFLAGS) $(LDLIBS) $(LINKFLAGS) -Xlinker "-)" + + +define test_cfg3_output + mkdir -p output + mkdir -p output/bin + cp -rf test_cfg3 output/bin + `if [ -e "conf" ];then cp -rf conf output/ ;fi` + +endef + + +define test_cfg3_clean + -rm -rf $(test_cfg3_OBJS) $(test_cfg3_IDLSRCCPP) $(test_cfg3_IDLSRCH) test_cfg3.range conf/test_cfg3.range + -rm -rf test_cfg3 + -rm -rf output + -rm -rf ccp_output.error ccp_output_scm.xml ccp_output.xml ccp_output.pclint ccp_output.txt +endef + + +define test_cfg3_ccpc + ccp $(test_cfg3_SOURCES) --formatter vim +endef + + +define test_cfg3_cov + +endef + + + + +#---------------------end build target : test_cfg3------------------ + +#----------------build target : test_zr-------------------- + +test_zr : CC := gcc +test_zr : CXX := g++ +test_zr : CXXFLAGS := -pipe -fsigned-char -Wall -W -g -fPIC +test_zr : CPPFLAGS := +test_zr : IDLFLAGS := +test_zr : CFLAGS := -pipe -fsigned-char -Wall -W -g -fPIC +test_zr : INCPATH := -I. -I.. $(DEP_INCPATH) +test_zr : LDLIBS := -lcrypto -lm -lpthread $(DEP_LDLIBS) +test_zr : LDFLAGS := $(DEP_LDFLAGS) +test_zr : LINKFLAGS := -rdynamic + +test_zr_SOURCES := $(wildcard comake_autogen.cpp test_zr.cpp) +#test_zr_HEADERS := $(wildcard *.h) +test_zr_HEADERS := *.h +test_zr_IDLSRC := $(wildcard __$IDLSRC_VALUE$__) +test_zr_IDLSRCCPP := $(patsubst %.idl,%.cpp, $(test_zr_IDLSRC)) +test_zr_IDLSRCH := $(patsubst %.idl,%.h, $(test_zr_IDLSRC)) +test_zr_CONFDES := $(wildcard __$CONFDES$_VALUE$__ test_zr.des) +test_zr_CONFRANGE := $(patsubst %.des,%.range, $(test_zr_CONFDES)) +test_zr_OBJS := $(test_zr_IDLSRC:.idl=.o) +test_zr_OBJS += $(test_zr_SOURCES:.c=.o) +test_zr_OBJS := $(test_zr_OBJS:.cc=.o) +test_zr_OBJS := $(test_zr_OBJS:.cpp=.o) +test_zr_OBJS := $(test_zr_OBJS:.cxx=.o) +test_zr_OBJS := $(test_zr_OBJS:.C=.o) +test_zr_OBJS := $(test_zr_OBJS:.idl=.o) +test_zr_OBJS := $(test_zr_OBJS:.yacc=.o) +test_zr_OBJS := $(test_zr_OBJS:.lex=.o) +test_zr : $(test_zr_OBJS) + @echo "force_clean" + $(foreach n, $(wildcard ), $(if ifeq($(suffix $(n)), .c), $(CC) -c -o $(basename $(n)).o $(n) $(CXXFLAGS) $(CPPFLAGS) $(INCPATH); , $(CXX) -c -o $(basename $(n)).o $(n) $(CXXFLAGS) $(CPPFLAGS) $(INCPATH); )) + @`for x in $(test_zr_CONFDES);do cpp -C -o test_zr.range $$x $(CPPFLAGS) $(INCPATH);mkdir -p conf;cp test_zr.range conf/; done` + $(LINK) $^ -o $@ -Xlinker "-(" $(LDFLAGS) $(LDLIBS) $(LINKFLAGS) -Xlinker "-)" + + +define test_zr_output + mkdir -p output + mkdir -p output/bin + cp -rf test_zr output/bin + `if [ -e "conf" ];then cp -rf conf output/ ;fi` + +endef + + +define test_zr_clean + -rm -rf $(test_zr_OBJS) $(test_zr_IDLSRCCPP) $(test_zr_IDLSRCH) test_zr.range conf/test_zr.range + -rm -rf test_zr + -rm -rf output + -rm -rf ccp_output.error ccp_output_scm.xml ccp_output.xml ccp_output.pclint ccp_output.txt +endef + + +define test_zr_ccpc + ccp $(test_zr_SOURCES) --formatter vim +endef + + +define test_zr_cov + +endef + + + + +#---------------------end build target : test_zr------------------ + +#----------------build target : test_to_default-------------------- + +test_to_default : CC := gcc +test_to_default : CXX := g++ +test_to_default : CXXFLAGS := -pipe -fsigned-char -Wall -W -g -fPIC +test_to_default : CPPFLAGS := +test_to_default : IDLFLAGS := +test_to_default : CFLAGS := -pipe -fsigned-char -Wall -W -g -fPIC +test_to_default : INCPATH := -I. -I.. $(DEP_INCPATH) +test_to_default : LDLIBS := -lcrypto -lm -lpthread $(DEP_LDLIBS) +test_to_default : LDFLAGS := $(DEP_LDFLAGS) +test_to_default : LINKFLAGS := -rdynamic + +test_to_default_SOURCES := $(wildcard comake_autogen.cpp test_to_default.cpp) +#test_to_default_HEADERS := $(wildcard *.h) +test_to_default_HEADERS := *.h +test_to_default_IDLSRC := $(wildcard __$IDLSRC_VALUE$__) +test_to_default_IDLSRCCPP := $(patsubst %.idl,%.cpp, $(test_to_default_IDLSRC)) +test_to_default_IDLSRCH := $(patsubst %.idl,%.h, $(test_to_default_IDLSRC)) +test_to_default_CONFDES := $(wildcard __$CONFDES$_VALUE$__ test_to_default.des) +test_to_default_CONFRANGE := $(patsubst %.des,%.range, $(test_to_default_CONFDES)) +test_to_default_OBJS := $(test_to_default_IDLSRC:.idl=.o) +test_to_default_OBJS += $(test_to_default_SOURCES:.c=.o) +test_to_default_OBJS := $(test_to_default_OBJS:.cc=.o) +test_to_default_OBJS := $(test_to_default_OBJS:.cpp=.o) +test_to_default_OBJS := $(test_to_default_OBJS:.cxx=.o) +test_to_default_OBJS := $(test_to_default_OBJS:.C=.o) +test_to_default_OBJS := $(test_to_default_OBJS:.idl=.o) +test_to_default_OBJS := $(test_to_default_OBJS:.yacc=.o) +test_to_default_OBJS := $(test_to_default_OBJS:.lex=.o) +test_to_default : $(test_to_default_OBJS) + @echo "force_clean" + $(foreach n, $(wildcard ), $(if ifeq($(suffix $(n)), .c), $(CC) -c -o $(basename $(n)).o $(n) $(CXXFLAGS) $(CPPFLAGS) $(INCPATH); , $(CXX) -c -o $(basename $(n)).o $(n) $(CXXFLAGS) $(CPPFLAGS) $(INCPATH); )) + @`for x in $(test_to_default_CONFDES);do cpp -C -o test_to_default.range $$x $(CPPFLAGS) $(INCPATH);mkdir -p conf;cp test_to_default.range conf/; done` + $(LINK) $^ -o $@ -Xlinker "-(" $(LDFLAGS) $(LDLIBS) $(LINKFLAGS) -Xlinker "-)" + + +define test_to_default_output + mkdir -p output + mkdir -p output/bin + cp -rf test_to_default output/bin + `if [ -e "conf" ];then cp -rf conf output/ ;fi` + +endef + + +define test_to_default_clean + -rm -rf $(test_to_default_OBJS) $(test_to_default_IDLSRCCPP) $(test_to_default_IDLSRCH) test_to_default.range conf/test_to_default.range + -rm -rf test_to_default + -rm -rf output + -rm -rf ccp_output.error ccp_output_scm.xml ccp_output.xml ccp_output.pclint ccp_output.txt +endef + + +define test_to_default_ccpc + ccp $(test_to_default_SOURCES) --formatter vim +endef + + +define test_to_default_cov + +endef + + + + +#---------------------end build target : test_to_default------------------ + +#----------------build target : test_checkone-------------------- + +test_checkone : CC := gcc +test_checkone : CXX := g++ +test_checkone : CXXFLAGS := -pipe -fsigned-char -Wall -W -g -fPIC +test_checkone : CPPFLAGS := +test_checkone : IDLFLAGS := +test_checkone : CFLAGS := -pipe -fsigned-char -Wall -W -g -fPIC +test_checkone : INCPATH := -I. -I.. $(DEP_INCPATH) +test_checkone : LDLIBS := -lcrypto -lm -lpthread $(DEP_LDLIBS) +test_checkone : LDFLAGS := $(DEP_LDFLAGS) +test_checkone : LINKFLAGS := -rdynamic + +test_checkone_SOURCES := $(wildcard comake_autogen.cpp test_checkone.cpp) +#test_checkone_HEADERS := $(wildcard *.h) +test_checkone_HEADERS := *.h +test_checkone_IDLSRC := $(wildcard __$IDLSRC_VALUE$__) +test_checkone_IDLSRCCPP := $(patsubst %.idl,%.cpp, $(test_checkone_IDLSRC)) +test_checkone_IDLSRCH := $(patsubst %.idl,%.h, $(test_checkone_IDLSRC)) +test_checkone_CONFDES := $(wildcard __$CONFDES$_VALUE$__ test_checkone.des) +test_checkone_CONFRANGE := $(patsubst %.des,%.range, $(test_checkone_CONFDES)) +test_checkone_OBJS := $(test_checkone_IDLSRC:.idl=.o) +test_checkone_OBJS += $(test_checkone_SOURCES:.c=.o) +test_checkone_OBJS := $(test_checkone_OBJS:.cc=.o) +test_checkone_OBJS := $(test_checkone_OBJS:.cpp=.o) +test_checkone_OBJS := $(test_checkone_OBJS:.cxx=.o) +test_checkone_OBJS := $(test_checkone_OBJS:.C=.o) +test_checkone_OBJS := $(test_checkone_OBJS:.idl=.o) +test_checkone_OBJS := $(test_checkone_OBJS:.yacc=.o) +test_checkone_OBJS := $(test_checkone_OBJS:.lex=.o) +test_checkone : $(test_checkone_OBJS) + @echo "force_clean" + $(foreach n, $(wildcard ), $(if ifeq($(suffix $(n)), .c), $(CC) -c -o $(basename $(n)).o $(n) $(CXXFLAGS) $(CPPFLAGS) $(INCPATH); , $(CXX) -c -o $(basename $(n)).o $(n) $(CXXFLAGS) $(CPPFLAGS) $(INCPATH); )) + @`for x in $(test_checkone_CONFDES);do cpp -C -o test_checkone.range $$x $(CPPFLAGS) $(INCPATH);mkdir -p conf;cp test_checkone.range conf/; done` + $(LINK) $^ -o $@ -Xlinker "-(" $(LDFLAGS) $(LDLIBS) $(LINKFLAGS) -Xlinker "-)" + + +define test_checkone_output + mkdir -p output + mkdir -p output/bin + cp -rf test_checkone output/bin + `if [ -e "conf" ];then cp -rf conf output/ ;fi` + +endef + + +define test_checkone_clean + -rm -rf $(test_checkone_OBJS) $(test_checkone_IDLSRCCPP) $(test_checkone_IDLSRCH) test_checkone.range conf/test_checkone.range + -rm -rf test_checkone + -rm -rf output + -rm -rf ccp_output.error ccp_output_scm.xml ccp_output.xml ccp_output.pclint ccp_output.txt +endef + + +define test_checkone_ccpc + ccp $(test_checkone_SOURCES) --formatter vim +endef + + +define test_checkone_cov + +endef + + + + +#---------------------end build target : test_checkone------------------ + +#----------------build target : test_reloader-------------------- + +test_reloader : CC := gcc +test_reloader : CXX := g++ +test_reloader : CXXFLAGS := -pipe -fsigned-char -Wall -W -g -fPIC +test_reloader : CPPFLAGS := +test_reloader : IDLFLAGS := +test_reloader : CFLAGS := -pipe -fsigned-char -Wall -W -g -fPIC +test_reloader : INCPATH := -I. -I.. $(DEP_INCPATH) +test_reloader : LDLIBS := -lcrypto -lm -lpthread $(DEP_LDLIBS) +test_reloader : LDFLAGS := $(DEP_LDFLAGS) +test_reloader : LINKFLAGS := -rdynamic + +test_reloader_SOURCES := $(wildcard comake_autogen.cpp test_reloader.cpp) +#test_reloader_HEADERS := $(wildcard *.h) +test_reloader_HEADERS := *.h +test_reloader_IDLSRC := $(wildcard __$IDLSRC_VALUE$__) +test_reloader_IDLSRCCPP := $(patsubst %.idl,%.cpp, $(test_reloader_IDLSRC)) +test_reloader_IDLSRCH := $(patsubst %.idl,%.h, $(test_reloader_IDLSRC)) +test_reloader_CONFDES := $(wildcard __$CONFDES$_VALUE$__ test_reloader.des) +test_reloader_CONFRANGE := $(patsubst %.des,%.range, $(test_reloader_CONFDES)) +test_reloader_OBJS := $(test_reloader_IDLSRC:.idl=.o) +test_reloader_OBJS += $(test_reloader_SOURCES:.c=.o) +test_reloader_OBJS := $(test_reloader_OBJS:.cc=.o) +test_reloader_OBJS := $(test_reloader_OBJS:.cpp=.o) +test_reloader_OBJS := $(test_reloader_OBJS:.cxx=.o) +test_reloader_OBJS := $(test_reloader_OBJS:.C=.o) +test_reloader_OBJS := $(test_reloader_OBJS:.idl=.o) +test_reloader_OBJS := $(test_reloader_OBJS:.yacc=.o) +test_reloader_OBJS := $(test_reloader_OBJS:.lex=.o) +test_reloader : $(test_reloader_OBJS) + @echo "force_clean" + $(foreach n, $(wildcard ), $(if ifeq($(suffix $(n)), .c), $(CC) -c -o $(basename $(n)).o $(n) $(CXXFLAGS) $(CPPFLAGS) $(INCPATH); , $(CXX) -c -o $(basename $(n)).o $(n) $(CXXFLAGS) $(CPPFLAGS) $(INCPATH); )) + @`for x in $(test_reloader_CONFDES);do cpp -C -o test_reloader.range $$x $(CPPFLAGS) $(INCPATH);mkdir -p conf;cp test_reloader.range conf/; done` + $(LINK) $^ -o $@ -Xlinker "-(" $(LDFLAGS) $(LDLIBS) $(LINKFLAGS) -Xlinker "-)" + + +define test_reloader_output + mkdir -p output + mkdir -p output/bin + cp -rf test_reloader output/bin + `if [ -e "conf" ];then cp -rf conf output/ ;fi` + +endef + + +define test_reloader_clean + -rm -rf $(test_reloader_OBJS) $(test_reloader_IDLSRCCPP) $(test_reloader_IDLSRCH) test_reloader.range conf/test_reloader.range + -rm -rf test_reloader + -rm -rf output + -rm -rf ccp_output.error ccp_output_scm.xml ccp_output.xml ccp_output.pclint ccp_output.txt +endef + + +define test_reloader_ccpc + ccp $(test_reloader_SOURCES) --formatter vim +endef + + +define test_reloader_cov + +endef + + + + +#---------------------end build target : test_reloader------------------ + +#----------------build target : test_sigreload-------------------- + +test_sigreload : CC := gcc +test_sigreload : CXX := g++ +test_sigreload : CXXFLAGS := -pipe -fsigned-char -Wall -W -g -fPIC +test_sigreload : CPPFLAGS := +test_sigreload : IDLFLAGS := +test_sigreload : CFLAGS := -pipe -fsigned-char -Wall -W -g -fPIC +test_sigreload : INCPATH := -I. -I.. $(DEP_INCPATH) +test_sigreload : LDLIBS := -lcrypto -lm -lpthread $(DEP_LDLIBS) +test_sigreload : LDFLAGS := $(DEP_LDFLAGS) +test_sigreload : LINKFLAGS := -rdynamic + +test_sigreload_SOURCES := $(wildcard comake_autogen.cpp test_sigreload.cpp) +#test_sigreload_HEADERS := $(wildcard *.h) +test_sigreload_HEADERS := *.h +test_sigreload_IDLSRC := $(wildcard __$IDLSRC_VALUE$__) +test_sigreload_IDLSRCCPP := $(patsubst %.idl,%.cpp, $(test_sigreload_IDLSRC)) +test_sigreload_IDLSRCH := $(patsubst %.idl,%.h, $(test_sigreload_IDLSRC)) +test_sigreload_CONFDES := $(wildcard __$CONFDES$_VALUE$__ test_sigreload.des) +test_sigreload_CONFRANGE := $(patsubst %.des,%.range, $(test_sigreload_CONFDES)) +test_sigreload_OBJS := $(test_sigreload_IDLSRC:.idl=.o) +test_sigreload_OBJS += $(test_sigreload_SOURCES:.c=.o) +test_sigreload_OBJS := $(test_sigreload_OBJS:.cc=.o) +test_sigreload_OBJS := $(test_sigreload_OBJS:.cpp=.o) +test_sigreload_OBJS := $(test_sigreload_OBJS:.cxx=.o) +test_sigreload_OBJS := $(test_sigreload_OBJS:.C=.o) +test_sigreload_OBJS := $(test_sigreload_OBJS:.idl=.o) +test_sigreload_OBJS := $(test_sigreload_OBJS:.yacc=.o) +test_sigreload_OBJS := $(test_sigreload_OBJS:.lex=.o) +test_sigreload : $(test_sigreload_OBJS) + @echo "force_clean" + $(foreach n, $(wildcard ), $(if ifeq($(suffix $(n)), .c), $(CC) -c -o $(basename $(n)).o $(n) $(CXXFLAGS) $(CPPFLAGS) $(INCPATH); , $(CXX) -c -o $(basename $(n)).o $(n) $(CXXFLAGS) $(CPPFLAGS) $(INCPATH); )) + @`for x in $(test_sigreload_CONFDES);do cpp -C -o test_sigreload.range $$x $(CPPFLAGS) $(INCPATH);mkdir -p conf;cp test_sigreload.range conf/; done` + $(LINK) $^ -o $@ -Xlinker "-(" $(LDFLAGS) $(LDLIBS) $(LINKFLAGS) -Xlinker "-)" + + +define test_sigreload_output + mkdir -p output + mkdir -p output/bin + cp -rf test_sigreload output/bin + `if [ -e "conf" ];then cp -rf conf output/ ;fi` + +endef + + +define test_sigreload_clean + -rm -rf $(test_sigreload_OBJS) $(test_sigreload_IDLSRCCPP) $(test_sigreload_IDLSRCH) test_sigreload.range conf/test_sigreload.range + -rm -rf test_sigreload + -rm -rf output + -rm -rf ccp_output.error ccp_output_scm.xml ccp_output.xml ccp_output.pclint ccp_output.txt +endef + + +define test_sigreload_ccpc + ccp $(test_sigreload_SOURCES) --formatter vim +endef + + +define test_sigreload_cov + +endef + + + + +#---------------------end build target : test_sigreload------------------ + +#----------------build target : test_filereload-------------------- + +test_filereload : CC := gcc +test_filereload : CXX := g++ +test_filereload : CXXFLAGS := -pipe -fsigned-char -Wall -W -g -fPIC +test_filereload : CPPFLAGS := +test_filereload : IDLFLAGS := +test_filereload : CFLAGS := -pipe -fsigned-char -Wall -W -g -fPIC +test_filereload : INCPATH := -I. -I.. $(DEP_INCPATH) +test_filereload : LDLIBS := -lcrypto -lm -lpthread $(DEP_LDLIBS) +test_filereload : LDFLAGS := $(DEP_LDFLAGS) +test_filereload : LINKFLAGS := -rdynamic + +test_filereload_SOURCES := $(wildcard comake_autogen.cpp test_filereload.cpp) +#test_filereload_HEADERS := $(wildcard *.h) +test_filereload_HEADERS := *.h +test_filereload_IDLSRC := $(wildcard __$IDLSRC_VALUE$__) +test_filereload_IDLSRCCPP := $(patsubst %.idl,%.cpp, $(test_filereload_IDLSRC)) +test_filereload_IDLSRCH := $(patsubst %.idl,%.h, $(test_filereload_IDLSRC)) +test_filereload_CONFDES := $(wildcard __$CONFDES$_VALUE$__ test_filereload.des) +test_filereload_CONFRANGE := $(patsubst %.des,%.range, $(test_filereload_CONFDES)) +test_filereload_OBJS := $(test_filereload_IDLSRC:.idl=.o) +test_filereload_OBJS += $(test_filereload_SOURCES:.c=.o) +test_filereload_OBJS := $(test_filereload_OBJS:.cc=.o) +test_filereload_OBJS := $(test_filereload_OBJS:.cpp=.o) +test_filereload_OBJS := $(test_filereload_OBJS:.cxx=.o) +test_filereload_OBJS := $(test_filereload_OBJS:.C=.o) +test_filereload_OBJS := $(test_filereload_OBJS:.idl=.o) +test_filereload_OBJS := $(test_filereload_OBJS:.yacc=.o) +test_filereload_OBJS := $(test_filereload_OBJS:.lex=.o) +test_filereload : $(test_filereload_OBJS) + @echo "force_clean" + $(foreach n, $(wildcard ), $(if ifeq($(suffix $(n)), .c), $(CC) -c -o $(basename $(n)).o $(n) $(CXXFLAGS) $(CPPFLAGS) $(INCPATH); , $(CXX) -c -o $(basename $(n)).o $(n) $(CXXFLAGS) $(CPPFLAGS) $(INCPATH); )) + @`for x in $(test_filereload_CONFDES);do cpp -C -o test_filereload.range $$x $(CPPFLAGS) $(INCPATH);mkdir -p conf;cp test_filereload.range conf/; done` + $(LINK) $^ -o $@ -Xlinker "-(" $(LDFLAGS) $(LDLIBS) $(LINKFLAGS) -Xlinker "-)" + + +define test_filereload_output + mkdir -p output + mkdir -p output/bin + cp -rf test_filereload output/bin + `if [ -e "conf" ];then cp -rf conf output/ ;fi` + +endef + + +define test_filereload_clean + -rm -rf $(test_filereload_OBJS) $(test_filereload_IDLSRCCPP) $(test_filereload_IDLSRCH) test_filereload.range conf/test_filereload.range + -rm -rf test_filereload + -rm -rf output + -rm -rf ccp_output.error ccp_output_scm.xml ccp_output.xml ccp_output.pclint ccp_output.txt +endef + + +define test_filereload_ccpc + ccp $(test_filereload_SOURCES) --formatter vim +endef + + +define test_filereload_cov + +endef + + + + +#---------------------end build target : test_filereload------------------ + +#----------------build target : test_setvalue-------------------- + +test_setvalue : CC := gcc +test_setvalue : CXX := g++ +test_setvalue : CXXFLAGS := -pipe -fsigned-char -Wall -W -g -fPIC +test_setvalue : CPPFLAGS := +test_setvalue : IDLFLAGS := +test_setvalue : CFLAGS := -pipe -fsigned-char -Wall -W -g -fPIC +test_setvalue : INCPATH := -I. -I.. $(DEP_INCPATH) +test_setvalue : LDLIBS := -lcrypto -lm -lpthread $(DEP_LDLIBS) +test_setvalue : LDFLAGS := $(DEP_LDFLAGS) +test_setvalue : LINKFLAGS := -rdynamic + +test_setvalue_SOURCES := $(wildcard comake_autogen.cpp test_setvalue.cpp) +#test_setvalue_HEADERS := $(wildcard *.h) +test_setvalue_HEADERS := *.h +test_setvalue_IDLSRC := $(wildcard __$IDLSRC_VALUE$__) +test_setvalue_IDLSRCCPP := $(patsubst %.idl,%.cpp, $(test_setvalue_IDLSRC)) +test_setvalue_IDLSRCH := $(patsubst %.idl,%.h, $(test_setvalue_IDLSRC)) +test_setvalue_CONFDES := $(wildcard __$CONFDES$_VALUE$__ test_setvalue.des) +test_setvalue_CONFRANGE := $(patsubst %.des,%.range, $(test_setvalue_CONFDES)) +test_setvalue_OBJS := $(test_setvalue_IDLSRC:.idl=.o) +test_setvalue_OBJS += $(test_setvalue_SOURCES:.c=.o) +test_setvalue_OBJS := $(test_setvalue_OBJS:.cc=.o) +test_setvalue_OBJS := $(test_setvalue_OBJS:.cpp=.o) +test_setvalue_OBJS := $(test_setvalue_OBJS:.cxx=.o) +test_setvalue_OBJS := $(test_setvalue_OBJS:.C=.o) +test_setvalue_OBJS := $(test_setvalue_OBJS:.idl=.o) +test_setvalue_OBJS := $(test_setvalue_OBJS:.yacc=.o) +test_setvalue_OBJS := $(test_setvalue_OBJS:.lex=.o) +test_setvalue : $(test_setvalue_OBJS) + @echo "force_clean" + $(foreach n, $(wildcard ), $(if ifeq($(suffix $(n)), .c), $(CC) -c -o $(basename $(n)).o $(n) $(CXXFLAGS) $(CPPFLAGS) $(INCPATH); , $(CXX) -c -o $(basename $(n)).o $(n) $(CXXFLAGS) $(CPPFLAGS) $(INCPATH); )) + @`for x in $(test_setvalue_CONFDES);do cpp -C -o test_setvalue.range $$x $(CPPFLAGS) $(INCPATH);mkdir -p conf;cp test_setvalue.range conf/; done` + $(LINK) $^ -o $@ -Xlinker "-(" $(LDFLAGS) $(LDLIBS) $(LINKFLAGS) -Xlinker "-)" + + +define test_setvalue_output + mkdir -p output + mkdir -p output/bin + cp -rf test_setvalue output/bin + `if [ -e "conf" ];then cp -rf conf output/ ;fi` + +endef + + +define test_setvalue_clean + -rm -rf $(test_setvalue_OBJS) $(test_setvalue_IDLSRCCPP) $(test_setvalue_IDLSRCH) test_setvalue.range conf/test_setvalue.range + -rm -rf test_setvalue + -rm -rf output + -rm -rf ccp_output.error ccp_output_scm.xml ccp_output.xml ccp_output.pclint ccp_output.txt +endef + + +define test_setvalue_ccpc + ccp $(test_setvalue_SOURCES) --formatter vim +endef + + +define test_setvalue_cov + +endef + + + + +#---------------------end build target : test_setvalue------------------ + +define _output + $(test_get_default_output) + $(test_1010new_output) + $(test_ivar_output) + $(test_auto_output) + $(test_cfg_output) + $(test_conf_output) + $(test_demo_output) + $(test_err_output) + $(test_get_value_output) + $(test_option_output) + $(test_rawdata_output) + $(test_reader_output) + $(test_rebuild_output) + $(test_str_output) + $(test_t1_output) + $(test_trans_float_output) + $(test_trans_str2str_output) + $(test_xiaowei_output) + $(test_cfg2_output) + $(test_cfg3_output) + $(test_zr_output) + $(test_to_default_output) + $(test_checkone_output) + $(test_reloader_output) + $(test_sigreload_output) + $(test_filereload_output) + $(test_setvalue_output) +endef + + +define _clean + $(test_get_default_clean) + $(test_1010new_clean) + $(test_ivar_clean) + $(test_auto_clean) + $(test_cfg_clean) + $(test_conf_clean) + $(test_demo_clean) + $(test_err_clean) + $(test_get_value_clean) + $(test_option_clean) + $(test_rawdata_clean) + $(test_reader_clean) + $(test_rebuild_clean) + $(test_str_clean) + $(test_t1_clean) + $(test_trans_float_clean) + $(test_trans_str2str_clean) + $(test_xiaowei_clean) + $(test_cfg2_clean) + $(test_cfg3_clean) + $(test_zr_clean) + $(test_to_default_clean) + $(test_checkone_clean) + $(test_reloader_clean) + $(test_sigreload_clean) + $(test_filereload_clean) + $(test_setvalue_clean) +endef + + +ccpc : + $(test_get_default_ccpc) + $(test_1010new_ccpc) + $(test_ivar_ccpc) + $(test_auto_ccpc) + $(test_cfg_ccpc) + $(test_conf_ccpc) + $(test_demo_ccpc) + $(test_err_ccpc) + $(test_get_value_ccpc) + $(test_option_ccpc) + $(test_rawdata_ccpc) + $(test_reader_ccpc) + $(test_rebuild_ccpc) + $(test_str_ccpc) + $(test_t1_ccpc) + $(test_trans_float_ccpc) + $(test_trans_str2str_ccpc) + $(test_xiaowei_ccpc) + $(test_cfg2_ccpc) + $(test_cfg3_ccpc) + $(test_zr_ccpc) + $(test_to_default_ccpc) + $(test_checkone_ccpc) + $(test_reloader_ccpc) + $(test_sigreload_ccpc) + $(test_filereload_ccpc) + $(test_setvalue_ccpc) + +cov : + cov01 -1 + make clean + make + cov01 -0 + + + +output : test_get_default test_1010new test_ivar test_auto test_cfg test_conf test_demo test_err test_get_value test_option test_rawdata test_reader test_rebuild test_str test_t1 test_trans_float test_trans_str2str test_xiaowei test_cfg2 test_cfg3 test_zr test_to_default test_checkone test_reloader test_sigreload test_filereload test_setvalue + $(_output) + rm -rf $(MAKDEP) + +$(MAKDEP) : $(wildcard comake_autogen.cpp test_get_default.cpp test_1010new.cpp test_ivar.cpp test_auto.cpp test_cfg.cpp test_conf.cpp test_demo.cpp test_err.cpp test_get_value.cpp test_option.cpp test_rawdata.cpp test_reader.cpp test_rebuild.cpp test_str.cpp test_t1.cpp test_trans_float.cpp test_trans_str2str.cpp test_xiaowei.cpp test_cfg2.cpp test_cfg3.cpp test_zr.cpp test_to_default.cpp test_checkone.cpp test_reloader.cpp test_sigreload.cpp test_filereload.cpp test_setvalue.cpp) + -$(CC) -MG -MM $(CPPFLAGS) $(INCPATH) $(DEP_INCPATH) $^ > $@ + +clean: + $(_clean) + rm -rf $(MAKDEP) + + diff --git a/configure/test/checkone.conf b/configure/test/checkone.conf new file mode 100644 index 0000000000000000000000000000000000000000..54e79ac81fbe6d0dece29630e35ca08e7901f0df --- /dev/null +++ b/configure/test/checkone.conf @@ -0,0 +1,4 @@ +#配置文件 +[server] +port : 9900 +ip : 127.0.0.1 diff --git a/configure/test/checkone.range b/configure/test/checkone.range new file mode 100644 index 0000000000000000000000000000000000000000..5954b8aadb2a7ce87188afe5e7ec57f83cd1d885 --- /dev/null +++ b/configure/test/checkone.range @@ -0,0 +1,7 @@ +//约束文件:server.range +struct server_t{ + int32_t port = range(1024, 65535); + string ip = ip(); +}; +//然后我们就可以使用这种类型了 +server_t server; diff --git a/configure/test/clt.des b/configure/test/clt.des new file mode 100644 index 0000000000000000000000000000000000000000..550106f237f0aa38666a8bfaed651990c3df36d1 --- /dev/null +++ b/configure/test/clt.des @@ -0,0 +1,14 @@ +#ifndef CLT_DES +#define CLT_DES + +struct ubclt //设置ub客户端 +{ + string name = default("default"); //请求服务器文件名 + string ip[]; //服务器ip数组 @ip 127.0.0.1 + int32_t port = default(5000); //请求服务器数组 + int32_t read_timeout = default(500); + int32_t write_timeout = default(500); + int32_t connect_timeout = default(200); +}; + +#endif diff --git a/configure/test/comlog.range b/configure/test/comlog.range new file mode 100644 index 0000000000000000000000000000000000000000..00e771b7550cfcf9215ae2338c5d45f2e6915ffe --- /dev/null +++ b/configure/test/comlog.range @@ -0,0 +1,49 @@ +struct appender_t{ + string type; + string path; + string file; + string auth = default(""); + string reserved1 = default(""); + string reserved2 = default(""); + string reserved3 = default(""); + string reserved4 = default(""); + + string split_type = default("TRUNCT");//切割方式 + uint32_t log_size = default(2048);//回滚日志的大小 + int32_t open = range(0,1), default(1);//是否启用 + int32_t compress = range(0,1), default(0);//是否压缩 + uint32_t cuttime = default(60);//切割周期 + + uint32_t syslevel = range(0,31), default(16);//支持的系统日志级别 + string selflevel = default("");//支持的自定义日志级别 + string layout = default("");//打印出来的日志的格式 + string layout_ndc = default("");//打印的Key:value对的格式 +}; + + +struct comlog_t{ + string procname = default("NoModuleName");//进程名 + int32_t level = default(16);//日志级别的总控开关 + appender_t device[];//设备数组 + string selfdefine = default("");//自定义级别 +}; + +comlog_t comlog; +int32_t tt = default(16); + +struct A{ + int32_t a; +}; + +struct B{ + uint32_t b; +}; + +struct C{ + A a; + B b; + int32_t tt; + A a2; +}; + +C c; diff --git a/configure/test/gentest.sh b/configure/test/gentest.sh new file mode 100644 index 0000000000000000000000000000000000000000..e53edd0ceda1f7aea9b8299e82cb4d28e1958744 --- /dev/null +++ b/configure/test/gentest.sh @@ -0,0 +1,30 @@ +S=(char uchar int16 uint16 int32 uint32 int64 uint64 float double std_string) +for ((i=0;i<${#S[*]};i++)) ; do + echo ""; + echo '//========= Test '${S[$i]}'=============' + echo "try{" + echo ${S[$i]} a$i = $1.to_${S[$i]}"();" ; + echo 'std::cerr<<"to '${S[$i]}' successful, value = "< ./test_conf.log +diff ./test_conf.res ./test_conf.log >> res + + +echo ====RUN ./test_demo==== +./test_demo > ./test_demo.log +diff ./test_demo.res ./test_demo.log >> res + + +echo ====RUN ./test_err==== +./test_err > ./test_err.log +diff ./test_err.res ./test_err.log >> res + + +echo ====RUN ./test_get_value==== +./test_get_value > ./test_get_value.log +diff ./test_get_value.res ./test_get_value.log >> res + + +echo ====RUN ./test_option==== +./test_option > ./test_option.log +diff ./test_option.res ./test_option.log >> res + + +echo ====RUN ./test_rawdata==== +./test_rawdata > ./test_rawdata.log +diff ./test_rawdata.res ./test_rawdata.log >> res + + +echo ====RUN ./test_reader==== +./test_reader > ./test_reader.log +diff ./test_reader.res ./test_reader.log >> res + + +echo ====RUN ./test_rebuild==== +./test_rebuild > ./test_rebuild.log +diff ./test_rebuild.res ./test_rebuild.log >> res + + +echo ====RUN ./test_str==== +./test_str > ./test_str.log +diff ./test_str.res ./test_str.log >> res + + +echo ====RUN ./test_t1==== +./test_t1 > ./test_t1.log +diff ./test_t1.res ./test_t1.log >> res + + +echo ====RUN ./test_trans_float==== +./test_trans_float > ./test_trans_float.log +diff ./test_trans_float.res ./test_trans_float.log >> res + + +echo ====RUN ./test_trans_str2str==== +./test_trans_str2str > ./test_trans_str2str.log +diff ./test_trans_str2str.res ./test_trans_str2str.log >> res + + +echo ====RUN ./test_xiaowei==== +./test_xiaowei > ./test_xiaowei.log +diff ./test_xiaowei.res ./test_xiaowei.log >> res + +echo ======= Done! ============== +echo +echo | awk '{print "\033[1;32mIf *.log is diff to *.res, the diff is written to \033[31mres\033[m"}' +echo diff --git a/configure/test/str.conf b/configure/test/str.conf new file mode 100644 index 0000000000000000000000000000000000000000..9ffcf4ebcdd4b0a346b63c4dd342b14294861f4b --- /dev/null +++ b/configure/test/str.conf @@ -0,0 +1,2 @@ +str1 : "xyz\x41\x42\x43" +str2 : x234567890y234567890 diff --git a/configure/test/str2str b/configure/test/str2str new file mode 100644 index 0000000000000000000000000000000000000000..cb4dbcf40054b20219d77d451405587c00057d41 --- /dev/null +++ b/configure/test/str2str @@ -0,0 +1,6 @@ +"test" +"Haha"ddd +"\tThis is \"Hawk\".\n"sadf +askdfj;aj jaskdfj;askf +"\x41---" +"\101---" diff --git a/configure/test/svr.des b/configure/test/svr.des new file mode 100644 index 0000000000000000000000000000000000000000..0838e031c9f80686bb38c05bc9d6b5cd34c4bc9a --- /dev/null +++ b/configure/test/svr.des @@ -0,0 +1,18 @@ +#ifndef SVR_DES +#define SVR_DES +struct ubsvr +{ + string name = default("name"); + int32_t thread_num = default(30); + int32_t port = default(50000); + int32_t read_bufsize = default(1024000); + int32_t write_bufsize = default(1024000); + int32_t read_timeout = default(500); + int32_t write_timeout = default(500); + int32_t connect_timeout = default(200); + int32_t queue_size = default(100); + int32_t socket_size = default(512); +}; + + +#endif diff --git a/configure/test/t1.conf b/configure/test/t1.conf new file mode 100644 index 0000000000000000000000000000000000000000..657703b5c2b3e4b9d93f01a507a5197de21a803f --- /dev/null +++ b/configure/test/t1.conf @@ -0,0 +1,26 @@ +[@com] +age : 22 +name : xiaowei +[.sub] +haha : xiaowei +[@com] +age : 212 +name : yingxiang +[.sub] +haha : yingxiang +[@com] +age : 30 +name : wangjiping +[.sun] +haha : wjp +[GLOBAL] +Putian : 100 +name : com +@num : 1 +@num : 11 +@num : -2 +@ip : 123.-1.2.6 +@ip : 1.1.1.1 +@reg : AdalDlP +@reg : "S2sadf\t\x41" +@reg : asdlLLLkdkksdf diff --git a/configure/test/t1.cons b/configure/test/t1.cons new file mode 100644 index 0000000000000000000000000000000000000000..e55f6b3479d9594d8a9002a4e69aa1a5e2e419f8 --- /dev/null +++ b/configure/test/t1.cons @@ -0,0 +1,12 @@ +struct Person{ + int32_t age = range(0, 200); + string name = length(32); +}; + +Person com[4]; +string name; +int32_t Putian = range(-4, 18); +int32_t num[3] = range(0,10); +string ip[1] = ip(); + +string reg[4] = regexp("[A-Za-z]*"), length(10); diff --git a/configure/test/test.conf b/configure/test/test.conf new file mode 100644 index 0000000000000000000000000000000000000000..218f17b960f6f2835b6a59c04f9896985e460d46 --- /dev/null +++ b/configure/test/test.conf @@ -0,0 +1,8 @@ +module : Config Demo +[@server] +ip : 127.0.0.1 +port : 9900 +$include : inc.conf +[@server] +ip : 192.168.1.2 +port : 9901 diff --git a/configure/test/test.deps b/configure/test/test.deps new file mode 100644 index 0000000000000000000000000000000000000000..0f3b7ae569bdb245a93ad053cad89add159ad3ae --- /dev/null +++ b/configure/test/test.deps @@ -0,0 +1,8 @@ ++ public/configure configure_1-0-0-5_PD_BL ++ public/spreg spreg_1-0-1-1_PD_BL ++ third-64/pcre pcre_7-7-0-0_PD_BL ++ lib2-64/bsl bsl_1-0-2-4_PD_BL ++ third/pcre pcre_7-7-0-0_PD_BL ++ lib2/ullib ullib_3-1-24-0_PD_BL ++ lib2-64/ullib ullib_3-1-24-0_PD_BL ++ lib2/bsl bsl_1-0-2-4_PD_BL \ No newline at end of file diff --git a/configure/test/test.prj b/configure/test/test.prj new file mode 100644 index 0000000000000000000000000000000000000000..ad89183f1319210e255e4b57d174afd2d1a4dce0 --- /dev/null +++ b/configure/test/test.prj @@ -0,0 +1,97 @@ +########################################################################### +# Automatically generated by comake (1.0.0) 2009-03-09 16:24:43 # +########################################################################### +WORKROOT = ../../../ +INCPATH = . .. +CONFIG = public/configure +SOURCES += + + +target(test_get_default){ +SOURCES+=test_get_default.cpp +} +target(test_1010new){ +SOURCES+=test_1010new.cpp +} +target(test_ivar){ +SOURCES+=test_ivar.cpp +} +target(test_auto){ +SOURCES+=test_auto.cpp +} +target(test_cfg){ +SOURCES+=test_cfg.cpp +} +target(test_conf){ +SOURCES+=test_conf.cpp +} +target(test_demo){ +SOURCES+=test_demo.cpp +} +target(test_err){ +SOURCES+=test_err.cpp +} +target(test_get_value){ +SOURCES+=test_get_value.cpp +} +target(test_option){ +SOURCES+=test_option.cpp +} +target(test_rawdata){ +SOURCES+=test_rawdata.cpp +} +target(test_reader){ +SOURCES+=test_reader.cpp +} +target(test_rebuild){ +SOURCES+=test_rebuild.cpp +} +target(test_str){ +SOURCES+=test_str.cpp +} +target(test_t1){ +SOURCES+=test_t1.cpp +} +target(test_trans_float){ +SOURCES+=test_trans_float.cpp +} +target(test_trans_str2str){ +SOURCES+=test_trans_str2str.cpp +} +target(test_xiaowei){ +SOURCES+=test_xiaowei.cpp +} +target(test_cfg2){ +SOURCES+=test_cfg2.cpp +} +target(test_cfg3){ +SOURCES+=test_cfg3.cpp +} +target(test_zr){ +SOURCES+=test_zr.cpp +} +target(test_to_default){ +SOURCES+=test_to_default.cpp +} +target(test_checkone){ +SOURCES+=test_checkone.cpp +} +target(test_reloader){ +SOURCES+=test_reloader.cpp +} +target(test_sigreload){ +SOURCES+=test_sigreload.cpp +} + +target(test_filereload){ +SOURCES+=test_filereload.cpp +} + + + +target(test_Configure) { + SOURCES += test_Configure.cpp + CXXFLAGS += -Woverloaded-virtual + TEMPLATE += app +} + diff --git a/configure/test/test_1010new.cpp b/configure/test/test_1010new.cpp new file mode 100644 index 0000000000000000000000000000000000000000..9872899711c24abf8a8036fbf951a396d10a04b3 --- /dev/null +++ b/configure/test/test_1010new.cpp @@ -0,0 +1,57 @@ +/*************************************************************************** + * + * Copyright (c) 2009 Baidu.com, Inc. All Rights Reserved + * $Id: test_1010new.cpp,v 1.2 2009/03/23 03:14:53 yingxiang Exp $ + * + **************************************************************************/ + + + +/** + * @file test_1010new.cpp + * @author yingxiang(com@baidu.com) + * @date 2009/03/12 00:54:03 + * @version $Revision: 1.2 $ + * @brief + * + **/ + +#include "Configure.h" + +#define ASSERT(x) do{\ + if(!(x))printf("Assert failed %s:%d\n", __FILE__, __LINE__);\ + else printf("Assertion Successful. %s:%d\n", __FILE__, __LINE__);\ +}while(0) + + +int main(){ + comcfg::Configure conf; + int ret = conf.load(".", "t1.conf", "t1.cons"); + ASSERT(ret == comcfg::CONSTRAINT_ERROR); + system("touch t1.conf -d '19870121 12:35'"); + //system : date '+%s' -d'19870121 12:35' + //--> 538202100 + time_t t = conf.lastConfigModify(); + ASSERT(t == time_t(538202100) ); + return 0; +} + + + + + + + + + + + + + + + + + + + +/* vim: set ts=4 sw=4 sts=4 tw=100 */ diff --git a/configure/test/test_array_constraint/COMAKE b/configure/test/test_array_constraint/COMAKE new file mode 100644 index 0000000000000000000000000000000000000000..44a02c8c8d1eaf716bd88c842b42ffc6121d6887 --- /dev/null +++ b/configure/test/test_array_constraint/COMAKE @@ -0,0 +1,60 @@ +#edit-mode: -*- python -*- +#coding:gbk + +#工作路径. +WORKROOT('../../../../') + +#使用硬链接copy. +CopyUsingHardLink(True) + +#支持32位/64位平台编译 +#ENABLE_MULTI_LIBS(True) + +#C预处理器参数. +CPPFLAGS('-D_GNU_SOURCE -D__STDC_LIMIT_MACROS -DVERSION=\\\"1.9.8.7\\\"') +#为32位目标编译指定额外的预处理参数 +#CPPFLAGS_32('-D_XOPEN_SOURE=500') + +#C编译参数. +CFLAGS('-g -pipe -W -Wall -fPIC') + +#C++编译参数. +CXXFLAGS('-g -pipe -W -Wall -fPIC') + +#IDL编译参数 +IDLFLAGS('--compack') + +#UBRPC编译参数 +UBRPCFLAGS('--compack') + +#头文件路径. +INCPATHS('. ../../ ./include ./output ./output/include') + +#使用库 +LIBS('../../libconfig.a') + +#链接参数. +LDFLAGS('-lpthread -lcrypto -lrt') + +#依赖模块 +CONFIGS('lib2-64/ullib@base') +CONFIGS('lib2-64/bsl@base') +CONFIGS('public/spreg@base') +CONFIGS('com/btest/gtest@base') + +#为32位/64位指定不同的依赖路径. +#CONFIGS_32('lib2/ullib') +#CONFIGS_64('lib2-64/ullib') + +user_sources='' +user_headers='' + +#可执行文件 +Application('test_arr',Sources('test_arr.cpp')) +#静态库 +#StaticLibrary('test_group',Sources(user_sources),HeaderFiles(user_headers)) +#共享库 +#SharedLibrary('test_group',Sources(user_sources),HeaderFiles(user_headers)) +#子目录 +#Directory('demo') + diff --git a/configure/test/test_array_constraint/Makefile b/configure/test/test_array_constraint/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..a7163ab9e8fe2bcea3cfa8f0e0df1550b3af8a0c --- /dev/null +++ b/configure/test/test_array_constraint/Makefile @@ -0,0 +1,137 @@ +#COMAKE2 edit-mode: -*- Makefile -*- +####################64Bit Mode#################### +ifeq ($(shell uname -m),x86_64) +CC=gcc +CXX=g++ +CXXFLAGS=-g \ + -pipe \ + -W \ + -Wall \ + -fPIC +CFLAGS=-g \ + -pipe \ + -W \ + -Wall \ + -fPIC +CPPFLAGS=-D_GNU_SOURCE \ + -D__STDC_LIMIT_MACROS \ + -DVERSION=\"1.9.8.7\" +INCPATH=-I. \ + -I../../ \ + -I./include \ + -I./output \ + -I./output/include +DEP_INCPATH=-I../../../../com/btest/gtest \ + -I../../../../com/btest/gtest/include \ + -I../../../../com/btest/gtest/output \ + -I../../../../com/btest/gtest/output/include \ + -I../../../../lib2-64/bsl \ + -I../../../../lib2-64/bsl/include \ + -I../../../../lib2-64/bsl/output \ + -I../../../../lib2-64/bsl/output/include \ + -I../../../../lib2-64/ullib \ + -I../../../../lib2-64/ullib/include \ + -I../../../../lib2-64/ullib/output \ + -I../../../../lib2-64/ullib/output/include \ + -I../../../../public/spreg \ + -I../../../../public/spreg/include \ + -I../../../../public/spreg/output \ + -I../../../../public/spreg/output/include \ + -I../../../../quality/autotest/reportlib/cpp \ + -I../../../../quality/autotest/reportlib/cpp/include \ + -I../../../../quality/autotest/reportlib/cpp/output \ + -I../../../../quality/autotest/reportlib/cpp/output/include \ + -I../../../../third-64/pcre \ + -I../../../../third-64/pcre/include \ + -I../../../../third-64/pcre/output \ + -I../../../../third-64/pcre/output/include + +#============ CCP vars ============ +CCHECK=@ccheck.py +CCHECK_FLAGS= +PCLINT=@pclint +PCLINT_FLAGS= +CCP=@ccp.py +CCP_FLAGS= + + +#COMAKE UUID +COMAKE_MD5=96636deacbb58c864ba532f366b07a55 COMAKE + + +.PHONY:all +all:comake2_makefile_check test_arr + @echo "[COMAKE:BUILD][Target:'all']" + @echo "make all done" + +.PHONY:comake2_makefile_check +comake2_makefile_check: + @echo "[COMAKE:BUILD][Target:'comake2_makefile_check']" + #in case of error, update 'Makefile' by 'comake2' + @echo "$(COMAKE_MD5)">comake2.md5 + @md5sum -c --status comake2.md5 + @rm -f comake2.md5 + +.PHONY:ccpclean +ccpclean: + @echo "[COMAKE:BUILD][Target:'ccpclean']" + @echo "make ccpclean done" + +.PHONY:clean +clean:ccpclean + @echo "[COMAKE:BUILD][Target:'clean']" + rm -rf test_arr + rm -rf ./output/bin/test_arr + rm -rf test_arr_test_arr.o + +.PHONY:dist +dist: + @echo "[COMAKE:BUILD][Target:'dist']" + tar czvf output.tar.gz output + @echo "make dist done" + +.PHONY:distclean +distclean:clean + @echo "[COMAKE:BUILD][Target:'distclean']" + rm -f output.tar.gz + @echo "make distclean done" + +.PHONY:love +love: + @echo "[COMAKE:BUILD][Target:'love']" + @echo "make love done" + +test_arr:test_arr_test_arr.o \ + ../../libconfig.a + @echo "[COMAKE:BUILD][Target:'test_arr']" + $(CXX) test_arr_test_arr.o -Xlinker "-(" ../../libconfig.a ../../../../com/btest/gtest/output/lib/libgtest.a \ + ../../../../com/btest/gtest/output/lib/libgtest_main.a \ + ../../../../lib2-64/bsl/lib/libbsl.a \ + ../../../../lib2-64/bsl/lib/libbsl_ResourcePool.a \ + ../../../../lib2-64/bsl/lib/libbsl_archive.a \ + ../../../../lib2-64/bsl/lib/libbsl_buffer.a \ + ../../../../lib2-64/bsl/lib/libbsl_check_cast.a \ + ../../../../lib2-64/bsl/lib/libbsl_exception.a \ + ../../../../lib2-64/bsl/lib/libbsl_pool.a \ + ../../../../lib2-64/bsl/lib/libbsl_utils.a \ + ../../../../lib2-64/bsl/lib/libbsl_var.a \ + ../../../../lib2-64/bsl/lib/libbsl_var_implement.a \ + ../../../../lib2-64/bsl/lib/libbsl_var_utils.a \ + ../../../../lib2-64/ullib/lib/libullib.a \ + ../../../../public/spreg/libspreg.a \ + ../../../../quality/autotest/reportlib/cpp/libautotest.a \ + ../../../../third-64/pcre/lib/libpcre.a \ + ../../../../third-64/pcre/lib/libpcrecpp.a \ + ../../../../third-64/pcre/lib/libpcreposix.a -lpthread \ + -lcrypto \ + -lrt -Xlinker "-)" -o test_arr + mkdir -p ./output/bin + cp -f --link test_arr ./output/bin + +test_arr_test_arr.o:test_arr.cpp + @echo "[COMAKE:BUILD][Target:'test_arr_test_arr.o']" + $(CXX) -c $(INCPATH) $(DEP_INCPATH) $(CPPFLAGS) $(CXXFLAGS) -o test_arr_test_arr.o test_arr.cpp + +endif #ifeq ($(shell uname -m),x86_64) + + diff --git a/configure/test/test_array_constraint/conf/sample.conf b/configure/test/test_array_constraint/conf/sample.conf new file mode 100644 index 0000000000000000000000000000000000000000..11f0f458fe0e63f6410216917e72fad66652c798 --- /dev/null +++ b/configure/test/test_array_constraint/conf/sample.conf @@ -0,0 +1,14 @@ +[@sample_level] +@plan_id : 0 +default_name : default + +[@sample_level] +@plan_id : 12305 +@plan_id : 12306 +default_name : default +[.@sample] +name : cf +ratio : 50 +[.@sample] +name : content +ratio : 40 diff --git a/configure/test/test_array_constraint/conf/sample.conf.range b/configure/test/test_array_constraint/conf/sample.conf.range new file mode 100644 index 0000000000000000000000000000000000000000..e91d94a2d23bfb2e3786810823479151beee78f6 --- /dev/null +++ b/configure/test/test_array_constraint/conf/sample.conf.range @@ -0,0 +1,16 @@ +struct sample_t +{ + string name = default("default"); + string info = default(""); + int32_t ratio = default(50); +}; + +struct sample_level_t +{ + int32_t plan_id[]; + string default_name = default("default"); + string default_info = default(""); + sample_t sample[]; +}; + +sample_level_t sample_level[]; diff --git a/configure/test/test_array_constraint/conf/sample2.conf b/configure/test/test_array_constraint/conf/sample2.conf new file mode 100644 index 0000000000000000000000000000000000000000..0f9cc13f37c75d69fcb5919a46ddbfafea5df2f3 --- /dev/null +++ b/configure/test/test_array_constraint/conf/sample2.conf @@ -0,0 +1,2 @@ +[@sample_level] +default_name : default diff --git a/configure/test/test_array_constraint/conf/sample2.conf.range b/configure/test/test_array_constraint/conf/sample2.conf.range new file mode 100644 index 0000000000000000000000000000000000000000..aca57c487bc6e6cbae1ef5bb452ead590ac2785c --- /dev/null +++ b/configure/test/test_array_constraint/conf/sample2.conf.range @@ -0,0 +1,14 @@ +struct sample_t +{ + string name = default("default"); + string info = default(""); + int32_t ratio = default(50); +}; + +struct sample_level_t +{ + string default_name = default("default"); + sample_t sample[]; +}; + +sample_level_t sample_level[]; diff --git a/configure/test/test_array_constraint/test_arr.cpp b/configure/test/test_array_constraint/test_arr.cpp new file mode 100644 index 0000000000000000000000000000000000000000..2d3eed72669c63f65f7a88b464644710d68c86b0 --- /dev/null +++ b/configure/test/test_array_constraint/test_arr.cpp @@ -0,0 +1,56 @@ +#include +#include +#include +#include "plugin/plgcomlog.h" + +int main(int argc, char **argv) +{ + testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} +/** + * @brief check if the lib reports the vector overflow situation +**/ +class test_arr_suite : public ::testing::Test{ + protected: + test_arr_suite(){}; + virtual ~test_arr_suite(){}; + virtual void SetUp() { + //Called befor every TEST_F(test_arr_suite, *) + }; + virtual void TearDown() { + //Called after every TEST_F(test_arr_suite, *) + }; +}; + +/** + * @brief check if the defaultly created array can pass the constraint check + * @begin_version + **/ +TEST_F(test_arr_suite, case_constraint1) +{ + //TODO + //comcfg::Log::openLowLevel(); + comcfg::Configure conf; + int ret = conf.load("conf/", "sample.conf", "sample.conf.range"); + ASSERT_EQ(0, ret); + + EXPECT_EQ(conf["sample_level"][0]["sample"].selfType(), comcfg::CONFIG_ARRAY_TYPE); + EXPECT_EQ(conf["sample_level"][0]["sample"].size(), 0); +} + +/** + * @brief check if the defaultly created array can pass the constraint check + * @begin_version + **/ +TEST_F(test_arr_suite, case_constraint2) +{ + //TODO + //comcfg::Log::openLowLevel(); + comcfg::Configure conf; + int ret = conf.load("conf/", "sample2.conf", "sample2.conf.range"); + ASSERT_EQ(0, ret); + + EXPECT_EQ(conf["sample_level"][0]["sample"].selfType(), comcfg::CONFIG_ARRAY_TYPE); + EXPECT_EQ(conf["sample_level"][0]["sample"].size(), 0); +} diff --git a/configure/test/test_auto.cpp b/configure/test/test_auto.cpp new file mode 100644 index 0000000000000000000000000000000000000000..e2c08c0f087814ef615ee4ccb3b4bde4b1df3fc8 --- /dev/null +++ b/configure/test/test_auto.cpp @@ -0,0 +1,65 @@ +/*************************************************************************** + * + * Copyright (c) 2009 Baidu.com, Inc. All Rights Reserved + * $Id: test_auto.cpp,v 1.2 2009/03/23 03:14:53 yingxiang Exp $ + * + **************************************************************************/ + + + +/** + * @file test_auto.cpp + * @author yingxiang(com@baidu.com) + * @date 2009/03/11 17:06:15 + * @version $Revision: 1.2 $ + * @brief + * + **/ + +#include "cfgext.h" +#include "Configure.h" +int main(int argc, char ** argv){ + if(argc == 1){ + printf("Usage : %s constraint_file\n\n", argv[0]); + return 0; + } + try{ + //comcfg::Log::openLowLevel(); + bsl::string str = comcfg::autoConfigGen(argv[1]); + printf("%s", str.c_str()); +#if 1 + comcfg::Configure conf; + char * s = conf.getRebuildBuffer(str.size()); + strcpy(s, str.c_str()); + int ret = conf.rebuild(); + printf("================= rebuild ret = %d ===================\n", ret); + conf.print(); +#endif + }catch(comcfg::ConfigException e){ + fprintf(stderr, "Catch : %s\n", e.what()); + }catch(...){ + fprintf(stderr, "Catch : Unknown\n"); + } + + return 0; +} + + + + + + + + + + + + + + + + + + + +/* vim: set ts=4 sw=4 sts=4 tw=100 */ diff --git a/configure/test/test_cfg.cpp b/configure/test/test_cfg.cpp new file mode 100644 index 0000000000000000000000000000000000000000..3d91419f3289edac0d4df91aab089a97b35be7cc --- /dev/null +++ b/configure/test/test_cfg.cpp @@ -0,0 +1,45 @@ +/*************************************************************************** + * + * Copyright (c) 2009 Baidu.com, Inc. All Rights Reserved + * $Id: test_cfg.cpp,v 1.2 2009/03/23 03:14:53 yingxiang Exp $ + * + **************************************************************************/ + + + +/** + * @file test_cfg.cpp + * @author xiaowei(com@baidu.com) + * @date 2009/03/09 15:53:27 + * @version $Revision: 1.2 $ + * @brief + * + **/ +#include +int main(int argc, char **argv) +{ + comcfg::Flag flag; + flag.init(argc, argv); + flag.loadconfig(); + return 0; +} + + + + + + + + + + + + + + + + + + + +/* vim: set ts=4 sw=4 sts=4 tw=100 */ diff --git a/configure/test/test_cfg.des b/configure/test/test_cfg.des new file mode 100644 index 0000000000000000000000000000000000000000..5f0da09af977a93189f94ef97289ad97d2f8be3c --- /dev/null +++ b/configure/test/test_cfg.des @@ -0,0 +1,17 @@ +#include "log.des" +#include "clt.des" +#include "svr.des" + +struct my_t +{ + comlog log; + ubclt clt; + ubsvr svr; +}; + +comlog log; +ubclt clt[]; +ubsvr svr[]; + +my_t my; +string b;//ab diff --git a/configure/test/test_cfg2.cpp b/configure/test/test_cfg2.cpp new file mode 100644 index 0000000000000000000000000000000000000000..1f6b65f8981f3692722ca8022ffcbdd9ec5287c6 --- /dev/null +++ b/configure/test/test_cfg2.cpp @@ -0,0 +1,47 @@ +/*************************************************************************** + * + * Copyright (c) 2009 Baidu.com, Inc. All Rights Reserved + * $Id: test_cfg2.cpp,v 1.2 2009/03/23 03:14:53 yingxiang Exp $ + * + **************************************************************************/ + + + +/** + * @file test_cfg2.cpp + * @author xiaowei(com@baidu.com) + * @date 2009/03/09 16:07:57 + * @version $Revision: 1.2 $ + * @brief + * + **/ + +#include +int main(int argc, char **argv) +{ + comcfg::Flag flag; + flag.init(argc, argv); + flag.set_confpath(".", "t1.conf", "t1.cons"); + flag.loadconfig(); + return 0; +} + + + + + + + + + + + + + + + + + + + +/* vim: set ts=4 sw=4 sts=4 tw=100 */ diff --git a/configure/test/test_cfg3.cpp b/configure/test/test_cfg3.cpp new file mode 100644 index 0000000000000000000000000000000000000000..e77ad17e8d01cd640f5972b030c9720a7d3cc86a --- /dev/null +++ b/configure/test/test_cfg3.cpp @@ -0,0 +1,54 @@ +/*************************************************************************** + * + * Copyright (c) 2009 Baidu.com, Inc. All Rights Reserved + * $Id: test_cfg3.cpp,v 1.2 2009/03/23 03:14:53 yingxiang Exp $ + * + **************************************************************************/ + + + +/** + * @file test_cfg3.cpp + * @author xiaowei(com@baidu.com) + * @date 2009/03/09 16:10:23 + * @version $Revision: 1.2 $ + * @brief + * + **/ + +#include + +void version() +{ + printf("faint-------------\n"); +} + +int main(int argc, char **argv) +{ + comcfg::Flag flag; + flag.set_version(version); + flag.set_help(version); + flag.init(argc, argv); + flag.loadconfig(); + return 0; +} + + + + + + + + + + + + + + + + + + + +/* vim: set ts=4 sw=4 sts=4 tw=100 */ diff --git a/configure/test/test_checkConstraint/COMAKE b/configure/test/test_checkConstraint/COMAKE new file mode 100644 index 0000000000000000000000000000000000000000..14e9b58ffd2f19c673277c3a8403375734efc61d --- /dev/null +++ b/configure/test/test_checkConstraint/COMAKE @@ -0,0 +1,60 @@ +#edit-mode: -*- python -*- +#coding:gbk + +#工作路径. +WORKROOT('../../../../') + +#使用硬链接copy. +CopyUsingHardLink(True) + +#支持32位/64位平台编译 +#ENABLE_MULTI_LIBS(True) + +#C预处理器参数. +CPPFLAGS('-D_GNU_SOURCE -D__STDC_LIMIT_MACROS -DVERSION=\\\"1.9.8.7\\\"') +#为32位目标编译指定额外的预处理参数 +#CPPFLAGS_32('-D_XOPEN_SOURE=500') + +#C编译参数. +CFLAGS('-g -pipe -W -Wall -fPIC') + +#C++编译参数. +CXXFLAGS('-g -pipe -W -Wall -fPIC') + +#IDL编译参数 +IDLFLAGS('--compack') + +#UBRPC编译参数 +UBRPCFLAGS('--compack') + +#头文件路径. +INCPATHS('. ../../ ./include ./output ./output/include') + +#使用库 +LIBS('../../libconfig.a') + +#链接参数. +LDFLAGS('-lpthread -lcrypto -lrt') + +#依赖模块 +CONFIGS('lib2-64/ullib') +CONFIGS('lib2-64/bsl') +CONFIGS('public/spreg') +CONFIGS('com/btest/gtest') + +#为32位/64位指定不同的依赖路径. +#CONFIGS_32('lib2/ullib') +#CONFIGS_64('lib2-64/ullib') + +user_sources='' +user_headers='' + +#可执行文件 +Application('test_constraint',Sources('test_constraint.cpp')) +#静态库 +#StaticLibrary('test_group',Sources(user_sources),HeaderFiles(user_headers)) +#共享库 +#SharedLibrary('test_group',Sources(user_sources),HeaderFiles(user_headers)) +#子目录 +#Directory('demo') + diff --git a/configure/test/test_checkConstraint/Makefile b/configure/test/test_checkConstraint/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..ee2168946d0352cb0d761dbe6514da5bd1d1cc9f --- /dev/null +++ b/configure/test/test_checkConstraint/Makefile @@ -0,0 +1,137 @@ +#COMAKE2 edit-mode: -*- Makefile -*- +####################64Bit Mode#################### +ifeq ($(shell uname -m),x86_64) +CC=gcc +CXX=g++ +CXXFLAGS=-g \ + -pipe \ + -W \ + -Wall \ + -fPIC +CFLAGS=-g \ + -pipe \ + -W \ + -Wall \ + -fPIC +CPPFLAGS=-D_GNU_SOURCE \ + -D__STDC_LIMIT_MACROS \ + -DVERSION=\"1.9.8.7\" +INCPATH=-I. \ + -I../../ \ + -I./include \ + -I./output \ + -I./output/include +DEP_INCPATH=-I../../../../com/btest/gtest \ + -I../../../../com/btest/gtest/include \ + -I../../../../com/btest/gtest/output \ + -I../../../../com/btest/gtest/output/include \ + -I../../../../lib2-64/bsl \ + -I../../../../lib2-64/bsl/include \ + -I../../../../lib2-64/bsl/output \ + -I../../../../lib2-64/bsl/output/include \ + -I../../../../lib2-64/ullib \ + -I../../../../lib2-64/ullib/include \ + -I../../../../lib2-64/ullib/output \ + -I../../../../lib2-64/ullib/output/include \ + -I../../../../public/spreg \ + -I../../../../public/spreg/include \ + -I../../../../public/spreg/output \ + -I../../../../public/spreg/output/include \ + -I../../../../quality/autotest/reportlib/cpp \ + -I../../../../quality/autotest/reportlib/cpp/include \ + -I../../../../quality/autotest/reportlib/cpp/output \ + -I../../../../quality/autotest/reportlib/cpp/output/include \ + -I../../../../third-64/pcre \ + -I../../../../third-64/pcre/include \ + -I../../../../third-64/pcre/output \ + -I../../../../third-64/pcre/output/include + +#============ CCP vars ============ +CCHECK=@ccheck.py +CCHECK_FLAGS= +PCLINT=@pclint +PCLINT_FLAGS= +CCP=@ccp.py +CCP_FLAGS= + + +#COMAKE UUID +COMAKE_MD5=1b60095c966a1f959e8affcbcd52b483 COMAKE + + +.PHONY:all +all:comake2_makefile_check test_constraint + @echo "[COMAKE:BUILD][Target:'all']" + @echo "make all done" + +.PHONY:comake2_makefile_check +comake2_makefile_check: + @echo "[COMAKE:BUILD][Target:'comake2_makefile_check']" + #in case of error, update 'Makefile' by 'comake2' + @echo "$(COMAKE_MD5)">comake2.md5 + @md5sum -c --status comake2.md5 + @rm -f comake2.md5 + +.PHONY:ccpclean +ccpclean: + @echo "[COMAKE:BUILD][Target:'ccpclean']" + @echo "make ccpclean done" + +.PHONY:clean +clean:ccpclean + @echo "[COMAKE:BUILD][Target:'clean']" + rm -rf test_constraint + rm -rf ./output/bin/test_constraint + rm -rf test_constraint_test_constraint.o + +.PHONY:dist +dist: + @echo "[COMAKE:BUILD][Target:'dist']" + tar czvf output.tar.gz output + @echo "make dist done" + +.PHONY:distclean +distclean:clean + @echo "[COMAKE:BUILD][Target:'distclean']" + rm -f output.tar.gz + @echo "make distclean done" + +.PHONY:love +love: + @echo "[COMAKE:BUILD][Target:'love']" + @echo "make love done" + +test_constraint:test_constraint_test_constraint.o \ + ../../libconfig.a + @echo "[COMAKE:BUILD][Target:'test_constraint']" + $(CXX) test_constraint_test_constraint.o -Xlinker "-(" ../../libconfig.a ../../../../com/btest/gtest/output/lib/libgtest.a \ + ../../../../com/btest/gtest/output/lib/libgtest_main.a \ + ../../../../lib2-64/bsl/lib/libbsl.a \ + ../../../../lib2-64/bsl/lib/libbsl_ResourcePool.a \ + ../../../../lib2-64/bsl/lib/libbsl_archive.a \ + ../../../../lib2-64/bsl/lib/libbsl_buffer.a \ + ../../../../lib2-64/bsl/lib/libbsl_check_cast.a \ + ../../../../lib2-64/bsl/lib/libbsl_exception.a \ + ../../../../lib2-64/bsl/lib/libbsl_pool.a \ + ../../../../lib2-64/bsl/lib/libbsl_utils.a \ + ../../../../lib2-64/bsl/lib/libbsl_var.a \ + ../../../../lib2-64/bsl/lib/libbsl_var_implement.a \ + ../../../../lib2-64/bsl/lib/libbsl_var_utils.a \ + ../../../../lib2-64/ullib/lib/libullib.a \ + ../../../../public/spreg/libspreg.a \ + ../../../../quality/autotest/reportlib/cpp/libautotest.a \ + ../../../../third-64/pcre/lib/libpcre.a \ + ../../../../third-64/pcre/lib/libpcrecpp.a \ + ../../../../third-64/pcre/lib/libpcreposix.a -lpthread \ + -lcrypto \ + -lrt -Xlinker "-)" -o test_constraint + mkdir -p ./output/bin + cp -f --link test_constraint ./output/bin + +test_constraint_test_constraint.o:test_constraint.cpp + @echo "[COMAKE:BUILD][Target:'test_constraint_test_constraint.o']" + $(CXX) -c $(INCPATH) $(DEP_INCPATH) $(CPPFLAGS) $(CXXFLAGS) -o test_constraint_test_constraint.o test_constraint.cpp + +endif #ifeq ($(shell uname -m),x86_64) + + diff --git a/configure/test/test_checkConstraint/conf/bad_cons.range b/configure/test/test_checkConstraint/conf/bad_cons.range new file mode 100644 index 0000000000000000000000000000000000000000..eaea34904a470897bf6bbcb71cfb5fe7d52e2bea --- /dev/null +++ b/configure/test/test_checkConstraint/conf/bad_cons.range @@ -0,0 +1,8 @@ +struct server_t{ + string ip = ip(), length(20); + uint16_t port = range(1, 1023); +}; + +server_t server; +string position = length(100); + diff --git a/configure/test/test_checkConstraint/conf/cons.range b/configure/test/test_checkConstraint/conf/cons.range new file mode 100644 index 0000000000000000000000000000000000000000..f9a3873ab7fca7159508bff94e8a6bf920099d6c --- /dev/null +++ b/configure/test/test_checkConstraint/conf/cons.range @@ -0,0 +1,16 @@ +struct server_t{ + string ip = ip(), length(20); + uint16_t port = range(1, 1023); + string host = length(100); +}; + +server_t server; +string position = length(100); +uint32_t height[10] = range(0,10); + +struct company_t{ + string name = length(100); + server_t svr[]; +}; + +company_t company; diff --git a/configure/test/test_checkConstraint/conf/ill_cons.conf b/configure/test/test_checkConstraint/conf/ill_cons.conf new file mode 100644 index 0000000000000000000000000000000000000000..29f14aeeec8d68c6480974c9ead3352f5558fc7d --- /dev/null +++ b/configure/test/test_checkConstraint/conf/ill_cons.conf @@ -0,0 +1,26 @@ +[server] +ip : 1.2.3.4 +port : 123 +host : baidu +[GLOBAL] +position : beijing +[server2] +[.host1] +[..position2] +ip : 2.3.4.5 +[GLOBAL] +@height : 1 +@height : 2 +@height : 3 + +[company] +[.@svr] +ip : 4.3.2.1 +port : 321 +host : beijing +[.@svr] +ip : 5.5.5.5 +port : 111 +host : shenzhen +[company] +name : baidu.com diff --git a/configure/test/test_checkConstraint/conf/reg_cons.conf b/configure/test/test_checkConstraint/conf/reg_cons.conf new file mode 100644 index 0000000000000000000000000000000000000000..60c13514e7169d3f32f84c5ddcd8a9a3d3c94fbd --- /dev/null +++ b/configure/test/test_checkConstraint/conf/reg_cons.conf @@ -0,0 +1,16 @@ +[server] +ip : 1.2.3.4 +port : 123 +host : baidu +[GLOBAL] +position : beijing +@height : 5 +@height : 6 + +[company] +[.@svr] +ip : 4.3.2.1 +port : 321 +host : baidu +[company] +name : baidu.com diff --git a/configure/test/test_checkConstraint/test_constraint.cpp b/configure/test/test_checkConstraint/test_constraint.cpp new file mode 100644 index 0000000000000000000000000000000000000000..ddf921489f2bc4c8bf1d983f625c04204851b6e7 --- /dev/null +++ b/configure/test/test_checkConstraint/test_constraint.cpp @@ -0,0 +1,117 @@ +#include +#include +#include + + +int main(int argc, char **argv) +{ + testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} +/** + * @brief +**/ +class test_load_ex2_suite : public ::testing::Test{ + protected: + test_load_ex2_suite(){}; + virtual ~test_load_ex2_suite(){}; + virtual void SetUp() { + //Called befor every TEST_F(test_load_ex_suite, *) + }; + virtual void TearDown() { + //Called after every TEST_F(test_load_ex_suite, *) + }; +}; + + +/** + * @brief check null param + * @begin_version + **/ +TEST_F(test_load_ex2_suite, case_nullParam) +{ + //TODO + comcfg::Configure conf[3]; + int ret = conf[0].load_ex2("conf/", "ill_cons.conf", NULL); + ASSERT_EQ(0, ret); + ret = conf[1].load_ex2("conf/", "ill_cons.conf", ""); + ASSERT_EQ(0, ret); + ret = conf[2].load_ex2("conf/", "ill_cons.conf"); + ASSERT_EQ(0, ret); +} + +/** + * @brief check regular range file + * @begin_version + **/ +TEST_F(test_load_ex2_suite, case_reg_conf) +{ + //TODO + comcfg::Configure conf; + int ret = conf.load_ex2("conf/", "reg_cons.conf", "cons.range"); + ASSERT_EQ(0, ret); +} + +/** + * @brief check illegal range file + * @begin_version + **/ +TEST_F(test_load_ex2_suite, case_ill_conf) +{ + //TODO + comcfg::Configure conf; + int ret = conf.load_ex2("conf/", "ill_cons.conf", "cons.range"); + ASSERT_NE(0, ret); +} + +/** + * @brief check load()+checkConstraint() + * @begin_version + **/ +TEST_F(test_load_ex2_suite, case_load_check_conf) +{ + //TODO + comcfg::Configure conf; + int ret = conf.load("conf/", "ill_cons.conf", "cons.range"); + ASSERT_EQ(0, ret); + ret = conf.checkConstraint(); + ASSERT_NE(0, ret); +} + +/** + * @brief check load_ex()+checkConstraint() + * @begin_version + **/ +TEST_F(test_load_ex2_suite, case_load_ex_check_conf) +{ + //TODO + comcfg::Configure conf; + int ret = conf.load_ex("conf/", "ill_cons.conf", "cons.range"); + ASSERT_EQ(0, ret); + ret = conf.checkConstraint(); + ASSERT_NE(0, ret); +} + +/** + * @brief check reentrant check_once() + * @begin_version + **/ +TEST_F(test_load_ex2_suite, case_reentrant_check_once) +{ + //TODO + comcfg::Configure conf; + int ret = conf.load("conf/", "reg_cons.conf"); + ASSERT_EQ(0, ret); + for(int i=1; i<5; i++){ + ret = conf.check_once("conf/cons.range"); + ASSERT_EQ(0, ret); + ret = conf.checkConstraint(); + ASSERT_EQ(0, ret); + + ret = conf.check_once("conf/bad_cons.range"); + ASSERT_EQ(0, ret); + ret = conf.checkConstraint(); + ASSERT_NE(0, ret); + } +} + diff --git a/configure/test/test_checkone.cpp b/configure/test/test_checkone.cpp new file mode 100644 index 0000000000000000000000000000000000000000..a3a23642731d7db37dc7e82891cd9de3f6019c3c --- /dev/null +++ b/configure/test/test_checkone.cpp @@ -0,0 +1,31 @@ +/*************************************************************************** + * + * Copyright (c) 2009 Baidu.com, Inc. All Rights Reserved + * + **************************************************************************/ + + + +/** + * @file test_checkone.cpp + * @author zhang_rui(com@baidu.com) + * @date 2009-12-15 + * @brief + * + **/ + +#include "Configure.h" + +int main(int argc, char* argv[]){ + if (argc < 3) { + printf("usage : %s conf range\n",argv[0]); + return -1; + } + comcfg::Configure conf; + conf.load("./", argv[1]); + int chk = conf.check_once(argv[2]); + printf("checkone:%d\n", chk); + + return 0; +} + diff --git a/configure/test/test_conf.cpp b/configure/test/test_conf.cpp new file mode 100644 index 0000000000000000000000000000000000000000..ca84d7feab990e71464c99e109800c3189728b57 --- /dev/null +++ b/configure/test/test_conf.cpp @@ -0,0 +1,66 @@ +/*************************************************************************** + * + * Copyright (c) 2008 Baidu.com, Inc. All Rights Reserved + * $Id: test_conf.cpp,v 1.5 2009/02/13 15:25:31 yingxiang Exp $ + * + **************************************************************************/ + + + +/** + * @file test_conf.cpp + * @author yingxiang(com@baidu.com) + * @date 2008/12/24 18:47:10 + * @version $Revision: 1.5 $ + * @brief + * + **/ + +#include "Configure.h" +#include "stdio.h" +#include + +int main(){ + comcfg::Configure conf; + //comcfg::Log::openLowLevel(); + conf.load("./", "new.conf"); + comcfg::str_t str; + if(conf["COMLOG"]["FILE"]["TYPE"].get_bsl_string(&str) == 0){ + printf("read = [%s]\n", str.c_str()); + }else{ + printf("No such key\n"); + } + if(conf["COMLOG"]["FILEx"]["TYPE"][2].get_bsl_string(&str) == 0){ + printf("read = [%s]\n", str.c_str()); + }else{ + printf("No such key\n"); + } + try{ + conf["COMLOG"]["FILEx"]["TYPE"][2].to_bsl_string(); + } + catch(bsl::Exception e){ + printf("%s\n", e.what()); + } + int err; + int tmp = conf["COMLOG"]["FILE"]["SIZE"].to_int32(&err); + printf("read = [%d]\n", tmp); + return 0; +} + + + + + + + + + + + + + + + + + +/* vim: set ts=4 sw=4 sts=4 tw=100 */ diff --git a/configure/test/test_conf.res b/configure/test/test_conf.res new file mode 100644 index 0000000000000000000000000000000000000000..7ef8534d8449445ab433b0bbff440665fde2636c --- /dev/null +++ b/configure/test/test_conf.res @@ -0,0 +1,4 @@ +read = [FILE] +No such key +ConfigException.NoSuchKey +read = [0] diff --git a/configure/test/test_demo.cpp b/configure/test/test_demo.cpp new file mode 100644 index 0000000000000000000000000000000000000000..10d62987be4eed1ff2a0a4c8cf9d3333cef0da06 --- /dev/null +++ b/configure/test/test_demo.cpp @@ -0,0 +1,76 @@ +/*************************************************************************** + * + * Copyright (c) 2009 Baidu.com, Inc. All Rights Reserved + * $Id: test_demo.cpp,v 1.5 2009/02/13 15:25:31 yingxiang Exp $ + * + **************************************************************************/ + + + +/** + * @file test_demo.cpp + * @author yingxiang(com@baidu.com) + * @date 2009/01/06 16:50:46 + * @version $Revision: 1.5 $ + * @brief + * + **/ + +#include "Configure.h" +#include + +int main(){ + //comcfg :: Log :: openLowLevel(); + comcfg :: Configure conf; + int ret = conf.load("", "test.conf"); + if(ret != 0){ + return 0; + } + + try{ + std::cout<< "Module Name : " << conf["module"].to_bsl_string() << std::endl; + size_t num = conf["server"].size(); + std::cout<< "We have " << num << " servers." << std::endl; + for(size_t i = 0; i < num; ++i){ + printf("Server[%d] is : ip = %s, port = %d\n", + (int)i, + conf["server"][i]["ip"].to_cstr(), + conf["server"][i]["port"].to_int32() ); + } + } + catch(comcfg :: ConfigException e){ + std::cerr << "Something error "<< e.what() << std::endl; + } + catch(...){ + std::cerr << "What's wrong?" << std::endl; + } + size_t sz; + printf("\n-------dump-------\n%s\n--------print---------\n", conf.dump(&sz)); + conf.print(); + comcfg::Configure nxt; + char * b = nxt.getRebuildBuffer(sz); + memcpy(b, conf.dump(NULL), sz); + nxt.rebuild(); + printf("----nxt.print----\n"); + nxt.print(); + return 0; +} + + + + + + + + + + + + + + + + + + +/* vim: set ts=4 sw=4 sts=4 tw=100 */ diff --git a/configure/test/test_demo.res b/configure/test/test_demo.res new file mode 100644 index 0000000000000000000000000000000000000000..6e65719efaac0977b23aaab24e8073bdf08f8c61 --- /dev/null +++ b/configure/test/test_demo.res @@ -0,0 +1,47 @@ +Module Name : Config Demo +We have 2 servers. +Server[0] is : ip = 127.0.0.1, port = 9900 +Server[1] is : ip = 192.168.1.2, port = 9901 + +-------dump------- +module : Config Demo +[@server] +ip : 127.0.0.1 +port : 9900 +$include : inc.conf +[@server] +ip : 192.168.1.2 +port : 9901 + +[GLOBAL] +#this is inc +name : inc +age : 12 +$include : "Hello" + +--------print--------- +Section-------[GLOBAL] + =[module], _value=[Config Demo] + =[name], _value=[inc] + =[age], _value=[12] + Array--------[server] : { + Section-------[GLOBAL.@server] + =[ip], _value=[127.0.0.1] + =[port], _value=[9900] + Section-------[GLOBAL.@server] + =[ip], _value=[192.168.1.2] + =[port], _value=[9901] + } +----nxt.print---- +Section-------[GLOBAL] + =[module], _value=[Config Demo] + =[name], _value=[inc] + =[age], _value=[12] + Array--------[server] : { + Section-------[GLOBAL.@server] + =[ip], _value=[127.0.0.1] + =[port], _value=[9900] + Section-------[GLOBAL.@server] + =[ip], _value=[192.168.1.2] + =[port], _value=[9901] + } diff --git a/configure/test/test_dump_ex/COMAKE b/configure/test/test_dump_ex/COMAKE new file mode 100644 index 0000000000000000000000000000000000000000..d35161e25950d95c9f7685699bbdf647f72b4d2c --- /dev/null +++ b/configure/test/test_dump_ex/COMAKE @@ -0,0 +1,60 @@ +#edit-mode: -*- python -*- +#coding:gbk + +#工作路径. +WORKROOT('../../../../') + +#使用硬链接copy. +CopyUsingHardLink(True) + +#支持32位/64位平台编译 +#ENABLE_MULTI_LIBS(True) + +#C预处理器参数. +CPPFLAGS('-D_GNU_SOURCE -D__STDC_LIMIT_MACROS -DVERSION=\\\"1.9.8.7\\\"') +#为32位目标编译指定额外的预处理参数 +#CPPFLAGS_32('-D_XOPEN_SOURE=500') + +#C编译参数. +CFLAGS('-g -pipe -W -Wall -fPIC') + +#C++编译参数. +CXXFLAGS('-g -pipe -W -Wall -fPIC') + +#IDL编译参数 +IDLFLAGS('--compack') + +#UBRPC编译参数 +UBRPCFLAGS('--compack') + +#头文件路径. +INCPATHS('. ../../ ./include ./output ./output/include') + +#使用库 +LIBS('../../libconfig.a') + +#链接参数. +LDFLAGS('-lpthread -lcrypto -lrt') + +#依赖模块 +CONFIGS('lib2-64/ullib') +CONFIGS('lib2-64/bsl') +CONFIGS('public/spreg') +CONFIGS('com/btest/gtest') + +#为32位/64位指定不同的依赖路径. +#CONFIGS_32('lib2/ullib') +#CONFIGS_64('lib2-64/ullib') + +user_sources='' +user_headers='' + +#可执行文件 +Application('dumpex', Sources('test_unit_dumpex.cpp')) +#静态库 +#StaticLibrary('test_other',Sources(user_sources),HeaderFiles(user_headers)) +#共享库 +#SharedLibrary('test_other',Sources(user_sources),HeaderFiles(user_headers)) +#子目录 +#Directory('demo') + diff --git a/configure/test/test_dump_ex/Makefile b/configure/test/test_dump_ex/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..a01761efb4bd707e3f27b78ec0dfae462c0756c7 --- /dev/null +++ b/configure/test/test_dump_ex/Makefile @@ -0,0 +1,137 @@ +#COMAKE2 edit-mode: -*- Makefile -*- +####################64Bit Mode#################### +ifeq ($(shell uname -m),x86_64) +CC=gcc +CXX=g++ +CXXFLAGS=-g \ + -pipe \ + -W \ + -Wall \ + -fPIC +CFLAGS=-g \ + -pipe \ + -W \ + -Wall \ + -fPIC +CPPFLAGS=-D_GNU_SOURCE \ + -D__STDC_LIMIT_MACROS \ + -DVERSION=\"1.9.8.7\" +INCPATH=-I. \ + -I../../ \ + -I./include \ + -I./output \ + -I./output/include +DEP_INCPATH=-I../../../../com/btest/gtest \ + -I../../../../com/btest/gtest/include \ + -I../../../../com/btest/gtest/output \ + -I../../../../com/btest/gtest/output/include \ + -I../../../../lib2-64/bsl \ + -I../../../../lib2-64/bsl/include \ + -I../../../../lib2-64/bsl/output \ + -I../../../../lib2-64/bsl/output/include \ + -I../../../../lib2-64/ullib \ + -I../../../../lib2-64/ullib/include \ + -I../../../../lib2-64/ullib/output \ + -I../../../../lib2-64/ullib/output/include \ + -I../../../../public/spreg \ + -I../../../../public/spreg/include \ + -I../../../../public/spreg/output \ + -I../../../../public/spreg/output/include \ + -I../../../../quality/autotest/reportlib/cpp \ + -I../../../../quality/autotest/reportlib/cpp/include \ + -I../../../../quality/autotest/reportlib/cpp/output \ + -I../../../../quality/autotest/reportlib/cpp/output/include \ + -I../../../../third-64/pcre \ + -I../../../../third-64/pcre/include \ + -I../../../../third-64/pcre/output \ + -I../../../../third-64/pcre/output/include + +#============ CCP vars ============ +CCHECK=@ccheck.py +CCHECK_FLAGS= +PCLINT=@pclint +PCLINT_FLAGS= +CCP=@ccp.py +CCP_FLAGS= + + +#COMAKE UUID +COMAKE_MD5=afda5b77791616ecf9f0922265568a51 COMAKE + + +.PHONY:all +all:comake2_makefile_check dumpex + @echo "[COMAKE:BUILD][Target:'all']" + @echo "make all done" + +.PHONY:comake2_makefile_check +comake2_makefile_check: + @echo "[COMAKE:BUILD][Target:'comake2_makefile_check']" + #in case of error, update 'Makefile' by 'comake2' + @echo "$(COMAKE_MD5)">comake2.md5 + @md5sum -c --status comake2.md5 + @rm -f comake2.md5 + +.PHONY:ccpclean +ccpclean: + @echo "[COMAKE:BUILD][Target:'ccpclean']" + @echo "make ccpclean done" + +.PHONY:clean +clean:ccpclean + @echo "[COMAKE:BUILD][Target:'clean']" + rm -rf dumpex + rm -rf ./output/bin/dumpex + rm -rf dumpex_test_unit_dumpex.o + +.PHONY:dist +dist: + @echo "[COMAKE:BUILD][Target:'dist']" + tar czvf output.tar.gz output + @echo "make dist done" + +.PHONY:distclean +distclean:clean + @echo "[COMAKE:BUILD][Target:'distclean']" + rm -f output.tar.gz + @echo "make distclean done" + +.PHONY:love +love: + @echo "[COMAKE:BUILD][Target:'love']" + @echo "make love done" + +dumpex:dumpex_test_unit_dumpex.o \ + ../../libconfig.a + @echo "[COMAKE:BUILD][Target:'dumpex']" + $(CXX) dumpex_test_unit_dumpex.o -Xlinker "-(" ../../libconfig.a ../../../../com/btest/gtest/output/lib/libgtest.a \ + ../../../../com/btest/gtest/output/lib/libgtest_main.a \ + ../../../../lib2-64/bsl/lib/libbsl.a \ + ../../../../lib2-64/bsl/lib/libbsl_ResourcePool.a \ + ../../../../lib2-64/bsl/lib/libbsl_archive.a \ + ../../../../lib2-64/bsl/lib/libbsl_buffer.a \ + ../../../../lib2-64/bsl/lib/libbsl_check_cast.a \ + ../../../../lib2-64/bsl/lib/libbsl_exception.a \ + ../../../../lib2-64/bsl/lib/libbsl_pool.a \ + ../../../../lib2-64/bsl/lib/libbsl_utils.a \ + ../../../../lib2-64/bsl/lib/libbsl_var.a \ + ../../../../lib2-64/bsl/lib/libbsl_var_implement.a \ + ../../../../lib2-64/bsl/lib/libbsl_var_utils.a \ + ../../../../lib2-64/ullib/lib/libullib.a \ + ../../../../public/spreg/libspreg.a \ + ../../../../quality/autotest/reportlib/cpp/libautotest.a \ + ../../../../third-64/pcre/lib/libpcre.a \ + ../../../../third-64/pcre/lib/libpcrecpp.a \ + ../../../../third-64/pcre/lib/libpcreposix.a -lpthread \ + -lcrypto \ + -lrt -Xlinker "-)" -o dumpex + mkdir -p ./output/bin + cp -f --link dumpex ./output/bin + +dumpex_test_unit_dumpex.o:test_unit_dumpex.cpp + @echo "[COMAKE:BUILD][Target:'dumpex_test_unit_dumpex.o']" + $(CXX) -c $(INCPATH) $(DEP_INCPATH) $(CPPFLAGS) $(CXXFLAGS) -o dumpex_test_unit_dumpex.o test_unit_dumpex.cpp + +endif #ifeq ($(shell uname -m),x86_64) + + diff --git a/configure/test/test_dump_ex/conf/array.conf b/configure/test/test_dump_ex/conf/array.conf new file mode 100644 index 0000000000000000000000000000000000000000..72cfb05a61493818e5f7d627b03f094959d5cf7b --- /dev/null +++ b/configure/test/test_dump_ex/conf/array.conf @@ -0,0 +1,5 @@ +[@building] +@floor : 1 +@floor : 2 +@floor : 3 + diff --git a/configure/test/test_dump_ex/conf/sample.conf b/configure/test/test_dump_ex/conf/sample.conf new file mode 100644 index 0000000000000000000000000000000000000000..bca215192acc16016aab974c2ac774679684801f --- /dev/null +++ b/configure/test/test_dump_ex/conf/sample.conf @@ -0,0 +1,35 @@ +#this comment will not be dumped +#neither does this one +#me neither, LOL +$include : sub_conf.conf +[company] +name : baidu +addr : beijing +type : Internet +[.staff] +count : 20000 +[..@employee] +#you see, +#Joan is a girl, which means that +#you will never know +#if she is cheating to you +name : Joan +gender : female +age : 20 +#GLOBAL: this comment won't be dumped +#neither does this +[GLOBAL] +copyright : baidu.Inc +date : 2013/04/28 +[company.staff.@employee] +name : Jay +gender : male +age : 24 +[building] +#this is the reception floor +@floor : 1 +#this is the worker floor +@floor : 2 +#this is the administrator floor +@floor : 3 +#END: this comment won't be dumped diff --git a/configure/test/test_dump_ex/conf/sub_conf.conf b/configure/test/test_dump_ex/conf/sub_conf.conf new file mode 100644 index 0000000000000000000000000000000000000000..8c685390c315f879080cee2319adeca3550f4bb7 --- /dev/null +++ b/configure/test/test_dump_ex/conf/sub_conf.conf @@ -0,0 +1,2 @@ +@greeting : hi, i am from baidu +@greeting : hi, i am now working overtime, TT diff --git a/configure/test/test_dump_ex/test_unit_dumpex.cpp b/configure/test/test_dump_ex/test_unit_dumpex.cpp new file mode 100644 index 0000000000000000000000000000000000000000..5639fb2293c3ec6ae16f3ff5f4d7203118f5a958 --- /dev/null +++ b/configure/test/test_dump_ex/test_unit_dumpex.cpp @@ -0,0 +1,242 @@ + +#include +#include +#include "spreg.h" + +int main(int argc, char **argv) +{ + testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} +/** + * @brief +**/ +class test_dump_ex_suite : public ::testing::Test{ + protected: + test_dump_ex_suite(){}; + virtual ~test_dump_ex_suite(){}; + virtual void SetUp() { + //Called befor every TEST_F(test_dump_ex_suite, *) + }; + virtual void TearDown() { + //Called after every TEST_F(test_dump_ex_suite, *) + }; +}; + +/** + * @brief + * @begin_version +**/ +TEST_F(test_dump_ex_suite, case_ivalid_param1) +{ + //TODO + //comcfg::Log::openLowLevel(); + comcfg::Configure conf; + int ret = conf.load("conf", "sample.conf"); + ASSERT_EQ(ret, 0); + + char buf[1024]; + + ret = conf.dump_ex(NULL, 1024, 1); + EXPECT_NE(ret, 0); + + ret = conf.dump_ex(buf, 0, 1); + EXPECT_NE(ret, 0); + + ret = conf.dump_ex(buf, 1024, -1); + EXPECT_NE(ret, 0); + + ret = conf.dump_ex(buf, 1024, 3); + EXPECT_NE(ret, 0); + + ret = conf.dump_ex(buf, 100, 0); + EXPECT_NE(ret, 0); +} + +/** + * @brief + * @begin_version +**/ +TEST_F(test_dump_ex_suite, case_Comment) +{ + //TODO + //comcfg::Log::openLowLevel(); + comcfg::Configure conf; + int ret = conf.load("conf", "sample.conf"); + ASSERT_EQ(ret, 0); + + char buf[10240]; + + ret = conf.dump_ex(buf, 10240, 0); + EXPECT_GT(ret, 0); + + char * comment_pos = strstr(buf,"#you see, \n#Joan is a girl, which"); + ASSERT_NE((long)comment_pos, 0); + + comment_pos = strstr(buf, "#this is the reception floor"); + ASSERT_NE((long)comment_pos, 0); + + comment_pos = strstr(buf, "#GLOBAL: this comment won't be dumped"); + ASSERT_EQ((long)comment_pos, 0); + + comment_pos = strstr(buf, "#END: this comment won't be dumped"); + ASSERT_EQ((long)comment_pos, 0); +} + +/** + * @brief + * @begin_version +**/ +TEST_F(test_dump_ex_suite, case_NoComment) +{ + //TODO + //comcfg::Log::openLowLevel(); + comcfg::Configure conf; + int ret = conf.load("conf", "sample.conf"); + ASSERT_EQ(ret, 0); + + char buf[10240]; + + ret = conf.dump_ex(buf, 10240, 1); + EXPECT_GT(ret, 0); + + char * comment_pos = strchr(buf, '#'); + ASSERT_EQ((long)comment_pos, 0); +} + +/** + * @brief + * @begin_version +**/ +TEST_F(test_dump_ex_suite, case_Position) +{ + //TODO + //comcfg::Log::openLowLevel(); + comcfg::Configure conf; + int ret = conf.load("conf", "sample.conf"); + ASSERT_EQ(ret, 0); + + char buf[10240]; + + ret = conf.dump_ex(buf, 10240, 2); + EXPECT_GT(ret, 0); + + //std::cout< + +int main(){ + comcfg :: Configure conf; + conf.load(".", "str.conf"); + int err; + conf["xxx"].to_int32(&err); + std::cout< +#include +#include "stdio.h" +#include + +using namespace comcfg; + +static int g_run = 0; + +static void * change_threadfun(void *param) +{ + FileReloader * prd = (FileReloader *)param; + while (g_run) { + printf("g_run:%d, monitor: %d\n",g_run, prd->monitor()); + sleep(10); + } + return NULL; +} + +int file_change(const char * filename, void * ) { + printf("file[%s]: changed\n", filename); + if (g_run) { + if (++g_run >3) { + g_run = 0; + } + } + return 0; +} + +int main(){ + FileReloader rd; + rd.add_file_monitor("./reload.conf", file_change, NULL); + int add = rd.add_file_monitor("./reload.conf", file_change, NULL); + printf("add:%d\n", add); + rd.add_file_monitor("./reload.range", file_change, NULL); + g_run = 1; + pthread_t tid; + pthread_create(&tid, NULL, change_threadfun, &rd); + pthread_join(tid, NULL); + return 0; +} + + diff --git a/configure/test/test_get_default.cpp b/configure/test/test_get_default.cpp new file mode 100644 index 0000000000000000000000000000000000000000..d09e1da1cf7bada0841a458acbad201f1b464b30 --- /dev/null +++ b/configure/test/test_get_default.cpp @@ -0,0 +1,94 @@ +/*************************************************************************** + * + * Copyright (c) 2009 Baidu.com, Inc. All Rights Reserved + * $Id: test_get_default.cpp,v 1.3 2009/11/10 04:50:30 scmpf Exp $ + * + **************************************************************************/ + + + +/** + * @file test_get_default.cpp + * @author yingxiang(com@baidu.com) + * @date 2009/03/12 01:30:32 + * @version $Revision: 1.3 $ + * @brief + * + **/ + +#include "Configure.h" + + +#define ASSERT(x) do{\ + if(!(x))printf("Assert failed %s:%d\n", __FILE__, __LINE__);\ + else printf("Assertion Successful. %s:%d\n", __FILE__, __LINE__);\ +}while(0) + +int main(){ + using namespace comcfg; + system("touch Nothing.conf"); + system("echo A : B > Nothing.conf"); + comcfg::Configure conf; + int ret = conf.load(".", "Nothing.conf"); + ASSERT(ret == 0); + + char v0; + ASSERT( comcfg::NOSUCHKEY == conf["xxx"].get_char(&v0, '0') ); + ASSERT( v0 == '0' ); + unsigned char v1; + ASSERT( comcfg::NOSUCHKEY == conf["xxx"].get_uchar(&v1, '1') ); + ASSERT( v1 == '1' ); + int16_t v2; + ASSERT( comcfg::NOSUCHKEY == conf["xxx"].get_int16(&v2, 2) ); + ASSERT( v2 == 2 ); + u_int16_t v3; + ASSERT( comcfg::NOSUCHKEY == conf["xxx"].get_uint16(&v3, 3) ); + ASSERT( v3 == 3 ); + int v4; + ASSERT( comcfg::NOSUCHKEY == conf["xxx"].get_int32(&v4, 4) ); + ASSERT( v4 == 4 ); + u_int32_t v5; + ASSERT( comcfg::NOSUCHKEY == conf["xxx"].get_uint32(&v5, 5) ); + ASSERT( v5 == 5 ); + long long v6; + ASSERT( comcfg::NOSUCHKEY == conf["xxx"].get_int64(&v6, 6) ); + ASSERT( v6 == 6 ); + unsigned long long v7; + ASSERT( comcfg::NOSUCHKEY == conf["xxx"].get_uint64(&v7, 7) ); + ASSERT( v7 == 7 ); + float v8; + ASSERT( comcfg::NOSUCHKEY == conf["xxx"].get_float(&v8, 8) ); + ASSERT( v8 == 8 ); + double v9; + ASSERT( comcfg::NOSUCHKEY == conf["xxx"].get_double(&v9, 9) ); + ASSERT( v9 == 9 ); + bsl_string v10; + ASSERT( comcfg::NOSUCHKEY == conf["xxx"].get_bsl_string(&v10, "10") ); + ASSERT( v10 == str_t("10") ); + str_t v11; + ASSERT( comcfg::NOSUCHKEY == conf["xxx"].get_raw_string(&v11, "11") ); + ASSERT( v11 == str_t("11") ); + char s[12]; + ASSERT( comcfg::NOSUCHKEY == conf["xxx"].get_cstr(s,12, "12") ); + ASSERT(strcmp(s, "12") == 0); + + return 0; +} + + + + + + + + + + + + + + + + + +/* vim: set ts=4 sw=4 sts=4 tw=100 */ diff --git a/configure/test/test_get_value.cpp b/configure/test/test_get_value.cpp new file mode 100644 index 0000000000000000000000000000000000000000..ecd061286b0e26f2815caa8360e6883a9efe4d0c --- /dev/null +++ b/configure/test/test_get_value.cpp @@ -0,0 +1,244 @@ +/*************************************************************************** + * + * Copyright (c) 2008 Baidu.com, Inc. All Rights Reserved + * $Id: test_get_value.cpp,v 1.5 2009/11/10 04:50:30 scmpf Exp $ + * + **************************************************************************/ + + + +/** + * @file test_get_value.cpp + * @author yingxiang(com@baidu.com) + * @date 2008/12/29 16:45:20 + * @version $Revision: 1.5 $ + * @brief + * + **/ + +#include "ConfigUnit.h" +#include "Configure.h" +#include "utils/cc_struct.h" +#include +#include "ul_log.h" + +using namespace comcfg; + +void runtest(const comcfg::ConfigUnit &); + +int main(){ + ul_logstat_t ulg; + ulg.events = 2; + ul_openlog("./log", "test_get_value", &ulg, 2048); + comcfg::Configure conf; + conf.load(".", "test_value.conf", NULL); + printf( "\n\nRead test_int : "); + runtest(conf["test_int"]); + printf( "\n\nRead test_float : "); + runtest(conf["test_float"]); + printf( "\n\nRead test_str : "); + runtest(conf["test_str"]); + printf( "\n\nRead test_err : "); + runtest(conf["test_err"]); + return 0; +} + +void runtest(const comcfg::ConfigUnit & conf){ + + //========= Test char============= + try{ + char a0 = conf.to_char(); + std::cout<<"to char successful, value = "<comake2.md5 + @md5sum -c --status comake2.md5 + @rm -f comake2.md5 + +.PHONY:ccpclean +ccpclean: + @echo "[COMAKE:BUILD][Target:'ccpclean']" + @echo "make ccpclean done" + +.PHONY:clean +clean:ccpclean + @echo "[COMAKE:BUILD][Target:'clean']" + rm -rf test_globalConstraint + rm -rf ./output/bin/test_globalConstraint + rm -rf test_globalConstraint_test_globalConstraint.o + +.PHONY:dist +dist: + @echo "[COMAKE:BUILD][Target:'dist']" + tar czvf output.tar.gz output + @echo "make dist done" + +.PHONY:distclean +distclean:clean + @echo "[COMAKE:BUILD][Target:'distclean']" + rm -f output.tar.gz + @echo "make distclean done" + +.PHONY:love +love: + @echo "[COMAKE:BUILD][Target:'love']" + @echo "make love done" + +test_globalConstraint:test_globalConstraint_test_globalConstraint.o \ + ../../libconfig.a + @echo "[COMAKE:BUILD][Target:'test_globalConstraint']" + $(CXX) test_globalConstraint_test_globalConstraint.o -Xlinker "-(" ../../libconfig.a ../../../../com/btest/gtest/output/lib/libgtest.a \ + ../../../../com/btest/gtest/output/lib/libgtest_main.a \ + ../../../../lib2-64/bsl/lib/libbsl.a \ + ../../../../lib2-64/bsl/lib/libbsl_ResourcePool.a \ + ../../../../lib2-64/bsl/lib/libbsl_archive.a \ + ../../../../lib2-64/bsl/lib/libbsl_buffer.a \ + ../../../../lib2-64/bsl/lib/libbsl_check_cast.a \ + ../../../../lib2-64/bsl/lib/libbsl_exception.a \ + ../../../../lib2-64/bsl/lib/libbsl_pool.a \ + ../../../../lib2-64/bsl/lib/libbsl_utils.a \ + ../../../../lib2-64/bsl/lib/libbsl_var.a \ + ../../../../lib2-64/bsl/lib/libbsl_var_implement.a \ + ../../../../lib2-64/bsl/lib/libbsl_var_utils.a \ + ../../../../lib2-64/ullib/lib/libullib.a \ + ../../../../public/spreg/libspreg.a \ + ../../../../quality/autotest/reportlib/cpp/libautotest.a \ + ../../../../third-64/pcre/lib/libpcre.a \ + ../../../../third-64/pcre/lib/libpcrecpp.a \ + ../../../../third-64/pcre/lib/libpcreposix.a -lpthread \ + -lcrypto \ + -lrt -Xlinker "-)" -o test_globalConstraint + mkdir -p ./output/bin + cp -f --link test_globalConstraint ./output/bin + +test_globalConstraint_test_globalConstraint.o:test_globalConstraint.cpp + @echo "[COMAKE:BUILD][Target:'test_globalConstraint_test_globalConstraint.o']" + $(CXX) -c $(INCPATH) $(DEP_INCPATH) $(CPPFLAGS) $(CXXFLAGS) -o test_globalConstraint_test_globalConstraint.o test_globalConstraint.cpp + +endif #ifeq ($(shell uname -m),x86_64) + + diff --git a/configure/test/test_globalConstraint/conf/default.conf b/configure/test/test_globalConstraint/conf/default.conf new file mode 100644 index 0000000000000000000000000000000000000000..ce519c74e0c8b89a0e9a053a4a578328118d3ccc --- /dev/null +++ b/configure/test/test_globalConstraint/conf/default.conf @@ -0,0 +1,4 @@ +[groupxxx] +def_value : +[groupyyy] +not_def_value : 4331 diff --git a/configure/test/test_globalConstraint/conf/enum.conf b/configure/test/test_globalConstraint/conf/enum.conf new file mode 100644 index 0000000000000000000000000000000000000000..b075cee89fe2897997c73d34aa16a55af6f5e8eb --- /dev/null +++ b/configure/test/test_globalConstraint/conf/enum.conf @@ -0,0 +1,5 @@ +[groupxxx] +enum1 : 100 +enum2 : 10 +enum3 : 10 +enum4 : 1 diff --git a/configure/test/test_globalConstraint/conf/getKey.conf b/configure/test/test_globalConstraint/conf/getKey.conf new file mode 100644 index 0000000000000000000000000000000000000000..1f32cf23de0cf44f4c7c96357a0537704ee21a36 --- /dev/null +++ b/configure/test/test_globalConstraint/conf/getKey.conf @@ -0,0 +1,19 @@ +[server] +ip : 1.2.3.4 +port : 123 +host : baidu +[GLOBAL] +position : beijing +@height : 5 +@height : 6 + +[company] +[.@svr] +ip : 4.3.2.1 +port : 321 +host : baidu +[company] +name : baidu.com +[GLOBAL] +g_n1 : value1 +g_n2 : value2 diff --git a/configure/test/test_globalConstraint/conf/getKey.range b/configure/test/test_globalConstraint/conf/getKey.range new file mode 100644 index 0000000000000000000000000000000000000000..f9a3873ab7fca7159508bff94e8a6bf920099d6c --- /dev/null +++ b/configure/test/test_globalConstraint/conf/getKey.range @@ -0,0 +1,16 @@ +struct server_t{ + string ip = ip(), length(20); + uint16_t port = range(1, 1023); + string host = length(100); +}; + +server_t server; +string position = length(100); +uint32_t height[10] = range(0,10); + +struct company_t{ + string name = length(100); + server_t svr[]; +}; + +company_t company; diff --git a/configure/test/test_globalConstraint/conf/ip.conf b/configure/test/test_globalConstraint/conf/ip.conf new file mode 100644 index 0000000000000000000000000000000000000000..498314aac2bf09cc8e9ae2f1208df3cc208e6365 --- /dev/null +++ b/configure/test/test_globalConstraint/conf/ip.conf @@ -0,0 +1,2 @@ +[groupxxx] +addr : 1.2.3.4 diff --git a/configure/test/test_globalConstraint/conf/length.conf b/configure/test/test_globalConstraint/conf/length.conf new file mode 100644 index 0000000000000000000000000000000000000000..c16c791121bf0ea1141abe6dc0be81dc12ee2baf --- /dev/null +++ b/configure/test/test_globalConstraint/conf/length.conf @@ -0,0 +1,2 @@ +[groupxxx] +str : 1234567890 diff --git a/configure/test/test_globalConstraint/conf/range.conf b/configure/test/test_globalConstraint/conf/range.conf new file mode 100644 index 0000000000000000000000000000000000000000..e2820bdfada02c9f43d7d7b2ba1848fe6269f957 --- /dev/null +++ b/configure/test/test_globalConstraint/conf/range.conf @@ -0,0 +1,4 @@ +[groupxxx] +range1 : 1 +range2 : 1000 +range3 : 250 diff --git a/configure/test/test_globalConstraint/conf/regexp.conf b/configure/test/test_globalConstraint/conf/regexp.conf new file mode 100644 index 0000000000000000000000000000000000000000..0d8f97f1acf7a6048692e86fcf0ea1345b25afc7 --- /dev/null +++ b/configure/test/test_globalConstraint/conf/regexp.conf @@ -0,0 +1,4 @@ +#regular expression: (\d)+ match +#regular expression: .{1.5} not match +[groupxxx] +regtext : 1234567890 diff --git a/configure/test/test_globalConstraint/test_globalConstraint.cpp b/configure/test/test_globalConstraint/test_globalConstraint.cpp new file mode 100644 index 0000000000000000000000000000000000000000..87e176d851021a5d1e18ba560bd0670dde6d4218 --- /dev/null +++ b/configure/test/test_globalConstraint/test_globalConstraint.cpp @@ -0,0 +1,526 @@ +#include +#include +#include +//#include "compiler/src/idl_conf_if.h" +#include "constraint/cc_default.h" +#include "constraint/ConstraintFunction.h" + +int main(int argc, char **argv) +{ + testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} +/** + * @brief +**/ +class test_globalConstraint_suite : public ::testing::Test{ + protected: + test_globalConstraint_suite(){}; + virtual ~test_globalConstraint_suite(){}; + virtual void SetUp() { + //Called befor every TEST_F(test_globalConstaint_suite, *) + }; + virtual void TearDown() { + //Called after every TEST_F(test_globalConstraint_suite, *) + }; +}; + + +/** + * @brief check printKeyConstraint + * @begin_version + **/ +TEST_F(test_globalConstraint_suite, case_printKeyConstraint) +{ + //TODO + comcfg::Configure conf; + int ret = conf.load("conf/", "getKey.conf"); + ASSERT_EQ(0, ret); + //range file not specified + ret = conf.printKeyConstraint("company.svr.ip"); + ASSERT_NE(0, ret); + //wrongly formatted key_path + ret = conf.printKeyConstraint(".svr.ip", "conf/getKey.range"); + ASSERT_NE(0, ret); + //group not found + ret = conf.printKeyConstraint("company.notfound.ip", "conf/getKey.range"); + ASSERT_NE(0, ret); + //right long key + ret = conf.printKeyConstraint("company.svr.ip", "conf/getKey.range"); + ASSERT_EQ(0, ret); + //right short key + ret = conf.printKeyConstraint("position"); + ASSERT_EQ(0, ret); + //key not found + ret = conf.printKeyConstraint("not_found_key"); + ASSERT_NE(0, ret); +} + +/** + * @brief test global constraint function regexp + * @begin_version + **/ +TEST_F(test_globalConstraint_suite, case_regexp_wrong_arg_num) +{ + comcfg::GlobalConsFun gFun("regexp_wrong_arg_num", comcfg::CFdefault::gcons_regexp); + gFun._arg.push_back("(\\d)+"); + gFun._arg.push_back(".{1,64}"); + comcfg::ConstraintLibrary::getInstance()->registGlobalConstraint(gFun); + + comcfg::Configure conf; + int ret = conf.load("conf/", "regexp.conf"); + ASSERT_NE(0, ret); + + comcfg::ConstraintLibrary::destroyInstance(); +} + +/** + * @brief test global constraint function regexp + * @begin_version + **/ +TEST_F(test_globalConstraint_suite, case_regexp_match) +{ + comcfg::GlobalConsFun gFun("regexp_match", comcfg::CFdefault::gcons_regexp); + gFun._arg.push_back("(\\d)+"); + comcfg::ConstraintLibrary::getInstance()->registGlobalConstraint(gFun); + + comcfg::Configure conf; + int ret = conf.load("conf/", "regexp.conf"); + ASSERT_EQ(0, ret); + + comcfg::ConstraintLibrary::destroyInstance(); +} + +/** + * @brief test global constraint function regexp + * @begin_version + **/ +TEST_F(test_globalConstraint_suite, case_regexp_not_match) +{ + comcfg::GlobalConsFun gFun("regexp_not_match", comcfg::CFdefault::gcons_regexp); + gFun._arg.push_back(".{1,5}"); + comcfg::ConstraintLibrary::getInstance()->registGlobalConstraint(gFun); + + comcfg::Configure conf; + int ret = conf.load("conf/", "regexp.conf"); + ASSERT_NE(0, ret); + + comcfg::ConstraintLibrary::destroyInstance(); +} + +/** + * @brief test global constraint function ip + * @begin_version + **/ +TEST_F(test_globalConstraint_suite, case_ip_match) +{ + comcfg::GlobalConsFun gFun("ip_match", comcfg::CFdefault::gcons_ip); + comcfg::ConstraintLibrary::getInstance()->registGlobalConstraint(gFun); + + comcfg::Configure conf; + int ret = conf.load("conf/", "ip.conf"); + ASSERT_EQ(0, ret); + + comcfg::ConstraintLibrary::destroyInstance(); +} + +/** + * @brief test global constraint function ip + * @begin_version + **/ +TEST_F(test_globalConstraint_suite, case_ip_not_match) +{ + comcfg::GlobalConsFun gFun("ip_not_match", comcfg::CFdefault::gcons_ip); + comcfg::ConstraintLibrary::getInstance()->registGlobalConstraint(gFun); + + comcfg::Configure conf; + int ret = conf.load("conf/", "regexp.conf"); + ASSERT_NE(0, ret); + + comcfg::ConstraintLibrary::destroyInstance(); +} + +/** + * @brief test global constraint function length + * @begin_version + **/ +TEST_F(test_globalConstraint_suite, case_length_int) +{ + typedef int ARG_TYPE; + ARG_TYPE DEF_VALUE = 100; + comcfg::GlobalConsFun gFun("length_int", comcfg::CFdefault::gcons_length); + gFun._arg.push_back(DEF_VALUE); + comcfg::ConstraintLibrary::getInstance()->registGlobalConstraint(gFun); + + comcfg::Configure conf; + int ret = conf.load("conf/", "length.conf"); + ASSERT_EQ(0, ret); + + comcfg::ConstraintLibrary::destroyInstance(); +} + +/** + * @brief test global constraint function length + * @begin_version + **/ +TEST_F(test_globalConstraint_suite, case_length_longlong) +{ + typedef long long ARG_TYPE; + ARG_TYPE DEF_VALUE = 5; + comcfg::GlobalConsFun gFun("length_longlong", comcfg::CFdefault::gcons_length); + gFun._arg.push_back(DEF_VALUE); + comcfg::ConstraintLibrary::getInstance()->registGlobalConstraint(gFun); + + comcfg::Configure conf; + int ret = conf.load("conf/", "length.conf"); + ASSERT_NE(0, ret); + + comcfg::ConstraintLibrary::destroyInstance(); +} + +/** + * @brief test global constraint function default + * @begin_version + **/ +TEST_F(test_globalConstraint_suite, case_default_int) +{ + typedef int ARG_TYPE; + const ARG_TYPE DEF_VALUE = 100; + comcfg::GlobalConsFun gFun("default_int", comcfg::CFdefault::gcons_default); + gFun._arg.push_back(DEF_VALUE); + comcfg::ConstraintLibrary::getInstance()->registGlobalConstraint(gFun); + + comcfg::Configure conf; + int ret = conf.load("conf/", "default.conf"); + ASSERT_EQ(0, ret); + + int errcode = 0; + int value = conf["def_value"].to_int32(&errcode); + if(errcode == 0){ + ASSERT_EQ(DEF_VALUE, value); + } + errcode = 0; + value = conf["not_def_value"].to_int32(&errcode); + if(errcode == 0){ + ASSERT_NE(DEF_VALUE, value); + } + + comcfg::ConstraintLibrary::destroyInstance(); +} + +/** + * @brief test global constraint function default + * @begin_version + **/ +TEST_F(test_globalConstraint_suite, case_default_longlong) +{ + typedef long long ARG_TYPE; + const ARG_TYPE DEF_VALUE = 100; + comcfg::GlobalConsFun gFun("default_longlong", comcfg::CFdefault::gcons_default); + gFun._arg.push_back(DEF_VALUE); + comcfg::ConstraintLibrary::getInstance()->registGlobalConstraint(gFun); + + comcfg::Configure conf; + int ret = conf.load("conf/", "default.conf"); + ASSERT_EQ(0, ret); + + int errcode = 0; + ARG_TYPE value = conf["def_value"].to_int64(&errcode); + if(errcode == 0){ + ASSERT_EQ(DEF_VALUE, value); + } + errcode = 0; + value = conf["not_def_value"].to_int64(&errcode); + if(errcode == 0){ + ASSERT_NE(DEF_VALUE, value); + } + + comcfg::ConstraintLibrary::destroyInstance(); +} + +/** + * @brief test global constraint function default + * @begin_version + **/ +TEST_F(test_globalConstraint_suite, case_default_double) +{ + typedef double ARG_TYPE; + const ARG_TYPE DEF_VALUE = 100; + comcfg::GlobalConsFun gFun("default_double", comcfg::CFdefault::gcons_default); + gFun._arg.push_back(DEF_VALUE); + comcfg::ConstraintLibrary::getInstance()->registGlobalConstraint(gFun); + + comcfg::Configure conf; + int ret = conf.load("conf/", "default.conf"); + ASSERT_EQ(0, ret); + + int errcode = 0; + ARG_TYPE value = conf["def_value"].to_double(&errcode); + if(errcode == 0){ + ASSERT_DOUBLE_EQ(DEF_VALUE, value); + } + + comcfg::ConstraintLibrary::destroyInstance(); +} + +/** + * @brief test global constraint function default + * @begin_version + **/ +TEST_F(test_globalConstraint_suite, case_default_string) +{ + typedef bsl::string ARG_TYPE; + const ARG_TYPE DEF_VALUE = "hello, default string"; + comcfg::GlobalConsFun gFun("default_string", comcfg::CFdefault::gcons_default); + gFun._arg.push_back(DEF_VALUE); + comcfg::ConstraintLibrary::getInstance()->registGlobalConstraint(gFun); + + comcfg::Configure conf; + int ret = conf.load("conf/", "default.conf"); + ASSERT_EQ(0, ret); + + int errcode = 0; + ARG_TYPE value = conf["def_value"].to_bsl_string(&errcode); + if(errcode == 0){ + ASSERT_STREQ(DEF_VALUE.c_str(), value.c_str()); + } + errcode = 0; + value = conf["not_def_value"].to_bsl_string(&errcode); + if(errcode == 0){ + ASSERT_STRNE(DEF_VALUE.c_str(), value.c_str()); + } + + comcfg::ConstraintLibrary::destroyInstance(); +} + +/** + * @brief test global constraint function default + * @begin_version + **/ +TEST_F(test_globalConstraint_suite, case_default_wrong_type) +{ + typedef long ARG_TYPE; + ARG_TYPE DEF_VALUE = 100; + comcfg::GlobalConsFun gFun("default_long", comcfg::CFdefault::gcons_default); + gFun._arg.push_back(DEF_VALUE); + comcfg::ConstraintLibrary::getInstance()->registGlobalConstraint(gFun); + + comcfg::Configure conf; + int ret = conf.load("conf/", "default.conf"); + ASSERT_NE(0, ret); + + comcfg::ConstraintLibrary::destroyInstance(); +} + +/** + * @brief test global constraint function enum + * @begin_version + **/ +TEST_F(test_globalConstraint_suite, case_enum_int) +{ + typedef int ARG_TYPE; + comcfg::GlobalConsFun gFun("enum_int", comcfg::CFdefault::gcons_enum); + gFun._arg.push_back(1); + gFun._arg.push_back(10); + gFun._arg.push_back(100); + gFun._arg.push_back(1000); + comcfg::ConstraintLibrary::getInstance()->registGlobalConstraint(gFun); + + comcfg::Configure conf; + int ret = conf.load("conf/", "enum.conf"); + ASSERT_EQ(0, ret); + + comcfg::ConstraintLibrary::destroyInstance(); +} + +/** + * @brief test global constraint function enum + * @begin_version + **/ +TEST_F(test_globalConstraint_suite, case_enum_longlong) +{ + typedef long long ARG_TYPE; + comcfg::GlobalConsFun gFun("enum_longlong", comcfg::CFdefault::gcons_enum); + gFun._arg.push_back(1); + gFun._arg.push_back(100); + gFun._arg.push_back(1000); + comcfg::ConstraintLibrary::getInstance()->registGlobalConstraint(gFun); + + comcfg::Configure conf; + int ret = conf.load("conf/", "enum.conf"); + ASSERT_NE(0, ret); + + comcfg::ConstraintLibrary::destroyInstance(); +} + +/** + * @brief test global constraint function enum + * @begin_version + **/ +TEST_F(test_globalConstraint_suite, case_enum_string) +{ + typedef bsl::string ARG_TYPE; + comcfg::GlobalConsFun gFun("enum_string", comcfg::CFdefault::gcons_enum); + gFun._arg.push_back("1"); + gFun._arg.push_back("10"); + gFun._arg.push_back("100"); + gFun._arg.push_back("1000"); + comcfg::ConstraintLibrary::getInstance()->registGlobalConstraint(gFun); + + comcfg::Configure conf; + int ret = conf.load("conf/", "enum.conf"); + ASSERT_EQ(0, ret); + + comcfg::ConstraintLibrary::destroyInstance(); +} + +/** + * @brief test global constraint function enum + * @begin_version + **/ +TEST_F(test_globalConstraint_suite, case_enum_double) +{ + typedef double ARG_TYPE; + comcfg::GlobalConsFun gFun("enum_double", comcfg::CFdefault::gcons_enum); + gFun._arg.push_back(1); + gFun._arg.push_back(10); + gFun._arg.push_back(1000); + comcfg::ConstraintLibrary::getInstance()->registGlobalConstraint(gFun); + + comcfg::Configure conf; + int ret = conf.load("conf/", "enum.conf"); + ASSERT_NE(0, ret); + + comcfg::ConstraintLibrary::destroyInstance(); +} + +/** + * @brief test global constraint function enum + * @begin_version + **/ +TEST_F(test_globalConstraint_suite, case_enum_wrong_type) +{ + typedef char ARG_TYPE; + comcfg::GlobalConsFun gFun("enum_char", comcfg::CFdefault::gcons_enum); + gFun._arg.push_back('1'); + gFun._arg.push_back('2'); + gFun._arg.push_back('3'); + comcfg::ConstraintLibrary::getInstance()->registGlobalConstraint(gFun); + + comcfg::Configure conf; + int ret = conf.load("conf/", "enum.conf"); + ASSERT_NE(0, ret); + + comcfg::ConstraintLibrary::destroyInstance(); +} + +/** + * @brief test global constraint function range + * @begin_version + **/ +TEST_F(test_globalConstraint_suite, case_range_int) +{ + typedef int ARG_TYPE; + comcfg::GlobalConsFun gFun("range_int", comcfg::CFdefault::gcons_range); + gFun._arg.push_back(1); + gFun._arg.push_back(1000); + comcfg::ConstraintLibrary::getInstance()->registGlobalConstraint(gFun); + + comcfg::Configure conf; + int ret = conf.load("conf/", "range.conf"); + ASSERT_EQ(0, ret); + + comcfg::ConstraintLibrary::destroyInstance(); +} + +/** + * @brief test global constraint function range + * @begin_version + **/ +TEST_F(test_globalConstraint_suite, case_range_longlong) +{ + typedef long long ARG_TYPE; + comcfg::GlobalConsFun gFun("range_longlong", comcfg::CFdefault::gcons_range); + gFun._arg.push_back(1); + gFun._arg.push_back(500); + comcfg::ConstraintLibrary::getInstance()->registGlobalConstraint(gFun); + + comcfg::Configure conf; + int ret = conf.load("conf/", "range.conf"); + ASSERT_NE(0, ret); + + comcfg::ConstraintLibrary::destroyInstance(); +} + +/** + * @brief test global constraint function range + * @begin_version + **/ +TEST_F(test_globalConstraint_suite, case_range_double) +{ + typedef double ARG_TYPE; + comcfg::GlobalConsFun gFun("range_double", comcfg::CFdefault::gcons_range); + gFun._arg.push_back(1); + gFun._arg.push_back(1000); + comcfg::ConstraintLibrary::getInstance()->registGlobalConstraint(gFun); + + comcfg::Configure conf; + int ret = conf.load("conf/", "range.conf"); + ASSERT_EQ(0, ret); + + comcfg::ConstraintLibrary::destroyInstance(); +} + +/** + * @brief test variable parameters + * @begin_version + **/ +TEST_F(test_globalConstraint_suite, case_variable_parameters_int) +{ + comcfg::ConstraintLibrary::getInstance()->registGlobalConstraint("range_int_vp",comcfg::CFdefault::gcons_range, 2, 1, 1000); + + comcfg::Configure conf; + int ret = conf.load("conf/", "range.conf"); + ASSERT_EQ(0, ret); + + comcfg::ConstraintLibrary::destroyInstance(); +} + +/** + * @brief test variable parameters + * @begin_version + **/ +TEST_F(test_globalConstraint_suite, case_variable_parameters_double) +{ + //comcfg::ConstraintLibrary::getInstance()->registGlobalConstraint("range_double_vp",comcfg::CFdefault::gcons_range, 2, 1, 1000); + comcfg::ConstraintLibrary::getInstance()->registGlobalConstraint("range_double_vp",comcfg::CFdefault::gcons_range, 2, 1.0, 1000.0); + + comcfg::Configure conf; + int ret = conf.load("conf/", "range.conf"); + //ASSERT_NE(0, ret); + ASSERT_EQ(0, ret); + + comcfg::ConstraintLibrary::destroyInstance(); +} + +/** + * @brief test variable parameters + * @note the program will crash if the variable parameters are not of POD type. This must be paid great attention. + * @begin_version + **/ +TEST_F(test_globalConstraint_suite, case_variable_parameters_string) +{ + /* + comcfg::ConstraintLibrary::getInstance()->registGlobalConstraint("enum_string_vp",comcfg::CFdefault::gcons_enum, 4, "1", "10", "100", "1000"); + + comcfg::Configure conf; + int ret = conf.load("conf/", "enum.conf"); + ASSERT_EQ(0, ret); + + comcfg::ConstraintLibrary::destroyInstance(); + */ +} + + + + diff --git a/configure/test/test_group/COMAKE b/configure/test/test_group/COMAKE new file mode 100644 index 0000000000000000000000000000000000000000..06cf831c539ebb05ad102487482b5a47e63574cf --- /dev/null +++ b/configure/test/test_group/COMAKE @@ -0,0 +1,60 @@ +#edit-mode: -*- python -*- +#coding:gbk + +#工作路径. +WORKROOT('../../../../') + +#使用硬链接copy. +CopyUsingHardLink(True) + +#支持32位/64位平台编译 +#ENABLE_MULTI_LIBS(True) + +#C预处理器参数. +CPPFLAGS('-D_GNU_SOURCE -D__STDC_LIMIT_MACROS -DVERSION=\\\"1.9.8.7\\\"') +#为32位目标编译指定额外的预处理参数 +#CPPFLAGS_32('-D_XOPEN_SOURE=500') + +#C编译参数. +CFLAGS('-g -pipe -W -Wall -fPIC') + +#C++编译参数. +CXXFLAGS('-g -pipe -W -Wall -fPIC') + +#IDL编译参数 +IDLFLAGS('--compack') + +#UBRPC编译参数 +UBRPCFLAGS('--compack') + +#头文件路径. +INCPATHS('. ../../ ./include ./output ./output/include') + +#使用库 +LIBS('../../libconfig.a') + +#链接参数. +LDFLAGS('-lpthread -lcrypto -lrt') + +#依赖模块 +CONFIGS('lib2-64/ullib') +CONFIGS('lib2-64/bsl') +CONFIGS('public/spreg') +CONFIGS('com/btest/gtest') + +#为32位/64位指定不同的依赖路径. +#CONFIGS_32('lib2/ullib') +#CONFIGS_64('lib2-64/ullib') + +user_sources='' +user_headers='' + +#可执行文件 +Application('test_Configure',Sources('test_Configure.cpp')) +#静态库 +#StaticLibrary('test_group',Sources(user_sources),HeaderFiles(user_headers)) +#共享库 +#SharedLibrary('test_group',Sources(user_sources),HeaderFiles(user_headers)) +#子目录 +#Directory('demo') + diff --git a/configure/test/test_group/Makefile b/configure/test/test_group/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..f8fd87434e7fe11586ceaadbf57f93d7386691f9 --- /dev/null +++ b/configure/test/test_group/Makefile @@ -0,0 +1,137 @@ +#COMAKE2 edit-mode: -*- Makefile -*- +####################64Bit Mode#################### +ifeq ($(shell uname -m),x86_64) +CC=gcc +CXX=g++ +CXXFLAGS=-g \ + -pipe \ + -W \ + -Wall \ + -fPIC +CFLAGS=-g \ + -pipe \ + -W \ + -Wall \ + -fPIC +CPPFLAGS=-D_GNU_SOURCE \ + -D__STDC_LIMIT_MACROS \ + -DVERSION=\"1.9.8.7\" +INCPATH=-I. \ + -I../../ \ + -I./include \ + -I./output \ + -I./output/include +DEP_INCPATH=-I../../../../com/btest/gtest \ + -I../../../../com/btest/gtest/include \ + -I../../../../com/btest/gtest/output \ + -I../../../../com/btest/gtest/output/include \ + -I../../../../lib2-64/bsl \ + -I../../../../lib2-64/bsl/include \ + -I../../../../lib2-64/bsl/output \ + -I../../../../lib2-64/bsl/output/include \ + -I../../../../lib2-64/ullib \ + -I../../../../lib2-64/ullib/include \ + -I../../../../lib2-64/ullib/output \ + -I../../../../lib2-64/ullib/output/include \ + -I../../../../public/spreg \ + -I../../../../public/spreg/include \ + -I../../../../public/spreg/output \ + -I../../../../public/spreg/output/include \ + -I../../../../quality/autotest/reportlib/cpp \ + -I../../../../quality/autotest/reportlib/cpp/include \ + -I../../../../quality/autotest/reportlib/cpp/output \ + -I../../../../quality/autotest/reportlib/cpp/output/include \ + -I../../../../third-64/pcre \ + -I../../../../third-64/pcre/include \ + -I../../../../third-64/pcre/output \ + -I../../../../third-64/pcre/output/include + +#============ CCP vars ============ +CCHECK=@ccheck.py +CCHECK_FLAGS= +PCLINT=@pclint +PCLINT_FLAGS= +CCP=@ccp.py +CCP_FLAGS= + + +#COMAKE UUID +COMAKE_MD5=efc277696b93624647d9d0370f10bdd4 COMAKE + + +.PHONY:all +all:comake2_makefile_check test_Configure + @echo "[COMAKE:BUILD][Target:'all']" + @echo "make all done" + +.PHONY:comake2_makefile_check +comake2_makefile_check: + @echo "[COMAKE:BUILD][Target:'comake2_makefile_check']" + #in case of error, update 'Makefile' by 'comake2' + @echo "$(COMAKE_MD5)">comake2.md5 + @md5sum -c --status comake2.md5 + @rm -f comake2.md5 + +.PHONY:ccpclean +ccpclean: + @echo "[COMAKE:BUILD][Target:'ccpclean']" + @echo "make ccpclean done" + +.PHONY:clean +clean:ccpclean + @echo "[COMAKE:BUILD][Target:'clean']" + rm -rf test_Configure + rm -rf ./output/bin/test_Configure + rm -rf test_Configure_test_Configure.o + +.PHONY:dist +dist: + @echo "[COMAKE:BUILD][Target:'dist']" + tar czvf output.tar.gz output + @echo "make dist done" + +.PHONY:distclean +distclean:clean + @echo "[COMAKE:BUILD][Target:'distclean']" + rm -f output.tar.gz + @echo "make distclean done" + +.PHONY:love +love: + @echo "[COMAKE:BUILD][Target:'love']" + @echo "make love done" + +test_Configure:test_Configure_test_Configure.o \ + ../../libconfig.a + @echo "[COMAKE:BUILD][Target:'test_Configure']" + $(CXX) test_Configure_test_Configure.o -Xlinker "-(" ../../libconfig.a ../../../../com/btest/gtest/output/lib/libgtest.a \ + ../../../../com/btest/gtest/output/lib/libgtest_main.a \ + ../../../../lib2-64/bsl/lib/libbsl.a \ + ../../../../lib2-64/bsl/lib/libbsl_ResourcePool.a \ + ../../../../lib2-64/bsl/lib/libbsl_archive.a \ + ../../../../lib2-64/bsl/lib/libbsl_buffer.a \ + ../../../../lib2-64/bsl/lib/libbsl_check_cast.a \ + ../../../../lib2-64/bsl/lib/libbsl_exception.a \ + ../../../../lib2-64/bsl/lib/libbsl_pool.a \ + ../../../../lib2-64/bsl/lib/libbsl_utils.a \ + ../../../../lib2-64/bsl/lib/libbsl_var.a \ + ../../../../lib2-64/bsl/lib/libbsl_var_implement.a \ + ../../../../lib2-64/bsl/lib/libbsl_var_utils.a \ + ../../../../lib2-64/ullib/lib/libullib.a \ + ../../../../public/spreg/libspreg.a \ + ../../../../quality/autotest/reportlib/cpp/libautotest.a \ + ../../../../third-64/pcre/lib/libpcre.a \ + ../../../../third-64/pcre/lib/libpcrecpp.a \ + ../../../../third-64/pcre/lib/libpcreposix.a -lpthread \ + -lcrypto \ + -lrt -Xlinker "-)" -o test_Configure + mkdir -p ./output/bin + cp -f --link test_Configure ./output/bin + +test_Configure_test_Configure.o:test_Configure.cpp + @echo "[COMAKE:BUILD][Target:'test_Configure_test_Configure.o']" + $(CXX) -c $(INCPATH) $(DEP_INCPATH) $(CPPFLAGS) $(CXXFLAGS) -o test_Configure_test_Configure.o test_Configure.cpp + +endif #ifeq ($(shell uname -m),x86_64) + + diff --git a/configure/test/test_group/conf/bigconf.conf b/configure/test/test_group/conf/bigconf.conf new file mode 100644 index 0000000000000000000000000000000000000000..20078318435f8a5a32aff5ddbb942090ca299327 --- /dev/null +++ b/configure/test/test_group/conf/bigconf.conf @@ -0,0 +1,100000 @@ +[group_1] +[group_2] +[group_3] +[group_4] +[group_5] +[group_6] +[group_7] +[group_8] +[group_9] +[group_10] +[group_11] +[group_12] +[group_13] +[group_14] +[group_15] +[group_16] +[group_17] +[group_18] +[group_19] +[group_20] +[group_21] +[group_22] +[group_23] +[group_24] +[group_25] +[group_26] +[group_27] +[group_28] +[group_29] +[group_30] +[group_31] +[group_32] +[group_33] +[group_34] +[group_35] +[group_36] +[group_37] +[group_38] +[group_39] +[group_40] +[group_41] +[group_42] +[group_43] +[group_44] +[group_45] +[group_46] +[group_47] +[group_48] +[group_49] +[group_50] +[group_51] +[group_52] +[group_53] +[group_54] +[group_55] +[group_56] +[group_57] +[group_58] +[group_59] +[group_60] +[group_61] +[group_62] +[group_63] +[group_64] +[group_65] +[group_66] +[group_67] +[group_68] +[group_69] +[group_70] +[group_71] +[group_72] +[group_73] +[group_74] +[group_75] +[group_76] +[group_77] +[group_78] +[group_79] +[group_80] +[group_81] +[group_82] +[group_83] +[group_84] +[group_85] +[group_86] +[group_87] +[group_88] +[group_89] +[group_90] +[group_91] +[group_92] +[group_93] +[group_94] +[group_95] +[group_96] +[group_97] +[group_98] +[group_99] +[group_100] +[group_101] +[group_102] +[group_103] +[group_104] +[group_105] +[group_106] +[group_107] +[group_108] +[group_109] +[group_110] +[group_111] +[group_112] +[group_113] +[group_114] +[group_115] +[group_116] +[group_117] +[group_118] +[group_119] +[group_120] +[group_121] +[group_122] +[group_123] +[group_124] +[group_125] +[group_126] +[group_127] +[group_128] +[group_129] +[group_130] +[group_131] +[group_132] +[group_133] +[group_134] +[group_135] +[group_136] +[group_137] +[group_138] +[group_139] +[group_140] +[group_141] +[group_142] +[group_143] +[group_144] +[group_145] +[group_146] +[group_147] +[group_148] +[group_149] +[group_150] +[group_151] +[group_152] +[group_153] +[group_154] +[group_155] +[group_156] +[group_157] +[group_158] +[group_159] +[group_160] +[group_161] +[group_162] +[group_163] +[group_164] +[group_165] +[group_166] +[group_167] +[group_168] +[group_169] +[group_170] +[group_171] +[group_172] +[group_173] +[group_174] +[group_175] +[group_176] +[group_177] +[group_178] +[group_179] +[group_180] +[group_181] +[group_182] +[group_183] +[group_184] +[group_185] +[group_186] +[group_187] +[group_188] +[group_189] +[group_190] +[group_191] +[group_192] +[group_193] +[group_194] +[group_195] +[group_196] +[group_197] +[group_198] +[group_199] +[group_200] +[group_201] +[group_202] +[group_203] +[group_204] +[group_205] +[group_206] +[group_207] +[group_208] +[group_209] +[group_210] +[group_211] +[group_212] +[group_213] +[group_214] +[group_215] +[group_216] +[group_217] +[group_218] +[group_219] +[group_220] +[group_221] +[group_222] +[group_223] +[group_224] +[group_225] +[group_226] +[group_227] +[group_228] +[group_229] +[group_230] +[group_231] +[group_232] +[group_233] +[group_234] +[group_235] +[group_236] +[group_237] +[group_238] +[group_239] +[group_240] +[group_241] +[group_242] +[group_243] +[group_244] +[group_245] +[group_246] +[group_247] +[group_248] +[group_249] +[group_250] +[group_251] +[group_252] +[group_253] +[group_254] +[group_255] +[group_256] +[group_257] +[group_258] +[group_259] +[group_260] +[group_261] +[group_262] +[group_263] +[group_264] +[group_265] +[group_266] +[group_267] +[group_268] +[group_269] +[group_270] +[group_271] +[group_272] +[group_273] +[group_274] +[group_275] +[group_276] +[group_277] +[group_278] +[group_279] +[group_280] +[group_281] +[group_282] +[group_283] +[group_284] +[group_285] +[group_286] +[group_287] +[group_288] +[group_289] +[group_290] +[group_291] +[group_292] +[group_293] +[group_294] +[group_295] +[group_296] +[group_297] +[group_298] +[group_299] +[group_300] +[group_301] +[group_302] +[group_303] +[group_304] +[group_305] +[group_306] +[group_307] +[group_308] +[group_309] +[group_310] +[group_311] +[group_312] +[group_313] +[group_314] +[group_315] +[group_316] +[group_317] +[group_318] +[group_319] +[group_320] +[group_321] +[group_322] +[group_323] +[group_324] +[group_325] +[group_326] +[group_327] +[group_328] +[group_329] +[group_330] +[group_331] +[group_332] +[group_333] +[group_334] +[group_335] +[group_336] +[group_337] +[group_338] +[group_339] +[group_340] +[group_341] +[group_342] +[group_343] +[group_344] +[group_345] +[group_346] +[group_347] +[group_348] +[group_349] +[group_350] +[group_351] +[group_352] +[group_353] +[group_354] +[group_355] +[group_356] +[group_357] +[group_358] +[group_359] +[group_360] +[group_361] +[group_362] +[group_363] +[group_364] +[group_365] +[group_366] +[group_367] +[group_368] +[group_369] +[group_370] +[group_371] +[group_372] +[group_373] +[group_374] +[group_375] +[group_376] +[group_377] +[group_378] +[group_379] +[group_380] +[group_381] +[group_382] +[group_383] +[group_384] +[group_385] +[group_386] +[group_387] +[group_388] +[group_389] +[group_390] +[group_391] +[group_392] +[group_393] +[group_394] +[group_395] +[group_396] +[group_397] +[group_398] +[group_399] +[group_400] +[group_401] +[group_402] +[group_403] +[group_404] +[group_405] +[group_406] +[group_407] +[group_408] +[group_409] +[group_410] +[group_411] +[group_412] +[group_413] +[group_414] +[group_415] +[group_416] +[group_417] +[group_418] +[group_419] +[group_420] +[group_421] +[group_422] +[group_423] +[group_424] +[group_425] +[group_426] +[group_427] +[group_428] +[group_429] +[group_430] +[group_431] +[group_432] +[group_433] +[group_434] +[group_435] +[group_436] +[group_437] +[group_438] +[group_439] +[group_440] +[group_441] +[group_442] +[group_443] +[group_444] +[group_445] +[group_446] +[group_447] +[group_448] +[group_449] +[group_450] +[group_451] +[group_452] +[group_453] +[group_454] +[group_455] +[group_456] +[group_457] +[group_458] +[group_459] +[group_460] +[group_461] +[group_462] +[group_463] +[group_464] +[group_465] +[group_466] +[group_467] +[group_468] +[group_469] +[group_470] +[group_471] +[group_472] +[group_473] +[group_474] +[group_475] +[group_476] +[group_477] +[group_478] +[group_479] +[group_480] +[group_481] +[group_482] +[group_483] +[group_484] +[group_485] +[group_486] +[group_487] +[group_488] +[group_489] +[group_490] +[group_491] +[group_492] +[group_493] +[group_494] +[group_495] +[group_496] +[group_497] +[group_498] +[group_499] +[group_500] +[group_501] +[group_502] +[group_503] +[group_504] +[group_505] +[group_506] +[group_507] +[group_508] +[group_509] +[group_510] +[group_511] +[group_512] +[group_513] +[group_514] +[group_515] +[group_516] +[group_517] +[group_518] +[group_519] +[group_520] +[group_521] +[group_522] +[group_523] +[group_524] +[group_525] +[group_526] +[group_527] +[group_528] +[group_529] +[group_530] +[group_531] +[group_532] +[group_533] +[group_534] +[group_535] +[group_536] +[group_537] +[group_538] +[group_539] +[group_540] +[group_541] +[group_542] +[group_543] +[group_544] +[group_545] +[group_546] +[group_547] +[group_548] +[group_549] +[group_550] +[group_551] +[group_552] +[group_553] +[group_554] +[group_555] +[group_556] +[group_557] +[group_558] +[group_559] +[group_560] +[group_561] +[group_562] +[group_563] +[group_564] +[group_565] +[group_566] +[group_567] +[group_568] +[group_569] +[group_570] +[group_571] +[group_572] +[group_573] +[group_574] +[group_575] +[group_576] +[group_577] +[group_578] +[group_579] +[group_580] +[group_581] +[group_582] +[group_583] +[group_584] +[group_585] +[group_586] +[group_587] +[group_588] +[group_589] +[group_590] +[group_591] +[group_592] +[group_593] +[group_594] +[group_595] +[group_596] +[group_597] +[group_598] +[group_599] +[group_600] +[group_601] +[group_602] +[group_603] +[group_604] +[group_605] +[group_606] +[group_607] +[group_608] +[group_609] +[group_610] +[group_611] +[group_612] +[group_613] +[group_614] +[group_615] +[group_616] +[group_617] +[group_618] +[group_619] +[group_620] +[group_621] +[group_622] +[group_623] +[group_624] +[group_625] +[group_626] +[group_627] +[group_628] +[group_629] +[group_630] +[group_631] +[group_632] +[group_633] +[group_634] +[group_635] +[group_636] +[group_637] +[group_638] +[group_639] +[group_640] +[group_641] +[group_642] +[group_643] +[group_644] +[group_645] +[group_646] +[group_647] +[group_648] +[group_649] +[group_650] +[group_651] +[group_652] +[group_653] +[group_654] +[group_655] +[group_656] +[group_657] +[group_658] +[group_659] +[group_660] +[group_661] +[group_662] +[group_663] +[group_664] +[group_665] +[group_666] +[group_667] +[group_668] +[group_669] +[group_670] +[group_671] +[group_672] +[group_673] +[group_674] +[group_675] +[group_676] +[group_677] +[group_678] +[group_679] +[group_680] +[group_681] +[group_682] +[group_683] +[group_684] +[group_685] +[group_686] +[group_687] +[group_688] +[group_689] +[group_690] +[group_691] +[group_692] +[group_693] +[group_694] +[group_695] +[group_696] +[group_697] +[group_698] +[group_699] +[group_700] +[group_701] +[group_702] +[group_703] +[group_704] +[group_705] +[group_706] +[group_707] +[group_708] +[group_709] +[group_710] +[group_711] +[group_712] +[group_713] +[group_714] +[group_715] +[group_716] +[group_717] +[group_718] +[group_719] +[group_720] +[group_721] +[group_722] +[group_723] +[group_724] +[group_725] +[group_726] +[group_727] +[group_728] +[group_729] +[group_730] +[group_731] +[group_732] +[group_733] +[group_734] +[group_735] +[group_736] +[group_737] +[group_738] +[group_739] +[group_740] +[group_741] +[group_742] +[group_743] +[group_744] +[group_745] +[group_746] +[group_747] +[group_748] +[group_749] +[group_750] +[group_751] +[group_752] +[group_753] +[group_754] +[group_755] +[group_756] +[group_757] +[group_758] +[group_759] +[group_760] +[group_761] +[group_762] +[group_763] +[group_764] +[group_765] +[group_766] +[group_767] +[group_768] +[group_769] +[group_770] +[group_771] +[group_772] +[group_773] +[group_774] +[group_775] +[group_776] +[group_777] +[group_778] +[group_779] +[group_780] +[group_781] +[group_782] +[group_783] +[group_784] +[group_785] +[group_786] +[group_787] +[group_788] +[group_789] +[group_790] +[group_791] +[group_792] +[group_793] +[group_794] +[group_795] +[group_796] +[group_797] +[group_798] +[group_799] +[group_800] +[group_801] +[group_802] +[group_803] +[group_804] +[group_805] +[group_806] +[group_807] +[group_808] +[group_809] +[group_810] +[group_811] +[group_812] +[group_813] +[group_814] +[group_815] +[group_816] +[group_817] +[group_818] +[group_819] +[group_820] +[group_821] +[group_822] +[group_823] +[group_824] +[group_825] +[group_826] +[group_827] +[group_828] +[group_829] +[group_830] +[group_831] +[group_832] +[group_833] +[group_834] +[group_835] +[group_836] +[group_837] +[group_838] +[group_839] +[group_840] +[group_841] +[group_842] +[group_843] +[group_844] +[group_845] +[group_846] +[group_847] +[group_848] +[group_849] +[group_850] +[group_851] +[group_852] +[group_853] +[group_854] +[group_855] +[group_856] +[group_857] +[group_858] +[group_859] +[group_860] +[group_861] +[group_862] +[group_863] +[group_864] +[group_865] +[group_866] +[group_867] +[group_868] +[group_869] +[group_870] +[group_871] +[group_872] +[group_873] +[group_874] +[group_875] +[group_876] +[group_877] +[group_878] +[group_879] +[group_880] +[group_881] +[group_882] +[group_883] +[group_884] +[group_885] +[group_886] +[group_887] +[group_888] +[group_889] +[group_890] +[group_891] +[group_892] +[group_893] +[group_894] +[group_895] +[group_896] +[group_897] +[group_898] +[group_899] +[group_900] +[group_901] +[group_902] +[group_903] +[group_904] +[group_905] +[group_906] +[group_907] +[group_908] +[group_909] +[group_910] +[group_911] +[group_912] +[group_913] +[group_914] +[group_915] +[group_916] +[group_917] +[group_918] +[group_919] +[group_920] +[group_921] +[group_922] +[group_923] +[group_924] +[group_925] +[group_926] +[group_927] +[group_928] +[group_929] +[group_930] +[group_931] +[group_932] +[group_933] +[group_934] +[group_935] +[group_936] +[group_937] +[group_938] +[group_939] +[group_940] +[group_941] +[group_942] +[group_943] +[group_944] +[group_945] +[group_946] +[group_947] +[group_948] +[group_949] +[group_950] +[group_951] +[group_952] +[group_953] +[group_954] +[group_955] +[group_956] +[group_957] +[group_958] +[group_959] +[group_960] +[group_961] +[group_962] +[group_963] +[group_964] +[group_965] +[group_966] +[group_967] +[group_968] +[group_969] +[group_970] +[group_971] +[group_972] +[group_973] +[group_974] +[group_975] +[group_976] +[group_977] +[group_978] +[group_979] +[group_980] +[group_981] +[group_982] +[group_983] +[group_984] +[group_985] +[group_986] +[group_987] +[group_988] +[group_989] +[group_990] +[group_991] +[group_992] +[group_993] +[group_994] +[group_995] +[group_996] +[group_997] +[group_998] +[group_999] +[group_1000] +[group_1001] +[group_1002] +[group_1003] +[group_1004] +[group_1005] +[group_1006] +[group_1007] +[group_1008] +[group_1009] +[group_1010] +[group_1011] +[group_1012] +[group_1013] +[group_1014] +[group_1015] +[group_1016] +[group_1017] +[group_1018] +[group_1019] +[group_1020] +[group_1021] +[group_1022] +[group_1023] +[group_1024] +[group_1025] +[group_1026] +[group_1027] +[group_1028] +[group_1029] +[group_1030] +[group_1031] +[group_1032] +[group_1033] +[group_1034] +[group_1035] +[group_1036] +[group_1037] +[group_1038] +[group_1039] +[group_1040] +[group_1041] +[group_1042] +[group_1043] +[group_1044] +[group_1045] +[group_1046] +[group_1047] +[group_1048] +[group_1049] +[group_1050] +[group_1051] +[group_1052] +[group_1053] +[group_1054] +[group_1055] +[group_1056] +[group_1057] +[group_1058] +[group_1059] +[group_1060] +[group_1061] +[group_1062] +[group_1063] +[group_1064] +[group_1065] +[group_1066] +[group_1067] +[group_1068] +[group_1069] +[group_1070] +[group_1071] +[group_1072] +[group_1073] +[group_1074] +[group_1075] +[group_1076] +[group_1077] +[group_1078] +[group_1079] +[group_1080] +[group_1081] +[group_1082] +[group_1083] +[group_1084] +[group_1085] +[group_1086] +[group_1087] +[group_1088] +[group_1089] +[group_1090] +[group_1091] +[group_1092] +[group_1093] +[group_1094] +[group_1095] +[group_1096] +[group_1097] +[group_1098] +[group_1099] +[group_1100] +[group_1101] +[group_1102] +[group_1103] +[group_1104] +[group_1105] +[group_1106] +[group_1107] +[group_1108] +[group_1109] +[group_1110] +[group_1111] +[group_1112] +[group_1113] +[group_1114] +[group_1115] +[group_1116] +[group_1117] +[group_1118] +[group_1119] +[group_1120] +[group_1121] +[group_1122] +[group_1123] +[group_1124] +[group_1125] +[group_1126] +[group_1127] +[group_1128] +[group_1129] +[group_1130] +[group_1131] +[group_1132] +[group_1133] +[group_1134] +[group_1135] +[group_1136] +[group_1137] +[group_1138] +[group_1139] +[group_1140] +[group_1141] +[group_1142] +[group_1143] +[group_1144] +[group_1145] +[group_1146] +[group_1147] +[group_1148] +[group_1149] +[group_1150] +[group_1151] +[group_1152] +[group_1153] +[group_1154] +[group_1155] +[group_1156] +[group_1157] +[group_1158] +[group_1159] +[group_1160] +[group_1161] +[group_1162] +[group_1163] +[group_1164] +[group_1165] +[group_1166] +[group_1167] +[group_1168] +[group_1169] +[group_1170] +[group_1171] +[group_1172] +[group_1173] +[group_1174] +[group_1175] +[group_1176] +[group_1177] +[group_1178] +[group_1179] +[group_1180] +[group_1181] +[group_1182] +[group_1183] +[group_1184] +[group_1185] +[group_1186] +[group_1187] +[group_1188] +[group_1189] +[group_1190] +[group_1191] +[group_1192] +[group_1193] +[group_1194] +[group_1195] +[group_1196] +[group_1197] +[group_1198] +[group_1199] +[group_1200] +[group_1201] +[group_1202] +[group_1203] +[group_1204] +[group_1205] +[group_1206] +[group_1207] +[group_1208] +[group_1209] +[group_1210] +[group_1211] +[group_1212] +[group_1213] +[group_1214] +[group_1215] +[group_1216] +[group_1217] +[group_1218] +[group_1219] +[group_1220] +[group_1221] +[group_1222] +[group_1223] +[group_1224] +[group_1225] +[group_1226] +[group_1227] +[group_1228] +[group_1229] +[group_1230] +[group_1231] +[group_1232] +[group_1233] +[group_1234] +[group_1235] +[group_1236] +[group_1237] +[group_1238] +[group_1239] +[group_1240] +[group_1241] +[group_1242] +[group_1243] +[group_1244] +[group_1245] +[group_1246] +[group_1247] +[group_1248] +[group_1249] +[group_1250] +[group_1251] +[group_1252] +[group_1253] +[group_1254] +[group_1255] +[group_1256] +[group_1257] +[group_1258] +[group_1259] +[group_1260] +[group_1261] +[group_1262] +[group_1263] +[group_1264] +[group_1265] +[group_1266] +[group_1267] +[group_1268] +[group_1269] +[group_1270] +[group_1271] +[group_1272] +[group_1273] +[group_1274] +[group_1275] +[group_1276] +[group_1277] +[group_1278] +[group_1279] +[group_1280] +[group_1281] +[group_1282] +[group_1283] +[group_1284] +[group_1285] +[group_1286] +[group_1287] +[group_1288] +[group_1289] +[group_1290] +[group_1291] +[group_1292] +[group_1293] +[group_1294] +[group_1295] +[group_1296] +[group_1297] +[group_1298] +[group_1299] +[group_1300] +[group_1301] +[group_1302] +[group_1303] +[group_1304] +[group_1305] +[group_1306] +[group_1307] +[group_1308] +[group_1309] +[group_1310] +[group_1311] +[group_1312] +[group_1313] +[group_1314] +[group_1315] +[group_1316] +[group_1317] +[group_1318] +[group_1319] +[group_1320] +[group_1321] +[group_1322] +[group_1323] +[group_1324] +[group_1325] +[group_1326] +[group_1327] +[group_1328] +[group_1329] +[group_1330] +[group_1331] +[group_1332] +[group_1333] +[group_1334] +[group_1335] +[group_1336] +[group_1337] +[group_1338] +[group_1339] +[group_1340] +[group_1341] +[group_1342] +[group_1343] +[group_1344] +[group_1345] +[group_1346] +[group_1347] +[group_1348] +[group_1349] +[group_1350] +[group_1351] +[group_1352] +[group_1353] +[group_1354] +[group_1355] +[group_1356] +[group_1357] +[group_1358] +[group_1359] +[group_1360] +[group_1361] +[group_1362] +[group_1363] +[group_1364] +[group_1365] +[group_1366] +[group_1367] +[group_1368] +[group_1369] +[group_1370] +[group_1371] +[group_1372] +[group_1373] +[group_1374] +[group_1375] +[group_1376] +[group_1377] +[group_1378] +[group_1379] +[group_1380] +[group_1381] +[group_1382] +[group_1383] +[group_1384] +[group_1385] +[group_1386] +[group_1387] +[group_1388] +[group_1389] +[group_1390] +[group_1391] +[group_1392] +[group_1393] +[group_1394] +[group_1395] +[group_1396] +[group_1397] +[group_1398] +[group_1399] +[group_1400] +[group_1401] +[group_1402] +[group_1403] +[group_1404] +[group_1405] +[group_1406] +[group_1407] +[group_1408] +[group_1409] +[group_1410] +[group_1411] +[group_1412] +[group_1413] +[group_1414] +[group_1415] +[group_1416] +[group_1417] +[group_1418] +[group_1419] +[group_1420] +[group_1421] +[group_1422] +[group_1423] +[group_1424] +[group_1425] +[group_1426] +[group_1427] +[group_1428] +[group_1429] +[group_1430] +[group_1431] +[group_1432] +[group_1433] +[group_1434] +[group_1435] +[group_1436] +[group_1437] +[group_1438] +[group_1439] +[group_1440] +[group_1441] +[group_1442] +[group_1443] +[group_1444] +[group_1445] +[group_1446] +[group_1447] +[group_1448] +[group_1449] +[group_1450] +[group_1451] +[group_1452] +[group_1453] +[group_1454] +[group_1455] +[group_1456] +[group_1457] +[group_1458] +[group_1459] +[group_1460] +[group_1461] +[group_1462] +[group_1463] +[group_1464] +[group_1465] +[group_1466] +[group_1467] +[group_1468] +[group_1469] +[group_1470] +[group_1471] +[group_1472] +[group_1473] +[group_1474] +[group_1475] +[group_1476] +[group_1477] +[group_1478] +[group_1479] +[group_1480] +[group_1481] +[group_1482] +[group_1483] +[group_1484] +[group_1485] +[group_1486] +[group_1487] +[group_1488] +[group_1489] +[group_1490] +[group_1491] +[group_1492] +[group_1493] +[group_1494] +[group_1495] +[group_1496] +[group_1497] +[group_1498] +[group_1499] +[group_1500] +[group_1501] +[group_1502] +[group_1503] +[group_1504] +[group_1505] +[group_1506] +[group_1507] +[group_1508] +[group_1509] +[group_1510] +[group_1511] +[group_1512] +[group_1513] +[group_1514] +[group_1515] +[group_1516] +[group_1517] +[group_1518] +[group_1519] +[group_1520] +[group_1521] +[group_1522] +[group_1523] +[group_1524] +[group_1525] +[group_1526] +[group_1527] +[group_1528] +[group_1529] +[group_1530] +[group_1531] +[group_1532] +[group_1533] +[group_1534] +[group_1535] +[group_1536] +[group_1537] +[group_1538] +[group_1539] +[group_1540] +[group_1541] +[group_1542] +[group_1543] +[group_1544] +[group_1545] +[group_1546] +[group_1547] +[group_1548] +[group_1549] +[group_1550] +[group_1551] +[group_1552] +[group_1553] +[group_1554] +[group_1555] +[group_1556] +[group_1557] +[group_1558] +[group_1559] +[group_1560] +[group_1561] +[group_1562] +[group_1563] +[group_1564] +[group_1565] +[group_1566] +[group_1567] +[group_1568] +[group_1569] +[group_1570] +[group_1571] +[group_1572] +[group_1573] +[group_1574] +[group_1575] +[group_1576] +[group_1577] +[group_1578] +[group_1579] +[group_1580] +[group_1581] +[group_1582] +[group_1583] +[group_1584] +[group_1585] +[group_1586] +[group_1587] +[group_1588] +[group_1589] +[group_1590] +[group_1591] +[group_1592] +[group_1593] +[group_1594] +[group_1595] +[group_1596] +[group_1597] +[group_1598] +[group_1599] +[group_1600] +[group_1601] +[group_1602] +[group_1603] +[group_1604] +[group_1605] +[group_1606] +[group_1607] +[group_1608] +[group_1609] +[group_1610] +[group_1611] +[group_1612] +[group_1613] +[group_1614] +[group_1615] +[group_1616] +[group_1617] +[group_1618] +[group_1619] +[group_1620] +[group_1621] +[group_1622] +[group_1623] +[group_1624] +[group_1625] +[group_1626] +[group_1627] +[group_1628] +[group_1629] +[group_1630] +[group_1631] +[group_1632] +[group_1633] +[group_1634] +[group_1635] +[group_1636] +[group_1637] +[group_1638] +[group_1639] +[group_1640] +[group_1641] +[group_1642] +[group_1643] +[group_1644] +[group_1645] +[group_1646] +[group_1647] +[group_1648] +[group_1649] +[group_1650] +[group_1651] +[group_1652] +[group_1653] +[group_1654] +[group_1655] +[group_1656] +[group_1657] +[group_1658] +[group_1659] +[group_1660] +[group_1661] +[group_1662] +[group_1663] +[group_1664] +[group_1665] +[group_1666] +[group_1667] +[group_1668] +[group_1669] +[group_1670] +[group_1671] +[group_1672] +[group_1673] +[group_1674] +[group_1675] +[group_1676] +[group_1677] +[group_1678] +[group_1679] +[group_1680] +[group_1681] +[group_1682] +[group_1683] +[group_1684] +[group_1685] +[group_1686] +[group_1687] +[group_1688] +[group_1689] +[group_1690] +[group_1691] +[group_1692] +[group_1693] +[group_1694] +[group_1695] +[group_1696] +[group_1697] +[group_1698] +[group_1699] +[group_1700] +[group_1701] +[group_1702] +[group_1703] +[group_1704] +[group_1705] +[group_1706] +[group_1707] +[group_1708] +[group_1709] +[group_1710] +[group_1711] +[group_1712] +[group_1713] +[group_1714] +[group_1715] +[group_1716] +[group_1717] +[group_1718] +[group_1719] +[group_1720] +[group_1721] +[group_1722] +[group_1723] +[group_1724] +[group_1725] +[group_1726] +[group_1727] +[group_1728] +[group_1729] +[group_1730] +[group_1731] +[group_1732] +[group_1733] +[group_1734] +[group_1735] +[group_1736] +[group_1737] +[group_1738] +[group_1739] +[group_1740] +[group_1741] +[group_1742] +[group_1743] +[group_1744] +[group_1745] +[group_1746] +[group_1747] +[group_1748] +[group_1749] +[group_1750] +[group_1751] +[group_1752] +[group_1753] +[group_1754] +[group_1755] +[group_1756] +[group_1757] +[group_1758] +[group_1759] +[group_1760] +[group_1761] +[group_1762] +[group_1763] +[group_1764] +[group_1765] +[group_1766] +[group_1767] +[group_1768] +[group_1769] +[group_1770] +[group_1771] +[group_1772] +[group_1773] +[group_1774] +[group_1775] +[group_1776] +[group_1777] +[group_1778] +[group_1779] +[group_1780] +[group_1781] +[group_1782] +[group_1783] +[group_1784] +[group_1785] +[group_1786] +[group_1787] +[group_1788] +[group_1789] +[group_1790] +[group_1791] +[group_1792] +[group_1793] +[group_1794] +[group_1795] +[group_1796] +[group_1797] +[group_1798] +[group_1799] +[group_1800] +[group_1801] +[group_1802] +[group_1803] +[group_1804] +[group_1805] +[group_1806] +[group_1807] +[group_1808] +[group_1809] +[group_1810] +[group_1811] +[group_1812] +[group_1813] +[group_1814] +[group_1815] +[group_1816] +[group_1817] +[group_1818] +[group_1819] +[group_1820] +[group_1821] +[group_1822] +[group_1823] +[group_1824] +[group_1825] +[group_1826] +[group_1827] +[group_1828] +[group_1829] +[group_1830] +[group_1831] +[group_1832] +[group_1833] +[group_1834] +[group_1835] +[group_1836] +[group_1837] +[group_1838] +[group_1839] +[group_1840] +[group_1841] +[group_1842] +[group_1843] +[group_1844] +[group_1845] +[group_1846] +[group_1847] +[group_1848] +[group_1849] +[group_1850] +[group_1851] +[group_1852] +[group_1853] +[group_1854] +[group_1855] +[group_1856] +[group_1857] +[group_1858] +[group_1859] +[group_1860] +[group_1861] +[group_1862] +[group_1863] +[group_1864] +[group_1865] +[group_1866] +[group_1867] +[group_1868] +[group_1869] +[group_1870] +[group_1871] +[group_1872] +[group_1873] +[group_1874] +[group_1875] +[group_1876] +[group_1877] +[group_1878] +[group_1879] +[group_1880] +[group_1881] +[group_1882] +[group_1883] +[group_1884] +[group_1885] +[group_1886] +[group_1887] +[group_1888] +[group_1889] +[group_1890] +[group_1891] +[group_1892] +[group_1893] +[group_1894] +[group_1895] +[group_1896] +[group_1897] +[group_1898] +[group_1899] +[group_1900] +[group_1901] +[group_1902] +[group_1903] +[group_1904] +[group_1905] +[group_1906] +[group_1907] +[group_1908] +[group_1909] +[group_1910] +[group_1911] +[group_1912] +[group_1913] +[group_1914] +[group_1915] +[group_1916] +[group_1917] +[group_1918] +[group_1919] +[group_1920] +[group_1921] +[group_1922] +[group_1923] +[group_1924] +[group_1925] +[group_1926] +[group_1927] +[group_1928] +[group_1929] +[group_1930] +[group_1931] +[group_1932] +[group_1933] +[group_1934] +[group_1935] +[group_1936] +[group_1937] +[group_1938] +[group_1939] +[group_1940] +[group_1941] +[group_1942] +[group_1943] +[group_1944] +[group_1945] +[group_1946] +[group_1947] +[group_1948] +[group_1949] +[group_1950] +[group_1951] +[group_1952] +[group_1953] +[group_1954] +[group_1955] +[group_1956] +[group_1957] +[group_1958] +[group_1959] +[group_1960] +[group_1961] +[group_1962] +[group_1963] +[group_1964] +[group_1965] +[group_1966] +[group_1967] +[group_1968] +[group_1969] +[group_1970] +[group_1971] +[group_1972] +[group_1973] +[group_1974] +[group_1975] +[group_1976] +[group_1977] +[group_1978] +[group_1979] +[group_1980] +[group_1981] +[group_1982] +[group_1983] +[group_1984] +[group_1985] +[group_1986] +[group_1987] +[group_1988] +[group_1989] +[group_1990] +[group_1991] +[group_1992] +[group_1993] +[group_1994] +[group_1995] +[group_1996] +[group_1997] +[group_1998] +[group_1999] +[group_2000] +[group_2001] +[group_2002] +[group_2003] +[group_2004] +[group_2005] +[group_2006] +[group_2007] +[group_2008] +[group_2009] +[group_2010] +[group_2011] +[group_2012] +[group_2013] +[group_2014] +[group_2015] +[group_2016] +[group_2017] +[group_2018] +[group_2019] +[group_2020] +[group_2021] +[group_2022] +[group_2023] +[group_2024] +[group_2025] +[group_2026] +[group_2027] +[group_2028] +[group_2029] +[group_2030] +[group_2031] +[group_2032] +[group_2033] +[group_2034] +[group_2035] +[group_2036] +[group_2037] +[group_2038] +[group_2039] +[group_2040] +[group_2041] +[group_2042] +[group_2043] +[group_2044] +[group_2045] +[group_2046] +[group_2047] +[group_2048] +[group_2049] +[group_2050] +[group_2051] +[group_2052] +[group_2053] +[group_2054] +[group_2055] +[group_2056] +[group_2057] +[group_2058] +[group_2059] +[group_2060] +[group_2061] +[group_2062] +[group_2063] +[group_2064] +[group_2065] +[group_2066] +[group_2067] +[group_2068] +[group_2069] +[group_2070] +[group_2071] +[group_2072] +[group_2073] +[group_2074] +[group_2075] +[group_2076] +[group_2077] +[group_2078] +[group_2079] +[group_2080] +[group_2081] +[group_2082] +[group_2083] +[group_2084] +[group_2085] +[group_2086] +[group_2087] +[group_2088] +[group_2089] +[group_2090] +[group_2091] +[group_2092] +[group_2093] +[group_2094] +[group_2095] +[group_2096] +[group_2097] +[group_2098] +[group_2099] +[group_2100] +[group_2101] +[group_2102] +[group_2103] +[group_2104] +[group_2105] +[group_2106] +[group_2107] +[group_2108] +[group_2109] +[group_2110] +[group_2111] +[group_2112] +[group_2113] +[group_2114] +[group_2115] +[group_2116] +[group_2117] +[group_2118] +[group_2119] +[group_2120] +[group_2121] +[group_2122] +[group_2123] +[group_2124] +[group_2125] +[group_2126] +[group_2127] +[group_2128] +[group_2129] +[group_2130] +[group_2131] +[group_2132] +[group_2133] +[group_2134] +[group_2135] +[group_2136] +[group_2137] +[group_2138] +[group_2139] +[group_2140] +[group_2141] +[group_2142] +[group_2143] +[group_2144] +[group_2145] +[group_2146] +[group_2147] +[group_2148] +[group_2149] +[group_2150] +[group_2151] +[group_2152] +[group_2153] +[group_2154] +[group_2155] +[group_2156] +[group_2157] +[group_2158] +[group_2159] +[group_2160] +[group_2161] +[group_2162] +[group_2163] +[group_2164] +[group_2165] +[group_2166] +[group_2167] +[group_2168] +[group_2169] +[group_2170] +[group_2171] +[group_2172] +[group_2173] +[group_2174] +[group_2175] +[group_2176] +[group_2177] +[group_2178] +[group_2179] +[group_2180] +[group_2181] +[group_2182] +[group_2183] +[group_2184] +[group_2185] +[group_2186] +[group_2187] +[group_2188] +[group_2189] +[group_2190] +[group_2191] +[group_2192] +[group_2193] +[group_2194] +[group_2195] +[group_2196] +[group_2197] +[group_2198] +[group_2199] +[group_2200] +[group_2201] +[group_2202] +[group_2203] +[group_2204] +[group_2205] +[group_2206] +[group_2207] +[group_2208] +[group_2209] +[group_2210] +[group_2211] +[group_2212] +[group_2213] +[group_2214] +[group_2215] +[group_2216] +[group_2217] +[group_2218] +[group_2219] +[group_2220] +[group_2221] +[group_2222] +[group_2223] +[group_2224] +[group_2225] +[group_2226] +[group_2227] +[group_2228] +[group_2229] +[group_2230] +[group_2231] +[group_2232] +[group_2233] +[group_2234] +[group_2235] +[group_2236] +[group_2237] +[group_2238] +[group_2239] +[group_2240] +[group_2241] +[group_2242] +[group_2243] +[group_2244] +[group_2245] +[group_2246] +[group_2247] +[group_2248] +[group_2249] +[group_2250] +[group_2251] +[group_2252] +[group_2253] +[group_2254] +[group_2255] +[group_2256] +[group_2257] +[group_2258] +[group_2259] +[group_2260] +[group_2261] +[group_2262] +[group_2263] +[group_2264] +[group_2265] +[group_2266] +[group_2267] +[group_2268] +[group_2269] +[group_2270] +[group_2271] +[group_2272] +[group_2273] +[group_2274] +[group_2275] +[group_2276] +[group_2277] +[group_2278] +[group_2279] +[group_2280] +[group_2281] +[group_2282] +[group_2283] +[group_2284] +[group_2285] +[group_2286] +[group_2287] +[group_2288] +[group_2289] +[group_2290] +[group_2291] +[group_2292] +[group_2293] +[group_2294] +[group_2295] +[group_2296] +[group_2297] +[group_2298] +[group_2299] +[group_2300] +[group_2301] +[group_2302] +[group_2303] +[group_2304] +[group_2305] +[group_2306] +[group_2307] +[group_2308] +[group_2309] +[group_2310] +[group_2311] +[group_2312] +[group_2313] +[group_2314] +[group_2315] +[group_2316] +[group_2317] +[group_2318] +[group_2319] +[group_2320] +[group_2321] +[group_2322] +[group_2323] +[group_2324] +[group_2325] +[group_2326] +[group_2327] +[group_2328] +[group_2329] +[group_2330] +[group_2331] +[group_2332] +[group_2333] +[group_2334] +[group_2335] +[group_2336] +[group_2337] +[group_2338] +[group_2339] +[group_2340] +[group_2341] +[group_2342] +[group_2343] +[group_2344] +[group_2345] +[group_2346] +[group_2347] +[group_2348] +[group_2349] +[group_2350] +[group_2351] +[group_2352] +[group_2353] +[group_2354] +[group_2355] +[group_2356] +[group_2357] +[group_2358] +[group_2359] +[group_2360] +[group_2361] +[group_2362] +[group_2363] +[group_2364] +[group_2365] +[group_2366] +[group_2367] +[group_2368] +[group_2369] +[group_2370] +[group_2371] +[group_2372] +[group_2373] +[group_2374] +[group_2375] +[group_2376] +[group_2377] +[group_2378] +[group_2379] +[group_2380] +[group_2381] +[group_2382] +[group_2383] +[group_2384] +[group_2385] +[group_2386] +[group_2387] +[group_2388] +[group_2389] +[group_2390] +[group_2391] +[group_2392] +[group_2393] +[group_2394] +[group_2395] +[group_2396] +[group_2397] +[group_2398] +[group_2399] +[group_2400] +[group_2401] +[group_2402] +[group_2403] +[group_2404] +[group_2405] +[group_2406] +[group_2407] +[group_2408] +[group_2409] +[group_2410] +[group_2411] +[group_2412] +[group_2413] +[group_2414] +[group_2415] +[group_2416] +[group_2417] +[group_2418] +[group_2419] +[group_2420] +[group_2421] +[group_2422] +[group_2423] +[group_2424] +[group_2425] +[group_2426] +[group_2427] +[group_2428] +[group_2429] +[group_2430] +[group_2431] +[group_2432] +[group_2433] +[group_2434] +[group_2435] +[group_2436] +[group_2437] +[group_2438] +[group_2439] +[group_2440] +[group_2441] +[group_2442] +[group_2443] +[group_2444] +[group_2445] +[group_2446] +[group_2447] +[group_2448] +[group_2449] +[group_2450] +[group_2451] +[group_2452] +[group_2453] +[group_2454] +[group_2455] +[group_2456] +[group_2457] +[group_2458] +[group_2459] +[group_2460] +[group_2461] +[group_2462] +[group_2463] +[group_2464] +[group_2465] +[group_2466] +[group_2467] +[group_2468] +[group_2469] +[group_2470] +[group_2471] +[group_2472] +[group_2473] +[group_2474] +[group_2475] +[group_2476] +[group_2477] +[group_2478] +[group_2479] +[group_2480] +[group_2481] +[group_2482] +[group_2483] +[group_2484] +[group_2485] +[group_2486] +[group_2487] +[group_2488] +[group_2489] +[group_2490] +[group_2491] +[group_2492] +[group_2493] +[group_2494] +[group_2495] +[group_2496] +[group_2497] +[group_2498] +[group_2499] +[group_2500] +[group_2501] +[group_2502] +[group_2503] +[group_2504] +[group_2505] +[group_2506] +[group_2507] +[group_2508] +[group_2509] +[group_2510] +[group_2511] +[group_2512] +[group_2513] +[group_2514] +[group_2515] +[group_2516] +[group_2517] +[group_2518] +[group_2519] +[group_2520] +[group_2521] +[group_2522] +[group_2523] +[group_2524] +[group_2525] +[group_2526] +[group_2527] +[group_2528] +[group_2529] +[group_2530] +[group_2531] +[group_2532] +[group_2533] +[group_2534] +[group_2535] +[group_2536] +[group_2537] +[group_2538] +[group_2539] +[group_2540] +[group_2541] +[group_2542] +[group_2543] +[group_2544] +[group_2545] +[group_2546] +[group_2547] +[group_2548] +[group_2549] +[group_2550] +[group_2551] +[group_2552] +[group_2553] +[group_2554] +[group_2555] +[group_2556] +[group_2557] +[group_2558] +[group_2559] +[group_2560] +[group_2561] +[group_2562] +[group_2563] +[group_2564] +[group_2565] +[group_2566] +[group_2567] +[group_2568] +[group_2569] +[group_2570] +[group_2571] +[group_2572] +[group_2573] +[group_2574] +[group_2575] +[group_2576] +[group_2577] +[group_2578] +[group_2579] +[group_2580] +[group_2581] +[group_2582] +[group_2583] +[group_2584] +[group_2585] +[group_2586] +[group_2587] +[group_2588] +[group_2589] +[group_2590] +[group_2591] +[group_2592] +[group_2593] +[group_2594] +[group_2595] +[group_2596] +[group_2597] +[group_2598] +[group_2599] +[group_2600] +[group_2601] +[group_2602] +[group_2603] +[group_2604] +[group_2605] +[group_2606] +[group_2607] +[group_2608] +[group_2609] +[group_2610] +[group_2611] +[group_2612] +[group_2613] +[group_2614] +[group_2615] +[group_2616] +[group_2617] +[group_2618] +[group_2619] +[group_2620] +[group_2621] +[group_2622] +[group_2623] +[group_2624] +[group_2625] +[group_2626] +[group_2627] +[group_2628] +[group_2629] +[group_2630] +[group_2631] +[group_2632] +[group_2633] +[group_2634] +[group_2635] +[group_2636] +[group_2637] +[group_2638] +[group_2639] +[group_2640] +[group_2641] +[group_2642] +[group_2643] +[group_2644] +[group_2645] +[group_2646] +[group_2647] +[group_2648] +[group_2649] +[group_2650] +[group_2651] +[group_2652] +[group_2653] +[group_2654] +[group_2655] +[group_2656] +[group_2657] +[group_2658] +[group_2659] +[group_2660] +[group_2661] +[group_2662] +[group_2663] +[group_2664] +[group_2665] +[group_2666] +[group_2667] +[group_2668] +[group_2669] +[group_2670] +[group_2671] +[group_2672] +[group_2673] +[group_2674] +[group_2675] +[group_2676] +[group_2677] +[group_2678] +[group_2679] +[group_2680] +[group_2681] +[group_2682] +[group_2683] +[group_2684] +[group_2685] +[group_2686] +[group_2687] +[group_2688] +[group_2689] +[group_2690] +[group_2691] +[group_2692] +[group_2693] +[group_2694] +[group_2695] +[group_2696] +[group_2697] +[group_2698] +[group_2699] +[group_2700] +[group_2701] +[group_2702] +[group_2703] +[group_2704] +[group_2705] +[group_2706] +[group_2707] +[group_2708] +[group_2709] +[group_2710] +[group_2711] +[group_2712] +[group_2713] +[group_2714] +[group_2715] +[group_2716] +[group_2717] +[group_2718] +[group_2719] +[group_2720] +[group_2721] +[group_2722] +[group_2723] +[group_2724] +[group_2725] +[group_2726] +[group_2727] +[group_2728] +[group_2729] +[group_2730] +[group_2731] +[group_2732] +[group_2733] +[group_2734] +[group_2735] +[group_2736] +[group_2737] +[group_2738] +[group_2739] +[group_2740] +[group_2741] +[group_2742] +[group_2743] +[group_2744] +[group_2745] +[group_2746] +[group_2747] +[group_2748] +[group_2749] +[group_2750] +[group_2751] +[group_2752] +[group_2753] +[group_2754] +[group_2755] +[group_2756] +[group_2757] +[group_2758] +[group_2759] +[group_2760] +[group_2761] +[group_2762] +[group_2763] +[group_2764] +[group_2765] +[group_2766] +[group_2767] +[group_2768] +[group_2769] +[group_2770] +[group_2771] +[group_2772] +[group_2773] +[group_2774] +[group_2775] +[group_2776] +[group_2777] +[group_2778] +[group_2779] +[group_2780] +[group_2781] +[group_2782] +[group_2783] +[group_2784] +[group_2785] +[group_2786] +[group_2787] +[group_2788] +[group_2789] +[group_2790] +[group_2791] +[group_2792] +[group_2793] +[group_2794] +[group_2795] +[group_2796] +[group_2797] +[group_2798] +[group_2799] +[group_2800] +[group_2801] +[group_2802] +[group_2803] +[group_2804] +[group_2805] +[group_2806] +[group_2807] +[group_2808] +[group_2809] +[group_2810] +[group_2811] +[group_2812] +[group_2813] +[group_2814] +[group_2815] +[group_2816] +[group_2817] +[group_2818] +[group_2819] +[group_2820] +[group_2821] +[group_2822] +[group_2823] +[group_2824] +[group_2825] +[group_2826] +[group_2827] +[group_2828] +[group_2829] +[group_2830] +[group_2831] +[group_2832] +[group_2833] +[group_2834] +[group_2835] +[group_2836] +[group_2837] +[group_2838] +[group_2839] +[group_2840] +[group_2841] +[group_2842] +[group_2843] +[group_2844] +[group_2845] +[group_2846] +[group_2847] +[group_2848] +[group_2849] +[group_2850] +[group_2851] +[group_2852] +[group_2853] +[group_2854] +[group_2855] +[group_2856] +[group_2857] +[group_2858] +[group_2859] +[group_2860] +[group_2861] +[group_2862] +[group_2863] +[group_2864] +[group_2865] +[group_2866] +[group_2867] +[group_2868] +[group_2869] +[group_2870] +[group_2871] +[group_2872] +[group_2873] +[group_2874] +[group_2875] +[group_2876] +[group_2877] +[group_2878] +[group_2879] +[group_2880] +[group_2881] +[group_2882] +[group_2883] +[group_2884] +[group_2885] +[group_2886] +[group_2887] +[group_2888] +[group_2889] +[group_2890] +[group_2891] +[group_2892] +[group_2893] +[group_2894] +[group_2895] +[group_2896] +[group_2897] +[group_2898] +[group_2899] +[group_2900] +[group_2901] +[group_2902] +[group_2903] +[group_2904] +[group_2905] +[group_2906] +[group_2907] +[group_2908] +[group_2909] +[group_2910] +[group_2911] +[group_2912] +[group_2913] +[group_2914] +[group_2915] +[group_2916] +[group_2917] +[group_2918] +[group_2919] +[group_2920] +[group_2921] +[group_2922] +[group_2923] +[group_2924] +[group_2925] +[group_2926] +[group_2927] +[group_2928] +[group_2929] +[group_2930] +[group_2931] +[group_2932] +[group_2933] +[group_2934] +[group_2935] +[group_2936] +[group_2937] +[group_2938] +[group_2939] +[group_2940] +[group_2941] +[group_2942] +[group_2943] +[group_2944] +[group_2945] +[group_2946] +[group_2947] +[group_2948] +[group_2949] +[group_2950] +[group_2951] +[group_2952] +[group_2953] +[group_2954] +[group_2955] +[group_2956] +[group_2957] +[group_2958] +[group_2959] +[group_2960] +[group_2961] +[group_2962] +[group_2963] +[group_2964] +[group_2965] +[group_2966] +[group_2967] +[group_2968] +[group_2969] +[group_2970] +[group_2971] +[group_2972] +[group_2973] +[group_2974] +[group_2975] +[group_2976] +[group_2977] +[group_2978] +[group_2979] +[group_2980] +[group_2981] +[group_2982] +[group_2983] +[group_2984] +[group_2985] +[group_2986] +[group_2987] +[group_2988] +[group_2989] +[group_2990] +[group_2991] +[group_2992] +[group_2993] +[group_2994] +[group_2995] +[group_2996] +[group_2997] +[group_2998] +[group_2999] +[group_3000] +[group_3001] +[group_3002] +[group_3003] +[group_3004] +[group_3005] +[group_3006] +[group_3007] +[group_3008] +[group_3009] +[group_3010] +[group_3011] +[group_3012] +[group_3013] +[group_3014] +[group_3015] +[group_3016] +[group_3017] +[group_3018] +[group_3019] +[group_3020] +[group_3021] +[group_3022] +[group_3023] +[group_3024] +[group_3025] +[group_3026] +[group_3027] +[group_3028] +[group_3029] +[group_3030] +[group_3031] +[group_3032] +[group_3033] +[group_3034] +[group_3035] +[group_3036] +[group_3037] +[group_3038] +[group_3039] +[group_3040] +[group_3041] +[group_3042] +[group_3043] +[group_3044] +[group_3045] +[group_3046] +[group_3047] +[group_3048] +[group_3049] +[group_3050] +[group_3051] +[group_3052] +[group_3053] +[group_3054] +[group_3055] +[group_3056] +[group_3057] +[group_3058] +[group_3059] +[group_3060] +[group_3061] +[group_3062] +[group_3063] +[group_3064] +[group_3065] +[group_3066] +[group_3067] +[group_3068] +[group_3069] +[group_3070] +[group_3071] +[group_3072] +[group_3073] +[group_3074] +[group_3075] +[group_3076] +[group_3077] +[group_3078] +[group_3079] +[group_3080] +[group_3081] +[group_3082] +[group_3083] +[group_3084] +[group_3085] +[group_3086] +[group_3087] +[group_3088] +[group_3089] +[group_3090] +[group_3091] +[group_3092] +[group_3093] +[group_3094] +[group_3095] +[group_3096] +[group_3097] +[group_3098] +[group_3099] +[group_3100] +[group_3101] +[group_3102] +[group_3103] +[group_3104] +[group_3105] +[group_3106] +[group_3107] +[group_3108] +[group_3109] +[group_3110] +[group_3111] +[group_3112] +[group_3113] +[group_3114] +[group_3115] +[group_3116] +[group_3117] +[group_3118] +[group_3119] +[group_3120] +[group_3121] +[group_3122] +[group_3123] +[group_3124] +[group_3125] +[group_3126] +[group_3127] +[group_3128] +[group_3129] +[group_3130] +[group_3131] +[group_3132] +[group_3133] +[group_3134] +[group_3135] +[group_3136] +[group_3137] +[group_3138] +[group_3139] +[group_3140] +[group_3141] +[group_3142] +[group_3143] +[group_3144] +[group_3145] +[group_3146] +[group_3147] +[group_3148] +[group_3149] +[group_3150] +[group_3151] +[group_3152] +[group_3153] +[group_3154] +[group_3155] +[group_3156] +[group_3157] +[group_3158] +[group_3159] +[group_3160] +[group_3161] +[group_3162] +[group_3163] +[group_3164] +[group_3165] +[group_3166] +[group_3167] +[group_3168] +[group_3169] +[group_3170] +[group_3171] +[group_3172] +[group_3173] +[group_3174] +[group_3175] +[group_3176] +[group_3177] +[group_3178] +[group_3179] +[group_3180] +[group_3181] +[group_3182] +[group_3183] +[group_3184] +[group_3185] +[group_3186] +[group_3187] +[group_3188] +[group_3189] +[group_3190] +[group_3191] +[group_3192] +[group_3193] +[group_3194] +[group_3195] +[group_3196] +[group_3197] +[group_3198] +[group_3199] +[group_3200] +[group_3201] +[group_3202] +[group_3203] +[group_3204] +[group_3205] +[group_3206] +[group_3207] +[group_3208] +[group_3209] +[group_3210] +[group_3211] +[group_3212] +[group_3213] +[group_3214] +[group_3215] +[group_3216] +[group_3217] +[group_3218] +[group_3219] +[group_3220] +[group_3221] +[group_3222] +[group_3223] +[group_3224] +[group_3225] +[group_3226] +[group_3227] +[group_3228] +[group_3229] +[group_3230] +[group_3231] +[group_3232] +[group_3233] +[group_3234] +[group_3235] +[group_3236] +[group_3237] +[group_3238] +[group_3239] +[group_3240] +[group_3241] +[group_3242] +[group_3243] +[group_3244] +[group_3245] +[group_3246] +[group_3247] +[group_3248] +[group_3249] +[group_3250] +[group_3251] +[group_3252] +[group_3253] +[group_3254] +[group_3255] +[group_3256] +[group_3257] +[group_3258] +[group_3259] +[group_3260] +[group_3261] +[group_3262] +[group_3263] +[group_3264] +[group_3265] +[group_3266] +[group_3267] +[group_3268] +[group_3269] +[group_3270] +[group_3271] +[group_3272] +[group_3273] +[group_3274] +[group_3275] +[group_3276] +[group_3277] +[group_3278] +[group_3279] +[group_3280] +[group_3281] +[group_3282] +[group_3283] +[group_3284] +[group_3285] +[group_3286] +[group_3287] +[group_3288] +[group_3289] +[group_3290] +[group_3291] +[group_3292] +[group_3293] +[group_3294] +[group_3295] +[group_3296] +[group_3297] +[group_3298] +[group_3299] +[group_3300] +[group_3301] +[group_3302] +[group_3303] +[group_3304] +[group_3305] +[group_3306] +[group_3307] +[group_3308] +[group_3309] +[group_3310] +[group_3311] +[group_3312] +[group_3313] +[group_3314] +[group_3315] +[group_3316] +[group_3317] +[group_3318] +[group_3319] +[group_3320] +[group_3321] +[group_3322] +[group_3323] +[group_3324] +[group_3325] +[group_3326] +[group_3327] +[group_3328] +[group_3329] +[group_3330] +[group_3331] +[group_3332] +[group_3333] +[group_3334] +[group_3335] +[group_3336] +[group_3337] +[group_3338] +[group_3339] +[group_3340] +[group_3341] +[group_3342] +[group_3343] +[group_3344] +[group_3345] +[group_3346] +[group_3347] +[group_3348] +[group_3349] +[group_3350] +[group_3351] +[group_3352] +[group_3353] +[group_3354] +[group_3355] +[group_3356] +[group_3357] +[group_3358] +[group_3359] +[group_3360] +[group_3361] +[group_3362] +[group_3363] +[group_3364] +[group_3365] +[group_3366] +[group_3367] +[group_3368] +[group_3369] +[group_3370] +[group_3371] +[group_3372] +[group_3373] +[group_3374] +[group_3375] +[group_3376] +[group_3377] +[group_3378] +[group_3379] +[group_3380] +[group_3381] +[group_3382] +[group_3383] +[group_3384] +[group_3385] +[group_3386] +[group_3387] +[group_3388] +[group_3389] +[group_3390] +[group_3391] +[group_3392] +[group_3393] +[group_3394] +[group_3395] +[group_3396] +[group_3397] +[group_3398] +[group_3399] +[group_3400] +[group_3401] +[group_3402] +[group_3403] +[group_3404] +[group_3405] +[group_3406] +[group_3407] +[group_3408] +[group_3409] +[group_3410] +[group_3411] +[group_3412] +[group_3413] +[group_3414] +[group_3415] +[group_3416] +[group_3417] +[group_3418] +[group_3419] +[group_3420] +[group_3421] +[group_3422] +[group_3423] +[group_3424] +[group_3425] +[group_3426] +[group_3427] +[group_3428] +[group_3429] +[group_3430] +[group_3431] +[group_3432] +[group_3433] +[group_3434] +[group_3435] +[group_3436] +[group_3437] +[group_3438] +[group_3439] +[group_3440] +[group_3441] +[group_3442] +[group_3443] +[group_3444] +[group_3445] +[group_3446] +[group_3447] +[group_3448] +[group_3449] +[group_3450] +[group_3451] +[group_3452] +[group_3453] +[group_3454] +[group_3455] +[group_3456] +[group_3457] +[group_3458] +[group_3459] +[group_3460] +[group_3461] +[group_3462] +[group_3463] +[group_3464] +[group_3465] +[group_3466] +[group_3467] +[group_3468] +[group_3469] +[group_3470] +[group_3471] +[group_3472] +[group_3473] +[group_3474] +[group_3475] +[group_3476] +[group_3477] +[group_3478] +[group_3479] +[group_3480] +[group_3481] +[group_3482] +[group_3483] +[group_3484] +[group_3485] +[group_3486] +[group_3487] +[group_3488] +[group_3489] +[group_3490] +[group_3491] +[group_3492] +[group_3493] +[group_3494] +[group_3495] +[group_3496] +[group_3497] +[group_3498] +[group_3499] +[group_3500] +[group_3501] +[group_3502] +[group_3503] +[group_3504] +[group_3505] +[group_3506] +[group_3507] +[group_3508] +[group_3509] +[group_3510] +[group_3511] +[group_3512] +[group_3513] +[group_3514] +[group_3515] +[group_3516] +[group_3517] +[group_3518] +[group_3519] +[group_3520] +[group_3521] +[group_3522] +[group_3523] +[group_3524] +[group_3525] +[group_3526] +[group_3527] +[group_3528] +[group_3529] +[group_3530] +[group_3531] +[group_3532] +[group_3533] +[group_3534] +[group_3535] +[group_3536] +[group_3537] +[group_3538] +[group_3539] +[group_3540] +[group_3541] +[group_3542] +[group_3543] +[group_3544] +[group_3545] +[group_3546] +[group_3547] +[group_3548] +[group_3549] +[group_3550] +[group_3551] +[group_3552] +[group_3553] +[group_3554] +[group_3555] +[group_3556] +[group_3557] +[group_3558] +[group_3559] +[group_3560] +[group_3561] +[group_3562] +[group_3563] +[group_3564] +[group_3565] +[group_3566] +[group_3567] +[group_3568] +[group_3569] +[group_3570] +[group_3571] +[group_3572] +[group_3573] +[group_3574] +[group_3575] +[group_3576] +[group_3577] +[group_3578] +[group_3579] +[group_3580] +[group_3581] +[group_3582] +[group_3583] +[group_3584] +[group_3585] +[group_3586] +[group_3587] +[group_3588] +[group_3589] +[group_3590] +[group_3591] +[group_3592] +[group_3593] +[group_3594] +[group_3595] +[group_3596] +[group_3597] +[group_3598] +[group_3599] +[group_3600] +[group_3601] +[group_3602] +[group_3603] +[group_3604] +[group_3605] +[group_3606] +[group_3607] +[group_3608] +[group_3609] +[group_3610] +[group_3611] +[group_3612] +[group_3613] +[group_3614] +[group_3615] +[group_3616] +[group_3617] +[group_3618] +[group_3619] +[group_3620] +[group_3621] +[group_3622] +[group_3623] +[group_3624] +[group_3625] +[group_3626] +[group_3627] +[group_3628] +[group_3629] +[group_3630] +[group_3631] +[group_3632] +[group_3633] +[group_3634] +[group_3635] +[group_3636] +[group_3637] +[group_3638] +[group_3639] +[group_3640] +[group_3641] +[group_3642] +[group_3643] +[group_3644] +[group_3645] +[group_3646] +[group_3647] +[group_3648] +[group_3649] +[group_3650] +[group_3651] +[group_3652] +[group_3653] +[group_3654] +[group_3655] +[group_3656] +[group_3657] +[group_3658] +[group_3659] +[group_3660] +[group_3661] +[group_3662] +[group_3663] +[group_3664] +[group_3665] +[group_3666] +[group_3667] +[group_3668] +[group_3669] +[group_3670] +[group_3671] +[group_3672] +[group_3673] +[group_3674] +[group_3675] +[group_3676] +[group_3677] +[group_3678] +[group_3679] +[group_3680] +[group_3681] +[group_3682] +[group_3683] +[group_3684] +[group_3685] +[group_3686] +[group_3687] +[group_3688] +[group_3689] +[group_3690] +[group_3691] +[group_3692] +[group_3693] +[group_3694] +[group_3695] +[group_3696] +[group_3697] +[group_3698] +[group_3699] +[group_3700] +[group_3701] +[group_3702] +[group_3703] +[group_3704] +[group_3705] +[group_3706] +[group_3707] +[group_3708] +[group_3709] +[group_3710] +[group_3711] +[group_3712] +[group_3713] +[group_3714] +[group_3715] +[group_3716] +[group_3717] +[group_3718] +[group_3719] +[group_3720] +[group_3721] +[group_3722] +[group_3723] +[group_3724] +[group_3725] +[group_3726] +[group_3727] +[group_3728] +[group_3729] +[group_3730] +[group_3731] +[group_3732] +[group_3733] +[group_3734] +[group_3735] +[group_3736] +[group_3737] +[group_3738] +[group_3739] +[group_3740] +[group_3741] +[group_3742] +[group_3743] +[group_3744] +[group_3745] +[group_3746] +[group_3747] +[group_3748] +[group_3749] +[group_3750] +[group_3751] +[group_3752] +[group_3753] +[group_3754] +[group_3755] +[group_3756] +[group_3757] +[group_3758] +[group_3759] +[group_3760] +[group_3761] +[group_3762] +[group_3763] +[group_3764] +[group_3765] +[group_3766] +[group_3767] +[group_3768] +[group_3769] +[group_3770] +[group_3771] +[group_3772] +[group_3773] +[group_3774] +[group_3775] +[group_3776] +[group_3777] +[group_3778] +[group_3779] +[group_3780] +[group_3781] +[group_3782] +[group_3783] +[group_3784] +[group_3785] +[group_3786] +[group_3787] +[group_3788] +[group_3789] +[group_3790] +[group_3791] +[group_3792] +[group_3793] +[group_3794] +[group_3795] +[group_3796] +[group_3797] +[group_3798] +[group_3799] +[group_3800] +[group_3801] +[group_3802] +[group_3803] +[group_3804] +[group_3805] +[group_3806] +[group_3807] +[group_3808] +[group_3809] +[group_3810] +[group_3811] +[group_3812] +[group_3813] +[group_3814] +[group_3815] +[group_3816] +[group_3817] +[group_3818] +[group_3819] +[group_3820] +[group_3821] +[group_3822] +[group_3823] +[group_3824] +[group_3825] +[group_3826] +[group_3827] +[group_3828] +[group_3829] +[group_3830] +[group_3831] +[group_3832] +[group_3833] +[group_3834] +[group_3835] +[group_3836] +[group_3837] +[group_3838] +[group_3839] +[group_3840] +[group_3841] +[group_3842] +[group_3843] +[group_3844] +[group_3845] +[group_3846] +[group_3847] +[group_3848] +[group_3849] +[group_3850] +[group_3851] +[group_3852] +[group_3853] +[group_3854] +[group_3855] +[group_3856] +[group_3857] +[group_3858] +[group_3859] +[group_3860] +[group_3861] +[group_3862] +[group_3863] +[group_3864] +[group_3865] +[group_3866] +[group_3867] +[group_3868] +[group_3869] +[group_3870] +[group_3871] +[group_3872] +[group_3873] +[group_3874] +[group_3875] +[group_3876] +[group_3877] +[group_3878] +[group_3879] +[group_3880] +[group_3881] +[group_3882] +[group_3883] +[group_3884] +[group_3885] +[group_3886] +[group_3887] +[group_3888] +[group_3889] +[group_3890] +[group_3891] +[group_3892] +[group_3893] +[group_3894] +[group_3895] +[group_3896] +[group_3897] +[group_3898] +[group_3899] +[group_3900] +[group_3901] +[group_3902] +[group_3903] +[group_3904] +[group_3905] +[group_3906] +[group_3907] +[group_3908] +[group_3909] +[group_3910] +[group_3911] +[group_3912] +[group_3913] +[group_3914] +[group_3915] +[group_3916] +[group_3917] +[group_3918] +[group_3919] +[group_3920] +[group_3921] +[group_3922] +[group_3923] +[group_3924] +[group_3925] +[group_3926] +[group_3927] +[group_3928] +[group_3929] +[group_3930] +[group_3931] +[group_3932] +[group_3933] +[group_3934] +[group_3935] +[group_3936] +[group_3937] +[group_3938] +[group_3939] +[group_3940] +[group_3941] +[group_3942] +[group_3943] +[group_3944] +[group_3945] +[group_3946] +[group_3947] +[group_3948] +[group_3949] +[group_3950] +[group_3951] +[group_3952] +[group_3953] +[group_3954] +[group_3955] +[group_3956] +[group_3957] +[group_3958] +[group_3959] +[group_3960] +[group_3961] +[group_3962] +[group_3963] +[group_3964] +[group_3965] +[group_3966] +[group_3967] +[group_3968] +[group_3969] +[group_3970] +[group_3971] +[group_3972] +[group_3973] +[group_3974] +[group_3975] +[group_3976] +[group_3977] +[group_3978] +[group_3979] +[group_3980] +[group_3981] +[group_3982] +[group_3983] +[group_3984] +[group_3985] +[group_3986] +[group_3987] +[group_3988] +[group_3989] +[group_3990] +[group_3991] +[group_3992] +[group_3993] +[group_3994] +[group_3995] +[group_3996] +[group_3997] +[group_3998] +[group_3999] +[group_4000] +[group_4001] +[group_4002] +[group_4003] +[group_4004] +[group_4005] +[group_4006] +[group_4007] +[group_4008] +[group_4009] +[group_4010] +[group_4011] +[group_4012] +[group_4013] +[group_4014] +[group_4015] +[group_4016] +[group_4017] +[group_4018] +[group_4019] +[group_4020] +[group_4021] +[group_4022] +[group_4023] +[group_4024] +[group_4025] +[group_4026] +[group_4027] +[group_4028] +[group_4029] +[group_4030] +[group_4031] +[group_4032] +[group_4033] +[group_4034] +[group_4035] +[group_4036] +[group_4037] +[group_4038] +[group_4039] +[group_4040] +[group_4041] +[group_4042] +[group_4043] +[group_4044] +[group_4045] +[group_4046] +[group_4047] +[group_4048] +[group_4049] +[group_4050] +[group_4051] +[group_4052] +[group_4053] +[group_4054] +[group_4055] +[group_4056] +[group_4057] +[group_4058] +[group_4059] +[group_4060] +[group_4061] +[group_4062] +[group_4063] +[group_4064] +[group_4065] +[group_4066] +[group_4067] +[group_4068] +[group_4069] +[group_4070] +[group_4071] +[group_4072] +[group_4073] +[group_4074] +[group_4075] +[group_4076] +[group_4077] +[group_4078] +[group_4079] +[group_4080] +[group_4081] +[group_4082] +[group_4083] +[group_4084] +[group_4085] +[group_4086] +[group_4087] +[group_4088] +[group_4089] +[group_4090] +[group_4091] +[group_4092] +[group_4093] +[group_4094] +[group_4095] +[group_4096] +[group_4097] +[group_4098] +[group_4099] +[group_4100] +[group_4101] +[group_4102] +[group_4103] +[group_4104] +[group_4105] +[group_4106] +[group_4107] +[group_4108] +[group_4109] +[group_4110] +[group_4111] +[group_4112] +[group_4113] +[group_4114] +[group_4115] +[group_4116] +[group_4117] +[group_4118] +[group_4119] +[group_4120] +[group_4121] +[group_4122] +[group_4123] +[group_4124] +[group_4125] +[group_4126] +[group_4127] +[group_4128] +[group_4129] +[group_4130] +[group_4131] +[group_4132] +[group_4133] +[group_4134] +[group_4135] +[group_4136] +[group_4137] +[group_4138] +[group_4139] +[group_4140] +[group_4141] +[group_4142] +[group_4143] +[group_4144] +[group_4145] +[group_4146] +[group_4147] +[group_4148] +[group_4149] +[group_4150] +[group_4151] +[group_4152] +[group_4153] +[group_4154] +[group_4155] +[group_4156] +[group_4157] +[group_4158] +[group_4159] +[group_4160] +[group_4161] +[group_4162] +[group_4163] +[group_4164] +[group_4165] +[group_4166] +[group_4167] +[group_4168] +[group_4169] +[group_4170] +[group_4171] +[group_4172] +[group_4173] +[group_4174] +[group_4175] +[group_4176] +[group_4177] +[group_4178] +[group_4179] +[group_4180] +[group_4181] +[group_4182] +[group_4183] +[group_4184] +[group_4185] +[group_4186] +[group_4187] +[group_4188] +[group_4189] +[group_4190] +[group_4191] +[group_4192] +[group_4193] +[group_4194] +[group_4195] +[group_4196] +[group_4197] +[group_4198] +[group_4199] +[group_4200] +[group_4201] +[group_4202] +[group_4203] +[group_4204] +[group_4205] +[group_4206] +[group_4207] +[group_4208] +[group_4209] +[group_4210] +[group_4211] +[group_4212] +[group_4213] +[group_4214] +[group_4215] +[group_4216] +[group_4217] +[group_4218] +[group_4219] +[group_4220] +[group_4221] +[group_4222] +[group_4223] +[group_4224] +[group_4225] +[group_4226] +[group_4227] +[group_4228] +[group_4229] +[group_4230] +[group_4231] +[group_4232] +[group_4233] +[group_4234] +[group_4235] +[group_4236] +[group_4237] +[group_4238] +[group_4239] +[group_4240] +[group_4241] +[group_4242] +[group_4243] +[group_4244] +[group_4245] +[group_4246] +[group_4247] +[group_4248] +[group_4249] +[group_4250] +[group_4251] +[group_4252] +[group_4253] +[group_4254] +[group_4255] +[group_4256] +[group_4257] +[group_4258] +[group_4259] +[group_4260] +[group_4261] +[group_4262] +[group_4263] +[group_4264] +[group_4265] +[group_4266] +[group_4267] +[group_4268] +[group_4269] +[group_4270] +[group_4271] +[group_4272] +[group_4273] +[group_4274] +[group_4275] +[group_4276] +[group_4277] +[group_4278] +[group_4279] +[group_4280] +[group_4281] +[group_4282] +[group_4283] +[group_4284] +[group_4285] +[group_4286] +[group_4287] +[group_4288] +[group_4289] +[group_4290] +[group_4291] +[group_4292] +[group_4293] +[group_4294] +[group_4295] +[group_4296] +[group_4297] +[group_4298] +[group_4299] +[group_4300] +[group_4301] +[group_4302] +[group_4303] +[group_4304] +[group_4305] +[group_4306] +[group_4307] +[group_4308] +[group_4309] +[group_4310] +[group_4311] +[group_4312] +[group_4313] +[group_4314] +[group_4315] +[group_4316] +[group_4317] +[group_4318] +[group_4319] +[group_4320] +[group_4321] +[group_4322] +[group_4323] +[group_4324] +[group_4325] +[group_4326] +[group_4327] +[group_4328] +[group_4329] +[group_4330] +[group_4331] +[group_4332] +[group_4333] +[group_4334] +[group_4335] +[group_4336] +[group_4337] +[group_4338] +[group_4339] +[group_4340] +[group_4341] +[group_4342] +[group_4343] +[group_4344] +[group_4345] +[group_4346] +[group_4347] +[group_4348] +[group_4349] +[group_4350] +[group_4351] +[group_4352] +[group_4353] +[group_4354] +[group_4355] +[group_4356] +[group_4357] +[group_4358] +[group_4359] +[group_4360] +[group_4361] +[group_4362] +[group_4363] +[group_4364] +[group_4365] +[group_4366] +[group_4367] +[group_4368] +[group_4369] +[group_4370] +[group_4371] +[group_4372] +[group_4373] +[group_4374] +[group_4375] +[group_4376] +[group_4377] +[group_4378] +[group_4379] +[group_4380] +[group_4381] +[group_4382] +[group_4383] +[group_4384] +[group_4385] +[group_4386] +[group_4387] +[group_4388] +[group_4389] +[group_4390] +[group_4391] +[group_4392] +[group_4393] +[group_4394] +[group_4395] +[group_4396] +[group_4397] +[group_4398] +[group_4399] +[group_4400] +[group_4401] +[group_4402] +[group_4403] +[group_4404] +[group_4405] +[group_4406] +[group_4407] +[group_4408] +[group_4409] +[group_4410] +[group_4411] +[group_4412] +[group_4413] +[group_4414] +[group_4415] +[group_4416] +[group_4417] +[group_4418] +[group_4419] +[group_4420] +[group_4421] +[group_4422] +[group_4423] +[group_4424] +[group_4425] +[group_4426] +[group_4427] +[group_4428] +[group_4429] +[group_4430] +[group_4431] +[group_4432] +[group_4433] +[group_4434] +[group_4435] +[group_4436] +[group_4437] +[group_4438] +[group_4439] +[group_4440] +[group_4441] +[group_4442] +[group_4443] +[group_4444] +[group_4445] +[group_4446] +[group_4447] +[group_4448] +[group_4449] +[group_4450] +[group_4451] +[group_4452] +[group_4453] +[group_4454] +[group_4455] +[group_4456] +[group_4457] +[group_4458] +[group_4459] +[group_4460] +[group_4461] +[group_4462] +[group_4463] +[group_4464] +[group_4465] +[group_4466] +[group_4467] +[group_4468] +[group_4469] +[group_4470] +[group_4471] +[group_4472] +[group_4473] +[group_4474] +[group_4475] +[group_4476] +[group_4477] +[group_4478] +[group_4479] +[group_4480] +[group_4481] +[group_4482] +[group_4483] +[group_4484] +[group_4485] +[group_4486] +[group_4487] +[group_4488] +[group_4489] +[group_4490] +[group_4491] +[group_4492] +[group_4493] +[group_4494] +[group_4495] +[group_4496] +[group_4497] +[group_4498] +[group_4499] +[group_4500] +[group_4501] +[group_4502] +[group_4503] +[group_4504] +[group_4505] +[group_4506] +[group_4507] +[group_4508] +[group_4509] +[group_4510] +[group_4511] +[group_4512] +[group_4513] +[group_4514] +[group_4515] +[group_4516] +[group_4517] +[group_4518] +[group_4519] +[group_4520] +[group_4521] +[group_4522] +[group_4523] +[group_4524] +[group_4525] +[group_4526] +[group_4527] +[group_4528] +[group_4529] +[group_4530] +[group_4531] +[group_4532] +[group_4533] +[group_4534] +[group_4535] +[group_4536] +[group_4537] +[group_4538] +[group_4539] +[group_4540] +[group_4541] +[group_4542] +[group_4543] +[group_4544] +[group_4545] +[group_4546] +[group_4547] +[group_4548] +[group_4549] +[group_4550] +[group_4551] +[group_4552] +[group_4553] +[group_4554] +[group_4555] +[group_4556] +[group_4557] +[group_4558] +[group_4559] +[group_4560] +[group_4561] +[group_4562] +[group_4563] +[group_4564] +[group_4565] +[group_4566] +[group_4567] +[group_4568] +[group_4569] +[group_4570] +[group_4571] +[group_4572] +[group_4573] +[group_4574] +[group_4575] +[group_4576] +[group_4577] +[group_4578] +[group_4579] +[group_4580] +[group_4581] +[group_4582] +[group_4583] +[group_4584] +[group_4585] +[group_4586] +[group_4587] +[group_4588] +[group_4589] +[group_4590] +[group_4591] +[group_4592] +[group_4593] +[group_4594] +[group_4595] +[group_4596] +[group_4597] +[group_4598] +[group_4599] +[group_4600] +[group_4601] +[group_4602] +[group_4603] +[group_4604] +[group_4605] +[group_4606] +[group_4607] +[group_4608] +[group_4609] +[group_4610] +[group_4611] +[group_4612] +[group_4613] +[group_4614] +[group_4615] +[group_4616] +[group_4617] +[group_4618] +[group_4619] +[group_4620] +[group_4621] +[group_4622] +[group_4623] +[group_4624] +[group_4625] +[group_4626] +[group_4627] +[group_4628] +[group_4629] +[group_4630] +[group_4631] +[group_4632] +[group_4633] +[group_4634] +[group_4635] +[group_4636] +[group_4637] +[group_4638] +[group_4639] +[group_4640] +[group_4641] +[group_4642] +[group_4643] +[group_4644] +[group_4645] +[group_4646] +[group_4647] +[group_4648] +[group_4649] +[group_4650] +[group_4651] +[group_4652] +[group_4653] +[group_4654] +[group_4655] +[group_4656] +[group_4657] +[group_4658] +[group_4659] +[group_4660] +[group_4661] +[group_4662] +[group_4663] +[group_4664] +[group_4665] +[group_4666] +[group_4667] +[group_4668] +[group_4669] +[group_4670] +[group_4671] +[group_4672] +[group_4673] +[group_4674] +[group_4675] +[group_4676] +[group_4677] +[group_4678] +[group_4679] +[group_4680] +[group_4681] +[group_4682] +[group_4683] +[group_4684] +[group_4685] +[group_4686] +[group_4687] +[group_4688] +[group_4689] +[group_4690] +[group_4691] +[group_4692] +[group_4693] +[group_4694] +[group_4695] +[group_4696] +[group_4697] +[group_4698] +[group_4699] +[group_4700] +[group_4701] +[group_4702] +[group_4703] +[group_4704] +[group_4705] +[group_4706] +[group_4707] +[group_4708] +[group_4709] +[group_4710] +[group_4711] +[group_4712] +[group_4713] +[group_4714] +[group_4715] +[group_4716] +[group_4717] +[group_4718] +[group_4719] +[group_4720] +[group_4721] +[group_4722] +[group_4723] +[group_4724] +[group_4725] +[group_4726] +[group_4727] +[group_4728] +[group_4729] +[group_4730] +[group_4731] +[group_4732] +[group_4733] +[group_4734] +[group_4735] +[group_4736] +[group_4737] +[group_4738] +[group_4739] +[group_4740] +[group_4741] +[group_4742] +[group_4743] +[group_4744] +[group_4745] +[group_4746] +[group_4747] +[group_4748] +[group_4749] +[group_4750] +[group_4751] +[group_4752] +[group_4753] +[group_4754] +[group_4755] +[group_4756] +[group_4757] +[group_4758] +[group_4759] +[group_4760] +[group_4761] +[group_4762] +[group_4763] +[group_4764] +[group_4765] +[group_4766] +[group_4767] +[group_4768] +[group_4769] +[group_4770] +[group_4771] +[group_4772] +[group_4773] +[group_4774] +[group_4775] +[group_4776] +[group_4777] +[group_4778] +[group_4779] +[group_4780] +[group_4781] +[group_4782] +[group_4783] +[group_4784] +[group_4785] +[group_4786] +[group_4787] +[group_4788] +[group_4789] +[group_4790] +[group_4791] +[group_4792] +[group_4793] +[group_4794] +[group_4795] +[group_4796] +[group_4797] +[group_4798] +[group_4799] +[group_4800] +[group_4801] +[group_4802] +[group_4803] +[group_4804] +[group_4805] +[group_4806] +[group_4807] +[group_4808] +[group_4809] +[group_4810] +[group_4811] +[group_4812] +[group_4813] +[group_4814] +[group_4815] +[group_4816] +[group_4817] +[group_4818] +[group_4819] +[group_4820] +[group_4821] +[group_4822] +[group_4823] +[group_4824] +[group_4825] +[group_4826] +[group_4827] +[group_4828] +[group_4829] +[group_4830] +[group_4831] +[group_4832] +[group_4833] +[group_4834] +[group_4835] +[group_4836] +[group_4837] +[group_4838] +[group_4839] +[group_4840] +[group_4841] +[group_4842] +[group_4843] +[group_4844] +[group_4845] +[group_4846] +[group_4847] +[group_4848] +[group_4849] +[group_4850] +[group_4851] +[group_4852] +[group_4853] +[group_4854] +[group_4855] +[group_4856] +[group_4857] +[group_4858] +[group_4859] +[group_4860] +[group_4861] +[group_4862] +[group_4863] +[group_4864] +[group_4865] +[group_4866] +[group_4867] +[group_4868] +[group_4869] +[group_4870] +[group_4871] +[group_4872] +[group_4873] +[group_4874] +[group_4875] +[group_4876] +[group_4877] +[group_4878] +[group_4879] +[group_4880] +[group_4881] +[group_4882] +[group_4883] +[group_4884] +[group_4885] +[group_4886] +[group_4887] +[group_4888] +[group_4889] +[group_4890] +[group_4891] +[group_4892] +[group_4893] +[group_4894] +[group_4895] +[group_4896] +[group_4897] +[group_4898] +[group_4899] +[group_4900] +[group_4901] +[group_4902] +[group_4903] +[group_4904] +[group_4905] +[group_4906] +[group_4907] +[group_4908] +[group_4909] +[group_4910] +[group_4911] +[group_4912] +[group_4913] +[group_4914] +[group_4915] +[group_4916] +[group_4917] +[group_4918] +[group_4919] +[group_4920] +[group_4921] +[group_4922] +[group_4923] +[group_4924] +[group_4925] +[group_4926] +[group_4927] +[group_4928] +[group_4929] +[group_4930] +[group_4931] +[group_4932] +[group_4933] +[group_4934] +[group_4935] +[group_4936] +[group_4937] +[group_4938] +[group_4939] +[group_4940] +[group_4941] +[group_4942] +[group_4943] +[group_4944] +[group_4945] +[group_4946] +[group_4947] +[group_4948] +[group_4949] +[group_4950] +[group_4951] +[group_4952] +[group_4953] +[group_4954] +[group_4955] +[group_4956] +[group_4957] +[group_4958] +[group_4959] +[group_4960] +[group_4961] +[group_4962] +[group_4963] +[group_4964] +[group_4965] +[group_4966] +[group_4967] +[group_4968] +[group_4969] +[group_4970] +[group_4971] +[group_4972] +[group_4973] +[group_4974] +[group_4975] +[group_4976] +[group_4977] +[group_4978] +[group_4979] +[group_4980] +[group_4981] +[group_4982] +[group_4983] +[group_4984] +[group_4985] +[group_4986] +[group_4987] +[group_4988] +[group_4989] +[group_4990] +[group_4991] +[group_4992] +[group_4993] +[group_4994] +[group_4995] +[group_4996] +[group_4997] +[group_4998] +[group_4999] +[group_5000] +[group_5001] +[group_5002] +[group_5003] +[group_5004] +[group_5005] +[group_5006] +[group_5007] +[group_5008] +[group_5009] +[group_5010] +[group_5011] +[group_5012] +[group_5013] +[group_5014] +[group_5015] +[group_5016] +[group_5017] +[group_5018] +[group_5019] +[group_5020] +[group_5021] +[group_5022] +[group_5023] +[group_5024] +[group_5025] +[group_5026] +[group_5027] +[group_5028] +[group_5029] +[group_5030] +[group_5031] +[group_5032] +[group_5033] +[group_5034] +[group_5035] +[group_5036] +[group_5037] +[group_5038] +[group_5039] +[group_5040] +[group_5041] +[group_5042] +[group_5043] +[group_5044] +[group_5045] +[group_5046] +[group_5047] +[group_5048] +[group_5049] +[group_5050] +[group_5051] +[group_5052] +[group_5053] +[group_5054] +[group_5055] +[group_5056] +[group_5057] +[group_5058] +[group_5059] +[group_5060] +[group_5061] +[group_5062] +[group_5063] +[group_5064] +[group_5065] +[group_5066] +[group_5067] +[group_5068] +[group_5069] +[group_5070] +[group_5071] +[group_5072] +[group_5073] +[group_5074] +[group_5075] +[group_5076] +[group_5077] +[group_5078] +[group_5079] +[group_5080] +[group_5081] +[group_5082] +[group_5083] +[group_5084] +[group_5085] +[group_5086] +[group_5087] +[group_5088] +[group_5089] +[group_5090] +[group_5091] +[group_5092] +[group_5093] +[group_5094] +[group_5095] +[group_5096] +[group_5097] +[group_5098] +[group_5099] +[group_5100] +[group_5101] +[group_5102] +[group_5103] +[group_5104] +[group_5105] +[group_5106] +[group_5107] +[group_5108] +[group_5109] +[group_5110] +[group_5111] +[group_5112] +[group_5113] +[group_5114] +[group_5115] +[group_5116] +[group_5117] +[group_5118] +[group_5119] +[group_5120] +[group_5121] +[group_5122] +[group_5123] +[group_5124] +[group_5125] +[group_5126] +[group_5127] +[group_5128] +[group_5129] +[group_5130] +[group_5131] +[group_5132] +[group_5133] +[group_5134] +[group_5135] +[group_5136] +[group_5137] +[group_5138] +[group_5139] +[group_5140] +[group_5141] +[group_5142] +[group_5143] +[group_5144] +[group_5145] +[group_5146] +[group_5147] +[group_5148] +[group_5149] +[group_5150] +[group_5151] +[group_5152] +[group_5153] +[group_5154] +[group_5155] +[group_5156] +[group_5157] +[group_5158] +[group_5159] +[group_5160] +[group_5161] +[group_5162] +[group_5163] +[group_5164] +[group_5165] +[group_5166] +[group_5167] +[group_5168] +[group_5169] +[group_5170] +[group_5171] +[group_5172] +[group_5173] +[group_5174] +[group_5175] +[group_5176] +[group_5177] +[group_5178] +[group_5179] +[group_5180] +[group_5181] +[group_5182] +[group_5183] +[group_5184] +[group_5185] +[group_5186] +[group_5187] +[group_5188] +[group_5189] +[group_5190] +[group_5191] +[group_5192] +[group_5193] +[group_5194] +[group_5195] +[group_5196] +[group_5197] +[group_5198] +[group_5199] +[group_5200] +[group_5201] +[group_5202] +[group_5203] +[group_5204] +[group_5205] +[group_5206] +[group_5207] +[group_5208] +[group_5209] +[group_5210] +[group_5211] +[group_5212] +[group_5213] +[group_5214] +[group_5215] +[group_5216] +[group_5217] +[group_5218] +[group_5219] +[group_5220] +[group_5221] +[group_5222] +[group_5223] +[group_5224] +[group_5225] +[group_5226] +[group_5227] +[group_5228] +[group_5229] +[group_5230] +[group_5231] +[group_5232] +[group_5233] +[group_5234] +[group_5235] +[group_5236] +[group_5237] +[group_5238] +[group_5239] +[group_5240] +[group_5241] +[group_5242] +[group_5243] +[group_5244] +[group_5245] +[group_5246] +[group_5247] +[group_5248] +[group_5249] +[group_5250] +[group_5251] +[group_5252] +[group_5253] +[group_5254] +[group_5255] +[group_5256] +[group_5257] +[group_5258] +[group_5259] +[group_5260] +[group_5261] +[group_5262] +[group_5263] +[group_5264] +[group_5265] +[group_5266] +[group_5267] +[group_5268] +[group_5269] +[group_5270] +[group_5271] +[group_5272] +[group_5273] +[group_5274] +[group_5275] +[group_5276] +[group_5277] +[group_5278] +[group_5279] +[group_5280] +[group_5281] +[group_5282] +[group_5283] +[group_5284] +[group_5285] +[group_5286] +[group_5287] +[group_5288] +[group_5289] +[group_5290] +[group_5291] +[group_5292] +[group_5293] +[group_5294] +[group_5295] +[group_5296] +[group_5297] +[group_5298] +[group_5299] +[group_5300] +[group_5301] +[group_5302] +[group_5303] +[group_5304] +[group_5305] +[group_5306] +[group_5307] +[group_5308] +[group_5309] +[group_5310] +[group_5311] +[group_5312] +[group_5313] +[group_5314] +[group_5315] +[group_5316] +[group_5317] +[group_5318] +[group_5319] +[group_5320] +[group_5321] +[group_5322] +[group_5323] +[group_5324] +[group_5325] +[group_5326] +[group_5327] +[group_5328] +[group_5329] +[group_5330] +[group_5331] +[group_5332] +[group_5333] +[group_5334] +[group_5335] +[group_5336] +[group_5337] +[group_5338] +[group_5339] +[group_5340] +[group_5341] +[group_5342] +[group_5343] +[group_5344] +[group_5345] +[group_5346] +[group_5347] +[group_5348] +[group_5349] +[group_5350] +[group_5351] +[group_5352] +[group_5353] +[group_5354] +[group_5355] +[group_5356] +[group_5357] +[group_5358] +[group_5359] +[group_5360] +[group_5361] +[group_5362] +[group_5363] +[group_5364] +[group_5365] +[group_5366] +[group_5367] +[group_5368] +[group_5369] +[group_5370] +[group_5371] +[group_5372] +[group_5373] +[group_5374] +[group_5375] +[group_5376] +[group_5377] +[group_5378] +[group_5379] +[group_5380] +[group_5381] +[group_5382] +[group_5383] +[group_5384] +[group_5385] +[group_5386] +[group_5387] +[group_5388] +[group_5389] +[group_5390] +[group_5391] +[group_5392] +[group_5393] +[group_5394] +[group_5395] +[group_5396] +[group_5397] +[group_5398] +[group_5399] +[group_5400] +[group_5401] +[group_5402] +[group_5403] +[group_5404] +[group_5405] +[group_5406] +[group_5407] +[group_5408] +[group_5409] +[group_5410] +[group_5411] +[group_5412] +[group_5413] +[group_5414] +[group_5415] +[group_5416] +[group_5417] +[group_5418] +[group_5419] +[group_5420] +[group_5421] +[group_5422] +[group_5423] +[group_5424] +[group_5425] +[group_5426] +[group_5427] +[group_5428] +[group_5429] +[group_5430] +[group_5431] +[group_5432] +[group_5433] +[group_5434] +[group_5435] +[group_5436] +[group_5437] +[group_5438] +[group_5439] +[group_5440] +[group_5441] +[group_5442] +[group_5443] +[group_5444] +[group_5445] +[group_5446] +[group_5447] +[group_5448] +[group_5449] +[group_5450] +[group_5451] +[group_5452] +[group_5453] +[group_5454] +[group_5455] +[group_5456] +[group_5457] +[group_5458] +[group_5459] +[group_5460] +[group_5461] +[group_5462] +[group_5463] +[group_5464] +[group_5465] +[group_5466] +[group_5467] +[group_5468] +[group_5469] +[group_5470] +[group_5471] +[group_5472] +[group_5473] +[group_5474] +[group_5475] +[group_5476] +[group_5477] +[group_5478] +[group_5479] +[group_5480] +[group_5481] +[group_5482] +[group_5483] +[group_5484] +[group_5485] +[group_5486] +[group_5487] +[group_5488] +[group_5489] +[group_5490] +[group_5491] +[group_5492] +[group_5493] +[group_5494] +[group_5495] +[group_5496] +[group_5497] +[group_5498] +[group_5499] +[group_5500] +[group_5501] +[group_5502] +[group_5503] +[group_5504] +[group_5505] +[group_5506] +[group_5507] +[group_5508] +[group_5509] +[group_5510] +[group_5511] +[group_5512] +[group_5513] +[group_5514] +[group_5515] +[group_5516] +[group_5517] +[group_5518] +[group_5519] +[group_5520] +[group_5521] +[group_5522] +[group_5523] +[group_5524] +[group_5525] +[group_5526] +[group_5527] +[group_5528] +[group_5529] +[group_5530] +[group_5531] +[group_5532] +[group_5533] +[group_5534] +[group_5535] +[group_5536] +[group_5537] +[group_5538] +[group_5539] +[group_5540] +[group_5541] +[group_5542] +[group_5543] +[group_5544] +[group_5545] +[group_5546] +[group_5547] +[group_5548] +[group_5549] +[group_5550] +[group_5551] +[group_5552] +[group_5553] +[group_5554] +[group_5555] +[group_5556] +[group_5557] +[group_5558] +[group_5559] +[group_5560] +[group_5561] +[group_5562] +[group_5563] +[group_5564] +[group_5565] +[group_5566] +[group_5567] +[group_5568] +[group_5569] +[group_5570] +[group_5571] +[group_5572] +[group_5573] +[group_5574] +[group_5575] +[group_5576] +[group_5577] +[group_5578] +[group_5579] +[group_5580] +[group_5581] +[group_5582] +[group_5583] +[group_5584] +[group_5585] +[group_5586] +[group_5587] +[group_5588] +[group_5589] +[group_5590] +[group_5591] +[group_5592] +[group_5593] +[group_5594] +[group_5595] +[group_5596] +[group_5597] +[group_5598] +[group_5599] +[group_5600] +[group_5601] +[group_5602] +[group_5603] +[group_5604] +[group_5605] +[group_5606] +[group_5607] +[group_5608] +[group_5609] +[group_5610] +[group_5611] +[group_5612] +[group_5613] +[group_5614] +[group_5615] +[group_5616] +[group_5617] +[group_5618] +[group_5619] +[group_5620] +[group_5621] +[group_5622] +[group_5623] +[group_5624] +[group_5625] +[group_5626] +[group_5627] +[group_5628] +[group_5629] +[group_5630] +[group_5631] +[group_5632] +[group_5633] +[group_5634] +[group_5635] +[group_5636] +[group_5637] +[group_5638] +[group_5639] +[group_5640] +[group_5641] +[group_5642] +[group_5643] +[group_5644] +[group_5645] +[group_5646] +[group_5647] +[group_5648] +[group_5649] +[group_5650] +[group_5651] +[group_5652] +[group_5653] +[group_5654] +[group_5655] +[group_5656] +[group_5657] +[group_5658] +[group_5659] +[group_5660] +[group_5661] +[group_5662] +[group_5663] +[group_5664] +[group_5665] +[group_5666] +[group_5667] +[group_5668] +[group_5669] +[group_5670] +[group_5671] +[group_5672] +[group_5673] +[group_5674] +[group_5675] +[group_5676] +[group_5677] +[group_5678] +[group_5679] +[group_5680] +[group_5681] +[group_5682] +[group_5683] +[group_5684] +[group_5685] +[group_5686] +[group_5687] +[group_5688] +[group_5689] +[group_5690] +[group_5691] +[group_5692] +[group_5693] +[group_5694] +[group_5695] +[group_5696] +[group_5697] +[group_5698] +[group_5699] +[group_5700] +[group_5701] +[group_5702] +[group_5703] +[group_5704] +[group_5705] +[group_5706] +[group_5707] +[group_5708] +[group_5709] +[group_5710] +[group_5711] +[group_5712] +[group_5713] +[group_5714] +[group_5715] +[group_5716] +[group_5717] +[group_5718] +[group_5719] +[group_5720] +[group_5721] +[group_5722] +[group_5723] +[group_5724] +[group_5725] +[group_5726] +[group_5727] +[group_5728] +[group_5729] +[group_5730] +[group_5731] +[group_5732] +[group_5733] +[group_5734] +[group_5735] +[group_5736] +[group_5737] +[group_5738] +[group_5739] +[group_5740] +[group_5741] +[group_5742] +[group_5743] +[group_5744] +[group_5745] +[group_5746] +[group_5747] +[group_5748] +[group_5749] +[group_5750] +[group_5751] +[group_5752] +[group_5753] +[group_5754] +[group_5755] +[group_5756] +[group_5757] +[group_5758] +[group_5759] +[group_5760] +[group_5761] +[group_5762] +[group_5763] +[group_5764] +[group_5765] +[group_5766] +[group_5767] +[group_5768] +[group_5769] +[group_5770] +[group_5771] +[group_5772] +[group_5773] +[group_5774] +[group_5775] +[group_5776] +[group_5777] +[group_5778] +[group_5779] +[group_5780] +[group_5781] +[group_5782] +[group_5783] +[group_5784] +[group_5785] +[group_5786] +[group_5787] +[group_5788] +[group_5789] +[group_5790] +[group_5791] +[group_5792] +[group_5793] +[group_5794] +[group_5795] +[group_5796] +[group_5797] +[group_5798] +[group_5799] +[group_5800] +[group_5801] +[group_5802] +[group_5803] +[group_5804] +[group_5805] +[group_5806] +[group_5807] +[group_5808] +[group_5809] +[group_5810] +[group_5811] +[group_5812] +[group_5813] +[group_5814] +[group_5815] +[group_5816] +[group_5817] +[group_5818] +[group_5819] +[group_5820] +[group_5821] +[group_5822] +[group_5823] +[group_5824] +[group_5825] +[group_5826] +[group_5827] +[group_5828] +[group_5829] +[group_5830] +[group_5831] +[group_5832] +[group_5833] +[group_5834] +[group_5835] +[group_5836] +[group_5837] +[group_5838] +[group_5839] +[group_5840] +[group_5841] +[group_5842] +[group_5843] +[group_5844] +[group_5845] +[group_5846] +[group_5847] +[group_5848] +[group_5849] +[group_5850] +[group_5851] +[group_5852] +[group_5853] +[group_5854] +[group_5855] +[group_5856] +[group_5857] +[group_5858] +[group_5859] +[group_5860] +[group_5861] +[group_5862] +[group_5863] +[group_5864] +[group_5865] +[group_5866] +[group_5867] +[group_5868] +[group_5869] +[group_5870] +[group_5871] +[group_5872] +[group_5873] +[group_5874] +[group_5875] +[group_5876] +[group_5877] +[group_5878] +[group_5879] +[group_5880] +[group_5881] +[group_5882] +[group_5883] +[group_5884] +[group_5885] +[group_5886] +[group_5887] +[group_5888] +[group_5889] +[group_5890] +[group_5891] +[group_5892] +[group_5893] +[group_5894] +[group_5895] +[group_5896] +[group_5897] +[group_5898] +[group_5899] +[group_5900] +[group_5901] +[group_5902] +[group_5903] +[group_5904] +[group_5905] +[group_5906] +[group_5907] +[group_5908] +[group_5909] +[group_5910] +[group_5911] +[group_5912] +[group_5913] +[group_5914] +[group_5915] +[group_5916] +[group_5917] +[group_5918] +[group_5919] +[group_5920] +[group_5921] +[group_5922] +[group_5923] +[group_5924] +[group_5925] +[group_5926] +[group_5927] +[group_5928] +[group_5929] +[group_5930] +[group_5931] +[group_5932] +[group_5933] +[group_5934] +[group_5935] +[group_5936] +[group_5937] +[group_5938] +[group_5939] +[group_5940] +[group_5941] +[group_5942] +[group_5943] +[group_5944] +[group_5945] +[group_5946] +[group_5947] +[group_5948] +[group_5949] +[group_5950] +[group_5951] +[group_5952] +[group_5953] +[group_5954] +[group_5955] +[group_5956] +[group_5957] +[group_5958] +[group_5959] +[group_5960] +[group_5961] +[group_5962] +[group_5963] +[group_5964] +[group_5965] +[group_5966] +[group_5967] +[group_5968] +[group_5969] +[group_5970] +[group_5971] +[group_5972] +[group_5973] +[group_5974] +[group_5975] +[group_5976] +[group_5977] +[group_5978] +[group_5979] +[group_5980] +[group_5981] +[group_5982] +[group_5983] +[group_5984] +[group_5985] +[group_5986] +[group_5987] +[group_5988] +[group_5989] +[group_5990] +[group_5991] +[group_5992] +[group_5993] +[group_5994] +[group_5995] +[group_5996] +[group_5997] +[group_5998] +[group_5999] +[group_6000] +[group_6001] +[group_6002] +[group_6003] +[group_6004] +[group_6005] +[group_6006] +[group_6007] +[group_6008] +[group_6009] +[group_6010] +[group_6011] +[group_6012] +[group_6013] +[group_6014] +[group_6015] +[group_6016] +[group_6017] +[group_6018] +[group_6019] +[group_6020] +[group_6021] +[group_6022] +[group_6023] +[group_6024] +[group_6025] +[group_6026] +[group_6027] +[group_6028] +[group_6029] +[group_6030] +[group_6031] +[group_6032] +[group_6033] +[group_6034] +[group_6035] +[group_6036] +[group_6037] +[group_6038] +[group_6039] +[group_6040] +[group_6041] +[group_6042] +[group_6043] +[group_6044] +[group_6045] +[group_6046] +[group_6047] +[group_6048] +[group_6049] +[group_6050] +[group_6051] +[group_6052] +[group_6053] +[group_6054] +[group_6055] +[group_6056] +[group_6057] +[group_6058] +[group_6059] +[group_6060] +[group_6061] +[group_6062] +[group_6063] +[group_6064] +[group_6065] +[group_6066] +[group_6067] +[group_6068] +[group_6069] +[group_6070] +[group_6071] +[group_6072] +[group_6073] +[group_6074] +[group_6075] +[group_6076] +[group_6077] +[group_6078] +[group_6079] +[group_6080] +[group_6081] +[group_6082] +[group_6083] +[group_6084] +[group_6085] +[group_6086] +[group_6087] +[group_6088] +[group_6089] +[group_6090] +[group_6091] +[group_6092] +[group_6093] +[group_6094] +[group_6095] +[group_6096] +[group_6097] +[group_6098] +[group_6099] +[group_6100] +[group_6101] +[group_6102] +[group_6103] +[group_6104] +[group_6105] +[group_6106] +[group_6107] +[group_6108] +[group_6109] +[group_6110] +[group_6111] +[group_6112] +[group_6113] +[group_6114] +[group_6115] +[group_6116] +[group_6117] +[group_6118] +[group_6119] +[group_6120] +[group_6121] +[group_6122] +[group_6123] +[group_6124] +[group_6125] +[group_6126] +[group_6127] +[group_6128] +[group_6129] +[group_6130] +[group_6131] +[group_6132] +[group_6133] +[group_6134] +[group_6135] +[group_6136] +[group_6137] +[group_6138] +[group_6139] +[group_6140] +[group_6141] +[group_6142] +[group_6143] +[group_6144] +[group_6145] +[group_6146] +[group_6147] +[group_6148] +[group_6149] +[group_6150] +[group_6151] +[group_6152] +[group_6153] +[group_6154] +[group_6155] +[group_6156] +[group_6157] +[group_6158] +[group_6159] +[group_6160] +[group_6161] +[group_6162] +[group_6163] +[group_6164] +[group_6165] +[group_6166] +[group_6167] +[group_6168] +[group_6169] +[group_6170] +[group_6171] +[group_6172] +[group_6173] +[group_6174] +[group_6175] +[group_6176] +[group_6177] +[group_6178] +[group_6179] +[group_6180] +[group_6181] +[group_6182] +[group_6183] +[group_6184] +[group_6185] +[group_6186] +[group_6187] +[group_6188] +[group_6189] +[group_6190] +[group_6191] +[group_6192] +[group_6193] +[group_6194] +[group_6195] +[group_6196] +[group_6197] +[group_6198] +[group_6199] +[group_6200] +[group_6201] +[group_6202] +[group_6203] +[group_6204] +[group_6205] +[group_6206] +[group_6207] +[group_6208] +[group_6209] +[group_6210] +[group_6211] +[group_6212] +[group_6213] +[group_6214] +[group_6215] +[group_6216] +[group_6217] +[group_6218] +[group_6219] +[group_6220] +[group_6221] +[group_6222] +[group_6223] +[group_6224] +[group_6225] +[group_6226] +[group_6227] +[group_6228] +[group_6229] +[group_6230] +[group_6231] +[group_6232] +[group_6233] +[group_6234] +[group_6235] +[group_6236] +[group_6237] +[group_6238] +[group_6239] +[group_6240] +[group_6241] +[group_6242] +[group_6243] +[group_6244] +[group_6245] +[group_6246] +[group_6247] +[group_6248] +[group_6249] +[group_6250] +[group_6251] +[group_6252] +[group_6253] +[group_6254] +[group_6255] +[group_6256] +[group_6257] +[group_6258] +[group_6259] +[group_6260] +[group_6261] +[group_6262] +[group_6263] +[group_6264] +[group_6265] +[group_6266] +[group_6267] +[group_6268] +[group_6269] +[group_6270] +[group_6271] +[group_6272] +[group_6273] +[group_6274] +[group_6275] +[group_6276] +[group_6277] +[group_6278] +[group_6279] +[group_6280] +[group_6281] +[group_6282] +[group_6283] +[group_6284] +[group_6285] +[group_6286] +[group_6287] +[group_6288] +[group_6289] +[group_6290] +[group_6291] +[group_6292] +[group_6293] +[group_6294] +[group_6295] +[group_6296] +[group_6297] +[group_6298] +[group_6299] +[group_6300] +[group_6301] +[group_6302] +[group_6303] +[group_6304] +[group_6305] +[group_6306] +[group_6307] +[group_6308] +[group_6309] +[group_6310] +[group_6311] +[group_6312] +[group_6313] +[group_6314] +[group_6315] +[group_6316] +[group_6317] +[group_6318] +[group_6319] +[group_6320] +[group_6321] +[group_6322] +[group_6323] +[group_6324] +[group_6325] +[group_6326] +[group_6327] +[group_6328] +[group_6329] +[group_6330] +[group_6331] +[group_6332] +[group_6333] +[group_6334] +[group_6335] +[group_6336] +[group_6337] +[group_6338] +[group_6339] +[group_6340] +[group_6341] +[group_6342] +[group_6343] +[group_6344] +[group_6345] +[group_6346] +[group_6347] +[group_6348] +[group_6349] +[group_6350] +[group_6351] +[group_6352] +[group_6353] +[group_6354] +[group_6355] +[group_6356] +[group_6357] +[group_6358] +[group_6359] +[group_6360] +[group_6361] +[group_6362] +[group_6363] +[group_6364] +[group_6365] +[group_6366] +[group_6367] +[group_6368] +[group_6369] +[group_6370] +[group_6371] +[group_6372] +[group_6373] +[group_6374] +[group_6375] +[group_6376] +[group_6377] +[group_6378] +[group_6379] +[group_6380] +[group_6381] +[group_6382] +[group_6383] +[group_6384] +[group_6385] +[group_6386] +[group_6387] +[group_6388] +[group_6389] +[group_6390] +[group_6391] +[group_6392] +[group_6393] +[group_6394] +[group_6395] +[group_6396] +[group_6397] +[group_6398] +[group_6399] +[group_6400] +[group_6401] +[group_6402] +[group_6403] +[group_6404] +[group_6405] +[group_6406] +[group_6407] +[group_6408] +[group_6409] +[group_6410] +[group_6411] +[group_6412] +[group_6413] +[group_6414] +[group_6415] +[group_6416] +[group_6417] +[group_6418] +[group_6419] +[group_6420] +[group_6421] +[group_6422] +[group_6423] +[group_6424] +[group_6425] +[group_6426] +[group_6427] +[group_6428] +[group_6429] +[group_6430] +[group_6431] +[group_6432] +[group_6433] +[group_6434] +[group_6435] +[group_6436] +[group_6437] +[group_6438] +[group_6439] +[group_6440] +[group_6441] +[group_6442] +[group_6443] +[group_6444] +[group_6445] +[group_6446] +[group_6447] +[group_6448] +[group_6449] +[group_6450] +[group_6451] +[group_6452] +[group_6453] +[group_6454] +[group_6455] +[group_6456] +[group_6457] +[group_6458] +[group_6459] +[group_6460] +[group_6461] +[group_6462] +[group_6463] +[group_6464] +[group_6465] +[group_6466] +[group_6467] +[group_6468] +[group_6469] +[group_6470] +[group_6471] +[group_6472] +[group_6473] +[group_6474] +[group_6475] +[group_6476] +[group_6477] +[group_6478] +[group_6479] +[group_6480] +[group_6481] +[group_6482] +[group_6483] +[group_6484] +[group_6485] +[group_6486] +[group_6487] +[group_6488] +[group_6489] +[group_6490] +[group_6491] +[group_6492] +[group_6493] +[group_6494] +[group_6495] +[group_6496] +[group_6497] +[group_6498] +[group_6499] +[group_6500] +[group_6501] +[group_6502] +[group_6503] +[group_6504] +[group_6505] +[group_6506] +[group_6507] +[group_6508] +[group_6509] +[group_6510] +[group_6511] +[group_6512] +[group_6513] +[group_6514] +[group_6515] +[group_6516] +[group_6517] +[group_6518] +[group_6519] +[group_6520] +[group_6521] +[group_6522] +[group_6523] +[group_6524] +[group_6525] +[group_6526] +[group_6527] +[group_6528] +[group_6529] +[group_6530] +[group_6531] +[group_6532] +[group_6533] +[group_6534] +[group_6535] +[group_6536] +[group_6537] +[group_6538] +[group_6539] +[group_6540] +[group_6541] +[group_6542] +[group_6543] +[group_6544] +[group_6545] +[group_6546] +[group_6547] +[group_6548] +[group_6549] +[group_6550] +[group_6551] +[group_6552] +[group_6553] +[group_6554] +[group_6555] +[group_6556] +[group_6557] +[group_6558] +[group_6559] +[group_6560] +[group_6561] +[group_6562] +[group_6563] +[group_6564] +[group_6565] +[group_6566] +[group_6567] +[group_6568] +[group_6569] +[group_6570] +[group_6571] +[group_6572] +[group_6573] +[group_6574] +[group_6575] +[group_6576] +[group_6577] +[group_6578] +[group_6579] +[group_6580] +[group_6581] +[group_6582] +[group_6583] +[group_6584] +[group_6585] +[group_6586] +[group_6587] +[group_6588] +[group_6589] +[group_6590] +[group_6591] +[group_6592] +[group_6593] +[group_6594] +[group_6595] +[group_6596] +[group_6597] +[group_6598] +[group_6599] +[group_6600] +[group_6601] +[group_6602] +[group_6603] +[group_6604] +[group_6605] +[group_6606] +[group_6607] +[group_6608] +[group_6609] +[group_6610] +[group_6611] +[group_6612] +[group_6613] +[group_6614] +[group_6615] +[group_6616] +[group_6617] +[group_6618] +[group_6619] +[group_6620] +[group_6621] +[group_6622] +[group_6623] +[group_6624] +[group_6625] +[group_6626] +[group_6627] +[group_6628] +[group_6629] +[group_6630] +[group_6631] +[group_6632] +[group_6633] +[group_6634] +[group_6635] +[group_6636] +[group_6637] +[group_6638] +[group_6639] +[group_6640] +[group_6641] +[group_6642] +[group_6643] +[group_6644] +[group_6645] +[group_6646] +[group_6647] +[group_6648] +[group_6649] +[group_6650] +[group_6651] +[group_6652] +[group_6653] +[group_6654] +[group_6655] +[group_6656] +[group_6657] +[group_6658] +[group_6659] +[group_6660] +[group_6661] +[group_6662] +[group_6663] +[group_6664] +[group_6665] +[group_6666] +[group_6667] +[group_6668] +[group_6669] +[group_6670] +[group_6671] +[group_6672] +[group_6673] +[group_6674] +[group_6675] +[group_6676] +[group_6677] +[group_6678] +[group_6679] +[group_6680] +[group_6681] +[group_6682] +[group_6683] +[group_6684] +[group_6685] +[group_6686] +[group_6687] +[group_6688] +[group_6689] +[group_6690] +[group_6691] +[group_6692] +[group_6693] +[group_6694] +[group_6695] +[group_6696] +[group_6697] +[group_6698] +[group_6699] +[group_6700] +[group_6701] +[group_6702] +[group_6703] +[group_6704] +[group_6705] +[group_6706] +[group_6707] +[group_6708] +[group_6709] +[group_6710] +[group_6711] +[group_6712] +[group_6713] +[group_6714] +[group_6715] +[group_6716] +[group_6717] +[group_6718] +[group_6719] +[group_6720] +[group_6721] +[group_6722] +[group_6723] +[group_6724] +[group_6725] +[group_6726] +[group_6727] +[group_6728] +[group_6729] +[group_6730] +[group_6731] +[group_6732] +[group_6733] +[group_6734] +[group_6735] +[group_6736] +[group_6737] +[group_6738] +[group_6739] +[group_6740] +[group_6741] +[group_6742] +[group_6743] +[group_6744] +[group_6745] +[group_6746] +[group_6747] +[group_6748] +[group_6749] +[group_6750] +[group_6751] +[group_6752] +[group_6753] +[group_6754] +[group_6755] +[group_6756] +[group_6757] +[group_6758] +[group_6759] +[group_6760] +[group_6761] +[group_6762] +[group_6763] +[group_6764] +[group_6765] +[group_6766] +[group_6767] +[group_6768] +[group_6769] +[group_6770] +[group_6771] +[group_6772] +[group_6773] +[group_6774] +[group_6775] +[group_6776] +[group_6777] +[group_6778] +[group_6779] +[group_6780] +[group_6781] +[group_6782] +[group_6783] +[group_6784] +[group_6785] +[group_6786] +[group_6787] +[group_6788] +[group_6789] +[group_6790] +[group_6791] +[group_6792] +[group_6793] +[group_6794] +[group_6795] +[group_6796] +[group_6797] +[group_6798] +[group_6799] +[group_6800] +[group_6801] +[group_6802] +[group_6803] +[group_6804] +[group_6805] +[group_6806] +[group_6807] +[group_6808] +[group_6809] +[group_6810] +[group_6811] +[group_6812] +[group_6813] +[group_6814] +[group_6815] +[group_6816] +[group_6817] +[group_6818] +[group_6819] +[group_6820] +[group_6821] +[group_6822] +[group_6823] +[group_6824] +[group_6825] +[group_6826] +[group_6827] +[group_6828] +[group_6829] +[group_6830] +[group_6831] +[group_6832] +[group_6833] +[group_6834] +[group_6835] +[group_6836] +[group_6837] +[group_6838] +[group_6839] +[group_6840] +[group_6841] +[group_6842] +[group_6843] +[group_6844] +[group_6845] +[group_6846] +[group_6847] +[group_6848] +[group_6849] +[group_6850] +[group_6851] +[group_6852] +[group_6853] +[group_6854] +[group_6855] +[group_6856] +[group_6857] +[group_6858] +[group_6859] +[group_6860] +[group_6861] +[group_6862] +[group_6863] +[group_6864] +[group_6865] +[group_6866] +[group_6867] +[group_6868] +[group_6869] +[group_6870] +[group_6871] +[group_6872] +[group_6873] +[group_6874] +[group_6875] +[group_6876] +[group_6877] +[group_6878] +[group_6879] +[group_6880] +[group_6881] +[group_6882] +[group_6883] +[group_6884] +[group_6885] +[group_6886] +[group_6887] +[group_6888] +[group_6889] +[group_6890] +[group_6891] +[group_6892] +[group_6893] +[group_6894] +[group_6895] +[group_6896] +[group_6897] +[group_6898] +[group_6899] +[group_6900] +[group_6901] +[group_6902] +[group_6903] +[group_6904] +[group_6905] +[group_6906] +[group_6907] +[group_6908] +[group_6909] +[group_6910] +[group_6911] +[group_6912] +[group_6913] +[group_6914] +[group_6915] +[group_6916] +[group_6917] +[group_6918] +[group_6919] +[group_6920] +[group_6921] +[group_6922] +[group_6923] +[group_6924] +[group_6925] +[group_6926] +[group_6927] +[group_6928] +[group_6929] +[group_6930] +[group_6931] +[group_6932] +[group_6933] +[group_6934] +[group_6935] +[group_6936] +[group_6937] +[group_6938] +[group_6939] +[group_6940] +[group_6941] +[group_6942] +[group_6943] +[group_6944] +[group_6945] +[group_6946] +[group_6947] +[group_6948] +[group_6949] +[group_6950] +[group_6951] +[group_6952] +[group_6953] +[group_6954] +[group_6955] +[group_6956] +[group_6957] +[group_6958] +[group_6959] +[group_6960] +[group_6961] +[group_6962] +[group_6963] +[group_6964] +[group_6965] +[group_6966] +[group_6967] +[group_6968] +[group_6969] +[group_6970] +[group_6971] +[group_6972] +[group_6973] +[group_6974] +[group_6975] +[group_6976] +[group_6977] +[group_6978] +[group_6979] +[group_6980] +[group_6981] +[group_6982] +[group_6983] +[group_6984] +[group_6985] +[group_6986] +[group_6987] +[group_6988] +[group_6989] +[group_6990] +[group_6991] +[group_6992] +[group_6993] +[group_6994] +[group_6995] +[group_6996] +[group_6997] +[group_6998] +[group_6999] +[group_7000] +[group_7001] +[group_7002] +[group_7003] +[group_7004] +[group_7005] +[group_7006] +[group_7007] +[group_7008] +[group_7009] +[group_7010] +[group_7011] +[group_7012] +[group_7013] +[group_7014] +[group_7015] +[group_7016] +[group_7017] +[group_7018] +[group_7019] +[group_7020] +[group_7021] +[group_7022] +[group_7023] +[group_7024] +[group_7025] +[group_7026] +[group_7027] +[group_7028] +[group_7029] +[group_7030] +[group_7031] +[group_7032] +[group_7033] +[group_7034] +[group_7035] +[group_7036] +[group_7037] +[group_7038] +[group_7039] +[group_7040] +[group_7041] +[group_7042] +[group_7043] +[group_7044] +[group_7045] +[group_7046] +[group_7047] +[group_7048] +[group_7049] +[group_7050] +[group_7051] +[group_7052] +[group_7053] +[group_7054] +[group_7055] +[group_7056] +[group_7057] +[group_7058] +[group_7059] +[group_7060] +[group_7061] +[group_7062] +[group_7063] +[group_7064] +[group_7065] +[group_7066] +[group_7067] +[group_7068] +[group_7069] +[group_7070] +[group_7071] +[group_7072] +[group_7073] +[group_7074] +[group_7075] +[group_7076] +[group_7077] +[group_7078] +[group_7079] +[group_7080] +[group_7081] +[group_7082] +[group_7083] +[group_7084] +[group_7085] +[group_7086] +[group_7087] +[group_7088] +[group_7089] +[group_7090] +[group_7091] +[group_7092] +[group_7093] +[group_7094] +[group_7095] +[group_7096] +[group_7097] +[group_7098] +[group_7099] +[group_7100] +[group_7101] +[group_7102] +[group_7103] +[group_7104] +[group_7105] +[group_7106] +[group_7107] +[group_7108] +[group_7109] +[group_7110] +[group_7111] +[group_7112] +[group_7113] +[group_7114] +[group_7115] +[group_7116] +[group_7117] +[group_7118] +[group_7119] +[group_7120] +[group_7121] +[group_7122] +[group_7123] +[group_7124] +[group_7125] +[group_7126] +[group_7127] +[group_7128] +[group_7129] +[group_7130] +[group_7131] +[group_7132] +[group_7133] +[group_7134] +[group_7135] +[group_7136] +[group_7137] +[group_7138] +[group_7139] +[group_7140] +[group_7141] +[group_7142] +[group_7143] +[group_7144] +[group_7145] +[group_7146] +[group_7147] +[group_7148] +[group_7149] +[group_7150] +[group_7151] +[group_7152] +[group_7153] +[group_7154] +[group_7155] +[group_7156] +[group_7157] +[group_7158] +[group_7159] +[group_7160] +[group_7161] +[group_7162] +[group_7163] +[group_7164] +[group_7165] +[group_7166] +[group_7167] +[group_7168] +[group_7169] +[group_7170] +[group_7171] +[group_7172] +[group_7173] +[group_7174] +[group_7175] +[group_7176] +[group_7177] +[group_7178] +[group_7179] +[group_7180] +[group_7181] +[group_7182] +[group_7183] +[group_7184] +[group_7185] +[group_7186] +[group_7187] +[group_7188] +[group_7189] +[group_7190] +[group_7191] +[group_7192] +[group_7193] +[group_7194] +[group_7195] +[group_7196] +[group_7197] +[group_7198] +[group_7199] +[group_7200] +[group_7201] +[group_7202] +[group_7203] +[group_7204] +[group_7205] +[group_7206] +[group_7207] +[group_7208] +[group_7209] +[group_7210] +[group_7211] +[group_7212] +[group_7213] +[group_7214] +[group_7215] +[group_7216] +[group_7217] +[group_7218] +[group_7219] +[group_7220] +[group_7221] +[group_7222] +[group_7223] +[group_7224] +[group_7225] +[group_7226] +[group_7227] +[group_7228] +[group_7229] +[group_7230] +[group_7231] +[group_7232] +[group_7233] +[group_7234] +[group_7235] +[group_7236] +[group_7237] +[group_7238] +[group_7239] +[group_7240] +[group_7241] +[group_7242] +[group_7243] +[group_7244] +[group_7245] +[group_7246] +[group_7247] +[group_7248] +[group_7249] +[group_7250] +[group_7251] +[group_7252] +[group_7253] +[group_7254] +[group_7255] +[group_7256] +[group_7257] +[group_7258] +[group_7259] +[group_7260] +[group_7261] +[group_7262] +[group_7263] +[group_7264] +[group_7265] +[group_7266] +[group_7267] +[group_7268] +[group_7269] +[group_7270] +[group_7271] +[group_7272] +[group_7273] +[group_7274] +[group_7275] +[group_7276] +[group_7277] +[group_7278] +[group_7279] +[group_7280] +[group_7281] +[group_7282] +[group_7283] +[group_7284] +[group_7285] +[group_7286] +[group_7287] +[group_7288] +[group_7289] +[group_7290] +[group_7291] +[group_7292] +[group_7293] +[group_7294] +[group_7295] +[group_7296] +[group_7297] +[group_7298] +[group_7299] +[group_7300] +[group_7301] +[group_7302] +[group_7303] +[group_7304] +[group_7305] +[group_7306] +[group_7307] +[group_7308] +[group_7309] +[group_7310] +[group_7311] +[group_7312] +[group_7313] +[group_7314] +[group_7315] +[group_7316] +[group_7317] +[group_7318] +[group_7319] +[group_7320] +[group_7321] +[group_7322] +[group_7323] +[group_7324] +[group_7325] +[group_7326] +[group_7327] +[group_7328] +[group_7329] +[group_7330] +[group_7331] +[group_7332] +[group_7333] +[group_7334] +[group_7335] +[group_7336] +[group_7337] +[group_7338] +[group_7339] +[group_7340] +[group_7341] +[group_7342] +[group_7343] +[group_7344] +[group_7345] +[group_7346] +[group_7347] +[group_7348] +[group_7349] +[group_7350] +[group_7351] +[group_7352] +[group_7353] +[group_7354] +[group_7355] +[group_7356] +[group_7357] +[group_7358] +[group_7359] +[group_7360] +[group_7361] +[group_7362] +[group_7363] +[group_7364] +[group_7365] +[group_7366] +[group_7367] +[group_7368] +[group_7369] +[group_7370] +[group_7371] +[group_7372] +[group_7373] +[group_7374] +[group_7375] +[group_7376] +[group_7377] +[group_7378] +[group_7379] +[group_7380] +[group_7381] +[group_7382] +[group_7383] +[group_7384] +[group_7385] +[group_7386] +[group_7387] +[group_7388] +[group_7389] +[group_7390] +[group_7391] +[group_7392] +[group_7393] +[group_7394] +[group_7395] +[group_7396] +[group_7397] +[group_7398] +[group_7399] +[group_7400] +[group_7401] +[group_7402] +[group_7403] +[group_7404] +[group_7405] +[group_7406] +[group_7407] +[group_7408] +[group_7409] +[group_7410] +[group_7411] +[group_7412] +[group_7413] +[group_7414] +[group_7415] +[group_7416] +[group_7417] +[group_7418] +[group_7419] +[group_7420] +[group_7421] +[group_7422] +[group_7423] +[group_7424] +[group_7425] +[group_7426] +[group_7427] +[group_7428] +[group_7429] +[group_7430] +[group_7431] +[group_7432] +[group_7433] +[group_7434] +[group_7435] +[group_7436] +[group_7437] +[group_7438] +[group_7439] +[group_7440] +[group_7441] +[group_7442] +[group_7443] +[group_7444] +[group_7445] +[group_7446] +[group_7447] +[group_7448] +[group_7449] +[group_7450] +[group_7451] +[group_7452] +[group_7453] +[group_7454] +[group_7455] +[group_7456] +[group_7457] +[group_7458] +[group_7459] +[group_7460] +[group_7461] +[group_7462] +[group_7463] +[group_7464] +[group_7465] +[group_7466] +[group_7467] +[group_7468] +[group_7469] +[group_7470] +[group_7471] +[group_7472] +[group_7473] +[group_7474] +[group_7475] +[group_7476] +[group_7477] +[group_7478] +[group_7479] +[group_7480] +[group_7481] +[group_7482] +[group_7483] +[group_7484] +[group_7485] +[group_7486] +[group_7487] +[group_7488] +[group_7489] +[group_7490] +[group_7491] +[group_7492] +[group_7493] +[group_7494] +[group_7495] +[group_7496] +[group_7497] +[group_7498] +[group_7499] +[group_7500] +[group_7501] +[group_7502] +[group_7503] +[group_7504] +[group_7505] +[group_7506] +[group_7507] +[group_7508] +[group_7509] +[group_7510] +[group_7511] +[group_7512] +[group_7513] +[group_7514] +[group_7515] +[group_7516] +[group_7517] +[group_7518] +[group_7519] +[group_7520] +[group_7521] +[group_7522] +[group_7523] +[group_7524] +[group_7525] +[group_7526] +[group_7527] +[group_7528] +[group_7529] +[group_7530] +[group_7531] +[group_7532] +[group_7533] +[group_7534] +[group_7535] +[group_7536] +[group_7537] +[group_7538] +[group_7539] +[group_7540] +[group_7541] +[group_7542] +[group_7543] +[group_7544] +[group_7545] +[group_7546] +[group_7547] +[group_7548] +[group_7549] +[group_7550] +[group_7551] +[group_7552] +[group_7553] +[group_7554] +[group_7555] +[group_7556] +[group_7557] +[group_7558] +[group_7559] +[group_7560] +[group_7561] +[group_7562] +[group_7563] +[group_7564] +[group_7565] +[group_7566] +[group_7567] +[group_7568] +[group_7569] +[group_7570] +[group_7571] +[group_7572] +[group_7573] +[group_7574] +[group_7575] +[group_7576] +[group_7577] +[group_7578] +[group_7579] +[group_7580] +[group_7581] +[group_7582] +[group_7583] +[group_7584] +[group_7585] +[group_7586] +[group_7587] +[group_7588] +[group_7589] +[group_7590] +[group_7591] +[group_7592] +[group_7593] +[group_7594] +[group_7595] +[group_7596] +[group_7597] +[group_7598] +[group_7599] +[group_7600] +[group_7601] +[group_7602] +[group_7603] +[group_7604] +[group_7605] +[group_7606] +[group_7607] +[group_7608] +[group_7609] +[group_7610] +[group_7611] +[group_7612] +[group_7613] +[group_7614] +[group_7615] +[group_7616] +[group_7617] +[group_7618] +[group_7619] +[group_7620] +[group_7621] +[group_7622] +[group_7623] +[group_7624] +[group_7625] +[group_7626] +[group_7627] +[group_7628] +[group_7629] +[group_7630] +[group_7631] +[group_7632] +[group_7633] +[group_7634] +[group_7635] +[group_7636] +[group_7637] +[group_7638] +[group_7639] +[group_7640] +[group_7641] +[group_7642] +[group_7643] +[group_7644] +[group_7645] +[group_7646] +[group_7647] +[group_7648] +[group_7649] +[group_7650] +[group_7651] +[group_7652] +[group_7653] +[group_7654] +[group_7655] +[group_7656] +[group_7657] +[group_7658] +[group_7659] +[group_7660] +[group_7661] +[group_7662] +[group_7663] +[group_7664] +[group_7665] +[group_7666] +[group_7667] +[group_7668] +[group_7669] +[group_7670] +[group_7671] +[group_7672] +[group_7673] +[group_7674] +[group_7675] +[group_7676] +[group_7677] +[group_7678] +[group_7679] +[group_7680] +[group_7681] +[group_7682] +[group_7683] +[group_7684] +[group_7685] +[group_7686] +[group_7687] +[group_7688] +[group_7689] +[group_7690] +[group_7691] +[group_7692] +[group_7693] +[group_7694] +[group_7695] +[group_7696] +[group_7697] +[group_7698] +[group_7699] +[group_7700] +[group_7701] +[group_7702] +[group_7703] +[group_7704] +[group_7705] +[group_7706] +[group_7707] +[group_7708] +[group_7709] +[group_7710] +[group_7711] +[group_7712] +[group_7713] +[group_7714] +[group_7715] +[group_7716] +[group_7717] +[group_7718] +[group_7719] +[group_7720] +[group_7721] +[group_7722] +[group_7723] +[group_7724] +[group_7725] +[group_7726] +[group_7727] +[group_7728] +[group_7729] +[group_7730] +[group_7731] +[group_7732] +[group_7733] +[group_7734] +[group_7735] +[group_7736] +[group_7737] +[group_7738] +[group_7739] +[group_7740] +[group_7741] +[group_7742] +[group_7743] +[group_7744] +[group_7745] +[group_7746] +[group_7747] +[group_7748] +[group_7749] +[group_7750] +[group_7751] +[group_7752] +[group_7753] +[group_7754] +[group_7755] +[group_7756] +[group_7757] +[group_7758] +[group_7759] +[group_7760] +[group_7761] +[group_7762] +[group_7763] +[group_7764] +[group_7765] +[group_7766] +[group_7767] +[group_7768] +[group_7769] +[group_7770] +[group_7771] +[group_7772] +[group_7773] +[group_7774] +[group_7775] +[group_7776] +[group_7777] +[group_7778] +[group_7779] +[group_7780] +[group_7781] +[group_7782] +[group_7783] +[group_7784] +[group_7785] +[group_7786] +[group_7787] +[group_7788] +[group_7789] +[group_7790] +[group_7791] +[group_7792] +[group_7793] +[group_7794] +[group_7795] +[group_7796] +[group_7797] +[group_7798] +[group_7799] +[group_7800] +[group_7801] +[group_7802] +[group_7803] +[group_7804] +[group_7805] +[group_7806] +[group_7807] +[group_7808] +[group_7809] +[group_7810] +[group_7811] +[group_7812] +[group_7813] +[group_7814] +[group_7815] +[group_7816] +[group_7817] +[group_7818] +[group_7819] +[group_7820] +[group_7821] +[group_7822] +[group_7823] +[group_7824] +[group_7825] +[group_7826] +[group_7827] +[group_7828] +[group_7829] +[group_7830] +[group_7831] +[group_7832] +[group_7833] +[group_7834] +[group_7835] +[group_7836] +[group_7837] +[group_7838] +[group_7839] +[group_7840] +[group_7841] +[group_7842] +[group_7843] +[group_7844] +[group_7845] +[group_7846] +[group_7847] +[group_7848] +[group_7849] +[group_7850] +[group_7851] +[group_7852] +[group_7853] +[group_7854] +[group_7855] +[group_7856] +[group_7857] +[group_7858] +[group_7859] +[group_7860] +[group_7861] +[group_7862] +[group_7863] +[group_7864] +[group_7865] +[group_7866] +[group_7867] +[group_7868] +[group_7869] +[group_7870] +[group_7871] +[group_7872] +[group_7873] +[group_7874] +[group_7875] +[group_7876] +[group_7877] +[group_7878] +[group_7879] +[group_7880] +[group_7881] +[group_7882] +[group_7883] +[group_7884] +[group_7885] +[group_7886] +[group_7887] +[group_7888] +[group_7889] +[group_7890] +[group_7891] +[group_7892] +[group_7893] +[group_7894] +[group_7895] +[group_7896] +[group_7897] +[group_7898] +[group_7899] +[group_7900] +[group_7901] +[group_7902] +[group_7903] +[group_7904] +[group_7905] +[group_7906] +[group_7907] +[group_7908] +[group_7909] +[group_7910] +[group_7911] +[group_7912] +[group_7913] +[group_7914] +[group_7915] +[group_7916] +[group_7917] +[group_7918] +[group_7919] +[group_7920] +[group_7921] +[group_7922] +[group_7923] +[group_7924] +[group_7925] +[group_7926] +[group_7927] +[group_7928] +[group_7929] +[group_7930] +[group_7931] +[group_7932] +[group_7933] +[group_7934] +[group_7935] +[group_7936] +[group_7937] +[group_7938] +[group_7939] +[group_7940] +[group_7941] +[group_7942] +[group_7943] +[group_7944] +[group_7945] +[group_7946] +[group_7947] +[group_7948] +[group_7949] +[group_7950] +[group_7951] +[group_7952] +[group_7953] +[group_7954] +[group_7955] +[group_7956] +[group_7957] +[group_7958] +[group_7959] +[group_7960] +[group_7961] +[group_7962] +[group_7963] +[group_7964] +[group_7965] +[group_7966] +[group_7967] +[group_7968] +[group_7969] +[group_7970] +[group_7971] +[group_7972] +[group_7973] +[group_7974] +[group_7975] +[group_7976] +[group_7977] +[group_7978] +[group_7979] +[group_7980] +[group_7981] +[group_7982] +[group_7983] +[group_7984] +[group_7985] +[group_7986] +[group_7987] +[group_7988] +[group_7989] +[group_7990] +[group_7991] +[group_7992] +[group_7993] +[group_7994] +[group_7995] +[group_7996] +[group_7997] +[group_7998] +[group_7999] +[group_8000] +[group_8001] +[group_8002] +[group_8003] +[group_8004] +[group_8005] +[group_8006] +[group_8007] +[group_8008] +[group_8009] +[group_8010] +[group_8011] +[group_8012] +[group_8013] +[group_8014] +[group_8015] +[group_8016] +[group_8017] +[group_8018] +[group_8019] +[group_8020] +[group_8021] +[group_8022] +[group_8023] +[group_8024] +[group_8025] +[group_8026] +[group_8027] +[group_8028] +[group_8029] +[group_8030] +[group_8031] +[group_8032] +[group_8033] +[group_8034] +[group_8035] +[group_8036] +[group_8037] +[group_8038] +[group_8039] +[group_8040] +[group_8041] +[group_8042] +[group_8043] +[group_8044] +[group_8045] +[group_8046] +[group_8047] +[group_8048] +[group_8049] +[group_8050] +[group_8051] +[group_8052] +[group_8053] +[group_8054] +[group_8055] +[group_8056] +[group_8057] +[group_8058] +[group_8059] +[group_8060] +[group_8061] +[group_8062] +[group_8063] +[group_8064] +[group_8065] +[group_8066] +[group_8067] +[group_8068] +[group_8069] +[group_8070] +[group_8071] +[group_8072] +[group_8073] +[group_8074] +[group_8075] +[group_8076] +[group_8077] +[group_8078] +[group_8079] +[group_8080] +[group_8081] +[group_8082] +[group_8083] +[group_8084] +[group_8085] +[group_8086] +[group_8087] +[group_8088] +[group_8089] +[group_8090] +[group_8091] +[group_8092] +[group_8093] +[group_8094] +[group_8095] +[group_8096] +[group_8097] +[group_8098] +[group_8099] +[group_8100] +[group_8101] +[group_8102] +[group_8103] +[group_8104] +[group_8105] +[group_8106] +[group_8107] +[group_8108] +[group_8109] +[group_8110] +[group_8111] +[group_8112] +[group_8113] +[group_8114] +[group_8115] +[group_8116] +[group_8117] +[group_8118] +[group_8119] +[group_8120] +[group_8121] +[group_8122] +[group_8123] +[group_8124] +[group_8125] +[group_8126] +[group_8127] +[group_8128] +[group_8129] +[group_8130] +[group_8131] +[group_8132] +[group_8133] +[group_8134] +[group_8135] +[group_8136] +[group_8137] +[group_8138] +[group_8139] +[group_8140] +[group_8141] +[group_8142] +[group_8143] +[group_8144] +[group_8145] +[group_8146] +[group_8147] +[group_8148] +[group_8149] +[group_8150] +[group_8151] +[group_8152] +[group_8153] +[group_8154] +[group_8155] +[group_8156] +[group_8157] +[group_8158] +[group_8159] +[group_8160] +[group_8161] +[group_8162] +[group_8163] +[group_8164] +[group_8165] +[group_8166] +[group_8167] +[group_8168] +[group_8169] +[group_8170] +[group_8171] +[group_8172] +[group_8173] +[group_8174] +[group_8175] +[group_8176] +[group_8177] +[group_8178] +[group_8179] +[group_8180] +[group_8181] +[group_8182] +[group_8183] +[group_8184] +[group_8185] +[group_8186] +[group_8187] +[group_8188] +[group_8189] +[group_8190] +[group_8191] +[group_8192] +[group_8193] +[group_8194] +[group_8195] +[group_8196] +[group_8197] +[group_8198] +[group_8199] +[group_8200] +[group_8201] +[group_8202] +[group_8203] +[group_8204] +[group_8205] +[group_8206] +[group_8207] +[group_8208] +[group_8209] +[group_8210] +[group_8211] +[group_8212] +[group_8213] +[group_8214] +[group_8215] +[group_8216] +[group_8217] +[group_8218] +[group_8219] +[group_8220] +[group_8221] +[group_8222] +[group_8223] +[group_8224] +[group_8225] +[group_8226] +[group_8227] +[group_8228] +[group_8229] +[group_8230] +[group_8231] +[group_8232] +[group_8233] +[group_8234] +[group_8235] +[group_8236] +[group_8237] +[group_8238] +[group_8239] +[group_8240] +[group_8241] +[group_8242] +[group_8243] +[group_8244] +[group_8245] +[group_8246] +[group_8247] +[group_8248] +[group_8249] +[group_8250] +[group_8251] +[group_8252] +[group_8253] +[group_8254] +[group_8255] +[group_8256] +[group_8257] +[group_8258] +[group_8259] +[group_8260] +[group_8261] +[group_8262] +[group_8263] +[group_8264] +[group_8265] +[group_8266] +[group_8267] +[group_8268] +[group_8269] +[group_8270] +[group_8271] +[group_8272] +[group_8273] +[group_8274] +[group_8275] +[group_8276] +[group_8277] +[group_8278] +[group_8279] +[group_8280] +[group_8281] +[group_8282] +[group_8283] +[group_8284] +[group_8285] +[group_8286] +[group_8287] +[group_8288] +[group_8289] +[group_8290] +[group_8291] +[group_8292] +[group_8293] +[group_8294] +[group_8295] +[group_8296] +[group_8297] +[group_8298] +[group_8299] +[group_8300] +[group_8301] +[group_8302] +[group_8303] +[group_8304] +[group_8305] +[group_8306] +[group_8307] +[group_8308] +[group_8309] +[group_8310] +[group_8311] +[group_8312] +[group_8313] +[group_8314] +[group_8315] +[group_8316] +[group_8317] +[group_8318] +[group_8319] +[group_8320] +[group_8321] +[group_8322] +[group_8323] +[group_8324] +[group_8325] +[group_8326] +[group_8327] +[group_8328] +[group_8329] +[group_8330] +[group_8331] +[group_8332] +[group_8333] +[group_8334] +[group_8335] +[group_8336] +[group_8337] +[group_8338] +[group_8339] +[group_8340] +[group_8341] +[group_8342] +[group_8343] +[group_8344] +[group_8345] +[group_8346] +[group_8347] +[group_8348] +[group_8349] +[group_8350] +[group_8351] +[group_8352] +[group_8353] +[group_8354] +[group_8355] +[group_8356] +[group_8357] +[group_8358] +[group_8359] +[group_8360] +[group_8361] +[group_8362] +[group_8363] +[group_8364] +[group_8365] +[group_8366] +[group_8367] +[group_8368] +[group_8369] +[group_8370] +[group_8371] +[group_8372] +[group_8373] +[group_8374] +[group_8375] +[group_8376] +[group_8377] +[group_8378] +[group_8379] +[group_8380] +[group_8381] +[group_8382] +[group_8383] +[group_8384] +[group_8385] +[group_8386] +[group_8387] +[group_8388] +[group_8389] +[group_8390] +[group_8391] +[group_8392] +[group_8393] +[group_8394] +[group_8395] +[group_8396] +[group_8397] +[group_8398] +[group_8399] +[group_8400] +[group_8401] +[group_8402] +[group_8403] +[group_8404] +[group_8405] +[group_8406] +[group_8407] +[group_8408] +[group_8409] +[group_8410] +[group_8411] +[group_8412] +[group_8413] +[group_8414] +[group_8415] +[group_8416] +[group_8417] +[group_8418] +[group_8419] +[group_8420] +[group_8421] +[group_8422] +[group_8423] +[group_8424] +[group_8425] +[group_8426] +[group_8427] +[group_8428] +[group_8429] +[group_8430] +[group_8431] +[group_8432] +[group_8433] +[group_8434] +[group_8435] +[group_8436] +[group_8437] +[group_8438] +[group_8439] +[group_8440] +[group_8441] +[group_8442] +[group_8443] +[group_8444] +[group_8445] +[group_8446] +[group_8447] +[group_8448] +[group_8449] +[group_8450] +[group_8451] +[group_8452] +[group_8453] +[group_8454] +[group_8455] +[group_8456] +[group_8457] +[group_8458] +[group_8459] +[group_8460] +[group_8461] +[group_8462] +[group_8463] +[group_8464] +[group_8465] +[group_8466] +[group_8467] +[group_8468] +[group_8469] +[group_8470] +[group_8471] +[group_8472] +[group_8473] +[group_8474] +[group_8475] +[group_8476] +[group_8477] +[group_8478] +[group_8479] +[group_8480] +[group_8481] +[group_8482] +[group_8483] +[group_8484] +[group_8485] +[group_8486] +[group_8487] +[group_8488] +[group_8489] +[group_8490] +[group_8491] +[group_8492] +[group_8493] +[group_8494] +[group_8495] +[group_8496] +[group_8497] +[group_8498] +[group_8499] +[group_8500] +[group_8501] +[group_8502] +[group_8503] +[group_8504] +[group_8505] +[group_8506] +[group_8507] +[group_8508] +[group_8509] +[group_8510] +[group_8511] +[group_8512] +[group_8513] +[group_8514] +[group_8515] +[group_8516] +[group_8517] +[group_8518] +[group_8519] +[group_8520] +[group_8521] +[group_8522] +[group_8523] +[group_8524] +[group_8525] +[group_8526] +[group_8527] +[group_8528] +[group_8529] +[group_8530] +[group_8531] +[group_8532] +[group_8533] +[group_8534] +[group_8535] +[group_8536] +[group_8537] +[group_8538] +[group_8539] +[group_8540] +[group_8541] +[group_8542] +[group_8543] +[group_8544] +[group_8545] +[group_8546] +[group_8547] +[group_8548] +[group_8549] +[group_8550] +[group_8551] +[group_8552] +[group_8553] +[group_8554] +[group_8555] +[group_8556] +[group_8557] +[group_8558] +[group_8559] +[group_8560] +[group_8561] +[group_8562] +[group_8563] +[group_8564] +[group_8565] +[group_8566] +[group_8567] +[group_8568] +[group_8569] +[group_8570] +[group_8571] +[group_8572] +[group_8573] +[group_8574] +[group_8575] +[group_8576] +[group_8577] +[group_8578] +[group_8579] +[group_8580] +[group_8581] +[group_8582] +[group_8583] +[group_8584] +[group_8585] +[group_8586] +[group_8587] +[group_8588] +[group_8589] +[group_8590] +[group_8591] +[group_8592] +[group_8593] +[group_8594] +[group_8595] +[group_8596] +[group_8597] +[group_8598] +[group_8599] +[group_8600] +[group_8601] +[group_8602] +[group_8603] +[group_8604] +[group_8605] +[group_8606] +[group_8607] +[group_8608] +[group_8609] +[group_8610] +[group_8611] +[group_8612] +[group_8613] +[group_8614] +[group_8615] +[group_8616] +[group_8617] +[group_8618] +[group_8619] +[group_8620] +[group_8621] +[group_8622] +[group_8623] +[group_8624] +[group_8625] +[group_8626] +[group_8627] +[group_8628] +[group_8629] +[group_8630] +[group_8631] +[group_8632] +[group_8633] +[group_8634] +[group_8635] +[group_8636] +[group_8637] +[group_8638] +[group_8639] +[group_8640] +[group_8641] +[group_8642] +[group_8643] +[group_8644] +[group_8645] +[group_8646] +[group_8647] +[group_8648] +[group_8649] +[group_8650] +[group_8651] +[group_8652] +[group_8653] +[group_8654] +[group_8655] +[group_8656] +[group_8657] +[group_8658] +[group_8659] +[group_8660] +[group_8661] +[group_8662] +[group_8663] +[group_8664] +[group_8665] +[group_8666] +[group_8667] +[group_8668] +[group_8669] +[group_8670] +[group_8671] +[group_8672] +[group_8673] +[group_8674] +[group_8675] +[group_8676] +[group_8677] +[group_8678] +[group_8679] +[group_8680] +[group_8681] +[group_8682] +[group_8683] +[group_8684] +[group_8685] +[group_8686] +[group_8687] +[group_8688] +[group_8689] +[group_8690] +[group_8691] +[group_8692] +[group_8693] +[group_8694] +[group_8695] +[group_8696] +[group_8697] +[group_8698] +[group_8699] +[group_8700] +[group_8701] +[group_8702] +[group_8703] +[group_8704] +[group_8705] +[group_8706] +[group_8707] +[group_8708] +[group_8709] +[group_8710] +[group_8711] +[group_8712] +[group_8713] +[group_8714] +[group_8715] +[group_8716] +[group_8717] +[group_8718] +[group_8719] +[group_8720] +[group_8721] +[group_8722] +[group_8723] +[group_8724] +[group_8725] +[group_8726] +[group_8727] +[group_8728] +[group_8729] +[group_8730] +[group_8731] +[group_8732] +[group_8733] +[group_8734] +[group_8735] +[group_8736] +[group_8737] +[group_8738] +[group_8739] +[group_8740] +[group_8741] +[group_8742] +[group_8743] +[group_8744] +[group_8745] +[group_8746] +[group_8747] +[group_8748] +[group_8749] +[group_8750] +[group_8751] +[group_8752] +[group_8753] +[group_8754] +[group_8755] +[group_8756] +[group_8757] +[group_8758] +[group_8759] +[group_8760] +[group_8761] +[group_8762] +[group_8763] +[group_8764] +[group_8765] +[group_8766] +[group_8767] +[group_8768] +[group_8769] +[group_8770] +[group_8771] +[group_8772] +[group_8773] +[group_8774] +[group_8775] +[group_8776] +[group_8777] +[group_8778] +[group_8779] +[group_8780] +[group_8781] +[group_8782] +[group_8783] +[group_8784] +[group_8785] +[group_8786] +[group_8787] +[group_8788] +[group_8789] +[group_8790] +[group_8791] +[group_8792] +[group_8793] +[group_8794] +[group_8795] +[group_8796] +[group_8797] +[group_8798] +[group_8799] +[group_8800] +[group_8801] +[group_8802] +[group_8803] +[group_8804] +[group_8805] +[group_8806] +[group_8807] +[group_8808] +[group_8809] +[group_8810] +[group_8811] +[group_8812] +[group_8813] +[group_8814] +[group_8815] +[group_8816] +[group_8817] +[group_8818] +[group_8819] +[group_8820] +[group_8821] +[group_8822] +[group_8823] +[group_8824] +[group_8825] +[group_8826] +[group_8827] +[group_8828] +[group_8829] +[group_8830] +[group_8831] +[group_8832] +[group_8833] +[group_8834] +[group_8835] +[group_8836] +[group_8837] +[group_8838] +[group_8839] +[group_8840] +[group_8841] +[group_8842] +[group_8843] +[group_8844] +[group_8845] +[group_8846] +[group_8847] +[group_8848] +[group_8849] +[group_8850] +[group_8851] +[group_8852] +[group_8853] +[group_8854] +[group_8855] +[group_8856] +[group_8857] +[group_8858] +[group_8859] +[group_8860] +[group_8861] +[group_8862] +[group_8863] +[group_8864] +[group_8865] +[group_8866] +[group_8867] +[group_8868] +[group_8869] +[group_8870] +[group_8871] +[group_8872] +[group_8873] +[group_8874] +[group_8875] +[group_8876] +[group_8877] +[group_8878] +[group_8879] +[group_8880] +[group_8881] +[group_8882] +[group_8883] +[group_8884] +[group_8885] +[group_8886] +[group_8887] +[group_8888] +[group_8889] +[group_8890] +[group_8891] +[group_8892] +[group_8893] +[group_8894] +[group_8895] +[group_8896] +[group_8897] +[group_8898] +[group_8899] +[group_8900] +[group_8901] +[group_8902] +[group_8903] +[group_8904] +[group_8905] +[group_8906] +[group_8907] +[group_8908] +[group_8909] +[group_8910] +[group_8911] +[group_8912] +[group_8913] +[group_8914] +[group_8915] +[group_8916] +[group_8917] +[group_8918] +[group_8919] +[group_8920] +[group_8921] +[group_8922] +[group_8923] +[group_8924] +[group_8925] +[group_8926] +[group_8927] +[group_8928] +[group_8929] +[group_8930] +[group_8931] +[group_8932] +[group_8933] +[group_8934] +[group_8935] +[group_8936] +[group_8937] +[group_8938] +[group_8939] +[group_8940] +[group_8941] +[group_8942] +[group_8943] +[group_8944] +[group_8945] +[group_8946] +[group_8947] +[group_8948] +[group_8949] +[group_8950] +[group_8951] +[group_8952] +[group_8953] +[group_8954] +[group_8955] +[group_8956] +[group_8957] +[group_8958] +[group_8959] +[group_8960] +[group_8961] +[group_8962] +[group_8963] +[group_8964] +[group_8965] +[group_8966] +[group_8967] +[group_8968] +[group_8969] +[group_8970] +[group_8971] +[group_8972] +[group_8973] +[group_8974] +[group_8975] +[group_8976] +[group_8977] +[group_8978] +[group_8979] +[group_8980] +[group_8981] +[group_8982] +[group_8983] +[group_8984] +[group_8985] +[group_8986] +[group_8987] +[group_8988] +[group_8989] +[group_8990] +[group_8991] +[group_8992] +[group_8993] +[group_8994] +[group_8995] +[group_8996] +[group_8997] +[group_8998] +[group_8999] +[group_9000] +[group_9001] +[group_9002] +[group_9003] +[group_9004] +[group_9005] +[group_9006] +[group_9007] +[group_9008] +[group_9009] +[group_9010] +[group_9011] +[group_9012] +[group_9013] +[group_9014] +[group_9015] +[group_9016] +[group_9017] +[group_9018] +[group_9019] +[group_9020] +[group_9021] +[group_9022] +[group_9023] +[group_9024] +[group_9025] +[group_9026] +[group_9027] +[group_9028] +[group_9029] +[group_9030] +[group_9031] +[group_9032] +[group_9033] +[group_9034] +[group_9035] +[group_9036] +[group_9037] +[group_9038] +[group_9039] +[group_9040] +[group_9041] +[group_9042] +[group_9043] +[group_9044] +[group_9045] +[group_9046] +[group_9047] +[group_9048] +[group_9049] +[group_9050] +[group_9051] +[group_9052] +[group_9053] +[group_9054] +[group_9055] +[group_9056] +[group_9057] +[group_9058] +[group_9059] +[group_9060] +[group_9061] +[group_9062] +[group_9063] +[group_9064] +[group_9065] +[group_9066] +[group_9067] +[group_9068] +[group_9069] +[group_9070] +[group_9071] +[group_9072] +[group_9073] +[group_9074] +[group_9075] +[group_9076] +[group_9077] +[group_9078] +[group_9079] +[group_9080] +[group_9081] +[group_9082] +[group_9083] +[group_9084] +[group_9085] +[group_9086] +[group_9087] +[group_9088] +[group_9089] +[group_9090] +[group_9091] +[group_9092] +[group_9093] +[group_9094] +[group_9095] +[group_9096] +[group_9097] +[group_9098] +[group_9099] +[group_9100] +[group_9101] +[group_9102] +[group_9103] +[group_9104] +[group_9105] +[group_9106] +[group_9107] +[group_9108] +[group_9109] +[group_9110] +[group_9111] +[group_9112] +[group_9113] +[group_9114] +[group_9115] +[group_9116] +[group_9117] +[group_9118] +[group_9119] +[group_9120] +[group_9121] +[group_9122] +[group_9123] +[group_9124] +[group_9125] +[group_9126] +[group_9127] +[group_9128] +[group_9129] +[group_9130] +[group_9131] +[group_9132] +[group_9133] +[group_9134] +[group_9135] +[group_9136] +[group_9137] +[group_9138] +[group_9139] +[group_9140] +[group_9141] +[group_9142] +[group_9143] +[group_9144] +[group_9145] +[group_9146] +[group_9147] +[group_9148] +[group_9149] +[group_9150] +[group_9151] +[group_9152] +[group_9153] +[group_9154] +[group_9155] +[group_9156] +[group_9157] +[group_9158] +[group_9159] +[group_9160] +[group_9161] +[group_9162] +[group_9163] +[group_9164] +[group_9165] +[group_9166] +[group_9167] +[group_9168] +[group_9169] +[group_9170] +[group_9171] +[group_9172] +[group_9173] +[group_9174] +[group_9175] +[group_9176] +[group_9177] +[group_9178] +[group_9179] +[group_9180] +[group_9181] +[group_9182] +[group_9183] +[group_9184] +[group_9185] +[group_9186] +[group_9187] +[group_9188] +[group_9189] +[group_9190] +[group_9191] +[group_9192] +[group_9193] +[group_9194] +[group_9195] +[group_9196] +[group_9197] +[group_9198] +[group_9199] +[group_9200] +[group_9201] +[group_9202] +[group_9203] +[group_9204] +[group_9205] +[group_9206] +[group_9207] +[group_9208] +[group_9209] +[group_9210] +[group_9211] +[group_9212] +[group_9213] +[group_9214] +[group_9215] +[group_9216] +[group_9217] +[group_9218] +[group_9219] +[group_9220] +[group_9221] +[group_9222] +[group_9223] +[group_9224] +[group_9225] +[group_9226] +[group_9227] +[group_9228] +[group_9229] +[group_9230] +[group_9231] +[group_9232] +[group_9233] +[group_9234] +[group_9235] +[group_9236] +[group_9237] +[group_9238] +[group_9239] +[group_9240] +[group_9241] +[group_9242] +[group_9243] +[group_9244] +[group_9245] +[group_9246] +[group_9247] +[group_9248] +[group_9249] +[group_9250] +[group_9251] +[group_9252] +[group_9253] +[group_9254] +[group_9255] +[group_9256] +[group_9257] +[group_9258] +[group_9259] +[group_9260] +[group_9261] +[group_9262] +[group_9263] +[group_9264] +[group_9265] +[group_9266] +[group_9267] +[group_9268] +[group_9269] +[group_9270] +[group_9271] +[group_9272] +[group_9273] +[group_9274] +[group_9275] +[group_9276] +[group_9277] +[group_9278] +[group_9279] +[group_9280] +[group_9281] +[group_9282] +[group_9283] +[group_9284] +[group_9285] +[group_9286] +[group_9287] +[group_9288] +[group_9289] +[group_9290] +[group_9291] +[group_9292] +[group_9293] +[group_9294] +[group_9295] +[group_9296] +[group_9297] +[group_9298] +[group_9299] +[group_9300] +[group_9301] +[group_9302] +[group_9303] +[group_9304] +[group_9305] +[group_9306] +[group_9307] +[group_9308] +[group_9309] +[group_9310] +[group_9311] +[group_9312] +[group_9313] +[group_9314] +[group_9315] +[group_9316] +[group_9317] +[group_9318] +[group_9319] +[group_9320] +[group_9321] +[group_9322] +[group_9323] +[group_9324] +[group_9325] +[group_9326] +[group_9327] +[group_9328] +[group_9329] +[group_9330] +[group_9331] +[group_9332] +[group_9333] +[group_9334] +[group_9335] +[group_9336] +[group_9337] +[group_9338] +[group_9339] +[group_9340] +[group_9341] +[group_9342] +[group_9343] +[group_9344] +[group_9345] +[group_9346] +[group_9347] +[group_9348] +[group_9349] +[group_9350] +[group_9351] +[group_9352] +[group_9353] +[group_9354] +[group_9355] +[group_9356] +[group_9357] +[group_9358] +[group_9359] +[group_9360] +[group_9361] +[group_9362] +[group_9363] +[group_9364] +[group_9365] +[group_9366] +[group_9367] +[group_9368] +[group_9369] +[group_9370] +[group_9371] +[group_9372] +[group_9373] +[group_9374] +[group_9375] +[group_9376] +[group_9377] +[group_9378] +[group_9379] +[group_9380] +[group_9381] +[group_9382] +[group_9383] +[group_9384] +[group_9385] +[group_9386] +[group_9387] +[group_9388] +[group_9389] +[group_9390] +[group_9391] +[group_9392] +[group_9393] +[group_9394] +[group_9395] +[group_9396] +[group_9397] +[group_9398] +[group_9399] +[group_9400] +[group_9401] +[group_9402] +[group_9403] +[group_9404] +[group_9405] +[group_9406] +[group_9407] +[group_9408] +[group_9409] +[group_9410] +[group_9411] +[group_9412] +[group_9413] +[group_9414] +[group_9415] +[group_9416] +[group_9417] +[group_9418] +[group_9419] +[group_9420] +[group_9421] +[group_9422] +[group_9423] +[group_9424] +[group_9425] +[group_9426] +[group_9427] +[group_9428] +[group_9429] +[group_9430] +[group_9431] +[group_9432] +[group_9433] +[group_9434] +[group_9435] +[group_9436] +[group_9437] +[group_9438] +[group_9439] +[group_9440] +[group_9441] +[group_9442] +[group_9443] +[group_9444] +[group_9445] +[group_9446] +[group_9447] +[group_9448] +[group_9449] +[group_9450] +[group_9451] +[group_9452] +[group_9453] +[group_9454] +[group_9455] +[group_9456] +[group_9457] +[group_9458] +[group_9459] +[group_9460] +[group_9461] +[group_9462] +[group_9463] +[group_9464] +[group_9465] +[group_9466] +[group_9467] +[group_9468] +[group_9469] +[group_9470] +[group_9471] +[group_9472] +[group_9473] +[group_9474] +[group_9475] +[group_9476] +[group_9477] +[group_9478] +[group_9479] +[group_9480] +[group_9481] +[group_9482] +[group_9483] +[group_9484] +[group_9485] +[group_9486] +[group_9487] +[group_9488] +[group_9489] +[group_9490] +[group_9491] +[group_9492] +[group_9493] +[group_9494] +[group_9495] +[group_9496] +[group_9497] +[group_9498] +[group_9499] +[group_9500] +[group_9501] +[group_9502] +[group_9503] +[group_9504] +[group_9505] +[group_9506] +[group_9507] +[group_9508] +[group_9509] +[group_9510] +[group_9511] +[group_9512] +[group_9513] +[group_9514] +[group_9515] +[group_9516] +[group_9517] +[group_9518] +[group_9519] +[group_9520] +[group_9521] +[group_9522] +[group_9523] +[group_9524] +[group_9525] +[group_9526] +[group_9527] +[group_9528] +[group_9529] +[group_9530] +[group_9531] +[group_9532] +[group_9533] +[group_9534] +[group_9535] +[group_9536] +[group_9537] +[group_9538] +[group_9539] +[group_9540] +[group_9541] +[group_9542] +[group_9543] +[group_9544] +[group_9545] +[group_9546] +[group_9547] +[group_9548] +[group_9549] +[group_9550] +[group_9551] +[group_9552] +[group_9553] +[group_9554] +[group_9555] +[group_9556] +[group_9557] +[group_9558] +[group_9559] +[group_9560] +[group_9561] +[group_9562] +[group_9563] +[group_9564] +[group_9565] +[group_9566] +[group_9567] +[group_9568] +[group_9569] +[group_9570] +[group_9571] +[group_9572] +[group_9573] +[group_9574] +[group_9575] +[group_9576] +[group_9577] +[group_9578] +[group_9579] +[group_9580] +[group_9581] +[group_9582] +[group_9583] +[group_9584] +[group_9585] +[group_9586] +[group_9587] +[group_9588] +[group_9589] +[group_9590] +[group_9591] +[group_9592] +[group_9593] +[group_9594] +[group_9595] +[group_9596] +[group_9597] +[group_9598] +[group_9599] +[group_9600] +[group_9601] +[group_9602] +[group_9603] +[group_9604] +[group_9605] +[group_9606] +[group_9607] +[group_9608] +[group_9609] +[group_9610] +[group_9611] +[group_9612] +[group_9613] +[group_9614] +[group_9615] +[group_9616] +[group_9617] +[group_9618] +[group_9619] +[group_9620] +[group_9621] +[group_9622] +[group_9623] +[group_9624] +[group_9625] +[group_9626] +[group_9627] +[group_9628] +[group_9629] +[group_9630] +[group_9631] +[group_9632] +[group_9633] +[group_9634] +[group_9635] +[group_9636] +[group_9637] +[group_9638] +[group_9639] +[group_9640] +[group_9641] +[group_9642] +[group_9643] +[group_9644] +[group_9645] +[group_9646] +[group_9647] +[group_9648] +[group_9649] +[group_9650] +[group_9651] +[group_9652] +[group_9653] +[group_9654] +[group_9655] +[group_9656] +[group_9657] +[group_9658] +[group_9659] +[group_9660] +[group_9661] +[group_9662] +[group_9663] +[group_9664] +[group_9665] +[group_9666] +[group_9667] +[group_9668] +[group_9669] +[group_9670] +[group_9671] +[group_9672] +[group_9673] +[group_9674] +[group_9675] +[group_9676] +[group_9677] +[group_9678] +[group_9679] +[group_9680] +[group_9681] +[group_9682] +[group_9683] +[group_9684] +[group_9685] +[group_9686] +[group_9687] +[group_9688] +[group_9689] +[group_9690] +[group_9691] +[group_9692] +[group_9693] +[group_9694] +[group_9695] +[group_9696] +[group_9697] +[group_9698] +[group_9699] +[group_9700] +[group_9701] +[group_9702] +[group_9703] +[group_9704] +[group_9705] +[group_9706] +[group_9707] +[group_9708] +[group_9709] +[group_9710] +[group_9711] +[group_9712] +[group_9713] +[group_9714] +[group_9715] +[group_9716] +[group_9717] +[group_9718] +[group_9719] +[group_9720] +[group_9721] +[group_9722] +[group_9723] +[group_9724] +[group_9725] +[group_9726] +[group_9727] +[group_9728] +[group_9729] +[group_9730] +[group_9731] +[group_9732] +[group_9733] +[group_9734] +[group_9735] +[group_9736] +[group_9737] +[group_9738] +[group_9739] +[group_9740] +[group_9741] +[group_9742] +[group_9743] +[group_9744] +[group_9745] +[group_9746] +[group_9747] +[group_9748] +[group_9749] +[group_9750] +[group_9751] +[group_9752] +[group_9753] +[group_9754] +[group_9755] +[group_9756] +[group_9757] +[group_9758] +[group_9759] +[group_9760] +[group_9761] +[group_9762] +[group_9763] +[group_9764] +[group_9765] +[group_9766] +[group_9767] +[group_9768] +[group_9769] +[group_9770] +[group_9771] +[group_9772] +[group_9773] +[group_9774] +[group_9775] +[group_9776] +[group_9777] +[group_9778] +[group_9779] +[group_9780] +[group_9781] +[group_9782] +[group_9783] +[group_9784] +[group_9785] +[group_9786] +[group_9787] +[group_9788] +[group_9789] +[group_9790] +[group_9791] +[group_9792] +[group_9793] +[group_9794] +[group_9795] +[group_9796] +[group_9797] +[group_9798] +[group_9799] +[group_9800] +[group_9801] +[group_9802] +[group_9803] +[group_9804] +[group_9805] +[group_9806] +[group_9807] +[group_9808] +[group_9809] +[group_9810] +[group_9811] +[group_9812] +[group_9813] +[group_9814] +[group_9815] +[group_9816] +[group_9817] +[group_9818] +[group_9819] +[group_9820] +[group_9821] +[group_9822] +[group_9823] +[group_9824] +[group_9825] +[group_9826] +[group_9827] +[group_9828] +[group_9829] +[group_9830] +[group_9831] +[group_9832] +[group_9833] +[group_9834] +[group_9835] +[group_9836] +[group_9837] +[group_9838] +[group_9839] +[group_9840] +[group_9841] +[group_9842] +[group_9843] +[group_9844] +[group_9845] +[group_9846] +[group_9847] +[group_9848] +[group_9849] +[group_9850] +[group_9851] +[group_9852] +[group_9853] +[group_9854] +[group_9855] +[group_9856] +[group_9857] +[group_9858] +[group_9859] +[group_9860] +[group_9861] +[group_9862] +[group_9863] +[group_9864] +[group_9865] +[group_9866] +[group_9867] +[group_9868] +[group_9869] +[group_9870] +[group_9871] +[group_9872] +[group_9873] +[group_9874] +[group_9875] +[group_9876] +[group_9877] +[group_9878] +[group_9879] +[group_9880] +[group_9881] +[group_9882] +[group_9883] +[group_9884] +[group_9885] +[group_9886] +[group_9887] +[group_9888] +[group_9889] +[group_9890] +[group_9891] +[group_9892] +[group_9893] +[group_9894] +[group_9895] +[group_9896] +[group_9897] +[group_9898] +[group_9899] +[group_9900] +[group_9901] +[group_9902] +[group_9903] +[group_9904] +[group_9905] +[group_9906] +[group_9907] +[group_9908] +[group_9909] +[group_9910] +[group_9911] +[group_9912] +[group_9913] +[group_9914] +[group_9915] +[group_9916] +[group_9917] +[group_9918] +[group_9919] +[group_9920] +[group_9921] +[group_9922] +[group_9923] +[group_9924] +[group_9925] +[group_9926] +[group_9927] +[group_9928] +[group_9929] +[group_9930] +[group_9931] +[group_9932] +[group_9933] +[group_9934] +[group_9935] +[group_9936] +[group_9937] +[group_9938] +[group_9939] +[group_9940] +[group_9941] +[group_9942] +[group_9943] +[group_9944] +[group_9945] +[group_9946] +[group_9947] +[group_9948] +[group_9949] +[group_9950] +[group_9951] +[group_9952] +[group_9953] +[group_9954] +[group_9955] +[group_9956] +[group_9957] +[group_9958] +[group_9959] +[group_9960] +[group_9961] +[group_9962] +[group_9963] +[group_9964] +[group_9965] +[group_9966] +[group_9967] +[group_9968] +[group_9969] +[group_9970] +[group_9971] +[group_9972] +[group_9973] +[group_9974] +[group_9975] +[group_9976] +[group_9977] +[group_9978] +[group_9979] +[group_9980] +[group_9981] +[group_9982] +[group_9983] +[group_9984] +[group_9985] +[group_9986] +[group_9987] +[group_9988] +[group_9989] +[group_9990] +[group_9991] +[group_9992] +[group_9993] +[group_9994] +[group_9995] +[group_9996] +[group_9997] +[group_9998] +[group_9999] +[group_10000] +[group_10001] +[group_10002] +[group_10003] +[group_10004] +[group_10005] +[group_10006] +[group_10007] +[group_10008] +[group_10009] +[group_10010] +[group_10011] +[group_10012] +[group_10013] +[group_10014] +[group_10015] +[group_10016] +[group_10017] +[group_10018] +[group_10019] +[group_10020] +[group_10021] +[group_10022] +[group_10023] +[group_10024] +[group_10025] +[group_10026] +[group_10027] +[group_10028] +[group_10029] +[group_10030] +[group_10031] +[group_10032] +[group_10033] +[group_10034] +[group_10035] +[group_10036] +[group_10037] +[group_10038] +[group_10039] +[group_10040] +[group_10041] +[group_10042] +[group_10043] +[group_10044] +[group_10045] +[group_10046] +[group_10047] +[group_10048] +[group_10049] +[group_10050] +[group_10051] +[group_10052] +[group_10053] +[group_10054] +[group_10055] +[group_10056] +[group_10057] +[group_10058] +[group_10059] +[group_10060] +[group_10061] +[group_10062] +[group_10063] +[group_10064] +[group_10065] +[group_10066] +[group_10067] +[group_10068] +[group_10069] +[group_10070] +[group_10071] +[group_10072] +[group_10073] +[group_10074] +[group_10075] +[group_10076] +[group_10077] +[group_10078] +[group_10079] +[group_10080] +[group_10081] +[group_10082] +[group_10083] +[group_10084] +[group_10085] +[group_10086] +[group_10087] +[group_10088] +[group_10089] +[group_10090] +[group_10091] +[group_10092] +[group_10093] +[group_10094] +[group_10095] +[group_10096] +[group_10097] +[group_10098] +[group_10099] +[group_10100] +[group_10101] +[group_10102] +[group_10103] +[group_10104] +[group_10105] +[group_10106] +[group_10107] +[group_10108] +[group_10109] +[group_10110] +[group_10111] +[group_10112] +[group_10113] +[group_10114] +[group_10115] +[group_10116] +[group_10117] +[group_10118] +[group_10119] +[group_10120] +[group_10121] +[group_10122] +[group_10123] +[group_10124] +[group_10125] +[group_10126] +[group_10127] +[group_10128] +[group_10129] +[group_10130] +[group_10131] +[group_10132] +[group_10133] +[group_10134] +[group_10135] +[group_10136] +[group_10137] +[group_10138] +[group_10139] +[group_10140] +[group_10141] +[group_10142] +[group_10143] +[group_10144] +[group_10145] +[group_10146] +[group_10147] +[group_10148] +[group_10149] +[group_10150] +[group_10151] +[group_10152] +[group_10153] +[group_10154] +[group_10155] +[group_10156] +[group_10157] +[group_10158] +[group_10159] +[group_10160] +[group_10161] +[group_10162] +[group_10163] +[group_10164] +[group_10165] +[group_10166] +[group_10167] +[group_10168] +[group_10169] +[group_10170] +[group_10171] +[group_10172] +[group_10173] +[group_10174] +[group_10175] +[group_10176] +[group_10177] +[group_10178] +[group_10179] +[group_10180] +[group_10181] +[group_10182] +[group_10183] +[group_10184] +[group_10185] +[group_10186] +[group_10187] +[group_10188] +[group_10189] +[group_10190] +[group_10191] +[group_10192] +[group_10193] +[group_10194] +[group_10195] +[group_10196] +[group_10197] +[group_10198] +[group_10199] +[group_10200] +[group_10201] +[group_10202] +[group_10203] +[group_10204] +[group_10205] +[group_10206] +[group_10207] +[group_10208] +[group_10209] +[group_10210] +[group_10211] +[group_10212] +[group_10213] +[group_10214] +[group_10215] +[group_10216] +[group_10217] +[group_10218] +[group_10219] +[group_10220] +[group_10221] +[group_10222] +[group_10223] +[group_10224] +[group_10225] +[group_10226] +[group_10227] +[group_10228] +[group_10229] +[group_10230] +[group_10231] +[group_10232] +[group_10233] +[group_10234] +[group_10235] +[group_10236] +[group_10237] +[group_10238] +[group_10239] +[group_10240] +[group_10241] +[group_10242] +[group_10243] +[group_10244] +[group_10245] +[group_10246] +[group_10247] +[group_10248] +[group_10249] +[group_10250] +[group_10251] +[group_10252] +[group_10253] +[group_10254] +[group_10255] +[group_10256] +[group_10257] +[group_10258] +[group_10259] +[group_10260] +[group_10261] +[group_10262] +[group_10263] +[group_10264] +[group_10265] +[group_10266] +[group_10267] +[group_10268] +[group_10269] +[group_10270] +[group_10271] +[group_10272] +[group_10273] +[group_10274] +[group_10275] +[group_10276] +[group_10277] +[group_10278] +[group_10279] +[group_10280] +[group_10281] +[group_10282] +[group_10283] +[group_10284] +[group_10285] +[group_10286] +[group_10287] +[group_10288] +[group_10289] +[group_10290] +[group_10291] +[group_10292] +[group_10293] +[group_10294] +[group_10295] +[group_10296] +[group_10297] +[group_10298] +[group_10299] +[group_10300] +[group_10301] +[group_10302] +[group_10303] +[group_10304] +[group_10305] +[group_10306] +[group_10307] +[group_10308] +[group_10309] +[group_10310] +[group_10311] +[group_10312] +[group_10313] +[group_10314] +[group_10315] +[group_10316] +[group_10317] +[group_10318] +[group_10319] +[group_10320] +[group_10321] +[group_10322] +[group_10323] +[group_10324] +[group_10325] +[group_10326] +[group_10327] +[group_10328] +[group_10329] +[group_10330] +[group_10331] +[group_10332] +[group_10333] +[group_10334] +[group_10335] +[group_10336] +[group_10337] +[group_10338] +[group_10339] +[group_10340] +[group_10341] +[group_10342] +[group_10343] +[group_10344] +[group_10345] +[group_10346] +[group_10347] +[group_10348] +[group_10349] +[group_10350] +[group_10351] +[group_10352] +[group_10353] +[group_10354] +[group_10355] +[group_10356] +[group_10357] +[group_10358] +[group_10359] +[group_10360] +[group_10361] +[group_10362] +[group_10363] +[group_10364] +[group_10365] +[group_10366] +[group_10367] +[group_10368] +[group_10369] +[group_10370] +[group_10371] +[group_10372] +[group_10373] +[group_10374] +[group_10375] +[group_10376] +[group_10377] +[group_10378] +[group_10379] +[group_10380] +[group_10381] +[group_10382] +[group_10383] +[group_10384] +[group_10385] +[group_10386] +[group_10387] +[group_10388] +[group_10389] +[group_10390] +[group_10391] +[group_10392] +[group_10393] +[group_10394] +[group_10395] +[group_10396] +[group_10397] +[group_10398] +[group_10399] +[group_10400] +[group_10401] +[group_10402] +[group_10403] +[group_10404] +[group_10405] +[group_10406] +[group_10407] +[group_10408] +[group_10409] +[group_10410] +[group_10411] +[group_10412] +[group_10413] +[group_10414] +[group_10415] +[group_10416] +[group_10417] +[group_10418] +[group_10419] +[group_10420] +[group_10421] +[group_10422] +[group_10423] +[group_10424] +[group_10425] +[group_10426] +[group_10427] +[group_10428] +[group_10429] +[group_10430] +[group_10431] +[group_10432] +[group_10433] +[group_10434] +[group_10435] +[group_10436] +[group_10437] +[group_10438] +[group_10439] +[group_10440] +[group_10441] +[group_10442] +[group_10443] +[group_10444] +[group_10445] +[group_10446] +[group_10447] +[group_10448] +[group_10449] +[group_10450] +[group_10451] +[group_10452] +[group_10453] +[group_10454] +[group_10455] +[group_10456] +[group_10457] +[group_10458] +[group_10459] +[group_10460] +[group_10461] +[group_10462] +[group_10463] +[group_10464] +[group_10465] +[group_10466] +[group_10467] +[group_10468] +[group_10469] +[group_10470] +[group_10471] +[group_10472] +[group_10473] +[group_10474] +[group_10475] +[group_10476] +[group_10477] +[group_10478] +[group_10479] +[group_10480] +[group_10481] +[group_10482] +[group_10483] +[group_10484] +[group_10485] +[group_10486] +[group_10487] +[group_10488] +[group_10489] +[group_10490] +[group_10491] +[group_10492] +[group_10493] +[group_10494] +[group_10495] +[group_10496] +[group_10497] +[group_10498] +[group_10499] +[group_10500] +[group_10501] +[group_10502] +[group_10503] +[group_10504] +[group_10505] +[group_10506] +[group_10507] +[group_10508] +[group_10509] +[group_10510] +[group_10511] +[group_10512] +[group_10513] +[group_10514] +[group_10515] +[group_10516] +[group_10517] +[group_10518] +[group_10519] +[group_10520] +[group_10521] +[group_10522] +[group_10523] +[group_10524] +[group_10525] +[group_10526] +[group_10527] +[group_10528] +[group_10529] +[group_10530] +[group_10531] +[group_10532] +[group_10533] +[group_10534] +[group_10535] +[group_10536] +[group_10537] +[group_10538] +[group_10539] +[group_10540] +[group_10541] +[group_10542] +[group_10543] +[group_10544] +[group_10545] +[group_10546] +[group_10547] +[group_10548] +[group_10549] +[group_10550] +[group_10551] +[group_10552] +[group_10553] +[group_10554] +[group_10555] +[group_10556] +[group_10557] +[group_10558] +[group_10559] +[group_10560] +[group_10561] +[group_10562] +[group_10563] +[group_10564] +[group_10565] +[group_10566] +[group_10567] +[group_10568] +[group_10569] +[group_10570] +[group_10571] +[group_10572] +[group_10573] +[group_10574] +[group_10575] +[group_10576] +[group_10577] +[group_10578] +[group_10579] +[group_10580] +[group_10581] +[group_10582] +[group_10583] +[group_10584] +[group_10585] +[group_10586] +[group_10587] +[group_10588] +[group_10589] +[group_10590] +[group_10591] +[group_10592] +[group_10593] +[group_10594] +[group_10595] +[group_10596] +[group_10597] +[group_10598] +[group_10599] +[group_10600] +[group_10601] +[group_10602] +[group_10603] +[group_10604] +[group_10605] +[group_10606] +[group_10607] +[group_10608] +[group_10609] +[group_10610] +[group_10611] +[group_10612] +[group_10613] +[group_10614] +[group_10615] +[group_10616] +[group_10617] +[group_10618] +[group_10619] +[group_10620] +[group_10621] +[group_10622] +[group_10623] +[group_10624] +[group_10625] +[group_10626] +[group_10627] +[group_10628] +[group_10629] +[group_10630] +[group_10631] +[group_10632] +[group_10633] +[group_10634] +[group_10635] +[group_10636] +[group_10637] +[group_10638] +[group_10639] +[group_10640] +[group_10641] +[group_10642] +[group_10643] +[group_10644] +[group_10645] +[group_10646] +[group_10647] +[group_10648] +[group_10649] +[group_10650] +[group_10651] +[group_10652] +[group_10653] +[group_10654] +[group_10655] +[group_10656] +[group_10657] +[group_10658] +[group_10659] +[group_10660] +[group_10661] +[group_10662] +[group_10663] +[group_10664] +[group_10665] +[group_10666] +[group_10667] +[group_10668] +[group_10669] +[group_10670] +[group_10671] +[group_10672] +[group_10673] +[group_10674] +[group_10675] +[group_10676] +[group_10677] +[group_10678] +[group_10679] +[group_10680] +[group_10681] +[group_10682] +[group_10683] +[group_10684] +[group_10685] +[group_10686] +[group_10687] +[group_10688] +[group_10689] +[group_10690] +[group_10691] +[group_10692] +[group_10693] +[group_10694] +[group_10695] +[group_10696] +[group_10697] +[group_10698] +[group_10699] +[group_10700] +[group_10701] +[group_10702] +[group_10703] +[group_10704] +[group_10705] +[group_10706] +[group_10707] +[group_10708] +[group_10709] +[group_10710] +[group_10711] +[group_10712] +[group_10713] +[group_10714] +[group_10715] +[group_10716] +[group_10717] +[group_10718] +[group_10719] +[group_10720] +[group_10721] +[group_10722] +[group_10723] +[group_10724] +[group_10725] +[group_10726] +[group_10727] +[group_10728] +[group_10729] +[group_10730] +[group_10731] +[group_10732] +[group_10733] +[group_10734] +[group_10735] +[group_10736] +[group_10737] +[group_10738] +[group_10739] +[group_10740] +[group_10741] +[group_10742] +[group_10743] +[group_10744] +[group_10745] +[group_10746] +[group_10747] +[group_10748] +[group_10749] +[group_10750] +[group_10751] +[group_10752] +[group_10753] +[group_10754] +[group_10755] +[group_10756] +[group_10757] +[group_10758] +[group_10759] +[group_10760] +[group_10761] +[group_10762] +[group_10763] +[group_10764] +[group_10765] +[group_10766] +[group_10767] +[group_10768] +[group_10769] +[group_10770] +[group_10771] +[group_10772] +[group_10773] +[group_10774] +[group_10775] +[group_10776] +[group_10777] +[group_10778] +[group_10779] +[group_10780] +[group_10781] +[group_10782] +[group_10783] +[group_10784] +[group_10785] +[group_10786] +[group_10787] +[group_10788] +[group_10789] +[group_10790] +[group_10791] +[group_10792] +[group_10793] +[group_10794] +[group_10795] +[group_10796] +[group_10797] +[group_10798] +[group_10799] +[group_10800] +[group_10801] +[group_10802] +[group_10803] +[group_10804] +[group_10805] +[group_10806] +[group_10807] +[group_10808] +[group_10809] +[group_10810] +[group_10811] +[group_10812] +[group_10813] +[group_10814] +[group_10815] +[group_10816] +[group_10817] +[group_10818] +[group_10819] +[group_10820] +[group_10821] +[group_10822] +[group_10823] +[group_10824] +[group_10825] +[group_10826] +[group_10827] +[group_10828] +[group_10829] +[group_10830] +[group_10831] +[group_10832] +[group_10833] +[group_10834] +[group_10835] +[group_10836] +[group_10837] +[group_10838] +[group_10839] +[group_10840] +[group_10841] +[group_10842] +[group_10843] +[group_10844] +[group_10845] +[group_10846] +[group_10847] +[group_10848] +[group_10849] +[group_10850] +[group_10851] +[group_10852] +[group_10853] +[group_10854] +[group_10855] +[group_10856] +[group_10857] +[group_10858] +[group_10859] +[group_10860] +[group_10861] +[group_10862] +[group_10863] +[group_10864] +[group_10865] +[group_10866] +[group_10867] +[group_10868] +[group_10869] +[group_10870] +[group_10871] +[group_10872] +[group_10873] +[group_10874] +[group_10875] +[group_10876] +[group_10877] +[group_10878] +[group_10879] +[group_10880] +[group_10881] +[group_10882] +[group_10883] +[group_10884] +[group_10885] +[group_10886] +[group_10887] +[group_10888] +[group_10889] +[group_10890] +[group_10891] +[group_10892] +[group_10893] +[group_10894] +[group_10895] +[group_10896] +[group_10897] +[group_10898] +[group_10899] +[group_10900] +[group_10901] +[group_10902] +[group_10903] +[group_10904] +[group_10905] +[group_10906] +[group_10907] +[group_10908] +[group_10909] +[group_10910] +[group_10911] +[group_10912] +[group_10913] +[group_10914] +[group_10915] +[group_10916] +[group_10917] +[group_10918] +[group_10919] +[group_10920] +[group_10921] +[group_10922] +[group_10923] +[group_10924] +[group_10925] +[group_10926] +[group_10927] +[group_10928] +[group_10929] +[group_10930] +[group_10931] +[group_10932] +[group_10933] +[group_10934] +[group_10935] +[group_10936] +[group_10937] +[group_10938] +[group_10939] +[group_10940] +[group_10941] +[group_10942] +[group_10943] +[group_10944] +[group_10945] +[group_10946] +[group_10947] +[group_10948] +[group_10949] +[group_10950] +[group_10951] +[group_10952] +[group_10953] +[group_10954] +[group_10955] +[group_10956] +[group_10957] +[group_10958] +[group_10959] +[group_10960] +[group_10961] +[group_10962] +[group_10963] +[group_10964] +[group_10965] +[group_10966] +[group_10967] +[group_10968] +[group_10969] +[group_10970] +[group_10971] +[group_10972] +[group_10973] +[group_10974] +[group_10975] +[group_10976] +[group_10977] +[group_10978] +[group_10979] +[group_10980] +[group_10981] +[group_10982] +[group_10983] +[group_10984] +[group_10985] +[group_10986] +[group_10987] +[group_10988] +[group_10989] +[group_10990] +[group_10991] +[group_10992] +[group_10993] +[group_10994] +[group_10995] +[group_10996] +[group_10997] +[group_10998] +[group_10999] +[group_11000] +[group_11001] +[group_11002] +[group_11003] +[group_11004] +[group_11005] +[group_11006] +[group_11007] +[group_11008] +[group_11009] +[group_11010] +[group_11011] +[group_11012] +[group_11013] +[group_11014] +[group_11015] +[group_11016] +[group_11017] +[group_11018] +[group_11019] +[group_11020] +[group_11021] +[group_11022] +[group_11023] +[group_11024] +[group_11025] +[group_11026] +[group_11027] +[group_11028] +[group_11029] +[group_11030] +[group_11031] +[group_11032] +[group_11033] +[group_11034] +[group_11035] +[group_11036] +[group_11037] +[group_11038] +[group_11039] +[group_11040] +[group_11041] +[group_11042] +[group_11043] +[group_11044] +[group_11045] +[group_11046] +[group_11047] +[group_11048] +[group_11049] +[group_11050] +[group_11051] +[group_11052] +[group_11053] +[group_11054] +[group_11055] +[group_11056] +[group_11057] +[group_11058] +[group_11059] +[group_11060] +[group_11061] +[group_11062] +[group_11063] +[group_11064] +[group_11065] +[group_11066] +[group_11067] +[group_11068] +[group_11069] +[group_11070] +[group_11071] +[group_11072] +[group_11073] +[group_11074] +[group_11075] +[group_11076] +[group_11077] +[group_11078] +[group_11079] +[group_11080] +[group_11081] +[group_11082] +[group_11083] +[group_11084] +[group_11085] +[group_11086] +[group_11087] +[group_11088] +[group_11089] +[group_11090] +[group_11091] +[group_11092] +[group_11093] +[group_11094] +[group_11095] +[group_11096] +[group_11097] +[group_11098] +[group_11099] +[group_11100] +[group_11101] +[group_11102] +[group_11103] +[group_11104] +[group_11105] +[group_11106] +[group_11107] +[group_11108] +[group_11109] +[group_11110] +[group_11111] +[group_11112] +[group_11113] +[group_11114] +[group_11115] +[group_11116] +[group_11117] +[group_11118] +[group_11119] +[group_11120] +[group_11121] +[group_11122] +[group_11123] +[group_11124] +[group_11125] +[group_11126] +[group_11127] +[group_11128] +[group_11129] +[group_11130] +[group_11131] +[group_11132] +[group_11133] +[group_11134] +[group_11135] +[group_11136] +[group_11137] +[group_11138] +[group_11139] +[group_11140] +[group_11141] +[group_11142] +[group_11143] +[group_11144] +[group_11145] +[group_11146] +[group_11147] +[group_11148] +[group_11149] +[group_11150] +[group_11151] +[group_11152] +[group_11153] +[group_11154] +[group_11155] +[group_11156] +[group_11157] +[group_11158] +[group_11159] +[group_11160] +[group_11161] +[group_11162] +[group_11163] +[group_11164] +[group_11165] +[group_11166] +[group_11167] +[group_11168] +[group_11169] +[group_11170] +[group_11171] +[group_11172] +[group_11173] +[group_11174] +[group_11175] +[group_11176] +[group_11177] +[group_11178] +[group_11179] +[group_11180] +[group_11181] +[group_11182] +[group_11183] +[group_11184] +[group_11185] +[group_11186] +[group_11187] +[group_11188] +[group_11189] +[group_11190] +[group_11191] +[group_11192] +[group_11193] +[group_11194] +[group_11195] +[group_11196] +[group_11197] +[group_11198] +[group_11199] +[group_11200] +[group_11201] +[group_11202] +[group_11203] +[group_11204] +[group_11205] +[group_11206] +[group_11207] +[group_11208] +[group_11209] +[group_11210] +[group_11211] +[group_11212] +[group_11213] +[group_11214] +[group_11215] +[group_11216] +[group_11217] +[group_11218] +[group_11219] +[group_11220] +[group_11221] +[group_11222] +[group_11223] +[group_11224] +[group_11225] +[group_11226] +[group_11227] +[group_11228] +[group_11229] +[group_11230] +[group_11231] +[group_11232] +[group_11233] +[group_11234] +[group_11235] +[group_11236] +[group_11237] +[group_11238] +[group_11239] +[group_11240] +[group_11241] +[group_11242] +[group_11243] +[group_11244] +[group_11245] +[group_11246] +[group_11247] +[group_11248] +[group_11249] +[group_11250] +[group_11251] +[group_11252] +[group_11253] +[group_11254] +[group_11255] +[group_11256] +[group_11257] +[group_11258] +[group_11259] +[group_11260] +[group_11261] +[group_11262] +[group_11263] +[group_11264] +[group_11265] +[group_11266] +[group_11267] +[group_11268] +[group_11269] +[group_11270] +[group_11271] +[group_11272] +[group_11273] +[group_11274] +[group_11275] +[group_11276] +[group_11277] +[group_11278] +[group_11279] +[group_11280] +[group_11281] +[group_11282] +[group_11283] +[group_11284] +[group_11285] +[group_11286] +[group_11287] +[group_11288] +[group_11289] +[group_11290] +[group_11291] +[group_11292] +[group_11293] +[group_11294] +[group_11295] +[group_11296] +[group_11297] +[group_11298] +[group_11299] +[group_11300] +[group_11301] +[group_11302] +[group_11303] +[group_11304] +[group_11305] +[group_11306] +[group_11307] +[group_11308] +[group_11309] +[group_11310] +[group_11311] +[group_11312] +[group_11313] +[group_11314] +[group_11315] +[group_11316] +[group_11317] +[group_11318] +[group_11319] +[group_11320] +[group_11321] +[group_11322] +[group_11323] +[group_11324] +[group_11325] +[group_11326] +[group_11327] +[group_11328] +[group_11329] +[group_11330] +[group_11331] +[group_11332] +[group_11333] +[group_11334] +[group_11335] +[group_11336] +[group_11337] +[group_11338] +[group_11339] +[group_11340] +[group_11341] +[group_11342] +[group_11343] +[group_11344] +[group_11345] +[group_11346] +[group_11347] +[group_11348] +[group_11349] +[group_11350] +[group_11351] +[group_11352] +[group_11353] +[group_11354] +[group_11355] +[group_11356] +[group_11357] +[group_11358] +[group_11359] +[group_11360] +[group_11361] +[group_11362] +[group_11363] +[group_11364] +[group_11365] +[group_11366] +[group_11367] +[group_11368] +[group_11369] +[group_11370] +[group_11371] +[group_11372] +[group_11373] +[group_11374] +[group_11375] +[group_11376] +[group_11377] +[group_11378] +[group_11379] +[group_11380] +[group_11381] +[group_11382] +[group_11383] +[group_11384] +[group_11385] +[group_11386] +[group_11387] +[group_11388] +[group_11389] +[group_11390] +[group_11391] +[group_11392] +[group_11393] +[group_11394] +[group_11395] +[group_11396] +[group_11397] +[group_11398] +[group_11399] +[group_11400] +[group_11401] +[group_11402] +[group_11403] +[group_11404] +[group_11405] +[group_11406] +[group_11407] +[group_11408] +[group_11409] +[group_11410] +[group_11411] +[group_11412] +[group_11413] +[group_11414] +[group_11415] +[group_11416] +[group_11417] +[group_11418] +[group_11419] +[group_11420] +[group_11421] +[group_11422] +[group_11423] +[group_11424] +[group_11425] +[group_11426] +[group_11427] +[group_11428] +[group_11429] +[group_11430] +[group_11431] +[group_11432] +[group_11433] +[group_11434] +[group_11435] +[group_11436] +[group_11437] +[group_11438] +[group_11439] +[group_11440] +[group_11441] +[group_11442] +[group_11443] +[group_11444] +[group_11445] +[group_11446] +[group_11447] +[group_11448] +[group_11449] +[group_11450] +[group_11451] +[group_11452] +[group_11453] +[group_11454] +[group_11455] +[group_11456] +[group_11457] +[group_11458] +[group_11459] +[group_11460] +[group_11461] +[group_11462] +[group_11463] +[group_11464] +[group_11465] +[group_11466] +[group_11467] +[group_11468] +[group_11469] +[group_11470] +[group_11471] +[group_11472] +[group_11473] +[group_11474] +[group_11475] +[group_11476] +[group_11477] +[group_11478] +[group_11479] +[group_11480] +[group_11481] +[group_11482] +[group_11483] +[group_11484] +[group_11485] +[group_11486] +[group_11487] +[group_11488] +[group_11489] +[group_11490] +[group_11491] +[group_11492] +[group_11493] +[group_11494] +[group_11495] +[group_11496] +[group_11497] +[group_11498] +[group_11499] +[group_11500] +[group_11501] +[group_11502] +[group_11503] +[group_11504] +[group_11505] +[group_11506] +[group_11507] +[group_11508] +[group_11509] +[group_11510] +[group_11511] +[group_11512] +[group_11513] +[group_11514] +[group_11515] +[group_11516] +[group_11517] +[group_11518] +[group_11519] +[group_11520] +[group_11521] +[group_11522] +[group_11523] +[group_11524] +[group_11525] +[group_11526] +[group_11527] +[group_11528] +[group_11529] +[group_11530] +[group_11531] +[group_11532] +[group_11533] +[group_11534] +[group_11535] +[group_11536] +[group_11537] +[group_11538] +[group_11539] +[group_11540] +[group_11541] +[group_11542] +[group_11543] +[group_11544] +[group_11545] +[group_11546] +[group_11547] +[group_11548] +[group_11549] +[group_11550] +[group_11551] +[group_11552] +[group_11553] +[group_11554] +[group_11555] +[group_11556] +[group_11557] +[group_11558] +[group_11559] +[group_11560] +[group_11561] +[group_11562] +[group_11563] +[group_11564] +[group_11565] +[group_11566] +[group_11567] +[group_11568] +[group_11569] +[group_11570] +[group_11571] +[group_11572] +[group_11573] +[group_11574] +[group_11575] +[group_11576] +[group_11577] +[group_11578] +[group_11579] +[group_11580] +[group_11581] +[group_11582] +[group_11583] +[group_11584] +[group_11585] +[group_11586] +[group_11587] +[group_11588] +[group_11589] +[group_11590] +[group_11591] +[group_11592] +[group_11593] +[group_11594] +[group_11595] +[group_11596] +[group_11597] +[group_11598] +[group_11599] +[group_11600] +[group_11601] +[group_11602] +[group_11603] +[group_11604] +[group_11605] +[group_11606] +[group_11607] +[group_11608] +[group_11609] +[group_11610] +[group_11611] +[group_11612] +[group_11613] +[group_11614] +[group_11615] +[group_11616] +[group_11617] +[group_11618] +[group_11619] +[group_11620] +[group_11621] +[group_11622] +[group_11623] +[group_11624] +[group_11625] +[group_11626] +[group_11627] +[group_11628] +[group_11629] +[group_11630] +[group_11631] +[group_11632] +[group_11633] +[group_11634] +[group_11635] +[group_11636] +[group_11637] +[group_11638] +[group_11639] +[group_11640] +[group_11641] +[group_11642] +[group_11643] +[group_11644] +[group_11645] +[group_11646] +[group_11647] +[group_11648] +[group_11649] +[group_11650] +[group_11651] +[group_11652] +[group_11653] +[group_11654] +[group_11655] +[group_11656] +[group_11657] +[group_11658] +[group_11659] +[group_11660] +[group_11661] +[group_11662] +[group_11663] +[group_11664] +[group_11665] +[group_11666] +[group_11667] +[group_11668] +[group_11669] +[group_11670] +[group_11671] +[group_11672] +[group_11673] +[group_11674] +[group_11675] +[group_11676] +[group_11677] +[group_11678] +[group_11679] +[group_11680] +[group_11681] +[group_11682] +[group_11683] +[group_11684] +[group_11685] +[group_11686] +[group_11687] +[group_11688] +[group_11689] +[group_11690] +[group_11691] +[group_11692] +[group_11693] +[group_11694] +[group_11695] +[group_11696] +[group_11697] +[group_11698] +[group_11699] +[group_11700] +[group_11701] +[group_11702] +[group_11703] +[group_11704] +[group_11705] +[group_11706] +[group_11707] +[group_11708] +[group_11709] +[group_11710] +[group_11711] +[group_11712] +[group_11713] +[group_11714] +[group_11715] +[group_11716] +[group_11717] +[group_11718] +[group_11719] +[group_11720] +[group_11721] +[group_11722] +[group_11723] +[group_11724] +[group_11725] +[group_11726] +[group_11727] +[group_11728] +[group_11729] +[group_11730] +[group_11731] +[group_11732] +[group_11733] +[group_11734] +[group_11735] +[group_11736] +[group_11737] +[group_11738] +[group_11739] +[group_11740] +[group_11741] +[group_11742] +[group_11743] +[group_11744] +[group_11745] +[group_11746] +[group_11747] +[group_11748] +[group_11749] +[group_11750] +[group_11751] +[group_11752] +[group_11753] +[group_11754] +[group_11755] +[group_11756] +[group_11757] +[group_11758] +[group_11759] +[group_11760] +[group_11761] +[group_11762] +[group_11763] +[group_11764] +[group_11765] +[group_11766] +[group_11767] +[group_11768] +[group_11769] +[group_11770] +[group_11771] +[group_11772] +[group_11773] +[group_11774] +[group_11775] +[group_11776] +[group_11777] +[group_11778] +[group_11779] +[group_11780] +[group_11781] +[group_11782] +[group_11783] +[group_11784] +[group_11785] +[group_11786] +[group_11787] +[group_11788] +[group_11789] +[group_11790] +[group_11791] +[group_11792] +[group_11793] +[group_11794] +[group_11795] +[group_11796] +[group_11797] +[group_11798] +[group_11799] +[group_11800] +[group_11801] +[group_11802] +[group_11803] +[group_11804] +[group_11805] +[group_11806] +[group_11807] +[group_11808] +[group_11809] +[group_11810] +[group_11811] +[group_11812] +[group_11813] +[group_11814] +[group_11815] +[group_11816] +[group_11817] +[group_11818] +[group_11819] +[group_11820] +[group_11821] +[group_11822] +[group_11823] +[group_11824] +[group_11825] +[group_11826] +[group_11827] +[group_11828] +[group_11829] +[group_11830] +[group_11831] +[group_11832] +[group_11833] +[group_11834] +[group_11835] +[group_11836] +[group_11837] +[group_11838] +[group_11839] +[group_11840] +[group_11841] +[group_11842] +[group_11843] +[group_11844] +[group_11845] +[group_11846] +[group_11847] +[group_11848] +[group_11849] +[group_11850] +[group_11851] +[group_11852] +[group_11853] +[group_11854] +[group_11855] +[group_11856] +[group_11857] +[group_11858] +[group_11859] +[group_11860] +[group_11861] +[group_11862] +[group_11863] +[group_11864] +[group_11865] +[group_11866] +[group_11867] +[group_11868] +[group_11869] +[group_11870] +[group_11871] +[group_11872] +[group_11873] +[group_11874] +[group_11875] +[group_11876] +[group_11877] +[group_11878] +[group_11879] +[group_11880] +[group_11881] +[group_11882] +[group_11883] +[group_11884] +[group_11885] +[group_11886] +[group_11887] +[group_11888] +[group_11889] +[group_11890] +[group_11891] +[group_11892] +[group_11893] +[group_11894] +[group_11895] +[group_11896] +[group_11897] +[group_11898] +[group_11899] +[group_11900] +[group_11901] +[group_11902] +[group_11903] +[group_11904] +[group_11905] +[group_11906] +[group_11907] +[group_11908] +[group_11909] +[group_11910] +[group_11911] +[group_11912] +[group_11913] +[group_11914] +[group_11915] +[group_11916] +[group_11917] +[group_11918] +[group_11919] +[group_11920] +[group_11921] +[group_11922] +[group_11923] +[group_11924] +[group_11925] +[group_11926] +[group_11927] +[group_11928] +[group_11929] +[group_11930] +[group_11931] +[group_11932] +[group_11933] +[group_11934] +[group_11935] +[group_11936] +[group_11937] +[group_11938] +[group_11939] +[group_11940] +[group_11941] +[group_11942] +[group_11943] +[group_11944] +[group_11945] +[group_11946] +[group_11947] +[group_11948] +[group_11949] +[group_11950] +[group_11951] +[group_11952] +[group_11953] +[group_11954] +[group_11955] +[group_11956] +[group_11957] +[group_11958] +[group_11959] +[group_11960] +[group_11961] +[group_11962] +[group_11963] +[group_11964] +[group_11965] +[group_11966] +[group_11967] +[group_11968] +[group_11969] +[group_11970] +[group_11971] +[group_11972] +[group_11973] +[group_11974] +[group_11975] +[group_11976] +[group_11977] +[group_11978] +[group_11979] +[group_11980] +[group_11981] +[group_11982] +[group_11983] +[group_11984] +[group_11985] +[group_11986] +[group_11987] +[group_11988] +[group_11989] +[group_11990] +[group_11991] +[group_11992] +[group_11993] +[group_11994] +[group_11995] +[group_11996] +[group_11997] +[group_11998] +[group_11999] +[group_12000] +[group_12001] +[group_12002] +[group_12003] +[group_12004] +[group_12005] +[group_12006] +[group_12007] +[group_12008] +[group_12009] +[group_12010] +[group_12011] +[group_12012] +[group_12013] +[group_12014] +[group_12015] +[group_12016] +[group_12017] +[group_12018] +[group_12019] +[group_12020] +[group_12021] +[group_12022] +[group_12023] +[group_12024] +[group_12025] +[group_12026] +[group_12027] +[group_12028] +[group_12029] +[group_12030] +[group_12031] +[group_12032] +[group_12033] +[group_12034] +[group_12035] +[group_12036] +[group_12037] +[group_12038] +[group_12039] +[group_12040] +[group_12041] +[group_12042] +[group_12043] +[group_12044] +[group_12045] +[group_12046] +[group_12047] +[group_12048] +[group_12049] +[group_12050] +[group_12051] +[group_12052] +[group_12053] +[group_12054] +[group_12055] +[group_12056] +[group_12057] +[group_12058] +[group_12059] +[group_12060] +[group_12061] +[group_12062] +[group_12063] +[group_12064] +[group_12065] +[group_12066] +[group_12067] +[group_12068] +[group_12069] +[group_12070] +[group_12071] +[group_12072] +[group_12073] +[group_12074] +[group_12075] +[group_12076] +[group_12077] +[group_12078] +[group_12079] +[group_12080] +[group_12081] +[group_12082] +[group_12083] +[group_12084] +[group_12085] +[group_12086] +[group_12087] +[group_12088] +[group_12089] +[group_12090] +[group_12091] +[group_12092] +[group_12093] +[group_12094] +[group_12095] +[group_12096] +[group_12097] +[group_12098] +[group_12099] +[group_12100] +[group_12101] +[group_12102] +[group_12103] +[group_12104] +[group_12105] +[group_12106] +[group_12107] +[group_12108] +[group_12109] +[group_12110] +[group_12111] +[group_12112] +[group_12113] +[group_12114] +[group_12115] +[group_12116] +[group_12117] +[group_12118] +[group_12119] +[group_12120] +[group_12121] +[group_12122] +[group_12123] +[group_12124] +[group_12125] +[group_12126] +[group_12127] +[group_12128] +[group_12129] +[group_12130] +[group_12131] +[group_12132] +[group_12133] +[group_12134] +[group_12135] +[group_12136] +[group_12137] +[group_12138] +[group_12139] +[group_12140] +[group_12141] +[group_12142] +[group_12143] +[group_12144] +[group_12145] +[group_12146] +[group_12147] +[group_12148] +[group_12149] +[group_12150] +[group_12151] +[group_12152] +[group_12153] +[group_12154] +[group_12155] +[group_12156] +[group_12157] +[group_12158] +[group_12159] +[group_12160] +[group_12161] +[group_12162] +[group_12163] +[group_12164] +[group_12165] +[group_12166] +[group_12167] +[group_12168] +[group_12169] +[group_12170] +[group_12171] +[group_12172] +[group_12173] +[group_12174] +[group_12175] +[group_12176] +[group_12177] +[group_12178] +[group_12179] +[group_12180] +[group_12181] +[group_12182] +[group_12183] +[group_12184] +[group_12185] +[group_12186] +[group_12187] +[group_12188] +[group_12189] +[group_12190] +[group_12191] +[group_12192] +[group_12193] +[group_12194] +[group_12195] +[group_12196] +[group_12197] +[group_12198] +[group_12199] +[group_12200] +[group_12201] +[group_12202] +[group_12203] +[group_12204] +[group_12205] +[group_12206] +[group_12207] +[group_12208] +[group_12209] +[group_12210] +[group_12211] +[group_12212] +[group_12213] +[group_12214] +[group_12215] +[group_12216] +[group_12217] +[group_12218] +[group_12219] +[group_12220] +[group_12221] +[group_12222] +[group_12223] +[group_12224] +[group_12225] +[group_12226] +[group_12227] +[group_12228] +[group_12229] +[group_12230] +[group_12231] +[group_12232] +[group_12233] +[group_12234] +[group_12235] +[group_12236] +[group_12237] +[group_12238] +[group_12239] +[group_12240] +[group_12241] +[group_12242] +[group_12243] +[group_12244] +[group_12245] +[group_12246] +[group_12247] +[group_12248] +[group_12249] +[group_12250] +[group_12251] +[group_12252] +[group_12253] +[group_12254] +[group_12255] +[group_12256] +[group_12257] +[group_12258] +[group_12259] +[group_12260] +[group_12261] +[group_12262] +[group_12263] +[group_12264] +[group_12265] +[group_12266] +[group_12267] +[group_12268] +[group_12269] +[group_12270] +[group_12271] +[group_12272] +[group_12273] +[group_12274] +[group_12275] +[group_12276] +[group_12277] +[group_12278] +[group_12279] +[group_12280] +[group_12281] +[group_12282] +[group_12283] +[group_12284] +[group_12285] +[group_12286] +[group_12287] +[group_12288] +[group_12289] +[group_12290] +[group_12291] +[group_12292] +[group_12293] +[group_12294] +[group_12295] +[group_12296] +[group_12297] +[group_12298] +[group_12299] +[group_12300] +[group_12301] +[group_12302] +[group_12303] +[group_12304] +[group_12305] +[group_12306] +[group_12307] +[group_12308] +[group_12309] +[group_12310] +[group_12311] +[group_12312] +[group_12313] +[group_12314] +[group_12315] +[group_12316] +[group_12317] +[group_12318] +[group_12319] +[group_12320] +[group_12321] +[group_12322] +[group_12323] +[group_12324] +[group_12325] +[group_12326] +[group_12327] +[group_12328] +[group_12329] +[group_12330] +[group_12331] +[group_12332] +[group_12333] +[group_12334] +[group_12335] +[group_12336] +[group_12337] +[group_12338] +[group_12339] +[group_12340] +[group_12341] +[group_12342] +[group_12343] +[group_12344] +[group_12345] +[group_12346] +[group_12347] +[group_12348] +[group_12349] +[group_12350] +[group_12351] +[group_12352] +[group_12353] +[group_12354] +[group_12355] +[group_12356] +[group_12357] +[group_12358] +[group_12359] +[group_12360] +[group_12361] +[group_12362] +[group_12363] +[group_12364] +[group_12365] +[group_12366] +[group_12367] +[group_12368] +[group_12369] +[group_12370] +[group_12371] +[group_12372] +[group_12373] +[group_12374] +[group_12375] +[group_12376] +[group_12377] +[group_12378] +[group_12379] +[group_12380] +[group_12381] +[group_12382] +[group_12383] +[group_12384] +[group_12385] +[group_12386] +[group_12387] +[group_12388] +[group_12389] +[group_12390] +[group_12391] +[group_12392] +[group_12393] +[group_12394] +[group_12395] +[group_12396] +[group_12397] +[group_12398] +[group_12399] +[group_12400] +[group_12401] +[group_12402] +[group_12403] +[group_12404] +[group_12405] +[group_12406] +[group_12407] +[group_12408] +[group_12409] +[group_12410] +[group_12411] +[group_12412] +[group_12413] +[group_12414] +[group_12415] +[group_12416] +[group_12417] +[group_12418] +[group_12419] +[group_12420] +[group_12421] +[group_12422] +[group_12423] +[group_12424] +[group_12425] +[group_12426] +[group_12427] +[group_12428] +[group_12429] +[group_12430] +[group_12431] +[group_12432] +[group_12433] +[group_12434] +[group_12435] +[group_12436] +[group_12437] +[group_12438] +[group_12439] +[group_12440] +[group_12441] +[group_12442] +[group_12443] +[group_12444] +[group_12445] +[group_12446] +[group_12447] +[group_12448] +[group_12449] +[group_12450] +[group_12451] +[group_12452] +[group_12453] +[group_12454] +[group_12455] +[group_12456] +[group_12457] +[group_12458] +[group_12459] +[group_12460] +[group_12461] +[group_12462] +[group_12463] +[group_12464] +[group_12465] +[group_12466] +[group_12467] +[group_12468] +[group_12469] +[group_12470] +[group_12471] +[group_12472] +[group_12473] +[group_12474] +[group_12475] +[group_12476] +[group_12477] +[group_12478] +[group_12479] +[group_12480] +[group_12481] +[group_12482] +[group_12483] +[group_12484] +[group_12485] +[group_12486] +[group_12487] +[group_12488] +[group_12489] +[group_12490] +[group_12491] +[group_12492] +[group_12493] +[group_12494] +[group_12495] +[group_12496] +[group_12497] +[group_12498] +[group_12499] +[group_12500] +[group_12501] +[group_12502] +[group_12503] +[group_12504] +[group_12505] +[group_12506] +[group_12507] +[group_12508] +[group_12509] +[group_12510] +[group_12511] +[group_12512] +[group_12513] +[group_12514] +[group_12515] +[group_12516] +[group_12517] +[group_12518] +[group_12519] +[group_12520] +[group_12521] +[group_12522] +[group_12523] +[group_12524] +[group_12525] +[group_12526] +[group_12527] +[group_12528] +[group_12529] +[group_12530] +[group_12531] +[group_12532] +[group_12533] +[group_12534] +[group_12535] +[group_12536] +[group_12537] +[group_12538] +[group_12539] +[group_12540] +[group_12541] +[group_12542] +[group_12543] +[group_12544] +[group_12545] +[group_12546] +[group_12547] +[group_12548] +[group_12549] +[group_12550] +[group_12551] +[group_12552] +[group_12553] +[group_12554] +[group_12555] +[group_12556] +[group_12557] +[group_12558] +[group_12559] +[group_12560] +[group_12561] +[group_12562] +[group_12563] +[group_12564] +[group_12565] +[group_12566] +[group_12567] +[group_12568] +[group_12569] +[group_12570] +[group_12571] +[group_12572] +[group_12573] +[group_12574] +[group_12575] +[group_12576] +[group_12577] +[group_12578] +[group_12579] +[group_12580] +[group_12581] +[group_12582] +[group_12583] +[group_12584] +[group_12585] +[group_12586] +[group_12587] +[group_12588] +[group_12589] +[group_12590] +[group_12591] +[group_12592] +[group_12593] +[group_12594] +[group_12595] +[group_12596] +[group_12597] +[group_12598] +[group_12599] +[group_12600] +[group_12601] +[group_12602] +[group_12603] +[group_12604] +[group_12605] +[group_12606] +[group_12607] +[group_12608] +[group_12609] +[group_12610] +[group_12611] +[group_12612] +[group_12613] +[group_12614] +[group_12615] +[group_12616] +[group_12617] +[group_12618] +[group_12619] +[group_12620] +[group_12621] +[group_12622] +[group_12623] +[group_12624] +[group_12625] +[group_12626] +[group_12627] +[group_12628] +[group_12629] +[group_12630] +[group_12631] +[group_12632] +[group_12633] +[group_12634] +[group_12635] +[group_12636] +[group_12637] +[group_12638] +[group_12639] +[group_12640] +[group_12641] +[group_12642] +[group_12643] +[group_12644] +[group_12645] +[group_12646] +[group_12647] +[group_12648] +[group_12649] +[group_12650] +[group_12651] +[group_12652] +[group_12653] +[group_12654] +[group_12655] +[group_12656] +[group_12657] +[group_12658] +[group_12659] +[group_12660] +[group_12661] +[group_12662] +[group_12663] +[group_12664] +[group_12665] +[group_12666] +[group_12667] +[group_12668] +[group_12669] +[group_12670] +[group_12671] +[group_12672] +[group_12673] +[group_12674] +[group_12675] +[group_12676] +[group_12677] +[group_12678] +[group_12679] +[group_12680] +[group_12681] +[group_12682] +[group_12683] +[group_12684] +[group_12685] +[group_12686] +[group_12687] +[group_12688] +[group_12689] +[group_12690] +[group_12691] +[group_12692] +[group_12693] +[group_12694] +[group_12695] +[group_12696] +[group_12697] +[group_12698] +[group_12699] +[group_12700] +[group_12701] +[group_12702] +[group_12703] +[group_12704] +[group_12705] +[group_12706] +[group_12707] +[group_12708] +[group_12709] +[group_12710] +[group_12711] +[group_12712] +[group_12713] +[group_12714] +[group_12715] +[group_12716] +[group_12717] +[group_12718] +[group_12719] +[group_12720] +[group_12721] +[group_12722] +[group_12723] +[group_12724] +[group_12725] +[group_12726] +[group_12727] +[group_12728] +[group_12729] +[group_12730] +[group_12731] +[group_12732] +[group_12733] +[group_12734] +[group_12735] +[group_12736] +[group_12737] +[group_12738] +[group_12739] +[group_12740] +[group_12741] +[group_12742] +[group_12743] +[group_12744] +[group_12745] +[group_12746] +[group_12747] +[group_12748] +[group_12749] +[group_12750] +[group_12751] +[group_12752] +[group_12753] +[group_12754] +[group_12755] +[group_12756] +[group_12757] +[group_12758] +[group_12759] +[group_12760] +[group_12761] +[group_12762] +[group_12763] +[group_12764] +[group_12765] +[group_12766] +[group_12767] +[group_12768] +[group_12769] +[group_12770] +[group_12771] +[group_12772] +[group_12773] +[group_12774] +[group_12775] +[group_12776] +[group_12777] +[group_12778] +[group_12779] +[group_12780] +[group_12781] +[group_12782] +[group_12783] +[group_12784] +[group_12785] +[group_12786] +[group_12787] +[group_12788] +[group_12789] +[group_12790] +[group_12791] +[group_12792] +[group_12793] +[group_12794] +[group_12795] +[group_12796] +[group_12797] +[group_12798] +[group_12799] +[group_12800] +[group_12801] +[group_12802] +[group_12803] +[group_12804] +[group_12805] +[group_12806] +[group_12807] +[group_12808] +[group_12809] +[group_12810] +[group_12811] +[group_12812] +[group_12813] +[group_12814] +[group_12815] +[group_12816] +[group_12817] +[group_12818] +[group_12819] +[group_12820] +[group_12821] +[group_12822] +[group_12823] +[group_12824] +[group_12825] +[group_12826] +[group_12827] +[group_12828] +[group_12829] +[group_12830] +[group_12831] +[group_12832] +[group_12833] +[group_12834] +[group_12835] +[group_12836] +[group_12837] +[group_12838] +[group_12839] +[group_12840] +[group_12841] +[group_12842] +[group_12843] +[group_12844] +[group_12845] +[group_12846] +[group_12847] +[group_12848] +[group_12849] +[group_12850] +[group_12851] +[group_12852] +[group_12853] +[group_12854] +[group_12855] +[group_12856] +[group_12857] +[group_12858] +[group_12859] +[group_12860] +[group_12861] +[group_12862] +[group_12863] +[group_12864] +[group_12865] +[group_12866] +[group_12867] +[group_12868] +[group_12869] +[group_12870] +[group_12871] +[group_12872] +[group_12873] +[group_12874] +[group_12875] +[group_12876] +[group_12877] +[group_12878] +[group_12879] +[group_12880] +[group_12881] +[group_12882] +[group_12883] +[group_12884] +[group_12885] +[group_12886] +[group_12887] +[group_12888] +[group_12889] +[group_12890] +[group_12891] +[group_12892] +[group_12893] +[group_12894] +[group_12895] +[group_12896] +[group_12897] +[group_12898] +[group_12899] +[group_12900] +[group_12901] +[group_12902] +[group_12903] +[group_12904] +[group_12905] +[group_12906] +[group_12907] +[group_12908] +[group_12909] +[group_12910] +[group_12911] +[group_12912] +[group_12913] +[group_12914] +[group_12915] +[group_12916] +[group_12917] +[group_12918] +[group_12919] +[group_12920] +[group_12921] +[group_12922] +[group_12923] +[group_12924] +[group_12925] +[group_12926] +[group_12927] +[group_12928] +[group_12929] +[group_12930] +[group_12931] +[group_12932] +[group_12933] +[group_12934] +[group_12935] +[group_12936] +[group_12937] +[group_12938] +[group_12939] +[group_12940] +[group_12941] +[group_12942] +[group_12943] +[group_12944] +[group_12945] +[group_12946] +[group_12947] +[group_12948] +[group_12949] +[group_12950] +[group_12951] +[group_12952] +[group_12953] +[group_12954] +[group_12955] +[group_12956] +[group_12957] +[group_12958] +[group_12959] +[group_12960] +[group_12961] +[group_12962] +[group_12963] +[group_12964] +[group_12965] +[group_12966] +[group_12967] +[group_12968] +[group_12969] +[group_12970] +[group_12971] +[group_12972] +[group_12973] +[group_12974] +[group_12975] +[group_12976] +[group_12977] +[group_12978] +[group_12979] +[group_12980] +[group_12981] +[group_12982] +[group_12983] +[group_12984] +[group_12985] +[group_12986] +[group_12987] +[group_12988] +[group_12989] +[group_12990] +[group_12991] +[group_12992] +[group_12993] +[group_12994] +[group_12995] +[group_12996] +[group_12997] +[group_12998] +[group_12999] +[group_13000] +[group_13001] +[group_13002] +[group_13003] +[group_13004] +[group_13005] +[group_13006] +[group_13007] +[group_13008] +[group_13009] +[group_13010] +[group_13011] +[group_13012] +[group_13013] +[group_13014] +[group_13015] +[group_13016] +[group_13017] +[group_13018] +[group_13019] +[group_13020] +[group_13021] +[group_13022] +[group_13023] +[group_13024] +[group_13025] +[group_13026] +[group_13027] +[group_13028] +[group_13029] +[group_13030] +[group_13031] +[group_13032] +[group_13033] +[group_13034] +[group_13035] +[group_13036] +[group_13037] +[group_13038] +[group_13039] +[group_13040] +[group_13041] +[group_13042] +[group_13043] +[group_13044] +[group_13045] +[group_13046] +[group_13047] +[group_13048] +[group_13049] +[group_13050] +[group_13051] +[group_13052] +[group_13053] +[group_13054] +[group_13055] +[group_13056] +[group_13057] +[group_13058] +[group_13059] +[group_13060] +[group_13061] +[group_13062] +[group_13063] +[group_13064] +[group_13065] +[group_13066] +[group_13067] +[group_13068] +[group_13069] +[group_13070] +[group_13071] +[group_13072] +[group_13073] +[group_13074] +[group_13075] +[group_13076] +[group_13077] +[group_13078] +[group_13079] +[group_13080] +[group_13081] +[group_13082] +[group_13083] +[group_13084] +[group_13085] +[group_13086] +[group_13087] +[group_13088] +[group_13089] +[group_13090] +[group_13091] +[group_13092] +[group_13093] +[group_13094] +[group_13095] +[group_13096] +[group_13097] +[group_13098] +[group_13099] +[group_13100] +[group_13101] +[group_13102] +[group_13103] +[group_13104] +[group_13105] +[group_13106] +[group_13107] +[group_13108] +[group_13109] +[group_13110] +[group_13111] +[group_13112] +[group_13113] +[group_13114] +[group_13115] +[group_13116] +[group_13117] +[group_13118] +[group_13119] +[group_13120] +[group_13121] +[group_13122] +[group_13123] +[group_13124] +[group_13125] +[group_13126] +[group_13127] +[group_13128] +[group_13129] +[group_13130] +[group_13131] +[group_13132] +[group_13133] +[group_13134] +[group_13135] +[group_13136] +[group_13137] +[group_13138] +[group_13139] +[group_13140] +[group_13141] +[group_13142] +[group_13143] +[group_13144] +[group_13145] +[group_13146] +[group_13147] +[group_13148] +[group_13149] +[group_13150] +[group_13151] +[group_13152] +[group_13153] +[group_13154] +[group_13155] +[group_13156] +[group_13157] +[group_13158] +[group_13159] +[group_13160] +[group_13161] +[group_13162] +[group_13163] +[group_13164] +[group_13165] +[group_13166] +[group_13167] +[group_13168] +[group_13169] +[group_13170] +[group_13171] +[group_13172] +[group_13173] +[group_13174] +[group_13175] +[group_13176] +[group_13177] +[group_13178] +[group_13179] +[group_13180] +[group_13181] +[group_13182] +[group_13183] +[group_13184] +[group_13185] +[group_13186] +[group_13187] +[group_13188] +[group_13189] +[group_13190] +[group_13191] +[group_13192] +[group_13193] +[group_13194] +[group_13195] +[group_13196] +[group_13197] +[group_13198] +[group_13199] +[group_13200] +[group_13201] +[group_13202] +[group_13203] +[group_13204] +[group_13205] +[group_13206] +[group_13207] +[group_13208] +[group_13209] +[group_13210] +[group_13211] +[group_13212] +[group_13213] +[group_13214] +[group_13215] +[group_13216] +[group_13217] +[group_13218] +[group_13219] +[group_13220] +[group_13221] +[group_13222] +[group_13223] +[group_13224] +[group_13225] +[group_13226] +[group_13227] +[group_13228] +[group_13229] +[group_13230] +[group_13231] +[group_13232] +[group_13233] +[group_13234] +[group_13235] +[group_13236] +[group_13237] +[group_13238] +[group_13239] +[group_13240] +[group_13241] +[group_13242] +[group_13243] +[group_13244] +[group_13245] +[group_13246] +[group_13247] +[group_13248] +[group_13249] +[group_13250] +[group_13251] +[group_13252] +[group_13253] +[group_13254] +[group_13255] +[group_13256] +[group_13257] +[group_13258] +[group_13259] +[group_13260] +[group_13261] +[group_13262] +[group_13263] +[group_13264] +[group_13265] +[group_13266] +[group_13267] +[group_13268] +[group_13269] +[group_13270] +[group_13271] +[group_13272] +[group_13273] +[group_13274] +[group_13275] +[group_13276] +[group_13277] +[group_13278] +[group_13279] +[group_13280] +[group_13281] +[group_13282] +[group_13283] +[group_13284] +[group_13285] +[group_13286] +[group_13287] +[group_13288] +[group_13289] +[group_13290] +[group_13291] +[group_13292] +[group_13293] +[group_13294] +[group_13295] +[group_13296] +[group_13297] +[group_13298] +[group_13299] +[group_13300] +[group_13301] +[group_13302] +[group_13303] +[group_13304] +[group_13305] +[group_13306] +[group_13307] +[group_13308] +[group_13309] +[group_13310] +[group_13311] +[group_13312] +[group_13313] +[group_13314] +[group_13315] +[group_13316] +[group_13317] +[group_13318] +[group_13319] +[group_13320] +[group_13321] +[group_13322] +[group_13323] +[group_13324] +[group_13325] +[group_13326] +[group_13327] +[group_13328] +[group_13329] +[group_13330] +[group_13331] +[group_13332] +[group_13333] +[group_13334] +[group_13335] +[group_13336] +[group_13337] +[group_13338] +[group_13339] +[group_13340] +[group_13341] +[group_13342] +[group_13343] +[group_13344] +[group_13345] +[group_13346] +[group_13347] +[group_13348] +[group_13349] +[group_13350] +[group_13351] +[group_13352] +[group_13353] +[group_13354] +[group_13355] +[group_13356] +[group_13357] +[group_13358] +[group_13359] +[group_13360] +[group_13361] +[group_13362] +[group_13363] +[group_13364] +[group_13365] +[group_13366] +[group_13367] +[group_13368] +[group_13369] +[group_13370] +[group_13371] +[group_13372] +[group_13373] +[group_13374] +[group_13375] +[group_13376] +[group_13377] +[group_13378] +[group_13379] +[group_13380] +[group_13381] +[group_13382] +[group_13383] +[group_13384] +[group_13385] +[group_13386] +[group_13387] +[group_13388] +[group_13389] +[group_13390] +[group_13391] +[group_13392] +[group_13393] +[group_13394] +[group_13395] +[group_13396] +[group_13397] +[group_13398] +[group_13399] +[group_13400] +[group_13401] +[group_13402] +[group_13403] +[group_13404] +[group_13405] +[group_13406] +[group_13407] +[group_13408] +[group_13409] +[group_13410] +[group_13411] +[group_13412] +[group_13413] +[group_13414] +[group_13415] +[group_13416] +[group_13417] +[group_13418] +[group_13419] +[group_13420] +[group_13421] +[group_13422] +[group_13423] +[group_13424] +[group_13425] +[group_13426] +[group_13427] +[group_13428] +[group_13429] +[group_13430] +[group_13431] +[group_13432] +[group_13433] +[group_13434] +[group_13435] +[group_13436] +[group_13437] +[group_13438] +[group_13439] +[group_13440] +[group_13441] +[group_13442] +[group_13443] +[group_13444] +[group_13445] +[group_13446] +[group_13447] +[group_13448] +[group_13449] +[group_13450] +[group_13451] +[group_13452] +[group_13453] +[group_13454] +[group_13455] +[group_13456] +[group_13457] +[group_13458] +[group_13459] +[group_13460] +[group_13461] +[group_13462] +[group_13463] +[group_13464] +[group_13465] +[group_13466] +[group_13467] +[group_13468] +[group_13469] +[group_13470] +[group_13471] +[group_13472] +[group_13473] +[group_13474] +[group_13475] +[group_13476] +[group_13477] +[group_13478] +[group_13479] +[group_13480] +[group_13481] +[group_13482] +[group_13483] +[group_13484] +[group_13485] +[group_13486] +[group_13487] +[group_13488] +[group_13489] +[group_13490] +[group_13491] +[group_13492] +[group_13493] +[group_13494] +[group_13495] +[group_13496] +[group_13497] +[group_13498] +[group_13499] +[group_13500] +[group_13501] +[group_13502] +[group_13503] +[group_13504] +[group_13505] +[group_13506] +[group_13507] +[group_13508] +[group_13509] +[group_13510] +[group_13511] +[group_13512] +[group_13513] +[group_13514] +[group_13515] +[group_13516] +[group_13517] +[group_13518] +[group_13519] +[group_13520] +[group_13521] +[group_13522] +[group_13523] +[group_13524] +[group_13525] +[group_13526] +[group_13527] +[group_13528] +[group_13529] +[group_13530] +[group_13531] +[group_13532] +[group_13533] +[group_13534] +[group_13535] +[group_13536] +[group_13537] +[group_13538] +[group_13539] +[group_13540] +[group_13541] +[group_13542] +[group_13543] +[group_13544] +[group_13545] +[group_13546] +[group_13547] +[group_13548] +[group_13549] +[group_13550] +[group_13551] +[group_13552] +[group_13553] +[group_13554] +[group_13555] +[group_13556] +[group_13557] +[group_13558] +[group_13559] +[group_13560] +[group_13561] +[group_13562] +[group_13563] +[group_13564] +[group_13565] +[group_13566] +[group_13567] +[group_13568] +[group_13569] +[group_13570] +[group_13571] +[group_13572] +[group_13573] +[group_13574] +[group_13575] +[group_13576] +[group_13577] +[group_13578] +[group_13579] +[group_13580] +[group_13581] +[group_13582] +[group_13583] +[group_13584] +[group_13585] +[group_13586] +[group_13587] +[group_13588] +[group_13589] +[group_13590] +[group_13591] +[group_13592] +[group_13593] +[group_13594] +[group_13595] +[group_13596] +[group_13597] +[group_13598] +[group_13599] +[group_13600] +[group_13601] +[group_13602] +[group_13603] +[group_13604] +[group_13605] +[group_13606] +[group_13607] +[group_13608] +[group_13609] +[group_13610] +[group_13611] +[group_13612] +[group_13613] +[group_13614] +[group_13615] +[group_13616] +[group_13617] +[group_13618] +[group_13619] +[group_13620] +[group_13621] +[group_13622] +[group_13623] +[group_13624] +[group_13625] +[group_13626] +[group_13627] +[group_13628] +[group_13629] +[group_13630] +[group_13631] +[group_13632] +[group_13633] +[group_13634] +[group_13635] +[group_13636] +[group_13637] +[group_13638] +[group_13639] +[group_13640] +[group_13641] +[group_13642] +[group_13643] +[group_13644] +[group_13645] +[group_13646] +[group_13647] +[group_13648] +[group_13649] +[group_13650] +[group_13651] +[group_13652] +[group_13653] +[group_13654] +[group_13655] +[group_13656] +[group_13657] +[group_13658] +[group_13659] +[group_13660] +[group_13661] +[group_13662] +[group_13663] +[group_13664] +[group_13665] +[group_13666] +[group_13667] +[group_13668] +[group_13669] +[group_13670] +[group_13671] +[group_13672] +[group_13673] +[group_13674] +[group_13675] +[group_13676] +[group_13677] +[group_13678] +[group_13679] +[group_13680] +[group_13681] +[group_13682] +[group_13683] +[group_13684] +[group_13685] +[group_13686] +[group_13687] +[group_13688] +[group_13689] +[group_13690] +[group_13691] +[group_13692] +[group_13693] +[group_13694] +[group_13695] +[group_13696] +[group_13697] +[group_13698] +[group_13699] +[group_13700] +[group_13701] +[group_13702] +[group_13703] +[group_13704] +[group_13705] +[group_13706] +[group_13707] +[group_13708] +[group_13709] +[group_13710] +[group_13711] +[group_13712] +[group_13713] +[group_13714] +[group_13715] +[group_13716] +[group_13717] +[group_13718] +[group_13719] +[group_13720] +[group_13721] +[group_13722] +[group_13723] +[group_13724] +[group_13725] +[group_13726] +[group_13727] +[group_13728] +[group_13729] +[group_13730] +[group_13731] +[group_13732] +[group_13733] +[group_13734] +[group_13735] +[group_13736] +[group_13737] +[group_13738] +[group_13739] +[group_13740] +[group_13741] +[group_13742] +[group_13743] +[group_13744] +[group_13745] +[group_13746] +[group_13747] +[group_13748] +[group_13749] +[group_13750] +[group_13751] +[group_13752] +[group_13753] +[group_13754] +[group_13755] +[group_13756] +[group_13757] +[group_13758] +[group_13759] +[group_13760] +[group_13761] +[group_13762] +[group_13763] +[group_13764] +[group_13765] +[group_13766] +[group_13767] +[group_13768] +[group_13769] +[group_13770] +[group_13771] +[group_13772] +[group_13773] +[group_13774] +[group_13775] +[group_13776] +[group_13777] +[group_13778] +[group_13779] +[group_13780] +[group_13781] +[group_13782] +[group_13783] +[group_13784] +[group_13785] +[group_13786] +[group_13787] +[group_13788] +[group_13789] +[group_13790] +[group_13791] +[group_13792] +[group_13793] +[group_13794] +[group_13795] +[group_13796] +[group_13797] +[group_13798] +[group_13799] +[group_13800] +[group_13801] +[group_13802] +[group_13803] +[group_13804] +[group_13805] +[group_13806] +[group_13807] +[group_13808] +[group_13809] +[group_13810] +[group_13811] +[group_13812] +[group_13813] +[group_13814] +[group_13815] +[group_13816] +[group_13817] +[group_13818] +[group_13819] +[group_13820] +[group_13821] +[group_13822] +[group_13823] +[group_13824] +[group_13825] +[group_13826] +[group_13827] +[group_13828] +[group_13829] +[group_13830] +[group_13831] +[group_13832] +[group_13833] +[group_13834] +[group_13835] +[group_13836] +[group_13837] +[group_13838] +[group_13839] +[group_13840] +[group_13841] +[group_13842] +[group_13843] +[group_13844] +[group_13845] +[group_13846] +[group_13847] +[group_13848] +[group_13849] +[group_13850] +[group_13851] +[group_13852] +[group_13853] +[group_13854] +[group_13855] +[group_13856] +[group_13857] +[group_13858] +[group_13859] +[group_13860] +[group_13861] +[group_13862] +[group_13863] +[group_13864] +[group_13865] +[group_13866] +[group_13867] +[group_13868] +[group_13869] +[group_13870] +[group_13871] +[group_13872] +[group_13873] +[group_13874] +[group_13875] +[group_13876] +[group_13877] +[group_13878] +[group_13879] +[group_13880] +[group_13881] +[group_13882] +[group_13883] +[group_13884] +[group_13885] +[group_13886] +[group_13887] +[group_13888] +[group_13889] +[group_13890] +[group_13891] +[group_13892] +[group_13893] +[group_13894] +[group_13895] +[group_13896] +[group_13897] +[group_13898] +[group_13899] +[group_13900] +[group_13901] +[group_13902] +[group_13903] +[group_13904] +[group_13905] +[group_13906] +[group_13907] +[group_13908] +[group_13909] +[group_13910] +[group_13911] +[group_13912] +[group_13913] +[group_13914] +[group_13915] +[group_13916] +[group_13917] +[group_13918] +[group_13919] +[group_13920] +[group_13921] +[group_13922] +[group_13923] +[group_13924] +[group_13925] +[group_13926] +[group_13927] +[group_13928] +[group_13929] +[group_13930] +[group_13931] +[group_13932] +[group_13933] +[group_13934] +[group_13935] +[group_13936] +[group_13937] +[group_13938] +[group_13939] +[group_13940] +[group_13941] +[group_13942] +[group_13943] +[group_13944] +[group_13945] +[group_13946] +[group_13947] +[group_13948] +[group_13949] +[group_13950] +[group_13951] +[group_13952] +[group_13953] +[group_13954] +[group_13955] +[group_13956] +[group_13957] +[group_13958] +[group_13959] +[group_13960] +[group_13961] +[group_13962] +[group_13963] +[group_13964] +[group_13965] +[group_13966] +[group_13967] +[group_13968] +[group_13969] +[group_13970] +[group_13971] +[group_13972] +[group_13973] +[group_13974] +[group_13975] +[group_13976] +[group_13977] +[group_13978] +[group_13979] +[group_13980] +[group_13981] +[group_13982] +[group_13983] +[group_13984] +[group_13985] +[group_13986] +[group_13987] +[group_13988] +[group_13989] +[group_13990] +[group_13991] +[group_13992] +[group_13993] +[group_13994] +[group_13995] +[group_13996] +[group_13997] +[group_13998] +[group_13999] +[group_14000] +[group_14001] +[group_14002] +[group_14003] +[group_14004] +[group_14005] +[group_14006] +[group_14007] +[group_14008] +[group_14009] +[group_14010] +[group_14011] +[group_14012] +[group_14013] +[group_14014] +[group_14015] +[group_14016] +[group_14017] +[group_14018] +[group_14019] +[group_14020] +[group_14021] +[group_14022] +[group_14023] +[group_14024] +[group_14025] +[group_14026] +[group_14027] +[group_14028] +[group_14029] +[group_14030] +[group_14031] +[group_14032] +[group_14033] +[group_14034] +[group_14035] +[group_14036] +[group_14037] +[group_14038] +[group_14039] +[group_14040] +[group_14041] +[group_14042] +[group_14043] +[group_14044] +[group_14045] +[group_14046] +[group_14047] +[group_14048] +[group_14049] +[group_14050] +[group_14051] +[group_14052] +[group_14053] +[group_14054] +[group_14055] +[group_14056] +[group_14057] +[group_14058] +[group_14059] +[group_14060] +[group_14061] +[group_14062] +[group_14063] +[group_14064] +[group_14065] +[group_14066] +[group_14067] +[group_14068] +[group_14069] +[group_14070] +[group_14071] +[group_14072] +[group_14073] +[group_14074] +[group_14075] +[group_14076] +[group_14077] +[group_14078] +[group_14079] +[group_14080] +[group_14081] +[group_14082] +[group_14083] +[group_14084] +[group_14085] +[group_14086] +[group_14087] +[group_14088] +[group_14089] +[group_14090] +[group_14091] +[group_14092] +[group_14093] +[group_14094] +[group_14095] +[group_14096] +[group_14097] +[group_14098] +[group_14099] +[group_14100] +[group_14101] +[group_14102] +[group_14103] +[group_14104] +[group_14105] +[group_14106] +[group_14107] +[group_14108] +[group_14109] +[group_14110] +[group_14111] +[group_14112] +[group_14113] +[group_14114] +[group_14115] +[group_14116] +[group_14117] +[group_14118] +[group_14119] +[group_14120] +[group_14121] +[group_14122] +[group_14123] +[group_14124] +[group_14125] +[group_14126] +[group_14127] +[group_14128] +[group_14129] +[group_14130] +[group_14131] +[group_14132] +[group_14133] +[group_14134] +[group_14135] +[group_14136] +[group_14137] +[group_14138] +[group_14139] +[group_14140] +[group_14141] +[group_14142] +[group_14143] +[group_14144] +[group_14145] +[group_14146] +[group_14147] +[group_14148] +[group_14149] +[group_14150] +[group_14151] +[group_14152] +[group_14153] +[group_14154] +[group_14155] +[group_14156] +[group_14157] +[group_14158] +[group_14159] +[group_14160] +[group_14161] +[group_14162] +[group_14163] +[group_14164] +[group_14165] +[group_14166] +[group_14167] +[group_14168] +[group_14169] +[group_14170] +[group_14171] +[group_14172] +[group_14173] +[group_14174] +[group_14175] +[group_14176] +[group_14177] +[group_14178] +[group_14179] +[group_14180] +[group_14181] +[group_14182] +[group_14183] +[group_14184] +[group_14185] +[group_14186] +[group_14187] +[group_14188] +[group_14189] +[group_14190] +[group_14191] +[group_14192] +[group_14193] +[group_14194] +[group_14195] +[group_14196] +[group_14197] +[group_14198] +[group_14199] +[group_14200] +[group_14201] +[group_14202] +[group_14203] +[group_14204] +[group_14205] +[group_14206] +[group_14207] +[group_14208] +[group_14209] +[group_14210] +[group_14211] +[group_14212] +[group_14213] +[group_14214] +[group_14215] +[group_14216] +[group_14217] +[group_14218] +[group_14219] +[group_14220] +[group_14221] +[group_14222] +[group_14223] +[group_14224] +[group_14225] +[group_14226] +[group_14227] +[group_14228] +[group_14229] +[group_14230] +[group_14231] +[group_14232] +[group_14233] +[group_14234] +[group_14235] +[group_14236] +[group_14237] +[group_14238] +[group_14239] +[group_14240] +[group_14241] +[group_14242] +[group_14243] +[group_14244] +[group_14245] +[group_14246] +[group_14247] +[group_14248] +[group_14249] +[group_14250] +[group_14251] +[group_14252] +[group_14253] +[group_14254] +[group_14255] +[group_14256] +[group_14257] +[group_14258] +[group_14259] +[group_14260] +[group_14261] +[group_14262] +[group_14263] +[group_14264] +[group_14265] +[group_14266] +[group_14267] +[group_14268] +[group_14269] +[group_14270] +[group_14271] +[group_14272] +[group_14273] +[group_14274] +[group_14275] +[group_14276] +[group_14277] +[group_14278] +[group_14279] +[group_14280] +[group_14281] +[group_14282] +[group_14283] +[group_14284] +[group_14285] +[group_14286] +[group_14287] +[group_14288] +[group_14289] +[group_14290] +[group_14291] +[group_14292] +[group_14293] +[group_14294] +[group_14295] +[group_14296] +[group_14297] +[group_14298] +[group_14299] +[group_14300] +[group_14301] +[group_14302] +[group_14303] +[group_14304] +[group_14305] +[group_14306] +[group_14307] +[group_14308] +[group_14309] +[group_14310] +[group_14311] +[group_14312] +[group_14313] +[group_14314] +[group_14315] +[group_14316] +[group_14317] +[group_14318] +[group_14319] +[group_14320] +[group_14321] +[group_14322] +[group_14323] +[group_14324] +[group_14325] +[group_14326] +[group_14327] +[group_14328] +[group_14329] +[group_14330] +[group_14331] +[group_14332] +[group_14333] +[group_14334] +[group_14335] +[group_14336] +[group_14337] +[group_14338] +[group_14339] +[group_14340] +[group_14341] +[group_14342] +[group_14343] +[group_14344] +[group_14345] +[group_14346] +[group_14347] +[group_14348] +[group_14349] +[group_14350] +[group_14351] +[group_14352] +[group_14353] +[group_14354] +[group_14355] +[group_14356] +[group_14357] +[group_14358] +[group_14359] +[group_14360] +[group_14361] +[group_14362] +[group_14363] +[group_14364] +[group_14365] +[group_14366] +[group_14367] +[group_14368] +[group_14369] +[group_14370] +[group_14371] +[group_14372] +[group_14373] +[group_14374] +[group_14375] +[group_14376] +[group_14377] +[group_14378] +[group_14379] +[group_14380] +[group_14381] +[group_14382] +[group_14383] +[group_14384] +[group_14385] +[group_14386] +[group_14387] +[group_14388] +[group_14389] +[group_14390] +[group_14391] +[group_14392] +[group_14393] +[group_14394] +[group_14395] +[group_14396] +[group_14397] +[group_14398] +[group_14399] +[group_14400] +[group_14401] +[group_14402] +[group_14403] +[group_14404] +[group_14405] +[group_14406] +[group_14407] +[group_14408] +[group_14409] +[group_14410] +[group_14411] +[group_14412] +[group_14413] +[group_14414] +[group_14415] +[group_14416] +[group_14417] +[group_14418] +[group_14419] +[group_14420] +[group_14421] +[group_14422] +[group_14423] +[group_14424] +[group_14425] +[group_14426] +[group_14427] +[group_14428] +[group_14429] +[group_14430] +[group_14431] +[group_14432] +[group_14433] +[group_14434] +[group_14435] +[group_14436] +[group_14437] +[group_14438] +[group_14439] +[group_14440] +[group_14441] +[group_14442] +[group_14443] +[group_14444] +[group_14445] +[group_14446] +[group_14447] +[group_14448] +[group_14449] +[group_14450] +[group_14451] +[group_14452] +[group_14453] +[group_14454] +[group_14455] +[group_14456] +[group_14457] +[group_14458] +[group_14459] +[group_14460] +[group_14461] +[group_14462] +[group_14463] +[group_14464] +[group_14465] +[group_14466] +[group_14467] +[group_14468] +[group_14469] +[group_14470] +[group_14471] +[group_14472] +[group_14473] +[group_14474] +[group_14475] +[group_14476] +[group_14477] +[group_14478] +[group_14479] +[group_14480] +[group_14481] +[group_14482] +[group_14483] +[group_14484] +[group_14485] +[group_14486] +[group_14487] +[group_14488] +[group_14489] +[group_14490] +[group_14491] +[group_14492] +[group_14493] +[group_14494] +[group_14495] +[group_14496] +[group_14497] +[group_14498] +[group_14499] +[group_14500] +[group_14501] +[group_14502] +[group_14503] +[group_14504] +[group_14505] +[group_14506] +[group_14507] +[group_14508] +[group_14509] +[group_14510] +[group_14511] +[group_14512] +[group_14513] +[group_14514] +[group_14515] +[group_14516] +[group_14517] +[group_14518] +[group_14519] +[group_14520] +[group_14521] +[group_14522] +[group_14523] +[group_14524] +[group_14525] +[group_14526] +[group_14527] +[group_14528] +[group_14529] +[group_14530] +[group_14531] +[group_14532] +[group_14533] +[group_14534] +[group_14535] +[group_14536] +[group_14537] +[group_14538] +[group_14539] +[group_14540] +[group_14541] +[group_14542] +[group_14543] +[group_14544] +[group_14545] +[group_14546] +[group_14547] +[group_14548] +[group_14549] +[group_14550] +[group_14551] +[group_14552] +[group_14553] +[group_14554] +[group_14555] +[group_14556] +[group_14557] +[group_14558] +[group_14559] +[group_14560] +[group_14561] +[group_14562] +[group_14563] +[group_14564] +[group_14565] +[group_14566] +[group_14567] +[group_14568] +[group_14569] +[group_14570] +[group_14571] +[group_14572] +[group_14573] +[group_14574] +[group_14575] +[group_14576] +[group_14577] +[group_14578] +[group_14579] +[group_14580] +[group_14581] +[group_14582] +[group_14583] +[group_14584] +[group_14585] +[group_14586] +[group_14587] +[group_14588] +[group_14589] +[group_14590] +[group_14591] +[group_14592] +[group_14593] +[group_14594] +[group_14595] +[group_14596] +[group_14597] +[group_14598] +[group_14599] +[group_14600] +[group_14601] +[group_14602] +[group_14603] +[group_14604] +[group_14605] +[group_14606] +[group_14607] +[group_14608] +[group_14609] +[group_14610] +[group_14611] +[group_14612] +[group_14613] +[group_14614] +[group_14615] +[group_14616] +[group_14617] +[group_14618] +[group_14619] +[group_14620] +[group_14621] +[group_14622] +[group_14623] +[group_14624] +[group_14625] +[group_14626] +[group_14627] +[group_14628] +[group_14629] +[group_14630] +[group_14631] +[group_14632] +[group_14633] +[group_14634] +[group_14635] +[group_14636] +[group_14637] +[group_14638] +[group_14639] +[group_14640] +[group_14641] +[group_14642] +[group_14643] +[group_14644] +[group_14645] +[group_14646] +[group_14647] +[group_14648] +[group_14649] +[group_14650] +[group_14651] +[group_14652] +[group_14653] +[group_14654] +[group_14655] +[group_14656] +[group_14657] +[group_14658] +[group_14659] +[group_14660] +[group_14661] +[group_14662] +[group_14663] +[group_14664] +[group_14665] +[group_14666] +[group_14667] +[group_14668] +[group_14669] +[group_14670] +[group_14671] +[group_14672] +[group_14673] +[group_14674] +[group_14675] +[group_14676] +[group_14677] +[group_14678] +[group_14679] +[group_14680] +[group_14681] +[group_14682] +[group_14683] +[group_14684] +[group_14685] +[group_14686] +[group_14687] +[group_14688] +[group_14689] +[group_14690] +[group_14691] +[group_14692] +[group_14693] +[group_14694] +[group_14695] +[group_14696] +[group_14697] +[group_14698] +[group_14699] +[group_14700] +[group_14701] +[group_14702] +[group_14703] +[group_14704] +[group_14705] +[group_14706] +[group_14707] +[group_14708] +[group_14709] +[group_14710] +[group_14711] +[group_14712] +[group_14713] +[group_14714] +[group_14715] +[group_14716] +[group_14717] +[group_14718] +[group_14719] +[group_14720] +[group_14721] +[group_14722] +[group_14723] +[group_14724] +[group_14725] +[group_14726] +[group_14727] +[group_14728] +[group_14729] +[group_14730] +[group_14731] +[group_14732] +[group_14733] +[group_14734] +[group_14735] +[group_14736] +[group_14737] +[group_14738] +[group_14739] +[group_14740] +[group_14741] +[group_14742] +[group_14743] +[group_14744] +[group_14745] +[group_14746] +[group_14747] +[group_14748] +[group_14749] +[group_14750] +[group_14751] +[group_14752] +[group_14753] +[group_14754] +[group_14755] +[group_14756] +[group_14757] +[group_14758] +[group_14759] +[group_14760] +[group_14761] +[group_14762] +[group_14763] +[group_14764] +[group_14765] +[group_14766] +[group_14767] +[group_14768] +[group_14769] +[group_14770] +[group_14771] +[group_14772] +[group_14773] +[group_14774] +[group_14775] +[group_14776] +[group_14777] +[group_14778] +[group_14779] +[group_14780] +[group_14781] +[group_14782] +[group_14783] +[group_14784] +[group_14785] +[group_14786] +[group_14787] +[group_14788] +[group_14789] +[group_14790] +[group_14791] +[group_14792] +[group_14793] +[group_14794] +[group_14795] +[group_14796] +[group_14797] +[group_14798] +[group_14799] +[group_14800] +[group_14801] +[group_14802] +[group_14803] +[group_14804] +[group_14805] +[group_14806] +[group_14807] +[group_14808] +[group_14809] +[group_14810] +[group_14811] +[group_14812] +[group_14813] +[group_14814] +[group_14815] +[group_14816] +[group_14817] +[group_14818] +[group_14819] +[group_14820] +[group_14821] +[group_14822] +[group_14823] +[group_14824] +[group_14825] +[group_14826] +[group_14827] +[group_14828] +[group_14829] +[group_14830] +[group_14831] +[group_14832] +[group_14833] +[group_14834] +[group_14835] +[group_14836] +[group_14837] +[group_14838] +[group_14839] +[group_14840] +[group_14841] +[group_14842] +[group_14843] +[group_14844] +[group_14845] +[group_14846] +[group_14847] +[group_14848] +[group_14849] +[group_14850] +[group_14851] +[group_14852] +[group_14853] +[group_14854] +[group_14855] +[group_14856] +[group_14857] +[group_14858] +[group_14859] +[group_14860] +[group_14861] +[group_14862] +[group_14863] +[group_14864] +[group_14865] +[group_14866] +[group_14867] +[group_14868] +[group_14869] +[group_14870] +[group_14871] +[group_14872] +[group_14873] +[group_14874] +[group_14875] +[group_14876] +[group_14877] +[group_14878] +[group_14879] +[group_14880] +[group_14881] +[group_14882] +[group_14883] +[group_14884] +[group_14885] +[group_14886] +[group_14887] +[group_14888] +[group_14889] +[group_14890] +[group_14891] +[group_14892] +[group_14893] +[group_14894] +[group_14895] +[group_14896] +[group_14897] +[group_14898] +[group_14899] +[group_14900] +[group_14901] +[group_14902] +[group_14903] +[group_14904] +[group_14905] +[group_14906] +[group_14907] +[group_14908] +[group_14909] +[group_14910] +[group_14911] +[group_14912] +[group_14913] +[group_14914] +[group_14915] +[group_14916] +[group_14917] +[group_14918] +[group_14919] +[group_14920] +[group_14921] +[group_14922] +[group_14923] +[group_14924] +[group_14925] +[group_14926] +[group_14927] +[group_14928] +[group_14929] +[group_14930] +[group_14931] +[group_14932] +[group_14933] +[group_14934] +[group_14935] +[group_14936] +[group_14937] +[group_14938] +[group_14939] +[group_14940] +[group_14941] +[group_14942] +[group_14943] +[group_14944] +[group_14945] +[group_14946] +[group_14947] +[group_14948] +[group_14949] +[group_14950] +[group_14951] +[group_14952] +[group_14953] +[group_14954] +[group_14955] +[group_14956] +[group_14957] +[group_14958] +[group_14959] +[group_14960] +[group_14961] +[group_14962] +[group_14963] +[group_14964] +[group_14965] +[group_14966] +[group_14967] +[group_14968] +[group_14969] +[group_14970] +[group_14971] +[group_14972] +[group_14973] +[group_14974] +[group_14975] +[group_14976] +[group_14977] +[group_14978] +[group_14979] +[group_14980] +[group_14981] +[group_14982] +[group_14983] +[group_14984] +[group_14985] +[group_14986] +[group_14987] +[group_14988] +[group_14989] +[group_14990] +[group_14991] +[group_14992] +[group_14993] +[group_14994] +[group_14995] +[group_14996] +[group_14997] +[group_14998] +[group_14999] +[group_15000] +[group_15001] +[group_15002] +[group_15003] +[group_15004] +[group_15005] +[group_15006] +[group_15007] +[group_15008] +[group_15009] +[group_15010] +[group_15011] +[group_15012] +[group_15013] +[group_15014] +[group_15015] +[group_15016] +[group_15017] +[group_15018] +[group_15019] +[group_15020] +[group_15021] +[group_15022] +[group_15023] +[group_15024] +[group_15025] +[group_15026] +[group_15027] +[group_15028] +[group_15029] +[group_15030] +[group_15031] +[group_15032] +[group_15033] +[group_15034] +[group_15035] +[group_15036] +[group_15037] +[group_15038] +[group_15039] +[group_15040] +[group_15041] +[group_15042] +[group_15043] +[group_15044] +[group_15045] +[group_15046] +[group_15047] +[group_15048] +[group_15049] +[group_15050] +[group_15051] +[group_15052] +[group_15053] +[group_15054] +[group_15055] +[group_15056] +[group_15057] +[group_15058] +[group_15059] +[group_15060] +[group_15061] +[group_15062] +[group_15063] +[group_15064] +[group_15065] +[group_15066] +[group_15067] +[group_15068] +[group_15069] +[group_15070] +[group_15071] +[group_15072] +[group_15073] +[group_15074] +[group_15075] +[group_15076] +[group_15077] +[group_15078] +[group_15079] +[group_15080] +[group_15081] +[group_15082] +[group_15083] +[group_15084] +[group_15085] +[group_15086] +[group_15087] +[group_15088] +[group_15089] +[group_15090] +[group_15091] +[group_15092] +[group_15093] +[group_15094] +[group_15095] +[group_15096] +[group_15097] +[group_15098] +[group_15099] +[group_15100] +[group_15101] +[group_15102] +[group_15103] +[group_15104] +[group_15105] +[group_15106] +[group_15107] +[group_15108] +[group_15109] +[group_15110] +[group_15111] +[group_15112] +[group_15113] +[group_15114] +[group_15115] +[group_15116] +[group_15117] +[group_15118] +[group_15119] +[group_15120] +[group_15121] +[group_15122] +[group_15123] +[group_15124] +[group_15125] +[group_15126] +[group_15127] +[group_15128] +[group_15129] +[group_15130] +[group_15131] +[group_15132] +[group_15133] +[group_15134] +[group_15135] +[group_15136] +[group_15137] +[group_15138] +[group_15139] +[group_15140] +[group_15141] +[group_15142] +[group_15143] +[group_15144] +[group_15145] +[group_15146] +[group_15147] +[group_15148] +[group_15149] +[group_15150] +[group_15151] +[group_15152] +[group_15153] +[group_15154] +[group_15155] +[group_15156] +[group_15157] +[group_15158] +[group_15159] +[group_15160] +[group_15161] +[group_15162] +[group_15163] +[group_15164] +[group_15165] +[group_15166] +[group_15167] +[group_15168] +[group_15169] +[group_15170] +[group_15171] +[group_15172] +[group_15173] +[group_15174] +[group_15175] +[group_15176] +[group_15177] +[group_15178] +[group_15179] +[group_15180] +[group_15181] +[group_15182] +[group_15183] +[group_15184] +[group_15185] +[group_15186] +[group_15187] +[group_15188] +[group_15189] +[group_15190] +[group_15191] +[group_15192] +[group_15193] +[group_15194] +[group_15195] +[group_15196] +[group_15197] +[group_15198] +[group_15199] +[group_15200] +[group_15201] +[group_15202] +[group_15203] +[group_15204] +[group_15205] +[group_15206] +[group_15207] +[group_15208] +[group_15209] +[group_15210] +[group_15211] +[group_15212] +[group_15213] +[group_15214] +[group_15215] +[group_15216] +[group_15217] +[group_15218] +[group_15219] +[group_15220] +[group_15221] +[group_15222] +[group_15223] +[group_15224] +[group_15225] +[group_15226] +[group_15227] +[group_15228] +[group_15229] +[group_15230] +[group_15231] +[group_15232] +[group_15233] +[group_15234] +[group_15235] +[group_15236] +[group_15237] +[group_15238] +[group_15239] +[group_15240] +[group_15241] +[group_15242] +[group_15243] +[group_15244] +[group_15245] +[group_15246] +[group_15247] +[group_15248] +[group_15249] +[group_15250] +[group_15251] +[group_15252] +[group_15253] +[group_15254] +[group_15255] +[group_15256] +[group_15257] +[group_15258] +[group_15259] +[group_15260] +[group_15261] +[group_15262] +[group_15263] +[group_15264] +[group_15265] +[group_15266] +[group_15267] +[group_15268] +[group_15269] +[group_15270] +[group_15271] +[group_15272] +[group_15273] +[group_15274] +[group_15275] +[group_15276] +[group_15277] +[group_15278] +[group_15279] +[group_15280] +[group_15281] +[group_15282] +[group_15283] +[group_15284] +[group_15285] +[group_15286] +[group_15287] +[group_15288] +[group_15289] +[group_15290] +[group_15291] +[group_15292] +[group_15293] +[group_15294] +[group_15295] +[group_15296] +[group_15297] +[group_15298] +[group_15299] +[group_15300] +[group_15301] +[group_15302] +[group_15303] +[group_15304] +[group_15305] +[group_15306] +[group_15307] +[group_15308] +[group_15309] +[group_15310] +[group_15311] +[group_15312] +[group_15313] +[group_15314] +[group_15315] +[group_15316] +[group_15317] +[group_15318] +[group_15319] +[group_15320] +[group_15321] +[group_15322] +[group_15323] +[group_15324] +[group_15325] +[group_15326] +[group_15327] +[group_15328] +[group_15329] +[group_15330] +[group_15331] +[group_15332] +[group_15333] +[group_15334] +[group_15335] +[group_15336] +[group_15337] +[group_15338] +[group_15339] +[group_15340] +[group_15341] +[group_15342] +[group_15343] +[group_15344] +[group_15345] +[group_15346] +[group_15347] +[group_15348] +[group_15349] +[group_15350] +[group_15351] +[group_15352] +[group_15353] +[group_15354] +[group_15355] +[group_15356] +[group_15357] +[group_15358] +[group_15359] +[group_15360] +[group_15361] +[group_15362] +[group_15363] +[group_15364] +[group_15365] +[group_15366] +[group_15367] +[group_15368] +[group_15369] +[group_15370] +[group_15371] +[group_15372] +[group_15373] +[group_15374] +[group_15375] +[group_15376] +[group_15377] +[group_15378] +[group_15379] +[group_15380] +[group_15381] +[group_15382] +[group_15383] +[group_15384] +[group_15385] +[group_15386] +[group_15387] +[group_15388] +[group_15389] +[group_15390] +[group_15391] +[group_15392] +[group_15393] +[group_15394] +[group_15395] +[group_15396] +[group_15397] +[group_15398] +[group_15399] +[group_15400] +[group_15401] +[group_15402] +[group_15403] +[group_15404] +[group_15405] +[group_15406] +[group_15407] +[group_15408] +[group_15409] +[group_15410] +[group_15411] +[group_15412] +[group_15413] +[group_15414] +[group_15415] +[group_15416] +[group_15417] +[group_15418] +[group_15419] +[group_15420] +[group_15421] +[group_15422] +[group_15423] +[group_15424] +[group_15425] +[group_15426] +[group_15427] +[group_15428] +[group_15429] +[group_15430] +[group_15431] +[group_15432] +[group_15433] +[group_15434] +[group_15435] +[group_15436] +[group_15437] +[group_15438] +[group_15439] +[group_15440] +[group_15441] +[group_15442] +[group_15443] +[group_15444] +[group_15445] +[group_15446] +[group_15447] +[group_15448] +[group_15449] +[group_15450] +[group_15451] +[group_15452] +[group_15453] +[group_15454] +[group_15455] +[group_15456] +[group_15457] +[group_15458] +[group_15459] +[group_15460] +[group_15461] +[group_15462] +[group_15463] +[group_15464] +[group_15465] +[group_15466] +[group_15467] +[group_15468] +[group_15469] +[group_15470] +[group_15471] +[group_15472] +[group_15473] +[group_15474] +[group_15475] +[group_15476] +[group_15477] +[group_15478] +[group_15479] +[group_15480] +[group_15481] +[group_15482] +[group_15483] +[group_15484] +[group_15485] +[group_15486] +[group_15487] +[group_15488] +[group_15489] +[group_15490] +[group_15491] +[group_15492] +[group_15493] +[group_15494] +[group_15495] +[group_15496] +[group_15497] +[group_15498] +[group_15499] +[group_15500] +[group_15501] +[group_15502] +[group_15503] +[group_15504] +[group_15505] +[group_15506] +[group_15507] +[group_15508] +[group_15509] +[group_15510] +[group_15511] +[group_15512] +[group_15513] +[group_15514] +[group_15515] +[group_15516] +[group_15517] +[group_15518] +[group_15519] +[group_15520] +[group_15521] +[group_15522] +[group_15523] +[group_15524] +[group_15525] +[group_15526] +[group_15527] +[group_15528] +[group_15529] +[group_15530] +[group_15531] +[group_15532] +[group_15533] +[group_15534] +[group_15535] +[group_15536] +[group_15537] +[group_15538] +[group_15539] +[group_15540] +[group_15541] +[group_15542] +[group_15543] +[group_15544] +[group_15545] +[group_15546] +[group_15547] +[group_15548] +[group_15549] +[group_15550] +[group_15551] +[group_15552] +[group_15553] +[group_15554] +[group_15555] +[group_15556] +[group_15557] +[group_15558] +[group_15559] +[group_15560] +[group_15561] +[group_15562] +[group_15563] +[group_15564] +[group_15565] +[group_15566] +[group_15567] +[group_15568] +[group_15569] +[group_15570] +[group_15571] +[group_15572] +[group_15573] +[group_15574] +[group_15575] +[group_15576] +[group_15577] +[group_15578] +[group_15579] +[group_15580] +[group_15581] +[group_15582] +[group_15583] +[group_15584] +[group_15585] +[group_15586] +[group_15587] +[group_15588] +[group_15589] +[group_15590] +[group_15591] +[group_15592] +[group_15593] +[group_15594] +[group_15595] +[group_15596] +[group_15597] +[group_15598] +[group_15599] +[group_15600] +[group_15601] +[group_15602] +[group_15603] +[group_15604] +[group_15605] +[group_15606] +[group_15607] +[group_15608] +[group_15609] +[group_15610] +[group_15611] +[group_15612] +[group_15613] +[group_15614] +[group_15615] +[group_15616] +[group_15617] +[group_15618] +[group_15619] +[group_15620] +[group_15621] +[group_15622] +[group_15623] +[group_15624] +[group_15625] +[group_15626] +[group_15627] +[group_15628] +[group_15629] +[group_15630] +[group_15631] +[group_15632] +[group_15633] +[group_15634] +[group_15635] +[group_15636] +[group_15637] +[group_15638] +[group_15639] +[group_15640] +[group_15641] +[group_15642] +[group_15643] +[group_15644] +[group_15645] +[group_15646] +[group_15647] +[group_15648] +[group_15649] +[group_15650] +[group_15651] +[group_15652] +[group_15653] +[group_15654] +[group_15655] +[group_15656] +[group_15657] +[group_15658] +[group_15659] +[group_15660] +[group_15661] +[group_15662] +[group_15663] +[group_15664] +[group_15665] +[group_15666] +[group_15667] +[group_15668] +[group_15669] +[group_15670] +[group_15671] +[group_15672] +[group_15673] +[group_15674] +[group_15675] +[group_15676] +[group_15677] +[group_15678] +[group_15679] +[group_15680] +[group_15681] +[group_15682] +[group_15683] +[group_15684] +[group_15685] +[group_15686] +[group_15687] +[group_15688] +[group_15689] +[group_15690] +[group_15691] +[group_15692] +[group_15693] +[group_15694] +[group_15695] +[group_15696] +[group_15697] +[group_15698] +[group_15699] +[group_15700] +[group_15701] +[group_15702] +[group_15703] +[group_15704] +[group_15705] +[group_15706] +[group_15707] +[group_15708] +[group_15709] +[group_15710] +[group_15711] +[group_15712] +[group_15713] +[group_15714] +[group_15715] +[group_15716] +[group_15717] +[group_15718] +[group_15719] +[group_15720] +[group_15721] +[group_15722] +[group_15723] +[group_15724] +[group_15725] +[group_15726] +[group_15727] +[group_15728] +[group_15729] +[group_15730] +[group_15731] +[group_15732] +[group_15733] +[group_15734] +[group_15735] +[group_15736] +[group_15737] +[group_15738] +[group_15739] +[group_15740] +[group_15741] +[group_15742] +[group_15743] +[group_15744] +[group_15745] +[group_15746] +[group_15747] +[group_15748] +[group_15749] +[group_15750] +[group_15751] +[group_15752] +[group_15753] +[group_15754] +[group_15755] +[group_15756] +[group_15757] +[group_15758] +[group_15759] +[group_15760] +[group_15761] +[group_15762] +[group_15763] +[group_15764] +[group_15765] +[group_15766] +[group_15767] +[group_15768] +[group_15769] +[group_15770] +[group_15771] +[group_15772] +[group_15773] +[group_15774] +[group_15775] +[group_15776] +[group_15777] +[group_15778] +[group_15779] +[group_15780] +[group_15781] +[group_15782] +[group_15783] +[group_15784] +[group_15785] +[group_15786] +[group_15787] +[group_15788] +[group_15789] +[group_15790] +[group_15791] +[group_15792] +[group_15793] +[group_15794] +[group_15795] +[group_15796] +[group_15797] +[group_15798] +[group_15799] +[group_15800] +[group_15801] +[group_15802] +[group_15803] +[group_15804] +[group_15805] +[group_15806] +[group_15807] +[group_15808] +[group_15809] +[group_15810] +[group_15811] +[group_15812] +[group_15813] +[group_15814] +[group_15815] +[group_15816] +[group_15817] +[group_15818] +[group_15819] +[group_15820] +[group_15821] +[group_15822] +[group_15823] +[group_15824] +[group_15825] +[group_15826] +[group_15827] +[group_15828] +[group_15829] +[group_15830] +[group_15831] +[group_15832] +[group_15833] +[group_15834] +[group_15835] +[group_15836] +[group_15837] +[group_15838] +[group_15839] +[group_15840] +[group_15841] +[group_15842] +[group_15843] +[group_15844] +[group_15845] +[group_15846] +[group_15847] +[group_15848] +[group_15849] +[group_15850] +[group_15851] +[group_15852] +[group_15853] +[group_15854] +[group_15855] +[group_15856] +[group_15857] +[group_15858] +[group_15859] +[group_15860] +[group_15861] +[group_15862] +[group_15863] +[group_15864] +[group_15865] +[group_15866] +[group_15867] +[group_15868] +[group_15869] +[group_15870] +[group_15871] +[group_15872] +[group_15873] +[group_15874] +[group_15875] +[group_15876] +[group_15877] +[group_15878] +[group_15879] +[group_15880] +[group_15881] +[group_15882] +[group_15883] +[group_15884] +[group_15885] +[group_15886] +[group_15887] +[group_15888] +[group_15889] +[group_15890] +[group_15891] +[group_15892] +[group_15893] +[group_15894] +[group_15895] +[group_15896] +[group_15897] +[group_15898] +[group_15899] +[group_15900] +[group_15901] +[group_15902] +[group_15903] +[group_15904] +[group_15905] +[group_15906] +[group_15907] +[group_15908] +[group_15909] +[group_15910] +[group_15911] +[group_15912] +[group_15913] +[group_15914] +[group_15915] +[group_15916] +[group_15917] +[group_15918] +[group_15919] +[group_15920] +[group_15921] +[group_15922] +[group_15923] +[group_15924] +[group_15925] +[group_15926] +[group_15927] +[group_15928] +[group_15929] +[group_15930] +[group_15931] +[group_15932] +[group_15933] +[group_15934] +[group_15935] +[group_15936] +[group_15937] +[group_15938] +[group_15939] +[group_15940] +[group_15941] +[group_15942] +[group_15943] +[group_15944] +[group_15945] +[group_15946] +[group_15947] +[group_15948] +[group_15949] +[group_15950] +[group_15951] +[group_15952] +[group_15953] +[group_15954] +[group_15955] +[group_15956] +[group_15957] +[group_15958] +[group_15959] +[group_15960] +[group_15961] +[group_15962] +[group_15963] +[group_15964] +[group_15965] +[group_15966] +[group_15967] +[group_15968] +[group_15969] +[group_15970] +[group_15971] +[group_15972] +[group_15973] +[group_15974] +[group_15975] +[group_15976] +[group_15977] +[group_15978] +[group_15979] +[group_15980] +[group_15981] +[group_15982] +[group_15983] +[group_15984] +[group_15985] +[group_15986] +[group_15987] +[group_15988] +[group_15989] +[group_15990] +[group_15991] +[group_15992] +[group_15993] +[group_15994] +[group_15995] +[group_15996] +[group_15997] +[group_15998] +[group_15999] +[group_16000] +[group_16001] +[group_16002] +[group_16003] +[group_16004] +[group_16005] +[group_16006] +[group_16007] +[group_16008] +[group_16009] +[group_16010] +[group_16011] +[group_16012] +[group_16013] +[group_16014] +[group_16015] +[group_16016] +[group_16017] +[group_16018] +[group_16019] +[group_16020] +[group_16021] +[group_16022] +[group_16023] +[group_16024] +[group_16025] +[group_16026] +[group_16027] +[group_16028] +[group_16029] +[group_16030] +[group_16031] +[group_16032] +[group_16033] +[group_16034] +[group_16035] +[group_16036] +[group_16037] +[group_16038] +[group_16039] +[group_16040] +[group_16041] +[group_16042] +[group_16043] +[group_16044] +[group_16045] +[group_16046] +[group_16047] +[group_16048] +[group_16049] +[group_16050] +[group_16051] +[group_16052] +[group_16053] +[group_16054] +[group_16055] +[group_16056] +[group_16057] +[group_16058] +[group_16059] +[group_16060] +[group_16061] +[group_16062] +[group_16063] +[group_16064] +[group_16065] +[group_16066] +[group_16067] +[group_16068] +[group_16069] +[group_16070] +[group_16071] +[group_16072] +[group_16073] +[group_16074] +[group_16075] +[group_16076] +[group_16077] +[group_16078] +[group_16079] +[group_16080] +[group_16081] +[group_16082] +[group_16083] +[group_16084] +[group_16085] +[group_16086] +[group_16087] +[group_16088] +[group_16089] +[group_16090] +[group_16091] +[group_16092] +[group_16093] +[group_16094] +[group_16095] +[group_16096] +[group_16097] +[group_16098] +[group_16099] +[group_16100] +[group_16101] +[group_16102] +[group_16103] +[group_16104] +[group_16105] +[group_16106] +[group_16107] +[group_16108] +[group_16109] +[group_16110] +[group_16111] +[group_16112] +[group_16113] +[group_16114] +[group_16115] +[group_16116] +[group_16117] +[group_16118] +[group_16119] +[group_16120] +[group_16121] +[group_16122] +[group_16123] +[group_16124] +[group_16125] +[group_16126] +[group_16127] +[group_16128] +[group_16129] +[group_16130] +[group_16131] +[group_16132] +[group_16133] +[group_16134] +[group_16135] +[group_16136] +[group_16137] +[group_16138] +[group_16139] +[group_16140] +[group_16141] +[group_16142] +[group_16143] +[group_16144] +[group_16145] +[group_16146] +[group_16147] +[group_16148] +[group_16149] +[group_16150] +[group_16151] +[group_16152] +[group_16153] +[group_16154] +[group_16155] +[group_16156] +[group_16157] +[group_16158] +[group_16159] +[group_16160] +[group_16161] +[group_16162] +[group_16163] +[group_16164] +[group_16165] +[group_16166] +[group_16167] +[group_16168] +[group_16169] +[group_16170] +[group_16171] +[group_16172] +[group_16173] +[group_16174] +[group_16175] +[group_16176] +[group_16177] +[group_16178] +[group_16179] +[group_16180] +[group_16181] +[group_16182] +[group_16183] +[group_16184] +[group_16185] +[group_16186] +[group_16187] +[group_16188] +[group_16189] +[group_16190] +[group_16191] +[group_16192] +[group_16193] +[group_16194] +[group_16195] +[group_16196] +[group_16197] +[group_16198] +[group_16199] +[group_16200] +[group_16201] +[group_16202] +[group_16203] +[group_16204] +[group_16205] +[group_16206] +[group_16207] +[group_16208] +[group_16209] +[group_16210] +[group_16211] +[group_16212] +[group_16213] +[group_16214] +[group_16215] +[group_16216] +[group_16217] +[group_16218] +[group_16219] +[group_16220] +[group_16221] +[group_16222] +[group_16223] +[group_16224] +[group_16225] +[group_16226] +[group_16227] +[group_16228] +[group_16229] +[group_16230] +[group_16231] +[group_16232] +[group_16233] +[group_16234] +[group_16235] +[group_16236] +[group_16237] +[group_16238] +[group_16239] +[group_16240] +[group_16241] +[group_16242] +[group_16243] +[group_16244] +[group_16245] +[group_16246] +[group_16247] +[group_16248] +[group_16249] +[group_16250] +[group_16251] +[group_16252] +[group_16253] +[group_16254] +[group_16255] +[group_16256] +[group_16257] +[group_16258] +[group_16259] +[group_16260] +[group_16261] +[group_16262] +[group_16263] +[group_16264] +[group_16265] +[group_16266] +[group_16267] +[group_16268] +[group_16269] +[group_16270] +[group_16271] +[group_16272] +[group_16273] +[group_16274] +[group_16275] +[group_16276] +[group_16277] +[group_16278] +[group_16279] +[group_16280] +[group_16281] +[group_16282] +[group_16283] +[group_16284] +[group_16285] +[group_16286] +[group_16287] +[group_16288] +[group_16289] +[group_16290] +[group_16291] +[group_16292] +[group_16293] +[group_16294] +[group_16295] +[group_16296] +[group_16297] +[group_16298] +[group_16299] +[group_16300] +[group_16301] +[group_16302] +[group_16303] +[group_16304] +[group_16305] +[group_16306] +[group_16307] +[group_16308] +[group_16309] +[group_16310] +[group_16311] +[group_16312] +[group_16313] +[group_16314] +[group_16315] +[group_16316] +[group_16317] +[group_16318] +[group_16319] +[group_16320] +[group_16321] +[group_16322] +[group_16323] +[group_16324] +[group_16325] +[group_16326] +[group_16327] +[group_16328] +[group_16329] +[group_16330] +[group_16331] +[group_16332] +[group_16333] +[group_16334] +[group_16335] +[group_16336] +[group_16337] +[group_16338] +[group_16339] +[group_16340] +[group_16341] +[group_16342] +[group_16343] +[group_16344] +[group_16345] +[group_16346] +[group_16347] +[group_16348] +[group_16349] +[group_16350] +[group_16351] +[group_16352] +[group_16353] +[group_16354] +[group_16355] +[group_16356] +[group_16357] +[group_16358] +[group_16359] +[group_16360] +[group_16361] +[group_16362] +[group_16363] +[group_16364] +[group_16365] +[group_16366] +[group_16367] +[group_16368] +[group_16369] +[group_16370] +[group_16371] +[group_16372] +[group_16373] +[group_16374] +[group_16375] +[group_16376] +[group_16377] +[group_16378] +[group_16379] +[group_16380] +[group_16381] +[group_16382] +[group_16383] +[group_16384] +[group_16385] +[group_16386] +[group_16387] +[group_16388] +[group_16389] +[group_16390] +[group_16391] +[group_16392] +[group_16393] +[group_16394] +[group_16395] +[group_16396] +[group_16397] +[group_16398] +[group_16399] +[group_16400] +[group_16401] +[group_16402] +[group_16403] +[group_16404] +[group_16405] +[group_16406] +[group_16407] +[group_16408] +[group_16409] +[group_16410] +[group_16411] +[group_16412] +[group_16413] +[group_16414] +[group_16415] +[group_16416] +[group_16417] +[group_16418] +[group_16419] +[group_16420] +[group_16421] +[group_16422] +[group_16423] +[group_16424] +[group_16425] +[group_16426] +[group_16427] +[group_16428] +[group_16429] +[group_16430] +[group_16431] +[group_16432] +[group_16433] +[group_16434] +[group_16435] +[group_16436] +[group_16437] +[group_16438] +[group_16439] +[group_16440] +[group_16441] +[group_16442] +[group_16443] +[group_16444] +[group_16445] +[group_16446] +[group_16447] +[group_16448] +[group_16449] +[group_16450] +[group_16451] +[group_16452] +[group_16453] +[group_16454] +[group_16455] +[group_16456] +[group_16457] +[group_16458] +[group_16459] +[group_16460] +[group_16461] +[group_16462] +[group_16463] +[group_16464] +[group_16465] +[group_16466] +[group_16467] +[group_16468] +[group_16469] +[group_16470] +[group_16471] +[group_16472] +[group_16473] +[group_16474] +[group_16475] +[group_16476] +[group_16477] +[group_16478] +[group_16479] +[group_16480] +[group_16481] +[group_16482] +[group_16483] +[group_16484] +[group_16485] +[group_16486] +[group_16487] +[group_16488] +[group_16489] +[group_16490] +[group_16491] +[group_16492] +[group_16493] +[group_16494] +[group_16495] +[group_16496] +[group_16497] +[group_16498] +[group_16499] +[group_16500] +[group_16501] +[group_16502] +[group_16503] +[group_16504] +[group_16505] +[group_16506] +[group_16507] +[group_16508] +[group_16509] +[group_16510] +[group_16511] +[group_16512] +[group_16513] +[group_16514] +[group_16515] +[group_16516] +[group_16517] +[group_16518] +[group_16519] +[group_16520] +[group_16521] +[group_16522] +[group_16523] +[group_16524] +[group_16525] +[group_16526] +[group_16527] +[group_16528] +[group_16529] +[group_16530] +[group_16531] +[group_16532] +[group_16533] +[group_16534] +[group_16535] +[group_16536] +[group_16537] +[group_16538] +[group_16539] +[group_16540] +[group_16541] +[group_16542] +[group_16543] +[group_16544] +[group_16545] +[group_16546] +[group_16547] +[group_16548] +[group_16549] +[group_16550] +[group_16551] +[group_16552] +[group_16553] +[group_16554] +[group_16555] +[group_16556] +[group_16557] +[group_16558] +[group_16559] +[group_16560] +[group_16561] +[group_16562] +[group_16563] +[group_16564] +[group_16565] +[group_16566] +[group_16567] +[group_16568] +[group_16569] +[group_16570] +[group_16571] +[group_16572] +[group_16573] +[group_16574] +[group_16575] +[group_16576] +[group_16577] +[group_16578] +[group_16579] +[group_16580] +[group_16581] +[group_16582] +[group_16583] +[group_16584] +[group_16585] +[group_16586] +[group_16587] +[group_16588] +[group_16589] +[group_16590] +[group_16591] +[group_16592] +[group_16593] +[group_16594] +[group_16595] +[group_16596] +[group_16597] +[group_16598] +[group_16599] +[group_16600] +[group_16601] +[group_16602] +[group_16603] +[group_16604] +[group_16605] +[group_16606] +[group_16607] +[group_16608] +[group_16609] +[group_16610] +[group_16611] +[group_16612] +[group_16613] +[group_16614] +[group_16615] +[group_16616] +[group_16617] +[group_16618] +[group_16619] +[group_16620] +[group_16621] +[group_16622] +[group_16623] +[group_16624] +[group_16625] +[group_16626] +[group_16627] +[group_16628] +[group_16629] +[group_16630] +[group_16631] +[group_16632] +[group_16633] +[group_16634] +[group_16635] +[group_16636] +[group_16637] +[group_16638] +[group_16639] +[group_16640] +[group_16641] +[group_16642] +[group_16643] +[group_16644] +[group_16645] +[group_16646] +[group_16647] +[group_16648] +[group_16649] +[group_16650] +[group_16651] +[group_16652] +[group_16653] +[group_16654] +[group_16655] +[group_16656] +[group_16657] +[group_16658] +[group_16659] +[group_16660] +[group_16661] +[group_16662] +[group_16663] +[group_16664] +[group_16665] +[group_16666] +[group_16667] +[group_16668] +[group_16669] +[group_16670] +[group_16671] +[group_16672] +[group_16673] +[group_16674] +[group_16675] +[group_16676] +[group_16677] +[group_16678] +[group_16679] +[group_16680] +[group_16681] +[group_16682] +[group_16683] +[group_16684] +[group_16685] +[group_16686] +[group_16687] +[group_16688] +[group_16689] +[group_16690] +[group_16691] +[group_16692] +[group_16693] +[group_16694] +[group_16695] +[group_16696] +[group_16697] +[group_16698] +[group_16699] +[group_16700] +[group_16701] +[group_16702] +[group_16703] +[group_16704] +[group_16705] +[group_16706] +[group_16707] +[group_16708] +[group_16709] +[group_16710] +[group_16711] +[group_16712] +[group_16713] +[group_16714] +[group_16715] +[group_16716] +[group_16717] +[group_16718] +[group_16719] +[group_16720] +[group_16721] +[group_16722] +[group_16723] +[group_16724] +[group_16725] +[group_16726] +[group_16727] +[group_16728] +[group_16729] +[group_16730] +[group_16731] +[group_16732] +[group_16733] +[group_16734] +[group_16735] +[group_16736] +[group_16737] +[group_16738] +[group_16739] +[group_16740] +[group_16741] +[group_16742] +[group_16743] +[group_16744] +[group_16745] +[group_16746] +[group_16747] +[group_16748] +[group_16749] +[group_16750] +[group_16751] +[group_16752] +[group_16753] +[group_16754] +[group_16755] +[group_16756] +[group_16757] +[group_16758] +[group_16759] +[group_16760] +[group_16761] +[group_16762] +[group_16763] +[group_16764] +[group_16765] +[group_16766] +[group_16767] +[group_16768] +[group_16769] +[group_16770] +[group_16771] +[group_16772] +[group_16773] +[group_16774] +[group_16775] +[group_16776] +[group_16777] +[group_16778] +[group_16779] +[group_16780] +[group_16781] +[group_16782] +[group_16783] +[group_16784] +[group_16785] +[group_16786] +[group_16787] +[group_16788] +[group_16789] +[group_16790] +[group_16791] +[group_16792] +[group_16793] +[group_16794] +[group_16795] +[group_16796] +[group_16797] +[group_16798] +[group_16799] +[group_16800] +[group_16801] +[group_16802] +[group_16803] +[group_16804] +[group_16805] +[group_16806] +[group_16807] +[group_16808] +[group_16809] +[group_16810] +[group_16811] +[group_16812] +[group_16813] +[group_16814] +[group_16815] +[group_16816] +[group_16817] +[group_16818] +[group_16819] +[group_16820] +[group_16821] +[group_16822] +[group_16823] +[group_16824] +[group_16825] +[group_16826] +[group_16827] +[group_16828] +[group_16829] +[group_16830] +[group_16831] +[group_16832] +[group_16833] +[group_16834] +[group_16835] +[group_16836] +[group_16837] +[group_16838] +[group_16839] +[group_16840] +[group_16841] +[group_16842] +[group_16843] +[group_16844] +[group_16845] +[group_16846] +[group_16847] +[group_16848] +[group_16849] +[group_16850] +[group_16851] +[group_16852] +[group_16853] +[group_16854] +[group_16855] +[group_16856] +[group_16857] +[group_16858] +[group_16859] +[group_16860] +[group_16861] +[group_16862] +[group_16863] +[group_16864] +[group_16865] +[group_16866] +[group_16867] +[group_16868] +[group_16869] +[group_16870] +[group_16871] +[group_16872] +[group_16873] +[group_16874] +[group_16875] +[group_16876] +[group_16877] +[group_16878] +[group_16879] +[group_16880] +[group_16881] +[group_16882] +[group_16883] +[group_16884] +[group_16885] +[group_16886] +[group_16887] +[group_16888] +[group_16889] +[group_16890] +[group_16891] +[group_16892] +[group_16893] +[group_16894] +[group_16895] +[group_16896] +[group_16897] +[group_16898] +[group_16899] +[group_16900] +[group_16901] +[group_16902] +[group_16903] +[group_16904] +[group_16905] +[group_16906] +[group_16907] +[group_16908] +[group_16909] +[group_16910] +[group_16911] +[group_16912] +[group_16913] +[group_16914] +[group_16915] +[group_16916] +[group_16917] +[group_16918] +[group_16919] +[group_16920] +[group_16921] +[group_16922] +[group_16923] +[group_16924] +[group_16925] +[group_16926] +[group_16927] +[group_16928] +[group_16929] +[group_16930] +[group_16931] +[group_16932] +[group_16933] +[group_16934] +[group_16935] +[group_16936] +[group_16937] +[group_16938] +[group_16939] +[group_16940] +[group_16941] +[group_16942] +[group_16943] +[group_16944] +[group_16945] +[group_16946] +[group_16947] +[group_16948] +[group_16949] +[group_16950] +[group_16951] +[group_16952] +[group_16953] +[group_16954] +[group_16955] +[group_16956] +[group_16957] +[group_16958] +[group_16959] +[group_16960] +[group_16961] +[group_16962] +[group_16963] +[group_16964] +[group_16965] +[group_16966] +[group_16967] +[group_16968] +[group_16969] +[group_16970] +[group_16971] +[group_16972] +[group_16973] +[group_16974] +[group_16975] +[group_16976] +[group_16977] +[group_16978] +[group_16979] +[group_16980] +[group_16981] +[group_16982] +[group_16983] +[group_16984] +[group_16985] +[group_16986] +[group_16987] +[group_16988] +[group_16989] +[group_16990] +[group_16991] +[group_16992] +[group_16993] +[group_16994] +[group_16995] +[group_16996] +[group_16997] +[group_16998] +[group_16999] +[group_17000] +[group_17001] +[group_17002] +[group_17003] +[group_17004] +[group_17005] +[group_17006] +[group_17007] +[group_17008] +[group_17009] +[group_17010] +[group_17011] +[group_17012] +[group_17013] +[group_17014] +[group_17015] +[group_17016] +[group_17017] +[group_17018] +[group_17019] +[group_17020] +[group_17021] +[group_17022] +[group_17023] +[group_17024] +[group_17025] +[group_17026] +[group_17027] +[group_17028] +[group_17029] +[group_17030] +[group_17031] +[group_17032] +[group_17033] +[group_17034] +[group_17035] +[group_17036] +[group_17037] +[group_17038] +[group_17039] +[group_17040] +[group_17041] +[group_17042] +[group_17043] +[group_17044] +[group_17045] +[group_17046] +[group_17047] +[group_17048] +[group_17049] +[group_17050] +[group_17051] +[group_17052] +[group_17053] +[group_17054] +[group_17055] +[group_17056] +[group_17057] +[group_17058] +[group_17059] +[group_17060] +[group_17061] +[group_17062] +[group_17063] +[group_17064] +[group_17065] +[group_17066] +[group_17067] +[group_17068] +[group_17069] +[group_17070] +[group_17071] +[group_17072] +[group_17073] +[group_17074] +[group_17075] +[group_17076] +[group_17077] +[group_17078] +[group_17079] +[group_17080] +[group_17081] +[group_17082] +[group_17083] +[group_17084] +[group_17085] +[group_17086] +[group_17087] +[group_17088] +[group_17089] +[group_17090] +[group_17091] +[group_17092] +[group_17093] +[group_17094] +[group_17095] +[group_17096] +[group_17097] +[group_17098] +[group_17099] +[group_17100] +[group_17101] +[group_17102] +[group_17103] +[group_17104] +[group_17105] +[group_17106] +[group_17107] +[group_17108] +[group_17109] +[group_17110] +[group_17111] +[group_17112] +[group_17113] +[group_17114] +[group_17115] +[group_17116] +[group_17117] +[group_17118] +[group_17119] +[group_17120] +[group_17121] +[group_17122] +[group_17123] +[group_17124] +[group_17125] +[group_17126] +[group_17127] +[group_17128] +[group_17129] +[group_17130] +[group_17131] +[group_17132] +[group_17133] +[group_17134] +[group_17135] +[group_17136] +[group_17137] +[group_17138] +[group_17139] +[group_17140] +[group_17141] +[group_17142] +[group_17143] +[group_17144] +[group_17145] +[group_17146] +[group_17147] +[group_17148] +[group_17149] +[group_17150] +[group_17151] +[group_17152] +[group_17153] +[group_17154] +[group_17155] +[group_17156] +[group_17157] +[group_17158] +[group_17159] +[group_17160] +[group_17161] +[group_17162] +[group_17163] +[group_17164] +[group_17165] +[group_17166] +[group_17167] +[group_17168] +[group_17169] +[group_17170] +[group_17171] +[group_17172] +[group_17173] +[group_17174] +[group_17175] +[group_17176] +[group_17177] +[group_17178] +[group_17179] +[group_17180] +[group_17181] +[group_17182] +[group_17183] +[group_17184] +[group_17185] +[group_17186] +[group_17187] +[group_17188] +[group_17189] +[group_17190] +[group_17191] +[group_17192] +[group_17193] +[group_17194] +[group_17195] +[group_17196] +[group_17197] +[group_17198] +[group_17199] +[group_17200] +[group_17201] +[group_17202] +[group_17203] +[group_17204] +[group_17205] +[group_17206] +[group_17207] +[group_17208] +[group_17209] +[group_17210] +[group_17211] +[group_17212] +[group_17213] +[group_17214] +[group_17215] +[group_17216] +[group_17217] +[group_17218] +[group_17219] +[group_17220] +[group_17221] +[group_17222] +[group_17223] +[group_17224] +[group_17225] +[group_17226] +[group_17227] +[group_17228] +[group_17229] +[group_17230] +[group_17231] +[group_17232] +[group_17233] +[group_17234] +[group_17235] +[group_17236] +[group_17237] +[group_17238] +[group_17239] +[group_17240] +[group_17241] +[group_17242] +[group_17243] +[group_17244] +[group_17245] +[group_17246] +[group_17247] +[group_17248] +[group_17249] +[group_17250] +[group_17251] +[group_17252] +[group_17253] +[group_17254] +[group_17255] +[group_17256] +[group_17257] +[group_17258] +[group_17259] +[group_17260] +[group_17261] +[group_17262] +[group_17263] +[group_17264] +[group_17265] +[group_17266] +[group_17267] +[group_17268] +[group_17269] +[group_17270] +[group_17271] +[group_17272] +[group_17273] +[group_17274] +[group_17275] +[group_17276] +[group_17277] +[group_17278] +[group_17279] +[group_17280] +[group_17281] +[group_17282] +[group_17283] +[group_17284] +[group_17285] +[group_17286] +[group_17287] +[group_17288] +[group_17289] +[group_17290] +[group_17291] +[group_17292] +[group_17293] +[group_17294] +[group_17295] +[group_17296] +[group_17297] +[group_17298] +[group_17299] +[group_17300] +[group_17301] +[group_17302] +[group_17303] +[group_17304] +[group_17305] +[group_17306] +[group_17307] +[group_17308] +[group_17309] +[group_17310] +[group_17311] +[group_17312] +[group_17313] +[group_17314] +[group_17315] +[group_17316] +[group_17317] +[group_17318] +[group_17319] +[group_17320] +[group_17321] +[group_17322] +[group_17323] +[group_17324] +[group_17325] +[group_17326] +[group_17327] +[group_17328] +[group_17329] +[group_17330] +[group_17331] +[group_17332] +[group_17333] +[group_17334] +[group_17335] +[group_17336] +[group_17337] +[group_17338] +[group_17339] +[group_17340] +[group_17341] +[group_17342] +[group_17343] +[group_17344] +[group_17345] +[group_17346] +[group_17347] +[group_17348] +[group_17349] +[group_17350] +[group_17351] +[group_17352] +[group_17353] +[group_17354] +[group_17355] +[group_17356] +[group_17357] +[group_17358] +[group_17359] +[group_17360] +[group_17361] +[group_17362] +[group_17363] +[group_17364] +[group_17365] +[group_17366] +[group_17367] +[group_17368] +[group_17369] +[group_17370] +[group_17371] +[group_17372] +[group_17373] +[group_17374] +[group_17375] +[group_17376] +[group_17377] +[group_17378] +[group_17379] +[group_17380] +[group_17381] +[group_17382] +[group_17383] +[group_17384] +[group_17385] +[group_17386] +[group_17387] +[group_17388] +[group_17389] +[group_17390] +[group_17391] +[group_17392] +[group_17393] +[group_17394] +[group_17395] +[group_17396] +[group_17397] +[group_17398] +[group_17399] +[group_17400] +[group_17401] +[group_17402] +[group_17403] +[group_17404] +[group_17405] +[group_17406] +[group_17407] +[group_17408] +[group_17409] +[group_17410] +[group_17411] +[group_17412] +[group_17413] +[group_17414] +[group_17415] +[group_17416] +[group_17417] +[group_17418] +[group_17419] +[group_17420] +[group_17421] +[group_17422] +[group_17423] +[group_17424] +[group_17425] +[group_17426] +[group_17427] +[group_17428] +[group_17429] +[group_17430] +[group_17431] +[group_17432] +[group_17433] +[group_17434] +[group_17435] +[group_17436] +[group_17437] +[group_17438] +[group_17439] +[group_17440] +[group_17441] +[group_17442] +[group_17443] +[group_17444] +[group_17445] +[group_17446] +[group_17447] +[group_17448] +[group_17449] +[group_17450] +[group_17451] +[group_17452] +[group_17453] +[group_17454] +[group_17455] +[group_17456] +[group_17457] +[group_17458] +[group_17459] +[group_17460] +[group_17461] +[group_17462] +[group_17463] +[group_17464] +[group_17465] +[group_17466] +[group_17467] +[group_17468] +[group_17469] +[group_17470] +[group_17471] +[group_17472] +[group_17473] +[group_17474] +[group_17475] +[group_17476] +[group_17477] +[group_17478] +[group_17479] +[group_17480] +[group_17481] +[group_17482] +[group_17483] +[group_17484] +[group_17485] +[group_17486] +[group_17487] +[group_17488] +[group_17489] +[group_17490] +[group_17491] +[group_17492] +[group_17493] +[group_17494] +[group_17495] +[group_17496] +[group_17497] +[group_17498] +[group_17499] +[group_17500] +[group_17501] +[group_17502] +[group_17503] +[group_17504] +[group_17505] +[group_17506] +[group_17507] +[group_17508] +[group_17509] +[group_17510] +[group_17511] +[group_17512] +[group_17513] +[group_17514] +[group_17515] +[group_17516] +[group_17517] +[group_17518] +[group_17519] +[group_17520] +[group_17521] +[group_17522] +[group_17523] +[group_17524] +[group_17525] +[group_17526] +[group_17527] +[group_17528] +[group_17529] +[group_17530] +[group_17531] +[group_17532] +[group_17533] +[group_17534] +[group_17535] +[group_17536] +[group_17537] +[group_17538] +[group_17539] +[group_17540] +[group_17541] +[group_17542] +[group_17543] +[group_17544] +[group_17545] +[group_17546] +[group_17547] +[group_17548] +[group_17549] +[group_17550] +[group_17551] +[group_17552] +[group_17553] +[group_17554] +[group_17555] +[group_17556] +[group_17557] +[group_17558] +[group_17559] +[group_17560] +[group_17561] +[group_17562] +[group_17563] +[group_17564] +[group_17565] +[group_17566] +[group_17567] +[group_17568] +[group_17569] +[group_17570] +[group_17571] +[group_17572] +[group_17573] +[group_17574] +[group_17575] +[group_17576] +[group_17577] +[group_17578] +[group_17579] +[group_17580] +[group_17581] +[group_17582] +[group_17583] +[group_17584] +[group_17585] +[group_17586] +[group_17587] +[group_17588] +[group_17589] +[group_17590] +[group_17591] +[group_17592] +[group_17593] +[group_17594] +[group_17595] +[group_17596] +[group_17597] +[group_17598] +[group_17599] +[group_17600] +[group_17601] +[group_17602] +[group_17603] +[group_17604] +[group_17605] +[group_17606] +[group_17607] +[group_17608] +[group_17609] +[group_17610] +[group_17611] +[group_17612] +[group_17613] +[group_17614] +[group_17615] +[group_17616] +[group_17617] +[group_17618] +[group_17619] +[group_17620] +[group_17621] +[group_17622] +[group_17623] +[group_17624] +[group_17625] +[group_17626] +[group_17627] +[group_17628] +[group_17629] +[group_17630] +[group_17631] +[group_17632] +[group_17633] +[group_17634] +[group_17635] +[group_17636] +[group_17637] +[group_17638] +[group_17639] +[group_17640] +[group_17641] +[group_17642] +[group_17643] +[group_17644] +[group_17645] +[group_17646] +[group_17647] +[group_17648] +[group_17649] +[group_17650] +[group_17651] +[group_17652] +[group_17653] +[group_17654] +[group_17655] +[group_17656] +[group_17657] +[group_17658] +[group_17659] +[group_17660] +[group_17661] +[group_17662] +[group_17663] +[group_17664] +[group_17665] +[group_17666] +[group_17667] +[group_17668] +[group_17669] +[group_17670] +[group_17671] +[group_17672] +[group_17673] +[group_17674] +[group_17675] +[group_17676] +[group_17677] +[group_17678] +[group_17679] +[group_17680] +[group_17681] +[group_17682] +[group_17683] +[group_17684] +[group_17685] +[group_17686] +[group_17687] +[group_17688] +[group_17689] +[group_17690] +[group_17691] +[group_17692] +[group_17693] +[group_17694] +[group_17695] +[group_17696] +[group_17697] +[group_17698] +[group_17699] +[group_17700] +[group_17701] +[group_17702] +[group_17703] +[group_17704] +[group_17705] +[group_17706] +[group_17707] +[group_17708] +[group_17709] +[group_17710] +[group_17711] +[group_17712] +[group_17713] +[group_17714] +[group_17715] +[group_17716] +[group_17717] +[group_17718] +[group_17719] +[group_17720] +[group_17721] +[group_17722] +[group_17723] +[group_17724] +[group_17725] +[group_17726] +[group_17727] +[group_17728] +[group_17729] +[group_17730] +[group_17731] +[group_17732] +[group_17733] +[group_17734] +[group_17735] +[group_17736] +[group_17737] +[group_17738] +[group_17739] +[group_17740] +[group_17741] +[group_17742] +[group_17743] +[group_17744] +[group_17745] +[group_17746] +[group_17747] +[group_17748] +[group_17749] +[group_17750] +[group_17751] +[group_17752] +[group_17753] +[group_17754] +[group_17755] +[group_17756] +[group_17757] +[group_17758] +[group_17759] +[group_17760] +[group_17761] +[group_17762] +[group_17763] +[group_17764] +[group_17765] +[group_17766] +[group_17767] +[group_17768] +[group_17769] +[group_17770] +[group_17771] +[group_17772] +[group_17773] +[group_17774] +[group_17775] +[group_17776] +[group_17777] +[group_17778] +[group_17779] +[group_17780] +[group_17781] +[group_17782] +[group_17783] +[group_17784] +[group_17785] +[group_17786] +[group_17787] +[group_17788] +[group_17789] +[group_17790] +[group_17791] +[group_17792] +[group_17793] +[group_17794] +[group_17795] +[group_17796] +[group_17797] +[group_17798] +[group_17799] +[group_17800] +[group_17801] +[group_17802] +[group_17803] +[group_17804] +[group_17805] +[group_17806] +[group_17807] +[group_17808] +[group_17809] +[group_17810] +[group_17811] +[group_17812] +[group_17813] +[group_17814] +[group_17815] +[group_17816] +[group_17817] +[group_17818] +[group_17819] +[group_17820] +[group_17821] +[group_17822] +[group_17823] +[group_17824] +[group_17825] +[group_17826] +[group_17827] +[group_17828] +[group_17829] +[group_17830] +[group_17831] +[group_17832] +[group_17833] +[group_17834] +[group_17835] +[group_17836] +[group_17837] +[group_17838] +[group_17839] +[group_17840] +[group_17841] +[group_17842] +[group_17843] +[group_17844] +[group_17845] +[group_17846] +[group_17847] +[group_17848] +[group_17849] +[group_17850] +[group_17851] +[group_17852] +[group_17853] +[group_17854] +[group_17855] +[group_17856] +[group_17857] +[group_17858] +[group_17859] +[group_17860] +[group_17861] +[group_17862] +[group_17863] +[group_17864] +[group_17865] +[group_17866] +[group_17867] +[group_17868] +[group_17869] +[group_17870] +[group_17871] +[group_17872] +[group_17873] +[group_17874] +[group_17875] +[group_17876] +[group_17877] +[group_17878] +[group_17879] +[group_17880] +[group_17881] +[group_17882] +[group_17883] +[group_17884] +[group_17885] +[group_17886] +[group_17887] +[group_17888] +[group_17889] +[group_17890] +[group_17891] +[group_17892] +[group_17893] +[group_17894] +[group_17895] +[group_17896] +[group_17897] +[group_17898] +[group_17899] +[group_17900] +[group_17901] +[group_17902] +[group_17903] +[group_17904] +[group_17905] +[group_17906] +[group_17907] +[group_17908] +[group_17909] +[group_17910] +[group_17911] +[group_17912] +[group_17913] +[group_17914] +[group_17915] +[group_17916] +[group_17917] +[group_17918] +[group_17919] +[group_17920] +[group_17921] +[group_17922] +[group_17923] +[group_17924] +[group_17925] +[group_17926] +[group_17927] +[group_17928] +[group_17929] +[group_17930] +[group_17931] +[group_17932] +[group_17933] +[group_17934] +[group_17935] +[group_17936] +[group_17937] +[group_17938] +[group_17939] +[group_17940] +[group_17941] +[group_17942] +[group_17943] +[group_17944] +[group_17945] +[group_17946] +[group_17947] +[group_17948] +[group_17949] +[group_17950] +[group_17951] +[group_17952] +[group_17953] +[group_17954] +[group_17955] +[group_17956] +[group_17957] +[group_17958] +[group_17959] +[group_17960] +[group_17961] +[group_17962] +[group_17963] +[group_17964] +[group_17965] +[group_17966] +[group_17967] +[group_17968] +[group_17969] +[group_17970] +[group_17971] +[group_17972] +[group_17973] +[group_17974] +[group_17975] +[group_17976] +[group_17977] +[group_17978] +[group_17979] +[group_17980] +[group_17981] +[group_17982] +[group_17983] +[group_17984] +[group_17985] +[group_17986] +[group_17987] +[group_17988] +[group_17989] +[group_17990] +[group_17991] +[group_17992] +[group_17993] +[group_17994] +[group_17995] +[group_17996] +[group_17997] +[group_17998] +[group_17999] +[group_18000] +[group_18001] +[group_18002] +[group_18003] +[group_18004] +[group_18005] +[group_18006] +[group_18007] +[group_18008] +[group_18009] +[group_18010] +[group_18011] +[group_18012] +[group_18013] +[group_18014] +[group_18015] +[group_18016] +[group_18017] +[group_18018] +[group_18019] +[group_18020] +[group_18021] +[group_18022] +[group_18023] +[group_18024] +[group_18025] +[group_18026] +[group_18027] +[group_18028] +[group_18029] +[group_18030] +[group_18031] +[group_18032] +[group_18033] +[group_18034] +[group_18035] +[group_18036] +[group_18037] +[group_18038] +[group_18039] +[group_18040] +[group_18041] +[group_18042] +[group_18043] +[group_18044] +[group_18045] +[group_18046] +[group_18047] +[group_18048] +[group_18049] +[group_18050] +[group_18051] +[group_18052] +[group_18053] +[group_18054] +[group_18055] +[group_18056] +[group_18057] +[group_18058] +[group_18059] +[group_18060] +[group_18061] +[group_18062] +[group_18063] +[group_18064] +[group_18065] +[group_18066] +[group_18067] +[group_18068] +[group_18069] +[group_18070] +[group_18071] +[group_18072] +[group_18073] +[group_18074] +[group_18075] +[group_18076] +[group_18077] +[group_18078] +[group_18079] +[group_18080] +[group_18081] +[group_18082] +[group_18083] +[group_18084] +[group_18085] +[group_18086] +[group_18087] +[group_18088] +[group_18089] +[group_18090] +[group_18091] +[group_18092] +[group_18093] +[group_18094] +[group_18095] +[group_18096] +[group_18097] +[group_18098] +[group_18099] +[group_18100] +[group_18101] +[group_18102] +[group_18103] +[group_18104] +[group_18105] +[group_18106] +[group_18107] +[group_18108] +[group_18109] +[group_18110] +[group_18111] +[group_18112] +[group_18113] +[group_18114] +[group_18115] +[group_18116] +[group_18117] +[group_18118] +[group_18119] +[group_18120] +[group_18121] +[group_18122] +[group_18123] +[group_18124] +[group_18125] +[group_18126] +[group_18127] +[group_18128] +[group_18129] +[group_18130] +[group_18131] +[group_18132] +[group_18133] +[group_18134] +[group_18135] +[group_18136] +[group_18137] +[group_18138] +[group_18139] +[group_18140] +[group_18141] +[group_18142] +[group_18143] +[group_18144] +[group_18145] +[group_18146] +[group_18147] +[group_18148] +[group_18149] +[group_18150] +[group_18151] +[group_18152] +[group_18153] +[group_18154] +[group_18155] +[group_18156] +[group_18157] +[group_18158] +[group_18159] +[group_18160] +[group_18161] +[group_18162] +[group_18163] +[group_18164] +[group_18165] +[group_18166] +[group_18167] +[group_18168] +[group_18169] +[group_18170] +[group_18171] +[group_18172] +[group_18173] +[group_18174] +[group_18175] +[group_18176] +[group_18177] +[group_18178] +[group_18179] +[group_18180] +[group_18181] +[group_18182] +[group_18183] +[group_18184] +[group_18185] +[group_18186] +[group_18187] +[group_18188] +[group_18189] +[group_18190] +[group_18191] +[group_18192] +[group_18193] +[group_18194] +[group_18195] +[group_18196] +[group_18197] +[group_18198] +[group_18199] +[group_18200] +[group_18201] +[group_18202] +[group_18203] +[group_18204] +[group_18205] +[group_18206] +[group_18207] +[group_18208] +[group_18209] +[group_18210] +[group_18211] +[group_18212] +[group_18213] +[group_18214] +[group_18215] +[group_18216] +[group_18217] +[group_18218] +[group_18219] +[group_18220] +[group_18221] +[group_18222] +[group_18223] +[group_18224] +[group_18225] +[group_18226] +[group_18227] +[group_18228] +[group_18229] +[group_18230] +[group_18231] +[group_18232] +[group_18233] +[group_18234] +[group_18235] +[group_18236] +[group_18237] +[group_18238] +[group_18239] +[group_18240] +[group_18241] +[group_18242] +[group_18243] +[group_18244] +[group_18245] +[group_18246] +[group_18247] +[group_18248] +[group_18249] +[group_18250] +[group_18251] +[group_18252] +[group_18253] +[group_18254] +[group_18255] +[group_18256] +[group_18257] +[group_18258] +[group_18259] +[group_18260] +[group_18261] +[group_18262] +[group_18263] +[group_18264] +[group_18265] +[group_18266] +[group_18267] +[group_18268] +[group_18269] +[group_18270] +[group_18271] +[group_18272] +[group_18273] +[group_18274] +[group_18275] +[group_18276] +[group_18277] +[group_18278] +[group_18279] +[group_18280] +[group_18281] +[group_18282] +[group_18283] +[group_18284] +[group_18285] +[group_18286] +[group_18287] +[group_18288] +[group_18289] +[group_18290] +[group_18291] +[group_18292] +[group_18293] +[group_18294] +[group_18295] +[group_18296] +[group_18297] +[group_18298] +[group_18299] +[group_18300] +[group_18301] +[group_18302] +[group_18303] +[group_18304] +[group_18305] +[group_18306] +[group_18307] +[group_18308] +[group_18309] +[group_18310] +[group_18311] +[group_18312] +[group_18313] +[group_18314] +[group_18315] +[group_18316] +[group_18317] +[group_18318] +[group_18319] +[group_18320] +[group_18321] +[group_18322] +[group_18323] +[group_18324] +[group_18325] +[group_18326] +[group_18327] +[group_18328] +[group_18329] +[group_18330] +[group_18331] +[group_18332] +[group_18333] +[group_18334] +[group_18335] +[group_18336] +[group_18337] +[group_18338] +[group_18339] +[group_18340] +[group_18341] +[group_18342] +[group_18343] +[group_18344] +[group_18345] +[group_18346] +[group_18347] +[group_18348] +[group_18349] +[group_18350] +[group_18351] +[group_18352] +[group_18353] +[group_18354] +[group_18355] +[group_18356] +[group_18357] +[group_18358] +[group_18359] +[group_18360] +[group_18361] +[group_18362] +[group_18363] +[group_18364] +[group_18365] +[group_18366] +[group_18367] +[group_18368] +[group_18369] +[group_18370] +[group_18371] +[group_18372] +[group_18373] +[group_18374] +[group_18375] +[group_18376] +[group_18377] +[group_18378] +[group_18379] +[group_18380] +[group_18381] +[group_18382] +[group_18383] +[group_18384] +[group_18385] +[group_18386] +[group_18387] +[group_18388] +[group_18389] +[group_18390] +[group_18391] +[group_18392] +[group_18393] +[group_18394] +[group_18395] +[group_18396] +[group_18397] +[group_18398] +[group_18399] +[group_18400] +[group_18401] +[group_18402] +[group_18403] +[group_18404] +[group_18405] +[group_18406] +[group_18407] +[group_18408] +[group_18409] +[group_18410] +[group_18411] +[group_18412] +[group_18413] +[group_18414] +[group_18415] +[group_18416] +[group_18417] +[group_18418] +[group_18419] +[group_18420] +[group_18421] +[group_18422] +[group_18423] +[group_18424] +[group_18425] +[group_18426] +[group_18427] +[group_18428] +[group_18429] +[group_18430] +[group_18431] +[group_18432] +[group_18433] +[group_18434] +[group_18435] +[group_18436] +[group_18437] +[group_18438] +[group_18439] +[group_18440] +[group_18441] +[group_18442] +[group_18443] +[group_18444] +[group_18445] +[group_18446] +[group_18447] +[group_18448] +[group_18449] +[group_18450] +[group_18451] +[group_18452] +[group_18453] +[group_18454] +[group_18455] +[group_18456] +[group_18457] +[group_18458] +[group_18459] +[group_18460] +[group_18461] +[group_18462] +[group_18463] +[group_18464] +[group_18465] +[group_18466] +[group_18467] +[group_18468] +[group_18469] +[group_18470] +[group_18471] +[group_18472] +[group_18473] +[group_18474] +[group_18475] +[group_18476] +[group_18477] +[group_18478] +[group_18479] +[group_18480] +[group_18481] +[group_18482] +[group_18483] +[group_18484] +[group_18485] +[group_18486] +[group_18487] +[group_18488] +[group_18489] +[group_18490] +[group_18491] +[group_18492] +[group_18493] +[group_18494] +[group_18495] +[group_18496] +[group_18497] +[group_18498] +[group_18499] +[group_18500] +[group_18501] +[group_18502] +[group_18503] +[group_18504] +[group_18505] +[group_18506] +[group_18507] +[group_18508] +[group_18509] +[group_18510] +[group_18511] +[group_18512] +[group_18513] +[group_18514] +[group_18515] +[group_18516] +[group_18517] +[group_18518] +[group_18519] +[group_18520] +[group_18521] +[group_18522] +[group_18523] +[group_18524] +[group_18525] +[group_18526] +[group_18527] +[group_18528] +[group_18529] +[group_18530] +[group_18531] +[group_18532] +[group_18533] +[group_18534] +[group_18535] +[group_18536] +[group_18537] +[group_18538] +[group_18539] +[group_18540] +[group_18541] +[group_18542] +[group_18543] +[group_18544] +[group_18545] +[group_18546] +[group_18547] +[group_18548] +[group_18549] +[group_18550] +[group_18551] +[group_18552] +[group_18553] +[group_18554] +[group_18555] +[group_18556] +[group_18557] +[group_18558] +[group_18559] +[group_18560] +[group_18561] +[group_18562] +[group_18563] +[group_18564] +[group_18565] +[group_18566] +[group_18567] +[group_18568] +[group_18569] +[group_18570] +[group_18571] +[group_18572] +[group_18573] +[group_18574] +[group_18575] +[group_18576] +[group_18577] +[group_18578] +[group_18579] +[group_18580] +[group_18581] +[group_18582] +[group_18583] +[group_18584] +[group_18585] +[group_18586] +[group_18587] +[group_18588] +[group_18589] +[group_18590] +[group_18591] +[group_18592] +[group_18593] +[group_18594] +[group_18595] +[group_18596] +[group_18597] +[group_18598] +[group_18599] +[group_18600] +[group_18601] +[group_18602] +[group_18603] +[group_18604] +[group_18605] +[group_18606] +[group_18607] +[group_18608] +[group_18609] +[group_18610] +[group_18611] +[group_18612] +[group_18613] +[group_18614] +[group_18615] +[group_18616] +[group_18617] +[group_18618] +[group_18619] +[group_18620] +[group_18621] +[group_18622] +[group_18623] +[group_18624] +[group_18625] +[group_18626] +[group_18627] +[group_18628] +[group_18629] +[group_18630] +[group_18631] +[group_18632] +[group_18633] +[group_18634] +[group_18635] +[group_18636] +[group_18637] +[group_18638] +[group_18639] +[group_18640] +[group_18641] +[group_18642] +[group_18643] +[group_18644] +[group_18645] +[group_18646] +[group_18647] +[group_18648] +[group_18649] +[group_18650] +[group_18651] +[group_18652] +[group_18653] +[group_18654] +[group_18655] +[group_18656] +[group_18657] +[group_18658] +[group_18659] +[group_18660] +[group_18661] +[group_18662] +[group_18663] +[group_18664] +[group_18665] +[group_18666] +[group_18667] +[group_18668] +[group_18669] +[group_18670] +[group_18671] +[group_18672] +[group_18673] +[group_18674] +[group_18675] +[group_18676] +[group_18677] +[group_18678] +[group_18679] +[group_18680] +[group_18681] +[group_18682] +[group_18683] +[group_18684] +[group_18685] +[group_18686] +[group_18687] +[group_18688] +[group_18689] +[group_18690] +[group_18691] +[group_18692] +[group_18693] +[group_18694] +[group_18695] +[group_18696] +[group_18697] +[group_18698] +[group_18699] +[group_18700] +[group_18701] +[group_18702] +[group_18703] +[group_18704] +[group_18705] +[group_18706] +[group_18707] +[group_18708] +[group_18709] +[group_18710] +[group_18711] +[group_18712] +[group_18713] +[group_18714] +[group_18715] +[group_18716] +[group_18717] +[group_18718] +[group_18719] +[group_18720] +[group_18721] +[group_18722] +[group_18723] +[group_18724] +[group_18725] +[group_18726] +[group_18727] +[group_18728] +[group_18729] +[group_18730] +[group_18731] +[group_18732] +[group_18733] +[group_18734] +[group_18735] +[group_18736] +[group_18737] +[group_18738] +[group_18739] +[group_18740] +[group_18741] +[group_18742] +[group_18743] +[group_18744] +[group_18745] +[group_18746] +[group_18747] +[group_18748] +[group_18749] +[group_18750] +[group_18751] +[group_18752] +[group_18753] +[group_18754] +[group_18755] +[group_18756] +[group_18757] +[group_18758] +[group_18759] +[group_18760] +[group_18761] +[group_18762] +[group_18763] +[group_18764] +[group_18765] +[group_18766] +[group_18767] +[group_18768] +[group_18769] +[group_18770] +[group_18771] +[group_18772] +[group_18773] +[group_18774] +[group_18775] +[group_18776] +[group_18777] +[group_18778] +[group_18779] +[group_18780] +[group_18781] +[group_18782] +[group_18783] +[group_18784] +[group_18785] +[group_18786] +[group_18787] +[group_18788] +[group_18789] +[group_18790] +[group_18791] +[group_18792] +[group_18793] +[group_18794] +[group_18795] +[group_18796] +[group_18797] +[group_18798] +[group_18799] +[group_18800] +[group_18801] +[group_18802] +[group_18803] +[group_18804] +[group_18805] +[group_18806] +[group_18807] +[group_18808] +[group_18809] +[group_18810] +[group_18811] +[group_18812] +[group_18813] +[group_18814] +[group_18815] +[group_18816] +[group_18817] +[group_18818] +[group_18819] +[group_18820] +[group_18821] +[group_18822] +[group_18823] +[group_18824] +[group_18825] +[group_18826] +[group_18827] +[group_18828] +[group_18829] +[group_18830] +[group_18831] +[group_18832] +[group_18833] +[group_18834] +[group_18835] +[group_18836] +[group_18837] +[group_18838] +[group_18839] +[group_18840] +[group_18841] +[group_18842] +[group_18843] +[group_18844] +[group_18845] +[group_18846] +[group_18847] +[group_18848] +[group_18849] +[group_18850] +[group_18851] +[group_18852] +[group_18853] +[group_18854] +[group_18855] +[group_18856] +[group_18857] +[group_18858] +[group_18859] +[group_18860] +[group_18861] +[group_18862] +[group_18863] +[group_18864] +[group_18865] +[group_18866] +[group_18867] +[group_18868] +[group_18869] +[group_18870] +[group_18871] +[group_18872] +[group_18873] +[group_18874] +[group_18875] +[group_18876] +[group_18877] +[group_18878] +[group_18879] +[group_18880] +[group_18881] +[group_18882] +[group_18883] +[group_18884] +[group_18885] +[group_18886] +[group_18887] +[group_18888] +[group_18889] +[group_18890] +[group_18891] +[group_18892] +[group_18893] +[group_18894] +[group_18895] +[group_18896] +[group_18897] +[group_18898] +[group_18899] +[group_18900] +[group_18901] +[group_18902] +[group_18903] +[group_18904] +[group_18905] +[group_18906] +[group_18907] +[group_18908] +[group_18909] +[group_18910] +[group_18911] +[group_18912] +[group_18913] +[group_18914] +[group_18915] +[group_18916] +[group_18917] +[group_18918] +[group_18919] +[group_18920] +[group_18921] +[group_18922] +[group_18923] +[group_18924] +[group_18925] +[group_18926] +[group_18927] +[group_18928] +[group_18929] +[group_18930] +[group_18931] +[group_18932] +[group_18933] +[group_18934] +[group_18935] +[group_18936] +[group_18937] +[group_18938] +[group_18939] +[group_18940] +[group_18941] +[group_18942] +[group_18943] +[group_18944] +[group_18945] +[group_18946] +[group_18947] +[group_18948] +[group_18949] +[group_18950] +[group_18951] +[group_18952] +[group_18953] +[group_18954] +[group_18955] +[group_18956] +[group_18957] +[group_18958] +[group_18959] +[group_18960] +[group_18961] +[group_18962] +[group_18963] +[group_18964] +[group_18965] +[group_18966] +[group_18967] +[group_18968] +[group_18969] +[group_18970] +[group_18971] +[group_18972] +[group_18973] +[group_18974] +[group_18975] +[group_18976] +[group_18977] +[group_18978] +[group_18979] +[group_18980] +[group_18981] +[group_18982] +[group_18983] +[group_18984] +[group_18985] +[group_18986] +[group_18987] +[group_18988] +[group_18989] +[group_18990] +[group_18991] +[group_18992] +[group_18993] +[group_18994] +[group_18995] +[group_18996] +[group_18997] +[group_18998] +[group_18999] +[group_19000] +[group_19001] +[group_19002] +[group_19003] +[group_19004] +[group_19005] +[group_19006] +[group_19007] +[group_19008] +[group_19009] +[group_19010] +[group_19011] +[group_19012] +[group_19013] +[group_19014] +[group_19015] +[group_19016] +[group_19017] +[group_19018] +[group_19019] +[group_19020] +[group_19021] +[group_19022] +[group_19023] +[group_19024] +[group_19025] +[group_19026] +[group_19027] +[group_19028] +[group_19029] +[group_19030] +[group_19031] +[group_19032] +[group_19033] +[group_19034] +[group_19035] +[group_19036] +[group_19037] +[group_19038] +[group_19039] +[group_19040] +[group_19041] +[group_19042] +[group_19043] +[group_19044] +[group_19045] +[group_19046] +[group_19047] +[group_19048] +[group_19049] +[group_19050] +[group_19051] +[group_19052] +[group_19053] +[group_19054] +[group_19055] +[group_19056] +[group_19057] +[group_19058] +[group_19059] +[group_19060] +[group_19061] +[group_19062] +[group_19063] +[group_19064] +[group_19065] +[group_19066] +[group_19067] +[group_19068] +[group_19069] +[group_19070] +[group_19071] +[group_19072] +[group_19073] +[group_19074] +[group_19075] +[group_19076] +[group_19077] +[group_19078] +[group_19079] +[group_19080] +[group_19081] +[group_19082] +[group_19083] +[group_19084] +[group_19085] +[group_19086] +[group_19087] +[group_19088] +[group_19089] +[group_19090] +[group_19091] +[group_19092] +[group_19093] +[group_19094] +[group_19095] +[group_19096] +[group_19097] +[group_19098] +[group_19099] +[group_19100] +[group_19101] +[group_19102] +[group_19103] +[group_19104] +[group_19105] +[group_19106] +[group_19107] +[group_19108] +[group_19109] +[group_19110] +[group_19111] +[group_19112] +[group_19113] +[group_19114] +[group_19115] +[group_19116] +[group_19117] +[group_19118] +[group_19119] +[group_19120] +[group_19121] +[group_19122] +[group_19123] +[group_19124] +[group_19125] +[group_19126] +[group_19127] +[group_19128] +[group_19129] +[group_19130] +[group_19131] +[group_19132] +[group_19133] +[group_19134] +[group_19135] +[group_19136] +[group_19137] +[group_19138] +[group_19139] +[group_19140] +[group_19141] +[group_19142] +[group_19143] +[group_19144] +[group_19145] +[group_19146] +[group_19147] +[group_19148] +[group_19149] +[group_19150] +[group_19151] +[group_19152] +[group_19153] +[group_19154] +[group_19155] +[group_19156] +[group_19157] +[group_19158] +[group_19159] +[group_19160] +[group_19161] +[group_19162] +[group_19163] +[group_19164] +[group_19165] +[group_19166] +[group_19167] +[group_19168] +[group_19169] +[group_19170] +[group_19171] +[group_19172] +[group_19173] +[group_19174] +[group_19175] +[group_19176] +[group_19177] +[group_19178] +[group_19179] +[group_19180] +[group_19181] +[group_19182] +[group_19183] +[group_19184] +[group_19185] +[group_19186] +[group_19187] +[group_19188] +[group_19189] +[group_19190] +[group_19191] +[group_19192] +[group_19193] +[group_19194] +[group_19195] +[group_19196] +[group_19197] +[group_19198] +[group_19199] +[group_19200] +[group_19201] +[group_19202] +[group_19203] +[group_19204] +[group_19205] +[group_19206] +[group_19207] +[group_19208] +[group_19209] +[group_19210] +[group_19211] +[group_19212] +[group_19213] +[group_19214] +[group_19215] +[group_19216] +[group_19217] +[group_19218] +[group_19219] +[group_19220] +[group_19221] +[group_19222] +[group_19223] +[group_19224] +[group_19225] +[group_19226] +[group_19227] +[group_19228] +[group_19229] +[group_19230] +[group_19231] +[group_19232] +[group_19233] +[group_19234] +[group_19235] +[group_19236] +[group_19237] +[group_19238] +[group_19239] +[group_19240] +[group_19241] +[group_19242] +[group_19243] +[group_19244] +[group_19245] +[group_19246] +[group_19247] +[group_19248] +[group_19249] +[group_19250] +[group_19251] +[group_19252] +[group_19253] +[group_19254] +[group_19255] +[group_19256] +[group_19257] +[group_19258] +[group_19259] +[group_19260] +[group_19261] +[group_19262] +[group_19263] +[group_19264] +[group_19265] +[group_19266] +[group_19267] +[group_19268] +[group_19269] +[group_19270] +[group_19271] +[group_19272] +[group_19273] +[group_19274] +[group_19275] +[group_19276] +[group_19277] +[group_19278] +[group_19279] +[group_19280] +[group_19281] +[group_19282] +[group_19283] +[group_19284] +[group_19285] +[group_19286] +[group_19287] +[group_19288] +[group_19289] +[group_19290] +[group_19291] +[group_19292] +[group_19293] +[group_19294] +[group_19295] +[group_19296] +[group_19297] +[group_19298] +[group_19299] +[group_19300] +[group_19301] +[group_19302] +[group_19303] +[group_19304] +[group_19305] +[group_19306] +[group_19307] +[group_19308] +[group_19309] +[group_19310] +[group_19311] +[group_19312] +[group_19313] +[group_19314] +[group_19315] +[group_19316] +[group_19317] +[group_19318] +[group_19319] +[group_19320] +[group_19321] +[group_19322] +[group_19323] +[group_19324] +[group_19325] +[group_19326] +[group_19327] +[group_19328] +[group_19329] +[group_19330] +[group_19331] +[group_19332] +[group_19333] +[group_19334] +[group_19335] +[group_19336] +[group_19337] +[group_19338] +[group_19339] +[group_19340] +[group_19341] +[group_19342] +[group_19343] +[group_19344] +[group_19345] +[group_19346] +[group_19347] +[group_19348] +[group_19349] +[group_19350] +[group_19351] +[group_19352] +[group_19353] +[group_19354] +[group_19355] +[group_19356] +[group_19357] +[group_19358] +[group_19359] +[group_19360] +[group_19361] +[group_19362] +[group_19363] +[group_19364] +[group_19365] +[group_19366] +[group_19367] +[group_19368] +[group_19369] +[group_19370] +[group_19371] +[group_19372] +[group_19373] +[group_19374] +[group_19375] +[group_19376] +[group_19377] +[group_19378] +[group_19379] +[group_19380] +[group_19381] +[group_19382] +[group_19383] +[group_19384] +[group_19385] +[group_19386] +[group_19387] +[group_19388] +[group_19389] +[group_19390] +[group_19391] +[group_19392] +[group_19393] +[group_19394] +[group_19395] +[group_19396] +[group_19397] +[group_19398] +[group_19399] +[group_19400] +[group_19401] +[group_19402] +[group_19403] +[group_19404] +[group_19405] +[group_19406] +[group_19407] +[group_19408] +[group_19409] +[group_19410] +[group_19411] +[group_19412] +[group_19413] +[group_19414] +[group_19415] +[group_19416] +[group_19417] +[group_19418] +[group_19419] +[group_19420] +[group_19421] +[group_19422] +[group_19423] +[group_19424] +[group_19425] +[group_19426] +[group_19427] +[group_19428] +[group_19429] +[group_19430] +[group_19431] +[group_19432] +[group_19433] +[group_19434] +[group_19435] +[group_19436] +[group_19437] +[group_19438] +[group_19439] +[group_19440] +[group_19441] +[group_19442] +[group_19443] +[group_19444] +[group_19445] +[group_19446] +[group_19447] +[group_19448] +[group_19449] +[group_19450] +[group_19451] +[group_19452] +[group_19453] +[group_19454] +[group_19455] +[group_19456] +[group_19457] +[group_19458] +[group_19459] +[group_19460] +[group_19461] +[group_19462] +[group_19463] +[group_19464] +[group_19465] +[group_19466] +[group_19467] +[group_19468] +[group_19469] +[group_19470] +[group_19471] +[group_19472] +[group_19473] +[group_19474] +[group_19475] +[group_19476] +[group_19477] +[group_19478] +[group_19479] +[group_19480] +[group_19481] +[group_19482] +[group_19483] +[group_19484] +[group_19485] +[group_19486] +[group_19487] +[group_19488] +[group_19489] +[group_19490] +[group_19491] +[group_19492] +[group_19493] +[group_19494] +[group_19495] +[group_19496] +[group_19497] +[group_19498] +[group_19499] +[group_19500] +[group_19501] +[group_19502] +[group_19503] +[group_19504] +[group_19505] +[group_19506] +[group_19507] +[group_19508] +[group_19509] +[group_19510] +[group_19511] +[group_19512] +[group_19513] +[group_19514] +[group_19515] +[group_19516] +[group_19517] +[group_19518] +[group_19519] +[group_19520] +[group_19521] +[group_19522] +[group_19523] +[group_19524] +[group_19525] +[group_19526] +[group_19527] +[group_19528] +[group_19529] +[group_19530] +[group_19531] +[group_19532] +[group_19533] +[group_19534] +[group_19535] +[group_19536] +[group_19537] +[group_19538] +[group_19539] +[group_19540] +[group_19541] +[group_19542] +[group_19543] +[group_19544] +[group_19545] +[group_19546] +[group_19547] +[group_19548] +[group_19549] +[group_19550] +[group_19551] +[group_19552] +[group_19553] +[group_19554] +[group_19555] +[group_19556] +[group_19557] +[group_19558] +[group_19559] +[group_19560] +[group_19561] +[group_19562] +[group_19563] +[group_19564] +[group_19565] +[group_19566] +[group_19567] +[group_19568] +[group_19569] +[group_19570] +[group_19571] +[group_19572] +[group_19573] +[group_19574] +[group_19575] +[group_19576] +[group_19577] +[group_19578] +[group_19579] +[group_19580] +[group_19581] +[group_19582] +[group_19583] +[group_19584] +[group_19585] +[group_19586] +[group_19587] +[group_19588] +[group_19589] +[group_19590] +[group_19591] +[group_19592] +[group_19593] +[group_19594] +[group_19595] +[group_19596] +[group_19597] +[group_19598] +[group_19599] +[group_19600] +[group_19601] +[group_19602] +[group_19603] +[group_19604] +[group_19605] +[group_19606] +[group_19607] +[group_19608] +[group_19609] +[group_19610] +[group_19611] +[group_19612] +[group_19613] +[group_19614] +[group_19615] +[group_19616] +[group_19617] +[group_19618] +[group_19619] +[group_19620] +[group_19621] +[group_19622] +[group_19623] +[group_19624] +[group_19625] +[group_19626] +[group_19627] +[group_19628] +[group_19629] +[group_19630] +[group_19631] +[group_19632] +[group_19633] +[group_19634] +[group_19635] +[group_19636] +[group_19637] +[group_19638] +[group_19639] +[group_19640] +[group_19641] +[group_19642] +[group_19643] +[group_19644] +[group_19645] +[group_19646] +[group_19647] +[group_19648] +[group_19649] +[group_19650] +[group_19651] +[group_19652] +[group_19653] +[group_19654] +[group_19655] +[group_19656] +[group_19657] +[group_19658] +[group_19659] +[group_19660] +[group_19661] +[group_19662] +[group_19663] +[group_19664] +[group_19665] +[group_19666] +[group_19667] +[group_19668] +[group_19669] +[group_19670] +[group_19671] +[group_19672] +[group_19673] +[group_19674] +[group_19675] +[group_19676] +[group_19677] +[group_19678] +[group_19679] +[group_19680] +[group_19681] +[group_19682] +[group_19683] +[group_19684] +[group_19685] +[group_19686] +[group_19687] +[group_19688] +[group_19689] +[group_19690] +[group_19691] +[group_19692] +[group_19693] +[group_19694] +[group_19695] +[group_19696] +[group_19697] +[group_19698] +[group_19699] +[group_19700] +[group_19701] +[group_19702] +[group_19703] +[group_19704] +[group_19705] +[group_19706] +[group_19707] +[group_19708] +[group_19709] +[group_19710] +[group_19711] +[group_19712] +[group_19713] +[group_19714] +[group_19715] +[group_19716] +[group_19717] +[group_19718] +[group_19719] +[group_19720] +[group_19721] +[group_19722] +[group_19723] +[group_19724] +[group_19725] +[group_19726] +[group_19727] +[group_19728] +[group_19729] +[group_19730] +[group_19731] +[group_19732] +[group_19733] +[group_19734] +[group_19735] +[group_19736] +[group_19737] +[group_19738] +[group_19739] +[group_19740] +[group_19741] +[group_19742] +[group_19743] +[group_19744] +[group_19745] +[group_19746] +[group_19747] +[group_19748] +[group_19749] +[group_19750] +[group_19751] +[group_19752] +[group_19753] +[group_19754] +[group_19755] +[group_19756] +[group_19757] +[group_19758] +[group_19759] +[group_19760] +[group_19761] +[group_19762] +[group_19763] +[group_19764] +[group_19765] +[group_19766] +[group_19767] +[group_19768] +[group_19769] +[group_19770] +[group_19771] +[group_19772] +[group_19773] +[group_19774] +[group_19775] +[group_19776] +[group_19777] +[group_19778] +[group_19779] +[group_19780] +[group_19781] +[group_19782] +[group_19783] +[group_19784] +[group_19785] +[group_19786] +[group_19787] +[group_19788] +[group_19789] +[group_19790] +[group_19791] +[group_19792] +[group_19793] +[group_19794] +[group_19795] +[group_19796] +[group_19797] +[group_19798] +[group_19799] +[group_19800] +[group_19801] +[group_19802] +[group_19803] +[group_19804] +[group_19805] +[group_19806] +[group_19807] +[group_19808] +[group_19809] +[group_19810] +[group_19811] +[group_19812] +[group_19813] +[group_19814] +[group_19815] +[group_19816] +[group_19817] +[group_19818] +[group_19819] +[group_19820] +[group_19821] +[group_19822] +[group_19823] +[group_19824] +[group_19825] +[group_19826] +[group_19827] +[group_19828] +[group_19829] +[group_19830] +[group_19831] +[group_19832] +[group_19833] +[group_19834] +[group_19835] +[group_19836] +[group_19837] +[group_19838] +[group_19839] +[group_19840] +[group_19841] +[group_19842] +[group_19843] +[group_19844] +[group_19845] +[group_19846] +[group_19847] +[group_19848] +[group_19849] +[group_19850] +[group_19851] +[group_19852] +[group_19853] +[group_19854] +[group_19855] +[group_19856] +[group_19857] +[group_19858] +[group_19859] +[group_19860] +[group_19861] +[group_19862] +[group_19863] +[group_19864] +[group_19865] +[group_19866] +[group_19867] +[group_19868] +[group_19869] +[group_19870] +[group_19871] +[group_19872] +[group_19873] +[group_19874] +[group_19875] +[group_19876] +[group_19877] +[group_19878] +[group_19879] +[group_19880] +[group_19881] +[group_19882] +[group_19883] +[group_19884] +[group_19885] +[group_19886] +[group_19887] +[group_19888] +[group_19889] +[group_19890] +[group_19891] +[group_19892] +[group_19893] +[group_19894] +[group_19895] +[group_19896] +[group_19897] +[group_19898] +[group_19899] +[group_19900] +[group_19901] +[group_19902] +[group_19903] +[group_19904] +[group_19905] +[group_19906] +[group_19907] +[group_19908] +[group_19909] +[group_19910] +[group_19911] +[group_19912] +[group_19913] +[group_19914] +[group_19915] +[group_19916] +[group_19917] +[group_19918] +[group_19919] +[group_19920] +[group_19921] +[group_19922] +[group_19923] +[group_19924] +[group_19925] +[group_19926] +[group_19927] +[group_19928] +[group_19929] +[group_19930] +[group_19931] +[group_19932] +[group_19933] +[group_19934] +[group_19935] +[group_19936] +[group_19937] +[group_19938] +[group_19939] +[group_19940] +[group_19941] +[group_19942] +[group_19943] +[group_19944] +[group_19945] +[group_19946] +[group_19947] +[group_19948] +[group_19949] +[group_19950] +[group_19951] +[group_19952] +[group_19953] +[group_19954] +[group_19955] +[group_19956] +[group_19957] +[group_19958] +[group_19959] +[group_19960] +[group_19961] +[group_19962] +[group_19963] +[group_19964] +[group_19965] +[group_19966] +[group_19967] +[group_19968] +[group_19969] +[group_19970] +[group_19971] +[group_19972] +[group_19973] +[group_19974] +[group_19975] +[group_19976] +[group_19977] +[group_19978] +[group_19979] +[group_19980] +[group_19981] +[group_19982] +[group_19983] +[group_19984] +[group_19985] +[group_19986] +[group_19987] +[group_19988] +[group_19989] +[group_19990] +[group_19991] +[group_19992] +[group_19993] +[group_19994] +[group_19995] +[group_19996] +[group_19997] +[group_19998] +[group_19999] +[group_20000] +[group_20001] +[group_20002] +[group_20003] +[group_20004] +[group_20005] +[group_20006] +[group_20007] +[group_20008] +[group_20009] +[group_20010] +[group_20011] +[group_20012] +[group_20013] +[group_20014] +[group_20015] +[group_20016] +[group_20017] +[group_20018] +[group_20019] +[group_20020] +[group_20021] +[group_20022] +[group_20023] +[group_20024] +[group_20025] +[group_20026] +[group_20027] +[group_20028] +[group_20029] +[group_20030] +[group_20031] +[group_20032] +[group_20033] +[group_20034] +[group_20035] +[group_20036] +[group_20037] +[group_20038] +[group_20039] +[group_20040] +[group_20041] +[group_20042] +[group_20043] +[group_20044] +[group_20045] +[group_20046] +[group_20047] +[group_20048] +[group_20049] +[group_20050] +[group_20051] +[group_20052] +[group_20053] +[group_20054] +[group_20055] +[group_20056] +[group_20057] +[group_20058] +[group_20059] +[group_20060] +[group_20061] +[group_20062] +[group_20063] +[group_20064] +[group_20065] +[group_20066] +[group_20067] +[group_20068] +[group_20069] +[group_20070] +[group_20071] +[group_20072] +[group_20073] +[group_20074] +[group_20075] +[group_20076] +[group_20077] +[group_20078] +[group_20079] +[group_20080] +[group_20081] +[group_20082] +[group_20083] +[group_20084] +[group_20085] +[group_20086] +[group_20087] +[group_20088] +[group_20089] +[group_20090] +[group_20091] +[group_20092] +[group_20093] +[group_20094] +[group_20095] +[group_20096] +[group_20097] +[group_20098] +[group_20099] +[group_20100] +[group_20101] +[group_20102] +[group_20103] +[group_20104] +[group_20105] +[group_20106] +[group_20107] +[group_20108] +[group_20109] +[group_20110] +[group_20111] +[group_20112] +[group_20113] +[group_20114] +[group_20115] +[group_20116] +[group_20117] +[group_20118] +[group_20119] +[group_20120] +[group_20121] +[group_20122] +[group_20123] +[group_20124] +[group_20125] +[group_20126] +[group_20127] +[group_20128] +[group_20129] +[group_20130] +[group_20131] +[group_20132] +[group_20133] +[group_20134] +[group_20135] +[group_20136] +[group_20137] +[group_20138] +[group_20139] +[group_20140] +[group_20141] +[group_20142] +[group_20143] +[group_20144] +[group_20145] +[group_20146] +[group_20147] +[group_20148] +[group_20149] +[group_20150] +[group_20151] +[group_20152] +[group_20153] +[group_20154] +[group_20155] +[group_20156] +[group_20157] +[group_20158] +[group_20159] +[group_20160] +[group_20161] +[group_20162] +[group_20163] +[group_20164] +[group_20165] +[group_20166] +[group_20167] +[group_20168] +[group_20169] +[group_20170] +[group_20171] +[group_20172] +[group_20173] +[group_20174] +[group_20175] +[group_20176] +[group_20177] +[group_20178] +[group_20179] +[group_20180] +[group_20181] +[group_20182] +[group_20183] +[group_20184] +[group_20185] +[group_20186] +[group_20187] +[group_20188] +[group_20189] +[group_20190] +[group_20191] +[group_20192] +[group_20193] +[group_20194] +[group_20195] +[group_20196] +[group_20197] +[group_20198] +[group_20199] +[group_20200] +[group_20201] +[group_20202] +[group_20203] +[group_20204] +[group_20205] +[group_20206] +[group_20207] +[group_20208] +[group_20209] +[group_20210] +[group_20211] +[group_20212] +[group_20213] +[group_20214] +[group_20215] +[group_20216] +[group_20217] +[group_20218] +[group_20219] +[group_20220] +[group_20221] +[group_20222] +[group_20223] +[group_20224] +[group_20225] +[group_20226] +[group_20227] +[group_20228] +[group_20229] +[group_20230] +[group_20231] +[group_20232] +[group_20233] +[group_20234] +[group_20235] +[group_20236] +[group_20237] +[group_20238] +[group_20239] +[group_20240] +[group_20241] +[group_20242] +[group_20243] +[group_20244] +[group_20245] +[group_20246] +[group_20247] +[group_20248] +[group_20249] +[group_20250] +[group_20251] +[group_20252] +[group_20253] +[group_20254] +[group_20255] +[group_20256] +[group_20257] +[group_20258] +[group_20259] +[group_20260] +[group_20261] +[group_20262] +[group_20263] +[group_20264] +[group_20265] +[group_20266] +[group_20267] +[group_20268] +[group_20269] +[group_20270] +[group_20271] +[group_20272] +[group_20273] +[group_20274] +[group_20275] +[group_20276] +[group_20277] +[group_20278] +[group_20279] +[group_20280] +[group_20281] +[group_20282] +[group_20283] +[group_20284] +[group_20285] +[group_20286] +[group_20287] +[group_20288] +[group_20289] +[group_20290] +[group_20291] +[group_20292] +[group_20293] +[group_20294] +[group_20295] +[group_20296] +[group_20297] +[group_20298] +[group_20299] +[group_20300] +[group_20301] +[group_20302] +[group_20303] +[group_20304] +[group_20305] +[group_20306] +[group_20307] +[group_20308] +[group_20309] +[group_20310] +[group_20311] +[group_20312] +[group_20313] +[group_20314] +[group_20315] +[group_20316] +[group_20317] +[group_20318] +[group_20319] +[group_20320] +[group_20321] +[group_20322] +[group_20323] +[group_20324] +[group_20325] +[group_20326] +[group_20327] +[group_20328] +[group_20329] +[group_20330] +[group_20331] +[group_20332] +[group_20333] +[group_20334] +[group_20335] +[group_20336] +[group_20337] +[group_20338] +[group_20339] +[group_20340] +[group_20341] +[group_20342] +[group_20343] +[group_20344] +[group_20345] +[group_20346] +[group_20347] +[group_20348] +[group_20349] +[group_20350] +[group_20351] +[group_20352] +[group_20353] +[group_20354] +[group_20355] +[group_20356] +[group_20357] +[group_20358] +[group_20359] +[group_20360] +[group_20361] +[group_20362] +[group_20363] +[group_20364] +[group_20365] +[group_20366] +[group_20367] +[group_20368] +[group_20369] +[group_20370] +[group_20371] +[group_20372] +[group_20373] +[group_20374] +[group_20375] +[group_20376] +[group_20377] +[group_20378] +[group_20379] +[group_20380] +[group_20381] +[group_20382] +[group_20383] +[group_20384] +[group_20385] +[group_20386] +[group_20387] +[group_20388] +[group_20389] +[group_20390] +[group_20391] +[group_20392] +[group_20393] +[group_20394] +[group_20395] +[group_20396] +[group_20397] +[group_20398] +[group_20399] +[group_20400] +[group_20401] +[group_20402] +[group_20403] +[group_20404] +[group_20405] +[group_20406] +[group_20407] +[group_20408] +[group_20409] +[group_20410] +[group_20411] +[group_20412] +[group_20413] +[group_20414] +[group_20415] +[group_20416] +[group_20417] +[group_20418] +[group_20419] +[group_20420] +[group_20421] +[group_20422] +[group_20423] +[group_20424] +[group_20425] +[group_20426] +[group_20427] +[group_20428] +[group_20429] +[group_20430] +[group_20431] +[group_20432] +[group_20433] +[group_20434] +[group_20435] +[group_20436] +[group_20437] +[group_20438] +[group_20439] +[group_20440] +[group_20441] +[group_20442] +[group_20443] +[group_20444] +[group_20445] +[group_20446] +[group_20447] +[group_20448] +[group_20449] +[group_20450] +[group_20451] +[group_20452] +[group_20453] +[group_20454] +[group_20455] +[group_20456] +[group_20457] +[group_20458] +[group_20459] +[group_20460] +[group_20461] +[group_20462] +[group_20463] +[group_20464] +[group_20465] +[group_20466] +[group_20467] +[group_20468] +[group_20469] +[group_20470] +[group_20471] +[group_20472] +[group_20473] +[group_20474] +[group_20475] +[group_20476] +[group_20477] +[group_20478] +[group_20479] +[group_20480] +[group_20481] +[group_20482] +[group_20483] +[group_20484] +[group_20485] +[group_20486] +[group_20487] +[group_20488] +[group_20489] +[group_20490] +[group_20491] +[group_20492] +[group_20493] +[group_20494] +[group_20495] +[group_20496] +[group_20497] +[group_20498] +[group_20499] +[group_20500] +[group_20501] +[group_20502] +[group_20503] +[group_20504] +[group_20505] +[group_20506] +[group_20507] +[group_20508] +[group_20509] +[group_20510] +[group_20511] +[group_20512] +[group_20513] +[group_20514] +[group_20515] +[group_20516] +[group_20517] +[group_20518] +[group_20519] +[group_20520] +[group_20521] +[group_20522] +[group_20523] +[group_20524] +[group_20525] +[group_20526] +[group_20527] +[group_20528] +[group_20529] +[group_20530] +[group_20531] +[group_20532] +[group_20533] +[group_20534] +[group_20535] +[group_20536] +[group_20537] +[group_20538] +[group_20539] +[group_20540] +[group_20541] +[group_20542] +[group_20543] +[group_20544] +[group_20545] +[group_20546] +[group_20547] +[group_20548] +[group_20549] +[group_20550] +[group_20551] +[group_20552] +[group_20553] +[group_20554] +[group_20555] +[group_20556] +[group_20557] +[group_20558] +[group_20559] +[group_20560] +[group_20561] +[group_20562] +[group_20563] +[group_20564] +[group_20565] +[group_20566] +[group_20567] +[group_20568] +[group_20569] +[group_20570] +[group_20571] +[group_20572] +[group_20573] +[group_20574] +[group_20575] +[group_20576] +[group_20577] +[group_20578] +[group_20579] +[group_20580] +[group_20581] +[group_20582] +[group_20583] +[group_20584] +[group_20585] +[group_20586] +[group_20587] +[group_20588] +[group_20589] +[group_20590] +[group_20591] +[group_20592] +[group_20593] +[group_20594] +[group_20595] +[group_20596] +[group_20597] +[group_20598] +[group_20599] +[group_20600] +[group_20601] +[group_20602] +[group_20603] +[group_20604] +[group_20605] +[group_20606] +[group_20607] +[group_20608] +[group_20609] +[group_20610] +[group_20611] +[group_20612] +[group_20613] +[group_20614] +[group_20615] +[group_20616] +[group_20617] +[group_20618] +[group_20619] +[group_20620] +[group_20621] +[group_20622] +[group_20623] +[group_20624] +[group_20625] +[group_20626] +[group_20627] +[group_20628] +[group_20629] +[group_20630] +[group_20631] +[group_20632] +[group_20633] +[group_20634] +[group_20635] +[group_20636] +[group_20637] +[group_20638] +[group_20639] +[group_20640] +[group_20641] +[group_20642] +[group_20643] +[group_20644] +[group_20645] +[group_20646] +[group_20647] +[group_20648] +[group_20649] +[group_20650] +[group_20651] +[group_20652] +[group_20653] +[group_20654] +[group_20655] +[group_20656] +[group_20657] +[group_20658] +[group_20659] +[group_20660] +[group_20661] +[group_20662] +[group_20663] +[group_20664] +[group_20665] +[group_20666] +[group_20667] +[group_20668] +[group_20669] +[group_20670] +[group_20671] +[group_20672] +[group_20673] +[group_20674] +[group_20675] +[group_20676] +[group_20677] +[group_20678] +[group_20679] +[group_20680] +[group_20681] +[group_20682] +[group_20683] +[group_20684] +[group_20685] +[group_20686] +[group_20687] +[group_20688] +[group_20689] +[group_20690] +[group_20691] +[group_20692] +[group_20693] +[group_20694] +[group_20695] +[group_20696] +[group_20697] +[group_20698] +[group_20699] +[group_20700] +[group_20701] +[group_20702] +[group_20703] +[group_20704] +[group_20705] +[group_20706] +[group_20707] +[group_20708] +[group_20709] +[group_20710] +[group_20711] +[group_20712] +[group_20713] +[group_20714] +[group_20715] +[group_20716] +[group_20717] +[group_20718] +[group_20719] +[group_20720] +[group_20721] +[group_20722] +[group_20723] +[group_20724] +[group_20725] +[group_20726] +[group_20727] +[group_20728] +[group_20729] +[group_20730] +[group_20731] +[group_20732] +[group_20733] +[group_20734] +[group_20735] +[group_20736] +[group_20737] +[group_20738] +[group_20739] +[group_20740] +[group_20741] +[group_20742] +[group_20743] +[group_20744] +[group_20745] +[group_20746] +[group_20747] +[group_20748] +[group_20749] +[group_20750] +[group_20751] +[group_20752] +[group_20753] +[group_20754] +[group_20755] +[group_20756] +[group_20757] +[group_20758] +[group_20759] +[group_20760] +[group_20761] +[group_20762] +[group_20763] +[group_20764] +[group_20765] +[group_20766] +[group_20767] +[group_20768] +[group_20769] +[group_20770] +[group_20771] +[group_20772] +[group_20773] +[group_20774] +[group_20775] +[group_20776] +[group_20777] +[group_20778] +[group_20779] +[group_20780] +[group_20781] +[group_20782] +[group_20783] +[group_20784] +[group_20785] +[group_20786] +[group_20787] +[group_20788] +[group_20789] +[group_20790] +[group_20791] +[group_20792] +[group_20793] +[group_20794] +[group_20795] +[group_20796] +[group_20797] +[group_20798] +[group_20799] +[group_20800] +[group_20801] +[group_20802] +[group_20803] +[group_20804] +[group_20805] +[group_20806] +[group_20807] +[group_20808] +[group_20809] +[group_20810] +[group_20811] +[group_20812] +[group_20813] +[group_20814] +[group_20815] +[group_20816] +[group_20817] +[group_20818] +[group_20819] +[group_20820] +[group_20821] +[group_20822] +[group_20823] +[group_20824] +[group_20825] +[group_20826] +[group_20827] +[group_20828] +[group_20829] +[group_20830] +[group_20831] +[group_20832] +[group_20833] +[group_20834] +[group_20835] +[group_20836] +[group_20837] +[group_20838] +[group_20839] +[group_20840] +[group_20841] +[group_20842] +[group_20843] +[group_20844] +[group_20845] +[group_20846] +[group_20847] +[group_20848] +[group_20849] +[group_20850] +[group_20851] +[group_20852] +[group_20853] +[group_20854] +[group_20855] +[group_20856] +[group_20857] +[group_20858] +[group_20859] +[group_20860] +[group_20861] +[group_20862] +[group_20863] +[group_20864] +[group_20865] +[group_20866] +[group_20867] +[group_20868] +[group_20869] +[group_20870] +[group_20871] +[group_20872] +[group_20873] +[group_20874] +[group_20875] +[group_20876] +[group_20877] +[group_20878] +[group_20879] +[group_20880] +[group_20881] +[group_20882] +[group_20883] +[group_20884] +[group_20885] +[group_20886] +[group_20887] +[group_20888] +[group_20889] +[group_20890] +[group_20891] +[group_20892] +[group_20893] +[group_20894] +[group_20895] +[group_20896] +[group_20897] +[group_20898] +[group_20899] +[group_20900] +[group_20901] +[group_20902] +[group_20903] +[group_20904] +[group_20905] +[group_20906] +[group_20907] +[group_20908] +[group_20909] +[group_20910] +[group_20911] +[group_20912] +[group_20913] +[group_20914] +[group_20915] +[group_20916] +[group_20917] +[group_20918] +[group_20919] +[group_20920] +[group_20921] +[group_20922] +[group_20923] +[group_20924] +[group_20925] +[group_20926] +[group_20927] +[group_20928] +[group_20929] +[group_20930] +[group_20931] +[group_20932] +[group_20933] +[group_20934] +[group_20935] +[group_20936] +[group_20937] +[group_20938] +[group_20939] +[group_20940] +[group_20941] +[group_20942] +[group_20943] +[group_20944] +[group_20945] +[group_20946] +[group_20947] +[group_20948] +[group_20949] +[group_20950] +[group_20951] +[group_20952] +[group_20953] +[group_20954] +[group_20955] +[group_20956] +[group_20957] +[group_20958] +[group_20959] +[group_20960] +[group_20961] +[group_20962] +[group_20963] +[group_20964] +[group_20965] +[group_20966] +[group_20967] +[group_20968] +[group_20969] +[group_20970] +[group_20971] +[group_20972] +[group_20973] +[group_20974] +[group_20975] +[group_20976] +[group_20977] +[group_20978] +[group_20979] +[group_20980] +[group_20981] +[group_20982] +[group_20983] +[group_20984] +[group_20985] +[group_20986] +[group_20987] +[group_20988] +[group_20989] +[group_20990] +[group_20991] +[group_20992] +[group_20993] +[group_20994] +[group_20995] +[group_20996] +[group_20997] +[group_20998] +[group_20999] +[group_21000] +[group_21001] +[group_21002] +[group_21003] +[group_21004] +[group_21005] +[group_21006] +[group_21007] +[group_21008] +[group_21009] +[group_21010] +[group_21011] +[group_21012] +[group_21013] +[group_21014] +[group_21015] +[group_21016] +[group_21017] +[group_21018] +[group_21019] +[group_21020] +[group_21021] +[group_21022] +[group_21023] +[group_21024] +[group_21025] +[group_21026] +[group_21027] +[group_21028] +[group_21029] +[group_21030] +[group_21031] +[group_21032] +[group_21033] +[group_21034] +[group_21035] +[group_21036] +[group_21037] +[group_21038] +[group_21039] +[group_21040] +[group_21041] +[group_21042] +[group_21043] +[group_21044] +[group_21045] +[group_21046] +[group_21047] +[group_21048] +[group_21049] +[group_21050] +[group_21051] +[group_21052] +[group_21053] +[group_21054] +[group_21055] +[group_21056] +[group_21057] +[group_21058] +[group_21059] +[group_21060] +[group_21061] +[group_21062] +[group_21063] +[group_21064] +[group_21065] +[group_21066] +[group_21067] +[group_21068] +[group_21069] +[group_21070] +[group_21071] +[group_21072] +[group_21073] +[group_21074] +[group_21075] +[group_21076] +[group_21077] +[group_21078] +[group_21079] +[group_21080] +[group_21081] +[group_21082] +[group_21083] +[group_21084] +[group_21085] +[group_21086] +[group_21087] +[group_21088] +[group_21089] +[group_21090] +[group_21091] +[group_21092] +[group_21093] +[group_21094] +[group_21095] +[group_21096] +[group_21097] +[group_21098] +[group_21099] +[group_21100] +[group_21101] +[group_21102] +[group_21103] +[group_21104] +[group_21105] +[group_21106] +[group_21107] +[group_21108] +[group_21109] +[group_21110] +[group_21111] +[group_21112] +[group_21113] +[group_21114] +[group_21115] +[group_21116] +[group_21117] +[group_21118] +[group_21119] +[group_21120] +[group_21121] +[group_21122] +[group_21123] +[group_21124] +[group_21125] +[group_21126] +[group_21127] +[group_21128] +[group_21129] +[group_21130] +[group_21131] +[group_21132] +[group_21133] +[group_21134] +[group_21135] +[group_21136] +[group_21137] +[group_21138] +[group_21139] +[group_21140] +[group_21141] +[group_21142] +[group_21143] +[group_21144] +[group_21145] +[group_21146] +[group_21147] +[group_21148] +[group_21149] +[group_21150] +[group_21151] +[group_21152] +[group_21153] +[group_21154] +[group_21155] +[group_21156] +[group_21157] +[group_21158] +[group_21159] +[group_21160] +[group_21161] +[group_21162] +[group_21163] +[group_21164] +[group_21165] +[group_21166] +[group_21167] +[group_21168] +[group_21169] +[group_21170] +[group_21171] +[group_21172] +[group_21173] +[group_21174] +[group_21175] +[group_21176] +[group_21177] +[group_21178] +[group_21179] +[group_21180] +[group_21181] +[group_21182] +[group_21183] +[group_21184] +[group_21185] +[group_21186] +[group_21187] +[group_21188] +[group_21189] +[group_21190] +[group_21191] +[group_21192] +[group_21193] +[group_21194] +[group_21195] +[group_21196] +[group_21197] +[group_21198] +[group_21199] +[group_21200] +[group_21201] +[group_21202] +[group_21203] +[group_21204] +[group_21205] +[group_21206] +[group_21207] +[group_21208] +[group_21209] +[group_21210] +[group_21211] +[group_21212] +[group_21213] +[group_21214] +[group_21215] +[group_21216] +[group_21217] +[group_21218] +[group_21219] +[group_21220] +[group_21221] +[group_21222] +[group_21223] +[group_21224] +[group_21225] +[group_21226] +[group_21227] +[group_21228] +[group_21229] +[group_21230] +[group_21231] +[group_21232] +[group_21233] +[group_21234] +[group_21235] +[group_21236] +[group_21237] +[group_21238] +[group_21239] +[group_21240] +[group_21241] +[group_21242] +[group_21243] +[group_21244] +[group_21245] +[group_21246] +[group_21247] +[group_21248] +[group_21249] +[group_21250] +[group_21251] +[group_21252] +[group_21253] +[group_21254] +[group_21255] +[group_21256] +[group_21257] +[group_21258] +[group_21259] +[group_21260] +[group_21261] +[group_21262] +[group_21263] +[group_21264] +[group_21265] +[group_21266] +[group_21267] +[group_21268] +[group_21269] +[group_21270] +[group_21271] +[group_21272] +[group_21273] +[group_21274] +[group_21275] +[group_21276] +[group_21277] +[group_21278] +[group_21279] +[group_21280] +[group_21281] +[group_21282] +[group_21283] +[group_21284] +[group_21285] +[group_21286] +[group_21287] +[group_21288] +[group_21289] +[group_21290] +[group_21291] +[group_21292] +[group_21293] +[group_21294] +[group_21295] +[group_21296] +[group_21297] +[group_21298] +[group_21299] +[group_21300] +[group_21301] +[group_21302] +[group_21303] +[group_21304] +[group_21305] +[group_21306] +[group_21307] +[group_21308] +[group_21309] +[group_21310] +[group_21311] +[group_21312] +[group_21313] +[group_21314] +[group_21315] +[group_21316] +[group_21317] +[group_21318] +[group_21319] +[group_21320] +[group_21321] +[group_21322] +[group_21323] +[group_21324] +[group_21325] +[group_21326] +[group_21327] +[group_21328] +[group_21329] +[group_21330] +[group_21331] +[group_21332] +[group_21333] +[group_21334] +[group_21335] +[group_21336] +[group_21337] +[group_21338] +[group_21339] +[group_21340] +[group_21341] +[group_21342] +[group_21343] +[group_21344] +[group_21345] +[group_21346] +[group_21347] +[group_21348] +[group_21349] +[group_21350] +[group_21351] +[group_21352] +[group_21353] +[group_21354] +[group_21355] +[group_21356] +[group_21357] +[group_21358] +[group_21359] +[group_21360] +[group_21361] +[group_21362] +[group_21363] +[group_21364] +[group_21365] +[group_21366] +[group_21367] +[group_21368] +[group_21369] +[group_21370] +[group_21371] +[group_21372] +[group_21373] +[group_21374] +[group_21375] +[group_21376] +[group_21377] +[group_21378] +[group_21379] +[group_21380] +[group_21381] +[group_21382] +[group_21383] +[group_21384] +[group_21385] +[group_21386] +[group_21387] +[group_21388] +[group_21389] +[group_21390] +[group_21391] +[group_21392] +[group_21393] +[group_21394] +[group_21395] +[group_21396] +[group_21397] +[group_21398] +[group_21399] +[group_21400] +[group_21401] +[group_21402] +[group_21403] +[group_21404] +[group_21405] +[group_21406] +[group_21407] +[group_21408] +[group_21409] +[group_21410] +[group_21411] +[group_21412] +[group_21413] +[group_21414] +[group_21415] +[group_21416] +[group_21417] +[group_21418] +[group_21419] +[group_21420] +[group_21421] +[group_21422] +[group_21423] +[group_21424] +[group_21425] +[group_21426] +[group_21427] +[group_21428] +[group_21429] +[group_21430] +[group_21431] +[group_21432] +[group_21433] +[group_21434] +[group_21435] +[group_21436] +[group_21437] +[group_21438] +[group_21439] +[group_21440] +[group_21441] +[group_21442] +[group_21443] +[group_21444] +[group_21445] +[group_21446] +[group_21447] +[group_21448] +[group_21449] +[group_21450] +[group_21451] +[group_21452] +[group_21453] +[group_21454] +[group_21455] +[group_21456] +[group_21457] +[group_21458] +[group_21459] +[group_21460] +[group_21461] +[group_21462] +[group_21463] +[group_21464] +[group_21465] +[group_21466] +[group_21467] +[group_21468] +[group_21469] +[group_21470] +[group_21471] +[group_21472] +[group_21473] +[group_21474] +[group_21475] +[group_21476] +[group_21477] +[group_21478] +[group_21479] +[group_21480] +[group_21481] +[group_21482] +[group_21483] +[group_21484] +[group_21485] +[group_21486] +[group_21487] +[group_21488] +[group_21489] +[group_21490] +[group_21491] +[group_21492] +[group_21493] +[group_21494] +[group_21495] +[group_21496] +[group_21497] +[group_21498] +[group_21499] +[group_21500] +[group_21501] +[group_21502] +[group_21503] +[group_21504] +[group_21505] +[group_21506] +[group_21507] +[group_21508] +[group_21509] +[group_21510] +[group_21511] +[group_21512] +[group_21513] +[group_21514] +[group_21515] +[group_21516] +[group_21517] +[group_21518] +[group_21519] +[group_21520] +[group_21521] +[group_21522] +[group_21523] +[group_21524] +[group_21525] +[group_21526] +[group_21527] +[group_21528] +[group_21529] +[group_21530] +[group_21531] +[group_21532] +[group_21533] +[group_21534] +[group_21535] +[group_21536] +[group_21537] +[group_21538] +[group_21539] +[group_21540] +[group_21541] +[group_21542] +[group_21543] +[group_21544] +[group_21545] +[group_21546] +[group_21547] +[group_21548] +[group_21549] +[group_21550] +[group_21551] +[group_21552] +[group_21553] +[group_21554] +[group_21555] +[group_21556] +[group_21557] +[group_21558] +[group_21559] +[group_21560] +[group_21561] +[group_21562] +[group_21563] +[group_21564] +[group_21565] +[group_21566] +[group_21567] +[group_21568] +[group_21569] +[group_21570] +[group_21571] +[group_21572] +[group_21573] +[group_21574] +[group_21575] +[group_21576] +[group_21577] +[group_21578] +[group_21579] +[group_21580] +[group_21581] +[group_21582] +[group_21583] +[group_21584] +[group_21585] +[group_21586] +[group_21587] +[group_21588] +[group_21589] +[group_21590] +[group_21591] +[group_21592] +[group_21593] +[group_21594] +[group_21595] +[group_21596] +[group_21597] +[group_21598] +[group_21599] +[group_21600] +[group_21601] +[group_21602] +[group_21603] +[group_21604] +[group_21605] +[group_21606] +[group_21607] +[group_21608] +[group_21609] +[group_21610] +[group_21611] +[group_21612] +[group_21613] +[group_21614] +[group_21615] +[group_21616] +[group_21617] +[group_21618] +[group_21619] +[group_21620] +[group_21621] +[group_21622] +[group_21623] +[group_21624] +[group_21625] +[group_21626] +[group_21627] +[group_21628] +[group_21629] +[group_21630] +[group_21631] +[group_21632] +[group_21633] +[group_21634] +[group_21635] +[group_21636] +[group_21637] +[group_21638] +[group_21639] +[group_21640] +[group_21641] +[group_21642] +[group_21643] +[group_21644] +[group_21645] +[group_21646] +[group_21647] +[group_21648] +[group_21649] +[group_21650] +[group_21651] +[group_21652] +[group_21653] +[group_21654] +[group_21655] +[group_21656] +[group_21657] +[group_21658] +[group_21659] +[group_21660] +[group_21661] +[group_21662] +[group_21663] +[group_21664] +[group_21665] +[group_21666] +[group_21667] +[group_21668] +[group_21669] +[group_21670] +[group_21671] +[group_21672] +[group_21673] +[group_21674] +[group_21675] +[group_21676] +[group_21677] +[group_21678] +[group_21679] +[group_21680] +[group_21681] +[group_21682] +[group_21683] +[group_21684] +[group_21685] +[group_21686] +[group_21687] +[group_21688] +[group_21689] +[group_21690] +[group_21691] +[group_21692] +[group_21693] +[group_21694] +[group_21695] +[group_21696] +[group_21697] +[group_21698] +[group_21699] +[group_21700] +[group_21701] +[group_21702] +[group_21703] +[group_21704] +[group_21705] +[group_21706] +[group_21707] +[group_21708] +[group_21709] +[group_21710] +[group_21711] +[group_21712] +[group_21713] +[group_21714] +[group_21715] +[group_21716] +[group_21717] +[group_21718] +[group_21719] +[group_21720] +[group_21721] +[group_21722] +[group_21723] +[group_21724] +[group_21725] +[group_21726] +[group_21727] +[group_21728] +[group_21729] +[group_21730] +[group_21731] +[group_21732] +[group_21733] +[group_21734] +[group_21735] +[group_21736] +[group_21737] +[group_21738] +[group_21739] +[group_21740] +[group_21741] +[group_21742] +[group_21743] +[group_21744] +[group_21745] +[group_21746] +[group_21747] +[group_21748] +[group_21749] +[group_21750] +[group_21751] +[group_21752] +[group_21753] +[group_21754] +[group_21755] +[group_21756] +[group_21757] +[group_21758] +[group_21759] +[group_21760] +[group_21761] +[group_21762] +[group_21763] +[group_21764] +[group_21765] +[group_21766] +[group_21767] +[group_21768] +[group_21769] +[group_21770] +[group_21771] +[group_21772] +[group_21773] +[group_21774] +[group_21775] +[group_21776] +[group_21777] +[group_21778] +[group_21779] +[group_21780] +[group_21781] +[group_21782] +[group_21783] +[group_21784] +[group_21785] +[group_21786] +[group_21787] +[group_21788] +[group_21789] +[group_21790] +[group_21791] +[group_21792] +[group_21793] +[group_21794] +[group_21795] +[group_21796] +[group_21797] +[group_21798] +[group_21799] +[group_21800] +[group_21801] +[group_21802] +[group_21803] +[group_21804] +[group_21805] +[group_21806] +[group_21807] +[group_21808] +[group_21809] +[group_21810] +[group_21811] +[group_21812] +[group_21813] +[group_21814] +[group_21815] +[group_21816] +[group_21817] +[group_21818] +[group_21819] +[group_21820] +[group_21821] +[group_21822] +[group_21823] +[group_21824] +[group_21825] +[group_21826] +[group_21827] +[group_21828] +[group_21829] +[group_21830] +[group_21831] +[group_21832] +[group_21833] +[group_21834] +[group_21835] +[group_21836] +[group_21837] +[group_21838] +[group_21839] +[group_21840] +[group_21841] +[group_21842] +[group_21843] +[group_21844] +[group_21845] +[group_21846] +[group_21847] +[group_21848] +[group_21849] +[group_21850] +[group_21851] +[group_21852] +[group_21853] +[group_21854] +[group_21855] +[group_21856] +[group_21857] +[group_21858] +[group_21859] +[group_21860] +[group_21861] +[group_21862] +[group_21863] +[group_21864] +[group_21865] +[group_21866] +[group_21867] +[group_21868] +[group_21869] +[group_21870] +[group_21871] +[group_21872] +[group_21873] +[group_21874] +[group_21875] +[group_21876] +[group_21877] +[group_21878] +[group_21879] +[group_21880] +[group_21881] +[group_21882] +[group_21883] +[group_21884] +[group_21885] +[group_21886] +[group_21887] +[group_21888] +[group_21889] +[group_21890] +[group_21891] +[group_21892] +[group_21893] +[group_21894] +[group_21895] +[group_21896] +[group_21897] +[group_21898] +[group_21899] +[group_21900] +[group_21901] +[group_21902] +[group_21903] +[group_21904] +[group_21905] +[group_21906] +[group_21907] +[group_21908] +[group_21909] +[group_21910] +[group_21911] +[group_21912] +[group_21913] +[group_21914] +[group_21915] +[group_21916] +[group_21917] +[group_21918] +[group_21919] +[group_21920] +[group_21921] +[group_21922] +[group_21923] +[group_21924] +[group_21925] +[group_21926] +[group_21927] +[group_21928] +[group_21929] +[group_21930] +[group_21931] +[group_21932] +[group_21933] +[group_21934] +[group_21935] +[group_21936] +[group_21937] +[group_21938] +[group_21939] +[group_21940] +[group_21941] +[group_21942] +[group_21943] +[group_21944] +[group_21945] +[group_21946] +[group_21947] +[group_21948] +[group_21949] +[group_21950] +[group_21951] +[group_21952] +[group_21953] +[group_21954] +[group_21955] +[group_21956] +[group_21957] +[group_21958] +[group_21959] +[group_21960] +[group_21961] +[group_21962] +[group_21963] +[group_21964] +[group_21965] +[group_21966] +[group_21967] +[group_21968] +[group_21969] +[group_21970] +[group_21971] +[group_21972] +[group_21973] +[group_21974] +[group_21975] +[group_21976] +[group_21977] +[group_21978] +[group_21979] +[group_21980] +[group_21981] +[group_21982] +[group_21983] +[group_21984] +[group_21985] +[group_21986] +[group_21987] +[group_21988] +[group_21989] +[group_21990] +[group_21991] +[group_21992] +[group_21993] +[group_21994] +[group_21995] +[group_21996] +[group_21997] +[group_21998] +[group_21999] +[group_22000] +[group_22001] +[group_22002] +[group_22003] +[group_22004] +[group_22005] +[group_22006] +[group_22007] +[group_22008] +[group_22009] +[group_22010] +[group_22011] +[group_22012] +[group_22013] +[group_22014] +[group_22015] +[group_22016] +[group_22017] +[group_22018] +[group_22019] +[group_22020] +[group_22021] +[group_22022] +[group_22023] +[group_22024] +[group_22025] +[group_22026] +[group_22027] +[group_22028] +[group_22029] +[group_22030] +[group_22031] +[group_22032] +[group_22033] +[group_22034] +[group_22035] +[group_22036] +[group_22037] +[group_22038] +[group_22039] +[group_22040] +[group_22041] +[group_22042] +[group_22043] +[group_22044] +[group_22045] +[group_22046] +[group_22047] +[group_22048] +[group_22049] +[group_22050] +[group_22051] +[group_22052] +[group_22053] +[group_22054] +[group_22055] +[group_22056] +[group_22057] +[group_22058] +[group_22059] +[group_22060] +[group_22061] +[group_22062] +[group_22063] +[group_22064] +[group_22065] +[group_22066] +[group_22067] +[group_22068] +[group_22069] +[group_22070] +[group_22071] +[group_22072] +[group_22073] +[group_22074] +[group_22075] +[group_22076] +[group_22077] +[group_22078] +[group_22079] +[group_22080] +[group_22081] +[group_22082] +[group_22083] +[group_22084] +[group_22085] +[group_22086] +[group_22087] +[group_22088] +[group_22089] +[group_22090] +[group_22091] +[group_22092] +[group_22093] +[group_22094] +[group_22095] +[group_22096] +[group_22097] +[group_22098] +[group_22099] +[group_22100] +[group_22101] +[group_22102] +[group_22103] +[group_22104] +[group_22105] +[group_22106] +[group_22107] +[group_22108] +[group_22109] +[group_22110] +[group_22111] +[group_22112] +[group_22113] +[group_22114] +[group_22115] +[group_22116] +[group_22117] +[group_22118] +[group_22119] +[group_22120] +[group_22121] +[group_22122] +[group_22123] +[group_22124] +[group_22125] +[group_22126] +[group_22127] +[group_22128] +[group_22129] +[group_22130] +[group_22131] +[group_22132] +[group_22133] +[group_22134] +[group_22135] +[group_22136] +[group_22137] +[group_22138] +[group_22139] +[group_22140] +[group_22141] +[group_22142] +[group_22143] +[group_22144] +[group_22145] +[group_22146] +[group_22147] +[group_22148] +[group_22149] +[group_22150] +[group_22151] +[group_22152] +[group_22153] +[group_22154] +[group_22155] +[group_22156] +[group_22157] +[group_22158] +[group_22159] +[group_22160] +[group_22161] +[group_22162] +[group_22163] +[group_22164] +[group_22165] +[group_22166] +[group_22167] +[group_22168] +[group_22169] +[group_22170] +[group_22171] +[group_22172] +[group_22173] +[group_22174] +[group_22175] +[group_22176] +[group_22177] +[group_22178] +[group_22179] +[group_22180] +[group_22181] +[group_22182] +[group_22183] +[group_22184] +[group_22185] +[group_22186] +[group_22187] +[group_22188] +[group_22189] +[group_22190] +[group_22191] +[group_22192] +[group_22193] +[group_22194] +[group_22195] +[group_22196] +[group_22197] +[group_22198] +[group_22199] +[group_22200] +[group_22201] +[group_22202] +[group_22203] +[group_22204] +[group_22205] +[group_22206] +[group_22207] +[group_22208] +[group_22209] +[group_22210] +[group_22211] +[group_22212] +[group_22213] +[group_22214] +[group_22215] +[group_22216] +[group_22217] +[group_22218] +[group_22219] +[group_22220] +[group_22221] +[group_22222] +[group_22223] +[group_22224] +[group_22225] +[group_22226] +[group_22227] +[group_22228] +[group_22229] +[group_22230] +[group_22231] +[group_22232] +[group_22233] +[group_22234] +[group_22235] +[group_22236] +[group_22237] +[group_22238] +[group_22239] +[group_22240] +[group_22241] +[group_22242] +[group_22243] +[group_22244] +[group_22245] +[group_22246] +[group_22247] +[group_22248] +[group_22249] +[group_22250] +[group_22251] +[group_22252] +[group_22253] +[group_22254] +[group_22255] +[group_22256] +[group_22257] +[group_22258] +[group_22259] +[group_22260] +[group_22261] +[group_22262] +[group_22263] +[group_22264] +[group_22265] +[group_22266] +[group_22267] +[group_22268] +[group_22269] +[group_22270] +[group_22271] +[group_22272] +[group_22273] +[group_22274] +[group_22275] +[group_22276] +[group_22277] +[group_22278] +[group_22279] +[group_22280] +[group_22281] +[group_22282] +[group_22283] +[group_22284] +[group_22285] +[group_22286] +[group_22287] +[group_22288] +[group_22289] +[group_22290] +[group_22291] +[group_22292] +[group_22293] +[group_22294] +[group_22295] +[group_22296] +[group_22297] +[group_22298] +[group_22299] +[group_22300] +[group_22301] +[group_22302] +[group_22303] +[group_22304] +[group_22305] +[group_22306] +[group_22307] +[group_22308] +[group_22309] +[group_22310] +[group_22311] +[group_22312] +[group_22313] +[group_22314] +[group_22315] +[group_22316] +[group_22317] +[group_22318] +[group_22319] +[group_22320] +[group_22321] +[group_22322] +[group_22323] +[group_22324] +[group_22325] +[group_22326] +[group_22327] +[group_22328] +[group_22329] +[group_22330] +[group_22331] +[group_22332] +[group_22333] +[group_22334] +[group_22335] +[group_22336] +[group_22337] +[group_22338] +[group_22339] +[group_22340] +[group_22341] +[group_22342] +[group_22343] +[group_22344] +[group_22345] +[group_22346] +[group_22347] +[group_22348] +[group_22349] +[group_22350] +[group_22351] +[group_22352] +[group_22353] +[group_22354] +[group_22355] +[group_22356] +[group_22357] +[group_22358] +[group_22359] +[group_22360] +[group_22361] +[group_22362] +[group_22363] +[group_22364] +[group_22365] +[group_22366] +[group_22367] +[group_22368] +[group_22369] +[group_22370] +[group_22371] +[group_22372] +[group_22373] +[group_22374] +[group_22375] +[group_22376] +[group_22377] +[group_22378] +[group_22379] +[group_22380] +[group_22381] +[group_22382] +[group_22383] +[group_22384] +[group_22385] +[group_22386] +[group_22387] +[group_22388] +[group_22389] +[group_22390] +[group_22391] +[group_22392] +[group_22393] +[group_22394] +[group_22395] +[group_22396] +[group_22397] +[group_22398] +[group_22399] +[group_22400] +[group_22401] +[group_22402] +[group_22403] +[group_22404] +[group_22405] +[group_22406] +[group_22407] +[group_22408] +[group_22409] +[group_22410] +[group_22411] +[group_22412] +[group_22413] +[group_22414] +[group_22415] +[group_22416] +[group_22417] +[group_22418] +[group_22419] +[group_22420] +[group_22421] +[group_22422] +[group_22423] +[group_22424] +[group_22425] +[group_22426] +[group_22427] +[group_22428] +[group_22429] +[group_22430] +[group_22431] +[group_22432] +[group_22433] +[group_22434] +[group_22435] +[group_22436] +[group_22437] +[group_22438] +[group_22439] +[group_22440] +[group_22441] +[group_22442] +[group_22443] +[group_22444] +[group_22445] +[group_22446] +[group_22447] +[group_22448] +[group_22449] +[group_22450] +[group_22451] +[group_22452] +[group_22453] +[group_22454] +[group_22455] +[group_22456] +[group_22457] +[group_22458] +[group_22459] +[group_22460] +[group_22461] +[group_22462] +[group_22463] +[group_22464] +[group_22465] +[group_22466] +[group_22467] +[group_22468] +[group_22469] +[group_22470] +[group_22471] +[group_22472] +[group_22473] +[group_22474] +[group_22475] +[group_22476] +[group_22477] +[group_22478] +[group_22479] +[group_22480] +[group_22481] +[group_22482] +[group_22483] +[group_22484] +[group_22485] +[group_22486] +[group_22487] +[group_22488] +[group_22489] +[group_22490] +[group_22491] +[group_22492] +[group_22493] +[group_22494] +[group_22495] +[group_22496] +[group_22497] +[group_22498] +[group_22499] +[group_22500] +[group_22501] +[group_22502] +[group_22503] +[group_22504] +[group_22505] +[group_22506] +[group_22507] +[group_22508] +[group_22509] +[group_22510] +[group_22511] +[group_22512] +[group_22513] +[group_22514] +[group_22515] +[group_22516] +[group_22517] +[group_22518] +[group_22519] +[group_22520] +[group_22521] +[group_22522] +[group_22523] +[group_22524] +[group_22525] +[group_22526] +[group_22527] +[group_22528] +[group_22529] +[group_22530] +[group_22531] +[group_22532] +[group_22533] +[group_22534] +[group_22535] +[group_22536] +[group_22537] +[group_22538] +[group_22539] +[group_22540] +[group_22541] +[group_22542] +[group_22543] +[group_22544] +[group_22545] +[group_22546] +[group_22547] +[group_22548] +[group_22549] +[group_22550] +[group_22551] +[group_22552] +[group_22553] +[group_22554] +[group_22555] +[group_22556] +[group_22557] +[group_22558] +[group_22559] +[group_22560] +[group_22561] +[group_22562] +[group_22563] +[group_22564] +[group_22565] +[group_22566] +[group_22567] +[group_22568] +[group_22569] +[group_22570] +[group_22571] +[group_22572] +[group_22573] +[group_22574] +[group_22575] +[group_22576] +[group_22577] +[group_22578] +[group_22579] +[group_22580] +[group_22581] +[group_22582] +[group_22583] +[group_22584] +[group_22585] +[group_22586] +[group_22587] +[group_22588] +[group_22589] +[group_22590] +[group_22591] +[group_22592] +[group_22593] +[group_22594] +[group_22595] +[group_22596] +[group_22597] +[group_22598] +[group_22599] +[group_22600] +[group_22601] +[group_22602] +[group_22603] +[group_22604] +[group_22605] +[group_22606] +[group_22607] +[group_22608] +[group_22609] +[group_22610] +[group_22611] +[group_22612] +[group_22613] +[group_22614] +[group_22615] +[group_22616] +[group_22617] +[group_22618] +[group_22619] +[group_22620] +[group_22621] +[group_22622] +[group_22623] +[group_22624] +[group_22625] +[group_22626] +[group_22627] +[group_22628] +[group_22629] +[group_22630] +[group_22631] +[group_22632] +[group_22633] +[group_22634] +[group_22635] +[group_22636] +[group_22637] +[group_22638] +[group_22639] +[group_22640] +[group_22641] +[group_22642] +[group_22643] +[group_22644] +[group_22645] +[group_22646] +[group_22647] +[group_22648] +[group_22649] +[group_22650] +[group_22651] +[group_22652] +[group_22653] +[group_22654] +[group_22655] +[group_22656] +[group_22657] +[group_22658] +[group_22659] +[group_22660] +[group_22661] +[group_22662] +[group_22663] +[group_22664] +[group_22665] +[group_22666] +[group_22667] +[group_22668] +[group_22669] +[group_22670] +[group_22671] +[group_22672] +[group_22673] +[group_22674] +[group_22675] +[group_22676] +[group_22677] +[group_22678] +[group_22679] +[group_22680] +[group_22681] +[group_22682] +[group_22683] +[group_22684] +[group_22685] +[group_22686] +[group_22687] +[group_22688] +[group_22689] +[group_22690] +[group_22691] +[group_22692] +[group_22693] +[group_22694] +[group_22695] +[group_22696] +[group_22697] +[group_22698] +[group_22699] +[group_22700] +[group_22701] +[group_22702] +[group_22703] +[group_22704] +[group_22705] +[group_22706] +[group_22707] +[group_22708] +[group_22709] +[group_22710] +[group_22711] +[group_22712] +[group_22713] +[group_22714] +[group_22715] +[group_22716] +[group_22717] +[group_22718] +[group_22719] +[group_22720] +[group_22721] +[group_22722] +[group_22723] +[group_22724] +[group_22725] +[group_22726] +[group_22727] +[group_22728] +[group_22729] +[group_22730] +[group_22731] +[group_22732] +[group_22733] +[group_22734] +[group_22735] +[group_22736] +[group_22737] +[group_22738] +[group_22739] +[group_22740] +[group_22741] +[group_22742] +[group_22743] +[group_22744] +[group_22745] +[group_22746] +[group_22747] +[group_22748] +[group_22749] +[group_22750] +[group_22751] +[group_22752] +[group_22753] +[group_22754] +[group_22755] +[group_22756] +[group_22757] +[group_22758] +[group_22759] +[group_22760] +[group_22761] +[group_22762] +[group_22763] +[group_22764] +[group_22765] +[group_22766] +[group_22767] +[group_22768] +[group_22769] +[group_22770] +[group_22771] +[group_22772] +[group_22773] +[group_22774] +[group_22775] +[group_22776] +[group_22777] +[group_22778] +[group_22779] +[group_22780] +[group_22781] +[group_22782] +[group_22783] +[group_22784] +[group_22785] +[group_22786] +[group_22787] +[group_22788] +[group_22789] +[group_22790] +[group_22791] +[group_22792] +[group_22793] +[group_22794] +[group_22795] +[group_22796] +[group_22797] +[group_22798] +[group_22799] +[group_22800] +[group_22801] +[group_22802] +[group_22803] +[group_22804] +[group_22805] +[group_22806] +[group_22807] +[group_22808] +[group_22809] +[group_22810] +[group_22811] +[group_22812] +[group_22813] +[group_22814] +[group_22815] +[group_22816] +[group_22817] +[group_22818] +[group_22819] +[group_22820] +[group_22821] +[group_22822] +[group_22823] +[group_22824] +[group_22825] +[group_22826] +[group_22827] +[group_22828] +[group_22829] +[group_22830] +[group_22831] +[group_22832] +[group_22833] +[group_22834] +[group_22835] +[group_22836] +[group_22837] +[group_22838] +[group_22839] +[group_22840] +[group_22841] +[group_22842] +[group_22843] +[group_22844] +[group_22845] +[group_22846] +[group_22847] +[group_22848] +[group_22849] +[group_22850] +[group_22851] +[group_22852] +[group_22853] +[group_22854] +[group_22855] +[group_22856] +[group_22857] +[group_22858] +[group_22859] +[group_22860] +[group_22861] +[group_22862] +[group_22863] +[group_22864] +[group_22865] +[group_22866] +[group_22867] +[group_22868] +[group_22869] +[group_22870] +[group_22871] +[group_22872] +[group_22873] +[group_22874] +[group_22875] +[group_22876] +[group_22877] +[group_22878] +[group_22879] +[group_22880] +[group_22881] +[group_22882] +[group_22883] +[group_22884] +[group_22885] +[group_22886] +[group_22887] +[group_22888] +[group_22889] +[group_22890] +[group_22891] +[group_22892] +[group_22893] +[group_22894] +[group_22895] +[group_22896] +[group_22897] +[group_22898] +[group_22899] +[group_22900] +[group_22901] +[group_22902] +[group_22903] +[group_22904] +[group_22905] +[group_22906] +[group_22907] +[group_22908] +[group_22909] +[group_22910] +[group_22911] +[group_22912] +[group_22913] +[group_22914] +[group_22915] +[group_22916] +[group_22917] +[group_22918] +[group_22919] +[group_22920] +[group_22921] +[group_22922] +[group_22923] +[group_22924] +[group_22925] +[group_22926] +[group_22927] +[group_22928] +[group_22929] +[group_22930] +[group_22931] +[group_22932] +[group_22933] +[group_22934] +[group_22935] +[group_22936] +[group_22937] +[group_22938] +[group_22939] +[group_22940] +[group_22941] +[group_22942] +[group_22943] +[group_22944] +[group_22945] +[group_22946] +[group_22947] +[group_22948] +[group_22949] +[group_22950] +[group_22951] +[group_22952] +[group_22953] +[group_22954] +[group_22955] +[group_22956] +[group_22957] +[group_22958] +[group_22959] +[group_22960] +[group_22961] +[group_22962] +[group_22963] +[group_22964] +[group_22965] +[group_22966] +[group_22967] +[group_22968] +[group_22969] +[group_22970] +[group_22971] +[group_22972] +[group_22973] +[group_22974] +[group_22975] +[group_22976] +[group_22977] +[group_22978] +[group_22979] +[group_22980] +[group_22981] +[group_22982] +[group_22983] +[group_22984] +[group_22985] +[group_22986] +[group_22987] +[group_22988] +[group_22989] +[group_22990] +[group_22991] +[group_22992] +[group_22993] +[group_22994] +[group_22995] +[group_22996] +[group_22997] +[group_22998] +[group_22999] +[group_23000] +[group_23001] +[group_23002] +[group_23003] +[group_23004] +[group_23005] +[group_23006] +[group_23007] +[group_23008] +[group_23009] +[group_23010] +[group_23011] +[group_23012] +[group_23013] +[group_23014] +[group_23015] +[group_23016] +[group_23017] +[group_23018] +[group_23019] +[group_23020] +[group_23021] +[group_23022] +[group_23023] +[group_23024] +[group_23025] +[group_23026] +[group_23027] +[group_23028] +[group_23029] +[group_23030] +[group_23031] +[group_23032] +[group_23033] +[group_23034] +[group_23035] +[group_23036] +[group_23037] +[group_23038] +[group_23039] +[group_23040] +[group_23041] +[group_23042] +[group_23043] +[group_23044] +[group_23045] +[group_23046] +[group_23047] +[group_23048] +[group_23049] +[group_23050] +[group_23051] +[group_23052] +[group_23053] +[group_23054] +[group_23055] +[group_23056] +[group_23057] +[group_23058] +[group_23059] +[group_23060] +[group_23061] +[group_23062] +[group_23063] +[group_23064] +[group_23065] +[group_23066] +[group_23067] +[group_23068] +[group_23069] +[group_23070] +[group_23071] +[group_23072] +[group_23073] +[group_23074] +[group_23075] +[group_23076] +[group_23077] +[group_23078] +[group_23079] +[group_23080] +[group_23081] +[group_23082] +[group_23083] +[group_23084] +[group_23085] +[group_23086] +[group_23087] +[group_23088] +[group_23089] +[group_23090] +[group_23091] +[group_23092] +[group_23093] +[group_23094] +[group_23095] +[group_23096] +[group_23097] +[group_23098] +[group_23099] +[group_23100] +[group_23101] +[group_23102] +[group_23103] +[group_23104] +[group_23105] +[group_23106] +[group_23107] +[group_23108] +[group_23109] +[group_23110] +[group_23111] +[group_23112] +[group_23113] +[group_23114] +[group_23115] +[group_23116] +[group_23117] +[group_23118] +[group_23119] +[group_23120] +[group_23121] +[group_23122] +[group_23123] +[group_23124] +[group_23125] +[group_23126] +[group_23127] +[group_23128] +[group_23129] +[group_23130] +[group_23131] +[group_23132] +[group_23133] +[group_23134] +[group_23135] +[group_23136] +[group_23137] +[group_23138] +[group_23139] +[group_23140] +[group_23141] +[group_23142] +[group_23143] +[group_23144] +[group_23145] +[group_23146] +[group_23147] +[group_23148] +[group_23149] +[group_23150] +[group_23151] +[group_23152] +[group_23153] +[group_23154] +[group_23155] +[group_23156] +[group_23157] +[group_23158] +[group_23159] +[group_23160] +[group_23161] +[group_23162] +[group_23163] +[group_23164] +[group_23165] +[group_23166] +[group_23167] +[group_23168] +[group_23169] +[group_23170] +[group_23171] +[group_23172] +[group_23173] +[group_23174] +[group_23175] +[group_23176] +[group_23177] +[group_23178] +[group_23179] +[group_23180] +[group_23181] +[group_23182] +[group_23183] +[group_23184] +[group_23185] +[group_23186] +[group_23187] +[group_23188] +[group_23189] +[group_23190] +[group_23191] +[group_23192] +[group_23193] +[group_23194] +[group_23195] +[group_23196] +[group_23197] +[group_23198] +[group_23199] +[group_23200] +[group_23201] +[group_23202] +[group_23203] +[group_23204] +[group_23205] +[group_23206] +[group_23207] +[group_23208] +[group_23209] +[group_23210] +[group_23211] +[group_23212] +[group_23213] +[group_23214] +[group_23215] +[group_23216] +[group_23217] +[group_23218] +[group_23219] +[group_23220] +[group_23221] +[group_23222] +[group_23223] +[group_23224] +[group_23225] +[group_23226] +[group_23227] +[group_23228] +[group_23229] +[group_23230] +[group_23231] +[group_23232] +[group_23233] +[group_23234] +[group_23235] +[group_23236] +[group_23237] +[group_23238] +[group_23239] +[group_23240] +[group_23241] +[group_23242] +[group_23243] +[group_23244] +[group_23245] +[group_23246] +[group_23247] +[group_23248] +[group_23249] +[group_23250] +[group_23251] +[group_23252] +[group_23253] +[group_23254] +[group_23255] +[group_23256] +[group_23257] +[group_23258] +[group_23259] +[group_23260] +[group_23261] +[group_23262] +[group_23263] +[group_23264] +[group_23265] +[group_23266] +[group_23267] +[group_23268] +[group_23269] +[group_23270] +[group_23271] +[group_23272] +[group_23273] +[group_23274] +[group_23275] +[group_23276] +[group_23277] +[group_23278] +[group_23279] +[group_23280] +[group_23281] +[group_23282] +[group_23283] +[group_23284] +[group_23285] +[group_23286] +[group_23287] +[group_23288] +[group_23289] +[group_23290] +[group_23291] +[group_23292] +[group_23293] +[group_23294] +[group_23295] +[group_23296] +[group_23297] +[group_23298] +[group_23299] +[group_23300] +[group_23301] +[group_23302] +[group_23303] +[group_23304] +[group_23305] +[group_23306] +[group_23307] +[group_23308] +[group_23309] +[group_23310] +[group_23311] +[group_23312] +[group_23313] +[group_23314] +[group_23315] +[group_23316] +[group_23317] +[group_23318] +[group_23319] +[group_23320] +[group_23321] +[group_23322] +[group_23323] +[group_23324] +[group_23325] +[group_23326] +[group_23327] +[group_23328] +[group_23329] +[group_23330] +[group_23331] +[group_23332] +[group_23333] +[group_23334] +[group_23335] +[group_23336] +[group_23337] +[group_23338] +[group_23339] +[group_23340] +[group_23341] +[group_23342] +[group_23343] +[group_23344] +[group_23345] +[group_23346] +[group_23347] +[group_23348] +[group_23349] +[group_23350] +[group_23351] +[group_23352] +[group_23353] +[group_23354] +[group_23355] +[group_23356] +[group_23357] +[group_23358] +[group_23359] +[group_23360] +[group_23361] +[group_23362] +[group_23363] +[group_23364] +[group_23365] +[group_23366] +[group_23367] +[group_23368] +[group_23369] +[group_23370] +[group_23371] +[group_23372] +[group_23373] +[group_23374] +[group_23375] +[group_23376] +[group_23377] +[group_23378] +[group_23379] +[group_23380] +[group_23381] +[group_23382] +[group_23383] +[group_23384] +[group_23385] +[group_23386] +[group_23387] +[group_23388] +[group_23389] +[group_23390] +[group_23391] +[group_23392] +[group_23393] +[group_23394] +[group_23395] +[group_23396] +[group_23397] +[group_23398] +[group_23399] +[group_23400] +[group_23401] +[group_23402] +[group_23403] +[group_23404] +[group_23405] +[group_23406] +[group_23407] +[group_23408] +[group_23409] +[group_23410] +[group_23411] +[group_23412] +[group_23413] +[group_23414] +[group_23415] +[group_23416] +[group_23417] +[group_23418] +[group_23419] +[group_23420] +[group_23421] +[group_23422] +[group_23423] +[group_23424] +[group_23425] +[group_23426] +[group_23427] +[group_23428] +[group_23429] +[group_23430] +[group_23431] +[group_23432] +[group_23433] +[group_23434] +[group_23435] +[group_23436] +[group_23437] +[group_23438] +[group_23439] +[group_23440] +[group_23441] +[group_23442] +[group_23443] +[group_23444] +[group_23445] +[group_23446] +[group_23447] +[group_23448] +[group_23449] +[group_23450] +[group_23451] +[group_23452] +[group_23453] +[group_23454] +[group_23455] +[group_23456] +[group_23457] +[group_23458] +[group_23459] +[group_23460] +[group_23461] +[group_23462] +[group_23463] +[group_23464] +[group_23465] +[group_23466] +[group_23467] +[group_23468] +[group_23469] +[group_23470] +[group_23471] +[group_23472] +[group_23473] +[group_23474] +[group_23475] +[group_23476] +[group_23477] +[group_23478] +[group_23479] +[group_23480] +[group_23481] +[group_23482] +[group_23483] +[group_23484] +[group_23485] +[group_23486] +[group_23487] +[group_23488] +[group_23489] +[group_23490] +[group_23491] +[group_23492] +[group_23493] +[group_23494] +[group_23495] +[group_23496] +[group_23497] +[group_23498] +[group_23499] +[group_23500] +[group_23501] +[group_23502] +[group_23503] +[group_23504] +[group_23505] +[group_23506] +[group_23507] +[group_23508] +[group_23509] +[group_23510] +[group_23511] +[group_23512] +[group_23513] +[group_23514] +[group_23515] +[group_23516] +[group_23517] +[group_23518] +[group_23519] +[group_23520] +[group_23521] +[group_23522] +[group_23523] +[group_23524] +[group_23525] +[group_23526] +[group_23527] +[group_23528] +[group_23529] +[group_23530] +[group_23531] +[group_23532] +[group_23533] +[group_23534] +[group_23535] +[group_23536] +[group_23537] +[group_23538] +[group_23539] +[group_23540] +[group_23541] +[group_23542] +[group_23543] +[group_23544] +[group_23545] +[group_23546] +[group_23547] +[group_23548] +[group_23549] +[group_23550] +[group_23551] +[group_23552] +[group_23553] +[group_23554] +[group_23555] +[group_23556] +[group_23557] +[group_23558] +[group_23559] +[group_23560] +[group_23561] +[group_23562] +[group_23563] +[group_23564] +[group_23565] +[group_23566] +[group_23567] +[group_23568] +[group_23569] +[group_23570] +[group_23571] +[group_23572] +[group_23573] +[group_23574] +[group_23575] +[group_23576] +[group_23577] +[group_23578] +[group_23579] +[group_23580] +[group_23581] +[group_23582] +[group_23583] +[group_23584] +[group_23585] +[group_23586] +[group_23587] +[group_23588] +[group_23589] +[group_23590] +[group_23591] +[group_23592] +[group_23593] +[group_23594] +[group_23595] +[group_23596] +[group_23597] +[group_23598] +[group_23599] +[group_23600] +[group_23601] +[group_23602] +[group_23603] +[group_23604] +[group_23605] +[group_23606] +[group_23607] +[group_23608] +[group_23609] +[group_23610] +[group_23611] +[group_23612] +[group_23613] +[group_23614] +[group_23615] +[group_23616] +[group_23617] +[group_23618] +[group_23619] +[group_23620] +[group_23621] +[group_23622] +[group_23623] +[group_23624] +[group_23625] +[group_23626] +[group_23627] +[group_23628] +[group_23629] +[group_23630] +[group_23631] +[group_23632] +[group_23633] +[group_23634] +[group_23635] +[group_23636] +[group_23637] +[group_23638] +[group_23639] +[group_23640] +[group_23641] +[group_23642] +[group_23643] +[group_23644] +[group_23645] +[group_23646] +[group_23647] +[group_23648] +[group_23649] +[group_23650] +[group_23651] +[group_23652] +[group_23653] +[group_23654] +[group_23655] +[group_23656] +[group_23657] +[group_23658] +[group_23659] +[group_23660] +[group_23661] +[group_23662] +[group_23663] +[group_23664] +[group_23665] +[group_23666] +[group_23667] +[group_23668] +[group_23669] +[group_23670] +[group_23671] +[group_23672] +[group_23673] +[group_23674] +[group_23675] +[group_23676] +[group_23677] +[group_23678] +[group_23679] +[group_23680] +[group_23681] +[group_23682] +[group_23683] +[group_23684] +[group_23685] +[group_23686] +[group_23687] +[group_23688] +[group_23689] +[group_23690] +[group_23691] +[group_23692] +[group_23693] +[group_23694] +[group_23695] +[group_23696] +[group_23697] +[group_23698] +[group_23699] +[group_23700] +[group_23701] +[group_23702] +[group_23703] +[group_23704] +[group_23705] +[group_23706] +[group_23707] +[group_23708] +[group_23709] +[group_23710] +[group_23711] +[group_23712] +[group_23713] +[group_23714] +[group_23715] +[group_23716] +[group_23717] +[group_23718] +[group_23719] +[group_23720] +[group_23721] +[group_23722] +[group_23723] +[group_23724] +[group_23725] +[group_23726] +[group_23727] +[group_23728] +[group_23729] +[group_23730] +[group_23731] +[group_23732] +[group_23733] +[group_23734] +[group_23735] +[group_23736] +[group_23737] +[group_23738] +[group_23739] +[group_23740] +[group_23741] +[group_23742] +[group_23743] +[group_23744] +[group_23745] +[group_23746] +[group_23747] +[group_23748] +[group_23749] +[group_23750] +[group_23751] +[group_23752] +[group_23753] +[group_23754] +[group_23755] +[group_23756] +[group_23757] +[group_23758] +[group_23759] +[group_23760] +[group_23761] +[group_23762] +[group_23763] +[group_23764] +[group_23765] +[group_23766] +[group_23767] +[group_23768] +[group_23769] +[group_23770] +[group_23771] +[group_23772] +[group_23773] +[group_23774] +[group_23775] +[group_23776] +[group_23777] +[group_23778] +[group_23779] +[group_23780] +[group_23781] +[group_23782] +[group_23783] +[group_23784] +[group_23785] +[group_23786] +[group_23787] +[group_23788] +[group_23789] +[group_23790] +[group_23791] +[group_23792] +[group_23793] +[group_23794] +[group_23795] +[group_23796] +[group_23797] +[group_23798] +[group_23799] +[group_23800] +[group_23801] +[group_23802] +[group_23803] +[group_23804] +[group_23805] +[group_23806] +[group_23807] +[group_23808] +[group_23809] +[group_23810] +[group_23811] +[group_23812] +[group_23813] +[group_23814] +[group_23815] +[group_23816] +[group_23817] +[group_23818] +[group_23819] +[group_23820] +[group_23821] +[group_23822] +[group_23823] +[group_23824] +[group_23825] +[group_23826] +[group_23827] +[group_23828] +[group_23829] +[group_23830] +[group_23831] +[group_23832] +[group_23833] +[group_23834] +[group_23835] +[group_23836] +[group_23837] +[group_23838] +[group_23839] +[group_23840] +[group_23841] +[group_23842] +[group_23843] +[group_23844] +[group_23845] +[group_23846] +[group_23847] +[group_23848] +[group_23849] +[group_23850] +[group_23851] +[group_23852] +[group_23853] +[group_23854] +[group_23855] +[group_23856] +[group_23857] +[group_23858] +[group_23859] +[group_23860] +[group_23861] +[group_23862] +[group_23863] +[group_23864] +[group_23865] +[group_23866] +[group_23867] +[group_23868] +[group_23869] +[group_23870] +[group_23871] +[group_23872] +[group_23873] +[group_23874] +[group_23875] +[group_23876] +[group_23877] +[group_23878] +[group_23879] +[group_23880] +[group_23881] +[group_23882] +[group_23883] +[group_23884] +[group_23885] +[group_23886] +[group_23887] +[group_23888] +[group_23889] +[group_23890] +[group_23891] +[group_23892] +[group_23893] +[group_23894] +[group_23895] +[group_23896] +[group_23897] +[group_23898] +[group_23899] +[group_23900] +[group_23901] +[group_23902] +[group_23903] +[group_23904] +[group_23905] +[group_23906] +[group_23907] +[group_23908] +[group_23909] +[group_23910] +[group_23911] +[group_23912] +[group_23913] +[group_23914] +[group_23915] +[group_23916] +[group_23917] +[group_23918] +[group_23919] +[group_23920] +[group_23921] +[group_23922] +[group_23923] +[group_23924] +[group_23925] +[group_23926] +[group_23927] +[group_23928] +[group_23929] +[group_23930] +[group_23931] +[group_23932] +[group_23933] +[group_23934] +[group_23935] +[group_23936] +[group_23937] +[group_23938] +[group_23939] +[group_23940] +[group_23941] +[group_23942] +[group_23943] +[group_23944] +[group_23945] +[group_23946] +[group_23947] +[group_23948] +[group_23949] +[group_23950] +[group_23951] +[group_23952] +[group_23953] +[group_23954] +[group_23955] +[group_23956] +[group_23957] +[group_23958] +[group_23959] +[group_23960] +[group_23961] +[group_23962] +[group_23963] +[group_23964] +[group_23965] +[group_23966] +[group_23967] +[group_23968] +[group_23969] +[group_23970] +[group_23971] +[group_23972] +[group_23973] +[group_23974] +[group_23975] +[group_23976] +[group_23977] +[group_23978] +[group_23979] +[group_23980] +[group_23981] +[group_23982] +[group_23983] +[group_23984] +[group_23985] +[group_23986] +[group_23987] +[group_23988] +[group_23989] +[group_23990] +[group_23991] +[group_23992] +[group_23993] +[group_23994] +[group_23995] +[group_23996] +[group_23997] +[group_23998] +[group_23999] +[group_24000] +[group_24001] +[group_24002] +[group_24003] +[group_24004] +[group_24005] +[group_24006] +[group_24007] +[group_24008] +[group_24009] +[group_24010] +[group_24011] +[group_24012] +[group_24013] +[group_24014] +[group_24015] +[group_24016] +[group_24017] +[group_24018] +[group_24019] +[group_24020] +[group_24021] +[group_24022] +[group_24023] +[group_24024] +[group_24025] +[group_24026] +[group_24027] +[group_24028] +[group_24029] +[group_24030] +[group_24031] +[group_24032] +[group_24033] +[group_24034] +[group_24035] +[group_24036] +[group_24037] +[group_24038] +[group_24039] +[group_24040] +[group_24041] +[group_24042] +[group_24043] +[group_24044] +[group_24045] +[group_24046] +[group_24047] +[group_24048] +[group_24049] +[group_24050] +[group_24051] +[group_24052] +[group_24053] +[group_24054] +[group_24055] +[group_24056] +[group_24057] +[group_24058] +[group_24059] +[group_24060] +[group_24061] +[group_24062] +[group_24063] +[group_24064] +[group_24065] +[group_24066] +[group_24067] +[group_24068] +[group_24069] +[group_24070] +[group_24071] +[group_24072] +[group_24073] +[group_24074] +[group_24075] +[group_24076] +[group_24077] +[group_24078] +[group_24079] +[group_24080] +[group_24081] +[group_24082] +[group_24083] +[group_24084] +[group_24085] +[group_24086] +[group_24087] +[group_24088] +[group_24089] +[group_24090] +[group_24091] +[group_24092] +[group_24093] +[group_24094] +[group_24095] +[group_24096] +[group_24097] +[group_24098] +[group_24099] +[group_24100] +[group_24101] +[group_24102] +[group_24103] +[group_24104] +[group_24105] +[group_24106] +[group_24107] +[group_24108] +[group_24109] +[group_24110] +[group_24111] +[group_24112] +[group_24113] +[group_24114] +[group_24115] +[group_24116] +[group_24117] +[group_24118] +[group_24119] +[group_24120] +[group_24121] +[group_24122] +[group_24123] +[group_24124] +[group_24125] +[group_24126] +[group_24127] +[group_24128] +[group_24129] +[group_24130] +[group_24131] +[group_24132] +[group_24133] +[group_24134] +[group_24135] +[group_24136] +[group_24137] +[group_24138] +[group_24139] +[group_24140] +[group_24141] +[group_24142] +[group_24143] +[group_24144] +[group_24145] +[group_24146] +[group_24147] +[group_24148] +[group_24149] +[group_24150] +[group_24151] +[group_24152] +[group_24153] +[group_24154] +[group_24155] +[group_24156] +[group_24157] +[group_24158] +[group_24159] +[group_24160] +[group_24161] +[group_24162] +[group_24163] +[group_24164] +[group_24165] +[group_24166] +[group_24167] +[group_24168] +[group_24169] +[group_24170] +[group_24171] +[group_24172] +[group_24173] +[group_24174] +[group_24175] +[group_24176] +[group_24177] +[group_24178] +[group_24179] +[group_24180] +[group_24181] +[group_24182] +[group_24183] +[group_24184] +[group_24185] +[group_24186] +[group_24187] +[group_24188] +[group_24189] +[group_24190] +[group_24191] +[group_24192] +[group_24193] +[group_24194] +[group_24195] +[group_24196] +[group_24197] +[group_24198] +[group_24199] +[group_24200] +[group_24201] +[group_24202] +[group_24203] +[group_24204] +[group_24205] +[group_24206] +[group_24207] +[group_24208] +[group_24209] +[group_24210] +[group_24211] +[group_24212] +[group_24213] +[group_24214] +[group_24215] +[group_24216] +[group_24217] +[group_24218] +[group_24219] +[group_24220] +[group_24221] +[group_24222] +[group_24223] +[group_24224] +[group_24225] +[group_24226] +[group_24227] +[group_24228] +[group_24229] +[group_24230] +[group_24231] +[group_24232] +[group_24233] +[group_24234] +[group_24235] +[group_24236] +[group_24237] +[group_24238] +[group_24239] +[group_24240] +[group_24241] +[group_24242] +[group_24243] +[group_24244] +[group_24245] +[group_24246] +[group_24247] +[group_24248] +[group_24249] +[group_24250] +[group_24251] +[group_24252] +[group_24253] +[group_24254] +[group_24255] +[group_24256] +[group_24257] +[group_24258] +[group_24259] +[group_24260] +[group_24261] +[group_24262] +[group_24263] +[group_24264] +[group_24265] +[group_24266] +[group_24267] +[group_24268] +[group_24269] +[group_24270] +[group_24271] +[group_24272] +[group_24273] +[group_24274] +[group_24275] +[group_24276] +[group_24277] +[group_24278] +[group_24279] +[group_24280] +[group_24281] +[group_24282] +[group_24283] +[group_24284] +[group_24285] +[group_24286] +[group_24287] +[group_24288] +[group_24289] +[group_24290] +[group_24291] +[group_24292] +[group_24293] +[group_24294] +[group_24295] +[group_24296] +[group_24297] +[group_24298] +[group_24299] +[group_24300] +[group_24301] +[group_24302] +[group_24303] +[group_24304] +[group_24305] +[group_24306] +[group_24307] +[group_24308] +[group_24309] +[group_24310] +[group_24311] +[group_24312] +[group_24313] +[group_24314] +[group_24315] +[group_24316] +[group_24317] +[group_24318] +[group_24319] +[group_24320] +[group_24321] +[group_24322] +[group_24323] +[group_24324] +[group_24325] +[group_24326] +[group_24327] +[group_24328] +[group_24329] +[group_24330] +[group_24331] +[group_24332] +[group_24333] +[group_24334] +[group_24335] +[group_24336] +[group_24337] +[group_24338] +[group_24339] +[group_24340] +[group_24341] +[group_24342] +[group_24343] +[group_24344] +[group_24345] +[group_24346] +[group_24347] +[group_24348] +[group_24349] +[group_24350] +[group_24351] +[group_24352] +[group_24353] +[group_24354] +[group_24355] +[group_24356] +[group_24357] +[group_24358] +[group_24359] +[group_24360] +[group_24361] +[group_24362] +[group_24363] +[group_24364] +[group_24365] +[group_24366] +[group_24367] +[group_24368] +[group_24369] +[group_24370] +[group_24371] +[group_24372] +[group_24373] +[group_24374] +[group_24375] +[group_24376] +[group_24377] +[group_24378] +[group_24379] +[group_24380] +[group_24381] +[group_24382] +[group_24383] +[group_24384] +[group_24385] +[group_24386] +[group_24387] +[group_24388] +[group_24389] +[group_24390] +[group_24391] +[group_24392] +[group_24393] +[group_24394] +[group_24395] +[group_24396] +[group_24397] +[group_24398] +[group_24399] +[group_24400] +[group_24401] +[group_24402] +[group_24403] +[group_24404] +[group_24405] +[group_24406] +[group_24407] +[group_24408] +[group_24409] +[group_24410] +[group_24411] +[group_24412] +[group_24413] +[group_24414] +[group_24415] +[group_24416] +[group_24417] +[group_24418] +[group_24419] +[group_24420] +[group_24421] +[group_24422] +[group_24423] +[group_24424] +[group_24425] +[group_24426] +[group_24427] +[group_24428] +[group_24429] +[group_24430] +[group_24431] +[group_24432] +[group_24433] +[group_24434] +[group_24435] +[group_24436] +[group_24437] +[group_24438] +[group_24439] +[group_24440] +[group_24441] +[group_24442] +[group_24443] +[group_24444] +[group_24445] +[group_24446] +[group_24447] +[group_24448] +[group_24449] +[group_24450] +[group_24451] +[group_24452] +[group_24453] +[group_24454] +[group_24455] +[group_24456] +[group_24457] +[group_24458] +[group_24459] +[group_24460] +[group_24461] +[group_24462] +[group_24463] +[group_24464] +[group_24465] +[group_24466] +[group_24467] +[group_24468] +[group_24469] +[group_24470] +[group_24471] +[group_24472] +[group_24473] +[group_24474] +[group_24475] +[group_24476] +[group_24477] +[group_24478] +[group_24479] +[group_24480] +[group_24481] +[group_24482] +[group_24483] +[group_24484] +[group_24485] +[group_24486] +[group_24487] +[group_24488] +[group_24489] +[group_24490] +[group_24491] +[group_24492] +[group_24493] +[group_24494] +[group_24495] +[group_24496] +[group_24497] +[group_24498] +[group_24499] +[group_24500] +[group_24501] +[group_24502] +[group_24503] +[group_24504] +[group_24505] +[group_24506] +[group_24507] +[group_24508] +[group_24509] +[group_24510] +[group_24511] +[group_24512] +[group_24513] +[group_24514] +[group_24515] +[group_24516] +[group_24517] +[group_24518] +[group_24519] +[group_24520] +[group_24521] +[group_24522] +[group_24523] +[group_24524] +[group_24525] +[group_24526] +[group_24527] +[group_24528] +[group_24529] +[group_24530] +[group_24531] +[group_24532] +[group_24533] +[group_24534] +[group_24535] +[group_24536] +[group_24537] +[group_24538] +[group_24539] +[group_24540] +[group_24541] +[group_24542] +[group_24543] +[group_24544] +[group_24545] +[group_24546] +[group_24547] +[group_24548] +[group_24549] +[group_24550] +[group_24551] +[group_24552] +[group_24553] +[group_24554] +[group_24555] +[group_24556] +[group_24557] +[group_24558] +[group_24559] +[group_24560] +[group_24561] +[group_24562] +[group_24563] +[group_24564] +[group_24565] +[group_24566] +[group_24567] +[group_24568] +[group_24569] +[group_24570] +[group_24571] +[group_24572] +[group_24573] +[group_24574] +[group_24575] +[group_24576] +[group_24577] +[group_24578] +[group_24579] +[group_24580] +[group_24581] +[group_24582] +[group_24583] +[group_24584] +[group_24585] +[group_24586] +[group_24587] +[group_24588] +[group_24589] +[group_24590] +[group_24591] +[group_24592] +[group_24593] +[group_24594] +[group_24595] +[group_24596] +[group_24597] +[group_24598] +[group_24599] +[group_24600] +[group_24601] +[group_24602] +[group_24603] +[group_24604] +[group_24605] +[group_24606] +[group_24607] +[group_24608] +[group_24609] +[group_24610] +[group_24611] +[group_24612] +[group_24613] +[group_24614] +[group_24615] +[group_24616] +[group_24617] +[group_24618] +[group_24619] +[group_24620] +[group_24621] +[group_24622] +[group_24623] +[group_24624] +[group_24625] +[group_24626] +[group_24627] +[group_24628] +[group_24629] +[group_24630] +[group_24631] +[group_24632] +[group_24633] +[group_24634] +[group_24635] +[group_24636] +[group_24637] +[group_24638] +[group_24639] +[group_24640] +[group_24641] +[group_24642] +[group_24643] +[group_24644] +[group_24645] +[group_24646] +[group_24647] +[group_24648] +[group_24649] +[group_24650] +[group_24651] +[group_24652] +[group_24653] +[group_24654] +[group_24655] +[group_24656] +[group_24657] +[group_24658] +[group_24659] +[group_24660] +[group_24661] +[group_24662] +[group_24663] +[group_24664] +[group_24665] +[group_24666] +[group_24667] +[group_24668] +[group_24669] +[group_24670] +[group_24671] +[group_24672] +[group_24673] +[group_24674] +[group_24675] +[group_24676] +[group_24677] +[group_24678] +[group_24679] +[group_24680] +[group_24681] +[group_24682] +[group_24683] +[group_24684] +[group_24685] +[group_24686] +[group_24687] +[group_24688] +[group_24689] +[group_24690] +[group_24691] +[group_24692] +[group_24693] +[group_24694] +[group_24695] +[group_24696] +[group_24697] +[group_24698] +[group_24699] +[group_24700] +[group_24701] +[group_24702] +[group_24703] +[group_24704] +[group_24705] +[group_24706] +[group_24707] +[group_24708] +[group_24709] +[group_24710] +[group_24711] +[group_24712] +[group_24713] +[group_24714] +[group_24715] +[group_24716] +[group_24717] +[group_24718] +[group_24719] +[group_24720] +[group_24721] +[group_24722] +[group_24723] +[group_24724] +[group_24725] +[group_24726] +[group_24727] +[group_24728] +[group_24729] +[group_24730] +[group_24731] +[group_24732] +[group_24733] +[group_24734] +[group_24735] +[group_24736] +[group_24737] +[group_24738] +[group_24739] +[group_24740] +[group_24741] +[group_24742] +[group_24743] +[group_24744] +[group_24745] +[group_24746] +[group_24747] +[group_24748] +[group_24749] +[group_24750] +[group_24751] +[group_24752] +[group_24753] +[group_24754] +[group_24755] +[group_24756] +[group_24757] +[group_24758] +[group_24759] +[group_24760] +[group_24761] +[group_24762] +[group_24763] +[group_24764] +[group_24765] +[group_24766] +[group_24767] +[group_24768] +[group_24769] +[group_24770] +[group_24771] +[group_24772] +[group_24773] +[group_24774] +[group_24775] +[group_24776] +[group_24777] +[group_24778] +[group_24779] +[group_24780] +[group_24781] +[group_24782] +[group_24783] +[group_24784] +[group_24785] +[group_24786] +[group_24787] +[group_24788] +[group_24789] +[group_24790] +[group_24791] +[group_24792] +[group_24793] +[group_24794] +[group_24795] +[group_24796] +[group_24797] +[group_24798] +[group_24799] +[group_24800] +[group_24801] +[group_24802] +[group_24803] +[group_24804] +[group_24805] +[group_24806] +[group_24807] +[group_24808] +[group_24809] +[group_24810] +[group_24811] +[group_24812] +[group_24813] +[group_24814] +[group_24815] +[group_24816] +[group_24817] +[group_24818] +[group_24819] +[group_24820] +[group_24821] +[group_24822] +[group_24823] +[group_24824] +[group_24825] +[group_24826] +[group_24827] +[group_24828] +[group_24829] +[group_24830] +[group_24831] +[group_24832] +[group_24833] +[group_24834] +[group_24835] +[group_24836] +[group_24837] +[group_24838] +[group_24839] +[group_24840] +[group_24841] +[group_24842] +[group_24843] +[group_24844] +[group_24845] +[group_24846] +[group_24847] +[group_24848] +[group_24849] +[group_24850] +[group_24851] +[group_24852] +[group_24853] +[group_24854] +[group_24855] +[group_24856] +[group_24857] +[group_24858] +[group_24859] +[group_24860] +[group_24861] +[group_24862] +[group_24863] +[group_24864] +[group_24865] +[group_24866] +[group_24867] +[group_24868] +[group_24869] +[group_24870] +[group_24871] +[group_24872] +[group_24873] +[group_24874] +[group_24875] +[group_24876] +[group_24877] +[group_24878] +[group_24879] +[group_24880] +[group_24881] +[group_24882] +[group_24883] +[group_24884] +[group_24885] +[group_24886] +[group_24887] +[group_24888] +[group_24889] +[group_24890] +[group_24891] +[group_24892] +[group_24893] +[group_24894] +[group_24895] +[group_24896] +[group_24897] +[group_24898] +[group_24899] +[group_24900] +[group_24901] +[group_24902] +[group_24903] +[group_24904] +[group_24905] +[group_24906] +[group_24907] +[group_24908] +[group_24909] +[group_24910] +[group_24911] +[group_24912] +[group_24913] +[group_24914] +[group_24915] +[group_24916] +[group_24917] +[group_24918] +[group_24919] +[group_24920] +[group_24921] +[group_24922] +[group_24923] +[group_24924] +[group_24925] +[group_24926] +[group_24927] +[group_24928] +[group_24929] +[group_24930] +[group_24931] +[group_24932] +[group_24933] +[group_24934] +[group_24935] +[group_24936] +[group_24937] +[group_24938] +[group_24939] +[group_24940] +[group_24941] +[group_24942] +[group_24943] +[group_24944] +[group_24945] +[group_24946] +[group_24947] +[group_24948] +[group_24949] +[group_24950] +[group_24951] +[group_24952] +[group_24953] +[group_24954] +[group_24955] +[group_24956] +[group_24957] +[group_24958] +[group_24959] +[group_24960] +[group_24961] +[group_24962] +[group_24963] +[group_24964] +[group_24965] +[group_24966] +[group_24967] +[group_24968] +[group_24969] +[group_24970] +[group_24971] +[group_24972] +[group_24973] +[group_24974] +[group_24975] +[group_24976] +[group_24977] +[group_24978] +[group_24979] +[group_24980] +[group_24981] +[group_24982] +[group_24983] +[group_24984] +[group_24985] +[group_24986] +[group_24987] +[group_24988] +[group_24989] +[group_24990] +[group_24991] +[group_24992] +[group_24993] +[group_24994] +[group_24995] +[group_24996] +[group_24997] +[group_24998] +[group_24999] +[group_25000] +[group_25001] +[group_25002] +[group_25003] +[group_25004] +[group_25005] +[group_25006] +[group_25007] +[group_25008] +[group_25009] +[group_25010] +[group_25011] +[group_25012] +[group_25013] +[group_25014] +[group_25015] +[group_25016] +[group_25017] +[group_25018] +[group_25019] +[group_25020] +[group_25021] +[group_25022] +[group_25023] +[group_25024] +[group_25025] +[group_25026] +[group_25027] +[group_25028] +[group_25029] +[group_25030] +[group_25031] +[group_25032] +[group_25033] +[group_25034] +[group_25035] +[group_25036] +[group_25037] +[group_25038] +[group_25039] +[group_25040] +[group_25041] +[group_25042] +[group_25043] +[group_25044] +[group_25045] +[group_25046] +[group_25047] +[group_25048] +[group_25049] +[group_25050] +[group_25051] +[group_25052] +[group_25053] +[group_25054] +[group_25055] +[group_25056] +[group_25057] +[group_25058] +[group_25059] +[group_25060] +[group_25061] +[group_25062] +[group_25063] +[group_25064] +[group_25065] +[group_25066] +[group_25067] +[group_25068] +[group_25069] +[group_25070] +[group_25071] +[group_25072] +[group_25073] +[group_25074] +[group_25075] +[group_25076] +[group_25077] +[group_25078] +[group_25079] +[group_25080] +[group_25081] +[group_25082] +[group_25083] +[group_25084] +[group_25085] +[group_25086] +[group_25087] +[group_25088] +[group_25089] +[group_25090] +[group_25091] +[group_25092] +[group_25093] +[group_25094] +[group_25095] +[group_25096] +[group_25097] +[group_25098] +[group_25099] +[group_25100] +[group_25101] +[group_25102] +[group_25103] +[group_25104] +[group_25105] +[group_25106] +[group_25107] +[group_25108] +[group_25109] +[group_25110] +[group_25111] +[group_25112] +[group_25113] +[group_25114] +[group_25115] +[group_25116] +[group_25117] +[group_25118] +[group_25119] +[group_25120] +[group_25121] +[group_25122] +[group_25123] +[group_25124] +[group_25125] +[group_25126] +[group_25127] +[group_25128] +[group_25129] +[group_25130] +[group_25131] +[group_25132] +[group_25133] +[group_25134] +[group_25135] +[group_25136] +[group_25137] +[group_25138] +[group_25139] +[group_25140] +[group_25141] +[group_25142] +[group_25143] +[group_25144] +[group_25145] +[group_25146] +[group_25147] +[group_25148] +[group_25149] +[group_25150] +[group_25151] +[group_25152] +[group_25153] +[group_25154] +[group_25155] +[group_25156] +[group_25157] +[group_25158] +[group_25159] +[group_25160] +[group_25161] +[group_25162] +[group_25163] +[group_25164] +[group_25165] +[group_25166] +[group_25167] +[group_25168] +[group_25169] +[group_25170] +[group_25171] +[group_25172] +[group_25173] +[group_25174] +[group_25175] +[group_25176] +[group_25177] +[group_25178] +[group_25179] +[group_25180] +[group_25181] +[group_25182] +[group_25183] +[group_25184] +[group_25185] +[group_25186] +[group_25187] +[group_25188] +[group_25189] +[group_25190] +[group_25191] +[group_25192] +[group_25193] +[group_25194] +[group_25195] +[group_25196] +[group_25197] +[group_25198] +[group_25199] +[group_25200] +[group_25201] +[group_25202] +[group_25203] +[group_25204] +[group_25205] +[group_25206] +[group_25207] +[group_25208] +[group_25209] +[group_25210] +[group_25211] +[group_25212] +[group_25213] +[group_25214] +[group_25215] +[group_25216] +[group_25217] +[group_25218] +[group_25219] +[group_25220] +[group_25221] +[group_25222] +[group_25223] +[group_25224] +[group_25225] +[group_25226] +[group_25227] +[group_25228] +[group_25229] +[group_25230] +[group_25231] +[group_25232] +[group_25233] +[group_25234] +[group_25235] +[group_25236] +[group_25237] +[group_25238] +[group_25239] +[group_25240] +[group_25241] +[group_25242] +[group_25243] +[group_25244] +[group_25245] +[group_25246] +[group_25247] +[group_25248] +[group_25249] +[group_25250] +[group_25251] +[group_25252] +[group_25253] +[group_25254] +[group_25255] +[group_25256] +[group_25257] +[group_25258] +[group_25259] +[group_25260] +[group_25261] +[group_25262] +[group_25263] +[group_25264] +[group_25265] +[group_25266] +[group_25267] +[group_25268] +[group_25269] +[group_25270] +[group_25271] +[group_25272] +[group_25273] +[group_25274] +[group_25275] +[group_25276] +[group_25277] +[group_25278] +[group_25279] +[group_25280] +[group_25281] +[group_25282] +[group_25283] +[group_25284] +[group_25285] +[group_25286] +[group_25287] +[group_25288] +[group_25289] +[group_25290] +[group_25291] +[group_25292] +[group_25293] +[group_25294] +[group_25295] +[group_25296] +[group_25297] +[group_25298] +[group_25299] +[group_25300] +[group_25301] +[group_25302] +[group_25303] +[group_25304] +[group_25305] +[group_25306] +[group_25307] +[group_25308] +[group_25309] +[group_25310] +[group_25311] +[group_25312] +[group_25313] +[group_25314] +[group_25315] +[group_25316] +[group_25317] +[group_25318] +[group_25319] +[group_25320] +[group_25321] +[group_25322] +[group_25323] +[group_25324] +[group_25325] +[group_25326] +[group_25327] +[group_25328] +[group_25329] +[group_25330] +[group_25331] +[group_25332] +[group_25333] +[group_25334] +[group_25335] +[group_25336] +[group_25337] +[group_25338] +[group_25339] +[group_25340] +[group_25341] +[group_25342] +[group_25343] +[group_25344] +[group_25345] +[group_25346] +[group_25347] +[group_25348] +[group_25349] +[group_25350] +[group_25351] +[group_25352] +[group_25353] +[group_25354] +[group_25355] +[group_25356] +[group_25357] +[group_25358] +[group_25359] +[group_25360] +[group_25361] +[group_25362] +[group_25363] +[group_25364] +[group_25365] +[group_25366] +[group_25367] +[group_25368] +[group_25369] +[group_25370] +[group_25371] +[group_25372] +[group_25373] +[group_25374] +[group_25375] +[group_25376] +[group_25377] +[group_25378] +[group_25379] +[group_25380] +[group_25381] +[group_25382] +[group_25383] +[group_25384] +[group_25385] +[group_25386] +[group_25387] +[group_25388] +[group_25389] +[group_25390] +[group_25391] +[group_25392] +[group_25393] +[group_25394] +[group_25395] +[group_25396] +[group_25397] +[group_25398] +[group_25399] +[group_25400] +[group_25401] +[group_25402] +[group_25403] +[group_25404] +[group_25405] +[group_25406] +[group_25407] +[group_25408] +[group_25409] +[group_25410] +[group_25411] +[group_25412] +[group_25413] +[group_25414] +[group_25415] +[group_25416] +[group_25417] +[group_25418] +[group_25419] +[group_25420] +[group_25421] +[group_25422] +[group_25423] +[group_25424] +[group_25425] +[group_25426] +[group_25427] +[group_25428] +[group_25429] +[group_25430] +[group_25431] +[group_25432] +[group_25433] +[group_25434] +[group_25435] +[group_25436] +[group_25437] +[group_25438] +[group_25439] +[group_25440] +[group_25441] +[group_25442] +[group_25443] +[group_25444] +[group_25445] +[group_25446] +[group_25447] +[group_25448] +[group_25449] +[group_25450] +[group_25451] +[group_25452] +[group_25453] +[group_25454] +[group_25455] +[group_25456] +[group_25457] +[group_25458] +[group_25459] +[group_25460] +[group_25461] +[group_25462] +[group_25463] +[group_25464] +[group_25465] +[group_25466] +[group_25467] +[group_25468] +[group_25469] +[group_25470] +[group_25471] +[group_25472] +[group_25473] +[group_25474] +[group_25475] +[group_25476] +[group_25477] +[group_25478] +[group_25479] +[group_25480] +[group_25481] +[group_25482] +[group_25483] +[group_25484] +[group_25485] +[group_25486] +[group_25487] +[group_25488] +[group_25489] +[group_25490] +[group_25491] +[group_25492] +[group_25493] +[group_25494] +[group_25495] +[group_25496] +[group_25497] +[group_25498] +[group_25499] +[group_25500] +[group_25501] +[group_25502] +[group_25503] +[group_25504] +[group_25505] +[group_25506] +[group_25507] +[group_25508] +[group_25509] +[group_25510] +[group_25511] +[group_25512] +[group_25513] +[group_25514] +[group_25515] +[group_25516] +[group_25517] +[group_25518] +[group_25519] +[group_25520] +[group_25521] +[group_25522] +[group_25523] +[group_25524] +[group_25525] +[group_25526] +[group_25527] +[group_25528] +[group_25529] +[group_25530] +[group_25531] +[group_25532] +[group_25533] +[group_25534] +[group_25535] +[group_25536] +[group_25537] +[group_25538] +[group_25539] +[group_25540] +[group_25541] +[group_25542] +[group_25543] +[group_25544] +[group_25545] +[group_25546] +[group_25547] +[group_25548] +[group_25549] +[group_25550] +[group_25551] +[group_25552] +[group_25553] +[group_25554] +[group_25555] +[group_25556] +[group_25557] +[group_25558] +[group_25559] +[group_25560] +[group_25561] +[group_25562] +[group_25563] +[group_25564] +[group_25565] +[group_25566] +[group_25567] +[group_25568] +[group_25569] +[group_25570] +[group_25571] +[group_25572] +[group_25573] +[group_25574] +[group_25575] +[group_25576] +[group_25577] +[group_25578] +[group_25579] +[group_25580] +[group_25581] +[group_25582] +[group_25583] +[group_25584] +[group_25585] +[group_25586] +[group_25587] +[group_25588] +[group_25589] +[group_25590] +[group_25591] +[group_25592] +[group_25593] +[group_25594] +[group_25595] +[group_25596] +[group_25597] +[group_25598] +[group_25599] +[group_25600] +[group_25601] +[group_25602] +[group_25603] +[group_25604] +[group_25605] +[group_25606] +[group_25607] +[group_25608] +[group_25609] +[group_25610] +[group_25611] +[group_25612] +[group_25613] +[group_25614] +[group_25615] +[group_25616] +[group_25617] +[group_25618] +[group_25619] +[group_25620] +[group_25621] +[group_25622] +[group_25623] +[group_25624] +[group_25625] +[group_25626] +[group_25627] +[group_25628] +[group_25629] +[group_25630] +[group_25631] +[group_25632] +[group_25633] +[group_25634] +[group_25635] +[group_25636] +[group_25637] +[group_25638] +[group_25639] +[group_25640] +[group_25641] +[group_25642] +[group_25643] +[group_25644] +[group_25645] +[group_25646] +[group_25647] +[group_25648] +[group_25649] +[group_25650] +[group_25651] +[group_25652] +[group_25653] +[group_25654] +[group_25655] +[group_25656] +[group_25657] +[group_25658] +[group_25659] +[group_25660] +[group_25661] +[group_25662] +[group_25663] +[group_25664] +[group_25665] +[group_25666] +[group_25667] +[group_25668] +[group_25669] +[group_25670] +[group_25671] +[group_25672] +[group_25673] +[group_25674] +[group_25675] +[group_25676] +[group_25677] +[group_25678] +[group_25679] +[group_25680] +[group_25681] +[group_25682] +[group_25683] +[group_25684] +[group_25685] +[group_25686] +[group_25687] +[group_25688] +[group_25689] +[group_25690] +[group_25691] +[group_25692] +[group_25693] +[group_25694] +[group_25695] +[group_25696] +[group_25697] +[group_25698] +[group_25699] +[group_25700] +[group_25701] +[group_25702] +[group_25703] +[group_25704] +[group_25705] +[group_25706] +[group_25707] +[group_25708] +[group_25709] +[group_25710] +[group_25711] +[group_25712] +[group_25713] +[group_25714] +[group_25715] +[group_25716] +[group_25717] +[group_25718] +[group_25719] +[group_25720] +[group_25721] +[group_25722] +[group_25723] +[group_25724] +[group_25725] +[group_25726] +[group_25727] +[group_25728] +[group_25729] +[group_25730] +[group_25731] +[group_25732] +[group_25733] +[group_25734] +[group_25735] +[group_25736] +[group_25737] +[group_25738] +[group_25739] +[group_25740] +[group_25741] +[group_25742] +[group_25743] +[group_25744] +[group_25745] +[group_25746] +[group_25747] +[group_25748] +[group_25749] +[group_25750] +[group_25751] +[group_25752] +[group_25753] +[group_25754] +[group_25755] +[group_25756] +[group_25757] +[group_25758] +[group_25759] +[group_25760] +[group_25761] +[group_25762] +[group_25763] +[group_25764] +[group_25765] +[group_25766] +[group_25767] +[group_25768] +[group_25769] +[group_25770] +[group_25771] +[group_25772] +[group_25773] +[group_25774] +[group_25775] +[group_25776] +[group_25777] +[group_25778] +[group_25779] +[group_25780] +[group_25781] +[group_25782] +[group_25783] +[group_25784] +[group_25785] +[group_25786] +[group_25787] +[group_25788] +[group_25789] +[group_25790] +[group_25791] +[group_25792] +[group_25793] +[group_25794] +[group_25795] +[group_25796] +[group_25797] +[group_25798] +[group_25799] +[group_25800] +[group_25801] +[group_25802] +[group_25803] +[group_25804] +[group_25805] +[group_25806] +[group_25807] +[group_25808] +[group_25809] +[group_25810] +[group_25811] +[group_25812] +[group_25813] +[group_25814] +[group_25815] +[group_25816] +[group_25817] +[group_25818] +[group_25819] +[group_25820] +[group_25821] +[group_25822] +[group_25823] +[group_25824] +[group_25825] +[group_25826] +[group_25827] +[group_25828] +[group_25829] +[group_25830] +[group_25831] +[group_25832] +[group_25833] +[group_25834] +[group_25835] +[group_25836] +[group_25837] +[group_25838] +[group_25839] +[group_25840] +[group_25841] +[group_25842] +[group_25843] +[group_25844] +[group_25845] +[group_25846] +[group_25847] +[group_25848] +[group_25849] +[group_25850] +[group_25851] +[group_25852] +[group_25853] +[group_25854] +[group_25855] +[group_25856] +[group_25857] +[group_25858] +[group_25859] +[group_25860] +[group_25861] +[group_25862] +[group_25863] +[group_25864] +[group_25865] +[group_25866] +[group_25867] +[group_25868] +[group_25869] +[group_25870] +[group_25871] +[group_25872] +[group_25873] +[group_25874] +[group_25875] +[group_25876] +[group_25877] +[group_25878] +[group_25879] +[group_25880] +[group_25881] +[group_25882] +[group_25883] +[group_25884] +[group_25885] +[group_25886] +[group_25887] +[group_25888] +[group_25889] +[group_25890] +[group_25891] +[group_25892] +[group_25893] +[group_25894] +[group_25895] +[group_25896] +[group_25897] +[group_25898] +[group_25899] +[group_25900] +[group_25901] +[group_25902] +[group_25903] +[group_25904] +[group_25905] +[group_25906] +[group_25907] +[group_25908] +[group_25909] +[group_25910] +[group_25911] +[group_25912] +[group_25913] +[group_25914] +[group_25915] +[group_25916] +[group_25917] +[group_25918] +[group_25919] +[group_25920] +[group_25921] +[group_25922] +[group_25923] +[group_25924] +[group_25925] +[group_25926] +[group_25927] +[group_25928] +[group_25929] +[group_25930] +[group_25931] +[group_25932] +[group_25933] +[group_25934] +[group_25935] +[group_25936] +[group_25937] +[group_25938] +[group_25939] +[group_25940] +[group_25941] +[group_25942] +[group_25943] +[group_25944] +[group_25945] +[group_25946] +[group_25947] +[group_25948] +[group_25949] +[group_25950] +[group_25951] +[group_25952] +[group_25953] +[group_25954] +[group_25955] +[group_25956] +[group_25957] +[group_25958] +[group_25959] +[group_25960] +[group_25961] +[group_25962] +[group_25963] +[group_25964] +[group_25965] +[group_25966] +[group_25967] +[group_25968] +[group_25969] +[group_25970] +[group_25971] +[group_25972] +[group_25973] +[group_25974] +[group_25975] +[group_25976] +[group_25977] +[group_25978] +[group_25979] +[group_25980] +[group_25981] +[group_25982] +[group_25983] +[group_25984] +[group_25985] +[group_25986] +[group_25987] +[group_25988] +[group_25989] +[group_25990] +[group_25991] +[group_25992] +[group_25993] +[group_25994] +[group_25995] +[group_25996] +[group_25997] +[group_25998] +[group_25999] +[group_26000] +[group_26001] +[group_26002] +[group_26003] +[group_26004] +[group_26005] +[group_26006] +[group_26007] +[group_26008] +[group_26009] +[group_26010] +[group_26011] +[group_26012] +[group_26013] +[group_26014] +[group_26015] +[group_26016] +[group_26017] +[group_26018] +[group_26019] +[group_26020] +[group_26021] +[group_26022] +[group_26023] +[group_26024] +[group_26025] +[group_26026] +[group_26027] +[group_26028] +[group_26029] +[group_26030] +[group_26031] +[group_26032] +[group_26033] +[group_26034] +[group_26035] +[group_26036] +[group_26037] +[group_26038] +[group_26039] +[group_26040] +[group_26041] +[group_26042] +[group_26043] +[group_26044] +[group_26045] +[group_26046] +[group_26047] +[group_26048] +[group_26049] +[group_26050] +[group_26051] +[group_26052] +[group_26053] +[group_26054] +[group_26055] +[group_26056] +[group_26057] +[group_26058] +[group_26059] +[group_26060] +[group_26061] +[group_26062] +[group_26063] +[group_26064] +[group_26065] +[group_26066] +[group_26067] +[group_26068] +[group_26069] +[group_26070] +[group_26071] +[group_26072] +[group_26073] +[group_26074] +[group_26075] +[group_26076] +[group_26077] +[group_26078] +[group_26079] +[group_26080] +[group_26081] +[group_26082] +[group_26083] +[group_26084] +[group_26085] +[group_26086] +[group_26087] +[group_26088] +[group_26089] +[group_26090] +[group_26091] +[group_26092] +[group_26093] +[group_26094] +[group_26095] +[group_26096] +[group_26097] +[group_26098] +[group_26099] +[group_26100] +[group_26101] +[group_26102] +[group_26103] +[group_26104] +[group_26105] +[group_26106] +[group_26107] +[group_26108] +[group_26109] +[group_26110] +[group_26111] +[group_26112] +[group_26113] +[group_26114] +[group_26115] +[group_26116] +[group_26117] +[group_26118] +[group_26119] +[group_26120] +[group_26121] +[group_26122] +[group_26123] +[group_26124] +[group_26125] +[group_26126] +[group_26127] +[group_26128] +[group_26129] +[group_26130] +[group_26131] +[group_26132] +[group_26133] +[group_26134] +[group_26135] +[group_26136] +[group_26137] +[group_26138] +[group_26139] +[group_26140] +[group_26141] +[group_26142] +[group_26143] +[group_26144] +[group_26145] +[group_26146] +[group_26147] +[group_26148] +[group_26149] +[group_26150] +[group_26151] +[group_26152] +[group_26153] +[group_26154] +[group_26155] +[group_26156] +[group_26157] +[group_26158] +[group_26159] +[group_26160] +[group_26161] +[group_26162] +[group_26163] +[group_26164] +[group_26165] +[group_26166] +[group_26167] +[group_26168] +[group_26169] +[group_26170] +[group_26171] +[group_26172] +[group_26173] +[group_26174] +[group_26175] +[group_26176] +[group_26177] +[group_26178] +[group_26179] +[group_26180] +[group_26181] +[group_26182] +[group_26183] +[group_26184] +[group_26185] +[group_26186] +[group_26187] +[group_26188] +[group_26189] +[group_26190] +[group_26191] +[group_26192] +[group_26193] +[group_26194] +[group_26195] +[group_26196] +[group_26197] +[group_26198] +[group_26199] +[group_26200] +[group_26201] +[group_26202] +[group_26203] +[group_26204] +[group_26205] +[group_26206] +[group_26207] +[group_26208] +[group_26209] +[group_26210] +[group_26211] +[group_26212] +[group_26213] +[group_26214] +[group_26215] +[group_26216] +[group_26217] +[group_26218] +[group_26219] +[group_26220] +[group_26221] +[group_26222] +[group_26223] +[group_26224] +[group_26225] +[group_26226] +[group_26227] +[group_26228] +[group_26229] +[group_26230] +[group_26231] +[group_26232] +[group_26233] +[group_26234] +[group_26235] +[group_26236] +[group_26237] +[group_26238] +[group_26239] +[group_26240] +[group_26241] +[group_26242] +[group_26243] +[group_26244] +[group_26245] +[group_26246] +[group_26247] +[group_26248] +[group_26249] +[group_26250] +[group_26251] +[group_26252] +[group_26253] +[group_26254] +[group_26255] +[group_26256] +[group_26257] +[group_26258] +[group_26259] +[group_26260] +[group_26261] +[group_26262] +[group_26263] +[group_26264] +[group_26265] +[group_26266] +[group_26267] +[group_26268] +[group_26269] +[group_26270] +[group_26271] +[group_26272] +[group_26273] +[group_26274] +[group_26275] +[group_26276] +[group_26277] +[group_26278] +[group_26279] +[group_26280] +[group_26281] +[group_26282] +[group_26283] +[group_26284] +[group_26285] +[group_26286] +[group_26287] +[group_26288] +[group_26289] +[group_26290] +[group_26291] +[group_26292] +[group_26293] +[group_26294] +[group_26295] +[group_26296] +[group_26297] +[group_26298] +[group_26299] +[group_26300] +[group_26301] +[group_26302] +[group_26303] +[group_26304] +[group_26305] +[group_26306] +[group_26307] +[group_26308] +[group_26309] +[group_26310] +[group_26311] +[group_26312] +[group_26313] +[group_26314] +[group_26315] +[group_26316] +[group_26317] +[group_26318] +[group_26319] +[group_26320] +[group_26321] +[group_26322] +[group_26323] +[group_26324] +[group_26325] +[group_26326] +[group_26327] +[group_26328] +[group_26329] +[group_26330] +[group_26331] +[group_26332] +[group_26333] +[group_26334] +[group_26335] +[group_26336] +[group_26337] +[group_26338] +[group_26339] +[group_26340] +[group_26341] +[group_26342] +[group_26343] +[group_26344] +[group_26345] +[group_26346] +[group_26347] +[group_26348] +[group_26349] +[group_26350] +[group_26351] +[group_26352] +[group_26353] +[group_26354] +[group_26355] +[group_26356] +[group_26357] +[group_26358] +[group_26359] +[group_26360] +[group_26361] +[group_26362] +[group_26363] +[group_26364] +[group_26365] +[group_26366] +[group_26367] +[group_26368] +[group_26369] +[group_26370] +[group_26371] +[group_26372] +[group_26373] +[group_26374] +[group_26375] +[group_26376] +[group_26377] +[group_26378] +[group_26379] +[group_26380] +[group_26381] +[group_26382] +[group_26383] +[group_26384] +[group_26385] +[group_26386] +[group_26387] +[group_26388] +[group_26389] +[group_26390] +[group_26391] +[group_26392] +[group_26393] +[group_26394] +[group_26395] +[group_26396] +[group_26397] +[group_26398] +[group_26399] +[group_26400] +[group_26401] +[group_26402] +[group_26403] +[group_26404] +[group_26405] +[group_26406] +[group_26407] +[group_26408] +[group_26409] +[group_26410] +[group_26411] +[group_26412] +[group_26413] +[group_26414] +[group_26415] +[group_26416] +[group_26417] +[group_26418] +[group_26419] +[group_26420] +[group_26421] +[group_26422] +[group_26423] +[group_26424] +[group_26425] +[group_26426] +[group_26427] +[group_26428] +[group_26429] +[group_26430] +[group_26431] +[group_26432] +[group_26433] +[group_26434] +[group_26435] +[group_26436] +[group_26437] +[group_26438] +[group_26439] +[group_26440] +[group_26441] +[group_26442] +[group_26443] +[group_26444] +[group_26445] +[group_26446] +[group_26447] +[group_26448] +[group_26449] +[group_26450] +[group_26451] +[group_26452] +[group_26453] +[group_26454] +[group_26455] +[group_26456] +[group_26457] +[group_26458] +[group_26459] +[group_26460] +[group_26461] +[group_26462] +[group_26463] +[group_26464] +[group_26465] +[group_26466] +[group_26467] +[group_26468] +[group_26469] +[group_26470] +[group_26471] +[group_26472] +[group_26473] +[group_26474] +[group_26475] +[group_26476] +[group_26477] +[group_26478] +[group_26479] +[group_26480] +[group_26481] +[group_26482] +[group_26483] +[group_26484] +[group_26485] +[group_26486] +[group_26487] +[group_26488] +[group_26489] +[group_26490] +[group_26491] +[group_26492] +[group_26493] +[group_26494] +[group_26495] +[group_26496] +[group_26497] +[group_26498] +[group_26499] +[group_26500] +[group_26501] +[group_26502] +[group_26503] +[group_26504] +[group_26505] +[group_26506] +[group_26507] +[group_26508] +[group_26509] +[group_26510] +[group_26511] +[group_26512] +[group_26513] +[group_26514] +[group_26515] +[group_26516] +[group_26517] +[group_26518] +[group_26519] +[group_26520] +[group_26521] +[group_26522] +[group_26523] +[group_26524] +[group_26525] +[group_26526] +[group_26527] +[group_26528] +[group_26529] +[group_26530] +[group_26531] +[group_26532] +[group_26533] +[group_26534] +[group_26535] +[group_26536] +[group_26537] +[group_26538] +[group_26539] +[group_26540] +[group_26541] +[group_26542] +[group_26543] +[group_26544] +[group_26545] +[group_26546] +[group_26547] +[group_26548] +[group_26549] +[group_26550] +[group_26551] +[group_26552] +[group_26553] +[group_26554] +[group_26555] +[group_26556] +[group_26557] +[group_26558] +[group_26559] +[group_26560] +[group_26561] +[group_26562] +[group_26563] +[group_26564] +[group_26565] +[group_26566] +[group_26567] +[group_26568] +[group_26569] +[group_26570] +[group_26571] +[group_26572] +[group_26573] +[group_26574] +[group_26575] +[group_26576] +[group_26577] +[group_26578] +[group_26579] +[group_26580] +[group_26581] +[group_26582] +[group_26583] +[group_26584] +[group_26585] +[group_26586] +[group_26587] +[group_26588] +[group_26589] +[group_26590] +[group_26591] +[group_26592] +[group_26593] +[group_26594] +[group_26595] +[group_26596] +[group_26597] +[group_26598] +[group_26599] +[group_26600] +[group_26601] +[group_26602] +[group_26603] +[group_26604] +[group_26605] +[group_26606] +[group_26607] +[group_26608] +[group_26609] +[group_26610] +[group_26611] +[group_26612] +[group_26613] +[group_26614] +[group_26615] +[group_26616] +[group_26617] +[group_26618] +[group_26619] +[group_26620] +[group_26621] +[group_26622] +[group_26623] +[group_26624] +[group_26625] +[group_26626] +[group_26627] +[group_26628] +[group_26629] +[group_26630] +[group_26631] +[group_26632] +[group_26633] +[group_26634] +[group_26635] +[group_26636] +[group_26637] +[group_26638] +[group_26639] +[group_26640] +[group_26641] +[group_26642] +[group_26643] +[group_26644] +[group_26645] +[group_26646] +[group_26647] +[group_26648] +[group_26649] +[group_26650] +[group_26651] +[group_26652] +[group_26653] +[group_26654] +[group_26655] +[group_26656] +[group_26657] +[group_26658] +[group_26659] +[group_26660] +[group_26661] +[group_26662] +[group_26663] +[group_26664] +[group_26665] +[group_26666] +[group_26667] +[group_26668] +[group_26669] +[group_26670] +[group_26671] +[group_26672] +[group_26673] +[group_26674] +[group_26675] +[group_26676] +[group_26677] +[group_26678] +[group_26679] +[group_26680] +[group_26681] +[group_26682] +[group_26683] +[group_26684] +[group_26685] +[group_26686] +[group_26687] +[group_26688] +[group_26689] +[group_26690] +[group_26691] +[group_26692] +[group_26693] +[group_26694] +[group_26695] +[group_26696] +[group_26697] +[group_26698] +[group_26699] +[group_26700] +[group_26701] +[group_26702] +[group_26703] +[group_26704] +[group_26705] +[group_26706] +[group_26707] +[group_26708] +[group_26709] +[group_26710] +[group_26711] +[group_26712] +[group_26713] +[group_26714] +[group_26715] +[group_26716] +[group_26717] +[group_26718] +[group_26719] +[group_26720] +[group_26721] +[group_26722] +[group_26723] +[group_26724] +[group_26725] +[group_26726] +[group_26727] +[group_26728] +[group_26729] +[group_26730] +[group_26731] +[group_26732] +[group_26733] +[group_26734] +[group_26735] +[group_26736] +[group_26737] +[group_26738] +[group_26739] +[group_26740] +[group_26741] +[group_26742] +[group_26743] +[group_26744] +[group_26745] +[group_26746] +[group_26747] +[group_26748] +[group_26749] +[group_26750] +[group_26751] +[group_26752] +[group_26753] +[group_26754] +[group_26755] +[group_26756] +[group_26757] +[group_26758] +[group_26759] +[group_26760] +[group_26761] +[group_26762] +[group_26763] +[group_26764] +[group_26765] +[group_26766] +[group_26767] +[group_26768] +[group_26769] +[group_26770] +[group_26771] +[group_26772] +[group_26773] +[group_26774] +[group_26775] +[group_26776] +[group_26777] +[group_26778] +[group_26779] +[group_26780] +[group_26781] +[group_26782] +[group_26783] +[group_26784] +[group_26785] +[group_26786] +[group_26787] +[group_26788] +[group_26789] +[group_26790] +[group_26791] +[group_26792] +[group_26793] +[group_26794] +[group_26795] +[group_26796] +[group_26797] +[group_26798] +[group_26799] +[group_26800] +[group_26801] +[group_26802] +[group_26803] +[group_26804] +[group_26805] +[group_26806] +[group_26807] +[group_26808] +[group_26809] +[group_26810] +[group_26811] +[group_26812] +[group_26813] +[group_26814] +[group_26815] +[group_26816] +[group_26817] +[group_26818] +[group_26819] +[group_26820] +[group_26821] +[group_26822] +[group_26823] +[group_26824] +[group_26825] +[group_26826] +[group_26827] +[group_26828] +[group_26829] +[group_26830] +[group_26831] +[group_26832] +[group_26833] +[group_26834] +[group_26835] +[group_26836] +[group_26837] +[group_26838] +[group_26839] +[group_26840] +[group_26841] +[group_26842] +[group_26843] +[group_26844] +[group_26845] +[group_26846] +[group_26847] +[group_26848] +[group_26849] +[group_26850] +[group_26851] +[group_26852] +[group_26853] +[group_26854] +[group_26855] +[group_26856] +[group_26857] +[group_26858] +[group_26859] +[group_26860] +[group_26861] +[group_26862] +[group_26863] +[group_26864] +[group_26865] +[group_26866] +[group_26867] +[group_26868] +[group_26869] +[group_26870] +[group_26871] +[group_26872] +[group_26873] +[group_26874] +[group_26875] +[group_26876] +[group_26877] +[group_26878] +[group_26879] +[group_26880] +[group_26881] +[group_26882] +[group_26883] +[group_26884] +[group_26885] +[group_26886] +[group_26887] +[group_26888] +[group_26889] +[group_26890] +[group_26891] +[group_26892] +[group_26893] +[group_26894] +[group_26895] +[group_26896] +[group_26897] +[group_26898] +[group_26899] +[group_26900] +[group_26901] +[group_26902] +[group_26903] +[group_26904] +[group_26905] +[group_26906] +[group_26907] +[group_26908] +[group_26909] +[group_26910] +[group_26911] +[group_26912] +[group_26913] +[group_26914] +[group_26915] +[group_26916] +[group_26917] +[group_26918] +[group_26919] +[group_26920] +[group_26921] +[group_26922] +[group_26923] +[group_26924] +[group_26925] +[group_26926] +[group_26927] +[group_26928] +[group_26929] +[group_26930] +[group_26931] +[group_26932] +[group_26933] +[group_26934] +[group_26935] +[group_26936] +[group_26937] +[group_26938] +[group_26939] +[group_26940] +[group_26941] +[group_26942] +[group_26943] +[group_26944] +[group_26945] +[group_26946] +[group_26947] +[group_26948] +[group_26949] +[group_26950] +[group_26951] +[group_26952] +[group_26953] +[group_26954] +[group_26955] +[group_26956] +[group_26957] +[group_26958] +[group_26959] +[group_26960] +[group_26961] +[group_26962] +[group_26963] +[group_26964] +[group_26965] +[group_26966] +[group_26967] +[group_26968] +[group_26969] +[group_26970] +[group_26971] +[group_26972] +[group_26973] +[group_26974] +[group_26975] +[group_26976] +[group_26977] +[group_26978] +[group_26979] +[group_26980] +[group_26981] +[group_26982] +[group_26983] +[group_26984] +[group_26985] +[group_26986] +[group_26987] +[group_26988] +[group_26989] +[group_26990] +[group_26991] +[group_26992] +[group_26993] +[group_26994] +[group_26995] +[group_26996] +[group_26997] +[group_26998] +[group_26999] +[group_27000] +[group_27001] +[group_27002] +[group_27003] +[group_27004] +[group_27005] +[group_27006] +[group_27007] +[group_27008] +[group_27009] +[group_27010] +[group_27011] +[group_27012] +[group_27013] +[group_27014] +[group_27015] +[group_27016] +[group_27017] +[group_27018] +[group_27019] +[group_27020] +[group_27021] +[group_27022] +[group_27023] +[group_27024] +[group_27025] +[group_27026] +[group_27027] +[group_27028] +[group_27029] +[group_27030] +[group_27031] +[group_27032] +[group_27033] +[group_27034] +[group_27035] +[group_27036] +[group_27037] +[group_27038] +[group_27039] +[group_27040] +[group_27041] +[group_27042] +[group_27043] +[group_27044] +[group_27045] +[group_27046] +[group_27047] +[group_27048] +[group_27049] +[group_27050] +[group_27051] +[group_27052] +[group_27053] +[group_27054] +[group_27055] +[group_27056] +[group_27057] +[group_27058] +[group_27059] +[group_27060] +[group_27061] +[group_27062] +[group_27063] +[group_27064] +[group_27065] +[group_27066] +[group_27067] +[group_27068] +[group_27069] +[group_27070] +[group_27071] +[group_27072] +[group_27073] +[group_27074] +[group_27075] +[group_27076] +[group_27077] +[group_27078] +[group_27079] +[group_27080] +[group_27081] +[group_27082] +[group_27083] +[group_27084] +[group_27085] +[group_27086] +[group_27087] +[group_27088] +[group_27089] +[group_27090] +[group_27091] +[group_27092] +[group_27093] +[group_27094] +[group_27095] +[group_27096] +[group_27097] +[group_27098] +[group_27099] +[group_27100] +[group_27101] +[group_27102] +[group_27103] +[group_27104] +[group_27105] +[group_27106] +[group_27107] +[group_27108] +[group_27109] +[group_27110] +[group_27111] +[group_27112] +[group_27113] +[group_27114] +[group_27115] +[group_27116] +[group_27117] +[group_27118] +[group_27119] +[group_27120] +[group_27121] +[group_27122] +[group_27123] +[group_27124] +[group_27125] +[group_27126] +[group_27127] +[group_27128] +[group_27129] +[group_27130] +[group_27131] +[group_27132] +[group_27133] +[group_27134] +[group_27135] +[group_27136] +[group_27137] +[group_27138] +[group_27139] +[group_27140] +[group_27141] +[group_27142] +[group_27143] +[group_27144] +[group_27145] +[group_27146] +[group_27147] +[group_27148] +[group_27149] +[group_27150] +[group_27151] +[group_27152] +[group_27153] +[group_27154] +[group_27155] +[group_27156] +[group_27157] +[group_27158] +[group_27159] +[group_27160] +[group_27161] +[group_27162] +[group_27163] +[group_27164] +[group_27165] +[group_27166] +[group_27167] +[group_27168] +[group_27169] +[group_27170] +[group_27171] +[group_27172] +[group_27173] +[group_27174] +[group_27175] +[group_27176] +[group_27177] +[group_27178] +[group_27179] +[group_27180] +[group_27181] +[group_27182] +[group_27183] +[group_27184] +[group_27185] +[group_27186] +[group_27187] +[group_27188] +[group_27189] +[group_27190] +[group_27191] +[group_27192] +[group_27193] +[group_27194] +[group_27195] +[group_27196] +[group_27197] +[group_27198] +[group_27199] +[group_27200] +[group_27201] +[group_27202] +[group_27203] +[group_27204] +[group_27205] +[group_27206] +[group_27207] +[group_27208] +[group_27209] +[group_27210] +[group_27211] +[group_27212] +[group_27213] +[group_27214] +[group_27215] +[group_27216] +[group_27217] +[group_27218] +[group_27219] +[group_27220] +[group_27221] +[group_27222] +[group_27223] +[group_27224] +[group_27225] +[group_27226] +[group_27227] +[group_27228] +[group_27229] +[group_27230] +[group_27231] +[group_27232] +[group_27233] +[group_27234] +[group_27235] +[group_27236] +[group_27237] +[group_27238] +[group_27239] +[group_27240] +[group_27241] +[group_27242] +[group_27243] +[group_27244] +[group_27245] +[group_27246] +[group_27247] +[group_27248] +[group_27249] +[group_27250] +[group_27251] +[group_27252] +[group_27253] +[group_27254] +[group_27255] +[group_27256] +[group_27257] +[group_27258] +[group_27259] +[group_27260] +[group_27261] +[group_27262] +[group_27263] +[group_27264] +[group_27265] +[group_27266] +[group_27267] +[group_27268] +[group_27269] +[group_27270] +[group_27271] +[group_27272] +[group_27273] +[group_27274] +[group_27275] +[group_27276] +[group_27277] +[group_27278] +[group_27279] +[group_27280] +[group_27281] +[group_27282] +[group_27283] +[group_27284] +[group_27285] +[group_27286] +[group_27287] +[group_27288] +[group_27289] +[group_27290] +[group_27291] +[group_27292] +[group_27293] +[group_27294] +[group_27295] +[group_27296] +[group_27297] +[group_27298] +[group_27299] +[group_27300] +[group_27301] +[group_27302] +[group_27303] +[group_27304] +[group_27305] +[group_27306] +[group_27307] +[group_27308] +[group_27309] +[group_27310] +[group_27311] +[group_27312] +[group_27313] +[group_27314] +[group_27315] +[group_27316] +[group_27317] +[group_27318] +[group_27319] +[group_27320] +[group_27321] +[group_27322] +[group_27323] +[group_27324] +[group_27325] +[group_27326] +[group_27327] +[group_27328] +[group_27329] +[group_27330] +[group_27331] +[group_27332] +[group_27333] +[group_27334] +[group_27335] +[group_27336] +[group_27337] +[group_27338] +[group_27339] +[group_27340] +[group_27341] +[group_27342] +[group_27343] +[group_27344] +[group_27345] +[group_27346] +[group_27347] +[group_27348] +[group_27349] +[group_27350] +[group_27351] +[group_27352] +[group_27353] +[group_27354] +[group_27355] +[group_27356] +[group_27357] +[group_27358] +[group_27359] +[group_27360] +[group_27361] +[group_27362] +[group_27363] +[group_27364] +[group_27365] +[group_27366] +[group_27367] +[group_27368] +[group_27369] +[group_27370] +[group_27371] +[group_27372] +[group_27373] +[group_27374] +[group_27375] +[group_27376] +[group_27377] +[group_27378] +[group_27379] +[group_27380] +[group_27381] +[group_27382] +[group_27383] +[group_27384] +[group_27385] +[group_27386] +[group_27387] +[group_27388] +[group_27389] +[group_27390] +[group_27391] +[group_27392] +[group_27393] +[group_27394] +[group_27395] +[group_27396] +[group_27397] +[group_27398] +[group_27399] +[group_27400] +[group_27401] +[group_27402] +[group_27403] +[group_27404] +[group_27405] +[group_27406] +[group_27407] +[group_27408] +[group_27409] +[group_27410] +[group_27411] +[group_27412] +[group_27413] +[group_27414] +[group_27415] +[group_27416] +[group_27417] +[group_27418] +[group_27419] +[group_27420] +[group_27421] +[group_27422] +[group_27423] +[group_27424] +[group_27425] +[group_27426] +[group_27427] +[group_27428] +[group_27429] +[group_27430] +[group_27431] +[group_27432] +[group_27433] +[group_27434] +[group_27435] +[group_27436] +[group_27437] +[group_27438] +[group_27439] +[group_27440] +[group_27441] +[group_27442] +[group_27443] +[group_27444] +[group_27445] +[group_27446] +[group_27447] +[group_27448] +[group_27449] +[group_27450] +[group_27451] +[group_27452] +[group_27453] +[group_27454] +[group_27455] +[group_27456] +[group_27457] +[group_27458] +[group_27459] +[group_27460] +[group_27461] +[group_27462] +[group_27463] +[group_27464] +[group_27465] +[group_27466] +[group_27467] +[group_27468] +[group_27469] +[group_27470] +[group_27471] +[group_27472] +[group_27473] +[group_27474] +[group_27475] +[group_27476] +[group_27477] +[group_27478] +[group_27479] +[group_27480] +[group_27481] +[group_27482] +[group_27483] +[group_27484] +[group_27485] +[group_27486] +[group_27487] +[group_27488] +[group_27489] +[group_27490] +[group_27491] +[group_27492] +[group_27493] +[group_27494] +[group_27495] +[group_27496] +[group_27497] +[group_27498] +[group_27499] +[group_27500] +[group_27501] +[group_27502] +[group_27503] +[group_27504] +[group_27505] +[group_27506] +[group_27507] +[group_27508] +[group_27509] +[group_27510] +[group_27511] +[group_27512] +[group_27513] +[group_27514] +[group_27515] +[group_27516] +[group_27517] +[group_27518] +[group_27519] +[group_27520] +[group_27521] +[group_27522] +[group_27523] +[group_27524] +[group_27525] +[group_27526] +[group_27527] +[group_27528] +[group_27529] +[group_27530] +[group_27531] +[group_27532] +[group_27533] +[group_27534] +[group_27535] +[group_27536] +[group_27537] +[group_27538] +[group_27539] +[group_27540] +[group_27541] +[group_27542] +[group_27543] +[group_27544] +[group_27545] +[group_27546] +[group_27547] +[group_27548] +[group_27549] +[group_27550] +[group_27551] +[group_27552] +[group_27553] +[group_27554] +[group_27555] +[group_27556] +[group_27557] +[group_27558] +[group_27559] +[group_27560] +[group_27561] +[group_27562] +[group_27563] +[group_27564] +[group_27565] +[group_27566] +[group_27567] +[group_27568] +[group_27569] +[group_27570] +[group_27571] +[group_27572] +[group_27573] +[group_27574] +[group_27575] +[group_27576] +[group_27577] +[group_27578] +[group_27579] +[group_27580] +[group_27581] +[group_27582] +[group_27583] +[group_27584] +[group_27585] +[group_27586] +[group_27587] +[group_27588] +[group_27589] +[group_27590] +[group_27591] +[group_27592] +[group_27593] +[group_27594] +[group_27595] +[group_27596] +[group_27597] +[group_27598] +[group_27599] +[group_27600] +[group_27601] +[group_27602] +[group_27603] +[group_27604] +[group_27605] +[group_27606] +[group_27607] +[group_27608] +[group_27609] +[group_27610] +[group_27611] +[group_27612] +[group_27613] +[group_27614] +[group_27615] +[group_27616] +[group_27617] +[group_27618] +[group_27619] +[group_27620] +[group_27621] +[group_27622] +[group_27623] +[group_27624] +[group_27625] +[group_27626] +[group_27627] +[group_27628] +[group_27629] +[group_27630] +[group_27631] +[group_27632] +[group_27633] +[group_27634] +[group_27635] +[group_27636] +[group_27637] +[group_27638] +[group_27639] +[group_27640] +[group_27641] +[group_27642] +[group_27643] +[group_27644] +[group_27645] +[group_27646] +[group_27647] +[group_27648] +[group_27649] +[group_27650] +[group_27651] +[group_27652] +[group_27653] +[group_27654] +[group_27655] +[group_27656] +[group_27657] +[group_27658] +[group_27659] +[group_27660] +[group_27661] +[group_27662] +[group_27663] +[group_27664] +[group_27665] +[group_27666] +[group_27667] +[group_27668] +[group_27669] +[group_27670] +[group_27671] +[group_27672] +[group_27673] +[group_27674] +[group_27675] +[group_27676] +[group_27677] +[group_27678] +[group_27679] +[group_27680] +[group_27681] +[group_27682] +[group_27683] +[group_27684] +[group_27685] +[group_27686] +[group_27687] +[group_27688] +[group_27689] +[group_27690] +[group_27691] +[group_27692] +[group_27693] +[group_27694] +[group_27695] +[group_27696] +[group_27697] +[group_27698] +[group_27699] +[group_27700] +[group_27701] +[group_27702] +[group_27703] +[group_27704] +[group_27705] +[group_27706] +[group_27707] +[group_27708] +[group_27709] +[group_27710] +[group_27711] +[group_27712] +[group_27713] +[group_27714] +[group_27715] +[group_27716] +[group_27717] +[group_27718] +[group_27719] +[group_27720] +[group_27721] +[group_27722] +[group_27723] +[group_27724] +[group_27725] +[group_27726] +[group_27727] +[group_27728] +[group_27729] +[group_27730] +[group_27731] +[group_27732] +[group_27733] +[group_27734] +[group_27735] +[group_27736] +[group_27737] +[group_27738] +[group_27739] +[group_27740] +[group_27741] +[group_27742] +[group_27743] +[group_27744] +[group_27745] +[group_27746] +[group_27747] +[group_27748] +[group_27749] +[group_27750] +[group_27751] +[group_27752] +[group_27753] +[group_27754] +[group_27755] +[group_27756] +[group_27757] +[group_27758] +[group_27759] +[group_27760] +[group_27761] +[group_27762] +[group_27763] +[group_27764] +[group_27765] +[group_27766] +[group_27767] +[group_27768] +[group_27769] +[group_27770] +[group_27771] +[group_27772] +[group_27773] +[group_27774] +[group_27775] +[group_27776] +[group_27777] +[group_27778] +[group_27779] +[group_27780] +[group_27781] +[group_27782] +[group_27783] +[group_27784] +[group_27785] +[group_27786] +[group_27787] +[group_27788] +[group_27789] +[group_27790] +[group_27791] +[group_27792] +[group_27793] +[group_27794] +[group_27795] +[group_27796] +[group_27797] +[group_27798] +[group_27799] +[group_27800] +[group_27801] +[group_27802] +[group_27803] +[group_27804] +[group_27805] +[group_27806] +[group_27807] +[group_27808] +[group_27809] +[group_27810] +[group_27811] +[group_27812] +[group_27813] +[group_27814] +[group_27815] +[group_27816] +[group_27817] +[group_27818] +[group_27819] +[group_27820] +[group_27821] +[group_27822] +[group_27823] +[group_27824] +[group_27825] +[group_27826] +[group_27827] +[group_27828] +[group_27829] +[group_27830] +[group_27831] +[group_27832] +[group_27833] +[group_27834] +[group_27835] +[group_27836] +[group_27837] +[group_27838] +[group_27839] +[group_27840] +[group_27841] +[group_27842] +[group_27843] +[group_27844] +[group_27845] +[group_27846] +[group_27847] +[group_27848] +[group_27849] +[group_27850] +[group_27851] +[group_27852] +[group_27853] +[group_27854] +[group_27855] +[group_27856] +[group_27857] +[group_27858] +[group_27859] +[group_27860] +[group_27861] +[group_27862] +[group_27863] +[group_27864] +[group_27865] +[group_27866] +[group_27867] +[group_27868] +[group_27869] +[group_27870] +[group_27871] +[group_27872] +[group_27873] +[group_27874] +[group_27875] +[group_27876] +[group_27877] +[group_27878] +[group_27879] +[group_27880] +[group_27881] +[group_27882] +[group_27883] +[group_27884] +[group_27885] +[group_27886] +[group_27887] +[group_27888] +[group_27889] +[group_27890] +[group_27891] +[group_27892] +[group_27893] +[group_27894] +[group_27895] +[group_27896] +[group_27897] +[group_27898] +[group_27899] +[group_27900] +[group_27901] +[group_27902] +[group_27903] +[group_27904] +[group_27905] +[group_27906] +[group_27907] +[group_27908] +[group_27909] +[group_27910] +[group_27911] +[group_27912] +[group_27913] +[group_27914] +[group_27915] +[group_27916] +[group_27917] +[group_27918] +[group_27919] +[group_27920] +[group_27921] +[group_27922] +[group_27923] +[group_27924] +[group_27925] +[group_27926] +[group_27927] +[group_27928] +[group_27929] +[group_27930] +[group_27931] +[group_27932] +[group_27933] +[group_27934] +[group_27935] +[group_27936] +[group_27937] +[group_27938] +[group_27939] +[group_27940] +[group_27941] +[group_27942] +[group_27943] +[group_27944] +[group_27945] +[group_27946] +[group_27947] +[group_27948] +[group_27949] +[group_27950] +[group_27951] +[group_27952] +[group_27953] +[group_27954] +[group_27955] +[group_27956] +[group_27957] +[group_27958] +[group_27959] +[group_27960] +[group_27961] +[group_27962] +[group_27963] +[group_27964] +[group_27965] +[group_27966] +[group_27967] +[group_27968] +[group_27969] +[group_27970] +[group_27971] +[group_27972] +[group_27973] +[group_27974] +[group_27975] +[group_27976] +[group_27977] +[group_27978] +[group_27979] +[group_27980] +[group_27981] +[group_27982] +[group_27983] +[group_27984] +[group_27985] +[group_27986] +[group_27987] +[group_27988] +[group_27989] +[group_27990] +[group_27991] +[group_27992] +[group_27993] +[group_27994] +[group_27995] +[group_27996] +[group_27997] +[group_27998] +[group_27999] +[group_28000] +[group_28001] +[group_28002] +[group_28003] +[group_28004] +[group_28005] +[group_28006] +[group_28007] +[group_28008] +[group_28009] +[group_28010] +[group_28011] +[group_28012] +[group_28013] +[group_28014] +[group_28015] +[group_28016] +[group_28017] +[group_28018] +[group_28019] +[group_28020] +[group_28021] +[group_28022] +[group_28023] +[group_28024] +[group_28025] +[group_28026] +[group_28027] +[group_28028] +[group_28029] +[group_28030] +[group_28031] +[group_28032] +[group_28033] +[group_28034] +[group_28035] +[group_28036] +[group_28037] +[group_28038] +[group_28039] +[group_28040] +[group_28041] +[group_28042] +[group_28043] +[group_28044] +[group_28045] +[group_28046] +[group_28047] +[group_28048] +[group_28049] +[group_28050] +[group_28051] +[group_28052] +[group_28053] +[group_28054] +[group_28055] +[group_28056] +[group_28057] +[group_28058] +[group_28059] +[group_28060] +[group_28061] +[group_28062] +[group_28063] +[group_28064] +[group_28065] +[group_28066] +[group_28067] +[group_28068] +[group_28069] +[group_28070] +[group_28071] +[group_28072] +[group_28073] +[group_28074] +[group_28075] +[group_28076] +[group_28077] +[group_28078] +[group_28079] +[group_28080] +[group_28081] +[group_28082] +[group_28083] +[group_28084] +[group_28085] +[group_28086] +[group_28087] +[group_28088] +[group_28089] +[group_28090] +[group_28091] +[group_28092] +[group_28093] +[group_28094] +[group_28095] +[group_28096] +[group_28097] +[group_28098] +[group_28099] +[group_28100] +[group_28101] +[group_28102] +[group_28103] +[group_28104] +[group_28105] +[group_28106] +[group_28107] +[group_28108] +[group_28109] +[group_28110] +[group_28111] +[group_28112] +[group_28113] +[group_28114] +[group_28115] +[group_28116] +[group_28117] +[group_28118] +[group_28119] +[group_28120] +[group_28121] +[group_28122] +[group_28123] +[group_28124] +[group_28125] +[group_28126] +[group_28127] +[group_28128] +[group_28129] +[group_28130] +[group_28131] +[group_28132] +[group_28133] +[group_28134] +[group_28135] +[group_28136] +[group_28137] +[group_28138] +[group_28139] +[group_28140] +[group_28141] +[group_28142] +[group_28143] +[group_28144] +[group_28145] +[group_28146] +[group_28147] +[group_28148] +[group_28149] +[group_28150] +[group_28151] +[group_28152] +[group_28153] +[group_28154] +[group_28155] +[group_28156] +[group_28157] +[group_28158] +[group_28159] +[group_28160] +[group_28161] +[group_28162] +[group_28163] +[group_28164] +[group_28165] +[group_28166] +[group_28167] +[group_28168] +[group_28169] +[group_28170] +[group_28171] +[group_28172] +[group_28173] +[group_28174] +[group_28175] +[group_28176] +[group_28177] +[group_28178] +[group_28179] +[group_28180] +[group_28181] +[group_28182] +[group_28183] +[group_28184] +[group_28185] +[group_28186] +[group_28187] +[group_28188] +[group_28189] +[group_28190] +[group_28191] +[group_28192] +[group_28193] +[group_28194] +[group_28195] +[group_28196] +[group_28197] +[group_28198] +[group_28199] +[group_28200] +[group_28201] +[group_28202] +[group_28203] +[group_28204] +[group_28205] +[group_28206] +[group_28207] +[group_28208] +[group_28209] +[group_28210] +[group_28211] +[group_28212] +[group_28213] +[group_28214] +[group_28215] +[group_28216] +[group_28217] +[group_28218] +[group_28219] +[group_28220] +[group_28221] +[group_28222] +[group_28223] +[group_28224] +[group_28225] +[group_28226] +[group_28227] +[group_28228] +[group_28229] +[group_28230] +[group_28231] +[group_28232] +[group_28233] +[group_28234] +[group_28235] +[group_28236] +[group_28237] +[group_28238] +[group_28239] +[group_28240] +[group_28241] +[group_28242] +[group_28243] +[group_28244] +[group_28245] +[group_28246] +[group_28247] +[group_28248] +[group_28249] +[group_28250] +[group_28251] +[group_28252] +[group_28253] +[group_28254] +[group_28255] +[group_28256] +[group_28257] +[group_28258] +[group_28259] +[group_28260] +[group_28261] +[group_28262] +[group_28263] +[group_28264] +[group_28265] +[group_28266] +[group_28267] +[group_28268] +[group_28269] +[group_28270] +[group_28271] +[group_28272] +[group_28273] +[group_28274] +[group_28275] +[group_28276] +[group_28277] +[group_28278] +[group_28279] +[group_28280] +[group_28281] +[group_28282] +[group_28283] +[group_28284] +[group_28285] +[group_28286] +[group_28287] +[group_28288] +[group_28289] +[group_28290] +[group_28291] +[group_28292] +[group_28293] +[group_28294] +[group_28295] +[group_28296] +[group_28297] +[group_28298] +[group_28299] +[group_28300] +[group_28301] +[group_28302] +[group_28303] +[group_28304] +[group_28305] +[group_28306] +[group_28307] +[group_28308] +[group_28309] +[group_28310] +[group_28311] +[group_28312] +[group_28313] +[group_28314] +[group_28315] +[group_28316] +[group_28317] +[group_28318] +[group_28319] +[group_28320] +[group_28321] +[group_28322] +[group_28323] +[group_28324] +[group_28325] +[group_28326] +[group_28327] +[group_28328] +[group_28329] +[group_28330] +[group_28331] +[group_28332] +[group_28333] +[group_28334] +[group_28335] +[group_28336] +[group_28337] +[group_28338] +[group_28339] +[group_28340] +[group_28341] +[group_28342] +[group_28343] +[group_28344] +[group_28345] +[group_28346] +[group_28347] +[group_28348] +[group_28349] +[group_28350] +[group_28351] +[group_28352] +[group_28353] +[group_28354] +[group_28355] +[group_28356] +[group_28357] +[group_28358] +[group_28359] +[group_28360] +[group_28361] +[group_28362] +[group_28363] +[group_28364] +[group_28365] +[group_28366] +[group_28367] +[group_28368] +[group_28369] +[group_28370] +[group_28371] +[group_28372] +[group_28373] +[group_28374] +[group_28375] +[group_28376] +[group_28377] +[group_28378] +[group_28379] +[group_28380] +[group_28381] +[group_28382] +[group_28383] +[group_28384] +[group_28385] +[group_28386] +[group_28387] +[group_28388] +[group_28389] +[group_28390] +[group_28391] +[group_28392] +[group_28393] +[group_28394] +[group_28395] +[group_28396] +[group_28397] +[group_28398] +[group_28399] +[group_28400] +[group_28401] +[group_28402] +[group_28403] +[group_28404] +[group_28405] +[group_28406] +[group_28407] +[group_28408] +[group_28409] +[group_28410] +[group_28411] +[group_28412] +[group_28413] +[group_28414] +[group_28415] +[group_28416] +[group_28417] +[group_28418] +[group_28419] +[group_28420] +[group_28421] +[group_28422] +[group_28423] +[group_28424] +[group_28425] +[group_28426] +[group_28427] +[group_28428] +[group_28429] +[group_28430] +[group_28431] +[group_28432] +[group_28433] +[group_28434] +[group_28435] +[group_28436] +[group_28437] +[group_28438] +[group_28439] +[group_28440] +[group_28441] +[group_28442] +[group_28443] +[group_28444] +[group_28445] +[group_28446] +[group_28447] +[group_28448] +[group_28449] +[group_28450] +[group_28451] +[group_28452] +[group_28453] +[group_28454] +[group_28455] +[group_28456] +[group_28457] +[group_28458] +[group_28459] +[group_28460] +[group_28461] +[group_28462] +[group_28463] +[group_28464] +[group_28465] +[group_28466] +[group_28467] +[group_28468] +[group_28469] +[group_28470] +[group_28471] +[group_28472] +[group_28473] +[group_28474] +[group_28475] +[group_28476] +[group_28477] +[group_28478] +[group_28479] +[group_28480] +[group_28481] +[group_28482] +[group_28483] +[group_28484] +[group_28485] +[group_28486] +[group_28487] +[group_28488] +[group_28489] +[group_28490] +[group_28491] +[group_28492] +[group_28493] +[group_28494] +[group_28495] +[group_28496] +[group_28497] +[group_28498] +[group_28499] +[group_28500] +[group_28501] +[group_28502] +[group_28503] +[group_28504] +[group_28505] +[group_28506] +[group_28507] +[group_28508] +[group_28509] +[group_28510] +[group_28511] +[group_28512] +[group_28513] +[group_28514] +[group_28515] +[group_28516] +[group_28517] +[group_28518] +[group_28519] +[group_28520] +[group_28521] +[group_28522] +[group_28523] +[group_28524] +[group_28525] +[group_28526] +[group_28527] +[group_28528] +[group_28529] +[group_28530] +[group_28531] +[group_28532] +[group_28533] +[group_28534] +[group_28535] +[group_28536] +[group_28537] +[group_28538] +[group_28539] +[group_28540] +[group_28541] +[group_28542] +[group_28543] +[group_28544] +[group_28545] +[group_28546] +[group_28547] +[group_28548] +[group_28549] +[group_28550] +[group_28551] +[group_28552] +[group_28553] +[group_28554] +[group_28555] +[group_28556] +[group_28557] +[group_28558] +[group_28559] +[group_28560] +[group_28561] +[group_28562] +[group_28563] +[group_28564] +[group_28565] +[group_28566] +[group_28567] +[group_28568] +[group_28569] +[group_28570] +[group_28571] +[group_28572] +[group_28573] +[group_28574] +[group_28575] +[group_28576] +[group_28577] +[group_28578] +[group_28579] +[group_28580] +[group_28581] +[group_28582] +[group_28583] +[group_28584] +[group_28585] +[group_28586] +[group_28587] +[group_28588] +[group_28589] +[group_28590] +[group_28591] +[group_28592] +[group_28593] +[group_28594] +[group_28595] +[group_28596] +[group_28597] +[group_28598] +[group_28599] +[group_28600] +[group_28601] +[group_28602] +[group_28603] +[group_28604] +[group_28605] +[group_28606] +[group_28607] +[group_28608] +[group_28609] +[group_28610] +[group_28611] +[group_28612] +[group_28613] +[group_28614] +[group_28615] +[group_28616] +[group_28617] +[group_28618] +[group_28619] +[group_28620] +[group_28621] +[group_28622] +[group_28623] +[group_28624] +[group_28625] +[group_28626] +[group_28627] +[group_28628] +[group_28629] +[group_28630] +[group_28631] +[group_28632] +[group_28633] +[group_28634] +[group_28635] +[group_28636] +[group_28637] +[group_28638] +[group_28639] +[group_28640] +[group_28641] +[group_28642] +[group_28643] +[group_28644] +[group_28645] +[group_28646] +[group_28647] +[group_28648] +[group_28649] +[group_28650] +[group_28651] +[group_28652] +[group_28653] +[group_28654] +[group_28655] +[group_28656] +[group_28657] +[group_28658] +[group_28659] +[group_28660] +[group_28661] +[group_28662] +[group_28663] +[group_28664] +[group_28665] +[group_28666] +[group_28667] +[group_28668] +[group_28669] +[group_28670] +[group_28671] +[group_28672] +[group_28673] +[group_28674] +[group_28675] +[group_28676] +[group_28677] +[group_28678] +[group_28679] +[group_28680] +[group_28681] +[group_28682] +[group_28683] +[group_28684] +[group_28685] +[group_28686] +[group_28687] +[group_28688] +[group_28689] +[group_28690] +[group_28691] +[group_28692] +[group_28693] +[group_28694] +[group_28695] +[group_28696] +[group_28697] +[group_28698] +[group_28699] +[group_28700] +[group_28701] +[group_28702] +[group_28703] +[group_28704] +[group_28705] +[group_28706] +[group_28707] +[group_28708] +[group_28709] +[group_28710] +[group_28711] +[group_28712] +[group_28713] +[group_28714] +[group_28715] +[group_28716] +[group_28717] +[group_28718] +[group_28719] +[group_28720] +[group_28721] +[group_28722] +[group_28723] +[group_28724] +[group_28725] +[group_28726] +[group_28727] +[group_28728] +[group_28729] +[group_28730] +[group_28731] +[group_28732] +[group_28733] +[group_28734] +[group_28735] +[group_28736] +[group_28737] +[group_28738] +[group_28739] +[group_28740] +[group_28741] +[group_28742] +[group_28743] +[group_28744] +[group_28745] +[group_28746] +[group_28747] +[group_28748] +[group_28749] +[group_28750] +[group_28751] +[group_28752] +[group_28753] +[group_28754] +[group_28755] +[group_28756] +[group_28757] +[group_28758] +[group_28759] +[group_28760] +[group_28761] +[group_28762] +[group_28763] +[group_28764] +[group_28765] +[group_28766] +[group_28767] +[group_28768] +[group_28769] +[group_28770] +[group_28771] +[group_28772] +[group_28773] +[group_28774] +[group_28775] +[group_28776] +[group_28777] +[group_28778] +[group_28779] +[group_28780] +[group_28781] +[group_28782] +[group_28783] +[group_28784] +[group_28785] +[group_28786] +[group_28787] +[group_28788] +[group_28789] +[group_28790] +[group_28791] +[group_28792] +[group_28793] +[group_28794] +[group_28795] +[group_28796] +[group_28797] +[group_28798] +[group_28799] +[group_28800] +[group_28801] +[group_28802] +[group_28803] +[group_28804] +[group_28805] +[group_28806] +[group_28807] +[group_28808] +[group_28809] +[group_28810] +[group_28811] +[group_28812] +[group_28813] +[group_28814] +[group_28815] +[group_28816] +[group_28817] +[group_28818] +[group_28819] +[group_28820] +[group_28821] +[group_28822] +[group_28823] +[group_28824] +[group_28825] +[group_28826] +[group_28827] +[group_28828] +[group_28829] +[group_28830] +[group_28831] +[group_28832] +[group_28833] +[group_28834] +[group_28835] +[group_28836] +[group_28837] +[group_28838] +[group_28839] +[group_28840] +[group_28841] +[group_28842] +[group_28843] +[group_28844] +[group_28845] +[group_28846] +[group_28847] +[group_28848] +[group_28849] +[group_28850] +[group_28851] +[group_28852] +[group_28853] +[group_28854] +[group_28855] +[group_28856] +[group_28857] +[group_28858] +[group_28859] +[group_28860] +[group_28861] +[group_28862] +[group_28863] +[group_28864] +[group_28865] +[group_28866] +[group_28867] +[group_28868] +[group_28869] +[group_28870] +[group_28871] +[group_28872] +[group_28873] +[group_28874] +[group_28875] +[group_28876] +[group_28877] +[group_28878] +[group_28879] +[group_28880] +[group_28881] +[group_28882] +[group_28883] +[group_28884] +[group_28885] +[group_28886] +[group_28887] +[group_28888] +[group_28889] +[group_28890] +[group_28891] +[group_28892] +[group_28893] +[group_28894] +[group_28895] +[group_28896] +[group_28897] +[group_28898] +[group_28899] +[group_28900] +[group_28901] +[group_28902] +[group_28903] +[group_28904] +[group_28905] +[group_28906] +[group_28907] +[group_28908] +[group_28909] +[group_28910] +[group_28911] +[group_28912] +[group_28913] +[group_28914] +[group_28915] +[group_28916] +[group_28917] +[group_28918] +[group_28919] +[group_28920] +[group_28921] +[group_28922] +[group_28923] +[group_28924] +[group_28925] +[group_28926] +[group_28927] +[group_28928] +[group_28929] +[group_28930] +[group_28931] +[group_28932] +[group_28933] +[group_28934] +[group_28935] +[group_28936] +[group_28937] +[group_28938] +[group_28939] +[group_28940] +[group_28941] +[group_28942] +[group_28943] +[group_28944] +[group_28945] +[group_28946] +[group_28947] +[group_28948] +[group_28949] +[group_28950] +[group_28951] +[group_28952] +[group_28953] +[group_28954] +[group_28955] +[group_28956] +[group_28957] +[group_28958] +[group_28959] +[group_28960] +[group_28961] +[group_28962] +[group_28963] +[group_28964] +[group_28965] +[group_28966] +[group_28967] +[group_28968] +[group_28969] +[group_28970] +[group_28971] +[group_28972] +[group_28973] +[group_28974] +[group_28975] +[group_28976] +[group_28977] +[group_28978] +[group_28979] +[group_28980] +[group_28981] +[group_28982] +[group_28983] +[group_28984] +[group_28985] +[group_28986] +[group_28987] +[group_28988] +[group_28989] +[group_28990] +[group_28991] +[group_28992] +[group_28993] +[group_28994] +[group_28995] +[group_28996] +[group_28997] +[group_28998] +[group_28999] +[group_29000] +[group_29001] +[group_29002] +[group_29003] +[group_29004] +[group_29005] +[group_29006] +[group_29007] +[group_29008] +[group_29009] +[group_29010] +[group_29011] +[group_29012] +[group_29013] +[group_29014] +[group_29015] +[group_29016] +[group_29017] +[group_29018] +[group_29019] +[group_29020] +[group_29021] +[group_29022] +[group_29023] +[group_29024] +[group_29025] +[group_29026] +[group_29027] +[group_29028] +[group_29029] +[group_29030] +[group_29031] +[group_29032] +[group_29033] +[group_29034] +[group_29035] +[group_29036] +[group_29037] +[group_29038] +[group_29039] +[group_29040] +[group_29041] +[group_29042] +[group_29043] +[group_29044] +[group_29045] +[group_29046] +[group_29047] +[group_29048] +[group_29049] +[group_29050] +[group_29051] +[group_29052] +[group_29053] +[group_29054] +[group_29055] +[group_29056] +[group_29057] +[group_29058] +[group_29059] +[group_29060] +[group_29061] +[group_29062] +[group_29063] +[group_29064] +[group_29065] +[group_29066] +[group_29067] +[group_29068] +[group_29069] +[group_29070] +[group_29071] +[group_29072] +[group_29073] +[group_29074] +[group_29075] +[group_29076] +[group_29077] +[group_29078] +[group_29079] +[group_29080] +[group_29081] +[group_29082] +[group_29083] +[group_29084] +[group_29085] +[group_29086] +[group_29087] +[group_29088] +[group_29089] +[group_29090] +[group_29091] +[group_29092] +[group_29093] +[group_29094] +[group_29095] +[group_29096] +[group_29097] +[group_29098] +[group_29099] +[group_29100] +[group_29101] +[group_29102] +[group_29103] +[group_29104] +[group_29105] +[group_29106] +[group_29107] +[group_29108] +[group_29109] +[group_29110] +[group_29111] +[group_29112] +[group_29113] +[group_29114] +[group_29115] +[group_29116] +[group_29117] +[group_29118] +[group_29119] +[group_29120] +[group_29121] +[group_29122] +[group_29123] +[group_29124] +[group_29125] +[group_29126] +[group_29127] +[group_29128] +[group_29129] +[group_29130] +[group_29131] +[group_29132] +[group_29133] +[group_29134] +[group_29135] +[group_29136] +[group_29137] +[group_29138] +[group_29139] +[group_29140] +[group_29141] +[group_29142] +[group_29143] +[group_29144] +[group_29145] +[group_29146] +[group_29147] +[group_29148] +[group_29149] +[group_29150] +[group_29151] +[group_29152] +[group_29153] +[group_29154] +[group_29155] +[group_29156] +[group_29157] +[group_29158] +[group_29159] +[group_29160] +[group_29161] +[group_29162] +[group_29163] +[group_29164] +[group_29165] +[group_29166] +[group_29167] +[group_29168] +[group_29169] +[group_29170] +[group_29171] +[group_29172] +[group_29173] +[group_29174] +[group_29175] +[group_29176] +[group_29177] +[group_29178] +[group_29179] +[group_29180] +[group_29181] +[group_29182] +[group_29183] +[group_29184] +[group_29185] +[group_29186] +[group_29187] +[group_29188] +[group_29189] +[group_29190] +[group_29191] +[group_29192] +[group_29193] +[group_29194] +[group_29195] +[group_29196] +[group_29197] +[group_29198] +[group_29199] +[group_29200] +[group_29201] +[group_29202] +[group_29203] +[group_29204] +[group_29205] +[group_29206] +[group_29207] +[group_29208] +[group_29209] +[group_29210] +[group_29211] +[group_29212] +[group_29213] +[group_29214] +[group_29215] +[group_29216] +[group_29217] +[group_29218] +[group_29219] +[group_29220] +[group_29221] +[group_29222] +[group_29223] +[group_29224] +[group_29225] +[group_29226] +[group_29227] +[group_29228] +[group_29229] +[group_29230] +[group_29231] +[group_29232] +[group_29233] +[group_29234] +[group_29235] +[group_29236] +[group_29237] +[group_29238] +[group_29239] +[group_29240] +[group_29241] +[group_29242] +[group_29243] +[group_29244] +[group_29245] +[group_29246] +[group_29247] +[group_29248] +[group_29249] +[group_29250] +[group_29251] +[group_29252] +[group_29253] +[group_29254] +[group_29255] +[group_29256] +[group_29257] +[group_29258] +[group_29259] +[group_29260] +[group_29261] +[group_29262] +[group_29263] +[group_29264] +[group_29265] +[group_29266] +[group_29267] +[group_29268] +[group_29269] +[group_29270] +[group_29271] +[group_29272] +[group_29273] +[group_29274] +[group_29275] +[group_29276] +[group_29277] +[group_29278] +[group_29279] +[group_29280] +[group_29281] +[group_29282] +[group_29283] +[group_29284] +[group_29285] +[group_29286] +[group_29287] +[group_29288] +[group_29289] +[group_29290] +[group_29291] +[group_29292] +[group_29293] +[group_29294] +[group_29295] +[group_29296] +[group_29297] +[group_29298] +[group_29299] +[group_29300] +[group_29301] +[group_29302] +[group_29303] +[group_29304] +[group_29305] +[group_29306] +[group_29307] +[group_29308] +[group_29309] +[group_29310] +[group_29311] +[group_29312] +[group_29313] +[group_29314] +[group_29315] +[group_29316] +[group_29317] +[group_29318] +[group_29319] +[group_29320] +[group_29321] +[group_29322] +[group_29323] +[group_29324] +[group_29325] +[group_29326] +[group_29327] +[group_29328] +[group_29329] +[group_29330] +[group_29331] +[group_29332] +[group_29333] +[group_29334] +[group_29335] +[group_29336] +[group_29337] +[group_29338] +[group_29339] +[group_29340] +[group_29341] +[group_29342] +[group_29343] +[group_29344] +[group_29345] +[group_29346] +[group_29347] +[group_29348] +[group_29349] +[group_29350] +[group_29351] +[group_29352] +[group_29353] +[group_29354] +[group_29355] +[group_29356] +[group_29357] +[group_29358] +[group_29359] +[group_29360] +[group_29361] +[group_29362] +[group_29363] +[group_29364] +[group_29365] +[group_29366] +[group_29367] +[group_29368] +[group_29369] +[group_29370] +[group_29371] +[group_29372] +[group_29373] +[group_29374] +[group_29375] +[group_29376] +[group_29377] +[group_29378] +[group_29379] +[group_29380] +[group_29381] +[group_29382] +[group_29383] +[group_29384] +[group_29385] +[group_29386] +[group_29387] +[group_29388] +[group_29389] +[group_29390] +[group_29391] +[group_29392] +[group_29393] +[group_29394] +[group_29395] +[group_29396] +[group_29397] +[group_29398] +[group_29399] +[group_29400] +[group_29401] +[group_29402] +[group_29403] +[group_29404] +[group_29405] +[group_29406] +[group_29407] +[group_29408] +[group_29409] +[group_29410] +[group_29411] +[group_29412] +[group_29413] +[group_29414] +[group_29415] +[group_29416] +[group_29417] +[group_29418] +[group_29419] +[group_29420] +[group_29421] +[group_29422] +[group_29423] +[group_29424] +[group_29425] +[group_29426] +[group_29427] +[group_29428] +[group_29429] +[group_29430] +[group_29431] +[group_29432] +[group_29433] +[group_29434] +[group_29435] +[group_29436] +[group_29437] +[group_29438] +[group_29439] +[group_29440] +[group_29441] +[group_29442] +[group_29443] +[group_29444] +[group_29445] +[group_29446] +[group_29447] +[group_29448] +[group_29449] +[group_29450] +[group_29451] +[group_29452] +[group_29453] +[group_29454] +[group_29455] +[group_29456] +[group_29457] +[group_29458] +[group_29459] +[group_29460] +[group_29461] +[group_29462] +[group_29463] +[group_29464] +[group_29465] +[group_29466] +[group_29467] +[group_29468] +[group_29469] +[group_29470] +[group_29471] +[group_29472] +[group_29473] +[group_29474] +[group_29475] +[group_29476] +[group_29477] +[group_29478] +[group_29479] +[group_29480] +[group_29481] +[group_29482] +[group_29483] +[group_29484] +[group_29485] +[group_29486] +[group_29487] +[group_29488] +[group_29489] +[group_29490] +[group_29491] +[group_29492] +[group_29493] +[group_29494] +[group_29495] +[group_29496] +[group_29497] +[group_29498] +[group_29499] +[group_29500] +[group_29501] +[group_29502] +[group_29503] +[group_29504] +[group_29505] +[group_29506] +[group_29507] +[group_29508] +[group_29509] +[group_29510] +[group_29511] +[group_29512] +[group_29513] +[group_29514] +[group_29515] +[group_29516] +[group_29517] +[group_29518] +[group_29519] +[group_29520] +[group_29521] +[group_29522] +[group_29523] +[group_29524] +[group_29525] +[group_29526] +[group_29527] +[group_29528] +[group_29529] +[group_29530] +[group_29531] +[group_29532] +[group_29533] +[group_29534] +[group_29535] +[group_29536] +[group_29537] +[group_29538] +[group_29539] +[group_29540] +[group_29541] +[group_29542] +[group_29543] +[group_29544] +[group_29545] +[group_29546] +[group_29547] +[group_29548] +[group_29549] +[group_29550] +[group_29551] +[group_29552] +[group_29553] +[group_29554] +[group_29555] +[group_29556] +[group_29557] +[group_29558] +[group_29559] +[group_29560] +[group_29561] +[group_29562] +[group_29563] +[group_29564] +[group_29565] +[group_29566] +[group_29567] +[group_29568] +[group_29569] +[group_29570] +[group_29571] +[group_29572] +[group_29573] +[group_29574] +[group_29575] +[group_29576] +[group_29577] +[group_29578] +[group_29579] +[group_29580] +[group_29581] +[group_29582] +[group_29583] +[group_29584] +[group_29585] +[group_29586] +[group_29587] +[group_29588] +[group_29589] +[group_29590] +[group_29591] +[group_29592] +[group_29593] +[group_29594] +[group_29595] +[group_29596] +[group_29597] +[group_29598] +[group_29599] +[group_29600] +[group_29601] +[group_29602] +[group_29603] +[group_29604] +[group_29605] +[group_29606] +[group_29607] +[group_29608] +[group_29609] +[group_29610] +[group_29611] +[group_29612] +[group_29613] +[group_29614] +[group_29615] +[group_29616] +[group_29617] +[group_29618] +[group_29619] +[group_29620] +[group_29621] +[group_29622] +[group_29623] +[group_29624] +[group_29625] +[group_29626] +[group_29627] +[group_29628] +[group_29629] +[group_29630] +[group_29631] +[group_29632] +[group_29633] +[group_29634] +[group_29635] +[group_29636] +[group_29637] +[group_29638] +[group_29639] +[group_29640] +[group_29641] +[group_29642] +[group_29643] +[group_29644] +[group_29645] +[group_29646] +[group_29647] +[group_29648] +[group_29649] +[group_29650] +[group_29651] +[group_29652] +[group_29653] +[group_29654] +[group_29655] +[group_29656] +[group_29657] +[group_29658] +[group_29659] +[group_29660] +[group_29661] +[group_29662] +[group_29663] +[group_29664] +[group_29665] +[group_29666] +[group_29667] +[group_29668] +[group_29669] +[group_29670] +[group_29671] +[group_29672] +[group_29673] +[group_29674] +[group_29675] +[group_29676] +[group_29677] +[group_29678] +[group_29679] +[group_29680] +[group_29681] +[group_29682] +[group_29683] +[group_29684] +[group_29685] +[group_29686] +[group_29687] +[group_29688] +[group_29689] +[group_29690] +[group_29691] +[group_29692] +[group_29693] +[group_29694] +[group_29695] +[group_29696] +[group_29697] +[group_29698] +[group_29699] +[group_29700] +[group_29701] +[group_29702] +[group_29703] +[group_29704] +[group_29705] +[group_29706] +[group_29707] +[group_29708] +[group_29709] +[group_29710] +[group_29711] +[group_29712] +[group_29713] +[group_29714] +[group_29715] +[group_29716] +[group_29717] +[group_29718] +[group_29719] +[group_29720] +[group_29721] +[group_29722] +[group_29723] +[group_29724] +[group_29725] +[group_29726] +[group_29727] +[group_29728] +[group_29729] +[group_29730] +[group_29731] +[group_29732] +[group_29733] +[group_29734] +[group_29735] +[group_29736] +[group_29737] +[group_29738] +[group_29739] +[group_29740] +[group_29741] +[group_29742] +[group_29743] +[group_29744] +[group_29745] +[group_29746] +[group_29747] +[group_29748] +[group_29749] +[group_29750] +[group_29751] +[group_29752] +[group_29753] +[group_29754] +[group_29755] +[group_29756] +[group_29757] +[group_29758] +[group_29759] +[group_29760] +[group_29761] +[group_29762] +[group_29763] +[group_29764] +[group_29765] +[group_29766] +[group_29767] +[group_29768] +[group_29769] +[group_29770] +[group_29771] +[group_29772] +[group_29773] +[group_29774] +[group_29775] +[group_29776] +[group_29777] +[group_29778] +[group_29779] +[group_29780] +[group_29781] +[group_29782] +[group_29783] +[group_29784] +[group_29785] +[group_29786] +[group_29787] +[group_29788] +[group_29789] +[group_29790] +[group_29791] +[group_29792] +[group_29793] +[group_29794] +[group_29795] +[group_29796] +[group_29797] +[group_29798] +[group_29799] +[group_29800] +[group_29801] +[group_29802] +[group_29803] +[group_29804] +[group_29805] +[group_29806] +[group_29807] +[group_29808] +[group_29809] +[group_29810] +[group_29811] +[group_29812] +[group_29813] +[group_29814] +[group_29815] +[group_29816] +[group_29817] +[group_29818] +[group_29819] +[group_29820] +[group_29821] +[group_29822] +[group_29823] +[group_29824] +[group_29825] +[group_29826] +[group_29827] +[group_29828] +[group_29829] +[group_29830] +[group_29831] +[group_29832] +[group_29833] +[group_29834] +[group_29835] +[group_29836] +[group_29837] +[group_29838] +[group_29839] +[group_29840] +[group_29841] +[group_29842] +[group_29843] +[group_29844] +[group_29845] +[group_29846] +[group_29847] +[group_29848] +[group_29849] +[group_29850] +[group_29851] +[group_29852] +[group_29853] +[group_29854] +[group_29855] +[group_29856] +[group_29857] +[group_29858] +[group_29859] +[group_29860] +[group_29861] +[group_29862] +[group_29863] +[group_29864] +[group_29865] +[group_29866] +[group_29867] +[group_29868] +[group_29869] +[group_29870] +[group_29871] +[group_29872] +[group_29873] +[group_29874] +[group_29875] +[group_29876] +[group_29877] +[group_29878] +[group_29879] +[group_29880] +[group_29881] +[group_29882] +[group_29883] +[group_29884] +[group_29885] +[group_29886] +[group_29887] +[group_29888] +[group_29889] +[group_29890] +[group_29891] +[group_29892] +[group_29893] +[group_29894] +[group_29895] +[group_29896] +[group_29897] +[group_29898] +[group_29899] +[group_29900] +[group_29901] +[group_29902] +[group_29903] +[group_29904] +[group_29905] +[group_29906] +[group_29907] +[group_29908] +[group_29909] +[group_29910] +[group_29911] +[group_29912] +[group_29913] +[group_29914] +[group_29915] +[group_29916] +[group_29917] +[group_29918] +[group_29919] +[group_29920] +[group_29921] +[group_29922] +[group_29923] +[group_29924] +[group_29925] +[group_29926] +[group_29927] +[group_29928] +[group_29929] +[group_29930] +[group_29931] +[group_29932] +[group_29933] +[group_29934] +[group_29935] +[group_29936] +[group_29937] +[group_29938] +[group_29939] +[group_29940] +[group_29941] +[group_29942] +[group_29943] +[group_29944] +[group_29945] +[group_29946] +[group_29947] +[group_29948] +[group_29949] +[group_29950] +[group_29951] +[group_29952] +[group_29953] +[group_29954] +[group_29955] +[group_29956] +[group_29957] +[group_29958] +[group_29959] +[group_29960] +[group_29961] +[group_29962] +[group_29963] +[group_29964] +[group_29965] +[group_29966] +[group_29967] +[group_29968] +[group_29969] +[group_29970] +[group_29971] +[group_29972] +[group_29973] +[group_29974] +[group_29975] +[group_29976] +[group_29977] +[group_29978] +[group_29979] +[group_29980] +[group_29981] +[group_29982] +[group_29983] +[group_29984] +[group_29985] +[group_29986] +[group_29987] +[group_29988] +[group_29989] +[group_29990] +[group_29991] +[group_29992] +[group_29993] +[group_29994] +[group_29995] +[group_29996] +[group_29997] +[group_29998] +[group_29999] +[group_30000] +[group_30001] +[group_30002] +[group_30003] +[group_30004] +[group_30005] +[group_30006] +[group_30007] +[group_30008] +[group_30009] +[group_30010] +[group_30011] +[group_30012] +[group_30013] +[group_30014] +[group_30015] +[group_30016] +[group_30017] +[group_30018] +[group_30019] +[group_30020] +[group_30021] +[group_30022] +[group_30023] +[group_30024] +[group_30025] +[group_30026] +[group_30027] +[group_30028] +[group_30029] +[group_30030] +[group_30031] +[group_30032] +[group_30033] +[group_30034] +[group_30035] +[group_30036] +[group_30037] +[group_30038] +[group_30039] +[group_30040] +[group_30041] +[group_30042] +[group_30043] +[group_30044] +[group_30045] +[group_30046] +[group_30047] +[group_30048] +[group_30049] +[group_30050] +[group_30051] +[group_30052] +[group_30053] +[group_30054] +[group_30055] +[group_30056] +[group_30057] +[group_30058] +[group_30059] +[group_30060] +[group_30061] +[group_30062] +[group_30063] +[group_30064] +[group_30065] +[group_30066] +[group_30067] +[group_30068] +[group_30069] +[group_30070] +[group_30071] +[group_30072] +[group_30073] +[group_30074] +[group_30075] +[group_30076] +[group_30077] +[group_30078] +[group_30079] +[group_30080] +[group_30081] +[group_30082] +[group_30083] +[group_30084] +[group_30085] +[group_30086] +[group_30087] +[group_30088] +[group_30089] +[group_30090] +[group_30091] +[group_30092] +[group_30093] +[group_30094] +[group_30095] +[group_30096] +[group_30097] +[group_30098] +[group_30099] +[group_30100] +[group_30101] +[group_30102] +[group_30103] +[group_30104] +[group_30105] +[group_30106] +[group_30107] +[group_30108] +[group_30109] +[group_30110] +[group_30111] +[group_30112] +[group_30113] +[group_30114] +[group_30115] +[group_30116] +[group_30117] +[group_30118] +[group_30119] +[group_30120] +[group_30121] +[group_30122] +[group_30123] +[group_30124] +[group_30125] +[group_30126] +[group_30127] +[group_30128] +[group_30129] +[group_30130] +[group_30131] +[group_30132] +[group_30133] +[group_30134] +[group_30135] +[group_30136] +[group_30137] +[group_30138] +[group_30139] +[group_30140] +[group_30141] +[group_30142] +[group_30143] +[group_30144] +[group_30145] +[group_30146] +[group_30147] +[group_30148] +[group_30149] +[group_30150] +[group_30151] +[group_30152] +[group_30153] +[group_30154] +[group_30155] +[group_30156] +[group_30157] +[group_30158] +[group_30159] +[group_30160] +[group_30161] +[group_30162] +[group_30163] +[group_30164] +[group_30165] +[group_30166] +[group_30167] +[group_30168] +[group_30169] +[group_30170] +[group_30171] +[group_30172] +[group_30173] +[group_30174] +[group_30175] +[group_30176] +[group_30177] +[group_30178] +[group_30179] +[group_30180] +[group_30181] +[group_30182] +[group_30183] +[group_30184] +[group_30185] +[group_30186] +[group_30187] +[group_30188] +[group_30189] +[group_30190] +[group_30191] +[group_30192] +[group_30193] +[group_30194] +[group_30195] +[group_30196] +[group_30197] +[group_30198] +[group_30199] +[group_30200] +[group_30201] +[group_30202] +[group_30203] +[group_30204] +[group_30205] +[group_30206] +[group_30207] +[group_30208] +[group_30209] +[group_30210] +[group_30211] +[group_30212] +[group_30213] +[group_30214] +[group_30215] +[group_30216] +[group_30217] +[group_30218] +[group_30219] +[group_30220] +[group_30221] +[group_30222] +[group_30223] +[group_30224] +[group_30225] +[group_30226] +[group_30227] +[group_30228] +[group_30229] +[group_30230] +[group_30231] +[group_30232] +[group_30233] +[group_30234] +[group_30235] +[group_30236] +[group_30237] +[group_30238] +[group_30239] +[group_30240] +[group_30241] +[group_30242] +[group_30243] +[group_30244] +[group_30245] +[group_30246] +[group_30247] +[group_30248] +[group_30249] +[group_30250] +[group_30251] +[group_30252] +[group_30253] +[group_30254] +[group_30255] +[group_30256] +[group_30257] +[group_30258] +[group_30259] +[group_30260] +[group_30261] +[group_30262] +[group_30263] +[group_30264] +[group_30265] +[group_30266] +[group_30267] +[group_30268] +[group_30269] +[group_30270] +[group_30271] +[group_30272] +[group_30273] +[group_30274] +[group_30275] +[group_30276] +[group_30277] +[group_30278] +[group_30279] +[group_30280] +[group_30281] +[group_30282] +[group_30283] +[group_30284] +[group_30285] +[group_30286] +[group_30287] +[group_30288] +[group_30289] +[group_30290] +[group_30291] +[group_30292] +[group_30293] +[group_30294] +[group_30295] +[group_30296] +[group_30297] +[group_30298] +[group_30299] +[group_30300] +[group_30301] +[group_30302] +[group_30303] +[group_30304] +[group_30305] +[group_30306] +[group_30307] +[group_30308] +[group_30309] +[group_30310] +[group_30311] +[group_30312] +[group_30313] +[group_30314] +[group_30315] +[group_30316] +[group_30317] +[group_30318] +[group_30319] +[group_30320] +[group_30321] +[group_30322] +[group_30323] +[group_30324] +[group_30325] +[group_30326] +[group_30327] +[group_30328] +[group_30329] +[group_30330] +[group_30331] +[group_30332] +[group_30333] +[group_30334] +[group_30335] +[group_30336] +[group_30337] +[group_30338] +[group_30339] +[group_30340] +[group_30341] +[group_30342] +[group_30343] +[group_30344] +[group_30345] +[group_30346] +[group_30347] +[group_30348] +[group_30349] +[group_30350] +[group_30351] +[group_30352] +[group_30353] +[group_30354] +[group_30355] +[group_30356] +[group_30357] +[group_30358] +[group_30359] +[group_30360] +[group_30361] +[group_30362] +[group_30363] +[group_30364] +[group_30365] +[group_30366] +[group_30367] +[group_30368] +[group_30369] +[group_30370] +[group_30371] +[group_30372] +[group_30373] +[group_30374] +[group_30375] +[group_30376] +[group_30377] +[group_30378] +[group_30379] +[group_30380] +[group_30381] +[group_30382] +[group_30383] +[group_30384] +[group_30385] +[group_30386] +[group_30387] +[group_30388] +[group_30389] +[group_30390] +[group_30391] +[group_30392] +[group_30393] +[group_30394] +[group_30395] +[group_30396] +[group_30397] +[group_30398] +[group_30399] +[group_30400] +[group_30401] +[group_30402] +[group_30403] +[group_30404] +[group_30405] +[group_30406] +[group_30407] +[group_30408] +[group_30409] +[group_30410] +[group_30411] +[group_30412] +[group_30413] +[group_30414] +[group_30415] +[group_30416] +[group_30417] +[group_30418] +[group_30419] +[group_30420] +[group_30421] +[group_30422] +[group_30423] +[group_30424] +[group_30425] +[group_30426] +[group_30427] +[group_30428] +[group_30429] +[group_30430] +[group_30431] +[group_30432] +[group_30433] +[group_30434] +[group_30435] +[group_30436] +[group_30437] +[group_30438] +[group_30439] +[group_30440] +[group_30441] +[group_30442] +[group_30443] +[group_30444] +[group_30445] +[group_30446] +[group_30447] +[group_30448] +[group_30449] +[group_30450] +[group_30451] +[group_30452] +[group_30453] +[group_30454] +[group_30455] +[group_30456] +[group_30457] +[group_30458] +[group_30459] +[group_30460] +[group_30461] +[group_30462] +[group_30463] +[group_30464] +[group_30465] +[group_30466] +[group_30467] +[group_30468] +[group_30469] +[group_30470] +[group_30471] +[group_30472] +[group_30473] +[group_30474] +[group_30475] +[group_30476] +[group_30477] +[group_30478] +[group_30479] +[group_30480] +[group_30481] +[group_30482] +[group_30483] +[group_30484] +[group_30485] +[group_30486] +[group_30487] +[group_30488] +[group_30489] +[group_30490] +[group_30491] +[group_30492] +[group_30493] +[group_30494] +[group_30495] +[group_30496] +[group_30497] +[group_30498] +[group_30499] +[group_30500] +[group_30501] +[group_30502] +[group_30503] +[group_30504] +[group_30505] +[group_30506] +[group_30507] +[group_30508] +[group_30509] +[group_30510] +[group_30511] +[group_30512] +[group_30513] +[group_30514] +[group_30515] +[group_30516] +[group_30517] +[group_30518] +[group_30519] +[group_30520] +[group_30521] +[group_30522] +[group_30523] +[group_30524] +[group_30525] +[group_30526] +[group_30527] +[group_30528] +[group_30529] +[group_30530] +[group_30531] +[group_30532] +[group_30533] +[group_30534] +[group_30535] +[group_30536] +[group_30537] +[group_30538] +[group_30539] +[group_30540] +[group_30541] +[group_30542] +[group_30543] +[group_30544] +[group_30545] +[group_30546] +[group_30547] +[group_30548] +[group_30549] +[group_30550] +[group_30551] +[group_30552] +[group_30553] +[group_30554] +[group_30555] +[group_30556] +[group_30557] +[group_30558] +[group_30559] +[group_30560] +[group_30561] +[group_30562] +[group_30563] +[group_30564] +[group_30565] +[group_30566] +[group_30567] +[group_30568] +[group_30569] +[group_30570] +[group_30571] +[group_30572] +[group_30573] +[group_30574] +[group_30575] +[group_30576] +[group_30577] +[group_30578] +[group_30579] +[group_30580] +[group_30581] +[group_30582] +[group_30583] +[group_30584] +[group_30585] +[group_30586] +[group_30587] +[group_30588] +[group_30589] +[group_30590] +[group_30591] +[group_30592] +[group_30593] +[group_30594] +[group_30595] +[group_30596] +[group_30597] +[group_30598] +[group_30599] +[group_30600] +[group_30601] +[group_30602] +[group_30603] +[group_30604] +[group_30605] +[group_30606] +[group_30607] +[group_30608] +[group_30609] +[group_30610] +[group_30611] +[group_30612] +[group_30613] +[group_30614] +[group_30615] +[group_30616] +[group_30617] +[group_30618] +[group_30619] +[group_30620] +[group_30621] +[group_30622] +[group_30623] +[group_30624] +[group_30625] +[group_30626] +[group_30627] +[group_30628] +[group_30629] +[group_30630] +[group_30631] +[group_30632] +[group_30633] +[group_30634] +[group_30635] +[group_30636] +[group_30637] +[group_30638] +[group_30639] +[group_30640] +[group_30641] +[group_30642] +[group_30643] +[group_30644] +[group_30645] +[group_30646] +[group_30647] +[group_30648] +[group_30649] +[group_30650] +[group_30651] +[group_30652] +[group_30653] +[group_30654] +[group_30655] +[group_30656] +[group_30657] +[group_30658] +[group_30659] +[group_30660] +[group_30661] +[group_30662] +[group_30663] +[group_30664] +[group_30665] +[group_30666] +[group_30667] +[group_30668] +[group_30669] +[group_30670] +[group_30671] +[group_30672] +[group_30673] +[group_30674] +[group_30675] +[group_30676] +[group_30677] +[group_30678] +[group_30679] +[group_30680] +[group_30681] +[group_30682] +[group_30683] +[group_30684] +[group_30685] +[group_30686] +[group_30687] +[group_30688] +[group_30689] +[group_30690] +[group_30691] +[group_30692] +[group_30693] +[group_30694] +[group_30695] +[group_30696] +[group_30697] +[group_30698] +[group_30699] +[group_30700] +[group_30701] +[group_30702] +[group_30703] +[group_30704] +[group_30705] +[group_30706] +[group_30707] +[group_30708] +[group_30709] +[group_30710] +[group_30711] +[group_30712] +[group_30713] +[group_30714] +[group_30715] +[group_30716] +[group_30717] +[group_30718] +[group_30719] +[group_30720] +[group_30721] +[group_30722] +[group_30723] +[group_30724] +[group_30725] +[group_30726] +[group_30727] +[group_30728] +[group_30729] +[group_30730] +[group_30731] +[group_30732] +[group_30733] +[group_30734] +[group_30735] +[group_30736] +[group_30737] +[group_30738] +[group_30739] +[group_30740] +[group_30741] +[group_30742] +[group_30743] +[group_30744] +[group_30745] +[group_30746] +[group_30747] +[group_30748] +[group_30749] +[group_30750] +[group_30751] +[group_30752] +[group_30753] +[group_30754] +[group_30755] +[group_30756] +[group_30757] +[group_30758] +[group_30759] +[group_30760] +[group_30761] +[group_30762] +[group_30763] +[group_30764] +[group_30765] +[group_30766] +[group_30767] +[group_30768] +[group_30769] +[group_30770] +[group_30771] +[group_30772] +[group_30773] +[group_30774] +[group_30775] +[group_30776] +[group_30777] +[group_30778] +[group_30779] +[group_30780] +[group_30781] +[group_30782] +[group_30783] +[group_30784] +[group_30785] +[group_30786] +[group_30787] +[group_30788] +[group_30789] +[group_30790] +[group_30791] +[group_30792] +[group_30793] +[group_30794] +[group_30795] +[group_30796] +[group_30797] +[group_30798] +[group_30799] +[group_30800] +[group_30801] +[group_30802] +[group_30803] +[group_30804] +[group_30805] +[group_30806] +[group_30807] +[group_30808] +[group_30809] +[group_30810] +[group_30811] +[group_30812] +[group_30813] +[group_30814] +[group_30815] +[group_30816] +[group_30817] +[group_30818] +[group_30819] +[group_30820] +[group_30821] +[group_30822] +[group_30823] +[group_30824] +[group_30825] +[group_30826] +[group_30827] +[group_30828] +[group_30829] +[group_30830] +[group_30831] +[group_30832] +[group_30833] +[group_30834] +[group_30835] +[group_30836] +[group_30837] +[group_30838] +[group_30839] +[group_30840] +[group_30841] +[group_30842] +[group_30843] +[group_30844] +[group_30845] +[group_30846] +[group_30847] +[group_30848] +[group_30849] +[group_30850] +[group_30851] +[group_30852] +[group_30853] +[group_30854] +[group_30855] +[group_30856] +[group_30857] +[group_30858] +[group_30859] +[group_30860] +[group_30861] +[group_30862] +[group_30863] +[group_30864] +[group_30865] +[group_30866] +[group_30867] +[group_30868] +[group_30869] +[group_30870] +[group_30871] +[group_30872] +[group_30873] +[group_30874] +[group_30875] +[group_30876] +[group_30877] +[group_30878] +[group_30879] +[group_30880] +[group_30881] +[group_30882] +[group_30883] +[group_30884] +[group_30885] +[group_30886] +[group_30887] +[group_30888] +[group_30889] +[group_30890] +[group_30891] +[group_30892] +[group_30893] +[group_30894] +[group_30895] +[group_30896] +[group_30897] +[group_30898] +[group_30899] +[group_30900] +[group_30901] +[group_30902] +[group_30903] +[group_30904] +[group_30905] +[group_30906] +[group_30907] +[group_30908] +[group_30909] +[group_30910] +[group_30911] +[group_30912] +[group_30913] +[group_30914] +[group_30915] +[group_30916] +[group_30917] +[group_30918] +[group_30919] +[group_30920] +[group_30921] +[group_30922] +[group_30923] +[group_30924] +[group_30925] +[group_30926] +[group_30927] +[group_30928] +[group_30929] +[group_30930] +[group_30931] +[group_30932] +[group_30933] +[group_30934] +[group_30935] +[group_30936] +[group_30937] +[group_30938] +[group_30939] +[group_30940] +[group_30941] +[group_30942] +[group_30943] +[group_30944] +[group_30945] +[group_30946] +[group_30947] +[group_30948] +[group_30949] +[group_30950] +[group_30951] +[group_30952] +[group_30953] +[group_30954] +[group_30955] +[group_30956] +[group_30957] +[group_30958] +[group_30959] +[group_30960] +[group_30961] +[group_30962] +[group_30963] +[group_30964] +[group_30965] +[group_30966] +[group_30967] +[group_30968] +[group_30969] +[group_30970] +[group_30971] +[group_30972] +[group_30973] +[group_30974] +[group_30975] +[group_30976] +[group_30977] +[group_30978] +[group_30979] +[group_30980] +[group_30981] +[group_30982] +[group_30983] +[group_30984] +[group_30985] +[group_30986] +[group_30987] +[group_30988] +[group_30989] +[group_30990] +[group_30991] +[group_30992] +[group_30993] +[group_30994] +[group_30995] +[group_30996] +[group_30997] +[group_30998] +[group_30999] +[group_31000] +[group_31001] +[group_31002] +[group_31003] +[group_31004] +[group_31005] +[group_31006] +[group_31007] +[group_31008] +[group_31009] +[group_31010] +[group_31011] +[group_31012] +[group_31013] +[group_31014] +[group_31015] +[group_31016] +[group_31017] +[group_31018] +[group_31019] +[group_31020] +[group_31021] +[group_31022] +[group_31023] +[group_31024] +[group_31025] +[group_31026] +[group_31027] +[group_31028] +[group_31029] +[group_31030] +[group_31031] +[group_31032] +[group_31033] +[group_31034] +[group_31035] +[group_31036] +[group_31037] +[group_31038] +[group_31039] +[group_31040] +[group_31041] +[group_31042] +[group_31043] +[group_31044] +[group_31045] +[group_31046] +[group_31047] +[group_31048] +[group_31049] +[group_31050] +[group_31051] +[group_31052] +[group_31053] +[group_31054] +[group_31055] +[group_31056] +[group_31057] +[group_31058] +[group_31059] +[group_31060] +[group_31061] +[group_31062] +[group_31063] +[group_31064] +[group_31065] +[group_31066] +[group_31067] +[group_31068] +[group_31069] +[group_31070] +[group_31071] +[group_31072] +[group_31073] +[group_31074] +[group_31075] +[group_31076] +[group_31077] +[group_31078] +[group_31079] +[group_31080] +[group_31081] +[group_31082] +[group_31083] +[group_31084] +[group_31085] +[group_31086] +[group_31087] +[group_31088] +[group_31089] +[group_31090] +[group_31091] +[group_31092] +[group_31093] +[group_31094] +[group_31095] +[group_31096] +[group_31097] +[group_31098] +[group_31099] +[group_31100] +[group_31101] +[group_31102] +[group_31103] +[group_31104] +[group_31105] +[group_31106] +[group_31107] +[group_31108] +[group_31109] +[group_31110] +[group_31111] +[group_31112] +[group_31113] +[group_31114] +[group_31115] +[group_31116] +[group_31117] +[group_31118] +[group_31119] +[group_31120] +[group_31121] +[group_31122] +[group_31123] +[group_31124] +[group_31125] +[group_31126] +[group_31127] +[group_31128] +[group_31129] +[group_31130] +[group_31131] +[group_31132] +[group_31133] +[group_31134] +[group_31135] +[group_31136] +[group_31137] +[group_31138] +[group_31139] +[group_31140] +[group_31141] +[group_31142] +[group_31143] +[group_31144] +[group_31145] +[group_31146] +[group_31147] +[group_31148] +[group_31149] +[group_31150] +[group_31151] +[group_31152] +[group_31153] +[group_31154] +[group_31155] +[group_31156] +[group_31157] +[group_31158] +[group_31159] +[group_31160] +[group_31161] +[group_31162] +[group_31163] +[group_31164] +[group_31165] +[group_31166] +[group_31167] +[group_31168] +[group_31169] +[group_31170] +[group_31171] +[group_31172] +[group_31173] +[group_31174] +[group_31175] +[group_31176] +[group_31177] +[group_31178] +[group_31179] +[group_31180] +[group_31181] +[group_31182] +[group_31183] +[group_31184] +[group_31185] +[group_31186] +[group_31187] +[group_31188] +[group_31189] +[group_31190] +[group_31191] +[group_31192] +[group_31193] +[group_31194] +[group_31195] +[group_31196] +[group_31197] +[group_31198] +[group_31199] +[group_31200] +[group_31201] +[group_31202] +[group_31203] +[group_31204] +[group_31205] +[group_31206] +[group_31207] +[group_31208] +[group_31209] +[group_31210] +[group_31211] +[group_31212] +[group_31213] +[group_31214] +[group_31215] +[group_31216] +[group_31217] +[group_31218] +[group_31219] +[group_31220] +[group_31221] +[group_31222] +[group_31223] +[group_31224] +[group_31225] +[group_31226] +[group_31227] +[group_31228] +[group_31229] +[group_31230] +[group_31231] +[group_31232] +[group_31233] +[group_31234] +[group_31235] +[group_31236] +[group_31237] +[group_31238] +[group_31239] +[group_31240] +[group_31241] +[group_31242] +[group_31243] +[group_31244] +[group_31245] +[group_31246] +[group_31247] +[group_31248] +[group_31249] +[group_31250] +[group_31251] +[group_31252] +[group_31253] +[group_31254] +[group_31255] +[group_31256] +[group_31257] +[group_31258] +[group_31259] +[group_31260] +[group_31261] +[group_31262] +[group_31263] +[group_31264] +[group_31265] +[group_31266] +[group_31267] +[group_31268] +[group_31269] +[group_31270] +[group_31271] +[group_31272] +[group_31273] +[group_31274] +[group_31275] +[group_31276] +[group_31277] +[group_31278] +[group_31279] +[group_31280] +[group_31281] +[group_31282] +[group_31283] +[group_31284] +[group_31285] +[group_31286] +[group_31287] +[group_31288] +[group_31289] +[group_31290] +[group_31291] +[group_31292] +[group_31293] +[group_31294] +[group_31295] +[group_31296] +[group_31297] +[group_31298] +[group_31299] +[group_31300] +[group_31301] +[group_31302] +[group_31303] +[group_31304] +[group_31305] +[group_31306] +[group_31307] +[group_31308] +[group_31309] +[group_31310] +[group_31311] +[group_31312] +[group_31313] +[group_31314] +[group_31315] +[group_31316] +[group_31317] +[group_31318] +[group_31319] +[group_31320] +[group_31321] +[group_31322] +[group_31323] +[group_31324] +[group_31325] +[group_31326] +[group_31327] +[group_31328] +[group_31329] +[group_31330] +[group_31331] +[group_31332] +[group_31333] +[group_31334] +[group_31335] +[group_31336] +[group_31337] +[group_31338] +[group_31339] +[group_31340] +[group_31341] +[group_31342] +[group_31343] +[group_31344] +[group_31345] +[group_31346] +[group_31347] +[group_31348] +[group_31349] +[group_31350] +[group_31351] +[group_31352] +[group_31353] +[group_31354] +[group_31355] +[group_31356] +[group_31357] +[group_31358] +[group_31359] +[group_31360] +[group_31361] +[group_31362] +[group_31363] +[group_31364] +[group_31365] +[group_31366] +[group_31367] +[group_31368] +[group_31369] +[group_31370] +[group_31371] +[group_31372] +[group_31373] +[group_31374] +[group_31375] +[group_31376] +[group_31377] +[group_31378] +[group_31379] +[group_31380] +[group_31381] +[group_31382] +[group_31383] +[group_31384] +[group_31385] +[group_31386] +[group_31387] +[group_31388] +[group_31389] +[group_31390] +[group_31391] +[group_31392] +[group_31393] +[group_31394] +[group_31395] +[group_31396] +[group_31397] +[group_31398] +[group_31399] +[group_31400] +[group_31401] +[group_31402] +[group_31403] +[group_31404] +[group_31405] +[group_31406] +[group_31407] +[group_31408] +[group_31409] +[group_31410] +[group_31411] +[group_31412] +[group_31413] +[group_31414] +[group_31415] +[group_31416] +[group_31417] +[group_31418] +[group_31419] +[group_31420] +[group_31421] +[group_31422] +[group_31423] +[group_31424] +[group_31425] +[group_31426] +[group_31427] +[group_31428] +[group_31429] +[group_31430] +[group_31431] +[group_31432] +[group_31433] +[group_31434] +[group_31435] +[group_31436] +[group_31437] +[group_31438] +[group_31439] +[group_31440] +[group_31441] +[group_31442] +[group_31443] +[group_31444] +[group_31445] +[group_31446] +[group_31447] +[group_31448] +[group_31449] +[group_31450] +[group_31451] +[group_31452] +[group_31453] +[group_31454] +[group_31455] +[group_31456] +[group_31457] +[group_31458] +[group_31459] +[group_31460] +[group_31461] +[group_31462] +[group_31463] +[group_31464] +[group_31465] +[group_31466] +[group_31467] +[group_31468] +[group_31469] +[group_31470] +[group_31471] +[group_31472] +[group_31473] +[group_31474] +[group_31475] +[group_31476] +[group_31477] +[group_31478] +[group_31479] +[group_31480] +[group_31481] +[group_31482] +[group_31483] +[group_31484] +[group_31485] +[group_31486] +[group_31487] +[group_31488] +[group_31489] +[group_31490] +[group_31491] +[group_31492] +[group_31493] +[group_31494] +[group_31495] +[group_31496] +[group_31497] +[group_31498] +[group_31499] +[group_31500] +[group_31501] +[group_31502] +[group_31503] +[group_31504] +[group_31505] +[group_31506] +[group_31507] +[group_31508] +[group_31509] +[group_31510] +[group_31511] +[group_31512] +[group_31513] +[group_31514] +[group_31515] +[group_31516] +[group_31517] +[group_31518] +[group_31519] +[group_31520] +[group_31521] +[group_31522] +[group_31523] +[group_31524] +[group_31525] +[group_31526] +[group_31527] +[group_31528] +[group_31529] +[group_31530] +[group_31531] +[group_31532] +[group_31533] +[group_31534] +[group_31535] +[group_31536] +[group_31537] +[group_31538] +[group_31539] +[group_31540] +[group_31541] +[group_31542] +[group_31543] +[group_31544] +[group_31545] +[group_31546] +[group_31547] +[group_31548] +[group_31549] +[group_31550] +[group_31551] +[group_31552] +[group_31553] +[group_31554] +[group_31555] +[group_31556] +[group_31557] +[group_31558] +[group_31559] +[group_31560] +[group_31561] +[group_31562] +[group_31563] +[group_31564] +[group_31565] +[group_31566] +[group_31567] +[group_31568] +[group_31569] +[group_31570] +[group_31571] +[group_31572] +[group_31573] +[group_31574] +[group_31575] +[group_31576] +[group_31577] +[group_31578] +[group_31579] +[group_31580] +[group_31581] +[group_31582] +[group_31583] +[group_31584] +[group_31585] +[group_31586] +[group_31587] +[group_31588] +[group_31589] +[group_31590] +[group_31591] +[group_31592] +[group_31593] +[group_31594] +[group_31595] +[group_31596] +[group_31597] +[group_31598] +[group_31599] +[group_31600] +[group_31601] +[group_31602] +[group_31603] +[group_31604] +[group_31605] +[group_31606] +[group_31607] +[group_31608] +[group_31609] +[group_31610] +[group_31611] +[group_31612] +[group_31613] +[group_31614] +[group_31615] +[group_31616] +[group_31617] +[group_31618] +[group_31619] +[group_31620] +[group_31621] +[group_31622] +[group_31623] +[group_31624] +[group_31625] +[group_31626] +[group_31627] +[group_31628] +[group_31629] +[group_31630] +[group_31631] +[group_31632] +[group_31633] +[group_31634] +[group_31635] +[group_31636] +[group_31637] +[group_31638] +[group_31639] +[group_31640] +[group_31641] +[group_31642] +[group_31643] +[group_31644] +[group_31645] +[group_31646] +[group_31647] +[group_31648] +[group_31649] +[group_31650] +[group_31651] +[group_31652] +[group_31653] +[group_31654] +[group_31655] +[group_31656] +[group_31657] +[group_31658] +[group_31659] +[group_31660] +[group_31661] +[group_31662] +[group_31663] +[group_31664] +[group_31665] +[group_31666] +[group_31667] +[group_31668] +[group_31669] +[group_31670] +[group_31671] +[group_31672] +[group_31673] +[group_31674] +[group_31675] +[group_31676] +[group_31677] +[group_31678] +[group_31679] +[group_31680] +[group_31681] +[group_31682] +[group_31683] +[group_31684] +[group_31685] +[group_31686] +[group_31687] +[group_31688] +[group_31689] +[group_31690] +[group_31691] +[group_31692] +[group_31693] +[group_31694] +[group_31695] +[group_31696] +[group_31697] +[group_31698] +[group_31699] +[group_31700] +[group_31701] +[group_31702] +[group_31703] +[group_31704] +[group_31705] +[group_31706] +[group_31707] +[group_31708] +[group_31709] +[group_31710] +[group_31711] +[group_31712] +[group_31713] +[group_31714] +[group_31715] +[group_31716] +[group_31717] +[group_31718] +[group_31719] +[group_31720] +[group_31721] +[group_31722] +[group_31723] +[group_31724] +[group_31725] +[group_31726] +[group_31727] +[group_31728] +[group_31729] +[group_31730] +[group_31731] +[group_31732] +[group_31733] +[group_31734] +[group_31735] +[group_31736] +[group_31737] +[group_31738] +[group_31739] +[group_31740] +[group_31741] +[group_31742] +[group_31743] +[group_31744] +[group_31745] +[group_31746] +[group_31747] +[group_31748] +[group_31749] +[group_31750] +[group_31751] +[group_31752] +[group_31753] +[group_31754] +[group_31755] +[group_31756] +[group_31757] +[group_31758] +[group_31759] +[group_31760] +[group_31761] +[group_31762] +[group_31763] +[group_31764] +[group_31765] +[group_31766] +[group_31767] +[group_31768] +[group_31769] +[group_31770] +[group_31771] +[group_31772] +[group_31773] +[group_31774] +[group_31775] +[group_31776] +[group_31777] +[group_31778] +[group_31779] +[group_31780] +[group_31781] +[group_31782] +[group_31783] +[group_31784] +[group_31785] +[group_31786] +[group_31787] +[group_31788] +[group_31789] +[group_31790] +[group_31791] +[group_31792] +[group_31793] +[group_31794] +[group_31795] +[group_31796] +[group_31797] +[group_31798] +[group_31799] +[group_31800] +[group_31801] +[group_31802] +[group_31803] +[group_31804] +[group_31805] +[group_31806] +[group_31807] +[group_31808] +[group_31809] +[group_31810] +[group_31811] +[group_31812] +[group_31813] +[group_31814] +[group_31815] +[group_31816] +[group_31817] +[group_31818] +[group_31819] +[group_31820] +[group_31821] +[group_31822] +[group_31823] +[group_31824] +[group_31825] +[group_31826] +[group_31827] +[group_31828] +[group_31829] +[group_31830] +[group_31831] +[group_31832] +[group_31833] +[group_31834] +[group_31835] +[group_31836] +[group_31837] +[group_31838] +[group_31839] +[group_31840] +[group_31841] +[group_31842] +[group_31843] +[group_31844] +[group_31845] +[group_31846] +[group_31847] +[group_31848] +[group_31849] +[group_31850] +[group_31851] +[group_31852] +[group_31853] +[group_31854] +[group_31855] +[group_31856] +[group_31857] +[group_31858] +[group_31859] +[group_31860] +[group_31861] +[group_31862] +[group_31863] +[group_31864] +[group_31865] +[group_31866] +[group_31867] +[group_31868] +[group_31869] +[group_31870] +[group_31871] +[group_31872] +[group_31873] +[group_31874] +[group_31875] +[group_31876] +[group_31877] +[group_31878] +[group_31879] +[group_31880] +[group_31881] +[group_31882] +[group_31883] +[group_31884] +[group_31885] +[group_31886] +[group_31887] +[group_31888] +[group_31889] +[group_31890] +[group_31891] +[group_31892] +[group_31893] +[group_31894] +[group_31895] +[group_31896] +[group_31897] +[group_31898] +[group_31899] +[group_31900] +[group_31901] +[group_31902] +[group_31903] +[group_31904] +[group_31905] +[group_31906] +[group_31907] +[group_31908] +[group_31909] +[group_31910] +[group_31911] +[group_31912] +[group_31913] +[group_31914] +[group_31915] +[group_31916] +[group_31917] +[group_31918] +[group_31919] +[group_31920] +[group_31921] +[group_31922] +[group_31923] +[group_31924] +[group_31925] +[group_31926] +[group_31927] +[group_31928] +[group_31929] +[group_31930] +[group_31931] +[group_31932] +[group_31933] +[group_31934] +[group_31935] +[group_31936] +[group_31937] +[group_31938] +[group_31939] +[group_31940] +[group_31941] +[group_31942] +[group_31943] +[group_31944] +[group_31945] +[group_31946] +[group_31947] +[group_31948] +[group_31949] +[group_31950] +[group_31951] +[group_31952] +[group_31953] +[group_31954] +[group_31955] +[group_31956] +[group_31957] +[group_31958] +[group_31959] +[group_31960] +[group_31961] +[group_31962] +[group_31963] +[group_31964] +[group_31965] +[group_31966] +[group_31967] +[group_31968] +[group_31969] +[group_31970] +[group_31971] +[group_31972] +[group_31973] +[group_31974] +[group_31975] +[group_31976] +[group_31977] +[group_31978] +[group_31979] +[group_31980] +[group_31981] +[group_31982] +[group_31983] +[group_31984] +[group_31985] +[group_31986] +[group_31987] +[group_31988] +[group_31989] +[group_31990] +[group_31991] +[group_31992] +[group_31993] +[group_31994] +[group_31995] +[group_31996] +[group_31997] +[group_31998] +[group_31999] +[group_32000] +[group_32001] +[group_32002] +[group_32003] +[group_32004] +[group_32005] +[group_32006] +[group_32007] +[group_32008] +[group_32009] +[group_32010] +[group_32011] +[group_32012] +[group_32013] +[group_32014] +[group_32015] +[group_32016] +[group_32017] +[group_32018] +[group_32019] +[group_32020] +[group_32021] +[group_32022] +[group_32023] +[group_32024] +[group_32025] +[group_32026] +[group_32027] +[group_32028] +[group_32029] +[group_32030] +[group_32031] +[group_32032] +[group_32033] +[group_32034] +[group_32035] +[group_32036] +[group_32037] +[group_32038] +[group_32039] +[group_32040] +[group_32041] +[group_32042] +[group_32043] +[group_32044] +[group_32045] +[group_32046] +[group_32047] +[group_32048] +[group_32049] +[group_32050] +[group_32051] +[group_32052] +[group_32053] +[group_32054] +[group_32055] +[group_32056] +[group_32057] +[group_32058] +[group_32059] +[group_32060] +[group_32061] +[group_32062] +[group_32063] +[group_32064] +[group_32065] +[group_32066] +[group_32067] +[group_32068] +[group_32069] +[group_32070] +[group_32071] +[group_32072] +[group_32073] +[group_32074] +[group_32075] +[group_32076] +[group_32077] +[group_32078] +[group_32079] +[group_32080] +[group_32081] +[group_32082] +[group_32083] +[group_32084] +[group_32085] +[group_32086] +[group_32087] +[group_32088] +[group_32089] +[group_32090] +[group_32091] +[group_32092] +[group_32093] +[group_32094] +[group_32095] +[group_32096] +[group_32097] +[group_32098] +[group_32099] +[group_32100] +[group_32101] +[group_32102] +[group_32103] +[group_32104] +[group_32105] +[group_32106] +[group_32107] +[group_32108] +[group_32109] +[group_32110] +[group_32111] +[group_32112] +[group_32113] +[group_32114] +[group_32115] +[group_32116] +[group_32117] +[group_32118] +[group_32119] +[group_32120] +[group_32121] +[group_32122] +[group_32123] +[group_32124] +[group_32125] +[group_32126] +[group_32127] +[group_32128] +[group_32129] +[group_32130] +[group_32131] +[group_32132] +[group_32133] +[group_32134] +[group_32135] +[group_32136] +[group_32137] +[group_32138] +[group_32139] +[group_32140] +[group_32141] +[group_32142] +[group_32143] +[group_32144] +[group_32145] +[group_32146] +[group_32147] +[group_32148] +[group_32149] +[group_32150] +[group_32151] +[group_32152] +[group_32153] +[group_32154] +[group_32155] +[group_32156] +[group_32157] +[group_32158] +[group_32159] +[group_32160] +[group_32161] +[group_32162] +[group_32163] +[group_32164] +[group_32165] +[group_32166] +[group_32167] +[group_32168] +[group_32169] +[group_32170] +[group_32171] +[group_32172] +[group_32173] +[group_32174] +[group_32175] +[group_32176] +[group_32177] +[group_32178] +[group_32179] +[group_32180] +[group_32181] +[group_32182] +[group_32183] +[group_32184] +[group_32185] +[group_32186] +[group_32187] +[group_32188] +[group_32189] +[group_32190] +[group_32191] +[group_32192] +[group_32193] +[group_32194] +[group_32195] +[group_32196] +[group_32197] +[group_32198] +[group_32199] +[group_32200] +[group_32201] +[group_32202] +[group_32203] +[group_32204] +[group_32205] +[group_32206] +[group_32207] +[group_32208] +[group_32209] +[group_32210] +[group_32211] +[group_32212] +[group_32213] +[group_32214] +[group_32215] +[group_32216] +[group_32217] +[group_32218] +[group_32219] +[group_32220] +[group_32221] +[group_32222] +[group_32223] +[group_32224] +[group_32225] +[group_32226] +[group_32227] +[group_32228] +[group_32229] +[group_32230] +[group_32231] +[group_32232] +[group_32233] +[group_32234] +[group_32235] +[group_32236] +[group_32237] +[group_32238] +[group_32239] +[group_32240] +[group_32241] +[group_32242] +[group_32243] +[group_32244] +[group_32245] +[group_32246] +[group_32247] +[group_32248] +[group_32249] +[group_32250] +[group_32251] +[group_32252] +[group_32253] +[group_32254] +[group_32255] +[group_32256] +[group_32257] +[group_32258] +[group_32259] +[group_32260] +[group_32261] +[group_32262] +[group_32263] +[group_32264] +[group_32265] +[group_32266] +[group_32267] +[group_32268] +[group_32269] +[group_32270] +[group_32271] +[group_32272] +[group_32273] +[group_32274] +[group_32275] +[group_32276] +[group_32277] +[group_32278] +[group_32279] +[group_32280] +[group_32281] +[group_32282] +[group_32283] +[group_32284] +[group_32285] +[group_32286] +[group_32287] +[group_32288] +[group_32289] +[group_32290] +[group_32291] +[group_32292] +[group_32293] +[group_32294] +[group_32295] +[group_32296] +[group_32297] +[group_32298] +[group_32299] +[group_32300] +[group_32301] +[group_32302] +[group_32303] +[group_32304] +[group_32305] +[group_32306] +[group_32307] +[group_32308] +[group_32309] +[group_32310] +[group_32311] +[group_32312] +[group_32313] +[group_32314] +[group_32315] +[group_32316] +[group_32317] +[group_32318] +[group_32319] +[group_32320] +[group_32321] +[group_32322] +[group_32323] +[group_32324] +[group_32325] +[group_32326] +[group_32327] +[group_32328] +[group_32329] +[group_32330] +[group_32331] +[group_32332] +[group_32333] +[group_32334] +[group_32335] +[group_32336] +[group_32337] +[group_32338] +[group_32339] +[group_32340] +[group_32341] +[group_32342] +[group_32343] +[group_32344] +[group_32345] +[group_32346] +[group_32347] +[group_32348] +[group_32349] +[group_32350] +[group_32351] +[group_32352] +[group_32353] +[group_32354] +[group_32355] +[group_32356] +[group_32357] +[group_32358] +[group_32359] +[group_32360] +[group_32361] +[group_32362] +[group_32363] +[group_32364] +[group_32365] +[group_32366] +[group_32367] +[group_32368] +[group_32369] +[group_32370] +[group_32371] +[group_32372] +[group_32373] +[group_32374] +[group_32375] +[group_32376] +[group_32377] +[group_32378] +[group_32379] +[group_32380] +[group_32381] +[group_32382] +[group_32383] +[group_32384] +[group_32385] +[group_32386] +[group_32387] +[group_32388] +[group_32389] +[group_32390] +[group_32391] +[group_32392] +[group_32393] +[group_32394] +[group_32395] +[group_32396] +[group_32397] +[group_32398] +[group_32399] +[group_32400] +[group_32401] +[group_32402] +[group_32403] +[group_32404] +[group_32405] +[group_32406] +[group_32407] +[group_32408] +[group_32409] +[group_32410] +[group_32411] +[group_32412] +[group_32413] +[group_32414] +[group_32415] +[group_32416] +[group_32417] +[group_32418] +[group_32419] +[group_32420] +[group_32421] +[group_32422] +[group_32423] +[group_32424] +[group_32425] +[group_32426] +[group_32427] +[group_32428] +[group_32429] +[group_32430] +[group_32431] +[group_32432] +[group_32433] +[group_32434] +[group_32435] +[group_32436] +[group_32437] +[group_32438] +[group_32439] +[group_32440] +[group_32441] +[group_32442] +[group_32443] +[group_32444] +[group_32445] +[group_32446] +[group_32447] +[group_32448] +[group_32449] +[group_32450] +[group_32451] +[group_32452] +[group_32453] +[group_32454] +[group_32455] +[group_32456] +[group_32457] +[group_32458] +[group_32459] +[group_32460] +[group_32461] +[group_32462] +[group_32463] +[group_32464] +[group_32465] +[group_32466] +[group_32467] +[group_32468] +[group_32469] +[group_32470] +[group_32471] +[group_32472] +[group_32473] +[group_32474] +[group_32475] +[group_32476] +[group_32477] +[group_32478] +[group_32479] +[group_32480] +[group_32481] +[group_32482] +[group_32483] +[group_32484] +[group_32485] +[group_32486] +[group_32487] +[group_32488] +[group_32489] +[group_32490] +[group_32491] +[group_32492] +[group_32493] +[group_32494] +[group_32495] +[group_32496] +[group_32497] +[group_32498] +[group_32499] +[group_32500] +[group_32501] +[group_32502] +[group_32503] +[group_32504] +[group_32505] +[group_32506] +[group_32507] +[group_32508] +[group_32509] +[group_32510] +[group_32511] +[group_32512] +[group_32513] +[group_32514] +[group_32515] +[group_32516] +[group_32517] +[group_32518] +[group_32519] +[group_32520] +[group_32521] +[group_32522] +[group_32523] +[group_32524] +[group_32525] +[group_32526] +[group_32527] +[group_32528] +[group_32529] +[group_32530] +[group_32531] +[group_32532] +[group_32533] +[group_32534] +[group_32535] +[group_32536] +[group_32537] +[group_32538] +[group_32539] +[group_32540] +[group_32541] +[group_32542] +[group_32543] +[group_32544] +[group_32545] +[group_32546] +[group_32547] +[group_32548] +[group_32549] +[group_32550] +[group_32551] +[group_32552] +[group_32553] +[group_32554] +[group_32555] +[group_32556] +[group_32557] +[group_32558] +[group_32559] +[group_32560] +[group_32561] +[group_32562] +[group_32563] +[group_32564] +[group_32565] +[group_32566] +[group_32567] +[group_32568] +[group_32569] +[group_32570] +[group_32571] +[group_32572] +[group_32573] +[group_32574] +[group_32575] +[group_32576] +[group_32577] +[group_32578] +[group_32579] +[group_32580] +[group_32581] +[group_32582] +[group_32583] +[group_32584] +[group_32585] +[group_32586] +[group_32587] +[group_32588] +[group_32589] +[group_32590] +[group_32591] +[group_32592] +[group_32593] +[group_32594] +[group_32595] +[group_32596] +[group_32597] +[group_32598] +[group_32599] +[group_32600] +[group_32601] +[group_32602] +[group_32603] +[group_32604] +[group_32605] +[group_32606] +[group_32607] +[group_32608] +[group_32609] +[group_32610] +[group_32611] +[group_32612] +[group_32613] +[group_32614] +[group_32615] +[group_32616] +[group_32617] +[group_32618] +[group_32619] +[group_32620] +[group_32621] +[group_32622] +[group_32623] +[group_32624] +[group_32625] +[group_32626] +[group_32627] +[group_32628] +[group_32629] +[group_32630] +[group_32631] +[group_32632] +[group_32633] +[group_32634] +[group_32635] +[group_32636] +[group_32637] +[group_32638] +[group_32639] +[group_32640] +[group_32641] +[group_32642] +[group_32643] +[group_32644] +[group_32645] +[group_32646] +[group_32647] +[group_32648] +[group_32649] +[group_32650] +[group_32651] +[group_32652] +[group_32653] +[group_32654] +[group_32655] +[group_32656] +[group_32657] +[group_32658] +[group_32659] +[group_32660] +[group_32661] +[group_32662] +[group_32663] +[group_32664] +[group_32665] +[group_32666] +[group_32667] +[group_32668] +[group_32669] +[group_32670] +[group_32671] +[group_32672] +[group_32673] +[group_32674] +[group_32675] +[group_32676] +[group_32677] +[group_32678] +[group_32679] +[group_32680] +[group_32681] +[group_32682] +[group_32683] +[group_32684] +[group_32685] +[group_32686] +[group_32687] +[group_32688] +[group_32689] +[group_32690] +[group_32691] +[group_32692] +[group_32693] +[group_32694] +[group_32695] +[group_32696] +[group_32697] +[group_32698] +[group_32699] +[group_32700] +[group_32701] +[group_32702] +[group_32703] +[group_32704] +[group_32705] +[group_32706] +[group_32707] +[group_32708] +[group_32709] +[group_32710] +[group_32711] +[group_32712] +[group_32713] +[group_32714] +[group_32715] +[group_32716] +[group_32717] +[group_32718] +[group_32719] +[group_32720] +[group_32721] +[group_32722] +[group_32723] +[group_32724] +[group_32725] +[group_32726] +[group_32727] +[group_32728] +[group_32729] +[group_32730] +[group_32731] +[group_32732] +[group_32733] +[group_32734] +[group_32735] +[group_32736] +[group_32737] +[group_32738] +[group_32739] +[group_32740] +[group_32741] +[group_32742] +[group_32743] +[group_32744] +[group_32745] +[group_32746] +[group_32747] +[group_32748] +[group_32749] +[group_32750] +[group_32751] +[group_32752] +[group_32753] +[group_32754] +[group_32755] +[group_32756] +[group_32757] +[group_32758] +[group_32759] +[group_32760] +[group_32761] +[group_32762] +[group_32763] +[group_32764] +[group_32765] +[group_32766] +[group_32767] +[group_32768] +[group_32769] +[group_32770] +[group_32771] +[group_32772] +[group_32773] +[group_32774] +[group_32775] +[group_32776] +[group_32777] +[group_32778] +[group_32779] +[group_32780] +[group_32781] +[group_32782] +[group_32783] +[group_32784] +[group_32785] +[group_32786] +[group_32787] +[group_32788] +[group_32789] +[group_32790] +[group_32791] +[group_32792] +[group_32793] +[group_32794] +[group_32795] +[group_32796] +[group_32797] +[group_32798] +[group_32799] +[group_32800] +[group_32801] +[group_32802] +[group_32803] +[group_32804] +[group_32805] +[group_32806] +[group_32807] +[group_32808] +[group_32809] +[group_32810] +[group_32811] +[group_32812] +[group_32813] +[group_32814] +[group_32815] +[group_32816] +[group_32817] +[group_32818] +[group_32819] +[group_32820] +[group_32821] +[group_32822] +[group_32823] +[group_32824] +[group_32825] +[group_32826] +[group_32827] +[group_32828] +[group_32829] +[group_32830] +[group_32831] +[group_32832] +[group_32833] +[group_32834] +[group_32835] +[group_32836] +[group_32837] +[group_32838] +[group_32839] +[group_32840] +[group_32841] +[group_32842] +[group_32843] +[group_32844] +[group_32845] +[group_32846] +[group_32847] +[group_32848] +[group_32849] +[group_32850] +[group_32851] +[group_32852] +[group_32853] +[group_32854] +[group_32855] +[group_32856] +[group_32857] +[group_32858] +[group_32859] +[group_32860] +[group_32861] +[group_32862] +[group_32863] +[group_32864] +[group_32865] +[group_32866] +[group_32867] +[group_32868] +[group_32869] +[group_32870] +[group_32871] +[group_32872] +[group_32873] +[group_32874] +[group_32875] +[group_32876] +[group_32877] +[group_32878] +[group_32879] +[group_32880] +[group_32881] +[group_32882] +[group_32883] +[group_32884] +[group_32885] +[group_32886] +[group_32887] +[group_32888] +[group_32889] +[group_32890] +[group_32891] +[group_32892] +[group_32893] +[group_32894] +[group_32895] +[group_32896] +[group_32897] +[group_32898] +[group_32899] +[group_32900] +[group_32901] +[group_32902] +[group_32903] +[group_32904] +[group_32905] +[group_32906] +[group_32907] +[group_32908] +[group_32909] +[group_32910] +[group_32911] +[group_32912] +[group_32913] +[group_32914] +[group_32915] +[group_32916] +[group_32917] +[group_32918] +[group_32919] +[group_32920] +[group_32921] +[group_32922] +[group_32923] +[group_32924] +[group_32925] +[group_32926] +[group_32927] +[group_32928] +[group_32929] +[group_32930] +[group_32931] +[group_32932] +[group_32933] +[group_32934] +[group_32935] +[group_32936] +[group_32937] +[group_32938] +[group_32939] +[group_32940] +[group_32941] +[group_32942] +[group_32943] +[group_32944] +[group_32945] +[group_32946] +[group_32947] +[group_32948] +[group_32949] +[group_32950] +[group_32951] +[group_32952] +[group_32953] +[group_32954] +[group_32955] +[group_32956] +[group_32957] +[group_32958] +[group_32959] +[group_32960] +[group_32961] +[group_32962] +[group_32963] +[group_32964] +[group_32965] +[group_32966] +[group_32967] +[group_32968] +[group_32969] +[group_32970] +[group_32971] +[group_32972] +[group_32973] +[group_32974] +[group_32975] +[group_32976] +[group_32977] +[group_32978] +[group_32979] +[group_32980] +[group_32981] +[group_32982] +[group_32983] +[group_32984] +[group_32985] +[group_32986] +[group_32987] +[group_32988] +[group_32989] +[group_32990] +[group_32991] +[group_32992] +[group_32993] +[group_32994] +[group_32995] +[group_32996] +[group_32997] +[group_32998] +[group_32999] +[group_33000] +[group_33001] +[group_33002] +[group_33003] +[group_33004] +[group_33005] +[group_33006] +[group_33007] +[group_33008] +[group_33009] +[group_33010] +[group_33011] +[group_33012] +[group_33013] +[group_33014] +[group_33015] +[group_33016] +[group_33017] +[group_33018] +[group_33019] +[group_33020] +[group_33021] +[group_33022] +[group_33023] +[group_33024] +[group_33025] +[group_33026] +[group_33027] +[group_33028] +[group_33029] +[group_33030] +[group_33031] +[group_33032] +[group_33033] +[group_33034] +[group_33035] +[group_33036] +[group_33037] +[group_33038] +[group_33039] +[group_33040] +[group_33041] +[group_33042] +[group_33043] +[group_33044] +[group_33045] +[group_33046] +[group_33047] +[group_33048] +[group_33049] +[group_33050] +[group_33051] +[group_33052] +[group_33053] +[group_33054] +[group_33055] +[group_33056] +[group_33057] +[group_33058] +[group_33059] +[group_33060] +[group_33061] +[group_33062] +[group_33063] +[group_33064] +[group_33065] +[group_33066] +[group_33067] +[group_33068] +[group_33069] +[group_33070] +[group_33071] +[group_33072] +[group_33073] +[group_33074] +[group_33075] +[group_33076] +[group_33077] +[group_33078] +[group_33079] +[group_33080] +[group_33081] +[group_33082] +[group_33083] +[group_33084] +[group_33085] +[group_33086] +[group_33087] +[group_33088] +[group_33089] +[group_33090] +[group_33091] +[group_33092] +[group_33093] +[group_33094] +[group_33095] +[group_33096] +[group_33097] +[group_33098] +[group_33099] +[group_33100] +[group_33101] +[group_33102] +[group_33103] +[group_33104] +[group_33105] +[group_33106] +[group_33107] +[group_33108] +[group_33109] +[group_33110] +[group_33111] +[group_33112] +[group_33113] +[group_33114] +[group_33115] +[group_33116] +[group_33117] +[group_33118] +[group_33119] +[group_33120] +[group_33121] +[group_33122] +[group_33123] +[group_33124] +[group_33125] +[group_33126] +[group_33127] +[group_33128] +[group_33129] +[group_33130] +[group_33131] +[group_33132] +[group_33133] +[group_33134] +[group_33135] +[group_33136] +[group_33137] +[group_33138] +[group_33139] +[group_33140] +[group_33141] +[group_33142] +[group_33143] +[group_33144] +[group_33145] +[group_33146] +[group_33147] +[group_33148] +[group_33149] +[group_33150] +[group_33151] +[group_33152] +[group_33153] +[group_33154] +[group_33155] +[group_33156] +[group_33157] +[group_33158] +[group_33159] +[group_33160] +[group_33161] +[group_33162] +[group_33163] +[group_33164] +[group_33165] +[group_33166] +[group_33167] +[group_33168] +[group_33169] +[group_33170] +[group_33171] +[group_33172] +[group_33173] +[group_33174] +[group_33175] +[group_33176] +[group_33177] +[group_33178] +[group_33179] +[group_33180] +[group_33181] +[group_33182] +[group_33183] +[group_33184] +[group_33185] +[group_33186] +[group_33187] +[group_33188] +[group_33189] +[group_33190] +[group_33191] +[group_33192] +[group_33193] +[group_33194] +[group_33195] +[group_33196] +[group_33197] +[group_33198] +[group_33199] +[group_33200] +[group_33201] +[group_33202] +[group_33203] +[group_33204] +[group_33205] +[group_33206] +[group_33207] +[group_33208] +[group_33209] +[group_33210] +[group_33211] +[group_33212] +[group_33213] +[group_33214] +[group_33215] +[group_33216] +[group_33217] +[group_33218] +[group_33219] +[group_33220] +[group_33221] +[group_33222] +[group_33223] +[group_33224] +[group_33225] +[group_33226] +[group_33227] +[group_33228] +[group_33229] +[group_33230] +[group_33231] +[group_33232] +[group_33233] +[group_33234] +[group_33235] +[group_33236] +[group_33237] +[group_33238] +[group_33239] +[group_33240] +[group_33241] +[group_33242] +[group_33243] +[group_33244] +[group_33245] +[group_33246] +[group_33247] +[group_33248] +[group_33249] +[group_33250] +[group_33251] +[group_33252] +[group_33253] +[group_33254] +[group_33255] +[group_33256] +[group_33257] +[group_33258] +[group_33259] +[group_33260] +[group_33261] +[group_33262] +[group_33263] +[group_33264] +[group_33265] +[group_33266] +[group_33267] +[group_33268] +[group_33269] +[group_33270] +[group_33271] +[group_33272] +[group_33273] +[group_33274] +[group_33275] +[group_33276] +[group_33277] +[group_33278] +[group_33279] +[group_33280] +[group_33281] +[group_33282] +[group_33283] +[group_33284] +[group_33285] +[group_33286] +[group_33287] +[group_33288] +[group_33289] +[group_33290] +[group_33291] +[group_33292] +[group_33293] +[group_33294] +[group_33295] +[group_33296] +[group_33297] +[group_33298] +[group_33299] +[group_33300] +[group_33301] +[group_33302] +[group_33303] +[group_33304] +[group_33305] +[group_33306] +[group_33307] +[group_33308] +[group_33309] +[group_33310] +[group_33311] +[group_33312] +[group_33313] +[group_33314] +[group_33315] +[group_33316] +[group_33317] +[group_33318] +[group_33319] +[group_33320] +[group_33321] +[group_33322] +[group_33323] +[group_33324] +[group_33325] +[group_33326] +[group_33327] +[group_33328] +[group_33329] +[group_33330] +[group_33331] +[group_33332] +[group_33333] +[group_33334] +[group_33335] +[group_33336] +[group_33337] +[group_33338] +[group_33339] +[group_33340] +[group_33341] +[group_33342] +[group_33343] +[group_33344] +[group_33345] +[group_33346] +[group_33347] +[group_33348] +[group_33349] +[group_33350] +[group_33351] +[group_33352] +[group_33353] +[group_33354] +[group_33355] +[group_33356] +[group_33357] +[group_33358] +[group_33359] +[group_33360] +[group_33361] +[group_33362] +[group_33363] +[group_33364] +[group_33365] +[group_33366] +[group_33367] +[group_33368] +[group_33369] +[group_33370] +[group_33371] +[group_33372] +[group_33373] +[group_33374] +[group_33375] +[group_33376] +[group_33377] +[group_33378] +[group_33379] +[group_33380] +[group_33381] +[group_33382] +[group_33383] +[group_33384] +[group_33385] +[group_33386] +[group_33387] +[group_33388] +[group_33389] +[group_33390] +[group_33391] +[group_33392] +[group_33393] +[group_33394] +[group_33395] +[group_33396] +[group_33397] +[group_33398] +[group_33399] +[group_33400] +[group_33401] +[group_33402] +[group_33403] +[group_33404] +[group_33405] +[group_33406] +[group_33407] +[group_33408] +[group_33409] +[group_33410] +[group_33411] +[group_33412] +[group_33413] +[group_33414] +[group_33415] +[group_33416] +[group_33417] +[group_33418] +[group_33419] +[group_33420] +[group_33421] +[group_33422] +[group_33423] +[group_33424] +[group_33425] +[group_33426] +[group_33427] +[group_33428] +[group_33429] +[group_33430] +[group_33431] +[group_33432] +[group_33433] +[group_33434] +[group_33435] +[group_33436] +[group_33437] +[group_33438] +[group_33439] +[group_33440] +[group_33441] +[group_33442] +[group_33443] +[group_33444] +[group_33445] +[group_33446] +[group_33447] +[group_33448] +[group_33449] +[group_33450] +[group_33451] +[group_33452] +[group_33453] +[group_33454] +[group_33455] +[group_33456] +[group_33457] +[group_33458] +[group_33459] +[group_33460] +[group_33461] +[group_33462] +[group_33463] +[group_33464] +[group_33465] +[group_33466] +[group_33467] +[group_33468] +[group_33469] +[group_33470] +[group_33471] +[group_33472] +[group_33473] +[group_33474] +[group_33475] +[group_33476] +[group_33477] +[group_33478] +[group_33479] +[group_33480] +[group_33481] +[group_33482] +[group_33483] +[group_33484] +[group_33485] +[group_33486] +[group_33487] +[group_33488] +[group_33489] +[group_33490] +[group_33491] +[group_33492] +[group_33493] +[group_33494] +[group_33495] +[group_33496] +[group_33497] +[group_33498] +[group_33499] +[group_33500] +[group_33501] +[group_33502] +[group_33503] +[group_33504] +[group_33505] +[group_33506] +[group_33507] +[group_33508] +[group_33509] +[group_33510] +[group_33511] +[group_33512] +[group_33513] +[group_33514] +[group_33515] +[group_33516] +[group_33517] +[group_33518] +[group_33519] +[group_33520] +[group_33521] +[group_33522] +[group_33523] +[group_33524] +[group_33525] +[group_33526] +[group_33527] +[group_33528] +[group_33529] +[group_33530] +[group_33531] +[group_33532] +[group_33533] +[group_33534] +[group_33535] +[group_33536] +[group_33537] +[group_33538] +[group_33539] +[group_33540] +[group_33541] +[group_33542] +[group_33543] +[group_33544] +[group_33545] +[group_33546] +[group_33547] +[group_33548] +[group_33549] +[group_33550] +[group_33551] +[group_33552] +[group_33553] +[group_33554] +[group_33555] +[group_33556] +[group_33557] +[group_33558] +[group_33559] +[group_33560] +[group_33561] +[group_33562] +[group_33563] +[group_33564] +[group_33565] +[group_33566] +[group_33567] +[group_33568] +[group_33569] +[group_33570] +[group_33571] +[group_33572] +[group_33573] +[group_33574] +[group_33575] +[group_33576] +[group_33577] +[group_33578] +[group_33579] +[group_33580] +[group_33581] +[group_33582] +[group_33583] +[group_33584] +[group_33585] +[group_33586] +[group_33587] +[group_33588] +[group_33589] +[group_33590] +[group_33591] +[group_33592] +[group_33593] +[group_33594] +[group_33595] +[group_33596] +[group_33597] +[group_33598] +[group_33599] +[group_33600] +[group_33601] +[group_33602] +[group_33603] +[group_33604] +[group_33605] +[group_33606] +[group_33607] +[group_33608] +[group_33609] +[group_33610] +[group_33611] +[group_33612] +[group_33613] +[group_33614] +[group_33615] +[group_33616] +[group_33617] +[group_33618] +[group_33619] +[group_33620] +[group_33621] +[group_33622] +[group_33623] +[group_33624] +[group_33625] +[group_33626] +[group_33627] +[group_33628] +[group_33629] +[group_33630] +[group_33631] +[group_33632] +[group_33633] +[group_33634] +[group_33635] +[group_33636] +[group_33637] +[group_33638] +[group_33639] +[group_33640] +[group_33641] +[group_33642] +[group_33643] +[group_33644] +[group_33645] +[group_33646] +[group_33647] +[group_33648] +[group_33649] +[group_33650] +[group_33651] +[group_33652] +[group_33653] +[group_33654] +[group_33655] +[group_33656] +[group_33657] +[group_33658] +[group_33659] +[group_33660] +[group_33661] +[group_33662] +[group_33663] +[group_33664] +[group_33665] +[group_33666] +[group_33667] +[group_33668] +[group_33669] +[group_33670] +[group_33671] +[group_33672] +[group_33673] +[group_33674] +[group_33675] +[group_33676] +[group_33677] +[group_33678] +[group_33679] +[group_33680] +[group_33681] +[group_33682] +[group_33683] +[group_33684] +[group_33685] +[group_33686] +[group_33687] +[group_33688] +[group_33689] +[group_33690] +[group_33691] +[group_33692] +[group_33693] +[group_33694] +[group_33695] +[group_33696] +[group_33697] +[group_33698] +[group_33699] +[group_33700] +[group_33701] +[group_33702] +[group_33703] +[group_33704] +[group_33705] +[group_33706] +[group_33707] +[group_33708] +[group_33709] +[group_33710] +[group_33711] +[group_33712] +[group_33713] +[group_33714] +[group_33715] +[group_33716] +[group_33717] +[group_33718] +[group_33719] +[group_33720] +[group_33721] +[group_33722] +[group_33723] +[group_33724] +[group_33725] +[group_33726] +[group_33727] +[group_33728] +[group_33729] +[group_33730] +[group_33731] +[group_33732] +[group_33733] +[group_33734] +[group_33735] +[group_33736] +[group_33737] +[group_33738] +[group_33739] +[group_33740] +[group_33741] +[group_33742] +[group_33743] +[group_33744] +[group_33745] +[group_33746] +[group_33747] +[group_33748] +[group_33749] +[group_33750] +[group_33751] +[group_33752] +[group_33753] +[group_33754] +[group_33755] +[group_33756] +[group_33757] +[group_33758] +[group_33759] +[group_33760] +[group_33761] +[group_33762] +[group_33763] +[group_33764] +[group_33765] +[group_33766] +[group_33767] +[group_33768] +[group_33769] +[group_33770] +[group_33771] +[group_33772] +[group_33773] +[group_33774] +[group_33775] +[group_33776] +[group_33777] +[group_33778] +[group_33779] +[group_33780] +[group_33781] +[group_33782] +[group_33783] +[group_33784] +[group_33785] +[group_33786] +[group_33787] +[group_33788] +[group_33789] +[group_33790] +[group_33791] +[group_33792] +[group_33793] +[group_33794] +[group_33795] +[group_33796] +[group_33797] +[group_33798] +[group_33799] +[group_33800] +[group_33801] +[group_33802] +[group_33803] +[group_33804] +[group_33805] +[group_33806] +[group_33807] +[group_33808] +[group_33809] +[group_33810] +[group_33811] +[group_33812] +[group_33813] +[group_33814] +[group_33815] +[group_33816] +[group_33817] +[group_33818] +[group_33819] +[group_33820] +[group_33821] +[group_33822] +[group_33823] +[group_33824] +[group_33825] +[group_33826] +[group_33827] +[group_33828] +[group_33829] +[group_33830] +[group_33831] +[group_33832] +[group_33833] +[group_33834] +[group_33835] +[group_33836] +[group_33837] +[group_33838] +[group_33839] +[group_33840] +[group_33841] +[group_33842] +[group_33843] +[group_33844] +[group_33845] +[group_33846] +[group_33847] +[group_33848] +[group_33849] +[group_33850] +[group_33851] +[group_33852] +[group_33853] +[group_33854] +[group_33855] +[group_33856] +[group_33857] +[group_33858] +[group_33859] +[group_33860] +[group_33861] +[group_33862] +[group_33863] +[group_33864] +[group_33865] +[group_33866] +[group_33867] +[group_33868] +[group_33869] +[group_33870] +[group_33871] +[group_33872] +[group_33873] +[group_33874] +[group_33875] +[group_33876] +[group_33877] +[group_33878] +[group_33879] +[group_33880] +[group_33881] +[group_33882] +[group_33883] +[group_33884] +[group_33885] +[group_33886] +[group_33887] +[group_33888] +[group_33889] +[group_33890] +[group_33891] +[group_33892] +[group_33893] +[group_33894] +[group_33895] +[group_33896] +[group_33897] +[group_33898] +[group_33899] +[group_33900] +[group_33901] +[group_33902] +[group_33903] +[group_33904] +[group_33905] +[group_33906] +[group_33907] +[group_33908] +[group_33909] +[group_33910] +[group_33911] +[group_33912] +[group_33913] +[group_33914] +[group_33915] +[group_33916] +[group_33917] +[group_33918] +[group_33919] +[group_33920] +[group_33921] +[group_33922] +[group_33923] +[group_33924] +[group_33925] +[group_33926] +[group_33927] +[group_33928] +[group_33929] +[group_33930] +[group_33931] +[group_33932] +[group_33933] +[group_33934] +[group_33935] +[group_33936] +[group_33937] +[group_33938] +[group_33939] +[group_33940] +[group_33941] +[group_33942] +[group_33943] +[group_33944] +[group_33945] +[group_33946] +[group_33947] +[group_33948] +[group_33949] +[group_33950] +[group_33951] +[group_33952] +[group_33953] +[group_33954] +[group_33955] +[group_33956] +[group_33957] +[group_33958] +[group_33959] +[group_33960] +[group_33961] +[group_33962] +[group_33963] +[group_33964] +[group_33965] +[group_33966] +[group_33967] +[group_33968] +[group_33969] +[group_33970] +[group_33971] +[group_33972] +[group_33973] +[group_33974] +[group_33975] +[group_33976] +[group_33977] +[group_33978] +[group_33979] +[group_33980] +[group_33981] +[group_33982] +[group_33983] +[group_33984] +[group_33985] +[group_33986] +[group_33987] +[group_33988] +[group_33989] +[group_33990] +[group_33991] +[group_33992] +[group_33993] +[group_33994] +[group_33995] +[group_33996] +[group_33997] +[group_33998] +[group_33999] +[group_34000] +[group_34001] +[group_34002] +[group_34003] +[group_34004] +[group_34005] +[group_34006] +[group_34007] +[group_34008] +[group_34009] +[group_34010] +[group_34011] +[group_34012] +[group_34013] +[group_34014] +[group_34015] +[group_34016] +[group_34017] +[group_34018] +[group_34019] +[group_34020] +[group_34021] +[group_34022] +[group_34023] +[group_34024] +[group_34025] +[group_34026] +[group_34027] +[group_34028] +[group_34029] +[group_34030] +[group_34031] +[group_34032] +[group_34033] +[group_34034] +[group_34035] +[group_34036] +[group_34037] +[group_34038] +[group_34039] +[group_34040] +[group_34041] +[group_34042] +[group_34043] +[group_34044] +[group_34045] +[group_34046] +[group_34047] +[group_34048] +[group_34049] +[group_34050] +[group_34051] +[group_34052] +[group_34053] +[group_34054] +[group_34055] +[group_34056] +[group_34057] +[group_34058] +[group_34059] +[group_34060] +[group_34061] +[group_34062] +[group_34063] +[group_34064] +[group_34065] +[group_34066] +[group_34067] +[group_34068] +[group_34069] +[group_34070] +[group_34071] +[group_34072] +[group_34073] +[group_34074] +[group_34075] +[group_34076] +[group_34077] +[group_34078] +[group_34079] +[group_34080] +[group_34081] +[group_34082] +[group_34083] +[group_34084] +[group_34085] +[group_34086] +[group_34087] +[group_34088] +[group_34089] +[group_34090] +[group_34091] +[group_34092] +[group_34093] +[group_34094] +[group_34095] +[group_34096] +[group_34097] +[group_34098] +[group_34099] +[group_34100] +[group_34101] +[group_34102] +[group_34103] +[group_34104] +[group_34105] +[group_34106] +[group_34107] +[group_34108] +[group_34109] +[group_34110] +[group_34111] +[group_34112] +[group_34113] +[group_34114] +[group_34115] +[group_34116] +[group_34117] +[group_34118] +[group_34119] +[group_34120] +[group_34121] +[group_34122] +[group_34123] +[group_34124] +[group_34125] +[group_34126] +[group_34127] +[group_34128] +[group_34129] +[group_34130] +[group_34131] +[group_34132] +[group_34133] +[group_34134] +[group_34135] +[group_34136] +[group_34137] +[group_34138] +[group_34139] +[group_34140] +[group_34141] +[group_34142] +[group_34143] +[group_34144] +[group_34145] +[group_34146] +[group_34147] +[group_34148] +[group_34149] +[group_34150] +[group_34151] +[group_34152] +[group_34153] +[group_34154] +[group_34155] +[group_34156] +[group_34157] +[group_34158] +[group_34159] +[group_34160] +[group_34161] +[group_34162] +[group_34163] +[group_34164] +[group_34165] +[group_34166] +[group_34167] +[group_34168] +[group_34169] +[group_34170] +[group_34171] +[group_34172] +[group_34173] +[group_34174] +[group_34175] +[group_34176] +[group_34177] +[group_34178] +[group_34179] +[group_34180] +[group_34181] +[group_34182] +[group_34183] +[group_34184] +[group_34185] +[group_34186] +[group_34187] +[group_34188] +[group_34189] +[group_34190] +[group_34191] +[group_34192] +[group_34193] +[group_34194] +[group_34195] +[group_34196] +[group_34197] +[group_34198] +[group_34199] +[group_34200] +[group_34201] +[group_34202] +[group_34203] +[group_34204] +[group_34205] +[group_34206] +[group_34207] +[group_34208] +[group_34209] +[group_34210] +[group_34211] +[group_34212] +[group_34213] +[group_34214] +[group_34215] +[group_34216] +[group_34217] +[group_34218] +[group_34219] +[group_34220] +[group_34221] +[group_34222] +[group_34223] +[group_34224] +[group_34225] +[group_34226] +[group_34227] +[group_34228] +[group_34229] +[group_34230] +[group_34231] +[group_34232] +[group_34233] +[group_34234] +[group_34235] +[group_34236] +[group_34237] +[group_34238] +[group_34239] +[group_34240] +[group_34241] +[group_34242] +[group_34243] +[group_34244] +[group_34245] +[group_34246] +[group_34247] +[group_34248] +[group_34249] +[group_34250] +[group_34251] +[group_34252] +[group_34253] +[group_34254] +[group_34255] +[group_34256] +[group_34257] +[group_34258] +[group_34259] +[group_34260] +[group_34261] +[group_34262] +[group_34263] +[group_34264] +[group_34265] +[group_34266] +[group_34267] +[group_34268] +[group_34269] +[group_34270] +[group_34271] +[group_34272] +[group_34273] +[group_34274] +[group_34275] +[group_34276] +[group_34277] +[group_34278] +[group_34279] +[group_34280] +[group_34281] +[group_34282] +[group_34283] +[group_34284] +[group_34285] +[group_34286] +[group_34287] +[group_34288] +[group_34289] +[group_34290] +[group_34291] +[group_34292] +[group_34293] +[group_34294] +[group_34295] +[group_34296] +[group_34297] +[group_34298] +[group_34299] +[group_34300] +[group_34301] +[group_34302] +[group_34303] +[group_34304] +[group_34305] +[group_34306] +[group_34307] +[group_34308] +[group_34309] +[group_34310] +[group_34311] +[group_34312] +[group_34313] +[group_34314] +[group_34315] +[group_34316] +[group_34317] +[group_34318] +[group_34319] +[group_34320] +[group_34321] +[group_34322] +[group_34323] +[group_34324] +[group_34325] +[group_34326] +[group_34327] +[group_34328] +[group_34329] +[group_34330] +[group_34331] +[group_34332] +[group_34333] +[group_34334] +[group_34335] +[group_34336] +[group_34337] +[group_34338] +[group_34339] +[group_34340] +[group_34341] +[group_34342] +[group_34343] +[group_34344] +[group_34345] +[group_34346] +[group_34347] +[group_34348] +[group_34349] +[group_34350] +[group_34351] +[group_34352] +[group_34353] +[group_34354] +[group_34355] +[group_34356] +[group_34357] +[group_34358] +[group_34359] +[group_34360] +[group_34361] +[group_34362] +[group_34363] +[group_34364] +[group_34365] +[group_34366] +[group_34367] +[group_34368] +[group_34369] +[group_34370] +[group_34371] +[group_34372] +[group_34373] +[group_34374] +[group_34375] +[group_34376] +[group_34377] +[group_34378] +[group_34379] +[group_34380] +[group_34381] +[group_34382] +[group_34383] +[group_34384] +[group_34385] +[group_34386] +[group_34387] +[group_34388] +[group_34389] +[group_34390] +[group_34391] +[group_34392] +[group_34393] +[group_34394] +[group_34395] +[group_34396] +[group_34397] +[group_34398] +[group_34399] +[group_34400] +[group_34401] +[group_34402] +[group_34403] +[group_34404] +[group_34405] +[group_34406] +[group_34407] +[group_34408] +[group_34409] +[group_34410] +[group_34411] +[group_34412] +[group_34413] +[group_34414] +[group_34415] +[group_34416] +[group_34417] +[group_34418] +[group_34419] +[group_34420] +[group_34421] +[group_34422] +[group_34423] +[group_34424] +[group_34425] +[group_34426] +[group_34427] +[group_34428] +[group_34429] +[group_34430] +[group_34431] +[group_34432] +[group_34433] +[group_34434] +[group_34435] +[group_34436] +[group_34437] +[group_34438] +[group_34439] +[group_34440] +[group_34441] +[group_34442] +[group_34443] +[group_34444] +[group_34445] +[group_34446] +[group_34447] +[group_34448] +[group_34449] +[group_34450] +[group_34451] +[group_34452] +[group_34453] +[group_34454] +[group_34455] +[group_34456] +[group_34457] +[group_34458] +[group_34459] +[group_34460] +[group_34461] +[group_34462] +[group_34463] +[group_34464] +[group_34465] +[group_34466] +[group_34467] +[group_34468] +[group_34469] +[group_34470] +[group_34471] +[group_34472] +[group_34473] +[group_34474] +[group_34475] +[group_34476] +[group_34477] +[group_34478] +[group_34479] +[group_34480] +[group_34481] +[group_34482] +[group_34483] +[group_34484] +[group_34485] +[group_34486] +[group_34487] +[group_34488] +[group_34489] +[group_34490] +[group_34491] +[group_34492] +[group_34493] +[group_34494] +[group_34495] +[group_34496] +[group_34497] +[group_34498] +[group_34499] +[group_34500] +[group_34501] +[group_34502] +[group_34503] +[group_34504] +[group_34505] +[group_34506] +[group_34507] +[group_34508] +[group_34509] +[group_34510] +[group_34511] +[group_34512] +[group_34513] +[group_34514] +[group_34515] +[group_34516] +[group_34517] +[group_34518] +[group_34519] +[group_34520] +[group_34521] +[group_34522] +[group_34523] +[group_34524] +[group_34525] +[group_34526] +[group_34527] +[group_34528] +[group_34529] +[group_34530] +[group_34531] +[group_34532] +[group_34533] +[group_34534] +[group_34535] +[group_34536] +[group_34537] +[group_34538] +[group_34539] +[group_34540] +[group_34541] +[group_34542] +[group_34543] +[group_34544] +[group_34545] +[group_34546] +[group_34547] +[group_34548] +[group_34549] +[group_34550] +[group_34551] +[group_34552] +[group_34553] +[group_34554] +[group_34555] +[group_34556] +[group_34557] +[group_34558] +[group_34559] +[group_34560] +[group_34561] +[group_34562] +[group_34563] +[group_34564] +[group_34565] +[group_34566] +[group_34567] +[group_34568] +[group_34569] +[group_34570] +[group_34571] +[group_34572] +[group_34573] +[group_34574] +[group_34575] +[group_34576] +[group_34577] +[group_34578] +[group_34579] +[group_34580] +[group_34581] +[group_34582] +[group_34583] +[group_34584] +[group_34585] +[group_34586] +[group_34587] +[group_34588] +[group_34589] +[group_34590] +[group_34591] +[group_34592] +[group_34593] +[group_34594] +[group_34595] +[group_34596] +[group_34597] +[group_34598] +[group_34599] +[group_34600] +[group_34601] +[group_34602] +[group_34603] +[group_34604] +[group_34605] +[group_34606] +[group_34607] +[group_34608] +[group_34609] +[group_34610] +[group_34611] +[group_34612] +[group_34613] +[group_34614] +[group_34615] +[group_34616] +[group_34617] +[group_34618] +[group_34619] +[group_34620] +[group_34621] +[group_34622] +[group_34623] +[group_34624] +[group_34625] +[group_34626] +[group_34627] +[group_34628] +[group_34629] +[group_34630] +[group_34631] +[group_34632] +[group_34633] +[group_34634] +[group_34635] +[group_34636] +[group_34637] +[group_34638] +[group_34639] +[group_34640] +[group_34641] +[group_34642] +[group_34643] +[group_34644] +[group_34645] +[group_34646] +[group_34647] +[group_34648] +[group_34649] +[group_34650] +[group_34651] +[group_34652] +[group_34653] +[group_34654] +[group_34655] +[group_34656] +[group_34657] +[group_34658] +[group_34659] +[group_34660] +[group_34661] +[group_34662] +[group_34663] +[group_34664] +[group_34665] +[group_34666] +[group_34667] +[group_34668] +[group_34669] +[group_34670] +[group_34671] +[group_34672] +[group_34673] +[group_34674] +[group_34675] +[group_34676] +[group_34677] +[group_34678] +[group_34679] +[group_34680] +[group_34681] +[group_34682] +[group_34683] +[group_34684] +[group_34685] +[group_34686] +[group_34687] +[group_34688] +[group_34689] +[group_34690] +[group_34691] +[group_34692] +[group_34693] +[group_34694] +[group_34695] +[group_34696] +[group_34697] +[group_34698] +[group_34699] +[group_34700] +[group_34701] +[group_34702] +[group_34703] +[group_34704] +[group_34705] +[group_34706] +[group_34707] +[group_34708] +[group_34709] +[group_34710] +[group_34711] +[group_34712] +[group_34713] +[group_34714] +[group_34715] +[group_34716] +[group_34717] +[group_34718] +[group_34719] +[group_34720] +[group_34721] +[group_34722] +[group_34723] +[group_34724] +[group_34725] +[group_34726] +[group_34727] +[group_34728] +[group_34729] +[group_34730] +[group_34731] +[group_34732] +[group_34733] +[group_34734] +[group_34735] +[group_34736] +[group_34737] +[group_34738] +[group_34739] +[group_34740] +[group_34741] +[group_34742] +[group_34743] +[group_34744] +[group_34745] +[group_34746] +[group_34747] +[group_34748] +[group_34749] +[group_34750] +[group_34751] +[group_34752] +[group_34753] +[group_34754] +[group_34755] +[group_34756] +[group_34757] +[group_34758] +[group_34759] +[group_34760] +[group_34761] +[group_34762] +[group_34763] +[group_34764] +[group_34765] +[group_34766] +[group_34767] +[group_34768] +[group_34769] +[group_34770] +[group_34771] +[group_34772] +[group_34773] +[group_34774] +[group_34775] +[group_34776] +[group_34777] +[group_34778] +[group_34779] +[group_34780] +[group_34781] +[group_34782] +[group_34783] +[group_34784] +[group_34785] +[group_34786] +[group_34787] +[group_34788] +[group_34789] +[group_34790] +[group_34791] +[group_34792] +[group_34793] +[group_34794] +[group_34795] +[group_34796] +[group_34797] +[group_34798] +[group_34799] +[group_34800] +[group_34801] +[group_34802] +[group_34803] +[group_34804] +[group_34805] +[group_34806] +[group_34807] +[group_34808] +[group_34809] +[group_34810] +[group_34811] +[group_34812] +[group_34813] +[group_34814] +[group_34815] +[group_34816] +[group_34817] +[group_34818] +[group_34819] +[group_34820] +[group_34821] +[group_34822] +[group_34823] +[group_34824] +[group_34825] +[group_34826] +[group_34827] +[group_34828] +[group_34829] +[group_34830] +[group_34831] +[group_34832] +[group_34833] +[group_34834] +[group_34835] +[group_34836] +[group_34837] +[group_34838] +[group_34839] +[group_34840] +[group_34841] +[group_34842] +[group_34843] +[group_34844] +[group_34845] +[group_34846] +[group_34847] +[group_34848] +[group_34849] +[group_34850] +[group_34851] +[group_34852] +[group_34853] +[group_34854] +[group_34855] +[group_34856] +[group_34857] +[group_34858] +[group_34859] +[group_34860] +[group_34861] +[group_34862] +[group_34863] +[group_34864] +[group_34865] +[group_34866] +[group_34867] +[group_34868] +[group_34869] +[group_34870] +[group_34871] +[group_34872] +[group_34873] +[group_34874] +[group_34875] +[group_34876] +[group_34877] +[group_34878] +[group_34879] +[group_34880] +[group_34881] +[group_34882] +[group_34883] +[group_34884] +[group_34885] +[group_34886] +[group_34887] +[group_34888] +[group_34889] +[group_34890] +[group_34891] +[group_34892] +[group_34893] +[group_34894] +[group_34895] +[group_34896] +[group_34897] +[group_34898] +[group_34899] +[group_34900] +[group_34901] +[group_34902] +[group_34903] +[group_34904] +[group_34905] +[group_34906] +[group_34907] +[group_34908] +[group_34909] +[group_34910] +[group_34911] +[group_34912] +[group_34913] +[group_34914] +[group_34915] +[group_34916] +[group_34917] +[group_34918] +[group_34919] +[group_34920] +[group_34921] +[group_34922] +[group_34923] +[group_34924] +[group_34925] +[group_34926] +[group_34927] +[group_34928] +[group_34929] +[group_34930] +[group_34931] +[group_34932] +[group_34933] +[group_34934] +[group_34935] +[group_34936] +[group_34937] +[group_34938] +[group_34939] +[group_34940] +[group_34941] +[group_34942] +[group_34943] +[group_34944] +[group_34945] +[group_34946] +[group_34947] +[group_34948] +[group_34949] +[group_34950] +[group_34951] +[group_34952] +[group_34953] +[group_34954] +[group_34955] +[group_34956] +[group_34957] +[group_34958] +[group_34959] +[group_34960] +[group_34961] +[group_34962] +[group_34963] +[group_34964] +[group_34965] +[group_34966] +[group_34967] +[group_34968] +[group_34969] +[group_34970] +[group_34971] +[group_34972] +[group_34973] +[group_34974] +[group_34975] +[group_34976] +[group_34977] +[group_34978] +[group_34979] +[group_34980] +[group_34981] +[group_34982] +[group_34983] +[group_34984] +[group_34985] +[group_34986] +[group_34987] +[group_34988] +[group_34989] +[group_34990] +[group_34991] +[group_34992] +[group_34993] +[group_34994] +[group_34995] +[group_34996] +[group_34997] +[group_34998] +[group_34999] +[group_35000] +[group_35001] +[group_35002] +[group_35003] +[group_35004] +[group_35005] +[group_35006] +[group_35007] +[group_35008] +[group_35009] +[group_35010] +[group_35011] +[group_35012] +[group_35013] +[group_35014] +[group_35015] +[group_35016] +[group_35017] +[group_35018] +[group_35019] +[group_35020] +[group_35021] +[group_35022] +[group_35023] +[group_35024] +[group_35025] +[group_35026] +[group_35027] +[group_35028] +[group_35029] +[group_35030] +[group_35031] +[group_35032] +[group_35033] +[group_35034] +[group_35035] +[group_35036] +[group_35037] +[group_35038] +[group_35039] +[group_35040] +[group_35041] +[group_35042] +[group_35043] +[group_35044] +[group_35045] +[group_35046] +[group_35047] +[group_35048] +[group_35049] +[group_35050] +[group_35051] +[group_35052] +[group_35053] +[group_35054] +[group_35055] +[group_35056] +[group_35057] +[group_35058] +[group_35059] +[group_35060] +[group_35061] +[group_35062] +[group_35063] +[group_35064] +[group_35065] +[group_35066] +[group_35067] +[group_35068] +[group_35069] +[group_35070] +[group_35071] +[group_35072] +[group_35073] +[group_35074] +[group_35075] +[group_35076] +[group_35077] +[group_35078] +[group_35079] +[group_35080] +[group_35081] +[group_35082] +[group_35083] +[group_35084] +[group_35085] +[group_35086] +[group_35087] +[group_35088] +[group_35089] +[group_35090] +[group_35091] +[group_35092] +[group_35093] +[group_35094] +[group_35095] +[group_35096] +[group_35097] +[group_35098] +[group_35099] +[group_35100] +[group_35101] +[group_35102] +[group_35103] +[group_35104] +[group_35105] +[group_35106] +[group_35107] +[group_35108] +[group_35109] +[group_35110] +[group_35111] +[group_35112] +[group_35113] +[group_35114] +[group_35115] +[group_35116] +[group_35117] +[group_35118] +[group_35119] +[group_35120] +[group_35121] +[group_35122] +[group_35123] +[group_35124] +[group_35125] +[group_35126] +[group_35127] +[group_35128] +[group_35129] +[group_35130] +[group_35131] +[group_35132] +[group_35133] +[group_35134] +[group_35135] +[group_35136] +[group_35137] +[group_35138] +[group_35139] +[group_35140] +[group_35141] +[group_35142] +[group_35143] +[group_35144] +[group_35145] +[group_35146] +[group_35147] +[group_35148] +[group_35149] +[group_35150] +[group_35151] +[group_35152] +[group_35153] +[group_35154] +[group_35155] +[group_35156] +[group_35157] +[group_35158] +[group_35159] +[group_35160] +[group_35161] +[group_35162] +[group_35163] +[group_35164] +[group_35165] +[group_35166] +[group_35167] +[group_35168] +[group_35169] +[group_35170] +[group_35171] +[group_35172] +[group_35173] +[group_35174] +[group_35175] +[group_35176] +[group_35177] +[group_35178] +[group_35179] +[group_35180] +[group_35181] +[group_35182] +[group_35183] +[group_35184] +[group_35185] +[group_35186] +[group_35187] +[group_35188] +[group_35189] +[group_35190] +[group_35191] +[group_35192] +[group_35193] +[group_35194] +[group_35195] +[group_35196] +[group_35197] +[group_35198] +[group_35199] +[group_35200] +[group_35201] +[group_35202] +[group_35203] +[group_35204] +[group_35205] +[group_35206] +[group_35207] +[group_35208] +[group_35209] +[group_35210] +[group_35211] +[group_35212] +[group_35213] +[group_35214] +[group_35215] +[group_35216] +[group_35217] +[group_35218] +[group_35219] +[group_35220] +[group_35221] +[group_35222] +[group_35223] +[group_35224] +[group_35225] +[group_35226] +[group_35227] +[group_35228] +[group_35229] +[group_35230] +[group_35231] +[group_35232] +[group_35233] +[group_35234] +[group_35235] +[group_35236] +[group_35237] +[group_35238] +[group_35239] +[group_35240] +[group_35241] +[group_35242] +[group_35243] +[group_35244] +[group_35245] +[group_35246] +[group_35247] +[group_35248] +[group_35249] +[group_35250] +[group_35251] +[group_35252] +[group_35253] +[group_35254] +[group_35255] +[group_35256] +[group_35257] +[group_35258] +[group_35259] +[group_35260] +[group_35261] +[group_35262] +[group_35263] +[group_35264] +[group_35265] +[group_35266] +[group_35267] +[group_35268] +[group_35269] +[group_35270] +[group_35271] +[group_35272] +[group_35273] +[group_35274] +[group_35275] +[group_35276] +[group_35277] +[group_35278] +[group_35279] +[group_35280] +[group_35281] +[group_35282] +[group_35283] +[group_35284] +[group_35285] +[group_35286] +[group_35287] +[group_35288] +[group_35289] +[group_35290] +[group_35291] +[group_35292] +[group_35293] +[group_35294] +[group_35295] +[group_35296] +[group_35297] +[group_35298] +[group_35299] +[group_35300] +[group_35301] +[group_35302] +[group_35303] +[group_35304] +[group_35305] +[group_35306] +[group_35307] +[group_35308] +[group_35309] +[group_35310] +[group_35311] +[group_35312] +[group_35313] +[group_35314] +[group_35315] +[group_35316] +[group_35317] +[group_35318] +[group_35319] +[group_35320] +[group_35321] +[group_35322] +[group_35323] +[group_35324] +[group_35325] +[group_35326] +[group_35327] +[group_35328] +[group_35329] +[group_35330] +[group_35331] +[group_35332] +[group_35333] +[group_35334] +[group_35335] +[group_35336] +[group_35337] +[group_35338] +[group_35339] +[group_35340] +[group_35341] +[group_35342] +[group_35343] +[group_35344] +[group_35345] +[group_35346] +[group_35347] +[group_35348] +[group_35349] +[group_35350] +[group_35351] +[group_35352] +[group_35353] +[group_35354] +[group_35355] +[group_35356] +[group_35357] +[group_35358] +[group_35359] +[group_35360] +[group_35361] +[group_35362] +[group_35363] +[group_35364] +[group_35365] +[group_35366] +[group_35367] +[group_35368] +[group_35369] +[group_35370] +[group_35371] +[group_35372] +[group_35373] +[group_35374] +[group_35375] +[group_35376] +[group_35377] +[group_35378] +[group_35379] +[group_35380] +[group_35381] +[group_35382] +[group_35383] +[group_35384] +[group_35385] +[group_35386] +[group_35387] +[group_35388] +[group_35389] +[group_35390] +[group_35391] +[group_35392] +[group_35393] +[group_35394] +[group_35395] +[group_35396] +[group_35397] +[group_35398] +[group_35399] +[group_35400] +[group_35401] +[group_35402] +[group_35403] +[group_35404] +[group_35405] +[group_35406] +[group_35407] +[group_35408] +[group_35409] +[group_35410] +[group_35411] +[group_35412] +[group_35413] +[group_35414] +[group_35415] +[group_35416] +[group_35417] +[group_35418] +[group_35419] +[group_35420] +[group_35421] +[group_35422] +[group_35423] +[group_35424] +[group_35425] +[group_35426] +[group_35427] +[group_35428] +[group_35429] +[group_35430] +[group_35431] +[group_35432] +[group_35433] +[group_35434] +[group_35435] +[group_35436] +[group_35437] +[group_35438] +[group_35439] +[group_35440] +[group_35441] +[group_35442] +[group_35443] +[group_35444] +[group_35445] +[group_35446] +[group_35447] +[group_35448] +[group_35449] +[group_35450] +[group_35451] +[group_35452] +[group_35453] +[group_35454] +[group_35455] +[group_35456] +[group_35457] +[group_35458] +[group_35459] +[group_35460] +[group_35461] +[group_35462] +[group_35463] +[group_35464] +[group_35465] +[group_35466] +[group_35467] +[group_35468] +[group_35469] +[group_35470] +[group_35471] +[group_35472] +[group_35473] +[group_35474] +[group_35475] +[group_35476] +[group_35477] +[group_35478] +[group_35479] +[group_35480] +[group_35481] +[group_35482] +[group_35483] +[group_35484] +[group_35485] +[group_35486] +[group_35487] +[group_35488] +[group_35489] +[group_35490] +[group_35491] +[group_35492] +[group_35493] +[group_35494] +[group_35495] +[group_35496] +[group_35497] +[group_35498] +[group_35499] +[group_35500] +[group_35501] +[group_35502] +[group_35503] +[group_35504] +[group_35505] +[group_35506] +[group_35507] +[group_35508] +[group_35509] +[group_35510] +[group_35511] +[group_35512] +[group_35513] +[group_35514] +[group_35515] +[group_35516] +[group_35517] +[group_35518] +[group_35519] +[group_35520] +[group_35521] +[group_35522] +[group_35523] +[group_35524] +[group_35525] +[group_35526] +[group_35527] +[group_35528] +[group_35529] +[group_35530] +[group_35531] +[group_35532] +[group_35533] +[group_35534] +[group_35535] +[group_35536] +[group_35537] +[group_35538] +[group_35539] +[group_35540] +[group_35541] +[group_35542] +[group_35543] +[group_35544] +[group_35545] +[group_35546] +[group_35547] +[group_35548] +[group_35549] +[group_35550] +[group_35551] +[group_35552] +[group_35553] +[group_35554] +[group_35555] +[group_35556] +[group_35557] +[group_35558] +[group_35559] +[group_35560] +[group_35561] +[group_35562] +[group_35563] +[group_35564] +[group_35565] +[group_35566] +[group_35567] +[group_35568] +[group_35569] +[group_35570] +[group_35571] +[group_35572] +[group_35573] +[group_35574] +[group_35575] +[group_35576] +[group_35577] +[group_35578] +[group_35579] +[group_35580] +[group_35581] +[group_35582] +[group_35583] +[group_35584] +[group_35585] +[group_35586] +[group_35587] +[group_35588] +[group_35589] +[group_35590] +[group_35591] +[group_35592] +[group_35593] +[group_35594] +[group_35595] +[group_35596] +[group_35597] +[group_35598] +[group_35599] +[group_35600] +[group_35601] +[group_35602] +[group_35603] +[group_35604] +[group_35605] +[group_35606] +[group_35607] +[group_35608] +[group_35609] +[group_35610] +[group_35611] +[group_35612] +[group_35613] +[group_35614] +[group_35615] +[group_35616] +[group_35617] +[group_35618] +[group_35619] +[group_35620] +[group_35621] +[group_35622] +[group_35623] +[group_35624] +[group_35625] +[group_35626] +[group_35627] +[group_35628] +[group_35629] +[group_35630] +[group_35631] +[group_35632] +[group_35633] +[group_35634] +[group_35635] +[group_35636] +[group_35637] +[group_35638] +[group_35639] +[group_35640] +[group_35641] +[group_35642] +[group_35643] +[group_35644] +[group_35645] +[group_35646] +[group_35647] +[group_35648] +[group_35649] +[group_35650] +[group_35651] +[group_35652] +[group_35653] +[group_35654] +[group_35655] +[group_35656] +[group_35657] +[group_35658] +[group_35659] +[group_35660] +[group_35661] +[group_35662] +[group_35663] +[group_35664] +[group_35665] +[group_35666] +[group_35667] +[group_35668] +[group_35669] +[group_35670] +[group_35671] +[group_35672] +[group_35673] +[group_35674] +[group_35675] +[group_35676] +[group_35677] +[group_35678] +[group_35679] +[group_35680] +[group_35681] +[group_35682] +[group_35683] +[group_35684] +[group_35685] +[group_35686] +[group_35687] +[group_35688] +[group_35689] +[group_35690] +[group_35691] +[group_35692] +[group_35693] +[group_35694] +[group_35695] +[group_35696] +[group_35697] +[group_35698] +[group_35699] +[group_35700] +[group_35701] +[group_35702] +[group_35703] +[group_35704] +[group_35705] +[group_35706] +[group_35707] +[group_35708] +[group_35709] +[group_35710] +[group_35711] +[group_35712] +[group_35713] +[group_35714] +[group_35715] +[group_35716] +[group_35717] +[group_35718] +[group_35719] +[group_35720] +[group_35721] +[group_35722] +[group_35723] +[group_35724] +[group_35725] +[group_35726] +[group_35727] +[group_35728] +[group_35729] +[group_35730] +[group_35731] +[group_35732] +[group_35733] +[group_35734] +[group_35735] +[group_35736] +[group_35737] +[group_35738] +[group_35739] +[group_35740] +[group_35741] +[group_35742] +[group_35743] +[group_35744] +[group_35745] +[group_35746] +[group_35747] +[group_35748] +[group_35749] +[group_35750] +[group_35751] +[group_35752] +[group_35753] +[group_35754] +[group_35755] +[group_35756] +[group_35757] +[group_35758] +[group_35759] +[group_35760] +[group_35761] +[group_35762] +[group_35763] +[group_35764] +[group_35765] +[group_35766] +[group_35767] +[group_35768] +[group_35769] +[group_35770] +[group_35771] +[group_35772] +[group_35773] +[group_35774] +[group_35775] +[group_35776] +[group_35777] +[group_35778] +[group_35779] +[group_35780] +[group_35781] +[group_35782] +[group_35783] +[group_35784] +[group_35785] +[group_35786] +[group_35787] +[group_35788] +[group_35789] +[group_35790] +[group_35791] +[group_35792] +[group_35793] +[group_35794] +[group_35795] +[group_35796] +[group_35797] +[group_35798] +[group_35799] +[group_35800] +[group_35801] +[group_35802] +[group_35803] +[group_35804] +[group_35805] +[group_35806] +[group_35807] +[group_35808] +[group_35809] +[group_35810] +[group_35811] +[group_35812] +[group_35813] +[group_35814] +[group_35815] +[group_35816] +[group_35817] +[group_35818] +[group_35819] +[group_35820] +[group_35821] +[group_35822] +[group_35823] +[group_35824] +[group_35825] +[group_35826] +[group_35827] +[group_35828] +[group_35829] +[group_35830] +[group_35831] +[group_35832] +[group_35833] +[group_35834] +[group_35835] +[group_35836] +[group_35837] +[group_35838] +[group_35839] +[group_35840] +[group_35841] +[group_35842] +[group_35843] +[group_35844] +[group_35845] +[group_35846] +[group_35847] +[group_35848] +[group_35849] +[group_35850] +[group_35851] +[group_35852] +[group_35853] +[group_35854] +[group_35855] +[group_35856] +[group_35857] +[group_35858] +[group_35859] +[group_35860] +[group_35861] +[group_35862] +[group_35863] +[group_35864] +[group_35865] +[group_35866] +[group_35867] +[group_35868] +[group_35869] +[group_35870] +[group_35871] +[group_35872] +[group_35873] +[group_35874] +[group_35875] +[group_35876] +[group_35877] +[group_35878] +[group_35879] +[group_35880] +[group_35881] +[group_35882] +[group_35883] +[group_35884] +[group_35885] +[group_35886] +[group_35887] +[group_35888] +[group_35889] +[group_35890] +[group_35891] +[group_35892] +[group_35893] +[group_35894] +[group_35895] +[group_35896] +[group_35897] +[group_35898] +[group_35899] +[group_35900] +[group_35901] +[group_35902] +[group_35903] +[group_35904] +[group_35905] +[group_35906] +[group_35907] +[group_35908] +[group_35909] +[group_35910] +[group_35911] +[group_35912] +[group_35913] +[group_35914] +[group_35915] +[group_35916] +[group_35917] +[group_35918] +[group_35919] +[group_35920] +[group_35921] +[group_35922] +[group_35923] +[group_35924] +[group_35925] +[group_35926] +[group_35927] +[group_35928] +[group_35929] +[group_35930] +[group_35931] +[group_35932] +[group_35933] +[group_35934] +[group_35935] +[group_35936] +[group_35937] +[group_35938] +[group_35939] +[group_35940] +[group_35941] +[group_35942] +[group_35943] +[group_35944] +[group_35945] +[group_35946] +[group_35947] +[group_35948] +[group_35949] +[group_35950] +[group_35951] +[group_35952] +[group_35953] +[group_35954] +[group_35955] +[group_35956] +[group_35957] +[group_35958] +[group_35959] +[group_35960] +[group_35961] +[group_35962] +[group_35963] +[group_35964] +[group_35965] +[group_35966] +[group_35967] +[group_35968] +[group_35969] +[group_35970] +[group_35971] +[group_35972] +[group_35973] +[group_35974] +[group_35975] +[group_35976] +[group_35977] +[group_35978] +[group_35979] +[group_35980] +[group_35981] +[group_35982] +[group_35983] +[group_35984] +[group_35985] +[group_35986] +[group_35987] +[group_35988] +[group_35989] +[group_35990] +[group_35991] +[group_35992] +[group_35993] +[group_35994] +[group_35995] +[group_35996] +[group_35997] +[group_35998] +[group_35999] +[group_36000] +[group_36001] +[group_36002] +[group_36003] +[group_36004] +[group_36005] +[group_36006] +[group_36007] +[group_36008] +[group_36009] +[group_36010] +[group_36011] +[group_36012] +[group_36013] +[group_36014] +[group_36015] +[group_36016] +[group_36017] +[group_36018] +[group_36019] +[group_36020] +[group_36021] +[group_36022] +[group_36023] +[group_36024] +[group_36025] +[group_36026] +[group_36027] +[group_36028] +[group_36029] +[group_36030] +[group_36031] +[group_36032] +[group_36033] +[group_36034] +[group_36035] +[group_36036] +[group_36037] +[group_36038] +[group_36039] +[group_36040] +[group_36041] +[group_36042] +[group_36043] +[group_36044] +[group_36045] +[group_36046] +[group_36047] +[group_36048] +[group_36049] +[group_36050] +[group_36051] +[group_36052] +[group_36053] +[group_36054] +[group_36055] +[group_36056] +[group_36057] +[group_36058] +[group_36059] +[group_36060] +[group_36061] +[group_36062] +[group_36063] +[group_36064] +[group_36065] +[group_36066] +[group_36067] +[group_36068] +[group_36069] +[group_36070] +[group_36071] +[group_36072] +[group_36073] +[group_36074] +[group_36075] +[group_36076] +[group_36077] +[group_36078] +[group_36079] +[group_36080] +[group_36081] +[group_36082] +[group_36083] +[group_36084] +[group_36085] +[group_36086] +[group_36087] +[group_36088] +[group_36089] +[group_36090] +[group_36091] +[group_36092] +[group_36093] +[group_36094] +[group_36095] +[group_36096] +[group_36097] +[group_36098] +[group_36099] +[group_36100] +[group_36101] +[group_36102] +[group_36103] +[group_36104] +[group_36105] +[group_36106] +[group_36107] +[group_36108] +[group_36109] +[group_36110] +[group_36111] +[group_36112] +[group_36113] +[group_36114] +[group_36115] +[group_36116] +[group_36117] +[group_36118] +[group_36119] +[group_36120] +[group_36121] +[group_36122] +[group_36123] +[group_36124] +[group_36125] +[group_36126] +[group_36127] +[group_36128] +[group_36129] +[group_36130] +[group_36131] +[group_36132] +[group_36133] +[group_36134] +[group_36135] +[group_36136] +[group_36137] +[group_36138] +[group_36139] +[group_36140] +[group_36141] +[group_36142] +[group_36143] +[group_36144] +[group_36145] +[group_36146] +[group_36147] +[group_36148] +[group_36149] +[group_36150] +[group_36151] +[group_36152] +[group_36153] +[group_36154] +[group_36155] +[group_36156] +[group_36157] +[group_36158] +[group_36159] +[group_36160] +[group_36161] +[group_36162] +[group_36163] +[group_36164] +[group_36165] +[group_36166] +[group_36167] +[group_36168] +[group_36169] +[group_36170] +[group_36171] +[group_36172] +[group_36173] +[group_36174] +[group_36175] +[group_36176] +[group_36177] +[group_36178] +[group_36179] +[group_36180] +[group_36181] +[group_36182] +[group_36183] +[group_36184] +[group_36185] +[group_36186] +[group_36187] +[group_36188] +[group_36189] +[group_36190] +[group_36191] +[group_36192] +[group_36193] +[group_36194] +[group_36195] +[group_36196] +[group_36197] +[group_36198] +[group_36199] +[group_36200] +[group_36201] +[group_36202] +[group_36203] +[group_36204] +[group_36205] +[group_36206] +[group_36207] +[group_36208] +[group_36209] +[group_36210] +[group_36211] +[group_36212] +[group_36213] +[group_36214] +[group_36215] +[group_36216] +[group_36217] +[group_36218] +[group_36219] +[group_36220] +[group_36221] +[group_36222] +[group_36223] +[group_36224] +[group_36225] +[group_36226] +[group_36227] +[group_36228] +[group_36229] +[group_36230] +[group_36231] +[group_36232] +[group_36233] +[group_36234] +[group_36235] +[group_36236] +[group_36237] +[group_36238] +[group_36239] +[group_36240] +[group_36241] +[group_36242] +[group_36243] +[group_36244] +[group_36245] +[group_36246] +[group_36247] +[group_36248] +[group_36249] +[group_36250] +[group_36251] +[group_36252] +[group_36253] +[group_36254] +[group_36255] +[group_36256] +[group_36257] +[group_36258] +[group_36259] +[group_36260] +[group_36261] +[group_36262] +[group_36263] +[group_36264] +[group_36265] +[group_36266] +[group_36267] +[group_36268] +[group_36269] +[group_36270] +[group_36271] +[group_36272] +[group_36273] +[group_36274] +[group_36275] +[group_36276] +[group_36277] +[group_36278] +[group_36279] +[group_36280] +[group_36281] +[group_36282] +[group_36283] +[group_36284] +[group_36285] +[group_36286] +[group_36287] +[group_36288] +[group_36289] +[group_36290] +[group_36291] +[group_36292] +[group_36293] +[group_36294] +[group_36295] +[group_36296] +[group_36297] +[group_36298] +[group_36299] +[group_36300] +[group_36301] +[group_36302] +[group_36303] +[group_36304] +[group_36305] +[group_36306] +[group_36307] +[group_36308] +[group_36309] +[group_36310] +[group_36311] +[group_36312] +[group_36313] +[group_36314] +[group_36315] +[group_36316] +[group_36317] +[group_36318] +[group_36319] +[group_36320] +[group_36321] +[group_36322] +[group_36323] +[group_36324] +[group_36325] +[group_36326] +[group_36327] +[group_36328] +[group_36329] +[group_36330] +[group_36331] +[group_36332] +[group_36333] +[group_36334] +[group_36335] +[group_36336] +[group_36337] +[group_36338] +[group_36339] +[group_36340] +[group_36341] +[group_36342] +[group_36343] +[group_36344] +[group_36345] +[group_36346] +[group_36347] +[group_36348] +[group_36349] +[group_36350] +[group_36351] +[group_36352] +[group_36353] +[group_36354] +[group_36355] +[group_36356] +[group_36357] +[group_36358] +[group_36359] +[group_36360] +[group_36361] +[group_36362] +[group_36363] +[group_36364] +[group_36365] +[group_36366] +[group_36367] +[group_36368] +[group_36369] +[group_36370] +[group_36371] +[group_36372] +[group_36373] +[group_36374] +[group_36375] +[group_36376] +[group_36377] +[group_36378] +[group_36379] +[group_36380] +[group_36381] +[group_36382] +[group_36383] +[group_36384] +[group_36385] +[group_36386] +[group_36387] +[group_36388] +[group_36389] +[group_36390] +[group_36391] +[group_36392] +[group_36393] +[group_36394] +[group_36395] +[group_36396] +[group_36397] +[group_36398] +[group_36399] +[group_36400] +[group_36401] +[group_36402] +[group_36403] +[group_36404] +[group_36405] +[group_36406] +[group_36407] +[group_36408] +[group_36409] +[group_36410] +[group_36411] +[group_36412] +[group_36413] +[group_36414] +[group_36415] +[group_36416] +[group_36417] +[group_36418] +[group_36419] +[group_36420] +[group_36421] +[group_36422] +[group_36423] +[group_36424] +[group_36425] +[group_36426] +[group_36427] +[group_36428] +[group_36429] +[group_36430] +[group_36431] +[group_36432] +[group_36433] +[group_36434] +[group_36435] +[group_36436] +[group_36437] +[group_36438] +[group_36439] +[group_36440] +[group_36441] +[group_36442] +[group_36443] +[group_36444] +[group_36445] +[group_36446] +[group_36447] +[group_36448] +[group_36449] +[group_36450] +[group_36451] +[group_36452] +[group_36453] +[group_36454] +[group_36455] +[group_36456] +[group_36457] +[group_36458] +[group_36459] +[group_36460] +[group_36461] +[group_36462] +[group_36463] +[group_36464] +[group_36465] +[group_36466] +[group_36467] +[group_36468] +[group_36469] +[group_36470] +[group_36471] +[group_36472] +[group_36473] +[group_36474] +[group_36475] +[group_36476] +[group_36477] +[group_36478] +[group_36479] +[group_36480] +[group_36481] +[group_36482] +[group_36483] +[group_36484] +[group_36485] +[group_36486] +[group_36487] +[group_36488] +[group_36489] +[group_36490] +[group_36491] +[group_36492] +[group_36493] +[group_36494] +[group_36495] +[group_36496] +[group_36497] +[group_36498] +[group_36499] +[group_36500] +[group_36501] +[group_36502] +[group_36503] +[group_36504] +[group_36505] +[group_36506] +[group_36507] +[group_36508] +[group_36509] +[group_36510] +[group_36511] +[group_36512] +[group_36513] +[group_36514] +[group_36515] +[group_36516] +[group_36517] +[group_36518] +[group_36519] +[group_36520] +[group_36521] +[group_36522] +[group_36523] +[group_36524] +[group_36525] +[group_36526] +[group_36527] +[group_36528] +[group_36529] +[group_36530] +[group_36531] +[group_36532] +[group_36533] +[group_36534] +[group_36535] +[group_36536] +[group_36537] +[group_36538] +[group_36539] +[group_36540] +[group_36541] +[group_36542] +[group_36543] +[group_36544] +[group_36545] +[group_36546] +[group_36547] +[group_36548] +[group_36549] +[group_36550] +[group_36551] +[group_36552] +[group_36553] +[group_36554] +[group_36555] +[group_36556] +[group_36557] +[group_36558] +[group_36559] +[group_36560] +[group_36561] +[group_36562] +[group_36563] +[group_36564] +[group_36565] +[group_36566] +[group_36567] +[group_36568] +[group_36569] +[group_36570] +[group_36571] +[group_36572] +[group_36573] +[group_36574] +[group_36575] +[group_36576] +[group_36577] +[group_36578] +[group_36579] +[group_36580] +[group_36581] +[group_36582] +[group_36583] +[group_36584] +[group_36585] +[group_36586] +[group_36587] +[group_36588] +[group_36589] +[group_36590] +[group_36591] +[group_36592] +[group_36593] +[group_36594] +[group_36595] +[group_36596] +[group_36597] +[group_36598] +[group_36599] +[group_36600] +[group_36601] +[group_36602] +[group_36603] +[group_36604] +[group_36605] +[group_36606] +[group_36607] +[group_36608] +[group_36609] +[group_36610] +[group_36611] +[group_36612] +[group_36613] +[group_36614] +[group_36615] +[group_36616] +[group_36617] +[group_36618] +[group_36619] +[group_36620] +[group_36621] +[group_36622] +[group_36623] +[group_36624] +[group_36625] +[group_36626] +[group_36627] +[group_36628] +[group_36629] +[group_36630] +[group_36631] +[group_36632] +[group_36633] +[group_36634] +[group_36635] +[group_36636] +[group_36637] +[group_36638] +[group_36639] +[group_36640] +[group_36641] +[group_36642] +[group_36643] +[group_36644] +[group_36645] +[group_36646] +[group_36647] +[group_36648] +[group_36649] +[group_36650] +[group_36651] +[group_36652] +[group_36653] +[group_36654] +[group_36655] +[group_36656] +[group_36657] +[group_36658] +[group_36659] +[group_36660] +[group_36661] +[group_36662] +[group_36663] +[group_36664] +[group_36665] +[group_36666] +[group_36667] +[group_36668] +[group_36669] +[group_36670] +[group_36671] +[group_36672] +[group_36673] +[group_36674] +[group_36675] +[group_36676] +[group_36677] +[group_36678] +[group_36679] +[group_36680] +[group_36681] +[group_36682] +[group_36683] +[group_36684] +[group_36685] +[group_36686] +[group_36687] +[group_36688] +[group_36689] +[group_36690] +[group_36691] +[group_36692] +[group_36693] +[group_36694] +[group_36695] +[group_36696] +[group_36697] +[group_36698] +[group_36699] +[group_36700] +[group_36701] +[group_36702] +[group_36703] +[group_36704] +[group_36705] +[group_36706] +[group_36707] +[group_36708] +[group_36709] +[group_36710] +[group_36711] +[group_36712] +[group_36713] +[group_36714] +[group_36715] +[group_36716] +[group_36717] +[group_36718] +[group_36719] +[group_36720] +[group_36721] +[group_36722] +[group_36723] +[group_36724] +[group_36725] +[group_36726] +[group_36727] +[group_36728] +[group_36729] +[group_36730] +[group_36731] +[group_36732] +[group_36733] +[group_36734] +[group_36735] +[group_36736] +[group_36737] +[group_36738] +[group_36739] +[group_36740] +[group_36741] +[group_36742] +[group_36743] +[group_36744] +[group_36745] +[group_36746] +[group_36747] +[group_36748] +[group_36749] +[group_36750] +[group_36751] +[group_36752] +[group_36753] +[group_36754] +[group_36755] +[group_36756] +[group_36757] +[group_36758] +[group_36759] +[group_36760] +[group_36761] +[group_36762] +[group_36763] +[group_36764] +[group_36765] +[group_36766] +[group_36767] +[group_36768] +[group_36769] +[group_36770] +[group_36771] +[group_36772] +[group_36773] +[group_36774] +[group_36775] +[group_36776] +[group_36777] +[group_36778] +[group_36779] +[group_36780] +[group_36781] +[group_36782] +[group_36783] +[group_36784] +[group_36785] +[group_36786] +[group_36787] +[group_36788] +[group_36789] +[group_36790] +[group_36791] +[group_36792] +[group_36793] +[group_36794] +[group_36795] +[group_36796] +[group_36797] +[group_36798] +[group_36799] +[group_36800] +[group_36801] +[group_36802] +[group_36803] +[group_36804] +[group_36805] +[group_36806] +[group_36807] +[group_36808] +[group_36809] +[group_36810] +[group_36811] +[group_36812] +[group_36813] +[group_36814] +[group_36815] +[group_36816] +[group_36817] +[group_36818] +[group_36819] +[group_36820] +[group_36821] +[group_36822] +[group_36823] +[group_36824] +[group_36825] +[group_36826] +[group_36827] +[group_36828] +[group_36829] +[group_36830] +[group_36831] +[group_36832] +[group_36833] +[group_36834] +[group_36835] +[group_36836] +[group_36837] +[group_36838] +[group_36839] +[group_36840] +[group_36841] +[group_36842] +[group_36843] +[group_36844] +[group_36845] +[group_36846] +[group_36847] +[group_36848] +[group_36849] +[group_36850] +[group_36851] +[group_36852] +[group_36853] +[group_36854] +[group_36855] +[group_36856] +[group_36857] +[group_36858] +[group_36859] +[group_36860] +[group_36861] +[group_36862] +[group_36863] +[group_36864] +[group_36865] +[group_36866] +[group_36867] +[group_36868] +[group_36869] +[group_36870] +[group_36871] +[group_36872] +[group_36873] +[group_36874] +[group_36875] +[group_36876] +[group_36877] +[group_36878] +[group_36879] +[group_36880] +[group_36881] +[group_36882] +[group_36883] +[group_36884] +[group_36885] +[group_36886] +[group_36887] +[group_36888] +[group_36889] +[group_36890] +[group_36891] +[group_36892] +[group_36893] +[group_36894] +[group_36895] +[group_36896] +[group_36897] +[group_36898] +[group_36899] +[group_36900] +[group_36901] +[group_36902] +[group_36903] +[group_36904] +[group_36905] +[group_36906] +[group_36907] +[group_36908] +[group_36909] +[group_36910] +[group_36911] +[group_36912] +[group_36913] +[group_36914] +[group_36915] +[group_36916] +[group_36917] +[group_36918] +[group_36919] +[group_36920] +[group_36921] +[group_36922] +[group_36923] +[group_36924] +[group_36925] +[group_36926] +[group_36927] +[group_36928] +[group_36929] +[group_36930] +[group_36931] +[group_36932] +[group_36933] +[group_36934] +[group_36935] +[group_36936] +[group_36937] +[group_36938] +[group_36939] +[group_36940] +[group_36941] +[group_36942] +[group_36943] +[group_36944] +[group_36945] +[group_36946] +[group_36947] +[group_36948] +[group_36949] +[group_36950] +[group_36951] +[group_36952] +[group_36953] +[group_36954] +[group_36955] +[group_36956] +[group_36957] +[group_36958] +[group_36959] +[group_36960] +[group_36961] +[group_36962] +[group_36963] +[group_36964] +[group_36965] +[group_36966] +[group_36967] +[group_36968] +[group_36969] +[group_36970] +[group_36971] +[group_36972] +[group_36973] +[group_36974] +[group_36975] +[group_36976] +[group_36977] +[group_36978] +[group_36979] +[group_36980] +[group_36981] +[group_36982] +[group_36983] +[group_36984] +[group_36985] +[group_36986] +[group_36987] +[group_36988] +[group_36989] +[group_36990] +[group_36991] +[group_36992] +[group_36993] +[group_36994] +[group_36995] +[group_36996] +[group_36997] +[group_36998] +[group_36999] +[group_37000] +[group_37001] +[group_37002] +[group_37003] +[group_37004] +[group_37005] +[group_37006] +[group_37007] +[group_37008] +[group_37009] +[group_37010] +[group_37011] +[group_37012] +[group_37013] +[group_37014] +[group_37015] +[group_37016] +[group_37017] +[group_37018] +[group_37019] +[group_37020] +[group_37021] +[group_37022] +[group_37023] +[group_37024] +[group_37025] +[group_37026] +[group_37027] +[group_37028] +[group_37029] +[group_37030] +[group_37031] +[group_37032] +[group_37033] +[group_37034] +[group_37035] +[group_37036] +[group_37037] +[group_37038] +[group_37039] +[group_37040] +[group_37041] +[group_37042] +[group_37043] +[group_37044] +[group_37045] +[group_37046] +[group_37047] +[group_37048] +[group_37049] +[group_37050] +[group_37051] +[group_37052] +[group_37053] +[group_37054] +[group_37055] +[group_37056] +[group_37057] +[group_37058] +[group_37059] +[group_37060] +[group_37061] +[group_37062] +[group_37063] +[group_37064] +[group_37065] +[group_37066] +[group_37067] +[group_37068] +[group_37069] +[group_37070] +[group_37071] +[group_37072] +[group_37073] +[group_37074] +[group_37075] +[group_37076] +[group_37077] +[group_37078] +[group_37079] +[group_37080] +[group_37081] +[group_37082] +[group_37083] +[group_37084] +[group_37085] +[group_37086] +[group_37087] +[group_37088] +[group_37089] +[group_37090] +[group_37091] +[group_37092] +[group_37093] +[group_37094] +[group_37095] +[group_37096] +[group_37097] +[group_37098] +[group_37099] +[group_37100] +[group_37101] +[group_37102] +[group_37103] +[group_37104] +[group_37105] +[group_37106] +[group_37107] +[group_37108] +[group_37109] +[group_37110] +[group_37111] +[group_37112] +[group_37113] +[group_37114] +[group_37115] +[group_37116] +[group_37117] +[group_37118] +[group_37119] +[group_37120] +[group_37121] +[group_37122] +[group_37123] +[group_37124] +[group_37125] +[group_37126] +[group_37127] +[group_37128] +[group_37129] +[group_37130] +[group_37131] +[group_37132] +[group_37133] +[group_37134] +[group_37135] +[group_37136] +[group_37137] +[group_37138] +[group_37139] +[group_37140] +[group_37141] +[group_37142] +[group_37143] +[group_37144] +[group_37145] +[group_37146] +[group_37147] +[group_37148] +[group_37149] +[group_37150] +[group_37151] +[group_37152] +[group_37153] +[group_37154] +[group_37155] +[group_37156] +[group_37157] +[group_37158] +[group_37159] +[group_37160] +[group_37161] +[group_37162] +[group_37163] +[group_37164] +[group_37165] +[group_37166] +[group_37167] +[group_37168] +[group_37169] +[group_37170] +[group_37171] +[group_37172] +[group_37173] +[group_37174] +[group_37175] +[group_37176] +[group_37177] +[group_37178] +[group_37179] +[group_37180] +[group_37181] +[group_37182] +[group_37183] +[group_37184] +[group_37185] +[group_37186] +[group_37187] +[group_37188] +[group_37189] +[group_37190] +[group_37191] +[group_37192] +[group_37193] +[group_37194] +[group_37195] +[group_37196] +[group_37197] +[group_37198] +[group_37199] +[group_37200] +[group_37201] +[group_37202] +[group_37203] +[group_37204] +[group_37205] +[group_37206] +[group_37207] +[group_37208] +[group_37209] +[group_37210] +[group_37211] +[group_37212] +[group_37213] +[group_37214] +[group_37215] +[group_37216] +[group_37217] +[group_37218] +[group_37219] +[group_37220] +[group_37221] +[group_37222] +[group_37223] +[group_37224] +[group_37225] +[group_37226] +[group_37227] +[group_37228] +[group_37229] +[group_37230] +[group_37231] +[group_37232] +[group_37233] +[group_37234] +[group_37235] +[group_37236] +[group_37237] +[group_37238] +[group_37239] +[group_37240] +[group_37241] +[group_37242] +[group_37243] +[group_37244] +[group_37245] +[group_37246] +[group_37247] +[group_37248] +[group_37249] +[group_37250] +[group_37251] +[group_37252] +[group_37253] +[group_37254] +[group_37255] +[group_37256] +[group_37257] +[group_37258] +[group_37259] +[group_37260] +[group_37261] +[group_37262] +[group_37263] +[group_37264] +[group_37265] +[group_37266] +[group_37267] +[group_37268] +[group_37269] +[group_37270] +[group_37271] +[group_37272] +[group_37273] +[group_37274] +[group_37275] +[group_37276] +[group_37277] +[group_37278] +[group_37279] +[group_37280] +[group_37281] +[group_37282] +[group_37283] +[group_37284] +[group_37285] +[group_37286] +[group_37287] +[group_37288] +[group_37289] +[group_37290] +[group_37291] +[group_37292] +[group_37293] +[group_37294] +[group_37295] +[group_37296] +[group_37297] +[group_37298] +[group_37299] +[group_37300] +[group_37301] +[group_37302] +[group_37303] +[group_37304] +[group_37305] +[group_37306] +[group_37307] +[group_37308] +[group_37309] +[group_37310] +[group_37311] +[group_37312] +[group_37313] +[group_37314] +[group_37315] +[group_37316] +[group_37317] +[group_37318] +[group_37319] +[group_37320] +[group_37321] +[group_37322] +[group_37323] +[group_37324] +[group_37325] +[group_37326] +[group_37327] +[group_37328] +[group_37329] +[group_37330] +[group_37331] +[group_37332] +[group_37333] +[group_37334] +[group_37335] +[group_37336] +[group_37337] +[group_37338] +[group_37339] +[group_37340] +[group_37341] +[group_37342] +[group_37343] +[group_37344] +[group_37345] +[group_37346] +[group_37347] +[group_37348] +[group_37349] +[group_37350] +[group_37351] +[group_37352] +[group_37353] +[group_37354] +[group_37355] +[group_37356] +[group_37357] +[group_37358] +[group_37359] +[group_37360] +[group_37361] +[group_37362] +[group_37363] +[group_37364] +[group_37365] +[group_37366] +[group_37367] +[group_37368] +[group_37369] +[group_37370] +[group_37371] +[group_37372] +[group_37373] +[group_37374] +[group_37375] +[group_37376] +[group_37377] +[group_37378] +[group_37379] +[group_37380] +[group_37381] +[group_37382] +[group_37383] +[group_37384] +[group_37385] +[group_37386] +[group_37387] +[group_37388] +[group_37389] +[group_37390] +[group_37391] +[group_37392] +[group_37393] +[group_37394] +[group_37395] +[group_37396] +[group_37397] +[group_37398] +[group_37399] +[group_37400] +[group_37401] +[group_37402] +[group_37403] +[group_37404] +[group_37405] +[group_37406] +[group_37407] +[group_37408] +[group_37409] +[group_37410] +[group_37411] +[group_37412] +[group_37413] +[group_37414] +[group_37415] +[group_37416] +[group_37417] +[group_37418] +[group_37419] +[group_37420] +[group_37421] +[group_37422] +[group_37423] +[group_37424] +[group_37425] +[group_37426] +[group_37427] +[group_37428] +[group_37429] +[group_37430] +[group_37431] +[group_37432] +[group_37433] +[group_37434] +[group_37435] +[group_37436] +[group_37437] +[group_37438] +[group_37439] +[group_37440] +[group_37441] +[group_37442] +[group_37443] +[group_37444] +[group_37445] +[group_37446] +[group_37447] +[group_37448] +[group_37449] +[group_37450] +[group_37451] +[group_37452] +[group_37453] +[group_37454] +[group_37455] +[group_37456] +[group_37457] +[group_37458] +[group_37459] +[group_37460] +[group_37461] +[group_37462] +[group_37463] +[group_37464] +[group_37465] +[group_37466] +[group_37467] +[group_37468] +[group_37469] +[group_37470] +[group_37471] +[group_37472] +[group_37473] +[group_37474] +[group_37475] +[group_37476] +[group_37477] +[group_37478] +[group_37479] +[group_37480] +[group_37481] +[group_37482] +[group_37483] +[group_37484] +[group_37485] +[group_37486] +[group_37487] +[group_37488] +[group_37489] +[group_37490] +[group_37491] +[group_37492] +[group_37493] +[group_37494] +[group_37495] +[group_37496] +[group_37497] +[group_37498] +[group_37499] +[group_37500] +[group_37501] +[group_37502] +[group_37503] +[group_37504] +[group_37505] +[group_37506] +[group_37507] +[group_37508] +[group_37509] +[group_37510] +[group_37511] +[group_37512] +[group_37513] +[group_37514] +[group_37515] +[group_37516] +[group_37517] +[group_37518] +[group_37519] +[group_37520] +[group_37521] +[group_37522] +[group_37523] +[group_37524] +[group_37525] +[group_37526] +[group_37527] +[group_37528] +[group_37529] +[group_37530] +[group_37531] +[group_37532] +[group_37533] +[group_37534] +[group_37535] +[group_37536] +[group_37537] +[group_37538] +[group_37539] +[group_37540] +[group_37541] +[group_37542] +[group_37543] +[group_37544] +[group_37545] +[group_37546] +[group_37547] +[group_37548] +[group_37549] +[group_37550] +[group_37551] +[group_37552] +[group_37553] +[group_37554] +[group_37555] +[group_37556] +[group_37557] +[group_37558] +[group_37559] +[group_37560] +[group_37561] +[group_37562] +[group_37563] +[group_37564] +[group_37565] +[group_37566] +[group_37567] +[group_37568] +[group_37569] +[group_37570] +[group_37571] +[group_37572] +[group_37573] +[group_37574] +[group_37575] +[group_37576] +[group_37577] +[group_37578] +[group_37579] +[group_37580] +[group_37581] +[group_37582] +[group_37583] +[group_37584] +[group_37585] +[group_37586] +[group_37587] +[group_37588] +[group_37589] +[group_37590] +[group_37591] +[group_37592] +[group_37593] +[group_37594] +[group_37595] +[group_37596] +[group_37597] +[group_37598] +[group_37599] +[group_37600] +[group_37601] +[group_37602] +[group_37603] +[group_37604] +[group_37605] +[group_37606] +[group_37607] +[group_37608] +[group_37609] +[group_37610] +[group_37611] +[group_37612] +[group_37613] +[group_37614] +[group_37615] +[group_37616] +[group_37617] +[group_37618] +[group_37619] +[group_37620] +[group_37621] +[group_37622] +[group_37623] +[group_37624] +[group_37625] +[group_37626] +[group_37627] +[group_37628] +[group_37629] +[group_37630] +[group_37631] +[group_37632] +[group_37633] +[group_37634] +[group_37635] +[group_37636] +[group_37637] +[group_37638] +[group_37639] +[group_37640] +[group_37641] +[group_37642] +[group_37643] +[group_37644] +[group_37645] +[group_37646] +[group_37647] +[group_37648] +[group_37649] +[group_37650] +[group_37651] +[group_37652] +[group_37653] +[group_37654] +[group_37655] +[group_37656] +[group_37657] +[group_37658] +[group_37659] +[group_37660] +[group_37661] +[group_37662] +[group_37663] +[group_37664] +[group_37665] +[group_37666] +[group_37667] +[group_37668] +[group_37669] +[group_37670] +[group_37671] +[group_37672] +[group_37673] +[group_37674] +[group_37675] +[group_37676] +[group_37677] +[group_37678] +[group_37679] +[group_37680] +[group_37681] +[group_37682] +[group_37683] +[group_37684] +[group_37685] +[group_37686] +[group_37687] +[group_37688] +[group_37689] +[group_37690] +[group_37691] +[group_37692] +[group_37693] +[group_37694] +[group_37695] +[group_37696] +[group_37697] +[group_37698] +[group_37699] +[group_37700] +[group_37701] +[group_37702] +[group_37703] +[group_37704] +[group_37705] +[group_37706] +[group_37707] +[group_37708] +[group_37709] +[group_37710] +[group_37711] +[group_37712] +[group_37713] +[group_37714] +[group_37715] +[group_37716] +[group_37717] +[group_37718] +[group_37719] +[group_37720] +[group_37721] +[group_37722] +[group_37723] +[group_37724] +[group_37725] +[group_37726] +[group_37727] +[group_37728] +[group_37729] +[group_37730] +[group_37731] +[group_37732] +[group_37733] +[group_37734] +[group_37735] +[group_37736] +[group_37737] +[group_37738] +[group_37739] +[group_37740] +[group_37741] +[group_37742] +[group_37743] +[group_37744] +[group_37745] +[group_37746] +[group_37747] +[group_37748] +[group_37749] +[group_37750] +[group_37751] +[group_37752] +[group_37753] +[group_37754] +[group_37755] +[group_37756] +[group_37757] +[group_37758] +[group_37759] +[group_37760] +[group_37761] +[group_37762] +[group_37763] +[group_37764] +[group_37765] +[group_37766] +[group_37767] +[group_37768] +[group_37769] +[group_37770] +[group_37771] +[group_37772] +[group_37773] +[group_37774] +[group_37775] +[group_37776] +[group_37777] +[group_37778] +[group_37779] +[group_37780] +[group_37781] +[group_37782] +[group_37783] +[group_37784] +[group_37785] +[group_37786] +[group_37787] +[group_37788] +[group_37789] +[group_37790] +[group_37791] +[group_37792] +[group_37793] +[group_37794] +[group_37795] +[group_37796] +[group_37797] +[group_37798] +[group_37799] +[group_37800] +[group_37801] +[group_37802] +[group_37803] +[group_37804] +[group_37805] +[group_37806] +[group_37807] +[group_37808] +[group_37809] +[group_37810] +[group_37811] +[group_37812] +[group_37813] +[group_37814] +[group_37815] +[group_37816] +[group_37817] +[group_37818] +[group_37819] +[group_37820] +[group_37821] +[group_37822] +[group_37823] +[group_37824] +[group_37825] +[group_37826] +[group_37827] +[group_37828] +[group_37829] +[group_37830] +[group_37831] +[group_37832] +[group_37833] +[group_37834] +[group_37835] +[group_37836] +[group_37837] +[group_37838] +[group_37839] +[group_37840] +[group_37841] +[group_37842] +[group_37843] +[group_37844] +[group_37845] +[group_37846] +[group_37847] +[group_37848] +[group_37849] +[group_37850] +[group_37851] +[group_37852] +[group_37853] +[group_37854] +[group_37855] +[group_37856] +[group_37857] +[group_37858] +[group_37859] +[group_37860] +[group_37861] +[group_37862] +[group_37863] +[group_37864] +[group_37865] +[group_37866] +[group_37867] +[group_37868] +[group_37869] +[group_37870] +[group_37871] +[group_37872] +[group_37873] +[group_37874] +[group_37875] +[group_37876] +[group_37877] +[group_37878] +[group_37879] +[group_37880] +[group_37881] +[group_37882] +[group_37883] +[group_37884] +[group_37885] +[group_37886] +[group_37887] +[group_37888] +[group_37889] +[group_37890] +[group_37891] +[group_37892] +[group_37893] +[group_37894] +[group_37895] +[group_37896] +[group_37897] +[group_37898] +[group_37899] +[group_37900] +[group_37901] +[group_37902] +[group_37903] +[group_37904] +[group_37905] +[group_37906] +[group_37907] +[group_37908] +[group_37909] +[group_37910] +[group_37911] +[group_37912] +[group_37913] +[group_37914] +[group_37915] +[group_37916] +[group_37917] +[group_37918] +[group_37919] +[group_37920] +[group_37921] +[group_37922] +[group_37923] +[group_37924] +[group_37925] +[group_37926] +[group_37927] +[group_37928] +[group_37929] +[group_37930] +[group_37931] +[group_37932] +[group_37933] +[group_37934] +[group_37935] +[group_37936] +[group_37937] +[group_37938] +[group_37939] +[group_37940] +[group_37941] +[group_37942] +[group_37943] +[group_37944] +[group_37945] +[group_37946] +[group_37947] +[group_37948] +[group_37949] +[group_37950] +[group_37951] +[group_37952] +[group_37953] +[group_37954] +[group_37955] +[group_37956] +[group_37957] +[group_37958] +[group_37959] +[group_37960] +[group_37961] +[group_37962] +[group_37963] +[group_37964] +[group_37965] +[group_37966] +[group_37967] +[group_37968] +[group_37969] +[group_37970] +[group_37971] +[group_37972] +[group_37973] +[group_37974] +[group_37975] +[group_37976] +[group_37977] +[group_37978] +[group_37979] +[group_37980] +[group_37981] +[group_37982] +[group_37983] +[group_37984] +[group_37985] +[group_37986] +[group_37987] +[group_37988] +[group_37989] +[group_37990] +[group_37991] +[group_37992] +[group_37993] +[group_37994] +[group_37995] +[group_37996] +[group_37997] +[group_37998] +[group_37999] +[group_38000] +[group_38001] +[group_38002] +[group_38003] +[group_38004] +[group_38005] +[group_38006] +[group_38007] +[group_38008] +[group_38009] +[group_38010] +[group_38011] +[group_38012] +[group_38013] +[group_38014] +[group_38015] +[group_38016] +[group_38017] +[group_38018] +[group_38019] +[group_38020] +[group_38021] +[group_38022] +[group_38023] +[group_38024] +[group_38025] +[group_38026] +[group_38027] +[group_38028] +[group_38029] +[group_38030] +[group_38031] +[group_38032] +[group_38033] +[group_38034] +[group_38035] +[group_38036] +[group_38037] +[group_38038] +[group_38039] +[group_38040] +[group_38041] +[group_38042] +[group_38043] +[group_38044] +[group_38045] +[group_38046] +[group_38047] +[group_38048] +[group_38049] +[group_38050] +[group_38051] +[group_38052] +[group_38053] +[group_38054] +[group_38055] +[group_38056] +[group_38057] +[group_38058] +[group_38059] +[group_38060] +[group_38061] +[group_38062] +[group_38063] +[group_38064] +[group_38065] +[group_38066] +[group_38067] +[group_38068] +[group_38069] +[group_38070] +[group_38071] +[group_38072] +[group_38073] +[group_38074] +[group_38075] +[group_38076] +[group_38077] +[group_38078] +[group_38079] +[group_38080] +[group_38081] +[group_38082] +[group_38083] +[group_38084] +[group_38085] +[group_38086] +[group_38087] +[group_38088] +[group_38089] +[group_38090] +[group_38091] +[group_38092] +[group_38093] +[group_38094] +[group_38095] +[group_38096] +[group_38097] +[group_38098] +[group_38099] +[group_38100] +[group_38101] +[group_38102] +[group_38103] +[group_38104] +[group_38105] +[group_38106] +[group_38107] +[group_38108] +[group_38109] +[group_38110] +[group_38111] +[group_38112] +[group_38113] +[group_38114] +[group_38115] +[group_38116] +[group_38117] +[group_38118] +[group_38119] +[group_38120] +[group_38121] +[group_38122] +[group_38123] +[group_38124] +[group_38125] +[group_38126] +[group_38127] +[group_38128] +[group_38129] +[group_38130] +[group_38131] +[group_38132] +[group_38133] +[group_38134] +[group_38135] +[group_38136] +[group_38137] +[group_38138] +[group_38139] +[group_38140] +[group_38141] +[group_38142] +[group_38143] +[group_38144] +[group_38145] +[group_38146] +[group_38147] +[group_38148] +[group_38149] +[group_38150] +[group_38151] +[group_38152] +[group_38153] +[group_38154] +[group_38155] +[group_38156] +[group_38157] +[group_38158] +[group_38159] +[group_38160] +[group_38161] +[group_38162] +[group_38163] +[group_38164] +[group_38165] +[group_38166] +[group_38167] +[group_38168] +[group_38169] +[group_38170] +[group_38171] +[group_38172] +[group_38173] +[group_38174] +[group_38175] +[group_38176] +[group_38177] +[group_38178] +[group_38179] +[group_38180] +[group_38181] +[group_38182] +[group_38183] +[group_38184] +[group_38185] +[group_38186] +[group_38187] +[group_38188] +[group_38189] +[group_38190] +[group_38191] +[group_38192] +[group_38193] +[group_38194] +[group_38195] +[group_38196] +[group_38197] +[group_38198] +[group_38199] +[group_38200] +[group_38201] +[group_38202] +[group_38203] +[group_38204] +[group_38205] +[group_38206] +[group_38207] +[group_38208] +[group_38209] +[group_38210] +[group_38211] +[group_38212] +[group_38213] +[group_38214] +[group_38215] +[group_38216] +[group_38217] +[group_38218] +[group_38219] +[group_38220] +[group_38221] +[group_38222] +[group_38223] +[group_38224] +[group_38225] +[group_38226] +[group_38227] +[group_38228] +[group_38229] +[group_38230] +[group_38231] +[group_38232] +[group_38233] +[group_38234] +[group_38235] +[group_38236] +[group_38237] +[group_38238] +[group_38239] +[group_38240] +[group_38241] +[group_38242] +[group_38243] +[group_38244] +[group_38245] +[group_38246] +[group_38247] +[group_38248] +[group_38249] +[group_38250] +[group_38251] +[group_38252] +[group_38253] +[group_38254] +[group_38255] +[group_38256] +[group_38257] +[group_38258] +[group_38259] +[group_38260] +[group_38261] +[group_38262] +[group_38263] +[group_38264] +[group_38265] +[group_38266] +[group_38267] +[group_38268] +[group_38269] +[group_38270] +[group_38271] +[group_38272] +[group_38273] +[group_38274] +[group_38275] +[group_38276] +[group_38277] +[group_38278] +[group_38279] +[group_38280] +[group_38281] +[group_38282] +[group_38283] +[group_38284] +[group_38285] +[group_38286] +[group_38287] +[group_38288] +[group_38289] +[group_38290] +[group_38291] +[group_38292] +[group_38293] +[group_38294] +[group_38295] +[group_38296] +[group_38297] +[group_38298] +[group_38299] +[group_38300] +[group_38301] +[group_38302] +[group_38303] +[group_38304] +[group_38305] +[group_38306] +[group_38307] +[group_38308] +[group_38309] +[group_38310] +[group_38311] +[group_38312] +[group_38313] +[group_38314] +[group_38315] +[group_38316] +[group_38317] +[group_38318] +[group_38319] +[group_38320] +[group_38321] +[group_38322] +[group_38323] +[group_38324] +[group_38325] +[group_38326] +[group_38327] +[group_38328] +[group_38329] +[group_38330] +[group_38331] +[group_38332] +[group_38333] +[group_38334] +[group_38335] +[group_38336] +[group_38337] +[group_38338] +[group_38339] +[group_38340] +[group_38341] +[group_38342] +[group_38343] +[group_38344] +[group_38345] +[group_38346] +[group_38347] +[group_38348] +[group_38349] +[group_38350] +[group_38351] +[group_38352] +[group_38353] +[group_38354] +[group_38355] +[group_38356] +[group_38357] +[group_38358] +[group_38359] +[group_38360] +[group_38361] +[group_38362] +[group_38363] +[group_38364] +[group_38365] +[group_38366] +[group_38367] +[group_38368] +[group_38369] +[group_38370] +[group_38371] +[group_38372] +[group_38373] +[group_38374] +[group_38375] +[group_38376] +[group_38377] +[group_38378] +[group_38379] +[group_38380] +[group_38381] +[group_38382] +[group_38383] +[group_38384] +[group_38385] +[group_38386] +[group_38387] +[group_38388] +[group_38389] +[group_38390] +[group_38391] +[group_38392] +[group_38393] +[group_38394] +[group_38395] +[group_38396] +[group_38397] +[group_38398] +[group_38399] +[group_38400] +[group_38401] +[group_38402] +[group_38403] +[group_38404] +[group_38405] +[group_38406] +[group_38407] +[group_38408] +[group_38409] +[group_38410] +[group_38411] +[group_38412] +[group_38413] +[group_38414] +[group_38415] +[group_38416] +[group_38417] +[group_38418] +[group_38419] +[group_38420] +[group_38421] +[group_38422] +[group_38423] +[group_38424] +[group_38425] +[group_38426] +[group_38427] +[group_38428] +[group_38429] +[group_38430] +[group_38431] +[group_38432] +[group_38433] +[group_38434] +[group_38435] +[group_38436] +[group_38437] +[group_38438] +[group_38439] +[group_38440] +[group_38441] +[group_38442] +[group_38443] +[group_38444] +[group_38445] +[group_38446] +[group_38447] +[group_38448] +[group_38449] +[group_38450] +[group_38451] +[group_38452] +[group_38453] +[group_38454] +[group_38455] +[group_38456] +[group_38457] +[group_38458] +[group_38459] +[group_38460] +[group_38461] +[group_38462] +[group_38463] +[group_38464] +[group_38465] +[group_38466] +[group_38467] +[group_38468] +[group_38469] +[group_38470] +[group_38471] +[group_38472] +[group_38473] +[group_38474] +[group_38475] +[group_38476] +[group_38477] +[group_38478] +[group_38479] +[group_38480] +[group_38481] +[group_38482] +[group_38483] +[group_38484] +[group_38485] +[group_38486] +[group_38487] +[group_38488] +[group_38489] +[group_38490] +[group_38491] +[group_38492] +[group_38493] +[group_38494] +[group_38495] +[group_38496] +[group_38497] +[group_38498] +[group_38499] +[group_38500] +[group_38501] +[group_38502] +[group_38503] +[group_38504] +[group_38505] +[group_38506] +[group_38507] +[group_38508] +[group_38509] +[group_38510] +[group_38511] +[group_38512] +[group_38513] +[group_38514] +[group_38515] +[group_38516] +[group_38517] +[group_38518] +[group_38519] +[group_38520] +[group_38521] +[group_38522] +[group_38523] +[group_38524] +[group_38525] +[group_38526] +[group_38527] +[group_38528] +[group_38529] +[group_38530] +[group_38531] +[group_38532] +[group_38533] +[group_38534] +[group_38535] +[group_38536] +[group_38537] +[group_38538] +[group_38539] +[group_38540] +[group_38541] +[group_38542] +[group_38543] +[group_38544] +[group_38545] +[group_38546] +[group_38547] +[group_38548] +[group_38549] +[group_38550] +[group_38551] +[group_38552] +[group_38553] +[group_38554] +[group_38555] +[group_38556] +[group_38557] +[group_38558] +[group_38559] +[group_38560] +[group_38561] +[group_38562] +[group_38563] +[group_38564] +[group_38565] +[group_38566] +[group_38567] +[group_38568] +[group_38569] +[group_38570] +[group_38571] +[group_38572] +[group_38573] +[group_38574] +[group_38575] +[group_38576] +[group_38577] +[group_38578] +[group_38579] +[group_38580] +[group_38581] +[group_38582] +[group_38583] +[group_38584] +[group_38585] +[group_38586] +[group_38587] +[group_38588] +[group_38589] +[group_38590] +[group_38591] +[group_38592] +[group_38593] +[group_38594] +[group_38595] +[group_38596] +[group_38597] +[group_38598] +[group_38599] +[group_38600] +[group_38601] +[group_38602] +[group_38603] +[group_38604] +[group_38605] +[group_38606] +[group_38607] +[group_38608] +[group_38609] +[group_38610] +[group_38611] +[group_38612] +[group_38613] +[group_38614] +[group_38615] +[group_38616] +[group_38617] +[group_38618] +[group_38619] +[group_38620] +[group_38621] +[group_38622] +[group_38623] +[group_38624] +[group_38625] +[group_38626] +[group_38627] +[group_38628] +[group_38629] +[group_38630] +[group_38631] +[group_38632] +[group_38633] +[group_38634] +[group_38635] +[group_38636] +[group_38637] +[group_38638] +[group_38639] +[group_38640] +[group_38641] +[group_38642] +[group_38643] +[group_38644] +[group_38645] +[group_38646] +[group_38647] +[group_38648] +[group_38649] +[group_38650] +[group_38651] +[group_38652] +[group_38653] +[group_38654] +[group_38655] +[group_38656] +[group_38657] +[group_38658] +[group_38659] +[group_38660] +[group_38661] +[group_38662] +[group_38663] +[group_38664] +[group_38665] +[group_38666] +[group_38667] +[group_38668] +[group_38669] +[group_38670] +[group_38671] +[group_38672] +[group_38673] +[group_38674] +[group_38675] +[group_38676] +[group_38677] +[group_38678] +[group_38679] +[group_38680] +[group_38681] +[group_38682] +[group_38683] +[group_38684] +[group_38685] +[group_38686] +[group_38687] +[group_38688] +[group_38689] +[group_38690] +[group_38691] +[group_38692] +[group_38693] +[group_38694] +[group_38695] +[group_38696] +[group_38697] +[group_38698] +[group_38699] +[group_38700] +[group_38701] +[group_38702] +[group_38703] +[group_38704] +[group_38705] +[group_38706] +[group_38707] +[group_38708] +[group_38709] +[group_38710] +[group_38711] +[group_38712] +[group_38713] +[group_38714] +[group_38715] +[group_38716] +[group_38717] +[group_38718] +[group_38719] +[group_38720] +[group_38721] +[group_38722] +[group_38723] +[group_38724] +[group_38725] +[group_38726] +[group_38727] +[group_38728] +[group_38729] +[group_38730] +[group_38731] +[group_38732] +[group_38733] +[group_38734] +[group_38735] +[group_38736] +[group_38737] +[group_38738] +[group_38739] +[group_38740] +[group_38741] +[group_38742] +[group_38743] +[group_38744] +[group_38745] +[group_38746] +[group_38747] +[group_38748] +[group_38749] +[group_38750] +[group_38751] +[group_38752] +[group_38753] +[group_38754] +[group_38755] +[group_38756] +[group_38757] +[group_38758] +[group_38759] +[group_38760] +[group_38761] +[group_38762] +[group_38763] +[group_38764] +[group_38765] +[group_38766] +[group_38767] +[group_38768] +[group_38769] +[group_38770] +[group_38771] +[group_38772] +[group_38773] +[group_38774] +[group_38775] +[group_38776] +[group_38777] +[group_38778] +[group_38779] +[group_38780] +[group_38781] +[group_38782] +[group_38783] +[group_38784] +[group_38785] +[group_38786] +[group_38787] +[group_38788] +[group_38789] +[group_38790] +[group_38791] +[group_38792] +[group_38793] +[group_38794] +[group_38795] +[group_38796] +[group_38797] +[group_38798] +[group_38799] +[group_38800] +[group_38801] +[group_38802] +[group_38803] +[group_38804] +[group_38805] +[group_38806] +[group_38807] +[group_38808] +[group_38809] +[group_38810] +[group_38811] +[group_38812] +[group_38813] +[group_38814] +[group_38815] +[group_38816] +[group_38817] +[group_38818] +[group_38819] +[group_38820] +[group_38821] +[group_38822] +[group_38823] +[group_38824] +[group_38825] +[group_38826] +[group_38827] +[group_38828] +[group_38829] +[group_38830] +[group_38831] +[group_38832] +[group_38833] +[group_38834] +[group_38835] +[group_38836] +[group_38837] +[group_38838] +[group_38839] +[group_38840] +[group_38841] +[group_38842] +[group_38843] +[group_38844] +[group_38845] +[group_38846] +[group_38847] +[group_38848] +[group_38849] +[group_38850] +[group_38851] +[group_38852] +[group_38853] +[group_38854] +[group_38855] +[group_38856] +[group_38857] +[group_38858] +[group_38859] +[group_38860] +[group_38861] +[group_38862] +[group_38863] +[group_38864] +[group_38865] +[group_38866] +[group_38867] +[group_38868] +[group_38869] +[group_38870] +[group_38871] +[group_38872] +[group_38873] +[group_38874] +[group_38875] +[group_38876] +[group_38877] +[group_38878] +[group_38879] +[group_38880] +[group_38881] +[group_38882] +[group_38883] +[group_38884] +[group_38885] +[group_38886] +[group_38887] +[group_38888] +[group_38889] +[group_38890] +[group_38891] +[group_38892] +[group_38893] +[group_38894] +[group_38895] +[group_38896] +[group_38897] +[group_38898] +[group_38899] +[group_38900] +[group_38901] +[group_38902] +[group_38903] +[group_38904] +[group_38905] +[group_38906] +[group_38907] +[group_38908] +[group_38909] +[group_38910] +[group_38911] +[group_38912] +[group_38913] +[group_38914] +[group_38915] +[group_38916] +[group_38917] +[group_38918] +[group_38919] +[group_38920] +[group_38921] +[group_38922] +[group_38923] +[group_38924] +[group_38925] +[group_38926] +[group_38927] +[group_38928] +[group_38929] +[group_38930] +[group_38931] +[group_38932] +[group_38933] +[group_38934] +[group_38935] +[group_38936] +[group_38937] +[group_38938] +[group_38939] +[group_38940] +[group_38941] +[group_38942] +[group_38943] +[group_38944] +[group_38945] +[group_38946] +[group_38947] +[group_38948] +[group_38949] +[group_38950] +[group_38951] +[group_38952] +[group_38953] +[group_38954] +[group_38955] +[group_38956] +[group_38957] +[group_38958] +[group_38959] +[group_38960] +[group_38961] +[group_38962] +[group_38963] +[group_38964] +[group_38965] +[group_38966] +[group_38967] +[group_38968] +[group_38969] +[group_38970] +[group_38971] +[group_38972] +[group_38973] +[group_38974] +[group_38975] +[group_38976] +[group_38977] +[group_38978] +[group_38979] +[group_38980] +[group_38981] +[group_38982] +[group_38983] +[group_38984] +[group_38985] +[group_38986] +[group_38987] +[group_38988] +[group_38989] +[group_38990] +[group_38991] +[group_38992] +[group_38993] +[group_38994] +[group_38995] +[group_38996] +[group_38997] +[group_38998] +[group_38999] +[group_39000] +[group_39001] +[group_39002] +[group_39003] +[group_39004] +[group_39005] +[group_39006] +[group_39007] +[group_39008] +[group_39009] +[group_39010] +[group_39011] +[group_39012] +[group_39013] +[group_39014] +[group_39015] +[group_39016] +[group_39017] +[group_39018] +[group_39019] +[group_39020] +[group_39021] +[group_39022] +[group_39023] +[group_39024] +[group_39025] +[group_39026] +[group_39027] +[group_39028] +[group_39029] +[group_39030] +[group_39031] +[group_39032] +[group_39033] +[group_39034] +[group_39035] +[group_39036] +[group_39037] +[group_39038] +[group_39039] +[group_39040] +[group_39041] +[group_39042] +[group_39043] +[group_39044] +[group_39045] +[group_39046] +[group_39047] +[group_39048] +[group_39049] +[group_39050] +[group_39051] +[group_39052] +[group_39053] +[group_39054] +[group_39055] +[group_39056] +[group_39057] +[group_39058] +[group_39059] +[group_39060] +[group_39061] +[group_39062] +[group_39063] +[group_39064] +[group_39065] +[group_39066] +[group_39067] +[group_39068] +[group_39069] +[group_39070] +[group_39071] +[group_39072] +[group_39073] +[group_39074] +[group_39075] +[group_39076] +[group_39077] +[group_39078] +[group_39079] +[group_39080] +[group_39081] +[group_39082] +[group_39083] +[group_39084] +[group_39085] +[group_39086] +[group_39087] +[group_39088] +[group_39089] +[group_39090] +[group_39091] +[group_39092] +[group_39093] +[group_39094] +[group_39095] +[group_39096] +[group_39097] +[group_39098] +[group_39099] +[group_39100] +[group_39101] +[group_39102] +[group_39103] +[group_39104] +[group_39105] +[group_39106] +[group_39107] +[group_39108] +[group_39109] +[group_39110] +[group_39111] +[group_39112] +[group_39113] +[group_39114] +[group_39115] +[group_39116] +[group_39117] +[group_39118] +[group_39119] +[group_39120] +[group_39121] +[group_39122] +[group_39123] +[group_39124] +[group_39125] +[group_39126] +[group_39127] +[group_39128] +[group_39129] +[group_39130] +[group_39131] +[group_39132] +[group_39133] +[group_39134] +[group_39135] +[group_39136] +[group_39137] +[group_39138] +[group_39139] +[group_39140] +[group_39141] +[group_39142] +[group_39143] +[group_39144] +[group_39145] +[group_39146] +[group_39147] +[group_39148] +[group_39149] +[group_39150] +[group_39151] +[group_39152] +[group_39153] +[group_39154] +[group_39155] +[group_39156] +[group_39157] +[group_39158] +[group_39159] +[group_39160] +[group_39161] +[group_39162] +[group_39163] +[group_39164] +[group_39165] +[group_39166] +[group_39167] +[group_39168] +[group_39169] +[group_39170] +[group_39171] +[group_39172] +[group_39173] +[group_39174] +[group_39175] +[group_39176] +[group_39177] +[group_39178] +[group_39179] +[group_39180] +[group_39181] +[group_39182] +[group_39183] +[group_39184] +[group_39185] +[group_39186] +[group_39187] +[group_39188] +[group_39189] +[group_39190] +[group_39191] +[group_39192] +[group_39193] +[group_39194] +[group_39195] +[group_39196] +[group_39197] +[group_39198] +[group_39199] +[group_39200] +[group_39201] +[group_39202] +[group_39203] +[group_39204] +[group_39205] +[group_39206] +[group_39207] +[group_39208] +[group_39209] +[group_39210] +[group_39211] +[group_39212] +[group_39213] +[group_39214] +[group_39215] +[group_39216] +[group_39217] +[group_39218] +[group_39219] +[group_39220] +[group_39221] +[group_39222] +[group_39223] +[group_39224] +[group_39225] +[group_39226] +[group_39227] +[group_39228] +[group_39229] +[group_39230] +[group_39231] +[group_39232] +[group_39233] +[group_39234] +[group_39235] +[group_39236] +[group_39237] +[group_39238] +[group_39239] +[group_39240] +[group_39241] +[group_39242] +[group_39243] +[group_39244] +[group_39245] +[group_39246] +[group_39247] +[group_39248] +[group_39249] +[group_39250] +[group_39251] +[group_39252] +[group_39253] +[group_39254] +[group_39255] +[group_39256] +[group_39257] +[group_39258] +[group_39259] +[group_39260] +[group_39261] +[group_39262] +[group_39263] +[group_39264] +[group_39265] +[group_39266] +[group_39267] +[group_39268] +[group_39269] +[group_39270] +[group_39271] +[group_39272] +[group_39273] +[group_39274] +[group_39275] +[group_39276] +[group_39277] +[group_39278] +[group_39279] +[group_39280] +[group_39281] +[group_39282] +[group_39283] +[group_39284] +[group_39285] +[group_39286] +[group_39287] +[group_39288] +[group_39289] +[group_39290] +[group_39291] +[group_39292] +[group_39293] +[group_39294] +[group_39295] +[group_39296] +[group_39297] +[group_39298] +[group_39299] +[group_39300] +[group_39301] +[group_39302] +[group_39303] +[group_39304] +[group_39305] +[group_39306] +[group_39307] +[group_39308] +[group_39309] +[group_39310] +[group_39311] +[group_39312] +[group_39313] +[group_39314] +[group_39315] +[group_39316] +[group_39317] +[group_39318] +[group_39319] +[group_39320] +[group_39321] +[group_39322] +[group_39323] +[group_39324] +[group_39325] +[group_39326] +[group_39327] +[group_39328] +[group_39329] +[group_39330] +[group_39331] +[group_39332] +[group_39333] +[group_39334] +[group_39335] +[group_39336] +[group_39337] +[group_39338] +[group_39339] +[group_39340] +[group_39341] +[group_39342] +[group_39343] +[group_39344] +[group_39345] +[group_39346] +[group_39347] +[group_39348] +[group_39349] +[group_39350] +[group_39351] +[group_39352] +[group_39353] +[group_39354] +[group_39355] +[group_39356] +[group_39357] +[group_39358] +[group_39359] +[group_39360] +[group_39361] +[group_39362] +[group_39363] +[group_39364] +[group_39365] +[group_39366] +[group_39367] +[group_39368] +[group_39369] +[group_39370] +[group_39371] +[group_39372] +[group_39373] +[group_39374] +[group_39375] +[group_39376] +[group_39377] +[group_39378] +[group_39379] +[group_39380] +[group_39381] +[group_39382] +[group_39383] +[group_39384] +[group_39385] +[group_39386] +[group_39387] +[group_39388] +[group_39389] +[group_39390] +[group_39391] +[group_39392] +[group_39393] +[group_39394] +[group_39395] +[group_39396] +[group_39397] +[group_39398] +[group_39399] +[group_39400] +[group_39401] +[group_39402] +[group_39403] +[group_39404] +[group_39405] +[group_39406] +[group_39407] +[group_39408] +[group_39409] +[group_39410] +[group_39411] +[group_39412] +[group_39413] +[group_39414] +[group_39415] +[group_39416] +[group_39417] +[group_39418] +[group_39419] +[group_39420] +[group_39421] +[group_39422] +[group_39423] +[group_39424] +[group_39425] +[group_39426] +[group_39427] +[group_39428] +[group_39429] +[group_39430] +[group_39431] +[group_39432] +[group_39433] +[group_39434] +[group_39435] +[group_39436] +[group_39437] +[group_39438] +[group_39439] +[group_39440] +[group_39441] +[group_39442] +[group_39443] +[group_39444] +[group_39445] +[group_39446] +[group_39447] +[group_39448] +[group_39449] +[group_39450] +[group_39451] +[group_39452] +[group_39453] +[group_39454] +[group_39455] +[group_39456] +[group_39457] +[group_39458] +[group_39459] +[group_39460] +[group_39461] +[group_39462] +[group_39463] +[group_39464] +[group_39465] +[group_39466] +[group_39467] +[group_39468] +[group_39469] +[group_39470] +[group_39471] +[group_39472] +[group_39473] +[group_39474] +[group_39475] +[group_39476] +[group_39477] +[group_39478] +[group_39479] +[group_39480] +[group_39481] +[group_39482] +[group_39483] +[group_39484] +[group_39485] +[group_39486] +[group_39487] +[group_39488] +[group_39489] +[group_39490] +[group_39491] +[group_39492] +[group_39493] +[group_39494] +[group_39495] +[group_39496] +[group_39497] +[group_39498] +[group_39499] +[group_39500] +[group_39501] +[group_39502] +[group_39503] +[group_39504] +[group_39505] +[group_39506] +[group_39507] +[group_39508] +[group_39509] +[group_39510] +[group_39511] +[group_39512] +[group_39513] +[group_39514] +[group_39515] +[group_39516] +[group_39517] +[group_39518] +[group_39519] +[group_39520] +[group_39521] +[group_39522] +[group_39523] +[group_39524] +[group_39525] +[group_39526] +[group_39527] +[group_39528] +[group_39529] +[group_39530] +[group_39531] +[group_39532] +[group_39533] +[group_39534] +[group_39535] +[group_39536] +[group_39537] +[group_39538] +[group_39539] +[group_39540] +[group_39541] +[group_39542] +[group_39543] +[group_39544] +[group_39545] +[group_39546] +[group_39547] +[group_39548] +[group_39549] +[group_39550] +[group_39551] +[group_39552] +[group_39553] +[group_39554] +[group_39555] +[group_39556] +[group_39557] +[group_39558] +[group_39559] +[group_39560] +[group_39561] +[group_39562] +[group_39563] +[group_39564] +[group_39565] +[group_39566] +[group_39567] +[group_39568] +[group_39569] +[group_39570] +[group_39571] +[group_39572] +[group_39573] +[group_39574] +[group_39575] +[group_39576] +[group_39577] +[group_39578] +[group_39579] +[group_39580] +[group_39581] +[group_39582] +[group_39583] +[group_39584] +[group_39585] +[group_39586] +[group_39587] +[group_39588] +[group_39589] +[group_39590] +[group_39591] +[group_39592] +[group_39593] +[group_39594] +[group_39595] +[group_39596] +[group_39597] +[group_39598] +[group_39599] +[group_39600] +[group_39601] +[group_39602] +[group_39603] +[group_39604] +[group_39605] +[group_39606] +[group_39607] +[group_39608] +[group_39609] +[group_39610] +[group_39611] +[group_39612] +[group_39613] +[group_39614] +[group_39615] +[group_39616] +[group_39617] +[group_39618] +[group_39619] +[group_39620] +[group_39621] +[group_39622] +[group_39623] +[group_39624] +[group_39625] +[group_39626] +[group_39627] +[group_39628] +[group_39629] +[group_39630] +[group_39631] +[group_39632] +[group_39633] +[group_39634] +[group_39635] +[group_39636] +[group_39637] +[group_39638] +[group_39639] +[group_39640] +[group_39641] +[group_39642] +[group_39643] +[group_39644] +[group_39645] +[group_39646] +[group_39647] +[group_39648] +[group_39649] +[group_39650] +[group_39651] +[group_39652] +[group_39653] +[group_39654] +[group_39655] +[group_39656] +[group_39657] +[group_39658] +[group_39659] +[group_39660] +[group_39661] +[group_39662] +[group_39663] +[group_39664] +[group_39665] +[group_39666] +[group_39667] +[group_39668] +[group_39669] +[group_39670] +[group_39671] +[group_39672] +[group_39673] +[group_39674] +[group_39675] +[group_39676] +[group_39677] +[group_39678] +[group_39679] +[group_39680] +[group_39681] +[group_39682] +[group_39683] +[group_39684] +[group_39685] +[group_39686] +[group_39687] +[group_39688] +[group_39689] +[group_39690] +[group_39691] +[group_39692] +[group_39693] +[group_39694] +[group_39695] +[group_39696] +[group_39697] +[group_39698] +[group_39699] +[group_39700] +[group_39701] +[group_39702] +[group_39703] +[group_39704] +[group_39705] +[group_39706] +[group_39707] +[group_39708] +[group_39709] +[group_39710] +[group_39711] +[group_39712] +[group_39713] +[group_39714] +[group_39715] +[group_39716] +[group_39717] +[group_39718] +[group_39719] +[group_39720] +[group_39721] +[group_39722] +[group_39723] +[group_39724] +[group_39725] +[group_39726] +[group_39727] +[group_39728] +[group_39729] +[group_39730] +[group_39731] +[group_39732] +[group_39733] +[group_39734] +[group_39735] +[group_39736] +[group_39737] +[group_39738] +[group_39739] +[group_39740] +[group_39741] +[group_39742] +[group_39743] +[group_39744] +[group_39745] +[group_39746] +[group_39747] +[group_39748] +[group_39749] +[group_39750] +[group_39751] +[group_39752] +[group_39753] +[group_39754] +[group_39755] +[group_39756] +[group_39757] +[group_39758] +[group_39759] +[group_39760] +[group_39761] +[group_39762] +[group_39763] +[group_39764] +[group_39765] +[group_39766] +[group_39767] +[group_39768] +[group_39769] +[group_39770] +[group_39771] +[group_39772] +[group_39773] +[group_39774] +[group_39775] +[group_39776] +[group_39777] +[group_39778] +[group_39779] +[group_39780] +[group_39781] +[group_39782] +[group_39783] +[group_39784] +[group_39785] +[group_39786] +[group_39787] +[group_39788] +[group_39789] +[group_39790] +[group_39791] +[group_39792] +[group_39793] +[group_39794] +[group_39795] +[group_39796] +[group_39797] +[group_39798] +[group_39799] +[group_39800] +[group_39801] +[group_39802] +[group_39803] +[group_39804] +[group_39805] +[group_39806] +[group_39807] +[group_39808] +[group_39809] +[group_39810] +[group_39811] +[group_39812] +[group_39813] +[group_39814] +[group_39815] +[group_39816] +[group_39817] +[group_39818] +[group_39819] +[group_39820] +[group_39821] +[group_39822] +[group_39823] +[group_39824] +[group_39825] +[group_39826] +[group_39827] +[group_39828] +[group_39829] +[group_39830] +[group_39831] +[group_39832] +[group_39833] +[group_39834] +[group_39835] +[group_39836] +[group_39837] +[group_39838] +[group_39839] +[group_39840] +[group_39841] +[group_39842] +[group_39843] +[group_39844] +[group_39845] +[group_39846] +[group_39847] +[group_39848] +[group_39849] +[group_39850] +[group_39851] +[group_39852] +[group_39853] +[group_39854] +[group_39855] +[group_39856] +[group_39857] +[group_39858] +[group_39859] +[group_39860] +[group_39861] +[group_39862] +[group_39863] +[group_39864] +[group_39865] +[group_39866] +[group_39867] +[group_39868] +[group_39869] +[group_39870] +[group_39871] +[group_39872] +[group_39873] +[group_39874] +[group_39875] +[group_39876] +[group_39877] +[group_39878] +[group_39879] +[group_39880] +[group_39881] +[group_39882] +[group_39883] +[group_39884] +[group_39885] +[group_39886] +[group_39887] +[group_39888] +[group_39889] +[group_39890] +[group_39891] +[group_39892] +[group_39893] +[group_39894] +[group_39895] +[group_39896] +[group_39897] +[group_39898] +[group_39899] +[group_39900] +[group_39901] +[group_39902] +[group_39903] +[group_39904] +[group_39905] +[group_39906] +[group_39907] +[group_39908] +[group_39909] +[group_39910] +[group_39911] +[group_39912] +[group_39913] +[group_39914] +[group_39915] +[group_39916] +[group_39917] +[group_39918] +[group_39919] +[group_39920] +[group_39921] +[group_39922] +[group_39923] +[group_39924] +[group_39925] +[group_39926] +[group_39927] +[group_39928] +[group_39929] +[group_39930] +[group_39931] +[group_39932] +[group_39933] +[group_39934] +[group_39935] +[group_39936] +[group_39937] +[group_39938] +[group_39939] +[group_39940] +[group_39941] +[group_39942] +[group_39943] +[group_39944] +[group_39945] +[group_39946] +[group_39947] +[group_39948] +[group_39949] +[group_39950] +[group_39951] +[group_39952] +[group_39953] +[group_39954] +[group_39955] +[group_39956] +[group_39957] +[group_39958] +[group_39959] +[group_39960] +[group_39961] +[group_39962] +[group_39963] +[group_39964] +[group_39965] +[group_39966] +[group_39967] +[group_39968] +[group_39969] +[group_39970] +[group_39971] +[group_39972] +[group_39973] +[group_39974] +[group_39975] +[group_39976] +[group_39977] +[group_39978] +[group_39979] +[group_39980] +[group_39981] +[group_39982] +[group_39983] +[group_39984] +[group_39985] +[group_39986] +[group_39987] +[group_39988] +[group_39989] +[group_39990] +[group_39991] +[group_39992] +[group_39993] +[group_39994] +[group_39995] +[group_39996] +[group_39997] +[group_39998] +[group_39999] +[group_40000] +[group_40001] +[group_40002] +[group_40003] +[group_40004] +[group_40005] +[group_40006] +[group_40007] +[group_40008] +[group_40009] +[group_40010] +[group_40011] +[group_40012] +[group_40013] +[group_40014] +[group_40015] +[group_40016] +[group_40017] +[group_40018] +[group_40019] +[group_40020] +[group_40021] +[group_40022] +[group_40023] +[group_40024] +[group_40025] +[group_40026] +[group_40027] +[group_40028] +[group_40029] +[group_40030] +[group_40031] +[group_40032] +[group_40033] +[group_40034] +[group_40035] +[group_40036] +[group_40037] +[group_40038] +[group_40039] +[group_40040] +[group_40041] +[group_40042] +[group_40043] +[group_40044] +[group_40045] +[group_40046] +[group_40047] +[group_40048] +[group_40049] +[group_40050] +[group_40051] +[group_40052] +[group_40053] +[group_40054] +[group_40055] +[group_40056] +[group_40057] +[group_40058] +[group_40059] +[group_40060] +[group_40061] +[group_40062] +[group_40063] +[group_40064] +[group_40065] +[group_40066] +[group_40067] +[group_40068] +[group_40069] +[group_40070] +[group_40071] +[group_40072] +[group_40073] +[group_40074] +[group_40075] +[group_40076] +[group_40077] +[group_40078] +[group_40079] +[group_40080] +[group_40081] +[group_40082] +[group_40083] +[group_40084] +[group_40085] +[group_40086] +[group_40087] +[group_40088] +[group_40089] +[group_40090] +[group_40091] +[group_40092] +[group_40093] +[group_40094] +[group_40095] +[group_40096] +[group_40097] +[group_40098] +[group_40099] +[group_40100] +[group_40101] +[group_40102] +[group_40103] +[group_40104] +[group_40105] +[group_40106] +[group_40107] +[group_40108] +[group_40109] +[group_40110] +[group_40111] +[group_40112] +[group_40113] +[group_40114] +[group_40115] +[group_40116] +[group_40117] +[group_40118] +[group_40119] +[group_40120] +[group_40121] +[group_40122] +[group_40123] +[group_40124] +[group_40125] +[group_40126] +[group_40127] +[group_40128] +[group_40129] +[group_40130] +[group_40131] +[group_40132] +[group_40133] +[group_40134] +[group_40135] +[group_40136] +[group_40137] +[group_40138] +[group_40139] +[group_40140] +[group_40141] +[group_40142] +[group_40143] +[group_40144] +[group_40145] +[group_40146] +[group_40147] +[group_40148] +[group_40149] +[group_40150] +[group_40151] +[group_40152] +[group_40153] +[group_40154] +[group_40155] +[group_40156] +[group_40157] +[group_40158] +[group_40159] +[group_40160] +[group_40161] +[group_40162] +[group_40163] +[group_40164] +[group_40165] +[group_40166] +[group_40167] +[group_40168] +[group_40169] +[group_40170] +[group_40171] +[group_40172] +[group_40173] +[group_40174] +[group_40175] +[group_40176] +[group_40177] +[group_40178] +[group_40179] +[group_40180] +[group_40181] +[group_40182] +[group_40183] +[group_40184] +[group_40185] +[group_40186] +[group_40187] +[group_40188] +[group_40189] +[group_40190] +[group_40191] +[group_40192] +[group_40193] +[group_40194] +[group_40195] +[group_40196] +[group_40197] +[group_40198] +[group_40199] +[group_40200] +[group_40201] +[group_40202] +[group_40203] +[group_40204] +[group_40205] +[group_40206] +[group_40207] +[group_40208] +[group_40209] +[group_40210] +[group_40211] +[group_40212] +[group_40213] +[group_40214] +[group_40215] +[group_40216] +[group_40217] +[group_40218] +[group_40219] +[group_40220] +[group_40221] +[group_40222] +[group_40223] +[group_40224] +[group_40225] +[group_40226] +[group_40227] +[group_40228] +[group_40229] +[group_40230] +[group_40231] +[group_40232] +[group_40233] +[group_40234] +[group_40235] +[group_40236] +[group_40237] +[group_40238] +[group_40239] +[group_40240] +[group_40241] +[group_40242] +[group_40243] +[group_40244] +[group_40245] +[group_40246] +[group_40247] +[group_40248] +[group_40249] +[group_40250] +[group_40251] +[group_40252] +[group_40253] +[group_40254] +[group_40255] +[group_40256] +[group_40257] +[group_40258] +[group_40259] +[group_40260] +[group_40261] +[group_40262] +[group_40263] +[group_40264] +[group_40265] +[group_40266] +[group_40267] +[group_40268] +[group_40269] +[group_40270] +[group_40271] +[group_40272] +[group_40273] +[group_40274] +[group_40275] +[group_40276] +[group_40277] +[group_40278] +[group_40279] +[group_40280] +[group_40281] +[group_40282] +[group_40283] +[group_40284] +[group_40285] +[group_40286] +[group_40287] +[group_40288] +[group_40289] +[group_40290] +[group_40291] +[group_40292] +[group_40293] +[group_40294] +[group_40295] +[group_40296] +[group_40297] +[group_40298] +[group_40299] +[group_40300] +[group_40301] +[group_40302] +[group_40303] +[group_40304] +[group_40305] +[group_40306] +[group_40307] +[group_40308] +[group_40309] +[group_40310] +[group_40311] +[group_40312] +[group_40313] +[group_40314] +[group_40315] +[group_40316] +[group_40317] +[group_40318] +[group_40319] +[group_40320] +[group_40321] +[group_40322] +[group_40323] +[group_40324] +[group_40325] +[group_40326] +[group_40327] +[group_40328] +[group_40329] +[group_40330] +[group_40331] +[group_40332] +[group_40333] +[group_40334] +[group_40335] +[group_40336] +[group_40337] +[group_40338] +[group_40339] +[group_40340] +[group_40341] +[group_40342] +[group_40343] +[group_40344] +[group_40345] +[group_40346] +[group_40347] +[group_40348] +[group_40349] +[group_40350] +[group_40351] +[group_40352] +[group_40353] +[group_40354] +[group_40355] +[group_40356] +[group_40357] +[group_40358] +[group_40359] +[group_40360] +[group_40361] +[group_40362] +[group_40363] +[group_40364] +[group_40365] +[group_40366] +[group_40367] +[group_40368] +[group_40369] +[group_40370] +[group_40371] +[group_40372] +[group_40373] +[group_40374] +[group_40375] +[group_40376] +[group_40377] +[group_40378] +[group_40379] +[group_40380] +[group_40381] +[group_40382] +[group_40383] +[group_40384] +[group_40385] +[group_40386] +[group_40387] +[group_40388] +[group_40389] +[group_40390] +[group_40391] +[group_40392] +[group_40393] +[group_40394] +[group_40395] +[group_40396] +[group_40397] +[group_40398] +[group_40399] +[group_40400] +[group_40401] +[group_40402] +[group_40403] +[group_40404] +[group_40405] +[group_40406] +[group_40407] +[group_40408] +[group_40409] +[group_40410] +[group_40411] +[group_40412] +[group_40413] +[group_40414] +[group_40415] +[group_40416] +[group_40417] +[group_40418] +[group_40419] +[group_40420] +[group_40421] +[group_40422] +[group_40423] +[group_40424] +[group_40425] +[group_40426] +[group_40427] +[group_40428] +[group_40429] +[group_40430] +[group_40431] +[group_40432] +[group_40433] +[group_40434] +[group_40435] +[group_40436] +[group_40437] +[group_40438] +[group_40439] +[group_40440] +[group_40441] +[group_40442] +[group_40443] +[group_40444] +[group_40445] +[group_40446] +[group_40447] +[group_40448] +[group_40449] +[group_40450] +[group_40451] +[group_40452] +[group_40453] +[group_40454] +[group_40455] +[group_40456] +[group_40457] +[group_40458] +[group_40459] +[group_40460] +[group_40461] +[group_40462] +[group_40463] +[group_40464] +[group_40465] +[group_40466] +[group_40467] +[group_40468] +[group_40469] +[group_40470] +[group_40471] +[group_40472] +[group_40473] +[group_40474] +[group_40475] +[group_40476] +[group_40477] +[group_40478] +[group_40479] +[group_40480] +[group_40481] +[group_40482] +[group_40483] +[group_40484] +[group_40485] +[group_40486] +[group_40487] +[group_40488] +[group_40489] +[group_40490] +[group_40491] +[group_40492] +[group_40493] +[group_40494] +[group_40495] +[group_40496] +[group_40497] +[group_40498] +[group_40499] +[group_40500] +[group_40501] +[group_40502] +[group_40503] +[group_40504] +[group_40505] +[group_40506] +[group_40507] +[group_40508] +[group_40509] +[group_40510] +[group_40511] +[group_40512] +[group_40513] +[group_40514] +[group_40515] +[group_40516] +[group_40517] +[group_40518] +[group_40519] +[group_40520] +[group_40521] +[group_40522] +[group_40523] +[group_40524] +[group_40525] +[group_40526] +[group_40527] +[group_40528] +[group_40529] +[group_40530] +[group_40531] +[group_40532] +[group_40533] +[group_40534] +[group_40535] +[group_40536] +[group_40537] +[group_40538] +[group_40539] +[group_40540] +[group_40541] +[group_40542] +[group_40543] +[group_40544] +[group_40545] +[group_40546] +[group_40547] +[group_40548] +[group_40549] +[group_40550] +[group_40551] +[group_40552] +[group_40553] +[group_40554] +[group_40555] +[group_40556] +[group_40557] +[group_40558] +[group_40559] +[group_40560] +[group_40561] +[group_40562] +[group_40563] +[group_40564] +[group_40565] +[group_40566] +[group_40567] +[group_40568] +[group_40569] +[group_40570] +[group_40571] +[group_40572] +[group_40573] +[group_40574] +[group_40575] +[group_40576] +[group_40577] +[group_40578] +[group_40579] +[group_40580] +[group_40581] +[group_40582] +[group_40583] +[group_40584] +[group_40585] +[group_40586] +[group_40587] +[group_40588] +[group_40589] +[group_40590] +[group_40591] +[group_40592] +[group_40593] +[group_40594] +[group_40595] +[group_40596] +[group_40597] +[group_40598] +[group_40599] +[group_40600] +[group_40601] +[group_40602] +[group_40603] +[group_40604] +[group_40605] +[group_40606] +[group_40607] +[group_40608] +[group_40609] +[group_40610] +[group_40611] +[group_40612] +[group_40613] +[group_40614] +[group_40615] +[group_40616] +[group_40617] +[group_40618] +[group_40619] +[group_40620] +[group_40621] +[group_40622] +[group_40623] +[group_40624] +[group_40625] +[group_40626] +[group_40627] +[group_40628] +[group_40629] +[group_40630] +[group_40631] +[group_40632] +[group_40633] +[group_40634] +[group_40635] +[group_40636] +[group_40637] +[group_40638] +[group_40639] +[group_40640] +[group_40641] +[group_40642] +[group_40643] +[group_40644] +[group_40645] +[group_40646] +[group_40647] +[group_40648] +[group_40649] +[group_40650] +[group_40651] +[group_40652] +[group_40653] +[group_40654] +[group_40655] +[group_40656] +[group_40657] +[group_40658] +[group_40659] +[group_40660] +[group_40661] +[group_40662] +[group_40663] +[group_40664] +[group_40665] +[group_40666] +[group_40667] +[group_40668] +[group_40669] +[group_40670] +[group_40671] +[group_40672] +[group_40673] +[group_40674] +[group_40675] +[group_40676] +[group_40677] +[group_40678] +[group_40679] +[group_40680] +[group_40681] +[group_40682] +[group_40683] +[group_40684] +[group_40685] +[group_40686] +[group_40687] +[group_40688] +[group_40689] +[group_40690] +[group_40691] +[group_40692] +[group_40693] +[group_40694] +[group_40695] +[group_40696] +[group_40697] +[group_40698] +[group_40699] +[group_40700] +[group_40701] +[group_40702] +[group_40703] +[group_40704] +[group_40705] +[group_40706] +[group_40707] +[group_40708] +[group_40709] +[group_40710] +[group_40711] +[group_40712] +[group_40713] +[group_40714] +[group_40715] +[group_40716] +[group_40717] +[group_40718] +[group_40719] +[group_40720] +[group_40721] +[group_40722] +[group_40723] +[group_40724] +[group_40725] +[group_40726] +[group_40727] +[group_40728] +[group_40729] +[group_40730] +[group_40731] +[group_40732] +[group_40733] +[group_40734] +[group_40735] +[group_40736] +[group_40737] +[group_40738] +[group_40739] +[group_40740] +[group_40741] +[group_40742] +[group_40743] +[group_40744] +[group_40745] +[group_40746] +[group_40747] +[group_40748] +[group_40749] +[group_40750] +[group_40751] +[group_40752] +[group_40753] +[group_40754] +[group_40755] +[group_40756] +[group_40757] +[group_40758] +[group_40759] +[group_40760] +[group_40761] +[group_40762] +[group_40763] +[group_40764] +[group_40765] +[group_40766] +[group_40767] +[group_40768] +[group_40769] +[group_40770] +[group_40771] +[group_40772] +[group_40773] +[group_40774] +[group_40775] +[group_40776] +[group_40777] +[group_40778] +[group_40779] +[group_40780] +[group_40781] +[group_40782] +[group_40783] +[group_40784] +[group_40785] +[group_40786] +[group_40787] +[group_40788] +[group_40789] +[group_40790] +[group_40791] +[group_40792] +[group_40793] +[group_40794] +[group_40795] +[group_40796] +[group_40797] +[group_40798] +[group_40799] +[group_40800] +[group_40801] +[group_40802] +[group_40803] +[group_40804] +[group_40805] +[group_40806] +[group_40807] +[group_40808] +[group_40809] +[group_40810] +[group_40811] +[group_40812] +[group_40813] +[group_40814] +[group_40815] +[group_40816] +[group_40817] +[group_40818] +[group_40819] +[group_40820] +[group_40821] +[group_40822] +[group_40823] +[group_40824] +[group_40825] +[group_40826] +[group_40827] +[group_40828] +[group_40829] +[group_40830] +[group_40831] +[group_40832] +[group_40833] +[group_40834] +[group_40835] +[group_40836] +[group_40837] +[group_40838] +[group_40839] +[group_40840] +[group_40841] +[group_40842] +[group_40843] +[group_40844] +[group_40845] +[group_40846] +[group_40847] +[group_40848] +[group_40849] +[group_40850] +[group_40851] +[group_40852] +[group_40853] +[group_40854] +[group_40855] +[group_40856] +[group_40857] +[group_40858] +[group_40859] +[group_40860] +[group_40861] +[group_40862] +[group_40863] +[group_40864] +[group_40865] +[group_40866] +[group_40867] +[group_40868] +[group_40869] +[group_40870] +[group_40871] +[group_40872] +[group_40873] +[group_40874] +[group_40875] +[group_40876] +[group_40877] +[group_40878] +[group_40879] +[group_40880] +[group_40881] +[group_40882] +[group_40883] +[group_40884] +[group_40885] +[group_40886] +[group_40887] +[group_40888] +[group_40889] +[group_40890] +[group_40891] +[group_40892] +[group_40893] +[group_40894] +[group_40895] +[group_40896] +[group_40897] +[group_40898] +[group_40899] +[group_40900] +[group_40901] +[group_40902] +[group_40903] +[group_40904] +[group_40905] +[group_40906] +[group_40907] +[group_40908] +[group_40909] +[group_40910] +[group_40911] +[group_40912] +[group_40913] +[group_40914] +[group_40915] +[group_40916] +[group_40917] +[group_40918] +[group_40919] +[group_40920] +[group_40921] +[group_40922] +[group_40923] +[group_40924] +[group_40925] +[group_40926] +[group_40927] +[group_40928] +[group_40929] +[group_40930] +[group_40931] +[group_40932] +[group_40933] +[group_40934] +[group_40935] +[group_40936] +[group_40937] +[group_40938] +[group_40939] +[group_40940] +[group_40941] +[group_40942] +[group_40943] +[group_40944] +[group_40945] +[group_40946] +[group_40947] +[group_40948] +[group_40949] +[group_40950] +[group_40951] +[group_40952] +[group_40953] +[group_40954] +[group_40955] +[group_40956] +[group_40957] +[group_40958] +[group_40959] +[group_40960] +[group_40961] +[group_40962] +[group_40963] +[group_40964] +[group_40965] +[group_40966] +[group_40967] +[group_40968] +[group_40969] +[group_40970] +[group_40971] +[group_40972] +[group_40973] +[group_40974] +[group_40975] +[group_40976] +[group_40977] +[group_40978] +[group_40979] +[group_40980] +[group_40981] +[group_40982] +[group_40983] +[group_40984] +[group_40985] +[group_40986] +[group_40987] +[group_40988] +[group_40989] +[group_40990] +[group_40991] +[group_40992] +[group_40993] +[group_40994] +[group_40995] +[group_40996] +[group_40997] +[group_40998] +[group_40999] +[group_41000] +[group_41001] +[group_41002] +[group_41003] +[group_41004] +[group_41005] +[group_41006] +[group_41007] +[group_41008] +[group_41009] +[group_41010] +[group_41011] +[group_41012] +[group_41013] +[group_41014] +[group_41015] +[group_41016] +[group_41017] +[group_41018] +[group_41019] +[group_41020] +[group_41021] +[group_41022] +[group_41023] +[group_41024] +[group_41025] +[group_41026] +[group_41027] +[group_41028] +[group_41029] +[group_41030] +[group_41031] +[group_41032] +[group_41033] +[group_41034] +[group_41035] +[group_41036] +[group_41037] +[group_41038] +[group_41039] +[group_41040] +[group_41041] +[group_41042] +[group_41043] +[group_41044] +[group_41045] +[group_41046] +[group_41047] +[group_41048] +[group_41049] +[group_41050] +[group_41051] +[group_41052] +[group_41053] +[group_41054] +[group_41055] +[group_41056] +[group_41057] +[group_41058] +[group_41059] +[group_41060] +[group_41061] +[group_41062] +[group_41063] +[group_41064] +[group_41065] +[group_41066] +[group_41067] +[group_41068] +[group_41069] +[group_41070] +[group_41071] +[group_41072] +[group_41073] +[group_41074] +[group_41075] +[group_41076] +[group_41077] +[group_41078] +[group_41079] +[group_41080] +[group_41081] +[group_41082] +[group_41083] +[group_41084] +[group_41085] +[group_41086] +[group_41087] +[group_41088] +[group_41089] +[group_41090] +[group_41091] +[group_41092] +[group_41093] +[group_41094] +[group_41095] +[group_41096] +[group_41097] +[group_41098] +[group_41099] +[group_41100] +[group_41101] +[group_41102] +[group_41103] +[group_41104] +[group_41105] +[group_41106] +[group_41107] +[group_41108] +[group_41109] +[group_41110] +[group_41111] +[group_41112] +[group_41113] +[group_41114] +[group_41115] +[group_41116] +[group_41117] +[group_41118] +[group_41119] +[group_41120] +[group_41121] +[group_41122] +[group_41123] +[group_41124] +[group_41125] +[group_41126] +[group_41127] +[group_41128] +[group_41129] +[group_41130] +[group_41131] +[group_41132] +[group_41133] +[group_41134] +[group_41135] +[group_41136] +[group_41137] +[group_41138] +[group_41139] +[group_41140] +[group_41141] +[group_41142] +[group_41143] +[group_41144] +[group_41145] +[group_41146] +[group_41147] +[group_41148] +[group_41149] +[group_41150] +[group_41151] +[group_41152] +[group_41153] +[group_41154] +[group_41155] +[group_41156] +[group_41157] +[group_41158] +[group_41159] +[group_41160] +[group_41161] +[group_41162] +[group_41163] +[group_41164] +[group_41165] +[group_41166] +[group_41167] +[group_41168] +[group_41169] +[group_41170] +[group_41171] +[group_41172] +[group_41173] +[group_41174] +[group_41175] +[group_41176] +[group_41177] +[group_41178] +[group_41179] +[group_41180] +[group_41181] +[group_41182] +[group_41183] +[group_41184] +[group_41185] +[group_41186] +[group_41187] +[group_41188] +[group_41189] +[group_41190] +[group_41191] +[group_41192] +[group_41193] +[group_41194] +[group_41195] +[group_41196] +[group_41197] +[group_41198] +[group_41199] +[group_41200] +[group_41201] +[group_41202] +[group_41203] +[group_41204] +[group_41205] +[group_41206] +[group_41207] +[group_41208] +[group_41209] +[group_41210] +[group_41211] +[group_41212] +[group_41213] +[group_41214] +[group_41215] +[group_41216] +[group_41217] +[group_41218] +[group_41219] +[group_41220] +[group_41221] +[group_41222] +[group_41223] +[group_41224] +[group_41225] +[group_41226] +[group_41227] +[group_41228] +[group_41229] +[group_41230] +[group_41231] +[group_41232] +[group_41233] +[group_41234] +[group_41235] +[group_41236] +[group_41237] +[group_41238] +[group_41239] +[group_41240] +[group_41241] +[group_41242] +[group_41243] +[group_41244] +[group_41245] +[group_41246] +[group_41247] +[group_41248] +[group_41249] +[group_41250] +[group_41251] +[group_41252] +[group_41253] +[group_41254] +[group_41255] +[group_41256] +[group_41257] +[group_41258] +[group_41259] +[group_41260] +[group_41261] +[group_41262] +[group_41263] +[group_41264] +[group_41265] +[group_41266] +[group_41267] +[group_41268] +[group_41269] +[group_41270] +[group_41271] +[group_41272] +[group_41273] +[group_41274] +[group_41275] +[group_41276] +[group_41277] +[group_41278] +[group_41279] +[group_41280] +[group_41281] +[group_41282] +[group_41283] +[group_41284] +[group_41285] +[group_41286] +[group_41287] +[group_41288] +[group_41289] +[group_41290] +[group_41291] +[group_41292] +[group_41293] +[group_41294] +[group_41295] +[group_41296] +[group_41297] +[group_41298] +[group_41299] +[group_41300] +[group_41301] +[group_41302] +[group_41303] +[group_41304] +[group_41305] +[group_41306] +[group_41307] +[group_41308] +[group_41309] +[group_41310] +[group_41311] +[group_41312] +[group_41313] +[group_41314] +[group_41315] +[group_41316] +[group_41317] +[group_41318] +[group_41319] +[group_41320] +[group_41321] +[group_41322] +[group_41323] +[group_41324] +[group_41325] +[group_41326] +[group_41327] +[group_41328] +[group_41329] +[group_41330] +[group_41331] +[group_41332] +[group_41333] +[group_41334] +[group_41335] +[group_41336] +[group_41337] +[group_41338] +[group_41339] +[group_41340] +[group_41341] +[group_41342] +[group_41343] +[group_41344] +[group_41345] +[group_41346] +[group_41347] +[group_41348] +[group_41349] +[group_41350] +[group_41351] +[group_41352] +[group_41353] +[group_41354] +[group_41355] +[group_41356] +[group_41357] +[group_41358] +[group_41359] +[group_41360] +[group_41361] +[group_41362] +[group_41363] +[group_41364] +[group_41365] +[group_41366] +[group_41367] +[group_41368] +[group_41369] +[group_41370] +[group_41371] +[group_41372] +[group_41373] +[group_41374] +[group_41375] +[group_41376] +[group_41377] +[group_41378] +[group_41379] +[group_41380] +[group_41381] +[group_41382] +[group_41383] +[group_41384] +[group_41385] +[group_41386] +[group_41387] +[group_41388] +[group_41389] +[group_41390] +[group_41391] +[group_41392] +[group_41393] +[group_41394] +[group_41395] +[group_41396] +[group_41397] +[group_41398] +[group_41399] +[group_41400] +[group_41401] +[group_41402] +[group_41403] +[group_41404] +[group_41405] +[group_41406] +[group_41407] +[group_41408] +[group_41409] +[group_41410] +[group_41411] +[group_41412] +[group_41413] +[group_41414] +[group_41415] +[group_41416] +[group_41417] +[group_41418] +[group_41419] +[group_41420] +[group_41421] +[group_41422] +[group_41423] +[group_41424] +[group_41425] +[group_41426] +[group_41427] +[group_41428] +[group_41429] +[group_41430] +[group_41431] +[group_41432] +[group_41433] +[group_41434] +[group_41435] +[group_41436] +[group_41437] +[group_41438] +[group_41439] +[group_41440] +[group_41441] +[group_41442] +[group_41443] +[group_41444] +[group_41445] +[group_41446] +[group_41447] +[group_41448] +[group_41449] +[group_41450] +[group_41451] +[group_41452] +[group_41453] +[group_41454] +[group_41455] +[group_41456] +[group_41457] +[group_41458] +[group_41459] +[group_41460] +[group_41461] +[group_41462] +[group_41463] +[group_41464] +[group_41465] +[group_41466] +[group_41467] +[group_41468] +[group_41469] +[group_41470] +[group_41471] +[group_41472] +[group_41473] +[group_41474] +[group_41475] +[group_41476] +[group_41477] +[group_41478] +[group_41479] +[group_41480] +[group_41481] +[group_41482] +[group_41483] +[group_41484] +[group_41485] +[group_41486] +[group_41487] +[group_41488] +[group_41489] +[group_41490] +[group_41491] +[group_41492] +[group_41493] +[group_41494] +[group_41495] +[group_41496] +[group_41497] +[group_41498] +[group_41499] +[group_41500] +[group_41501] +[group_41502] +[group_41503] +[group_41504] +[group_41505] +[group_41506] +[group_41507] +[group_41508] +[group_41509] +[group_41510] +[group_41511] +[group_41512] +[group_41513] +[group_41514] +[group_41515] +[group_41516] +[group_41517] +[group_41518] +[group_41519] +[group_41520] +[group_41521] +[group_41522] +[group_41523] +[group_41524] +[group_41525] +[group_41526] +[group_41527] +[group_41528] +[group_41529] +[group_41530] +[group_41531] +[group_41532] +[group_41533] +[group_41534] +[group_41535] +[group_41536] +[group_41537] +[group_41538] +[group_41539] +[group_41540] +[group_41541] +[group_41542] +[group_41543] +[group_41544] +[group_41545] +[group_41546] +[group_41547] +[group_41548] +[group_41549] +[group_41550] +[group_41551] +[group_41552] +[group_41553] +[group_41554] +[group_41555] +[group_41556] +[group_41557] +[group_41558] +[group_41559] +[group_41560] +[group_41561] +[group_41562] +[group_41563] +[group_41564] +[group_41565] +[group_41566] +[group_41567] +[group_41568] +[group_41569] +[group_41570] +[group_41571] +[group_41572] +[group_41573] +[group_41574] +[group_41575] +[group_41576] +[group_41577] +[group_41578] +[group_41579] +[group_41580] +[group_41581] +[group_41582] +[group_41583] +[group_41584] +[group_41585] +[group_41586] +[group_41587] +[group_41588] +[group_41589] +[group_41590] +[group_41591] +[group_41592] +[group_41593] +[group_41594] +[group_41595] +[group_41596] +[group_41597] +[group_41598] +[group_41599] +[group_41600] +[group_41601] +[group_41602] +[group_41603] +[group_41604] +[group_41605] +[group_41606] +[group_41607] +[group_41608] +[group_41609] +[group_41610] +[group_41611] +[group_41612] +[group_41613] +[group_41614] +[group_41615] +[group_41616] +[group_41617] +[group_41618] +[group_41619] +[group_41620] +[group_41621] +[group_41622] +[group_41623] +[group_41624] +[group_41625] +[group_41626] +[group_41627] +[group_41628] +[group_41629] +[group_41630] +[group_41631] +[group_41632] +[group_41633] +[group_41634] +[group_41635] +[group_41636] +[group_41637] +[group_41638] +[group_41639] +[group_41640] +[group_41641] +[group_41642] +[group_41643] +[group_41644] +[group_41645] +[group_41646] +[group_41647] +[group_41648] +[group_41649] +[group_41650] +[group_41651] +[group_41652] +[group_41653] +[group_41654] +[group_41655] +[group_41656] +[group_41657] +[group_41658] +[group_41659] +[group_41660] +[group_41661] +[group_41662] +[group_41663] +[group_41664] +[group_41665] +[group_41666] +[group_41667] +[group_41668] +[group_41669] +[group_41670] +[group_41671] +[group_41672] +[group_41673] +[group_41674] +[group_41675] +[group_41676] +[group_41677] +[group_41678] +[group_41679] +[group_41680] +[group_41681] +[group_41682] +[group_41683] +[group_41684] +[group_41685] +[group_41686] +[group_41687] +[group_41688] +[group_41689] +[group_41690] +[group_41691] +[group_41692] +[group_41693] +[group_41694] +[group_41695] +[group_41696] +[group_41697] +[group_41698] +[group_41699] +[group_41700] +[group_41701] +[group_41702] +[group_41703] +[group_41704] +[group_41705] +[group_41706] +[group_41707] +[group_41708] +[group_41709] +[group_41710] +[group_41711] +[group_41712] +[group_41713] +[group_41714] +[group_41715] +[group_41716] +[group_41717] +[group_41718] +[group_41719] +[group_41720] +[group_41721] +[group_41722] +[group_41723] +[group_41724] +[group_41725] +[group_41726] +[group_41727] +[group_41728] +[group_41729] +[group_41730] +[group_41731] +[group_41732] +[group_41733] +[group_41734] +[group_41735] +[group_41736] +[group_41737] +[group_41738] +[group_41739] +[group_41740] +[group_41741] +[group_41742] +[group_41743] +[group_41744] +[group_41745] +[group_41746] +[group_41747] +[group_41748] +[group_41749] +[group_41750] +[group_41751] +[group_41752] +[group_41753] +[group_41754] +[group_41755] +[group_41756] +[group_41757] +[group_41758] +[group_41759] +[group_41760] +[group_41761] +[group_41762] +[group_41763] +[group_41764] +[group_41765] +[group_41766] +[group_41767] +[group_41768] +[group_41769] +[group_41770] +[group_41771] +[group_41772] +[group_41773] +[group_41774] +[group_41775] +[group_41776] +[group_41777] +[group_41778] +[group_41779] +[group_41780] +[group_41781] +[group_41782] +[group_41783] +[group_41784] +[group_41785] +[group_41786] +[group_41787] +[group_41788] +[group_41789] +[group_41790] +[group_41791] +[group_41792] +[group_41793] +[group_41794] +[group_41795] +[group_41796] +[group_41797] +[group_41798] +[group_41799] +[group_41800] +[group_41801] +[group_41802] +[group_41803] +[group_41804] +[group_41805] +[group_41806] +[group_41807] +[group_41808] +[group_41809] +[group_41810] +[group_41811] +[group_41812] +[group_41813] +[group_41814] +[group_41815] +[group_41816] +[group_41817] +[group_41818] +[group_41819] +[group_41820] +[group_41821] +[group_41822] +[group_41823] +[group_41824] +[group_41825] +[group_41826] +[group_41827] +[group_41828] +[group_41829] +[group_41830] +[group_41831] +[group_41832] +[group_41833] +[group_41834] +[group_41835] +[group_41836] +[group_41837] +[group_41838] +[group_41839] +[group_41840] +[group_41841] +[group_41842] +[group_41843] +[group_41844] +[group_41845] +[group_41846] +[group_41847] +[group_41848] +[group_41849] +[group_41850] +[group_41851] +[group_41852] +[group_41853] +[group_41854] +[group_41855] +[group_41856] +[group_41857] +[group_41858] +[group_41859] +[group_41860] +[group_41861] +[group_41862] +[group_41863] +[group_41864] +[group_41865] +[group_41866] +[group_41867] +[group_41868] +[group_41869] +[group_41870] +[group_41871] +[group_41872] +[group_41873] +[group_41874] +[group_41875] +[group_41876] +[group_41877] +[group_41878] +[group_41879] +[group_41880] +[group_41881] +[group_41882] +[group_41883] +[group_41884] +[group_41885] +[group_41886] +[group_41887] +[group_41888] +[group_41889] +[group_41890] +[group_41891] +[group_41892] +[group_41893] +[group_41894] +[group_41895] +[group_41896] +[group_41897] +[group_41898] +[group_41899] +[group_41900] +[group_41901] +[group_41902] +[group_41903] +[group_41904] +[group_41905] +[group_41906] +[group_41907] +[group_41908] +[group_41909] +[group_41910] +[group_41911] +[group_41912] +[group_41913] +[group_41914] +[group_41915] +[group_41916] +[group_41917] +[group_41918] +[group_41919] +[group_41920] +[group_41921] +[group_41922] +[group_41923] +[group_41924] +[group_41925] +[group_41926] +[group_41927] +[group_41928] +[group_41929] +[group_41930] +[group_41931] +[group_41932] +[group_41933] +[group_41934] +[group_41935] +[group_41936] +[group_41937] +[group_41938] +[group_41939] +[group_41940] +[group_41941] +[group_41942] +[group_41943] +[group_41944] +[group_41945] +[group_41946] +[group_41947] +[group_41948] +[group_41949] +[group_41950] +[group_41951] +[group_41952] +[group_41953] +[group_41954] +[group_41955] +[group_41956] +[group_41957] +[group_41958] +[group_41959] +[group_41960] +[group_41961] +[group_41962] +[group_41963] +[group_41964] +[group_41965] +[group_41966] +[group_41967] +[group_41968] +[group_41969] +[group_41970] +[group_41971] +[group_41972] +[group_41973] +[group_41974] +[group_41975] +[group_41976] +[group_41977] +[group_41978] +[group_41979] +[group_41980] +[group_41981] +[group_41982] +[group_41983] +[group_41984] +[group_41985] +[group_41986] +[group_41987] +[group_41988] +[group_41989] +[group_41990] +[group_41991] +[group_41992] +[group_41993] +[group_41994] +[group_41995] +[group_41996] +[group_41997] +[group_41998] +[group_41999] +[group_42000] +[group_42001] +[group_42002] +[group_42003] +[group_42004] +[group_42005] +[group_42006] +[group_42007] +[group_42008] +[group_42009] +[group_42010] +[group_42011] +[group_42012] +[group_42013] +[group_42014] +[group_42015] +[group_42016] +[group_42017] +[group_42018] +[group_42019] +[group_42020] +[group_42021] +[group_42022] +[group_42023] +[group_42024] +[group_42025] +[group_42026] +[group_42027] +[group_42028] +[group_42029] +[group_42030] +[group_42031] +[group_42032] +[group_42033] +[group_42034] +[group_42035] +[group_42036] +[group_42037] +[group_42038] +[group_42039] +[group_42040] +[group_42041] +[group_42042] +[group_42043] +[group_42044] +[group_42045] +[group_42046] +[group_42047] +[group_42048] +[group_42049] +[group_42050] +[group_42051] +[group_42052] +[group_42053] +[group_42054] +[group_42055] +[group_42056] +[group_42057] +[group_42058] +[group_42059] +[group_42060] +[group_42061] +[group_42062] +[group_42063] +[group_42064] +[group_42065] +[group_42066] +[group_42067] +[group_42068] +[group_42069] +[group_42070] +[group_42071] +[group_42072] +[group_42073] +[group_42074] +[group_42075] +[group_42076] +[group_42077] +[group_42078] +[group_42079] +[group_42080] +[group_42081] +[group_42082] +[group_42083] +[group_42084] +[group_42085] +[group_42086] +[group_42087] +[group_42088] +[group_42089] +[group_42090] +[group_42091] +[group_42092] +[group_42093] +[group_42094] +[group_42095] +[group_42096] +[group_42097] +[group_42098] +[group_42099] +[group_42100] +[group_42101] +[group_42102] +[group_42103] +[group_42104] +[group_42105] +[group_42106] +[group_42107] +[group_42108] +[group_42109] +[group_42110] +[group_42111] +[group_42112] +[group_42113] +[group_42114] +[group_42115] +[group_42116] +[group_42117] +[group_42118] +[group_42119] +[group_42120] +[group_42121] +[group_42122] +[group_42123] +[group_42124] +[group_42125] +[group_42126] +[group_42127] +[group_42128] +[group_42129] +[group_42130] +[group_42131] +[group_42132] +[group_42133] +[group_42134] +[group_42135] +[group_42136] +[group_42137] +[group_42138] +[group_42139] +[group_42140] +[group_42141] +[group_42142] +[group_42143] +[group_42144] +[group_42145] +[group_42146] +[group_42147] +[group_42148] +[group_42149] +[group_42150] +[group_42151] +[group_42152] +[group_42153] +[group_42154] +[group_42155] +[group_42156] +[group_42157] +[group_42158] +[group_42159] +[group_42160] +[group_42161] +[group_42162] +[group_42163] +[group_42164] +[group_42165] +[group_42166] +[group_42167] +[group_42168] +[group_42169] +[group_42170] +[group_42171] +[group_42172] +[group_42173] +[group_42174] +[group_42175] +[group_42176] +[group_42177] +[group_42178] +[group_42179] +[group_42180] +[group_42181] +[group_42182] +[group_42183] +[group_42184] +[group_42185] +[group_42186] +[group_42187] +[group_42188] +[group_42189] +[group_42190] +[group_42191] +[group_42192] +[group_42193] +[group_42194] +[group_42195] +[group_42196] +[group_42197] +[group_42198] +[group_42199] +[group_42200] +[group_42201] +[group_42202] +[group_42203] +[group_42204] +[group_42205] +[group_42206] +[group_42207] +[group_42208] +[group_42209] +[group_42210] +[group_42211] +[group_42212] +[group_42213] +[group_42214] +[group_42215] +[group_42216] +[group_42217] +[group_42218] +[group_42219] +[group_42220] +[group_42221] +[group_42222] +[group_42223] +[group_42224] +[group_42225] +[group_42226] +[group_42227] +[group_42228] +[group_42229] +[group_42230] +[group_42231] +[group_42232] +[group_42233] +[group_42234] +[group_42235] +[group_42236] +[group_42237] +[group_42238] +[group_42239] +[group_42240] +[group_42241] +[group_42242] +[group_42243] +[group_42244] +[group_42245] +[group_42246] +[group_42247] +[group_42248] +[group_42249] +[group_42250] +[group_42251] +[group_42252] +[group_42253] +[group_42254] +[group_42255] +[group_42256] +[group_42257] +[group_42258] +[group_42259] +[group_42260] +[group_42261] +[group_42262] +[group_42263] +[group_42264] +[group_42265] +[group_42266] +[group_42267] +[group_42268] +[group_42269] +[group_42270] +[group_42271] +[group_42272] +[group_42273] +[group_42274] +[group_42275] +[group_42276] +[group_42277] +[group_42278] +[group_42279] +[group_42280] +[group_42281] +[group_42282] +[group_42283] +[group_42284] +[group_42285] +[group_42286] +[group_42287] +[group_42288] +[group_42289] +[group_42290] +[group_42291] +[group_42292] +[group_42293] +[group_42294] +[group_42295] +[group_42296] +[group_42297] +[group_42298] +[group_42299] +[group_42300] +[group_42301] +[group_42302] +[group_42303] +[group_42304] +[group_42305] +[group_42306] +[group_42307] +[group_42308] +[group_42309] +[group_42310] +[group_42311] +[group_42312] +[group_42313] +[group_42314] +[group_42315] +[group_42316] +[group_42317] +[group_42318] +[group_42319] +[group_42320] +[group_42321] +[group_42322] +[group_42323] +[group_42324] +[group_42325] +[group_42326] +[group_42327] +[group_42328] +[group_42329] +[group_42330] +[group_42331] +[group_42332] +[group_42333] +[group_42334] +[group_42335] +[group_42336] +[group_42337] +[group_42338] +[group_42339] +[group_42340] +[group_42341] +[group_42342] +[group_42343] +[group_42344] +[group_42345] +[group_42346] +[group_42347] +[group_42348] +[group_42349] +[group_42350] +[group_42351] +[group_42352] +[group_42353] +[group_42354] +[group_42355] +[group_42356] +[group_42357] +[group_42358] +[group_42359] +[group_42360] +[group_42361] +[group_42362] +[group_42363] +[group_42364] +[group_42365] +[group_42366] +[group_42367] +[group_42368] +[group_42369] +[group_42370] +[group_42371] +[group_42372] +[group_42373] +[group_42374] +[group_42375] +[group_42376] +[group_42377] +[group_42378] +[group_42379] +[group_42380] +[group_42381] +[group_42382] +[group_42383] +[group_42384] +[group_42385] +[group_42386] +[group_42387] +[group_42388] +[group_42389] +[group_42390] +[group_42391] +[group_42392] +[group_42393] +[group_42394] +[group_42395] +[group_42396] +[group_42397] +[group_42398] +[group_42399] +[group_42400] +[group_42401] +[group_42402] +[group_42403] +[group_42404] +[group_42405] +[group_42406] +[group_42407] +[group_42408] +[group_42409] +[group_42410] +[group_42411] +[group_42412] +[group_42413] +[group_42414] +[group_42415] +[group_42416] +[group_42417] +[group_42418] +[group_42419] +[group_42420] +[group_42421] +[group_42422] +[group_42423] +[group_42424] +[group_42425] +[group_42426] +[group_42427] +[group_42428] +[group_42429] +[group_42430] +[group_42431] +[group_42432] +[group_42433] +[group_42434] +[group_42435] +[group_42436] +[group_42437] +[group_42438] +[group_42439] +[group_42440] +[group_42441] +[group_42442] +[group_42443] +[group_42444] +[group_42445] +[group_42446] +[group_42447] +[group_42448] +[group_42449] +[group_42450] +[group_42451] +[group_42452] +[group_42453] +[group_42454] +[group_42455] +[group_42456] +[group_42457] +[group_42458] +[group_42459] +[group_42460] +[group_42461] +[group_42462] +[group_42463] +[group_42464] +[group_42465] +[group_42466] +[group_42467] +[group_42468] +[group_42469] +[group_42470] +[group_42471] +[group_42472] +[group_42473] +[group_42474] +[group_42475] +[group_42476] +[group_42477] +[group_42478] +[group_42479] +[group_42480] +[group_42481] +[group_42482] +[group_42483] +[group_42484] +[group_42485] +[group_42486] +[group_42487] +[group_42488] +[group_42489] +[group_42490] +[group_42491] +[group_42492] +[group_42493] +[group_42494] +[group_42495] +[group_42496] +[group_42497] +[group_42498] +[group_42499] +[group_42500] +[group_42501] +[group_42502] +[group_42503] +[group_42504] +[group_42505] +[group_42506] +[group_42507] +[group_42508] +[group_42509] +[group_42510] +[group_42511] +[group_42512] +[group_42513] +[group_42514] +[group_42515] +[group_42516] +[group_42517] +[group_42518] +[group_42519] +[group_42520] +[group_42521] +[group_42522] +[group_42523] +[group_42524] +[group_42525] +[group_42526] +[group_42527] +[group_42528] +[group_42529] +[group_42530] +[group_42531] +[group_42532] +[group_42533] +[group_42534] +[group_42535] +[group_42536] +[group_42537] +[group_42538] +[group_42539] +[group_42540] +[group_42541] +[group_42542] +[group_42543] +[group_42544] +[group_42545] +[group_42546] +[group_42547] +[group_42548] +[group_42549] +[group_42550] +[group_42551] +[group_42552] +[group_42553] +[group_42554] +[group_42555] +[group_42556] +[group_42557] +[group_42558] +[group_42559] +[group_42560] +[group_42561] +[group_42562] +[group_42563] +[group_42564] +[group_42565] +[group_42566] +[group_42567] +[group_42568] +[group_42569] +[group_42570] +[group_42571] +[group_42572] +[group_42573] +[group_42574] +[group_42575] +[group_42576] +[group_42577] +[group_42578] +[group_42579] +[group_42580] +[group_42581] +[group_42582] +[group_42583] +[group_42584] +[group_42585] +[group_42586] +[group_42587] +[group_42588] +[group_42589] +[group_42590] +[group_42591] +[group_42592] +[group_42593] +[group_42594] +[group_42595] +[group_42596] +[group_42597] +[group_42598] +[group_42599] +[group_42600] +[group_42601] +[group_42602] +[group_42603] +[group_42604] +[group_42605] +[group_42606] +[group_42607] +[group_42608] +[group_42609] +[group_42610] +[group_42611] +[group_42612] +[group_42613] +[group_42614] +[group_42615] +[group_42616] +[group_42617] +[group_42618] +[group_42619] +[group_42620] +[group_42621] +[group_42622] +[group_42623] +[group_42624] +[group_42625] +[group_42626] +[group_42627] +[group_42628] +[group_42629] +[group_42630] +[group_42631] +[group_42632] +[group_42633] +[group_42634] +[group_42635] +[group_42636] +[group_42637] +[group_42638] +[group_42639] +[group_42640] +[group_42641] +[group_42642] +[group_42643] +[group_42644] +[group_42645] +[group_42646] +[group_42647] +[group_42648] +[group_42649] +[group_42650] +[group_42651] +[group_42652] +[group_42653] +[group_42654] +[group_42655] +[group_42656] +[group_42657] +[group_42658] +[group_42659] +[group_42660] +[group_42661] +[group_42662] +[group_42663] +[group_42664] +[group_42665] +[group_42666] +[group_42667] +[group_42668] +[group_42669] +[group_42670] +[group_42671] +[group_42672] +[group_42673] +[group_42674] +[group_42675] +[group_42676] +[group_42677] +[group_42678] +[group_42679] +[group_42680] +[group_42681] +[group_42682] +[group_42683] +[group_42684] +[group_42685] +[group_42686] +[group_42687] +[group_42688] +[group_42689] +[group_42690] +[group_42691] +[group_42692] +[group_42693] +[group_42694] +[group_42695] +[group_42696] +[group_42697] +[group_42698] +[group_42699] +[group_42700] +[group_42701] +[group_42702] +[group_42703] +[group_42704] +[group_42705] +[group_42706] +[group_42707] +[group_42708] +[group_42709] +[group_42710] +[group_42711] +[group_42712] +[group_42713] +[group_42714] +[group_42715] +[group_42716] +[group_42717] +[group_42718] +[group_42719] +[group_42720] +[group_42721] +[group_42722] +[group_42723] +[group_42724] +[group_42725] +[group_42726] +[group_42727] +[group_42728] +[group_42729] +[group_42730] +[group_42731] +[group_42732] +[group_42733] +[group_42734] +[group_42735] +[group_42736] +[group_42737] +[group_42738] +[group_42739] +[group_42740] +[group_42741] +[group_42742] +[group_42743] +[group_42744] +[group_42745] +[group_42746] +[group_42747] +[group_42748] +[group_42749] +[group_42750] +[group_42751] +[group_42752] +[group_42753] +[group_42754] +[group_42755] +[group_42756] +[group_42757] +[group_42758] +[group_42759] +[group_42760] +[group_42761] +[group_42762] +[group_42763] +[group_42764] +[group_42765] +[group_42766] +[group_42767] +[group_42768] +[group_42769] +[group_42770] +[group_42771] +[group_42772] +[group_42773] +[group_42774] +[group_42775] +[group_42776] +[group_42777] +[group_42778] +[group_42779] +[group_42780] +[group_42781] +[group_42782] +[group_42783] +[group_42784] +[group_42785] +[group_42786] +[group_42787] +[group_42788] +[group_42789] +[group_42790] +[group_42791] +[group_42792] +[group_42793] +[group_42794] +[group_42795] +[group_42796] +[group_42797] +[group_42798] +[group_42799] +[group_42800] +[group_42801] +[group_42802] +[group_42803] +[group_42804] +[group_42805] +[group_42806] +[group_42807] +[group_42808] +[group_42809] +[group_42810] +[group_42811] +[group_42812] +[group_42813] +[group_42814] +[group_42815] +[group_42816] +[group_42817] +[group_42818] +[group_42819] +[group_42820] +[group_42821] +[group_42822] +[group_42823] +[group_42824] +[group_42825] +[group_42826] +[group_42827] +[group_42828] +[group_42829] +[group_42830] +[group_42831] +[group_42832] +[group_42833] +[group_42834] +[group_42835] +[group_42836] +[group_42837] +[group_42838] +[group_42839] +[group_42840] +[group_42841] +[group_42842] +[group_42843] +[group_42844] +[group_42845] +[group_42846] +[group_42847] +[group_42848] +[group_42849] +[group_42850] +[group_42851] +[group_42852] +[group_42853] +[group_42854] +[group_42855] +[group_42856] +[group_42857] +[group_42858] +[group_42859] +[group_42860] +[group_42861] +[group_42862] +[group_42863] +[group_42864] +[group_42865] +[group_42866] +[group_42867] +[group_42868] +[group_42869] +[group_42870] +[group_42871] +[group_42872] +[group_42873] +[group_42874] +[group_42875] +[group_42876] +[group_42877] +[group_42878] +[group_42879] +[group_42880] +[group_42881] +[group_42882] +[group_42883] +[group_42884] +[group_42885] +[group_42886] +[group_42887] +[group_42888] +[group_42889] +[group_42890] +[group_42891] +[group_42892] +[group_42893] +[group_42894] +[group_42895] +[group_42896] +[group_42897] +[group_42898] +[group_42899] +[group_42900] +[group_42901] +[group_42902] +[group_42903] +[group_42904] +[group_42905] +[group_42906] +[group_42907] +[group_42908] +[group_42909] +[group_42910] +[group_42911] +[group_42912] +[group_42913] +[group_42914] +[group_42915] +[group_42916] +[group_42917] +[group_42918] +[group_42919] +[group_42920] +[group_42921] +[group_42922] +[group_42923] +[group_42924] +[group_42925] +[group_42926] +[group_42927] +[group_42928] +[group_42929] +[group_42930] +[group_42931] +[group_42932] +[group_42933] +[group_42934] +[group_42935] +[group_42936] +[group_42937] +[group_42938] +[group_42939] +[group_42940] +[group_42941] +[group_42942] +[group_42943] +[group_42944] +[group_42945] +[group_42946] +[group_42947] +[group_42948] +[group_42949] +[group_42950] +[group_42951] +[group_42952] +[group_42953] +[group_42954] +[group_42955] +[group_42956] +[group_42957] +[group_42958] +[group_42959] +[group_42960] +[group_42961] +[group_42962] +[group_42963] +[group_42964] +[group_42965] +[group_42966] +[group_42967] +[group_42968] +[group_42969] +[group_42970] +[group_42971] +[group_42972] +[group_42973] +[group_42974] +[group_42975] +[group_42976] +[group_42977] +[group_42978] +[group_42979] +[group_42980] +[group_42981] +[group_42982] +[group_42983] +[group_42984] +[group_42985] +[group_42986] +[group_42987] +[group_42988] +[group_42989] +[group_42990] +[group_42991] +[group_42992] +[group_42993] +[group_42994] +[group_42995] +[group_42996] +[group_42997] +[group_42998] +[group_42999] +[group_43000] +[group_43001] +[group_43002] +[group_43003] +[group_43004] +[group_43005] +[group_43006] +[group_43007] +[group_43008] +[group_43009] +[group_43010] +[group_43011] +[group_43012] +[group_43013] +[group_43014] +[group_43015] +[group_43016] +[group_43017] +[group_43018] +[group_43019] +[group_43020] +[group_43021] +[group_43022] +[group_43023] +[group_43024] +[group_43025] +[group_43026] +[group_43027] +[group_43028] +[group_43029] +[group_43030] +[group_43031] +[group_43032] +[group_43033] +[group_43034] +[group_43035] +[group_43036] +[group_43037] +[group_43038] +[group_43039] +[group_43040] +[group_43041] +[group_43042] +[group_43043] +[group_43044] +[group_43045] +[group_43046] +[group_43047] +[group_43048] +[group_43049] +[group_43050] +[group_43051] +[group_43052] +[group_43053] +[group_43054] +[group_43055] +[group_43056] +[group_43057] +[group_43058] +[group_43059] +[group_43060] +[group_43061] +[group_43062] +[group_43063] +[group_43064] +[group_43065] +[group_43066] +[group_43067] +[group_43068] +[group_43069] +[group_43070] +[group_43071] +[group_43072] +[group_43073] +[group_43074] +[group_43075] +[group_43076] +[group_43077] +[group_43078] +[group_43079] +[group_43080] +[group_43081] +[group_43082] +[group_43083] +[group_43084] +[group_43085] +[group_43086] +[group_43087] +[group_43088] +[group_43089] +[group_43090] +[group_43091] +[group_43092] +[group_43093] +[group_43094] +[group_43095] +[group_43096] +[group_43097] +[group_43098] +[group_43099] +[group_43100] +[group_43101] +[group_43102] +[group_43103] +[group_43104] +[group_43105] +[group_43106] +[group_43107] +[group_43108] +[group_43109] +[group_43110] +[group_43111] +[group_43112] +[group_43113] +[group_43114] +[group_43115] +[group_43116] +[group_43117] +[group_43118] +[group_43119] +[group_43120] +[group_43121] +[group_43122] +[group_43123] +[group_43124] +[group_43125] +[group_43126] +[group_43127] +[group_43128] +[group_43129] +[group_43130] +[group_43131] +[group_43132] +[group_43133] +[group_43134] +[group_43135] +[group_43136] +[group_43137] +[group_43138] +[group_43139] +[group_43140] +[group_43141] +[group_43142] +[group_43143] +[group_43144] +[group_43145] +[group_43146] +[group_43147] +[group_43148] +[group_43149] +[group_43150] +[group_43151] +[group_43152] +[group_43153] +[group_43154] +[group_43155] +[group_43156] +[group_43157] +[group_43158] +[group_43159] +[group_43160] +[group_43161] +[group_43162] +[group_43163] +[group_43164] +[group_43165] +[group_43166] +[group_43167] +[group_43168] +[group_43169] +[group_43170] +[group_43171] +[group_43172] +[group_43173] +[group_43174] +[group_43175] +[group_43176] +[group_43177] +[group_43178] +[group_43179] +[group_43180] +[group_43181] +[group_43182] +[group_43183] +[group_43184] +[group_43185] +[group_43186] +[group_43187] +[group_43188] +[group_43189] +[group_43190] +[group_43191] +[group_43192] +[group_43193] +[group_43194] +[group_43195] +[group_43196] +[group_43197] +[group_43198] +[group_43199] +[group_43200] +[group_43201] +[group_43202] +[group_43203] +[group_43204] +[group_43205] +[group_43206] +[group_43207] +[group_43208] +[group_43209] +[group_43210] +[group_43211] +[group_43212] +[group_43213] +[group_43214] +[group_43215] +[group_43216] +[group_43217] +[group_43218] +[group_43219] +[group_43220] +[group_43221] +[group_43222] +[group_43223] +[group_43224] +[group_43225] +[group_43226] +[group_43227] +[group_43228] +[group_43229] +[group_43230] +[group_43231] +[group_43232] +[group_43233] +[group_43234] +[group_43235] +[group_43236] +[group_43237] +[group_43238] +[group_43239] +[group_43240] +[group_43241] +[group_43242] +[group_43243] +[group_43244] +[group_43245] +[group_43246] +[group_43247] +[group_43248] +[group_43249] +[group_43250] +[group_43251] +[group_43252] +[group_43253] +[group_43254] +[group_43255] +[group_43256] +[group_43257] +[group_43258] +[group_43259] +[group_43260] +[group_43261] +[group_43262] +[group_43263] +[group_43264] +[group_43265] +[group_43266] +[group_43267] +[group_43268] +[group_43269] +[group_43270] +[group_43271] +[group_43272] +[group_43273] +[group_43274] +[group_43275] +[group_43276] +[group_43277] +[group_43278] +[group_43279] +[group_43280] +[group_43281] +[group_43282] +[group_43283] +[group_43284] +[group_43285] +[group_43286] +[group_43287] +[group_43288] +[group_43289] +[group_43290] +[group_43291] +[group_43292] +[group_43293] +[group_43294] +[group_43295] +[group_43296] +[group_43297] +[group_43298] +[group_43299] +[group_43300] +[group_43301] +[group_43302] +[group_43303] +[group_43304] +[group_43305] +[group_43306] +[group_43307] +[group_43308] +[group_43309] +[group_43310] +[group_43311] +[group_43312] +[group_43313] +[group_43314] +[group_43315] +[group_43316] +[group_43317] +[group_43318] +[group_43319] +[group_43320] +[group_43321] +[group_43322] +[group_43323] +[group_43324] +[group_43325] +[group_43326] +[group_43327] +[group_43328] +[group_43329] +[group_43330] +[group_43331] +[group_43332] +[group_43333] +[group_43334] +[group_43335] +[group_43336] +[group_43337] +[group_43338] +[group_43339] +[group_43340] +[group_43341] +[group_43342] +[group_43343] +[group_43344] +[group_43345] +[group_43346] +[group_43347] +[group_43348] +[group_43349] +[group_43350] +[group_43351] +[group_43352] +[group_43353] +[group_43354] +[group_43355] +[group_43356] +[group_43357] +[group_43358] +[group_43359] +[group_43360] +[group_43361] +[group_43362] +[group_43363] +[group_43364] +[group_43365] +[group_43366] +[group_43367] +[group_43368] +[group_43369] +[group_43370] +[group_43371] +[group_43372] +[group_43373] +[group_43374] +[group_43375] +[group_43376] +[group_43377] +[group_43378] +[group_43379] +[group_43380] +[group_43381] +[group_43382] +[group_43383] +[group_43384] +[group_43385] +[group_43386] +[group_43387] +[group_43388] +[group_43389] +[group_43390] +[group_43391] +[group_43392] +[group_43393] +[group_43394] +[group_43395] +[group_43396] +[group_43397] +[group_43398] +[group_43399] +[group_43400] +[group_43401] +[group_43402] +[group_43403] +[group_43404] +[group_43405] +[group_43406] +[group_43407] +[group_43408] +[group_43409] +[group_43410] +[group_43411] +[group_43412] +[group_43413] +[group_43414] +[group_43415] +[group_43416] +[group_43417] +[group_43418] +[group_43419] +[group_43420] +[group_43421] +[group_43422] +[group_43423] +[group_43424] +[group_43425] +[group_43426] +[group_43427] +[group_43428] +[group_43429] +[group_43430] +[group_43431] +[group_43432] +[group_43433] +[group_43434] +[group_43435] +[group_43436] +[group_43437] +[group_43438] +[group_43439] +[group_43440] +[group_43441] +[group_43442] +[group_43443] +[group_43444] +[group_43445] +[group_43446] +[group_43447] +[group_43448] +[group_43449] +[group_43450] +[group_43451] +[group_43452] +[group_43453] +[group_43454] +[group_43455] +[group_43456] +[group_43457] +[group_43458] +[group_43459] +[group_43460] +[group_43461] +[group_43462] +[group_43463] +[group_43464] +[group_43465] +[group_43466] +[group_43467] +[group_43468] +[group_43469] +[group_43470] +[group_43471] +[group_43472] +[group_43473] +[group_43474] +[group_43475] +[group_43476] +[group_43477] +[group_43478] +[group_43479] +[group_43480] +[group_43481] +[group_43482] +[group_43483] +[group_43484] +[group_43485] +[group_43486] +[group_43487] +[group_43488] +[group_43489] +[group_43490] +[group_43491] +[group_43492] +[group_43493] +[group_43494] +[group_43495] +[group_43496] +[group_43497] +[group_43498] +[group_43499] +[group_43500] +[group_43501] +[group_43502] +[group_43503] +[group_43504] +[group_43505] +[group_43506] +[group_43507] +[group_43508] +[group_43509] +[group_43510] +[group_43511] +[group_43512] +[group_43513] +[group_43514] +[group_43515] +[group_43516] +[group_43517] +[group_43518] +[group_43519] +[group_43520] +[group_43521] +[group_43522] +[group_43523] +[group_43524] +[group_43525] +[group_43526] +[group_43527] +[group_43528] +[group_43529] +[group_43530] +[group_43531] +[group_43532] +[group_43533] +[group_43534] +[group_43535] +[group_43536] +[group_43537] +[group_43538] +[group_43539] +[group_43540] +[group_43541] +[group_43542] +[group_43543] +[group_43544] +[group_43545] +[group_43546] +[group_43547] +[group_43548] +[group_43549] +[group_43550] +[group_43551] +[group_43552] +[group_43553] +[group_43554] +[group_43555] +[group_43556] +[group_43557] +[group_43558] +[group_43559] +[group_43560] +[group_43561] +[group_43562] +[group_43563] +[group_43564] +[group_43565] +[group_43566] +[group_43567] +[group_43568] +[group_43569] +[group_43570] +[group_43571] +[group_43572] +[group_43573] +[group_43574] +[group_43575] +[group_43576] +[group_43577] +[group_43578] +[group_43579] +[group_43580] +[group_43581] +[group_43582] +[group_43583] +[group_43584] +[group_43585] +[group_43586] +[group_43587] +[group_43588] +[group_43589] +[group_43590] +[group_43591] +[group_43592] +[group_43593] +[group_43594] +[group_43595] +[group_43596] +[group_43597] +[group_43598] +[group_43599] +[group_43600] +[group_43601] +[group_43602] +[group_43603] +[group_43604] +[group_43605] +[group_43606] +[group_43607] +[group_43608] +[group_43609] +[group_43610] +[group_43611] +[group_43612] +[group_43613] +[group_43614] +[group_43615] +[group_43616] +[group_43617] +[group_43618] +[group_43619] +[group_43620] +[group_43621] +[group_43622] +[group_43623] +[group_43624] +[group_43625] +[group_43626] +[group_43627] +[group_43628] +[group_43629] +[group_43630] +[group_43631] +[group_43632] +[group_43633] +[group_43634] +[group_43635] +[group_43636] +[group_43637] +[group_43638] +[group_43639] +[group_43640] +[group_43641] +[group_43642] +[group_43643] +[group_43644] +[group_43645] +[group_43646] +[group_43647] +[group_43648] +[group_43649] +[group_43650] +[group_43651] +[group_43652] +[group_43653] +[group_43654] +[group_43655] +[group_43656] +[group_43657] +[group_43658] +[group_43659] +[group_43660] +[group_43661] +[group_43662] +[group_43663] +[group_43664] +[group_43665] +[group_43666] +[group_43667] +[group_43668] +[group_43669] +[group_43670] +[group_43671] +[group_43672] +[group_43673] +[group_43674] +[group_43675] +[group_43676] +[group_43677] +[group_43678] +[group_43679] +[group_43680] +[group_43681] +[group_43682] +[group_43683] +[group_43684] +[group_43685] +[group_43686] +[group_43687] +[group_43688] +[group_43689] +[group_43690] +[group_43691] +[group_43692] +[group_43693] +[group_43694] +[group_43695] +[group_43696] +[group_43697] +[group_43698] +[group_43699] +[group_43700] +[group_43701] +[group_43702] +[group_43703] +[group_43704] +[group_43705] +[group_43706] +[group_43707] +[group_43708] +[group_43709] +[group_43710] +[group_43711] +[group_43712] +[group_43713] +[group_43714] +[group_43715] +[group_43716] +[group_43717] +[group_43718] +[group_43719] +[group_43720] +[group_43721] +[group_43722] +[group_43723] +[group_43724] +[group_43725] +[group_43726] +[group_43727] +[group_43728] +[group_43729] +[group_43730] +[group_43731] +[group_43732] +[group_43733] +[group_43734] +[group_43735] +[group_43736] +[group_43737] +[group_43738] +[group_43739] +[group_43740] +[group_43741] +[group_43742] +[group_43743] +[group_43744] +[group_43745] +[group_43746] +[group_43747] +[group_43748] +[group_43749] +[group_43750] +[group_43751] +[group_43752] +[group_43753] +[group_43754] +[group_43755] +[group_43756] +[group_43757] +[group_43758] +[group_43759] +[group_43760] +[group_43761] +[group_43762] +[group_43763] +[group_43764] +[group_43765] +[group_43766] +[group_43767] +[group_43768] +[group_43769] +[group_43770] +[group_43771] +[group_43772] +[group_43773] +[group_43774] +[group_43775] +[group_43776] +[group_43777] +[group_43778] +[group_43779] +[group_43780] +[group_43781] +[group_43782] +[group_43783] +[group_43784] +[group_43785] +[group_43786] +[group_43787] +[group_43788] +[group_43789] +[group_43790] +[group_43791] +[group_43792] +[group_43793] +[group_43794] +[group_43795] +[group_43796] +[group_43797] +[group_43798] +[group_43799] +[group_43800] +[group_43801] +[group_43802] +[group_43803] +[group_43804] +[group_43805] +[group_43806] +[group_43807] +[group_43808] +[group_43809] +[group_43810] +[group_43811] +[group_43812] +[group_43813] +[group_43814] +[group_43815] +[group_43816] +[group_43817] +[group_43818] +[group_43819] +[group_43820] +[group_43821] +[group_43822] +[group_43823] +[group_43824] +[group_43825] +[group_43826] +[group_43827] +[group_43828] +[group_43829] +[group_43830] +[group_43831] +[group_43832] +[group_43833] +[group_43834] +[group_43835] +[group_43836] +[group_43837] +[group_43838] +[group_43839] +[group_43840] +[group_43841] +[group_43842] +[group_43843] +[group_43844] +[group_43845] +[group_43846] +[group_43847] +[group_43848] +[group_43849] +[group_43850] +[group_43851] +[group_43852] +[group_43853] +[group_43854] +[group_43855] +[group_43856] +[group_43857] +[group_43858] +[group_43859] +[group_43860] +[group_43861] +[group_43862] +[group_43863] +[group_43864] +[group_43865] +[group_43866] +[group_43867] +[group_43868] +[group_43869] +[group_43870] +[group_43871] +[group_43872] +[group_43873] +[group_43874] +[group_43875] +[group_43876] +[group_43877] +[group_43878] +[group_43879] +[group_43880] +[group_43881] +[group_43882] +[group_43883] +[group_43884] +[group_43885] +[group_43886] +[group_43887] +[group_43888] +[group_43889] +[group_43890] +[group_43891] +[group_43892] +[group_43893] +[group_43894] +[group_43895] +[group_43896] +[group_43897] +[group_43898] +[group_43899] +[group_43900] +[group_43901] +[group_43902] +[group_43903] +[group_43904] +[group_43905] +[group_43906] +[group_43907] +[group_43908] +[group_43909] +[group_43910] +[group_43911] +[group_43912] +[group_43913] +[group_43914] +[group_43915] +[group_43916] +[group_43917] +[group_43918] +[group_43919] +[group_43920] +[group_43921] +[group_43922] +[group_43923] +[group_43924] +[group_43925] +[group_43926] +[group_43927] +[group_43928] +[group_43929] +[group_43930] +[group_43931] +[group_43932] +[group_43933] +[group_43934] +[group_43935] +[group_43936] +[group_43937] +[group_43938] +[group_43939] +[group_43940] +[group_43941] +[group_43942] +[group_43943] +[group_43944] +[group_43945] +[group_43946] +[group_43947] +[group_43948] +[group_43949] +[group_43950] +[group_43951] +[group_43952] +[group_43953] +[group_43954] +[group_43955] +[group_43956] +[group_43957] +[group_43958] +[group_43959] +[group_43960] +[group_43961] +[group_43962] +[group_43963] +[group_43964] +[group_43965] +[group_43966] +[group_43967] +[group_43968] +[group_43969] +[group_43970] +[group_43971] +[group_43972] +[group_43973] +[group_43974] +[group_43975] +[group_43976] +[group_43977] +[group_43978] +[group_43979] +[group_43980] +[group_43981] +[group_43982] +[group_43983] +[group_43984] +[group_43985] +[group_43986] +[group_43987] +[group_43988] +[group_43989] +[group_43990] +[group_43991] +[group_43992] +[group_43993] +[group_43994] +[group_43995] +[group_43996] +[group_43997] +[group_43998] +[group_43999] +[group_44000] +[group_44001] +[group_44002] +[group_44003] +[group_44004] +[group_44005] +[group_44006] +[group_44007] +[group_44008] +[group_44009] +[group_44010] +[group_44011] +[group_44012] +[group_44013] +[group_44014] +[group_44015] +[group_44016] +[group_44017] +[group_44018] +[group_44019] +[group_44020] +[group_44021] +[group_44022] +[group_44023] +[group_44024] +[group_44025] +[group_44026] +[group_44027] +[group_44028] +[group_44029] +[group_44030] +[group_44031] +[group_44032] +[group_44033] +[group_44034] +[group_44035] +[group_44036] +[group_44037] +[group_44038] +[group_44039] +[group_44040] +[group_44041] +[group_44042] +[group_44043] +[group_44044] +[group_44045] +[group_44046] +[group_44047] +[group_44048] +[group_44049] +[group_44050] +[group_44051] +[group_44052] +[group_44053] +[group_44054] +[group_44055] +[group_44056] +[group_44057] +[group_44058] +[group_44059] +[group_44060] +[group_44061] +[group_44062] +[group_44063] +[group_44064] +[group_44065] +[group_44066] +[group_44067] +[group_44068] +[group_44069] +[group_44070] +[group_44071] +[group_44072] +[group_44073] +[group_44074] +[group_44075] +[group_44076] +[group_44077] +[group_44078] +[group_44079] +[group_44080] +[group_44081] +[group_44082] +[group_44083] +[group_44084] +[group_44085] +[group_44086] +[group_44087] +[group_44088] +[group_44089] +[group_44090] +[group_44091] +[group_44092] +[group_44093] +[group_44094] +[group_44095] +[group_44096] +[group_44097] +[group_44098] +[group_44099] +[group_44100] +[group_44101] +[group_44102] +[group_44103] +[group_44104] +[group_44105] +[group_44106] +[group_44107] +[group_44108] +[group_44109] +[group_44110] +[group_44111] +[group_44112] +[group_44113] +[group_44114] +[group_44115] +[group_44116] +[group_44117] +[group_44118] +[group_44119] +[group_44120] +[group_44121] +[group_44122] +[group_44123] +[group_44124] +[group_44125] +[group_44126] +[group_44127] +[group_44128] +[group_44129] +[group_44130] +[group_44131] +[group_44132] +[group_44133] +[group_44134] +[group_44135] +[group_44136] +[group_44137] +[group_44138] +[group_44139] +[group_44140] +[group_44141] +[group_44142] +[group_44143] +[group_44144] +[group_44145] +[group_44146] +[group_44147] +[group_44148] +[group_44149] +[group_44150] +[group_44151] +[group_44152] +[group_44153] +[group_44154] +[group_44155] +[group_44156] +[group_44157] +[group_44158] +[group_44159] +[group_44160] +[group_44161] +[group_44162] +[group_44163] +[group_44164] +[group_44165] +[group_44166] +[group_44167] +[group_44168] +[group_44169] +[group_44170] +[group_44171] +[group_44172] +[group_44173] +[group_44174] +[group_44175] +[group_44176] +[group_44177] +[group_44178] +[group_44179] +[group_44180] +[group_44181] +[group_44182] +[group_44183] +[group_44184] +[group_44185] +[group_44186] +[group_44187] +[group_44188] +[group_44189] +[group_44190] +[group_44191] +[group_44192] +[group_44193] +[group_44194] +[group_44195] +[group_44196] +[group_44197] +[group_44198] +[group_44199] +[group_44200] +[group_44201] +[group_44202] +[group_44203] +[group_44204] +[group_44205] +[group_44206] +[group_44207] +[group_44208] +[group_44209] +[group_44210] +[group_44211] +[group_44212] +[group_44213] +[group_44214] +[group_44215] +[group_44216] +[group_44217] +[group_44218] +[group_44219] +[group_44220] +[group_44221] +[group_44222] +[group_44223] +[group_44224] +[group_44225] +[group_44226] +[group_44227] +[group_44228] +[group_44229] +[group_44230] +[group_44231] +[group_44232] +[group_44233] +[group_44234] +[group_44235] +[group_44236] +[group_44237] +[group_44238] +[group_44239] +[group_44240] +[group_44241] +[group_44242] +[group_44243] +[group_44244] +[group_44245] +[group_44246] +[group_44247] +[group_44248] +[group_44249] +[group_44250] +[group_44251] +[group_44252] +[group_44253] +[group_44254] +[group_44255] +[group_44256] +[group_44257] +[group_44258] +[group_44259] +[group_44260] +[group_44261] +[group_44262] +[group_44263] +[group_44264] +[group_44265] +[group_44266] +[group_44267] +[group_44268] +[group_44269] +[group_44270] +[group_44271] +[group_44272] +[group_44273] +[group_44274] +[group_44275] +[group_44276] +[group_44277] +[group_44278] +[group_44279] +[group_44280] +[group_44281] +[group_44282] +[group_44283] +[group_44284] +[group_44285] +[group_44286] +[group_44287] +[group_44288] +[group_44289] +[group_44290] +[group_44291] +[group_44292] +[group_44293] +[group_44294] +[group_44295] +[group_44296] +[group_44297] +[group_44298] +[group_44299] +[group_44300] +[group_44301] +[group_44302] +[group_44303] +[group_44304] +[group_44305] +[group_44306] +[group_44307] +[group_44308] +[group_44309] +[group_44310] +[group_44311] +[group_44312] +[group_44313] +[group_44314] +[group_44315] +[group_44316] +[group_44317] +[group_44318] +[group_44319] +[group_44320] +[group_44321] +[group_44322] +[group_44323] +[group_44324] +[group_44325] +[group_44326] +[group_44327] +[group_44328] +[group_44329] +[group_44330] +[group_44331] +[group_44332] +[group_44333] +[group_44334] +[group_44335] +[group_44336] +[group_44337] +[group_44338] +[group_44339] +[group_44340] +[group_44341] +[group_44342] +[group_44343] +[group_44344] +[group_44345] +[group_44346] +[group_44347] +[group_44348] +[group_44349] +[group_44350] +[group_44351] +[group_44352] +[group_44353] +[group_44354] +[group_44355] +[group_44356] +[group_44357] +[group_44358] +[group_44359] +[group_44360] +[group_44361] +[group_44362] +[group_44363] +[group_44364] +[group_44365] +[group_44366] +[group_44367] +[group_44368] +[group_44369] +[group_44370] +[group_44371] +[group_44372] +[group_44373] +[group_44374] +[group_44375] +[group_44376] +[group_44377] +[group_44378] +[group_44379] +[group_44380] +[group_44381] +[group_44382] +[group_44383] +[group_44384] +[group_44385] +[group_44386] +[group_44387] +[group_44388] +[group_44389] +[group_44390] +[group_44391] +[group_44392] +[group_44393] +[group_44394] +[group_44395] +[group_44396] +[group_44397] +[group_44398] +[group_44399] +[group_44400] +[group_44401] +[group_44402] +[group_44403] +[group_44404] +[group_44405] +[group_44406] +[group_44407] +[group_44408] +[group_44409] +[group_44410] +[group_44411] +[group_44412] +[group_44413] +[group_44414] +[group_44415] +[group_44416] +[group_44417] +[group_44418] +[group_44419] +[group_44420] +[group_44421] +[group_44422] +[group_44423] +[group_44424] +[group_44425] +[group_44426] +[group_44427] +[group_44428] +[group_44429] +[group_44430] +[group_44431] +[group_44432] +[group_44433] +[group_44434] +[group_44435] +[group_44436] +[group_44437] +[group_44438] +[group_44439] +[group_44440] +[group_44441] +[group_44442] +[group_44443] +[group_44444] +[group_44445] +[group_44446] +[group_44447] +[group_44448] +[group_44449] +[group_44450] +[group_44451] +[group_44452] +[group_44453] +[group_44454] +[group_44455] +[group_44456] +[group_44457] +[group_44458] +[group_44459] +[group_44460] +[group_44461] +[group_44462] +[group_44463] +[group_44464] +[group_44465] +[group_44466] +[group_44467] +[group_44468] +[group_44469] +[group_44470] +[group_44471] +[group_44472] +[group_44473] +[group_44474] +[group_44475] +[group_44476] +[group_44477] +[group_44478] +[group_44479] +[group_44480] +[group_44481] +[group_44482] +[group_44483] +[group_44484] +[group_44485] +[group_44486] +[group_44487] +[group_44488] +[group_44489] +[group_44490] +[group_44491] +[group_44492] +[group_44493] +[group_44494] +[group_44495] +[group_44496] +[group_44497] +[group_44498] +[group_44499] +[group_44500] +[group_44501] +[group_44502] +[group_44503] +[group_44504] +[group_44505] +[group_44506] +[group_44507] +[group_44508] +[group_44509] +[group_44510] +[group_44511] +[group_44512] +[group_44513] +[group_44514] +[group_44515] +[group_44516] +[group_44517] +[group_44518] +[group_44519] +[group_44520] +[group_44521] +[group_44522] +[group_44523] +[group_44524] +[group_44525] +[group_44526] +[group_44527] +[group_44528] +[group_44529] +[group_44530] +[group_44531] +[group_44532] +[group_44533] +[group_44534] +[group_44535] +[group_44536] +[group_44537] +[group_44538] +[group_44539] +[group_44540] +[group_44541] +[group_44542] +[group_44543] +[group_44544] +[group_44545] +[group_44546] +[group_44547] +[group_44548] +[group_44549] +[group_44550] +[group_44551] +[group_44552] +[group_44553] +[group_44554] +[group_44555] +[group_44556] +[group_44557] +[group_44558] +[group_44559] +[group_44560] +[group_44561] +[group_44562] +[group_44563] +[group_44564] +[group_44565] +[group_44566] +[group_44567] +[group_44568] +[group_44569] +[group_44570] +[group_44571] +[group_44572] +[group_44573] +[group_44574] +[group_44575] +[group_44576] +[group_44577] +[group_44578] +[group_44579] +[group_44580] +[group_44581] +[group_44582] +[group_44583] +[group_44584] +[group_44585] +[group_44586] +[group_44587] +[group_44588] +[group_44589] +[group_44590] +[group_44591] +[group_44592] +[group_44593] +[group_44594] +[group_44595] +[group_44596] +[group_44597] +[group_44598] +[group_44599] +[group_44600] +[group_44601] +[group_44602] +[group_44603] +[group_44604] +[group_44605] +[group_44606] +[group_44607] +[group_44608] +[group_44609] +[group_44610] +[group_44611] +[group_44612] +[group_44613] +[group_44614] +[group_44615] +[group_44616] +[group_44617] +[group_44618] +[group_44619] +[group_44620] +[group_44621] +[group_44622] +[group_44623] +[group_44624] +[group_44625] +[group_44626] +[group_44627] +[group_44628] +[group_44629] +[group_44630] +[group_44631] +[group_44632] +[group_44633] +[group_44634] +[group_44635] +[group_44636] +[group_44637] +[group_44638] +[group_44639] +[group_44640] +[group_44641] +[group_44642] +[group_44643] +[group_44644] +[group_44645] +[group_44646] +[group_44647] +[group_44648] +[group_44649] +[group_44650] +[group_44651] +[group_44652] +[group_44653] +[group_44654] +[group_44655] +[group_44656] +[group_44657] +[group_44658] +[group_44659] +[group_44660] +[group_44661] +[group_44662] +[group_44663] +[group_44664] +[group_44665] +[group_44666] +[group_44667] +[group_44668] +[group_44669] +[group_44670] +[group_44671] +[group_44672] +[group_44673] +[group_44674] +[group_44675] +[group_44676] +[group_44677] +[group_44678] +[group_44679] +[group_44680] +[group_44681] +[group_44682] +[group_44683] +[group_44684] +[group_44685] +[group_44686] +[group_44687] +[group_44688] +[group_44689] +[group_44690] +[group_44691] +[group_44692] +[group_44693] +[group_44694] +[group_44695] +[group_44696] +[group_44697] +[group_44698] +[group_44699] +[group_44700] +[group_44701] +[group_44702] +[group_44703] +[group_44704] +[group_44705] +[group_44706] +[group_44707] +[group_44708] +[group_44709] +[group_44710] +[group_44711] +[group_44712] +[group_44713] +[group_44714] +[group_44715] +[group_44716] +[group_44717] +[group_44718] +[group_44719] +[group_44720] +[group_44721] +[group_44722] +[group_44723] +[group_44724] +[group_44725] +[group_44726] +[group_44727] +[group_44728] +[group_44729] +[group_44730] +[group_44731] +[group_44732] +[group_44733] +[group_44734] +[group_44735] +[group_44736] +[group_44737] +[group_44738] +[group_44739] +[group_44740] +[group_44741] +[group_44742] +[group_44743] +[group_44744] +[group_44745] +[group_44746] +[group_44747] +[group_44748] +[group_44749] +[group_44750] +[group_44751] +[group_44752] +[group_44753] +[group_44754] +[group_44755] +[group_44756] +[group_44757] +[group_44758] +[group_44759] +[group_44760] +[group_44761] +[group_44762] +[group_44763] +[group_44764] +[group_44765] +[group_44766] +[group_44767] +[group_44768] +[group_44769] +[group_44770] +[group_44771] +[group_44772] +[group_44773] +[group_44774] +[group_44775] +[group_44776] +[group_44777] +[group_44778] +[group_44779] +[group_44780] +[group_44781] +[group_44782] +[group_44783] +[group_44784] +[group_44785] +[group_44786] +[group_44787] +[group_44788] +[group_44789] +[group_44790] +[group_44791] +[group_44792] +[group_44793] +[group_44794] +[group_44795] +[group_44796] +[group_44797] +[group_44798] +[group_44799] +[group_44800] +[group_44801] +[group_44802] +[group_44803] +[group_44804] +[group_44805] +[group_44806] +[group_44807] +[group_44808] +[group_44809] +[group_44810] +[group_44811] +[group_44812] +[group_44813] +[group_44814] +[group_44815] +[group_44816] +[group_44817] +[group_44818] +[group_44819] +[group_44820] +[group_44821] +[group_44822] +[group_44823] +[group_44824] +[group_44825] +[group_44826] +[group_44827] +[group_44828] +[group_44829] +[group_44830] +[group_44831] +[group_44832] +[group_44833] +[group_44834] +[group_44835] +[group_44836] +[group_44837] +[group_44838] +[group_44839] +[group_44840] +[group_44841] +[group_44842] +[group_44843] +[group_44844] +[group_44845] +[group_44846] +[group_44847] +[group_44848] +[group_44849] +[group_44850] +[group_44851] +[group_44852] +[group_44853] +[group_44854] +[group_44855] +[group_44856] +[group_44857] +[group_44858] +[group_44859] +[group_44860] +[group_44861] +[group_44862] +[group_44863] +[group_44864] +[group_44865] +[group_44866] +[group_44867] +[group_44868] +[group_44869] +[group_44870] +[group_44871] +[group_44872] +[group_44873] +[group_44874] +[group_44875] +[group_44876] +[group_44877] +[group_44878] +[group_44879] +[group_44880] +[group_44881] +[group_44882] +[group_44883] +[group_44884] +[group_44885] +[group_44886] +[group_44887] +[group_44888] +[group_44889] +[group_44890] +[group_44891] +[group_44892] +[group_44893] +[group_44894] +[group_44895] +[group_44896] +[group_44897] +[group_44898] +[group_44899] +[group_44900] +[group_44901] +[group_44902] +[group_44903] +[group_44904] +[group_44905] +[group_44906] +[group_44907] +[group_44908] +[group_44909] +[group_44910] +[group_44911] +[group_44912] +[group_44913] +[group_44914] +[group_44915] +[group_44916] +[group_44917] +[group_44918] +[group_44919] +[group_44920] +[group_44921] +[group_44922] +[group_44923] +[group_44924] +[group_44925] +[group_44926] +[group_44927] +[group_44928] +[group_44929] +[group_44930] +[group_44931] +[group_44932] +[group_44933] +[group_44934] +[group_44935] +[group_44936] +[group_44937] +[group_44938] +[group_44939] +[group_44940] +[group_44941] +[group_44942] +[group_44943] +[group_44944] +[group_44945] +[group_44946] +[group_44947] +[group_44948] +[group_44949] +[group_44950] +[group_44951] +[group_44952] +[group_44953] +[group_44954] +[group_44955] +[group_44956] +[group_44957] +[group_44958] +[group_44959] +[group_44960] +[group_44961] +[group_44962] +[group_44963] +[group_44964] +[group_44965] +[group_44966] +[group_44967] +[group_44968] +[group_44969] +[group_44970] +[group_44971] +[group_44972] +[group_44973] +[group_44974] +[group_44975] +[group_44976] +[group_44977] +[group_44978] +[group_44979] +[group_44980] +[group_44981] +[group_44982] +[group_44983] +[group_44984] +[group_44985] +[group_44986] +[group_44987] +[group_44988] +[group_44989] +[group_44990] +[group_44991] +[group_44992] +[group_44993] +[group_44994] +[group_44995] +[group_44996] +[group_44997] +[group_44998] +[group_44999] +[group_45000] +[group_45001] +[group_45002] +[group_45003] +[group_45004] +[group_45005] +[group_45006] +[group_45007] +[group_45008] +[group_45009] +[group_45010] +[group_45011] +[group_45012] +[group_45013] +[group_45014] +[group_45015] +[group_45016] +[group_45017] +[group_45018] +[group_45019] +[group_45020] +[group_45021] +[group_45022] +[group_45023] +[group_45024] +[group_45025] +[group_45026] +[group_45027] +[group_45028] +[group_45029] +[group_45030] +[group_45031] +[group_45032] +[group_45033] +[group_45034] +[group_45035] +[group_45036] +[group_45037] +[group_45038] +[group_45039] +[group_45040] +[group_45041] +[group_45042] +[group_45043] +[group_45044] +[group_45045] +[group_45046] +[group_45047] +[group_45048] +[group_45049] +[group_45050] +[group_45051] +[group_45052] +[group_45053] +[group_45054] +[group_45055] +[group_45056] +[group_45057] +[group_45058] +[group_45059] +[group_45060] +[group_45061] +[group_45062] +[group_45063] +[group_45064] +[group_45065] +[group_45066] +[group_45067] +[group_45068] +[group_45069] +[group_45070] +[group_45071] +[group_45072] +[group_45073] +[group_45074] +[group_45075] +[group_45076] +[group_45077] +[group_45078] +[group_45079] +[group_45080] +[group_45081] +[group_45082] +[group_45083] +[group_45084] +[group_45085] +[group_45086] +[group_45087] +[group_45088] +[group_45089] +[group_45090] +[group_45091] +[group_45092] +[group_45093] +[group_45094] +[group_45095] +[group_45096] +[group_45097] +[group_45098] +[group_45099] +[group_45100] +[group_45101] +[group_45102] +[group_45103] +[group_45104] +[group_45105] +[group_45106] +[group_45107] +[group_45108] +[group_45109] +[group_45110] +[group_45111] +[group_45112] +[group_45113] +[group_45114] +[group_45115] +[group_45116] +[group_45117] +[group_45118] +[group_45119] +[group_45120] +[group_45121] +[group_45122] +[group_45123] +[group_45124] +[group_45125] +[group_45126] +[group_45127] +[group_45128] +[group_45129] +[group_45130] +[group_45131] +[group_45132] +[group_45133] +[group_45134] +[group_45135] +[group_45136] +[group_45137] +[group_45138] +[group_45139] +[group_45140] +[group_45141] +[group_45142] +[group_45143] +[group_45144] +[group_45145] +[group_45146] +[group_45147] +[group_45148] +[group_45149] +[group_45150] +[group_45151] +[group_45152] +[group_45153] +[group_45154] +[group_45155] +[group_45156] +[group_45157] +[group_45158] +[group_45159] +[group_45160] +[group_45161] +[group_45162] +[group_45163] +[group_45164] +[group_45165] +[group_45166] +[group_45167] +[group_45168] +[group_45169] +[group_45170] +[group_45171] +[group_45172] +[group_45173] +[group_45174] +[group_45175] +[group_45176] +[group_45177] +[group_45178] +[group_45179] +[group_45180] +[group_45181] +[group_45182] +[group_45183] +[group_45184] +[group_45185] +[group_45186] +[group_45187] +[group_45188] +[group_45189] +[group_45190] +[group_45191] +[group_45192] +[group_45193] +[group_45194] +[group_45195] +[group_45196] +[group_45197] +[group_45198] +[group_45199] +[group_45200] +[group_45201] +[group_45202] +[group_45203] +[group_45204] +[group_45205] +[group_45206] +[group_45207] +[group_45208] +[group_45209] +[group_45210] +[group_45211] +[group_45212] +[group_45213] +[group_45214] +[group_45215] +[group_45216] +[group_45217] +[group_45218] +[group_45219] +[group_45220] +[group_45221] +[group_45222] +[group_45223] +[group_45224] +[group_45225] +[group_45226] +[group_45227] +[group_45228] +[group_45229] +[group_45230] +[group_45231] +[group_45232] +[group_45233] +[group_45234] +[group_45235] +[group_45236] +[group_45237] +[group_45238] +[group_45239] +[group_45240] +[group_45241] +[group_45242] +[group_45243] +[group_45244] +[group_45245] +[group_45246] +[group_45247] +[group_45248] +[group_45249] +[group_45250] +[group_45251] +[group_45252] +[group_45253] +[group_45254] +[group_45255] +[group_45256] +[group_45257] +[group_45258] +[group_45259] +[group_45260] +[group_45261] +[group_45262] +[group_45263] +[group_45264] +[group_45265] +[group_45266] +[group_45267] +[group_45268] +[group_45269] +[group_45270] +[group_45271] +[group_45272] +[group_45273] +[group_45274] +[group_45275] +[group_45276] +[group_45277] +[group_45278] +[group_45279] +[group_45280] +[group_45281] +[group_45282] +[group_45283] +[group_45284] +[group_45285] +[group_45286] +[group_45287] +[group_45288] +[group_45289] +[group_45290] +[group_45291] +[group_45292] +[group_45293] +[group_45294] +[group_45295] +[group_45296] +[group_45297] +[group_45298] +[group_45299] +[group_45300] +[group_45301] +[group_45302] +[group_45303] +[group_45304] +[group_45305] +[group_45306] +[group_45307] +[group_45308] +[group_45309] +[group_45310] +[group_45311] +[group_45312] +[group_45313] +[group_45314] +[group_45315] +[group_45316] +[group_45317] +[group_45318] +[group_45319] +[group_45320] +[group_45321] +[group_45322] +[group_45323] +[group_45324] +[group_45325] +[group_45326] +[group_45327] +[group_45328] +[group_45329] +[group_45330] +[group_45331] +[group_45332] +[group_45333] +[group_45334] +[group_45335] +[group_45336] +[group_45337] +[group_45338] +[group_45339] +[group_45340] +[group_45341] +[group_45342] +[group_45343] +[group_45344] +[group_45345] +[group_45346] +[group_45347] +[group_45348] +[group_45349] +[group_45350] +[group_45351] +[group_45352] +[group_45353] +[group_45354] +[group_45355] +[group_45356] +[group_45357] +[group_45358] +[group_45359] +[group_45360] +[group_45361] +[group_45362] +[group_45363] +[group_45364] +[group_45365] +[group_45366] +[group_45367] +[group_45368] +[group_45369] +[group_45370] +[group_45371] +[group_45372] +[group_45373] +[group_45374] +[group_45375] +[group_45376] +[group_45377] +[group_45378] +[group_45379] +[group_45380] +[group_45381] +[group_45382] +[group_45383] +[group_45384] +[group_45385] +[group_45386] +[group_45387] +[group_45388] +[group_45389] +[group_45390] +[group_45391] +[group_45392] +[group_45393] +[group_45394] +[group_45395] +[group_45396] +[group_45397] +[group_45398] +[group_45399] +[group_45400] +[group_45401] +[group_45402] +[group_45403] +[group_45404] +[group_45405] +[group_45406] +[group_45407] +[group_45408] +[group_45409] +[group_45410] +[group_45411] +[group_45412] +[group_45413] +[group_45414] +[group_45415] +[group_45416] +[group_45417] +[group_45418] +[group_45419] +[group_45420] +[group_45421] +[group_45422] +[group_45423] +[group_45424] +[group_45425] +[group_45426] +[group_45427] +[group_45428] +[group_45429] +[group_45430] +[group_45431] +[group_45432] +[group_45433] +[group_45434] +[group_45435] +[group_45436] +[group_45437] +[group_45438] +[group_45439] +[group_45440] +[group_45441] +[group_45442] +[group_45443] +[group_45444] +[group_45445] +[group_45446] +[group_45447] +[group_45448] +[group_45449] +[group_45450] +[group_45451] +[group_45452] +[group_45453] +[group_45454] +[group_45455] +[group_45456] +[group_45457] +[group_45458] +[group_45459] +[group_45460] +[group_45461] +[group_45462] +[group_45463] +[group_45464] +[group_45465] +[group_45466] +[group_45467] +[group_45468] +[group_45469] +[group_45470] +[group_45471] +[group_45472] +[group_45473] +[group_45474] +[group_45475] +[group_45476] +[group_45477] +[group_45478] +[group_45479] +[group_45480] +[group_45481] +[group_45482] +[group_45483] +[group_45484] +[group_45485] +[group_45486] +[group_45487] +[group_45488] +[group_45489] +[group_45490] +[group_45491] +[group_45492] +[group_45493] +[group_45494] +[group_45495] +[group_45496] +[group_45497] +[group_45498] +[group_45499] +[group_45500] +[group_45501] +[group_45502] +[group_45503] +[group_45504] +[group_45505] +[group_45506] +[group_45507] +[group_45508] +[group_45509] +[group_45510] +[group_45511] +[group_45512] +[group_45513] +[group_45514] +[group_45515] +[group_45516] +[group_45517] +[group_45518] +[group_45519] +[group_45520] +[group_45521] +[group_45522] +[group_45523] +[group_45524] +[group_45525] +[group_45526] +[group_45527] +[group_45528] +[group_45529] +[group_45530] +[group_45531] +[group_45532] +[group_45533] +[group_45534] +[group_45535] +[group_45536] +[group_45537] +[group_45538] +[group_45539] +[group_45540] +[group_45541] +[group_45542] +[group_45543] +[group_45544] +[group_45545] +[group_45546] +[group_45547] +[group_45548] +[group_45549] +[group_45550] +[group_45551] +[group_45552] +[group_45553] +[group_45554] +[group_45555] +[group_45556] +[group_45557] +[group_45558] +[group_45559] +[group_45560] +[group_45561] +[group_45562] +[group_45563] +[group_45564] +[group_45565] +[group_45566] +[group_45567] +[group_45568] +[group_45569] +[group_45570] +[group_45571] +[group_45572] +[group_45573] +[group_45574] +[group_45575] +[group_45576] +[group_45577] +[group_45578] +[group_45579] +[group_45580] +[group_45581] +[group_45582] +[group_45583] +[group_45584] +[group_45585] +[group_45586] +[group_45587] +[group_45588] +[group_45589] +[group_45590] +[group_45591] +[group_45592] +[group_45593] +[group_45594] +[group_45595] +[group_45596] +[group_45597] +[group_45598] +[group_45599] +[group_45600] +[group_45601] +[group_45602] +[group_45603] +[group_45604] +[group_45605] +[group_45606] +[group_45607] +[group_45608] +[group_45609] +[group_45610] +[group_45611] +[group_45612] +[group_45613] +[group_45614] +[group_45615] +[group_45616] +[group_45617] +[group_45618] +[group_45619] +[group_45620] +[group_45621] +[group_45622] +[group_45623] +[group_45624] +[group_45625] +[group_45626] +[group_45627] +[group_45628] +[group_45629] +[group_45630] +[group_45631] +[group_45632] +[group_45633] +[group_45634] +[group_45635] +[group_45636] +[group_45637] +[group_45638] +[group_45639] +[group_45640] +[group_45641] +[group_45642] +[group_45643] +[group_45644] +[group_45645] +[group_45646] +[group_45647] +[group_45648] +[group_45649] +[group_45650] +[group_45651] +[group_45652] +[group_45653] +[group_45654] +[group_45655] +[group_45656] +[group_45657] +[group_45658] +[group_45659] +[group_45660] +[group_45661] +[group_45662] +[group_45663] +[group_45664] +[group_45665] +[group_45666] +[group_45667] +[group_45668] +[group_45669] +[group_45670] +[group_45671] +[group_45672] +[group_45673] +[group_45674] +[group_45675] +[group_45676] +[group_45677] +[group_45678] +[group_45679] +[group_45680] +[group_45681] +[group_45682] +[group_45683] +[group_45684] +[group_45685] +[group_45686] +[group_45687] +[group_45688] +[group_45689] +[group_45690] +[group_45691] +[group_45692] +[group_45693] +[group_45694] +[group_45695] +[group_45696] +[group_45697] +[group_45698] +[group_45699] +[group_45700] +[group_45701] +[group_45702] +[group_45703] +[group_45704] +[group_45705] +[group_45706] +[group_45707] +[group_45708] +[group_45709] +[group_45710] +[group_45711] +[group_45712] +[group_45713] +[group_45714] +[group_45715] +[group_45716] +[group_45717] +[group_45718] +[group_45719] +[group_45720] +[group_45721] +[group_45722] +[group_45723] +[group_45724] +[group_45725] +[group_45726] +[group_45727] +[group_45728] +[group_45729] +[group_45730] +[group_45731] +[group_45732] +[group_45733] +[group_45734] +[group_45735] +[group_45736] +[group_45737] +[group_45738] +[group_45739] +[group_45740] +[group_45741] +[group_45742] +[group_45743] +[group_45744] +[group_45745] +[group_45746] +[group_45747] +[group_45748] +[group_45749] +[group_45750] +[group_45751] +[group_45752] +[group_45753] +[group_45754] +[group_45755] +[group_45756] +[group_45757] +[group_45758] +[group_45759] +[group_45760] +[group_45761] +[group_45762] +[group_45763] +[group_45764] +[group_45765] +[group_45766] +[group_45767] +[group_45768] +[group_45769] +[group_45770] +[group_45771] +[group_45772] +[group_45773] +[group_45774] +[group_45775] +[group_45776] +[group_45777] +[group_45778] +[group_45779] +[group_45780] +[group_45781] +[group_45782] +[group_45783] +[group_45784] +[group_45785] +[group_45786] +[group_45787] +[group_45788] +[group_45789] +[group_45790] +[group_45791] +[group_45792] +[group_45793] +[group_45794] +[group_45795] +[group_45796] +[group_45797] +[group_45798] +[group_45799] +[group_45800] +[group_45801] +[group_45802] +[group_45803] +[group_45804] +[group_45805] +[group_45806] +[group_45807] +[group_45808] +[group_45809] +[group_45810] +[group_45811] +[group_45812] +[group_45813] +[group_45814] +[group_45815] +[group_45816] +[group_45817] +[group_45818] +[group_45819] +[group_45820] +[group_45821] +[group_45822] +[group_45823] +[group_45824] +[group_45825] +[group_45826] +[group_45827] +[group_45828] +[group_45829] +[group_45830] +[group_45831] +[group_45832] +[group_45833] +[group_45834] +[group_45835] +[group_45836] +[group_45837] +[group_45838] +[group_45839] +[group_45840] +[group_45841] +[group_45842] +[group_45843] +[group_45844] +[group_45845] +[group_45846] +[group_45847] +[group_45848] +[group_45849] +[group_45850] +[group_45851] +[group_45852] +[group_45853] +[group_45854] +[group_45855] +[group_45856] +[group_45857] +[group_45858] +[group_45859] +[group_45860] +[group_45861] +[group_45862] +[group_45863] +[group_45864] +[group_45865] +[group_45866] +[group_45867] +[group_45868] +[group_45869] +[group_45870] +[group_45871] +[group_45872] +[group_45873] +[group_45874] +[group_45875] +[group_45876] +[group_45877] +[group_45878] +[group_45879] +[group_45880] +[group_45881] +[group_45882] +[group_45883] +[group_45884] +[group_45885] +[group_45886] +[group_45887] +[group_45888] +[group_45889] +[group_45890] +[group_45891] +[group_45892] +[group_45893] +[group_45894] +[group_45895] +[group_45896] +[group_45897] +[group_45898] +[group_45899] +[group_45900] +[group_45901] +[group_45902] +[group_45903] +[group_45904] +[group_45905] +[group_45906] +[group_45907] +[group_45908] +[group_45909] +[group_45910] +[group_45911] +[group_45912] +[group_45913] +[group_45914] +[group_45915] +[group_45916] +[group_45917] +[group_45918] +[group_45919] +[group_45920] +[group_45921] +[group_45922] +[group_45923] +[group_45924] +[group_45925] +[group_45926] +[group_45927] +[group_45928] +[group_45929] +[group_45930] +[group_45931] +[group_45932] +[group_45933] +[group_45934] +[group_45935] +[group_45936] +[group_45937] +[group_45938] +[group_45939] +[group_45940] +[group_45941] +[group_45942] +[group_45943] +[group_45944] +[group_45945] +[group_45946] +[group_45947] +[group_45948] +[group_45949] +[group_45950] +[group_45951] +[group_45952] +[group_45953] +[group_45954] +[group_45955] +[group_45956] +[group_45957] +[group_45958] +[group_45959] +[group_45960] +[group_45961] +[group_45962] +[group_45963] +[group_45964] +[group_45965] +[group_45966] +[group_45967] +[group_45968] +[group_45969] +[group_45970] +[group_45971] +[group_45972] +[group_45973] +[group_45974] +[group_45975] +[group_45976] +[group_45977] +[group_45978] +[group_45979] +[group_45980] +[group_45981] +[group_45982] +[group_45983] +[group_45984] +[group_45985] +[group_45986] +[group_45987] +[group_45988] +[group_45989] +[group_45990] +[group_45991] +[group_45992] +[group_45993] +[group_45994] +[group_45995] +[group_45996] +[group_45997] +[group_45998] +[group_45999] +[group_46000] +[group_46001] +[group_46002] +[group_46003] +[group_46004] +[group_46005] +[group_46006] +[group_46007] +[group_46008] +[group_46009] +[group_46010] +[group_46011] +[group_46012] +[group_46013] +[group_46014] +[group_46015] +[group_46016] +[group_46017] +[group_46018] +[group_46019] +[group_46020] +[group_46021] +[group_46022] +[group_46023] +[group_46024] +[group_46025] +[group_46026] +[group_46027] +[group_46028] +[group_46029] +[group_46030] +[group_46031] +[group_46032] +[group_46033] +[group_46034] +[group_46035] +[group_46036] +[group_46037] +[group_46038] +[group_46039] +[group_46040] +[group_46041] +[group_46042] +[group_46043] +[group_46044] +[group_46045] +[group_46046] +[group_46047] +[group_46048] +[group_46049] +[group_46050] +[group_46051] +[group_46052] +[group_46053] +[group_46054] +[group_46055] +[group_46056] +[group_46057] +[group_46058] +[group_46059] +[group_46060] +[group_46061] +[group_46062] +[group_46063] +[group_46064] +[group_46065] +[group_46066] +[group_46067] +[group_46068] +[group_46069] +[group_46070] +[group_46071] +[group_46072] +[group_46073] +[group_46074] +[group_46075] +[group_46076] +[group_46077] +[group_46078] +[group_46079] +[group_46080] +[group_46081] +[group_46082] +[group_46083] +[group_46084] +[group_46085] +[group_46086] +[group_46087] +[group_46088] +[group_46089] +[group_46090] +[group_46091] +[group_46092] +[group_46093] +[group_46094] +[group_46095] +[group_46096] +[group_46097] +[group_46098] +[group_46099] +[group_46100] +[group_46101] +[group_46102] +[group_46103] +[group_46104] +[group_46105] +[group_46106] +[group_46107] +[group_46108] +[group_46109] +[group_46110] +[group_46111] +[group_46112] +[group_46113] +[group_46114] +[group_46115] +[group_46116] +[group_46117] +[group_46118] +[group_46119] +[group_46120] +[group_46121] +[group_46122] +[group_46123] +[group_46124] +[group_46125] +[group_46126] +[group_46127] +[group_46128] +[group_46129] +[group_46130] +[group_46131] +[group_46132] +[group_46133] +[group_46134] +[group_46135] +[group_46136] +[group_46137] +[group_46138] +[group_46139] +[group_46140] +[group_46141] +[group_46142] +[group_46143] +[group_46144] +[group_46145] +[group_46146] +[group_46147] +[group_46148] +[group_46149] +[group_46150] +[group_46151] +[group_46152] +[group_46153] +[group_46154] +[group_46155] +[group_46156] +[group_46157] +[group_46158] +[group_46159] +[group_46160] +[group_46161] +[group_46162] +[group_46163] +[group_46164] +[group_46165] +[group_46166] +[group_46167] +[group_46168] +[group_46169] +[group_46170] +[group_46171] +[group_46172] +[group_46173] +[group_46174] +[group_46175] +[group_46176] +[group_46177] +[group_46178] +[group_46179] +[group_46180] +[group_46181] +[group_46182] +[group_46183] +[group_46184] +[group_46185] +[group_46186] +[group_46187] +[group_46188] +[group_46189] +[group_46190] +[group_46191] +[group_46192] +[group_46193] +[group_46194] +[group_46195] +[group_46196] +[group_46197] +[group_46198] +[group_46199] +[group_46200] +[group_46201] +[group_46202] +[group_46203] +[group_46204] +[group_46205] +[group_46206] +[group_46207] +[group_46208] +[group_46209] +[group_46210] +[group_46211] +[group_46212] +[group_46213] +[group_46214] +[group_46215] +[group_46216] +[group_46217] +[group_46218] +[group_46219] +[group_46220] +[group_46221] +[group_46222] +[group_46223] +[group_46224] +[group_46225] +[group_46226] +[group_46227] +[group_46228] +[group_46229] +[group_46230] +[group_46231] +[group_46232] +[group_46233] +[group_46234] +[group_46235] +[group_46236] +[group_46237] +[group_46238] +[group_46239] +[group_46240] +[group_46241] +[group_46242] +[group_46243] +[group_46244] +[group_46245] +[group_46246] +[group_46247] +[group_46248] +[group_46249] +[group_46250] +[group_46251] +[group_46252] +[group_46253] +[group_46254] +[group_46255] +[group_46256] +[group_46257] +[group_46258] +[group_46259] +[group_46260] +[group_46261] +[group_46262] +[group_46263] +[group_46264] +[group_46265] +[group_46266] +[group_46267] +[group_46268] +[group_46269] +[group_46270] +[group_46271] +[group_46272] +[group_46273] +[group_46274] +[group_46275] +[group_46276] +[group_46277] +[group_46278] +[group_46279] +[group_46280] +[group_46281] +[group_46282] +[group_46283] +[group_46284] +[group_46285] +[group_46286] +[group_46287] +[group_46288] +[group_46289] +[group_46290] +[group_46291] +[group_46292] +[group_46293] +[group_46294] +[group_46295] +[group_46296] +[group_46297] +[group_46298] +[group_46299] +[group_46300] +[group_46301] +[group_46302] +[group_46303] +[group_46304] +[group_46305] +[group_46306] +[group_46307] +[group_46308] +[group_46309] +[group_46310] +[group_46311] +[group_46312] +[group_46313] +[group_46314] +[group_46315] +[group_46316] +[group_46317] +[group_46318] +[group_46319] +[group_46320] +[group_46321] +[group_46322] +[group_46323] +[group_46324] +[group_46325] +[group_46326] +[group_46327] +[group_46328] +[group_46329] +[group_46330] +[group_46331] +[group_46332] +[group_46333] +[group_46334] +[group_46335] +[group_46336] +[group_46337] +[group_46338] +[group_46339] +[group_46340] +[group_46341] +[group_46342] +[group_46343] +[group_46344] +[group_46345] +[group_46346] +[group_46347] +[group_46348] +[group_46349] +[group_46350] +[group_46351] +[group_46352] +[group_46353] +[group_46354] +[group_46355] +[group_46356] +[group_46357] +[group_46358] +[group_46359] +[group_46360] +[group_46361] +[group_46362] +[group_46363] +[group_46364] +[group_46365] +[group_46366] +[group_46367] +[group_46368] +[group_46369] +[group_46370] +[group_46371] +[group_46372] +[group_46373] +[group_46374] +[group_46375] +[group_46376] +[group_46377] +[group_46378] +[group_46379] +[group_46380] +[group_46381] +[group_46382] +[group_46383] +[group_46384] +[group_46385] +[group_46386] +[group_46387] +[group_46388] +[group_46389] +[group_46390] +[group_46391] +[group_46392] +[group_46393] +[group_46394] +[group_46395] +[group_46396] +[group_46397] +[group_46398] +[group_46399] +[group_46400] +[group_46401] +[group_46402] +[group_46403] +[group_46404] +[group_46405] +[group_46406] +[group_46407] +[group_46408] +[group_46409] +[group_46410] +[group_46411] +[group_46412] +[group_46413] +[group_46414] +[group_46415] +[group_46416] +[group_46417] +[group_46418] +[group_46419] +[group_46420] +[group_46421] +[group_46422] +[group_46423] +[group_46424] +[group_46425] +[group_46426] +[group_46427] +[group_46428] +[group_46429] +[group_46430] +[group_46431] +[group_46432] +[group_46433] +[group_46434] +[group_46435] +[group_46436] +[group_46437] +[group_46438] +[group_46439] +[group_46440] +[group_46441] +[group_46442] +[group_46443] +[group_46444] +[group_46445] +[group_46446] +[group_46447] +[group_46448] +[group_46449] +[group_46450] +[group_46451] +[group_46452] +[group_46453] +[group_46454] +[group_46455] +[group_46456] +[group_46457] +[group_46458] +[group_46459] +[group_46460] +[group_46461] +[group_46462] +[group_46463] +[group_46464] +[group_46465] +[group_46466] +[group_46467] +[group_46468] +[group_46469] +[group_46470] +[group_46471] +[group_46472] +[group_46473] +[group_46474] +[group_46475] +[group_46476] +[group_46477] +[group_46478] +[group_46479] +[group_46480] +[group_46481] +[group_46482] +[group_46483] +[group_46484] +[group_46485] +[group_46486] +[group_46487] +[group_46488] +[group_46489] +[group_46490] +[group_46491] +[group_46492] +[group_46493] +[group_46494] +[group_46495] +[group_46496] +[group_46497] +[group_46498] +[group_46499] +[group_46500] +[group_46501] +[group_46502] +[group_46503] +[group_46504] +[group_46505] +[group_46506] +[group_46507] +[group_46508] +[group_46509] +[group_46510] +[group_46511] +[group_46512] +[group_46513] +[group_46514] +[group_46515] +[group_46516] +[group_46517] +[group_46518] +[group_46519] +[group_46520] +[group_46521] +[group_46522] +[group_46523] +[group_46524] +[group_46525] +[group_46526] +[group_46527] +[group_46528] +[group_46529] +[group_46530] +[group_46531] +[group_46532] +[group_46533] +[group_46534] +[group_46535] +[group_46536] +[group_46537] +[group_46538] +[group_46539] +[group_46540] +[group_46541] +[group_46542] +[group_46543] +[group_46544] +[group_46545] +[group_46546] +[group_46547] +[group_46548] +[group_46549] +[group_46550] +[group_46551] +[group_46552] +[group_46553] +[group_46554] +[group_46555] +[group_46556] +[group_46557] +[group_46558] +[group_46559] +[group_46560] +[group_46561] +[group_46562] +[group_46563] +[group_46564] +[group_46565] +[group_46566] +[group_46567] +[group_46568] +[group_46569] +[group_46570] +[group_46571] +[group_46572] +[group_46573] +[group_46574] +[group_46575] +[group_46576] +[group_46577] +[group_46578] +[group_46579] +[group_46580] +[group_46581] +[group_46582] +[group_46583] +[group_46584] +[group_46585] +[group_46586] +[group_46587] +[group_46588] +[group_46589] +[group_46590] +[group_46591] +[group_46592] +[group_46593] +[group_46594] +[group_46595] +[group_46596] +[group_46597] +[group_46598] +[group_46599] +[group_46600] +[group_46601] +[group_46602] +[group_46603] +[group_46604] +[group_46605] +[group_46606] +[group_46607] +[group_46608] +[group_46609] +[group_46610] +[group_46611] +[group_46612] +[group_46613] +[group_46614] +[group_46615] +[group_46616] +[group_46617] +[group_46618] +[group_46619] +[group_46620] +[group_46621] +[group_46622] +[group_46623] +[group_46624] +[group_46625] +[group_46626] +[group_46627] +[group_46628] +[group_46629] +[group_46630] +[group_46631] +[group_46632] +[group_46633] +[group_46634] +[group_46635] +[group_46636] +[group_46637] +[group_46638] +[group_46639] +[group_46640] +[group_46641] +[group_46642] +[group_46643] +[group_46644] +[group_46645] +[group_46646] +[group_46647] +[group_46648] +[group_46649] +[group_46650] +[group_46651] +[group_46652] +[group_46653] +[group_46654] +[group_46655] +[group_46656] +[group_46657] +[group_46658] +[group_46659] +[group_46660] +[group_46661] +[group_46662] +[group_46663] +[group_46664] +[group_46665] +[group_46666] +[group_46667] +[group_46668] +[group_46669] +[group_46670] +[group_46671] +[group_46672] +[group_46673] +[group_46674] +[group_46675] +[group_46676] +[group_46677] +[group_46678] +[group_46679] +[group_46680] +[group_46681] +[group_46682] +[group_46683] +[group_46684] +[group_46685] +[group_46686] +[group_46687] +[group_46688] +[group_46689] +[group_46690] +[group_46691] +[group_46692] +[group_46693] +[group_46694] +[group_46695] +[group_46696] +[group_46697] +[group_46698] +[group_46699] +[group_46700] +[group_46701] +[group_46702] +[group_46703] +[group_46704] +[group_46705] +[group_46706] +[group_46707] +[group_46708] +[group_46709] +[group_46710] +[group_46711] +[group_46712] +[group_46713] +[group_46714] +[group_46715] +[group_46716] +[group_46717] +[group_46718] +[group_46719] +[group_46720] +[group_46721] +[group_46722] +[group_46723] +[group_46724] +[group_46725] +[group_46726] +[group_46727] +[group_46728] +[group_46729] +[group_46730] +[group_46731] +[group_46732] +[group_46733] +[group_46734] +[group_46735] +[group_46736] +[group_46737] +[group_46738] +[group_46739] +[group_46740] +[group_46741] +[group_46742] +[group_46743] +[group_46744] +[group_46745] +[group_46746] +[group_46747] +[group_46748] +[group_46749] +[group_46750] +[group_46751] +[group_46752] +[group_46753] +[group_46754] +[group_46755] +[group_46756] +[group_46757] +[group_46758] +[group_46759] +[group_46760] +[group_46761] +[group_46762] +[group_46763] +[group_46764] +[group_46765] +[group_46766] +[group_46767] +[group_46768] +[group_46769] +[group_46770] +[group_46771] +[group_46772] +[group_46773] +[group_46774] +[group_46775] +[group_46776] +[group_46777] +[group_46778] +[group_46779] +[group_46780] +[group_46781] +[group_46782] +[group_46783] +[group_46784] +[group_46785] +[group_46786] +[group_46787] +[group_46788] +[group_46789] +[group_46790] +[group_46791] +[group_46792] +[group_46793] +[group_46794] +[group_46795] +[group_46796] +[group_46797] +[group_46798] +[group_46799] +[group_46800] +[group_46801] +[group_46802] +[group_46803] +[group_46804] +[group_46805] +[group_46806] +[group_46807] +[group_46808] +[group_46809] +[group_46810] +[group_46811] +[group_46812] +[group_46813] +[group_46814] +[group_46815] +[group_46816] +[group_46817] +[group_46818] +[group_46819] +[group_46820] +[group_46821] +[group_46822] +[group_46823] +[group_46824] +[group_46825] +[group_46826] +[group_46827] +[group_46828] +[group_46829] +[group_46830] +[group_46831] +[group_46832] +[group_46833] +[group_46834] +[group_46835] +[group_46836] +[group_46837] +[group_46838] +[group_46839] +[group_46840] +[group_46841] +[group_46842] +[group_46843] +[group_46844] +[group_46845] +[group_46846] +[group_46847] +[group_46848] +[group_46849] +[group_46850] +[group_46851] +[group_46852] +[group_46853] +[group_46854] +[group_46855] +[group_46856] +[group_46857] +[group_46858] +[group_46859] +[group_46860] +[group_46861] +[group_46862] +[group_46863] +[group_46864] +[group_46865] +[group_46866] +[group_46867] +[group_46868] +[group_46869] +[group_46870] +[group_46871] +[group_46872] +[group_46873] +[group_46874] +[group_46875] +[group_46876] +[group_46877] +[group_46878] +[group_46879] +[group_46880] +[group_46881] +[group_46882] +[group_46883] +[group_46884] +[group_46885] +[group_46886] +[group_46887] +[group_46888] +[group_46889] +[group_46890] +[group_46891] +[group_46892] +[group_46893] +[group_46894] +[group_46895] +[group_46896] +[group_46897] +[group_46898] +[group_46899] +[group_46900] +[group_46901] +[group_46902] +[group_46903] +[group_46904] +[group_46905] +[group_46906] +[group_46907] +[group_46908] +[group_46909] +[group_46910] +[group_46911] +[group_46912] +[group_46913] +[group_46914] +[group_46915] +[group_46916] +[group_46917] +[group_46918] +[group_46919] +[group_46920] +[group_46921] +[group_46922] +[group_46923] +[group_46924] +[group_46925] +[group_46926] +[group_46927] +[group_46928] +[group_46929] +[group_46930] +[group_46931] +[group_46932] +[group_46933] +[group_46934] +[group_46935] +[group_46936] +[group_46937] +[group_46938] +[group_46939] +[group_46940] +[group_46941] +[group_46942] +[group_46943] +[group_46944] +[group_46945] +[group_46946] +[group_46947] +[group_46948] +[group_46949] +[group_46950] +[group_46951] +[group_46952] +[group_46953] +[group_46954] +[group_46955] +[group_46956] +[group_46957] +[group_46958] +[group_46959] +[group_46960] +[group_46961] +[group_46962] +[group_46963] +[group_46964] +[group_46965] +[group_46966] +[group_46967] +[group_46968] +[group_46969] +[group_46970] +[group_46971] +[group_46972] +[group_46973] +[group_46974] +[group_46975] +[group_46976] +[group_46977] +[group_46978] +[group_46979] +[group_46980] +[group_46981] +[group_46982] +[group_46983] +[group_46984] +[group_46985] +[group_46986] +[group_46987] +[group_46988] +[group_46989] +[group_46990] +[group_46991] +[group_46992] +[group_46993] +[group_46994] +[group_46995] +[group_46996] +[group_46997] +[group_46998] +[group_46999] +[group_47000] +[group_47001] +[group_47002] +[group_47003] +[group_47004] +[group_47005] +[group_47006] +[group_47007] +[group_47008] +[group_47009] +[group_47010] +[group_47011] +[group_47012] +[group_47013] +[group_47014] +[group_47015] +[group_47016] +[group_47017] +[group_47018] +[group_47019] +[group_47020] +[group_47021] +[group_47022] +[group_47023] +[group_47024] +[group_47025] +[group_47026] +[group_47027] +[group_47028] +[group_47029] +[group_47030] +[group_47031] +[group_47032] +[group_47033] +[group_47034] +[group_47035] +[group_47036] +[group_47037] +[group_47038] +[group_47039] +[group_47040] +[group_47041] +[group_47042] +[group_47043] +[group_47044] +[group_47045] +[group_47046] +[group_47047] +[group_47048] +[group_47049] +[group_47050] +[group_47051] +[group_47052] +[group_47053] +[group_47054] +[group_47055] +[group_47056] +[group_47057] +[group_47058] +[group_47059] +[group_47060] +[group_47061] +[group_47062] +[group_47063] +[group_47064] +[group_47065] +[group_47066] +[group_47067] +[group_47068] +[group_47069] +[group_47070] +[group_47071] +[group_47072] +[group_47073] +[group_47074] +[group_47075] +[group_47076] +[group_47077] +[group_47078] +[group_47079] +[group_47080] +[group_47081] +[group_47082] +[group_47083] +[group_47084] +[group_47085] +[group_47086] +[group_47087] +[group_47088] +[group_47089] +[group_47090] +[group_47091] +[group_47092] +[group_47093] +[group_47094] +[group_47095] +[group_47096] +[group_47097] +[group_47098] +[group_47099] +[group_47100] +[group_47101] +[group_47102] +[group_47103] +[group_47104] +[group_47105] +[group_47106] +[group_47107] +[group_47108] +[group_47109] +[group_47110] +[group_47111] +[group_47112] +[group_47113] +[group_47114] +[group_47115] +[group_47116] +[group_47117] +[group_47118] +[group_47119] +[group_47120] +[group_47121] +[group_47122] +[group_47123] +[group_47124] +[group_47125] +[group_47126] +[group_47127] +[group_47128] +[group_47129] +[group_47130] +[group_47131] +[group_47132] +[group_47133] +[group_47134] +[group_47135] +[group_47136] +[group_47137] +[group_47138] +[group_47139] +[group_47140] +[group_47141] +[group_47142] +[group_47143] +[group_47144] +[group_47145] +[group_47146] +[group_47147] +[group_47148] +[group_47149] +[group_47150] +[group_47151] +[group_47152] +[group_47153] +[group_47154] +[group_47155] +[group_47156] +[group_47157] +[group_47158] +[group_47159] +[group_47160] +[group_47161] +[group_47162] +[group_47163] +[group_47164] +[group_47165] +[group_47166] +[group_47167] +[group_47168] +[group_47169] +[group_47170] +[group_47171] +[group_47172] +[group_47173] +[group_47174] +[group_47175] +[group_47176] +[group_47177] +[group_47178] +[group_47179] +[group_47180] +[group_47181] +[group_47182] +[group_47183] +[group_47184] +[group_47185] +[group_47186] +[group_47187] +[group_47188] +[group_47189] +[group_47190] +[group_47191] +[group_47192] +[group_47193] +[group_47194] +[group_47195] +[group_47196] +[group_47197] +[group_47198] +[group_47199] +[group_47200] +[group_47201] +[group_47202] +[group_47203] +[group_47204] +[group_47205] +[group_47206] +[group_47207] +[group_47208] +[group_47209] +[group_47210] +[group_47211] +[group_47212] +[group_47213] +[group_47214] +[group_47215] +[group_47216] +[group_47217] +[group_47218] +[group_47219] +[group_47220] +[group_47221] +[group_47222] +[group_47223] +[group_47224] +[group_47225] +[group_47226] +[group_47227] +[group_47228] +[group_47229] +[group_47230] +[group_47231] +[group_47232] +[group_47233] +[group_47234] +[group_47235] +[group_47236] +[group_47237] +[group_47238] +[group_47239] +[group_47240] +[group_47241] +[group_47242] +[group_47243] +[group_47244] +[group_47245] +[group_47246] +[group_47247] +[group_47248] +[group_47249] +[group_47250] +[group_47251] +[group_47252] +[group_47253] +[group_47254] +[group_47255] +[group_47256] +[group_47257] +[group_47258] +[group_47259] +[group_47260] +[group_47261] +[group_47262] +[group_47263] +[group_47264] +[group_47265] +[group_47266] +[group_47267] +[group_47268] +[group_47269] +[group_47270] +[group_47271] +[group_47272] +[group_47273] +[group_47274] +[group_47275] +[group_47276] +[group_47277] +[group_47278] +[group_47279] +[group_47280] +[group_47281] +[group_47282] +[group_47283] +[group_47284] +[group_47285] +[group_47286] +[group_47287] +[group_47288] +[group_47289] +[group_47290] +[group_47291] +[group_47292] +[group_47293] +[group_47294] +[group_47295] +[group_47296] +[group_47297] +[group_47298] +[group_47299] +[group_47300] +[group_47301] +[group_47302] +[group_47303] +[group_47304] +[group_47305] +[group_47306] +[group_47307] +[group_47308] +[group_47309] +[group_47310] +[group_47311] +[group_47312] +[group_47313] +[group_47314] +[group_47315] +[group_47316] +[group_47317] +[group_47318] +[group_47319] +[group_47320] +[group_47321] +[group_47322] +[group_47323] +[group_47324] +[group_47325] +[group_47326] +[group_47327] +[group_47328] +[group_47329] +[group_47330] +[group_47331] +[group_47332] +[group_47333] +[group_47334] +[group_47335] +[group_47336] +[group_47337] +[group_47338] +[group_47339] +[group_47340] +[group_47341] +[group_47342] +[group_47343] +[group_47344] +[group_47345] +[group_47346] +[group_47347] +[group_47348] +[group_47349] +[group_47350] +[group_47351] +[group_47352] +[group_47353] +[group_47354] +[group_47355] +[group_47356] +[group_47357] +[group_47358] +[group_47359] +[group_47360] +[group_47361] +[group_47362] +[group_47363] +[group_47364] +[group_47365] +[group_47366] +[group_47367] +[group_47368] +[group_47369] +[group_47370] +[group_47371] +[group_47372] +[group_47373] +[group_47374] +[group_47375] +[group_47376] +[group_47377] +[group_47378] +[group_47379] +[group_47380] +[group_47381] +[group_47382] +[group_47383] +[group_47384] +[group_47385] +[group_47386] +[group_47387] +[group_47388] +[group_47389] +[group_47390] +[group_47391] +[group_47392] +[group_47393] +[group_47394] +[group_47395] +[group_47396] +[group_47397] +[group_47398] +[group_47399] +[group_47400] +[group_47401] +[group_47402] +[group_47403] +[group_47404] +[group_47405] +[group_47406] +[group_47407] +[group_47408] +[group_47409] +[group_47410] +[group_47411] +[group_47412] +[group_47413] +[group_47414] +[group_47415] +[group_47416] +[group_47417] +[group_47418] +[group_47419] +[group_47420] +[group_47421] +[group_47422] +[group_47423] +[group_47424] +[group_47425] +[group_47426] +[group_47427] +[group_47428] +[group_47429] +[group_47430] +[group_47431] +[group_47432] +[group_47433] +[group_47434] +[group_47435] +[group_47436] +[group_47437] +[group_47438] +[group_47439] +[group_47440] +[group_47441] +[group_47442] +[group_47443] +[group_47444] +[group_47445] +[group_47446] +[group_47447] +[group_47448] +[group_47449] +[group_47450] +[group_47451] +[group_47452] +[group_47453] +[group_47454] +[group_47455] +[group_47456] +[group_47457] +[group_47458] +[group_47459] +[group_47460] +[group_47461] +[group_47462] +[group_47463] +[group_47464] +[group_47465] +[group_47466] +[group_47467] +[group_47468] +[group_47469] +[group_47470] +[group_47471] +[group_47472] +[group_47473] +[group_47474] +[group_47475] +[group_47476] +[group_47477] +[group_47478] +[group_47479] +[group_47480] +[group_47481] +[group_47482] +[group_47483] +[group_47484] +[group_47485] +[group_47486] +[group_47487] +[group_47488] +[group_47489] +[group_47490] +[group_47491] +[group_47492] +[group_47493] +[group_47494] +[group_47495] +[group_47496] +[group_47497] +[group_47498] +[group_47499] +[group_47500] +[group_47501] +[group_47502] +[group_47503] +[group_47504] +[group_47505] +[group_47506] +[group_47507] +[group_47508] +[group_47509] +[group_47510] +[group_47511] +[group_47512] +[group_47513] +[group_47514] +[group_47515] +[group_47516] +[group_47517] +[group_47518] +[group_47519] +[group_47520] +[group_47521] +[group_47522] +[group_47523] +[group_47524] +[group_47525] +[group_47526] +[group_47527] +[group_47528] +[group_47529] +[group_47530] +[group_47531] +[group_47532] +[group_47533] +[group_47534] +[group_47535] +[group_47536] +[group_47537] +[group_47538] +[group_47539] +[group_47540] +[group_47541] +[group_47542] +[group_47543] +[group_47544] +[group_47545] +[group_47546] +[group_47547] +[group_47548] +[group_47549] +[group_47550] +[group_47551] +[group_47552] +[group_47553] +[group_47554] +[group_47555] +[group_47556] +[group_47557] +[group_47558] +[group_47559] +[group_47560] +[group_47561] +[group_47562] +[group_47563] +[group_47564] +[group_47565] +[group_47566] +[group_47567] +[group_47568] +[group_47569] +[group_47570] +[group_47571] +[group_47572] +[group_47573] +[group_47574] +[group_47575] +[group_47576] +[group_47577] +[group_47578] +[group_47579] +[group_47580] +[group_47581] +[group_47582] +[group_47583] +[group_47584] +[group_47585] +[group_47586] +[group_47587] +[group_47588] +[group_47589] +[group_47590] +[group_47591] +[group_47592] +[group_47593] +[group_47594] +[group_47595] +[group_47596] +[group_47597] +[group_47598] +[group_47599] +[group_47600] +[group_47601] +[group_47602] +[group_47603] +[group_47604] +[group_47605] +[group_47606] +[group_47607] +[group_47608] +[group_47609] +[group_47610] +[group_47611] +[group_47612] +[group_47613] +[group_47614] +[group_47615] +[group_47616] +[group_47617] +[group_47618] +[group_47619] +[group_47620] +[group_47621] +[group_47622] +[group_47623] +[group_47624] +[group_47625] +[group_47626] +[group_47627] +[group_47628] +[group_47629] +[group_47630] +[group_47631] +[group_47632] +[group_47633] +[group_47634] +[group_47635] +[group_47636] +[group_47637] +[group_47638] +[group_47639] +[group_47640] +[group_47641] +[group_47642] +[group_47643] +[group_47644] +[group_47645] +[group_47646] +[group_47647] +[group_47648] +[group_47649] +[group_47650] +[group_47651] +[group_47652] +[group_47653] +[group_47654] +[group_47655] +[group_47656] +[group_47657] +[group_47658] +[group_47659] +[group_47660] +[group_47661] +[group_47662] +[group_47663] +[group_47664] +[group_47665] +[group_47666] +[group_47667] +[group_47668] +[group_47669] +[group_47670] +[group_47671] +[group_47672] +[group_47673] +[group_47674] +[group_47675] +[group_47676] +[group_47677] +[group_47678] +[group_47679] +[group_47680] +[group_47681] +[group_47682] +[group_47683] +[group_47684] +[group_47685] +[group_47686] +[group_47687] +[group_47688] +[group_47689] +[group_47690] +[group_47691] +[group_47692] +[group_47693] +[group_47694] +[group_47695] +[group_47696] +[group_47697] +[group_47698] +[group_47699] +[group_47700] +[group_47701] +[group_47702] +[group_47703] +[group_47704] +[group_47705] +[group_47706] +[group_47707] +[group_47708] +[group_47709] +[group_47710] +[group_47711] +[group_47712] +[group_47713] +[group_47714] +[group_47715] +[group_47716] +[group_47717] +[group_47718] +[group_47719] +[group_47720] +[group_47721] +[group_47722] +[group_47723] +[group_47724] +[group_47725] +[group_47726] +[group_47727] +[group_47728] +[group_47729] +[group_47730] +[group_47731] +[group_47732] +[group_47733] +[group_47734] +[group_47735] +[group_47736] +[group_47737] +[group_47738] +[group_47739] +[group_47740] +[group_47741] +[group_47742] +[group_47743] +[group_47744] +[group_47745] +[group_47746] +[group_47747] +[group_47748] +[group_47749] +[group_47750] +[group_47751] +[group_47752] +[group_47753] +[group_47754] +[group_47755] +[group_47756] +[group_47757] +[group_47758] +[group_47759] +[group_47760] +[group_47761] +[group_47762] +[group_47763] +[group_47764] +[group_47765] +[group_47766] +[group_47767] +[group_47768] +[group_47769] +[group_47770] +[group_47771] +[group_47772] +[group_47773] +[group_47774] +[group_47775] +[group_47776] +[group_47777] +[group_47778] +[group_47779] +[group_47780] +[group_47781] +[group_47782] +[group_47783] +[group_47784] +[group_47785] +[group_47786] +[group_47787] +[group_47788] +[group_47789] +[group_47790] +[group_47791] +[group_47792] +[group_47793] +[group_47794] +[group_47795] +[group_47796] +[group_47797] +[group_47798] +[group_47799] +[group_47800] +[group_47801] +[group_47802] +[group_47803] +[group_47804] +[group_47805] +[group_47806] +[group_47807] +[group_47808] +[group_47809] +[group_47810] +[group_47811] +[group_47812] +[group_47813] +[group_47814] +[group_47815] +[group_47816] +[group_47817] +[group_47818] +[group_47819] +[group_47820] +[group_47821] +[group_47822] +[group_47823] +[group_47824] +[group_47825] +[group_47826] +[group_47827] +[group_47828] +[group_47829] +[group_47830] +[group_47831] +[group_47832] +[group_47833] +[group_47834] +[group_47835] +[group_47836] +[group_47837] +[group_47838] +[group_47839] +[group_47840] +[group_47841] +[group_47842] +[group_47843] +[group_47844] +[group_47845] +[group_47846] +[group_47847] +[group_47848] +[group_47849] +[group_47850] +[group_47851] +[group_47852] +[group_47853] +[group_47854] +[group_47855] +[group_47856] +[group_47857] +[group_47858] +[group_47859] +[group_47860] +[group_47861] +[group_47862] +[group_47863] +[group_47864] +[group_47865] +[group_47866] +[group_47867] +[group_47868] +[group_47869] +[group_47870] +[group_47871] +[group_47872] +[group_47873] +[group_47874] +[group_47875] +[group_47876] +[group_47877] +[group_47878] +[group_47879] +[group_47880] +[group_47881] +[group_47882] +[group_47883] +[group_47884] +[group_47885] +[group_47886] +[group_47887] +[group_47888] +[group_47889] +[group_47890] +[group_47891] +[group_47892] +[group_47893] +[group_47894] +[group_47895] +[group_47896] +[group_47897] +[group_47898] +[group_47899] +[group_47900] +[group_47901] +[group_47902] +[group_47903] +[group_47904] +[group_47905] +[group_47906] +[group_47907] +[group_47908] +[group_47909] +[group_47910] +[group_47911] +[group_47912] +[group_47913] +[group_47914] +[group_47915] +[group_47916] +[group_47917] +[group_47918] +[group_47919] +[group_47920] +[group_47921] +[group_47922] +[group_47923] +[group_47924] +[group_47925] +[group_47926] +[group_47927] +[group_47928] +[group_47929] +[group_47930] +[group_47931] +[group_47932] +[group_47933] +[group_47934] +[group_47935] +[group_47936] +[group_47937] +[group_47938] +[group_47939] +[group_47940] +[group_47941] +[group_47942] +[group_47943] +[group_47944] +[group_47945] +[group_47946] +[group_47947] +[group_47948] +[group_47949] +[group_47950] +[group_47951] +[group_47952] +[group_47953] +[group_47954] +[group_47955] +[group_47956] +[group_47957] +[group_47958] +[group_47959] +[group_47960] +[group_47961] +[group_47962] +[group_47963] +[group_47964] +[group_47965] +[group_47966] +[group_47967] +[group_47968] +[group_47969] +[group_47970] +[group_47971] +[group_47972] +[group_47973] +[group_47974] +[group_47975] +[group_47976] +[group_47977] +[group_47978] +[group_47979] +[group_47980] +[group_47981] +[group_47982] +[group_47983] +[group_47984] +[group_47985] +[group_47986] +[group_47987] +[group_47988] +[group_47989] +[group_47990] +[group_47991] +[group_47992] +[group_47993] +[group_47994] +[group_47995] +[group_47996] +[group_47997] +[group_47998] +[group_47999] +[group_48000] +[group_48001] +[group_48002] +[group_48003] +[group_48004] +[group_48005] +[group_48006] +[group_48007] +[group_48008] +[group_48009] +[group_48010] +[group_48011] +[group_48012] +[group_48013] +[group_48014] +[group_48015] +[group_48016] +[group_48017] +[group_48018] +[group_48019] +[group_48020] +[group_48021] +[group_48022] +[group_48023] +[group_48024] +[group_48025] +[group_48026] +[group_48027] +[group_48028] +[group_48029] +[group_48030] +[group_48031] +[group_48032] +[group_48033] +[group_48034] +[group_48035] +[group_48036] +[group_48037] +[group_48038] +[group_48039] +[group_48040] +[group_48041] +[group_48042] +[group_48043] +[group_48044] +[group_48045] +[group_48046] +[group_48047] +[group_48048] +[group_48049] +[group_48050] +[group_48051] +[group_48052] +[group_48053] +[group_48054] +[group_48055] +[group_48056] +[group_48057] +[group_48058] +[group_48059] +[group_48060] +[group_48061] +[group_48062] +[group_48063] +[group_48064] +[group_48065] +[group_48066] +[group_48067] +[group_48068] +[group_48069] +[group_48070] +[group_48071] +[group_48072] +[group_48073] +[group_48074] +[group_48075] +[group_48076] +[group_48077] +[group_48078] +[group_48079] +[group_48080] +[group_48081] +[group_48082] +[group_48083] +[group_48084] +[group_48085] +[group_48086] +[group_48087] +[group_48088] +[group_48089] +[group_48090] +[group_48091] +[group_48092] +[group_48093] +[group_48094] +[group_48095] +[group_48096] +[group_48097] +[group_48098] +[group_48099] +[group_48100] +[group_48101] +[group_48102] +[group_48103] +[group_48104] +[group_48105] +[group_48106] +[group_48107] +[group_48108] +[group_48109] +[group_48110] +[group_48111] +[group_48112] +[group_48113] +[group_48114] +[group_48115] +[group_48116] +[group_48117] +[group_48118] +[group_48119] +[group_48120] +[group_48121] +[group_48122] +[group_48123] +[group_48124] +[group_48125] +[group_48126] +[group_48127] +[group_48128] +[group_48129] +[group_48130] +[group_48131] +[group_48132] +[group_48133] +[group_48134] +[group_48135] +[group_48136] +[group_48137] +[group_48138] +[group_48139] +[group_48140] +[group_48141] +[group_48142] +[group_48143] +[group_48144] +[group_48145] +[group_48146] +[group_48147] +[group_48148] +[group_48149] +[group_48150] +[group_48151] +[group_48152] +[group_48153] +[group_48154] +[group_48155] +[group_48156] +[group_48157] +[group_48158] +[group_48159] +[group_48160] +[group_48161] +[group_48162] +[group_48163] +[group_48164] +[group_48165] +[group_48166] +[group_48167] +[group_48168] +[group_48169] +[group_48170] +[group_48171] +[group_48172] +[group_48173] +[group_48174] +[group_48175] +[group_48176] +[group_48177] +[group_48178] +[group_48179] +[group_48180] +[group_48181] +[group_48182] +[group_48183] +[group_48184] +[group_48185] +[group_48186] +[group_48187] +[group_48188] +[group_48189] +[group_48190] +[group_48191] +[group_48192] +[group_48193] +[group_48194] +[group_48195] +[group_48196] +[group_48197] +[group_48198] +[group_48199] +[group_48200] +[group_48201] +[group_48202] +[group_48203] +[group_48204] +[group_48205] +[group_48206] +[group_48207] +[group_48208] +[group_48209] +[group_48210] +[group_48211] +[group_48212] +[group_48213] +[group_48214] +[group_48215] +[group_48216] +[group_48217] +[group_48218] +[group_48219] +[group_48220] +[group_48221] +[group_48222] +[group_48223] +[group_48224] +[group_48225] +[group_48226] +[group_48227] +[group_48228] +[group_48229] +[group_48230] +[group_48231] +[group_48232] +[group_48233] +[group_48234] +[group_48235] +[group_48236] +[group_48237] +[group_48238] +[group_48239] +[group_48240] +[group_48241] +[group_48242] +[group_48243] +[group_48244] +[group_48245] +[group_48246] +[group_48247] +[group_48248] +[group_48249] +[group_48250] +[group_48251] +[group_48252] +[group_48253] +[group_48254] +[group_48255] +[group_48256] +[group_48257] +[group_48258] +[group_48259] +[group_48260] +[group_48261] +[group_48262] +[group_48263] +[group_48264] +[group_48265] +[group_48266] +[group_48267] +[group_48268] +[group_48269] +[group_48270] +[group_48271] +[group_48272] +[group_48273] +[group_48274] +[group_48275] +[group_48276] +[group_48277] +[group_48278] +[group_48279] +[group_48280] +[group_48281] +[group_48282] +[group_48283] +[group_48284] +[group_48285] +[group_48286] +[group_48287] +[group_48288] +[group_48289] +[group_48290] +[group_48291] +[group_48292] +[group_48293] +[group_48294] +[group_48295] +[group_48296] +[group_48297] +[group_48298] +[group_48299] +[group_48300] +[group_48301] +[group_48302] +[group_48303] +[group_48304] +[group_48305] +[group_48306] +[group_48307] +[group_48308] +[group_48309] +[group_48310] +[group_48311] +[group_48312] +[group_48313] +[group_48314] +[group_48315] +[group_48316] +[group_48317] +[group_48318] +[group_48319] +[group_48320] +[group_48321] +[group_48322] +[group_48323] +[group_48324] +[group_48325] +[group_48326] +[group_48327] +[group_48328] +[group_48329] +[group_48330] +[group_48331] +[group_48332] +[group_48333] +[group_48334] +[group_48335] +[group_48336] +[group_48337] +[group_48338] +[group_48339] +[group_48340] +[group_48341] +[group_48342] +[group_48343] +[group_48344] +[group_48345] +[group_48346] +[group_48347] +[group_48348] +[group_48349] +[group_48350] +[group_48351] +[group_48352] +[group_48353] +[group_48354] +[group_48355] +[group_48356] +[group_48357] +[group_48358] +[group_48359] +[group_48360] +[group_48361] +[group_48362] +[group_48363] +[group_48364] +[group_48365] +[group_48366] +[group_48367] +[group_48368] +[group_48369] +[group_48370] +[group_48371] +[group_48372] +[group_48373] +[group_48374] +[group_48375] +[group_48376] +[group_48377] +[group_48378] +[group_48379] +[group_48380] +[group_48381] +[group_48382] +[group_48383] +[group_48384] +[group_48385] +[group_48386] +[group_48387] +[group_48388] +[group_48389] +[group_48390] +[group_48391] +[group_48392] +[group_48393] +[group_48394] +[group_48395] +[group_48396] +[group_48397] +[group_48398] +[group_48399] +[group_48400] +[group_48401] +[group_48402] +[group_48403] +[group_48404] +[group_48405] +[group_48406] +[group_48407] +[group_48408] +[group_48409] +[group_48410] +[group_48411] +[group_48412] +[group_48413] +[group_48414] +[group_48415] +[group_48416] +[group_48417] +[group_48418] +[group_48419] +[group_48420] +[group_48421] +[group_48422] +[group_48423] +[group_48424] +[group_48425] +[group_48426] +[group_48427] +[group_48428] +[group_48429] +[group_48430] +[group_48431] +[group_48432] +[group_48433] +[group_48434] +[group_48435] +[group_48436] +[group_48437] +[group_48438] +[group_48439] +[group_48440] +[group_48441] +[group_48442] +[group_48443] +[group_48444] +[group_48445] +[group_48446] +[group_48447] +[group_48448] +[group_48449] +[group_48450] +[group_48451] +[group_48452] +[group_48453] +[group_48454] +[group_48455] +[group_48456] +[group_48457] +[group_48458] +[group_48459] +[group_48460] +[group_48461] +[group_48462] +[group_48463] +[group_48464] +[group_48465] +[group_48466] +[group_48467] +[group_48468] +[group_48469] +[group_48470] +[group_48471] +[group_48472] +[group_48473] +[group_48474] +[group_48475] +[group_48476] +[group_48477] +[group_48478] +[group_48479] +[group_48480] +[group_48481] +[group_48482] +[group_48483] +[group_48484] +[group_48485] +[group_48486] +[group_48487] +[group_48488] +[group_48489] +[group_48490] +[group_48491] +[group_48492] +[group_48493] +[group_48494] +[group_48495] +[group_48496] +[group_48497] +[group_48498] +[group_48499] +[group_48500] +[group_48501] +[group_48502] +[group_48503] +[group_48504] +[group_48505] +[group_48506] +[group_48507] +[group_48508] +[group_48509] +[group_48510] +[group_48511] +[group_48512] +[group_48513] +[group_48514] +[group_48515] +[group_48516] +[group_48517] +[group_48518] +[group_48519] +[group_48520] +[group_48521] +[group_48522] +[group_48523] +[group_48524] +[group_48525] +[group_48526] +[group_48527] +[group_48528] +[group_48529] +[group_48530] +[group_48531] +[group_48532] +[group_48533] +[group_48534] +[group_48535] +[group_48536] +[group_48537] +[group_48538] +[group_48539] +[group_48540] +[group_48541] +[group_48542] +[group_48543] +[group_48544] +[group_48545] +[group_48546] +[group_48547] +[group_48548] +[group_48549] +[group_48550] +[group_48551] +[group_48552] +[group_48553] +[group_48554] +[group_48555] +[group_48556] +[group_48557] +[group_48558] +[group_48559] +[group_48560] +[group_48561] +[group_48562] +[group_48563] +[group_48564] +[group_48565] +[group_48566] +[group_48567] +[group_48568] +[group_48569] +[group_48570] +[group_48571] +[group_48572] +[group_48573] +[group_48574] +[group_48575] +[group_48576] +[group_48577] +[group_48578] +[group_48579] +[group_48580] +[group_48581] +[group_48582] +[group_48583] +[group_48584] +[group_48585] +[group_48586] +[group_48587] +[group_48588] +[group_48589] +[group_48590] +[group_48591] +[group_48592] +[group_48593] +[group_48594] +[group_48595] +[group_48596] +[group_48597] +[group_48598] +[group_48599] +[group_48600] +[group_48601] +[group_48602] +[group_48603] +[group_48604] +[group_48605] +[group_48606] +[group_48607] +[group_48608] +[group_48609] +[group_48610] +[group_48611] +[group_48612] +[group_48613] +[group_48614] +[group_48615] +[group_48616] +[group_48617] +[group_48618] +[group_48619] +[group_48620] +[group_48621] +[group_48622] +[group_48623] +[group_48624] +[group_48625] +[group_48626] +[group_48627] +[group_48628] +[group_48629] +[group_48630] +[group_48631] +[group_48632] +[group_48633] +[group_48634] +[group_48635] +[group_48636] +[group_48637] +[group_48638] +[group_48639] +[group_48640] +[group_48641] +[group_48642] +[group_48643] +[group_48644] +[group_48645] +[group_48646] +[group_48647] +[group_48648] +[group_48649] +[group_48650] +[group_48651] +[group_48652] +[group_48653] +[group_48654] +[group_48655] +[group_48656] +[group_48657] +[group_48658] +[group_48659] +[group_48660] +[group_48661] +[group_48662] +[group_48663] +[group_48664] +[group_48665] +[group_48666] +[group_48667] +[group_48668] +[group_48669] +[group_48670] +[group_48671] +[group_48672] +[group_48673] +[group_48674] +[group_48675] +[group_48676] +[group_48677] +[group_48678] +[group_48679] +[group_48680] +[group_48681] +[group_48682] +[group_48683] +[group_48684] +[group_48685] +[group_48686] +[group_48687] +[group_48688] +[group_48689] +[group_48690] +[group_48691] +[group_48692] +[group_48693] +[group_48694] +[group_48695] +[group_48696] +[group_48697] +[group_48698] +[group_48699] +[group_48700] +[group_48701] +[group_48702] +[group_48703] +[group_48704] +[group_48705] +[group_48706] +[group_48707] +[group_48708] +[group_48709] +[group_48710] +[group_48711] +[group_48712] +[group_48713] +[group_48714] +[group_48715] +[group_48716] +[group_48717] +[group_48718] +[group_48719] +[group_48720] +[group_48721] +[group_48722] +[group_48723] +[group_48724] +[group_48725] +[group_48726] +[group_48727] +[group_48728] +[group_48729] +[group_48730] +[group_48731] +[group_48732] +[group_48733] +[group_48734] +[group_48735] +[group_48736] +[group_48737] +[group_48738] +[group_48739] +[group_48740] +[group_48741] +[group_48742] +[group_48743] +[group_48744] +[group_48745] +[group_48746] +[group_48747] +[group_48748] +[group_48749] +[group_48750] +[group_48751] +[group_48752] +[group_48753] +[group_48754] +[group_48755] +[group_48756] +[group_48757] +[group_48758] +[group_48759] +[group_48760] +[group_48761] +[group_48762] +[group_48763] +[group_48764] +[group_48765] +[group_48766] +[group_48767] +[group_48768] +[group_48769] +[group_48770] +[group_48771] +[group_48772] +[group_48773] +[group_48774] +[group_48775] +[group_48776] +[group_48777] +[group_48778] +[group_48779] +[group_48780] +[group_48781] +[group_48782] +[group_48783] +[group_48784] +[group_48785] +[group_48786] +[group_48787] +[group_48788] +[group_48789] +[group_48790] +[group_48791] +[group_48792] +[group_48793] +[group_48794] +[group_48795] +[group_48796] +[group_48797] +[group_48798] +[group_48799] +[group_48800] +[group_48801] +[group_48802] +[group_48803] +[group_48804] +[group_48805] +[group_48806] +[group_48807] +[group_48808] +[group_48809] +[group_48810] +[group_48811] +[group_48812] +[group_48813] +[group_48814] +[group_48815] +[group_48816] +[group_48817] +[group_48818] +[group_48819] +[group_48820] +[group_48821] +[group_48822] +[group_48823] +[group_48824] +[group_48825] +[group_48826] +[group_48827] +[group_48828] +[group_48829] +[group_48830] +[group_48831] +[group_48832] +[group_48833] +[group_48834] +[group_48835] +[group_48836] +[group_48837] +[group_48838] +[group_48839] +[group_48840] +[group_48841] +[group_48842] +[group_48843] +[group_48844] +[group_48845] +[group_48846] +[group_48847] +[group_48848] +[group_48849] +[group_48850] +[group_48851] +[group_48852] +[group_48853] +[group_48854] +[group_48855] +[group_48856] +[group_48857] +[group_48858] +[group_48859] +[group_48860] +[group_48861] +[group_48862] +[group_48863] +[group_48864] +[group_48865] +[group_48866] +[group_48867] +[group_48868] +[group_48869] +[group_48870] +[group_48871] +[group_48872] +[group_48873] +[group_48874] +[group_48875] +[group_48876] +[group_48877] +[group_48878] +[group_48879] +[group_48880] +[group_48881] +[group_48882] +[group_48883] +[group_48884] +[group_48885] +[group_48886] +[group_48887] +[group_48888] +[group_48889] +[group_48890] +[group_48891] +[group_48892] +[group_48893] +[group_48894] +[group_48895] +[group_48896] +[group_48897] +[group_48898] +[group_48899] +[group_48900] +[group_48901] +[group_48902] +[group_48903] +[group_48904] +[group_48905] +[group_48906] +[group_48907] +[group_48908] +[group_48909] +[group_48910] +[group_48911] +[group_48912] +[group_48913] +[group_48914] +[group_48915] +[group_48916] +[group_48917] +[group_48918] +[group_48919] +[group_48920] +[group_48921] +[group_48922] +[group_48923] +[group_48924] +[group_48925] +[group_48926] +[group_48927] +[group_48928] +[group_48929] +[group_48930] +[group_48931] +[group_48932] +[group_48933] +[group_48934] +[group_48935] +[group_48936] +[group_48937] +[group_48938] +[group_48939] +[group_48940] +[group_48941] +[group_48942] +[group_48943] +[group_48944] +[group_48945] +[group_48946] +[group_48947] +[group_48948] +[group_48949] +[group_48950] +[group_48951] +[group_48952] +[group_48953] +[group_48954] +[group_48955] +[group_48956] +[group_48957] +[group_48958] +[group_48959] +[group_48960] +[group_48961] +[group_48962] +[group_48963] +[group_48964] +[group_48965] +[group_48966] +[group_48967] +[group_48968] +[group_48969] +[group_48970] +[group_48971] +[group_48972] +[group_48973] +[group_48974] +[group_48975] +[group_48976] +[group_48977] +[group_48978] +[group_48979] +[group_48980] +[group_48981] +[group_48982] +[group_48983] +[group_48984] +[group_48985] +[group_48986] +[group_48987] +[group_48988] +[group_48989] +[group_48990] +[group_48991] +[group_48992] +[group_48993] +[group_48994] +[group_48995] +[group_48996] +[group_48997] +[group_48998] +[group_48999] +[group_49000] +[group_49001] +[group_49002] +[group_49003] +[group_49004] +[group_49005] +[group_49006] +[group_49007] +[group_49008] +[group_49009] +[group_49010] +[group_49011] +[group_49012] +[group_49013] +[group_49014] +[group_49015] +[group_49016] +[group_49017] +[group_49018] +[group_49019] +[group_49020] +[group_49021] +[group_49022] +[group_49023] +[group_49024] +[group_49025] +[group_49026] +[group_49027] +[group_49028] +[group_49029] +[group_49030] +[group_49031] +[group_49032] +[group_49033] +[group_49034] +[group_49035] +[group_49036] +[group_49037] +[group_49038] +[group_49039] +[group_49040] +[group_49041] +[group_49042] +[group_49043] +[group_49044] +[group_49045] +[group_49046] +[group_49047] +[group_49048] +[group_49049] +[group_49050] +[group_49051] +[group_49052] +[group_49053] +[group_49054] +[group_49055] +[group_49056] +[group_49057] +[group_49058] +[group_49059] +[group_49060] +[group_49061] +[group_49062] +[group_49063] +[group_49064] +[group_49065] +[group_49066] +[group_49067] +[group_49068] +[group_49069] +[group_49070] +[group_49071] +[group_49072] +[group_49073] +[group_49074] +[group_49075] +[group_49076] +[group_49077] +[group_49078] +[group_49079] +[group_49080] +[group_49081] +[group_49082] +[group_49083] +[group_49084] +[group_49085] +[group_49086] +[group_49087] +[group_49088] +[group_49089] +[group_49090] +[group_49091] +[group_49092] +[group_49093] +[group_49094] +[group_49095] +[group_49096] +[group_49097] +[group_49098] +[group_49099] +[group_49100] +[group_49101] +[group_49102] +[group_49103] +[group_49104] +[group_49105] +[group_49106] +[group_49107] +[group_49108] +[group_49109] +[group_49110] +[group_49111] +[group_49112] +[group_49113] +[group_49114] +[group_49115] +[group_49116] +[group_49117] +[group_49118] +[group_49119] +[group_49120] +[group_49121] +[group_49122] +[group_49123] +[group_49124] +[group_49125] +[group_49126] +[group_49127] +[group_49128] +[group_49129] +[group_49130] +[group_49131] +[group_49132] +[group_49133] +[group_49134] +[group_49135] +[group_49136] +[group_49137] +[group_49138] +[group_49139] +[group_49140] +[group_49141] +[group_49142] +[group_49143] +[group_49144] +[group_49145] +[group_49146] +[group_49147] +[group_49148] +[group_49149] +[group_49150] +[group_49151] +[group_49152] +[group_49153] +[group_49154] +[group_49155] +[group_49156] +[group_49157] +[group_49158] +[group_49159] +[group_49160] +[group_49161] +[group_49162] +[group_49163] +[group_49164] +[group_49165] +[group_49166] +[group_49167] +[group_49168] +[group_49169] +[group_49170] +[group_49171] +[group_49172] +[group_49173] +[group_49174] +[group_49175] +[group_49176] +[group_49177] +[group_49178] +[group_49179] +[group_49180] +[group_49181] +[group_49182] +[group_49183] +[group_49184] +[group_49185] +[group_49186] +[group_49187] +[group_49188] +[group_49189] +[group_49190] +[group_49191] +[group_49192] +[group_49193] +[group_49194] +[group_49195] +[group_49196] +[group_49197] +[group_49198] +[group_49199] +[group_49200] +[group_49201] +[group_49202] +[group_49203] +[group_49204] +[group_49205] +[group_49206] +[group_49207] +[group_49208] +[group_49209] +[group_49210] +[group_49211] +[group_49212] +[group_49213] +[group_49214] +[group_49215] +[group_49216] +[group_49217] +[group_49218] +[group_49219] +[group_49220] +[group_49221] +[group_49222] +[group_49223] +[group_49224] +[group_49225] +[group_49226] +[group_49227] +[group_49228] +[group_49229] +[group_49230] +[group_49231] +[group_49232] +[group_49233] +[group_49234] +[group_49235] +[group_49236] +[group_49237] +[group_49238] +[group_49239] +[group_49240] +[group_49241] +[group_49242] +[group_49243] +[group_49244] +[group_49245] +[group_49246] +[group_49247] +[group_49248] +[group_49249] +[group_49250] +[group_49251] +[group_49252] +[group_49253] +[group_49254] +[group_49255] +[group_49256] +[group_49257] +[group_49258] +[group_49259] +[group_49260] +[group_49261] +[group_49262] +[group_49263] +[group_49264] +[group_49265] +[group_49266] +[group_49267] +[group_49268] +[group_49269] +[group_49270] +[group_49271] +[group_49272] +[group_49273] +[group_49274] +[group_49275] +[group_49276] +[group_49277] +[group_49278] +[group_49279] +[group_49280] +[group_49281] +[group_49282] +[group_49283] +[group_49284] +[group_49285] +[group_49286] +[group_49287] +[group_49288] +[group_49289] +[group_49290] +[group_49291] +[group_49292] +[group_49293] +[group_49294] +[group_49295] +[group_49296] +[group_49297] +[group_49298] +[group_49299] +[group_49300] +[group_49301] +[group_49302] +[group_49303] +[group_49304] +[group_49305] +[group_49306] +[group_49307] +[group_49308] +[group_49309] +[group_49310] +[group_49311] +[group_49312] +[group_49313] +[group_49314] +[group_49315] +[group_49316] +[group_49317] +[group_49318] +[group_49319] +[group_49320] +[group_49321] +[group_49322] +[group_49323] +[group_49324] +[group_49325] +[group_49326] +[group_49327] +[group_49328] +[group_49329] +[group_49330] +[group_49331] +[group_49332] +[group_49333] +[group_49334] +[group_49335] +[group_49336] +[group_49337] +[group_49338] +[group_49339] +[group_49340] +[group_49341] +[group_49342] +[group_49343] +[group_49344] +[group_49345] +[group_49346] +[group_49347] +[group_49348] +[group_49349] +[group_49350] +[group_49351] +[group_49352] +[group_49353] +[group_49354] +[group_49355] +[group_49356] +[group_49357] +[group_49358] +[group_49359] +[group_49360] +[group_49361] +[group_49362] +[group_49363] +[group_49364] +[group_49365] +[group_49366] +[group_49367] +[group_49368] +[group_49369] +[group_49370] +[group_49371] +[group_49372] +[group_49373] +[group_49374] +[group_49375] +[group_49376] +[group_49377] +[group_49378] +[group_49379] +[group_49380] +[group_49381] +[group_49382] +[group_49383] +[group_49384] +[group_49385] +[group_49386] +[group_49387] +[group_49388] +[group_49389] +[group_49390] +[group_49391] +[group_49392] +[group_49393] +[group_49394] +[group_49395] +[group_49396] +[group_49397] +[group_49398] +[group_49399] +[group_49400] +[group_49401] +[group_49402] +[group_49403] +[group_49404] +[group_49405] +[group_49406] +[group_49407] +[group_49408] +[group_49409] +[group_49410] +[group_49411] +[group_49412] +[group_49413] +[group_49414] +[group_49415] +[group_49416] +[group_49417] +[group_49418] +[group_49419] +[group_49420] +[group_49421] +[group_49422] +[group_49423] +[group_49424] +[group_49425] +[group_49426] +[group_49427] +[group_49428] +[group_49429] +[group_49430] +[group_49431] +[group_49432] +[group_49433] +[group_49434] +[group_49435] +[group_49436] +[group_49437] +[group_49438] +[group_49439] +[group_49440] +[group_49441] +[group_49442] +[group_49443] +[group_49444] +[group_49445] +[group_49446] +[group_49447] +[group_49448] +[group_49449] +[group_49450] +[group_49451] +[group_49452] +[group_49453] +[group_49454] +[group_49455] +[group_49456] +[group_49457] +[group_49458] +[group_49459] +[group_49460] +[group_49461] +[group_49462] +[group_49463] +[group_49464] +[group_49465] +[group_49466] +[group_49467] +[group_49468] +[group_49469] +[group_49470] +[group_49471] +[group_49472] +[group_49473] +[group_49474] +[group_49475] +[group_49476] +[group_49477] +[group_49478] +[group_49479] +[group_49480] +[group_49481] +[group_49482] +[group_49483] +[group_49484] +[group_49485] +[group_49486] +[group_49487] +[group_49488] +[group_49489] +[group_49490] +[group_49491] +[group_49492] +[group_49493] +[group_49494] +[group_49495] +[group_49496] +[group_49497] +[group_49498] +[group_49499] +[group_49500] +[group_49501] +[group_49502] +[group_49503] +[group_49504] +[group_49505] +[group_49506] +[group_49507] +[group_49508] +[group_49509] +[group_49510] +[group_49511] +[group_49512] +[group_49513] +[group_49514] +[group_49515] +[group_49516] +[group_49517] +[group_49518] +[group_49519] +[group_49520] +[group_49521] +[group_49522] +[group_49523] +[group_49524] +[group_49525] +[group_49526] +[group_49527] +[group_49528] +[group_49529] +[group_49530] +[group_49531] +[group_49532] +[group_49533] +[group_49534] +[group_49535] +[group_49536] +[group_49537] +[group_49538] +[group_49539] +[group_49540] +[group_49541] +[group_49542] +[group_49543] +[group_49544] +[group_49545] +[group_49546] +[group_49547] +[group_49548] +[group_49549] +[group_49550] +[group_49551] +[group_49552] +[group_49553] +[group_49554] +[group_49555] +[group_49556] +[group_49557] +[group_49558] +[group_49559] +[group_49560] +[group_49561] +[group_49562] +[group_49563] +[group_49564] +[group_49565] +[group_49566] +[group_49567] +[group_49568] +[group_49569] +[group_49570] +[group_49571] +[group_49572] +[group_49573] +[group_49574] +[group_49575] +[group_49576] +[group_49577] +[group_49578] +[group_49579] +[group_49580] +[group_49581] +[group_49582] +[group_49583] +[group_49584] +[group_49585] +[group_49586] +[group_49587] +[group_49588] +[group_49589] +[group_49590] +[group_49591] +[group_49592] +[group_49593] +[group_49594] +[group_49595] +[group_49596] +[group_49597] +[group_49598] +[group_49599] +[group_49600] +[group_49601] +[group_49602] +[group_49603] +[group_49604] +[group_49605] +[group_49606] +[group_49607] +[group_49608] +[group_49609] +[group_49610] +[group_49611] +[group_49612] +[group_49613] +[group_49614] +[group_49615] +[group_49616] +[group_49617] +[group_49618] +[group_49619] +[group_49620] +[group_49621] +[group_49622] +[group_49623] +[group_49624] +[group_49625] +[group_49626] +[group_49627] +[group_49628] +[group_49629] +[group_49630] +[group_49631] +[group_49632] +[group_49633] +[group_49634] +[group_49635] +[group_49636] +[group_49637] +[group_49638] +[group_49639] +[group_49640] +[group_49641] +[group_49642] +[group_49643] +[group_49644] +[group_49645] +[group_49646] +[group_49647] +[group_49648] +[group_49649] +[group_49650] +[group_49651] +[group_49652] +[group_49653] +[group_49654] +[group_49655] +[group_49656] +[group_49657] +[group_49658] +[group_49659] +[group_49660] +[group_49661] +[group_49662] +[group_49663] +[group_49664] +[group_49665] +[group_49666] +[group_49667] +[group_49668] +[group_49669] +[group_49670] +[group_49671] +[group_49672] +[group_49673] +[group_49674] +[group_49675] +[group_49676] +[group_49677] +[group_49678] +[group_49679] +[group_49680] +[group_49681] +[group_49682] +[group_49683] +[group_49684] +[group_49685] +[group_49686] +[group_49687] +[group_49688] +[group_49689] +[group_49690] +[group_49691] +[group_49692] +[group_49693] +[group_49694] +[group_49695] +[group_49696] +[group_49697] +[group_49698] +[group_49699] +[group_49700] +[group_49701] +[group_49702] +[group_49703] +[group_49704] +[group_49705] +[group_49706] +[group_49707] +[group_49708] +[group_49709] +[group_49710] +[group_49711] +[group_49712] +[group_49713] +[group_49714] +[group_49715] +[group_49716] +[group_49717] +[group_49718] +[group_49719] +[group_49720] +[group_49721] +[group_49722] +[group_49723] +[group_49724] +[group_49725] +[group_49726] +[group_49727] +[group_49728] +[group_49729] +[group_49730] +[group_49731] +[group_49732] +[group_49733] +[group_49734] +[group_49735] +[group_49736] +[group_49737] +[group_49738] +[group_49739] +[group_49740] +[group_49741] +[group_49742] +[group_49743] +[group_49744] +[group_49745] +[group_49746] +[group_49747] +[group_49748] +[group_49749] +[group_49750] +[group_49751] +[group_49752] +[group_49753] +[group_49754] +[group_49755] +[group_49756] +[group_49757] +[group_49758] +[group_49759] +[group_49760] +[group_49761] +[group_49762] +[group_49763] +[group_49764] +[group_49765] +[group_49766] +[group_49767] +[group_49768] +[group_49769] +[group_49770] +[group_49771] +[group_49772] +[group_49773] +[group_49774] +[group_49775] +[group_49776] +[group_49777] +[group_49778] +[group_49779] +[group_49780] +[group_49781] +[group_49782] +[group_49783] +[group_49784] +[group_49785] +[group_49786] +[group_49787] +[group_49788] +[group_49789] +[group_49790] +[group_49791] +[group_49792] +[group_49793] +[group_49794] +[group_49795] +[group_49796] +[group_49797] +[group_49798] +[group_49799] +[group_49800] +[group_49801] +[group_49802] +[group_49803] +[group_49804] +[group_49805] +[group_49806] +[group_49807] +[group_49808] +[group_49809] +[group_49810] +[group_49811] +[group_49812] +[group_49813] +[group_49814] +[group_49815] +[group_49816] +[group_49817] +[group_49818] +[group_49819] +[group_49820] +[group_49821] +[group_49822] +[group_49823] +[group_49824] +[group_49825] +[group_49826] +[group_49827] +[group_49828] +[group_49829] +[group_49830] +[group_49831] +[group_49832] +[group_49833] +[group_49834] +[group_49835] +[group_49836] +[group_49837] +[group_49838] +[group_49839] +[group_49840] +[group_49841] +[group_49842] +[group_49843] +[group_49844] +[group_49845] +[group_49846] +[group_49847] +[group_49848] +[group_49849] +[group_49850] +[group_49851] +[group_49852] +[group_49853] +[group_49854] +[group_49855] +[group_49856] +[group_49857] +[group_49858] +[group_49859] +[group_49860] +[group_49861] +[group_49862] +[group_49863] +[group_49864] +[group_49865] +[group_49866] +[group_49867] +[group_49868] +[group_49869] +[group_49870] +[group_49871] +[group_49872] +[group_49873] +[group_49874] +[group_49875] +[group_49876] +[group_49877] +[group_49878] +[group_49879] +[group_49880] +[group_49881] +[group_49882] +[group_49883] +[group_49884] +[group_49885] +[group_49886] +[group_49887] +[group_49888] +[group_49889] +[group_49890] +[group_49891] +[group_49892] +[group_49893] +[group_49894] +[group_49895] +[group_49896] +[group_49897] +[group_49898] +[group_49899] +[group_49900] +[group_49901] +[group_49902] +[group_49903] +[group_49904] +[group_49905] +[group_49906] +[group_49907] +[group_49908] +[group_49909] +[group_49910] +[group_49911] +[group_49912] +[group_49913] +[group_49914] +[group_49915] +[group_49916] +[group_49917] +[group_49918] +[group_49919] +[group_49920] +[group_49921] +[group_49922] +[group_49923] +[group_49924] +[group_49925] +[group_49926] +[group_49927] +[group_49928] +[group_49929] +[group_49930] +[group_49931] +[group_49932] +[group_49933] +[group_49934] +[group_49935] +[group_49936] +[group_49937] +[group_49938] +[group_49939] +[group_49940] +[group_49941] +[group_49942] +[group_49943] +[group_49944] +[group_49945] +[group_49946] +[group_49947] +[group_49948] +[group_49949] +[group_49950] +[group_49951] +[group_49952] +[group_49953] +[group_49954] +[group_49955] +[group_49956] +[group_49957] +[group_49958] +[group_49959] +[group_49960] +[group_49961] +[group_49962] +[group_49963] +[group_49964] +[group_49965] +[group_49966] +[group_49967] +[group_49968] +[group_49969] +[group_49970] +[group_49971] +[group_49972] +[group_49973] +[group_49974] +[group_49975] +[group_49976] +[group_49977] +[group_49978] +[group_49979] +[group_49980] +[group_49981] +[group_49982] +[group_49983] +[group_49984] +[group_49985] +[group_49986] +[group_49987] +[group_49988] +[group_49989] +[group_49990] +[group_49991] +[group_49992] +[group_49993] +[group_49994] +[group_49995] +[group_49996] +[group_49997] +[group_49998] +[group_49999] +[group_50000] +[group_50001] +[group_50002] +[group_50003] +[group_50004] +[group_50005] +[group_50006] +[group_50007] +[group_50008] +[group_50009] +[group_50010] +[group_50011] +[group_50012] +[group_50013] +[group_50014] +[group_50015] +[group_50016] +[group_50017] +[group_50018] +[group_50019] +[group_50020] +[group_50021] +[group_50022] +[group_50023] +[group_50024] +[group_50025] +[group_50026] +[group_50027] +[group_50028] +[group_50029] +[group_50030] +[group_50031] +[group_50032] +[group_50033] +[group_50034] +[group_50035] +[group_50036] +[group_50037] +[group_50038] +[group_50039] +[group_50040] +[group_50041] +[group_50042] +[group_50043] +[group_50044] +[group_50045] +[group_50046] +[group_50047] +[group_50048] +[group_50049] +[group_50050] +[group_50051] +[group_50052] +[group_50053] +[group_50054] +[group_50055] +[group_50056] +[group_50057] +[group_50058] +[group_50059] +[group_50060] +[group_50061] +[group_50062] +[group_50063] +[group_50064] +[group_50065] +[group_50066] +[group_50067] +[group_50068] +[group_50069] +[group_50070] +[group_50071] +[group_50072] +[group_50073] +[group_50074] +[group_50075] +[group_50076] +[group_50077] +[group_50078] +[group_50079] +[group_50080] +[group_50081] +[group_50082] +[group_50083] +[group_50084] +[group_50085] +[group_50086] +[group_50087] +[group_50088] +[group_50089] +[group_50090] +[group_50091] +[group_50092] +[group_50093] +[group_50094] +[group_50095] +[group_50096] +[group_50097] +[group_50098] +[group_50099] +[group_50100] +[group_50101] +[group_50102] +[group_50103] +[group_50104] +[group_50105] +[group_50106] +[group_50107] +[group_50108] +[group_50109] +[group_50110] +[group_50111] +[group_50112] +[group_50113] +[group_50114] +[group_50115] +[group_50116] +[group_50117] +[group_50118] +[group_50119] +[group_50120] +[group_50121] +[group_50122] +[group_50123] +[group_50124] +[group_50125] +[group_50126] +[group_50127] +[group_50128] +[group_50129] +[group_50130] +[group_50131] +[group_50132] +[group_50133] +[group_50134] +[group_50135] +[group_50136] +[group_50137] +[group_50138] +[group_50139] +[group_50140] +[group_50141] +[group_50142] +[group_50143] +[group_50144] +[group_50145] +[group_50146] +[group_50147] +[group_50148] +[group_50149] +[group_50150] +[group_50151] +[group_50152] +[group_50153] +[group_50154] +[group_50155] +[group_50156] +[group_50157] +[group_50158] +[group_50159] +[group_50160] +[group_50161] +[group_50162] +[group_50163] +[group_50164] +[group_50165] +[group_50166] +[group_50167] +[group_50168] +[group_50169] +[group_50170] +[group_50171] +[group_50172] +[group_50173] +[group_50174] +[group_50175] +[group_50176] +[group_50177] +[group_50178] +[group_50179] +[group_50180] +[group_50181] +[group_50182] +[group_50183] +[group_50184] +[group_50185] +[group_50186] +[group_50187] +[group_50188] +[group_50189] +[group_50190] +[group_50191] +[group_50192] +[group_50193] +[group_50194] +[group_50195] +[group_50196] +[group_50197] +[group_50198] +[group_50199] +[group_50200] +[group_50201] +[group_50202] +[group_50203] +[group_50204] +[group_50205] +[group_50206] +[group_50207] +[group_50208] +[group_50209] +[group_50210] +[group_50211] +[group_50212] +[group_50213] +[group_50214] +[group_50215] +[group_50216] +[group_50217] +[group_50218] +[group_50219] +[group_50220] +[group_50221] +[group_50222] +[group_50223] +[group_50224] +[group_50225] +[group_50226] +[group_50227] +[group_50228] +[group_50229] +[group_50230] +[group_50231] +[group_50232] +[group_50233] +[group_50234] +[group_50235] +[group_50236] +[group_50237] +[group_50238] +[group_50239] +[group_50240] +[group_50241] +[group_50242] +[group_50243] +[group_50244] +[group_50245] +[group_50246] +[group_50247] +[group_50248] +[group_50249] +[group_50250] +[group_50251] +[group_50252] +[group_50253] +[group_50254] +[group_50255] +[group_50256] +[group_50257] +[group_50258] +[group_50259] +[group_50260] +[group_50261] +[group_50262] +[group_50263] +[group_50264] +[group_50265] +[group_50266] +[group_50267] +[group_50268] +[group_50269] +[group_50270] +[group_50271] +[group_50272] +[group_50273] +[group_50274] +[group_50275] +[group_50276] +[group_50277] +[group_50278] +[group_50279] +[group_50280] +[group_50281] +[group_50282] +[group_50283] +[group_50284] +[group_50285] +[group_50286] +[group_50287] +[group_50288] +[group_50289] +[group_50290] +[group_50291] +[group_50292] +[group_50293] +[group_50294] +[group_50295] +[group_50296] +[group_50297] +[group_50298] +[group_50299] +[group_50300] +[group_50301] +[group_50302] +[group_50303] +[group_50304] +[group_50305] +[group_50306] +[group_50307] +[group_50308] +[group_50309] +[group_50310] +[group_50311] +[group_50312] +[group_50313] +[group_50314] +[group_50315] +[group_50316] +[group_50317] +[group_50318] +[group_50319] +[group_50320] +[group_50321] +[group_50322] +[group_50323] +[group_50324] +[group_50325] +[group_50326] +[group_50327] +[group_50328] +[group_50329] +[group_50330] +[group_50331] +[group_50332] +[group_50333] +[group_50334] +[group_50335] +[group_50336] +[group_50337] +[group_50338] +[group_50339] +[group_50340] +[group_50341] +[group_50342] +[group_50343] +[group_50344] +[group_50345] +[group_50346] +[group_50347] +[group_50348] +[group_50349] +[group_50350] +[group_50351] +[group_50352] +[group_50353] +[group_50354] +[group_50355] +[group_50356] +[group_50357] +[group_50358] +[group_50359] +[group_50360] +[group_50361] +[group_50362] +[group_50363] +[group_50364] +[group_50365] +[group_50366] +[group_50367] +[group_50368] +[group_50369] +[group_50370] +[group_50371] +[group_50372] +[group_50373] +[group_50374] +[group_50375] +[group_50376] +[group_50377] +[group_50378] +[group_50379] +[group_50380] +[group_50381] +[group_50382] +[group_50383] +[group_50384] +[group_50385] +[group_50386] +[group_50387] +[group_50388] +[group_50389] +[group_50390] +[group_50391] +[group_50392] +[group_50393] +[group_50394] +[group_50395] +[group_50396] +[group_50397] +[group_50398] +[group_50399] +[group_50400] +[group_50401] +[group_50402] +[group_50403] +[group_50404] +[group_50405] +[group_50406] +[group_50407] +[group_50408] +[group_50409] +[group_50410] +[group_50411] +[group_50412] +[group_50413] +[group_50414] +[group_50415] +[group_50416] +[group_50417] +[group_50418] +[group_50419] +[group_50420] +[group_50421] +[group_50422] +[group_50423] +[group_50424] +[group_50425] +[group_50426] +[group_50427] +[group_50428] +[group_50429] +[group_50430] +[group_50431] +[group_50432] +[group_50433] +[group_50434] +[group_50435] +[group_50436] +[group_50437] +[group_50438] +[group_50439] +[group_50440] +[group_50441] +[group_50442] +[group_50443] +[group_50444] +[group_50445] +[group_50446] +[group_50447] +[group_50448] +[group_50449] +[group_50450] +[group_50451] +[group_50452] +[group_50453] +[group_50454] +[group_50455] +[group_50456] +[group_50457] +[group_50458] +[group_50459] +[group_50460] +[group_50461] +[group_50462] +[group_50463] +[group_50464] +[group_50465] +[group_50466] +[group_50467] +[group_50468] +[group_50469] +[group_50470] +[group_50471] +[group_50472] +[group_50473] +[group_50474] +[group_50475] +[group_50476] +[group_50477] +[group_50478] +[group_50479] +[group_50480] +[group_50481] +[group_50482] +[group_50483] +[group_50484] +[group_50485] +[group_50486] +[group_50487] +[group_50488] +[group_50489] +[group_50490] +[group_50491] +[group_50492] +[group_50493] +[group_50494] +[group_50495] +[group_50496] +[group_50497] +[group_50498] +[group_50499] +[group_50500] +[group_50501] +[group_50502] +[group_50503] +[group_50504] +[group_50505] +[group_50506] +[group_50507] +[group_50508] +[group_50509] +[group_50510] +[group_50511] +[group_50512] +[group_50513] +[group_50514] +[group_50515] +[group_50516] +[group_50517] +[group_50518] +[group_50519] +[group_50520] +[group_50521] +[group_50522] +[group_50523] +[group_50524] +[group_50525] +[group_50526] +[group_50527] +[group_50528] +[group_50529] +[group_50530] +[group_50531] +[group_50532] +[group_50533] +[group_50534] +[group_50535] +[group_50536] +[group_50537] +[group_50538] +[group_50539] +[group_50540] +[group_50541] +[group_50542] +[group_50543] +[group_50544] +[group_50545] +[group_50546] +[group_50547] +[group_50548] +[group_50549] +[group_50550] +[group_50551] +[group_50552] +[group_50553] +[group_50554] +[group_50555] +[group_50556] +[group_50557] +[group_50558] +[group_50559] +[group_50560] +[group_50561] +[group_50562] +[group_50563] +[group_50564] +[group_50565] +[group_50566] +[group_50567] +[group_50568] +[group_50569] +[group_50570] +[group_50571] +[group_50572] +[group_50573] +[group_50574] +[group_50575] +[group_50576] +[group_50577] +[group_50578] +[group_50579] +[group_50580] +[group_50581] +[group_50582] +[group_50583] +[group_50584] +[group_50585] +[group_50586] +[group_50587] +[group_50588] +[group_50589] +[group_50590] +[group_50591] +[group_50592] +[group_50593] +[group_50594] +[group_50595] +[group_50596] +[group_50597] +[group_50598] +[group_50599] +[group_50600] +[group_50601] +[group_50602] +[group_50603] +[group_50604] +[group_50605] +[group_50606] +[group_50607] +[group_50608] +[group_50609] +[group_50610] +[group_50611] +[group_50612] +[group_50613] +[group_50614] +[group_50615] +[group_50616] +[group_50617] +[group_50618] +[group_50619] +[group_50620] +[group_50621] +[group_50622] +[group_50623] +[group_50624] +[group_50625] +[group_50626] +[group_50627] +[group_50628] +[group_50629] +[group_50630] +[group_50631] +[group_50632] +[group_50633] +[group_50634] +[group_50635] +[group_50636] +[group_50637] +[group_50638] +[group_50639] +[group_50640] +[group_50641] +[group_50642] +[group_50643] +[group_50644] +[group_50645] +[group_50646] +[group_50647] +[group_50648] +[group_50649] +[group_50650] +[group_50651] +[group_50652] +[group_50653] +[group_50654] +[group_50655] +[group_50656] +[group_50657] +[group_50658] +[group_50659] +[group_50660] +[group_50661] +[group_50662] +[group_50663] +[group_50664] +[group_50665] +[group_50666] +[group_50667] +[group_50668] +[group_50669] +[group_50670] +[group_50671] +[group_50672] +[group_50673] +[group_50674] +[group_50675] +[group_50676] +[group_50677] +[group_50678] +[group_50679] +[group_50680] +[group_50681] +[group_50682] +[group_50683] +[group_50684] +[group_50685] +[group_50686] +[group_50687] +[group_50688] +[group_50689] +[group_50690] +[group_50691] +[group_50692] +[group_50693] +[group_50694] +[group_50695] +[group_50696] +[group_50697] +[group_50698] +[group_50699] +[group_50700] +[group_50701] +[group_50702] +[group_50703] +[group_50704] +[group_50705] +[group_50706] +[group_50707] +[group_50708] +[group_50709] +[group_50710] +[group_50711] +[group_50712] +[group_50713] +[group_50714] +[group_50715] +[group_50716] +[group_50717] +[group_50718] +[group_50719] +[group_50720] +[group_50721] +[group_50722] +[group_50723] +[group_50724] +[group_50725] +[group_50726] +[group_50727] +[group_50728] +[group_50729] +[group_50730] +[group_50731] +[group_50732] +[group_50733] +[group_50734] +[group_50735] +[group_50736] +[group_50737] +[group_50738] +[group_50739] +[group_50740] +[group_50741] +[group_50742] +[group_50743] +[group_50744] +[group_50745] +[group_50746] +[group_50747] +[group_50748] +[group_50749] +[group_50750] +[group_50751] +[group_50752] +[group_50753] +[group_50754] +[group_50755] +[group_50756] +[group_50757] +[group_50758] +[group_50759] +[group_50760] +[group_50761] +[group_50762] +[group_50763] +[group_50764] +[group_50765] +[group_50766] +[group_50767] +[group_50768] +[group_50769] +[group_50770] +[group_50771] +[group_50772] +[group_50773] +[group_50774] +[group_50775] +[group_50776] +[group_50777] +[group_50778] +[group_50779] +[group_50780] +[group_50781] +[group_50782] +[group_50783] +[group_50784] +[group_50785] +[group_50786] +[group_50787] +[group_50788] +[group_50789] +[group_50790] +[group_50791] +[group_50792] +[group_50793] +[group_50794] +[group_50795] +[group_50796] +[group_50797] +[group_50798] +[group_50799] +[group_50800] +[group_50801] +[group_50802] +[group_50803] +[group_50804] +[group_50805] +[group_50806] +[group_50807] +[group_50808] +[group_50809] +[group_50810] +[group_50811] +[group_50812] +[group_50813] +[group_50814] +[group_50815] +[group_50816] +[group_50817] +[group_50818] +[group_50819] +[group_50820] +[group_50821] +[group_50822] +[group_50823] +[group_50824] +[group_50825] +[group_50826] +[group_50827] +[group_50828] +[group_50829] +[group_50830] +[group_50831] +[group_50832] +[group_50833] +[group_50834] +[group_50835] +[group_50836] +[group_50837] +[group_50838] +[group_50839] +[group_50840] +[group_50841] +[group_50842] +[group_50843] +[group_50844] +[group_50845] +[group_50846] +[group_50847] +[group_50848] +[group_50849] +[group_50850] +[group_50851] +[group_50852] +[group_50853] +[group_50854] +[group_50855] +[group_50856] +[group_50857] +[group_50858] +[group_50859] +[group_50860] +[group_50861] +[group_50862] +[group_50863] +[group_50864] +[group_50865] +[group_50866] +[group_50867] +[group_50868] +[group_50869] +[group_50870] +[group_50871] +[group_50872] +[group_50873] +[group_50874] +[group_50875] +[group_50876] +[group_50877] +[group_50878] +[group_50879] +[group_50880] +[group_50881] +[group_50882] +[group_50883] +[group_50884] +[group_50885] +[group_50886] +[group_50887] +[group_50888] +[group_50889] +[group_50890] +[group_50891] +[group_50892] +[group_50893] +[group_50894] +[group_50895] +[group_50896] +[group_50897] +[group_50898] +[group_50899] +[group_50900] +[group_50901] +[group_50902] +[group_50903] +[group_50904] +[group_50905] +[group_50906] +[group_50907] +[group_50908] +[group_50909] +[group_50910] +[group_50911] +[group_50912] +[group_50913] +[group_50914] +[group_50915] +[group_50916] +[group_50917] +[group_50918] +[group_50919] +[group_50920] +[group_50921] +[group_50922] +[group_50923] +[group_50924] +[group_50925] +[group_50926] +[group_50927] +[group_50928] +[group_50929] +[group_50930] +[group_50931] +[group_50932] +[group_50933] +[group_50934] +[group_50935] +[group_50936] +[group_50937] +[group_50938] +[group_50939] +[group_50940] +[group_50941] +[group_50942] +[group_50943] +[group_50944] +[group_50945] +[group_50946] +[group_50947] +[group_50948] +[group_50949] +[group_50950] +[group_50951] +[group_50952] +[group_50953] +[group_50954] +[group_50955] +[group_50956] +[group_50957] +[group_50958] +[group_50959] +[group_50960] +[group_50961] +[group_50962] +[group_50963] +[group_50964] +[group_50965] +[group_50966] +[group_50967] +[group_50968] +[group_50969] +[group_50970] +[group_50971] +[group_50972] +[group_50973] +[group_50974] +[group_50975] +[group_50976] +[group_50977] +[group_50978] +[group_50979] +[group_50980] +[group_50981] +[group_50982] +[group_50983] +[group_50984] +[group_50985] +[group_50986] +[group_50987] +[group_50988] +[group_50989] +[group_50990] +[group_50991] +[group_50992] +[group_50993] +[group_50994] +[group_50995] +[group_50996] +[group_50997] +[group_50998] +[group_50999] +[group_51000] +[group_51001] +[group_51002] +[group_51003] +[group_51004] +[group_51005] +[group_51006] +[group_51007] +[group_51008] +[group_51009] +[group_51010] +[group_51011] +[group_51012] +[group_51013] +[group_51014] +[group_51015] +[group_51016] +[group_51017] +[group_51018] +[group_51019] +[group_51020] +[group_51021] +[group_51022] +[group_51023] +[group_51024] +[group_51025] +[group_51026] +[group_51027] +[group_51028] +[group_51029] +[group_51030] +[group_51031] +[group_51032] +[group_51033] +[group_51034] +[group_51035] +[group_51036] +[group_51037] +[group_51038] +[group_51039] +[group_51040] +[group_51041] +[group_51042] +[group_51043] +[group_51044] +[group_51045] +[group_51046] +[group_51047] +[group_51048] +[group_51049] +[group_51050] +[group_51051] +[group_51052] +[group_51053] +[group_51054] +[group_51055] +[group_51056] +[group_51057] +[group_51058] +[group_51059] +[group_51060] +[group_51061] +[group_51062] +[group_51063] +[group_51064] +[group_51065] +[group_51066] +[group_51067] +[group_51068] +[group_51069] +[group_51070] +[group_51071] +[group_51072] +[group_51073] +[group_51074] +[group_51075] +[group_51076] +[group_51077] +[group_51078] +[group_51079] +[group_51080] +[group_51081] +[group_51082] +[group_51083] +[group_51084] +[group_51085] +[group_51086] +[group_51087] +[group_51088] +[group_51089] +[group_51090] +[group_51091] +[group_51092] +[group_51093] +[group_51094] +[group_51095] +[group_51096] +[group_51097] +[group_51098] +[group_51099] +[group_51100] +[group_51101] +[group_51102] +[group_51103] +[group_51104] +[group_51105] +[group_51106] +[group_51107] +[group_51108] +[group_51109] +[group_51110] +[group_51111] +[group_51112] +[group_51113] +[group_51114] +[group_51115] +[group_51116] +[group_51117] +[group_51118] +[group_51119] +[group_51120] +[group_51121] +[group_51122] +[group_51123] +[group_51124] +[group_51125] +[group_51126] +[group_51127] +[group_51128] +[group_51129] +[group_51130] +[group_51131] +[group_51132] +[group_51133] +[group_51134] +[group_51135] +[group_51136] +[group_51137] +[group_51138] +[group_51139] +[group_51140] +[group_51141] +[group_51142] +[group_51143] +[group_51144] +[group_51145] +[group_51146] +[group_51147] +[group_51148] +[group_51149] +[group_51150] +[group_51151] +[group_51152] +[group_51153] +[group_51154] +[group_51155] +[group_51156] +[group_51157] +[group_51158] +[group_51159] +[group_51160] +[group_51161] +[group_51162] +[group_51163] +[group_51164] +[group_51165] +[group_51166] +[group_51167] +[group_51168] +[group_51169] +[group_51170] +[group_51171] +[group_51172] +[group_51173] +[group_51174] +[group_51175] +[group_51176] +[group_51177] +[group_51178] +[group_51179] +[group_51180] +[group_51181] +[group_51182] +[group_51183] +[group_51184] +[group_51185] +[group_51186] +[group_51187] +[group_51188] +[group_51189] +[group_51190] +[group_51191] +[group_51192] +[group_51193] +[group_51194] +[group_51195] +[group_51196] +[group_51197] +[group_51198] +[group_51199] +[group_51200] +[group_51201] +[group_51202] +[group_51203] +[group_51204] +[group_51205] +[group_51206] +[group_51207] +[group_51208] +[group_51209] +[group_51210] +[group_51211] +[group_51212] +[group_51213] +[group_51214] +[group_51215] +[group_51216] +[group_51217] +[group_51218] +[group_51219] +[group_51220] +[group_51221] +[group_51222] +[group_51223] +[group_51224] +[group_51225] +[group_51226] +[group_51227] +[group_51228] +[group_51229] +[group_51230] +[group_51231] +[group_51232] +[group_51233] +[group_51234] +[group_51235] +[group_51236] +[group_51237] +[group_51238] +[group_51239] +[group_51240] +[group_51241] +[group_51242] +[group_51243] +[group_51244] +[group_51245] +[group_51246] +[group_51247] +[group_51248] +[group_51249] +[group_51250] +[group_51251] +[group_51252] +[group_51253] +[group_51254] +[group_51255] +[group_51256] +[group_51257] +[group_51258] +[group_51259] +[group_51260] +[group_51261] +[group_51262] +[group_51263] +[group_51264] +[group_51265] +[group_51266] +[group_51267] +[group_51268] +[group_51269] +[group_51270] +[group_51271] +[group_51272] +[group_51273] +[group_51274] +[group_51275] +[group_51276] +[group_51277] +[group_51278] +[group_51279] +[group_51280] +[group_51281] +[group_51282] +[group_51283] +[group_51284] +[group_51285] +[group_51286] +[group_51287] +[group_51288] +[group_51289] +[group_51290] +[group_51291] +[group_51292] +[group_51293] +[group_51294] +[group_51295] +[group_51296] +[group_51297] +[group_51298] +[group_51299] +[group_51300] +[group_51301] +[group_51302] +[group_51303] +[group_51304] +[group_51305] +[group_51306] +[group_51307] +[group_51308] +[group_51309] +[group_51310] +[group_51311] +[group_51312] +[group_51313] +[group_51314] +[group_51315] +[group_51316] +[group_51317] +[group_51318] +[group_51319] +[group_51320] +[group_51321] +[group_51322] +[group_51323] +[group_51324] +[group_51325] +[group_51326] +[group_51327] +[group_51328] +[group_51329] +[group_51330] +[group_51331] +[group_51332] +[group_51333] +[group_51334] +[group_51335] +[group_51336] +[group_51337] +[group_51338] +[group_51339] +[group_51340] +[group_51341] +[group_51342] +[group_51343] +[group_51344] +[group_51345] +[group_51346] +[group_51347] +[group_51348] +[group_51349] +[group_51350] +[group_51351] +[group_51352] +[group_51353] +[group_51354] +[group_51355] +[group_51356] +[group_51357] +[group_51358] +[group_51359] +[group_51360] +[group_51361] +[group_51362] +[group_51363] +[group_51364] +[group_51365] +[group_51366] +[group_51367] +[group_51368] +[group_51369] +[group_51370] +[group_51371] +[group_51372] +[group_51373] +[group_51374] +[group_51375] +[group_51376] +[group_51377] +[group_51378] +[group_51379] +[group_51380] +[group_51381] +[group_51382] +[group_51383] +[group_51384] +[group_51385] +[group_51386] +[group_51387] +[group_51388] +[group_51389] +[group_51390] +[group_51391] +[group_51392] +[group_51393] +[group_51394] +[group_51395] +[group_51396] +[group_51397] +[group_51398] +[group_51399] +[group_51400] +[group_51401] +[group_51402] +[group_51403] +[group_51404] +[group_51405] +[group_51406] +[group_51407] +[group_51408] +[group_51409] +[group_51410] +[group_51411] +[group_51412] +[group_51413] +[group_51414] +[group_51415] +[group_51416] +[group_51417] +[group_51418] +[group_51419] +[group_51420] +[group_51421] +[group_51422] +[group_51423] +[group_51424] +[group_51425] +[group_51426] +[group_51427] +[group_51428] +[group_51429] +[group_51430] +[group_51431] +[group_51432] +[group_51433] +[group_51434] +[group_51435] +[group_51436] +[group_51437] +[group_51438] +[group_51439] +[group_51440] +[group_51441] +[group_51442] +[group_51443] +[group_51444] +[group_51445] +[group_51446] +[group_51447] +[group_51448] +[group_51449] +[group_51450] +[group_51451] +[group_51452] +[group_51453] +[group_51454] +[group_51455] +[group_51456] +[group_51457] +[group_51458] +[group_51459] +[group_51460] +[group_51461] +[group_51462] +[group_51463] +[group_51464] +[group_51465] +[group_51466] +[group_51467] +[group_51468] +[group_51469] +[group_51470] +[group_51471] +[group_51472] +[group_51473] +[group_51474] +[group_51475] +[group_51476] +[group_51477] +[group_51478] +[group_51479] +[group_51480] +[group_51481] +[group_51482] +[group_51483] +[group_51484] +[group_51485] +[group_51486] +[group_51487] +[group_51488] +[group_51489] +[group_51490] +[group_51491] +[group_51492] +[group_51493] +[group_51494] +[group_51495] +[group_51496] +[group_51497] +[group_51498] +[group_51499] +[group_51500] +[group_51501] +[group_51502] +[group_51503] +[group_51504] +[group_51505] +[group_51506] +[group_51507] +[group_51508] +[group_51509] +[group_51510] +[group_51511] +[group_51512] +[group_51513] +[group_51514] +[group_51515] +[group_51516] +[group_51517] +[group_51518] +[group_51519] +[group_51520] +[group_51521] +[group_51522] +[group_51523] +[group_51524] +[group_51525] +[group_51526] +[group_51527] +[group_51528] +[group_51529] +[group_51530] +[group_51531] +[group_51532] +[group_51533] +[group_51534] +[group_51535] +[group_51536] +[group_51537] +[group_51538] +[group_51539] +[group_51540] +[group_51541] +[group_51542] +[group_51543] +[group_51544] +[group_51545] +[group_51546] +[group_51547] +[group_51548] +[group_51549] +[group_51550] +[group_51551] +[group_51552] +[group_51553] +[group_51554] +[group_51555] +[group_51556] +[group_51557] +[group_51558] +[group_51559] +[group_51560] +[group_51561] +[group_51562] +[group_51563] +[group_51564] +[group_51565] +[group_51566] +[group_51567] +[group_51568] +[group_51569] +[group_51570] +[group_51571] +[group_51572] +[group_51573] +[group_51574] +[group_51575] +[group_51576] +[group_51577] +[group_51578] +[group_51579] +[group_51580] +[group_51581] +[group_51582] +[group_51583] +[group_51584] +[group_51585] +[group_51586] +[group_51587] +[group_51588] +[group_51589] +[group_51590] +[group_51591] +[group_51592] +[group_51593] +[group_51594] +[group_51595] +[group_51596] +[group_51597] +[group_51598] +[group_51599] +[group_51600] +[group_51601] +[group_51602] +[group_51603] +[group_51604] +[group_51605] +[group_51606] +[group_51607] +[group_51608] +[group_51609] +[group_51610] +[group_51611] +[group_51612] +[group_51613] +[group_51614] +[group_51615] +[group_51616] +[group_51617] +[group_51618] +[group_51619] +[group_51620] +[group_51621] +[group_51622] +[group_51623] +[group_51624] +[group_51625] +[group_51626] +[group_51627] +[group_51628] +[group_51629] +[group_51630] +[group_51631] +[group_51632] +[group_51633] +[group_51634] +[group_51635] +[group_51636] +[group_51637] +[group_51638] +[group_51639] +[group_51640] +[group_51641] +[group_51642] +[group_51643] +[group_51644] +[group_51645] +[group_51646] +[group_51647] +[group_51648] +[group_51649] +[group_51650] +[group_51651] +[group_51652] +[group_51653] +[group_51654] +[group_51655] +[group_51656] +[group_51657] +[group_51658] +[group_51659] +[group_51660] +[group_51661] +[group_51662] +[group_51663] +[group_51664] +[group_51665] +[group_51666] +[group_51667] +[group_51668] +[group_51669] +[group_51670] +[group_51671] +[group_51672] +[group_51673] +[group_51674] +[group_51675] +[group_51676] +[group_51677] +[group_51678] +[group_51679] +[group_51680] +[group_51681] +[group_51682] +[group_51683] +[group_51684] +[group_51685] +[group_51686] +[group_51687] +[group_51688] +[group_51689] +[group_51690] +[group_51691] +[group_51692] +[group_51693] +[group_51694] +[group_51695] +[group_51696] +[group_51697] +[group_51698] +[group_51699] +[group_51700] +[group_51701] +[group_51702] +[group_51703] +[group_51704] +[group_51705] +[group_51706] +[group_51707] +[group_51708] +[group_51709] +[group_51710] +[group_51711] +[group_51712] +[group_51713] +[group_51714] +[group_51715] +[group_51716] +[group_51717] +[group_51718] +[group_51719] +[group_51720] +[group_51721] +[group_51722] +[group_51723] +[group_51724] +[group_51725] +[group_51726] +[group_51727] +[group_51728] +[group_51729] +[group_51730] +[group_51731] +[group_51732] +[group_51733] +[group_51734] +[group_51735] +[group_51736] +[group_51737] +[group_51738] +[group_51739] +[group_51740] +[group_51741] +[group_51742] +[group_51743] +[group_51744] +[group_51745] +[group_51746] +[group_51747] +[group_51748] +[group_51749] +[group_51750] +[group_51751] +[group_51752] +[group_51753] +[group_51754] +[group_51755] +[group_51756] +[group_51757] +[group_51758] +[group_51759] +[group_51760] +[group_51761] +[group_51762] +[group_51763] +[group_51764] +[group_51765] +[group_51766] +[group_51767] +[group_51768] +[group_51769] +[group_51770] +[group_51771] +[group_51772] +[group_51773] +[group_51774] +[group_51775] +[group_51776] +[group_51777] +[group_51778] +[group_51779] +[group_51780] +[group_51781] +[group_51782] +[group_51783] +[group_51784] +[group_51785] +[group_51786] +[group_51787] +[group_51788] +[group_51789] +[group_51790] +[group_51791] +[group_51792] +[group_51793] +[group_51794] +[group_51795] +[group_51796] +[group_51797] +[group_51798] +[group_51799] +[group_51800] +[group_51801] +[group_51802] +[group_51803] +[group_51804] +[group_51805] +[group_51806] +[group_51807] +[group_51808] +[group_51809] +[group_51810] +[group_51811] +[group_51812] +[group_51813] +[group_51814] +[group_51815] +[group_51816] +[group_51817] +[group_51818] +[group_51819] +[group_51820] +[group_51821] +[group_51822] +[group_51823] +[group_51824] +[group_51825] +[group_51826] +[group_51827] +[group_51828] +[group_51829] +[group_51830] +[group_51831] +[group_51832] +[group_51833] +[group_51834] +[group_51835] +[group_51836] +[group_51837] +[group_51838] +[group_51839] +[group_51840] +[group_51841] +[group_51842] +[group_51843] +[group_51844] +[group_51845] +[group_51846] +[group_51847] +[group_51848] +[group_51849] +[group_51850] +[group_51851] +[group_51852] +[group_51853] +[group_51854] +[group_51855] +[group_51856] +[group_51857] +[group_51858] +[group_51859] +[group_51860] +[group_51861] +[group_51862] +[group_51863] +[group_51864] +[group_51865] +[group_51866] +[group_51867] +[group_51868] +[group_51869] +[group_51870] +[group_51871] +[group_51872] +[group_51873] +[group_51874] +[group_51875] +[group_51876] +[group_51877] +[group_51878] +[group_51879] +[group_51880] +[group_51881] +[group_51882] +[group_51883] +[group_51884] +[group_51885] +[group_51886] +[group_51887] +[group_51888] +[group_51889] +[group_51890] +[group_51891] +[group_51892] +[group_51893] +[group_51894] +[group_51895] +[group_51896] +[group_51897] +[group_51898] +[group_51899] +[group_51900] +[group_51901] +[group_51902] +[group_51903] +[group_51904] +[group_51905] +[group_51906] +[group_51907] +[group_51908] +[group_51909] +[group_51910] +[group_51911] +[group_51912] +[group_51913] +[group_51914] +[group_51915] +[group_51916] +[group_51917] +[group_51918] +[group_51919] +[group_51920] +[group_51921] +[group_51922] +[group_51923] +[group_51924] +[group_51925] +[group_51926] +[group_51927] +[group_51928] +[group_51929] +[group_51930] +[group_51931] +[group_51932] +[group_51933] +[group_51934] +[group_51935] +[group_51936] +[group_51937] +[group_51938] +[group_51939] +[group_51940] +[group_51941] +[group_51942] +[group_51943] +[group_51944] +[group_51945] +[group_51946] +[group_51947] +[group_51948] +[group_51949] +[group_51950] +[group_51951] +[group_51952] +[group_51953] +[group_51954] +[group_51955] +[group_51956] +[group_51957] +[group_51958] +[group_51959] +[group_51960] +[group_51961] +[group_51962] +[group_51963] +[group_51964] +[group_51965] +[group_51966] +[group_51967] +[group_51968] +[group_51969] +[group_51970] +[group_51971] +[group_51972] +[group_51973] +[group_51974] +[group_51975] +[group_51976] +[group_51977] +[group_51978] +[group_51979] +[group_51980] +[group_51981] +[group_51982] +[group_51983] +[group_51984] +[group_51985] +[group_51986] +[group_51987] +[group_51988] +[group_51989] +[group_51990] +[group_51991] +[group_51992] +[group_51993] +[group_51994] +[group_51995] +[group_51996] +[group_51997] +[group_51998] +[group_51999] +[group_52000] +[group_52001] +[group_52002] +[group_52003] +[group_52004] +[group_52005] +[group_52006] +[group_52007] +[group_52008] +[group_52009] +[group_52010] +[group_52011] +[group_52012] +[group_52013] +[group_52014] +[group_52015] +[group_52016] +[group_52017] +[group_52018] +[group_52019] +[group_52020] +[group_52021] +[group_52022] +[group_52023] +[group_52024] +[group_52025] +[group_52026] +[group_52027] +[group_52028] +[group_52029] +[group_52030] +[group_52031] +[group_52032] +[group_52033] +[group_52034] +[group_52035] +[group_52036] +[group_52037] +[group_52038] +[group_52039] +[group_52040] +[group_52041] +[group_52042] +[group_52043] +[group_52044] +[group_52045] +[group_52046] +[group_52047] +[group_52048] +[group_52049] +[group_52050] +[group_52051] +[group_52052] +[group_52053] +[group_52054] +[group_52055] +[group_52056] +[group_52057] +[group_52058] +[group_52059] +[group_52060] +[group_52061] +[group_52062] +[group_52063] +[group_52064] +[group_52065] +[group_52066] +[group_52067] +[group_52068] +[group_52069] +[group_52070] +[group_52071] +[group_52072] +[group_52073] +[group_52074] +[group_52075] +[group_52076] +[group_52077] +[group_52078] +[group_52079] +[group_52080] +[group_52081] +[group_52082] +[group_52083] +[group_52084] +[group_52085] +[group_52086] +[group_52087] +[group_52088] +[group_52089] +[group_52090] +[group_52091] +[group_52092] +[group_52093] +[group_52094] +[group_52095] +[group_52096] +[group_52097] +[group_52098] +[group_52099] +[group_52100] +[group_52101] +[group_52102] +[group_52103] +[group_52104] +[group_52105] +[group_52106] +[group_52107] +[group_52108] +[group_52109] +[group_52110] +[group_52111] +[group_52112] +[group_52113] +[group_52114] +[group_52115] +[group_52116] +[group_52117] +[group_52118] +[group_52119] +[group_52120] +[group_52121] +[group_52122] +[group_52123] +[group_52124] +[group_52125] +[group_52126] +[group_52127] +[group_52128] +[group_52129] +[group_52130] +[group_52131] +[group_52132] +[group_52133] +[group_52134] +[group_52135] +[group_52136] +[group_52137] +[group_52138] +[group_52139] +[group_52140] +[group_52141] +[group_52142] +[group_52143] +[group_52144] +[group_52145] +[group_52146] +[group_52147] +[group_52148] +[group_52149] +[group_52150] +[group_52151] +[group_52152] +[group_52153] +[group_52154] +[group_52155] +[group_52156] +[group_52157] +[group_52158] +[group_52159] +[group_52160] +[group_52161] +[group_52162] +[group_52163] +[group_52164] +[group_52165] +[group_52166] +[group_52167] +[group_52168] +[group_52169] +[group_52170] +[group_52171] +[group_52172] +[group_52173] +[group_52174] +[group_52175] +[group_52176] +[group_52177] +[group_52178] +[group_52179] +[group_52180] +[group_52181] +[group_52182] +[group_52183] +[group_52184] +[group_52185] +[group_52186] +[group_52187] +[group_52188] +[group_52189] +[group_52190] +[group_52191] +[group_52192] +[group_52193] +[group_52194] +[group_52195] +[group_52196] +[group_52197] +[group_52198] +[group_52199] +[group_52200] +[group_52201] +[group_52202] +[group_52203] +[group_52204] +[group_52205] +[group_52206] +[group_52207] +[group_52208] +[group_52209] +[group_52210] +[group_52211] +[group_52212] +[group_52213] +[group_52214] +[group_52215] +[group_52216] +[group_52217] +[group_52218] +[group_52219] +[group_52220] +[group_52221] +[group_52222] +[group_52223] +[group_52224] +[group_52225] +[group_52226] +[group_52227] +[group_52228] +[group_52229] +[group_52230] +[group_52231] +[group_52232] +[group_52233] +[group_52234] +[group_52235] +[group_52236] +[group_52237] +[group_52238] +[group_52239] +[group_52240] +[group_52241] +[group_52242] +[group_52243] +[group_52244] +[group_52245] +[group_52246] +[group_52247] +[group_52248] +[group_52249] +[group_52250] +[group_52251] +[group_52252] +[group_52253] +[group_52254] +[group_52255] +[group_52256] +[group_52257] +[group_52258] +[group_52259] +[group_52260] +[group_52261] +[group_52262] +[group_52263] +[group_52264] +[group_52265] +[group_52266] +[group_52267] +[group_52268] +[group_52269] +[group_52270] +[group_52271] +[group_52272] +[group_52273] +[group_52274] +[group_52275] +[group_52276] +[group_52277] +[group_52278] +[group_52279] +[group_52280] +[group_52281] +[group_52282] +[group_52283] +[group_52284] +[group_52285] +[group_52286] +[group_52287] +[group_52288] +[group_52289] +[group_52290] +[group_52291] +[group_52292] +[group_52293] +[group_52294] +[group_52295] +[group_52296] +[group_52297] +[group_52298] +[group_52299] +[group_52300] +[group_52301] +[group_52302] +[group_52303] +[group_52304] +[group_52305] +[group_52306] +[group_52307] +[group_52308] +[group_52309] +[group_52310] +[group_52311] +[group_52312] +[group_52313] +[group_52314] +[group_52315] +[group_52316] +[group_52317] +[group_52318] +[group_52319] +[group_52320] +[group_52321] +[group_52322] +[group_52323] +[group_52324] +[group_52325] +[group_52326] +[group_52327] +[group_52328] +[group_52329] +[group_52330] +[group_52331] +[group_52332] +[group_52333] +[group_52334] +[group_52335] +[group_52336] +[group_52337] +[group_52338] +[group_52339] +[group_52340] +[group_52341] +[group_52342] +[group_52343] +[group_52344] +[group_52345] +[group_52346] +[group_52347] +[group_52348] +[group_52349] +[group_52350] +[group_52351] +[group_52352] +[group_52353] +[group_52354] +[group_52355] +[group_52356] +[group_52357] +[group_52358] +[group_52359] +[group_52360] +[group_52361] +[group_52362] +[group_52363] +[group_52364] +[group_52365] +[group_52366] +[group_52367] +[group_52368] +[group_52369] +[group_52370] +[group_52371] +[group_52372] +[group_52373] +[group_52374] +[group_52375] +[group_52376] +[group_52377] +[group_52378] +[group_52379] +[group_52380] +[group_52381] +[group_52382] +[group_52383] +[group_52384] +[group_52385] +[group_52386] +[group_52387] +[group_52388] +[group_52389] +[group_52390] +[group_52391] +[group_52392] +[group_52393] +[group_52394] +[group_52395] +[group_52396] +[group_52397] +[group_52398] +[group_52399] +[group_52400] +[group_52401] +[group_52402] +[group_52403] +[group_52404] +[group_52405] +[group_52406] +[group_52407] +[group_52408] +[group_52409] +[group_52410] +[group_52411] +[group_52412] +[group_52413] +[group_52414] +[group_52415] +[group_52416] +[group_52417] +[group_52418] +[group_52419] +[group_52420] +[group_52421] +[group_52422] +[group_52423] +[group_52424] +[group_52425] +[group_52426] +[group_52427] +[group_52428] +[group_52429] +[group_52430] +[group_52431] +[group_52432] +[group_52433] +[group_52434] +[group_52435] +[group_52436] +[group_52437] +[group_52438] +[group_52439] +[group_52440] +[group_52441] +[group_52442] +[group_52443] +[group_52444] +[group_52445] +[group_52446] +[group_52447] +[group_52448] +[group_52449] +[group_52450] +[group_52451] +[group_52452] +[group_52453] +[group_52454] +[group_52455] +[group_52456] +[group_52457] +[group_52458] +[group_52459] +[group_52460] +[group_52461] +[group_52462] +[group_52463] +[group_52464] +[group_52465] +[group_52466] +[group_52467] +[group_52468] +[group_52469] +[group_52470] +[group_52471] +[group_52472] +[group_52473] +[group_52474] +[group_52475] +[group_52476] +[group_52477] +[group_52478] +[group_52479] +[group_52480] +[group_52481] +[group_52482] +[group_52483] +[group_52484] +[group_52485] +[group_52486] +[group_52487] +[group_52488] +[group_52489] +[group_52490] +[group_52491] +[group_52492] +[group_52493] +[group_52494] +[group_52495] +[group_52496] +[group_52497] +[group_52498] +[group_52499] +[group_52500] +[group_52501] +[group_52502] +[group_52503] +[group_52504] +[group_52505] +[group_52506] +[group_52507] +[group_52508] +[group_52509] +[group_52510] +[group_52511] +[group_52512] +[group_52513] +[group_52514] +[group_52515] +[group_52516] +[group_52517] +[group_52518] +[group_52519] +[group_52520] +[group_52521] +[group_52522] +[group_52523] +[group_52524] +[group_52525] +[group_52526] +[group_52527] +[group_52528] +[group_52529] +[group_52530] +[group_52531] +[group_52532] +[group_52533] +[group_52534] +[group_52535] +[group_52536] +[group_52537] +[group_52538] +[group_52539] +[group_52540] +[group_52541] +[group_52542] +[group_52543] +[group_52544] +[group_52545] +[group_52546] +[group_52547] +[group_52548] +[group_52549] +[group_52550] +[group_52551] +[group_52552] +[group_52553] +[group_52554] +[group_52555] +[group_52556] +[group_52557] +[group_52558] +[group_52559] +[group_52560] +[group_52561] +[group_52562] +[group_52563] +[group_52564] +[group_52565] +[group_52566] +[group_52567] +[group_52568] +[group_52569] +[group_52570] +[group_52571] +[group_52572] +[group_52573] +[group_52574] +[group_52575] +[group_52576] +[group_52577] +[group_52578] +[group_52579] +[group_52580] +[group_52581] +[group_52582] +[group_52583] +[group_52584] +[group_52585] +[group_52586] +[group_52587] +[group_52588] +[group_52589] +[group_52590] +[group_52591] +[group_52592] +[group_52593] +[group_52594] +[group_52595] +[group_52596] +[group_52597] +[group_52598] +[group_52599] +[group_52600] +[group_52601] +[group_52602] +[group_52603] +[group_52604] +[group_52605] +[group_52606] +[group_52607] +[group_52608] +[group_52609] +[group_52610] +[group_52611] +[group_52612] +[group_52613] +[group_52614] +[group_52615] +[group_52616] +[group_52617] +[group_52618] +[group_52619] +[group_52620] +[group_52621] +[group_52622] +[group_52623] +[group_52624] +[group_52625] +[group_52626] +[group_52627] +[group_52628] +[group_52629] +[group_52630] +[group_52631] +[group_52632] +[group_52633] +[group_52634] +[group_52635] +[group_52636] +[group_52637] +[group_52638] +[group_52639] +[group_52640] +[group_52641] +[group_52642] +[group_52643] +[group_52644] +[group_52645] +[group_52646] +[group_52647] +[group_52648] +[group_52649] +[group_52650] +[group_52651] +[group_52652] +[group_52653] +[group_52654] +[group_52655] +[group_52656] +[group_52657] +[group_52658] +[group_52659] +[group_52660] +[group_52661] +[group_52662] +[group_52663] +[group_52664] +[group_52665] +[group_52666] +[group_52667] +[group_52668] +[group_52669] +[group_52670] +[group_52671] +[group_52672] +[group_52673] +[group_52674] +[group_52675] +[group_52676] +[group_52677] +[group_52678] +[group_52679] +[group_52680] +[group_52681] +[group_52682] +[group_52683] +[group_52684] +[group_52685] +[group_52686] +[group_52687] +[group_52688] +[group_52689] +[group_52690] +[group_52691] +[group_52692] +[group_52693] +[group_52694] +[group_52695] +[group_52696] +[group_52697] +[group_52698] +[group_52699] +[group_52700] +[group_52701] +[group_52702] +[group_52703] +[group_52704] +[group_52705] +[group_52706] +[group_52707] +[group_52708] +[group_52709] +[group_52710] +[group_52711] +[group_52712] +[group_52713] +[group_52714] +[group_52715] +[group_52716] +[group_52717] +[group_52718] +[group_52719] +[group_52720] +[group_52721] +[group_52722] +[group_52723] +[group_52724] +[group_52725] +[group_52726] +[group_52727] +[group_52728] +[group_52729] +[group_52730] +[group_52731] +[group_52732] +[group_52733] +[group_52734] +[group_52735] +[group_52736] +[group_52737] +[group_52738] +[group_52739] +[group_52740] +[group_52741] +[group_52742] +[group_52743] +[group_52744] +[group_52745] +[group_52746] +[group_52747] +[group_52748] +[group_52749] +[group_52750] +[group_52751] +[group_52752] +[group_52753] +[group_52754] +[group_52755] +[group_52756] +[group_52757] +[group_52758] +[group_52759] +[group_52760] +[group_52761] +[group_52762] +[group_52763] +[group_52764] +[group_52765] +[group_52766] +[group_52767] +[group_52768] +[group_52769] +[group_52770] +[group_52771] +[group_52772] +[group_52773] +[group_52774] +[group_52775] +[group_52776] +[group_52777] +[group_52778] +[group_52779] +[group_52780] +[group_52781] +[group_52782] +[group_52783] +[group_52784] +[group_52785] +[group_52786] +[group_52787] +[group_52788] +[group_52789] +[group_52790] +[group_52791] +[group_52792] +[group_52793] +[group_52794] +[group_52795] +[group_52796] +[group_52797] +[group_52798] +[group_52799] +[group_52800] +[group_52801] +[group_52802] +[group_52803] +[group_52804] +[group_52805] +[group_52806] +[group_52807] +[group_52808] +[group_52809] +[group_52810] +[group_52811] +[group_52812] +[group_52813] +[group_52814] +[group_52815] +[group_52816] +[group_52817] +[group_52818] +[group_52819] +[group_52820] +[group_52821] +[group_52822] +[group_52823] +[group_52824] +[group_52825] +[group_52826] +[group_52827] +[group_52828] +[group_52829] +[group_52830] +[group_52831] +[group_52832] +[group_52833] +[group_52834] +[group_52835] +[group_52836] +[group_52837] +[group_52838] +[group_52839] +[group_52840] +[group_52841] +[group_52842] +[group_52843] +[group_52844] +[group_52845] +[group_52846] +[group_52847] +[group_52848] +[group_52849] +[group_52850] +[group_52851] +[group_52852] +[group_52853] +[group_52854] +[group_52855] +[group_52856] +[group_52857] +[group_52858] +[group_52859] +[group_52860] +[group_52861] +[group_52862] +[group_52863] +[group_52864] +[group_52865] +[group_52866] +[group_52867] +[group_52868] +[group_52869] +[group_52870] +[group_52871] +[group_52872] +[group_52873] +[group_52874] +[group_52875] +[group_52876] +[group_52877] +[group_52878] +[group_52879] +[group_52880] +[group_52881] +[group_52882] +[group_52883] +[group_52884] +[group_52885] +[group_52886] +[group_52887] +[group_52888] +[group_52889] +[group_52890] +[group_52891] +[group_52892] +[group_52893] +[group_52894] +[group_52895] +[group_52896] +[group_52897] +[group_52898] +[group_52899] +[group_52900] +[group_52901] +[group_52902] +[group_52903] +[group_52904] +[group_52905] +[group_52906] +[group_52907] +[group_52908] +[group_52909] +[group_52910] +[group_52911] +[group_52912] +[group_52913] +[group_52914] +[group_52915] +[group_52916] +[group_52917] +[group_52918] +[group_52919] +[group_52920] +[group_52921] +[group_52922] +[group_52923] +[group_52924] +[group_52925] +[group_52926] +[group_52927] +[group_52928] +[group_52929] +[group_52930] +[group_52931] +[group_52932] +[group_52933] +[group_52934] +[group_52935] +[group_52936] +[group_52937] +[group_52938] +[group_52939] +[group_52940] +[group_52941] +[group_52942] +[group_52943] +[group_52944] +[group_52945] +[group_52946] +[group_52947] +[group_52948] +[group_52949] +[group_52950] +[group_52951] +[group_52952] +[group_52953] +[group_52954] +[group_52955] +[group_52956] +[group_52957] +[group_52958] +[group_52959] +[group_52960] +[group_52961] +[group_52962] +[group_52963] +[group_52964] +[group_52965] +[group_52966] +[group_52967] +[group_52968] +[group_52969] +[group_52970] +[group_52971] +[group_52972] +[group_52973] +[group_52974] +[group_52975] +[group_52976] +[group_52977] +[group_52978] +[group_52979] +[group_52980] +[group_52981] +[group_52982] +[group_52983] +[group_52984] +[group_52985] +[group_52986] +[group_52987] +[group_52988] +[group_52989] +[group_52990] +[group_52991] +[group_52992] +[group_52993] +[group_52994] +[group_52995] +[group_52996] +[group_52997] +[group_52998] +[group_52999] +[group_53000] +[group_53001] +[group_53002] +[group_53003] +[group_53004] +[group_53005] +[group_53006] +[group_53007] +[group_53008] +[group_53009] +[group_53010] +[group_53011] +[group_53012] +[group_53013] +[group_53014] +[group_53015] +[group_53016] +[group_53017] +[group_53018] +[group_53019] +[group_53020] +[group_53021] +[group_53022] +[group_53023] +[group_53024] +[group_53025] +[group_53026] +[group_53027] +[group_53028] +[group_53029] +[group_53030] +[group_53031] +[group_53032] +[group_53033] +[group_53034] +[group_53035] +[group_53036] +[group_53037] +[group_53038] +[group_53039] +[group_53040] +[group_53041] +[group_53042] +[group_53043] +[group_53044] +[group_53045] +[group_53046] +[group_53047] +[group_53048] +[group_53049] +[group_53050] +[group_53051] +[group_53052] +[group_53053] +[group_53054] +[group_53055] +[group_53056] +[group_53057] +[group_53058] +[group_53059] +[group_53060] +[group_53061] +[group_53062] +[group_53063] +[group_53064] +[group_53065] +[group_53066] +[group_53067] +[group_53068] +[group_53069] +[group_53070] +[group_53071] +[group_53072] +[group_53073] +[group_53074] +[group_53075] +[group_53076] +[group_53077] +[group_53078] +[group_53079] +[group_53080] +[group_53081] +[group_53082] +[group_53083] +[group_53084] +[group_53085] +[group_53086] +[group_53087] +[group_53088] +[group_53089] +[group_53090] +[group_53091] +[group_53092] +[group_53093] +[group_53094] +[group_53095] +[group_53096] +[group_53097] +[group_53098] +[group_53099] +[group_53100] +[group_53101] +[group_53102] +[group_53103] +[group_53104] +[group_53105] +[group_53106] +[group_53107] +[group_53108] +[group_53109] +[group_53110] +[group_53111] +[group_53112] +[group_53113] +[group_53114] +[group_53115] +[group_53116] +[group_53117] +[group_53118] +[group_53119] +[group_53120] +[group_53121] +[group_53122] +[group_53123] +[group_53124] +[group_53125] +[group_53126] +[group_53127] +[group_53128] +[group_53129] +[group_53130] +[group_53131] +[group_53132] +[group_53133] +[group_53134] +[group_53135] +[group_53136] +[group_53137] +[group_53138] +[group_53139] +[group_53140] +[group_53141] +[group_53142] +[group_53143] +[group_53144] +[group_53145] +[group_53146] +[group_53147] +[group_53148] +[group_53149] +[group_53150] +[group_53151] +[group_53152] +[group_53153] +[group_53154] +[group_53155] +[group_53156] +[group_53157] +[group_53158] +[group_53159] +[group_53160] +[group_53161] +[group_53162] +[group_53163] +[group_53164] +[group_53165] +[group_53166] +[group_53167] +[group_53168] +[group_53169] +[group_53170] +[group_53171] +[group_53172] +[group_53173] +[group_53174] +[group_53175] +[group_53176] +[group_53177] +[group_53178] +[group_53179] +[group_53180] +[group_53181] +[group_53182] +[group_53183] +[group_53184] +[group_53185] +[group_53186] +[group_53187] +[group_53188] +[group_53189] +[group_53190] +[group_53191] +[group_53192] +[group_53193] +[group_53194] +[group_53195] +[group_53196] +[group_53197] +[group_53198] +[group_53199] +[group_53200] +[group_53201] +[group_53202] +[group_53203] +[group_53204] +[group_53205] +[group_53206] +[group_53207] +[group_53208] +[group_53209] +[group_53210] +[group_53211] +[group_53212] +[group_53213] +[group_53214] +[group_53215] +[group_53216] +[group_53217] +[group_53218] +[group_53219] +[group_53220] +[group_53221] +[group_53222] +[group_53223] +[group_53224] +[group_53225] +[group_53226] +[group_53227] +[group_53228] +[group_53229] +[group_53230] +[group_53231] +[group_53232] +[group_53233] +[group_53234] +[group_53235] +[group_53236] +[group_53237] +[group_53238] +[group_53239] +[group_53240] +[group_53241] +[group_53242] +[group_53243] +[group_53244] +[group_53245] +[group_53246] +[group_53247] +[group_53248] +[group_53249] +[group_53250] +[group_53251] +[group_53252] +[group_53253] +[group_53254] +[group_53255] +[group_53256] +[group_53257] +[group_53258] +[group_53259] +[group_53260] +[group_53261] +[group_53262] +[group_53263] +[group_53264] +[group_53265] +[group_53266] +[group_53267] +[group_53268] +[group_53269] +[group_53270] +[group_53271] +[group_53272] +[group_53273] +[group_53274] +[group_53275] +[group_53276] +[group_53277] +[group_53278] +[group_53279] +[group_53280] +[group_53281] +[group_53282] +[group_53283] +[group_53284] +[group_53285] +[group_53286] +[group_53287] +[group_53288] +[group_53289] +[group_53290] +[group_53291] +[group_53292] +[group_53293] +[group_53294] +[group_53295] +[group_53296] +[group_53297] +[group_53298] +[group_53299] +[group_53300] +[group_53301] +[group_53302] +[group_53303] +[group_53304] +[group_53305] +[group_53306] +[group_53307] +[group_53308] +[group_53309] +[group_53310] +[group_53311] +[group_53312] +[group_53313] +[group_53314] +[group_53315] +[group_53316] +[group_53317] +[group_53318] +[group_53319] +[group_53320] +[group_53321] +[group_53322] +[group_53323] +[group_53324] +[group_53325] +[group_53326] +[group_53327] +[group_53328] +[group_53329] +[group_53330] +[group_53331] +[group_53332] +[group_53333] +[group_53334] +[group_53335] +[group_53336] +[group_53337] +[group_53338] +[group_53339] +[group_53340] +[group_53341] +[group_53342] +[group_53343] +[group_53344] +[group_53345] +[group_53346] +[group_53347] +[group_53348] +[group_53349] +[group_53350] +[group_53351] +[group_53352] +[group_53353] +[group_53354] +[group_53355] +[group_53356] +[group_53357] +[group_53358] +[group_53359] +[group_53360] +[group_53361] +[group_53362] +[group_53363] +[group_53364] +[group_53365] +[group_53366] +[group_53367] +[group_53368] +[group_53369] +[group_53370] +[group_53371] +[group_53372] +[group_53373] +[group_53374] +[group_53375] +[group_53376] +[group_53377] +[group_53378] +[group_53379] +[group_53380] +[group_53381] +[group_53382] +[group_53383] +[group_53384] +[group_53385] +[group_53386] +[group_53387] +[group_53388] +[group_53389] +[group_53390] +[group_53391] +[group_53392] +[group_53393] +[group_53394] +[group_53395] +[group_53396] +[group_53397] +[group_53398] +[group_53399] +[group_53400] +[group_53401] +[group_53402] +[group_53403] +[group_53404] +[group_53405] +[group_53406] +[group_53407] +[group_53408] +[group_53409] +[group_53410] +[group_53411] +[group_53412] +[group_53413] +[group_53414] +[group_53415] +[group_53416] +[group_53417] +[group_53418] +[group_53419] +[group_53420] +[group_53421] +[group_53422] +[group_53423] +[group_53424] +[group_53425] +[group_53426] +[group_53427] +[group_53428] +[group_53429] +[group_53430] +[group_53431] +[group_53432] +[group_53433] +[group_53434] +[group_53435] +[group_53436] +[group_53437] +[group_53438] +[group_53439] +[group_53440] +[group_53441] +[group_53442] +[group_53443] +[group_53444] +[group_53445] +[group_53446] +[group_53447] +[group_53448] +[group_53449] +[group_53450] +[group_53451] +[group_53452] +[group_53453] +[group_53454] +[group_53455] +[group_53456] +[group_53457] +[group_53458] +[group_53459] +[group_53460] +[group_53461] +[group_53462] +[group_53463] +[group_53464] +[group_53465] +[group_53466] +[group_53467] +[group_53468] +[group_53469] +[group_53470] +[group_53471] +[group_53472] +[group_53473] +[group_53474] +[group_53475] +[group_53476] +[group_53477] +[group_53478] +[group_53479] +[group_53480] +[group_53481] +[group_53482] +[group_53483] +[group_53484] +[group_53485] +[group_53486] +[group_53487] +[group_53488] +[group_53489] +[group_53490] +[group_53491] +[group_53492] +[group_53493] +[group_53494] +[group_53495] +[group_53496] +[group_53497] +[group_53498] +[group_53499] +[group_53500] +[group_53501] +[group_53502] +[group_53503] +[group_53504] +[group_53505] +[group_53506] +[group_53507] +[group_53508] +[group_53509] +[group_53510] +[group_53511] +[group_53512] +[group_53513] +[group_53514] +[group_53515] +[group_53516] +[group_53517] +[group_53518] +[group_53519] +[group_53520] +[group_53521] +[group_53522] +[group_53523] +[group_53524] +[group_53525] +[group_53526] +[group_53527] +[group_53528] +[group_53529] +[group_53530] +[group_53531] +[group_53532] +[group_53533] +[group_53534] +[group_53535] +[group_53536] +[group_53537] +[group_53538] +[group_53539] +[group_53540] +[group_53541] +[group_53542] +[group_53543] +[group_53544] +[group_53545] +[group_53546] +[group_53547] +[group_53548] +[group_53549] +[group_53550] +[group_53551] +[group_53552] +[group_53553] +[group_53554] +[group_53555] +[group_53556] +[group_53557] +[group_53558] +[group_53559] +[group_53560] +[group_53561] +[group_53562] +[group_53563] +[group_53564] +[group_53565] +[group_53566] +[group_53567] +[group_53568] +[group_53569] +[group_53570] +[group_53571] +[group_53572] +[group_53573] +[group_53574] +[group_53575] +[group_53576] +[group_53577] +[group_53578] +[group_53579] +[group_53580] +[group_53581] +[group_53582] +[group_53583] +[group_53584] +[group_53585] +[group_53586] +[group_53587] +[group_53588] +[group_53589] +[group_53590] +[group_53591] +[group_53592] +[group_53593] +[group_53594] +[group_53595] +[group_53596] +[group_53597] +[group_53598] +[group_53599] +[group_53600] +[group_53601] +[group_53602] +[group_53603] +[group_53604] +[group_53605] +[group_53606] +[group_53607] +[group_53608] +[group_53609] +[group_53610] +[group_53611] +[group_53612] +[group_53613] +[group_53614] +[group_53615] +[group_53616] +[group_53617] +[group_53618] +[group_53619] +[group_53620] +[group_53621] +[group_53622] +[group_53623] +[group_53624] +[group_53625] +[group_53626] +[group_53627] +[group_53628] +[group_53629] +[group_53630] +[group_53631] +[group_53632] +[group_53633] +[group_53634] +[group_53635] +[group_53636] +[group_53637] +[group_53638] +[group_53639] +[group_53640] +[group_53641] +[group_53642] +[group_53643] +[group_53644] +[group_53645] +[group_53646] +[group_53647] +[group_53648] +[group_53649] +[group_53650] +[group_53651] +[group_53652] +[group_53653] +[group_53654] +[group_53655] +[group_53656] +[group_53657] +[group_53658] +[group_53659] +[group_53660] +[group_53661] +[group_53662] +[group_53663] +[group_53664] +[group_53665] +[group_53666] +[group_53667] +[group_53668] +[group_53669] +[group_53670] +[group_53671] +[group_53672] +[group_53673] +[group_53674] +[group_53675] +[group_53676] +[group_53677] +[group_53678] +[group_53679] +[group_53680] +[group_53681] +[group_53682] +[group_53683] +[group_53684] +[group_53685] +[group_53686] +[group_53687] +[group_53688] +[group_53689] +[group_53690] +[group_53691] +[group_53692] +[group_53693] +[group_53694] +[group_53695] +[group_53696] +[group_53697] +[group_53698] +[group_53699] +[group_53700] +[group_53701] +[group_53702] +[group_53703] +[group_53704] +[group_53705] +[group_53706] +[group_53707] +[group_53708] +[group_53709] +[group_53710] +[group_53711] +[group_53712] +[group_53713] +[group_53714] +[group_53715] +[group_53716] +[group_53717] +[group_53718] +[group_53719] +[group_53720] +[group_53721] +[group_53722] +[group_53723] +[group_53724] +[group_53725] +[group_53726] +[group_53727] +[group_53728] +[group_53729] +[group_53730] +[group_53731] +[group_53732] +[group_53733] +[group_53734] +[group_53735] +[group_53736] +[group_53737] +[group_53738] +[group_53739] +[group_53740] +[group_53741] +[group_53742] +[group_53743] +[group_53744] +[group_53745] +[group_53746] +[group_53747] +[group_53748] +[group_53749] +[group_53750] +[group_53751] +[group_53752] +[group_53753] +[group_53754] +[group_53755] +[group_53756] +[group_53757] +[group_53758] +[group_53759] +[group_53760] +[group_53761] +[group_53762] +[group_53763] +[group_53764] +[group_53765] +[group_53766] +[group_53767] +[group_53768] +[group_53769] +[group_53770] +[group_53771] +[group_53772] +[group_53773] +[group_53774] +[group_53775] +[group_53776] +[group_53777] +[group_53778] +[group_53779] +[group_53780] +[group_53781] +[group_53782] +[group_53783] +[group_53784] +[group_53785] +[group_53786] +[group_53787] +[group_53788] +[group_53789] +[group_53790] +[group_53791] +[group_53792] +[group_53793] +[group_53794] +[group_53795] +[group_53796] +[group_53797] +[group_53798] +[group_53799] +[group_53800] +[group_53801] +[group_53802] +[group_53803] +[group_53804] +[group_53805] +[group_53806] +[group_53807] +[group_53808] +[group_53809] +[group_53810] +[group_53811] +[group_53812] +[group_53813] +[group_53814] +[group_53815] +[group_53816] +[group_53817] +[group_53818] +[group_53819] +[group_53820] +[group_53821] +[group_53822] +[group_53823] +[group_53824] +[group_53825] +[group_53826] +[group_53827] +[group_53828] +[group_53829] +[group_53830] +[group_53831] +[group_53832] +[group_53833] +[group_53834] +[group_53835] +[group_53836] +[group_53837] +[group_53838] +[group_53839] +[group_53840] +[group_53841] +[group_53842] +[group_53843] +[group_53844] +[group_53845] +[group_53846] +[group_53847] +[group_53848] +[group_53849] +[group_53850] +[group_53851] +[group_53852] +[group_53853] +[group_53854] +[group_53855] +[group_53856] +[group_53857] +[group_53858] +[group_53859] +[group_53860] +[group_53861] +[group_53862] +[group_53863] +[group_53864] +[group_53865] +[group_53866] +[group_53867] +[group_53868] +[group_53869] +[group_53870] +[group_53871] +[group_53872] +[group_53873] +[group_53874] +[group_53875] +[group_53876] +[group_53877] +[group_53878] +[group_53879] +[group_53880] +[group_53881] +[group_53882] +[group_53883] +[group_53884] +[group_53885] +[group_53886] +[group_53887] +[group_53888] +[group_53889] +[group_53890] +[group_53891] +[group_53892] +[group_53893] +[group_53894] +[group_53895] +[group_53896] +[group_53897] +[group_53898] +[group_53899] +[group_53900] +[group_53901] +[group_53902] +[group_53903] +[group_53904] +[group_53905] +[group_53906] +[group_53907] +[group_53908] +[group_53909] +[group_53910] +[group_53911] +[group_53912] +[group_53913] +[group_53914] +[group_53915] +[group_53916] +[group_53917] +[group_53918] +[group_53919] +[group_53920] +[group_53921] +[group_53922] +[group_53923] +[group_53924] +[group_53925] +[group_53926] +[group_53927] +[group_53928] +[group_53929] +[group_53930] +[group_53931] +[group_53932] +[group_53933] +[group_53934] +[group_53935] +[group_53936] +[group_53937] +[group_53938] +[group_53939] +[group_53940] +[group_53941] +[group_53942] +[group_53943] +[group_53944] +[group_53945] +[group_53946] +[group_53947] +[group_53948] +[group_53949] +[group_53950] +[group_53951] +[group_53952] +[group_53953] +[group_53954] +[group_53955] +[group_53956] +[group_53957] +[group_53958] +[group_53959] +[group_53960] +[group_53961] +[group_53962] +[group_53963] +[group_53964] +[group_53965] +[group_53966] +[group_53967] +[group_53968] +[group_53969] +[group_53970] +[group_53971] +[group_53972] +[group_53973] +[group_53974] +[group_53975] +[group_53976] +[group_53977] +[group_53978] +[group_53979] +[group_53980] +[group_53981] +[group_53982] +[group_53983] +[group_53984] +[group_53985] +[group_53986] +[group_53987] +[group_53988] +[group_53989] +[group_53990] +[group_53991] +[group_53992] +[group_53993] +[group_53994] +[group_53995] +[group_53996] +[group_53997] +[group_53998] +[group_53999] +[group_54000] +[group_54001] +[group_54002] +[group_54003] +[group_54004] +[group_54005] +[group_54006] +[group_54007] +[group_54008] +[group_54009] +[group_54010] +[group_54011] +[group_54012] +[group_54013] +[group_54014] +[group_54015] +[group_54016] +[group_54017] +[group_54018] +[group_54019] +[group_54020] +[group_54021] +[group_54022] +[group_54023] +[group_54024] +[group_54025] +[group_54026] +[group_54027] +[group_54028] +[group_54029] +[group_54030] +[group_54031] +[group_54032] +[group_54033] +[group_54034] +[group_54035] +[group_54036] +[group_54037] +[group_54038] +[group_54039] +[group_54040] +[group_54041] +[group_54042] +[group_54043] +[group_54044] +[group_54045] +[group_54046] +[group_54047] +[group_54048] +[group_54049] +[group_54050] +[group_54051] +[group_54052] +[group_54053] +[group_54054] +[group_54055] +[group_54056] +[group_54057] +[group_54058] +[group_54059] +[group_54060] +[group_54061] +[group_54062] +[group_54063] +[group_54064] +[group_54065] +[group_54066] +[group_54067] +[group_54068] +[group_54069] +[group_54070] +[group_54071] +[group_54072] +[group_54073] +[group_54074] +[group_54075] +[group_54076] +[group_54077] +[group_54078] +[group_54079] +[group_54080] +[group_54081] +[group_54082] +[group_54083] +[group_54084] +[group_54085] +[group_54086] +[group_54087] +[group_54088] +[group_54089] +[group_54090] +[group_54091] +[group_54092] +[group_54093] +[group_54094] +[group_54095] +[group_54096] +[group_54097] +[group_54098] +[group_54099] +[group_54100] +[group_54101] +[group_54102] +[group_54103] +[group_54104] +[group_54105] +[group_54106] +[group_54107] +[group_54108] +[group_54109] +[group_54110] +[group_54111] +[group_54112] +[group_54113] +[group_54114] +[group_54115] +[group_54116] +[group_54117] +[group_54118] +[group_54119] +[group_54120] +[group_54121] +[group_54122] +[group_54123] +[group_54124] +[group_54125] +[group_54126] +[group_54127] +[group_54128] +[group_54129] +[group_54130] +[group_54131] +[group_54132] +[group_54133] +[group_54134] +[group_54135] +[group_54136] +[group_54137] +[group_54138] +[group_54139] +[group_54140] +[group_54141] +[group_54142] +[group_54143] +[group_54144] +[group_54145] +[group_54146] +[group_54147] +[group_54148] +[group_54149] +[group_54150] +[group_54151] +[group_54152] +[group_54153] +[group_54154] +[group_54155] +[group_54156] +[group_54157] +[group_54158] +[group_54159] +[group_54160] +[group_54161] +[group_54162] +[group_54163] +[group_54164] +[group_54165] +[group_54166] +[group_54167] +[group_54168] +[group_54169] +[group_54170] +[group_54171] +[group_54172] +[group_54173] +[group_54174] +[group_54175] +[group_54176] +[group_54177] +[group_54178] +[group_54179] +[group_54180] +[group_54181] +[group_54182] +[group_54183] +[group_54184] +[group_54185] +[group_54186] +[group_54187] +[group_54188] +[group_54189] +[group_54190] +[group_54191] +[group_54192] +[group_54193] +[group_54194] +[group_54195] +[group_54196] +[group_54197] +[group_54198] +[group_54199] +[group_54200] +[group_54201] +[group_54202] +[group_54203] +[group_54204] +[group_54205] +[group_54206] +[group_54207] +[group_54208] +[group_54209] +[group_54210] +[group_54211] +[group_54212] +[group_54213] +[group_54214] +[group_54215] +[group_54216] +[group_54217] +[group_54218] +[group_54219] +[group_54220] +[group_54221] +[group_54222] +[group_54223] +[group_54224] +[group_54225] +[group_54226] +[group_54227] +[group_54228] +[group_54229] +[group_54230] +[group_54231] +[group_54232] +[group_54233] +[group_54234] +[group_54235] +[group_54236] +[group_54237] +[group_54238] +[group_54239] +[group_54240] +[group_54241] +[group_54242] +[group_54243] +[group_54244] +[group_54245] +[group_54246] +[group_54247] +[group_54248] +[group_54249] +[group_54250] +[group_54251] +[group_54252] +[group_54253] +[group_54254] +[group_54255] +[group_54256] +[group_54257] +[group_54258] +[group_54259] +[group_54260] +[group_54261] +[group_54262] +[group_54263] +[group_54264] +[group_54265] +[group_54266] +[group_54267] +[group_54268] +[group_54269] +[group_54270] +[group_54271] +[group_54272] +[group_54273] +[group_54274] +[group_54275] +[group_54276] +[group_54277] +[group_54278] +[group_54279] +[group_54280] +[group_54281] +[group_54282] +[group_54283] +[group_54284] +[group_54285] +[group_54286] +[group_54287] +[group_54288] +[group_54289] +[group_54290] +[group_54291] +[group_54292] +[group_54293] +[group_54294] +[group_54295] +[group_54296] +[group_54297] +[group_54298] +[group_54299] +[group_54300] +[group_54301] +[group_54302] +[group_54303] +[group_54304] +[group_54305] +[group_54306] +[group_54307] +[group_54308] +[group_54309] +[group_54310] +[group_54311] +[group_54312] +[group_54313] +[group_54314] +[group_54315] +[group_54316] +[group_54317] +[group_54318] +[group_54319] +[group_54320] +[group_54321] +[group_54322] +[group_54323] +[group_54324] +[group_54325] +[group_54326] +[group_54327] +[group_54328] +[group_54329] +[group_54330] +[group_54331] +[group_54332] +[group_54333] +[group_54334] +[group_54335] +[group_54336] +[group_54337] +[group_54338] +[group_54339] +[group_54340] +[group_54341] +[group_54342] +[group_54343] +[group_54344] +[group_54345] +[group_54346] +[group_54347] +[group_54348] +[group_54349] +[group_54350] +[group_54351] +[group_54352] +[group_54353] +[group_54354] +[group_54355] +[group_54356] +[group_54357] +[group_54358] +[group_54359] +[group_54360] +[group_54361] +[group_54362] +[group_54363] +[group_54364] +[group_54365] +[group_54366] +[group_54367] +[group_54368] +[group_54369] +[group_54370] +[group_54371] +[group_54372] +[group_54373] +[group_54374] +[group_54375] +[group_54376] +[group_54377] +[group_54378] +[group_54379] +[group_54380] +[group_54381] +[group_54382] +[group_54383] +[group_54384] +[group_54385] +[group_54386] +[group_54387] +[group_54388] +[group_54389] +[group_54390] +[group_54391] +[group_54392] +[group_54393] +[group_54394] +[group_54395] +[group_54396] +[group_54397] +[group_54398] +[group_54399] +[group_54400] +[group_54401] +[group_54402] +[group_54403] +[group_54404] +[group_54405] +[group_54406] +[group_54407] +[group_54408] +[group_54409] +[group_54410] +[group_54411] +[group_54412] +[group_54413] +[group_54414] +[group_54415] +[group_54416] +[group_54417] +[group_54418] +[group_54419] +[group_54420] +[group_54421] +[group_54422] +[group_54423] +[group_54424] +[group_54425] +[group_54426] +[group_54427] +[group_54428] +[group_54429] +[group_54430] +[group_54431] +[group_54432] +[group_54433] +[group_54434] +[group_54435] +[group_54436] +[group_54437] +[group_54438] +[group_54439] +[group_54440] +[group_54441] +[group_54442] +[group_54443] +[group_54444] +[group_54445] +[group_54446] +[group_54447] +[group_54448] +[group_54449] +[group_54450] +[group_54451] +[group_54452] +[group_54453] +[group_54454] +[group_54455] +[group_54456] +[group_54457] +[group_54458] +[group_54459] +[group_54460] +[group_54461] +[group_54462] +[group_54463] +[group_54464] +[group_54465] +[group_54466] +[group_54467] +[group_54468] +[group_54469] +[group_54470] +[group_54471] +[group_54472] +[group_54473] +[group_54474] +[group_54475] +[group_54476] +[group_54477] +[group_54478] +[group_54479] +[group_54480] +[group_54481] +[group_54482] +[group_54483] +[group_54484] +[group_54485] +[group_54486] +[group_54487] +[group_54488] +[group_54489] +[group_54490] +[group_54491] +[group_54492] +[group_54493] +[group_54494] +[group_54495] +[group_54496] +[group_54497] +[group_54498] +[group_54499] +[group_54500] +[group_54501] +[group_54502] +[group_54503] +[group_54504] +[group_54505] +[group_54506] +[group_54507] +[group_54508] +[group_54509] +[group_54510] +[group_54511] +[group_54512] +[group_54513] +[group_54514] +[group_54515] +[group_54516] +[group_54517] +[group_54518] +[group_54519] +[group_54520] +[group_54521] +[group_54522] +[group_54523] +[group_54524] +[group_54525] +[group_54526] +[group_54527] +[group_54528] +[group_54529] +[group_54530] +[group_54531] +[group_54532] +[group_54533] +[group_54534] +[group_54535] +[group_54536] +[group_54537] +[group_54538] +[group_54539] +[group_54540] +[group_54541] +[group_54542] +[group_54543] +[group_54544] +[group_54545] +[group_54546] +[group_54547] +[group_54548] +[group_54549] +[group_54550] +[group_54551] +[group_54552] +[group_54553] +[group_54554] +[group_54555] +[group_54556] +[group_54557] +[group_54558] +[group_54559] +[group_54560] +[group_54561] +[group_54562] +[group_54563] +[group_54564] +[group_54565] +[group_54566] +[group_54567] +[group_54568] +[group_54569] +[group_54570] +[group_54571] +[group_54572] +[group_54573] +[group_54574] +[group_54575] +[group_54576] +[group_54577] +[group_54578] +[group_54579] +[group_54580] +[group_54581] +[group_54582] +[group_54583] +[group_54584] +[group_54585] +[group_54586] +[group_54587] +[group_54588] +[group_54589] +[group_54590] +[group_54591] +[group_54592] +[group_54593] +[group_54594] +[group_54595] +[group_54596] +[group_54597] +[group_54598] +[group_54599] +[group_54600] +[group_54601] +[group_54602] +[group_54603] +[group_54604] +[group_54605] +[group_54606] +[group_54607] +[group_54608] +[group_54609] +[group_54610] +[group_54611] +[group_54612] +[group_54613] +[group_54614] +[group_54615] +[group_54616] +[group_54617] +[group_54618] +[group_54619] +[group_54620] +[group_54621] +[group_54622] +[group_54623] +[group_54624] +[group_54625] +[group_54626] +[group_54627] +[group_54628] +[group_54629] +[group_54630] +[group_54631] +[group_54632] +[group_54633] +[group_54634] +[group_54635] +[group_54636] +[group_54637] +[group_54638] +[group_54639] +[group_54640] +[group_54641] +[group_54642] +[group_54643] +[group_54644] +[group_54645] +[group_54646] +[group_54647] +[group_54648] +[group_54649] +[group_54650] +[group_54651] +[group_54652] +[group_54653] +[group_54654] +[group_54655] +[group_54656] +[group_54657] +[group_54658] +[group_54659] +[group_54660] +[group_54661] +[group_54662] +[group_54663] +[group_54664] +[group_54665] +[group_54666] +[group_54667] +[group_54668] +[group_54669] +[group_54670] +[group_54671] +[group_54672] +[group_54673] +[group_54674] +[group_54675] +[group_54676] +[group_54677] +[group_54678] +[group_54679] +[group_54680] +[group_54681] +[group_54682] +[group_54683] +[group_54684] +[group_54685] +[group_54686] +[group_54687] +[group_54688] +[group_54689] +[group_54690] +[group_54691] +[group_54692] +[group_54693] +[group_54694] +[group_54695] +[group_54696] +[group_54697] +[group_54698] +[group_54699] +[group_54700] +[group_54701] +[group_54702] +[group_54703] +[group_54704] +[group_54705] +[group_54706] +[group_54707] +[group_54708] +[group_54709] +[group_54710] +[group_54711] +[group_54712] +[group_54713] +[group_54714] +[group_54715] +[group_54716] +[group_54717] +[group_54718] +[group_54719] +[group_54720] +[group_54721] +[group_54722] +[group_54723] +[group_54724] +[group_54725] +[group_54726] +[group_54727] +[group_54728] +[group_54729] +[group_54730] +[group_54731] +[group_54732] +[group_54733] +[group_54734] +[group_54735] +[group_54736] +[group_54737] +[group_54738] +[group_54739] +[group_54740] +[group_54741] +[group_54742] +[group_54743] +[group_54744] +[group_54745] +[group_54746] +[group_54747] +[group_54748] +[group_54749] +[group_54750] +[group_54751] +[group_54752] +[group_54753] +[group_54754] +[group_54755] +[group_54756] +[group_54757] +[group_54758] +[group_54759] +[group_54760] +[group_54761] +[group_54762] +[group_54763] +[group_54764] +[group_54765] +[group_54766] +[group_54767] +[group_54768] +[group_54769] +[group_54770] +[group_54771] +[group_54772] +[group_54773] +[group_54774] +[group_54775] +[group_54776] +[group_54777] +[group_54778] +[group_54779] +[group_54780] +[group_54781] +[group_54782] +[group_54783] +[group_54784] +[group_54785] +[group_54786] +[group_54787] +[group_54788] +[group_54789] +[group_54790] +[group_54791] +[group_54792] +[group_54793] +[group_54794] +[group_54795] +[group_54796] +[group_54797] +[group_54798] +[group_54799] +[group_54800] +[group_54801] +[group_54802] +[group_54803] +[group_54804] +[group_54805] +[group_54806] +[group_54807] +[group_54808] +[group_54809] +[group_54810] +[group_54811] +[group_54812] +[group_54813] +[group_54814] +[group_54815] +[group_54816] +[group_54817] +[group_54818] +[group_54819] +[group_54820] +[group_54821] +[group_54822] +[group_54823] +[group_54824] +[group_54825] +[group_54826] +[group_54827] +[group_54828] +[group_54829] +[group_54830] +[group_54831] +[group_54832] +[group_54833] +[group_54834] +[group_54835] +[group_54836] +[group_54837] +[group_54838] +[group_54839] +[group_54840] +[group_54841] +[group_54842] +[group_54843] +[group_54844] +[group_54845] +[group_54846] +[group_54847] +[group_54848] +[group_54849] +[group_54850] +[group_54851] +[group_54852] +[group_54853] +[group_54854] +[group_54855] +[group_54856] +[group_54857] +[group_54858] +[group_54859] +[group_54860] +[group_54861] +[group_54862] +[group_54863] +[group_54864] +[group_54865] +[group_54866] +[group_54867] +[group_54868] +[group_54869] +[group_54870] +[group_54871] +[group_54872] +[group_54873] +[group_54874] +[group_54875] +[group_54876] +[group_54877] +[group_54878] +[group_54879] +[group_54880] +[group_54881] +[group_54882] +[group_54883] +[group_54884] +[group_54885] +[group_54886] +[group_54887] +[group_54888] +[group_54889] +[group_54890] +[group_54891] +[group_54892] +[group_54893] +[group_54894] +[group_54895] +[group_54896] +[group_54897] +[group_54898] +[group_54899] +[group_54900] +[group_54901] +[group_54902] +[group_54903] +[group_54904] +[group_54905] +[group_54906] +[group_54907] +[group_54908] +[group_54909] +[group_54910] +[group_54911] +[group_54912] +[group_54913] +[group_54914] +[group_54915] +[group_54916] +[group_54917] +[group_54918] +[group_54919] +[group_54920] +[group_54921] +[group_54922] +[group_54923] +[group_54924] +[group_54925] +[group_54926] +[group_54927] +[group_54928] +[group_54929] +[group_54930] +[group_54931] +[group_54932] +[group_54933] +[group_54934] +[group_54935] +[group_54936] +[group_54937] +[group_54938] +[group_54939] +[group_54940] +[group_54941] +[group_54942] +[group_54943] +[group_54944] +[group_54945] +[group_54946] +[group_54947] +[group_54948] +[group_54949] +[group_54950] +[group_54951] +[group_54952] +[group_54953] +[group_54954] +[group_54955] +[group_54956] +[group_54957] +[group_54958] +[group_54959] +[group_54960] +[group_54961] +[group_54962] +[group_54963] +[group_54964] +[group_54965] +[group_54966] +[group_54967] +[group_54968] +[group_54969] +[group_54970] +[group_54971] +[group_54972] +[group_54973] +[group_54974] +[group_54975] +[group_54976] +[group_54977] +[group_54978] +[group_54979] +[group_54980] +[group_54981] +[group_54982] +[group_54983] +[group_54984] +[group_54985] +[group_54986] +[group_54987] +[group_54988] +[group_54989] +[group_54990] +[group_54991] +[group_54992] +[group_54993] +[group_54994] +[group_54995] +[group_54996] +[group_54997] +[group_54998] +[group_54999] +[group_55000] +[group_55001] +[group_55002] +[group_55003] +[group_55004] +[group_55005] +[group_55006] +[group_55007] +[group_55008] +[group_55009] +[group_55010] +[group_55011] +[group_55012] +[group_55013] +[group_55014] +[group_55015] +[group_55016] +[group_55017] +[group_55018] +[group_55019] +[group_55020] +[group_55021] +[group_55022] +[group_55023] +[group_55024] +[group_55025] +[group_55026] +[group_55027] +[group_55028] +[group_55029] +[group_55030] +[group_55031] +[group_55032] +[group_55033] +[group_55034] +[group_55035] +[group_55036] +[group_55037] +[group_55038] +[group_55039] +[group_55040] +[group_55041] +[group_55042] +[group_55043] +[group_55044] +[group_55045] +[group_55046] +[group_55047] +[group_55048] +[group_55049] +[group_55050] +[group_55051] +[group_55052] +[group_55053] +[group_55054] +[group_55055] +[group_55056] +[group_55057] +[group_55058] +[group_55059] +[group_55060] +[group_55061] +[group_55062] +[group_55063] +[group_55064] +[group_55065] +[group_55066] +[group_55067] +[group_55068] +[group_55069] +[group_55070] +[group_55071] +[group_55072] +[group_55073] +[group_55074] +[group_55075] +[group_55076] +[group_55077] +[group_55078] +[group_55079] +[group_55080] +[group_55081] +[group_55082] +[group_55083] +[group_55084] +[group_55085] +[group_55086] +[group_55087] +[group_55088] +[group_55089] +[group_55090] +[group_55091] +[group_55092] +[group_55093] +[group_55094] +[group_55095] +[group_55096] +[group_55097] +[group_55098] +[group_55099] +[group_55100] +[group_55101] +[group_55102] +[group_55103] +[group_55104] +[group_55105] +[group_55106] +[group_55107] +[group_55108] +[group_55109] +[group_55110] +[group_55111] +[group_55112] +[group_55113] +[group_55114] +[group_55115] +[group_55116] +[group_55117] +[group_55118] +[group_55119] +[group_55120] +[group_55121] +[group_55122] +[group_55123] +[group_55124] +[group_55125] +[group_55126] +[group_55127] +[group_55128] +[group_55129] +[group_55130] +[group_55131] +[group_55132] +[group_55133] +[group_55134] +[group_55135] +[group_55136] +[group_55137] +[group_55138] +[group_55139] +[group_55140] +[group_55141] +[group_55142] +[group_55143] +[group_55144] +[group_55145] +[group_55146] +[group_55147] +[group_55148] +[group_55149] +[group_55150] +[group_55151] +[group_55152] +[group_55153] +[group_55154] +[group_55155] +[group_55156] +[group_55157] +[group_55158] +[group_55159] +[group_55160] +[group_55161] +[group_55162] +[group_55163] +[group_55164] +[group_55165] +[group_55166] +[group_55167] +[group_55168] +[group_55169] +[group_55170] +[group_55171] +[group_55172] +[group_55173] +[group_55174] +[group_55175] +[group_55176] +[group_55177] +[group_55178] +[group_55179] +[group_55180] +[group_55181] +[group_55182] +[group_55183] +[group_55184] +[group_55185] +[group_55186] +[group_55187] +[group_55188] +[group_55189] +[group_55190] +[group_55191] +[group_55192] +[group_55193] +[group_55194] +[group_55195] +[group_55196] +[group_55197] +[group_55198] +[group_55199] +[group_55200] +[group_55201] +[group_55202] +[group_55203] +[group_55204] +[group_55205] +[group_55206] +[group_55207] +[group_55208] +[group_55209] +[group_55210] +[group_55211] +[group_55212] +[group_55213] +[group_55214] +[group_55215] +[group_55216] +[group_55217] +[group_55218] +[group_55219] +[group_55220] +[group_55221] +[group_55222] +[group_55223] +[group_55224] +[group_55225] +[group_55226] +[group_55227] +[group_55228] +[group_55229] +[group_55230] +[group_55231] +[group_55232] +[group_55233] +[group_55234] +[group_55235] +[group_55236] +[group_55237] +[group_55238] +[group_55239] +[group_55240] +[group_55241] +[group_55242] +[group_55243] +[group_55244] +[group_55245] +[group_55246] +[group_55247] +[group_55248] +[group_55249] +[group_55250] +[group_55251] +[group_55252] +[group_55253] +[group_55254] +[group_55255] +[group_55256] +[group_55257] +[group_55258] +[group_55259] +[group_55260] +[group_55261] +[group_55262] +[group_55263] +[group_55264] +[group_55265] +[group_55266] +[group_55267] +[group_55268] +[group_55269] +[group_55270] +[group_55271] +[group_55272] +[group_55273] +[group_55274] +[group_55275] +[group_55276] +[group_55277] +[group_55278] +[group_55279] +[group_55280] +[group_55281] +[group_55282] +[group_55283] +[group_55284] +[group_55285] +[group_55286] +[group_55287] +[group_55288] +[group_55289] +[group_55290] +[group_55291] +[group_55292] +[group_55293] +[group_55294] +[group_55295] +[group_55296] +[group_55297] +[group_55298] +[group_55299] +[group_55300] +[group_55301] +[group_55302] +[group_55303] +[group_55304] +[group_55305] +[group_55306] +[group_55307] +[group_55308] +[group_55309] +[group_55310] +[group_55311] +[group_55312] +[group_55313] +[group_55314] +[group_55315] +[group_55316] +[group_55317] +[group_55318] +[group_55319] +[group_55320] +[group_55321] +[group_55322] +[group_55323] +[group_55324] +[group_55325] +[group_55326] +[group_55327] +[group_55328] +[group_55329] +[group_55330] +[group_55331] +[group_55332] +[group_55333] +[group_55334] +[group_55335] +[group_55336] +[group_55337] +[group_55338] +[group_55339] +[group_55340] +[group_55341] +[group_55342] +[group_55343] +[group_55344] +[group_55345] +[group_55346] +[group_55347] +[group_55348] +[group_55349] +[group_55350] +[group_55351] +[group_55352] +[group_55353] +[group_55354] +[group_55355] +[group_55356] +[group_55357] +[group_55358] +[group_55359] +[group_55360] +[group_55361] +[group_55362] +[group_55363] +[group_55364] +[group_55365] +[group_55366] +[group_55367] +[group_55368] +[group_55369] +[group_55370] +[group_55371] +[group_55372] +[group_55373] +[group_55374] +[group_55375] +[group_55376] +[group_55377] +[group_55378] +[group_55379] +[group_55380] +[group_55381] +[group_55382] +[group_55383] +[group_55384] +[group_55385] +[group_55386] +[group_55387] +[group_55388] +[group_55389] +[group_55390] +[group_55391] +[group_55392] +[group_55393] +[group_55394] +[group_55395] +[group_55396] +[group_55397] +[group_55398] +[group_55399] +[group_55400] +[group_55401] +[group_55402] +[group_55403] +[group_55404] +[group_55405] +[group_55406] +[group_55407] +[group_55408] +[group_55409] +[group_55410] +[group_55411] +[group_55412] +[group_55413] +[group_55414] +[group_55415] +[group_55416] +[group_55417] +[group_55418] +[group_55419] +[group_55420] +[group_55421] +[group_55422] +[group_55423] +[group_55424] +[group_55425] +[group_55426] +[group_55427] +[group_55428] +[group_55429] +[group_55430] +[group_55431] +[group_55432] +[group_55433] +[group_55434] +[group_55435] +[group_55436] +[group_55437] +[group_55438] +[group_55439] +[group_55440] +[group_55441] +[group_55442] +[group_55443] +[group_55444] +[group_55445] +[group_55446] +[group_55447] +[group_55448] +[group_55449] +[group_55450] +[group_55451] +[group_55452] +[group_55453] +[group_55454] +[group_55455] +[group_55456] +[group_55457] +[group_55458] +[group_55459] +[group_55460] +[group_55461] +[group_55462] +[group_55463] +[group_55464] +[group_55465] +[group_55466] +[group_55467] +[group_55468] +[group_55469] +[group_55470] +[group_55471] +[group_55472] +[group_55473] +[group_55474] +[group_55475] +[group_55476] +[group_55477] +[group_55478] +[group_55479] +[group_55480] +[group_55481] +[group_55482] +[group_55483] +[group_55484] +[group_55485] +[group_55486] +[group_55487] +[group_55488] +[group_55489] +[group_55490] +[group_55491] +[group_55492] +[group_55493] +[group_55494] +[group_55495] +[group_55496] +[group_55497] +[group_55498] +[group_55499] +[group_55500] +[group_55501] +[group_55502] +[group_55503] +[group_55504] +[group_55505] +[group_55506] +[group_55507] +[group_55508] +[group_55509] +[group_55510] +[group_55511] +[group_55512] +[group_55513] +[group_55514] +[group_55515] +[group_55516] +[group_55517] +[group_55518] +[group_55519] +[group_55520] +[group_55521] +[group_55522] +[group_55523] +[group_55524] +[group_55525] +[group_55526] +[group_55527] +[group_55528] +[group_55529] +[group_55530] +[group_55531] +[group_55532] +[group_55533] +[group_55534] +[group_55535] +[group_55536] +[group_55537] +[group_55538] +[group_55539] +[group_55540] +[group_55541] +[group_55542] +[group_55543] +[group_55544] +[group_55545] +[group_55546] +[group_55547] +[group_55548] +[group_55549] +[group_55550] +[group_55551] +[group_55552] +[group_55553] +[group_55554] +[group_55555] +[group_55556] +[group_55557] +[group_55558] +[group_55559] +[group_55560] +[group_55561] +[group_55562] +[group_55563] +[group_55564] +[group_55565] +[group_55566] +[group_55567] +[group_55568] +[group_55569] +[group_55570] +[group_55571] +[group_55572] +[group_55573] +[group_55574] +[group_55575] +[group_55576] +[group_55577] +[group_55578] +[group_55579] +[group_55580] +[group_55581] +[group_55582] +[group_55583] +[group_55584] +[group_55585] +[group_55586] +[group_55587] +[group_55588] +[group_55589] +[group_55590] +[group_55591] +[group_55592] +[group_55593] +[group_55594] +[group_55595] +[group_55596] +[group_55597] +[group_55598] +[group_55599] +[group_55600] +[group_55601] +[group_55602] +[group_55603] +[group_55604] +[group_55605] +[group_55606] +[group_55607] +[group_55608] +[group_55609] +[group_55610] +[group_55611] +[group_55612] +[group_55613] +[group_55614] +[group_55615] +[group_55616] +[group_55617] +[group_55618] +[group_55619] +[group_55620] +[group_55621] +[group_55622] +[group_55623] +[group_55624] +[group_55625] +[group_55626] +[group_55627] +[group_55628] +[group_55629] +[group_55630] +[group_55631] +[group_55632] +[group_55633] +[group_55634] +[group_55635] +[group_55636] +[group_55637] +[group_55638] +[group_55639] +[group_55640] +[group_55641] +[group_55642] +[group_55643] +[group_55644] +[group_55645] +[group_55646] +[group_55647] +[group_55648] +[group_55649] +[group_55650] +[group_55651] +[group_55652] +[group_55653] +[group_55654] +[group_55655] +[group_55656] +[group_55657] +[group_55658] +[group_55659] +[group_55660] +[group_55661] +[group_55662] +[group_55663] +[group_55664] +[group_55665] +[group_55666] +[group_55667] +[group_55668] +[group_55669] +[group_55670] +[group_55671] +[group_55672] +[group_55673] +[group_55674] +[group_55675] +[group_55676] +[group_55677] +[group_55678] +[group_55679] +[group_55680] +[group_55681] +[group_55682] +[group_55683] +[group_55684] +[group_55685] +[group_55686] +[group_55687] +[group_55688] +[group_55689] +[group_55690] +[group_55691] +[group_55692] +[group_55693] +[group_55694] +[group_55695] +[group_55696] +[group_55697] +[group_55698] +[group_55699] +[group_55700] +[group_55701] +[group_55702] +[group_55703] +[group_55704] +[group_55705] +[group_55706] +[group_55707] +[group_55708] +[group_55709] +[group_55710] +[group_55711] +[group_55712] +[group_55713] +[group_55714] +[group_55715] +[group_55716] +[group_55717] +[group_55718] +[group_55719] +[group_55720] +[group_55721] +[group_55722] +[group_55723] +[group_55724] +[group_55725] +[group_55726] +[group_55727] +[group_55728] +[group_55729] +[group_55730] +[group_55731] +[group_55732] +[group_55733] +[group_55734] +[group_55735] +[group_55736] +[group_55737] +[group_55738] +[group_55739] +[group_55740] +[group_55741] +[group_55742] +[group_55743] +[group_55744] +[group_55745] +[group_55746] +[group_55747] +[group_55748] +[group_55749] +[group_55750] +[group_55751] +[group_55752] +[group_55753] +[group_55754] +[group_55755] +[group_55756] +[group_55757] +[group_55758] +[group_55759] +[group_55760] +[group_55761] +[group_55762] +[group_55763] +[group_55764] +[group_55765] +[group_55766] +[group_55767] +[group_55768] +[group_55769] +[group_55770] +[group_55771] +[group_55772] +[group_55773] +[group_55774] +[group_55775] +[group_55776] +[group_55777] +[group_55778] +[group_55779] +[group_55780] +[group_55781] +[group_55782] +[group_55783] +[group_55784] +[group_55785] +[group_55786] +[group_55787] +[group_55788] +[group_55789] +[group_55790] +[group_55791] +[group_55792] +[group_55793] +[group_55794] +[group_55795] +[group_55796] +[group_55797] +[group_55798] +[group_55799] +[group_55800] +[group_55801] +[group_55802] +[group_55803] +[group_55804] +[group_55805] +[group_55806] +[group_55807] +[group_55808] +[group_55809] +[group_55810] +[group_55811] +[group_55812] +[group_55813] +[group_55814] +[group_55815] +[group_55816] +[group_55817] +[group_55818] +[group_55819] +[group_55820] +[group_55821] +[group_55822] +[group_55823] +[group_55824] +[group_55825] +[group_55826] +[group_55827] +[group_55828] +[group_55829] +[group_55830] +[group_55831] +[group_55832] +[group_55833] +[group_55834] +[group_55835] +[group_55836] +[group_55837] +[group_55838] +[group_55839] +[group_55840] +[group_55841] +[group_55842] +[group_55843] +[group_55844] +[group_55845] +[group_55846] +[group_55847] +[group_55848] +[group_55849] +[group_55850] +[group_55851] +[group_55852] +[group_55853] +[group_55854] +[group_55855] +[group_55856] +[group_55857] +[group_55858] +[group_55859] +[group_55860] +[group_55861] +[group_55862] +[group_55863] +[group_55864] +[group_55865] +[group_55866] +[group_55867] +[group_55868] +[group_55869] +[group_55870] +[group_55871] +[group_55872] +[group_55873] +[group_55874] +[group_55875] +[group_55876] +[group_55877] +[group_55878] +[group_55879] +[group_55880] +[group_55881] +[group_55882] +[group_55883] +[group_55884] +[group_55885] +[group_55886] +[group_55887] +[group_55888] +[group_55889] +[group_55890] +[group_55891] +[group_55892] +[group_55893] +[group_55894] +[group_55895] +[group_55896] +[group_55897] +[group_55898] +[group_55899] +[group_55900] +[group_55901] +[group_55902] +[group_55903] +[group_55904] +[group_55905] +[group_55906] +[group_55907] +[group_55908] +[group_55909] +[group_55910] +[group_55911] +[group_55912] +[group_55913] +[group_55914] +[group_55915] +[group_55916] +[group_55917] +[group_55918] +[group_55919] +[group_55920] +[group_55921] +[group_55922] +[group_55923] +[group_55924] +[group_55925] +[group_55926] +[group_55927] +[group_55928] +[group_55929] +[group_55930] +[group_55931] +[group_55932] +[group_55933] +[group_55934] +[group_55935] +[group_55936] +[group_55937] +[group_55938] +[group_55939] +[group_55940] +[group_55941] +[group_55942] +[group_55943] +[group_55944] +[group_55945] +[group_55946] +[group_55947] +[group_55948] +[group_55949] +[group_55950] +[group_55951] +[group_55952] +[group_55953] +[group_55954] +[group_55955] +[group_55956] +[group_55957] +[group_55958] +[group_55959] +[group_55960] +[group_55961] +[group_55962] +[group_55963] +[group_55964] +[group_55965] +[group_55966] +[group_55967] +[group_55968] +[group_55969] +[group_55970] +[group_55971] +[group_55972] +[group_55973] +[group_55974] +[group_55975] +[group_55976] +[group_55977] +[group_55978] +[group_55979] +[group_55980] +[group_55981] +[group_55982] +[group_55983] +[group_55984] +[group_55985] +[group_55986] +[group_55987] +[group_55988] +[group_55989] +[group_55990] +[group_55991] +[group_55992] +[group_55993] +[group_55994] +[group_55995] +[group_55996] +[group_55997] +[group_55998] +[group_55999] +[group_56000] +[group_56001] +[group_56002] +[group_56003] +[group_56004] +[group_56005] +[group_56006] +[group_56007] +[group_56008] +[group_56009] +[group_56010] +[group_56011] +[group_56012] +[group_56013] +[group_56014] +[group_56015] +[group_56016] +[group_56017] +[group_56018] +[group_56019] +[group_56020] +[group_56021] +[group_56022] +[group_56023] +[group_56024] +[group_56025] +[group_56026] +[group_56027] +[group_56028] +[group_56029] +[group_56030] +[group_56031] +[group_56032] +[group_56033] +[group_56034] +[group_56035] +[group_56036] +[group_56037] +[group_56038] +[group_56039] +[group_56040] +[group_56041] +[group_56042] +[group_56043] +[group_56044] +[group_56045] +[group_56046] +[group_56047] +[group_56048] +[group_56049] +[group_56050] +[group_56051] +[group_56052] +[group_56053] +[group_56054] +[group_56055] +[group_56056] +[group_56057] +[group_56058] +[group_56059] +[group_56060] +[group_56061] +[group_56062] +[group_56063] +[group_56064] +[group_56065] +[group_56066] +[group_56067] +[group_56068] +[group_56069] +[group_56070] +[group_56071] +[group_56072] +[group_56073] +[group_56074] +[group_56075] +[group_56076] +[group_56077] +[group_56078] +[group_56079] +[group_56080] +[group_56081] +[group_56082] +[group_56083] +[group_56084] +[group_56085] +[group_56086] +[group_56087] +[group_56088] +[group_56089] +[group_56090] +[group_56091] +[group_56092] +[group_56093] +[group_56094] +[group_56095] +[group_56096] +[group_56097] +[group_56098] +[group_56099] +[group_56100] +[group_56101] +[group_56102] +[group_56103] +[group_56104] +[group_56105] +[group_56106] +[group_56107] +[group_56108] +[group_56109] +[group_56110] +[group_56111] +[group_56112] +[group_56113] +[group_56114] +[group_56115] +[group_56116] +[group_56117] +[group_56118] +[group_56119] +[group_56120] +[group_56121] +[group_56122] +[group_56123] +[group_56124] +[group_56125] +[group_56126] +[group_56127] +[group_56128] +[group_56129] +[group_56130] +[group_56131] +[group_56132] +[group_56133] +[group_56134] +[group_56135] +[group_56136] +[group_56137] +[group_56138] +[group_56139] +[group_56140] +[group_56141] +[group_56142] +[group_56143] +[group_56144] +[group_56145] +[group_56146] +[group_56147] +[group_56148] +[group_56149] +[group_56150] +[group_56151] +[group_56152] +[group_56153] +[group_56154] +[group_56155] +[group_56156] +[group_56157] +[group_56158] +[group_56159] +[group_56160] +[group_56161] +[group_56162] +[group_56163] +[group_56164] +[group_56165] +[group_56166] +[group_56167] +[group_56168] +[group_56169] +[group_56170] +[group_56171] +[group_56172] +[group_56173] +[group_56174] +[group_56175] +[group_56176] +[group_56177] +[group_56178] +[group_56179] +[group_56180] +[group_56181] +[group_56182] +[group_56183] +[group_56184] +[group_56185] +[group_56186] +[group_56187] +[group_56188] +[group_56189] +[group_56190] +[group_56191] +[group_56192] +[group_56193] +[group_56194] +[group_56195] +[group_56196] +[group_56197] +[group_56198] +[group_56199] +[group_56200] +[group_56201] +[group_56202] +[group_56203] +[group_56204] +[group_56205] +[group_56206] +[group_56207] +[group_56208] +[group_56209] +[group_56210] +[group_56211] +[group_56212] +[group_56213] +[group_56214] +[group_56215] +[group_56216] +[group_56217] +[group_56218] +[group_56219] +[group_56220] +[group_56221] +[group_56222] +[group_56223] +[group_56224] +[group_56225] +[group_56226] +[group_56227] +[group_56228] +[group_56229] +[group_56230] +[group_56231] +[group_56232] +[group_56233] +[group_56234] +[group_56235] +[group_56236] +[group_56237] +[group_56238] +[group_56239] +[group_56240] +[group_56241] +[group_56242] +[group_56243] +[group_56244] +[group_56245] +[group_56246] +[group_56247] +[group_56248] +[group_56249] +[group_56250] +[group_56251] +[group_56252] +[group_56253] +[group_56254] +[group_56255] +[group_56256] +[group_56257] +[group_56258] +[group_56259] +[group_56260] +[group_56261] +[group_56262] +[group_56263] +[group_56264] +[group_56265] +[group_56266] +[group_56267] +[group_56268] +[group_56269] +[group_56270] +[group_56271] +[group_56272] +[group_56273] +[group_56274] +[group_56275] +[group_56276] +[group_56277] +[group_56278] +[group_56279] +[group_56280] +[group_56281] +[group_56282] +[group_56283] +[group_56284] +[group_56285] +[group_56286] +[group_56287] +[group_56288] +[group_56289] +[group_56290] +[group_56291] +[group_56292] +[group_56293] +[group_56294] +[group_56295] +[group_56296] +[group_56297] +[group_56298] +[group_56299] +[group_56300] +[group_56301] +[group_56302] +[group_56303] +[group_56304] +[group_56305] +[group_56306] +[group_56307] +[group_56308] +[group_56309] +[group_56310] +[group_56311] +[group_56312] +[group_56313] +[group_56314] +[group_56315] +[group_56316] +[group_56317] +[group_56318] +[group_56319] +[group_56320] +[group_56321] +[group_56322] +[group_56323] +[group_56324] +[group_56325] +[group_56326] +[group_56327] +[group_56328] +[group_56329] +[group_56330] +[group_56331] +[group_56332] +[group_56333] +[group_56334] +[group_56335] +[group_56336] +[group_56337] +[group_56338] +[group_56339] +[group_56340] +[group_56341] +[group_56342] +[group_56343] +[group_56344] +[group_56345] +[group_56346] +[group_56347] +[group_56348] +[group_56349] +[group_56350] +[group_56351] +[group_56352] +[group_56353] +[group_56354] +[group_56355] +[group_56356] +[group_56357] +[group_56358] +[group_56359] +[group_56360] +[group_56361] +[group_56362] +[group_56363] +[group_56364] +[group_56365] +[group_56366] +[group_56367] +[group_56368] +[group_56369] +[group_56370] +[group_56371] +[group_56372] +[group_56373] +[group_56374] +[group_56375] +[group_56376] +[group_56377] +[group_56378] +[group_56379] +[group_56380] +[group_56381] +[group_56382] +[group_56383] +[group_56384] +[group_56385] +[group_56386] +[group_56387] +[group_56388] +[group_56389] +[group_56390] +[group_56391] +[group_56392] +[group_56393] +[group_56394] +[group_56395] +[group_56396] +[group_56397] +[group_56398] +[group_56399] +[group_56400] +[group_56401] +[group_56402] +[group_56403] +[group_56404] +[group_56405] +[group_56406] +[group_56407] +[group_56408] +[group_56409] +[group_56410] +[group_56411] +[group_56412] +[group_56413] +[group_56414] +[group_56415] +[group_56416] +[group_56417] +[group_56418] +[group_56419] +[group_56420] +[group_56421] +[group_56422] +[group_56423] +[group_56424] +[group_56425] +[group_56426] +[group_56427] +[group_56428] +[group_56429] +[group_56430] +[group_56431] +[group_56432] +[group_56433] +[group_56434] +[group_56435] +[group_56436] +[group_56437] +[group_56438] +[group_56439] +[group_56440] +[group_56441] +[group_56442] +[group_56443] +[group_56444] +[group_56445] +[group_56446] +[group_56447] +[group_56448] +[group_56449] +[group_56450] +[group_56451] +[group_56452] +[group_56453] +[group_56454] +[group_56455] +[group_56456] +[group_56457] +[group_56458] +[group_56459] +[group_56460] +[group_56461] +[group_56462] +[group_56463] +[group_56464] +[group_56465] +[group_56466] +[group_56467] +[group_56468] +[group_56469] +[group_56470] +[group_56471] +[group_56472] +[group_56473] +[group_56474] +[group_56475] +[group_56476] +[group_56477] +[group_56478] +[group_56479] +[group_56480] +[group_56481] +[group_56482] +[group_56483] +[group_56484] +[group_56485] +[group_56486] +[group_56487] +[group_56488] +[group_56489] +[group_56490] +[group_56491] +[group_56492] +[group_56493] +[group_56494] +[group_56495] +[group_56496] +[group_56497] +[group_56498] +[group_56499] +[group_56500] +[group_56501] +[group_56502] +[group_56503] +[group_56504] +[group_56505] +[group_56506] +[group_56507] +[group_56508] +[group_56509] +[group_56510] +[group_56511] +[group_56512] +[group_56513] +[group_56514] +[group_56515] +[group_56516] +[group_56517] +[group_56518] +[group_56519] +[group_56520] +[group_56521] +[group_56522] +[group_56523] +[group_56524] +[group_56525] +[group_56526] +[group_56527] +[group_56528] +[group_56529] +[group_56530] +[group_56531] +[group_56532] +[group_56533] +[group_56534] +[group_56535] +[group_56536] +[group_56537] +[group_56538] +[group_56539] +[group_56540] +[group_56541] +[group_56542] +[group_56543] +[group_56544] +[group_56545] +[group_56546] +[group_56547] +[group_56548] +[group_56549] +[group_56550] +[group_56551] +[group_56552] +[group_56553] +[group_56554] +[group_56555] +[group_56556] +[group_56557] +[group_56558] +[group_56559] +[group_56560] +[group_56561] +[group_56562] +[group_56563] +[group_56564] +[group_56565] +[group_56566] +[group_56567] +[group_56568] +[group_56569] +[group_56570] +[group_56571] +[group_56572] +[group_56573] +[group_56574] +[group_56575] +[group_56576] +[group_56577] +[group_56578] +[group_56579] +[group_56580] +[group_56581] +[group_56582] +[group_56583] +[group_56584] +[group_56585] +[group_56586] +[group_56587] +[group_56588] +[group_56589] +[group_56590] +[group_56591] +[group_56592] +[group_56593] +[group_56594] +[group_56595] +[group_56596] +[group_56597] +[group_56598] +[group_56599] +[group_56600] +[group_56601] +[group_56602] +[group_56603] +[group_56604] +[group_56605] +[group_56606] +[group_56607] +[group_56608] +[group_56609] +[group_56610] +[group_56611] +[group_56612] +[group_56613] +[group_56614] +[group_56615] +[group_56616] +[group_56617] +[group_56618] +[group_56619] +[group_56620] +[group_56621] +[group_56622] +[group_56623] +[group_56624] +[group_56625] +[group_56626] +[group_56627] +[group_56628] +[group_56629] +[group_56630] +[group_56631] +[group_56632] +[group_56633] +[group_56634] +[group_56635] +[group_56636] +[group_56637] +[group_56638] +[group_56639] +[group_56640] +[group_56641] +[group_56642] +[group_56643] +[group_56644] +[group_56645] +[group_56646] +[group_56647] +[group_56648] +[group_56649] +[group_56650] +[group_56651] +[group_56652] +[group_56653] +[group_56654] +[group_56655] +[group_56656] +[group_56657] +[group_56658] +[group_56659] +[group_56660] +[group_56661] +[group_56662] +[group_56663] +[group_56664] +[group_56665] +[group_56666] +[group_56667] +[group_56668] +[group_56669] +[group_56670] +[group_56671] +[group_56672] +[group_56673] +[group_56674] +[group_56675] +[group_56676] +[group_56677] +[group_56678] +[group_56679] +[group_56680] +[group_56681] +[group_56682] +[group_56683] +[group_56684] +[group_56685] +[group_56686] +[group_56687] +[group_56688] +[group_56689] +[group_56690] +[group_56691] +[group_56692] +[group_56693] +[group_56694] +[group_56695] +[group_56696] +[group_56697] +[group_56698] +[group_56699] +[group_56700] +[group_56701] +[group_56702] +[group_56703] +[group_56704] +[group_56705] +[group_56706] +[group_56707] +[group_56708] +[group_56709] +[group_56710] +[group_56711] +[group_56712] +[group_56713] +[group_56714] +[group_56715] +[group_56716] +[group_56717] +[group_56718] +[group_56719] +[group_56720] +[group_56721] +[group_56722] +[group_56723] +[group_56724] +[group_56725] +[group_56726] +[group_56727] +[group_56728] +[group_56729] +[group_56730] +[group_56731] +[group_56732] +[group_56733] +[group_56734] +[group_56735] +[group_56736] +[group_56737] +[group_56738] +[group_56739] +[group_56740] +[group_56741] +[group_56742] +[group_56743] +[group_56744] +[group_56745] +[group_56746] +[group_56747] +[group_56748] +[group_56749] +[group_56750] +[group_56751] +[group_56752] +[group_56753] +[group_56754] +[group_56755] +[group_56756] +[group_56757] +[group_56758] +[group_56759] +[group_56760] +[group_56761] +[group_56762] +[group_56763] +[group_56764] +[group_56765] +[group_56766] +[group_56767] +[group_56768] +[group_56769] +[group_56770] +[group_56771] +[group_56772] +[group_56773] +[group_56774] +[group_56775] +[group_56776] +[group_56777] +[group_56778] +[group_56779] +[group_56780] +[group_56781] +[group_56782] +[group_56783] +[group_56784] +[group_56785] +[group_56786] +[group_56787] +[group_56788] +[group_56789] +[group_56790] +[group_56791] +[group_56792] +[group_56793] +[group_56794] +[group_56795] +[group_56796] +[group_56797] +[group_56798] +[group_56799] +[group_56800] +[group_56801] +[group_56802] +[group_56803] +[group_56804] +[group_56805] +[group_56806] +[group_56807] +[group_56808] +[group_56809] +[group_56810] +[group_56811] +[group_56812] +[group_56813] +[group_56814] +[group_56815] +[group_56816] +[group_56817] +[group_56818] +[group_56819] +[group_56820] +[group_56821] +[group_56822] +[group_56823] +[group_56824] +[group_56825] +[group_56826] +[group_56827] +[group_56828] +[group_56829] +[group_56830] +[group_56831] +[group_56832] +[group_56833] +[group_56834] +[group_56835] +[group_56836] +[group_56837] +[group_56838] +[group_56839] +[group_56840] +[group_56841] +[group_56842] +[group_56843] +[group_56844] +[group_56845] +[group_56846] +[group_56847] +[group_56848] +[group_56849] +[group_56850] +[group_56851] +[group_56852] +[group_56853] +[group_56854] +[group_56855] +[group_56856] +[group_56857] +[group_56858] +[group_56859] +[group_56860] +[group_56861] +[group_56862] +[group_56863] +[group_56864] +[group_56865] +[group_56866] +[group_56867] +[group_56868] +[group_56869] +[group_56870] +[group_56871] +[group_56872] +[group_56873] +[group_56874] +[group_56875] +[group_56876] +[group_56877] +[group_56878] +[group_56879] +[group_56880] +[group_56881] +[group_56882] +[group_56883] +[group_56884] +[group_56885] +[group_56886] +[group_56887] +[group_56888] +[group_56889] +[group_56890] +[group_56891] +[group_56892] +[group_56893] +[group_56894] +[group_56895] +[group_56896] +[group_56897] +[group_56898] +[group_56899] +[group_56900] +[group_56901] +[group_56902] +[group_56903] +[group_56904] +[group_56905] +[group_56906] +[group_56907] +[group_56908] +[group_56909] +[group_56910] +[group_56911] +[group_56912] +[group_56913] +[group_56914] +[group_56915] +[group_56916] +[group_56917] +[group_56918] +[group_56919] +[group_56920] +[group_56921] +[group_56922] +[group_56923] +[group_56924] +[group_56925] +[group_56926] +[group_56927] +[group_56928] +[group_56929] +[group_56930] +[group_56931] +[group_56932] +[group_56933] +[group_56934] +[group_56935] +[group_56936] +[group_56937] +[group_56938] +[group_56939] +[group_56940] +[group_56941] +[group_56942] +[group_56943] +[group_56944] +[group_56945] +[group_56946] +[group_56947] +[group_56948] +[group_56949] +[group_56950] +[group_56951] +[group_56952] +[group_56953] +[group_56954] +[group_56955] +[group_56956] +[group_56957] +[group_56958] +[group_56959] +[group_56960] +[group_56961] +[group_56962] +[group_56963] +[group_56964] +[group_56965] +[group_56966] +[group_56967] +[group_56968] +[group_56969] +[group_56970] +[group_56971] +[group_56972] +[group_56973] +[group_56974] +[group_56975] +[group_56976] +[group_56977] +[group_56978] +[group_56979] +[group_56980] +[group_56981] +[group_56982] +[group_56983] +[group_56984] +[group_56985] +[group_56986] +[group_56987] +[group_56988] +[group_56989] +[group_56990] +[group_56991] +[group_56992] +[group_56993] +[group_56994] +[group_56995] +[group_56996] +[group_56997] +[group_56998] +[group_56999] +[group_57000] +[group_57001] +[group_57002] +[group_57003] +[group_57004] +[group_57005] +[group_57006] +[group_57007] +[group_57008] +[group_57009] +[group_57010] +[group_57011] +[group_57012] +[group_57013] +[group_57014] +[group_57015] +[group_57016] +[group_57017] +[group_57018] +[group_57019] +[group_57020] +[group_57021] +[group_57022] +[group_57023] +[group_57024] +[group_57025] +[group_57026] +[group_57027] +[group_57028] +[group_57029] +[group_57030] +[group_57031] +[group_57032] +[group_57033] +[group_57034] +[group_57035] +[group_57036] +[group_57037] +[group_57038] +[group_57039] +[group_57040] +[group_57041] +[group_57042] +[group_57043] +[group_57044] +[group_57045] +[group_57046] +[group_57047] +[group_57048] +[group_57049] +[group_57050] +[group_57051] +[group_57052] +[group_57053] +[group_57054] +[group_57055] +[group_57056] +[group_57057] +[group_57058] +[group_57059] +[group_57060] +[group_57061] +[group_57062] +[group_57063] +[group_57064] +[group_57065] +[group_57066] +[group_57067] +[group_57068] +[group_57069] +[group_57070] +[group_57071] +[group_57072] +[group_57073] +[group_57074] +[group_57075] +[group_57076] +[group_57077] +[group_57078] +[group_57079] +[group_57080] +[group_57081] +[group_57082] +[group_57083] +[group_57084] +[group_57085] +[group_57086] +[group_57087] +[group_57088] +[group_57089] +[group_57090] +[group_57091] +[group_57092] +[group_57093] +[group_57094] +[group_57095] +[group_57096] +[group_57097] +[group_57098] +[group_57099] +[group_57100] +[group_57101] +[group_57102] +[group_57103] +[group_57104] +[group_57105] +[group_57106] +[group_57107] +[group_57108] +[group_57109] +[group_57110] +[group_57111] +[group_57112] +[group_57113] +[group_57114] +[group_57115] +[group_57116] +[group_57117] +[group_57118] +[group_57119] +[group_57120] +[group_57121] +[group_57122] +[group_57123] +[group_57124] +[group_57125] +[group_57126] +[group_57127] +[group_57128] +[group_57129] +[group_57130] +[group_57131] +[group_57132] +[group_57133] +[group_57134] +[group_57135] +[group_57136] +[group_57137] +[group_57138] +[group_57139] +[group_57140] +[group_57141] +[group_57142] +[group_57143] +[group_57144] +[group_57145] +[group_57146] +[group_57147] +[group_57148] +[group_57149] +[group_57150] +[group_57151] +[group_57152] +[group_57153] +[group_57154] +[group_57155] +[group_57156] +[group_57157] +[group_57158] +[group_57159] +[group_57160] +[group_57161] +[group_57162] +[group_57163] +[group_57164] +[group_57165] +[group_57166] +[group_57167] +[group_57168] +[group_57169] +[group_57170] +[group_57171] +[group_57172] +[group_57173] +[group_57174] +[group_57175] +[group_57176] +[group_57177] +[group_57178] +[group_57179] +[group_57180] +[group_57181] +[group_57182] +[group_57183] +[group_57184] +[group_57185] +[group_57186] +[group_57187] +[group_57188] +[group_57189] +[group_57190] +[group_57191] +[group_57192] +[group_57193] +[group_57194] +[group_57195] +[group_57196] +[group_57197] +[group_57198] +[group_57199] +[group_57200] +[group_57201] +[group_57202] +[group_57203] +[group_57204] +[group_57205] +[group_57206] +[group_57207] +[group_57208] +[group_57209] +[group_57210] +[group_57211] +[group_57212] +[group_57213] +[group_57214] +[group_57215] +[group_57216] +[group_57217] +[group_57218] +[group_57219] +[group_57220] +[group_57221] +[group_57222] +[group_57223] +[group_57224] +[group_57225] +[group_57226] +[group_57227] +[group_57228] +[group_57229] +[group_57230] +[group_57231] +[group_57232] +[group_57233] +[group_57234] +[group_57235] +[group_57236] +[group_57237] +[group_57238] +[group_57239] +[group_57240] +[group_57241] +[group_57242] +[group_57243] +[group_57244] +[group_57245] +[group_57246] +[group_57247] +[group_57248] +[group_57249] +[group_57250] +[group_57251] +[group_57252] +[group_57253] +[group_57254] +[group_57255] +[group_57256] +[group_57257] +[group_57258] +[group_57259] +[group_57260] +[group_57261] +[group_57262] +[group_57263] +[group_57264] +[group_57265] +[group_57266] +[group_57267] +[group_57268] +[group_57269] +[group_57270] +[group_57271] +[group_57272] +[group_57273] +[group_57274] +[group_57275] +[group_57276] +[group_57277] +[group_57278] +[group_57279] +[group_57280] +[group_57281] +[group_57282] +[group_57283] +[group_57284] +[group_57285] +[group_57286] +[group_57287] +[group_57288] +[group_57289] +[group_57290] +[group_57291] +[group_57292] +[group_57293] +[group_57294] +[group_57295] +[group_57296] +[group_57297] +[group_57298] +[group_57299] +[group_57300] +[group_57301] +[group_57302] +[group_57303] +[group_57304] +[group_57305] +[group_57306] +[group_57307] +[group_57308] +[group_57309] +[group_57310] +[group_57311] +[group_57312] +[group_57313] +[group_57314] +[group_57315] +[group_57316] +[group_57317] +[group_57318] +[group_57319] +[group_57320] +[group_57321] +[group_57322] +[group_57323] +[group_57324] +[group_57325] +[group_57326] +[group_57327] +[group_57328] +[group_57329] +[group_57330] +[group_57331] +[group_57332] +[group_57333] +[group_57334] +[group_57335] +[group_57336] +[group_57337] +[group_57338] +[group_57339] +[group_57340] +[group_57341] +[group_57342] +[group_57343] +[group_57344] +[group_57345] +[group_57346] +[group_57347] +[group_57348] +[group_57349] +[group_57350] +[group_57351] +[group_57352] +[group_57353] +[group_57354] +[group_57355] +[group_57356] +[group_57357] +[group_57358] +[group_57359] +[group_57360] +[group_57361] +[group_57362] +[group_57363] +[group_57364] +[group_57365] +[group_57366] +[group_57367] +[group_57368] +[group_57369] +[group_57370] +[group_57371] +[group_57372] +[group_57373] +[group_57374] +[group_57375] +[group_57376] +[group_57377] +[group_57378] +[group_57379] +[group_57380] +[group_57381] +[group_57382] +[group_57383] +[group_57384] +[group_57385] +[group_57386] +[group_57387] +[group_57388] +[group_57389] +[group_57390] +[group_57391] +[group_57392] +[group_57393] +[group_57394] +[group_57395] +[group_57396] +[group_57397] +[group_57398] +[group_57399] +[group_57400] +[group_57401] +[group_57402] +[group_57403] +[group_57404] +[group_57405] +[group_57406] +[group_57407] +[group_57408] +[group_57409] +[group_57410] +[group_57411] +[group_57412] +[group_57413] +[group_57414] +[group_57415] +[group_57416] +[group_57417] +[group_57418] +[group_57419] +[group_57420] +[group_57421] +[group_57422] +[group_57423] +[group_57424] +[group_57425] +[group_57426] +[group_57427] +[group_57428] +[group_57429] +[group_57430] +[group_57431] +[group_57432] +[group_57433] +[group_57434] +[group_57435] +[group_57436] +[group_57437] +[group_57438] +[group_57439] +[group_57440] +[group_57441] +[group_57442] +[group_57443] +[group_57444] +[group_57445] +[group_57446] +[group_57447] +[group_57448] +[group_57449] +[group_57450] +[group_57451] +[group_57452] +[group_57453] +[group_57454] +[group_57455] +[group_57456] +[group_57457] +[group_57458] +[group_57459] +[group_57460] +[group_57461] +[group_57462] +[group_57463] +[group_57464] +[group_57465] +[group_57466] +[group_57467] +[group_57468] +[group_57469] +[group_57470] +[group_57471] +[group_57472] +[group_57473] +[group_57474] +[group_57475] +[group_57476] +[group_57477] +[group_57478] +[group_57479] +[group_57480] +[group_57481] +[group_57482] +[group_57483] +[group_57484] +[group_57485] +[group_57486] +[group_57487] +[group_57488] +[group_57489] +[group_57490] +[group_57491] +[group_57492] +[group_57493] +[group_57494] +[group_57495] +[group_57496] +[group_57497] +[group_57498] +[group_57499] +[group_57500] +[group_57501] +[group_57502] +[group_57503] +[group_57504] +[group_57505] +[group_57506] +[group_57507] +[group_57508] +[group_57509] +[group_57510] +[group_57511] +[group_57512] +[group_57513] +[group_57514] +[group_57515] +[group_57516] +[group_57517] +[group_57518] +[group_57519] +[group_57520] +[group_57521] +[group_57522] +[group_57523] +[group_57524] +[group_57525] +[group_57526] +[group_57527] +[group_57528] +[group_57529] +[group_57530] +[group_57531] +[group_57532] +[group_57533] +[group_57534] +[group_57535] +[group_57536] +[group_57537] +[group_57538] +[group_57539] +[group_57540] +[group_57541] +[group_57542] +[group_57543] +[group_57544] +[group_57545] +[group_57546] +[group_57547] +[group_57548] +[group_57549] +[group_57550] +[group_57551] +[group_57552] +[group_57553] +[group_57554] +[group_57555] +[group_57556] +[group_57557] +[group_57558] +[group_57559] +[group_57560] +[group_57561] +[group_57562] +[group_57563] +[group_57564] +[group_57565] +[group_57566] +[group_57567] +[group_57568] +[group_57569] +[group_57570] +[group_57571] +[group_57572] +[group_57573] +[group_57574] +[group_57575] +[group_57576] +[group_57577] +[group_57578] +[group_57579] +[group_57580] +[group_57581] +[group_57582] +[group_57583] +[group_57584] +[group_57585] +[group_57586] +[group_57587] +[group_57588] +[group_57589] +[group_57590] +[group_57591] +[group_57592] +[group_57593] +[group_57594] +[group_57595] +[group_57596] +[group_57597] +[group_57598] +[group_57599] +[group_57600] +[group_57601] +[group_57602] +[group_57603] +[group_57604] +[group_57605] +[group_57606] +[group_57607] +[group_57608] +[group_57609] +[group_57610] +[group_57611] +[group_57612] +[group_57613] +[group_57614] +[group_57615] +[group_57616] +[group_57617] +[group_57618] +[group_57619] +[group_57620] +[group_57621] +[group_57622] +[group_57623] +[group_57624] +[group_57625] +[group_57626] +[group_57627] +[group_57628] +[group_57629] +[group_57630] +[group_57631] +[group_57632] +[group_57633] +[group_57634] +[group_57635] +[group_57636] +[group_57637] +[group_57638] +[group_57639] +[group_57640] +[group_57641] +[group_57642] +[group_57643] +[group_57644] +[group_57645] +[group_57646] +[group_57647] +[group_57648] +[group_57649] +[group_57650] +[group_57651] +[group_57652] +[group_57653] +[group_57654] +[group_57655] +[group_57656] +[group_57657] +[group_57658] +[group_57659] +[group_57660] +[group_57661] +[group_57662] +[group_57663] +[group_57664] +[group_57665] +[group_57666] +[group_57667] +[group_57668] +[group_57669] +[group_57670] +[group_57671] +[group_57672] +[group_57673] +[group_57674] +[group_57675] +[group_57676] +[group_57677] +[group_57678] +[group_57679] +[group_57680] +[group_57681] +[group_57682] +[group_57683] +[group_57684] +[group_57685] +[group_57686] +[group_57687] +[group_57688] +[group_57689] +[group_57690] +[group_57691] +[group_57692] +[group_57693] +[group_57694] +[group_57695] +[group_57696] +[group_57697] +[group_57698] +[group_57699] +[group_57700] +[group_57701] +[group_57702] +[group_57703] +[group_57704] +[group_57705] +[group_57706] +[group_57707] +[group_57708] +[group_57709] +[group_57710] +[group_57711] +[group_57712] +[group_57713] +[group_57714] +[group_57715] +[group_57716] +[group_57717] +[group_57718] +[group_57719] +[group_57720] +[group_57721] +[group_57722] +[group_57723] +[group_57724] +[group_57725] +[group_57726] +[group_57727] +[group_57728] +[group_57729] +[group_57730] +[group_57731] +[group_57732] +[group_57733] +[group_57734] +[group_57735] +[group_57736] +[group_57737] +[group_57738] +[group_57739] +[group_57740] +[group_57741] +[group_57742] +[group_57743] +[group_57744] +[group_57745] +[group_57746] +[group_57747] +[group_57748] +[group_57749] +[group_57750] +[group_57751] +[group_57752] +[group_57753] +[group_57754] +[group_57755] +[group_57756] +[group_57757] +[group_57758] +[group_57759] +[group_57760] +[group_57761] +[group_57762] +[group_57763] +[group_57764] +[group_57765] +[group_57766] +[group_57767] +[group_57768] +[group_57769] +[group_57770] +[group_57771] +[group_57772] +[group_57773] +[group_57774] +[group_57775] +[group_57776] +[group_57777] +[group_57778] +[group_57779] +[group_57780] +[group_57781] +[group_57782] +[group_57783] +[group_57784] +[group_57785] +[group_57786] +[group_57787] +[group_57788] +[group_57789] +[group_57790] +[group_57791] +[group_57792] +[group_57793] +[group_57794] +[group_57795] +[group_57796] +[group_57797] +[group_57798] +[group_57799] +[group_57800] +[group_57801] +[group_57802] +[group_57803] +[group_57804] +[group_57805] +[group_57806] +[group_57807] +[group_57808] +[group_57809] +[group_57810] +[group_57811] +[group_57812] +[group_57813] +[group_57814] +[group_57815] +[group_57816] +[group_57817] +[group_57818] +[group_57819] +[group_57820] +[group_57821] +[group_57822] +[group_57823] +[group_57824] +[group_57825] +[group_57826] +[group_57827] +[group_57828] +[group_57829] +[group_57830] +[group_57831] +[group_57832] +[group_57833] +[group_57834] +[group_57835] +[group_57836] +[group_57837] +[group_57838] +[group_57839] +[group_57840] +[group_57841] +[group_57842] +[group_57843] +[group_57844] +[group_57845] +[group_57846] +[group_57847] +[group_57848] +[group_57849] +[group_57850] +[group_57851] +[group_57852] +[group_57853] +[group_57854] +[group_57855] +[group_57856] +[group_57857] +[group_57858] +[group_57859] +[group_57860] +[group_57861] +[group_57862] +[group_57863] +[group_57864] +[group_57865] +[group_57866] +[group_57867] +[group_57868] +[group_57869] +[group_57870] +[group_57871] +[group_57872] +[group_57873] +[group_57874] +[group_57875] +[group_57876] +[group_57877] +[group_57878] +[group_57879] +[group_57880] +[group_57881] +[group_57882] +[group_57883] +[group_57884] +[group_57885] +[group_57886] +[group_57887] +[group_57888] +[group_57889] +[group_57890] +[group_57891] +[group_57892] +[group_57893] +[group_57894] +[group_57895] +[group_57896] +[group_57897] +[group_57898] +[group_57899] +[group_57900] +[group_57901] +[group_57902] +[group_57903] +[group_57904] +[group_57905] +[group_57906] +[group_57907] +[group_57908] +[group_57909] +[group_57910] +[group_57911] +[group_57912] +[group_57913] +[group_57914] +[group_57915] +[group_57916] +[group_57917] +[group_57918] +[group_57919] +[group_57920] +[group_57921] +[group_57922] +[group_57923] +[group_57924] +[group_57925] +[group_57926] +[group_57927] +[group_57928] +[group_57929] +[group_57930] +[group_57931] +[group_57932] +[group_57933] +[group_57934] +[group_57935] +[group_57936] +[group_57937] +[group_57938] +[group_57939] +[group_57940] +[group_57941] +[group_57942] +[group_57943] +[group_57944] +[group_57945] +[group_57946] +[group_57947] +[group_57948] +[group_57949] +[group_57950] +[group_57951] +[group_57952] +[group_57953] +[group_57954] +[group_57955] +[group_57956] +[group_57957] +[group_57958] +[group_57959] +[group_57960] +[group_57961] +[group_57962] +[group_57963] +[group_57964] +[group_57965] +[group_57966] +[group_57967] +[group_57968] +[group_57969] +[group_57970] +[group_57971] +[group_57972] +[group_57973] +[group_57974] +[group_57975] +[group_57976] +[group_57977] +[group_57978] +[group_57979] +[group_57980] +[group_57981] +[group_57982] +[group_57983] +[group_57984] +[group_57985] +[group_57986] +[group_57987] +[group_57988] +[group_57989] +[group_57990] +[group_57991] +[group_57992] +[group_57993] +[group_57994] +[group_57995] +[group_57996] +[group_57997] +[group_57998] +[group_57999] +[group_58000] +[group_58001] +[group_58002] +[group_58003] +[group_58004] +[group_58005] +[group_58006] +[group_58007] +[group_58008] +[group_58009] +[group_58010] +[group_58011] +[group_58012] +[group_58013] +[group_58014] +[group_58015] +[group_58016] +[group_58017] +[group_58018] +[group_58019] +[group_58020] +[group_58021] +[group_58022] +[group_58023] +[group_58024] +[group_58025] +[group_58026] +[group_58027] +[group_58028] +[group_58029] +[group_58030] +[group_58031] +[group_58032] +[group_58033] +[group_58034] +[group_58035] +[group_58036] +[group_58037] +[group_58038] +[group_58039] +[group_58040] +[group_58041] +[group_58042] +[group_58043] +[group_58044] +[group_58045] +[group_58046] +[group_58047] +[group_58048] +[group_58049] +[group_58050] +[group_58051] +[group_58052] +[group_58053] +[group_58054] +[group_58055] +[group_58056] +[group_58057] +[group_58058] +[group_58059] +[group_58060] +[group_58061] +[group_58062] +[group_58063] +[group_58064] +[group_58065] +[group_58066] +[group_58067] +[group_58068] +[group_58069] +[group_58070] +[group_58071] +[group_58072] +[group_58073] +[group_58074] +[group_58075] +[group_58076] +[group_58077] +[group_58078] +[group_58079] +[group_58080] +[group_58081] +[group_58082] +[group_58083] +[group_58084] +[group_58085] +[group_58086] +[group_58087] +[group_58088] +[group_58089] +[group_58090] +[group_58091] +[group_58092] +[group_58093] +[group_58094] +[group_58095] +[group_58096] +[group_58097] +[group_58098] +[group_58099] +[group_58100] +[group_58101] +[group_58102] +[group_58103] +[group_58104] +[group_58105] +[group_58106] +[group_58107] +[group_58108] +[group_58109] +[group_58110] +[group_58111] +[group_58112] +[group_58113] +[group_58114] +[group_58115] +[group_58116] +[group_58117] +[group_58118] +[group_58119] +[group_58120] +[group_58121] +[group_58122] +[group_58123] +[group_58124] +[group_58125] +[group_58126] +[group_58127] +[group_58128] +[group_58129] +[group_58130] +[group_58131] +[group_58132] +[group_58133] +[group_58134] +[group_58135] +[group_58136] +[group_58137] +[group_58138] +[group_58139] +[group_58140] +[group_58141] +[group_58142] +[group_58143] +[group_58144] +[group_58145] +[group_58146] +[group_58147] +[group_58148] +[group_58149] +[group_58150] +[group_58151] +[group_58152] +[group_58153] +[group_58154] +[group_58155] +[group_58156] +[group_58157] +[group_58158] +[group_58159] +[group_58160] +[group_58161] +[group_58162] +[group_58163] +[group_58164] +[group_58165] +[group_58166] +[group_58167] +[group_58168] +[group_58169] +[group_58170] +[group_58171] +[group_58172] +[group_58173] +[group_58174] +[group_58175] +[group_58176] +[group_58177] +[group_58178] +[group_58179] +[group_58180] +[group_58181] +[group_58182] +[group_58183] +[group_58184] +[group_58185] +[group_58186] +[group_58187] +[group_58188] +[group_58189] +[group_58190] +[group_58191] +[group_58192] +[group_58193] +[group_58194] +[group_58195] +[group_58196] +[group_58197] +[group_58198] +[group_58199] +[group_58200] +[group_58201] +[group_58202] +[group_58203] +[group_58204] +[group_58205] +[group_58206] +[group_58207] +[group_58208] +[group_58209] +[group_58210] +[group_58211] +[group_58212] +[group_58213] +[group_58214] +[group_58215] +[group_58216] +[group_58217] +[group_58218] +[group_58219] +[group_58220] +[group_58221] +[group_58222] +[group_58223] +[group_58224] +[group_58225] +[group_58226] +[group_58227] +[group_58228] +[group_58229] +[group_58230] +[group_58231] +[group_58232] +[group_58233] +[group_58234] +[group_58235] +[group_58236] +[group_58237] +[group_58238] +[group_58239] +[group_58240] +[group_58241] +[group_58242] +[group_58243] +[group_58244] +[group_58245] +[group_58246] +[group_58247] +[group_58248] +[group_58249] +[group_58250] +[group_58251] +[group_58252] +[group_58253] +[group_58254] +[group_58255] +[group_58256] +[group_58257] +[group_58258] +[group_58259] +[group_58260] +[group_58261] +[group_58262] +[group_58263] +[group_58264] +[group_58265] +[group_58266] +[group_58267] +[group_58268] +[group_58269] +[group_58270] +[group_58271] +[group_58272] +[group_58273] +[group_58274] +[group_58275] +[group_58276] +[group_58277] +[group_58278] +[group_58279] +[group_58280] +[group_58281] +[group_58282] +[group_58283] +[group_58284] +[group_58285] +[group_58286] +[group_58287] +[group_58288] +[group_58289] +[group_58290] +[group_58291] +[group_58292] +[group_58293] +[group_58294] +[group_58295] +[group_58296] +[group_58297] +[group_58298] +[group_58299] +[group_58300] +[group_58301] +[group_58302] +[group_58303] +[group_58304] +[group_58305] +[group_58306] +[group_58307] +[group_58308] +[group_58309] +[group_58310] +[group_58311] +[group_58312] +[group_58313] +[group_58314] +[group_58315] +[group_58316] +[group_58317] +[group_58318] +[group_58319] +[group_58320] +[group_58321] +[group_58322] +[group_58323] +[group_58324] +[group_58325] +[group_58326] +[group_58327] +[group_58328] +[group_58329] +[group_58330] +[group_58331] +[group_58332] +[group_58333] +[group_58334] +[group_58335] +[group_58336] +[group_58337] +[group_58338] +[group_58339] +[group_58340] +[group_58341] +[group_58342] +[group_58343] +[group_58344] +[group_58345] +[group_58346] +[group_58347] +[group_58348] +[group_58349] +[group_58350] +[group_58351] +[group_58352] +[group_58353] +[group_58354] +[group_58355] +[group_58356] +[group_58357] +[group_58358] +[group_58359] +[group_58360] +[group_58361] +[group_58362] +[group_58363] +[group_58364] +[group_58365] +[group_58366] +[group_58367] +[group_58368] +[group_58369] +[group_58370] +[group_58371] +[group_58372] +[group_58373] +[group_58374] +[group_58375] +[group_58376] +[group_58377] +[group_58378] +[group_58379] +[group_58380] +[group_58381] +[group_58382] +[group_58383] +[group_58384] +[group_58385] +[group_58386] +[group_58387] +[group_58388] +[group_58389] +[group_58390] +[group_58391] +[group_58392] +[group_58393] +[group_58394] +[group_58395] +[group_58396] +[group_58397] +[group_58398] +[group_58399] +[group_58400] +[group_58401] +[group_58402] +[group_58403] +[group_58404] +[group_58405] +[group_58406] +[group_58407] +[group_58408] +[group_58409] +[group_58410] +[group_58411] +[group_58412] +[group_58413] +[group_58414] +[group_58415] +[group_58416] +[group_58417] +[group_58418] +[group_58419] +[group_58420] +[group_58421] +[group_58422] +[group_58423] +[group_58424] +[group_58425] +[group_58426] +[group_58427] +[group_58428] +[group_58429] +[group_58430] +[group_58431] +[group_58432] +[group_58433] +[group_58434] +[group_58435] +[group_58436] +[group_58437] +[group_58438] +[group_58439] +[group_58440] +[group_58441] +[group_58442] +[group_58443] +[group_58444] +[group_58445] +[group_58446] +[group_58447] +[group_58448] +[group_58449] +[group_58450] +[group_58451] +[group_58452] +[group_58453] +[group_58454] +[group_58455] +[group_58456] +[group_58457] +[group_58458] +[group_58459] +[group_58460] +[group_58461] +[group_58462] +[group_58463] +[group_58464] +[group_58465] +[group_58466] +[group_58467] +[group_58468] +[group_58469] +[group_58470] +[group_58471] +[group_58472] +[group_58473] +[group_58474] +[group_58475] +[group_58476] +[group_58477] +[group_58478] +[group_58479] +[group_58480] +[group_58481] +[group_58482] +[group_58483] +[group_58484] +[group_58485] +[group_58486] +[group_58487] +[group_58488] +[group_58489] +[group_58490] +[group_58491] +[group_58492] +[group_58493] +[group_58494] +[group_58495] +[group_58496] +[group_58497] +[group_58498] +[group_58499] +[group_58500] +[group_58501] +[group_58502] +[group_58503] +[group_58504] +[group_58505] +[group_58506] +[group_58507] +[group_58508] +[group_58509] +[group_58510] +[group_58511] +[group_58512] +[group_58513] +[group_58514] +[group_58515] +[group_58516] +[group_58517] +[group_58518] +[group_58519] +[group_58520] +[group_58521] +[group_58522] +[group_58523] +[group_58524] +[group_58525] +[group_58526] +[group_58527] +[group_58528] +[group_58529] +[group_58530] +[group_58531] +[group_58532] +[group_58533] +[group_58534] +[group_58535] +[group_58536] +[group_58537] +[group_58538] +[group_58539] +[group_58540] +[group_58541] +[group_58542] +[group_58543] +[group_58544] +[group_58545] +[group_58546] +[group_58547] +[group_58548] +[group_58549] +[group_58550] +[group_58551] +[group_58552] +[group_58553] +[group_58554] +[group_58555] +[group_58556] +[group_58557] +[group_58558] +[group_58559] +[group_58560] +[group_58561] +[group_58562] +[group_58563] +[group_58564] +[group_58565] +[group_58566] +[group_58567] +[group_58568] +[group_58569] +[group_58570] +[group_58571] +[group_58572] +[group_58573] +[group_58574] +[group_58575] +[group_58576] +[group_58577] +[group_58578] +[group_58579] +[group_58580] +[group_58581] +[group_58582] +[group_58583] +[group_58584] +[group_58585] +[group_58586] +[group_58587] +[group_58588] +[group_58589] +[group_58590] +[group_58591] +[group_58592] +[group_58593] +[group_58594] +[group_58595] +[group_58596] +[group_58597] +[group_58598] +[group_58599] +[group_58600] +[group_58601] +[group_58602] +[group_58603] +[group_58604] +[group_58605] +[group_58606] +[group_58607] +[group_58608] +[group_58609] +[group_58610] +[group_58611] +[group_58612] +[group_58613] +[group_58614] +[group_58615] +[group_58616] +[group_58617] +[group_58618] +[group_58619] +[group_58620] +[group_58621] +[group_58622] +[group_58623] +[group_58624] +[group_58625] +[group_58626] +[group_58627] +[group_58628] +[group_58629] +[group_58630] +[group_58631] +[group_58632] +[group_58633] +[group_58634] +[group_58635] +[group_58636] +[group_58637] +[group_58638] +[group_58639] +[group_58640] +[group_58641] +[group_58642] +[group_58643] +[group_58644] +[group_58645] +[group_58646] +[group_58647] +[group_58648] +[group_58649] +[group_58650] +[group_58651] +[group_58652] +[group_58653] +[group_58654] +[group_58655] +[group_58656] +[group_58657] +[group_58658] +[group_58659] +[group_58660] +[group_58661] +[group_58662] +[group_58663] +[group_58664] +[group_58665] +[group_58666] +[group_58667] +[group_58668] +[group_58669] +[group_58670] +[group_58671] +[group_58672] +[group_58673] +[group_58674] +[group_58675] +[group_58676] +[group_58677] +[group_58678] +[group_58679] +[group_58680] +[group_58681] +[group_58682] +[group_58683] +[group_58684] +[group_58685] +[group_58686] +[group_58687] +[group_58688] +[group_58689] +[group_58690] +[group_58691] +[group_58692] +[group_58693] +[group_58694] +[group_58695] +[group_58696] +[group_58697] +[group_58698] +[group_58699] +[group_58700] +[group_58701] +[group_58702] +[group_58703] +[group_58704] +[group_58705] +[group_58706] +[group_58707] +[group_58708] +[group_58709] +[group_58710] +[group_58711] +[group_58712] +[group_58713] +[group_58714] +[group_58715] +[group_58716] +[group_58717] +[group_58718] +[group_58719] +[group_58720] +[group_58721] +[group_58722] +[group_58723] +[group_58724] +[group_58725] +[group_58726] +[group_58727] +[group_58728] +[group_58729] +[group_58730] +[group_58731] +[group_58732] +[group_58733] +[group_58734] +[group_58735] +[group_58736] +[group_58737] +[group_58738] +[group_58739] +[group_58740] +[group_58741] +[group_58742] +[group_58743] +[group_58744] +[group_58745] +[group_58746] +[group_58747] +[group_58748] +[group_58749] +[group_58750] +[group_58751] +[group_58752] +[group_58753] +[group_58754] +[group_58755] +[group_58756] +[group_58757] +[group_58758] +[group_58759] +[group_58760] +[group_58761] +[group_58762] +[group_58763] +[group_58764] +[group_58765] +[group_58766] +[group_58767] +[group_58768] +[group_58769] +[group_58770] +[group_58771] +[group_58772] +[group_58773] +[group_58774] +[group_58775] +[group_58776] +[group_58777] +[group_58778] +[group_58779] +[group_58780] +[group_58781] +[group_58782] +[group_58783] +[group_58784] +[group_58785] +[group_58786] +[group_58787] +[group_58788] +[group_58789] +[group_58790] +[group_58791] +[group_58792] +[group_58793] +[group_58794] +[group_58795] +[group_58796] +[group_58797] +[group_58798] +[group_58799] +[group_58800] +[group_58801] +[group_58802] +[group_58803] +[group_58804] +[group_58805] +[group_58806] +[group_58807] +[group_58808] +[group_58809] +[group_58810] +[group_58811] +[group_58812] +[group_58813] +[group_58814] +[group_58815] +[group_58816] +[group_58817] +[group_58818] +[group_58819] +[group_58820] +[group_58821] +[group_58822] +[group_58823] +[group_58824] +[group_58825] +[group_58826] +[group_58827] +[group_58828] +[group_58829] +[group_58830] +[group_58831] +[group_58832] +[group_58833] +[group_58834] +[group_58835] +[group_58836] +[group_58837] +[group_58838] +[group_58839] +[group_58840] +[group_58841] +[group_58842] +[group_58843] +[group_58844] +[group_58845] +[group_58846] +[group_58847] +[group_58848] +[group_58849] +[group_58850] +[group_58851] +[group_58852] +[group_58853] +[group_58854] +[group_58855] +[group_58856] +[group_58857] +[group_58858] +[group_58859] +[group_58860] +[group_58861] +[group_58862] +[group_58863] +[group_58864] +[group_58865] +[group_58866] +[group_58867] +[group_58868] +[group_58869] +[group_58870] +[group_58871] +[group_58872] +[group_58873] +[group_58874] +[group_58875] +[group_58876] +[group_58877] +[group_58878] +[group_58879] +[group_58880] +[group_58881] +[group_58882] +[group_58883] +[group_58884] +[group_58885] +[group_58886] +[group_58887] +[group_58888] +[group_58889] +[group_58890] +[group_58891] +[group_58892] +[group_58893] +[group_58894] +[group_58895] +[group_58896] +[group_58897] +[group_58898] +[group_58899] +[group_58900] +[group_58901] +[group_58902] +[group_58903] +[group_58904] +[group_58905] +[group_58906] +[group_58907] +[group_58908] +[group_58909] +[group_58910] +[group_58911] +[group_58912] +[group_58913] +[group_58914] +[group_58915] +[group_58916] +[group_58917] +[group_58918] +[group_58919] +[group_58920] +[group_58921] +[group_58922] +[group_58923] +[group_58924] +[group_58925] +[group_58926] +[group_58927] +[group_58928] +[group_58929] +[group_58930] +[group_58931] +[group_58932] +[group_58933] +[group_58934] +[group_58935] +[group_58936] +[group_58937] +[group_58938] +[group_58939] +[group_58940] +[group_58941] +[group_58942] +[group_58943] +[group_58944] +[group_58945] +[group_58946] +[group_58947] +[group_58948] +[group_58949] +[group_58950] +[group_58951] +[group_58952] +[group_58953] +[group_58954] +[group_58955] +[group_58956] +[group_58957] +[group_58958] +[group_58959] +[group_58960] +[group_58961] +[group_58962] +[group_58963] +[group_58964] +[group_58965] +[group_58966] +[group_58967] +[group_58968] +[group_58969] +[group_58970] +[group_58971] +[group_58972] +[group_58973] +[group_58974] +[group_58975] +[group_58976] +[group_58977] +[group_58978] +[group_58979] +[group_58980] +[group_58981] +[group_58982] +[group_58983] +[group_58984] +[group_58985] +[group_58986] +[group_58987] +[group_58988] +[group_58989] +[group_58990] +[group_58991] +[group_58992] +[group_58993] +[group_58994] +[group_58995] +[group_58996] +[group_58997] +[group_58998] +[group_58999] +[group_59000] +[group_59001] +[group_59002] +[group_59003] +[group_59004] +[group_59005] +[group_59006] +[group_59007] +[group_59008] +[group_59009] +[group_59010] +[group_59011] +[group_59012] +[group_59013] +[group_59014] +[group_59015] +[group_59016] +[group_59017] +[group_59018] +[group_59019] +[group_59020] +[group_59021] +[group_59022] +[group_59023] +[group_59024] +[group_59025] +[group_59026] +[group_59027] +[group_59028] +[group_59029] +[group_59030] +[group_59031] +[group_59032] +[group_59033] +[group_59034] +[group_59035] +[group_59036] +[group_59037] +[group_59038] +[group_59039] +[group_59040] +[group_59041] +[group_59042] +[group_59043] +[group_59044] +[group_59045] +[group_59046] +[group_59047] +[group_59048] +[group_59049] +[group_59050] +[group_59051] +[group_59052] +[group_59053] +[group_59054] +[group_59055] +[group_59056] +[group_59057] +[group_59058] +[group_59059] +[group_59060] +[group_59061] +[group_59062] +[group_59063] +[group_59064] +[group_59065] +[group_59066] +[group_59067] +[group_59068] +[group_59069] +[group_59070] +[group_59071] +[group_59072] +[group_59073] +[group_59074] +[group_59075] +[group_59076] +[group_59077] +[group_59078] +[group_59079] +[group_59080] +[group_59081] +[group_59082] +[group_59083] +[group_59084] +[group_59085] +[group_59086] +[group_59087] +[group_59088] +[group_59089] +[group_59090] +[group_59091] +[group_59092] +[group_59093] +[group_59094] +[group_59095] +[group_59096] +[group_59097] +[group_59098] +[group_59099] +[group_59100] +[group_59101] +[group_59102] +[group_59103] +[group_59104] +[group_59105] +[group_59106] +[group_59107] +[group_59108] +[group_59109] +[group_59110] +[group_59111] +[group_59112] +[group_59113] +[group_59114] +[group_59115] +[group_59116] +[group_59117] +[group_59118] +[group_59119] +[group_59120] +[group_59121] +[group_59122] +[group_59123] +[group_59124] +[group_59125] +[group_59126] +[group_59127] +[group_59128] +[group_59129] +[group_59130] +[group_59131] +[group_59132] +[group_59133] +[group_59134] +[group_59135] +[group_59136] +[group_59137] +[group_59138] +[group_59139] +[group_59140] +[group_59141] +[group_59142] +[group_59143] +[group_59144] +[group_59145] +[group_59146] +[group_59147] +[group_59148] +[group_59149] +[group_59150] +[group_59151] +[group_59152] +[group_59153] +[group_59154] +[group_59155] +[group_59156] +[group_59157] +[group_59158] +[group_59159] +[group_59160] +[group_59161] +[group_59162] +[group_59163] +[group_59164] +[group_59165] +[group_59166] +[group_59167] +[group_59168] +[group_59169] +[group_59170] +[group_59171] +[group_59172] +[group_59173] +[group_59174] +[group_59175] +[group_59176] +[group_59177] +[group_59178] +[group_59179] +[group_59180] +[group_59181] +[group_59182] +[group_59183] +[group_59184] +[group_59185] +[group_59186] +[group_59187] +[group_59188] +[group_59189] +[group_59190] +[group_59191] +[group_59192] +[group_59193] +[group_59194] +[group_59195] +[group_59196] +[group_59197] +[group_59198] +[group_59199] +[group_59200] +[group_59201] +[group_59202] +[group_59203] +[group_59204] +[group_59205] +[group_59206] +[group_59207] +[group_59208] +[group_59209] +[group_59210] +[group_59211] +[group_59212] +[group_59213] +[group_59214] +[group_59215] +[group_59216] +[group_59217] +[group_59218] +[group_59219] +[group_59220] +[group_59221] +[group_59222] +[group_59223] +[group_59224] +[group_59225] +[group_59226] +[group_59227] +[group_59228] +[group_59229] +[group_59230] +[group_59231] +[group_59232] +[group_59233] +[group_59234] +[group_59235] +[group_59236] +[group_59237] +[group_59238] +[group_59239] +[group_59240] +[group_59241] +[group_59242] +[group_59243] +[group_59244] +[group_59245] +[group_59246] +[group_59247] +[group_59248] +[group_59249] +[group_59250] +[group_59251] +[group_59252] +[group_59253] +[group_59254] +[group_59255] +[group_59256] +[group_59257] +[group_59258] +[group_59259] +[group_59260] +[group_59261] +[group_59262] +[group_59263] +[group_59264] +[group_59265] +[group_59266] +[group_59267] +[group_59268] +[group_59269] +[group_59270] +[group_59271] +[group_59272] +[group_59273] +[group_59274] +[group_59275] +[group_59276] +[group_59277] +[group_59278] +[group_59279] +[group_59280] +[group_59281] +[group_59282] +[group_59283] +[group_59284] +[group_59285] +[group_59286] +[group_59287] +[group_59288] +[group_59289] +[group_59290] +[group_59291] +[group_59292] +[group_59293] +[group_59294] +[group_59295] +[group_59296] +[group_59297] +[group_59298] +[group_59299] +[group_59300] +[group_59301] +[group_59302] +[group_59303] +[group_59304] +[group_59305] +[group_59306] +[group_59307] +[group_59308] +[group_59309] +[group_59310] +[group_59311] +[group_59312] +[group_59313] +[group_59314] +[group_59315] +[group_59316] +[group_59317] +[group_59318] +[group_59319] +[group_59320] +[group_59321] +[group_59322] +[group_59323] +[group_59324] +[group_59325] +[group_59326] +[group_59327] +[group_59328] +[group_59329] +[group_59330] +[group_59331] +[group_59332] +[group_59333] +[group_59334] +[group_59335] +[group_59336] +[group_59337] +[group_59338] +[group_59339] +[group_59340] +[group_59341] +[group_59342] +[group_59343] +[group_59344] +[group_59345] +[group_59346] +[group_59347] +[group_59348] +[group_59349] +[group_59350] +[group_59351] +[group_59352] +[group_59353] +[group_59354] +[group_59355] +[group_59356] +[group_59357] +[group_59358] +[group_59359] +[group_59360] +[group_59361] +[group_59362] +[group_59363] +[group_59364] +[group_59365] +[group_59366] +[group_59367] +[group_59368] +[group_59369] +[group_59370] +[group_59371] +[group_59372] +[group_59373] +[group_59374] +[group_59375] +[group_59376] +[group_59377] +[group_59378] +[group_59379] +[group_59380] +[group_59381] +[group_59382] +[group_59383] +[group_59384] +[group_59385] +[group_59386] +[group_59387] +[group_59388] +[group_59389] +[group_59390] +[group_59391] +[group_59392] +[group_59393] +[group_59394] +[group_59395] +[group_59396] +[group_59397] +[group_59398] +[group_59399] +[group_59400] +[group_59401] +[group_59402] +[group_59403] +[group_59404] +[group_59405] +[group_59406] +[group_59407] +[group_59408] +[group_59409] +[group_59410] +[group_59411] +[group_59412] +[group_59413] +[group_59414] +[group_59415] +[group_59416] +[group_59417] +[group_59418] +[group_59419] +[group_59420] +[group_59421] +[group_59422] +[group_59423] +[group_59424] +[group_59425] +[group_59426] +[group_59427] +[group_59428] +[group_59429] +[group_59430] +[group_59431] +[group_59432] +[group_59433] +[group_59434] +[group_59435] +[group_59436] +[group_59437] +[group_59438] +[group_59439] +[group_59440] +[group_59441] +[group_59442] +[group_59443] +[group_59444] +[group_59445] +[group_59446] +[group_59447] +[group_59448] +[group_59449] +[group_59450] +[group_59451] +[group_59452] +[group_59453] +[group_59454] +[group_59455] +[group_59456] +[group_59457] +[group_59458] +[group_59459] +[group_59460] +[group_59461] +[group_59462] +[group_59463] +[group_59464] +[group_59465] +[group_59466] +[group_59467] +[group_59468] +[group_59469] +[group_59470] +[group_59471] +[group_59472] +[group_59473] +[group_59474] +[group_59475] +[group_59476] +[group_59477] +[group_59478] +[group_59479] +[group_59480] +[group_59481] +[group_59482] +[group_59483] +[group_59484] +[group_59485] +[group_59486] +[group_59487] +[group_59488] +[group_59489] +[group_59490] +[group_59491] +[group_59492] +[group_59493] +[group_59494] +[group_59495] +[group_59496] +[group_59497] +[group_59498] +[group_59499] +[group_59500] +[group_59501] +[group_59502] +[group_59503] +[group_59504] +[group_59505] +[group_59506] +[group_59507] +[group_59508] +[group_59509] +[group_59510] +[group_59511] +[group_59512] +[group_59513] +[group_59514] +[group_59515] +[group_59516] +[group_59517] +[group_59518] +[group_59519] +[group_59520] +[group_59521] +[group_59522] +[group_59523] +[group_59524] +[group_59525] +[group_59526] +[group_59527] +[group_59528] +[group_59529] +[group_59530] +[group_59531] +[group_59532] +[group_59533] +[group_59534] +[group_59535] +[group_59536] +[group_59537] +[group_59538] +[group_59539] +[group_59540] +[group_59541] +[group_59542] +[group_59543] +[group_59544] +[group_59545] +[group_59546] +[group_59547] +[group_59548] +[group_59549] +[group_59550] +[group_59551] +[group_59552] +[group_59553] +[group_59554] +[group_59555] +[group_59556] +[group_59557] +[group_59558] +[group_59559] +[group_59560] +[group_59561] +[group_59562] +[group_59563] +[group_59564] +[group_59565] +[group_59566] +[group_59567] +[group_59568] +[group_59569] +[group_59570] +[group_59571] +[group_59572] +[group_59573] +[group_59574] +[group_59575] +[group_59576] +[group_59577] +[group_59578] +[group_59579] +[group_59580] +[group_59581] +[group_59582] +[group_59583] +[group_59584] +[group_59585] +[group_59586] +[group_59587] +[group_59588] +[group_59589] +[group_59590] +[group_59591] +[group_59592] +[group_59593] +[group_59594] +[group_59595] +[group_59596] +[group_59597] +[group_59598] +[group_59599] +[group_59600] +[group_59601] +[group_59602] +[group_59603] +[group_59604] +[group_59605] +[group_59606] +[group_59607] +[group_59608] +[group_59609] +[group_59610] +[group_59611] +[group_59612] +[group_59613] +[group_59614] +[group_59615] +[group_59616] +[group_59617] +[group_59618] +[group_59619] +[group_59620] +[group_59621] +[group_59622] +[group_59623] +[group_59624] +[group_59625] +[group_59626] +[group_59627] +[group_59628] +[group_59629] +[group_59630] +[group_59631] +[group_59632] +[group_59633] +[group_59634] +[group_59635] +[group_59636] +[group_59637] +[group_59638] +[group_59639] +[group_59640] +[group_59641] +[group_59642] +[group_59643] +[group_59644] +[group_59645] +[group_59646] +[group_59647] +[group_59648] +[group_59649] +[group_59650] +[group_59651] +[group_59652] +[group_59653] +[group_59654] +[group_59655] +[group_59656] +[group_59657] +[group_59658] +[group_59659] +[group_59660] +[group_59661] +[group_59662] +[group_59663] +[group_59664] +[group_59665] +[group_59666] +[group_59667] +[group_59668] +[group_59669] +[group_59670] +[group_59671] +[group_59672] +[group_59673] +[group_59674] +[group_59675] +[group_59676] +[group_59677] +[group_59678] +[group_59679] +[group_59680] +[group_59681] +[group_59682] +[group_59683] +[group_59684] +[group_59685] +[group_59686] +[group_59687] +[group_59688] +[group_59689] +[group_59690] +[group_59691] +[group_59692] +[group_59693] +[group_59694] +[group_59695] +[group_59696] +[group_59697] +[group_59698] +[group_59699] +[group_59700] +[group_59701] +[group_59702] +[group_59703] +[group_59704] +[group_59705] +[group_59706] +[group_59707] +[group_59708] +[group_59709] +[group_59710] +[group_59711] +[group_59712] +[group_59713] +[group_59714] +[group_59715] +[group_59716] +[group_59717] +[group_59718] +[group_59719] +[group_59720] +[group_59721] +[group_59722] +[group_59723] +[group_59724] +[group_59725] +[group_59726] +[group_59727] +[group_59728] +[group_59729] +[group_59730] +[group_59731] +[group_59732] +[group_59733] +[group_59734] +[group_59735] +[group_59736] +[group_59737] +[group_59738] +[group_59739] +[group_59740] +[group_59741] +[group_59742] +[group_59743] +[group_59744] +[group_59745] +[group_59746] +[group_59747] +[group_59748] +[group_59749] +[group_59750] +[group_59751] +[group_59752] +[group_59753] +[group_59754] +[group_59755] +[group_59756] +[group_59757] +[group_59758] +[group_59759] +[group_59760] +[group_59761] +[group_59762] +[group_59763] +[group_59764] +[group_59765] +[group_59766] +[group_59767] +[group_59768] +[group_59769] +[group_59770] +[group_59771] +[group_59772] +[group_59773] +[group_59774] +[group_59775] +[group_59776] +[group_59777] +[group_59778] +[group_59779] +[group_59780] +[group_59781] +[group_59782] +[group_59783] +[group_59784] +[group_59785] +[group_59786] +[group_59787] +[group_59788] +[group_59789] +[group_59790] +[group_59791] +[group_59792] +[group_59793] +[group_59794] +[group_59795] +[group_59796] +[group_59797] +[group_59798] +[group_59799] +[group_59800] +[group_59801] +[group_59802] +[group_59803] +[group_59804] +[group_59805] +[group_59806] +[group_59807] +[group_59808] +[group_59809] +[group_59810] +[group_59811] +[group_59812] +[group_59813] +[group_59814] +[group_59815] +[group_59816] +[group_59817] +[group_59818] +[group_59819] +[group_59820] +[group_59821] +[group_59822] +[group_59823] +[group_59824] +[group_59825] +[group_59826] +[group_59827] +[group_59828] +[group_59829] +[group_59830] +[group_59831] +[group_59832] +[group_59833] +[group_59834] +[group_59835] +[group_59836] +[group_59837] +[group_59838] +[group_59839] +[group_59840] +[group_59841] +[group_59842] +[group_59843] +[group_59844] +[group_59845] +[group_59846] +[group_59847] +[group_59848] +[group_59849] +[group_59850] +[group_59851] +[group_59852] +[group_59853] +[group_59854] +[group_59855] +[group_59856] +[group_59857] +[group_59858] +[group_59859] +[group_59860] +[group_59861] +[group_59862] +[group_59863] +[group_59864] +[group_59865] +[group_59866] +[group_59867] +[group_59868] +[group_59869] +[group_59870] +[group_59871] +[group_59872] +[group_59873] +[group_59874] +[group_59875] +[group_59876] +[group_59877] +[group_59878] +[group_59879] +[group_59880] +[group_59881] +[group_59882] +[group_59883] +[group_59884] +[group_59885] +[group_59886] +[group_59887] +[group_59888] +[group_59889] +[group_59890] +[group_59891] +[group_59892] +[group_59893] +[group_59894] +[group_59895] +[group_59896] +[group_59897] +[group_59898] +[group_59899] +[group_59900] +[group_59901] +[group_59902] +[group_59903] +[group_59904] +[group_59905] +[group_59906] +[group_59907] +[group_59908] +[group_59909] +[group_59910] +[group_59911] +[group_59912] +[group_59913] +[group_59914] +[group_59915] +[group_59916] +[group_59917] +[group_59918] +[group_59919] +[group_59920] +[group_59921] +[group_59922] +[group_59923] +[group_59924] +[group_59925] +[group_59926] +[group_59927] +[group_59928] +[group_59929] +[group_59930] +[group_59931] +[group_59932] +[group_59933] +[group_59934] +[group_59935] +[group_59936] +[group_59937] +[group_59938] +[group_59939] +[group_59940] +[group_59941] +[group_59942] +[group_59943] +[group_59944] +[group_59945] +[group_59946] +[group_59947] +[group_59948] +[group_59949] +[group_59950] +[group_59951] +[group_59952] +[group_59953] +[group_59954] +[group_59955] +[group_59956] +[group_59957] +[group_59958] +[group_59959] +[group_59960] +[group_59961] +[group_59962] +[group_59963] +[group_59964] +[group_59965] +[group_59966] +[group_59967] +[group_59968] +[group_59969] +[group_59970] +[group_59971] +[group_59972] +[group_59973] +[group_59974] +[group_59975] +[group_59976] +[group_59977] +[group_59978] +[group_59979] +[group_59980] +[group_59981] +[group_59982] +[group_59983] +[group_59984] +[group_59985] +[group_59986] +[group_59987] +[group_59988] +[group_59989] +[group_59990] +[group_59991] +[group_59992] +[group_59993] +[group_59994] +[group_59995] +[group_59996] +[group_59997] +[group_59998] +[group_59999] +[group_60000] +[group_60001] +[group_60002] +[group_60003] +[group_60004] +[group_60005] +[group_60006] +[group_60007] +[group_60008] +[group_60009] +[group_60010] +[group_60011] +[group_60012] +[group_60013] +[group_60014] +[group_60015] +[group_60016] +[group_60017] +[group_60018] +[group_60019] +[group_60020] +[group_60021] +[group_60022] +[group_60023] +[group_60024] +[group_60025] +[group_60026] +[group_60027] +[group_60028] +[group_60029] +[group_60030] +[group_60031] +[group_60032] +[group_60033] +[group_60034] +[group_60035] +[group_60036] +[group_60037] +[group_60038] +[group_60039] +[group_60040] +[group_60041] +[group_60042] +[group_60043] +[group_60044] +[group_60045] +[group_60046] +[group_60047] +[group_60048] +[group_60049] +[group_60050] +[group_60051] +[group_60052] +[group_60053] +[group_60054] +[group_60055] +[group_60056] +[group_60057] +[group_60058] +[group_60059] +[group_60060] +[group_60061] +[group_60062] +[group_60063] +[group_60064] +[group_60065] +[group_60066] +[group_60067] +[group_60068] +[group_60069] +[group_60070] +[group_60071] +[group_60072] +[group_60073] +[group_60074] +[group_60075] +[group_60076] +[group_60077] +[group_60078] +[group_60079] +[group_60080] +[group_60081] +[group_60082] +[group_60083] +[group_60084] +[group_60085] +[group_60086] +[group_60087] +[group_60088] +[group_60089] +[group_60090] +[group_60091] +[group_60092] +[group_60093] +[group_60094] +[group_60095] +[group_60096] +[group_60097] +[group_60098] +[group_60099] +[group_60100] +[group_60101] +[group_60102] +[group_60103] +[group_60104] +[group_60105] +[group_60106] +[group_60107] +[group_60108] +[group_60109] +[group_60110] +[group_60111] +[group_60112] +[group_60113] +[group_60114] +[group_60115] +[group_60116] +[group_60117] +[group_60118] +[group_60119] +[group_60120] +[group_60121] +[group_60122] +[group_60123] +[group_60124] +[group_60125] +[group_60126] +[group_60127] +[group_60128] +[group_60129] +[group_60130] +[group_60131] +[group_60132] +[group_60133] +[group_60134] +[group_60135] +[group_60136] +[group_60137] +[group_60138] +[group_60139] +[group_60140] +[group_60141] +[group_60142] +[group_60143] +[group_60144] +[group_60145] +[group_60146] +[group_60147] +[group_60148] +[group_60149] +[group_60150] +[group_60151] +[group_60152] +[group_60153] +[group_60154] +[group_60155] +[group_60156] +[group_60157] +[group_60158] +[group_60159] +[group_60160] +[group_60161] +[group_60162] +[group_60163] +[group_60164] +[group_60165] +[group_60166] +[group_60167] +[group_60168] +[group_60169] +[group_60170] +[group_60171] +[group_60172] +[group_60173] +[group_60174] +[group_60175] +[group_60176] +[group_60177] +[group_60178] +[group_60179] +[group_60180] +[group_60181] +[group_60182] +[group_60183] +[group_60184] +[group_60185] +[group_60186] +[group_60187] +[group_60188] +[group_60189] +[group_60190] +[group_60191] +[group_60192] +[group_60193] +[group_60194] +[group_60195] +[group_60196] +[group_60197] +[group_60198] +[group_60199] +[group_60200] +[group_60201] +[group_60202] +[group_60203] +[group_60204] +[group_60205] +[group_60206] +[group_60207] +[group_60208] +[group_60209] +[group_60210] +[group_60211] +[group_60212] +[group_60213] +[group_60214] +[group_60215] +[group_60216] +[group_60217] +[group_60218] +[group_60219] +[group_60220] +[group_60221] +[group_60222] +[group_60223] +[group_60224] +[group_60225] +[group_60226] +[group_60227] +[group_60228] +[group_60229] +[group_60230] +[group_60231] +[group_60232] +[group_60233] +[group_60234] +[group_60235] +[group_60236] +[group_60237] +[group_60238] +[group_60239] +[group_60240] +[group_60241] +[group_60242] +[group_60243] +[group_60244] +[group_60245] +[group_60246] +[group_60247] +[group_60248] +[group_60249] +[group_60250] +[group_60251] +[group_60252] +[group_60253] +[group_60254] +[group_60255] +[group_60256] +[group_60257] +[group_60258] +[group_60259] +[group_60260] +[group_60261] +[group_60262] +[group_60263] +[group_60264] +[group_60265] +[group_60266] +[group_60267] +[group_60268] +[group_60269] +[group_60270] +[group_60271] +[group_60272] +[group_60273] +[group_60274] +[group_60275] +[group_60276] +[group_60277] +[group_60278] +[group_60279] +[group_60280] +[group_60281] +[group_60282] +[group_60283] +[group_60284] +[group_60285] +[group_60286] +[group_60287] +[group_60288] +[group_60289] +[group_60290] +[group_60291] +[group_60292] +[group_60293] +[group_60294] +[group_60295] +[group_60296] +[group_60297] +[group_60298] +[group_60299] +[group_60300] +[group_60301] +[group_60302] +[group_60303] +[group_60304] +[group_60305] +[group_60306] +[group_60307] +[group_60308] +[group_60309] +[group_60310] +[group_60311] +[group_60312] +[group_60313] +[group_60314] +[group_60315] +[group_60316] +[group_60317] +[group_60318] +[group_60319] +[group_60320] +[group_60321] +[group_60322] +[group_60323] +[group_60324] +[group_60325] +[group_60326] +[group_60327] +[group_60328] +[group_60329] +[group_60330] +[group_60331] +[group_60332] +[group_60333] +[group_60334] +[group_60335] +[group_60336] +[group_60337] +[group_60338] +[group_60339] +[group_60340] +[group_60341] +[group_60342] +[group_60343] +[group_60344] +[group_60345] +[group_60346] +[group_60347] +[group_60348] +[group_60349] +[group_60350] +[group_60351] +[group_60352] +[group_60353] +[group_60354] +[group_60355] +[group_60356] +[group_60357] +[group_60358] +[group_60359] +[group_60360] +[group_60361] +[group_60362] +[group_60363] +[group_60364] +[group_60365] +[group_60366] +[group_60367] +[group_60368] +[group_60369] +[group_60370] +[group_60371] +[group_60372] +[group_60373] +[group_60374] +[group_60375] +[group_60376] +[group_60377] +[group_60378] +[group_60379] +[group_60380] +[group_60381] +[group_60382] +[group_60383] +[group_60384] +[group_60385] +[group_60386] +[group_60387] +[group_60388] +[group_60389] +[group_60390] +[group_60391] +[group_60392] +[group_60393] +[group_60394] +[group_60395] +[group_60396] +[group_60397] +[group_60398] +[group_60399] +[group_60400] +[group_60401] +[group_60402] +[group_60403] +[group_60404] +[group_60405] +[group_60406] +[group_60407] +[group_60408] +[group_60409] +[group_60410] +[group_60411] +[group_60412] +[group_60413] +[group_60414] +[group_60415] +[group_60416] +[group_60417] +[group_60418] +[group_60419] +[group_60420] +[group_60421] +[group_60422] +[group_60423] +[group_60424] +[group_60425] +[group_60426] +[group_60427] +[group_60428] +[group_60429] +[group_60430] +[group_60431] +[group_60432] +[group_60433] +[group_60434] +[group_60435] +[group_60436] +[group_60437] +[group_60438] +[group_60439] +[group_60440] +[group_60441] +[group_60442] +[group_60443] +[group_60444] +[group_60445] +[group_60446] +[group_60447] +[group_60448] +[group_60449] +[group_60450] +[group_60451] +[group_60452] +[group_60453] +[group_60454] +[group_60455] +[group_60456] +[group_60457] +[group_60458] +[group_60459] +[group_60460] +[group_60461] +[group_60462] +[group_60463] +[group_60464] +[group_60465] +[group_60466] +[group_60467] +[group_60468] +[group_60469] +[group_60470] +[group_60471] +[group_60472] +[group_60473] +[group_60474] +[group_60475] +[group_60476] +[group_60477] +[group_60478] +[group_60479] +[group_60480] +[group_60481] +[group_60482] +[group_60483] +[group_60484] +[group_60485] +[group_60486] +[group_60487] +[group_60488] +[group_60489] +[group_60490] +[group_60491] +[group_60492] +[group_60493] +[group_60494] +[group_60495] +[group_60496] +[group_60497] +[group_60498] +[group_60499] +[group_60500] +[group_60501] +[group_60502] +[group_60503] +[group_60504] +[group_60505] +[group_60506] +[group_60507] +[group_60508] +[group_60509] +[group_60510] +[group_60511] +[group_60512] +[group_60513] +[group_60514] +[group_60515] +[group_60516] +[group_60517] +[group_60518] +[group_60519] +[group_60520] +[group_60521] +[group_60522] +[group_60523] +[group_60524] +[group_60525] +[group_60526] +[group_60527] +[group_60528] +[group_60529] +[group_60530] +[group_60531] +[group_60532] +[group_60533] +[group_60534] +[group_60535] +[group_60536] +[group_60537] +[group_60538] +[group_60539] +[group_60540] +[group_60541] +[group_60542] +[group_60543] +[group_60544] +[group_60545] +[group_60546] +[group_60547] +[group_60548] +[group_60549] +[group_60550] +[group_60551] +[group_60552] +[group_60553] +[group_60554] +[group_60555] +[group_60556] +[group_60557] +[group_60558] +[group_60559] +[group_60560] +[group_60561] +[group_60562] +[group_60563] +[group_60564] +[group_60565] +[group_60566] +[group_60567] +[group_60568] +[group_60569] +[group_60570] +[group_60571] +[group_60572] +[group_60573] +[group_60574] +[group_60575] +[group_60576] +[group_60577] +[group_60578] +[group_60579] +[group_60580] +[group_60581] +[group_60582] +[group_60583] +[group_60584] +[group_60585] +[group_60586] +[group_60587] +[group_60588] +[group_60589] +[group_60590] +[group_60591] +[group_60592] +[group_60593] +[group_60594] +[group_60595] +[group_60596] +[group_60597] +[group_60598] +[group_60599] +[group_60600] +[group_60601] +[group_60602] +[group_60603] +[group_60604] +[group_60605] +[group_60606] +[group_60607] +[group_60608] +[group_60609] +[group_60610] +[group_60611] +[group_60612] +[group_60613] +[group_60614] +[group_60615] +[group_60616] +[group_60617] +[group_60618] +[group_60619] +[group_60620] +[group_60621] +[group_60622] +[group_60623] +[group_60624] +[group_60625] +[group_60626] +[group_60627] +[group_60628] +[group_60629] +[group_60630] +[group_60631] +[group_60632] +[group_60633] +[group_60634] +[group_60635] +[group_60636] +[group_60637] +[group_60638] +[group_60639] +[group_60640] +[group_60641] +[group_60642] +[group_60643] +[group_60644] +[group_60645] +[group_60646] +[group_60647] +[group_60648] +[group_60649] +[group_60650] +[group_60651] +[group_60652] +[group_60653] +[group_60654] +[group_60655] +[group_60656] +[group_60657] +[group_60658] +[group_60659] +[group_60660] +[group_60661] +[group_60662] +[group_60663] +[group_60664] +[group_60665] +[group_60666] +[group_60667] +[group_60668] +[group_60669] +[group_60670] +[group_60671] +[group_60672] +[group_60673] +[group_60674] +[group_60675] +[group_60676] +[group_60677] +[group_60678] +[group_60679] +[group_60680] +[group_60681] +[group_60682] +[group_60683] +[group_60684] +[group_60685] +[group_60686] +[group_60687] +[group_60688] +[group_60689] +[group_60690] +[group_60691] +[group_60692] +[group_60693] +[group_60694] +[group_60695] +[group_60696] +[group_60697] +[group_60698] +[group_60699] +[group_60700] +[group_60701] +[group_60702] +[group_60703] +[group_60704] +[group_60705] +[group_60706] +[group_60707] +[group_60708] +[group_60709] +[group_60710] +[group_60711] +[group_60712] +[group_60713] +[group_60714] +[group_60715] +[group_60716] +[group_60717] +[group_60718] +[group_60719] +[group_60720] +[group_60721] +[group_60722] +[group_60723] +[group_60724] +[group_60725] +[group_60726] +[group_60727] +[group_60728] +[group_60729] +[group_60730] +[group_60731] +[group_60732] +[group_60733] +[group_60734] +[group_60735] +[group_60736] +[group_60737] +[group_60738] +[group_60739] +[group_60740] +[group_60741] +[group_60742] +[group_60743] +[group_60744] +[group_60745] +[group_60746] +[group_60747] +[group_60748] +[group_60749] +[group_60750] +[group_60751] +[group_60752] +[group_60753] +[group_60754] +[group_60755] +[group_60756] +[group_60757] +[group_60758] +[group_60759] +[group_60760] +[group_60761] +[group_60762] +[group_60763] +[group_60764] +[group_60765] +[group_60766] +[group_60767] +[group_60768] +[group_60769] +[group_60770] +[group_60771] +[group_60772] +[group_60773] +[group_60774] +[group_60775] +[group_60776] +[group_60777] +[group_60778] +[group_60779] +[group_60780] +[group_60781] +[group_60782] +[group_60783] +[group_60784] +[group_60785] +[group_60786] +[group_60787] +[group_60788] +[group_60789] +[group_60790] +[group_60791] +[group_60792] +[group_60793] +[group_60794] +[group_60795] +[group_60796] +[group_60797] +[group_60798] +[group_60799] +[group_60800] +[group_60801] +[group_60802] +[group_60803] +[group_60804] +[group_60805] +[group_60806] +[group_60807] +[group_60808] +[group_60809] +[group_60810] +[group_60811] +[group_60812] +[group_60813] +[group_60814] +[group_60815] +[group_60816] +[group_60817] +[group_60818] +[group_60819] +[group_60820] +[group_60821] +[group_60822] +[group_60823] +[group_60824] +[group_60825] +[group_60826] +[group_60827] +[group_60828] +[group_60829] +[group_60830] +[group_60831] +[group_60832] +[group_60833] +[group_60834] +[group_60835] +[group_60836] +[group_60837] +[group_60838] +[group_60839] +[group_60840] +[group_60841] +[group_60842] +[group_60843] +[group_60844] +[group_60845] +[group_60846] +[group_60847] +[group_60848] +[group_60849] +[group_60850] +[group_60851] +[group_60852] +[group_60853] +[group_60854] +[group_60855] +[group_60856] +[group_60857] +[group_60858] +[group_60859] +[group_60860] +[group_60861] +[group_60862] +[group_60863] +[group_60864] +[group_60865] +[group_60866] +[group_60867] +[group_60868] +[group_60869] +[group_60870] +[group_60871] +[group_60872] +[group_60873] +[group_60874] +[group_60875] +[group_60876] +[group_60877] +[group_60878] +[group_60879] +[group_60880] +[group_60881] +[group_60882] +[group_60883] +[group_60884] +[group_60885] +[group_60886] +[group_60887] +[group_60888] +[group_60889] +[group_60890] +[group_60891] +[group_60892] +[group_60893] +[group_60894] +[group_60895] +[group_60896] +[group_60897] +[group_60898] +[group_60899] +[group_60900] +[group_60901] +[group_60902] +[group_60903] +[group_60904] +[group_60905] +[group_60906] +[group_60907] +[group_60908] +[group_60909] +[group_60910] +[group_60911] +[group_60912] +[group_60913] +[group_60914] +[group_60915] +[group_60916] +[group_60917] +[group_60918] +[group_60919] +[group_60920] +[group_60921] +[group_60922] +[group_60923] +[group_60924] +[group_60925] +[group_60926] +[group_60927] +[group_60928] +[group_60929] +[group_60930] +[group_60931] +[group_60932] +[group_60933] +[group_60934] +[group_60935] +[group_60936] +[group_60937] +[group_60938] +[group_60939] +[group_60940] +[group_60941] +[group_60942] +[group_60943] +[group_60944] +[group_60945] +[group_60946] +[group_60947] +[group_60948] +[group_60949] +[group_60950] +[group_60951] +[group_60952] +[group_60953] +[group_60954] +[group_60955] +[group_60956] +[group_60957] +[group_60958] +[group_60959] +[group_60960] +[group_60961] +[group_60962] +[group_60963] +[group_60964] +[group_60965] +[group_60966] +[group_60967] +[group_60968] +[group_60969] +[group_60970] +[group_60971] +[group_60972] +[group_60973] +[group_60974] +[group_60975] +[group_60976] +[group_60977] +[group_60978] +[group_60979] +[group_60980] +[group_60981] +[group_60982] +[group_60983] +[group_60984] +[group_60985] +[group_60986] +[group_60987] +[group_60988] +[group_60989] +[group_60990] +[group_60991] +[group_60992] +[group_60993] +[group_60994] +[group_60995] +[group_60996] +[group_60997] +[group_60998] +[group_60999] +[group_61000] +[group_61001] +[group_61002] +[group_61003] +[group_61004] +[group_61005] +[group_61006] +[group_61007] +[group_61008] +[group_61009] +[group_61010] +[group_61011] +[group_61012] +[group_61013] +[group_61014] +[group_61015] +[group_61016] +[group_61017] +[group_61018] +[group_61019] +[group_61020] +[group_61021] +[group_61022] +[group_61023] +[group_61024] +[group_61025] +[group_61026] +[group_61027] +[group_61028] +[group_61029] +[group_61030] +[group_61031] +[group_61032] +[group_61033] +[group_61034] +[group_61035] +[group_61036] +[group_61037] +[group_61038] +[group_61039] +[group_61040] +[group_61041] +[group_61042] +[group_61043] +[group_61044] +[group_61045] +[group_61046] +[group_61047] +[group_61048] +[group_61049] +[group_61050] +[group_61051] +[group_61052] +[group_61053] +[group_61054] +[group_61055] +[group_61056] +[group_61057] +[group_61058] +[group_61059] +[group_61060] +[group_61061] +[group_61062] +[group_61063] +[group_61064] +[group_61065] +[group_61066] +[group_61067] +[group_61068] +[group_61069] +[group_61070] +[group_61071] +[group_61072] +[group_61073] +[group_61074] +[group_61075] +[group_61076] +[group_61077] +[group_61078] +[group_61079] +[group_61080] +[group_61081] +[group_61082] +[group_61083] +[group_61084] +[group_61085] +[group_61086] +[group_61087] +[group_61088] +[group_61089] +[group_61090] +[group_61091] +[group_61092] +[group_61093] +[group_61094] +[group_61095] +[group_61096] +[group_61097] +[group_61098] +[group_61099] +[group_61100] +[group_61101] +[group_61102] +[group_61103] +[group_61104] +[group_61105] +[group_61106] +[group_61107] +[group_61108] +[group_61109] +[group_61110] +[group_61111] +[group_61112] +[group_61113] +[group_61114] +[group_61115] +[group_61116] +[group_61117] +[group_61118] +[group_61119] +[group_61120] +[group_61121] +[group_61122] +[group_61123] +[group_61124] +[group_61125] +[group_61126] +[group_61127] +[group_61128] +[group_61129] +[group_61130] +[group_61131] +[group_61132] +[group_61133] +[group_61134] +[group_61135] +[group_61136] +[group_61137] +[group_61138] +[group_61139] +[group_61140] +[group_61141] +[group_61142] +[group_61143] +[group_61144] +[group_61145] +[group_61146] +[group_61147] +[group_61148] +[group_61149] +[group_61150] +[group_61151] +[group_61152] +[group_61153] +[group_61154] +[group_61155] +[group_61156] +[group_61157] +[group_61158] +[group_61159] +[group_61160] +[group_61161] +[group_61162] +[group_61163] +[group_61164] +[group_61165] +[group_61166] +[group_61167] +[group_61168] +[group_61169] +[group_61170] +[group_61171] +[group_61172] +[group_61173] +[group_61174] +[group_61175] +[group_61176] +[group_61177] +[group_61178] +[group_61179] +[group_61180] +[group_61181] +[group_61182] +[group_61183] +[group_61184] +[group_61185] +[group_61186] +[group_61187] +[group_61188] +[group_61189] +[group_61190] +[group_61191] +[group_61192] +[group_61193] +[group_61194] +[group_61195] +[group_61196] +[group_61197] +[group_61198] +[group_61199] +[group_61200] +[group_61201] +[group_61202] +[group_61203] +[group_61204] +[group_61205] +[group_61206] +[group_61207] +[group_61208] +[group_61209] +[group_61210] +[group_61211] +[group_61212] +[group_61213] +[group_61214] +[group_61215] +[group_61216] +[group_61217] +[group_61218] +[group_61219] +[group_61220] +[group_61221] +[group_61222] +[group_61223] +[group_61224] +[group_61225] +[group_61226] +[group_61227] +[group_61228] +[group_61229] +[group_61230] +[group_61231] +[group_61232] +[group_61233] +[group_61234] +[group_61235] +[group_61236] +[group_61237] +[group_61238] +[group_61239] +[group_61240] +[group_61241] +[group_61242] +[group_61243] +[group_61244] +[group_61245] +[group_61246] +[group_61247] +[group_61248] +[group_61249] +[group_61250] +[group_61251] +[group_61252] +[group_61253] +[group_61254] +[group_61255] +[group_61256] +[group_61257] +[group_61258] +[group_61259] +[group_61260] +[group_61261] +[group_61262] +[group_61263] +[group_61264] +[group_61265] +[group_61266] +[group_61267] +[group_61268] +[group_61269] +[group_61270] +[group_61271] +[group_61272] +[group_61273] +[group_61274] +[group_61275] +[group_61276] +[group_61277] +[group_61278] +[group_61279] +[group_61280] +[group_61281] +[group_61282] +[group_61283] +[group_61284] +[group_61285] +[group_61286] +[group_61287] +[group_61288] +[group_61289] +[group_61290] +[group_61291] +[group_61292] +[group_61293] +[group_61294] +[group_61295] +[group_61296] +[group_61297] +[group_61298] +[group_61299] +[group_61300] +[group_61301] +[group_61302] +[group_61303] +[group_61304] +[group_61305] +[group_61306] +[group_61307] +[group_61308] +[group_61309] +[group_61310] +[group_61311] +[group_61312] +[group_61313] +[group_61314] +[group_61315] +[group_61316] +[group_61317] +[group_61318] +[group_61319] +[group_61320] +[group_61321] +[group_61322] +[group_61323] +[group_61324] +[group_61325] +[group_61326] +[group_61327] +[group_61328] +[group_61329] +[group_61330] +[group_61331] +[group_61332] +[group_61333] +[group_61334] +[group_61335] +[group_61336] +[group_61337] +[group_61338] +[group_61339] +[group_61340] +[group_61341] +[group_61342] +[group_61343] +[group_61344] +[group_61345] +[group_61346] +[group_61347] +[group_61348] +[group_61349] +[group_61350] +[group_61351] +[group_61352] +[group_61353] +[group_61354] +[group_61355] +[group_61356] +[group_61357] +[group_61358] +[group_61359] +[group_61360] +[group_61361] +[group_61362] +[group_61363] +[group_61364] +[group_61365] +[group_61366] +[group_61367] +[group_61368] +[group_61369] +[group_61370] +[group_61371] +[group_61372] +[group_61373] +[group_61374] +[group_61375] +[group_61376] +[group_61377] +[group_61378] +[group_61379] +[group_61380] +[group_61381] +[group_61382] +[group_61383] +[group_61384] +[group_61385] +[group_61386] +[group_61387] +[group_61388] +[group_61389] +[group_61390] +[group_61391] +[group_61392] +[group_61393] +[group_61394] +[group_61395] +[group_61396] +[group_61397] +[group_61398] +[group_61399] +[group_61400] +[group_61401] +[group_61402] +[group_61403] +[group_61404] +[group_61405] +[group_61406] +[group_61407] +[group_61408] +[group_61409] +[group_61410] +[group_61411] +[group_61412] +[group_61413] +[group_61414] +[group_61415] +[group_61416] +[group_61417] +[group_61418] +[group_61419] +[group_61420] +[group_61421] +[group_61422] +[group_61423] +[group_61424] +[group_61425] +[group_61426] +[group_61427] +[group_61428] +[group_61429] +[group_61430] +[group_61431] +[group_61432] +[group_61433] +[group_61434] +[group_61435] +[group_61436] +[group_61437] +[group_61438] +[group_61439] +[group_61440] +[group_61441] +[group_61442] +[group_61443] +[group_61444] +[group_61445] +[group_61446] +[group_61447] +[group_61448] +[group_61449] +[group_61450] +[group_61451] +[group_61452] +[group_61453] +[group_61454] +[group_61455] +[group_61456] +[group_61457] +[group_61458] +[group_61459] +[group_61460] +[group_61461] +[group_61462] +[group_61463] +[group_61464] +[group_61465] +[group_61466] +[group_61467] +[group_61468] +[group_61469] +[group_61470] +[group_61471] +[group_61472] +[group_61473] +[group_61474] +[group_61475] +[group_61476] +[group_61477] +[group_61478] +[group_61479] +[group_61480] +[group_61481] +[group_61482] +[group_61483] +[group_61484] +[group_61485] +[group_61486] +[group_61487] +[group_61488] +[group_61489] +[group_61490] +[group_61491] +[group_61492] +[group_61493] +[group_61494] +[group_61495] +[group_61496] +[group_61497] +[group_61498] +[group_61499] +[group_61500] +[group_61501] +[group_61502] +[group_61503] +[group_61504] +[group_61505] +[group_61506] +[group_61507] +[group_61508] +[group_61509] +[group_61510] +[group_61511] +[group_61512] +[group_61513] +[group_61514] +[group_61515] +[group_61516] +[group_61517] +[group_61518] +[group_61519] +[group_61520] +[group_61521] +[group_61522] +[group_61523] +[group_61524] +[group_61525] +[group_61526] +[group_61527] +[group_61528] +[group_61529] +[group_61530] +[group_61531] +[group_61532] +[group_61533] +[group_61534] +[group_61535] +[group_61536] +[group_61537] +[group_61538] +[group_61539] +[group_61540] +[group_61541] +[group_61542] +[group_61543] +[group_61544] +[group_61545] +[group_61546] +[group_61547] +[group_61548] +[group_61549] +[group_61550] +[group_61551] +[group_61552] +[group_61553] +[group_61554] +[group_61555] +[group_61556] +[group_61557] +[group_61558] +[group_61559] +[group_61560] +[group_61561] +[group_61562] +[group_61563] +[group_61564] +[group_61565] +[group_61566] +[group_61567] +[group_61568] +[group_61569] +[group_61570] +[group_61571] +[group_61572] +[group_61573] +[group_61574] +[group_61575] +[group_61576] +[group_61577] +[group_61578] +[group_61579] +[group_61580] +[group_61581] +[group_61582] +[group_61583] +[group_61584] +[group_61585] +[group_61586] +[group_61587] +[group_61588] +[group_61589] +[group_61590] +[group_61591] +[group_61592] +[group_61593] +[group_61594] +[group_61595] +[group_61596] +[group_61597] +[group_61598] +[group_61599] +[group_61600] +[group_61601] +[group_61602] +[group_61603] +[group_61604] +[group_61605] +[group_61606] +[group_61607] +[group_61608] +[group_61609] +[group_61610] +[group_61611] +[group_61612] +[group_61613] +[group_61614] +[group_61615] +[group_61616] +[group_61617] +[group_61618] +[group_61619] +[group_61620] +[group_61621] +[group_61622] +[group_61623] +[group_61624] +[group_61625] +[group_61626] +[group_61627] +[group_61628] +[group_61629] +[group_61630] +[group_61631] +[group_61632] +[group_61633] +[group_61634] +[group_61635] +[group_61636] +[group_61637] +[group_61638] +[group_61639] +[group_61640] +[group_61641] +[group_61642] +[group_61643] +[group_61644] +[group_61645] +[group_61646] +[group_61647] +[group_61648] +[group_61649] +[group_61650] +[group_61651] +[group_61652] +[group_61653] +[group_61654] +[group_61655] +[group_61656] +[group_61657] +[group_61658] +[group_61659] +[group_61660] +[group_61661] +[group_61662] +[group_61663] +[group_61664] +[group_61665] +[group_61666] +[group_61667] +[group_61668] +[group_61669] +[group_61670] +[group_61671] +[group_61672] +[group_61673] +[group_61674] +[group_61675] +[group_61676] +[group_61677] +[group_61678] +[group_61679] +[group_61680] +[group_61681] +[group_61682] +[group_61683] +[group_61684] +[group_61685] +[group_61686] +[group_61687] +[group_61688] +[group_61689] +[group_61690] +[group_61691] +[group_61692] +[group_61693] +[group_61694] +[group_61695] +[group_61696] +[group_61697] +[group_61698] +[group_61699] +[group_61700] +[group_61701] +[group_61702] +[group_61703] +[group_61704] +[group_61705] +[group_61706] +[group_61707] +[group_61708] +[group_61709] +[group_61710] +[group_61711] +[group_61712] +[group_61713] +[group_61714] +[group_61715] +[group_61716] +[group_61717] +[group_61718] +[group_61719] +[group_61720] +[group_61721] +[group_61722] +[group_61723] +[group_61724] +[group_61725] +[group_61726] +[group_61727] +[group_61728] +[group_61729] +[group_61730] +[group_61731] +[group_61732] +[group_61733] +[group_61734] +[group_61735] +[group_61736] +[group_61737] +[group_61738] +[group_61739] +[group_61740] +[group_61741] +[group_61742] +[group_61743] +[group_61744] +[group_61745] +[group_61746] +[group_61747] +[group_61748] +[group_61749] +[group_61750] +[group_61751] +[group_61752] +[group_61753] +[group_61754] +[group_61755] +[group_61756] +[group_61757] +[group_61758] +[group_61759] +[group_61760] +[group_61761] +[group_61762] +[group_61763] +[group_61764] +[group_61765] +[group_61766] +[group_61767] +[group_61768] +[group_61769] +[group_61770] +[group_61771] +[group_61772] +[group_61773] +[group_61774] +[group_61775] +[group_61776] +[group_61777] +[group_61778] +[group_61779] +[group_61780] +[group_61781] +[group_61782] +[group_61783] +[group_61784] +[group_61785] +[group_61786] +[group_61787] +[group_61788] +[group_61789] +[group_61790] +[group_61791] +[group_61792] +[group_61793] +[group_61794] +[group_61795] +[group_61796] +[group_61797] +[group_61798] +[group_61799] +[group_61800] +[group_61801] +[group_61802] +[group_61803] +[group_61804] +[group_61805] +[group_61806] +[group_61807] +[group_61808] +[group_61809] +[group_61810] +[group_61811] +[group_61812] +[group_61813] +[group_61814] +[group_61815] +[group_61816] +[group_61817] +[group_61818] +[group_61819] +[group_61820] +[group_61821] +[group_61822] +[group_61823] +[group_61824] +[group_61825] +[group_61826] +[group_61827] +[group_61828] +[group_61829] +[group_61830] +[group_61831] +[group_61832] +[group_61833] +[group_61834] +[group_61835] +[group_61836] +[group_61837] +[group_61838] +[group_61839] +[group_61840] +[group_61841] +[group_61842] +[group_61843] +[group_61844] +[group_61845] +[group_61846] +[group_61847] +[group_61848] +[group_61849] +[group_61850] +[group_61851] +[group_61852] +[group_61853] +[group_61854] +[group_61855] +[group_61856] +[group_61857] +[group_61858] +[group_61859] +[group_61860] +[group_61861] +[group_61862] +[group_61863] +[group_61864] +[group_61865] +[group_61866] +[group_61867] +[group_61868] +[group_61869] +[group_61870] +[group_61871] +[group_61872] +[group_61873] +[group_61874] +[group_61875] +[group_61876] +[group_61877] +[group_61878] +[group_61879] +[group_61880] +[group_61881] +[group_61882] +[group_61883] +[group_61884] +[group_61885] +[group_61886] +[group_61887] +[group_61888] +[group_61889] +[group_61890] +[group_61891] +[group_61892] +[group_61893] +[group_61894] +[group_61895] +[group_61896] +[group_61897] +[group_61898] +[group_61899] +[group_61900] +[group_61901] +[group_61902] +[group_61903] +[group_61904] +[group_61905] +[group_61906] +[group_61907] +[group_61908] +[group_61909] +[group_61910] +[group_61911] +[group_61912] +[group_61913] +[group_61914] +[group_61915] +[group_61916] +[group_61917] +[group_61918] +[group_61919] +[group_61920] +[group_61921] +[group_61922] +[group_61923] +[group_61924] +[group_61925] +[group_61926] +[group_61927] +[group_61928] +[group_61929] +[group_61930] +[group_61931] +[group_61932] +[group_61933] +[group_61934] +[group_61935] +[group_61936] +[group_61937] +[group_61938] +[group_61939] +[group_61940] +[group_61941] +[group_61942] +[group_61943] +[group_61944] +[group_61945] +[group_61946] +[group_61947] +[group_61948] +[group_61949] +[group_61950] +[group_61951] +[group_61952] +[group_61953] +[group_61954] +[group_61955] +[group_61956] +[group_61957] +[group_61958] +[group_61959] +[group_61960] +[group_61961] +[group_61962] +[group_61963] +[group_61964] +[group_61965] +[group_61966] +[group_61967] +[group_61968] +[group_61969] +[group_61970] +[group_61971] +[group_61972] +[group_61973] +[group_61974] +[group_61975] +[group_61976] +[group_61977] +[group_61978] +[group_61979] +[group_61980] +[group_61981] +[group_61982] +[group_61983] +[group_61984] +[group_61985] +[group_61986] +[group_61987] +[group_61988] +[group_61989] +[group_61990] +[group_61991] +[group_61992] +[group_61993] +[group_61994] +[group_61995] +[group_61996] +[group_61997] +[group_61998] +[group_61999] +[group_62000] +[group_62001] +[group_62002] +[group_62003] +[group_62004] +[group_62005] +[group_62006] +[group_62007] +[group_62008] +[group_62009] +[group_62010] +[group_62011] +[group_62012] +[group_62013] +[group_62014] +[group_62015] +[group_62016] +[group_62017] +[group_62018] +[group_62019] +[group_62020] +[group_62021] +[group_62022] +[group_62023] +[group_62024] +[group_62025] +[group_62026] +[group_62027] +[group_62028] +[group_62029] +[group_62030] +[group_62031] +[group_62032] +[group_62033] +[group_62034] +[group_62035] +[group_62036] +[group_62037] +[group_62038] +[group_62039] +[group_62040] +[group_62041] +[group_62042] +[group_62043] +[group_62044] +[group_62045] +[group_62046] +[group_62047] +[group_62048] +[group_62049] +[group_62050] +[group_62051] +[group_62052] +[group_62053] +[group_62054] +[group_62055] +[group_62056] +[group_62057] +[group_62058] +[group_62059] +[group_62060] +[group_62061] +[group_62062] +[group_62063] +[group_62064] +[group_62065] +[group_62066] +[group_62067] +[group_62068] +[group_62069] +[group_62070] +[group_62071] +[group_62072] +[group_62073] +[group_62074] +[group_62075] +[group_62076] +[group_62077] +[group_62078] +[group_62079] +[group_62080] +[group_62081] +[group_62082] +[group_62083] +[group_62084] +[group_62085] +[group_62086] +[group_62087] +[group_62088] +[group_62089] +[group_62090] +[group_62091] +[group_62092] +[group_62093] +[group_62094] +[group_62095] +[group_62096] +[group_62097] +[group_62098] +[group_62099] +[group_62100] +[group_62101] +[group_62102] +[group_62103] +[group_62104] +[group_62105] +[group_62106] +[group_62107] +[group_62108] +[group_62109] +[group_62110] +[group_62111] +[group_62112] +[group_62113] +[group_62114] +[group_62115] +[group_62116] +[group_62117] +[group_62118] +[group_62119] +[group_62120] +[group_62121] +[group_62122] +[group_62123] +[group_62124] +[group_62125] +[group_62126] +[group_62127] +[group_62128] +[group_62129] +[group_62130] +[group_62131] +[group_62132] +[group_62133] +[group_62134] +[group_62135] +[group_62136] +[group_62137] +[group_62138] +[group_62139] +[group_62140] +[group_62141] +[group_62142] +[group_62143] +[group_62144] +[group_62145] +[group_62146] +[group_62147] +[group_62148] +[group_62149] +[group_62150] +[group_62151] +[group_62152] +[group_62153] +[group_62154] +[group_62155] +[group_62156] +[group_62157] +[group_62158] +[group_62159] +[group_62160] +[group_62161] +[group_62162] +[group_62163] +[group_62164] +[group_62165] +[group_62166] +[group_62167] +[group_62168] +[group_62169] +[group_62170] +[group_62171] +[group_62172] +[group_62173] +[group_62174] +[group_62175] +[group_62176] +[group_62177] +[group_62178] +[group_62179] +[group_62180] +[group_62181] +[group_62182] +[group_62183] +[group_62184] +[group_62185] +[group_62186] +[group_62187] +[group_62188] +[group_62189] +[group_62190] +[group_62191] +[group_62192] +[group_62193] +[group_62194] +[group_62195] +[group_62196] +[group_62197] +[group_62198] +[group_62199] +[group_62200] +[group_62201] +[group_62202] +[group_62203] +[group_62204] +[group_62205] +[group_62206] +[group_62207] +[group_62208] +[group_62209] +[group_62210] +[group_62211] +[group_62212] +[group_62213] +[group_62214] +[group_62215] +[group_62216] +[group_62217] +[group_62218] +[group_62219] +[group_62220] +[group_62221] +[group_62222] +[group_62223] +[group_62224] +[group_62225] +[group_62226] +[group_62227] +[group_62228] +[group_62229] +[group_62230] +[group_62231] +[group_62232] +[group_62233] +[group_62234] +[group_62235] +[group_62236] +[group_62237] +[group_62238] +[group_62239] +[group_62240] +[group_62241] +[group_62242] +[group_62243] +[group_62244] +[group_62245] +[group_62246] +[group_62247] +[group_62248] +[group_62249] +[group_62250] +[group_62251] +[group_62252] +[group_62253] +[group_62254] +[group_62255] +[group_62256] +[group_62257] +[group_62258] +[group_62259] +[group_62260] +[group_62261] +[group_62262] +[group_62263] +[group_62264] +[group_62265] +[group_62266] +[group_62267] +[group_62268] +[group_62269] +[group_62270] +[group_62271] +[group_62272] +[group_62273] +[group_62274] +[group_62275] +[group_62276] +[group_62277] +[group_62278] +[group_62279] +[group_62280] +[group_62281] +[group_62282] +[group_62283] +[group_62284] +[group_62285] +[group_62286] +[group_62287] +[group_62288] +[group_62289] +[group_62290] +[group_62291] +[group_62292] +[group_62293] +[group_62294] +[group_62295] +[group_62296] +[group_62297] +[group_62298] +[group_62299] +[group_62300] +[group_62301] +[group_62302] +[group_62303] +[group_62304] +[group_62305] +[group_62306] +[group_62307] +[group_62308] +[group_62309] +[group_62310] +[group_62311] +[group_62312] +[group_62313] +[group_62314] +[group_62315] +[group_62316] +[group_62317] +[group_62318] +[group_62319] +[group_62320] +[group_62321] +[group_62322] +[group_62323] +[group_62324] +[group_62325] +[group_62326] +[group_62327] +[group_62328] +[group_62329] +[group_62330] +[group_62331] +[group_62332] +[group_62333] +[group_62334] +[group_62335] +[group_62336] +[group_62337] +[group_62338] +[group_62339] +[group_62340] +[group_62341] +[group_62342] +[group_62343] +[group_62344] +[group_62345] +[group_62346] +[group_62347] +[group_62348] +[group_62349] +[group_62350] +[group_62351] +[group_62352] +[group_62353] +[group_62354] +[group_62355] +[group_62356] +[group_62357] +[group_62358] +[group_62359] +[group_62360] +[group_62361] +[group_62362] +[group_62363] +[group_62364] +[group_62365] +[group_62366] +[group_62367] +[group_62368] +[group_62369] +[group_62370] +[group_62371] +[group_62372] +[group_62373] +[group_62374] +[group_62375] +[group_62376] +[group_62377] +[group_62378] +[group_62379] +[group_62380] +[group_62381] +[group_62382] +[group_62383] +[group_62384] +[group_62385] +[group_62386] +[group_62387] +[group_62388] +[group_62389] +[group_62390] +[group_62391] +[group_62392] +[group_62393] +[group_62394] +[group_62395] +[group_62396] +[group_62397] +[group_62398] +[group_62399] +[group_62400] +[group_62401] +[group_62402] +[group_62403] +[group_62404] +[group_62405] +[group_62406] +[group_62407] +[group_62408] +[group_62409] +[group_62410] +[group_62411] +[group_62412] +[group_62413] +[group_62414] +[group_62415] +[group_62416] +[group_62417] +[group_62418] +[group_62419] +[group_62420] +[group_62421] +[group_62422] +[group_62423] +[group_62424] +[group_62425] +[group_62426] +[group_62427] +[group_62428] +[group_62429] +[group_62430] +[group_62431] +[group_62432] +[group_62433] +[group_62434] +[group_62435] +[group_62436] +[group_62437] +[group_62438] +[group_62439] +[group_62440] +[group_62441] +[group_62442] +[group_62443] +[group_62444] +[group_62445] +[group_62446] +[group_62447] +[group_62448] +[group_62449] +[group_62450] +[group_62451] +[group_62452] +[group_62453] +[group_62454] +[group_62455] +[group_62456] +[group_62457] +[group_62458] +[group_62459] +[group_62460] +[group_62461] +[group_62462] +[group_62463] +[group_62464] +[group_62465] +[group_62466] +[group_62467] +[group_62468] +[group_62469] +[group_62470] +[group_62471] +[group_62472] +[group_62473] +[group_62474] +[group_62475] +[group_62476] +[group_62477] +[group_62478] +[group_62479] +[group_62480] +[group_62481] +[group_62482] +[group_62483] +[group_62484] +[group_62485] +[group_62486] +[group_62487] +[group_62488] +[group_62489] +[group_62490] +[group_62491] +[group_62492] +[group_62493] +[group_62494] +[group_62495] +[group_62496] +[group_62497] +[group_62498] +[group_62499] +[group_62500] +[group_62501] +[group_62502] +[group_62503] +[group_62504] +[group_62505] +[group_62506] +[group_62507] +[group_62508] +[group_62509] +[group_62510] +[group_62511] +[group_62512] +[group_62513] +[group_62514] +[group_62515] +[group_62516] +[group_62517] +[group_62518] +[group_62519] +[group_62520] +[group_62521] +[group_62522] +[group_62523] +[group_62524] +[group_62525] +[group_62526] +[group_62527] +[group_62528] +[group_62529] +[group_62530] +[group_62531] +[group_62532] +[group_62533] +[group_62534] +[group_62535] +[group_62536] +[group_62537] +[group_62538] +[group_62539] +[group_62540] +[group_62541] +[group_62542] +[group_62543] +[group_62544] +[group_62545] +[group_62546] +[group_62547] +[group_62548] +[group_62549] +[group_62550] +[group_62551] +[group_62552] +[group_62553] +[group_62554] +[group_62555] +[group_62556] +[group_62557] +[group_62558] +[group_62559] +[group_62560] +[group_62561] +[group_62562] +[group_62563] +[group_62564] +[group_62565] +[group_62566] +[group_62567] +[group_62568] +[group_62569] +[group_62570] +[group_62571] +[group_62572] +[group_62573] +[group_62574] +[group_62575] +[group_62576] +[group_62577] +[group_62578] +[group_62579] +[group_62580] +[group_62581] +[group_62582] +[group_62583] +[group_62584] +[group_62585] +[group_62586] +[group_62587] +[group_62588] +[group_62589] +[group_62590] +[group_62591] +[group_62592] +[group_62593] +[group_62594] +[group_62595] +[group_62596] +[group_62597] +[group_62598] +[group_62599] +[group_62600] +[group_62601] +[group_62602] +[group_62603] +[group_62604] +[group_62605] +[group_62606] +[group_62607] +[group_62608] +[group_62609] +[group_62610] +[group_62611] +[group_62612] +[group_62613] +[group_62614] +[group_62615] +[group_62616] +[group_62617] +[group_62618] +[group_62619] +[group_62620] +[group_62621] +[group_62622] +[group_62623] +[group_62624] +[group_62625] +[group_62626] +[group_62627] +[group_62628] +[group_62629] +[group_62630] +[group_62631] +[group_62632] +[group_62633] +[group_62634] +[group_62635] +[group_62636] +[group_62637] +[group_62638] +[group_62639] +[group_62640] +[group_62641] +[group_62642] +[group_62643] +[group_62644] +[group_62645] +[group_62646] +[group_62647] +[group_62648] +[group_62649] +[group_62650] +[group_62651] +[group_62652] +[group_62653] +[group_62654] +[group_62655] +[group_62656] +[group_62657] +[group_62658] +[group_62659] +[group_62660] +[group_62661] +[group_62662] +[group_62663] +[group_62664] +[group_62665] +[group_62666] +[group_62667] +[group_62668] +[group_62669] +[group_62670] +[group_62671] +[group_62672] +[group_62673] +[group_62674] +[group_62675] +[group_62676] +[group_62677] +[group_62678] +[group_62679] +[group_62680] +[group_62681] +[group_62682] +[group_62683] +[group_62684] +[group_62685] +[group_62686] +[group_62687] +[group_62688] +[group_62689] +[group_62690] +[group_62691] +[group_62692] +[group_62693] +[group_62694] +[group_62695] +[group_62696] +[group_62697] +[group_62698] +[group_62699] +[group_62700] +[group_62701] +[group_62702] +[group_62703] +[group_62704] +[group_62705] +[group_62706] +[group_62707] +[group_62708] +[group_62709] +[group_62710] +[group_62711] +[group_62712] +[group_62713] +[group_62714] +[group_62715] +[group_62716] +[group_62717] +[group_62718] +[group_62719] +[group_62720] +[group_62721] +[group_62722] +[group_62723] +[group_62724] +[group_62725] +[group_62726] +[group_62727] +[group_62728] +[group_62729] +[group_62730] +[group_62731] +[group_62732] +[group_62733] +[group_62734] +[group_62735] +[group_62736] +[group_62737] +[group_62738] +[group_62739] +[group_62740] +[group_62741] +[group_62742] +[group_62743] +[group_62744] +[group_62745] +[group_62746] +[group_62747] +[group_62748] +[group_62749] +[group_62750] +[group_62751] +[group_62752] +[group_62753] +[group_62754] +[group_62755] +[group_62756] +[group_62757] +[group_62758] +[group_62759] +[group_62760] +[group_62761] +[group_62762] +[group_62763] +[group_62764] +[group_62765] +[group_62766] +[group_62767] +[group_62768] +[group_62769] +[group_62770] +[group_62771] +[group_62772] +[group_62773] +[group_62774] +[group_62775] +[group_62776] +[group_62777] +[group_62778] +[group_62779] +[group_62780] +[group_62781] +[group_62782] +[group_62783] +[group_62784] +[group_62785] +[group_62786] +[group_62787] +[group_62788] +[group_62789] +[group_62790] +[group_62791] +[group_62792] +[group_62793] +[group_62794] +[group_62795] +[group_62796] +[group_62797] +[group_62798] +[group_62799] +[group_62800] +[group_62801] +[group_62802] +[group_62803] +[group_62804] +[group_62805] +[group_62806] +[group_62807] +[group_62808] +[group_62809] +[group_62810] +[group_62811] +[group_62812] +[group_62813] +[group_62814] +[group_62815] +[group_62816] +[group_62817] +[group_62818] +[group_62819] +[group_62820] +[group_62821] +[group_62822] +[group_62823] +[group_62824] +[group_62825] +[group_62826] +[group_62827] +[group_62828] +[group_62829] +[group_62830] +[group_62831] +[group_62832] +[group_62833] +[group_62834] +[group_62835] +[group_62836] +[group_62837] +[group_62838] +[group_62839] +[group_62840] +[group_62841] +[group_62842] +[group_62843] +[group_62844] +[group_62845] +[group_62846] +[group_62847] +[group_62848] +[group_62849] +[group_62850] +[group_62851] +[group_62852] +[group_62853] +[group_62854] +[group_62855] +[group_62856] +[group_62857] +[group_62858] +[group_62859] +[group_62860] +[group_62861] +[group_62862] +[group_62863] +[group_62864] +[group_62865] +[group_62866] +[group_62867] +[group_62868] +[group_62869] +[group_62870] +[group_62871] +[group_62872] +[group_62873] +[group_62874] +[group_62875] +[group_62876] +[group_62877] +[group_62878] +[group_62879] +[group_62880] +[group_62881] +[group_62882] +[group_62883] +[group_62884] +[group_62885] +[group_62886] +[group_62887] +[group_62888] +[group_62889] +[group_62890] +[group_62891] +[group_62892] +[group_62893] +[group_62894] +[group_62895] +[group_62896] +[group_62897] +[group_62898] +[group_62899] +[group_62900] +[group_62901] +[group_62902] +[group_62903] +[group_62904] +[group_62905] +[group_62906] +[group_62907] +[group_62908] +[group_62909] +[group_62910] +[group_62911] +[group_62912] +[group_62913] +[group_62914] +[group_62915] +[group_62916] +[group_62917] +[group_62918] +[group_62919] +[group_62920] +[group_62921] +[group_62922] +[group_62923] +[group_62924] +[group_62925] +[group_62926] +[group_62927] +[group_62928] +[group_62929] +[group_62930] +[group_62931] +[group_62932] +[group_62933] +[group_62934] +[group_62935] +[group_62936] +[group_62937] +[group_62938] +[group_62939] +[group_62940] +[group_62941] +[group_62942] +[group_62943] +[group_62944] +[group_62945] +[group_62946] +[group_62947] +[group_62948] +[group_62949] +[group_62950] +[group_62951] +[group_62952] +[group_62953] +[group_62954] +[group_62955] +[group_62956] +[group_62957] +[group_62958] +[group_62959] +[group_62960] +[group_62961] +[group_62962] +[group_62963] +[group_62964] +[group_62965] +[group_62966] +[group_62967] +[group_62968] +[group_62969] +[group_62970] +[group_62971] +[group_62972] +[group_62973] +[group_62974] +[group_62975] +[group_62976] +[group_62977] +[group_62978] +[group_62979] +[group_62980] +[group_62981] +[group_62982] +[group_62983] +[group_62984] +[group_62985] +[group_62986] +[group_62987] +[group_62988] +[group_62989] +[group_62990] +[group_62991] +[group_62992] +[group_62993] +[group_62994] +[group_62995] +[group_62996] +[group_62997] +[group_62998] +[group_62999] +[group_63000] +[group_63001] +[group_63002] +[group_63003] +[group_63004] +[group_63005] +[group_63006] +[group_63007] +[group_63008] +[group_63009] +[group_63010] +[group_63011] +[group_63012] +[group_63013] +[group_63014] +[group_63015] +[group_63016] +[group_63017] +[group_63018] +[group_63019] +[group_63020] +[group_63021] +[group_63022] +[group_63023] +[group_63024] +[group_63025] +[group_63026] +[group_63027] +[group_63028] +[group_63029] +[group_63030] +[group_63031] +[group_63032] +[group_63033] +[group_63034] +[group_63035] +[group_63036] +[group_63037] +[group_63038] +[group_63039] +[group_63040] +[group_63041] +[group_63042] +[group_63043] +[group_63044] +[group_63045] +[group_63046] +[group_63047] +[group_63048] +[group_63049] +[group_63050] +[group_63051] +[group_63052] +[group_63053] +[group_63054] +[group_63055] +[group_63056] +[group_63057] +[group_63058] +[group_63059] +[group_63060] +[group_63061] +[group_63062] +[group_63063] +[group_63064] +[group_63065] +[group_63066] +[group_63067] +[group_63068] +[group_63069] +[group_63070] +[group_63071] +[group_63072] +[group_63073] +[group_63074] +[group_63075] +[group_63076] +[group_63077] +[group_63078] +[group_63079] +[group_63080] +[group_63081] +[group_63082] +[group_63083] +[group_63084] +[group_63085] +[group_63086] +[group_63087] +[group_63088] +[group_63089] +[group_63090] +[group_63091] +[group_63092] +[group_63093] +[group_63094] +[group_63095] +[group_63096] +[group_63097] +[group_63098] +[group_63099] +[group_63100] +[group_63101] +[group_63102] +[group_63103] +[group_63104] +[group_63105] +[group_63106] +[group_63107] +[group_63108] +[group_63109] +[group_63110] +[group_63111] +[group_63112] +[group_63113] +[group_63114] +[group_63115] +[group_63116] +[group_63117] +[group_63118] +[group_63119] +[group_63120] +[group_63121] +[group_63122] +[group_63123] +[group_63124] +[group_63125] +[group_63126] +[group_63127] +[group_63128] +[group_63129] +[group_63130] +[group_63131] +[group_63132] +[group_63133] +[group_63134] +[group_63135] +[group_63136] +[group_63137] +[group_63138] +[group_63139] +[group_63140] +[group_63141] +[group_63142] +[group_63143] +[group_63144] +[group_63145] +[group_63146] +[group_63147] +[group_63148] +[group_63149] +[group_63150] +[group_63151] +[group_63152] +[group_63153] +[group_63154] +[group_63155] +[group_63156] +[group_63157] +[group_63158] +[group_63159] +[group_63160] +[group_63161] +[group_63162] +[group_63163] +[group_63164] +[group_63165] +[group_63166] +[group_63167] +[group_63168] +[group_63169] +[group_63170] +[group_63171] +[group_63172] +[group_63173] +[group_63174] +[group_63175] +[group_63176] +[group_63177] +[group_63178] +[group_63179] +[group_63180] +[group_63181] +[group_63182] +[group_63183] +[group_63184] +[group_63185] +[group_63186] +[group_63187] +[group_63188] +[group_63189] +[group_63190] +[group_63191] +[group_63192] +[group_63193] +[group_63194] +[group_63195] +[group_63196] +[group_63197] +[group_63198] +[group_63199] +[group_63200] +[group_63201] +[group_63202] +[group_63203] +[group_63204] +[group_63205] +[group_63206] +[group_63207] +[group_63208] +[group_63209] +[group_63210] +[group_63211] +[group_63212] +[group_63213] +[group_63214] +[group_63215] +[group_63216] +[group_63217] +[group_63218] +[group_63219] +[group_63220] +[group_63221] +[group_63222] +[group_63223] +[group_63224] +[group_63225] +[group_63226] +[group_63227] +[group_63228] +[group_63229] +[group_63230] +[group_63231] +[group_63232] +[group_63233] +[group_63234] +[group_63235] +[group_63236] +[group_63237] +[group_63238] +[group_63239] +[group_63240] +[group_63241] +[group_63242] +[group_63243] +[group_63244] +[group_63245] +[group_63246] +[group_63247] +[group_63248] +[group_63249] +[group_63250] +[group_63251] +[group_63252] +[group_63253] +[group_63254] +[group_63255] +[group_63256] +[group_63257] +[group_63258] +[group_63259] +[group_63260] +[group_63261] +[group_63262] +[group_63263] +[group_63264] +[group_63265] +[group_63266] +[group_63267] +[group_63268] +[group_63269] +[group_63270] +[group_63271] +[group_63272] +[group_63273] +[group_63274] +[group_63275] +[group_63276] +[group_63277] +[group_63278] +[group_63279] +[group_63280] +[group_63281] +[group_63282] +[group_63283] +[group_63284] +[group_63285] +[group_63286] +[group_63287] +[group_63288] +[group_63289] +[group_63290] +[group_63291] +[group_63292] +[group_63293] +[group_63294] +[group_63295] +[group_63296] +[group_63297] +[group_63298] +[group_63299] +[group_63300] +[group_63301] +[group_63302] +[group_63303] +[group_63304] +[group_63305] +[group_63306] +[group_63307] +[group_63308] +[group_63309] +[group_63310] +[group_63311] +[group_63312] +[group_63313] +[group_63314] +[group_63315] +[group_63316] +[group_63317] +[group_63318] +[group_63319] +[group_63320] +[group_63321] +[group_63322] +[group_63323] +[group_63324] +[group_63325] +[group_63326] +[group_63327] +[group_63328] +[group_63329] +[group_63330] +[group_63331] +[group_63332] +[group_63333] +[group_63334] +[group_63335] +[group_63336] +[group_63337] +[group_63338] +[group_63339] +[group_63340] +[group_63341] +[group_63342] +[group_63343] +[group_63344] +[group_63345] +[group_63346] +[group_63347] +[group_63348] +[group_63349] +[group_63350] +[group_63351] +[group_63352] +[group_63353] +[group_63354] +[group_63355] +[group_63356] +[group_63357] +[group_63358] +[group_63359] +[group_63360] +[group_63361] +[group_63362] +[group_63363] +[group_63364] +[group_63365] +[group_63366] +[group_63367] +[group_63368] +[group_63369] +[group_63370] +[group_63371] +[group_63372] +[group_63373] +[group_63374] +[group_63375] +[group_63376] +[group_63377] +[group_63378] +[group_63379] +[group_63380] +[group_63381] +[group_63382] +[group_63383] +[group_63384] +[group_63385] +[group_63386] +[group_63387] +[group_63388] +[group_63389] +[group_63390] +[group_63391] +[group_63392] +[group_63393] +[group_63394] +[group_63395] +[group_63396] +[group_63397] +[group_63398] +[group_63399] +[group_63400] +[group_63401] +[group_63402] +[group_63403] +[group_63404] +[group_63405] +[group_63406] +[group_63407] +[group_63408] +[group_63409] +[group_63410] +[group_63411] +[group_63412] +[group_63413] +[group_63414] +[group_63415] +[group_63416] +[group_63417] +[group_63418] +[group_63419] +[group_63420] +[group_63421] +[group_63422] +[group_63423] +[group_63424] +[group_63425] +[group_63426] +[group_63427] +[group_63428] +[group_63429] +[group_63430] +[group_63431] +[group_63432] +[group_63433] +[group_63434] +[group_63435] +[group_63436] +[group_63437] +[group_63438] +[group_63439] +[group_63440] +[group_63441] +[group_63442] +[group_63443] +[group_63444] +[group_63445] +[group_63446] +[group_63447] +[group_63448] +[group_63449] +[group_63450] +[group_63451] +[group_63452] +[group_63453] +[group_63454] +[group_63455] +[group_63456] +[group_63457] +[group_63458] +[group_63459] +[group_63460] +[group_63461] +[group_63462] +[group_63463] +[group_63464] +[group_63465] +[group_63466] +[group_63467] +[group_63468] +[group_63469] +[group_63470] +[group_63471] +[group_63472] +[group_63473] +[group_63474] +[group_63475] +[group_63476] +[group_63477] +[group_63478] +[group_63479] +[group_63480] +[group_63481] +[group_63482] +[group_63483] +[group_63484] +[group_63485] +[group_63486] +[group_63487] +[group_63488] +[group_63489] +[group_63490] +[group_63491] +[group_63492] +[group_63493] +[group_63494] +[group_63495] +[group_63496] +[group_63497] +[group_63498] +[group_63499] +[group_63500] +[group_63501] +[group_63502] +[group_63503] +[group_63504] +[group_63505] +[group_63506] +[group_63507] +[group_63508] +[group_63509] +[group_63510] +[group_63511] +[group_63512] +[group_63513] +[group_63514] +[group_63515] +[group_63516] +[group_63517] +[group_63518] +[group_63519] +[group_63520] +[group_63521] +[group_63522] +[group_63523] +[group_63524] +[group_63525] +[group_63526] +[group_63527] +[group_63528] +[group_63529] +[group_63530] +[group_63531] +[group_63532] +[group_63533] +[group_63534] +[group_63535] +[group_63536] +[group_63537] +[group_63538] +[group_63539] +[group_63540] +[group_63541] +[group_63542] +[group_63543] +[group_63544] +[group_63545] +[group_63546] +[group_63547] +[group_63548] +[group_63549] +[group_63550] +[group_63551] +[group_63552] +[group_63553] +[group_63554] +[group_63555] +[group_63556] +[group_63557] +[group_63558] +[group_63559] +[group_63560] +[group_63561] +[group_63562] +[group_63563] +[group_63564] +[group_63565] +[group_63566] +[group_63567] +[group_63568] +[group_63569] +[group_63570] +[group_63571] +[group_63572] +[group_63573] +[group_63574] +[group_63575] +[group_63576] +[group_63577] +[group_63578] +[group_63579] +[group_63580] +[group_63581] +[group_63582] +[group_63583] +[group_63584] +[group_63585] +[group_63586] +[group_63587] +[group_63588] +[group_63589] +[group_63590] +[group_63591] +[group_63592] +[group_63593] +[group_63594] +[group_63595] +[group_63596] +[group_63597] +[group_63598] +[group_63599] +[group_63600] +[group_63601] +[group_63602] +[group_63603] +[group_63604] +[group_63605] +[group_63606] +[group_63607] +[group_63608] +[group_63609] +[group_63610] +[group_63611] +[group_63612] +[group_63613] +[group_63614] +[group_63615] +[group_63616] +[group_63617] +[group_63618] +[group_63619] +[group_63620] +[group_63621] +[group_63622] +[group_63623] +[group_63624] +[group_63625] +[group_63626] +[group_63627] +[group_63628] +[group_63629] +[group_63630] +[group_63631] +[group_63632] +[group_63633] +[group_63634] +[group_63635] +[group_63636] +[group_63637] +[group_63638] +[group_63639] +[group_63640] +[group_63641] +[group_63642] +[group_63643] +[group_63644] +[group_63645] +[group_63646] +[group_63647] +[group_63648] +[group_63649] +[group_63650] +[group_63651] +[group_63652] +[group_63653] +[group_63654] +[group_63655] +[group_63656] +[group_63657] +[group_63658] +[group_63659] +[group_63660] +[group_63661] +[group_63662] +[group_63663] +[group_63664] +[group_63665] +[group_63666] +[group_63667] +[group_63668] +[group_63669] +[group_63670] +[group_63671] +[group_63672] +[group_63673] +[group_63674] +[group_63675] +[group_63676] +[group_63677] +[group_63678] +[group_63679] +[group_63680] +[group_63681] +[group_63682] +[group_63683] +[group_63684] +[group_63685] +[group_63686] +[group_63687] +[group_63688] +[group_63689] +[group_63690] +[group_63691] +[group_63692] +[group_63693] +[group_63694] +[group_63695] +[group_63696] +[group_63697] +[group_63698] +[group_63699] +[group_63700] +[group_63701] +[group_63702] +[group_63703] +[group_63704] +[group_63705] +[group_63706] +[group_63707] +[group_63708] +[group_63709] +[group_63710] +[group_63711] +[group_63712] +[group_63713] +[group_63714] +[group_63715] +[group_63716] +[group_63717] +[group_63718] +[group_63719] +[group_63720] +[group_63721] +[group_63722] +[group_63723] +[group_63724] +[group_63725] +[group_63726] +[group_63727] +[group_63728] +[group_63729] +[group_63730] +[group_63731] +[group_63732] +[group_63733] +[group_63734] +[group_63735] +[group_63736] +[group_63737] +[group_63738] +[group_63739] +[group_63740] +[group_63741] +[group_63742] +[group_63743] +[group_63744] +[group_63745] +[group_63746] +[group_63747] +[group_63748] +[group_63749] +[group_63750] +[group_63751] +[group_63752] +[group_63753] +[group_63754] +[group_63755] +[group_63756] +[group_63757] +[group_63758] +[group_63759] +[group_63760] +[group_63761] +[group_63762] +[group_63763] +[group_63764] +[group_63765] +[group_63766] +[group_63767] +[group_63768] +[group_63769] +[group_63770] +[group_63771] +[group_63772] +[group_63773] +[group_63774] +[group_63775] +[group_63776] +[group_63777] +[group_63778] +[group_63779] +[group_63780] +[group_63781] +[group_63782] +[group_63783] +[group_63784] +[group_63785] +[group_63786] +[group_63787] +[group_63788] +[group_63789] +[group_63790] +[group_63791] +[group_63792] +[group_63793] +[group_63794] +[group_63795] +[group_63796] +[group_63797] +[group_63798] +[group_63799] +[group_63800] +[group_63801] +[group_63802] +[group_63803] +[group_63804] +[group_63805] +[group_63806] +[group_63807] +[group_63808] +[group_63809] +[group_63810] +[group_63811] +[group_63812] +[group_63813] +[group_63814] +[group_63815] +[group_63816] +[group_63817] +[group_63818] +[group_63819] +[group_63820] +[group_63821] +[group_63822] +[group_63823] +[group_63824] +[group_63825] +[group_63826] +[group_63827] +[group_63828] +[group_63829] +[group_63830] +[group_63831] +[group_63832] +[group_63833] +[group_63834] +[group_63835] +[group_63836] +[group_63837] +[group_63838] +[group_63839] +[group_63840] +[group_63841] +[group_63842] +[group_63843] +[group_63844] +[group_63845] +[group_63846] +[group_63847] +[group_63848] +[group_63849] +[group_63850] +[group_63851] +[group_63852] +[group_63853] +[group_63854] +[group_63855] +[group_63856] +[group_63857] +[group_63858] +[group_63859] +[group_63860] +[group_63861] +[group_63862] +[group_63863] +[group_63864] +[group_63865] +[group_63866] +[group_63867] +[group_63868] +[group_63869] +[group_63870] +[group_63871] +[group_63872] +[group_63873] +[group_63874] +[group_63875] +[group_63876] +[group_63877] +[group_63878] +[group_63879] +[group_63880] +[group_63881] +[group_63882] +[group_63883] +[group_63884] +[group_63885] +[group_63886] +[group_63887] +[group_63888] +[group_63889] +[group_63890] +[group_63891] +[group_63892] +[group_63893] +[group_63894] +[group_63895] +[group_63896] +[group_63897] +[group_63898] +[group_63899] +[group_63900] +[group_63901] +[group_63902] +[group_63903] +[group_63904] +[group_63905] +[group_63906] +[group_63907] +[group_63908] +[group_63909] +[group_63910] +[group_63911] +[group_63912] +[group_63913] +[group_63914] +[group_63915] +[group_63916] +[group_63917] +[group_63918] +[group_63919] +[group_63920] +[group_63921] +[group_63922] +[group_63923] +[group_63924] +[group_63925] +[group_63926] +[group_63927] +[group_63928] +[group_63929] +[group_63930] +[group_63931] +[group_63932] +[group_63933] +[group_63934] +[group_63935] +[group_63936] +[group_63937] +[group_63938] +[group_63939] +[group_63940] +[group_63941] +[group_63942] +[group_63943] +[group_63944] +[group_63945] +[group_63946] +[group_63947] +[group_63948] +[group_63949] +[group_63950] +[group_63951] +[group_63952] +[group_63953] +[group_63954] +[group_63955] +[group_63956] +[group_63957] +[group_63958] +[group_63959] +[group_63960] +[group_63961] +[group_63962] +[group_63963] +[group_63964] +[group_63965] +[group_63966] +[group_63967] +[group_63968] +[group_63969] +[group_63970] +[group_63971] +[group_63972] +[group_63973] +[group_63974] +[group_63975] +[group_63976] +[group_63977] +[group_63978] +[group_63979] +[group_63980] +[group_63981] +[group_63982] +[group_63983] +[group_63984] +[group_63985] +[group_63986] +[group_63987] +[group_63988] +[group_63989] +[group_63990] +[group_63991] +[group_63992] +[group_63993] +[group_63994] +[group_63995] +[group_63996] +[group_63997] +[group_63998] +[group_63999] +[group_64000] +[group_64001] +[group_64002] +[group_64003] +[group_64004] +[group_64005] +[group_64006] +[group_64007] +[group_64008] +[group_64009] +[group_64010] +[group_64011] +[group_64012] +[group_64013] +[group_64014] +[group_64015] +[group_64016] +[group_64017] +[group_64018] +[group_64019] +[group_64020] +[group_64021] +[group_64022] +[group_64023] +[group_64024] +[group_64025] +[group_64026] +[group_64027] +[group_64028] +[group_64029] +[group_64030] +[group_64031] +[group_64032] +[group_64033] +[group_64034] +[group_64035] +[group_64036] +[group_64037] +[group_64038] +[group_64039] +[group_64040] +[group_64041] +[group_64042] +[group_64043] +[group_64044] +[group_64045] +[group_64046] +[group_64047] +[group_64048] +[group_64049] +[group_64050] +[group_64051] +[group_64052] +[group_64053] +[group_64054] +[group_64055] +[group_64056] +[group_64057] +[group_64058] +[group_64059] +[group_64060] +[group_64061] +[group_64062] +[group_64063] +[group_64064] +[group_64065] +[group_64066] +[group_64067] +[group_64068] +[group_64069] +[group_64070] +[group_64071] +[group_64072] +[group_64073] +[group_64074] +[group_64075] +[group_64076] +[group_64077] +[group_64078] +[group_64079] +[group_64080] +[group_64081] +[group_64082] +[group_64083] +[group_64084] +[group_64085] +[group_64086] +[group_64087] +[group_64088] +[group_64089] +[group_64090] +[group_64091] +[group_64092] +[group_64093] +[group_64094] +[group_64095] +[group_64096] +[group_64097] +[group_64098] +[group_64099] +[group_64100] +[group_64101] +[group_64102] +[group_64103] +[group_64104] +[group_64105] +[group_64106] +[group_64107] +[group_64108] +[group_64109] +[group_64110] +[group_64111] +[group_64112] +[group_64113] +[group_64114] +[group_64115] +[group_64116] +[group_64117] +[group_64118] +[group_64119] +[group_64120] +[group_64121] +[group_64122] +[group_64123] +[group_64124] +[group_64125] +[group_64126] +[group_64127] +[group_64128] +[group_64129] +[group_64130] +[group_64131] +[group_64132] +[group_64133] +[group_64134] +[group_64135] +[group_64136] +[group_64137] +[group_64138] +[group_64139] +[group_64140] +[group_64141] +[group_64142] +[group_64143] +[group_64144] +[group_64145] +[group_64146] +[group_64147] +[group_64148] +[group_64149] +[group_64150] +[group_64151] +[group_64152] +[group_64153] +[group_64154] +[group_64155] +[group_64156] +[group_64157] +[group_64158] +[group_64159] +[group_64160] +[group_64161] +[group_64162] +[group_64163] +[group_64164] +[group_64165] +[group_64166] +[group_64167] +[group_64168] +[group_64169] +[group_64170] +[group_64171] +[group_64172] +[group_64173] +[group_64174] +[group_64175] +[group_64176] +[group_64177] +[group_64178] +[group_64179] +[group_64180] +[group_64181] +[group_64182] +[group_64183] +[group_64184] +[group_64185] +[group_64186] +[group_64187] +[group_64188] +[group_64189] +[group_64190] +[group_64191] +[group_64192] +[group_64193] +[group_64194] +[group_64195] +[group_64196] +[group_64197] +[group_64198] +[group_64199] +[group_64200] +[group_64201] +[group_64202] +[group_64203] +[group_64204] +[group_64205] +[group_64206] +[group_64207] +[group_64208] +[group_64209] +[group_64210] +[group_64211] +[group_64212] +[group_64213] +[group_64214] +[group_64215] +[group_64216] +[group_64217] +[group_64218] +[group_64219] +[group_64220] +[group_64221] +[group_64222] +[group_64223] +[group_64224] +[group_64225] +[group_64226] +[group_64227] +[group_64228] +[group_64229] +[group_64230] +[group_64231] +[group_64232] +[group_64233] +[group_64234] +[group_64235] +[group_64236] +[group_64237] +[group_64238] +[group_64239] +[group_64240] +[group_64241] +[group_64242] +[group_64243] +[group_64244] +[group_64245] +[group_64246] +[group_64247] +[group_64248] +[group_64249] +[group_64250] +[group_64251] +[group_64252] +[group_64253] +[group_64254] +[group_64255] +[group_64256] +[group_64257] +[group_64258] +[group_64259] +[group_64260] +[group_64261] +[group_64262] +[group_64263] +[group_64264] +[group_64265] +[group_64266] +[group_64267] +[group_64268] +[group_64269] +[group_64270] +[group_64271] +[group_64272] +[group_64273] +[group_64274] +[group_64275] +[group_64276] +[group_64277] +[group_64278] +[group_64279] +[group_64280] +[group_64281] +[group_64282] +[group_64283] +[group_64284] +[group_64285] +[group_64286] +[group_64287] +[group_64288] +[group_64289] +[group_64290] +[group_64291] +[group_64292] +[group_64293] +[group_64294] +[group_64295] +[group_64296] +[group_64297] +[group_64298] +[group_64299] +[group_64300] +[group_64301] +[group_64302] +[group_64303] +[group_64304] +[group_64305] +[group_64306] +[group_64307] +[group_64308] +[group_64309] +[group_64310] +[group_64311] +[group_64312] +[group_64313] +[group_64314] +[group_64315] +[group_64316] +[group_64317] +[group_64318] +[group_64319] +[group_64320] +[group_64321] +[group_64322] +[group_64323] +[group_64324] +[group_64325] +[group_64326] +[group_64327] +[group_64328] +[group_64329] +[group_64330] +[group_64331] +[group_64332] +[group_64333] +[group_64334] +[group_64335] +[group_64336] +[group_64337] +[group_64338] +[group_64339] +[group_64340] +[group_64341] +[group_64342] +[group_64343] +[group_64344] +[group_64345] +[group_64346] +[group_64347] +[group_64348] +[group_64349] +[group_64350] +[group_64351] +[group_64352] +[group_64353] +[group_64354] +[group_64355] +[group_64356] +[group_64357] +[group_64358] +[group_64359] +[group_64360] +[group_64361] +[group_64362] +[group_64363] +[group_64364] +[group_64365] +[group_64366] +[group_64367] +[group_64368] +[group_64369] +[group_64370] +[group_64371] +[group_64372] +[group_64373] +[group_64374] +[group_64375] +[group_64376] +[group_64377] +[group_64378] +[group_64379] +[group_64380] +[group_64381] +[group_64382] +[group_64383] +[group_64384] +[group_64385] +[group_64386] +[group_64387] +[group_64388] +[group_64389] +[group_64390] +[group_64391] +[group_64392] +[group_64393] +[group_64394] +[group_64395] +[group_64396] +[group_64397] +[group_64398] +[group_64399] +[group_64400] +[group_64401] +[group_64402] +[group_64403] +[group_64404] +[group_64405] +[group_64406] +[group_64407] +[group_64408] +[group_64409] +[group_64410] +[group_64411] +[group_64412] +[group_64413] +[group_64414] +[group_64415] +[group_64416] +[group_64417] +[group_64418] +[group_64419] +[group_64420] +[group_64421] +[group_64422] +[group_64423] +[group_64424] +[group_64425] +[group_64426] +[group_64427] +[group_64428] +[group_64429] +[group_64430] +[group_64431] +[group_64432] +[group_64433] +[group_64434] +[group_64435] +[group_64436] +[group_64437] +[group_64438] +[group_64439] +[group_64440] +[group_64441] +[group_64442] +[group_64443] +[group_64444] +[group_64445] +[group_64446] +[group_64447] +[group_64448] +[group_64449] +[group_64450] +[group_64451] +[group_64452] +[group_64453] +[group_64454] +[group_64455] +[group_64456] +[group_64457] +[group_64458] +[group_64459] +[group_64460] +[group_64461] +[group_64462] +[group_64463] +[group_64464] +[group_64465] +[group_64466] +[group_64467] +[group_64468] +[group_64469] +[group_64470] +[group_64471] +[group_64472] +[group_64473] +[group_64474] +[group_64475] +[group_64476] +[group_64477] +[group_64478] +[group_64479] +[group_64480] +[group_64481] +[group_64482] +[group_64483] +[group_64484] +[group_64485] +[group_64486] +[group_64487] +[group_64488] +[group_64489] +[group_64490] +[group_64491] +[group_64492] +[group_64493] +[group_64494] +[group_64495] +[group_64496] +[group_64497] +[group_64498] +[group_64499] +[group_64500] +[group_64501] +[group_64502] +[group_64503] +[group_64504] +[group_64505] +[group_64506] +[group_64507] +[group_64508] +[group_64509] +[group_64510] +[group_64511] +[group_64512] +[group_64513] +[group_64514] +[group_64515] +[group_64516] +[group_64517] +[group_64518] +[group_64519] +[group_64520] +[group_64521] +[group_64522] +[group_64523] +[group_64524] +[group_64525] +[group_64526] +[group_64527] +[group_64528] +[group_64529] +[group_64530] +[group_64531] +[group_64532] +[group_64533] +[group_64534] +[group_64535] +[group_64536] +[group_64537] +[group_64538] +[group_64539] +[group_64540] +[group_64541] +[group_64542] +[group_64543] +[group_64544] +[group_64545] +[group_64546] +[group_64547] +[group_64548] +[group_64549] +[group_64550] +[group_64551] +[group_64552] +[group_64553] +[group_64554] +[group_64555] +[group_64556] +[group_64557] +[group_64558] +[group_64559] +[group_64560] +[group_64561] +[group_64562] +[group_64563] +[group_64564] +[group_64565] +[group_64566] +[group_64567] +[group_64568] +[group_64569] +[group_64570] +[group_64571] +[group_64572] +[group_64573] +[group_64574] +[group_64575] +[group_64576] +[group_64577] +[group_64578] +[group_64579] +[group_64580] +[group_64581] +[group_64582] +[group_64583] +[group_64584] +[group_64585] +[group_64586] +[group_64587] +[group_64588] +[group_64589] +[group_64590] +[group_64591] +[group_64592] +[group_64593] +[group_64594] +[group_64595] +[group_64596] +[group_64597] +[group_64598] +[group_64599] +[group_64600] +[group_64601] +[group_64602] +[group_64603] +[group_64604] +[group_64605] +[group_64606] +[group_64607] +[group_64608] +[group_64609] +[group_64610] +[group_64611] +[group_64612] +[group_64613] +[group_64614] +[group_64615] +[group_64616] +[group_64617] +[group_64618] +[group_64619] +[group_64620] +[group_64621] +[group_64622] +[group_64623] +[group_64624] +[group_64625] +[group_64626] +[group_64627] +[group_64628] +[group_64629] +[group_64630] +[group_64631] +[group_64632] +[group_64633] +[group_64634] +[group_64635] +[group_64636] +[group_64637] +[group_64638] +[group_64639] +[group_64640] +[group_64641] +[group_64642] +[group_64643] +[group_64644] +[group_64645] +[group_64646] +[group_64647] +[group_64648] +[group_64649] +[group_64650] +[group_64651] +[group_64652] +[group_64653] +[group_64654] +[group_64655] +[group_64656] +[group_64657] +[group_64658] +[group_64659] +[group_64660] +[group_64661] +[group_64662] +[group_64663] +[group_64664] +[group_64665] +[group_64666] +[group_64667] +[group_64668] +[group_64669] +[group_64670] +[group_64671] +[group_64672] +[group_64673] +[group_64674] +[group_64675] +[group_64676] +[group_64677] +[group_64678] +[group_64679] +[group_64680] +[group_64681] +[group_64682] +[group_64683] +[group_64684] +[group_64685] +[group_64686] +[group_64687] +[group_64688] +[group_64689] +[group_64690] +[group_64691] +[group_64692] +[group_64693] +[group_64694] +[group_64695] +[group_64696] +[group_64697] +[group_64698] +[group_64699] +[group_64700] +[group_64701] +[group_64702] +[group_64703] +[group_64704] +[group_64705] +[group_64706] +[group_64707] +[group_64708] +[group_64709] +[group_64710] +[group_64711] +[group_64712] +[group_64713] +[group_64714] +[group_64715] +[group_64716] +[group_64717] +[group_64718] +[group_64719] +[group_64720] +[group_64721] +[group_64722] +[group_64723] +[group_64724] +[group_64725] +[group_64726] +[group_64727] +[group_64728] +[group_64729] +[group_64730] +[group_64731] +[group_64732] +[group_64733] +[group_64734] +[group_64735] +[group_64736] +[group_64737] +[group_64738] +[group_64739] +[group_64740] +[group_64741] +[group_64742] +[group_64743] +[group_64744] +[group_64745] +[group_64746] +[group_64747] +[group_64748] +[group_64749] +[group_64750] +[group_64751] +[group_64752] +[group_64753] +[group_64754] +[group_64755] +[group_64756] +[group_64757] +[group_64758] +[group_64759] +[group_64760] +[group_64761] +[group_64762] +[group_64763] +[group_64764] +[group_64765] +[group_64766] +[group_64767] +[group_64768] +[group_64769] +[group_64770] +[group_64771] +[group_64772] +[group_64773] +[group_64774] +[group_64775] +[group_64776] +[group_64777] +[group_64778] +[group_64779] +[group_64780] +[group_64781] +[group_64782] +[group_64783] +[group_64784] +[group_64785] +[group_64786] +[group_64787] +[group_64788] +[group_64789] +[group_64790] +[group_64791] +[group_64792] +[group_64793] +[group_64794] +[group_64795] +[group_64796] +[group_64797] +[group_64798] +[group_64799] +[group_64800] +[group_64801] +[group_64802] +[group_64803] +[group_64804] +[group_64805] +[group_64806] +[group_64807] +[group_64808] +[group_64809] +[group_64810] +[group_64811] +[group_64812] +[group_64813] +[group_64814] +[group_64815] +[group_64816] +[group_64817] +[group_64818] +[group_64819] +[group_64820] +[group_64821] +[group_64822] +[group_64823] +[group_64824] +[group_64825] +[group_64826] +[group_64827] +[group_64828] +[group_64829] +[group_64830] +[group_64831] +[group_64832] +[group_64833] +[group_64834] +[group_64835] +[group_64836] +[group_64837] +[group_64838] +[group_64839] +[group_64840] +[group_64841] +[group_64842] +[group_64843] +[group_64844] +[group_64845] +[group_64846] +[group_64847] +[group_64848] +[group_64849] +[group_64850] +[group_64851] +[group_64852] +[group_64853] +[group_64854] +[group_64855] +[group_64856] +[group_64857] +[group_64858] +[group_64859] +[group_64860] +[group_64861] +[group_64862] +[group_64863] +[group_64864] +[group_64865] +[group_64866] +[group_64867] +[group_64868] +[group_64869] +[group_64870] +[group_64871] +[group_64872] +[group_64873] +[group_64874] +[group_64875] +[group_64876] +[group_64877] +[group_64878] +[group_64879] +[group_64880] +[group_64881] +[group_64882] +[group_64883] +[group_64884] +[group_64885] +[group_64886] +[group_64887] +[group_64888] +[group_64889] +[group_64890] +[group_64891] +[group_64892] +[group_64893] +[group_64894] +[group_64895] +[group_64896] +[group_64897] +[group_64898] +[group_64899] +[group_64900] +[group_64901] +[group_64902] +[group_64903] +[group_64904] +[group_64905] +[group_64906] +[group_64907] +[group_64908] +[group_64909] +[group_64910] +[group_64911] +[group_64912] +[group_64913] +[group_64914] +[group_64915] +[group_64916] +[group_64917] +[group_64918] +[group_64919] +[group_64920] +[group_64921] +[group_64922] +[group_64923] +[group_64924] +[group_64925] +[group_64926] +[group_64927] +[group_64928] +[group_64929] +[group_64930] +[group_64931] +[group_64932] +[group_64933] +[group_64934] +[group_64935] +[group_64936] +[group_64937] +[group_64938] +[group_64939] +[group_64940] +[group_64941] +[group_64942] +[group_64943] +[group_64944] +[group_64945] +[group_64946] +[group_64947] +[group_64948] +[group_64949] +[group_64950] +[group_64951] +[group_64952] +[group_64953] +[group_64954] +[group_64955] +[group_64956] +[group_64957] +[group_64958] +[group_64959] +[group_64960] +[group_64961] +[group_64962] +[group_64963] +[group_64964] +[group_64965] +[group_64966] +[group_64967] +[group_64968] +[group_64969] +[group_64970] +[group_64971] +[group_64972] +[group_64973] +[group_64974] +[group_64975] +[group_64976] +[group_64977] +[group_64978] +[group_64979] +[group_64980] +[group_64981] +[group_64982] +[group_64983] +[group_64984] +[group_64985] +[group_64986] +[group_64987] +[group_64988] +[group_64989] +[group_64990] +[group_64991] +[group_64992] +[group_64993] +[group_64994] +[group_64995] +[group_64996] +[group_64997] +[group_64998] +[group_64999] +[group_65000] +[group_65001] +[group_65002] +[group_65003] +[group_65004] +[group_65005] +[group_65006] +[group_65007] +[group_65008] +[group_65009] +[group_65010] +[group_65011] +[group_65012] +[group_65013] +[group_65014] +[group_65015] +[group_65016] +[group_65017] +[group_65018] +[group_65019] +[group_65020] +[group_65021] +[group_65022] +[group_65023] +[group_65024] +[group_65025] +[group_65026] +[group_65027] +[group_65028] +[group_65029] +[group_65030] +[group_65031] +[group_65032] +[group_65033] +[group_65034] +[group_65035] +[group_65036] +[group_65037] +[group_65038] +[group_65039] +[group_65040] +[group_65041] +[group_65042] +[group_65043] +[group_65044] +[group_65045] +[group_65046] +[group_65047] +[group_65048] +[group_65049] +[group_65050] +[group_65051] +[group_65052] +[group_65053] +[group_65054] +[group_65055] +[group_65056] +[group_65057] +[group_65058] +[group_65059] +[group_65060] +[group_65061] +[group_65062] +[group_65063] +[group_65064] +[group_65065] +[group_65066] +[group_65067] +[group_65068] +[group_65069] +[group_65070] +[group_65071] +[group_65072] +[group_65073] +[group_65074] +[group_65075] +[group_65076] +[group_65077] +[group_65078] +[group_65079] +[group_65080] +[group_65081] +[group_65082] +[group_65083] +[group_65084] +[group_65085] +[group_65086] +[group_65087] +[group_65088] +[group_65089] +[group_65090] +[group_65091] +[group_65092] +[group_65093] +[group_65094] +[group_65095] +[group_65096] +[group_65097] +[group_65098] +[group_65099] +[group_65100] +[group_65101] +[group_65102] +[group_65103] +[group_65104] +[group_65105] +[group_65106] +[group_65107] +[group_65108] +[group_65109] +[group_65110] +[group_65111] +[group_65112] +[group_65113] +[group_65114] +[group_65115] +[group_65116] +[group_65117] +[group_65118] +[group_65119] +[group_65120] +[group_65121] +[group_65122] +[group_65123] +[group_65124] +[group_65125] +[group_65126] +[group_65127] +[group_65128] +[group_65129] +[group_65130] +[group_65131] +[group_65132] +[group_65133] +[group_65134] +[group_65135] +[group_65136] +[group_65137] +[group_65138] +[group_65139] +[group_65140] +[group_65141] +[group_65142] +[group_65143] +[group_65144] +[group_65145] +[group_65146] +[group_65147] +[group_65148] +[group_65149] +[group_65150] +[group_65151] +[group_65152] +[group_65153] +[group_65154] +[group_65155] +[group_65156] +[group_65157] +[group_65158] +[group_65159] +[group_65160] +[group_65161] +[group_65162] +[group_65163] +[group_65164] +[group_65165] +[group_65166] +[group_65167] +[group_65168] +[group_65169] +[group_65170] +[group_65171] +[group_65172] +[group_65173] +[group_65174] +[group_65175] +[group_65176] +[group_65177] +[group_65178] +[group_65179] +[group_65180] +[group_65181] +[group_65182] +[group_65183] +[group_65184] +[group_65185] +[group_65186] +[group_65187] +[group_65188] +[group_65189] +[group_65190] +[group_65191] +[group_65192] +[group_65193] +[group_65194] +[group_65195] +[group_65196] +[group_65197] +[group_65198] +[group_65199] +[group_65200] +[group_65201] +[group_65202] +[group_65203] +[group_65204] +[group_65205] +[group_65206] +[group_65207] +[group_65208] +[group_65209] +[group_65210] +[group_65211] +[group_65212] +[group_65213] +[group_65214] +[group_65215] +[group_65216] +[group_65217] +[group_65218] +[group_65219] +[group_65220] +[group_65221] +[group_65222] +[group_65223] +[group_65224] +[group_65225] +[group_65226] +[group_65227] +[group_65228] +[group_65229] +[group_65230] +[group_65231] +[group_65232] +[group_65233] +[group_65234] +[group_65235] +[group_65236] +[group_65237] +[group_65238] +[group_65239] +[group_65240] +[group_65241] +[group_65242] +[group_65243] +[group_65244] +[group_65245] +[group_65246] +[group_65247] +[group_65248] +[group_65249] +[group_65250] +[group_65251] +[group_65252] +[group_65253] +[group_65254] +[group_65255] +[group_65256] +[group_65257] +[group_65258] +[group_65259] +[group_65260] +[group_65261] +[group_65262] +[group_65263] +[group_65264] +[group_65265] +[group_65266] +[group_65267] +[group_65268] +[group_65269] +[group_65270] +[group_65271] +[group_65272] +[group_65273] +[group_65274] +[group_65275] +[group_65276] +[group_65277] +[group_65278] +[group_65279] +[group_65280] +[group_65281] +[group_65282] +[group_65283] +[group_65284] +[group_65285] +[group_65286] +[group_65287] +[group_65288] +[group_65289] +[group_65290] +[group_65291] +[group_65292] +[group_65293] +[group_65294] +[group_65295] +[group_65296] +[group_65297] +[group_65298] +[group_65299] +[group_65300] +[group_65301] +[group_65302] +[group_65303] +[group_65304] +[group_65305] +[group_65306] +[group_65307] +[group_65308] +[group_65309] +[group_65310] +[group_65311] +[group_65312] +[group_65313] +[group_65314] +[group_65315] +[group_65316] +[group_65317] +[group_65318] +[group_65319] +[group_65320] +[group_65321] +[group_65322] +[group_65323] +[group_65324] +[group_65325] +[group_65326] +[group_65327] +[group_65328] +[group_65329] +[group_65330] +[group_65331] +[group_65332] +[group_65333] +[group_65334] +[group_65335] +[group_65336] +[group_65337] +[group_65338] +[group_65339] +[group_65340] +[group_65341] +[group_65342] +[group_65343] +[group_65344] +[group_65345] +[group_65346] +[group_65347] +[group_65348] +[group_65349] +[group_65350] +[group_65351] +[group_65352] +[group_65353] +[group_65354] +[group_65355] +[group_65356] +[group_65357] +[group_65358] +[group_65359] +[group_65360] +[group_65361] +[group_65362] +[group_65363] +[group_65364] +[group_65365] +[group_65366] +[group_65367] +[group_65368] +[group_65369] +[group_65370] +[group_65371] +[group_65372] +[group_65373] +[group_65374] +[group_65375] +[group_65376] +[group_65377] +[group_65378] +[group_65379] +[group_65380] +[group_65381] +[group_65382] +[group_65383] +[group_65384] +[group_65385] +[group_65386] +[group_65387] +[group_65388] +[group_65389] +[group_65390] +[group_65391] +[group_65392] +[group_65393] +[group_65394] +[group_65395] +[group_65396] +[group_65397] +[group_65398] +[group_65399] +[group_65400] +[group_65401] +[group_65402] +[group_65403] +[group_65404] +[group_65405] +[group_65406] +[group_65407] +[group_65408] +[group_65409] +[group_65410] +[group_65411] +[group_65412] +[group_65413] +[group_65414] +[group_65415] +[group_65416] +[group_65417] +[group_65418] +[group_65419] +[group_65420] +[group_65421] +[group_65422] +[group_65423] +[group_65424] +[group_65425] +[group_65426] +[group_65427] +[group_65428] +[group_65429] +[group_65430] +[group_65431] +[group_65432] +[group_65433] +[group_65434] +[group_65435] +[group_65436] +[group_65437] +[group_65438] +[group_65439] +[group_65440] +[group_65441] +[group_65442] +[group_65443] +[group_65444] +[group_65445] +[group_65446] +[group_65447] +[group_65448] +[group_65449] +[group_65450] +[group_65451] +[group_65452] +[group_65453] +[group_65454] +[group_65455] +[group_65456] +[group_65457] +[group_65458] +[group_65459] +[group_65460] +[group_65461] +[group_65462] +[group_65463] +[group_65464] +[group_65465] +[group_65466] +[group_65467] +[group_65468] +[group_65469] +[group_65470] +[group_65471] +[group_65472] +[group_65473] +[group_65474] +[group_65475] +[group_65476] +[group_65477] +[group_65478] +[group_65479] +[group_65480] +[group_65481] +[group_65482] +[group_65483] +[group_65484] +[group_65485] +[group_65486] +[group_65487] +[group_65488] +[group_65489] +[group_65490] +[group_65491] +[group_65492] +[group_65493] +[group_65494] +[group_65495] +[group_65496] +[group_65497] +[group_65498] +[group_65499] +[group_65500] +[group_65501] +[group_65502] +[group_65503] +[group_65504] +[group_65505] +[group_65506] +[group_65507] +[group_65508] +[group_65509] +[group_65510] +[group_65511] +[group_65512] +[group_65513] +[group_65514] +[group_65515] +[group_65516] +[group_65517] +[group_65518] +[group_65519] +[group_65520] +[group_65521] +[group_65522] +[group_65523] +[group_65524] +[group_65525] +[group_65526] +[group_65527] +[group_65528] +[group_65529] +[group_65530] +[group_65531] +[group_65532] +[group_65533] +[group_65534] +[group_65535] +[group_65536] +[group_65537] +[group_65538] +[group_65539] +[group_65540] +[group_65541] +[group_65542] +[group_65543] +[group_65544] +[group_65545] +[group_65546] +[group_65547] +[group_65548] +[group_65549] +[group_65550] +[group_65551] +[group_65552] +[group_65553] +[group_65554] +[group_65555] +[group_65556] +[group_65557] +[group_65558] +[group_65559] +[group_65560] +[group_65561] +[group_65562] +[group_65563] +[group_65564] +[group_65565] +[group_65566] +[group_65567] +[group_65568] +[group_65569] +[group_65570] +[group_65571] +[group_65572] +[group_65573] +[group_65574] +[group_65575] +[group_65576] +[group_65577] +[group_65578] +[group_65579] +[group_65580] +[group_65581] +[group_65582] +[group_65583] +[group_65584] +[group_65585] +[group_65586] +[group_65587] +[group_65588] +[group_65589] +[group_65590] +[group_65591] +[group_65592] +[group_65593] +[group_65594] +[group_65595] +[group_65596] +[group_65597] +[group_65598] +[group_65599] +[group_65600] +[group_65601] +[group_65602] +[group_65603] +[group_65604] +[group_65605] +[group_65606] +[group_65607] +[group_65608] +[group_65609] +[group_65610] +[group_65611] +[group_65612] +[group_65613] +[group_65614] +[group_65615] +[group_65616] +[group_65617] +[group_65618] +[group_65619] +[group_65620] +[group_65621] +[group_65622] +[group_65623] +[group_65624] +[group_65625] +[group_65626] +[group_65627] +[group_65628] +[group_65629] +[group_65630] +[group_65631] +[group_65632] +[group_65633] +[group_65634] +[group_65635] +[group_65636] +[group_65637] +[group_65638] +[group_65639] +[group_65640] +[group_65641] +[group_65642] +[group_65643] +[group_65644] +[group_65645] +[group_65646] +[group_65647] +[group_65648] +[group_65649] +[group_65650] +[group_65651] +[group_65652] +[group_65653] +[group_65654] +[group_65655] +[group_65656] +[group_65657] +[group_65658] +[group_65659] +[group_65660] +[group_65661] +[group_65662] +[group_65663] +[group_65664] +[group_65665] +[group_65666] +[group_65667] +[group_65668] +[group_65669] +[group_65670] +[group_65671] +[group_65672] +[group_65673] +[group_65674] +[group_65675] +[group_65676] +[group_65677] +[group_65678] +[group_65679] +[group_65680] +[group_65681] +[group_65682] +[group_65683] +[group_65684] +[group_65685] +[group_65686] +[group_65687] +[group_65688] +[group_65689] +[group_65690] +[group_65691] +[group_65692] +[group_65693] +[group_65694] +[group_65695] +[group_65696] +[group_65697] +[group_65698] +[group_65699] +[group_65700] +[group_65701] +[group_65702] +[group_65703] +[group_65704] +[group_65705] +[group_65706] +[group_65707] +[group_65708] +[group_65709] +[group_65710] +[group_65711] +[group_65712] +[group_65713] +[group_65714] +[group_65715] +[group_65716] +[group_65717] +[group_65718] +[group_65719] +[group_65720] +[group_65721] +[group_65722] +[group_65723] +[group_65724] +[group_65725] +[group_65726] +[group_65727] +[group_65728] +[group_65729] +[group_65730] +[group_65731] +[group_65732] +[group_65733] +[group_65734] +[group_65735] +[group_65736] +[group_65737] +[group_65738] +[group_65739] +[group_65740] +[group_65741] +[group_65742] +[group_65743] +[group_65744] +[group_65745] +[group_65746] +[group_65747] +[group_65748] +[group_65749] +[group_65750] +[group_65751] +[group_65752] +[group_65753] +[group_65754] +[group_65755] +[group_65756] +[group_65757] +[group_65758] +[group_65759] +[group_65760] +[group_65761] +[group_65762] +[group_65763] +[group_65764] +[group_65765] +[group_65766] +[group_65767] +[group_65768] +[group_65769] +[group_65770] +[group_65771] +[group_65772] +[group_65773] +[group_65774] +[group_65775] +[group_65776] +[group_65777] +[group_65778] +[group_65779] +[group_65780] +[group_65781] +[group_65782] +[group_65783] +[group_65784] +[group_65785] +[group_65786] +[group_65787] +[group_65788] +[group_65789] +[group_65790] +[group_65791] +[group_65792] +[group_65793] +[group_65794] +[group_65795] +[group_65796] +[group_65797] +[group_65798] +[group_65799] +[group_65800] +[group_65801] +[group_65802] +[group_65803] +[group_65804] +[group_65805] +[group_65806] +[group_65807] +[group_65808] +[group_65809] +[group_65810] +[group_65811] +[group_65812] +[group_65813] +[group_65814] +[group_65815] +[group_65816] +[group_65817] +[group_65818] +[group_65819] +[group_65820] +[group_65821] +[group_65822] +[group_65823] +[group_65824] +[group_65825] +[group_65826] +[group_65827] +[group_65828] +[group_65829] +[group_65830] +[group_65831] +[group_65832] +[group_65833] +[group_65834] +[group_65835] +[group_65836] +[group_65837] +[group_65838] +[group_65839] +[group_65840] +[group_65841] +[group_65842] +[group_65843] +[group_65844] +[group_65845] +[group_65846] +[group_65847] +[group_65848] +[group_65849] +[group_65850] +[group_65851] +[group_65852] +[group_65853] +[group_65854] +[group_65855] +[group_65856] +[group_65857] +[group_65858] +[group_65859] +[group_65860] +[group_65861] +[group_65862] +[group_65863] +[group_65864] +[group_65865] +[group_65866] +[group_65867] +[group_65868] +[group_65869] +[group_65870] +[group_65871] +[group_65872] +[group_65873] +[group_65874] +[group_65875] +[group_65876] +[group_65877] +[group_65878] +[group_65879] +[group_65880] +[group_65881] +[group_65882] +[group_65883] +[group_65884] +[group_65885] +[group_65886] +[group_65887] +[group_65888] +[group_65889] +[group_65890] +[group_65891] +[group_65892] +[group_65893] +[group_65894] +[group_65895] +[group_65896] +[group_65897] +[group_65898] +[group_65899] +[group_65900] +[group_65901] +[group_65902] +[group_65903] +[group_65904] +[group_65905] +[group_65906] +[group_65907] +[group_65908] +[group_65909] +[group_65910] +[group_65911] +[group_65912] +[group_65913] +[group_65914] +[group_65915] +[group_65916] +[group_65917] +[group_65918] +[group_65919] +[group_65920] +[group_65921] +[group_65922] +[group_65923] +[group_65924] +[group_65925] +[group_65926] +[group_65927] +[group_65928] +[group_65929] +[group_65930] +[group_65931] +[group_65932] +[group_65933] +[group_65934] +[group_65935] +[group_65936] +[group_65937] +[group_65938] +[group_65939] +[group_65940] +[group_65941] +[group_65942] +[group_65943] +[group_65944] +[group_65945] +[group_65946] +[group_65947] +[group_65948] +[group_65949] +[group_65950] +[group_65951] +[group_65952] +[group_65953] +[group_65954] +[group_65955] +[group_65956] +[group_65957] +[group_65958] +[group_65959] +[group_65960] +[group_65961] +[group_65962] +[group_65963] +[group_65964] +[group_65965] +[group_65966] +[group_65967] +[group_65968] +[group_65969] +[group_65970] +[group_65971] +[group_65972] +[group_65973] +[group_65974] +[group_65975] +[group_65976] +[group_65977] +[group_65978] +[group_65979] +[group_65980] +[group_65981] +[group_65982] +[group_65983] +[group_65984] +[group_65985] +[group_65986] +[group_65987] +[group_65988] +[group_65989] +[group_65990] +[group_65991] +[group_65992] +[group_65993] +[group_65994] +[group_65995] +[group_65996] +[group_65997] +[group_65998] +[group_65999] +[group_66000] +[group_66001] +[group_66002] +[group_66003] +[group_66004] +[group_66005] +[group_66006] +[group_66007] +[group_66008] +[group_66009] +[group_66010] +[group_66011] +[group_66012] +[group_66013] +[group_66014] +[group_66015] +[group_66016] +[group_66017] +[group_66018] +[group_66019] +[group_66020] +[group_66021] +[group_66022] +[group_66023] +[group_66024] +[group_66025] +[group_66026] +[group_66027] +[group_66028] +[group_66029] +[group_66030] +[group_66031] +[group_66032] +[group_66033] +[group_66034] +[group_66035] +[group_66036] +[group_66037] +[group_66038] +[group_66039] +[group_66040] +[group_66041] +[group_66042] +[group_66043] +[group_66044] +[group_66045] +[group_66046] +[group_66047] +[group_66048] +[group_66049] +[group_66050] +[group_66051] +[group_66052] +[group_66053] +[group_66054] +[group_66055] +[group_66056] +[group_66057] +[group_66058] +[group_66059] +[group_66060] +[group_66061] +[group_66062] +[group_66063] +[group_66064] +[group_66065] +[group_66066] +[group_66067] +[group_66068] +[group_66069] +[group_66070] +[group_66071] +[group_66072] +[group_66073] +[group_66074] +[group_66075] +[group_66076] +[group_66077] +[group_66078] +[group_66079] +[group_66080] +[group_66081] +[group_66082] +[group_66083] +[group_66084] +[group_66085] +[group_66086] +[group_66087] +[group_66088] +[group_66089] +[group_66090] +[group_66091] +[group_66092] +[group_66093] +[group_66094] +[group_66095] +[group_66096] +[group_66097] +[group_66098] +[group_66099] +[group_66100] +[group_66101] +[group_66102] +[group_66103] +[group_66104] +[group_66105] +[group_66106] +[group_66107] +[group_66108] +[group_66109] +[group_66110] +[group_66111] +[group_66112] +[group_66113] +[group_66114] +[group_66115] +[group_66116] +[group_66117] +[group_66118] +[group_66119] +[group_66120] +[group_66121] +[group_66122] +[group_66123] +[group_66124] +[group_66125] +[group_66126] +[group_66127] +[group_66128] +[group_66129] +[group_66130] +[group_66131] +[group_66132] +[group_66133] +[group_66134] +[group_66135] +[group_66136] +[group_66137] +[group_66138] +[group_66139] +[group_66140] +[group_66141] +[group_66142] +[group_66143] +[group_66144] +[group_66145] +[group_66146] +[group_66147] +[group_66148] +[group_66149] +[group_66150] +[group_66151] +[group_66152] +[group_66153] +[group_66154] +[group_66155] +[group_66156] +[group_66157] +[group_66158] +[group_66159] +[group_66160] +[group_66161] +[group_66162] +[group_66163] +[group_66164] +[group_66165] +[group_66166] +[group_66167] +[group_66168] +[group_66169] +[group_66170] +[group_66171] +[group_66172] +[group_66173] +[group_66174] +[group_66175] +[group_66176] +[group_66177] +[group_66178] +[group_66179] +[group_66180] +[group_66181] +[group_66182] +[group_66183] +[group_66184] +[group_66185] +[group_66186] +[group_66187] +[group_66188] +[group_66189] +[group_66190] +[group_66191] +[group_66192] +[group_66193] +[group_66194] +[group_66195] +[group_66196] +[group_66197] +[group_66198] +[group_66199] +[group_66200] +[group_66201] +[group_66202] +[group_66203] +[group_66204] +[group_66205] +[group_66206] +[group_66207] +[group_66208] +[group_66209] +[group_66210] +[group_66211] +[group_66212] +[group_66213] +[group_66214] +[group_66215] +[group_66216] +[group_66217] +[group_66218] +[group_66219] +[group_66220] +[group_66221] +[group_66222] +[group_66223] +[group_66224] +[group_66225] +[group_66226] +[group_66227] +[group_66228] +[group_66229] +[group_66230] +[group_66231] +[group_66232] +[group_66233] +[group_66234] +[group_66235] +[group_66236] +[group_66237] +[group_66238] +[group_66239] +[group_66240] +[group_66241] +[group_66242] +[group_66243] +[group_66244] +[group_66245] +[group_66246] +[group_66247] +[group_66248] +[group_66249] +[group_66250] +[group_66251] +[group_66252] +[group_66253] +[group_66254] +[group_66255] +[group_66256] +[group_66257] +[group_66258] +[group_66259] +[group_66260] +[group_66261] +[group_66262] +[group_66263] +[group_66264] +[group_66265] +[group_66266] +[group_66267] +[group_66268] +[group_66269] +[group_66270] +[group_66271] +[group_66272] +[group_66273] +[group_66274] +[group_66275] +[group_66276] +[group_66277] +[group_66278] +[group_66279] +[group_66280] +[group_66281] +[group_66282] +[group_66283] +[group_66284] +[group_66285] +[group_66286] +[group_66287] +[group_66288] +[group_66289] +[group_66290] +[group_66291] +[group_66292] +[group_66293] +[group_66294] +[group_66295] +[group_66296] +[group_66297] +[group_66298] +[group_66299] +[group_66300] +[group_66301] +[group_66302] +[group_66303] +[group_66304] +[group_66305] +[group_66306] +[group_66307] +[group_66308] +[group_66309] +[group_66310] +[group_66311] +[group_66312] +[group_66313] +[group_66314] +[group_66315] +[group_66316] +[group_66317] +[group_66318] +[group_66319] +[group_66320] +[group_66321] +[group_66322] +[group_66323] +[group_66324] +[group_66325] +[group_66326] +[group_66327] +[group_66328] +[group_66329] +[group_66330] +[group_66331] +[group_66332] +[group_66333] +[group_66334] +[group_66335] +[group_66336] +[group_66337] +[group_66338] +[group_66339] +[group_66340] +[group_66341] +[group_66342] +[group_66343] +[group_66344] +[group_66345] +[group_66346] +[group_66347] +[group_66348] +[group_66349] +[group_66350] +[group_66351] +[group_66352] +[group_66353] +[group_66354] +[group_66355] +[group_66356] +[group_66357] +[group_66358] +[group_66359] +[group_66360] +[group_66361] +[group_66362] +[group_66363] +[group_66364] +[group_66365] +[group_66366] +[group_66367] +[group_66368] +[group_66369] +[group_66370] +[group_66371] +[group_66372] +[group_66373] +[group_66374] +[group_66375] +[group_66376] +[group_66377] +[group_66378] +[group_66379] +[group_66380] +[group_66381] +[group_66382] +[group_66383] +[group_66384] +[group_66385] +[group_66386] +[group_66387] +[group_66388] +[group_66389] +[group_66390] +[group_66391] +[group_66392] +[group_66393] +[group_66394] +[group_66395] +[group_66396] +[group_66397] +[group_66398] +[group_66399] +[group_66400] +[group_66401] +[group_66402] +[group_66403] +[group_66404] +[group_66405] +[group_66406] +[group_66407] +[group_66408] +[group_66409] +[group_66410] +[group_66411] +[group_66412] +[group_66413] +[group_66414] +[group_66415] +[group_66416] +[group_66417] +[group_66418] +[group_66419] +[group_66420] +[group_66421] +[group_66422] +[group_66423] +[group_66424] +[group_66425] +[group_66426] +[group_66427] +[group_66428] +[group_66429] +[group_66430] +[group_66431] +[group_66432] +[group_66433] +[group_66434] +[group_66435] +[group_66436] +[group_66437] +[group_66438] +[group_66439] +[group_66440] +[group_66441] +[group_66442] +[group_66443] +[group_66444] +[group_66445] +[group_66446] +[group_66447] +[group_66448] +[group_66449] +[group_66450] +[group_66451] +[group_66452] +[group_66453] +[group_66454] +[group_66455] +[group_66456] +[group_66457] +[group_66458] +[group_66459] +[group_66460] +[group_66461] +[group_66462] +[group_66463] +[group_66464] +[group_66465] +[group_66466] +[group_66467] +[group_66468] +[group_66469] +[group_66470] +[group_66471] +[group_66472] +[group_66473] +[group_66474] +[group_66475] +[group_66476] +[group_66477] +[group_66478] +[group_66479] +[group_66480] +[group_66481] +[group_66482] +[group_66483] +[group_66484] +[group_66485] +[group_66486] +[group_66487] +[group_66488] +[group_66489] +[group_66490] +[group_66491] +[group_66492] +[group_66493] +[group_66494] +[group_66495] +[group_66496] +[group_66497] +[group_66498] +[group_66499] +[group_66500] +[group_66501] +[group_66502] +[group_66503] +[group_66504] +[group_66505] +[group_66506] +[group_66507] +[group_66508] +[group_66509] +[group_66510] +[group_66511] +[group_66512] +[group_66513] +[group_66514] +[group_66515] +[group_66516] +[group_66517] +[group_66518] +[group_66519] +[group_66520] +[group_66521] +[group_66522] +[group_66523] +[group_66524] +[group_66525] +[group_66526] +[group_66527] +[group_66528] +[group_66529] +[group_66530] +[group_66531] +[group_66532] +[group_66533] +[group_66534] +[group_66535] +[group_66536] +[group_66537] +[group_66538] +[group_66539] +[group_66540] +[group_66541] +[group_66542] +[group_66543] +[group_66544] +[group_66545] +[group_66546] +[group_66547] +[group_66548] +[group_66549] +[group_66550] +[group_66551] +[group_66552] +[group_66553] +[group_66554] +[group_66555] +[group_66556] +[group_66557] +[group_66558] +[group_66559] +[group_66560] +[group_66561] +[group_66562] +[group_66563] +[group_66564] +[group_66565] +[group_66566] +[group_66567] +[group_66568] +[group_66569] +[group_66570] +[group_66571] +[group_66572] +[group_66573] +[group_66574] +[group_66575] +[group_66576] +[group_66577] +[group_66578] +[group_66579] +[group_66580] +[group_66581] +[group_66582] +[group_66583] +[group_66584] +[group_66585] +[group_66586] +[group_66587] +[group_66588] +[group_66589] +[group_66590] +[group_66591] +[group_66592] +[group_66593] +[group_66594] +[group_66595] +[group_66596] +[group_66597] +[group_66598] +[group_66599] +[group_66600] +[group_66601] +[group_66602] +[group_66603] +[group_66604] +[group_66605] +[group_66606] +[group_66607] +[group_66608] +[group_66609] +[group_66610] +[group_66611] +[group_66612] +[group_66613] +[group_66614] +[group_66615] +[group_66616] +[group_66617] +[group_66618] +[group_66619] +[group_66620] +[group_66621] +[group_66622] +[group_66623] +[group_66624] +[group_66625] +[group_66626] +[group_66627] +[group_66628] +[group_66629] +[group_66630] +[group_66631] +[group_66632] +[group_66633] +[group_66634] +[group_66635] +[group_66636] +[group_66637] +[group_66638] +[group_66639] +[group_66640] +[group_66641] +[group_66642] +[group_66643] +[group_66644] +[group_66645] +[group_66646] +[group_66647] +[group_66648] +[group_66649] +[group_66650] +[group_66651] +[group_66652] +[group_66653] +[group_66654] +[group_66655] +[group_66656] +[group_66657] +[group_66658] +[group_66659] +[group_66660] +[group_66661] +[group_66662] +[group_66663] +[group_66664] +[group_66665] +[group_66666] +[group_66667] +[group_66668] +[group_66669] +[group_66670] +[group_66671] +[group_66672] +[group_66673] +[group_66674] +[group_66675] +[group_66676] +[group_66677] +[group_66678] +[group_66679] +[group_66680] +[group_66681] +[group_66682] +[group_66683] +[group_66684] +[group_66685] +[group_66686] +[group_66687] +[group_66688] +[group_66689] +[group_66690] +[group_66691] +[group_66692] +[group_66693] +[group_66694] +[group_66695] +[group_66696] +[group_66697] +[group_66698] +[group_66699] +[group_66700] +[group_66701] +[group_66702] +[group_66703] +[group_66704] +[group_66705] +[group_66706] +[group_66707] +[group_66708] +[group_66709] +[group_66710] +[group_66711] +[group_66712] +[group_66713] +[group_66714] +[group_66715] +[group_66716] +[group_66717] +[group_66718] +[group_66719] +[group_66720] +[group_66721] +[group_66722] +[group_66723] +[group_66724] +[group_66725] +[group_66726] +[group_66727] +[group_66728] +[group_66729] +[group_66730] +[group_66731] +[group_66732] +[group_66733] +[group_66734] +[group_66735] +[group_66736] +[group_66737] +[group_66738] +[group_66739] +[group_66740] +[group_66741] +[group_66742] +[group_66743] +[group_66744] +[group_66745] +[group_66746] +[group_66747] +[group_66748] +[group_66749] +[group_66750] +[group_66751] +[group_66752] +[group_66753] +[group_66754] +[group_66755] +[group_66756] +[group_66757] +[group_66758] +[group_66759] +[group_66760] +[group_66761] +[group_66762] +[group_66763] +[group_66764] +[group_66765] +[group_66766] +[group_66767] +[group_66768] +[group_66769] +[group_66770] +[group_66771] +[group_66772] +[group_66773] +[group_66774] +[group_66775] +[group_66776] +[group_66777] +[group_66778] +[group_66779] +[group_66780] +[group_66781] +[group_66782] +[group_66783] +[group_66784] +[group_66785] +[group_66786] +[group_66787] +[group_66788] +[group_66789] +[group_66790] +[group_66791] +[group_66792] +[group_66793] +[group_66794] +[group_66795] +[group_66796] +[group_66797] +[group_66798] +[group_66799] +[group_66800] +[group_66801] +[group_66802] +[group_66803] +[group_66804] +[group_66805] +[group_66806] +[group_66807] +[group_66808] +[group_66809] +[group_66810] +[group_66811] +[group_66812] +[group_66813] +[group_66814] +[group_66815] +[group_66816] +[group_66817] +[group_66818] +[group_66819] +[group_66820] +[group_66821] +[group_66822] +[group_66823] +[group_66824] +[group_66825] +[group_66826] +[group_66827] +[group_66828] +[group_66829] +[group_66830] +[group_66831] +[group_66832] +[group_66833] +[group_66834] +[group_66835] +[group_66836] +[group_66837] +[group_66838] +[group_66839] +[group_66840] +[group_66841] +[group_66842] +[group_66843] +[group_66844] +[group_66845] +[group_66846] +[group_66847] +[group_66848] +[group_66849] +[group_66850] +[group_66851] +[group_66852] +[group_66853] +[group_66854] +[group_66855] +[group_66856] +[group_66857] +[group_66858] +[group_66859] +[group_66860] +[group_66861] +[group_66862] +[group_66863] +[group_66864] +[group_66865] +[group_66866] +[group_66867] +[group_66868] +[group_66869] +[group_66870] +[group_66871] +[group_66872] +[group_66873] +[group_66874] +[group_66875] +[group_66876] +[group_66877] +[group_66878] +[group_66879] +[group_66880] +[group_66881] +[group_66882] +[group_66883] +[group_66884] +[group_66885] +[group_66886] +[group_66887] +[group_66888] +[group_66889] +[group_66890] +[group_66891] +[group_66892] +[group_66893] +[group_66894] +[group_66895] +[group_66896] +[group_66897] +[group_66898] +[group_66899] +[group_66900] +[group_66901] +[group_66902] +[group_66903] +[group_66904] +[group_66905] +[group_66906] +[group_66907] +[group_66908] +[group_66909] +[group_66910] +[group_66911] +[group_66912] +[group_66913] +[group_66914] +[group_66915] +[group_66916] +[group_66917] +[group_66918] +[group_66919] +[group_66920] +[group_66921] +[group_66922] +[group_66923] +[group_66924] +[group_66925] +[group_66926] +[group_66927] +[group_66928] +[group_66929] +[group_66930] +[group_66931] +[group_66932] +[group_66933] +[group_66934] +[group_66935] +[group_66936] +[group_66937] +[group_66938] +[group_66939] +[group_66940] +[group_66941] +[group_66942] +[group_66943] +[group_66944] +[group_66945] +[group_66946] +[group_66947] +[group_66948] +[group_66949] +[group_66950] +[group_66951] +[group_66952] +[group_66953] +[group_66954] +[group_66955] +[group_66956] +[group_66957] +[group_66958] +[group_66959] +[group_66960] +[group_66961] +[group_66962] +[group_66963] +[group_66964] +[group_66965] +[group_66966] +[group_66967] +[group_66968] +[group_66969] +[group_66970] +[group_66971] +[group_66972] +[group_66973] +[group_66974] +[group_66975] +[group_66976] +[group_66977] +[group_66978] +[group_66979] +[group_66980] +[group_66981] +[group_66982] +[group_66983] +[group_66984] +[group_66985] +[group_66986] +[group_66987] +[group_66988] +[group_66989] +[group_66990] +[group_66991] +[group_66992] +[group_66993] +[group_66994] +[group_66995] +[group_66996] +[group_66997] +[group_66998] +[group_66999] +[group_67000] +[group_67001] +[group_67002] +[group_67003] +[group_67004] +[group_67005] +[group_67006] +[group_67007] +[group_67008] +[group_67009] +[group_67010] +[group_67011] +[group_67012] +[group_67013] +[group_67014] +[group_67015] +[group_67016] +[group_67017] +[group_67018] +[group_67019] +[group_67020] +[group_67021] +[group_67022] +[group_67023] +[group_67024] +[group_67025] +[group_67026] +[group_67027] +[group_67028] +[group_67029] +[group_67030] +[group_67031] +[group_67032] +[group_67033] +[group_67034] +[group_67035] +[group_67036] +[group_67037] +[group_67038] +[group_67039] +[group_67040] +[group_67041] +[group_67042] +[group_67043] +[group_67044] +[group_67045] +[group_67046] +[group_67047] +[group_67048] +[group_67049] +[group_67050] +[group_67051] +[group_67052] +[group_67053] +[group_67054] +[group_67055] +[group_67056] +[group_67057] +[group_67058] +[group_67059] +[group_67060] +[group_67061] +[group_67062] +[group_67063] +[group_67064] +[group_67065] +[group_67066] +[group_67067] +[group_67068] +[group_67069] +[group_67070] +[group_67071] +[group_67072] +[group_67073] +[group_67074] +[group_67075] +[group_67076] +[group_67077] +[group_67078] +[group_67079] +[group_67080] +[group_67081] +[group_67082] +[group_67083] +[group_67084] +[group_67085] +[group_67086] +[group_67087] +[group_67088] +[group_67089] +[group_67090] +[group_67091] +[group_67092] +[group_67093] +[group_67094] +[group_67095] +[group_67096] +[group_67097] +[group_67098] +[group_67099] +[group_67100] +[group_67101] +[group_67102] +[group_67103] +[group_67104] +[group_67105] +[group_67106] +[group_67107] +[group_67108] +[group_67109] +[group_67110] +[group_67111] +[group_67112] +[group_67113] +[group_67114] +[group_67115] +[group_67116] +[group_67117] +[group_67118] +[group_67119] +[group_67120] +[group_67121] +[group_67122] +[group_67123] +[group_67124] +[group_67125] +[group_67126] +[group_67127] +[group_67128] +[group_67129] +[group_67130] +[group_67131] +[group_67132] +[group_67133] +[group_67134] +[group_67135] +[group_67136] +[group_67137] +[group_67138] +[group_67139] +[group_67140] +[group_67141] +[group_67142] +[group_67143] +[group_67144] +[group_67145] +[group_67146] +[group_67147] +[group_67148] +[group_67149] +[group_67150] +[group_67151] +[group_67152] +[group_67153] +[group_67154] +[group_67155] +[group_67156] +[group_67157] +[group_67158] +[group_67159] +[group_67160] +[group_67161] +[group_67162] +[group_67163] +[group_67164] +[group_67165] +[group_67166] +[group_67167] +[group_67168] +[group_67169] +[group_67170] +[group_67171] +[group_67172] +[group_67173] +[group_67174] +[group_67175] +[group_67176] +[group_67177] +[group_67178] +[group_67179] +[group_67180] +[group_67181] +[group_67182] +[group_67183] +[group_67184] +[group_67185] +[group_67186] +[group_67187] +[group_67188] +[group_67189] +[group_67190] +[group_67191] +[group_67192] +[group_67193] +[group_67194] +[group_67195] +[group_67196] +[group_67197] +[group_67198] +[group_67199] +[group_67200] +[group_67201] +[group_67202] +[group_67203] +[group_67204] +[group_67205] +[group_67206] +[group_67207] +[group_67208] +[group_67209] +[group_67210] +[group_67211] +[group_67212] +[group_67213] +[group_67214] +[group_67215] +[group_67216] +[group_67217] +[group_67218] +[group_67219] +[group_67220] +[group_67221] +[group_67222] +[group_67223] +[group_67224] +[group_67225] +[group_67226] +[group_67227] +[group_67228] +[group_67229] +[group_67230] +[group_67231] +[group_67232] +[group_67233] +[group_67234] +[group_67235] +[group_67236] +[group_67237] +[group_67238] +[group_67239] +[group_67240] +[group_67241] +[group_67242] +[group_67243] +[group_67244] +[group_67245] +[group_67246] +[group_67247] +[group_67248] +[group_67249] +[group_67250] +[group_67251] +[group_67252] +[group_67253] +[group_67254] +[group_67255] +[group_67256] +[group_67257] +[group_67258] +[group_67259] +[group_67260] +[group_67261] +[group_67262] +[group_67263] +[group_67264] +[group_67265] +[group_67266] +[group_67267] +[group_67268] +[group_67269] +[group_67270] +[group_67271] +[group_67272] +[group_67273] +[group_67274] +[group_67275] +[group_67276] +[group_67277] +[group_67278] +[group_67279] +[group_67280] +[group_67281] +[group_67282] +[group_67283] +[group_67284] +[group_67285] +[group_67286] +[group_67287] +[group_67288] +[group_67289] +[group_67290] +[group_67291] +[group_67292] +[group_67293] +[group_67294] +[group_67295] +[group_67296] +[group_67297] +[group_67298] +[group_67299] +[group_67300] +[group_67301] +[group_67302] +[group_67303] +[group_67304] +[group_67305] +[group_67306] +[group_67307] +[group_67308] +[group_67309] +[group_67310] +[group_67311] +[group_67312] +[group_67313] +[group_67314] +[group_67315] +[group_67316] +[group_67317] +[group_67318] +[group_67319] +[group_67320] +[group_67321] +[group_67322] +[group_67323] +[group_67324] +[group_67325] +[group_67326] +[group_67327] +[group_67328] +[group_67329] +[group_67330] +[group_67331] +[group_67332] +[group_67333] +[group_67334] +[group_67335] +[group_67336] +[group_67337] +[group_67338] +[group_67339] +[group_67340] +[group_67341] +[group_67342] +[group_67343] +[group_67344] +[group_67345] +[group_67346] +[group_67347] +[group_67348] +[group_67349] +[group_67350] +[group_67351] +[group_67352] +[group_67353] +[group_67354] +[group_67355] +[group_67356] +[group_67357] +[group_67358] +[group_67359] +[group_67360] +[group_67361] +[group_67362] +[group_67363] +[group_67364] +[group_67365] +[group_67366] +[group_67367] +[group_67368] +[group_67369] +[group_67370] +[group_67371] +[group_67372] +[group_67373] +[group_67374] +[group_67375] +[group_67376] +[group_67377] +[group_67378] +[group_67379] +[group_67380] +[group_67381] +[group_67382] +[group_67383] +[group_67384] +[group_67385] +[group_67386] +[group_67387] +[group_67388] +[group_67389] +[group_67390] +[group_67391] +[group_67392] +[group_67393] +[group_67394] +[group_67395] +[group_67396] +[group_67397] +[group_67398] +[group_67399] +[group_67400] +[group_67401] +[group_67402] +[group_67403] +[group_67404] +[group_67405] +[group_67406] +[group_67407] +[group_67408] +[group_67409] +[group_67410] +[group_67411] +[group_67412] +[group_67413] +[group_67414] +[group_67415] +[group_67416] +[group_67417] +[group_67418] +[group_67419] +[group_67420] +[group_67421] +[group_67422] +[group_67423] +[group_67424] +[group_67425] +[group_67426] +[group_67427] +[group_67428] +[group_67429] +[group_67430] +[group_67431] +[group_67432] +[group_67433] +[group_67434] +[group_67435] +[group_67436] +[group_67437] +[group_67438] +[group_67439] +[group_67440] +[group_67441] +[group_67442] +[group_67443] +[group_67444] +[group_67445] +[group_67446] +[group_67447] +[group_67448] +[group_67449] +[group_67450] +[group_67451] +[group_67452] +[group_67453] +[group_67454] +[group_67455] +[group_67456] +[group_67457] +[group_67458] +[group_67459] +[group_67460] +[group_67461] +[group_67462] +[group_67463] +[group_67464] +[group_67465] +[group_67466] +[group_67467] +[group_67468] +[group_67469] +[group_67470] +[group_67471] +[group_67472] +[group_67473] +[group_67474] +[group_67475] +[group_67476] +[group_67477] +[group_67478] +[group_67479] +[group_67480] +[group_67481] +[group_67482] +[group_67483] +[group_67484] +[group_67485] +[group_67486] +[group_67487] +[group_67488] +[group_67489] +[group_67490] +[group_67491] +[group_67492] +[group_67493] +[group_67494] +[group_67495] +[group_67496] +[group_67497] +[group_67498] +[group_67499] +[group_67500] +[group_67501] +[group_67502] +[group_67503] +[group_67504] +[group_67505] +[group_67506] +[group_67507] +[group_67508] +[group_67509] +[group_67510] +[group_67511] +[group_67512] +[group_67513] +[group_67514] +[group_67515] +[group_67516] +[group_67517] +[group_67518] +[group_67519] +[group_67520] +[group_67521] +[group_67522] +[group_67523] +[group_67524] +[group_67525] +[group_67526] +[group_67527] +[group_67528] +[group_67529] +[group_67530] +[group_67531] +[group_67532] +[group_67533] +[group_67534] +[group_67535] +[group_67536] +[group_67537] +[group_67538] +[group_67539] +[group_67540] +[group_67541] +[group_67542] +[group_67543] +[group_67544] +[group_67545] +[group_67546] +[group_67547] +[group_67548] +[group_67549] +[group_67550] +[group_67551] +[group_67552] +[group_67553] +[group_67554] +[group_67555] +[group_67556] +[group_67557] +[group_67558] +[group_67559] +[group_67560] +[group_67561] +[group_67562] +[group_67563] +[group_67564] +[group_67565] +[group_67566] +[group_67567] +[group_67568] +[group_67569] +[group_67570] +[group_67571] +[group_67572] +[group_67573] +[group_67574] +[group_67575] +[group_67576] +[group_67577] +[group_67578] +[group_67579] +[group_67580] +[group_67581] +[group_67582] +[group_67583] +[group_67584] +[group_67585] +[group_67586] +[group_67587] +[group_67588] +[group_67589] +[group_67590] +[group_67591] +[group_67592] +[group_67593] +[group_67594] +[group_67595] +[group_67596] +[group_67597] +[group_67598] +[group_67599] +[group_67600] +[group_67601] +[group_67602] +[group_67603] +[group_67604] +[group_67605] +[group_67606] +[group_67607] +[group_67608] +[group_67609] +[group_67610] +[group_67611] +[group_67612] +[group_67613] +[group_67614] +[group_67615] +[group_67616] +[group_67617] +[group_67618] +[group_67619] +[group_67620] +[group_67621] +[group_67622] +[group_67623] +[group_67624] +[group_67625] +[group_67626] +[group_67627] +[group_67628] +[group_67629] +[group_67630] +[group_67631] +[group_67632] +[group_67633] +[group_67634] +[group_67635] +[group_67636] +[group_67637] +[group_67638] +[group_67639] +[group_67640] +[group_67641] +[group_67642] +[group_67643] +[group_67644] +[group_67645] +[group_67646] +[group_67647] +[group_67648] +[group_67649] +[group_67650] +[group_67651] +[group_67652] +[group_67653] +[group_67654] +[group_67655] +[group_67656] +[group_67657] +[group_67658] +[group_67659] +[group_67660] +[group_67661] +[group_67662] +[group_67663] +[group_67664] +[group_67665] +[group_67666] +[group_67667] +[group_67668] +[group_67669] +[group_67670] +[group_67671] +[group_67672] +[group_67673] +[group_67674] +[group_67675] +[group_67676] +[group_67677] +[group_67678] +[group_67679] +[group_67680] +[group_67681] +[group_67682] +[group_67683] +[group_67684] +[group_67685] +[group_67686] +[group_67687] +[group_67688] +[group_67689] +[group_67690] +[group_67691] +[group_67692] +[group_67693] +[group_67694] +[group_67695] +[group_67696] +[group_67697] +[group_67698] +[group_67699] +[group_67700] +[group_67701] +[group_67702] +[group_67703] +[group_67704] +[group_67705] +[group_67706] +[group_67707] +[group_67708] +[group_67709] +[group_67710] +[group_67711] +[group_67712] +[group_67713] +[group_67714] +[group_67715] +[group_67716] +[group_67717] +[group_67718] +[group_67719] +[group_67720] +[group_67721] +[group_67722] +[group_67723] +[group_67724] +[group_67725] +[group_67726] +[group_67727] +[group_67728] +[group_67729] +[group_67730] +[group_67731] +[group_67732] +[group_67733] +[group_67734] +[group_67735] +[group_67736] +[group_67737] +[group_67738] +[group_67739] +[group_67740] +[group_67741] +[group_67742] +[group_67743] +[group_67744] +[group_67745] +[group_67746] +[group_67747] +[group_67748] +[group_67749] +[group_67750] +[group_67751] +[group_67752] +[group_67753] +[group_67754] +[group_67755] +[group_67756] +[group_67757] +[group_67758] +[group_67759] +[group_67760] +[group_67761] +[group_67762] +[group_67763] +[group_67764] +[group_67765] +[group_67766] +[group_67767] +[group_67768] +[group_67769] +[group_67770] +[group_67771] +[group_67772] +[group_67773] +[group_67774] +[group_67775] +[group_67776] +[group_67777] +[group_67778] +[group_67779] +[group_67780] +[group_67781] +[group_67782] +[group_67783] +[group_67784] +[group_67785] +[group_67786] +[group_67787] +[group_67788] +[group_67789] +[group_67790] +[group_67791] +[group_67792] +[group_67793] +[group_67794] +[group_67795] +[group_67796] +[group_67797] +[group_67798] +[group_67799] +[group_67800] +[group_67801] +[group_67802] +[group_67803] +[group_67804] +[group_67805] +[group_67806] +[group_67807] +[group_67808] +[group_67809] +[group_67810] +[group_67811] +[group_67812] +[group_67813] +[group_67814] +[group_67815] +[group_67816] +[group_67817] +[group_67818] +[group_67819] +[group_67820] +[group_67821] +[group_67822] +[group_67823] +[group_67824] +[group_67825] +[group_67826] +[group_67827] +[group_67828] +[group_67829] +[group_67830] +[group_67831] +[group_67832] +[group_67833] +[group_67834] +[group_67835] +[group_67836] +[group_67837] +[group_67838] +[group_67839] +[group_67840] +[group_67841] +[group_67842] +[group_67843] +[group_67844] +[group_67845] +[group_67846] +[group_67847] +[group_67848] +[group_67849] +[group_67850] +[group_67851] +[group_67852] +[group_67853] +[group_67854] +[group_67855] +[group_67856] +[group_67857] +[group_67858] +[group_67859] +[group_67860] +[group_67861] +[group_67862] +[group_67863] +[group_67864] +[group_67865] +[group_67866] +[group_67867] +[group_67868] +[group_67869] +[group_67870] +[group_67871] +[group_67872] +[group_67873] +[group_67874] +[group_67875] +[group_67876] +[group_67877] +[group_67878] +[group_67879] +[group_67880] +[group_67881] +[group_67882] +[group_67883] +[group_67884] +[group_67885] +[group_67886] +[group_67887] +[group_67888] +[group_67889] +[group_67890] +[group_67891] +[group_67892] +[group_67893] +[group_67894] +[group_67895] +[group_67896] +[group_67897] +[group_67898] +[group_67899] +[group_67900] +[group_67901] +[group_67902] +[group_67903] +[group_67904] +[group_67905] +[group_67906] +[group_67907] +[group_67908] +[group_67909] +[group_67910] +[group_67911] +[group_67912] +[group_67913] +[group_67914] +[group_67915] +[group_67916] +[group_67917] +[group_67918] +[group_67919] +[group_67920] +[group_67921] +[group_67922] +[group_67923] +[group_67924] +[group_67925] +[group_67926] +[group_67927] +[group_67928] +[group_67929] +[group_67930] +[group_67931] +[group_67932] +[group_67933] +[group_67934] +[group_67935] +[group_67936] +[group_67937] +[group_67938] +[group_67939] +[group_67940] +[group_67941] +[group_67942] +[group_67943] +[group_67944] +[group_67945] +[group_67946] +[group_67947] +[group_67948] +[group_67949] +[group_67950] +[group_67951] +[group_67952] +[group_67953] +[group_67954] +[group_67955] +[group_67956] +[group_67957] +[group_67958] +[group_67959] +[group_67960] +[group_67961] +[group_67962] +[group_67963] +[group_67964] +[group_67965] +[group_67966] +[group_67967] +[group_67968] +[group_67969] +[group_67970] +[group_67971] +[group_67972] +[group_67973] +[group_67974] +[group_67975] +[group_67976] +[group_67977] +[group_67978] +[group_67979] +[group_67980] +[group_67981] +[group_67982] +[group_67983] +[group_67984] +[group_67985] +[group_67986] +[group_67987] +[group_67988] +[group_67989] +[group_67990] +[group_67991] +[group_67992] +[group_67993] +[group_67994] +[group_67995] +[group_67996] +[group_67997] +[group_67998] +[group_67999] +[group_68000] +[group_68001] +[group_68002] +[group_68003] +[group_68004] +[group_68005] +[group_68006] +[group_68007] +[group_68008] +[group_68009] +[group_68010] +[group_68011] +[group_68012] +[group_68013] +[group_68014] +[group_68015] +[group_68016] +[group_68017] +[group_68018] +[group_68019] +[group_68020] +[group_68021] +[group_68022] +[group_68023] +[group_68024] +[group_68025] +[group_68026] +[group_68027] +[group_68028] +[group_68029] +[group_68030] +[group_68031] +[group_68032] +[group_68033] +[group_68034] +[group_68035] +[group_68036] +[group_68037] +[group_68038] +[group_68039] +[group_68040] +[group_68041] +[group_68042] +[group_68043] +[group_68044] +[group_68045] +[group_68046] +[group_68047] +[group_68048] +[group_68049] +[group_68050] +[group_68051] +[group_68052] +[group_68053] +[group_68054] +[group_68055] +[group_68056] +[group_68057] +[group_68058] +[group_68059] +[group_68060] +[group_68061] +[group_68062] +[group_68063] +[group_68064] +[group_68065] +[group_68066] +[group_68067] +[group_68068] +[group_68069] +[group_68070] +[group_68071] +[group_68072] +[group_68073] +[group_68074] +[group_68075] +[group_68076] +[group_68077] +[group_68078] +[group_68079] +[group_68080] +[group_68081] +[group_68082] +[group_68083] +[group_68084] +[group_68085] +[group_68086] +[group_68087] +[group_68088] +[group_68089] +[group_68090] +[group_68091] +[group_68092] +[group_68093] +[group_68094] +[group_68095] +[group_68096] +[group_68097] +[group_68098] +[group_68099] +[group_68100] +[group_68101] +[group_68102] +[group_68103] +[group_68104] +[group_68105] +[group_68106] +[group_68107] +[group_68108] +[group_68109] +[group_68110] +[group_68111] +[group_68112] +[group_68113] +[group_68114] +[group_68115] +[group_68116] +[group_68117] +[group_68118] +[group_68119] +[group_68120] +[group_68121] +[group_68122] +[group_68123] +[group_68124] +[group_68125] +[group_68126] +[group_68127] +[group_68128] +[group_68129] +[group_68130] +[group_68131] +[group_68132] +[group_68133] +[group_68134] +[group_68135] +[group_68136] +[group_68137] +[group_68138] +[group_68139] +[group_68140] +[group_68141] +[group_68142] +[group_68143] +[group_68144] +[group_68145] +[group_68146] +[group_68147] +[group_68148] +[group_68149] +[group_68150] +[group_68151] +[group_68152] +[group_68153] +[group_68154] +[group_68155] +[group_68156] +[group_68157] +[group_68158] +[group_68159] +[group_68160] +[group_68161] +[group_68162] +[group_68163] +[group_68164] +[group_68165] +[group_68166] +[group_68167] +[group_68168] +[group_68169] +[group_68170] +[group_68171] +[group_68172] +[group_68173] +[group_68174] +[group_68175] +[group_68176] +[group_68177] +[group_68178] +[group_68179] +[group_68180] +[group_68181] +[group_68182] +[group_68183] +[group_68184] +[group_68185] +[group_68186] +[group_68187] +[group_68188] +[group_68189] +[group_68190] +[group_68191] +[group_68192] +[group_68193] +[group_68194] +[group_68195] +[group_68196] +[group_68197] +[group_68198] +[group_68199] +[group_68200] +[group_68201] +[group_68202] +[group_68203] +[group_68204] +[group_68205] +[group_68206] +[group_68207] +[group_68208] +[group_68209] +[group_68210] +[group_68211] +[group_68212] +[group_68213] +[group_68214] +[group_68215] +[group_68216] +[group_68217] +[group_68218] +[group_68219] +[group_68220] +[group_68221] +[group_68222] +[group_68223] +[group_68224] +[group_68225] +[group_68226] +[group_68227] +[group_68228] +[group_68229] +[group_68230] +[group_68231] +[group_68232] +[group_68233] +[group_68234] +[group_68235] +[group_68236] +[group_68237] +[group_68238] +[group_68239] +[group_68240] +[group_68241] +[group_68242] +[group_68243] +[group_68244] +[group_68245] +[group_68246] +[group_68247] +[group_68248] +[group_68249] +[group_68250] +[group_68251] +[group_68252] +[group_68253] +[group_68254] +[group_68255] +[group_68256] +[group_68257] +[group_68258] +[group_68259] +[group_68260] +[group_68261] +[group_68262] +[group_68263] +[group_68264] +[group_68265] +[group_68266] +[group_68267] +[group_68268] +[group_68269] +[group_68270] +[group_68271] +[group_68272] +[group_68273] +[group_68274] +[group_68275] +[group_68276] +[group_68277] +[group_68278] +[group_68279] +[group_68280] +[group_68281] +[group_68282] +[group_68283] +[group_68284] +[group_68285] +[group_68286] +[group_68287] +[group_68288] +[group_68289] +[group_68290] +[group_68291] +[group_68292] +[group_68293] +[group_68294] +[group_68295] +[group_68296] +[group_68297] +[group_68298] +[group_68299] +[group_68300] +[group_68301] +[group_68302] +[group_68303] +[group_68304] +[group_68305] +[group_68306] +[group_68307] +[group_68308] +[group_68309] +[group_68310] +[group_68311] +[group_68312] +[group_68313] +[group_68314] +[group_68315] +[group_68316] +[group_68317] +[group_68318] +[group_68319] +[group_68320] +[group_68321] +[group_68322] +[group_68323] +[group_68324] +[group_68325] +[group_68326] +[group_68327] +[group_68328] +[group_68329] +[group_68330] +[group_68331] +[group_68332] +[group_68333] +[group_68334] +[group_68335] +[group_68336] +[group_68337] +[group_68338] +[group_68339] +[group_68340] +[group_68341] +[group_68342] +[group_68343] +[group_68344] +[group_68345] +[group_68346] +[group_68347] +[group_68348] +[group_68349] +[group_68350] +[group_68351] +[group_68352] +[group_68353] +[group_68354] +[group_68355] +[group_68356] +[group_68357] +[group_68358] +[group_68359] +[group_68360] +[group_68361] +[group_68362] +[group_68363] +[group_68364] +[group_68365] +[group_68366] +[group_68367] +[group_68368] +[group_68369] +[group_68370] +[group_68371] +[group_68372] +[group_68373] +[group_68374] +[group_68375] +[group_68376] +[group_68377] +[group_68378] +[group_68379] +[group_68380] +[group_68381] +[group_68382] +[group_68383] +[group_68384] +[group_68385] +[group_68386] +[group_68387] +[group_68388] +[group_68389] +[group_68390] +[group_68391] +[group_68392] +[group_68393] +[group_68394] +[group_68395] +[group_68396] +[group_68397] +[group_68398] +[group_68399] +[group_68400] +[group_68401] +[group_68402] +[group_68403] +[group_68404] +[group_68405] +[group_68406] +[group_68407] +[group_68408] +[group_68409] +[group_68410] +[group_68411] +[group_68412] +[group_68413] +[group_68414] +[group_68415] +[group_68416] +[group_68417] +[group_68418] +[group_68419] +[group_68420] +[group_68421] +[group_68422] +[group_68423] +[group_68424] +[group_68425] +[group_68426] +[group_68427] +[group_68428] +[group_68429] +[group_68430] +[group_68431] +[group_68432] +[group_68433] +[group_68434] +[group_68435] +[group_68436] +[group_68437] +[group_68438] +[group_68439] +[group_68440] +[group_68441] +[group_68442] +[group_68443] +[group_68444] +[group_68445] +[group_68446] +[group_68447] +[group_68448] +[group_68449] +[group_68450] +[group_68451] +[group_68452] +[group_68453] +[group_68454] +[group_68455] +[group_68456] +[group_68457] +[group_68458] +[group_68459] +[group_68460] +[group_68461] +[group_68462] +[group_68463] +[group_68464] +[group_68465] +[group_68466] +[group_68467] +[group_68468] +[group_68469] +[group_68470] +[group_68471] +[group_68472] +[group_68473] +[group_68474] +[group_68475] +[group_68476] +[group_68477] +[group_68478] +[group_68479] +[group_68480] +[group_68481] +[group_68482] +[group_68483] +[group_68484] +[group_68485] +[group_68486] +[group_68487] +[group_68488] +[group_68489] +[group_68490] +[group_68491] +[group_68492] +[group_68493] +[group_68494] +[group_68495] +[group_68496] +[group_68497] +[group_68498] +[group_68499] +[group_68500] +[group_68501] +[group_68502] +[group_68503] +[group_68504] +[group_68505] +[group_68506] +[group_68507] +[group_68508] +[group_68509] +[group_68510] +[group_68511] +[group_68512] +[group_68513] +[group_68514] +[group_68515] +[group_68516] +[group_68517] +[group_68518] +[group_68519] +[group_68520] +[group_68521] +[group_68522] +[group_68523] +[group_68524] +[group_68525] +[group_68526] +[group_68527] +[group_68528] +[group_68529] +[group_68530] +[group_68531] +[group_68532] +[group_68533] +[group_68534] +[group_68535] +[group_68536] +[group_68537] +[group_68538] +[group_68539] +[group_68540] +[group_68541] +[group_68542] +[group_68543] +[group_68544] +[group_68545] +[group_68546] +[group_68547] +[group_68548] +[group_68549] +[group_68550] +[group_68551] +[group_68552] +[group_68553] +[group_68554] +[group_68555] +[group_68556] +[group_68557] +[group_68558] +[group_68559] +[group_68560] +[group_68561] +[group_68562] +[group_68563] +[group_68564] +[group_68565] +[group_68566] +[group_68567] +[group_68568] +[group_68569] +[group_68570] +[group_68571] +[group_68572] +[group_68573] +[group_68574] +[group_68575] +[group_68576] +[group_68577] +[group_68578] +[group_68579] +[group_68580] +[group_68581] +[group_68582] +[group_68583] +[group_68584] +[group_68585] +[group_68586] +[group_68587] +[group_68588] +[group_68589] +[group_68590] +[group_68591] +[group_68592] +[group_68593] +[group_68594] +[group_68595] +[group_68596] +[group_68597] +[group_68598] +[group_68599] +[group_68600] +[group_68601] +[group_68602] +[group_68603] +[group_68604] +[group_68605] +[group_68606] +[group_68607] +[group_68608] +[group_68609] +[group_68610] +[group_68611] +[group_68612] +[group_68613] +[group_68614] +[group_68615] +[group_68616] +[group_68617] +[group_68618] +[group_68619] +[group_68620] +[group_68621] +[group_68622] +[group_68623] +[group_68624] +[group_68625] +[group_68626] +[group_68627] +[group_68628] +[group_68629] +[group_68630] +[group_68631] +[group_68632] +[group_68633] +[group_68634] +[group_68635] +[group_68636] +[group_68637] +[group_68638] +[group_68639] +[group_68640] +[group_68641] +[group_68642] +[group_68643] +[group_68644] +[group_68645] +[group_68646] +[group_68647] +[group_68648] +[group_68649] +[group_68650] +[group_68651] +[group_68652] +[group_68653] +[group_68654] +[group_68655] +[group_68656] +[group_68657] +[group_68658] +[group_68659] +[group_68660] +[group_68661] +[group_68662] +[group_68663] +[group_68664] +[group_68665] +[group_68666] +[group_68667] +[group_68668] +[group_68669] +[group_68670] +[group_68671] +[group_68672] +[group_68673] +[group_68674] +[group_68675] +[group_68676] +[group_68677] +[group_68678] +[group_68679] +[group_68680] +[group_68681] +[group_68682] +[group_68683] +[group_68684] +[group_68685] +[group_68686] +[group_68687] +[group_68688] +[group_68689] +[group_68690] +[group_68691] +[group_68692] +[group_68693] +[group_68694] +[group_68695] +[group_68696] +[group_68697] +[group_68698] +[group_68699] +[group_68700] +[group_68701] +[group_68702] +[group_68703] +[group_68704] +[group_68705] +[group_68706] +[group_68707] +[group_68708] +[group_68709] +[group_68710] +[group_68711] +[group_68712] +[group_68713] +[group_68714] +[group_68715] +[group_68716] +[group_68717] +[group_68718] +[group_68719] +[group_68720] +[group_68721] +[group_68722] +[group_68723] +[group_68724] +[group_68725] +[group_68726] +[group_68727] +[group_68728] +[group_68729] +[group_68730] +[group_68731] +[group_68732] +[group_68733] +[group_68734] +[group_68735] +[group_68736] +[group_68737] +[group_68738] +[group_68739] +[group_68740] +[group_68741] +[group_68742] +[group_68743] +[group_68744] +[group_68745] +[group_68746] +[group_68747] +[group_68748] +[group_68749] +[group_68750] +[group_68751] +[group_68752] +[group_68753] +[group_68754] +[group_68755] +[group_68756] +[group_68757] +[group_68758] +[group_68759] +[group_68760] +[group_68761] +[group_68762] +[group_68763] +[group_68764] +[group_68765] +[group_68766] +[group_68767] +[group_68768] +[group_68769] +[group_68770] +[group_68771] +[group_68772] +[group_68773] +[group_68774] +[group_68775] +[group_68776] +[group_68777] +[group_68778] +[group_68779] +[group_68780] +[group_68781] +[group_68782] +[group_68783] +[group_68784] +[group_68785] +[group_68786] +[group_68787] +[group_68788] +[group_68789] +[group_68790] +[group_68791] +[group_68792] +[group_68793] +[group_68794] +[group_68795] +[group_68796] +[group_68797] +[group_68798] +[group_68799] +[group_68800] +[group_68801] +[group_68802] +[group_68803] +[group_68804] +[group_68805] +[group_68806] +[group_68807] +[group_68808] +[group_68809] +[group_68810] +[group_68811] +[group_68812] +[group_68813] +[group_68814] +[group_68815] +[group_68816] +[group_68817] +[group_68818] +[group_68819] +[group_68820] +[group_68821] +[group_68822] +[group_68823] +[group_68824] +[group_68825] +[group_68826] +[group_68827] +[group_68828] +[group_68829] +[group_68830] +[group_68831] +[group_68832] +[group_68833] +[group_68834] +[group_68835] +[group_68836] +[group_68837] +[group_68838] +[group_68839] +[group_68840] +[group_68841] +[group_68842] +[group_68843] +[group_68844] +[group_68845] +[group_68846] +[group_68847] +[group_68848] +[group_68849] +[group_68850] +[group_68851] +[group_68852] +[group_68853] +[group_68854] +[group_68855] +[group_68856] +[group_68857] +[group_68858] +[group_68859] +[group_68860] +[group_68861] +[group_68862] +[group_68863] +[group_68864] +[group_68865] +[group_68866] +[group_68867] +[group_68868] +[group_68869] +[group_68870] +[group_68871] +[group_68872] +[group_68873] +[group_68874] +[group_68875] +[group_68876] +[group_68877] +[group_68878] +[group_68879] +[group_68880] +[group_68881] +[group_68882] +[group_68883] +[group_68884] +[group_68885] +[group_68886] +[group_68887] +[group_68888] +[group_68889] +[group_68890] +[group_68891] +[group_68892] +[group_68893] +[group_68894] +[group_68895] +[group_68896] +[group_68897] +[group_68898] +[group_68899] +[group_68900] +[group_68901] +[group_68902] +[group_68903] +[group_68904] +[group_68905] +[group_68906] +[group_68907] +[group_68908] +[group_68909] +[group_68910] +[group_68911] +[group_68912] +[group_68913] +[group_68914] +[group_68915] +[group_68916] +[group_68917] +[group_68918] +[group_68919] +[group_68920] +[group_68921] +[group_68922] +[group_68923] +[group_68924] +[group_68925] +[group_68926] +[group_68927] +[group_68928] +[group_68929] +[group_68930] +[group_68931] +[group_68932] +[group_68933] +[group_68934] +[group_68935] +[group_68936] +[group_68937] +[group_68938] +[group_68939] +[group_68940] +[group_68941] +[group_68942] +[group_68943] +[group_68944] +[group_68945] +[group_68946] +[group_68947] +[group_68948] +[group_68949] +[group_68950] +[group_68951] +[group_68952] +[group_68953] +[group_68954] +[group_68955] +[group_68956] +[group_68957] +[group_68958] +[group_68959] +[group_68960] +[group_68961] +[group_68962] +[group_68963] +[group_68964] +[group_68965] +[group_68966] +[group_68967] +[group_68968] +[group_68969] +[group_68970] +[group_68971] +[group_68972] +[group_68973] +[group_68974] +[group_68975] +[group_68976] +[group_68977] +[group_68978] +[group_68979] +[group_68980] +[group_68981] +[group_68982] +[group_68983] +[group_68984] +[group_68985] +[group_68986] +[group_68987] +[group_68988] +[group_68989] +[group_68990] +[group_68991] +[group_68992] +[group_68993] +[group_68994] +[group_68995] +[group_68996] +[group_68997] +[group_68998] +[group_68999] +[group_69000] +[group_69001] +[group_69002] +[group_69003] +[group_69004] +[group_69005] +[group_69006] +[group_69007] +[group_69008] +[group_69009] +[group_69010] +[group_69011] +[group_69012] +[group_69013] +[group_69014] +[group_69015] +[group_69016] +[group_69017] +[group_69018] +[group_69019] +[group_69020] +[group_69021] +[group_69022] +[group_69023] +[group_69024] +[group_69025] +[group_69026] +[group_69027] +[group_69028] +[group_69029] +[group_69030] +[group_69031] +[group_69032] +[group_69033] +[group_69034] +[group_69035] +[group_69036] +[group_69037] +[group_69038] +[group_69039] +[group_69040] +[group_69041] +[group_69042] +[group_69043] +[group_69044] +[group_69045] +[group_69046] +[group_69047] +[group_69048] +[group_69049] +[group_69050] +[group_69051] +[group_69052] +[group_69053] +[group_69054] +[group_69055] +[group_69056] +[group_69057] +[group_69058] +[group_69059] +[group_69060] +[group_69061] +[group_69062] +[group_69063] +[group_69064] +[group_69065] +[group_69066] +[group_69067] +[group_69068] +[group_69069] +[group_69070] +[group_69071] +[group_69072] +[group_69073] +[group_69074] +[group_69075] +[group_69076] +[group_69077] +[group_69078] +[group_69079] +[group_69080] +[group_69081] +[group_69082] +[group_69083] +[group_69084] +[group_69085] +[group_69086] +[group_69087] +[group_69088] +[group_69089] +[group_69090] +[group_69091] +[group_69092] +[group_69093] +[group_69094] +[group_69095] +[group_69096] +[group_69097] +[group_69098] +[group_69099] +[group_69100] +[group_69101] +[group_69102] +[group_69103] +[group_69104] +[group_69105] +[group_69106] +[group_69107] +[group_69108] +[group_69109] +[group_69110] +[group_69111] +[group_69112] +[group_69113] +[group_69114] +[group_69115] +[group_69116] +[group_69117] +[group_69118] +[group_69119] +[group_69120] +[group_69121] +[group_69122] +[group_69123] +[group_69124] +[group_69125] +[group_69126] +[group_69127] +[group_69128] +[group_69129] +[group_69130] +[group_69131] +[group_69132] +[group_69133] +[group_69134] +[group_69135] +[group_69136] +[group_69137] +[group_69138] +[group_69139] +[group_69140] +[group_69141] +[group_69142] +[group_69143] +[group_69144] +[group_69145] +[group_69146] +[group_69147] +[group_69148] +[group_69149] +[group_69150] +[group_69151] +[group_69152] +[group_69153] +[group_69154] +[group_69155] +[group_69156] +[group_69157] +[group_69158] +[group_69159] +[group_69160] +[group_69161] +[group_69162] +[group_69163] +[group_69164] +[group_69165] +[group_69166] +[group_69167] +[group_69168] +[group_69169] +[group_69170] +[group_69171] +[group_69172] +[group_69173] +[group_69174] +[group_69175] +[group_69176] +[group_69177] +[group_69178] +[group_69179] +[group_69180] +[group_69181] +[group_69182] +[group_69183] +[group_69184] +[group_69185] +[group_69186] +[group_69187] +[group_69188] +[group_69189] +[group_69190] +[group_69191] +[group_69192] +[group_69193] +[group_69194] +[group_69195] +[group_69196] +[group_69197] +[group_69198] +[group_69199] +[group_69200] +[group_69201] +[group_69202] +[group_69203] +[group_69204] +[group_69205] +[group_69206] +[group_69207] +[group_69208] +[group_69209] +[group_69210] +[group_69211] +[group_69212] +[group_69213] +[group_69214] +[group_69215] +[group_69216] +[group_69217] +[group_69218] +[group_69219] +[group_69220] +[group_69221] +[group_69222] +[group_69223] +[group_69224] +[group_69225] +[group_69226] +[group_69227] +[group_69228] +[group_69229] +[group_69230] +[group_69231] +[group_69232] +[group_69233] +[group_69234] +[group_69235] +[group_69236] +[group_69237] +[group_69238] +[group_69239] +[group_69240] +[group_69241] +[group_69242] +[group_69243] +[group_69244] +[group_69245] +[group_69246] +[group_69247] +[group_69248] +[group_69249] +[group_69250] +[group_69251] +[group_69252] +[group_69253] +[group_69254] +[group_69255] +[group_69256] +[group_69257] +[group_69258] +[group_69259] +[group_69260] +[group_69261] +[group_69262] +[group_69263] +[group_69264] +[group_69265] +[group_69266] +[group_69267] +[group_69268] +[group_69269] +[group_69270] +[group_69271] +[group_69272] +[group_69273] +[group_69274] +[group_69275] +[group_69276] +[group_69277] +[group_69278] +[group_69279] +[group_69280] +[group_69281] +[group_69282] +[group_69283] +[group_69284] +[group_69285] +[group_69286] +[group_69287] +[group_69288] +[group_69289] +[group_69290] +[group_69291] +[group_69292] +[group_69293] +[group_69294] +[group_69295] +[group_69296] +[group_69297] +[group_69298] +[group_69299] +[group_69300] +[group_69301] +[group_69302] +[group_69303] +[group_69304] +[group_69305] +[group_69306] +[group_69307] +[group_69308] +[group_69309] +[group_69310] +[group_69311] +[group_69312] +[group_69313] +[group_69314] +[group_69315] +[group_69316] +[group_69317] +[group_69318] +[group_69319] +[group_69320] +[group_69321] +[group_69322] +[group_69323] +[group_69324] +[group_69325] +[group_69326] +[group_69327] +[group_69328] +[group_69329] +[group_69330] +[group_69331] +[group_69332] +[group_69333] +[group_69334] +[group_69335] +[group_69336] +[group_69337] +[group_69338] +[group_69339] +[group_69340] +[group_69341] +[group_69342] +[group_69343] +[group_69344] +[group_69345] +[group_69346] +[group_69347] +[group_69348] +[group_69349] +[group_69350] +[group_69351] +[group_69352] +[group_69353] +[group_69354] +[group_69355] +[group_69356] +[group_69357] +[group_69358] +[group_69359] +[group_69360] +[group_69361] +[group_69362] +[group_69363] +[group_69364] +[group_69365] +[group_69366] +[group_69367] +[group_69368] +[group_69369] +[group_69370] +[group_69371] +[group_69372] +[group_69373] +[group_69374] +[group_69375] +[group_69376] +[group_69377] +[group_69378] +[group_69379] +[group_69380] +[group_69381] +[group_69382] +[group_69383] +[group_69384] +[group_69385] +[group_69386] +[group_69387] +[group_69388] +[group_69389] +[group_69390] +[group_69391] +[group_69392] +[group_69393] +[group_69394] +[group_69395] +[group_69396] +[group_69397] +[group_69398] +[group_69399] +[group_69400] +[group_69401] +[group_69402] +[group_69403] +[group_69404] +[group_69405] +[group_69406] +[group_69407] +[group_69408] +[group_69409] +[group_69410] +[group_69411] +[group_69412] +[group_69413] +[group_69414] +[group_69415] +[group_69416] +[group_69417] +[group_69418] +[group_69419] +[group_69420] +[group_69421] +[group_69422] +[group_69423] +[group_69424] +[group_69425] +[group_69426] +[group_69427] +[group_69428] +[group_69429] +[group_69430] +[group_69431] +[group_69432] +[group_69433] +[group_69434] +[group_69435] +[group_69436] +[group_69437] +[group_69438] +[group_69439] +[group_69440] +[group_69441] +[group_69442] +[group_69443] +[group_69444] +[group_69445] +[group_69446] +[group_69447] +[group_69448] +[group_69449] +[group_69450] +[group_69451] +[group_69452] +[group_69453] +[group_69454] +[group_69455] +[group_69456] +[group_69457] +[group_69458] +[group_69459] +[group_69460] +[group_69461] +[group_69462] +[group_69463] +[group_69464] +[group_69465] +[group_69466] +[group_69467] +[group_69468] +[group_69469] +[group_69470] +[group_69471] +[group_69472] +[group_69473] +[group_69474] +[group_69475] +[group_69476] +[group_69477] +[group_69478] +[group_69479] +[group_69480] +[group_69481] +[group_69482] +[group_69483] +[group_69484] +[group_69485] +[group_69486] +[group_69487] +[group_69488] +[group_69489] +[group_69490] +[group_69491] +[group_69492] +[group_69493] +[group_69494] +[group_69495] +[group_69496] +[group_69497] +[group_69498] +[group_69499] +[group_69500] +[group_69501] +[group_69502] +[group_69503] +[group_69504] +[group_69505] +[group_69506] +[group_69507] +[group_69508] +[group_69509] +[group_69510] +[group_69511] +[group_69512] +[group_69513] +[group_69514] +[group_69515] +[group_69516] +[group_69517] +[group_69518] +[group_69519] +[group_69520] +[group_69521] +[group_69522] +[group_69523] +[group_69524] +[group_69525] +[group_69526] +[group_69527] +[group_69528] +[group_69529] +[group_69530] +[group_69531] +[group_69532] +[group_69533] +[group_69534] +[group_69535] +[group_69536] +[group_69537] +[group_69538] +[group_69539] +[group_69540] +[group_69541] +[group_69542] +[group_69543] +[group_69544] +[group_69545] +[group_69546] +[group_69547] +[group_69548] +[group_69549] +[group_69550] +[group_69551] +[group_69552] +[group_69553] +[group_69554] +[group_69555] +[group_69556] +[group_69557] +[group_69558] +[group_69559] +[group_69560] +[group_69561] +[group_69562] +[group_69563] +[group_69564] +[group_69565] +[group_69566] +[group_69567] +[group_69568] +[group_69569] +[group_69570] +[group_69571] +[group_69572] +[group_69573] +[group_69574] +[group_69575] +[group_69576] +[group_69577] +[group_69578] +[group_69579] +[group_69580] +[group_69581] +[group_69582] +[group_69583] +[group_69584] +[group_69585] +[group_69586] +[group_69587] +[group_69588] +[group_69589] +[group_69590] +[group_69591] +[group_69592] +[group_69593] +[group_69594] +[group_69595] +[group_69596] +[group_69597] +[group_69598] +[group_69599] +[group_69600] +[group_69601] +[group_69602] +[group_69603] +[group_69604] +[group_69605] +[group_69606] +[group_69607] +[group_69608] +[group_69609] +[group_69610] +[group_69611] +[group_69612] +[group_69613] +[group_69614] +[group_69615] +[group_69616] +[group_69617] +[group_69618] +[group_69619] +[group_69620] +[group_69621] +[group_69622] +[group_69623] +[group_69624] +[group_69625] +[group_69626] +[group_69627] +[group_69628] +[group_69629] +[group_69630] +[group_69631] +[group_69632] +[group_69633] +[group_69634] +[group_69635] +[group_69636] +[group_69637] +[group_69638] +[group_69639] +[group_69640] +[group_69641] +[group_69642] +[group_69643] +[group_69644] +[group_69645] +[group_69646] +[group_69647] +[group_69648] +[group_69649] +[group_69650] +[group_69651] +[group_69652] +[group_69653] +[group_69654] +[group_69655] +[group_69656] +[group_69657] +[group_69658] +[group_69659] +[group_69660] +[group_69661] +[group_69662] +[group_69663] +[group_69664] +[group_69665] +[group_69666] +[group_69667] +[group_69668] +[group_69669] +[group_69670] +[group_69671] +[group_69672] +[group_69673] +[group_69674] +[group_69675] +[group_69676] +[group_69677] +[group_69678] +[group_69679] +[group_69680] +[group_69681] +[group_69682] +[group_69683] +[group_69684] +[group_69685] +[group_69686] +[group_69687] +[group_69688] +[group_69689] +[group_69690] +[group_69691] +[group_69692] +[group_69693] +[group_69694] +[group_69695] +[group_69696] +[group_69697] +[group_69698] +[group_69699] +[group_69700] +[group_69701] +[group_69702] +[group_69703] +[group_69704] +[group_69705] +[group_69706] +[group_69707] +[group_69708] +[group_69709] +[group_69710] +[group_69711] +[group_69712] +[group_69713] +[group_69714] +[group_69715] +[group_69716] +[group_69717] +[group_69718] +[group_69719] +[group_69720] +[group_69721] +[group_69722] +[group_69723] +[group_69724] +[group_69725] +[group_69726] +[group_69727] +[group_69728] +[group_69729] +[group_69730] +[group_69731] +[group_69732] +[group_69733] +[group_69734] +[group_69735] +[group_69736] +[group_69737] +[group_69738] +[group_69739] +[group_69740] +[group_69741] +[group_69742] +[group_69743] +[group_69744] +[group_69745] +[group_69746] +[group_69747] +[group_69748] +[group_69749] +[group_69750] +[group_69751] +[group_69752] +[group_69753] +[group_69754] +[group_69755] +[group_69756] +[group_69757] +[group_69758] +[group_69759] +[group_69760] +[group_69761] +[group_69762] +[group_69763] +[group_69764] +[group_69765] +[group_69766] +[group_69767] +[group_69768] +[group_69769] +[group_69770] +[group_69771] +[group_69772] +[group_69773] +[group_69774] +[group_69775] +[group_69776] +[group_69777] +[group_69778] +[group_69779] +[group_69780] +[group_69781] +[group_69782] +[group_69783] +[group_69784] +[group_69785] +[group_69786] +[group_69787] +[group_69788] +[group_69789] +[group_69790] +[group_69791] +[group_69792] +[group_69793] +[group_69794] +[group_69795] +[group_69796] +[group_69797] +[group_69798] +[group_69799] +[group_69800] +[group_69801] +[group_69802] +[group_69803] +[group_69804] +[group_69805] +[group_69806] +[group_69807] +[group_69808] +[group_69809] +[group_69810] +[group_69811] +[group_69812] +[group_69813] +[group_69814] +[group_69815] +[group_69816] +[group_69817] +[group_69818] +[group_69819] +[group_69820] +[group_69821] +[group_69822] +[group_69823] +[group_69824] +[group_69825] +[group_69826] +[group_69827] +[group_69828] +[group_69829] +[group_69830] +[group_69831] +[group_69832] +[group_69833] +[group_69834] +[group_69835] +[group_69836] +[group_69837] +[group_69838] +[group_69839] +[group_69840] +[group_69841] +[group_69842] +[group_69843] +[group_69844] +[group_69845] +[group_69846] +[group_69847] +[group_69848] +[group_69849] +[group_69850] +[group_69851] +[group_69852] +[group_69853] +[group_69854] +[group_69855] +[group_69856] +[group_69857] +[group_69858] +[group_69859] +[group_69860] +[group_69861] +[group_69862] +[group_69863] +[group_69864] +[group_69865] +[group_69866] +[group_69867] +[group_69868] +[group_69869] +[group_69870] +[group_69871] +[group_69872] +[group_69873] +[group_69874] +[group_69875] +[group_69876] +[group_69877] +[group_69878] +[group_69879] +[group_69880] +[group_69881] +[group_69882] +[group_69883] +[group_69884] +[group_69885] +[group_69886] +[group_69887] +[group_69888] +[group_69889] +[group_69890] +[group_69891] +[group_69892] +[group_69893] +[group_69894] +[group_69895] +[group_69896] +[group_69897] +[group_69898] +[group_69899] +[group_69900] +[group_69901] +[group_69902] +[group_69903] +[group_69904] +[group_69905] +[group_69906] +[group_69907] +[group_69908] +[group_69909] +[group_69910] +[group_69911] +[group_69912] +[group_69913] +[group_69914] +[group_69915] +[group_69916] +[group_69917] +[group_69918] +[group_69919] +[group_69920] +[group_69921] +[group_69922] +[group_69923] +[group_69924] +[group_69925] +[group_69926] +[group_69927] +[group_69928] +[group_69929] +[group_69930] +[group_69931] +[group_69932] +[group_69933] +[group_69934] +[group_69935] +[group_69936] +[group_69937] +[group_69938] +[group_69939] +[group_69940] +[group_69941] +[group_69942] +[group_69943] +[group_69944] +[group_69945] +[group_69946] +[group_69947] +[group_69948] +[group_69949] +[group_69950] +[group_69951] +[group_69952] +[group_69953] +[group_69954] +[group_69955] +[group_69956] +[group_69957] +[group_69958] +[group_69959] +[group_69960] +[group_69961] +[group_69962] +[group_69963] +[group_69964] +[group_69965] +[group_69966] +[group_69967] +[group_69968] +[group_69969] +[group_69970] +[group_69971] +[group_69972] +[group_69973] +[group_69974] +[group_69975] +[group_69976] +[group_69977] +[group_69978] +[group_69979] +[group_69980] +[group_69981] +[group_69982] +[group_69983] +[group_69984] +[group_69985] +[group_69986] +[group_69987] +[group_69988] +[group_69989] +[group_69990] +[group_69991] +[group_69992] +[group_69993] +[group_69994] +[group_69995] +[group_69996] +[group_69997] +[group_69998] +[group_69999] +[group_70000] +[group_70001] +[group_70002] +[group_70003] +[group_70004] +[group_70005] +[group_70006] +[group_70007] +[group_70008] +[group_70009] +[group_70010] +[group_70011] +[group_70012] +[group_70013] +[group_70014] +[group_70015] +[group_70016] +[group_70017] +[group_70018] +[group_70019] +[group_70020] +[group_70021] +[group_70022] +[group_70023] +[group_70024] +[group_70025] +[group_70026] +[group_70027] +[group_70028] +[group_70029] +[group_70030] +[group_70031] +[group_70032] +[group_70033] +[group_70034] +[group_70035] +[group_70036] +[group_70037] +[group_70038] +[group_70039] +[group_70040] +[group_70041] +[group_70042] +[group_70043] +[group_70044] +[group_70045] +[group_70046] +[group_70047] +[group_70048] +[group_70049] +[group_70050] +[group_70051] +[group_70052] +[group_70053] +[group_70054] +[group_70055] +[group_70056] +[group_70057] +[group_70058] +[group_70059] +[group_70060] +[group_70061] +[group_70062] +[group_70063] +[group_70064] +[group_70065] +[group_70066] +[group_70067] +[group_70068] +[group_70069] +[group_70070] +[group_70071] +[group_70072] +[group_70073] +[group_70074] +[group_70075] +[group_70076] +[group_70077] +[group_70078] +[group_70079] +[group_70080] +[group_70081] +[group_70082] +[group_70083] +[group_70084] +[group_70085] +[group_70086] +[group_70087] +[group_70088] +[group_70089] +[group_70090] +[group_70091] +[group_70092] +[group_70093] +[group_70094] +[group_70095] +[group_70096] +[group_70097] +[group_70098] +[group_70099] +[group_70100] +[group_70101] +[group_70102] +[group_70103] +[group_70104] +[group_70105] +[group_70106] +[group_70107] +[group_70108] +[group_70109] +[group_70110] +[group_70111] +[group_70112] +[group_70113] +[group_70114] +[group_70115] +[group_70116] +[group_70117] +[group_70118] +[group_70119] +[group_70120] +[group_70121] +[group_70122] +[group_70123] +[group_70124] +[group_70125] +[group_70126] +[group_70127] +[group_70128] +[group_70129] +[group_70130] +[group_70131] +[group_70132] +[group_70133] +[group_70134] +[group_70135] +[group_70136] +[group_70137] +[group_70138] +[group_70139] +[group_70140] +[group_70141] +[group_70142] +[group_70143] +[group_70144] +[group_70145] +[group_70146] +[group_70147] +[group_70148] +[group_70149] +[group_70150] +[group_70151] +[group_70152] +[group_70153] +[group_70154] +[group_70155] +[group_70156] +[group_70157] +[group_70158] +[group_70159] +[group_70160] +[group_70161] +[group_70162] +[group_70163] +[group_70164] +[group_70165] +[group_70166] +[group_70167] +[group_70168] +[group_70169] +[group_70170] +[group_70171] +[group_70172] +[group_70173] +[group_70174] +[group_70175] +[group_70176] +[group_70177] +[group_70178] +[group_70179] +[group_70180] +[group_70181] +[group_70182] +[group_70183] +[group_70184] +[group_70185] +[group_70186] +[group_70187] +[group_70188] +[group_70189] +[group_70190] +[group_70191] +[group_70192] +[group_70193] +[group_70194] +[group_70195] +[group_70196] +[group_70197] +[group_70198] +[group_70199] +[group_70200] +[group_70201] +[group_70202] +[group_70203] +[group_70204] +[group_70205] +[group_70206] +[group_70207] +[group_70208] +[group_70209] +[group_70210] +[group_70211] +[group_70212] +[group_70213] +[group_70214] +[group_70215] +[group_70216] +[group_70217] +[group_70218] +[group_70219] +[group_70220] +[group_70221] +[group_70222] +[group_70223] +[group_70224] +[group_70225] +[group_70226] +[group_70227] +[group_70228] +[group_70229] +[group_70230] +[group_70231] +[group_70232] +[group_70233] +[group_70234] +[group_70235] +[group_70236] +[group_70237] +[group_70238] +[group_70239] +[group_70240] +[group_70241] +[group_70242] +[group_70243] +[group_70244] +[group_70245] +[group_70246] +[group_70247] +[group_70248] +[group_70249] +[group_70250] +[group_70251] +[group_70252] +[group_70253] +[group_70254] +[group_70255] +[group_70256] +[group_70257] +[group_70258] +[group_70259] +[group_70260] +[group_70261] +[group_70262] +[group_70263] +[group_70264] +[group_70265] +[group_70266] +[group_70267] +[group_70268] +[group_70269] +[group_70270] +[group_70271] +[group_70272] +[group_70273] +[group_70274] +[group_70275] +[group_70276] +[group_70277] +[group_70278] +[group_70279] +[group_70280] +[group_70281] +[group_70282] +[group_70283] +[group_70284] +[group_70285] +[group_70286] +[group_70287] +[group_70288] +[group_70289] +[group_70290] +[group_70291] +[group_70292] +[group_70293] +[group_70294] +[group_70295] +[group_70296] +[group_70297] +[group_70298] +[group_70299] +[group_70300] +[group_70301] +[group_70302] +[group_70303] +[group_70304] +[group_70305] +[group_70306] +[group_70307] +[group_70308] +[group_70309] +[group_70310] +[group_70311] +[group_70312] +[group_70313] +[group_70314] +[group_70315] +[group_70316] +[group_70317] +[group_70318] +[group_70319] +[group_70320] +[group_70321] +[group_70322] +[group_70323] +[group_70324] +[group_70325] +[group_70326] +[group_70327] +[group_70328] +[group_70329] +[group_70330] +[group_70331] +[group_70332] +[group_70333] +[group_70334] +[group_70335] +[group_70336] +[group_70337] +[group_70338] +[group_70339] +[group_70340] +[group_70341] +[group_70342] +[group_70343] +[group_70344] +[group_70345] +[group_70346] +[group_70347] +[group_70348] +[group_70349] +[group_70350] +[group_70351] +[group_70352] +[group_70353] +[group_70354] +[group_70355] +[group_70356] +[group_70357] +[group_70358] +[group_70359] +[group_70360] +[group_70361] +[group_70362] +[group_70363] +[group_70364] +[group_70365] +[group_70366] +[group_70367] +[group_70368] +[group_70369] +[group_70370] +[group_70371] +[group_70372] +[group_70373] +[group_70374] +[group_70375] +[group_70376] +[group_70377] +[group_70378] +[group_70379] +[group_70380] +[group_70381] +[group_70382] +[group_70383] +[group_70384] +[group_70385] +[group_70386] +[group_70387] +[group_70388] +[group_70389] +[group_70390] +[group_70391] +[group_70392] +[group_70393] +[group_70394] +[group_70395] +[group_70396] +[group_70397] +[group_70398] +[group_70399] +[group_70400] +[group_70401] +[group_70402] +[group_70403] +[group_70404] +[group_70405] +[group_70406] +[group_70407] +[group_70408] +[group_70409] +[group_70410] +[group_70411] +[group_70412] +[group_70413] +[group_70414] +[group_70415] +[group_70416] +[group_70417] +[group_70418] +[group_70419] +[group_70420] +[group_70421] +[group_70422] +[group_70423] +[group_70424] +[group_70425] +[group_70426] +[group_70427] +[group_70428] +[group_70429] +[group_70430] +[group_70431] +[group_70432] +[group_70433] +[group_70434] +[group_70435] +[group_70436] +[group_70437] +[group_70438] +[group_70439] +[group_70440] +[group_70441] +[group_70442] +[group_70443] +[group_70444] +[group_70445] +[group_70446] +[group_70447] +[group_70448] +[group_70449] +[group_70450] +[group_70451] +[group_70452] +[group_70453] +[group_70454] +[group_70455] +[group_70456] +[group_70457] +[group_70458] +[group_70459] +[group_70460] +[group_70461] +[group_70462] +[group_70463] +[group_70464] +[group_70465] +[group_70466] +[group_70467] +[group_70468] +[group_70469] +[group_70470] +[group_70471] +[group_70472] +[group_70473] +[group_70474] +[group_70475] +[group_70476] +[group_70477] +[group_70478] +[group_70479] +[group_70480] +[group_70481] +[group_70482] +[group_70483] +[group_70484] +[group_70485] +[group_70486] +[group_70487] +[group_70488] +[group_70489] +[group_70490] +[group_70491] +[group_70492] +[group_70493] +[group_70494] +[group_70495] +[group_70496] +[group_70497] +[group_70498] +[group_70499] +[group_70500] +[group_70501] +[group_70502] +[group_70503] +[group_70504] +[group_70505] +[group_70506] +[group_70507] +[group_70508] +[group_70509] +[group_70510] +[group_70511] +[group_70512] +[group_70513] +[group_70514] +[group_70515] +[group_70516] +[group_70517] +[group_70518] +[group_70519] +[group_70520] +[group_70521] +[group_70522] +[group_70523] +[group_70524] +[group_70525] +[group_70526] +[group_70527] +[group_70528] +[group_70529] +[group_70530] +[group_70531] +[group_70532] +[group_70533] +[group_70534] +[group_70535] +[group_70536] +[group_70537] +[group_70538] +[group_70539] +[group_70540] +[group_70541] +[group_70542] +[group_70543] +[group_70544] +[group_70545] +[group_70546] +[group_70547] +[group_70548] +[group_70549] +[group_70550] +[group_70551] +[group_70552] +[group_70553] +[group_70554] +[group_70555] +[group_70556] +[group_70557] +[group_70558] +[group_70559] +[group_70560] +[group_70561] +[group_70562] +[group_70563] +[group_70564] +[group_70565] +[group_70566] +[group_70567] +[group_70568] +[group_70569] +[group_70570] +[group_70571] +[group_70572] +[group_70573] +[group_70574] +[group_70575] +[group_70576] +[group_70577] +[group_70578] +[group_70579] +[group_70580] +[group_70581] +[group_70582] +[group_70583] +[group_70584] +[group_70585] +[group_70586] +[group_70587] +[group_70588] +[group_70589] +[group_70590] +[group_70591] +[group_70592] +[group_70593] +[group_70594] +[group_70595] +[group_70596] +[group_70597] +[group_70598] +[group_70599] +[group_70600] +[group_70601] +[group_70602] +[group_70603] +[group_70604] +[group_70605] +[group_70606] +[group_70607] +[group_70608] +[group_70609] +[group_70610] +[group_70611] +[group_70612] +[group_70613] +[group_70614] +[group_70615] +[group_70616] +[group_70617] +[group_70618] +[group_70619] +[group_70620] +[group_70621] +[group_70622] +[group_70623] +[group_70624] +[group_70625] +[group_70626] +[group_70627] +[group_70628] +[group_70629] +[group_70630] +[group_70631] +[group_70632] +[group_70633] +[group_70634] +[group_70635] +[group_70636] +[group_70637] +[group_70638] +[group_70639] +[group_70640] +[group_70641] +[group_70642] +[group_70643] +[group_70644] +[group_70645] +[group_70646] +[group_70647] +[group_70648] +[group_70649] +[group_70650] +[group_70651] +[group_70652] +[group_70653] +[group_70654] +[group_70655] +[group_70656] +[group_70657] +[group_70658] +[group_70659] +[group_70660] +[group_70661] +[group_70662] +[group_70663] +[group_70664] +[group_70665] +[group_70666] +[group_70667] +[group_70668] +[group_70669] +[group_70670] +[group_70671] +[group_70672] +[group_70673] +[group_70674] +[group_70675] +[group_70676] +[group_70677] +[group_70678] +[group_70679] +[group_70680] +[group_70681] +[group_70682] +[group_70683] +[group_70684] +[group_70685] +[group_70686] +[group_70687] +[group_70688] +[group_70689] +[group_70690] +[group_70691] +[group_70692] +[group_70693] +[group_70694] +[group_70695] +[group_70696] +[group_70697] +[group_70698] +[group_70699] +[group_70700] +[group_70701] +[group_70702] +[group_70703] +[group_70704] +[group_70705] +[group_70706] +[group_70707] +[group_70708] +[group_70709] +[group_70710] +[group_70711] +[group_70712] +[group_70713] +[group_70714] +[group_70715] +[group_70716] +[group_70717] +[group_70718] +[group_70719] +[group_70720] +[group_70721] +[group_70722] +[group_70723] +[group_70724] +[group_70725] +[group_70726] +[group_70727] +[group_70728] +[group_70729] +[group_70730] +[group_70731] +[group_70732] +[group_70733] +[group_70734] +[group_70735] +[group_70736] +[group_70737] +[group_70738] +[group_70739] +[group_70740] +[group_70741] +[group_70742] +[group_70743] +[group_70744] +[group_70745] +[group_70746] +[group_70747] +[group_70748] +[group_70749] +[group_70750] +[group_70751] +[group_70752] +[group_70753] +[group_70754] +[group_70755] +[group_70756] +[group_70757] +[group_70758] +[group_70759] +[group_70760] +[group_70761] +[group_70762] +[group_70763] +[group_70764] +[group_70765] +[group_70766] +[group_70767] +[group_70768] +[group_70769] +[group_70770] +[group_70771] +[group_70772] +[group_70773] +[group_70774] +[group_70775] +[group_70776] +[group_70777] +[group_70778] +[group_70779] +[group_70780] +[group_70781] +[group_70782] +[group_70783] +[group_70784] +[group_70785] +[group_70786] +[group_70787] +[group_70788] +[group_70789] +[group_70790] +[group_70791] +[group_70792] +[group_70793] +[group_70794] +[group_70795] +[group_70796] +[group_70797] +[group_70798] +[group_70799] +[group_70800] +[group_70801] +[group_70802] +[group_70803] +[group_70804] +[group_70805] +[group_70806] +[group_70807] +[group_70808] +[group_70809] +[group_70810] +[group_70811] +[group_70812] +[group_70813] +[group_70814] +[group_70815] +[group_70816] +[group_70817] +[group_70818] +[group_70819] +[group_70820] +[group_70821] +[group_70822] +[group_70823] +[group_70824] +[group_70825] +[group_70826] +[group_70827] +[group_70828] +[group_70829] +[group_70830] +[group_70831] +[group_70832] +[group_70833] +[group_70834] +[group_70835] +[group_70836] +[group_70837] +[group_70838] +[group_70839] +[group_70840] +[group_70841] +[group_70842] +[group_70843] +[group_70844] +[group_70845] +[group_70846] +[group_70847] +[group_70848] +[group_70849] +[group_70850] +[group_70851] +[group_70852] +[group_70853] +[group_70854] +[group_70855] +[group_70856] +[group_70857] +[group_70858] +[group_70859] +[group_70860] +[group_70861] +[group_70862] +[group_70863] +[group_70864] +[group_70865] +[group_70866] +[group_70867] +[group_70868] +[group_70869] +[group_70870] +[group_70871] +[group_70872] +[group_70873] +[group_70874] +[group_70875] +[group_70876] +[group_70877] +[group_70878] +[group_70879] +[group_70880] +[group_70881] +[group_70882] +[group_70883] +[group_70884] +[group_70885] +[group_70886] +[group_70887] +[group_70888] +[group_70889] +[group_70890] +[group_70891] +[group_70892] +[group_70893] +[group_70894] +[group_70895] +[group_70896] +[group_70897] +[group_70898] +[group_70899] +[group_70900] +[group_70901] +[group_70902] +[group_70903] +[group_70904] +[group_70905] +[group_70906] +[group_70907] +[group_70908] +[group_70909] +[group_70910] +[group_70911] +[group_70912] +[group_70913] +[group_70914] +[group_70915] +[group_70916] +[group_70917] +[group_70918] +[group_70919] +[group_70920] +[group_70921] +[group_70922] +[group_70923] +[group_70924] +[group_70925] +[group_70926] +[group_70927] +[group_70928] +[group_70929] +[group_70930] +[group_70931] +[group_70932] +[group_70933] +[group_70934] +[group_70935] +[group_70936] +[group_70937] +[group_70938] +[group_70939] +[group_70940] +[group_70941] +[group_70942] +[group_70943] +[group_70944] +[group_70945] +[group_70946] +[group_70947] +[group_70948] +[group_70949] +[group_70950] +[group_70951] +[group_70952] +[group_70953] +[group_70954] +[group_70955] +[group_70956] +[group_70957] +[group_70958] +[group_70959] +[group_70960] +[group_70961] +[group_70962] +[group_70963] +[group_70964] +[group_70965] +[group_70966] +[group_70967] +[group_70968] +[group_70969] +[group_70970] +[group_70971] +[group_70972] +[group_70973] +[group_70974] +[group_70975] +[group_70976] +[group_70977] +[group_70978] +[group_70979] +[group_70980] +[group_70981] +[group_70982] +[group_70983] +[group_70984] +[group_70985] +[group_70986] +[group_70987] +[group_70988] +[group_70989] +[group_70990] +[group_70991] +[group_70992] +[group_70993] +[group_70994] +[group_70995] +[group_70996] +[group_70997] +[group_70998] +[group_70999] +[group_71000] +[group_71001] +[group_71002] +[group_71003] +[group_71004] +[group_71005] +[group_71006] +[group_71007] +[group_71008] +[group_71009] +[group_71010] +[group_71011] +[group_71012] +[group_71013] +[group_71014] +[group_71015] +[group_71016] +[group_71017] +[group_71018] +[group_71019] +[group_71020] +[group_71021] +[group_71022] +[group_71023] +[group_71024] +[group_71025] +[group_71026] +[group_71027] +[group_71028] +[group_71029] +[group_71030] +[group_71031] +[group_71032] +[group_71033] +[group_71034] +[group_71035] +[group_71036] +[group_71037] +[group_71038] +[group_71039] +[group_71040] +[group_71041] +[group_71042] +[group_71043] +[group_71044] +[group_71045] +[group_71046] +[group_71047] +[group_71048] +[group_71049] +[group_71050] +[group_71051] +[group_71052] +[group_71053] +[group_71054] +[group_71055] +[group_71056] +[group_71057] +[group_71058] +[group_71059] +[group_71060] +[group_71061] +[group_71062] +[group_71063] +[group_71064] +[group_71065] +[group_71066] +[group_71067] +[group_71068] +[group_71069] +[group_71070] +[group_71071] +[group_71072] +[group_71073] +[group_71074] +[group_71075] +[group_71076] +[group_71077] +[group_71078] +[group_71079] +[group_71080] +[group_71081] +[group_71082] +[group_71083] +[group_71084] +[group_71085] +[group_71086] +[group_71087] +[group_71088] +[group_71089] +[group_71090] +[group_71091] +[group_71092] +[group_71093] +[group_71094] +[group_71095] +[group_71096] +[group_71097] +[group_71098] +[group_71099] +[group_71100] +[group_71101] +[group_71102] +[group_71103] +[group_71104] +[group_71105] +[group_71106] +[group_71107] +[group_71108] +[group_71109] +[group_71110] +[group_71111] +[group_71112] +[group_71113] +[group_71114] +[group_71115] +[group_71116] +[group_71117] +[group_71118] +[group_71119] +[group_71120] +[group_71121] +[group_71122] +[group_71123] +[group_71124] +[group_71125] +[group_71126] +[group_71127] +[group_71128] +[group_71129] +[group_71130] +[group_71131] +[group_71132] +[group_71133] +[group_71134] +[group_71135] +[group_71136] +[group_71137] +[group_71138] +[group_71139] +[group_71140] +[group_71141] +[group_71142] +[group_71143] +[group_71144] +[group_71145] +[group_71146] +[group_71147] +[group_71148] +[group_71149] +[group_71150] +[group_71151] +[group_71152] +[group_71153] +[group_71154] +[group_71155] +[group_71156] +[group_71157] +[group_71158] +[group_71159] +[group_71160] +[group_71161] +[group_71162] +[group_71163] +[group_71164] +[group_71165] +[group_71166] +[group_71167] +[group_71168] +[group_71169] +[group_71170] +[group_71171] +[group_71172] +[group_71173] +[group_71174] +[group_71175] +[group_71176] +[group_71177] +[group_71178] +[group_71179] +[group_71180] +[group_71181] +[group_71182] +[group_71183] +[group_71184] +[group_71185] +[group_71186] +[group_71187] +[group_71188] +[group_71189] +[group_71190] +[group_71191] +[group_71192] +[group_71193] +[group_71194] +[group_71195] +[group_71196] +[group_71197] +[group_71198] +[group_71199] +[group_71200] +[group_71201] +[group_71202] +[group_71203] +[group_71204] +[group_71205] +[group_71206] +[group_71207] +[group_71208] +[group_71209] +[group_71210] +[group_71211] +[group_71212] +[group_71213] +[group_71214] +[group_71215] +[group_71216] +[group_71217] +[group_71218] +[group_71219] +[group_71220] +[group_71221] +[group_71222] +[group_71223] +[group_71224] +[group_71225] +[group_71226] +[group_71227] +[group_71228] +[group_71229] +[group_71230] +[group_71231] +[group_71232] +[group_71233] +[group_71234] +[group_71235] +[group_71236] +[group_71237] +[group_71238] +[group_71239] +[group_71240] +[group_71241] +[group_71242] +[group_71243] +[group_71244] +[group_71245] +[group_71246] +[group_71247] +[group_71248] +[group_71249] +[group_71250] +[group_71251] +[group_71252] +[group_71253] +[group_71254] +[group_71255] +[group_71256] +[group_71257] +[group_71258] +[group_71259] +[group_71260] +[group_71261] +[group_71262] +[group_71263] +[group_71264] +[group_71265] +[group_71266] +[group_71267] +[group_71268] +[group_71269] +[group_71270] +[group_71271] +[group_71272] +[group_71273] +[group_71274] +[group_71275] +[group_71276] +[group_71277] +[group_71278] +[group_71279] +[group_71280] +[group_71281] +[group_71282] +[group_71283] +[group_71284] +[group_71285] +[group_71286] +[group_71287] +[group_71288] +[group_71289] +[group_71290] +[group_71291] +[group_71292] +[group_71293] +[group_71294] +[group_71295] +[group_71296] +[group_71297] +[group_71298] +[group_71299] +[group_71300] +[group_71301] +[group_71302] +[group_71303] +[group_71304] +[group_71305] +[group_71306] +[group_71307] +[group_71308] +[group_71309] +[group_71310] +[group_71311] +[group_71312] +[group_71313] +[group_71314] +[group_71315] +[group_71316] +[group_71317] +[group_71318] +[group_71319] +[group_71320] +[group_71321] +[group_71322] +[group_71323] +[group_71324] +[group_71325] +[group_71326] +[group_71327] +[group_71328] +[group_71329] +[group_71330] +[group_71331] +[group_71332] +[group_71333] +[group_71334] +[group_71335] +[group_71336] +[group_71337] +[group_71338] +[group_71339] +[group_71340] +[group_71341] +[group_71342] +[group_71343] +[group_71344] +[group_71345] +[group_71346] +[group_71347] +[group_71348] +[group_71349] +[group_71350] +[group_71351] +[group_71352] +[group_71353] +[group_71354] +[group_71355] +[group_71356] +[group_71357] +[group_71358] +[group_71359] +[group_71360] +[group_71361] +[group_71362] +[group_71363] +[group_71364] +[group_71365] +[group_71366] +[group_71367] +[group_71368] +[group_71369] +[group_71370] +[group_71371] +[group_71372] +[group_71373] +[group_71374] +[group_71375] +[group_71376] +[group_71377] +[group_71378] +[group_71379] +[group_71380] +[group_71381] +[group_71382] +[group_71383] +[group_71384] +[group_71385] +[group_71386] +[group_71387] +[group_71388] +[group_71389] +[group_71390] +[group_71391] +[group_71392] +[group_71393] +[group_71394] +[group_71395] +[group_71396] +[group_71397] +[group_71398] +[group_71399] +[group_71400] +[group_71401] +[group_71402] +[group_71403] +[group_71404] +[group_71405] +[group_71406] +[group_71407] +[group_71408] +[group_71409] +[group_71410] +[group_71411] +[group_71412] +[group_71413] +[group_71414] +[group_71415] +[group_71416] +[group_71417] +[group_71418] +[group_71419] +[group_71420] +[group_71421] +[group_71422] +[group_71423] +[group_71424] +[group_71425] +[group_71426] +[group_71427] +[group_71428] +[group_71429] +[group_71430] +[group_71431] +[group_71432] +[group_71433] +[group_71434] +[group_71435] +[group_71436] +[group_71437] +[group_71438] +[group_71439] +[group_71440] +[group_71441] +[group_71442] +[group_71443] +[group_71444] +[group_71445] +[group_71446] +[group_71447] +[group_71448] +[group_71449] +[group_71450] +[group_71451] +[group_71452] +[group_71453] +[group_71454] +[group_71455] +[group_71456] +[group_71457] +[group_71458] +[group_71459] +[group_71460] +[group_71461] +[group_71462] +[group_71463] +[group_71464] +[group_71465] +[group_71466] +[group_71467] +[group_71468] +[group_71469] +[group_71470] +[group_71471] +[group_71472] +[group_71473] +[group_71474] +[group_71475] +[group_71476] +[group_71477] +[group_71478] +[group_71479] +[group_71480] +[group_71481] +[group_71482] +[group_71483] +[group_71484] +[group_71485] +[group_71486] +[group_71487] +[group_71488] +[group_71489] +[group_71490] +[group_71491] +[group_71492] +[group_71493] +[group_71494] +[group_71495] +[group_71496] +[group_71497] +[group_71498] +[group_71499] +[group_71500] +[group_71501] +[group_71502] +[group_71503] +[group_71504] +[group_71505] +[group_71506] +[group_71507] +[group_71508] +[group_71509] +[group_71510] +[group_71511] +[group_71512] +[group_71513] +[group_71514] +[group_71515] +[group_71516] +[group_71517] +[group_71518] +[group_71519] +[group_71520] +[group_71521] +[group_71522] +[group_71523] +[group_71524] +[group_71525] +[group_71526] +[group_71527] +[group_71528] +[group_71529] +[group_71530] +[group_71531] +[group_71532] +[group_71533] +[group_71534] +[group_71535] +[group_71536] +[group_71537] +[group_71538] +[group_71539] +[group_71540] +[group_71541] +[group_71542] +[group_71543] +[group_71544] +[group_71545] +[group_71546] +[group_71547] +[group_71548] +[group_71549] +[group_71550] +[group_71551] +[group_71552] +[group_71553] +[group_71554] +[group_71555] +[group_71556] +[group_71557] +[group_71558] +[group_71559] +[group_71560] +[group_71561] +[group_71562] +[group_71563] +[group_71564] +[group_71565] +[group_71566] +[group_71567] +[group_71568] +[group_71569] +[group_71570] +[group_71571] +[group_71572] +[group_71573] +[group_71574] +[group_71575] +[group_71576] +[group_71577] +[group_71578] +[group_71579] +[group_71580] +[group_71581] +[group_71582] +[group_71583] +[group_71584] +[group_71585] +[group_71586] +[group_71587] +[group_71588] +[group_71589] +[group_71590] +[group_71591] +[group_71592] +[group_71593] +[group_71594] +[group_71595] +[group_71596] +[group_71597] +[group_71598] +[group_71599] +[group_71600] +[group_71601] +[group_71602] +[group_71603] +[group_71604] +[group_71605] +[group_71606] +[group_71607] +[group_71608] +[group_71609] +[group_71610] +[group_71611] +[group_71612] +[group_71613] +[group_71614] +[group_71615] +[group_71616] +[group_71617] +[group_71618] +[group_71619] +[group_71620] +[group_71621] +[group_71622] +[group_71623] +[group_71624] +[group_71625] +[group_71626] +[group_71627] +[group_71628] +[group_71629] +[group_71630] +[group_71631] +[group_71632] +[group_71633] +[group_71634] +[group_71635] +[group_71636] +[group_71637] +[group_71638] +[group_71639] +[group_71640] +[group_71641] +[group_71642] +[group_71643] +[group_71644] +[group_71645] +[group_71646] +[group_71647] +[group_71648] +[group_71649] +[group_71650] +[group_71651] +[group_71652] +[group_71653] +[group_71654] +[group_71655] +[group_71656] +[group_71657] +[group_71658] +[group_71659] +[group_71660] +[group_71661] +[group_71662] +[group_71663] +[group_71664] +[group_71665] +[group_71666] +[group_71667] +[group_71668] +[group_71669] +[group_71670] +[group_71671] +[group_71672] +[group_71673] +[group_71674] +[group_71675] +[group_71676] +[group_71677] +[group_71678] +[group_71679] +[group_71680] +[group_71681] +[group_71682] +[group_71683] +[group_71684] +[group_71685] +[group_71686] +[group_71687] +[group_71688] +[group_71689] +[group_71690] +[group_71691] +[group_71692] +[group_71693] +[group_71694] +[group_71695] +[group_71696] +[group_71697] +[group_71698] +[group_71699] +[group_71700] +[group_71701] +[group_71702] +[group_71703] +[group_71704] +[group_71705] +[group_71706] +[group_71707] +[group_71708] +[group_71709] +[group_71710] +[group_71711] +[group_71712] +[group_71713] +[group_71714] +[group_71715] +[group_71716] +[group_71717] +[group_71718] +[group_71719] +[group_71720] +[group_71721] +[group_71722] +[group_71723] +[group_71724] +[group_71725] +[group_71726] +[group_71727] +[group_71728] +[group_71729] +[group_71730] +[group_71731] +[group_71732] +[group_71733] +[group_71734] +[group_71735] +[group_71736] +[group_71737] +[group_71738] +[group_71739] +[group_71740] +[group_71741] +[group_71742] +[group_71743] +[group_71744] +[group_71745] +[group_71746] +[group_71747] +[group_71748] +[group_71749] +[group_71750] +[group_71751] +[group_71752] +[group_71753] +[group_71754] +[group_71755] +[group_71756] +[group_71757] +[group_71758] +[group_71759] +[group_71760] +[group_71761] +[group_71762] +[group_71763] +[group_71764] +[group_71765] +[group_71766] +[group_71767] +[group_71768] +[group_71769] +[group_71770] +[group_71771] +[group_71772] +[group_71773] +[group_71774] +[group_71775] +[group_71776] +[group_71777] +[group_71778] +[group_71779] +[group_71780] +[group_71781] +[group_71782] +[group_71783] +[group_71784] +[group_71785] +[group_71786] +[group_71787] +[group_71788] +[group_71789] +[group_71790] +[group_71791] +[group_71792] +[group_71793] +[group_71794] +[group_71795] +[group_71796] +[group_71797] +[group_71798] +[group_71799] +[group_71800] +[group_71801] +[group_71802] +[group_71803] +[group_71804] +[group_71805] +[group_71806] +[group_71807] +[group_71808] +[group_71809] +[group_71810] +[group_71811] +[group_71812] +[group_71813] +[group_71814] +[group_71815] +[group_71816] +[group_71817] +[group_71818] +[group_71819] +[group_71820] +[group_71821] +[group_71822] +[group_71823] +[group_71824] +[group_71825] +[group_71826] +[group_71827] +[group_71828] +[group_71829] +[group_71830] +[group_71831] +[group_71832] +[group_71833] +[group_71834] +[group_71835] +[group_71836] +[group_71837] +[group_71838] +[group_71839] +[group_71840] +[group_71841] +[group_71842] +[group_71843] +[group_71844] +[group_71845] +[group_71846] +[group_71847] +[group_71848] +[group_71849] +[group_71850] +[group_71851] +[group_71852] +[group_71853] +[group_71854] +[group_71855] +[group_71856] +[group_71857] +[group_71858] +[group_71859] +[group_71860] +[group_71861] +[group_71862] +[group_71863] +[group_71864] +[group_71865] +[group_71866] +[group_71867] +[group_71868] +[group_71869] +[group_71870] +[group_71871] +[group_71872] +[group_71873] +[group_71874] +[group_71875] +[group_71876] +[group_71877] +[group_71878] +[group_71879] +[group_71880] +[group_71881] +[group_71882] +[group_71883] +[group_71884] +[group_71885] +[group_71886] +[group_71887] +[group_71888] +[group_71889] +[group_71890] +[group_71891] +[group_71892] +[group_71893] +[group_71894] +[group_71895] +[group_71896] +[group_71897] +[group_71898] +[group_71899] +[group_71900] +[group_71901] +[group_71902] +[group_71903] +[group_71904] +[group_71905] +[group_71906] +[group_71907] +[group_71908] +[group_71909] +[group_71910] +[group_71911] +[group_71912] +[group_71913] +[group_71914] +[group_71915] +[group_71916] +[group_71917] +[group_71918] +[group_71919] +[group_71920] +[group_71921] +[group_71922] +[group_71923] +[group_71924] +[group_71925] +[group_71926] +[group_71927] +[group_71928] +[group_71929] +[group_71930] +[group_71931] +[group_71932] +[group_71933] +[group_71934] +[group_71935] +[group_71936] +[group_71937] +[group_71938] +[group_71939] +[group_71940] +[group_71941] +[group_71942] +[group_71943] +[group_71944] +[group_71945] +[group_71946] +[group_71947] +[group_71948] +[group_71949] +[group_71950] +[group_71951] +[group_71952] +[group_71953] +[group_71954] +[group_71955] +[group_71956] +[group_71957] +[group_71958] +[group_71959] +[group_71960] +[group_71961] +[group_71962] +[group_71963] +[group_71964] +[group_71965] +[group_71966] +[group_71967] +[group_71968] +[group_71969] +[group_71970] +[group_71971] +[group_71972] +[group_71973] +[group_71974] +[group_71975] +[group_71976] +[group_71977] +[group_71978] +[group_71979] +[group_71980] +[group_71981] +[group_71982] +[group_71983] +[group_71984] +[group_71985] +[group_71986] +[group_71987] +[group_71988] +[group_71989] +[group_71990] +[group_71991] +[group_71992] +[group_71993] +[group_71994] +[group_71995] +[group_71996] +[group_71997] +[group_71998] +[group_71999] +[group_72000] +[group_72001] +[group_72002] +[group_72003] +[group_72004] +[group_72005] +[group_72006] +[group_72007] +[group_72008] +[group_72009] +[group_72010] +[group_72011] +[group_72012] +[group_72013] +[group_72014] +[group_72015] +[group_72016] +[group_72017] +[group_72018] +[group_72019] +[group_72020] +[group_72021] +[group_72022] +[group_72023] +[group_72024] +[group_72025] +[group_72026] +[group_72027] +[group_72028] +[group_72029] +[group_72030] +[group_72031] +[group_72032] +[group_72033] +[group_72034] +[group_72035] +[group_72036] +[group_72037] +[group_72038] +[group_72039] +[group_72040] +[group_72041] +[group_72042] +[group_72043] +[group_72044] +[group_72045] +[group_72046] +[group_72047] +[group_72048] +[group_72049] +[group_72050] +[group_72051] +[group_72052] +[group_72053] +[group_72054] +[group_72055] +[group_72056] +[group_72057] +[group_72058] +[group_72059] +[group_72060] +[group_72061] +[group_72062] +[group_72063] +[group_72064] +[group_72065] +[group_72066] +[group_72067] +[group_72068] +[group_72069] +[group_72070] +[group_72071] +[group_72072] +[group_72073] +[group_72074] +[group_72075] +[group_72076] +[group_72077] +[group_72078] +[group_72079] +[group_72080] +[group_72081] +[group_72082] +[group_72083] +[group_72084] +[group_72085] +[group_72086] +[group_72087] +[group_72088] +[group_72089] +[group_72090] +[group_72091] +[group_72092] +[group_72093] +[group_72094] +[group_72095] +[group_72096] +[group_72097] +[group_72098] +[group_72099] +[group_72100] +[group_72101] +[group_72102] +[group_72103] +[group_72104] +[group_72105] +[group_72106] +[group_72107] +[group_72108] +[group_72109] +[group_72110] +[group_72111] +[group_72112] +[group_72113] +[group_72114] +[group_72115] +[group_72116] +[group_72117] +[group_72118] +[group_72119] +[group_72120] +[group_72121] +[group_72122] +[group_72123] +[group_72124] +[group_72125] +[group_72126] +[group_72127] +[group_72128] +[group_72129] +[group_72130] +[group_72131] +[group_72132] +[group_72133] +[group_72134] +[group_72135] +[group_72136] +[group_72137] +[group_72138] +[group_72139] +[group_72140] +[group_72141] +[group_72142] +[group_72143] +[group_72144] +[group_72145] +[group_72146] +[group_72147] +[group_72148] +[group_72149] +[group_72150] +[group_72151] +[group_72152] +[group_72153] +[group_72154] +[group_72155] +[group_72156] +[group_72157] +[group_72158] +[group_72159] +[group_72160] +[group_72161] +[group_72162] +[group_72163] +[group_72164] +[group_72165] +[group_72166] +[group_72167] +[group_72168] +[group_72169] +[group_72170] +[group_72171] +[group_72172] +[group_72173] +[group_72174] +[group_72175] +[group_72176] +[group_72177] +[group_72178] +[group_72179] +[group_72180] +[group_72181] +[group_72182] +[group_72183] +[group_72184] +[group_72185] +[group_72186] +[group_72187] +[group_72188] +[group_72189] +[group_72190] +[group_72191] +[group_72192] +[group_72193] +[group_72194] +[group_72195] +[group_72196] +[group_72197] +[group_72198] +[group_72199] +[group_72200] +[group_72201] +[group_72202] +[group_72203] +[group_72204] +[group_72205] +[group_72206] +[group_72207] +[group_72208] +[group_72209] +[group_72210] +[group_72211] +[group_72212] +[group_72213] +[group_72214] +[group_72215] +[group_72216] +[group_72217] +[group_72218] +[group_72219] +[group_72220] +[group_72221] +[group_72222] +[group_72223] +[group_72224] +[group_72225] +[group_72226] +[group_72227] +[group_72228] +[group_72229] +[group_72230] +[group_72231] +[group_72232] +[group_72233] +[group_72234] +[group_72235] +[group_72236] +[group_72237] +[group_72238] +[group_72239] +[group_72240] +[group_72241] +[group_72242] +[group_72243] +[group_72244] +[group_72245] +[group_72246] +[group_72247] +[group_72248] +[group_72249] +[group_72250] +[group_72251] +[group_72252] +[group_72253] +[group_72254] +[group_72255] +[group_72256] +[group_72257] +[group_72258] +[group_72259] +[group_72260] +[group_72261] +[group_72262] +[group_72263] +[group_72264] +[group_72265] +[group_72266] +[group_72267] +[group_72268] +[group_72269] +[group_72270] +[group_72271] +[group_72272] +[group_72273] +[group_72274] +[group_72275] +[group_72276] +[group_72277] +[group_72278] +[group_72279] +[group_72280] +[group_72281] +[group_72282] +[group_72283] +[group_72284] +[group_72285] +[group_72286] +[group_72287] +[group_72288] +[group_72289] +[group_72290] +[group_72291] +[group_72292] +[group_72293] +[group_72294] +[group_72295] +[group_72296] +[group_72297] +[group_72298] +[group_72299] +[group_72300] +[group_72301] +[group_72302] +[group_72303] +[group_72304] +[group_72305] +[group_72306] +[group_72307] +[group_72308] +[group_72309] +[group_72310] +[group_72311] +[group_72312] +[group_72313] +[group_72314] +[group_72315] +[group_72316] +[group_72317] +[group_72318] +[group_72319] +[group_72320] +[group_72321] +[group_72322] +[group_72323] +[group_72324] +[group_72325] +[group_72326] +[group_72327] +[group_72328] +[group_72329] +[group_72330] +[group_72331] +[group_72332] +[group_72333] +[group_72334] +[group_72335] +[group_72336] +[group_72337] +[group_72338] +[group_72339] +[group_72340] +[group_72341] +[group_72342] +[group_72343] +[group_72344] +[group_72345] +[group_72346] +[group_72347] +[group_72348] +[group_72349] +[group_72350] +[group_72351] +[group_72352] +[group_72353] +[group_72354] +[group_72355] +[group_72356] +[group_72357] +[group_72358] +[group_72359] +[group_72360] +[group_72361] +[group_72362] +[group_72363] +[group_72364] +[group_72365] +[group_72366] +[group_72367] +[group_72368] +[group_72369] +[group_72370] +[group_72371] +[group_72372] +[group_72373] +[group_72374] +[group_72375] +[group_72376] +[group_72377] +[group_72378] +[group_72379] +[group_72380] +[group_72381] +[group_72382] +[group_72383] +[group_72384] +[group_72385] +[group_72386] +[group_72387] +[group_72388] +[group_72389] +[group_72390] +[group_72391] +[group_72392] +[group_72393] +[group_72394] +[group_72395] +[group_72396] +[group_72397] +[group_72398] +[group_72399] +[group_72400] +[group_72401] +[group_72402] +[group_72403] +[group_72404] +[group_72405] +[group_72406] +[group_72407] +[group_72408] +[group_72409] +[group_72410] +[group_72411] +[group_72412] +[group_72413] +[group_72414] +[group_72415] +[group_72416] +[group_72417] +[group_72418] +[group_72419] +[group_72420] +[group_72421] +[group_72422] +[group_72423] +[group_72424] +[group_72425] +[group_72426] +[group_72427] +[group_72428] +[group_72429] +[group_72430] +[group_72431] +[group_72432] +[group_72433] +[group_72434] +[group_72435] +[group_72436] +[group_72437] +[group_72438] +[group_72439] +[group_72440] +[group_72441] +[group_72442] +[group_72443] +[group_72444] +[group_72445] +[group_72446] +[group_72447] +[group_72448] +[group_72449] +[group_72450] +[group_72451] +[group_72452] +[group_72453] +[group_72454] +[group_72455] +[group_72456] +[group_72457] +[group_72458] +[group_72459] +[group_72460] +[group_72461] +[group_72462] +[group_72463] +[group_72464] +[group_72465] +[group_72466] +[group_72467] +[group_72468] +[group_72469] +[group_72470] +[group_72471] +[group_72472] +[group_72473] +[group_72474] +[group_72475] +[group_72476] +[group_72477] +[group_72478] +[group_72479] +[group_72480] +[group_72481] +[group_72482] +[group_72483] +[group_72484] +[group_72485] +[group_72486] +[group_72487] +[group_72488] +[group_72489] +[group_72490] +[group_72491] +[group_72492] +[group_72493] +[group_72494] +[group_72495] +[group_72496] +[group_72497] +[group_72498] +[group_72499] +[group_72500] +[group_72501] +[group_72502] +[group_72503] +[group_72504] +[group_72505] +[group_72506] +[group_72507] +[group_72508] +[group_72509] +[group_72510] +[group_72511] +[group_72512] +[group_72513] +[group_72514] +[group_72515] +[group_72516] +[group_72517] +[group_72518] +[group_72519] +[group_72520] +[group_72521] +[group_72522] +[group_72523] +[group_72524] +[group_72525] +[group_72526] +[group_72527] +[group_72528] +[group_72529] +[group_72530] +[group_72531] +[group_72532] +[group_72533] +[group_72534] +[group_72535] +[group_72536] +[group_72537] +[group_72538] +[group_72539] +[group_72540] +[group_72541] +[group_72542] +[group_72543] +[group_72544] +[group_72545] +[group_72546] +[group_72547] +[group_72548] +[group_72549] +[group_72550] +[group_72551] +[group_72552] +[group_72553] +[group_72554] +[group_72555] +[group_72556] +[group_72557] +[group_72558] +[group_72559] +[group_72560] +[group_72561] +[group_72562] +[group_72563] +[group_72564] +[group_72565] +[group_72566] +[group_72567] +[group_72568] +[group_72569] +[group_72570] +[group_72571] +[group_72572] +[group_72573] +[group_72574] +[group_72575] +[group_72576] +[group_72577] +[group_72578] +[group_72579] +[group_72580] +[group_72581] +[group_72582] +[group_72583] +[group_72584] +[group_72585] +[group_72586] +[group_72587] +[group_72588] +[group_72589] +[group_72590] +[group_72591] +[group_72592] +[group_72593] +[group_72594] +[group_72595] +[group_72596] +[group_72597] +[group_72598] +[group_72599] +[group_72600] +[group_72601] +[group_72602] +[group_72603] +[group_72604] +[group_72605] +[group_72606] +[group_72607] +[group_72608] +[group_72609] +[group_72610] +[group_72611] +[group_72612] +[group_72613] +[group_72614] +[group_72615] +[group_72616] +[group_72617] +[group_72618] +[group_72619] +[group_72620] +[group_72621] +[group_72622] +[group_72623] +[group_72624] +[group_72625] +[group_72626] +[group_72627] +[group_72628] +[group_72629] +[group_72630] +[group_72631] +[group_72632] +[group_72633] +[group_72634] +[group_72635] +[group_72636] +[group_72637] +[group_72638] +[group_72639] +[group_72640] +[group_72641] +[group_72642] +[group_72643] +[group_72644] +[group_72645] +[group_72646] +[group_72647] +[group_72648] +[group_72649] +[group_72650] +[group_72651] +[group_72652] +[group_72653] +[group_72654] +[group_72655] +[group_72656] +[group_72657] +[group_72658] +[group_72659] +[group_72660] +[group_72661] +[group_72662] +[group_72663] +[group_72664] +[group_72665] +[group_72666] +[group_72667] +[group_72668] +[group_72669] +[group_72670] +[group_72671] +[group_72672] +[group_72673] +[group_72674] +[group_72675] +[group_72676] +[group_72677] +[group_72678] +[group_72679] +[group_72680] +[group_72681] +[group_72682] +[group_72683] +[group_72684] +[group_72685] +[group_72686] +[group_72687] +[group_72688] +[group_72689] +[group_72690] +[group_72691] +[group_72692] +[group_72693] +[group_72694] +[group_72695] +[group_72696] +[group_72697] +[group_72698] +[group_72699] +[group_72700] +[group_72701] +[group_72702] +[group_72703] +[group_72704] +[group_72705] +[group_72706] +[group_72707] +[group_72708] +[group_72709] +[group_72710] +[group_72711] +[group_72712] +[group_72713] +[group_72714] +[group_72715] +[group_72716] +[group_72717] +[group_72718] +[group_72719] +[group_72720] +[group_72721] +[group_72722] +[group_72723] +[group_72724] +[group_72725] +[group_72726] +[group_72727] +[group_72728] +[group_72729] +[group_72730] +[group_72731] +[group_72732] +[group_72733] +[group_72734] +[group_72735] +[group_72736] +[group_72737] +[group_72738] +[group_72739] +[group_72740] +[group_72741] +[group_72742] +[group_72743] +[group_72744] +[group_72745] +[group_72746] +[group_72747] +[group_72748] +[group_72749] +[group_72750] +[group_72751] +[group_72752] +[group_72753] +[group_72754] +[group_72755] +[group_72756] +[group_72757] +[group_72758] +[group_72759] +[group_72760] +[group_72761] +[group_72762] +[group_72763] +[group_72764] +[group_72765] +[group_72766] +[group_72767] +[group_72768] +[group_72769] +[group_72770] +[group_72771] +[group_72772] +[group_72773] +[group_72774] +[group_72775] +[group_72776] +[group_72777] +[group_72778] +[group_72779] +[group_72780] +[group_72781] +[group_72782] +[group_72783] +[group_72784] +[group_72785] +[group_72786] +[group_72787] +[group_72788] +[group_72789] +[group_72790] +[group_72791] +[group_72792] +[group_72793] +[group_72794] +[group_72795] +[group_72796] +[group_72797] +[group_72798] +[group_72799] +[group_72800] +[group_72801] +[group_72802] +[group_72803] +[group_72804] +[group_72805] +[group_72806] +[group_72807] +[group_72808] +[group_72809] +[group_72810] +[group_72811] +[group_72812] +[group_72813] +[group_72814] +[group_72815] +[group_72816] +[group_72817] +[group_72818] +[group_72819] +[group_72820] +[group_72821] +[group_72822] +[group_72823] +[group_72824] +[group_72825] +[group_72826] +[group_72827] +[group_72828] +[group_72829] +[group_72830] +[group_72831] +[group_72832] +[group_72833] +[group_72834] +[group_72835] +[group_72836] +[group_72837] +[group_72838] +[group_72839] +[group_72840] +[group_72841] +[group_72842] +[group_72843] +[group_72844] +[group_72845] +[group_72846] +[group_72847] +[group_72848] +[group_72849] +[group_72850] +[group_72851] +[group_72852] +[group_72853] +[group_72854] +[group_72855] +[group_72856] +[group_72857] +[group_72858] +[group_72859] +[group_72860] +[group_72861] +[group_72862] +[group_72863] +[group_72864] +[group_72865] +[group_72866] +[group_72867] +[group_72868] +[group_72869] +[group_72870] +[group_72871] +[group_72872] +[group_72873] +[group_72874] +[group_72875] +[group_72876] +[group_72877] +[group_72878] +[group_72879] +[group_72880] +[group_72881] +[group_72882] +[group_72883] +[group_72884] +[group_72885] +[group_72886] +[group_72887] +[group_72888] +[group_72889] +[group_72890] +[group_72891] +[group_72892] +[group_72893] +[group_72894] +[group_72895] +[group_72896] +[group_72897] +[group_72898] +[group_72899] +[group_72900] +[group_72901] +[group_72902] +[group_72903] +[group_72904] +[group_72905] +[group_72906] +[group_72907] +[group_72908] +[group_72909] +[group_72910] +[group_72911] +[group_72912] +[group_72913] +[group_72914] +[group_72915] +[group_72916] +[group_72917] +[group_72918] +[group_72919] +[group_72920] +[group_72921] +[group_72922] +[group_72923] +[group_72924] +[group_72925] +[group_72926] +[group_72927] +[group_72928] +[group_72929] +[group_72930] +[group_72931] +[group_72932] +[group_72933] +[group_72934] +[group_72935] +[group_72936] +[group_72937] +[group_72938] +[group_72939] +[group_72940] +[group_72941] +[group_72942] +[group_72943] +[group_72944] +[group_72945] +[group_72946] +[group_72947] +[group_72948] +[group_72949] +[group_72950] +[group_72951] +[group_72952] +[group_72953] +[group_72954] +[group_72955] +[group_72956] +[group_72957] +[group_72958] +[group_72959] +[group_72960] +[group_72961] +[group_72962] +[group_72963] +[group_72964] +[group_72965] +[group_72966] +[group_72967] +[group_72968] +[group_72969] +[group_72970] +[group_72971] +[group_72972] +[group_72973] +[group_72974] +[group_72975] +[group_72976] +[group_72977] +[group_72978] +[group_72979] +[group_72980] +[group_72981] +[group_72982] +[group_72983] +[group_72984] +[group_72985] +[group_72986] +[group_72987] +[group_72988] +[group_72989] +[group_72990] +[group_72991] +[group_72992] +[group_72993] +[group_72994] +[group_72995] +[group_72996] +[group_72997] +[group_72998] +[group_72999] +[group_73000] +[group_73001] +[group_73002] +[group_73003] +[group_73004] +[group_73005] +[group_73006] +[group_73007] +[group_73008] +[group_73009] +[group_73010] +[group_73011] +[group_73012] +[group_73013] +[group_73014] +[group_73015] +[group_73016] +[group_73017] +[group_73018] +[group_73019] +[group_73020] +[group_73021] +[group_73022] +[group_73023] +[group_73024] +[group_73025] +[group_73026] +[group_73027] +[group_73028] +[group_73029] +[group_73030] +[group_73031] +[group_73032] +[group_73033] +[group_73034] +[group_73035] +[group_73036] +[group_73037] +[group_73038] +[group_73039] +[group_73040] +[group_73041] +[group_73042] +[group_73043] +[group_73044] +[group_73045] +[group_73046] +[group_73047] +[group_73048] +[group_73049] +[group_73050] +[group_73051] +[group_73052] +[group_73053] +[group_73054] +[group_73055] +[group_73056] +[group_73057] +[group_73058] +[group_73059] +[group_73060] +[group_73061] +[group_73062] +[group_73063] +[group_73064] +[group_73065] +[group_73066] +[group_73067] +[group_73068] +[group_73069] +[group_73070] +[group_73071] +[group_73072] +[group_73073] +[group_73074] +[group_73075] +[group_73076] +[group_73077] +[group_73078] +[group_73079] +[group_73080] +[group_73081] +[group_73082] +[group_73083] +[group_73084] +[group_73085] +[group_73086] +[group_73087] +[group_73088] +[group_73089] +[group_73090] +[group_73091] +[group_73092] +[group_73093] +[group_73094] +[group_73095] +[group_73096] +[group_73097] +[group_73098] +[group_73099] +[group_73100] +[group_73101] +[group_73102] +[group_73103] +[group_73104] +[group_73105] +[group_73106] +[group_73107] +[group_73108] +[group_73109] +[group_73110] +[group_73111] +[group_73112] +[group_73113] +[group_73114] +[group_73115] +[group_73116] +[group_73117] +[group_73118] +[group_73119] +[group_73120] +[group_73121] +[group_73122] +[group_73123] +[group_73124] +[group_73125] +[group_73126] +[group_73127] +[group_73128] +[group_73129] +[group_73130] +[group_73131] +[group_73132] +[group_73133] +[group_73134] +[group_73135] +[group_73136] +[group_73137] +[group_73138] +[group_73139] +[group_73140] +[group_73141] +[group_73142] +[group_73143] +[group_73144] +[group_73145] +[group_73146] +[group_73147] +[group_73148] +[group_73149] +[group_73150] +[group_73151] +[group_73152] +[group_73153] +[group_73154] +[group_73155] +[group_73156] +[group_73157] +[group_73158] +[group_73159] +[group_73160] +[group_73161] +[group_73162] +[group_73163] +[group_73164] +[group_73165] +[group_73166] +[group_73167] +[group_73168] +[group_73169] +[group_73170] +[group_73171] +[group_73172] +[group_73173] +[group_73174] +[group_73175] +[group_73176] +[group_73177] +[group_73178] +[group_73179] +[group_73180] +[group_73181] +[group_73182] +[group_73183] +[group_73184] +[group_73185] +[group_73186] +[group_73187] +[group_73188] +[group_73189] +[group_73190] +[group_73191] +[group_73192] +[group_73193] +[group_73194] +[group_73195] +[group_73196] +[group_73197] +[group_73198] +[group_73199] +[group_73200] +[group_73201] +[group_73202] +[group_73203] +[group_73204] +[group_73205] +[group_73206] +[group_73207] +[group_73208] +[group_73209] +[group_73210] +[group_73211] +[group_73212] +[group_73213] +[group_73214] +[group_73215] +[group_73216] +[group_73217] +[group_73218] +[group_73219] +[group_73220] +[group_73221] +[group_73222] +[group_73223] +[group_73224] +[group_73225] +[group_73226] +[group_73227] +[group_73228] +[group_73229] +[group_73230] +[group_73231] +[group_73232] +[group_73233] +[group_73234] +[group_73235] +[group_73236] +[group_73237] +[group_73238] +[group_73239] +[group_73240] +[group_73241] +[group_73242] +[group_73243] +[group_73244] +[group_73245] +[group_73246] +[group_73247] +[group_73248] +[group_73249] +[group_73250] +[group_73251] +[group_73252] +[group_73253] +[group_73254] +[group_73255] +[group_73256] +[group_73257] +[group_73258] +[group_73259] +[group_73260] +[group_73261] +[group_73262] +[group_73263] +[group_73264] +[group_73265] +[group_73266] +[group_73267] +[group_73268] +[group_73269] +[group_73270] +[group_73271] +[group_73272] +[group_73273] +[group_73274] +[group_73275] +[group_73276] +[group_73277] +[group_73278] +[group_73279] +[group_73280] +[group_73281] +[group_73282] +[group_73283] +[group_73284] +[group_73285] +[group_73286] +[group_73287] +[group_73288] +[group_73289] +[group_73290] +[group_73291] +[group_73292] +[group_73293] +[group_73294] +[group_73295] +[group_73296] +[group_73297] +[group_73298] +[group_73299] +[group_73300] +[group_73301] +[group_73302] +[group_73303] +[group_73304] +[group_73305] +[group_73306] +[group_73307] +[group_73308] +[group_73309] +[group_73310] +[group_73311] +[group_73312] +[group_73313] +[group_73314] +[group_73315] +[group_73316] +[group_73317] +[group_73318] +[group_73319] +[group_73320] +[group_73321] +[group_73322] +[group_73323] +[group_73324] +[group_73325] +[group_73326] +[group_73327] +[group_73328] +[group_73329] +[group_73330] +[group_73331] +[group_73332] +[group_73333] +[group_73334] +[group_73335] +[group_73336] +[group_73337] +[group_73338] +[group_73339] +[group_73340] +[group_73341] +[group_73342] +[group_73343] +[group_73344] +[group_73345] +[group_73346] +[group_73347] +[group_73348] +[group_73349] +[group_73350] +[group_73351] +[group_73352] +[group_73353] +[group_73354] +[group_73355] +[group_73356] +[group_73357] +[group_73358] +[group_73359] +[group_73360] +[group_73361] +[group_73362] +[group_73363] +[group_73364] +[group_73365] +[group_73366] +[group_73367] +[group_73368] +[group_73369] +[group_73370] +[group_73371] +[group_73372] +[group_73373] +[group_73374] +[group_73375] +[group_73376] +[group_73377] +[group_73378] +[group_73379] +[group_73380] +[group_73381] +[group_73382] +[group_73383] +[group_73384] +[group_73385] +[group_73386] +[group_73387] +[group_73388] +[group_73389] +[group_73390] +[group_73391] +[group_73392] +[group_73393] +[group_73394] +[group_73395] +[group_73396] +[group_73397] +[group_73398] +[group_73399] +[group_73400] +[group_73401] +[group_73402] +[group_73403] +[group_73404] +[group_73405] +[group_73406] +[group_73407] +[group_73408] +[group_73409] +[group_73410] +[group_73411] +[group_73412] +[group_73413] +[group_73414] +[group_73415] +[group_73416] +[group_73417] +[group_73418] +[group_73419] +[group_73420] +[group_73421] +[group_73422] +[group_73423] +[group_73424] +[group_73425] +[group_73426] +[group_73427] +[group_73428] +[group_73429] +[group_73430] +[group_73431] +[group_73432] +[group_73433] +[group_73434] +[group_73435] +[group_73436] +[group_73437] +[group_73438] +[group_73439] +[group_73440] +[group_73441] +[group_73442] +[group_73443] +[group_73444] +[group_73445] +[group_73446] +[group_73447] +[group_73448] +[group_73449] +[group_73450] +[group_73451] +[group_73452] +[group_73453] +[group_73454] +[group_73455] +[group_73456] +[group_73457] +[group_73458] +[group_73459] +[group_73460] +[group_73461] +[group_73462] +[group_73463] +[group_73464] +[group_73465] +[group_73466] +[group_73467] +[group_73468] +[group_73469] +[group_73470] +[group_73471] +[group_73472] +[group_73473] +[group_73474] +[group_73475] +[group_73476] +[group_73477] +[group_73478] +[group_73479] +[group_73480] +[group_73481] +[group_73482] +[group_73483] +[group_73484] +[group_73485] +[group_73486] +[group_73487] +[group_73488] +[group_73489] +[group_73490] +[group_73491] +[group_73492] +[group_73493] +[group_73494] +[group_73495] +[group_73496] +[group_73497] +[group_73498] +[group_73499] +[group_73500] +[group_73501] +[group_73502] +[group_73503] +[group_73504] +[group_73505] +[group_73506] +[group_73507] +[group_73508] +[group_73509] +[group_73510] +[group_73511] +[group_73512] +[group_73513] +[group_73514] +[group_73515] +[group_73516] +[group_73517] +[group_73518] +[group_73519] +[group_73520] +[group_73521] +[group_73522] +[group_73523] +[group_73524] +[group_73525] +[group_73526] +[group_73527] +[group_73528] +[group_73529] +[group_73530] +[group_73531] +[group_73532] +[group_73533] +[group_73534] +[group_73535] +[group_73536] +[group_73537] +[group_73538] +[group_73539] +[group_73540] +[group_73541] +[group_73542] +[group_73543] +[group_73544] +[group_73545] +[group_73546] +[group_73547] +[group_73548] +[group_73549] +[group_73550] +[group_73551] +[group_73552] +[group_73553] +[group_73554] +[group_73555] +[group_73556] +[group_73557] +[group_73558] +[group_73559] +[group_73560] +[group_73561] +[group_73562] +[group_73563] +[group_73564] +[group_73565] +[group_73566] +[group_73567] +[group_73568] +[group_73569] +[group_73570] +[group_73571] +[group_73572] +[group_73573] +[group_73574] +[group_73575] +[group_73576] +[group_73577] +[group_73578] +[group_73579] +[group_73580] +[group_73581] +[group_73582] +[group_73583] +[group_73584] +[group_73585] +[group_73586] +[group_73587] +[group_73588] +[group_73589] +[group_73590] +[group_73591] +[group_73592] +[group_73593] +[group_73594] +[group_73595] +[group_73596] +[group_73597] +[group_73598] +[group_73599] +[group_73600] +[group_73601] +[group_73602] +[group_73603] +[group_73604] +[group_73605] +[group_73606] +[group_73607] +[group_73608] +[group_73609] +[group_73610] +[group_73611] +[group_73612] +[group_73613] +[group_73614] +[group_73615] +[group_73616] +[group_73617] +[group_73618] +[group_73619] +[group_73620] +[group_73621] +[group_73622] +[group_73623] +[group_73624] +[group_73625] +[group_73626] +[group_73627] +[group_73628] +[group_73629] +[group_73630] +[group_73631] +[group_73632] +[group_73633] +[group_73634] +[group_73635] +[group_73636] +[group_73637] +[group_73638] +[group_73639] +[group_73640] +[group_73641] +[group_73642] +[group_73643] +[group_73644] +[group_73645] +[group_73646] +[group_73647] +[group_73648] +[group_73649] +[group_73650] +[group_73651] +[group_73652] +[group_73653] +[group_73654] +[group_73655] +[group_73656] +[group_73657] +[group_73658] +[group_73659] +[group_73660] +[group_73661] +[group_73662] +[group_73663] +[group_73664] +[group_73665] +[group_73666] +[group_73667] +[group_73668] +[group_73669] +[group_73670] +[group_73671] +[group_73672] +[group_73673] +[group_73674] +[group_73675] +[group_73676] +[group_73677] +[group_73678] +[group_73679] +[group_73680] +[group_73681] +[group_73682] +[group_73683] +[group_73684] +[group_73685] +[group_73686] +[group_73687] +[group_73688] +[group_73689] +[group_73690] +[group_73691] +[group_73692] +[group_73693] +[group_73694] +[group_73695] +[group_73696] +[group_73697] +[group_73698] +[group_73699] +[group_73700] +[group_73701] +[group_73702] +[group_73703] +[group_73704] +[group_73705] +[group_73706] +[group_73707] +[group_73708] +[group_73709] +[group_73710] +[group_73711] +[group_73712] +[group_73713] +[group_73714] +[group_73715] +[group_73716] +[group_73717] +[group_73718] +[group_73719] +[group_73720] +[group_73721] +[group_73722] +[group_73723] +[group_73724] +[group_73725] +[group_73726] +[group_73727] +[group_73728] +[group_73729] +[group_73730] +[group_73731] +[group_73732] +[group_73733] +[group_73734] +[group_73735] +[group_73736] +[group_73737] +[group_73738] +[group_73739] +[group_73740] +[group_73741] +[group_73742] +[group_73743] +[group_73744] +[group_73745] +[group_73746] +[group_73747] +[group_73748] +[group_73749] +[group_73750] +[group_73751] +[group_73752] +[group_73753] +[group_73754] +[group_73755] +[group_73756] +[group_73757] +[group_73758] +[group_73759] +[group_73760] +[group_73761] +[group_73762] +[group_73763] +[group_73764] +[group_73765] +[group_73766] +[group_73767] +[group_73768] +[group_73769] +[group_73770] +[group_73771] +[group_73772] +[group_73773] +[group_73774] +[group_73775] +[group_73776] +[group_73777] +[group_73778] +[group_73779] +[group_73780] +[group_73781] +[group_73782] +[group_73783] +[group_73784] +[group_73785] +[group_73786] +[group_73787] +[group_73788] +[group_73789] +[group_73790] +[group_73791] +[group_73792] +[group_73793] +[group_73794] +[group_73795] +[group_73796] +[group_73797] +[group_73798] +[group_73799] +[group_73800] +[group_73801] +[group_73802] +[group_73803] +[group_73804] +[group_73805] +[group_73806] +[group_73807] +[group_73808] +[group_73809] +[group_73810] +[group_73811] +[group_73812] +[group_73813] +[group_73814] +[group_73815] +[group_73816] +[group_73817] +[group_73818] +[group_73819] +[group_73820] +[group_73821] +[group_73822] +[group_73823] +[group_73824] +[group_73825] +[group_73826] +[group_73827] +[group_73828] +[group_73829] +[group_73830] +[group_73831] +[group_73832] +[group_73833] +[group_73834] +[group_73835] +[group_73836] +[group_73837] +[group_73838] +[group_73839] +[group_73840] +[group_73841] +[group_73842] +[group_73843] +[group_73844] +[group_73845] +[group_73846] +[group_73847] +[group_73848] +[group_73849] +[group_73850] +[group_73851] +[group_73852] +[group_73853] +[group_73854] +[group_73855] +[group_73856] +[group_73857] +[group_73858] +[group_73859] +[group_73860] +[group_73861] +[group_73862] +[group_73863] +[group_73864] +[group_73865] +[group_73866] +[group_73867] +[group_73868] +[group_73869] +[group_73870] +[group_73871] +[group_73872] +[group_73873] +[group_73874] +[group_73875] +[group_73876] +[group_73877] +[group_73878] +[group_73879] +[group_73880] +[group_73881] +[group_73882] +[group_73883] +[group_73884] +[group_73885] +[group_73886] +[group_73887] +[group_73888] +[group_73889] +[group_73890] +[group_73891] +[group_73892] +[group_73893] +[group_73894] +[group_73895] +[group_73896] +[group_73897] +[group_73898] +[group_73899] +[group_73900] +[group_73901] +[group_73902] +[group_73903] +[group_73904] +[group_73905] +[group_73906] +[group_73907] +[group_73908] +[group_73909] +[group_73910] +[group_73911] +[group_73912] +[group_73913] +[group_73914] +[group_73915] +[group_73916] +[group_73917] +[group_73918] +[group_73919] +[group_73920] +[group_73921] +[group_73922] +[group_73923] +[group_73924] +[group_73925] +[group_73926] +[group_73927] +[group_73928] +[group_73929] +[group_73930] +[group_73931] +[group_73932] +[group_73933] +[group_73934] +[group_73935] +[group_73936] +[group_73937] +[group_73938] +[group_73939] +[group_73940] +[group_73941] +[group_73942] +[group_73943] +[group_73944] +[group_73945] +[group_73946] +[group_73947] +[group_73948] +[group_73949] +[group_73950] +[group_73951] +[group_73952] +[group_73953] +[group_73954] +[group_73955] +[group_73956] +[group_73957] +[group_73958] +[group_73959] +[group_73960] +[group_73961] +[group_73962] +[group_73963] +[group_73964] +[group_73965] +[group_73966] +[group_73967] +[group_73968] +[group_73969] +[group_73970] +[group_73971] +[group_73972] +[group_73973] +[group_73974] +[group_73975] +[group_73976] +[group_73977] +[group_73978] +[group_73979] +[group_73980] +[group_73981] +[group_73982] +[group_73983] +[group_73984] +[group_73985] +[group_73986] +[group_73987] +[group_73988] +[group_73989] +[group_73990] +[group_73991] +[group_73992] +[group_73993] +[group_73994] +[group_73995] +[group_73996] +[group_73997] +[group_73998] +[group_73999] +[group_74000] +[group_74001] +[group_74002] +[group_74003] +[group_74004] +[group_74005] +[group_74006] +[group_74007] +[group_74008] +[group_74009] +[group_74010] +[group_74011] +[group_74012] +[group_74013] +[group_74014] +[group_74015] +[group_74016] +[group_74017] +[group_74018] +[group_74019] +[group_74020] +[group_74021] +[group_74022] +[group_74023] +[group_74024] +[group_74025] +[group_74026] +[group_74027] +[group_74028] +[group_74029] +[group_74030] +[group_74031] +[group_74032] +[group_74033] +[group_74034] +[group_74035] +[group_74036] +[group_74037] +[group_74038] +[group_74039] +[group_74040] +[group_74041] +[group_74042] +[group_74043] +[group_74044] +[group_74045] +[group_74046] +[group_74047] +[group_74048] +[group_74049] +[group_74050] +[group_74051] +[group_74052] +[group_74053] +[group_74054] +[group_74055] +[group_74056] +[group_74057] +[group_74058] +[group_74059] +[group_74060] +[group_74061] +[group_74062] +[group_74063] +[group_74064] +[group_74065] +[group_74066] +[group_74067] +[group_74068] +[group_74069] +[group_74070] +[group_74071] +[group_74072] +[group_74073] +[group_74074] +[group_74075] +[group_74076] +[group_74077] +[group_74078] +[group_74079] +[group_74080] +[group_74081] +[group_74082] +[group_74083] +[group_74084] +[group_74085] +[group_74086] +[group_74087] +[group_74088] +[group_74089] +[group_74090] +[group_74091] +[group_74092] +[group_74093] +[group_74094] +[group_74095] +[group_74096] +[group_74097] +[group_74098] +[group_74099] +[group_74100] +[group_74101] +[group_74102] +[group_74103] +[group_74104] +[group_74105] +[group_74106] +[group_74107] +[group_74108] +[group_74109] +[group_74110] +[group_74111] +[group_74112] +[group_74113] +[group_74114] +[group_74115] +[group_74116] +[group_74117] +[group_74118] +[group_74119] +[group_74120] +[group_74121] +[group_74122] +[group_74123] +[group_74124] +[group_74125] +[group_74126] +[group_74127] +[group_74128] +[group_74129] +[group_74130] +[group_74131] +[group_74132] +[group_74133] +[group_74134] +[group_74135] +[group_74136] +[group_74137] +[group_74138] +[group_74139] +[group_74140] +[group_74141] +[group_74142] +[group_74143] +[group_74144] +[group_74145] +[group_74146] +[group_74147] +[group_74148] +[group_74149] +[group_74150] +[group_74151] +[group_74152] +[group_74153] +[group_74154] +[group_74155] +[group_74156] +[group_74157] +[group_74158] +[group_74159] +[group_74160] +[group_74161] +[group_74162] +[group_74163] +[group_74164] +[group_74165] +[group_74166] +[group_74167] +[group_74168] +[group_74169] +[group_74170] +[group_74171] +[group_74172] +[group_74173] +[group_74174] +[group_74175] +[group_74176] +[group_74177] +[group_74178] +[group_74179] +[group_74180] +[group_74181] +[group_74182] +[group_74183] +[group_74184] +[group_74185] +[group_74186] +[group_74187] +[group_74188] +[group_74189] +[group_74190] +[group_74191] +[group_74192] +[group_74193] +[group_74194] +[group_74195] +[group_74196] +[group_74197] +[group_74198] +[group_74199] +[group_74200] +[group_74201] +[group_74202] +[group_74203] +[group_74204] +[group_74205] +[group_74206] +[group_74207] +[group_74208] +[group_74209] +[group_74210] +[group_74211] +[group_74212] +[group_74213] +[group_74214] +[group_74215] +[group_74216] +[group_74217] +[group_74218] +[group_74219] +[group_74220] +[group_74221] +[group_74222] +[group_74223] +[group_74224] +[group_74225] +[group_74226] +[group_74227] +[group_74228] +[group_74229] +[group_74230] +[group_74231] +[group_74232] +[group_74233] +[group_74234] +[group_74235] +[group_74236] +[group_74237] +[group_74238] +[group_74239] +[group_74240] +[group_74241] +[group_74242] +[group_74243] +[group_74244] +[group_74245] +[group_74246] +[group_74247] +[group_74248] +[group_74249] +[group_74250] +[group_74251] +[group_74252] +[group_74253] +[group_74254] +[group_74255] +[group_74256] +[group_74257] +[group_74258] +[group_74259] +[group_74260] +[group_74261] +[group_74262] +[group_74263] +[group_74264] +[group_74265] +[group_74266] +[group_74267] +[group_74268] +[group_74269] +[group_74270] +[group_74271] +[group_74272] +[group_74273] +[group_74274] +[group_74275] +[group_74276] +[group_74277] +[group_74278] +[group_74279] +[group_74280] +[group_74281] +[group_74282] +[group_74283] +[group_74284] +[group_74285] +[group_74286] +[group_74287] +[group_74288] +[group_74289] +[group_74290] +[group_74291] +[group_74292] +[group_74293] +[group_74294] +[group_74295] +[group_74296] +[group_74297] +[group_74298] +[group_74299] +[group_74300] +[group_74301] +[group_74302] +[group_74303] +[group_74304] +[group_74305] +[group_74306] +[group_74307] +[group_74308] +[group_74309] +[group_74310] +[group_74311] +[group_74312] +[group_74313] +[group_74314] +[group_74315] +[group_74316] +[group_74317] +[group_74318] +[group_74319] +[group_74320] +[group_74321] +[group_74322] +[group_74323] +[group_74324] +[group_74325] +[group_74326] +[group_74327] +[group_74328] +[group_74329] +[group_74330] +[group_74331] +[group_74332] +[group_74333] +[group_74334] +[group_74335] +[group_74336] +[group_74337] +[group_74338] +[group_74339] +[group_74340] +[group_74341] +[group_74342] +[group_74343] +[group_74344] +[group_74345] +[group_74346] +[group_74347] +[group_74348] +[group_74349] +[group_74350] +[group_74351] +[group_74352] +[group_74353] +[group_74354] +[group_74355] +[group_74356] +[group_74357] +[group_74358] +[group_74359] +[group_74360] +[group_74361] +[group_74362] +[group_74363] +[group_74364] +[group_74365] +[group_74366] +[group_74367] +[group_74368] +[group_74369] +[group_74370] +[group_74371] +[group_74372] +[group_74373] +[group_74374] +[group_74375] +[group_74376] +[group_74377] +[group_74378] +[group_74379] +[group_74380] +[group_74381] +[group_74382] +[group_74383] +[group_74384] +[group_74385] +[group_74386] +[group_74387] +[group_74388] +[group_74389] +[group_74390] +[group_74391] +[group_74392] +[group_74393] +[group_74394] +[group_74395] +[group_74396] +[group_74397] +[group_74398] +[group_74399] +[group_74400] +[group_74401] +[group_74402] +[group_74403] +[group_74404] +[group_74405] +[group_74406] +[group_74407] +[group_74408] +[group_74409] +[group_74410] +[group_74411] +[group_74412] +[group_74413] +[group_74414] +[group_74415] +[group_74416] +[group_74417] +[group_74418] +[group_74419] +[group_74420] +[group_74421] +[group_74422] +[group_74423] +[group_74424] +[group_74425] +[group_74426] +[group_74427] +[group_74428] +[group_74429] +[group_74430] +[group_74431] +[group_74432] +[group_74433] +[group_74434] +[group_74435] +[group_74436] +[group_74437] +[group_74438] +[group_74439] +[group_74440] +[group_74441] +[group_74442] +[group_74443] +[group_74444] +[group_74445] +[group_74446] +[group_74447] +[group_74448] +[group_74449] +[group_74450] +[group_74451] +[group_74452] +[group_74453] +[group_74454] +[group_74455] +[group_74456] +[group_74457] +[group_74458] +[group_74459] +[group_74460] +[group_74461] +[group_74462] +[group_74463] +[group_74464] +[group_74465] +[group_74466] +[group_74467] +[group_74468] +[group_74469] +[group_74470] +[group_74471] +[group_74472] +[group_74473] +[group_74474] +[group_74475] +[group_74476] +[group_74477] +[group_74478] +[group_74479] +[group_74480] +[group_74481] +[group_74482] +[group_74483] +[group_74484] +[group_74485] +[group_74486] +[group_74487] +[group_74488] +[group_74489] +[group_74490] +[group_74491] +[group_74492] +[group_74493] +[group_74494] +[group_74495] +[group_74496] +[group_74497] +[group_74498] +[group_74499] +[group_74500] +[group_74501] +[group_74502] +[group_74503] +[group_74504] +[group_74505] +[group_74506] +[group_74507] +[group_74508] +[group_74509] +[group_74510] +[group_74511] +[group_74512] +[group_74513] +[group_74514] +[group_74515] +[group_74516] +[group_74517] +[group_74518] +[group_74519] +[group_74520] +[group_74521] +[group_74522] +[group_74523] +[group_74524] +[group_74525] +[group_74526] +[group_74527] +[group_74528] +[group_74529] +[group_74530] +[group_74531] +[group_74532] +[group_74533] +[group_74534] +[group_74535] +[group_74536] +[group_74537] +[group_74538] +[group_74539] +[group_74540] +[group_74541] +[group_74542] +[group_74543] +[group_74544] +[group_74545] +[group_74546] +[group_74547] +[group_74548] +[group_74549] +[group_74550] +[group_74551] +[group_74552] +[group_74553] +[group_74554] +[group_74555] +[group_74556] +[group_74557] +[group_74558] +[group_74559] +[group_74560] +[group_74561] +[group_74562] +[group_74563] +[group_74564] +[group_74565] +[group_74566] +[group_74567] +[group_74568] +[group_74569] +[group_74570] +[group_74571] +[group_74572] +[group_74573] +[group_74574] +[group_74575] +[group_74576] +[group_74577] +[group_74578] +[group_74579] +[group_74580] +[group_74581] +[group_74582] +[group_74583] +[group_74584] +[group_74585] +[group_74586] +[group_74587] +[group_74588] +[group_74589] +[group_74590] +[group_74591] +[group_74592] +[group_74593] +[group_74594] +[group_74595] +[group_74596] +[group_74597] +[group_74598] +[group_74599] +[group_74600] +[group_74601] +[group_74602] +[group_74603] +[group_74604] +[group_74605] +[group_74606] +[group_74607] +[group_74608] +[group_74609] +[group_74610] +[group_74611] +[group_74612] +[group_74613] +[group_74614] +[group_74615] +[group_74616] +[group_74617] +[group_74618] +[group_74619] +[group_74620] +[group_74621] +[group_74622] +[group_74623] +[group_74624] +[group_74625] +[group_74626] +[group_74627] +[group_74628] +[group_74629] +[group_74630] +[group_74631] +[group_74632] +[group_74633] +[group_74634] +[group_74635] +[group_74636] +[group_74637] +[group_74638] +[group_74639] +[group_74640] +[group_74641] +[group_74642] +[group_74643] +[group_74644] +[group_74645] +[group_74646] +[group_74647] +[group_74648] +[group_74649] +[group_74650] +[group_74651] +[group_74652] +[group_74653] +[group_74654] +[group_74655] +[group_74656] +[group_74657] +[group_74658] +[group_74659] +[group_74660] +[group_74661] +[group_74662] +[group_74663] +[group_74664] +[group_74665] +[group_74666] +[group_74667] +[group_74668] +[group_74669] +[group_74670] +[group_74671] +[group_74672] +[group_74673] +[group_74674] +[group_74675] +[group_74676] +[group_74677] +[group_74678] +[group_74679] +[group_74680] +[group_74681] +[group_74682] +[group_74683] +[group_74684] +[group_74685] +[group_74686] +[group_74687] +[group_74688] +[group_74689] +[group_74690] +[group_74691] +[group_74692] +[group_74693] +[group_74694] +[group_74695] +[group_74696] +[group_74697] +[group_74698] +[group_74699] +[group_74700] +[group_74701] +[group_74702] +[group_74703] +[group_74704] +[group_74705] +[group_74706] +[group_74707] +[group_74708] +[group_74709] +[group_74710] +[group_74711] +[group_74712] +[group_74713] +[group_74714] +[group_74715] +[group_74716] +[group_74717] +[group_74718] +[group_74719] +[group_74720] +[group_74721] +[group_74722] +[group_74723] +[group_74724] +[group_74725] +[group_74726] +[group_74727] +[group_74728] +[group_74729] +[group_74730] +[group_74731] +[group_74732] +[group_74733] +[group_74734] +[group_74735] +[group_74736] +[group_74737] +[group_74738] +[group_74739] +[group_74740] +[group_74741] +[group_74742] +[group_74743] +[group_74744] +[group_74745] +[group_74746] +[group_74747] +[group_74748] +[group_74749] +[group_74750] +[group_74751] +[group_74752] +[group_74753] +[group_74754] +[group_74755] +[group_74756] +[group_74757] +[group_74758] +[group_74759] +[group_74760] +[group_74761] +[group_74762] +[group_74763] +[group_74764] +[group_74765] +[group_74766] +[group_74767] +[group_74768] +[group_74769] +[group_74770] +[group_74771] +[group_74772] +[group_74773] +[group_74774] +[group_74775] +[group_74776] +[group_74777] +[group_74778] +[group_74779] +[group_74780] +[group_74781] +[group_74782] +[group_74783] +[group_74784] +[group_74785] +[group_74786] +[group_74787] +[group_74788] +[group_74789] +[group_74790] +[group_74791] +[group_74792] +[group_74793] +[group_74794] +[group_74795] +[group_74796] +[group_74797] +[group_74798] +[group_74799] +[group_74800] +[group_74801] +[group_74802] +[group_74803] +[group_74804] +[group_74805] +[group_74806] +[group_74807] +[group_74808] +[group_74809] +[group_74810] +[group_74811] +[group_74812] +[group_74813] +[group_74814] +[group_74815] +[group_74816] +[group_74817] +[group_74818] +[group_74819] +[group_74820] +[group_74821] +[group_74822] +[group_74823] +[group_74824] +[group_74825] +[group_74826] +[group_74827] +[group_74828] +[group_74829] +[group_74830] +[group_74831] +[group_74832] +[group_74833] +[group_74834] +[group_74835] +[group_74836] +[group_74837] +[group_74838] +[group_74839] +[group_74840] +[group_74841] +[group_74842] +[group_74843] +[group_74844] +[group_74845] +[group_74846] +[group_74847] +[group_74848] +[group_74849] +[group_74850] +[group_74851] +[group_74852] +[group_74853] +[group_74854] +[group_74855] +[group_74856] +[group_74857] +[group_74858] +[group_74859] +[group_74860] +[group_74861] +[group_74862] +[group_74863] +[group_74864] +[group_74865] +[group_74866] +[group_74867] +[group_74868] +[group_74869] +[group_74870] +[group_74871] +[group_74872] +[group_74873] +[group_74874] +[group_74875] +[group_74876] +[group_74877] +[group_74878] +[group_74879] +[group_74880] +[group_74881] +[group_74882] +[group_74883] +[group_74884] +[group_74885] +[group_74886] +[group_74887] +[group_74888] +[group_74889] +[group_74890] +[group_74891] +[group_74892] +[group_74893] +[group_74894] +[group_74895] +[group_74896] +[group_74897] +[group_74898] +[group_74899] +[group_74900] +[group_74901] +[group_74902] +[group_74903] +[group_74904] +[group_74905] +[group_74906] +[group_74907] +[group_74908] +[group_74909] +[group_74910] +[group_74911] +[group_74912] +[group_74913] +[group_74914] +[group_74915] +[group_74916] +[group_74917] +[group_74918] +[group_74919] +[group_74920] +[group_74921] +[group_74922] +[group_74923] +[group_74924] +[group_74925] +[group_74926] +[group_74927] +[group_74928] +[group_74929] +[group_74930] +[group_74931] +[group_74932] +[group_74933] +[group_74934] +[group_74935] +[group_74936] +[group_74937] +[group_74938] +[group_74939] +[group_74940] +[group_74941] +[group_74942] +[group_74943] +[group_74944] +[group_74945] +[group_74946] +[group_74947] +[group_74948] +[group_74949] +[group_74950] +[group_74951] +[group_74952] +[group_74953] +[group_74954] +[group_74955] +[group_74956] +[group_74957] +[group_74958] +[group_74959] +[group_74960] +[group_74961] +[group_74962] +[group_74963] +[group_74964] +[group_74965] +[group_74966] +[group_74967] +[group_74968] +[group_74969] +[group_74970] +[group_74971] +[group_74972] +[group_74973] +[group_74974] +[group_74975] +[group_74976] +[group_74977] +[group_74978] +[group_74979] +[group_74980] +[group_74981] +[group_74982] +[group_74983] +[group_74984] +[group_74985] +[group_74986] +[group_74987] +[group_74988] +[group_74989] +[group_74990] +[group_74991] +[group_74992] +[group_74993] +[group_74994] +[group_74995] +[group_74996] +[group_74997] +[group_74998] +[group_74999] +[group_75000] +[group_75001] +[group_75002] +[group_75003] +[group_75004] +[group_75005] +[group_75006] +[group_75007] +[group_75008] +[group_75009] +[group_75010] +[group_75011] +[group_75012] +[group_75013] +[group_75014] +[group_75015] +[group_75016] +[group_75017] +[group_75018] +[group_75019] +[group_75020] +[group_75021] +[group_75022] +[group_75023] +[group_75024] +[group_75025] +[group_75026] +[group_75027] +[group_75028] +[group_75029] +[group_75030] +[group_75031] +[group_75032] +[group_75033] +[group_75034] +[group_75035] +[group_75036] +[group_75037] +[group_75038] +[group_75039] +[group_75040] +[group_75041] +[group_75042] +[group_75043] +[group_75044] +[group_75045] +[group_75046] +[group_75047] +[group_75048] +[group_75049] +[group_75050] +[group_75051] +[group_75052] +[group_75053] +[group_75054] +[group_75055] +[group_75056] +[group_75057] +[group_75058] +[group_75059] +[group_75060] +[group_75061] +[group_75062] +[group_75063] +[group_75064] +[group_75065] +[group_75066] +[group_75067] +[group_75068] +[group_75069] +[group_75070] +[group_75071] +[group_75072] +[group_75073] +[group_75074] +[group_75075] +[group_75076] +[group_75077] +[group_75078] +[group_75079] +[group_75080] +[group_75081] +[group_75082] +[group_75083] +[group_75084] +[group_75085] +[group_75086] +[group_75087] +[group_75088] +[group_75089] +[group_75090] +[group_75091] +[group_75092] +[group_75093] +[group_75094] +[group_75095] +[group_75096] +[group_75097] +[group_75098] +[group_75099] +[group_75100] +[group_75101] +[group_75102] +[group_75103] +[group_75104] +[group_75105] +[group_75106] +[group_75107] +[group_75108] +[group_75109] +[group_75110] +[group_75111] +[group_75112] +[group_75113] +[group_75114] +[group_75115] +[group_75116] +[group_75117] +[group_75118] +[group_75119] +[group_75120] +[group_75121] +[group_75122] +[group_75123] +[group_75124] +[group_75125] +[group_75126] +[group_75127] +[group_75128] +[group_75129] +[group_75130] +[group_75131] +[group_75132] +[group_75133] +[group_75134] +[group_75135] +[group_75136] +[group_75137] +[group_75138] +[group_75139] +[group_75140] +[group_75141] +[group_75142] +[group_75143] +[group_75144] +[group_75145] +[group_75146] +[group_75147] +[group_75148] +[group_75149] +[group_75150] +[group_75151] +[group_75152] +[group_75153] +[group_75154] +[group_75155] +[group_75156] +[group_75157] +[group_75158] +[group_75159] +[group_75160] +[group_75161] +[group_75162] +[group_75163] +[group_75164] +[group_75165] +[group_75166] +[group_75167] +[group_75168] +[group_75169] +[group_75170] +[group_75171] +[group_75172] +[group_75173] +[group_75174] +[group_75175] +[group_75176] +[group_75177] +[group_75178] +[group_75179] +[group_75180] +[group_75181] +[group_75182] +[group_75183] +[group_75184] +[group_75185] +[group_75186] +[group_75187] +[group_75188] +[group_75189] +[group_75190] +[group_75191] +[group_75192] +[group_75193] +[group_75194] +[group_75195] +[group_75196] +[group_75197] +[group_75198] +[group_75199] +[group_75200] +[group_75201] +[group_75202] +[group_75203] +[group_75204] +[group_75205] +[group_75206] +[group_75207] +[group_75208] +[group_75209] +[group_75210] +[group_75211] +[group_75212] +[group_75213] +[group_75214] +[group_75215] +[group_75216] +[group_75217] +[group_75218] +[group_75219] +[group_75220] +[group_75221] +[group_75222] +[group_75223] +[group_75224] +[group_75225] +[group_75226] +[group_75227] +[group_75228] +[group_75229] +[group_75230] +[group_75231] +[group_75232] +[group_75233] +[group_75234] +[group_75235] +[group_75236] +[group_75237] +[group_75238] +[group_75239] +[group_75240] +[group_75241] +[group_75242] +[group_75243] +[group_75244] +[group_75245] +[group_75246] +[group_75247] +[group_75248] +[group_75249] +[group_75250] +[group_75251] +[group_75252] +[group_75253] +[group_75254] +[group_75255] +[group_75256] +[group_75257] +[group_75258] +[group_75259] +[group_75260] +[group_75261] +[group_75262] +[group_75263] +[group_75264] +[group_75265] +[group_75266] +[group_75267] +[group_75268] +[group_75269] +[group_75270] +[group_75271] +[group_75272] +[group_75273] +[group_75274] +[group_75275] +[group_75276] +[group_75277] +[group_75278] +[group_75279] +[group_75280] +[group_75281] +[group_75282] +[group_75283] +[group_75284] +[group_75285] +[group_75286] +[group_75287] +[group_75288] +[group_75289] +[group_75290] +[group_75291] +[group_75292] +[group_75293] +[group_75294] +[group_75295] +[group_75296] +[group_75297] +[group_75298] +[group_75299] +[group_75300] +[group_75301] +[group_75302] +[group_75303] +[group_75304] +[group_75305] +[group_75306] +[group_75307] +[group_75308] +[group_75309] +[group_75310] +[group_75311] +[group_75312] +[group_75313] +[group_75314] +[group_75315] +[group_75316] +[group_75317] +[group_75318] +[group_75319] +[group_75320] +[group_75321] +[group_75322] +[group_75323] +[group_75324] +[group_75325] +[group_75326] +[group_75327] +[group_75328] +[group_75329] +[group_75330] +[group_75331] +[group_75332] +[group_75333] +[group_75334] +[group_75335] +[group_75336] +[group_75337] +[group_75338] +[group_75339] +[group_75340] +[group_75341] +[group_75342] +[group_75343] +[group_75344] +[group_75345] +[group_75346] +[group_75347] +[group_75348] +[group_75349] +[group_75350] +[group_75351] +[group_75352] +[group_75353] +[group_75354] +[group_75355] +[group_75356] +[group_75357] +[group_75358] +[group_75359] +[group_75360] +[group_75361] +[group_75362] +[group_75363] +[group_75364] +[group_75365] +[group_75366] +[group_75367] +[group_75368] +[group_75369] +[group_75370] +[group_75371] +[group_75372] +[group_75373] +[group_75374] +[group_75375] +[group_75376] +[group_75377] +[group_75378] +[group_75379] +[group_75380] +[group_75381] +[group_75382] +[group_75383] +[group_75384] +[group_75385] +[group_75386] +[group_75387] +[group_75388] +[group_75389] +[group_75390] +[group_75391] +[group_75392] +[group_75393] +[group_75394] +[group_75395] +[group_75396] +[group_75397] +[group_75398] +[group_75399] +[group_75400] +[group_75401] +[group_75402] +[group_75403] +[group_75404] +[group_75405] +[group_75406] +[group_75407] +[group_75408] +[group_75409] +[group_75410] +[group_75411] +[group_75412] +[group_75413] +[group_75414] +[group_75415] +[group_75416] +[group_75417] +[group_75418] +[group_75419] +[group_75420] +[group_75421] +[group_75422] +[group_75423] +[group_75424] +[group_75425] +[group_75426] +[group_75427] +[group_75428] +[group_75429] +[group_75430] +[group_75431] +[group_75432] +[group_75433] +[group_75434] +[group_75435] +[group_75436] +[group_75437] +[group_75438] +[group_75439] +[group_75440] +[group_75441] +[group_75442] +[group_75443] +[group_75444] +[group_75445] +[group_75446] +[group_75447] +[group_75448] +[group_75449] +[group_75450] +[group_75451] +[group_75452] +[group_75453] +[group_75454] +[group_75455] +[group_75456] +[group_75457] +[group_75458] +[group_75459] +[group_75460] +[group_75461] +[group_75462] +[group_75463] +[group_75464] +[group_75465] +[group_75466] +[group_75467] +[group_75468] +[group_75469] +[group_75470] +[group_75471] +[group_75472] +[group_75473] +[group_75474] +[group_75475] +[group_75476] +[group_75477] +[group_75478] +[group_75479] +[group_75480] +[group_75481] +[group_75482] +[group_75483] +[group_75484] +[group_75485] +[group_75486] +[group_75487] +[group_75488] +[group_75489] +[group_75490] +[group_75491] +[group_75492] +[group_75493] +[group_75494] +[group_75495] +[group_75496] +[group_75497] +[group_75498] +[group_75499] +[group_75500] +[group_75501] +[group_75502] +[group_75503] +[group_75504] +[group_75505] +[group_75506] +[group_75507] +[group_75508] +[group_75509] +[group_75510] +[group_75511] +[group_75512] +[group_75513] +[group_75514] +[group_75515] +[group_75516] +[group_75517] +[group_75518] +[group_75519] +[group_75520] +[group_75521] +[group_75522] +[group_75523] +[group_75524] +[group_75525] +[group_75526] +[group_75527] +[group_75528] +[group_75529] +[group_75530] +[group_75531] +[group_75532] +[group_75533] +[group_75534] +[group_75535] +[group_75536] +[group_75537] +[group_75538] +[group_75539] +[group_75540] +[group_75541] +[group_75542] +[group_75543] +[group_75544] +[group_75545] +[group_75546] +[group_75547] +[group_75548] +[group_75549] +[group_75550] +[group_75551] +[group_75552] +[group_75553] +[group_75554] +[group_75555] +[group_75556] +[group_75557] +[group_75558] +[group_75559] +[group_75560] +[group_75561] +[group_75562] +[group_75563] +[group_75564] +[group_75565] +[group_75566] +[group_75567] +[group_75568] +[group_75569] +[group_75570] +[group_75571] +[group_75572] +[group_75573] +[group_75574] +[group_75575] +[group_75576] +[group_75577] +[group_75578] +[group_75579] +[group_75580] +[group_75581] +[group_75582] +[group_75583] +[group_75584] +[group_75585] +[group_75586] +[group_75587] +[group_75588] +[group_75589] +[group_75590] +[group_75591] +[group_75592] +[group_75593] +[group_75594] +[group_75595] +[group_75596] +[group_75597] +[group_75598] +[group_75599] +[group_75600] +[group_75601] +[group_75602] +[group_75603] +[group_75604] +[group_75605] +[group_75606] +[group_75607] +[group_75608] +[group_75609] +[group_75610] +[group_75611] +[group_75612] +[group_75613] +[group_75614] +[group_75615] +[group_75616] +[group_75617] +[group_75618] +[group_75619] +[group_75620] +[group_75621] +[group_75622] +[group_75623] +[group_75624] +[group_75625] +[group_75626] +[group_75627] +[group_75628] +[group_75629] +[group_75630] +[group_75631] +[group_75632] +[group_75633] +[group_75634] +[group_75635] +[group_75636] +[group_75637] +[group_75638] +[group_75639] +[group_75640] +[group_75641] +[group_75642] +[group_75643] +[group_75644] +[group_75645] +[group_75646] +[group_75647] +[group_75648] +[group_75649] +[group_75650] +[group_75651] +[group_75652] +[group_75653] +[group_75654] +[group_75655] +[group_75656] +[group_75657] +[group_75658] +[group_75659] +[group_75660] +[group_75661] +[group_75662] +[group_75663] +[group_75664] +[group_75665] +[group_75666] +[group_75667] +[group_75668] +[group_75669] +[group_75670] +[group_75671] +[group_75672] +[group_75673] +[group_75674] +[group_75675] +[group_75676] +[group_75677] +[group_75678] +[group_75679] +[group_75680] +[group_75681] +[group_75682] +[group_75683] +[group_75684] +[group_75685] +[group_75686] +[group_75687] +[group_75688] +[group_75689] +[group_75690] +[group_75691] +[group_75692] +[group_75693] +[group_75694] +[group_75695] +[group_75696] +[group_75697] +[group_75698] +[group_75699] +[group_75700] +[group_75701] +[group_75702] +[group_75703] +[group_75704] +[group_75705] +[group_75706] +[group_75707] +[group_75708] +[group_75709] +[group_75710] +[group_75711] +[group_75712] +[group_75713] +[group_75714] +[group_75715] +[group_75716] +[group_75717] +[group_75718] +[group_75719] +[group_75720] +[group_75721] +[group_75722] +[group_75723] +[group_75724] +[group_75725] +[group_75726] +[group_75727] +[group_75728] +[group_75729] +[group_75730] +[group_75731] +[group_75732] +[group_75733] +[group_75734] +[group_75735] +[group_75736] +[group_75737] +[group_75738] +[group_75739] +[group_75740] +[group_75741] +[group_75742] +[group_75743] +[group_75744] +[group_75745] +[group_75746] +[group_75747] +[group_75748] +[group_75749] +[group_75750] +[group_75751] +[group_75752] +[group_75753] +[group_75754] +[group_75755] +[group_75756] +[group_75757] +[group_75758] +[group_75759] +[group_75760] +[group_75761] +[group_75762] +[group_75763] +[group_75764] +[group_75765] +[group_75766] +[group_75767] +[group_75768] +[group_75769] +[group_75770] +[group_75771] +[group_75772] +[group_75773] +[group_75774] +[group_75775] +[group_75776] +[group_75777] +[group_75778] +[group_75779] +[group_75780] +[group_75781] +[group_75782] +[group_75783] +[group_75784] +[group_75785] +[group_75786] +[group_75787] +[group_75788] +[group_75789] +[group_75790] +[group_75791] +[group_75792] +[group_75793] +[group_75794] +[group_75795] +[group_75796] +[group_75797] +[group_75798] +[group_75799] +[group_75800] +[group_75801] +[group_75802] +[group_75803] +[group_75804] +[group_75805] +[group_75806] +[group_75807] +[group_75808] +[group_75809] +[group_75810] +[group_75811] +[group_75812] +[group_75813] +[group_75814] +[group_75815] +[group_75816] +[group_75817] +[group_75818] +[group_75819] +[group_75820] +[group_75821] +[group_75822] +[group_75823] +[group_75824] +[group_75825] +[group_75826] +[group_75827] +[group_75828] +[group_75829] +[group_75830] +[group_75831] +[group_75832] +[group_75833] +[group_75834] +[group_75835] +[group_75836] +[group_75837] +[group_75838] +[group_75839] +[group_75840] +[group_75841] +[group_75842] +[group_75843] +[group_75844] +[group_75845] +[group_75846] +[group_75847] +[group_75848] +[group_75849] +[group_75850] +[group_75851] +[group_75852] +[group_75853] +[group_75854] +[group_75855] +[group_75856] +[group_75857] +[group_75858] +[group_75859] +[group_75860] +[group_75861] +[group_75862] +[group_75863] +[group_75864] +[group_75865] +[group_75866] +[group_75867] +[group_75868] +[group_75869] +[group_75870] +[group_75871] +[group_75872] +[group_75873] +[group_75874] +[group_75875] +[group_75876] +[group_75877] +[group_75878] +[group_75879] +[group_75880] +[group_75881] +[group_75882] +[group_75883] +[group_75884] +[group_75885] +[group_75886] +[group_75887] +[group_75888] +[group_75889] +[group_75890] +[group_75891] +[group_75892] +[group_75893] +[group_75894] +[group_75895] +[group_75896] +[group_75897] +[group_75898] +[group_75899] +[group_75900] +[group_75901] +[group_75902] +[group_75903] +[group_75904] +[group_75905] +[group_75906] +[group_75907] +[group_75908] +[group_75909] +[group_75910] +[group_75911] +[group_75912] +[group_75913] +[group_75914] +[group_75915] +[group_75916] +[group_75917] +[group_75918] +[group_75919] +[group_75920] +[group_75921] +[group_75922] +[group_75923] +[group_75924] +[group_75925] +[group_75926] +[group_75927] +[group_75928] +[group_75929] +[group_75930] +[group_75931] +[group_75932] +[group_75933] +[group_75934] +[group_75935] +[group_75936] +[group_75937] +[group_75938] +[group_75939] +[group_75940] +[group_75941] +[group_75942] +[group_75943] +[group_75944] +[group_75945] +[group_75946] +[group_75947] +[group_75948] +[group_75949] +[group_75950] +[group_75951] +[group_75952] +[group_75953] +[group_75954] +[group_75955] +[group_75956] +[group_75957] +[group_75958] +[group_75959] +[group_75960] +[group_75961] +[group_75962] +[group_75963] +[group_75964] +[group_75965] +[group_75966] +[group_75967] +[group_75968] +[group_75969] +[group_75970] +[group_75971] +[group_75972] +[group_75973] +[group_75974] +[group_75975] +[group_75976] +[group_75977] +[group_75978] +[group_75979] +[group_75980] +[group_75981] +[group_75982] +[group_75983] +[group_75984] +[group_75985] +[group_75986] +[group_75987] +[group_75988] +[group_75989] +[group_75990] +[group_75991] +[group_75992] +[group_75993] +[group_75994] +[group_75995] +[group_75996] +[group_75997] +[group_75998] +[group_75999] +[group_76000] +[group_76001] +[group_76002] +[group_76003] +[group_76004] +[group_76005] +[group_76006] +[group_76007] +[group_76008] +[group_76009] +[group_76010] +[group_76011] +[group_76012] +[group_76013] +[group_76014] +[group_76015] +[group_76016] +[group_76017] +[group_76018] +[group_76019] +[group_76020] +[group_76021] +[group_76022] +[group_76023] +[group_76024] +[group_76025] +[group_76026] +[group_76027] +[group_76028] +[group_76029] +[group_76030] +[group_76031] +[group_76032] +[group_76033] +[group_76034] +[group_76035] +[group_76036] +[group_76037] +[group_76038] +[group_76039] +[group_76040] +[group_76041] +[group_76042] +[group_76043] +[group_76044] +[group_76045] +[group_76046] +[group_76047] +[group_76048] +[group_76049] +[group_76050] +[group_76051] +[group_76052] +[group_76053] +[group_76054] +[group_76055] +[group_76056] +[group_76057] +[group_76058] +[group_76059] +[group_76060] +[group_76061] +[group_76062] +[group_76063] +[group_76064] +[group_76065] +[group_76066] +[group_76067] +[group_76068] +[group_76069] +[group_76070] +[group_76071] +[group_76072] +[group_76073] +[group_76074] +[group_76075] +[group_76076] +[group_76077] +[group_76078] +[group_76079] +[group_76080] +[group_76081] +[group_76082] +[group_76083] +[group_76084] +[group_76085] +[group_76086] +[group_76087] +[group_76088] +[group_76089] +[group_76090] +[group_76091] +[group_76092] +[group_76093] +[group_76094] +[group_76095] +[group_76096] +[group_76097] +[group_76098] +[group_76099] +[group_76100] +[group_76101] +[group_76102] +[group_76103] +[group_76104] +[group_76105] +[group_76106] +[group_76107] +[group_76108] +[group_76109] +[group_76110] +[group_76111] +[group_76112] +[group_76113] +[group_76114] +[group_76115] +[group_76116] +[group_76117] +[group_76118] +[group_76119] +[group_76120] +[group_76121] +[group_76122] +[group_76123] +[group_76124] +[group_76125] +[group_76126] +[group_76127] +[group_76128] +[group_76129] +[group_76130] +[group_76131] +[group_76132] +[group_76133] +[group_76134] +[group_76135] +[group_76136] +[group_76137] +[group_76138] +[group_76139] +[group_76140] +[group_76141] +[group_76142] +[group_76143] +[group_76144] +[group_76145] +[group_76146] +[group_76147] +[group_76148] +[group_76149] +[group_76150] +[group_76151] +[group_76152] +[group_76153] +[group_76154] +[group_76155] +[group_76156] +[group_76157] +[group_76158] +[group_76159] +[group_76160] +[group_76161] +[group_76162] +[group_76163] +[group_76164] +[group_76165] +[group_76166] +[group_76167] +[group_76168] +[group_76169] +[group_76170] +[group_76171] +[group_76172] +[group_76173] +[group_76174] +[group_76175] +[group_76176] +[group_76177] +[group_76178] +[group_76179] +[group_76180] +[group_76181] +[group_76182] +[group_76183] +[group_76184] +[group_76185] +[group_76186] +[group_76187] +[group_76188] +[group_76189] +[group_76190] +[group_76191] +[group_76192] +[group_76193] +[group_76194] +[group_76195] +[group_76196] +[group_76197] +[group_76198] +[group_76199] +[group_76200] +[group_76201] +[group_76202] +[group_76203] +[group_76204] +[group_76205] +[group_76206] +[group_76207] +[group_76208] +[group_76209] +[group_76210] +[group_76211] +[group_76212] +[group_76213] +[group_76214] +[group_76215] +[group_76216] +[group_76217] +[group_76218] +[group_76219] +[group_76220] +[group_76221] +[group_76222] +[group_76223] +[group_76224] +[group_76225] +[group_76226] +[group_76227] +[group_76228] +[group_76229] +[group_76230] +[group_76231] +[group_76232] +[group_76233] +[group_76234] +[group_76235] +[group_76236] +[group_76237] +[group_76238] +[group_76239] +[group_76240] +[group_76241] +[group_76242] +[group_76243] +[group_76244] +[group_76245] +[group_76246] +[group_76247] +[group_76248] +[group_76249] +[group_76250] +[group_76251] +[group_76252] +[group_76253] +[group_76254] +[group_76255] +[group_76256] +[group_76257] +[group_76258] +[group_76259] +[group_76260] +[group_76261] +[group_76262] +[group_76263] +[group_76264] +[group_76265] +[group_76266] +[group_76267] +[group_76268] +[group_76269] +[group_76270] +[group_76271] +[group_76272] +[group_76273] +[group_76274] +[group_76275] +[group_76276] +[group_76277] +[group_76278] +[group_76279] +[group_76280] +[group_76281] +[group_76282] +[group_76283] +[group_76284] +[group_76285] +[group_76286] +[group_76287] +[group_76288] +[group_76289] +[group_76290] +[group_76291] +[group_76292] +[group_76293] +[group_76294] +[group_76295] +[group_76296] +[group_76297] +[group_76298] +[group_76299] +[group_76300] +[group_76301] +[group_76302] +[group_76303] +[group_76304] +[group_76305] +[group_76306] +[group_76307] +[group_76308] +[group_76309] +[group_76310] +[group_76311] +[group_76312] +[group_76313] +[group_76314] +[group_76315] +[group_76316] +[group_76317] +[group_76318] +[group_76319] +[group_76320] +[group_76321] +[group_76322] +[group_76323] +[group_76324] +[group_76325] +[group_76326] +[group_76327] +[group_76328] +[group_76329] +[group_76330] +[group_76331] +[group_76332] +[group_76333] +[group_76334] +[group_76335] +[group_76336] +[group_76337] +[group_76338] +[group_76339] +[group_76340] +[group_76341] +[group_76342] +[group_76343] +[group_76344] +[group_76345] +[group_76346] +[group_76347] +[group_76348] +[group_76349] +[group_76350] +[group_76351] +[group_76352] +[group_76353] +[group_76354] +[group_76355] +[group_76356] +[group_76357] +[group_76358] +[group_76359] +[group_76360] +[group_76361] +[group_76362] +[group_76363] +[group_76364] +[group_76365] +[group_76366] +[group_76367] +[group_76368] +[group_76369] +[group_76370] +[group_76371] +[group_76372] +[group_76373] +[group_76374] +[group_76375] +[group_76376] +[group_76377] +[group_76378] +[group_76379] +[group_76380] +[group_76381] +[group_76382] +[group_76383] +[group_76384] +[group_76385] +[group_76386] +[group_76387] +[group_76388] +[group_76389] +[group_76390] +[group_76391] +[group_76392] +[group_76393] +[group_76394] +[group_76395] +[group_76396] +[group_76397] +[group_76398] +[group_76399] +[group_76400] +[group_76401] +[group_76402] +[group_76403] +[group_76404] +[group_76405] +[group_76406] +[group_76407] +[group_76408] +[group_76409] +[group_76410] +[group_76411] +[group_76412] +[group_76413] +[group_76414] +[group_76415] +[group_76416] +[group_76417] +[group_76418] +[group_76419] +[group_76420] +[group_76421] +[group_76422] +[group_76423] +[group_76424] +[group_76425] +[group_76426] +[group_76427] +[group_76428] +[group_76429] +[group_76430] +[group_76431] +[group_76432] +[group_76433] +[group_76434] +[group_76435] +[group_76436] +[group_76437] +[group_76438] +[group_76439] +[group_76440] +[group_76441] +[group_76442] +[group_76443] +[group_76444] +[group_76445] +[group_76446] +[group_76447] +[group_76448] +[group_76449] +[group_76450] +[group_76451] +[group_76452] +[group_76453] +[group_76454] +[group_76455] +[group_76456] +[group_76457] +[group_76458] +[group_76459] +[group_76460] +[group_76461] +[group_76462] +[group_76463] +[group_76464] +[group_76465] +[group_76466] +[group_76467] +[group_76468] +[group_76469] +[group_76470] +[group_76471] +[group_76472] +[group_76473] +[group_76474] +[group_76475] +[group_76476] +[group_76477] +[group_76478] +[group_76479] +[group_76480] +[group_76481] +[group_76482] +[group_76483] +[group_76484] +[group_76485] +[group_76486] +[group_76487] +[group_76488] +[group_76489] +[group_76490] +[group_76491] +[group_76492] +[group_76493] +[group_76494] +[group_76495] +[group_76496] +[group_76497] +[group_76498] +[group_76499] +[group_76500] +[group_76501] +[group_76502] +[group_76503] +[group_76504] +[group_76505] +[group_76506] +[group_76507] +[group_76508] +[group_76509] +[group_76510] +[group_76511] +[group_76512] +[group_76513] +[group_76514] +[group_76515] +[group_76516] +[group_76517] +[group_76518] +[group_76519] +[group_76520] +[group_76521] +[group_76522] +[group_76523] +[group_76524] +[group_76525] +[group_76526] +[group_76527] +[group_76528] +[group_76529] +[group_76530] +[group_76531] +[group_76532] +[group_76533] +[group_76534] +[group_76535] +[group_76536] +[group_76537] +[group_76538] +[group_76539] +[group_76540] +[group_76541] +[group_76542] +[group_76543] +[group_76544] +[group_76545] +[group_76546] +[group_76547] +[group_76548] +[group_76549] +[group_76550] +[group_76551] +[group_76552] +[group_76553] +[group_76554] +[group_76555] +[group_76556] +[group_76557] +[group_76558] +[group_76559] +[group_76560] +[group_76561] +[group_76562] +[group_76563] +[group_76564] +[group_76565] +[group_76566] +[group_76567] +[group_76568] +[group_76569] +[group_76570] +[group_76571] +[group_76572] +[group_76573] +[group_76574] +[group_76575] +[group_76576] +[group_76577] +[group_76578] +[group_76579] +[group_76580] +[group_76581] +[group_76582] +[group_76583] +[group_76584] +[group_76585] +[group_76586] +[group_76587] +[group_76588] +[group_76589] +[group_76590] +[group_76591] +[group_76592] +[group_76593] +[group_76594] +[group_76595] +[group_76596] +[group_76597] +[group_76598] +[group_76599] +[group_76600] +[group_76601] +[group_76602] +[group_76603] +[group_76604] +[group_76605] +[group_76606] +[group_76607] +[group_76608] +[group_76609] +[group_76610] +[group_76611] +[group_76612] +[group_76613] +[group_76614] +[group_76615] +[group_76616] +[group_76617] +[group_76618] +[group_76619] +[group_76620] +[group_76621] +[group_76622] +[group_76623] +[group_76624] +[group_76625] +[group_76626] +[group_76627] +[group_76628] +[group_76629] +[group_76630] +[group_76631] +[group_76632] +[group_76633] +[group_76634] +[group_76635] +[group_76636] +[group_76637] +[group_76638] +[group_76639] +[group_76640] +[group_76641] +[group_76642] +[group_76643] +[group_76644] +[group_76645] +[group_76646] +[group_76647] +[group_76648] +[group_76649] +[group_76650] +[group_76651] +[group_76652] +[group_76653] +[group_76654] +[group_76655] +[group_76656] +[group_76657] +[group_76658] +[group_76659] +[group_76660] +[group_76661] +[group_76662] +[group_76663] +[group_76664] +[group_76665] +[group_76666] +[group_76667] +[group_76668] +[group_76669] +[group_76670] +[group_76671] +[group_76672] +[group_76673] +[group_76674] +[group_76675] +[group_76676] +[group_76677] +[group_76678] +[group_76679] +[group_76680] +[group_76681] +[group_76682] +[group_76683] +[group_76684] +[group_76685] +[group_76686] +[group_76687] +[group_76688] +[group_76689] +[group_76690] +[group_76691] +[group_76692] +[group_76693] +[group_76694] +[group_76695] +[group_76696] +[group_76697] +[group_76698] +[group_76699] +[group_76700] +[group_76701] +[group_76702] +[group_76703] +[group_76704] +[group_76705] +[group_76706] +[group_76707] +[group_76708] +[group_76709] +[group_76710] +[group_76711] +[group_76712] +[group_76713] +[group_76714] +[group_76715] +[group_76716] +[group_76717] +[group_76718] +[group_76719] +[group_76720] +[group_76721] +[group_76722] +[group_76723] +[group_76724] +[group_76725] +[group_76726] +[group_76727] +[group_76728] +[group_76729] +[group_76730] +[group_76731] +[group_76732] +[group_76733] +[group_76734] +[group_76735] +[group_76736] +[group_76737] +[group_76738] +[group_76739] +[group_76740] +[group_76741] +[group_76742] +[group_76743] +[group_76744] +[group_76745] +[group_76746] +[group_76747] +[group_76748] +[group_76749] +[group_76750] +[group_76751] +[group_76752] +[group_76753] +[group_76754] +[group_76755] +[group_76756] +[group_76757] +[group_76758] +[group_76759] +[group_76760] +[group_76761] +[group_76762] +[group_76763] +[group_76764] +[group_76765] +[group_76766] +[group_76767] +[group_76768] +[group_76769] +[group_76770] +[group_76771] +[group_76772] +[group_76773] +[group_76774] +[group_76775] +[group_76776] +[group_76777] +[group_76778] +[group_76779] +[group_76780] +[group_76781] +[group_76782] +[group_76783] +[group_76784] +[group_76785] +[group_76786] +[group_76787] +[group_76788] +[group_76789] +[group_76790] +[group_76791] +[group_76792] +[group_76793] +[group_76794] +[group_76795] +[group_76796] +[group_76797] +[group_76798] +[group_76799] +[group_76800] +[group_76801] +[group_76802] +[group_76803] +[group_76804] +[group_76805] +[group_76806] +[group_76807] +[group_76808] +[group_76809] +[group_76810] +[group_76811] +[group_76812] +[group_76813] +[group_76814] +[group_76815] +[group_76816] +[group_76817] +[group_76818] +[group_76819] +[group_76820] +[group_76821] +[group_76822] +[group_76823] +[group_76824] +[group_76825] +[group_76826] +[group_76827] +[group_76828] +[group_76829] +[group_76830] +[group_76831] +[group_76832] +[group_76833] +[group_76834] +[group_76835] +[group_76836] +[group_76837] +[group_76838] +[group_76839] +[group_76840] +[group_76841] +[group_76842] +[group_76843] +[group_76844] +[group_76845] +[group_76846] +[group_76847] +[group_76848] +[group_76849] +[group_76850] +[group_76851] +[group_76852] +[group_76853] +[group_76854] +[group_76855] +[group_76856] +[group_76857] +[group_76858] +[group_76859] +[group_76860] +[group_76861] +[group_76862] +[group_76863] +[group_76864] +[group_76865] +[group_76866] +[group_76867] +[group_76868] +[group_76869] +[group_76870] +[group_76871] +[group_76872] +[group_76873] +[group_76874] +[group_76875] +[group_76876] +[group_76877] +[group_76878] +[group_76879] +[group_76880] +[group_76881] +[group_76882] +[group_76883] +[group_76884] +[group_76885] +[group_76886] +[group_76887] +[group_76888] +[group_76889] +[group_76890] +[group_76891] +[group_76892] +[group_76893] +[group_76894] +[group_76895] +[group_76896] +[group_76897] +[group_76898] +[group_76899] +[group_76900] +[group_76901] +[group_76902] +[group_76903] +[group_76904] +[group_76905] +[group_76906] +[group_76907] +[group_76908] +[group_76909] +[group_76910] +[group_76911] +[group_76912] +[group_76913] +[group_76914] +[group_76915] +[group_76916] +[group_76917] +[group_76918] +[group_76919] +[group_76920] +[group_76921] +[group_76922] +[group_76923] +[group_76924] +[group_76925] +[group_76926] +[group_76927] +[group_76928] +[group_76929] +[group_76930] +[group_76931] +[group_76932] +[group_76933] +[group_76934] +[group_76935] +[group_76936] +[group_76937] +[group_76938] +[group_76939] +[group_76940] +[group_76941] +[group_76942] +[group_76943] +[group_76944] +[group_76945] +[group_76946] +[group_76947] +[group_76948] +[group_76949] +[group_76950] +[group_76951] +[group_76952] +[group_76953] +[group_76954] +[group_76955] +[group_76956] +[group_76957] +[group_76958] +[group_76959] +[group_76960] +[group_76961] +[group_76962] +[group_76963] +[group_76964] +[group_76965] +[group_76966] +[group_76967] +[group_76968] +[group_76969] +[group_76970] +[group_76971] +[group_76972] +[group_76973] +[group_76974] +[group_76975] +[group_76976] +[group_76977] +[group_76978] +[group_76979] +[group_76980] +[group_76981] +[group_76982] +[group_76983] +[group_76984] +[group_76985] +[group_76986] +[group_76987] +[group_76988] +[group_76989] +[group_76990] +[group_76991] +[group_76992] +[group_76993] +[group_76994] +[group_76995] +[group_76996] +[group_76997] +[group_76998] +[group_76999] +[group_77000] +[group_77001] +[group_77002] +[group_77003] +[group_77004] +[group_77005] +[group_77006] +[group_77007] +[group_77008] +[group_77009] +[group_77010] +[group_77011] +[group_77012] +[group_77013] +[group_77014] +[group_77015] +[group_77016] +[group_77017] +[group_77018] +[group_77019] +[group_77020] +[group_77021] +[group_77022] +[group_77023] +[group_77024] +[group_77025] +[group_77026] +[group_77027] +[group_77028] +[group_77029] +[group_77030] +[group_77031] +[group_77032] +[group_77033] +[group_77034] +[group_77035] +[group_77036] +[group_77037] +[group_77038] +[group_77039] +[group_77040] +[group_77041] +[group_77042] +[group_77043] +[group_77044] +[group_77045] +[group_77046] +[group_77047] +[group_77048] +[group_77049] +[group_77050] +[group_77051] +[group_77052] +[group_77053] +[group_77054] +[group_77055] +[group_77056] +[group_77057] +[group_77058] +[group_77059] +[group_77060] +[group_77061] +[group_77062] +[group_77063] +[group_77064] +[group_77065] +[group_77066] +[group_77067] +[group_77068] +[group_77069] +[group_77070] +[group_77071] +[group_77072] +[group_77073] +[group_77074] +[group_77075] +[group_77076] +[group_77077] +[group_77078] +[group_77079] +[group_77080] +[group_77081] +[group_77082] +[group_77083] +[group_77084] +[group_77085] +[group_77086] +[group_77087] +[group_77088] +[group_77089] +[group_77090] +[group_77091] +[group_77092] +[group_77093] +[group_77094] +[group_77095] +[group_77096] +[group_77097] +[group_77098] +[group_77099] +[group_77100] +[group_77101] +[group_77102] +[group_77103] +[group_77104] +[group_77105] +[group_77106] +[group_77107] +[group_77108] +[group_77109] +[group_77110] +[group_77111] +[group_77112] +[group_77113] +[group_77114] +[group_77115] +[group_77116] +[group_77117] +[group_77118] +[group_77119] +[group_77120] +[group_77121] +[group_77122] +[group_77123] +[group_77124] +[group_77125] +[group_77126] +[group_77127] +[group_77128] +[group_77129] +[group_77130] +[group_77131] +[group_77132] +[group_77133] +[group_77134] +[group_77135] +[group_77136] +[group_77137] +[group_77138] +[group_77139] +[group_77140] +[group_77141] +[group_77142] +[group_77143] +[group_77144] +[group_77145] +[group_77146] +[group_77147] +[group_77148] +[group_77149] +[group_77150] +[group_77151] +[group_77152] +[group_77153] +[group_77154] +[group_77155] +[group_77156] +[group_77157] +[group_77158] +[group_77159] +[group_77160] +[group_77161] +[group_77162] +[group_77163] +[group_77164] +[group_77165] +[group_77166] +[group_77167] +[group_77168] +[group_77169] +[group_77170] +[group_77171] +[group_77172] +[group_77173] +[group_77174] +[group_77175] +[group_77176] +[group_77177] +[group_77178] +[group_77179] +[group_77180] +[group_77181] +[group_77182] +[group_77183] +[group_77184] +[group_77185] +[group_77186] +[group_77187] +[group_77188] +[group_77189] +[group_77190] +[group_77191] +[group_77192] +[group_77193] +[group_77194] +[group_77195] +[group_77196] +[group_77197] +[group_77198] +[group_77199] +[group_77200] +[group_77201] +[group_77202] +[group_77203] +[group_77204] +[group_77205] +[group_77206] +[group_77207] +[group_77208] +[group_77209] +[group_77210] +[group_77211] +[group_77212] +[group_77213] +[group_77214] +[group_77215] +[group_77216] +[group_77217] +[group_77218] +[group_77219] +[group_77220] +[group_77221] +[group_77222] +[group_77223] +[group_77224] +[group_77225] +[group_77226] +[group_77227] +[group_77228] +[group_77229] +[group_77230] +[group_77231] +[group_77232] +[group_77233] +[group_77234] +[group_77235] +[group_77236] +[group_77237] +[group_77238] +[group_77239] +[group_77240] +[group_77241] +[group_77242] +[group_77243] +[group_77244] +[group_77245] +[group_77246] +[group_77247] +[group_77248] +[group_77249] +[group_77250] +[group_77251] +[group_77252] +[group_77253] +[group_77254] +[group_77255] +[group_77256] +[group_77257] +[group_77258] +[group_77259] +[group_77260] +[group_77261] +[group_77262] +[group_77263] +[group_77264] +[group_77265] +[group_77266] +[group_77267] +[group_77268] +[group_77269] +[group_77270] +[group_77271] +[group_77272] +[group_77273] +[group_77274] +[group_77275] +[group_77276] +[group_77277] +[group_77278] +[group_77279] +[group_77280] +[group_77281] +[group_77282] +[group_77283] +[group_77284] +[group_77285] +[group_77286] +[group_77287] +[group_77288] +[group_77289] +[group_77290] +[group_77291] +[group_77292] +[group_77293] +[group_77294] +[group_77295] +[group_77296] +[group_77297] +[group_77298] +[group_77299] +[group_77300] +[group_77301] +[group_77302] +[group_77303] +[group_77304] +[group_77305] +[group_77306] +[group_77307] +[group_77308] +[group_77309] +[group_77310] +[group_77311] +[group_77312] +[group_77313] +[group_77314] +[group_77315] +[group_77316] +[group_77317] +[group_77318] +[group_77319] +[group_77320] +[group_77321] +[group_77322] +[group_77323] +[group_77324] +[group_77325] +[group_77326] +[group_77327] +[group_77328] +[group_77329] +[group_77330] +[group_77331] +[group_77332] +[group_77333] +[group_77334] +[group_77335] +[group_77336] +[group_77337] +[group_77338] +[group_77339] +[group_77340] +[group_77341] +[group_77342] +[group_77343] +[group_77344] +[group_77345] +[group_77346] +[group_77347] +[group_77348] +[group_77349] +[group_77350] +[group_77351] +[group_77352] +[group_77353] +[group_77354] +[group_77355] +[group_77356] +[group_77357] +[group_77358] +[group_77359] +[group_77360] +[group_77361] +[group_77362] +[group_77363] +[group_77364] +[group_77365] +[group_77366] +[group_77367] +[group_77368] +[group_77369] +[group_77370] +[group_77371] +[group_77372] +[group_77373] +[group_77374] +[group_77375] +[group_77376] +[group_77377] +[group_77378] +[group_77379] +[group_77380] +[group_77381] +[group_77382] +[group_77383] +[group_77384] +[group_77385] +[group_77386] +[group_77387] +[group_77388] +[group_77389] +[group_77390] +[group_77391] +[group_77392] +[group_77393] +[group_77394] +[group_77395] +[group_77396] +[group_77397] +[group_77398] +[group_77399] +[group_77400] +[group_77401] +[group_77402] +[group_77403] +[group_77404] +[group_77405] +[group_77406] +[group_77407] +[group_77408] +[group_77409] +[group_77410] +[group_77411] +[group_77412] +[group_77413] +[group_77414] +[group_77415] +[group_77416] +[group_77417] +[group_77418] +[group_77419] +[group_77420] +[group_77421] +[group_77422] +[group_77423] +[group_77424] +[group_77425] +[group_77426] +[group_77427] +[group_77428] +[group_77429] +[group_77430] +[group_77431] +[group_77432] +[group_77433] +[group_77434] +[group_77435] +[group_77436] +[group_77437] +[group_77438] +[group_77439] +[group_77440] +[group_77441] +[group_77442] +[group_77443] +[group_77444] +[group_77445] +[group_77446] +[group_77447] +[group_77448] +[group_77449] +[group_77450] +[group_77451] +[group_77452] +[group_77453] +[group_77454] +[group_77455] +[group_77456] +[group_77457] +[group_77458] +[group_77459] +[group_77460] +[group_77461] +[group_77462] +[group_77463] +[group_77464] +[group_77465] +[group_77466] +[group_77467] +[group_77468] +[group_77469] +[group_77470] +[group_77471] +[group_77472] +[group_77473] +[group_77474] +[group_77475] +[group_77476] +[group_77477] +[group_77478] +[group_77479] +[group_77480] +[group_77481] +[group_77482] +[group_77483] +[group_77484] +[group_77485] +[group_77486] +[group_77487] +[group_77488] +[group_77489] +[group_77490] +[group_77491] +[group_77492] +[group_77493] +[group_77494] +[group_77495] +[group_77496] +[group_77497] +[group_77498] +[group_77499] +[group_77500] +[group_77501] +[group_77502] +[group_77503] +[group_77504] +[group_77505] +[group_77506] +[group_77507] +[group_77508] +[group_77509] +[group_77510] +[group_77511] +[group_77512] +[group_77513] +[group_77514] +[group_77515] +[group_77516] +[group_77517] +[group_77518] +[group_77519] +[group_77520] +[group_77521] +[group_77522] +[group_77523] +[group_77524] +[group_77525] +[group_77526] +[group_77527] +[group_77528] +[group_77529] +[group_77530] +[group_77531] +[group_77532] +[group_77533] +[group_77534] +[group_77535] +[group_77536] +[group_77537] +[group_77538] +[group_77539] +[group_77540] +[group_77541] +[group_77542] +[group_77543] +[group_77544] +[group_77545] +[group_77546] +[group_77547] +[group_77548] +[group_77549] +[group_77550] +[group_77551] +[group_77552] +[group_77553] +[group_77554] +[group_77555] +[group_77556] +[group_77557] +[group_77558] +[group_77559] +[group_77560] +[group_77561] +[group_77562] +[group_77563] +[group_77564] +[group_77565] +[group_77566] +[group_77567] +[group_77568] +[group_77569] +[group_77570] +[group_77571] +[group_77572] +[group_77573] +[group_77574] +[group_77575] +[group_77576] +[group_77577] +[group_77578] +[group_77579] +[group_77580] +[group_77581] +[group_77582] +[group_77583] +[group_77584] +[group_77585] +[group_77586] +[group_77587] +[group_77588] +[group_77589] +[group_77590] +[group_77591] +[group_77592] +[group_77593] +[group_77594] +[group_77595] +[group_77596] +[group_77597] +[group_77598] +[group_77599] +[group_77600] +[group_77601] +[group_77602] +[group_77603] +[group_77604] +[group_77605] +[group_77606] +[group_77607] +[group_77608] +[group_77609] +[group_77610] +[group_77611] +[group_77612] +[group_77613] +[group_77614] +[group_77615] +[group_77616] +[group_77617] +[group_77618] +[group_77619] +[group_77620] +[group_77621] +[group_77622] +[group_77623] +[group_77624] +[group_77625] +[group_77626] +[group_77627] +[group_77628] +[group_77629] +[group_77630] +[group_77631] +[group_77632] +[group_77633] +[group_77634] +[group_77635] +[group_77636] +[group_77637] +[group_77638] +[group_77639] +[group_77640] +[group_77641] +[group_77642] +[group_77643] +[group_77644] +[group_77645] +[group_77646] +[group_77647] +[group_77648] +[group_77649] +[group_77650] +[group_77651] +[group_77652] +[group_77653] +[group_77654] +[group_77655] +[group_77656] +[group_77657] +[group_77658] +[group_77659] +[group_77660] +[group_77661] +[group_77662] +[group_77663] +[group_77664] +[group_77665] +[group_77666] +[group_77667] +[group_77668] +[group_77669] +[group_77670] +[group_77671] +[group_77672] +[group_77673] +[group_77674] +[group_77675] +[group_77676] +[group_77677] +[group_77678] +[group_77679] +[group_77680] +[group_77681] +[group_77682] +[group_77683] +[group_77684] +[group_77685] +[group_77686] +[group_77687] +[group_77688] +[group_77689] +[group_77690] +[group_77691] +[group_77692] +[group_77693] +[group_77694] +[group_77695] +[group_77696] +[group_77697] +[group_77698] +[group_77699] +[group_77700] +[group_77701] +[group_77702] +[group_77703] +[group_77704] +[group_77705] +[group_77706] +[group_77707] +[group_77708] +[group_77709] +[group_77710] +[group_77711] +[group_77712] +[group_77713] +[group_77714] +[group_77715] +[group_77716] +[group_77717] +[group_77718] +[group_77719] +[group_77720] +[group_77721] +[group_77722] +[group_77723] +[group_77724] +[group_77725] +[group_77726] +[group_77727] +[group_77728] +[group_77729] +[group_77730] +[group_77731] +[group_77732] +[group_77733] +[group_77734] +[group_77735] +[group_77736] +[group_77737] +[group_77738] +[group_77739] +[group_77740] +[group_77741] +[group_77742] +[group_77743] +[group_77744] +[group_77745] +[group_77746] +[group_77747] +[group_77748] +[group_77749] +[group_77750] +[group_77751] +[group_77752] +[group_77753] +[group_77754] +[group_77755] +[group_77756] +[group_77757] +[group_77758] +[group_77759] +[group_77760] +[group_77761] +[group_77762] +[group_77763] +[group_77764] +[group_77765] +[group_77766] +[group_77767] +[group_77768] +[group_77769] +[group_77770] +[group_77771] +[group_77772] +[group_77773] +[group_77774] +[group_77775] +[group_77776] +[group_77777] +[group_77778] +[group_77779] +[group_77780] +[group_77781] +[group_77782] +[group_77783] +[group_77784] +[group_77785] +[group_77786] +[group_77787] +[group_77788] +[group_77789] +[group_77790] +[group_77791] +[group_77792] +[group_77793] +[group_77794] +[group_77795] +[group_77796] +[group_77797] +[group_77798] +[group_77799] +[group_77800] +[group_77801] +[group_77802] +[group_77803] +[group_77804] +[group_77805] +[group_77806] +[group_77807] +[group_77808] +[group_77809] +[group_77810] +[group_77811] +[group_77812] +[group_77813] +[group_77814] +[group_77815] +[group_77816] +[group_77817] +[group_77818] +[group_77819] +[group_77820] +[group_77821] +[group_77822] +[group_77823] +[group_77824] +[group_77825] +[group_77826] +[group_77827] +[group_77828] +[group_77829] +[group_77830] +[group_77831] +[group_77832] +[group_77833] +[group_77834] +[group_77835] +[group_77836] +[group_77837] +[group_77838] +[group_77839] +[group_77840] +[group_77841] +[group_77842] +[group_77843] +[group_77844] +[group_77845] +[group_77846] +[group_77847] +[group_77848] +[group_77849] +[group_77850] +[group_77851] +[group_77852] +[group_77853] +[group_77854] +[group_77855] +[group_77856] +[group_77857] +[group_77858] +[group_77859] +[group_77860] +[group_77861] +[group_77862] +[group_77863] +[group_77864] +[group_77865] +[group_77866] +[group_77867] +[group_77868] +[group_77869] +[group_77870] +[group_77871] +[group_77872] +[group_77873] +[group_77874] +[group_77875] +[group_77876] +[group_77877] +[group_77878] +[group_77879] +[group_77880] +[group_77881] +[group_77882] +[group_77883] +[group_77884] +[group_77885] +[group_77886] +[group_77887] +[group_77888] +[group_77889] +[group_77890] +[group_77891] +[group_77892] +[group_77893] +[group_77894] +[group_77895] +[group_77896] +[group_77897] +[group_77898] +[group_77899] +[group_77900] +[group_77901] +[group_77902] +[group_77903] +[group_77904] +[group_77905] +[group_77906] +[group_77907] +[group_77908] +[group_77909] +[group_77910] +[group_77911] +[group_77912] +[group_77913] +[group_77914] +[group_77915] +[group_77916] +[group_77917] +[group_77918] +[group_77919] +[group_77920] +[group_77921] +[group_77922] +[group_77923] +[group_77924] +[group_77925] +[group_77926] +[group_77927] +[group_77928] +[group_77929] +[group_77930] +[group_77931] +[group_77932] +[group_77933] +[group_77934] +[group_77935] +[group_77936] +[group_77937] +[group_77938] +[group_77939] +[group_77940] +[group_77941] +[group_77942] +[group_77943] +[group_77944] +[group_77945] +[group_77946] +[group_77947] +[group_77948] +[group_77949] +[group_77950] +[group_77951] +[group_77952] +[group_77953] +[group_77954] +[group_77955] +[group_77956] +[group_77957] +[group_77958] +[group_77959] +[group_77960] +[group_77961] +[group_77962] +[group_77963] +[group_77964] +[group_77965] +[group_77966] +[group_77967] +[group_77968] +[group_77969] +[group_77970] +[group_77971] +[group_77972] +[group_77973] +[group_77974] +[group_77975] +[group_77976] +[group_77977] +[group_77978] +[group_77979] +[group_77980] +[group_77981] +[group_77982] +[group_77983] +[group_77984] +[group_77985] +[group_77986] +[group_77987] +[group_77988] +[group_77989] +[group_77990] +[group_77991] +[group_77992] +[group_77993] +[group_77994] +[group_77995] +[group_77996] +[group_77997] +[group_77998] +[group_77999] +[group_78000] +[group_78001] +[group_78002] +[group_78003] +[group_78004] +[group_78005] +[group_78006] +[group_78007] +[group_78008] +[group_78009] +[group_78010] +[group_78011] +[group_78012] +[group_78013] +[group_78014] +[group_78015] +[group_78016] +[group_78017] +[group_78018] +[group_78019] +[group_78020] +[group_78021] +[group_78022] +[group_78023] +[group_78024] +[group_78025] +[group_78026] +[group_78027] +[group_78028] +[group_78029] +[group_78030] +[group_78031] +[group_78032] +[group_78033] +[group_78034] +[group_78035] +[group_78036] +[group_78037] +[group_78038] +[group_78039] +[group_78040] +[group_78041] +[group_78042] +[group_78043] +[group_78044] +[group_78045] +[group_78046] +[group_78047] +[group_78048] +[group_78049] +[group_78050] +[group_78051] +[group_78052] +[group_78053] +[group_78054] +[group_78055] +[group_78056] +[group_78057] +[group_78058] +[group_78059] +[group_78060] +[group_78061] +[group_78062] +[group_78063] +[group_78064] +[group_78065] +[group_78066] +[group_78067] +[group_78068] +[group_78069] +[group_78070] +[group_78071] +[group_78072] +[group_78073] +[group_78074] +[group_78075] +[group_78076] +[group_78077] +[group_78078] +[group_78079] +[group_78080] +[group_78081] +[group_78082] +[group_78083] +[group_78084] +[group_78085] +[group_78086] +[group_78087] +[group_78088] +[group_78089] +[group_78090] +[group_78091] +[group_78092] +[group_78093] +[group_78094] +[group_78095] +[group_78096] +[group_78097] +[group_78098] +[group_78099] +[group_78100] +[group_78101] +[group_78102] +[group_78103] +[group_78104] +[group_78105] +[group_78106] +[group_78107] +[group_78108] +[group_78109] +[group_78110] +[group_78111] +[group_78112] +[group_78113] +[group_78114] +[group_78115] +[group_78116] +[group_78117] +[group_78118] +[group_78119] +[group_78120] +[group_78121] +[group_78122] +[group_78123] +[group_78124] +[group_78125] +[group_78126] +[group_78127] +[group_78128] +[group_78129] +[group_78130] +[group_78131] +[group_78132] +[group_78133] +[group_78134] +[group_78135] +[group_78136] +[group_78137] +[group_78138] +[group_78139] +[group_78140] +[group_78141] +[group_78142] +[group_78143] +[group_78144] +[group_78145] +[group_78146] +[group_78147] +[group_78148] +[group_78149] +[group_78150] +[group_78151] +[group_78152] +[group_78153] +[group_78154] +[group_78155] +[group_78156] +[group_78157] +[group_78158] +[group_78159] +[group_78160] +[group_78161] +[group_78162] +[group_78163] +[group_78164] +[group_78165] +[group_78166] +[group_78167] +[group_78168] +[group_78169] +[group_78170] +[group_78171] +[group_78172] +[group_78173] +[group_78174] +[group_78175] +[group_78176] +[group_78177] +[group_78178] +[group_78179] +[group_78180] +[group_78181] +[group_78182] +[group_78183] +[group_78184] +[group_78185] +[group_78186] +[group_78187] +[group_78188] +[group_78189] +[group_78190] +[group_78191] +[group_78192] +[group_78193] +[group_78194] +[group_78195] +[group_78196] +[group_78197] +[group_78198] +[group_78199] +[group_78200] +[group_78201] +[group_78202] +[group_78203] +[group_78204] +[group_78205] +[group_78206] +[group_78207] +[group_78208] +[group_78209] +[group_78210] +[group_78211] +[group_78212] +[group_78213] +[group_78214] +[group_78215] +[group_78216] +[group_78217] +[group_78218] +[group_78219] +[group_78220] +[group_78221] +[group_78222] +[group_78223] +[group_78224] +[group_78225] +[group_78226] +[group_78227] +[group_78228] +[group_78229] +[group_78230] +[group_78231] +[group_78232] +[group_78233] +[group_78234] +[group_78235] +[group_78236] +[group_78237] +[group_78238] +[group_78239] +[group_78240] +[group_78241] +[group_78242] +[group_78243] +[group_78244] +[group_78245] +[group_78246] +[group_78247] +[group_78248] +[group_78249] +[group_78250] +[group_78251] +[group_78252] +[group_78253] +[group_78254] +[group_78255] +[group_78256] +[group_78257] +[group_78258] +[group_78259] +[group_78260] +[group_78261] +[group_78262] +[group_78263] +[group_78264] +[group_78265] +[group_78266] +[group_78267] +[group_78268] +[group_78269] +[group_78270] +[group_78271] +[group_78272] +[group_78273] +[group_78274] +[group_78275] +[group_78276] +[group_78277] +[group_78278] +[group_78279] +[group_78280] +[group_78281] +[group_78282] +[group_78283] +[group_78284] +[group_78285] +[group_78286] +[group_78287] +[group_78288] +[group_78289] +[group_78290] +[group_78291] +[group_78292] +[group_78293] +[group_78294] +[group_78295] +[group_78296] +[group_78297] +[group_78298] +[group_78299] +[group_78300] +[group_78301] +[group_78302] +[group_78303] +[group_78304] +[group_78305] +[group_78306] +[group_78307] +[group_78308] +[group_78309] +[group_78310] +[group_78311] +[group_78312] +[group_78313] +[group_78314] +[group_78315] +[group_78316] +[group_78317] +[group_78318] +[group_78319] +[group_78320] +[group_78321] +[group_78322] +[group_78323] +[group_78324] +[group_78325] +[group_78326] +[group_78327] +[group_78328] +[group_78329] +[group_78330] +[group_78331] +[group_78332] +[group_78333] +[group_78334] +[group_78335] +[group_78336] +[group_78337] +[group_78338] +[group_78339] +[group_78340] +[group_78341] +[group_78342] +[group_78343] +[group_78344] +[group_78345] +[group_78346] +[group_78347] +[group_78348] +[group_78349] +[group_78350] +[group_78351] +[group_78352] +[group_78353] +[group_78354] +[group_78355] +[group_78356] +[group_78357] +[group_78358] +[group_78359] +[group_78360] +[group_78361] +[group_78362] +[group_78363] +[group_78364] +[group_78365] +[group_78366] +[group_78367] +[group_78368] +[group_78369] +[group_78370] +[group_78371] +[group_78372] +[group_78373] +[group_78374] +[group_78375] +[group_78376] +[group_78377] +[group_78378] +[group_78379] +[group_78380] +[group_78381] +[group_78382] +[group_78383] +[group_78384] +[group_78385] +[group_78386] +[group_78387] +[group_78388] +[group_78389] +[group_78390] +[group_78391] +[group_78392] +[group_78393] +[group_78394] +[group_78395] +[group_78396] +[group_78397] +[group_78398] +[group_78399] +[group_78400] +[group_78401] +[group_78402] +[group_78403] +[group_78404] +[group_78405] +[group_78406] +[group_78407] +[group_78408] +[group_78409] +[group_78410] +[group_78411] +[group_78412] +[group_78413] +[group_78414] +[group_78415] +[group_78416] +[group_78417] +[group_78418] +[group_78419] +[group_78420] +[group_78421] +[group_78422] +[group_78423] +[group_78424] +[group_78425] +[group_78426] +[group_78427] +[group_78428] +[group_78429] +[group_78430] +[group_78431] +[group_78432] +[group_78433] +[group_78434] +[group_78435] +[group_78436] +[group_78437] +[group_78438] +[group_78439] +[group_78440] +[group_78441] +[group_78442] +[group_78443] +[group_78444] +[group_78445] +[group_78446] +[group_78447] +[group_78448] +[group_78449] +[group_78450] +[group_78451] +[group_78452] +[group_78453] +[group_78454] +[group_78455] +[group_78456] +[group_78457] +[group_78458] +[group_78459] +[group_78460] +[group_78461] +[group_78462] +[group_78463] +[group_78464] +[group_78465] +[group_78466] +[group_78467] +[group_78468] +[group_78469] +[group_78470] +[group_78471] +[group_78472] +[group_78473] +[group_78474] +[group_78475] +[group_78476] +[group_78477] +[group_78478] +[group_78479] +[group_78480] +[group_78481] +[group_78482] +[group_78483] +[group_78484] +[group_78485] +[group_78486] +[group_78487] +[group_78488] +[group_78489] +[group_78490] +[group_78491] +[group_78492] +[group_78493] +[group_78494] +[group_78495] +[group_78496] +[group_78497] +[group_78498] +[group_78499] +[group_78500] +[group_78501] +[group_78502] +[group_78503] +[group_78504] +[group_78505] +[group_78506] +[group_78507] +[group_78508] +[group_78509] +[group_78510] +[group_78511] +[group_78512] +[group_78513] +[group_78514] +[group_78515] +[group_78516] +[group_78517] +[group_78518] +[group_78519] +[group_78520] +[group_78521] +[group_78522] +[group_78523] +[group_78524] +[group_78525] +[group_78526] +[group_78527] +[group_78528] +[group_78529] +[group_78530] +[group_78531] +[group_78532] +[group_78533] +[group_78534] +[group_78535] +[group_78536] +[group_78537] +[group_78538] +[group_78539] +[group_78540] +[group_78541] +[group_78542] +[group_78543] +[group_78544] +[group_78545] +[group_78546] +[group_78547] +[group_78548] +[group_78549] +[group_78550] +[group_78551] +[group_78552] +[group_78553] +[group_78554] +[group_78555] +[group_78556] +[group_78557] +[group_78558] +[group_78559] +[group_78560] +[group_78561] +[group_78562] +[group_78563] +[group_78564] +[group_78565] +[group_78566] +[group_78567] +[group_78568] +[group_78569] +[group_78570] +[group_78571] +[group_78572] +[group_78573] +[group_78574] +[group_78575] +[group_78576] +[group_78577] +[group_78578] +[group_78579] +[group_78580] +[group_78581] +[group_78582] +[group_78583] +[group_78584] +[group_78585] +[group_78586] +[group_78587] +[group_78588] +[group_78589] +[group_78590] +[group_78591] +[group_78592] +[group_78593] +[group_78594] +[group_78595] +[group_78596] +[group_78597] +[group_78598] +[group_78599] +[group_78600] +[group_78601] +[group_78602] +[group_78603] +[group_78604] +[group_78605] +[group_78606] +[group_78607] +[group_78608] +[group_78609] +[group_78610] +[group_78611] +[group_78612] +[group_78613] +[group_78614] +[group_78615] +[group_78616] +[group_78617] +[group_78618] +[group_78619] +[group_78620] +[group_78621] +[group_78622] +[group_78623] +[group_78624] +[group_78625] +[group_78626] +[group_78627] +[group_78628] +[group_78629] +[group_78630] +[group_78631] +[group_78632] +[group_78633] +[group_78634] +[group_78635] +[group_78636] +[group_78637] +[group_78638] +[group_78639] +[group_78640] +[group_78641] +[group_78642] +[group_78643] +[group_78644] +[group_78645] +[group_78646] +[group_78647] +[group_78648] +[group_78649] +[group_78650] +[group_78651] +[group_78652] +[group_78653] +[group_78654] +[group_78655] +[group_78656] +[group_78657] +[group_78658] +[group_78659] +[group_78660] +[group_78661] +[group_78662] +[group_78663] +[group_78664] +[group_78665] +[group_78666] +[group_78667] +[group_78668] +[group_78669] +[group_78670] +[group_78671] +[group_78672] +[group_78673] +[group_78674] +[group_78675] +[group_78676] +[group_78677] +[group_78678] +[group_78679] +[group_78680] +[group_78681] +[group_78682] +[group_78683] +[group_78684] +[group_78685] +[group_78686] +[group_78687] +[group_78688] +[group_78689] +[group_78690] +[group_78691] +[group_78692] +[group_78693] +[group_78694] +[group_78695] +[group_78696] +[group_78697] +[group_78698] +[group_78699] +[group_78700] +[group_78701] +[group_78702] +[group_78703] +[group_78704] +[group_78705] +[group_78706] +[group_78707] +[group_78708] +[group_78709] +[group_78710] +[group_78711] +[group_78712] +[group_78713] +[group_78714] +[group_78715] +[group_78716] +[group_78717] +[group_78718] +[group_78719] +[group_78720] +[group_78721] +[group_78722] +[group_78723] +[group_78724] +[group_78725] +[group_78726] +[group_78727] +[group_78728] +[group_78729] +[group_78730] +[group_78731] +[group_78732] +[group_78733] +[group_78734] +[group_78735] +[group_78736] +[group_78737] +[group_78738] +[group_78739] +[group_78740] +[group_78741] +[group_78742] +[group_78743] +[group_78744] +[group_78745] +[group_78746] +[group_78747] +[group_78748] +[group_78749] +[group_78750] +[group_78751] +[group_78752] +[group_78753] +[group_78754] +[group_78755] +[group_78756] +[group_78757] +[group_78758] +[group_78759] +[group_78760] +[group_78761] +[group_78762] +[group_78763] +[group_78764] +[group_78765] +[group_78766] +[group_78767] +[group_78768] +[group_78769] +[group_78770] +[group_78771] +[group_78772] +[group_78773] +[group_78774] +[group_78775] +[group_78776] +[group_78777] +[group_78778] +[group_78779] +[group_78780] +[group_78781] +[group_78782] +[group_78783] +[group_78784] +[group_78785] +[group_78786] +[group_78787] +[group_78788] +[group_78789] +[group_78790] +[group_78791] +[group_78792] +[group_78793] +[group_78794] +[group_78795] +[group_78796] +[group_78797] +[group_78798] +[group_78799] +[group_78800] +[group_78801] +[group_78802] +[group_78803] +[group_78804] +[group_78805] +[group_78806] +[group_78807] +[group_78808] +[group_78809] +[group_78810] +[group_78811] +[group_78812] +[group_78813] +[group_78814] +[group_78815] +[group_78816] +[group_78817] +[group_78818] +[group_78819] +[group_78820] +[group_78821] +[group_78822] +[group_78823] +[group_78824] +[group_78825] +[group_78826] +[group_78827] +[group_78828] +[group_78829] +[group_78830] +[group_78831] +[group_78832] +[group_78833] +[group_78834] +[group_78835] +[group_78836] +[group_78837] +[group_78838] +[group_78839] +[group_78840] +[group_78841] +[group_78842] +[group_78843] +[group_78844] +[group_78845] +[group_78846] +[group_78847] +[group_78848] +[group_78849] +[group_78850] +[group_78851] +[group_78852] +[group_78853] +[group_78854] +[group_78855] +[group_78856] +[group_78857] +[group_78858] +[group_78859] +[group_78860] +[group_78861] +[group_78862] +[group_78863] +[group_78864] +[group_78865] +[group_78866] +[group_78867] +[group_78868] +[group_78869] +[group_78870] +[group_78871] +[group_78872] +[group_78873] +[group_78874] +[group_78875] +[group_78876] +[group_78877] +[group_78878] +[group_78879] +[group_78880] +[group_78881] +[group_78882] +[group_78883] +[group_78884] +[group_78885] +[group_78886] +[group_78887] +[group_78888] +[group_78889] +[group_78890] +[group_78891] +[group_78892] +[group_78893] +[group_78894] +[group_78895] +[group_78896] +[group_78897] +[group_78898] +[group_78899] +[group_78900] +[group_78901] +[group_78902] +[group_78903] +[group_78904] +[group_78905] +[group_78906] +[group_78907] +[group_78908] +[group_78909] +[group_78910] +[group_78911] +[group_78912] +[group_78913] +[group_78914] +[group_78915] +[group_78916] +[group_78917] +[group_78918] +[group_78919] +[group_78920] +[group_78921] +[group_78922] +[group_78923] +[group_78924] +[group_78925] +[group_78926] +[group_78927] +[group_78928] +[group_78929] +[group_78930] +[group_78931] +[group_78932] +[group_78933] +[group_78934] +[group_78935] +[group_78936] +[group_78937] +[group_78938] +[group_78939] +[group_78940] +[group_78941] +[group_78942] +[group_78943] +[group_78944] +[group_78945] +[group_78946] +[group_78947] +[group_78948] +[group_78949] +[group_78950] +[group_78951] +[group_78952] +[group_78953] +[group_78954] +[group_78955] +[group_78956] +[group_78957] +[group_78958] +[group_78959] +[group_78960] +[group_78961] +[group_78962] +[group_78963] +[group_78964] +[group_78965] +[group_78966] +[group_78967] +[group_78968] +[group_78969] +[group_78970] +[group_78971] +[group_78972] +[group_78973] +[group_78974] +[group_78975] +[group_78976] +[group_78977] +[group_78978] +[group_78979] +[group_78980] +[group_78981] +[group_78982] +[group_78983] +[group_78984] +[group_78985] +[group_78986] +[group_78987] +[group_78988] +[group_78989] +[group_78990] +[group_78991] +[group_78992] +[group_78993] +[group_78994] +[group_78995] +[group_78996] +[group_78997] +[group_78998] +[group_78999] +[group_79000] +[group_79001] +[group_79002] +[group_79003] +[group_79004] +[group_79005] +[group_79006] +[group_79007] +[group_79008] +[group_79009] +[group_79010] +[group_79011] +[group_79012] +[group_79013] +[group_79014] +[group_79015] +[group_79016] +[group_79017] +[group_79018] +[group_79019] +[group_79020] +[group_79021] +[group_79022] +[group_79023] +[group_79024] +[group_79025] +[group_79026] +[group_79027] +[group_79028] +[group_79029] +[group_79030] +[group_79031] +[group_79032] +[group_79033] +[group_79034] +[group_79035] +[group_79036] +[group_79037] +[group_79038] +[group_79039] +[group_79040] +[group_79041] +[group_79042] +[group_79043] +[group_79044] +[group_79045] +[group_79046] +[group_79047] +[group_79048] +[group_79049] +[group_79050] +[group_79051] +[group_79052] +[group_79053] +[group_79054] +[group_79055] +[group_79056] +[group_79057] +[group_79058] +[group_79059] +[group_79060] +[group_79061] +[group_79062] +[group_79063] +[group_79064] +[group_79065] +[group_79066] +[group_79067] +[group_79068] +[group_79069] +[group_79070] +[group_79071] +[group_79072] +[group_79073] +[group_79074] +[group_79075] +[group_79076] +[group_79077] +[group_79078] +[group_79079] +[group_79080] +[group_79081] +[group_79082] +[group_79083] +[group_79084] +[group_79085] +[group_79086] +[group_79087] +[group_79088] +[group_79089] +[group_79090] +[group_79091] +[group_79092] +[group_79093] +[group_79094] +[group_79095] +[group_79096] +[group_79097] +[group_79098] +[group_79099] +[group_79100] +[group_79101] +[group_79102] +[group_79103] +[group_79104] +[group_79105] +[group_79106] +[group_79107] +[group_79108] +[group_79109] +[group_79110] +[group_79111] +[group_79112] +[group_79113] +[group_79114] +[group_79115] +[group_79116] +[group_79117] +[group_79118] +[group_79119] +[group_79120] +[group_79121] +[group_79122] +[group_79123] +[group_79124] +[group_79125] +[group_79126] +[group_79127] +[group_79128] +[group_79129] +[group_79130] +[group_79131] +[group_79132] +[group_79133] +[group_79134] +[group_79135] +[group_79136] +[group_79137] +[group_79138] +[group_79139] +[group_79140] +[group_79141] +[group_79142] +[group_79143] +[group_79144] +[group_79145] +[group_79146] +[group_79147] +[group_79148] +[group_79149] +[group_79150] +[group_79151] +[group_79152] +[group_79153] +[group_79154] +[group_79155] +[group_79156] +[group_79157] +[group_79158] +[group_79159] +[group_79160] +[group_79161] +[group_79162] +[group_79163] +[group_79164] +[group_79165] +[group_79166] +[group_79167] +[group_79168] +[group_79169] +[group_79170] +[group_79171] +[group_79172] +[group_79173] +[group_79174] +[group_79175] +[group_79176] +[group_79177] +[group_79178] +[group_79179] +[group_79180] +[group_79181] +[group_79182] +[group_79183] +[group_79184] +[group_79185] +[group_79186] +[group_79187] +[group_79188] +[group_79189] +[group_79190] +[group_79191] +[group_79192] +[group_79193] +[group_79194] +[group_79195] +[group_79196] +[group_79197] +[group_79198] +[group_79199] +[group_79200] +[group_79201] +[group_79202] +[group_79203] +[group_79204] +[group_79205] +[group_79206] +[group_79207] +[group_79208] +[group_79209] +[group_79210] +[group_79211] +[group_79212] +[group_79213] +[group_79214] +[group_79215] +[group_79216] +[group_79217] +[group_79218] +[group_79219] +[group_79220] +[group_79221] +[group_79222] +[group_79223] +[group_79224] +[group_79225] +[group_79226] +[group_79227] +[group_79228] +[group_79229] +[group_79230] +[group_79231] +[group_79232] +[group_79233] +[group_79234] +[group_79235] +[group_79236] +[group_79237] +[group_79238] +[group_79239] +[group_79240] +[group_79241] +[group_79242] +[group_79243] +[group_79244] +[group_79245] +[group_79246] +[group_79247] +[group_79248] +[group_79249] +[group_79250] +[group_79251] +[group_79252] +[group_79253] +[group_79254] +[group_79255] +[group_79256] +[group_79257] +[group_79258] +[group_79259] +[group_79260] +[group_79261] +[group_79262] +[group_79263] +[group_79264] +[group_79265] +[group_79266] +[group_79267] +[group_79268] +[group_79269] +[group_79270] +[group_79271] +[group_79272] +[group_79273] +[group_79274] +[group_79275] +[group_79276] +[group_79277] +[group_79278] +[group_79279] +[group_79280] +[group_79281] +[group_79282] +[group_79283] +[group_79284] +[group_79285] +[group_79286] +[group_79287] +[group_79288] +[group_79289] +[group_79290] +[group_79291] +[group_79292] +[group_79293] +[group_79294] +[group_79295] +[group_79296] +[group_79297] +[group_79298] +[group_79299] +[group_79300] +[group_79301] +[group_79302] +[group_79303] +[group_79304] +[group_79305] +[group_79306] +[group_79307] +[group_79308] +[group_79309] +[group_79310] +[group_79311] +[group_79312] +[group_79313] +[group_79314] +[group_79315] +[group_79316] +[group_79317] +[group_79318] +[group_79319] +[group_79320] +[group_79321] +[group_79322] +[group_79323] +[group_79324] +[group_79325] +[group_79326] +[group_79327] +[group_79328] +[group_79329] +[group_79330] +[group_79331] +[group_79332] +[group_79333] +[group_79334] +[group_79335] +[group_79336] +[group_79337] +[group_79338] +[group_79339] +[group_79340] +[group_79341] +[group_79342] +[group_79343] +[group_79344] +[group_79345] +[group_79346] +[group_79347] +[group_79348] +[group_79349] +[group_79350] +[group_79351] +[group_79352] +[group_79353] +[group_79354] +[group_79355] +[group_79356] +[group_79357] +[group_79358] +[group_79359] +[group_79360] +[group_79361] +[group_79362] +[group_79363] +[group_79364] +[group_79365] +[group_79366] +[group_79367] +[group_79368] +[group_79369] +[group_79370] +[group_79371] +[group_79372] +[group_79373] +[group_79374] +[group_79375] +[group_79376] +[group_79377] +[group_79378] +[group_79379] +[group_79380] +[group_79381] +[group_79382] +[group_79383] +[group_79384] +[group_79385] +[group_79386] +[group_79387] +[group_79388] +[group_79389] +[group_79390] +[group_79391] +[group_79392] +[group_79393] +[group_79394] +[group_79395] +[group_79396] +[group_79397] +[group_79398] +[group_79399] +[group_79400] +[group_79401] +[group_79402] +[group_79403] +[group_79404] +[group_79405] +[group_79406] +[group_79407] +[group_79408] +[group_79409] +[group_79410] +[group_79411] +[group_79412] +[group_79413] +[group_79414] +[group_79415] +[group_79416] +[group_79417] +[group_79418] +[group_79419] +[group_79420] +[group_79421] +[group_79422] +[group_79423] +[group_79424] +[group_79425] +[group_79426] +[group_79427] +[group_79428] +[group_79429] +[group_79430] +[group_79431] +[group_79432] +[group_79433] +[group_79434] +[group_79435] +[group_79436] +[group_79437] +[group_79438] +[group_79439] +[group_79440] +[group_79441] +[group_79442] +[group_79443] +[group_79444] +[group_79445] +[group_79446] +[group_79447] +[group_79448] +[group_79449] +[group_79450] +[group_79451] +[group_79452] +[group_79453] +[group_79454] +[group_79455] +[group_79456] +[group_79457] +[group_79458] +[group_79459] +[group_79460] +[group_79461] +[group_79462] +[group_79463] +[group_79464] +[group_79465] +[group_79466] +[group_79467] +[group_79468] +[group_79469] +[group_79470] +[group_79471] +[group_79472] +[group_79473] +[group_79474] +[group_79475] +[group_79476] +[group_79477] +[group_79478] +[group_79479] +[group_79480] +[group_79481] +[group_79482] +[group_79483] +[group_79484] +[group_79485] +[group_79486] +[group_79487] +[group_79488] +[group_79489] +[group_79490] +[group_79491] +[group_79492] +[group_79493] +[group_79494] +[group_79495] +[group_79496] +[group_79497] +[group_79498] +[group_79499] +[group_79500] +[group_79501] +[group_79502] +[group_79503] +[group_79504] +[group_79505] +[group_79506] +[group_79507] +[group_79508] +[group_79509] +[group_79510] +[group_79511] +[group_79512] +[group_79513] +[group_79514] +[group_79515] +[group_79516] +[group_79517] +[group_79518] +[group_79519] +[group_79520] +[group_79521] +[group_79522] +[group_79523] +[group_79524] +[group_79525] +[group_79526] +[group_79527] +[group_79528] +[group_79529] +[group_79530] +[group_79531] +[group_79532] +[group_79533] +[group_79534] +[group_79535] +[group_79536] +[group_79537] +[group_79538] +[group_79539] +[group_79540] +[group_79541] +[group_79542] +[group_79543] +[group_79544] +[group_79545] +[group_79546] +[group_79547] +[group_79548] +[group_79549] +[group_79550] +[group_79551] +[group_79552] +[group_79553] +[group_79554] +[group_79555] +[group_79556] +[group_79557] +[group_79558] +[group_79559] +[group_79560] +[group_79561] +[group_79562] +[group_79563] +[group_79564] +[group_79565] +[group_79566] +[group_79567] +[group_79568] +[group_79569] +[group_79570] +[group_79571] +[group_79572] +[group_79573] +[group_79574] +[group_79575] +[group_79576] +[group_79577] +[group_79578] +[group_79579] +[group_79580] +[group_79581] +[group_79582] +[group_79583] +[group_79584] +[group_79585] +[group_79586] +[group_79587] +[group_79588] +[group_79589] +[group_79590] +[group_79591] +[group_79592] +[group_79593] +[group_79594] +[group_79595] +[group_79596] +[group_79597] +[group_79598] +[group_79599] +[group_79600] +[group_79601] +[group_79602] +[group_79603] +[group_79604] +[group_79605] +[group_79606] +[group_79607] +[group_79608] +[group_79609] +[group_79610] +[group_79611] +[group_79612] +[group_79613] +[group_79614] +[group_79615] +[group_79616] +[group_79617] +[group_79618] +[group_79619] +[group_79620] +[group_79621] +[group_79622] +[group_79623] +[group_79624] +[group_79625] +[group_79626] +[group_79627] +[group_79628] +[group_79629] +[group_79630] +[group_79631] +[group_79632] +[group_79633] +[group_79634] +[group_79635] +[group_79636] +[group_79637] +[group_79638] +[group_79639] +[group_79640] +[group_79641] +[group_79642] +[group_79643] +[group_79644] +[group_79645] +[group_79646] +[group_79647] +[group_79648] +[group_79649] +[group_79650] +[group_79651] +[group_79652] +[group_79653] +[group_79654] +[group_79655] +[group_79656] +[group_79657] +[group_79658] +[group_79659] +[group_79660] +[group_79661] +[group_79662] +[group_79663] +[group_79664] +[group_79665] +[group_79666] +[group_79667] +[group_79668] +[group_79669] +[group_79670] +[group_79671] +[group_79672] +[group_79673] +[group_79674] +[group_79675] +[group_79676] +[group_79677] +[group_79678] +[group_79679] +[group_79680] +[group_79681] +[group_79682] +[group_79683] +[group_79684] +[group_79685] +[group_79686] +[group_79687] +[group_79688] +[group_79689] +[group_79690] +[group_79691] +[group_79692] +[group_79693] +[group_79694] +[group_79695] +[group_79696] +[group_79697] +[group_79698] +[group_79699] +[group_79700] +[group_79701] +[group_79702] +[group_79703] +[group_79704] +[group_79705] +[group_79706] +[group_79707] +[group_79708] +[group_79709] +[group_79710] +[group_79711] +[group_79712] +[group_79713] +[group_79714] +[group_79715] +[group_79716] +[group_79717] +[group_79718] +[group_79719] +[group_79720] +[group_79721] +[group_79722] +[group_79723] +[group_79724] +[group_79725] +[group_79726] +[group_79727] +[group_79728] +[group_79729] +[group_79730] +[group_79731] +[group_79732] +[group_79733] +[group_79734] +[group_79735] +[group_79736] +[group_79737] +[group_79738] +[group_79739] +[group_79740] +[group_79741] +[group_79742] +[group_79743] +[group_79744] +[group_79745] +[group_79746] +[group_79747] +[group_79748] +[group_79749] +[group_79750] +[group_79751] +[group_79752] +[group_79753] +[group_79754] +[group_79755] +[group_79756] +[group_79757] +[group_79758] +[group_79759] +[group_79760] +[group_79761] +[group_79762] +[group_79763] +[group_79764] +[group_79765] +[group_79766] +[group_79767] +[group_79768] +[group_79769] +[group_79770] +[group_79771] +[group_79772] +[group_79773] +[group_79774] +[group_79775] +[group_79776] +[group_79777] +[group_79778] +[group_79779] +[group_79780] +[group_79781] +[group_79782] +[group_79783] +[group_79784] +[group_79785] +[group_79786] +[group_79787] +[group_79788] +[group_79789] +[group_79790] +[group_79791] +[group_79792] +[group_79793] +[group_79794] +[group_79795] +[group_79796] +[group_79797] +[group_79798] +[group_79799] +[group_79800] +[group_79801] +[group_79802] +[group_79803] +[group_79804] +[group_79805] +[group_79806] +[group_79807] +[group_79808] +[group_79809] +[group_79810] +[group_79811] +[group_79812] +[group_79813] +[group_79814] +[group_79815] +[group_79816] +[group_79817] +[group_79818] +[group_79819] +[group_79820] +[group_79821] +[group_79822] +[group_79823] +[group_79824] +[group_79825] +[group_79826] +[group_79827] +[group_79828] +[group_79829] +[group_79830] +[group_79831] +[group_79832] +[group_79833] +[group_79834] +[group_79835] +[group_79836] +[group_79837] +[group_79838] +[group_79839] +[group_79840] +[group_79841] +[group_79842] +[group_79843] +[group_79844] +[group_79845] +[group_79846] +[group_79847] +[group_79848] +[group_79849] +[group_79850] +[group_79851] +[group_79852] +[group_79853] +[group_79854] +[group_79855] +[group_79856] +[group_79857] +[group_79858] +[group_79859] +[group_79860] +[group_79861] +[group_79862] +[group_79863] +[group_79864] +[group_79865] +[group_79866] +[group_79867] +[group_79868] +[group_79869] +[group_79870] +[group_79871] +[group_79872] +[group_79873] +[group_79874] +[group_79875] +[group_79876] +[group_79877] +[group_79878] +[group_79879] +[group_79880] +[group_79881] +[group_79882] +[group_79883] +[group_79884] +[group_79885] +[group_79886] +[group_79887] +[group_79888] +[group_79889] +[group_79890] +[group_79891] +[group_79892] +[group_79893] +[group_79894] +[group_79895] +[group_79896] +[group_79897] +[group_79898] +[group_79899] +[group_79900] +[group_79901] +[group_79902] +[group_79903] +[group_79904] +[group_79905] +[group_79906] +[group_79907] +[group_79908] +[group_79909] +[group_79910] +[group_79911] +[group_79912] +[group_79913] +[group_79914] +[group_79915] +[group_79916] +[group_79917] +[group_79918] +[group_79919] +[group_79920] +[group_79921] +[group_79922] +[group_79923] +[group_79924] +[group_79925] +[group_79926] +[group_79927] +[group_79928] +[group_79929] +[group_79930] +[group_79931] +[group_79932] +[group_79933] +[group_79934] +[group_79935] +[group_79936] +[group_79937] +[group_79938] +[group_79939] +[group_79940] +[group_79941] +[group_79942] +[group_79943] +[group_79944] +[group_79945] +[group_79946] +[group_79947] +[group_79948] +[group_79949] +[group_79950] +[group_79951] +[group_79952] +[group_79953] +[group_79954] +[group_79955] +[group_79956] +[group_79957] +[group_79958] +[group_79959] +[group_79960] +[group_79961] +[group_79962] +[group_79963] +[group_79964] +[group_79965] +[group_79966] +[group_79967] +[group_79968] +[group_79969] +[group_79970] +[group_79971] +[group_79972] +[group_79973] +[group_79974] +[group_79975] +[group_79976] +[group_79977] +[group_79978] +[group_79979] +[group_79980] +[group_79981] +[group_79982] +[group_79983] +[group_79984] +[group_79985] +[group_79986] +[group_79987] +[group_79988] +[group_79989] +[group_79990] +[group_79991] +[group_79992] +[group_79993] +[group_79994] +[group_79995] +[group_79996] +[group_79997] +[group_79998] +[group_79999] +[group_80000] +[group_80001] +[group_80002] +[group_80003] +[group_80004] +[group_80005] +[group_80006] +[group_80007] +[group_80008] +[group_80009] +[group_80010] +[group_80011] +[group_80012] +[group_80013] +[group_80014] +[group_80015] +[group_80016] +[group_80017] +[group_80018] +[group_80019] +[group_80020] +[group_80021] +[group_80022] +[group_80023] +[group_80024] +[group_80025] +[group_80026] +[group_80027] +[group_80028] +[group_80029] +[group_80030] +[group_80031] +[group_80032] +[group_80033] +[group_80034] +[group_80035] +[group_80036] +[group_80037] +[group_80038] +[group_80039] +[group_80040] +[group_80041] +[group_80042] +[group_80043] +[group_80044] +[group_80045] +[group_80046] +[group_80047] +[group_80048] +[group_80049] +[group_80050] +[group_80051] +[group_80052] +[group_80053] +[group_80054] +[group_80055] +[group_80056] +[group_80057] +[group_80058] +[group_80059] +[group_80060] +[group_80061] +[group_80062] +[group_80063] +[group_80064] +[group_80065] +[group_80066] +[group_80067] +[group_80068] +[group_80069] +[group_80070] +[group_80071] +[group_80072] +[group_80073] +[group_80074] +[group_80075] +[group_80076] +[group_80077] +[group_80078] +[group_80079] +[group_80080] +[group_80081] +[group_80082] +[group_80083] +[group_80084] +[group_80085] +[group_80086] +[group_80087] +[group_80088] +[group_80089] +[group_80090] +[group_80091] +[group_80092] +[group_80093] +[group_80094] +[group_80095] +[group_80096] +[group_80097] +[group_80098] +[group_80099] +[group_80100] +[group_80101] +[group_80102] +[group_80103] +[group_80104] +[group_80105] +[group_80106] +[group_80107] +[group_80108] +[group_80109] +[group_80110] +[group_80111] +[group_80112] +[group_80113] +[group_80114] +[group_80115] +[group_80116] +[group_80117] +[group_80118] +[group_80119] +[group_80120] +[group_80121] +[group_80122] +[group_80123] +[group_80124] +[group_80125] +[group_80126] +[group_80127] +[group_80128] +[group_80129] +[group_80130] +[group_80131] +[group_80132] +[group_80133] +[group_80134] +[group_80135] +[group_80136] +[group_80137] +[group_80138] +[group_80139] +[group_80140] +[group_80141] +[group_80142] +[group_80143] +[group_80144] +[group_80145] +[group_80146] +[group_80147] +[group_80148] +[group_80149] +[group_80150] +[group_80151] +[group_80152] +[group_80153] +[group_80154] +[group_80155] +[group_80156] +[group_80157] +[group_80158] +[group_80159] +[group_80160] +[group_80161] +[group_80162] +[group_80163] +[group_80164] +[group_80165] +[group_80166] +[group_80167] +[group_80168] +[group_80169] +[group_80170] +[group_80171] +[group_80172] +[group_80173] +[group_80174] +[group_80175] +[group_80176] +[group_80177] +[group_80178] +[group_80179] +[group_80180] +[group_80181] +[group_80182] +[group_80183] +[group_80184] +[group_80185] +[group_80186] +[group_80187] +[group_80188] +[group_80189] +[group_80190] +[group_80191] +[group_80192] +[group_80193] +[group_80194] +[group_80195] +[group_80196] +[group_80197] +[group_80198] +[group_80199] +[group_80200] +[group_80201] +[group_80202] +[group_80203] +[group_80204] +[group_80205] +[group_80206] +[group_80207] +[group_80208] +[group_80209] +[group_80210] +[group_80211] +[group_80212] +[group_80213] +[group_80214] +[group_80215] +[group_80216] +[group_80217] +[group_80218] +[group_80219] +[group_80220] +[group_80221] +[group_80222] +[group_80223] +[group_80224] +[group_80225] +[group_80226] +[group_80227] +[group_80228] +[group_80229] +[group_80230] +[group_80231] +[group_80232] +[group_80233] +[group_80234] +[group_80235] +[group_80236] +[group_80237] +[group_80238] +[group_80239] +[group_80240] +[group_80241] +[group_80242] +[group_80243] +[group_80244] +[group_80245] +[group_80246] +[group_80247] +[group_80248] +[group_80249] +[group_80250] +[group_80251] +[group_80252] +[group_80253] +[group_80254] +[group_80255] +[group_80256] +[group_80257] +[group_80258] +[group_80259] +[group_80260] +[group_80261] +[group_80262] +[group_80263] +[group_80264] +[group_80265] +[group_80266] +[group_80267] +[group_80268] +[group_80269] +[group_80270] +[group_80271] +[group_80272] +[group_80273] +[group_80274] +[group_80275] +[group_80276] +[group_80277] +[group_80278] +[group_80279] +[group_80280] +[group_80281] +[group_80282] +[group_80283] +[group_80284] +[group_80285] +[group_80286] +[group_80287] +[group_80288] +[group_80289] +[group_80290] +[group_80291] +[group_80292] +[group_80293] +[group_80294] +[group_80295] +[group_80296] +[group_80297] +[group_80298] +[group_80299] +[group_80300] +[group_80301] +[group_80302] +[group_80303] +[group_80304] +[group_80305] +[group_80306] +[group_80307] +[group_80308] +[group_80309] +[group_80310] +[group_80311] +[group_80312] +[group_80313] +[group_80314] +[group_80315] +[group_80316] +[group_80317] +[group_80318] +[group_80319] +[group_80320] +[group_80321] +[group_80322] +[group_80323] +[group_80324] +[group_80325] +[group_80326] +[group_80327] +[group_80328] +[group_80329] +[group_80330] +[group_80331] +[group_80332] +[group_80333] +[group_80334] +[group_80335] +[group_80336] +[group_80337] +[group_80338] +[group_80339] +[group_80340] +[group_80341] +[group_80342] +[group_80343] +[group_80344] +[group_80345] +[group_80346] +[group_80347] +[group_80348] +[group_80349] +[group_80350] +[group_80351] +[group_80352] +[group_80353] +[group_80354] +[group_80355] +[group_80356] +[group_80357] +[group_80358] +[group_80359] +[group_80360] +[group_80361] +[group_80362] +[group_80363] +[group_80364] +[group_80365] +[group_80366] +[group_80367] +[group_80368] +[group_80369] +[group_80370] +[group_80371] +[group_80372] +[group_80373] +[group_80374] +[group_80375] +[group_80376] +[group_80377] +[group_80378] +[group_80379] +[group_80380] +[group_80381] +[group_80382] +[group_80383] +[group_80384] +[group_80385] +[group_80386] +[group_80387] +[group_80388] +[group_80389] +[group_80390] +[group_80391] +[group_80392] +[group_80393] +[group_80394] +[group_80395] +[group_80396] +[group_80397] +[group_80398] +[group_80399] +[group_80400] +[group_80401] +[group_80402] +[group_80403] +[group_80404] +[group_80405] +[group_80406] +[group_80407] +[group_80408] +[group_80409] +[group_80410] +[group_80411] +[group_80412] +[group_80413] +[group_80414] +[group_80415] +[group_80416] +[group_80417] +[group_80418] +[group_80419] +[group_80420] +[group_80421] +[group_80422] +[group_80423] +[group_80424] +[group_80425] +[group_80426] +[group_80427] +[group_80428] +[group_80429] +[group_80430] +[group_80431] +[group_80432] +[group_80433] +[group_80434] +[group_80435] +[group_80436] +[group_80437] +[group_80438] +[group_80439] +[group_80440] +[group_80441] +[group_80442] +[group_80443] +[group_80444] +[group_80445] +[group_80446] +[group_80447] +[group_80448] +[group_80449] +[group_80450] +[group_80451] +[group_80452] +[group_80453] +[group_80454] +[group_80455] +[group_80456] +[group_80457] +[group_80458] +[group_80459] +[group_80460] +[group_80461] +[group_80462] +[group_80463] +[group_80464] +[group_80465] +[group_80466] +[group_80467] +[group_80468] +[group_80469] +[group_80470] +[group_80471] +[group_80472] +[group_80473] +[group_80474] +[group_80475] +[group_80476] +[group_80477] +[group_80478] +[group_80479] +[group_80480] +[group_80481] +[group_80482] +[group_80483] +[group_80484] +[group_80485] +[group_80486] +[group_80487] +[group_80488] +[group_80489] +[group_80490] +[group_80491] +[group_80492] +[group_80493] +[group_80494] +[group_80495] +[group_80496] +[group_80497] +[group_80498] +[group_80499] +[group_80500] +[group_80501] +[group_80502] +[group_80503] +[group_80504] +[group_80505] +[group_80506] +[group_80507] +[group_80508] +[group_80509] +[group_80510] +[group_80511] +[group_80512] +[group_80513] +[group_80514] +[group_80515] +[group_80516] +[group_80517] +[group_80518] +[group_80519] +[group_80520] +[group_80521] +[group_80522] +[group_80523] +[group_80524] +[group_80525] +[group_80526] +[group_80527] +[group_80528] +[group_80529] +[group_80530] +[group_80531] +[group_80532] +[group_80533] +[group_80534] +[group_80535] +[group_80536] +[group_80537] +[group_80538] +[group_80539] +[group_80540] +[group_80541] +[group_80542] +[group_80543] +[group_80544] +[group_80545] +[group_80546] +[group_80547] +[group_80548] +[group_80549] +[group_80550] +[group_80551] +[group_80552] +[group_80553] +[group_80554] +[group_80555] +[group_80556] +[group_80557] +[group_80558] +[group_80559] +[group_80560] +[group_80561] +[group_80562] +[group_80563] +[group_80564] +[group_80565] +[group_80566] +[group_80567] +[group_80568] +[group_80569] +[group_80570] +[group_80571] +[group_80572] +[group_80573] +[group_80574] +[group_80575] +[group_80576] +[group_80577] +[group_80578] +[group_80579] +[group_80580] +[group_80581] +[group_80582] +[group_80583] +[group_80584] +[group_80585] +[group_80586] +[group_80587] +[group_80588] +[group_80589] +[group_80590] +[group_80591] +[group_80592] +[group_80593] +[group_80594] +[group_80595] +[group_80596] +[group_80597] +[group_80598] +[group_80599] +[group_80600] +[group_80601] +[group_80602] +[group_80603] +[group_80604] +[group_80605] +[group_80606] +[group_80607] +[group_80608] +[group_80609] +[group_80610] +[group_80611] +[group_80612] +[group_80613] +[group_80614] +[group_80615] +[group_80616] +[group_80617] +[group_80618] +[group_80619] +[group_80620] +[group_80621] +[group_80622] +[group_80623] +[group_80624] +[group_80625] +[group_80626] +[group_80627] +[group_80628] +[group_80629] +[group_80630] +[group_80631] +[group_80632] +[group_80633] +[group_80634] +[group_80635] +[group_80636] +[group_80637] +[group_80638] +[group_80639] +[group_80640] +[group_80641] +[group_80642] +[group_80643] +[group_80644] +[group_80645] +[group_80646] +[group_80647] +[group_80648] +[group_80649] +[group_80650] +[group_80651] +[group_80652] +[group_80653] +[group_80654] +[group_80655] +[group_80656] +[group_80657] +[group_80658] +[group_80659] +[group_80660] +[group_80661] +[group_80662] +[group_80663] +[group_80664] +[group_80665] +[group_80666] +[group_80667] +[group_80668] +[group_80669] +[group_80670] +[group_80671] +[group_80672] +[group_80673] +[group_80674] +[group_80675] +[group_80676] +[group_80677] +[group_80678] +[group_80679] +[group_80680] +[group_80681] +[group_80682] +[group_80683] +[group_80684] +[group_80685] +[group_80686] +[group_80687] +[group_80688] +[group_80689] +[group_80690] +[group_80691] +[group_80692] +[group_80693] +[group_80694] +[group_80695] +[group_80696] +[group_80697] +[group_80698] +[group_80699] +[group_80700] +[group_80701] +[group_80702] +[group_80703] +[group_80704] +[group_80705] +[group_80706] +[group_80707] +[group_80708] +[group_80709] +[group_80710] +[group_80711] +[group_80712] +[group_80713] +[group_80714] +[group_80715] +[group_80716] +[group_80717] +[group_80718] +[group_80719] +[group_80720] +[group_80721] +[group_80722] +[group_80723] +[group_80724] +[group_80725] +[group_80726] +[group_80727] +[group_80728] +[group_80729] +[group_80730] +[group_80731] +[group_80732] +[group_80733] +[group_80734] +[group_80735] +[group_80736] +[group_80737] +[group_80738] +[group_80739] +[group_80740] +[group_80741] +[group_80742] +[group_80743] +[group_80744] +[group_80745] +[group_80746] +[group_80747] +[group_80748] +[group_80749] +[group_80750] +[group_80751] +[group_80752] +[group_80753] +[group_80754] +[group_80755] +[group_80756] +[group_80757] +[group_80758] +[group_80759] +[group_80760] +[group_80761] +[group_80762] +[group_80763] +[group_80764] +[group_80765] +[group_80766] +[group_80767] +[group_80768] +[group_80769] +[group_80770] +[group_80771] +[group_80772] +[group_80773] +[group_80774] +[group_80775] +[group_80776] +[group_80777] +[group_80778] +[group_80779] +[group_80780] +[group_80781] +[group_80782] +[group_80783] +[group_80784] +[group_80785] +[group_80786] +[group_80787] +[group_80788] +[group_80789] +[group_80790] +[group_80791] +[group_80792] +[group_80793] +[group_80794] +[group_80795] +[group_80796] +[group_80797] +[group_80798] +[group_80799] +[group_80800] +[group_80801] +[group_80802] +[group_80803] +[group_80804] +[group_80805] +[group_80806] +[group_80807] +[group_80808] +[group_80809] +[group_80810] +[group_80811] +[group_80812] +[group_80813] +[group_80814] +[group_80815] +[group_80816] +[group_80817] +[group_80818] +[group_80819] +[group_80820] +[group_80821] +[group_80822] +[group_80823] +[group_80824] +[group_80825] +[group_80826] +[group_80827] +[group_80828] +[group_80829] +[group_80830] +[group_80831] +[group_80832] +[group_80833] +[group_80834] +[group_80835] +[group_80836] +[group_80837] +[group_80838] +[group_80839] +[group_80840] +[group_80841] +[group_80842] +[group_80843] +[group_80844] +[group_80845] +[group_80846] +[group_80847] +[group_80848] +[group_80849] +[group_80850] +[group_80851] +[group_80852] +[group_80853] +[group_80854] +[group_80855] +[group_80856] +[group_80857] +[group_80858] +[group_80859] +[group_80860] +[group_80861] +[group_80862] +[group_80863] +[group_80864] +[group_80865] +[group_80866] +[group_80867] +[group_80868] +[group_80869] +[group_80870] +[group_80871] +[group_80872] +[group_80873] +[group_80874] +[group_80875] +[group_80876] +[group_80877] +[group_80878] +[group_80879] +[group_80880] +[group_80881] +[group_80882] +[group_80883] +[group_80884] +[group_80885] +[group_80886] +[group_80887] +[group_80888] +[group_80889] +[group_80890] +[group_80891] +[group_80892] +[group_80893] +[group_80894] +[group_80895] +[group_80896] +[group_80897] +[group_80898] +[group_80899] +[group_80900] +[group_80901] +[group_80902] +[group_80903] +[group_80904] +[group_80905] +[group_80906] +[group_80907] +[group_80908] +[group_80909] +[group_80910] +[group_80911] +[group_80912] +[group_80913] +[group_80914] +[group_80915] +[group_80916] +[group_80917] +[group_80918] +[group_80919] +[group_80920] +[group_80921] +[group_80922] +[group_80923] +[group_80924] +[group_80925] +[group_80926] +[group_80927] +[group_80928] +[group_80929] +[group_80930] +[group_80931] +[group_80932] +[group_80933] +[group_80934] +[group_80935] +[group_80936] +[group_80937] +[group_80938] +[group_80939] +[group_80940] +[group_80941] +[group_80942] +[group_80943] +[group_80944] +[group_80945] +[group_80946] +[group_80947] +[group_80948] +[group_80949] +[group_80950] +[group_80951] +[group_80952] +[group_80953] +[group_80954] +[group_80955] +[group_80956] +[group_80957] +[group_80958] +[group_80959] +[group_80960] +[group_80961] +[group_80962] +[group_80963] +[group_80964] +[group_80965] +[group_80966] +[group_80967] +[group_80968] +[group_80969] +[group_80970] +[group_80971] +[group_80972] +[group_80973] +[group_80974] +[group_80975] +[group_80976] +[group_80977] +[group_80978] +[group_80979] +[group_80980] +[group_80981] +[group_80982] +[group_80983] +[group_80984] +[group_80985] +[group_80986] +[group_80987] +[group_80988] +[group_80989] +[group_80990] +[group_80991] +[group_80992] +[group_80993] +[group_80994] +[group_80995] +[group_80996] +[group_80997] +[group_80998] +[group_80999] +[group_81000] +[group_81001] +[group_81002] +[group_81003] +[group_81004] +[group_81005] +[group_81006] +[group_81007] +[group_81008] +[group_81009] +[group_81010] +[group_81011] +[group_81012] +[group_81013] +[group_81014] +[group_81015] +[group_81016] +[group_81017] +[group_81018] +[group_81019] +[group_81020] +[group_81021] +[group_81022] +[group_81023] +[group_81024] +[group_81025] +[group_81026] +[group_81027] +[group_81028] +[group_81029] +[group_81030] +[group_81031] +[group_81032] +[group_81033] +[group_81034] +[group_81035] +[group_81036] +[group_81037] +[group_81038] +[group_81039] +[group_81040] +[group_81041] +[group_81042] +[group_81043] +[group_81044] +[group_81045] +[group_81046] +[group_81047] +[group_81048] +[group_81049] +[group_81050] +[group_81051] +[group_81052] +[group_81053] +[group_81054] +[group_81055] +[group_81056] +[group_81057] +[group_81058] +[group_81059] +[group_81060] +[group_81061] +[group_81062] +[group_81063] +[group_81064] +[group_81065] +[group_81066] +[group_81067] +[group_81068] +[group_81069] +[group_81070] +[group_81071] +[group_81072] +[group_81073] +[group_81074] +[group_81075] +[group_81076] +[group_81077] +[group_81078] +[group_81079] +[group_81080] +[group_81081] +[group_81082] +[group_81083] +[group_81084] +[group_81085] +[group_81086] +[group_81087] +[group_81088] +[group_81089] +[group_81090] +[group_81091] +[group_81092] +[group_81093] +[group_81094] +[group_81095] +[group_81096] +[group_81097] +[group_81098] +[group_81099] +[group_81100] +[group_81101] +[group_81102] +[group_81103] +[group_81104] +[group_81105] +[group_81106] +[group_81107] +[group_81108] +[group_81109] +[group_81110] +[group_81111] +[group_81112] +[group_81113] +[group_81114] +[group_81115] +[group_81116] +[group_81117] +[group_81118] +[group_81119] +[group_81120] +[group_81121] +[group_81122] +[group_81123] +[group_81124] +[group_81125] +[group_81126] +[group_81127] +[group_81128] +[group_81129] +[group_81130] +[group_81131] +[group_81132] +[group_81133] +[group_81134] +[group_81135] +[group_81136] +[group_81137] +[group_81138] +[group_81139] +[group_81140] +[group_81141] +[group_81142] +[group_81143] +[group_81144] +[group_81145] +[group_81146] +[group_81147] +[group_81148] +[group_81149] +[group_81150] +[group_81151] +[group_81152] +[group_81153] +[group_81154] +[group_81155] +[group_81156] +[group_81157] +[group_81158] +[group_81159] +[group_81160] +[group_81161] +[group_81162] +[group_81163] +[group_81164] +[group_81165] +[group_81166] +[group_81167] +[group_81168] +[group_81169] +[group_81170] +[group_81171] +[group_81172] +[group_81173] +[group_81174] +[group_81175] +[group_81176] +[group_81177] +[group_81178] +[group_81179] +[group_81180] +[group_81181] +[group_81182] +[group_81183] +[group_81184] +[group_81185] +[group_81186] +[group_81187] +[group_81188] +[group_81189] +[group_81190] +[group_81191] +[group_81192] +[group_81193] +[group_81194] +[group_81195] +[group_81196] +[group_81197] +[group_81198] +[group_81199] +[group_81200] +[group_81201] +[group_81202] +[group_81203] +[group_81204] +[group_81205] +[group_81206] +[group_81207] +[group_81208] +[group_81209] +[group_81210] +[group_81211] +[group_81212] +[group_81213] +[group_81214] +[group_81215] +[group_81216] +[group_81217] +[group_81218] +[group_81219] +[group_81220] +[group_81221] +[group_81222] +[group_81223] +[group_81224] +[group_81225] +[group_81226] +[group_81227] +[group_81228] +[group_81229] +[group_81230] +[group_81231] +[group_81232] +[group_81233] +[group_81234] +[group_81235] +[group_81236] +[group_81237] +[group_81238] +[group_81239] +[group_81240] +[group_81241] +[group_81242] +[group_81243] +[group_81244] +[group_81245] +[group_81246] +[group_81247] +[group_81248] +[group_81249] +[group_81250] +[group_81251] +[group_81252] +[group_81253] +[group_81254] +[group_81255] +[group_81256] +[group_81257] +[group_81258] +[group_81259] +[group_81260] +[group_81261] +[group_81262] +[group_81263] +[group_81264] +[group_81265] +[group_81266] +[group_81267] +[group_81268] +[group_81269] +[group_81270] +[group_81271] +[group_81272] +[group_81273] +[group_81274] +[group_81275] +[group_81276] +[group_81277] +[group_81278] +[group_81279] +[group_81280] +[group_81281] +[group_81282] +[group_81283] +[group_81284] +[group_81285] +[group_81286] +[group_81287] +[group_81288] +[group_81289] +[group_81290] +[group_81291] +[group_81292] +[group_81293] +[group_81294] +[group_81295] +[group_81296] +[group_81297] +[group_81298] +[group_81299] +[group_81300] +[group_81301] +[group_81302] +[group_81303] +[group_81304] +[group_81305] +[group_81306] +[group_81307] +[group_81308] +[group_81309] +[group_81310] +[group_81311] +[group_81312] +[group_81313] +[group_81314] +[group_81315] +[group_81316] +[group_81317] +[group_81318] +[group_81319] +[group_81320] +[group_81321] +[group_81322] +[group_81323] +[group_81324] +[group_81325] +[group_81326] +[group_81327] +[group_81328] +[group_81329] +[group_81330] +[group_81331] +[group_81332] +[group_81333] +[group_81334] +[group_81335] +[group_81336] +[group_81337] +[group_81338] +[group_81339] +[group_81340] +[group_81341] +[group_81342] +[group_81343] +[group_81344] +[group_81345] +[group_81346] +[group_81347] +[group_81348] +[group_81349] +[group_81350] +[group_81351] +[group_81352] +[group_81353] +[group_81354] +[group_81355] +[group_81356] +[group_81357] +[group_81358] +[group_81359] +[group_81360] +[group_81361] +[group_81362] +[group_81363] +[group_81364] +[group_81365] +[group_81366] +[group_81367] +[group_81368] +[group_81369] +[group_81370] +[group_81371] +[group_81372] +[group_81373] +[group_81374] +[group_81375] +[group_81376] +[group_81377] +[group_81378] +[group_81379] +[group_81380] +[group_81381] +[group_81382] +[group_81383] +[group_81384] +[group_81385] +[group_81386] +[group_81387] +[group_81388] +[group_81389] +[group_81390] +[group_81391] +[group_81392] +[group_81393] +[group_81394] +[group_81395] +[group_81396] +[group_81397] +[group_81398] +[group_81399] +[group_81400] +[group_81401] +[group_81402] +[group_81403] +[group_81404] +[group_81405] +[group_81406] +[group_81407] +[group_81408] +[group_81409] +[group_81410] +[group_81411] +[group_81412] +[group_81413] +[group_81414] +[group_81415] +[group_81416] +[group_81417] +[group_81418] +[group_81419] +[group_81420] +[group_81421] +[group_81422] +[group_81423] +[group_81424] +[group_81425] +[group_81426] +[group_81427] +[group_81428] +[group_81429] +[group_81430] +[group_81431] +[group_81432] +[group_81433] +[group_81434] +[group_81435] +[group_81436] +[group_81437] +[group_81438] +[group_81439] +[group_81440] +[group_81441] +[group_81442] +[group_81443] +[group_81444] +[group_81445] +[group_81446] +[group_81447] +[group_81448] +[group_81449] +[group_81450] +[group_81451] +[group_81452] +[group_81453] +[group_81454] +[group_81455] +[group_81456] +[group_81457] +[group_81458] +[group_81459] +[group_81460] +[group_81461] +[group_81462] +[group_81463] +[group_81464] +[group_81465] +[group_81466] +[group_81467] +[group_81468] +[group_81469] +[group_81470] +[group_81471] +[group_81472] +[group_81473] +[group_81474] +[group_81475] +[group_81476] +[group_81477] +[group_81478] +[group_81479] +[group_81480] +[group_81481] +[group_81482] +[group_81483] +[group_81484] +[group_81485] +[group_81486] +[group_81487] +[group_81488] +[group_81489] +[group_81490] +[group_81491] +[group_81492] +[group_81493] +[group_81494] +[group_81495] +[group_81496] +[group_81497] +[group_81498] +[group_81499] +[group_81500] +[group_81501] +[group_81502] +[group_81503] +[group_81504] +[group_81505] +[group_81506] +[group_81507] +[group_81508] +[group_81509] +[group_81510] +[group_81511] +[group_81512] +[group_81513] +[group_81514] +[group_81515] +[group_81516] +[group_81517] +[group_81518] +[group_81519] +[group_81520] +[group_81521] +[group_81522] +[group_81523] +[group_81524] +[group_81525] +[group_81526] +[group_81527] +[group_81528] +[group_81529] +[group_81530] +[group_81531] +[group_81532] +[group_81533] +[group_81534] +[group_81535] +[group_81536] +[group_81537] +[group_81538] +[group_81539] +[group_81540] +[group_81541] +[group_81542] +[group_81543] +[group_81544] +[group_81545] +[group_81546] +[group_81547] +[group_81548] +[group_81549] +[group_81550] +[group_81551] +[group_81552] +[group_81553] +[group_81554] +[group_81555] +[group_81556] +[group_81557] +[group_81558] +[group_81559] +[group_81560] +[group_81561] +[group_81562] +[group_81563] +[group_81564] +[group_81565] +[group_81566] +[group_81567] +[group_81568] +[group_81569] +[group_81570] +[group_81571] +[group_81572] +[group_81573] +[group_81574] +[group_81575] +[group_81576] +[group_81577] +[group_81578] +[group_81579] +[group_81580] +[group_81581] +[group_81582] +[group_81583] +[group_81584] +[group_81585] +[group_81586] +[group_81587] +[group_81588] +[group_81589] +[group_81590] +[group_81591] +[group_81592] +[group_81593] +[group_81594] +[group_81595] +[group_81596] +[group_81597] +[group_81598] +[group_81599] +[group_81600] +[group_81601] +[group_81602] +[group_81603] +[group_81604] +[group_81605] +[group_81606] +[group_81607] +[group_81608] +[group_81609] +[group_81610] +[group_81611] +[group_81612] +[group_81613] +[group_81614] +[group_81615] +[group_81616] +[group_81617] +[group_81618] +[group_81619] +[group_81620] +[group_81621] +[group_81622] +[group_81623] +[group_81624] +[group_81625] +[group_81626] +[group_81627] +[group_81628] +[group_81629] +[group_81630] +[group_81631] +[group_81632] +[group_81633] +[group_81634] +[group_81635] +[group_81636] +[group_81637] +[group_81638] +[group_81639] +[group_81640] +[group_81641] +[group_81642] +[group_81643] +[group_81644] +[group_81645] +[group_81646] +[group_81647] +[group_81648] +[group_81649] +[group_81650] +[group_81651] +[group_81652] +[group_81653] +[group_81654] +[group_81655] +[group_81656] +[group_81657] +[group_81658] +[group_81659] +[group_81660] +[group_81661] +[group_81662] +[group_81663] +[group_81664] +[group_81665] +[group_81666] +[group_81667] +[group_81668] +[group_81669] +[group_81670] +[group_81671] +[group_81672] +[group_81673] +[group_81674] +[group_81675] +[group_81676] +[group_81677] +[group_81678] +[group_81679] +[group_81680] +[group_81681] +[group_81682] +[group_81683] +[group_81684] +[group_81685] +[group_81686] +[group_81687] +[group_81688] +[group_81689] +[group_81690] +[group_81691] +[group_81692] +[group_81693] +[group_81694] +[group_81695] +[group_81696] +[group_81697] +[group_81698] +[group_81699] +[group_81700] +[group_81701] +[group_81702] +[group_81703] +[group_81704] +[group_81705] +[group_81706] +[group_81707] +[group_81708] +[group_81709] +[group_81710] +[group_81711] +[group_81712] +[group_81713] +[group_81714] +[group_81715] +[group_81716] +[group_81717] +[group_81718] +[group_81719] +[group_81720] +[group_81721] +[group_81722] +[group_81723] +[group_81724] +[group_81725] +[group_81726] +[group_81727] +[group_81728] +[group_81729] +[group_81730] +[group_81731] +[group_81732] +[group_81733] +[group_81734] +[group_81735] +[group_81736] +[group_81737] +[group_81738] +[group_81739] +[group_81740] +[group_81741] +[group_81742] +[group_81743] +[group_81744] +[group_81745] +[group_81746] +[group_81747] +[group_81748] +[group_81749] +[group_81750] +[group_81751] +[group_81752] +[group_81753] +[group_81754] +[group_81755] +[group_81756] +[group_81757] +[group_81758] +[group_81759] +[group_81760] +[group_81761] +[group_81762] +[group_81763] +[group_81764] +[group_81765] +[group_81766] +[group_81767] +[group_81768] +[group_81769] +[group_81770] +[group_81771] +[group_81772] +[group_81773] +[group_81774] +[group_81775] +[group_81776] +[group_81777] +[group_81778] +[group_81779] +[group_81780] +[group_81781] +[group_81782] +[group_81783] +[group_81784] +[group_81785] +[group_81786] +[group_81787] +[group_81788] +[group_81789] +[group_81790] +[group_81791] +[group_81792] +[group_81793] +[group_81794] +[group_81795] +[group_81796] +[group_81797] +[group_81798] +[group_81799] +[group_81800] +[group_81801] +[group_81802] +[group_81803] +[group_81804] +[group_81805] +[group_81806] +[group_81807] +[group_81808] +[group_81809] +[group_81810] +[group_81811] +[group_81812] +[group_81813] +[group_81814] +[group_81815] +[group_81816] +[group_81817] +[group_81818] +[group_81819] +[group_81820] +[group_81821] +[group_81822] +[group_81823] +[group_81824] +[group_81825] +[group_81826] +[group_81827] +[group_81828] +[group_81829] +[group_81830] +[group_81831] +[group_81832] +[group_81833] +[group_81834] +[group_81835] +[group_81836] +[group_81837] +[group_81838] +[group_81839] +[group_81840] +[group_81841] +[group_81842] +[group_81843] +[group_81844] +[group_81845] +[group_81846] +[group_81847] +[group_81848] +[group_81849] +[group_81850] +[group_81851] +[group_81852] +[group_81853] +[group_81854] +[group_81855] +[group_81856] +[group_81857] +[group_81858] +[group_81859] +[group_81860] +[group_81861] +[group_81862] +[group_81863] +[group_81864] +[group_81865] +[group_81866] +[group_81867] +[group_81868] +[group_81869] +[group_81870] +[group_81871] +[group_81872] +[group_81873] +[group_81874] +[group_81875] +[group_81876] +[group_81877] +[group_81878] +[group_81879] +[group_81880] +[group_81881] +[group_81882] +[group_81883] +[group_81884] +[group_81885] +[group_81886] +[group_81887] +[group_81888] +[group_81889] +[group_81890] +[group_81891] +[group_81892] +[group_81893] +[group_81894] +[group_81895] +[group_81896] +[group_81897] +[group_81898] +[group_81899] +[group_81900] +[group_81901] +[group_81902] +[group_81903] +[group_81904] +[group_81905] +[group_81906] +[group_81907] +[group_81908] +[group_81909] +[group_81910] +[group_81911] +[group_81912] +[group_81913] +[group_81914] +[group_81915] +[group_81916] +[group_81917] +[group_81918] +[group_81919] +[group_81920] +[group_81921] +[group_81922] +[group_81923] +[group_81924] +[group_81925] +[group_81926] +[group_81927] +[group_81928] +[group_81929] +[group_81930] +[group_81931] +[group_81932] +[group_81933] +[group_81934] +[group_81935] +[group_81936] +[group_81937] +[group_81938] +[group_81939] +[group_81940] +[group_81941] +[group_81942] +[group_81943] +[group_81944] +[group_81945] +[group_81946] +[group_81947] +[group_81948] +[group_81949] +[group_81950] +[group_81951] +[group_81952] +[group_81953] +[group_81954] +[group_81955] +[group_81956] +[group_81957] +[group_81958] +[group_81959] +[group_81960] +[group_81961] +[group_81962] +[group_81963] +[group_81964] +[group_81965] +[group_81966] +[group_81967] +[group_81968] +[group_81969] +[group_81970] +[group_81971] +[group_81972] +[group_81973] +[group_81974] +[group_81975] +[group_81976] +[group_81977] +[group_81978] +[group_81979] +[group_81980] +[group_81981] +[group_81982] +[group_81983] +[group_81984] +[group_81985] +[group_81986] +[group_81987] +[group_81988] +[group_81989] +[group_81990] +[group_81991] +[group_81992] +[group_81993] +[group_81994] +[group_81995] +[group_81996] +[group_81997] +[group_81998] +[group_81999] +[group_82000] +[group_82001] +[group_82002] +[group_82003] +[group_82004] +[group_82005] +[group_82006] +[group_82007] +[group_82008] +[group_82009] +[group_82010] +[group_82011] +[group_82012] +[group_82013] +[group_82014] +[group_82015] +[group_82016] +[group_82017] +[group_82018] +[group_82019] +[group_82020] +[group_82021] +[group_82022] +[group_82023] +[group_82024] +[group_82025] +[group_82026] +[group_82027] +[group_82028] +[group_82029] +[group_82030] +[group_82031] +[group_82032] +[group_82033] +[group_82034] +[group_82035] +[group_82036] +[group_82037] +[group_82038] +[group_82039] +[group_82040] +[group_82041] +[group_82042] +[group_82043] +[group_82044] +[group_82045] +[group_82046] +[group_82047] +[group_82048] +[group_82049] +[group_82050] +[group_82051] +[group_82052] +[group_82053] +[group_82054] +[group_82055] +[group_82056] +[group_82057] +[group_82058] +[group_82059] +[group_82060] +[group_82061] +[group_82062] +[group_82063] +[group_82064] +[group_82065] +[group_82066] +[group_82067] +[group_82068] +[group_82069] +[group_82070] +[group_82071] +[group_82072] +[group_82073] +[group_82074] +[group_82075] +[group_82076] +[group_82077] +[group_82078] +[group_82079] +[group_82080] +[group_82081] +[group_82082] +[group_82083] +[group_82084] +[group_82085] +[group_82086] +[group_82087] +[group_82088] +[group_82089] +[group_82090] +[group_82091] +[group_82092] +[group_82093] +[group_82094] +[group_82095] +[group_82096] +[group_82097] +[group_82098] +[group_82099] +[group_82100] +[group_82101] +[group_82102] +[group_82103] +[group_82104] +[group_82105] +[group_82106] +[group_82107] +[group_82108] +[group_82109] +[group_82110] +[group_82111] +[group_82112] +[group_82113] +[group_82114] +[group_82115] +[group_82116] +[group_82117] +[group_82118] +[group_82119] +[group_82120] +[group_82121] +[group_82122] +[group_82123] +[group_82124] +[group_82125] +[group_82126] +[group_82127] +[group_82128] +[group_82129] +[group_82130] +[group_82131] +[group_82132] +[group_82133] +[group_82134] +[group_82135] +[group_82136] +[group_82137] +[group_82138] +[group_82139] +[group_82140] +[group_82141] +[group_82142] +[group_82143] +[group_82144] +[group_82145] +[group_82146] +[group_82147] +[group_82148] +[group_82149] +[group_82150] +[group_82151] +[group_82152] +[group_82153] +[group_82154] +[group_82155] +[group_82156] +[group_82157] +[group_82158] +[group_82159] +[group_82160] +[group_82161] +[group_82162] +[group_82163] +[group_82164] +[group_82165] +[group_82166] +[group_82167] +[group_82168] +[group_82169] +[group_82170] +[group_82171] +[group_82172] +[group_82173] +[group_82174] +[group_82175] +[group_82176] +[group_82177] +[group_82178] +[group_82179] +[group_82180] +[group_82181] +[group_82182] +[group_82183] +[group_82184] +[group_82185] +[group_82186] +[group_82187] +[group_82188] +[group_82189] +[group_82190] +[group_82191] +[group_82192] +[group_82193] +[group_82194] +[group_82195] +[group_82196] +[group_82197] +[group_82198] +[group_82199] +[group_82200] +[group_82201] +[group_82202] +[group_82203] +[group_82204] +[group_82205] +[group_82206] +[group_82207] +[group_82208] +[group_82209] +[group_82210] +[group_82211] +[group_82212] +[group_82213] +[group_82214] +[group_82215] +[group_82216] +[group_82217] +[group_82218] +[group_82219] +[group_82220] +[group_82221] +[group_82222] +[group_82223] +[group_82224] +[group_82225] +[group_82226] +[group_82227] +[group_82228] +[group_82229] +[group_82230] +[group_82231] +[group_82232] +[group_82233] +[group_82234] +[group_82235] +[group_82236] +[group_82237] +[group_82238] +[group_82239] +[group_82240] +[group_82241] +[group_82242] +[group_82243] +[group_82244] +[group_82245] +[group_82246] +[group_82247] +[group_82248] +[group_82249] +[group_82250] +[group_82251] +[group_82252] +[group_82253] +[group_82254] +[group_82255] +[group_82256] +[group_82257] +[group_82258] +[group_82259] +[group_82260] +[group_82261] +[group_82262] +[group_82263] +[group_82264] +[group_82265] +[group_82266] +[group_82267] +[group_82268] +[group_82269] +[group_82270] +[group_82271] +[group_82272] +[group_82273] +[group_82274] +[group_82275] +[group_82276] +[group_82277] +[group_82278] +[group_82279] +[group_82280] +[group_82281] +[group_82282] +[group_82283] +[group_82284] +[group_82285] +[group_82286] +[group_82287] +[group_82288] +[group_82289] +[group_82290] +[group_82291] +[group_82292] +[group_82293] +[group_82294] +[group_82295] +[group_82296] +[group_82297] +[group_82298] +[group_82299] +[group_82300] +[group_82301] +[group_82302] +[group_82303] +[group_82304] +[group_82305] +[group_82306] +[group_82307] +[group_82308] +[group_82309] +[group_82310] +[group_82311] +[group_82312] +[group_82313] +[group_82314] +[group_82315] +[group_82316] +[group_82317] +[group_82318] +[group_82319] +[group_82320] +[group_82321] +[group_82322] +[group_82323] +[group_82324] +[group_82325] +[group_82326] +[group_82327] +[group_82328] +[group_82329] +[group_82330] +[group_82331] +[group_82332] +[group_82333] +[group_82334] +[group_82335] +[group_82336] +[group_82337] +[group_82338] +[group_82339] +[group_82340] +[group_82341] +[group_82342] +[group_82343] +[group_82344] +[group_82345] +[group_82346] +[group_82347] +[group_82348] +[group_82349] +[group_82350] +[group_82351] +[group_82352] +[group_82353] +[group_82354] +[group_82355] +[group_82356] +[group_82357] +[group_82358] +[group_82359] +[group_82360] +[group_82361] +[group_82362] +[group_82363] +[group_82364] +[group_82365] +[group_82366] +[group_82367] +[group_82368] +[group_82369] +[group_82370] +[group_82371] +[group_82372] +[group_82373] +[group_82374] +[group_82375] +[group_82376] +[group_82377] +[group_82378] +[group_82379] +[group_82380] +[group_82381] +[group_82382] +[group_82383] +[group_82384] +[group_82385] +[group_82386] +[group_82387] +[group_82388] +[group_82389] +[group_82390] +[group_82391] +[group_82392] +[group_82393] +[group_82394] +[group_82395] +[group_82396] +[group_82397] +[group_82398] +[group_82399] +[group_82400] +[group_82401] +[group_82402] +[group_82403] +[group_82404] +[group_82405] +[group_82406] +[group_82407] +[group_82408] +[group_82409] +[group_82410] +[group_82411] +[group_82412] +[group_82413] +[group_82414] +[group_82415] +[group_82416] +[group_82417] +[group_82418] +[group_82419] +[group_82420] +[group_82421] +[group_82422] +[group_82423] +[group_82424] +[group_82425] +[group_82426] +[group_82427] +[group_82428] +[group_82429] +[group_82430] +[group_82431] +[group_82432] +[group_82433] +[group_82434] +[group_82435] +[group_82436] +[group_82437] +[group_82438] +[group_82439] +[group_82440] +[group_82441] +[group_82442] +[group_82443] +[group_82444] +[group_82445] +[group_82446] +[group_82447] +[group_82448] +[group_82449] +[group_82450] +[group_82451] +[group_82452] +[group_82453] +[group_82454] +[group_82455] +[group_82456] +[group_82457] +[group_82458] +[group_82459] +[group_82460] +[group_82461] +[group_82462] +[group_82463] +[group_82464] +[group_82465] +[group_82466] +[group_82467] +[group_82468] +[group_82469] +[group_82470] +[group_82471] +[group_82472] +[group_82473] +[group_82474] +[group_82475] +[group_82476] +[group_82477] +[group_82478] +[group_82479] +[group_82480] +[group_82481] +[group_82482] +[group_82483] +[group_82484] +[group_82485] +[group_82486] +[group_82487] +[group_82488] +[group_82489] +[group_82490] +[group_82491] +[group_82492] +[group_82493] +[group_82494] +[group_82495] +[group_82496] +[group_82497] +[group_82498] +[group_82499] +[group_82500] +[group_82501] +[group_82502] +[group_82503] +[group_82504] +[group_82505] +[group_82506] +[group_82507] +[group_82508] +[group_82509] +[group_82510] +[group_82511] +[group_82512] +[group_82513] +[group_82514] +[group_82515] +[group_82516] +[group_82517] +[group_82518] +[group_82519] +[group_82520] +[group_82521] +[group_82522] +[group_82523] +[group_82524] +[group_82525] +[group_82526] +[group_82527] +[group_82528] +[group_82529] +[group_82530] +[group_82531] +[group_82532] +[group_82533] +[group_82534] +[group_82535] +[group_82536] +[group_82537] +[group_82538] +[group_82539] +[group_82540] +[group_82541] +[group_82542] +[group_82543] +[group_82544] +[group_82545] +[group_82546] +[group_82547] +[group_82548] +[group_82549] +[group_82550] +[group_82551] +[group_82552] +[group_82553] +[group_82554] +[group_82555] +[group_82556] +[group_82557] +[group_82558] +[group_82559] +[group_82560] +[group_82561] +[group_82562] +[group_82563] +[group_82564] +[group_82565] +[group_82566] +[group_82567] +[group_82568] +[group_82569] +[group_82570] +[group_82571] +[group_82572] +[group_82573] +[group_82574] +[group_82575] +[group_82576] +[group_82577] +[group_82578] +[group_82579] +[group_82580] +[group_82581] +[group_82582] +[group_82583] +[group_82584] +[group_82585] +[group_82586] +[group_82587] +[group_82588] +[group_82589] +[group_82590] +[group_82591] +[group_82592] +[group_82593] +[group_82594] +[group_82595] +[group_82596] +[group_82597] +[group_82598] +[group_82599] +[group_82600] +[group_82601] +[group_82602] +[group_82603] +[group_82604] +[group_82605] +[group_82606] +[group_82607] +[group_82608] +[group_82609] +[group_82610] +[group_82611] +[group_82612] +[group_82613] +[group_82614] +[group_82615] +[group_82616] +[group_82617] +[group_82618] +[group_82619] +[group_82620] +[group_82621] +[group_82622] +[group_82623] +[group_82624] +[group_82625] +[group_82626] +[group_82627] +[group_82628] +[group_82629] +[group_82630] +[group_82631] +[group_82632] +[group_82633] +[group_82634] +[group_82635] +[group_82636] +[group_82637] +[group_82638] +[group_82639] +[group_82640] +[group_82641] +[group_82642] +[group_82643] +[group_82644] +[group_82645] +[group_82646] +[group_82647] +[group_82648] +[group_82649] +[group_82650] +[group_82651] +[group_82652] +[group_82653] +[group_82654] +[group_82655] +[group_82656] +[group_82657] +[group_82658] +[group_82659] +[group_82660] +[group_82661] +[group_82662] +[group_82663] +[group_82664] +[group_82665] +[group_82666] +[group_82667] +[group_82668] +[group_82669] +[group_82670] +[group_82671] +[group_82672] +[group_82673] +[group_82674] +[group_82675] +[group_82676] +[group_82677] +[group_82678] +[group_82679] +[group_82680] +[group_82681] +[group_82682] +[group_82683] +[group_82684] +[group_82685] +[group_82686] +[group_82687] +[group_82688] +[group_82689] +[group_82690] +[group_82691] +[group_82692] +[group_82693] +[group_82694] +[group_82695] +[group_82696] +[group_82697] +[group_82698] +[group_82699] +[group_82700] +[group_82701] +[group_82702] +[group_82703] +[group_82704] +[group_82705] +[group_82706] +[group_82707] +[group_82708] +[group_82709] +[group_82710] +[group_82711] +[group_82712] +[group_82713] +[group_82714] +[group_82715] +[group_82716] +[group_82717] +[group_82718] +[group_82719] +[group_82720] +[group_82721] +[group_82722] +[group_82723] +[group_82724] +[group_82725] +[group_82726] +[group_82727] +[group_82728] +[group_82729] +[group_82730] +[group_82731] +[group_82732] +[group_82733] +[group_82734] +[group_82735] +[group_82736] +[group_82737] +[group_82738] +[group_82739] +[group_82740] +[group_82741] +[group_82742] +[group_82743] +[group_82744] +[group_82745] +[group_82746] +[group_82747] +[group_82748] +[group_82749] +[group_82750] +[group_82751] +[group_82752] +[group_82753] +[group_82754] +[group_82755] +[group_82756] +[group_82757] +[group_82758] +[group_82759] +[group_82760] +[group_82761] +[group_82762] +[group_82763] +[group_82764] +[group_82765] +[group_82766] +[group_82767] +[group_82768] +[group_82769] +[group_82770] +[group_82771] +[group_82772] +[group_82773] +[group_82774] +[group_82775] +[group_82776] +[group_82777] +[group_82778] +[group_82779] +[group_82780] +[group_82781] +[group_82782] +[group_82783] +[group_82784] +[group_82785] +[group_82786] +[group_82787] +[group_82788] +[group_82789] +[group_82790] +[group_82791] +[group_82792] +[group_82793] +[group_82794] +[group_82795] +[group_82796] +[group_82797] +[group_82798] +[group_82799] +[group_82800] +[group_82801] +[group_82802] +[group_82803] +[group_82804] +[group_82805] +[group_82806] +[group_82807] +[group_82808] +[group_82809] +[group_82810] +[group_82811] +[group_82812] +[group_82813] +[group_82814] +[group_82815] +[group_82816] +[group_82817] +[group_82818] +[group_82819] +[group_82820] +[group_82821] +[group_82822] +[group_82823] +[group_82824] +[group_82825] +[group_82826] +[group_82827] +[group_82828] +[group_82829] +[group_82830] +[group_82831] +[group_82832] +[group_82833] +[group_82834] +[group_82835] +[group_82836] +[group_82837] +[group_82838] +[group_82839] +[group_82840] +[group_82841] +[group_82842] +[group_82843] +[group_82844] +[group_82845] +[group_82846] +[group_82847] +[group_82848] +[group_82849] +[group_82850] +[group_82851] +[group_82852] +[group_82853] +[group_82854] +[group_82855] +[group_82856] +[group_82857] +[group_82858] +[group_82859] +[group_82860] +[group_82861] +[group_82862] +[group_82863] +[group_82864] +[group_82865] +[group_82866] +[group_82867] +[group_82868] +[group_82869] +[group_82870] +[group_82871] +[group_82872] +[group_82873] +[group_82874] +[group_82875] +[group_82876] +[group_82877] +[group_82878] +[group_82879] +[group_82880] +[group_82881] +[group_82882] +[group_82883] +[group_82884] +[group_82885] +[group_82886] +[group_82887] +[group_82888] +[group_82889] +[group_82890] +[group_82891] +[group_82892] +[group_82893] +[group_82894] +[group_82895] +[group_82896] +[group_82897] +[group_82898] +[group_82899] +[group_82900] +[group_82901] +[group_82902] +[group_82903] +[group_82904] +[group_82905] +[group_82906] +[group_82907] +[group_82908] +[group_82909] +[group_82910] +[group_82911] +[group_82912] +[group_82913] +[group_82914] +[group_82915] +[group_82916] +[group_82917] +[group_82918] +[group_82919] +[group_82920] +[group_82921] +[group_82922] +[group_82923] +[group_82924] +[group_82925] +[group_82926] +[group_82927] +[group_82928] +[group_82929] +[group_82930] +[group_82931] +[group_82932] +[group_82933] +[group_82934] +[group_82935] +[group_82936] +[group_82937] +[group_82938] +[group_82939] +[group_82940] +[group_82941] +[group_82942] +[group_82943] +[group_82944] +[group_82945] +[group_82946] +[group_82947] +[group_82948] +[group_82949] +[group_82950] +[group_82951] +[group_82952] +[group_82953] +[group_82954] +[group_82955] +[group_82956] +[group_82957] +[group_82958] +[group_82959] +[group_82960] +[group_82961] +[group_82962] +[group_82963] +[group_82964] +[group_82965] +[group_82966] +[group_82967] +[group_82968] +[group_82969] +[group_82970] +[group_82971] +[group_82972] +[group_82973] +[group_82974] +[group_82975] +[group_82976] +[group_82977] +[group_82978] +[group_82979] +[group_82980] +[group_82981] +[group_82982] +[group_82983] +[group_82984] +[group_82985] +[group_82986] +[group_82987] +[group_82988] +[group_82989] +[group_82990] +[group_82991] +[group_82992] +[group_82993] +[group_82994] +[group_82995] +[group_82996] +[group_82997] +[group_82998] +[group_82999] +[group_83000] +[group_83001] +[group_83002] +[group_83003] +[group_83004] +[group_83005] +[group_83006] +[group_83007] +[group_83008] +[group_83009] +[group_83010] +[group_83011] +[group_83012] +[group_83013] +[group_83014] +[group_83015] +[group_83016] +[group_83017] +[group_83018] +[group_83019] +[group_83020] +[group_83021] +[group_83022] +[group_83023] +[group_83024] +[group_83025] +[group_83026] +[group_83027] +[group_83028] +[group_83029] +[group_83030] +[group_83031] +[group_83032] +[group_83033] +[group_83034] +[group_83035] +[group_83036] +[group_83037] +[group_83038] +[group_83039] +[group_83040] +[group_83041] +[group_83042] +[group_83043] +[group_83044] +[group_83045] +[group_83046] +[group_83047] +[group_83048] +[group_83049] +[group_83050] +[group_83051] +[group_83052] +[group_83053] +[group_83054] +[group_83055] +[group_83056] +[group_83057] +[group_83058] +[group_83059] +[group_83060] +[group_83061] +[group_83062] +[group_83063] +[group_83064] +[group_83065] +[group_83066] +[group_83067] +[group_83068] +[group_83069] +[group_83070] +[group_83071] +[group_83072] +[group_83073] +[group_83074] +[group_83075] +[group_83076] +[group_83077] +[group_83078] +[group_83079] +[group_83080] +[group_83081] +[group_83082] +[group_83083] +[group_83084] +[group_83085] +[group_83086] +[group_83087] +[group_83088] +[group_83089] +[group_83090] +[group_83091] +[group_83092] +[group_83093] +[group_83094] +[group_83095] +[group_83096] +[group_83097] +[group_83098] +[group_83099] +[group_83100] +[group_83101] +[group_83102] +[group_83103] +[group_83104] +[group_83105] +[group_83106] +[group_83107] +[group_83108] +[group_83109] +[group_83110] +[group_83111] +[group_83112] +[group_83113] +[group_83114] +[group_83115] +[group_83116] +[group_83117] +[group_83118] +[group_83119] +[group_83120] +[group_83121] +[group_83122] +[group_83123] +[group_83124] +[group_83125] +[group_83126] +[group_83127] +[group_83128] +[group_83129] +[group_83130] +[group_83131] +[group_83132] +[group_83133] +[group_83134] +[group_83135] +[group_83136] +[group_83137] +[group_83138] +[group_83139] +[group_83140] +[group_83141] +[group_83142] +[group_83143] +[group_83144] +[group_83145] +[group_83146] +[group_83147] +[group_83148] +[group_83149] +[group_83150] +[group_83151] +[group_83152] +[group_83153] +[group_83154] +[group_83155] +[group_83156] +[group_83157] +[group_83158] +[group_83159] +[group_83160] +[group_83161] +[group_83162] +[group_83163] +[group_83164] +[group_83165] +[group_83166] +[group_83167] +[group_83168] +[group_83169] +[group_83170] +[group_83171] +[group_83172] +[group_83173] +[group_83174] +[group_83175] +[group_83176] +[group_83177] +[group_83178] +[group_83179] +[group_83180] +[group_83181] +[group_83182] +[group_83183] +[group_83184] +[group_83185] +[group_83186] +[group_83187] +[group_83188] +[group_83189] +[group_83190] +[group_83191] +[group_83192] +[group_83193] +[group_83194] +[group_83195] +[group_83196] +[group_83197] +[group_83198] +[group_83199] +[group_83200] +[group_83201] +[group_83202] +[group_83203] +[group_83204] +[group_83205] +[group_83206] +[group_83207] +[group_83208] +[group_83209] +[group_83210] +[group_83211] +[group_83212] +[group_83213] +[group_83214] +[group_83215] +[group_83216] +[group_83217] +[group_83218] +[group_83219] +[group_83220] +[group_83221] +[group_83222] +[group_83223] +[group_83224] +[group_83225] +[group_83226] +[group_83227] +[group_83228] +[group_83229] +[group_83230] +[group_83231] +[group_83232] +[group_83233] +[group_83234] +[group_83235] +[group_83236] +[group_83237] +[group_83238] +[group_83239] +[group_83240] +[group_83241] +[group_83242] +[group_83243] +[group_83244] +[group_83245] +[group_83246] +[group_83247] +[group_83248] +[group_83249] +[group_83250] +[group_83251] +[group_83252] +[group_83253] +[group_83254] +[group_83255] +[group_83256] +[group_83257] +[group_83258] +[group_83259] +[group_83260] +[group_83261] +[group_83262] +[group_83263] +[group_83264] +[group_83265] +[group_83266] +[group_83267] +[group_83268] +[group_83269] +[group_83270] +[group_83271] +[group_83272] +[group_83273] +[group_83274] +[group_83275] +[group_83276] +[group_83277] +[group_83278] +[group_83279] +[group_83280] +[group_83281] +[group_83282] +[group_83283] +[group_83284] +[group_83285] +[group_83286] +[group_83287] +[group_83288] +[group_83289] +[group_83290] +[group_83291] +[group_83292] +[group_83293] +[group_83294] +[group_83295] +[group_83296] +[group_83297] +[group_83298] +[group_83299] +[group_83300] +[group_83301] +[group_83302] +[group_83303] +[group_83304] +[group_83305] +[group_83306] +[group_83307] +[group_83308] +[group_83309] +[group_83310] +[group_83311] +[group_83312] +[group_83313] +[group_83314] +[group_83315] +[group_83316] +[group_83317] +[group_83318] +[group_83319] +[group_83320] +[group_83321] +[group_83322] +[group_83323] +[group_83324] +[group_83325] +[group_83326] +[group_83327] +[group_83328] +[group_83329] +[group_83330] +[group_83331] +[group_83332] +[group_83333] +[group_83334] +[group_83335] +[group_83336] +[group_83337] +[group_83338] +[group_83339] +[group_83340] +[group_83341] +[group_83342] +[group_83343] +[group_83344] +[group_83345] +[group_83346] +[group_83347] +[group_83348] +[group_83349] +[group_83350] +[group_83351] +[group_83352] +[group_83353] +[group_83354] +[group_83355] +[group_83356] +[group_83357] +[group_83358] +[group_83359] +[group_83360] +[group_83361] +[group_83362] +[group_83363] +[group_83364] +[group_83365] +[group_83366] +[group_83367] +[group_83368] +[group_83369] +[group_83370] +[group_83371] +[group_83372] +[group_83373] +[group_83374] +[group_83375] +[group_83376] +[group_83377] +[group_83378] +[group_83379] +[group_83380] +[group_83381] +[group_83382] +[group_83383] +[group_83384] +[group_83385] +[group_83386] +[group_83387] +[group_83388] +[group_83389] +[group_83390] +[group_83391] +[group_83392] +[group_83393] +[group_83394] +[group_83395] +[group_83396] +[group_83397] +[group_83398] +[group_83399] +[group_83400] +[group_83401] +[group_83402] +[group_83403] +[group_83404] +[group_83405] +[group_83406] +[group_83407] +[group_83408] +[group_83409] +[group_83410] +[group_83411] +[group_83412] +[group_83413] +[group_83414] +[group_83415] +[group_83416] +[group_83417] +[group_83418] +[group_83419] +[group_83420] +[group_83421] +[group_83422] +[group_83423] +[group_83424] +[group_83425] +[group_83426] +[group_83427] +[group_83428] +[group_83429] +[group_83430] +[group_83431] +[group_83432] +[group_83433] +[group_83434] +[group_83435] +[group_83436] +[group_83437] +[group_83438] +[group_83439] +[group_83440] +[group_83441] +[group_83442] +[group_83443] +[group_83444] +[group_83445] +[group_83446] +[group_83447] +[group_83448] +[group_83449] +[group_83450] +[group_83451] +[group_83452] +[group_83453] +[group_83454] +[group_83455] +[group_83456] +[group_83457] +[group_83458] +[group_83459] +[group_83460] +[group_83461] +[group_83462] +[group_83463] +[group_83464] +[group_83465] +[group_83466] +[group_83467] +[group_83468] +[group_83469] +[group_83470] +[group_83471] +[group_83472] +[group_83473] +[group_83474] +[group_83475] +[group_83476] +[group_83477] +[group_83478] +[group_83479] +[group_83480] +[group_83481] +[group_83482] +[group_83483] +[group_83484] +[group_83485] +[group_83486] +[group_83487] +[group_83488] +[group_83489] +[group_83490] +[group_83491] +[group_83492] +[group_83493] +[group_83494] +[group_83495] +[group_83496] +[group_83497] +[group_83498] +[group_83499] +[group_83500] +[group_83501] +[group_83502] +[group_83503] +[group_83504] +[group_83505] +[group_83506] +[group_83507] +[group_83508] +[group_83509] +[group_83510] +[group_83511] +[group_83512] +[group_83513] +[group_83514] +[group_83515] +[group_83516] +[group_83517] +[group_83518] +[group_83519] +[group_83520] +[group_83521] +[group_83522] +[group_83523] +[group_83524] +[group_83525] +[group_83526] +[group_83527] +[group_83528] +[group_83529] +[group_83530] +[group_83531] +[group_83532] +[group_83533] +[group_83534] +[group_83535] +[group_83536] +[group_83537] +[group_83538] +[group_83539] +[group_83540] +[group_83541] +[group_83542] +[group_83543] +[group_83544] +[group_83545] +[group_83546] +[group_83547] +[group_83548] +[group_83549] +[group_83550] +[group_83551] +[group_83552] +[group_83553] +[group_83554] +[group_83555] +[group_83556] +[group_83557] +[group_83558] +[group_83559] +[group_83560] +[group_83561] +[group_83562] +[group_83563] +[group_83564] +[group_83565] +[group_83566] +[group_83567] +[group_83568] +[group_83569] +[group_83570] +[group_83571] +[group_83572] +[group_83573] +[group_83574] +[group_83575] +[group_83576] +[group_83577] +[group_83578] +[group_83579] +[group_83580] +[group_83581] +[group_83582] +[group_83583] +[group_83584] +[group_83585] +[group_83586] +[group_83587] +[group_83588] +[group_83589] +[group_83590] +[group_83591] +[group_83592] +[group_83593] +[group_83594] +[group_83595] +[group_83596] +[group_83597] +[group_83598] +[group_83599] +[group_83600] +[group_83601] +[group_83602] +[group_83603] +[group_83604] +[group_83605] +[group_83606] +[group_83607] +[group_83608] +[group_83609] +[group_83610] +[group_83611] +[group_83612] +[group_83613] +[group_83614] +[group_83615] +[group_83616] +[group_83617] +[group_83618] +[group_83619] +[group_83620] +[group_83621] +[group_83622] +[group_83623] +[group_83624] +[group_83625] +[group_83626] +[group_83627] +[group_83628] +[group_83629] +[group_83630] +[group_83631] +[group_83632] +[group_83633] +[group_83634] +[group_83635] +[group_83636] +[group_83637] +[group_83638] +[group_83639] +[group_83640] +[group_83641] +[group_83642] +[group_83643] +[group_83644] +[group_83645] +[group_83646] +[group_83647] +[group_83648] +[group_83649] +[group_83650] +[group_83651] +[group_83652] +[group_83653] +[group_83654] +[group_83655] +[group_83656] +[group_83657] +[group_83658] +[group_83659] +[group_83660] +[group_83661] +[group_83662] +[group_83663] +[group_83664] +[group_83665] +[group_83666] +[group_83667] +[group_83668] +[group_83669] +[group_83670] +[group_83671] +[group_83672] +[group_83673] +[group_83674] +[group_83675] +[group_83676] +[group_83677] +[group_83678] +[group_83679] +[group_83680] +[group_83681] +[group_83682] +[group_83683] +[group_83684] +[group_83685] +[group_83686] +[group_83687] +[group_83688] +[group_83689] +[group_83690] +[group_83691] +[group_83692] +[group_83693] +[group_83694] +[group_83695] +[group_83696] +[group_83697] +[group_83698] +[group_83699] +[group_83700] +[group_83701] +[group_83702] +[group_83703] +[group_83704] +[group_83705] +[group_83706] +[group_83707] +[group_83708] +[group_83709] +[group_83710] +[group_83711] +[group_83712] +[group_83713] +[group_83714] +[group_83715] +[group_83716] +[group_83717] +[group_83718] +[group_83719] +[group_83720] +[group_83721] +[group_83722] +[group_83723] +[group_83724] +[group_83725] +[group_83726] +[group_83727] +[group_83728] +[group_83729] +[group_83730] +[group_83731] +[group_83732] +[group_83733] +[group_83734] +[group_83735] +[group_83736] +[group_83737] +[group_83738] +[group_83739] +[group_83740] +[group_83741] +[group_83742] +[group_83743] +[group_83744] +[group_83745] +[group_83746] +[group_83747] +[group_83748] +[group_83749] +[group_83750] +[group_83751] +[group_83752] +[group_83753] +[group_83754] +[group_83755] +[group_83756] +[group_83757] +[group_83758] +[group_83759] +[group_83760] +[group_83761] +[group_83762] +[group_83763] +[group_83764] +[group_83765] +[group_83766] +[group_83767] +[group_83768] +[group_83769] +[group_83770] +[group_83771] +[group_83772] +[group_83773] +[group_83774] +[group_83775] +[group_83776] +[group_83777] +[group_83778] +[group_83779] +[group_83780] +[group_83781] +[group_83782] +[group_83783] +[group_83784] +[group_83785] +[group_83786] +[group_83787] +[group_83788] +[group_83789] +[group_83790] +[group_83791] +[group_83792] +[group_83793] +[group_83794] +[group_83795] +[group_83796] +[group_83797] +[group_83798] +[group_83799] +[group_83800] +[group_83801] +[group_83802] +[group_83803] +[group_83804] +[group_83805] +[group_83806] +[group_83807] +[group_83808] +[group_83809] +[group_83810] +[group_83811] +[group_83812] +[group_83813] +[group_83814] +[group_83815] +[group_83816] +[group_83817] +[group_83818] +[group_83819] +[group_83820] +[group_83821] +[group_83822] +[group_83823] +[group_83824] +[group_83825] +[group_83826] +[group_83827] +[group_83828] +[group_83829] +[group_83830] +[group_83831] +[group_83832] +[group_83833] +[group_83834] +[group_83835] +[group_83836] +[group_83837] +[group_83838] +[group_83839] +[group_83840] +[group_83841] +[group_83842] +[group_83843] +[group_83844] +[group_83845] +[group_83846] +[group_83847] +[group_83848] +[group_83849] +[group_83850] +[group_83851] +[group_83852] +[group_83853] +[group_83854] +[group_83855] +[group_83856] +[group_83857] +[group_83858] +[group_83859] +[group_83860] +[group_83861] +[group_83862] +[group_83863] +[group_83864] +[group_83865] +[group_83866] +[group_83867] +[group_83868] +[group_83869] +[group_83870] +[group_83871] +[group_83872] +[group_83873] +[group_83874] +[group_83875] +[group_83876] +[group_83877] +[group_83878] +[group_83879] +[group_83880] +[group_83881] +[group_83882] +[group_83883] +[group_83884] +[group_83885] +[group_83886] +[group_83887] +[group_83888] +[group_83889] +[group_83890] +[group_83891] +[group_83892] +[group_83893] +[group_83894] +[group_83895] +[group_83896] +[group_83897] +[group_83898] +[group_83899] +[group_83900] +[group_83901] +[group_83902] +[group_83903] +[group_83904] +[group_83905] +[group_83906] +[group_83907] +[group_83908] +[group_83909] +[group_83910] +[group_83911] +[group_83912] +[group_83913] +[group_83914] +[group_83915] +[group_83916] +[group_83917] +[group_83918] +[group_83919] +[group_83920] +[group_83921] +[group_83922] +[group_83923] +[group_83924] +[group_83925] +[group_83926] +[group_83927] +[group_83928] +[group_83929] +[group_83930] +[group_83931] +[group_83932] +[group_83933] +[group_83934] +[group_83935] +[group_83936] +[group_83937] +[group_83938] +[group_83939] +[group_83940] +[group_83941] +[group_83942] +[group_83943] +[group_83944] +[group_83945] +[group_83946] +[group_83947] +[group_83948] +[group_83949] +[group_83950] +[group_83951] +[group_83952] +[group_83953] +[group_83954] +[group_83955] +[group_83956] +[group_83957] +[group_83958] +[group_83959] +[group_83960] +[group_83961] +[group_83962] +[group_83963] +[group_83964] +[group_83965] +[group_83966] +[group_83967] +[group_83968] +[group_83969] +[group_83970] +[group_83971] +[group_83972] +[group_83973] +[group_83974] +[group_83975] +[group_83976] +[group_83977] +[group_83978] +[group_83979] +[group_83980] +[group_83981] +[group_83982] +[group_83983] +[group_83984] +[group_83985] +[group_83986] +[group_83987] +[group_83988] +[group_83989] +[group_83990] +[group_83991] +[group_83992] +[group_83993] +[group_83994] +[group_83995] +[group_83996] +[group_83997] +[group_83998] +[group_83999] +[group_84000] +[group_84001] +[group_84002] +[group_84003] +[group_84004] +[group_84005] +[group_84006] +[group_84007] +[group_84008] +[group_84009] +[group_84010] +[group_84011] +[group_84012] +[group_84013] +[group_84014] +[group_84015] +[group_84016] +[group_84017] +[group_84018] +[group_84019] +[group_84020] +[group_84021] +[group_84022] +[group_84023] +[group_84024] +[group_84025] +[group_84026] +[group_84027] +[group_84028] +[group_84029] +[group_84030] +[group_84031] +[group_84032] +[group_84033] +[group_84034] +[group_84035] +[group_84036] +[group_84037] +[group_84038] +[group_84039] +[group_84040] +[group_84041] +[group_84042] +[group_84043] +[group_84044] +[group_84045] +[group_84046] +[group_84047] +[group_84048] +[group_84049] +[group_84050] +[group_84051] +[group_84052] +[group_84053] +[group_84054] +[group_84055] +[group_84056] +[group_84057] +[group_84058] +[group_84059] +[group_84060] +[group_84061] +[group_84062] +[group_84063] +[group_84064] +[group_84065] +[group_84066] +[group_84067] +[group_84068] +[group_84069] +[group_84070] +[group_84071] +[group_84072] +[group_84073] +[group_84074] +[group_84075] +[group_84076] +[group_84077] +[group_84078] +[group_84079] +[group_84080] +[group_84081] +[group_84082] +[group_84083] +[group_84084] +[group_84085] +[group_84086] +[group_84087] +[group_84088] +[group_84089] +[group_84090] +[group_84091] +[group_84092] +[group_84093] +[group_84094] +[group_84095] +[group_84096] +[group_84097] +[group_84098] +[group_84099] +[group_84100] +[group_84101] +[group_84102] +[group_84103] +[group_84104] +[group_84105] +[group_84106] +[group_84107] +[group_84108] +[group_84109] +[group_84110] +[group_84111] +[group_84112] +[group_84113] +[group_84114] +[group_84115] +[group_84116] +[group_84117] +[group_84118] +[group_84119] +[group_84120] +[group_84121] +[group_84122] +[group_84123] +[group_84124] +[group_84125] +[group_84126] +[group_84127] +[group_84128] +[group_84129] +[group_84130] +[group_84131] +[group_84132] +[group_84133] +[group_84134] +[group_84135] +[group_84136] +[group_84137] +[group_84138] +[group_84139] +[group_84140] +[group_84141] +[group_84142] +[group_84143] +[group_84144] +[group_84145] +[group_84146] +[group_84147] +[group_84148] +[group_84149] +[group_84150] +[group_84151] +[group_84152] +[group_84153] +[group_84154] +[group_84155] +[group_84156] +[group_84157] +[group_84158] +[group_84159] +[group_84160] +[group_84161] +[group_84162] +[group_84163] +[group_84164] +[group_84165] +[group_84166] +[group_84167] +[group_84168] +[group_84169] +[group_84170] +[group_84171] +[group_84172] +[group_84173] +[group_84174] +[group_84175] +[group_84176] +[group_84177] +[group_84178] +[group_84179] +[group_84180] +[group_84181] +[group_84182] +[group_84183] +[group_84184] +[group_84185] +[group_84186] +[group_84187] +[group_84188] +[group_84189] +[group_84190] +[group_84191] +[group_84192] +[group_84193] +[group_84194] +[group_84195] +[group_84196] +[group_84197] +[group_84198] +[group_84199] +[group_84200] +[group_84201] +[group_84202] +[group_84203] +[group_84204] +[group_84205] +[group_84206] +[group_84207] +[group_84208] +[group_84209] +[group_84210] +[group_84211] +[group_84212] +[group_84213] +[group_84214] +[group_84215] +[group_84216] +[group_84217] +[group_84218] +[group_84219] +[group_84220] +[group_84221] +[group_84222] +[group_84223] +[group_84224] +[group_84225] +[group_84226] +[group_84227] +[group_84228] +[group_84229] +[group_84230] +[group_84231] +[group_84232] +[group_84233] +[group_84234] +[group_84235] +[group_84236] +[group_84237] +[group_84238] +[group_84239] +[group_84240] +[group_84241] +[group_84242] +[group_84243] +[group_84244] +[group_84245] +[group_84246] +[group_84247] +[group_84248] +[group_84249] +[group_84250] +[group_84251] +[group_84252] +[group_84253] +[group_84254] +[group_84255] +[group_84256] +[group_84257] +[group_84258] +[group_84259] +[group_84260] +[group_84261] +[group_84262] +[group_84263] +[group_84264] +[group_84265] +[group_84266] +[group_84267] +[group_84268] +[group_84269] +[group_84270] +[group_84271] +[group_84272] +[group_84273] +[group_84274] +[group_84275] +[group_84276] +[group_84277] +[group_84278] +[group_84279] +[group_84280] +[group_84281] +[group_84282] +[group_84283] +[group_84284] +[group_84285] +[group_84286] +[group_84287] +[group_84288] +[group_84289] +[group_84290] +[group_84291] +[group_84292] +[group_84293] +[group_84294] +[group_84295] +[group_84296] +[group_84297] +[group_84298] +[group_84299] +[group_84300] +[group_84301] +[group_84302] +[group_84303] +[group_84304] +[group_84305] +[group_84306] +[group_84307] +[group_84308] +[group_84309] +[group_84310] +[group_84311] +[group_84312] +[group_84313] +[group_84314] +[group_84315] +[group_84316] +[group_84317] +[group_84318] +[group_84319] +[group_84320] +[group_84321] +[group_84322] +[group_84323] +[group_84324] +[group_84325] +[group_84326] +[group_84327] +[group_84328] +[group_84329] +[group_84330] +[group_84331] +[group_84332] +[group_84333] +[group_84334] +[group_84335] +[group_84336] +[group_84337] +[group_84338] +[group_84339] +[group_84340] +[group_84341] +[group_84342] +[group_84343] +[group_84344] +[group_84345] +[group_84346] +[group_84347] +[group_84348] +[group_84349] +[group_84350] +[group_84351] +[group_84352] +[group_84353] +[group_84354] +[group_84355] +[group_84356] +[group_84357] +[group_84358] +[group_84359] +[group_84360] +[group_84361] +[group_84362] +[group_84363] +[group_84364] +[group_84365] +[group_84366] +[group_84367] +[group_84368] +[group_84369] +[group_84370] +[group_84371] +[group_84372] +[group_84373] +[group_84374] +[group_84375] +[group_84376] +[group_84377] +[group_84378] +[group_84379] +[group_84380] +[group_84381] +[group_84382] +[group_84383] +[group_84384] +[group_84385] +[group_84386] +[group_84387] +[group_84388] +[group_84389] +[group_84390] +[group_84391] +[group_84392] +[group_84393] +[group_84394] +[group_84395] +[group_84396] +[group_84397] +[group_84398] +[group_84399] +[group_84400] +[group_84401] +[group_84402] +[group_84403] +[group_84404] +[group_84405] +[group_84406] +[group_84407] +[group_84408] +[group_84409] +[group_84410] +[group_84411] +[group_84412] +[group_84413] +[group_84414] +[group_84415] +[group_84416] +[group_84417] +[group_84418] +[group_84419] +[group_84420] +[group_84421] +[group_84422] +[group_84423] +[group_84424] +[group_84425] +[group_84426] +[group_84427] +[group_84428] +[group_84429] +[group_84430] +[group_84431] +[group_84432] +[group_84433] +[group_84434] +[group_84435] +[group_84436] +[group_84437] +[group_84438] +[group_84439] +[group_84440] +[group_84441] +[group_84442] +[group_84443] +[group_84444] +[group_84445] +[group_84446] +[group_84447] +[group_84448] +[group_84449] +[group_84450] +[group_84451] +[group_84452] +[group_84453] +[group_84454] +[group_84455] +[group_84456] +[group_84457] +[group_84458] +[group_84459] +[group_84460] +[group_84461] +[group_84462] +[group_84463] +[group_84464] +[group_84465] +[group_84466] +[group_84467] +[group_84468] +[group_84469] +[group_84470] +[group_84471] +[group_84472] +[group_84473] +[group_84474] +[group_84475] +[group_84476] +[group_84477] +[group_84478] +[group_84479] +[group_84480] +[group_84481] +[group_84482] +[group_84483] +[group_84484] +[group_84485] +[group_84486] +[group_84487] +[group_84488] +[group_84489] +[group_84490] +[group_84491] +[group_84492] +[group_84493] +[group_84494] +[group_84495] +[group_84496] +[group_84497] +[group_84498] +[group_84499] +[group_84500] +[group_84501] +[group_84502] +[group_84503] +[group_84504] +[group_84505] +[group_84506] +[group_84507] +[group_84508] +[group_84509] +[group_84510] +[group_84511] +[group_84512] +[group_84513] +[group_84514] +[group_84515] +[group_84516] +[group_84517] +[group_84518] +[group_84519] +[group_84520] +[group_84521] +[group_84522] +[group_84523] +[group_84524] +[group_84525] +[group_84526] +[group_84527] +[group_84528] +[group_84529] +[group_84530] +[group_84531] +[group_84532] +[group_84533] +[group_84534] +[group_84535] +[group_84536] +[group_84537] +[group_84538] +[group_84539] +[group_84540] +[group_84541] +[group_84542] +[group_84543] +[group_84544] +[group_84545] +[group_84546] +[group_84547] +[group_84548] +[group_84549] +[group_84550] +[group_84551] +[group_84552] +[group_84553] +[group_84554] +[group_84555] +[group_84556] +[group_84557] +[group_84558] +[group_84559] +[group_84560] +[group_84561] +[group_84562] +[group_84563] +[group_84564] +[group_84565] +[group_84566] +[group_84567] +[group_84568] +[group_84569] +[group_84570] +[group_84571] +[group_84572] +[group_84573] +[group_84574] +[group_84575] +[group_84576] +[group_84577] +[group_84578] +[group_84579] +[group_84580] +[group_84581] +[group_84582] +[group_84583] +[group_84584] +[group_84585] +[group_84586] +[group_84587] +[group_84588] +[group_84589] +[group_84590] +[group_84591] +[group_84592] +[group_84593] +[group_84594] +[group_84595] +[group_84596] +[group_84597] +[group_84598] +[group_84599] +[group_84600] +[group_84601] +[group_84602] +[group_84603] +[group_84604] +[group_84605] +[group_84606] +[group_84607] +[group_84608] +[group_84609] +[group_84610] +[group_84611] +[group_84612] +[group_84613] +[group_84614] +[group_84615] +[group_84616] +[group_84617] +[group_84618] +[group_84619] +[group_84620] +[group_84621] +[group_84622] +[group_84623] +[group_84624] +[group_84625] +[group_84626] +[group_84627] +[group_84628] +[group_84629] +[group_84630] +[group_84631] +[group_84632] +[group_84633] +[group_84634] +[group_84635] +[group_84636] +[group_84637] +[group_84638] +[group_84639] +[group_84640] +[group_84641] +[group_84642] +[group_84643] +[group_84644] +[group_84645] +[group_84646] +[group_84647] +[group_84648] +[group_84649] +[group_84650] +[group_84651] +[group_84652] +[group_84653] +[group_84654] +[group_84655] +[group_84656] +[group_84657] +[group_84658] +[group_84659] +[group_84660] +[group_84661] +[group_84662] +[group_84663] +[group_84664] +[group_84665] +[group_84666] +[group_84667] +[group_84668] +[group_84669] +[group_84670] +[group_84671] +[group_84672] +[group_84673] +[group_84674] +[group_84675] +[group_84676] +[group_84677] +[group_84678] +[group_84679] +[group_84680] +[group_84681] +[group_84682] +[group_84683] +[group_84684] +[group_84685] +[group_84686] +[group_84687] +[group_84688] +[group_84689] +[group_84690] +[group_84691] +[group_84692] +[group_84693] +[group_84694] +[group_84695] +[group_84696] +[group_84697] +[group_84698] +[group_84699] +[group_84700] +[group_84701] +[group_84702] +[group_84703] +[group_84704] +[group_84705] +[group_84706] +[group_84707] +[group_84708] +[group_84709] +[group_84710] +[group_84711] +[group_84712] +[group_84713] +[group_84714] +[group_84715] +[group_84716] +[group_84717] +[group_84718] +[group_84719] +[group_84720] +[group_84721] +[group_84722] +[group_84723] +[group_84724] +[group_84725] +[group_84726] +[group_84727] +[group_84728] +[group_84729] +[group_84730] +[group_84731] +[group_84732] +[group_84733] +[group_84734] +[group_84735] +[group_84736] +[group_84737] +[group_84738] +[group_84739] +[group_84740] +[group_84741] +[group_84742] +[group_84743] +[group_84744] +[group_84745] +[group_84746] +[group_84747] +[group_84748] +[group_84749] +[group_84750] +[group_84751] +[group_84752] +[group_84753] +[group_84754] +[group_84755] +[group_84756] +[group_84757] +[group_84758] +[group_84759] +[group_84760] +[group_84761] +[group_84762] +[group_84763] +[group_84764] +[group_84765] +[group_84766] +[group_84767] +[group_84768] +[group_84769] +[group_84770] +[group_84771] +[group_84772] +[group_84773] +[group_84774] +[group_84775] +[group_84776] +[group_84777] +[group_84778] +[group_84779] +[group_84780] +[group_84781] +[group_84782] +[group_84783] +[group_84784] +[group_84785] +[group_84786] +[group_84787] +[group_84788] +[group_84789] +[group_84790] +[group_84791] +[group_84792] +[group_84793] +[group_84794] +[group_84795] +[group_84796] +[group_84797] +[group_84798] +[group_84799] +[group_84800] +[group_84801] +[group_84802] +[group_84803] +[group_84804] +[group_84805] +[group_84806] +[group_84807] +[group_84808] +[group_84809] +[group_84810] +[group_84811] +[group_84812] +[group_84813] +[group_84814] +[group_84815] +[group_84816] +[group_84817] +[group_84818] +[group_84819] +[group_84820] +[group_84821] +[group_84822] +[group_84823] +[group_84824] +[group_84825] +[group_84826] +[group_84827] +[group_84828] +[group_84829] +[group_84830] +[group_84831] +[group_84832] +[group_84833] +[group_84834] +[group_84835] +[group_84836] +[group_84837] +[group_84838] +[group_84839] +[group_84840] +[group_84841] +[group_84842] +[group_84843] +[group_84844] +[group_84845] +[group_84846] +[group_84847] +[group_84848] +[group_84849] +[group_84850] +[group_84851] +[group_84852] +[group_84853] +[group_84854] +[group_84855] +[group_84856] +[group_84857] +[group_84858] +[group_84859] +[group_84860] +[group_84861] +[group_84862] +[group_84863] +[group_84864] +[group_84865] +[group_84866] +[group_84867] +[group_84868] +[group_84869] +[group_84870] +[group_84871] +[group_84872] +[group_84873] +[group_84874] +[group_84875] +[group_84876] +[group_84877] +[group_84878] +[group_84879] +[group_84880] +[group_84881] +[group_84882] +[group_84883] +[group_84884] +[group_84885] +[group_84886] +[group_84887] +[group_84888] +[group_84889] +[group_84890] +[group_84891] +[group_84892] +[group_84893] +[group_84894] +[group_84895] +[group_84896] +[group_84897] +[group_84898] +[group_84899] +[group_84900] +[group_84901] +[group_84902] +[group_84903] +[group_84904] +[group_84905] +[group_84906] +[group_84907] +[group_84908] +[group_84909] +[group_84910] +[group_84911] +[group_84912] +[group_84913] +[group_84914] +[group_84915] +[group_84916] +[group_84917] +[group_84918] +[group_84919] +[group_84920] +[group_84921] +[group_84922] +[group_84923] +[group_84924] +[group_84925] +[group_84926] +[group_84927] +[group_84928] +[group_84929] +[group_84930] +[group_84931] +[group_84932] +[group_84933] +[group_84934] +[group_84935] +[group_84936] +[group_84937] +[group_84938] +[group_84939] +[group_84940] +[group_84941] +[group_84942] +[group_84943] +[group_84944] +[group_84945] +[group_84946] +[group_84947] +[group_84948] +[group_84949] +[group_84950] +[group_84951] +[group_84952] +[group_84953] +[group_84954] +[group_84955] +[group_84956] +[group_84957] +[group_84958] +[group_84959] +[group_84960] +[group_84961] +[group_84962] +[group_84963] +[group_84964] +[group_84965] +[group_84966] +[group_84967] +[group_84968] +[group_84969] +[group_84970] +[group_84971] +[group_84972] +[group_84973] +[group_84974] +[group_84975] +[group_84976] +[group_84977] +[group_84978] +[group_84979] +[group_84980] +[group_84981] +[group_84982] +[group_84983] +[group_84984] +[group_84985] +[group_84986] +[group_84987] +[group_84988] +[group_84989] +[group_84990] +[group_84991] +[group_84992] +[group_84993] +[group_84994] +[group_84995] +[group_84996] +[group_84997] +[group_84998] +[group_84999] +[group_85000] +[group_85001] +[group_85002] +[group_85003] +[group_85004] +[group_85005] +[group_85006] +[group_85007] +[group_85008] +[group_85009] +[group_85010] +[group_85011] +[group_85012] +[group_85013] +[group_85014] +[group_85015] +[group_85016] +[group_85017] +[group_85018] +[group_85019] +[group_85020] +[group_85021] +[group_85022] +[group_85023] +[group_85024] +[group_85025] +[group_85026] +[group_85027] +[group_85028] +[group_85029] +[group_85030] +[group_85031] +[group_85032] +[group_85033] +[group_85034] +[group_85035] +[group_85036] +[group_85037] +[group_85038] +[group_85039] +[group_85040] +[group_85041] +[group_85042] +[group_85043] +[group_85044] +[group_85045] +[group_85046] +[group_85047] +[group_85048] +[group_85049] +[group_85050] +[group_85051] +[group_85052] +[group_85053] +[group_85054] +[group_85055] +[group_85056] +[group_85057] +[group_85058] +[group_85059] +[group_85060] +[group_85061] +[group_85062] +[group_85063] +[group_85064] +[group_85065] +[group_85066] +[group_85067] +[group_85068] +[group_85069] +[group_85070] +[group_85071] +[group_85072] +[group_85073] +[group_85074] +[group_85075] +[group_85076] +[group_85077] +[group_85078] +[group_85079] +[group_85080] +[group_85081] +[group_85082] +[group_85083] +[group_85084] +[group_85085] +[group_85086] +[group_85087] +[group_85088] +[group_85089] +[group_85090] +[group_85091] +[group_85092] +[group_85093] +[group_85094] +[group_85095] +[group_85096] +[group_85097] +[group_85098] +[group_85099] +[group_85100] +[group_85101] +[group_85102] +[group_85103] +[group_85104] +[group_85105] +[group_85106] +[group_85107] +[group_85108] +[group_85109] +[group_85110] +[group_85111] +[group_85112] +[group_85113] +[group_85114] +[group_85115] +[group_85116] +[group_85117] +[group_85118] +[group_85119] +[group_85120] +[group_85121] +[group_85122] +[group_85123] +[group_85124] +[group_85125] +[group_85126] +[group_85127] +[group_85128] +[group_85129] +[group_85130] +[group_85131] +[group_85132] +[group_85133] +[group_85134] +[group_85135] +[group_85136] +[group_85137] +[group_85138] +[group_85139] +[group_85140] +[group_85141] +[group_85142] +[group_85143] +[group_85144] +[group_85145] +[group_85146] +[group_85147] +[group_85148] +[group_85149] +[group_85150] +[group_85151] +[group_85152] +[group_85153] +[group_85154] +[group_85155] +[group_85156] +[group_85157] +[group_85158] +[group_85159] +[group_85160] +[group_85161] +[group_85162] +[group_85163] +[group_85164] +[group_85165] +[group_85166] +[group_85167] +[group_85168] +[group_85169] +[group_85170] +[group_85171] +[group_85172] +[group_85173] +[group_85174] +[group_85175] +[group_85176] +[group_85177] +[group_85178] +[group_85179] +[group_85180] +[group_85181] +[group_85182] +[group_85183] +[group_85184] +[group_85185] +[group_85186] +[group_85187] +[group_85188] +[group_85189] +[group_85190] +[group_85191] +[group_85192] +[group_85193] +[group_85194] +[group_85195] +[group_85196] +[group_85197] +[group_85198] +[group_85199] +[group_85200] +[group_85201] +[group_85202] +[group_85203] +[group_85204] +[group_85205] +[group_85206] +[group_85207] +[group_85208] +[group_85209] +[group_85210] +[group_85211] +[group_85212] +[group_85213] +[group_85214] +[group_85215] +[group_85216] +[group_85217] +[group_85218] +[group_85219] +[group_85220] +[group_85221] +[group_85222] +[group_85223] +[group_85224] +[group_85225] +[group_85226] +[group_85227] +[group_85228] +[group_85229] +[group_85230] +[group_85231] +[group_85232] +[group_85233] +[group_85234] +[group_85235] +[group_85236] +[group_85237] +[group_85238] +[group_85239] +[group_85240] +[group_85241] +[group_85242] +[group_85243] +[group_85244] +[group_85245] +[group_85246] +[group_85247] +[group_85248] +[group_85249] +[group_85250] +[group_85251] +[group_85252] +[group_85253] +[group_85254] +[group_85255] +[group_85256] +[group_85257] +[group_85258] +[group_85259] +[group_85260] +[group_85261] +[group_85262] +[group_85263] +[group_85264] +[group_85265] +[group_85266] +[group_85267] +[group_85268] +[group_85269] +[group_85270] +[group_85271] +[group_85272] +[group_85273] +[group_85274] +[group_85275] +[group_85276] +[group_85277] +[group_85278] +[group_85279] +[group_85280] +[group_85281] +[group_85282] +[group_85283] +[group_85284] +[group_85285] +[group_85286] +[group_85287] +[group_85288] +[group_85289] +[group_85290] +[group_85291] +[group_85292] +[group_85293] +[group_85294] +[group_85295] +[group_85296] +[group_85297] +[group_85298] +[group_85299] +[group_85300] +[group_85301] +[group_85302] +[group_85303] +[group_85304] +[group_85305] +[group_85306] +[group_85307] +[group_85308] +[group_85309] +[group_85310] +[group_85311] +[group_85312] +[group_85313] +[group_85314] +[group_85315] +[group_85316] +[group_85317] +[group_85318] +[group_85319] +[group_85320] +[group_85321] +[group_85322] +[group_85323] +[group_85324] +[group_85325] +[group_85326] +[group_85327] +[group_85328] +[group_85329] +[group_85330] +[group_85331] +[group_85332] +[group_85333] +[group_85334] +[group_85335] +[group_85336] +[group_85337] +[group_85338] +[group_85339] +[group_85340] +[group_85341] +[group_85342] +[group_85343] +[group_85344] +[group_85345] +[group_85346] +[group_85347] +[group_85348] +[group_85349] +[group_85350] +[group_85351] +[group_85352] +[group_85353] +[group_85354] +[group_85355] +[group_85356] +[group_85357] +[group_85358] +[group_85359] +[group_85360] +[group_85361] +[group_85362] +[group_85363] +[group_85364] +[group_85365] +[group_85366] +[group_85367] +[group_85368] +[group_85369] +[group_85370] +[group_85371] +[group_85372] +[group_85373] +[group_85374] +[group_85375] +[group_85376] +[group_85377] +[group_85378] +[group_85379] +[group_85380] +[group_85381] +[group_85382] +[group_85383] +[group_85384] +[group_85385] +[group_85386] +[group_85387] +[group_85388] +[group_85389] +[group_85390] +[group_85391] +[group_85392] +[group_85393] +[group_85394] +[group_85395] +[group_85396] +[group_85397] +[group_85398] +[group_85399] +[group_85400] +[group_85401] +[group_85402] +[group_85403] +[group_85404] +[group_85405] +[group_85406] +[group_85407] +[group_85408] +[group_85409] +[group_85410] +[group_85411] +[group_85412] +[group_85413] +[group_85414] +[group_85415] +[group_85416] +[group_85417] +[group_85418] +[group_85419] +[group_85420] +[group_85421] +[group_85422] +[group_85423] +[group_85424] +[group_85425] +[group_85426] +[group_85427] +[group_85428] +[group_85429] +[group_85430] +[group_85431] +[group_85432] +[group_85433] +[group_85434] +[group_85435] +[group_85436] +[group_85437] +[group_85438] +[group_85439] +[group_85440] +[group_85441] +[group_85442] +[group_85443] +[group_85444] +[group_85445] +[group_85446] +[group_85447] +[group_85448] +[group_85449] +[group_85450] +[group_85451] +[group_85452] +[group_85453] +[group_85454] +[group_85455] +[group_85456] +[group_85457] +[group_85458] +[group_85459] +[group_85460] +[group_85461] +[group_85462] +[group_85463] +[group_85464] +[group_85465] +[group_85466] +[group_85467] +[group_85468] +[group_85469] +[group_85470] +[group_85471] +[group_85472] +[group_85473] +[group_85474] +[group_85475] +[group_85476] +[group_85477] +[group_85478] +[group_85479] +[group_85480] +[group_85481] +[group_85482] +[group_85483] +[group_85484] +[group_85485] +[group_85486] +[group_85487] +[group_85488] +[group_85489] +[group_85490] +[group_85491] +[group_85492] +[group_85493] +[group_85494] +[group_85495] +[group_85496] +[group_85497] +[group_85498] +[group_85499] +[group_85500] +[group_85501] +[group_85502] +[group_85503] +[group_85504] +[group_85505] +[group_85506] +[group_85507] +[group_85508] +[group_85509] +[group_85510] +[group_85511] +[group_85512] +[group_85513] +[group_85514] +[group_85515] +[group_85516] +[group_85517] +[group_85518] +[group_85519] +[group_85520] +[group_85521] +[group_85522] +[group_85523] +[group_85524] +[group_85525] +[group_85526] +[group_85527] +[group_85528] +[group_85529] +[group_85530] +[group_85531] +[group_85532] +[group_85533] +[group_85534] +[group_85535] +[group_85536] +[group_85537] +[group_85538] +[group_85539] +[group_85540] +[group_85541] +[group_85542] +[group_85543] +[group_85544] +[group_85545] +[group_85546] +[group_85547] +[group_85548] +[group_85549] +[group_85550] +[group_85551] +[group_85552] +[group_85553] +[group_85554] +[group_85555] +[group_85556] +[group_85557] +[group_85558] +[group_85559] +[group_85560] +[group_85561] +[group_85562] +[group_85563] +[group_85564] +[group_85565] +[group_85566] +[group_85567] +[group_85568] +[group_85569] +[group_85570] +[group_85571] +[group_85572] +[group_85573] +[group_85574] +[group_85575] +[group_85576] +[group_85577] +[group_85578] +[group_85579] +[group_85580] +[group_85581] +[group_85582] +[group_85583] +[group_85584] +[group_85585] +[group_85586] +[group_85587] +[group_85588] +[group_85589] +[group_85590] +[group_85591] +[group_85592] +[group_85593] +[group_85594] +[group_85595] +[group_85596] +[group_85597] +[group_85598] +[group_85599] +[group_85600] +[group_85601] +[group_85602] +[group_85603] +[group_85604] +[group_85605] +[group_85606] +[group_85607] +[group_85608] +[group_85609] +[group_85610] +[group_85611] +[group_85612] +[group_85613] +[group_85614] +[group_85615] +[group_85616] +[group_85617] +[group_85618] +[group_85619] +[group_85620] +[group_85621] +[group_85622] +[group_85623] +[group_85624] +[group_85625] +[group_85626] +[group_85627] +[group_85628] +[group_85629] +[group_85630] +[group_85631] +[group_85632] +[group_85633] +[group_85634] +[group_85635] +[group_85636] +[group_85637] +[group_85638] +[group_85639] +[group_85640] +[group_85641] +[group_85642] +[group_85643] +[group_85644] +[group_85645] +[group_85646] +[group_85647] +[group_85648] +[group_85649] +[group_85650] +[group_85651] +[group_85652] +[group_85653] +[group_85654] +[group_85655] +[group_85656] +[group_85657] +[group_85658] +[group_85659] +[group_85660] +[group_85661] +[group_85662] +[group_85663] +[group_85664] +[group_85665] +[group_85666] +[group_85667] +[group_85668] +[group_85669] +[group_85670] +[group_85671] +[group_85672] +[group_85673] +[group_85674] +[group_85675] +[group_85676] +[group_85677] +[group_85678] +[group_85679] +[group_85680] +[group_85681] +[group_85682] +[group_85683] +[group_85684] +[group_85685] +[group_85686] +[group_85687] +[group_85688] +[group_85689] +[group_85690] +[group_85691] +[group_85692] +[group_85693] +[group_85694] +[group_85695] +[group_85696] +[group_85697] +[group_85698] +[group_85699] +[group_85700] +[group_85701] +[group_85702] +[group_85703] +[group_85704] +[group_85705] +[group_85706] +[group_85707] +[group_85708] +[group_85709] +[group_85710] +[group_85711] +[group_85712] +[group_85713] +[group_85714] +[group_85715] +[group_85716] +[group_85717] +[group_85718] +[group_85719] +[group_85720] +[group_85721] +[group_85722] +[group_85723] +[group_85724] +[group_85725] +[group_85726] +[group_85727] +[group_85728] +[group_85729] +[group_85730] +[group_85731] +[group_85732] +[group_85733] +[group_85734] +[group_85735] +[group_85736] +[group_85737] +[group_85738] +[group_85739] +[group_85740] +[group_85741] +[group_85742] +[group_85743] +[group_85744] +[group_85745] +[group_85746] +[group_85747] +[group_85748] +[group_85749] +[group_85750] +[group_85751] +[group_85752] +[group_85753] +[group_85754] +[group_85755] +[group_85756] +[group_85757] +[group_85758] +[group_85759] +[group_85760] +[group_85761] +[group_85762] +[group_85763] +[group_85764] +[group_85765] +[group_85766] +[group_85767] +[group_85768] +[group_85769] +[group_85770] +[group_85771] +[group_85772] +[group_85773] +[group_85774] +[group_85775] +[group_85776] +[group_85777] +[group_85778] +[group_85779] +[group_85780] +[group_85781] +[group_85782] +[group_85783] +[group_85784] +[group_85785] +[group_85786] +[group_85787] +[group_85788] +[group_85789] +[group_85790] +[group_85791] +[group_85792] +[group_85793] +[group_85794] +[group_85795] +[group_85796] +[group_85797] +[group_85798] +[group_85799] +[group_85800] +[group_85801] +[group_85802] +[group_85803] +[group_85804] +[group_85805] +[group_85806] +[group_85807] +[group_85808] +[group_85809] +[group_85810] +[group_85811] +[group_85812] +[group_85813] +[group_85814] +[group_85815] +[group_85816] +[group_85817] +[group_85818] +[group_85819] +[group_85820] +[group_85821] +[group_85822] +[group_85823] +[group_85824] +[group_85825] +[group_85826] +[group_85827] +[group_85828] +[group_85829] +[group_85830] +[group_85831] +[group_85832] +[group_85833] +[group_85834] +[group_85835] +[group_85836] +[group_85837] +[group_85838] +[group_85839] +[group_85840] +[group_85841] +[group_85842] +[group_85843] +[group_85844] +[group_85845] +[group_85846] +[group_85847] +[group_85848] +[group_85849] +[group_85850] +[group_85851] +[group_85852] +[group_85853] +[group_85854] +[group_85855] +[group_85856] +[group_85857] +[group_85858] +[group_85859] +[group_85860] +[group_85861] +[group_85862] +[group_85863] +[group_85864] +[group_85865] +[group_85866] +[group_85867] +[group_85868] +[group_85869] +[group_85870] +[group_85871] +[group_85872] +[group_85873] +[group_85874] +[group_85875] +[group_85876] +[group_85877] +[group_85878] +[group_85879] +[group_85880] +[group_85881] +[group_85882] +[group_85883] +[group_85884] +[group_85885] +[group_85886] +[group_85887] +[group_85888] +[group_85889] +[group_85890] +[group_85891] +[group_85892] +[group_85893] +[group_85894] +[group_85895] +[group_85896] +[group_85897] +[group_85898] +[group_85899] +[group_85900] +[group_85901] +[group_85902] +[group_85903] +[group_85904] +[group_85905] +[group_85906] +[group_85907] +[group_85908] +[group_85909] +[group_85910] +[group_85911] +[group_85912] +[group_85913] +[group_85914] +[group_85915] +[group_85916] +[group_85917] +[group_85918] +[group_85919] +[group_85920] +[group_85921] +[group_85922] +[group_85923] +[group_85924] +[group_85925] +[group_85926] +[group_85927] +[group_85928] +[group_85929] +[group_85930] +[group_85931] +[group_85932] +[group_85933] +[group_85934] +[group_85935] +[group_85936] +[group_85937] +[group_85938] +[group_85939] +[group_85940] +[group_85941] +[group_85942] +[group_85943] +[group_85944] +[group_85945] +[group_85946] +[group_85947] +[group_85948] +[group_85949] +[group_85950] +[group_85951] +[group_85952] +[group_85953] +[group_85954] +[group_85955] +[group_85956] +[group_85957] +[group_85958] +[group_85959] +[group_85960] +[group_85961] +[group_85962] +[group_85963] +[group_85964] +[group_85965] +[group_85966] +[group_85967] +[group_85968] +[group_85969] +[group_85970] +[group_85971] +[group_85972] +[group_85973] +[group_85974] +[group_85975] +[group_85976] +[group_85977] +[group_85978] +[group_85979] +[group_85980] +[group_85981] +[group_85982] +[group_85983] +[group_85984] +[group_85985] +[group_85986] +[group_85987] +[group_85988] +[group_85989] +[group_85990] +[group_85991] +[group_85992] +[group_85993] +[group_85994] +[group_85995] +[group_85996] +[group_85997] +[group_85998] +[group_85999] +[group_86000] +[group_86001] +[group_86002] +[group_86003] +[group_86004] +[group_86005] +[group_86006] +[group_86007] +[group_86008] +[group_86009] +[group_86010] +[group_86011] +[group_86012] +[group_86013] +[group_86014] +[group_86015] +[group_86016] +[group_86017] +[group_86018] +[group_86019] +[group_86020] +[group_86021] +[group_86022] +[group_86023] +[group_86024] +[group_86025] +[group_86026] +[group_86027] +[group_86028] +[group_86029] +[group_86030] +[group_86031] +[group_86032] +[group_86033] +[group_86034] +[group_86035] +[group_86036] +[group_86037] +[group_86038] +[group_86039] +[group_86040] +[group_86041] +[group_86042] +[group_86043] +[group_86044] +[group_86045] +[group_86046] +[group_86047] +[group_86048] +[group_86049] +[group_86050] +[group_86051] +[group_86052] +[group_86053] +[group_86054] +[group_86055] +[group_86056] +[group_86057] +[group_86058] +[group_86059] +[group_86060] +[group_86061] +[group_86062] +[group_86063] +[group_86064] +[group_86065] +[group_86066] +[group_86067] +[group_86068] +[group_86069] +[group_86070] +[group_86071] +[group_86072] +[group_86073] +[group_86074] +[group_86075] +[group_86076] +[group_86077] +[group_86078] +[group_86079] +[group_86080] +[group_86081] +[group_86082] +[group_86083] +[group_86084] +[group_86085] +[group_86086] +[group_86087] +[group_86088] +[group_86089] +[group_86090] +[group_86091] +[group_86092] +[group_86093] +[group_86094] +[group_86095] +[group_86096] +[group_86097] +[group_86098] +[group_86099] +[group_86100] +[group_86101] +[group_86102] +[group_86103] +[group_86104] +[group_86105] +[group_86106] +[group_86107] +[group_86108] +[group_86109] +[group_86110] +[group_86111] +[group_86112] +[group_86113] +[group_86114] +[group_86115] +[group_86116] +[group_86117] +[group_86118] +[group_86119] +[group_86120] +[group_86121] +[group_86122] +[group_86123] +[group_86124] +[group_86125] +[group_86126] +[group_86127] +[group_86128] +[group_86129] +[group_86130] +[group_86131] +[group_86132] +[group_86133] +[group_86134] +[group_86135] +[group_86136] +[group_86137] +[group_86138] +[group_86139] +[group_86140] +[group_86141] +[group_86142] +[group_86143] +[group_86144] +[group_86145] +[group_86146] +[group_86147] +[group_86148] +[group_86149] +[group_86150] +[group_86151] +[group_86152] +[group_86153] +[group_86154] +[group_86155] +[group_86156] +[group_86157] +[group_86158] +[group_86159] +[group_86160] +[group_86161] +[group_86162] +[group_86163] +[group_86164] +[group_86165] +[group_86166] +[group_86167] +[group_86168] +[group_86169] +[group_86170] +[group_86171] +[group_86172] +[group_86173] +[group_86174] +[group_86175] +[group_86176] +[group_86177] +[group_86178] +[group_86179] +[group_86180] +[group_86181] +[group_86182] +[group_86183] +[group_86184] +[group_86185] +[group_86186] +[group_86187] +[group_86188] +[group_86189] +[group_86190] +[group_86191] +[group_86192] +[group_86193] +[group_86194] +[group_86195] +[group_86196] +[group_86197] +[group_86198] +[group_86199] +[group_86200] +[group_86201] +[group_86202] +[group_86203] +[group_86204] +[group_86205] +[group_86206] +[group_86207] +[group_86208] +[group_86209] +[group_86210] +[group_86211] +[group_86212] +[group_86213] +[group_86214] +[group_86215] +[group_86216] +[group_86217] +[group_86218] +[group_86219] +[group_86220] +[group_86221] +[group_86222] +[group_86223] +[group_86224] +[group_86225] +[group_86226] +[group_86227] +[group_86228] +[group_86229] +[group_86230] +[group_86231] +[group_86232] +[group_86233] +[group_86234] +[group_86235] +[group_86236] +[group_86237] +[group_86238] +[group_86239] +[group_86240] +[group_86241] +[group_86242] +[group_86243] +[group_86244] +[group_86245] +[group_86246] +[group_86247] +[group_86248] +[group_86249] +[group_86250] +[group_86251] +[group_86252] +[group_86253] +[group_86254] +[group_86255] +[group_86256] +[group_86257] +[group_86258] +[group_86259] +[group_86260] +[group_86261] +[group_86262] +[group_86263] +[group_86264] +[group_86265] +[group_86266] +[group_86267] +[group_86268] +[group_86269] +[group_86270] +[group_86271] +[group_86272] +[group_86273] +[group_86274] +[group_86275] +[group_86276] +[group_86277] +[group_86278] +[group_86279] +[group_86280] +[group_86281] +[group_86282] +[group_86283] +[group_86284] +[group_86285] +[group_86286] +[group_86287] +[group_86288] +[group_86289] +[group_86290] +[group_86291] +[group_86292] +[group_86293] +[group_86294] +[group_86295] +[group_86296] +[group_86297] +[group_86298] +[group_86299] +[group_86300] +[group_86301] +[group_86302] +[group_86303] +[group_86304] +[group_86305] +[group_86306] +[group_86307] +[group_86308] +[group_86309] +[group_86310] +[group_86311] +[group_86312] +[group_86313] +[group_86314] +[group_86315] +[group_86316] +[group_86317] +[group_86318] +[group_86319] +[group_86320] +[group_86321] +[group_86322] +[group_86323] +[group_86324] +[group_86325] +[group_86326] +[group_86327] +[group_86328] +[group_86329] +[group_86330] +[group_86331] +[group_86332] +[group_86333] +[group_86334] +[group_86335] +[group_86336] +[group_86337] +[group_86338] +[group_86339] +[group_86340] +[group_86341] +[group_86342] +[group_86343] +[group_86344] +[group_86345] +[group_86346] +[group_86347] +[group_86348] +[group_86349] +[group_86350] +[group_86351] +[group_86352] +[group_86353] +[group_86354] +[group_86355] +[group_86356] +[group_86357] +[group_86358] +[group_86359] +[group_86360] +[group_86361] +[group_86362] +[group_86363] +[group_86364] +[group_86365] +[group_86366] +[group_86367] +[group_86368] +[group_86369] +[group_86370] +[group_86371] +[group_86372] +[group_86373] +[group_86374] +[group_86375] +[group_86376] +[group_86377] +[group_86378] +[group_86379] +[group_86380] +[group_86381] +[group_86382] +[group_86383] +[group_86384] +[group_86385] +[group_86386] +[group_86387] +[group_86388] +[group_86389] +[group_86390] +[group_86391] +[group_86392] +[group_86393] +[group_86394] +[group_86395] +[group_86396] +[group_86397] +[group_86398] +[group_86399] +[group_86400] +[group_86401] +[group_86402] +[group_86403] +[group_86404] +[group_86405] +[group_86406] +[group_86407] +[group_86408] +[group_86409] +[group_86410] +[group_86411] +[group_86412] +[group_86413] +[group_86414] +[group_86415] +[group_86416] +[group_86417] +[group_86418] +[group_86419] +[group_86420] +[group_86421] +[group_86422] +[group_86423] +[group_86424] +[group_86425] +[group_86426] +[group_86427] +[group_86428] +[group_86429] +[group_86430] +[group_86431] +[group_86432] +[group_86433] +[group_86434] +[group_86435] +[group_86436] +[group_86437] +[group_86438] +[group_86439] +[group_86440] +[group_86441] +[group_86442] +[group_86443] +[group_86444] +[group_86445] +[group_86446] +[group_86447] +[group_86448] +[group_86449] +[group_86450] +[group_86451] +[group_86452] +[group_86453] +[group_86454] +[group_86455] +[group_86456] +[group_86457] +[group_86458] +[group_86459] +[group_86460] +[group_86461] +[group_86462] +[group_86463] +[group_86464] +[group_86465] +[group_86466] +[group_86467] +[group_86468] +[group_86469] +[group_86470] +[group_86471] +[group_86472] +[group_86473] +[group_86474] +[group_86475] +[group_86476] +[group_86477] +[group_86478] +[group_86479] +[group_86480] +[group_86481] +[group_86482] +[group_86483] +[group_86484] +[group_86485] +[group_86486] +[group_86487] +[group_86488] +[group_86489] +[group_86490] +[group_86491] +[group_86492] +[group_86493] +[group_86494] +[group_86495] +[group_86496] +[group_86497] +[group_86498] +[group_86499] +[group_86500] +[group_86501] +[group_86502] +[group_86503] +[group_86504] +[group_86505] +[group_86506] +[group_86507] +[group_86508] +[group_86509] +[group_86510] +[group_86511] +[group_86512] +[group_86513] +[group_86514] +[group_86515] +[group_86516] +[group_86517] +[group_86518] +[group_86519] +[group_86520] +[group_86521] +[group_86522] +[group_86523] +[group_86524] +[group_86525] +[group_86526] +[group_86527] +[group_86528] +[group_86529] +[group_86530] +[group_86531] +[group_86532] +[group_86533] +[group_86534] +[group_86535] +[group_86536] +[group_86537] +[group_86538] +[group_86539] +[group_86540] +[group_86541] +[group_86542] +[group_86543] +[group_86544] +[group_86545] +[group_86546] +[group_86547] +[group_86548] +[group_86549] +[group_86550] +[group_86551] +[group_86552] +[group_86553] +[group_86554] +[group_86555] +[group_86556] +[group_86557] +[group_86558] +[group_86559] +[group_86560] +[group_86561] +[group_86562] +[group_86563] +[group_86564] +[group_86565] +[group_86566] +[group_86567] +[group_86568] +[group_86569] +[group_86570] +[group_86571] +[group_86572] +[group_86573] +[group_86574] +[group_86575] +[group_86576] +[group_86577] +[group_86578] +[group_86579] +[group_86580] +[group_86581] +[group_86582] +[group_86583] +[group_86584] +[group_86585] +[group_86586] +[group_86587] +[group_86588] +[group_86589] +[group_86590] +[group_86591] +[group_86592] +[group_86593] +[group_86594] +[group_86595] +[group_86596] +[group_86597] +[group_86598] +[group_86599] +[group_86600] +[group_86601] +[group_86602] +[group_86603] +[group_86604] +[group_86605] +[group_86606] +[group_86607] +[group_86608] +[group_86609] +[group_86610] +[group_86611] +[group_86612] +[group_86613] +[group_86614] +[group_86615] +[group_86616] +[group_86617] +[group_86618] +[group_86619] +[group_86620] +[group_86621] +[group_86622] +[group_86623] +[group_86624] +[group_86625] +[group_86626] +[group_86627] +[group_86628] +[group_86629] +[group_86630] +[group_86631] +[group_86632] +[group_86633] +[group_86634] +[group_86635] +[group_86636] +[group_86637] +[group_86638] +[group_86639] +[group_86640] +[group_86641] +[group_86642] +[group_86643] +[group_86644] +[group_86645] +[group_86646] +[group_86647] +[group_86648] +[group_86649] +[group_86650] +[group_86651] +[group_86652] +[group_86653] +[group_86654] +[group_86655] +[group_86656] +[group_86657] +[group_86658] +[group_86659] +[group_86660] +[group_86661] +[group_86662] +[group_86663] +[group_86664] +[group_86665] +[group_86666] +[group_86667] +[group_86668] +[group_86669] +[group_86670] +[group_86671] +[group_86672] +[group_86673] +[group_86674] +[group_86675] +[group_86676] +[group_86677] +[group_86678] +[group_86679] +[group_86680] +[group_86681] +[group_86682] +[group_86683] +[group_86684] +[group_86685] +[group_86686] +[group_86687] +[group_86688] +[group_86689] +[group_86690] +[group_86691] +[group_86692] +[group_86693] +[group_86694] +[group_86695] +[group_86696] +[group_86697] +[group_86698] +[group_86699] +[group_86700] +[group_86701] +[group_86702] +[group_86703] +[group_86704] +[group_86705] +[group_86706] +[group_86707] +[group_86708] +[group_86709] +[group_86710] +[group_86711] +[group_86712] +[group_86713] +[group_86714] +[group_86715] +[group_86716] +[group_86717] +[group_86718] +[group_86719] +[group_86720] +[group_86721] +[group_86722] +[group_86723] +[group_86724] +[group_86725] +[group_86726] +[group_86727] +[group_86728] +[group_86729] +[group_86730] +[group_86731] +[group_86732] +[group_86733] +[group_86734] +[group_86735] +[group_86736] +[group_86737] +[group_86738] +[group_86739] +[group_86740] +[group_86741] +[group_86742] +[group_86743] +[group_86744] +[group_86745] +[group_86746] +[group_86747] +[group_86748] +[group_86749] +[group_86750] +[group_86751] +[group_86752] +[group_86753] +[group_86754] +[group_86755] +[group_86756] +[group_86757] +[group_86758] +[group_86759] +[group_86760] +[group_86761] +[group_86762] +[group_86763] +[group_86764] +[group_86765] +[group_86766] +[group_86767] +[group_86768] +[group_86769] +[group_86770] +[group_86771] +[group_86772] +[group_86773] +[group_86774] +[group_86775] +[group_86776] +[group_86777] +[group_86778] +[group_86779] +[group_86780] +[group_86781] +[group_86782] +[group_86783] +[group_86784] +[group_86785] +[group_86786] +[group_86787] +[group_86788] +[group_86789] +[group_86790] +[group_86791] +[group_86792] +[group_86793] +[group_86794] +[group_86795] +[group_86796] +[group_86797] +[group_86798] +[group_86799] +[group_86800] +[group_86801] +[group_86802] +[group_86803] +[group_86804] +[group_86805] +[group_86806] +[group_86807] +[group_86808] +[group_86809] +[group_86810] +[group_86811] +[group_86812] +[group_86813] +[group_86814] +[group_86815] +[group_86816] +[group_86817] +[group_86818] +[group_86819] +[group_86820] +[group_86821] +[group_86822] +[group_86823] +[group_86824] +[group_86825] +[group_86826] +[group_86827] +[group_86828] +[group_86829] +[group_86830] +[group_86831] +[group_86832] +[group_86833] +[group_86834] +[group_86835] +[group_86836] +[group_86837] +[group_86838] +[group_86839] +[group_86840] +[group_86841] +[group_86842] +[group_86843] +[group_86844] +[group_86845] +[group_86846] +[group_86847] +[group_86848] +[group_86849] +[group_86850] +[group_86851] +[group_86852] +[group_86853] +[group_86854] +[group_86855] +[group_86856] +[group_86857] +[group_86858] +[group_86859] +[group_86860] +[group_86861] +[group_86862] +[group_86863] +[group_86864] +[group_86865] +[group_86866] +[group_86867] +[group_86868] +[group_86869] +[group_86870] +[group_86871] +[group_86872] +[group_86873] +[group_86874] +[group_86875] +[group_86876] +[group_86877] +[group_86878] +[group_86879] +[group_86880] +[group_86881] +[group_86882] +[group_86883] +[group_86884] +[group_86885] +[group_86886] +[group_86887] +[group_86888] +[group_86889] +[group_86890] +[group_86891] +[group_86892] +[group_86893] +[group_86894] +[group_86895] +[group_86896] +[group_86897] +[group_86898] +[group_86899] +[group_86900] +[group_86901] +[group_86902] +[group_86903] +[group_86904] +[group_86905] +[group_86906] +[group_86907] +[group_86908] +[group_86909] +[group_86910] +[group_86911] +[group_86912] +[group_86913] +[group_86914] +[group_86915] +[group_86916] +[group_86917] +[group_86918] +[group_86919] +[group_86920] +[group_86921] +[group_86922] +[group_86923] +[group_86924] +[group_86925] +[group_86926] +[group_86927] +[group_86928] +[group_86929] +[group_86930] +[group_86931] +[group_86932] +[group_86933] +[group_86934] +[group_86935] +[group_86936] +[group_86937] +[group_86938] +[group_86939] +[group_86940] +[group_86941] +[group_86942] +[group_86943] +[group_86944] +[group_86945] +[group_86946] +[group_86947] +[group_86948] +[group_86949] +[group_86950] +[group_86951] +[group_86952] +[group_86953] +[group_86954] +[group_86955] +[group_86956] +[group_86957] +[group_86958] +[group_86959] +[group_86960] +[group_86961] +[group_86962] +[group_86963] +[group_86964] +[group_86965] +[group_86966] +[group_86967] +[group_86968] +[group_86969] +[group_86970] +[group_86971] +[group_86972] +[group_86973] +[group_86974] +[group_86975] +[group_86976] +[group_86977] +[group_86978] +[group_86979] +[group_86980] +[group_86981] +[group_86982] +[group_86983] +[group_86984] +[group_86985] +[group_86986] +[group_86987] +[group_86988] +[group_86989] +[group_86990] +[group_86991] +[group_86992] +[group_86993] +[group_86994] +[group_86995] +[group_86996] +[group_86997] +[group_86998] +[group_86999] +[group_87000] +[group_87001] +[group_87002] +[group_87003] +[group_87004] +[group_87005] +[group_87006] +[group_87007] +[group_87008] +[group_87009] +[group_87010] +[group_87011] +[group_87012] +[group_87013] +[group_87014] +[group_87015] +[group_87016] +[group_87017] +[group_87018] +[group_87019] +[group_87020] +[group_87021] +[group_87022] +[group_87023] +[group_87024] +[group_87025] +[group_87026] +[group_87027] +[group_87028] +[group_87029] +[group_87030] +[group_87031] +[group_87032] +[group_87033] +[group_87034] +[group_87035] +[group_87036] +[group_87037] +[group_87038] +[group_87039] +[group_87040] +[group_87041] +[group_87042] +[group_87043] +[group_87044] +[group_87045] +[group_87046] +[group_87047] +[group_87048] +[group_87049] +[group_87050] +[group_87051] +[group_87052] +[group_87053] +[group_87054] +[group_87055] +[group_87056] +[group_87057] +[group_87058] +[group_87059] +[group_87060] +[group_87061] +[group_87062] +[group_87063] +[group_87064] +[group_87065] +[group_87066] +[group_87067] +[group_87068] +[group_87069] +[group_87070] +[group_87071] +[group_87072] +[group_87073] +[group_87074] +[group_87075] +[group_87076] +[group_87077] +[group_87078] +[group_87079] +[group_87080] +[group_87081] +[group_87082] +[group_87083] +[group_87084] +[group_87085] +[group_87086] +[group_87087] +[group_87088] +[group_87089] +[group_87090] +[group_87091] +[group_87092] +[group_87093] +[group_87094] +[group_87095] +[group_87096] +[group_87097] +[group_87098] +[group_87099] +[group_87100] +[group_87101] +[group_87102] +[group_87103] +[group_87104] +[group_87105] +[group_87106] +[group_87107] +[group_87108] +[group_87109] +[group_87110] +[group_87111] +[group_87112] +[group_87113] +[group_87114] +[group_87115] +[group_87116] +[group_87117] +[group_87118] +[group_87119] +[group_87120] +[group_87121] +[group_87122] +[group_87123] +[group_87124] +[group_87125] +[group_87126] +[group_87127] +[group_87128] +[group_87129] +[group_87130] +[group_87131] +[group_87132] +[group_87133] +[group_87134] +[group_87135] +[group_87136] +[group_87137] +[group_87138] +[group_87139] +[group_87140] +[group_87141] +[group_87142] +[group_87143] +[group_87144] +[group_87145] +[group_87146] +[group_87147] +[group_87148] +[group_87149] +[group_87150] +[group_87151] +[group_87152] +[group_87153] +[group_87154] +[group_87155] +[group_87156] +[group_87157] +[group_87158] +[group_87159] +[group_87160] +[group_87161] +[group_87162] +[group_87163] +[group_87164] +[group_87165] +[group_87166] +[group_87167] +[group_87168] +[group_87169] +[group_87170] +[group_87171] +[group_87172] +[group_87173] +[group_87174] +[group_87175] +[group_87176] +[group_87177] +[group_87178] +[group_87179] +[group_87180] +[group_87181] +[group_87182] +[group_87183] +[group_87184] +[group_87185] +[group_87186] +[group_87187] +[group_87188] +[group_87189] +[group_87190] +[group_87191] +[group_87192] +[group_87193] +[group_87194] +[group_87195] +[group_87196] +[group_87197] +[group_87198] +[group_87199] +[group_87200] +[group_87201] +[group_87202] +[group_87203] +[group_87204] +[group_87205] +[group_87206] +[group_87207] +[group_87208] +[group_87209] +[group_87210] +[group_87211] +[group_87212] +[group_87213] +[group_87214] +[group_87215] +[group_87216] +[group_87217] +[group_87218] +[group_87219] +[group_87220] +[group_87221] +[group_87222] +[group_87223] +[group_87224] +[group_87225] +[group_87226] +[group_87227] +[group_87228] +[group_87229] +[group_87230] +[group_87231] +[group_87232] +[group_87233] +[group_87234] +[group_87235] +[group_87236] +[group_87237] +[group_87238] +[group_87239] +[group_87240] +[group_87241] +[group_87242] +[group_87243] +[group_87244] +[group_87245] +[group_87246] +[group_87247] +[group_87248] +[group_87249] +[group_87250] +[group_87251] +[group_87252] +[group_87253] +[group_87254] +[group_87255] +[group_87256] +[group_87257] +[group_87258] +[group_87259] +[group_87260] +[group_87261] +[group_87262] +[group_87263] +[group_87264] +[group_87265] +[group_87266] +[group_87267] +[group_87268] +[group_87269] +[group_87270] +[group_87271] +[group_87272] +[group_87273] +[group_87274] +[group_87275] +[group_87276] +[group_87277] +[group_87278] +[group_87279] +[group_87280] +[group_87281] +[group_87282] +[group_87283] +[group_87284] +[group_87285] +[group_87286] +[group_87287] +[group_87288] +[group_87289] +[group_87290] +[group_87291] +[group_87292] +[group_87293] +[group_87294] +[group_87295] +[group_87296] +[group_87297] +[group_87298] +[group_87299] +[group_87300] +[group_87301] +[group_87302] +[group_87303] +[group_87304] +[group_87305] +[group_87306] +[group_87307] +[group_87308] +[group_87309] +[group_87310] +[group_87311] +[group_87312] +[group_87313] +[group_87314] +[group_87315] +[group_87316] +[group_87317] +[group_87318] +[group_87319] +[group_87320] +[group_87321] +[group_87322] +[group_87323] +[group_87324] +[group_87325] +[group_87326] +[group_87327] +[group_87328] +[group_87329] +[group_87330] +[group_87331] +[group_87332] +[group_87333] +[group_87334] +[group_87335] +[group_87336] +[group_87337] +[group_87338] +[group_87339] +[group_87340] +[group_87341] +[group_87342] +[group_87343] +[group_87344] +[group_87345] +[group_87346] +[group_87347] +[group_87348] +[group_87349] +[group_87350] +[group_87351] +[group_87352] +[group_87353] +[group_87354] +[group_87355] +[group_87356] +[group_87357] +[group_87358] +[group_87359] +[group_87360] +[group_87361] +[group_87362] +[group_87363] +[group_87364] +[group_87365] +[group_87366] +[group_87367] +[group_87368] +[group_87369] +[group_87370] +[group_87371] +[group_87372] +[group_87373] +[group_87374] +[group_87375] +[group_87376] +[group_87377] +[group_87378] +[group_87379] +[group_87380] +[group_87381] +[group_87382] +[group_87383] +[group_87384] +[group_87385] +[group_87386] +[group_87387] +[group_87388] +[group_87389] +[group_87390] +[group_87391] +[group_87392] +[group_87393] +[group_87394] +[group_87395] +[group_87396] +[group_87397] +[group_87398] +[group_87399] +[group_87400] +[group_87401] +[group_87402] +[group_87403] +[group_87404] +[group_87405] +[group_87406] +[group_87407] +[group_87408] +[group_87409] +[group_87410] +[group_87411] +[group_87412] +[group_87413] +[group_87414] +[group_87415] +[group_87416] +[group_87417] +[group_87418] +[group_87419] +[group_87420] +[group_87421] +[group_87422] +[group_87423] +[group_87424] +[group_87425] +[group_87426] +[group_87427] +[group_87428] +[group_87429] +[group_87430] +[group_87431] +[group_87432] +[group_87433] +[group_87434] +[group_87435] +[group_87436] +[group_87437] +[group_87438] +[group_87439] +[group_87440] +[group_87441] +[group_87442] +[group_87443] +[group_87444] +[group_87445] +[group_87446] +[group_87447] +[group_87448] +[group_87449] +[group_87450] +[group_87451] +[group_87452] +[group_87453] +[group_87454] +[group_87455] +[group_87456] +[group_87457] +[group_87458] +[group_87459] +[group_87460] +[group_87461] +[group_87462] +[group_87463] +[group_87464] +[group_87465] +[group_87466] +[group_87467] +[group_87468] +[group_87469] +[group_87470] +[group_87471] +[group_87472] +[group_87473] +[group_87474] +[group_87475] +[group_87476] +[group_87477] +[group_87478] +[group_87479] +[group_87480] +[group_87481] +[group_87482] +[group_87483] +[group_87484] +[group_87485] +[group_87486] +[group_87487] +[group_87488] +[group_87489] +[group_87490] +[group_87491] +[group_87492] +[group_87493] +[group_87494] +[group_87495] +[group_87496] +[group_87497] +[group_87498] +[group_87499] +[group_87500] +[group_87501] +[group_87502] +[group_87503] +[group_87504] +[group_87505] +[group_87506] +[group_87507] +[group_87508] +[group_87509] +[group_87510] +[group_87511] +[group_87512] +[group_87513] +[group_87514] +[group_87515] +[group_87516] +[group_87517] +[group_87518] +[group_87519] +[group_87520] +[group_87521] +[group_87522] +[group_87523] +[group_87524] +[group_87525] +[group_87526] +[group_87527] +[group_87528] +[group_87529] +[group_87530] +[group_87531] +[group_87532] +[group_87533] +[group_87534] +[group_87535] +[group_87536] +[group_87537] +[group_87538] +[group_87539] +[group_87540] +[group_87541] +[group_87542] +[group_87543] +[group_87544] +[group_87545] +[group_87546] +[group_87547] +[group_87548] +[group_87549] +[group_87550] +[group_87551] +[group_87552] +[group_87553] +[group_87554] +[group_87555] +[group_87556] +[group_87557] +[group_87558] +[group_87559] +[group_87560] +[group_87561] +[group_87562] +[group_87563] +[group_87564] +[group_87565] +[group_87566] +[group_87567] +[group_87568] +[group_87569] +[group_87570] +[group_87571] +[group_87572] +[group_87573] +[group_87574] +[group_87575] +[group_87576] +[group_87577] +[group_87578] +[group_87579] +[group_87580] +[group_87581] +[group_87582] +[group_87583] +[group_87584] +[group_87585] +[group_87586] +[group_87587] +[group_87588] +[group_87589] +[group_87590] +[group_87591] +[group_87592] +[group_87593] +[group_87594] +[group_87595] +[group_87596] +[group_87597] +[group_87598] +[group_87599] +[group_87600] +[group_87601] +[group_87602] +[group_87603] +[group_87604] +[group_87605] +[group_87606] +[group_87607] +[group_87608] +[group_87609] +[group_87610] +[group_87611] +[group_87612] +[group_87613] +[group_87614] +[group_87615] +[group_87616] +[group_87617] +[group_87618] +[group_87619] +[group_87620] +[group_87621] +[group_87622] +[group_87623] +[group_87624] +[group_87625] +[group_87626] +[group_87627] +[group_87628] +[group_87629] +[group_87630] +[group_87631] +[group_87632] +[group_87633] +[group_87634] +[group_87635] +[group_87636] +[group_87637] +[group_87638] +[group_87639] +[group_87640] +[group_87641] +[group_87642] +[group_87643] +[group_87644] +[group_87645] +[group_87646] +[group_87647] +[group_87648] +[group_87649] +[group_87650] +[group_87651] +[group_87652] +[group_87653] +[group_87654] +[group_87655] +[group_87656] +[group_87657] +[group_87658] +[group_87659] +[group_87660] +[group_87661] +[group_87662] +[group_87663] +[group_87664] +[group_87665] +[group_87666] +[group_87667] +[group_87668] +[group_87669] +[group_87670] +[group_87671] +[group_87672] +[group_87673] +[group_87674] +[group_87675] +[group_87676] +[group_87677] +[group_87678] +[group_87679] +[group_87680] +[group_87681] +[group_87682] +[group_87683] +[group_87684] +[group_87685] +[group_87686] +[group_87687] +[group_87688] +[group_87689] +[group_87690] +[group_87691] +[group_87692] +[group_87693] +[group_87694] +[group_87695] +[group_87696] +[group_87697] +[group_87698] +[group_87699] +[group_87700] +[group_87701] +[group_87702] +[group_87703] +[group_87704] +[group_87705] +[group_87706] +[group_87707] +[group_87708] +[group_87709] +[group_87710] +[group_87711] +[group_87712] +[group_87713] +[group_87714] +[group_87715] +[group_87716] +[group_87717] +[group_87718] +[group_87719] +[group_87720] +[group_87721] +[group_87722] +[group_87723] +[group_87724] +[group_87725] +[group_87726] +[group_87727] +[group_87728] +[group_87729] +[group_87730] +[group_87731] +[group_87732] +[group_87733] +[group_87734] +[group_87735] +[group_87736] +[group_87737] +[group_87738] +[group_87739] +[group_87740] +[group_87741] +[group_87742] +[group_87743] +[group_87744] +[group_87745] +[group_87746] +[group_87747] +[group_87748] +[group_87749] +[group_87750] +[group_87751] +[group_87752] +[group_87753] +[group_87754] +[group_87755] +[group_87756] +[group_87757] +[group_87758] +[group_87759] +[group_87760] +[group_87761] +[group_87762] +[group_87763] +[group_87764] +[group_87765] +[group_87766] +[group_87767] +[group_87768] +[group_87769] +[group_87770] +[group_87771] +[group_87772] +[group_87773] +[group_87774] +[group_87775] +[group_87776] +[group_87777] +[group_87778] +[group_87779] +[group_87780] +[group_87781] +[group_87782] +[group_87783] +[group_87784] +[group_87785] +[group_87786] +[group_87787] +[group_87788] +[group_87789] +[group_87790] +[group_87791] +[group_87792] +[group_87793] +[group_87794] +[group_87795] +[group_87796] +[group_87797] +[group_87798] +[group_87799] +[group_87800] +[group_87801] +[group_87802] +[group_87803] +[group_87804] +[group_87805] +[group_87806] +[group_87807] +[group_87808] +[group_87809] +[group_87810] +[group_87811] +[group_87812] +[group_87813] +[group_87814] +[group_87815] +[group_87816] +[group_87817] +[group_87818] +[group_87819] +[group_87820] +[group_87821] +[group_87822] +[group_87823] +[group_87824] +[group_87825] +[group_87826] +[group_87827] +[group_87828] +[group_87829] +[group_87830] +[group_87831] +[group_87832] +[group_87833] +[group_87834] +[group_87835] +[group_87836] +[group_87837] +[group_87838] +[group_87839] +[group_87840] +[group_87841] +[group_87842] +[group_87843] +[group_87844] +[group_87845] +[group_87846] +[group_87847] +[group_87848] +[group_87849] +[group_87850] +[group_87851] +[group_87852] +[group_87853] +[group_87854] +[group_87855] +[group_87856] +[group_87857] +[group_87858] +[group_87859] +[group_87860] +[group_87861] +[group_87862] +[group_87863] +[group_87864] +[group_87865] +[group_87866] +[group_87867] +[group_87868] +[group_87869] +[group_87870] +[group_87871] +[group_87872] +[group_87873] +[group_87874] +[group_87875] +[group_87876] +[group_87877] +[group_87878] +[group_87879] +[group_87880] +[group_87881] +[group_87882] +[group_87883] +[group_87884] +[group_87885] +[group_87886] +[group_87887] +[group_87888] +[group_87889] +[group_87890] +[group_87891] +[group_87892] +[group_87893] +[group_87894] +[group_87895] +[group_87896] +[group_87897] +[group_87898] +[group_87899] +[group_87900] +[group_87901] +[group_87902] +[group_87903] +[group_87904] +[group_87905] +[group_87906] +[group_87907] +[group_87908] +[group_87909] +[group_87910] +[group_87911] +[group_87912] +[group_87913] +[group_87914] +[group_87915] +[group_87916] +[group_87917] +[group_87918] +[group_87919] +[group_87920] +[group_87921] +[group_87922] +[group_87923] +[group_87924] +[group_87925] +[group_87926] +[group_87927] +[group_87928] +[group_87929] +[group_87930] +[group_87931] +[group_87932] +[group_87933] +[group_87934] +[group_87935] +[group_87936] +[group_87937] +[group_87938] +[group_87939] +[group_87940] +[group_87941] +[group_87942] +[group_87943] +[group_87944] +[group_87945] +[group_87946] +[group_87947] +[group_87948] +[group_87949] +[group_87950] +[group_87951] +[group_87952] +[group_87953] +[group_87954] +[group_87955] +[group_87956] +[group_87957] +[group_87958] +[group_87959] +[group_87960] +[group_87961] +[group_87962] +[group_87963] +[group_87964] +[group_87965] +[group_87966] +[group_87967] +[group_87968] +[group_87969] +[group_87970] +[group_87971] +[group_87972] +[group_87973] +[group_87974] +[group_87975] +[group_87976] +[group_87977] +[group_87978] +[group_87979] +[group_87980] +[group_87981] +[group_87982] +[group_87983] +[group_87984] +[group_87985] +[group_87986] +[group_87987] +[group_87988] +[group_87989] +[group_87990] +[group_87991] +[group_87992] +[group_87993] +[group_87994] +[group_87995] +[group_87996] +[group_87997] +[group_87998] +[group_87999] +[group_88000] +[group_88001] +[group_88002] +[group_88003] +[group_88004] +[group_88005] +[group_88006] +[group_88007] +[group_88008] +[group_88009] +[group_88010] +[group_88011] +[group_88012] +[group_88013] +[group_88014] +[group_88015] +[group_88016] +[group_88017] +[group_88018] +[group_88019] +[group_88020] +[group_88021] +[group_88022] +[group_88023] +[group_88024] +[group_88025] +[group_88026] +[group_88027] +[group_88028] +[group_88029] +[group_88030] +[group_88031] +[group_88032] +[group_88033] +[group_88034] +[group_88035] +[group_88036] +[group_88037] +[group_88038] +[group_88039] +[group_88040] +[group_88041] +[group_88042] +[group_88043] +[group_88044] +[group_88045] +[group_88046] +[group_88047] +[group_88048] +[group_88049] +[group_88050] +[group_88051] +[group_88052] +[group_88053] +[group_88054] +[group_88055] +[group_88056] +[group_88057] +[group_88058] +[group_88059] +[group_88060] +[group_88061] +[group_88062] +[group_88063] +[group_88064] +[group_88065] +[group_88066] +[group_88067] +[group_88068] +[group_88069] +[group_88070] +[group_88071] +[group_88072] +[group_88073] +[group_88074] +[group_88075] +[group_88076] +[group_88077] +[group_88078] +[group_88079] +[group_88080] +[group_88081] +[group_88082] +[group_88083] +[group_88084] +[group_88085] +[group_88086] +[group_88087] +[group_88088] +[group_88089] +[group_88090] +[group_88091] +[group_88092] +[group_88093] +[group_88094] +[group_88095] +[group_88096] +[group_88097] +[group_88098] +[group_88099] +[group_88100] +[group_88101] +[group_88102] +[group_88103] +[group_88104] +[group_88105] +[group_88106] +[group_88107] +[group_88108] +[group_88109] +[group_88110] +[group_88111] +[group_88112] +[group_88113] +[group_88114] +[group_88115] +[group_88116] +[group_88117] +[group_88118] +[group_88119] +[group_88120] +[group_88121] +[group_88122] +[group_88123] +[group_88124] +[group_88125] +[group_88126] +[group_88127] +[group_88128] +[group_88129] +[group_88130] +[group_88131] +[group_88132] +[group_88133] +[group_88134] +[group_88135] +[group_88136] +[group_88137] +[group_88138] +[group_88139] +[group_88140] +[group_88141] +[group_88142] +[group_88143] +[group_88144] +[group_88145] +[group_88146] +[group_88147] +[group_88148] +[group_88149] +[group_88150] +[group_88151] +[group_88152] +[group_88153] +[group_88154] +[group_88155] +[group_88156] +[group_88157] +[group_88158] +[group_88159] +[group_88160] +[group_88161] +[group_88162] +[group_88163] +[group_88164] +[group_88165] +[group_88166] +[group_88167] +[group_88168] +[group_88169] +[group_88170] +[group_88171] +[group_88172] +[group_88173] +[group_88174] +[group_88175] +[group_88176] +[group_88177] +[group_88178] +[group_88179] +[group_88180] +[group_88181] +[group_88182] +[group_88183] +[group_88184] +[group_88185] +[group_88186] +[group_88187] +[group_88188] +[group_88189] +[group_88190] +[group_88191] +[group_88192] +[group_88193] +[group_88194] +[group_88195] +[group_88196] +[group_88197] +[group_88198] +[group_88199] +[group_88200] +[group_88201] +[group_88202] +[group_88203] +[group_88204] +[group_88205] +[group_88206] +[group_88207] +[group_88208] +[group_88209] +[group_88210] +[group_88211] +[group_88212] +[group_88213] +[group_88214] +[group_88215] +[group_88216] +[group_88217] +[group_88218] +[group_88219] +[group_88220] +[group_88221] +[group_88222] +[group_88223] +[group_88224] +[group_88225] +[group_88226] +[group_88227] +[group_88228] +[group_88229] +[group_88230] +[group_88231] +[group_88232] +[group_88233] +[group_88234] +[group_88235] +[group_88236] +[group_88237] +[group_88238] +[group_88239] +[group_88240] +[group_88241] +[group_88242] +[group_88243] +[group_88244] +[group_88245] +[group_88246] +[group_88247] +[group_88248] +[group_88249] +[group_88250] +[group_88251] +[group_88252] +[group_88253] +[group_88254] +[group_88255] +[group_88256] +[group_88257] +[group_88258] +[group_88259] +[group_88260] +[group_88261] +[group_88262] +[group_88263] +[group_88264] +[group_88265] +[group_88266] +[group_88267] +[group_88268] +[group_88269] +[group_88270] +[group_88271] +[group_88272] +[group_88273] +[group_88274] +[group_88275] +[group_88276] +[group_88277] +[group_88278] +[group_88279] +[group_88280] +[group_88281] +[group_88282] +[group_88283] +[group_88284] +[group_88285] +[group_88286] +[group_88287] +[group_88288] +[group_88289] +[group_88290] +[group_88291] +[group_88292] +[group_88293] +[group_88294] +[group_88295] +[group_88296] +[group_88297] +[group_88298] +[group_88299] +[group_88300] +[group_88301] +[group_88302] +[group_88303] +[group_88304] +[group_88305] +[group_88306] +[group_88307] +[group_88308] +[group_88309] +[group_88310] +[group_88311] +[group_88312] +[group_88313] +[group_88314] +[group_88315] +[group_88316] +[group_88317] +[group_88318] +[group_88319] +[group_88320] +[group_88321] +[group_88322] +[group_88323] +[group_88324] +[group_88325] +[group_88326] +[group_88327] +[group_88328] +[group_88329] +[group_88330] +[group_88331] +[group_88332] +[group_88333] +[group_88334] +[group_88335] +[group_88336] +[group_88337] +[group_88338] +[group_88339] +[group_88340] +[group_88341] +[group_88342] +[group_88343] +[group_88344] +[group_88345] +[group_88346] +[group_88347] +[group_88348] +[group_88349] +[group_88350] +[group_88351] +[group_88352] +[group_88353] +[group_88354] +[group_88355] +[group_88356] +[group_88357] +[group_88358] +[group_88359] +[group_88360] +[group_88361] +[group_88362] +[group_88363] +[group_88364] +[group_88365] +[group_88366] +[group_88367] +[group_88368] +[group_88369] +[group_88370] +[group_88371] +[group_88372] +[group_88373] +[group_88374] +[group_88375] +[group_88376] +[group_88377] +[group_88378] +[group_88379] +[group_88380] +[group_88381] +[group_88382] +[group_88383] +[group_88384] +[group_88385] +[group_88386] +[group_88387] +[group_88388] +[group_88389] +[group_88390] +[group_88391] +[group_88392] +[group_88393] +[group_88394] +[group_88395] +[group_88396] +[group_88397] +[group_88398] +[group_88399] +[group_88400] +[group_88401] +[group_88402] +[group_88403] +[group_88404] +[group_88405] +[group_88406] +[group_88407] +[group_88408] +[group_88409] +[group_88410] +[group_88411] +[group_88412] +[group_88413] +[group_88414] +[group_88415] +[group_88416] +[group_88417] +[group_88418] +[group_88419] +[group_88420] +[group_88421] +[group_88422] +[group_88423] +[group_88424] +[group_88425] +[group_88426] +[group_88427] +[group_88428] +[group_88429] +[group_88430] +[group_88431] +[group_88432] +[group_88433] +[group_88434] +[group_88435] +[group_88436] +[group_88437] +[group_88438] +[group_88439] +[group_88440] +[group_88441] +[group_88442] +[group_88443] +[group_88444] +[group_88445] +[group_88446] +[group_88447] +[group_88448] +[group_88449] +[group_88450] +[group_88451] +[group_88452] +[group_88453] +[group_88454] +[group_88455] +[group_88456] +[group_88457] +[group_88458] +[group_88459] +[group_88460] +[group_88461] +[group_88462] +[group_88463] +[group_88464] +[group_88465] +[group_88466] +[group_88467] +[group_88468] +[group_88469] +[group_88470] +[group_88471] +[group_88472] +[group_88473] +[group_88474] +[group_88475] +[group_88476] +[group_88477] +[group_88478] +[group_88479] +[group_88480] +[group_88481] +[group_88482] +[group_88483] +[group_88484] +[group_88485] +[group_88486] +[group_88487] +[group_88488] +[group_88489] +[group_88490] +[group_88491] +[group_88492] +[group_88493] +[group_88494] +[group_88495] +[group_88496] +[group_88497] +[group_88498] +[group_88499] +[group_88500] +[group_88501] +[group_88502] +[group_88503] +[group_88504] +[group_88505] +[group_88506] +[group_88507] +[group_88508] +[group_88509] +[group_88510] +[group_88511] +[group_88512] +[group_88513] +[group_88514] +[group_88515] +[group_88516] +[group_88517] +[group_88518] +[group_88519] +[group_88520] +[group_88521] +[group_88522] +[group_88523] +[group_88524] +[group_88525] +[group_88526] +[group_88527] +[group_88528] +[group_88529] +[group_88530] +[group_88531] +[group_88532] +[group_88533] +[group_88534] +[group_88535] +[group_88536] +[group_88537] +[group_88538] +[group_88539] +[group_88540] +[group_88541] +[group_88542] +[group_88543] +[group_88544] +[group_88545] +[group_88546] +[group_88547] +[group_88548] +[group_88549] +[group_88550] +[group_88551] +[group_88552] +[group_88553] +[group_88554] +[group_88555] +[group_88556] +[group_88557] +[group_88558] +[group_88559] +[group_88560] +[group_88561] +[group_88562] +[group_88563] +[group_88564] +[group_88565] +[group_88566] +[group_88567] +[group_88568] +[group_88569] +[group_88570] +[group_88571] +[group_88572] +[group_88573] +[group_88574] +[group_88575] +[group_88576] +[group_88577] +[group_88578] +[group_88579] +[group_88580] +[group_88581] +[group_88582] +[group_88583] +[group_88584] +[group_88585] +[group_88586] +[group_88587] +[group_88588] +[group_88589] +[group_88590] +[group_88591] +[group_88592] +[group_88593] +[group_88594] +[group_88595] +[group_88596] +[group_88597] +[group_88598] +[group_88599] +[group_88600] +[group_88601] +[group_88602] +[group_88603] +[group_88604] +[group_88605] +[group_88606] +[group_88607] +[group_88608] +[group_88609] +[group_88610] +[group_88611] +[group_88612] +[group_88613] +[group_88614] +[group_88615] +[group_88616] +[group_88617] +[group_88618] +[group_88619] +[group_88620] +[group_88621] +[group_88622] +[group_88623] +[group_88624] +[group_88625] +[group_88626] +[group_88627] +[group_88628] +[group_88629] +[group_88630] +[group_88631] +[group_88632] +[group_88633] +[group_88634] +[group_88635] +[group_88636] +[group_88637] +[group_88638] +[group_88639] +[group_88640] +[group_88641] +[group_88642] +[group_88643] +[group_88644] +[group_88645] +[group_88646] +[group_88647] +[group_88648] +[group_88649] +[group_88650] +[group_88651] +[group_88652] +[group_88653] +[group_88654] +[group_88655] +[group_88656] +[group_88657] +[group_88658] +[group_88659] +[group_88660] +[group_88661] +[group_88662] +[group_88663] +[group_88664] +[group_88665] +[group_88666] +[group_88667] +[group_88668] +[group_88669] +[group_88670] +[group_88671] +[group_88672] +[group_88673] +[group_88674] +[group_88675] +[group_88676] +[group_88677] +[group_88678] +[group_88679] +[group_88680] +[group_88681] +[group_88682] +[group_88683] +[group_88684] +[group_88685] +[group_88686] +[group_88687] +[group_88688] +[group_88689] +[group_88690] +[group_88691] +[group_88692] +[group_88693] +[group_88694] +[group_88695] +[group_88696] +[group_88697] +[group_88698] +[group_88699] +[group_88700] +[group_88701] +[group_88702] +[group_88703] +[group_88704] +[group_88705] +[group_88706] +[group_88707] +[group_88708] +[group_88709] +[group_88710] +[group_88711] +[group_88712] +[group_88713] +[group_88714] +[group_88715] +[group_88716] +[group_88717] +[group_88718] +[group_88719] +[group_88720] +[group_88721] +[group_88722] +[group_88723] +[group_88724] +[group_88725] +[group_88726] +[group_88727] +[group_88728] +[group_88729] +[group_88730] +[group_88731] +[group_88732] +[group_88733] +[group_88734] +[group_88735] +[group_88736] +[group_88737] +[group_88738] +[group_88739] +[group_88740] +[group_88741] +[group_88742] +[group_88743] +[group_88744] +[group_88745] +[group_88746] +[group_88747] +[group_88748] +[group_88749] +[group_88750] +[group_88751] +[group_88752] +[group_88753] +[group_88754] +[group_88755] +[group_88756] +[group_88757] +[group_88758] +[group_88759] +[group_88760] +[group_88761] +[group_88762] +[group_88763] +[group_88764] +[group_88765] +[group_88766] +[group_88767] +[group_88768] +[group_88769] +[group_88770] +[group_88771] +[group_88772] +[group_88773] +[group_88774] +[group_88775] +[group_88776] +[group_88777] +[group_88778] +[group_88779] +[group_88780] +[group_88781] +[group_88782] +[group_88783] +[group_88784] +[group_88785] +[group_88786] +[group_88787] +[group_88788] +[group_88789] +[group_88790] +[group_88791] +[group_88792] +[group_88793] +[group_88794] +[group_88795] +[group_88796] +[group_88797] +[group_88798] +[group_88799] +[group_88800] +[group_88801] +[group_88802] +[group_88803] +[group_88804] +[group_88805] +[group_88806] +[group_88807] +[group_88808] +[group_88809] +[group_88810] +[group_88811] +[group_88812] +[group_88813] +[group_88814] +[group_88815] +[group_88816] +[group_88817] +[group_88818] +[group_88819] +[group_88820] +[group_88821] +[group_88822] +[group_88823] +[group_88824] +[group_88825] +[group_88826] +[group_88827] +[group_88828] +[group_88829] +[group_88830] +[group_88831] +[group_88832] +[group_88833] +[group_88834] +[group_88835] +[group_88836] +[group_88837] +[group_88838] +[group_88839] +[group_88840] +[group_88841] +[group_88842] +[group_88843] +[group_88844] +[group_88845] +[group_88846] +[group_88847] +[group_88848] +[group_88849] +[group_88850] +[group_88851] +[group_88852] +[group_88853] +[group_88854] +[group_88855] +[group_88856] +[group_88857] +[group_88858] +[group_88859] +[group_88860] +[group_88861] +[group_88862] +[group_88863] +[group_88864] +[group_88865] +[group_88866] +[group_88867] +[group_88868] +[group_88869] +[group_88870] +[group_88871] +[group_88872] +[group_88873] +[group_88874] +[group_88875] +[group_88876] +[group_88877] +[group_88878] +[group_88879] +[group_88880] +[group_88881] +[group_88882] +[group_88883] +[group_88884] +[group_88885] +[group_88886] +[group_88887] +[group_88888] +[group_88889] +[group_88890] +[group_88891] +[group_88892] +[group_88893] +[group_88894] +[group_88895] +[group_88896] +[group_88897] +[group_88898] +[group_88899] +[group_88900] +[group_88901] +[group_88902] +[group_88903] +[group_88904] +[group_88905] +[group_88906] +[group_88907] +[group_88908] +[group_88909] +[group_88910] +[group_88911] +[group_88912] +[group_88913] +[group_88914] +[group_88915] +[group_88916] +[group_88917] +[group_88918] +[group_88919] +[group_88920] +[group_88921] +[group_88922] +[group_88923] +[group_88924] +[group_88925] +[group_88926] +[group_88927] +[group_88928] +[group_88929] +[group_88930] +[group_88931] +[group_88932] +[group_88933] +[group_88934] +[group_88935] +[group_88936] +[group_88937] +[group_88938] +[group_88939] +[group_88940] +[group_88941] +[group_88942] +[group_88943] +[group_88944] +[group_88945] +[group_88946] +[group_88947] +[group_88948] +[group_88949] +[group_88950] +[group_88951] +[group_88952] +[group_88953] +[group_88954] +[group_88955] +[group_88956] +[group_88957] +[group_88958] +[group_88959] +[group_88960] +[group_88961] +[group_88962] +[group_88963] +[group_88964] +[group_88965] +[group_88966] +[group_88967] +[group_88968] +[group_88969] +[group_88970] +[group_88971] +[group_88972] +[group_88973] +[group_88974] +[group_88975] +[group_88976] +[group_88977] +[group_88978] +[group_88979] +[group_88980] +[group_88981] +[group_88982] +[group_88983] +[group_88984] +[group_88985] +[group_88986] +[group_88987] +[group_88988] +[group_88989] +[group_88990] +[group_88991] +[group_88992] +[group_88993] +[group_88994] +[group_88995] +[group_88996] +[group_88997] +[group_88998] +[group_88999] +[group_89000] +[group_89001] +[group_89002] +[group_89003] +[group_89004] +[group_89005] +[group_89006] +[group_89007] +[group_89008] +[group_89009] +[group_89010] +[group_89011] +[group_89012] +[group_89013] +[group_89014] +[group_89015] +[group_89016] +[group_89017] +[group_89018] +[group_89019] +[group_89020] +[group_89021] +[group_89022] +[group_89023] +[group_89024] +[group_89025] +[group_89026] +[group_89027] +[group_89028] +[group_89029] +[group_89030] +[group_89031] +[group_89032] +[group_89033] +[group_89034] +[group_89035] +[group_89036] +[group_89037] +[group_89038] +[group_89039] +[group_89040] +[group_89041] +[group_89042] +[group_89043] +[group_89044] +[group_89045] +[group_89046] +[group_89047] +[group_89048] +[group_89049] +[group_89050] +[group_89051] +[group_89052] +[group_89053] +[group_89054] +[group_89055] +[group_89056] +[group_89057] +[group_89058] +[group_89059] +[group_89060] +[group_89061] +[group_89062] +[group_89063] +[group_89064] +[group_89065] +[group_89066] +[group_89067] +[group_89068] +[group_89069] +[group_89070] +[group_89071] +[group_89072] +[group_89073] +[group_89074] +[group_89075] +[group_89076] +[group_89077] +[group_89078] +[group_89079] +[group_89080] +[group_89081] +[group_89082] +[group_89083] +[group_89084] +[group_89085] +[group_89086] +[group_89087] +[group_89088] +[group_89089] +[group_89090] +[group_89091] +[group_89092] +[group_89093] +[group_89094] +[group_89095] +[group_89096] +[group_89097] +[group_89098] +[group_89099] +[group_89100] +[group_89101] +[group_89102] +[group_89103] +[group_89104] +[group_89105] +[group_89106] +[group_89107] +[group_89108] +[group_89109] +[group_89110] +[group_89111] +[group_89112] +[group_89113] +[group_89114] +[group_89115] +[group_89116] +[group_89117] +[group_89118] +[group_89119] +[group_89120] +[group_89121] +[group_89122] +[group_89123] +[group_89124] +[group_89125] +[group_89126] +[group_89127] +[group_89128] +[group_89129] +[group_89130] +[group_89131] +[group_89132] +[group_89133] +[group_89134] +[group_89135] +[group_89136] +[group_89137] +[group_89138] +[group_89139] +[group_89140] +[group_89141] +[group_89142] +[group_89143] +[group_89144] +[group_89145] +[group_89146] +[group_89147] +[group_89148] +[group_89149] +[group_89150] +[group_89151] +[group_89152] +[group_89153] +[group_89154] +[group_89155] +[group_89156] +[group_89157] +[group_89158] +[group_89159] +[group_89160] +[group_89161] +[group_89162] +[group_89163] +[group_89164] +[group_89165] +[group_89166] +[group_89167] +[group_89168] +[group_89169] +[group_89170] +[group_89171] +[group_89172] +[group_89173] +[group_89174] +[group_89175] +[group_89176] +[group_89177] +[group_89178] +[group_89179] +[group_89180] +[group_89181] +[group_89182] +[group_89183] +[group_89184] +[group_89185] +[group_89186] +[group_89187] +[group_89188] +[group_89189] +[group_89190] +[group_89191] +[group_89192] +[group_89193] +[group_89194] +[group_89195] +[group_89196] +[group_89197] +[group_89198] +[group_89199] +[group_89200] +[group_89201] +[group_89202] +[group_89203] +[group_89204] +[group_89205] +[group_89206] +[group_89207] +[group_89208] +[group_89209] +[group_89210] +[group_89211] +[group_89212] +[group_89213] +[group_89214] +[group_89215] +[group_89216] +[group_89217] +[group_89218] +[group_89219] +[group_89220] +[group_89221] +[group_89222] +[group_89223] +[group_89224] +[group_89225] +[group_89226] +[group_89227] +[group_89228] +[group_89229] +[group_89230] +[group_89231] +[group_89232] +[group_89233] +[group_89234] +[group_89235] +[group_89236] +[group_89237] +[group_89238] +[group_89239] +[group_89240] +[group_89241] +[group_89242] +[group_89243] +[group_89244] +[group_89245] +[group_89246] +[group_89247] +[group_89248] +[group_89249] +[group_89250] +[group_89251] +[group_89252] +[group_89253] +[group_89254] +[group_89255] +[group_89256] +[group_89257] +[group_89258] +[group_89259] +[group_89260] +[group_89261] +[group_89262] +[group_89263] +[group_89264] +[group_89265] +[group_89266] +[group_89267] +[group_89268] +[group_89269] +[group_89270] +[group_89271] +[group_89272] +[group_89273] +[group_89274] +[group_89275] +[group_89276] +[group_89277] +[group_89278] +[group_89279] +[group_89280] +[group_89281] +[group_89282] +[group_89283] +[group_89284] +[group_89285] +[group_89286] +[group_89287] +[group_89288] +[group_89289] +[group_89290] +[group_89291] +[group_89292] +[group_89293] +[group_89294] +[group_89295] +[group_89296] +[group_89297] +[group_89298] +[group_89299] +[group_89300] +[group_89301] +[group_89302] +[group_89303] +[group_89304] +[group_89305] +[group_89306] +[group_89307] +[group_89308] +[group_89309] +[group_89310] +[group_89311] +[group_89312] +[group_89313] +[group_89314] +[group_89315] +[group_89316] +[group_89317] +[group_89318] +[group_89319] +[group_89320] +[group_89321] +[group_89322] +[group_89323] +[group_89324] +[group_89325] +[group_89326] +[group_89327] +[group_89328] +[group_89329] +[group_89330] +[group_89331] +[group_89332] +[group_89333] +[group_89334] +[group_89335] +[group_89336] +[group_89337] +[group_89338] +[group_89339] +[group_89340] +[group_89341] +[group_89342] +[group_89343] +[group_89344] +[group_89345] +[group_89346] +[group_89347] +[group_89348] +[group_89349] +[group_89350] +[group_89351] +[group_89352] +[group_89353] +[group_89354] +[group_89355] +[group_89356] +[group_89357] +[group_89358] +[group_89359] +[group_89360] +[group_89361] +[group_89362] +[group_89363] +[group_89364] +[group_89365] +[group_89366] +[group_89367] +[group_89368] +[group_89369] +[group_89370] +[group_89371] +[group_89372] +[group_89373] +[group_89374] +[group_89375] +[group_89376] +[group_89377] +[group_89378] +[group_89379] +[group_89380] +[group_89381] +[group_89382] +[group_89383] +[group_89384] +[group_89385] +[group_89386] +[group_89387] +[group_89388] +[group_89389] +[group_89390] +[group_89391] +[group_89392] +[group_89393] +[group_89394] +[group_89395] +[group_89396] +[group_89397] +[group_89398] +[group_89399] +[group_89400] +[group_89401] +[group_89402] +[group_89403] +[group_89404] +[group_89405] +[group_89406] +[group_89407] +[group_89408] +[group_89409] +[group_89410] +[group_89411] +[group_89412] +[group_89413] +[group_89414] +[group_89415] +[group_89416] +[group_89417] +[group_89418] +[group_89419] +[group_89420] +[group_89421] +[group_89422] +[group_89423] +[group_89424] +[group_89425] +[group_89426] +[group_89427] +[group_89428] +[group_89429] +[group_89430] +[group_89431] +[group_89432] +[group_89433] +[group_89434] +[group_89435] +[group_89436] +[group_89437] +[group_89438] +[group_89439] +[group_89440] +[group_89441] +[group_89442] +[group_89443] +[group_89444] +[group_89445] +[group_89446] +[group_89447] +[group_89448] +[group_89449] +[group_89450] +[group_89451] +[group_89452] +[group_89453] +[group_89454] +[group_89455] +[group_89456] +[group_89457] +[group_89458] +[group_89459] +[group_89460] +[group_89461] +[group_89462] +[group_89463] +[group_89464] +[group_89465] +[group_89466] +[group_89467] +[group_89468] +[group_89469] +[group_89470] +[group_89471] +[group_89472] +[group_89473] +[group_89474] +[group_89475] +[group_89476] +[group_89477] +[group_89478] +[group_89479] +[group_89480] +[group_89481] +[group_89482] +[group_89483] +[group_89484] +[group_89485] +[group_89486] +[group_89487] +[group_89488] +[group_89489] +[group_89490] +[group_89491] +[group_89492] +[group_89493] +[group_89494] +[group_89495] +[group_89496] +[group_89497] +[group_89498] +[group_89499] +[group_89500] +[group_89501] +[group_89502] +[group_89503] +[group_89504] +[group_89505] +[group_89506] +[group_89507] +[group_89508] +[group_89509] +[group_89510] +[group_89511] +[group_89512] +[group_89513] +[group_89514] +[group_89515] +[group_89516] +[group_89517] +[group_89518] +[group_89519] +[group_89520] +[group_89521] +[group_89522] +[group_89523] +[group_89524] +[group_89525] +[group_89526] +[group_89527] +[group_89528] +[group_89529] +[group_89530] +[group_89531] +[group_89532] +[group_89533] +[group_89534] +[group_89535] +[group_89536] +[group_89537] +[group_89538] +[group_89539] +[group_89540] +[group_89541] +[group_89542] +[group_89543] +[group_89544] +[group_89545] +[group_89546] +[group_89547] +[group_89548] +[group_89549] +[group_89550] +[group_89551] +[group_89552] +[group_89553] +[group_89554] +[group_89555] +[group_89556] +[group_89557] +[group_89558] +[group_89559] +[group_89560] +[group_89561] +[group_89562] +[group_89563] +[group_89564] +[group_89565] +[group_89566] +[group_89567] +[group_89568] +[group_89569] +[group_89570] +[group_89571] +[group_89572] +[group_89573] +[group_89574] +[group_89575] +[group_89576] +[group_89577] +[group_89578] +[group_89579] +[group_89580] +[group_89581] +[group_89582] +[group_89583] +[group_89584] +[group_89585] +[group_89586] +[group_89587] +[group_89588] +[group_89589] +[group_89590] +[group_89591] +[group_89592] +[group_89593] +[group_89594] +[group_89595] +[group_89596] +[group_89597] +[group_89598] +[group_89599] +[group_89600] +[group_89601] +[group_89602] +[group_89603] +[group_89604] +[group_89605] +[group_89606] +[group_89607] +[group_89608] +[group_89609] +[group_89610] +[group_89611] +[group_89612] +[group_89613] +[group_89614] +[group_89615] +[group_89616] +[group_89617] +[group_89618] +[group_89619] +[group_89620] +[group_89621] +[group_89622] +[group_89623] +[group_89624] +[group_89625] +[group_89626] +[group_89627] +[group_89628] +[group_89629] +[group_89630] +[group_89631] +[group_89632] +[group_89633] +[group_89634] +[group_89635] +[group_89636] +[group_89637] +[group_89638] +[group_89639] +[group_89640] +[group_89641] +[group_89642] +[group_89643] +[group_89644] +[group_89645] +[group_89646] +[group_89647] +[group_89648] +[group_89649] +[group_89650] +[group_89651] +[group_89652] +[group_89653] +[group_89654] +[group_89655] +[group_89656] +[group_89657] +[group_89658] +[group_89659] +[group_89660] +[group_89661] +[group_89662] +[group_89663] +[group_89664] +[group_89665] +[group_89666] +[group_89667] +[group_89668] +[group_89669] +[group_89670] +[group_89671] +[group_89672] +[group_89673] +[group_89674] +[group_89675] +[group_89676] +[group_89677] +[group_89678] +[group_89679] +[group_89680] +[group_89681] +[group_89682] +[group_89683] +[group_89684] +[group_89685] +[group_89686] +[group_89687] +[group_89688] +[group_89689] +[group_89690] +[group_89691] +[group_89692] +[group_89693] +[group_89694] +[group_89695] +[group_89696] +[group_89697] +[group_89698] +[group_89699] +[group_89700] +[group_89701] +[group_89702] +[group_89703] +[group_89704] +[group_89705] +[group_89706] +[group_89707] +[group_89708] +[group_89709] +[group_89710] +[group_89711] +[group_89712] +[group_89713] +[group_89714] +[group_89715] +[group_89716] +[group_89717] +[group_89718] +[group_89719] +[group_89720] +[group_89721] +[group_89722] +[group_89723] +[group_89724] +[group_89725] +[group_89726] +[group_89727] +[group_89728] +[group_89729] +[group_89730] +[group_89731] +[group_89732] +[group_89733] +[group_89734] +[group_89735] +[group_89736] +[group_89737] +[group_89738] +[group_89739] +[group_89740] +[group_89741] +[group_89742] +[group_89743] +[group_89744] +[group_89745] +[group_89746] +[group_89747] +[group_89748] +[group_89749] +[group_89750] +[group_89751] +[group_89752] +[group_89753] +[group_89754] +[group_89755] +[group_89756] +[group_89757] +[group_89758] +[group_89759] +[group_89760] +[group_89761] +[group_89762] +[group_89763] +[group_89764] +[group_89765] +[group_89766] +[group_89767] +[group_89768] +[group_89769] +[group_89770] +[group_89771] +[group_89772] +[group_89773] +[group_89774] +[group_89775] +[group_89776] +[group_89777] +[group_89778] +[group_89779] +[group_89780] +[group_89781] +[group_89782] +[group_89783] +[group_89784] +[group_89785] +[group_89786] +[group_89787] +[group_89788] +[group_89789] +[group_89790] +[group_89791] +[group_89792] +[group_89793] +[group_89794] +[group_89795] +[group_89796] +[group_89797] +[group_89798] +[group_89799] +[group_89800] +[group_89801] +[group_89802] +[group_89803] +[group_89804] +[group_89805] +[group_89806] +[group_89807] +[group_89808] +[group_89809] +[group_89810] +[group_89811] +[group_89812] +[group_89813] +[group_89814] +[group_89815] +[group_89816] +[group_89817] +[group_89818] +[group_89819] +[group_89820] +[group_89821] +[group_89822] +[group_89823] +[group_89824] +[group_89825] +[group_89826] +[group_89827] +[group_89828] +[group_89829] +[group_89830] +[group_89831] +[group_89832] +[group_89833] +[group_89834] +[group_89835] +[group_89836] +[group_89837] +[group_89838] +[group_89839] +[group_89840] +[group_89841] +[group_89842] +[group_89843] +[group_89844] +[group_89845] +[group_89846] +[group_89847] +[group_89848] +[group_89849] +[group_89850] +[group_89851] +[group_89852] +[group_89853] +[group_89854] +[group_89855] +[group_89856] +[group_89857] +[group_89858] +[group_89859] +[group_89860] +[group_89861] +[group_89862] +[group_89863] +[group_89864] +[group_89865] +[group_89866] +[group_89867] +[group_89868] +[group_89869] +[group_89870] +[group_89871] +[group_89872] +[group_89873] +[group_89874] +[group_89875] +[group_89876] +[group_89877] +[group_89878] +[group_89879] +[group_89880] +[group_89881] +[group_89882] +[group_89883] +[group_89884] +[group_89885] +[group_89886] +[group_89887] +[group_89888] +[group_89889] +[group_89890] +[group_89891] +[group_89892] +[group_89893] +[group_89894] +[group_89895] +[group_89896] +[group_89897] +[group_89898] +[group_89899] +[group_89900] +[group_89901] +[group_89902] +[group_89903] +[group_89904] +[group_89905] +[group_89906] +[group_89907] +[group_89908] +[group_89909] +[group_89910] +[group_89911] +[group_89912] +[group_89913] +[group_89914] +[group_89915] +[group_89916] +[group_89917] +[group_89918] +[group_89919] +[group_89920] +[group_89921] +[group_89922] +[group_89923] +[group_89924] +[group_89925] +[group_89926] +[group_89927] +[group_89928] +[group_89929] +[group_89930] +[group_89931] +[group_89932] +[group_89933] +[group_89934] +[group_89935] +[group_89936] +[group_89937] +[group_89938] +[group_89939] +[group_89940] +[group_89941] +[group_89942] +[group_89943] +[group_89944] +[group_89945] +[group_89946] +[group_89947] +[group_89948] +[group_89949] +[group_89950] +[group_89951] +[group_89952] +[group_89953] +[group_89954] +[group_89955] +[group_89956] +[group_89957] +[group_89958] +[group_89959] +[group_89960] +[group_89961] +[group_89962] +[group_89963] +[group_89964] +[group_89965] +[group_89966] +[group_89967] +[group_89968] +[group_89969] +[group_89970] +[group_89971] +[group_89972] +[group_89973] +[group_89974] +[group_89975] +[group_89976] +[group_89977] +[group_89978] +[group_89979] +[group_89980] +[group_89981] +[group_89982] +[group_89983] +[group_89984] +[group_89985] +[group_89986] +[group_89987] +[group_89988] +[group_89989] +[group_89990] +[group_89991] +[group_89992] +[group_89993] +[group_89994] +[group_89995] +[group_89996] +[group_89997] +[group_89998] +[group_89999] +[group_90000] +[group_90001] +[group_90002] +[group_90003] +[group_90004] +[group_90005] +[group_90006] +[group_90007] +[group_90008] +[group_90009] +[group_90010] +[group_90011] +[group_90012] +[group_90013] +[group_90014] +[group_90015] +[group_90016] +[group_90017] +[group_90018] +[group_90019] +[group_90020] +[group_90021] +[group_90022] +[group_90023] +[group_90024] +[group_90025] +[group_90026] +[group_90027] +[group_90028] +[group_90029] +[group_90030] +[group_90031] +[group_90032] +[group_90033] +[group_90034] +[group_90035] +[group_90036] +[group_90037] +[group_90038] +[group_90039] +[group_90040] +[group_90041] +[group_90042] +[group_90043] +[group_90044] +[group_90045] +[group_90046] +[group_90047] +[group_90048] +[group_90049] +[group_90050] +[group_90051] +[group_90052] +[group_90053] +[group_90054] +[group_90055] +[group_90056] +[group_90057] +[group_90058] +[group_90059] +[group_90060] +[group_90061] +[group_90062] +[group_90063] +[group_90064] +[group_90065] +[group_90066] +[group_90067] +[group_90068] +[group_90069] +[group_90070] +[group_90071] +[group_90072] +[group_90073] +[group_90074] +[group_90075] +[group_90076] +[group_90077] +[group_90078] +[group_90079] +[group_90080] +[group_90081] +[group_90082] +[group_90083] +[group_90084] +[group_90085] +[group_90086] +[group_90087] +[group_90088] +[group_90089] +[group_90090] +[group_90091] +[group_90092] +[group_90093] +[group_90094] +[group_90095] +[group_90096] +[group_90097] +[group_90098] +[group_90099] +[group_90100] +[group_90101] +[group_90102] +[group_90103] +[group_90104] +[group_90105] +[group_90106] +[group_90107] +[group_90108] +[group_90109] +[group_90110] +[group_90111] +[group_90112] +[group_90113] +[group_90114] +[group_90115] +[group_90116] +[group_90117] +[group_90118] +[group_90119] +[group_90120] +[group_90121] +[group_90122] +[group_90123] +[group_90124] +[group_90125] +[group_90126] +[group_90127] +[group_90128] +[group_90129] +[group_90130] +[group_90131] +[group_90132] +[group_90133] +[group_90134] +[group_90135] +[group_90136] +[group_90137] +[group_90138] +[group_90139] +[group_90140] +[group_90141] +[group_90142] +[group_90143] +[group_90144] +[group_90145] +[group_90146] +[group_90147] +[group_90148] +[group_90149] +[group_90150] +[group_90151] +[group_90152] +[group_90153] +[group_90154] +[group_90155] +[group_90156] +[group_90157] +[group_90158] +[group_90159] +[group_90160] +[group_90161] +[group_90162] +[group_90163] +[group_90164] +[group_90165] +[group_90166] +[group_90167] +[group_90168] +[group_90169] +[group_90170] +[group_90171] +[group_90172] +[group_90173] +[group_90174] +[group_90175] +[group_90176] +[group_90177] +[group_90178] +[group_90179] +[group_90180] +[group_90181] +[group_90182] +[group_90183] +[group_90184] +[group_90185] +[group_90186] +[group_90187] +[group_90188] +[group_90189] +[group_90190] +[group_90191] +[group_90192] +[group_90193] +[group_90194] +[group_90195] +[group_90196] +[group_90197] +[group_90198] +[group_90199] +[group_90200] +[group_90201] +[group_90202] +[group_90203] +[group_90204] +[group_90205] +[group_90206] +[group_90207] +[group_90208] +[group_90209] +[group_90210] +[group_90211] +[group_90212] +[group_90213] +[group_90214] +[group_90215] +[group_90216] +[group_90217] +[group_90218] +[group_90219] +[group_90220] +[group_90221] +[group_90222] +[group_90223] +[group_90224] +[group_90225] +[group_90226] +[group_90227] +[group_90228] +[group_90229] +[group_90230] +[group_90231] +[group_90232] +[group_90233] +[group_90234] +[group_90235] +[group_90236] +[group_90237] +[group_90238] +[group_90239] +[group_90240] +[group_90241] +[group_90242] +[group_90243] +[group_90244] +[group_90245] +[group_90246] +[group_90247] +[group_90248] +[group_90249] +[group_90250] +[group_90251] +[group_90252] +[group_90253] +[group_90254] +[group_90255] +[group_90256] +[group_90257] +[group_90258] +[group_90259] +[group_90260] +[group_90261] +[group_90262] +[group_90263] +[group_90264] +[group_90265] +[group_90266] +[group_90267] +[group_90268] +[group_90269] +[group_90270] +[group_90271] +[group_90272] +[group_90273] +[group_90274] +[group_90275] +[group_90276] +[group_90277] +[group_90278] +[group_90279] +[group_90280] +[group_90281] +[group_90282] +[group_90283] +[group_90284] +[group_90285] +[group_90286] +[group_90287] +[group_90288] +[group_90289] +[group_90290] +[group_90291] +[group_90292] +[group_90293] +[group_90294] +[group_90295] +[group_90296] +[group_90297] +[group_90298] +[group_90299] +[group_90300] +[group_90301] +[group_90302] +[group_90303] +[group_90304] +[group_90305] +[group_90306] +[group_90307] +[group_90308] +[group_90309] +[group_90310] +[group_90311] +[group_90312] +[group_90313] +[group_90314] +[group_90315] +[group_90316] +[group_90317] +[group_90318] +[group_90319] +[group_90320] +[group_90321] +[group_90322] +[group_90323] +[group_90324] +[group_90325] +[group_90326] +[group_90327] +[group_90328] +[group_90329] +[group_90330] +[group_90331] +[group_90332] +[group_90333] +[group_90334] +[group_90335] +[group_90336] +[group_90337] +[group_90338] +[group_90339] +[group_90340] +[group_90341] +[group_90342] +[group_90343] +[group_90344] +[group_90345] +[group_90346] +[group_90347] +[group_90348] +[group_90349] +[group_90350] +[group_90351] +[group_90352] +[group_90353] +[group_90354] +[group_90355] +[group_90356] +[group_90357] +[group_90358] +[group_90359] +[group_90360] +[group_90361] +[group_90362] +[group_90363] +[group_90364] +[group_90365] +[group_90366] +[group_90367] +[group_90368] +[group_90369] +[group_90370] +[group_90371] +[group_90372] +[group_90373] +[group_90374] +[group_90375] +[group_90376] +[group_90377] +[group_90378] +[group_90379] +[group_90380] +[group_90381] +[group_90382] +[group_90383] +[group_90384] +[group_90385] +[group_90386] +[group_90387] +[group_90388] +[group_90389] +[group_90390] +[group_90391] +[group_90392] +[group_90393] +[group_90394] +[group_90395] +[group_90396] +[group_90397] +[group_90398] +[group_90399] +[group_90400] +[group_90401] +[group_90402] +[group_90403] +[group_90404] +[group_90405] +[group_90406] +[group_90407] +[group_90408] +[group_90409] +[group_90410] +[group_90411] +[group_90412] +[group_90413] +[group_90414] +[group_90415] +[group_90416] +[group_90417] +[group_90418] +[group_90419] +[group_90420] +[group_90421] +[group_90422] +[group_90423] +[group_90424] +[group_90425] +[group_90426] +[group_90427] +[group_90428] +[group_90429] +[group_90430] +[group_90431] +[group_90432] +[group_90433] +[group_90434] +[group_90435] +[group_90436] +[group_90437] +[group_90438] +[group_90439] +[group_90440] +[group_90441] +[group_90442] +[group_90443] +[group_90444] +[group_90445] +[group_90446] +[group_90447] +[group_90448] +[group_90449] +[group_90450] +[group_90451] +[group_90452] +[group_90453] +[group_90454] +[group_90455] +[group_90456] +[group_90457] +[group_90458] +[group_90459] +[group_90460] +[group_90461] +[group_90462] +[group_90463] +[group_90464] +[group_90465] +[group_90466] +[group_90467] +[group_90468] +[group_90469] +[group_90470] +[group_90471] +[group_90472] +[group_90473] +[group_90474] +[group_90475] +[group_90476] +[group_90477] +[group_90478] +[group_90479] +[group_90480] +[group_90481] +[group_90482] +[group_90483] +[group_90484] +[group_90485] +[group_90486] +[group_90487] +[group_90488] +[group_90489] +[group_90490] +[group_90491] +[group_90492] +[group_90493] +[group_90494] +[group_90495] +[group_90496] +[group_90497] +[group_90498] +[group_90499] +[group_90500] +[group_90501] +[group_90502] +[group_90503] +[group_90504] +[group_90505] +[group_90506] +[group_90507] +[group_90508] +[group_90509] +[group_90510] +[group_90511] +[group_90512] +[group_90513] +[group_90514] +[group_90515] +[group_90516] +[group_90517] +[group_90518] +[group_90519] +[group_90520] +[group_90521] +[group_90522] +[group_90523] +[group_90524] +[group_90525] +[group_90526] +[group_90527] +[group_90528] +[group_90529] +[group_90530] +[group_90531] +[group_90532] +[group_90533] +[group_90534] +[group_90535] +[group_90536] +[group_90537] +[group_90538] +[group_90539] +[group_90540] +[group_90541] +[group_90542] +[group_90543] +[group_90544] +[group_90545] +[group_90546] +[group_90547] +[group_90548] +[group_90549] +[group_90550] +[group_90551] +[group_90552] +[group_90553] +[group_90554] +[group_90555] +[group_90556] +[group_90557] +[group_90558] +[group_90559] +[group_90560] +[group_90561] +[group_90562] +[group_90563] +[group_90564] +[group_90565] +[group_90566] +[group_90567] +[group_90568] +[group_90569] +[group_90570] +[group_90571] +[group_90572] +[group_90573] +[group_90574] +[group_90575] +[group_90576] +[group_90577] +[group_90578] +[group_90579] +[group_90580] +[group_90581] +[group_90582] +[group_90583] +[group_90584] +[group_90585] +[group_90586] +[group_90587] +[group_90588] +[group_90589] +[group_90590] +[group_90591] +[group_90592] +[group_90593] +[group_90594] +[group_90595] +[group_90596] +[group_90597] +[group_90598] +[group_90599] +[group_90600] +[group_90601] +[group_90602] +[group_90603] +[group_90604] +[group_90605] +[group_90606] +[group_90607] +[group_90608] +[group_90609] +[group_90610] +[group_90611] +[group_90612] +[group_90613] +[group_90614] +[group_90615] +[group_90616] +[group_90617] +[group_90618] +[group_90619] +[group_90620] +[group_90621] +[group_90622] +[group_90623] +[group_90624] +[group_90625] +[group_90626] +[group_90627] +[group_90628] +[group_90629] +[group_90630] +[group_90631] +[group_90632] +[group_90633] +[group_90634] +[group_90635] +[group_90636] +[group_90637] +[group_90638] +[group_90639] +[group_90640] +[group_90641] +[group_90642] +[group_90643] +[group_90644] +[group_90645] +[group_90646] +[group_90647] +[group_90648] +[group_90649] +[group_90650] +[group_90651] +[group_90652] +[group_90653] +[group_90654] +[group_90655] +[group_90656] +[group_90657] +[group_90658] +[group_90659] +[group_90660] +[group_90661] +[group_90662] +[group_90663] +[group_90664] +[group_90665] +[group_90666] +[group_90667] +[group_90668] +[group_90669] +[group_90670] +[group_90671] +[group_90672] +[group_90673] +[group_90674] +[group_90675] +[group_90676] +[group_90677] +[group_90678] +[group_90679] +[group_90680] +[group_90681] +[group_90682] +[group_90683] +[group_90684] +[group_90685] +[group_90686] +[group_90687] +[group_90688] +[group_90689] +[group_90690] +[group_90691] +[group_90692] +[group_90693] +[group_90694] +[group_90695] +[group_90696] +[group_90697] +[group_90698] +[group_90699] +[group_90700] +[group_90701] +[group_90702] +[group_90703] +[group_90704] +[group_90705] +[group_90706] +[group_90707] +[group_90708] +[group_90709] +[group_90710] +[group_90711] +[group_90712] +[group_90713] +[group_90714] +[group_90715] +[group_90716] +[group_90717] +[group_90718] +[group_90719] +[group_90720] +[group_90721] +[group_90722] +[group_90723] +[group_90724] +[group_90725] +[group_90726] +[group_90727] +[group_90728] +[group_90729] +[group_90730] +[group_90731] +[group_90732] +[group_90733] +[group_90734] +[group_90735] +[group_90736] +[group_90737] +[group_90738] +[group_90739] +[group_90740] +[group_90741] +[group_90742] +[group_90743] +[group_90744] +[group_90745] +[group_90746] +[group_90747] +[group_90748] +[group_90749] +[group_90750] +[group_90751] +[group_90752] +[group_90753] +[group_90754] +[group_90755] +[group_90756] +[group_90757] +[group_90758] +[group_90759] +[group_90760] +[group_90761] +[group_90762] +[group_90763] +[group_90764] +[group_90765] +[group_90766] +[group_90767] +[group_90768] +[group_90769] +[group_90770] +[group_90771] +[group_90772] +[group_90773] +[group_90774] +[group_90775] +[group_90776] +[group_90777] +[group_90778] +[group_90779] +[group_90780] +[group_90781] +[group_90782] +[group_90783] +[group_90784] +[group_90785] +[group_90786] +[group_90787] +[group_90788] +[group_90789] +[group_90790] +[group_90791] +[group_90792] +[group_90793] +[group_90794] +[group_90795] +[group_90796] +[group_90797] +[group_90798] +[group_90799] +[group_90800] +[group_90801] +[group_90802] +[group_90803] +[group_90804] +[group_90805] +[group_90806] +[group_90807] +[group_90808] +[group_90809] +[group_90810] +[group_90811] +[group_90812] +[group_90813] +[group_90814] +[group_90815] +[group_90816] +[group_90817] +[group_90818] +[group_90819] +[group_90820] +[group_90821] +[group_90822] +[group_90823] +[group_90824] +[group_90825] +[group_90826] +[group_90827] +[group_90828] +[group_90829] +[group_90830] +[group_90831] +[group_90832] +[group_90833] +[group_90834] +[group_90835] +[group_90836] +[group_90837] +[group_90838] +[group_90839] +[group_90840] +[group_90841] +[group_90842] +[group_90843] +[group_90844] +[group_90845] +[group_90846] +[group_90847] +[group_90848] +[group_90849] +[group_90850] +[group_90851] +[group_90852] +[group_90853] +[group_90854] +[group_90855] +[group_90856] +[group_90857] +[group_90858] +[group_90859] +[group_90860] +[group_90861] +[group_90862] +[group_90863] +[group_90864] +[group_90865] +[group_90866] +[group_90867] +[group_90868] +[group_90869] +[group_90870] +[group_90871] +[group_90872] +[group_90873] +[group_90874] +[group_90875] +[group_90876] +[group_90877] +[group_90878] +[group_90879] +[group_90880] +[group_90881] +[group_90882] +[group_90883] +[group_90884] +[group_90885] +[group_90886] +[group_90887] +[group_90888] +[group_90889] +[group_90890] +[group_90891] +[group_90892] +[group_90893] +[group_90894] +[group_90895] +[group_90896] +[group_90897] +[group_90898] +[group_90899] +[group_90900] +[group_90901] +[group_90902] +[group_90903] +[group_90904] +[group_90905] +[group_90906] +[group_90907] +[group_90908] +[group_90909] +[group_90910] +[group_90911] +[group_90912] +[group_90913] +[group_90914] +[group_90915] +[group_90916] +[group_90917] +[group_90918] +[group_90919] +[group_90920] +[group_90921] +[group_90922] +[group_90923] +[group_90924] +[group_90925] +[group_90926] +[group_90927] +[group_90928] +[group_90929] +[group_90930] +[group_90931] +[group_90932] +[group_90933] +[group_90934] +[group_90935] +[group_90936] +[group_90937] +[group_90938] +[group_90939] +[group_90940] +[group_90941] +[group_90942] +[group_90943] +[group_90944] +[group_90945] +[group_90946] +[group_90947] +[group_90948] +[group_90949] +[group_90950] +[group_90951] +[group_90952] +[group_90953] +[group_90954] +[group_90955] +[group_90956] +[group_90957] +[group_90958] +[group_90959] +[group_90960] +[group_90961] +[group_90962] +[group_90963] +[group_90964] +[group_90965] +[group_90966] +[group_90967] +[group_90968] +[group_90969] +[group_90970] +[group_90971] +[group_90972] +[group_90973] +[group_90974] +[group_90975] +[group_90976] +[group_90977] +[group_90978] +[group_90979] +[group_90980] +[group_90981] +[group_90982] +[group_90983] +[group_90984] +[group_90985] +[group_90986] +[group_90987] +[group_90988] +[group_90989] +[group_90990] +[group_90991] +[group_90992] +[group_90993] +[group_90994] +[group_90995] +[group_90996] +[group_90997] +[group_90998] +[group_90999] +[group_91000] +[group_91001] +[group_91002] +[group_91003] +[group_91004] +[group_91005] +[group_91006] +[group_91007] +[group_91008] +[group_91009] +[group_91010] +[group_91011] +[group_91012] +[group_91013] +[group_91014] +[group_91015] +[group_91016] +[group_91017] +[group_91018] +[group_91019] +[group_91020] +[group_91021] +[group_91022] +[group_91023] +[group_91024] +[group_91025] +[group_91026] +[group_91027] +[group_91028] +[group_91029] +[group_91030] +[group_91031] +[group_91032] +[group_91033] +[group_91034] +[group_91035] +[group_91036] +[group_91037] +[group_91038] +[group_91039] +[group_91040] +[group_91041] +[group_91042] +[group_91043] +[group_91044] +[group_91045] +[group_91046] +[group_91047] +[group_91048] +[group_91049] +[group_91050] +[group_91051] +[group_91052] +[group_91053] +[group_91054] +[group_91055] +[group_91056] +[group_91057] +[group_91058] +[group_91059] +[group_91060] +[group_91061] +[group_91062] +[group_91063] +[group_91064] +[group_91065] +[group_91066] +[group_91067] +[group_91068] +[group_91069] +[group_91070] +[group_91071] +[group_91072] +[group_91073] +[group_91074] +[group_91075] +[group_91076] +[group_91077] +[group_91078] +[group_91079] +[group_91080] +[group_91081] +[group_91082] +[group_91083] +[group_91084] +[group_91085] +[group_91086] +[group_91087] +[group_91088] +[group_91089] +[group_91090] +[group_91091] +[group_91092] +[group_91093] +[group_91094] +[group_91095] +[group_91096] +[group_91097] +[group_91098] +[group_91099] +[group_91100] +[group_91101] +[group_91102] +[group_91103] +[group_91104] +[group_91105] +[group_91106] +[group_91107] +[group_91108] +[group_91109] +[group_91110] +[group_91111] +[group_91112] +[group_91113] +[group_91114] +[group_91115] +[group_91116] +[group_91117] +[group_91118] +[group_91119] +[group_91120] +[group_91121] +[group_91122] +[group_91123] +[group_91124] +[group_91125] +[group_91126] +[group_91127] +[group_91128] +[group_91129] +[group_91130] +[group_91131] +[group_91132] +[group_91133] +[group_91134] +[group_91135] +[group_91136] +[group_91137] +[group_91138] +[group_91139] +[group_91140] +[group_91141] +[group_91142] +[group_91143] +[group_91144] +[group_91145] +[group_91146] +[group_91147] +[group_91148] +[group_91149] +[group_91150] +[group_91151] +[group_91152] +[group_91153] +[group_91154] +[group_91155] +[group_91156] +[group_91157] +[group_91158] +[group_91159] +[group_91160] +[group_91161] +[group_91162] +[group_91163] +[group_91164] +[group_91165] +[group_91166] +[group_91167] +[group_91168] +[group_91169] +[group_91170] +[group_91171] +[group_91172] +[group_91173] +[group_91174] +[group_91175] +[group_91176] +[group_91177] +[group_91178] +[group_91179] +[group_91180] +[group_91181] +[group_91182] +[group_91183] +[group_91184] +[group_91185] +[group_91186] +[group_91187] +[group_91188] +[group_91189] +[group_91190] +[group_91191] +[group_91192] +[group_91193] +[group_91194] +[group_91195] +[group_91196] +[group_91197] +[group_91198] +[group_91199] +[group_91200] +[group_91201] +[group_91202] +[group_91203] +[group_91204] +[group_91205] +[group_91206] +[group_91207] +[group_91208] +[group_91209] +[group_91210] +[group_91211] +[group_91212] +[group_91213] +[group_91214] +[group_91215] +[group_91216] +[group_91217] +[group_91218] +[group_91219] +[group_91220] +[group_91221] +[group_91222] +[group_91223] +[group_91224] +[group_91225] +[group_91226] +[group_91227] +[group_91228] +[group_91229] +[group_91230] +[group_91231] +[group_91232] +[group_91233] +[group_91234] +[group_91235] +[group_91236] +[group_91237] +[group_91238] +[group_91239] +[group_91240] +[group_91241] +[group_91242] +[group_91243] +[group_91244] +[group_91245] +[group_91246] +[group_91247] +[group_91248] +[group_91249] +[group_91250] +[group_91251] +[group_91252] +[group_91253] +[group_91254] +[group_91255] +[group_91256] +[group_91257] +[group_91258] +[group_91259] +[group_91260] +[group_91261] +[group_91262] +[group_91263] +[group_91264] +[group_91265] +[group_91266] +[group_91267] +[group_91268] +[group_91269] +[group_91270] +[group_91271] +[group_91272] +[group_91273] +[group_91274] +[group_91275] +[group_91276] +[group_91277] +[group_91278] +[group_91279] +[group_91280] +[group_91281] +[group_91282] +[group_91283] +[group_91284] +[group_91285] +[group_91286] +[group_91287] +[group_91288] +[group_91289] +[group_91290] +[group_91291] +[group_91292] +[group_91293] +[group_91294] +[group_91295] +[group_91296] +[group_91297] +[group_91298] +[group_91299] +[group_91300] +[group_91301] +[group_91302] +[group_91303] +[group_91304] +[group_91305] +[group_91306] +[group_91307] +[group_91308] +[group_91309] +[group_91310] +[group_91311] +[group_91312] +[group_91313] +[group_91314] +[group_91315] +[group_91316] +[group_91317] +[group_91318] +[group_91319] +[group_91320] +[group_91321] +[group_91322] +[group_91323] +[group_91324] +[group_91325] +[group_91326] +[group_91327] +[group_91328] +[group_91329] +[group_91330] +[group_91331] +[group_91332] +[group_91333] +[group_91334] +[group_91335] +[group_91336] +[group_91337] +[group_91338] +[group_91339] +[group_91340] +[group_91341] +[group_91342] +[group_91343] +[group_91344] +[group_91345] +[group_91346] +[group_91347] +[group_91348] +[group_91349] +[group_91350] +[group_91351] +[group_91352] +[group_91353] +[group_91354] +[group_91355] +[group_91356] +[group_91357] +[group_91358] +[group_91359] +[group_91360] +[group_91361] +[group_91362] +[group_91363] +[group_91364] +[group_91365] +[group_91366] +[group_91367] +[group_91368] +[group_91369] +[group_91370] +[group_91371] +[group_91372] +[group_91373] +[group_91374] +[group_91375] +[group_91376] +[group_91377] +[group_91378] +[group_91379] +[group_91380] +[group_91381] +[group_91382] +[group_91383] +[group_91384] +[group_91385] +[group_91386] +[group_91387] +[group_91388] +[group_91389] +[group_91390] +[group_91391] +[group_91392] +[group_91393] +[group_91394] +[group_91395] +[group_91396] +[group_91397] +[group_91398] +[group_91399] +[group_91400] +[group_91401] +[group_91402] +[group_91403] +[group_91404] +[group_91405] +[group_91406] +[group_91407] +[group_91408] +[group_91409] +[group_91410] +[group_91411] +[group_91412] +[group_91413] +[group_91414] +[group_91415] +[group_91416] +[group_91417] +[group_91418] +[group_91419] +[group_91420] +[group_91421] +[group_91422] +[group_91423] +[group_91424] +[group_91425] +[group_91426] +[group_91427] +[group_91428] +[group_91429] +[group_91430] +[group_91431] +[group_91432] +[group_91433] +[group_91434] +[group_91435] +[group_91436] +[group_91437] +[group_91438] +[group_91439] +[group_91440] +[group_91441] +[group_91442] +[group_91443] +[group_91444] +[group_91445] +[group_91446] +[group_91447] +[group_91448] +[group_91449] +[group_91450] +[group_91451] +[group_91452] +[group_91453] +[group_91454] +[group_91455] +[group_91456] +[group_91457] +[group_91458] +[group_91459] +[group_91460] +[group_91461] +[group_91462] +[group_91463] +[group_91464] +[group_91465] +[group_91466] +[group_91467] +[group_91468] +[group_91469] +[group_91470] +[group_91471] +[group_91472] +[group_91473] +[group_91474] +[group_91475] +[group_91476] +[group_91477] +[group_91478] +[group_91479] +[group_91480] +[group_91481] +[group_91482] +[group_91483] +[group_91484] +[group_91485] +[group_91486] +[group_91487] +[group_91488] +[group_91489] +[group_91490] +[group_91491] +[group_91492] +[group_91493] +[group_91494] +[group_91495] +[group_91496] +[group_91497] +[group_91498] +[group_91499] +[group_91500] +[group_91501] +[group_91502] +[group_91503] +[group_91504] +[group_91505] +[group_91506] +[group_91507] +[group_91508] +[group_91509] +[group_91510] +[group_91511] +[group_91512] +[group_91513] +[group_91514] +[group_91515] +[group_91516] +[group_91517] +[group_91518] +[group_91519] +[group_91520] +[group_91521] +[group_91522] +[group_91523] +[group_91524] +[group_91525] +[group_91526] +[group_91527] +[group_91528] +[group_91529] +[group_91530] +[group_91531] +[group_91532] +[group_91533] +[group_91534] +[group_91535] +[group_91536] +[group_91537] +[group_91538] +[group_91539] +[group_91540] +[group_91541] +[group_91542] +[group_91543] +[group_91544] +[group_91545] +[group_91546] +[group_91547] +[group_91548] +[group_91549] +[group_91550] +[group_91551] +[group_91552] +[group_91553] +[group_91554] +[group_91555] +[group_91556] +[group_91557] +[group_91558] +[group_91559] +[group_91560] +[group_91561] +[group_91562] +[group_91563] +[group_91564] +[group_91565] +[group_91566] +[group_91567] +[group_91568] +[group_91569] +[group_91570] +[group_91571] +[group_91572] +[group_91573] +[group_91574] +[group_91575] +[group_91576] +[group_91577] +[group_91578] +[group_91579] +[group_91580] +[group_91581] +[group_91582] +[group_91583] +[group_91584] +[group_91585] +[group_91586] +[group_91587] +[group_91588] +[group_91589] +[group_91590] +[group_91591] +[group_91592] +[group_91593] +[group_91594] +[group_91595] +[group_91596] +[group_91597] +[group_91598] +[group_91599] +[group_91600] +[group_91601] +[group_91602] +[group_91603] +[group_91604] +[group_91605] +[group_91606] +[group_91607] +[group_91608] +[group_91609] +[group_91610] +[group_91611] +[group_91612] +[group_91613] +[group_91614] +[group_91615] +[group_91616] +[group_91617] +[group_91618] +[group_91619] +[group_91620] +[group_91621] +[group_91622] +[group_91623] +[group_91624] +[group_91625] +[group_91626] +[group_91627] +[group_91628] +[group_91629] +[group_91630] +[group_91631] +[group_91632] +[group_91633] +[group_91634] +[group_91635] +[group_91636] +[group_91637] +[group_91638] +[group_91639] +[group_91640] +[group_91641] +[group_91642] +[group_91643] +[group_91644] +[group_91645] +[group_91646] +[group_91647] +[group_91648] +[group_91649] +[group_91650] +[group_91651] +[group_91652] +[group_91653] +[group_91654] +[group_91655] +[group_91656] +[group_91657] +[group_91658] +[group_91659] +[group_91660] +[group_91661] +[group_91662] +[group_91663] +[group_91664] +[group_91665] +[group_91666] +[group_91667] +[group_91668] +[group_91669] +[group_91670] +[group_91671] +[group_91672] +[group_91673] +[group_91674] +[group_91675] +[group_91676] +[group_91677] +[group_91678] +[group_91679] +[group_91680] +[group_91681] +[group_91682] +[group_91683] +[group_91684] +[group_91685] +[group_91686] +[group_91687] +[group_91688] +[group_91689] +[group_91690] +[group_91691] +[group_91692] +[group_91693] +[group_91694] +[group_91695] +[group_91696] +[group_91697] +[group_91698] +[group_91699] +[group_91700] +[group_91701] +[group_91702] +[group_91703] +[group_91704] +[group_91705] +[group_91706] +[group_91707] +[group_91708] +[group_91709] +[group_91710] +[group_91711] +[group_91712] +[group_91713] +[group_91714] +[group_91715] +[group_91716] +[group_91717] +[group_91718] +[group_91719] +[group_91720] +[group_91721] +[group_91722] +[group_91723] +[group_91724] +[group_91725] +[group_91726] +[group_91727] +[group_91728] +[group_91729] +[group_91730] +[group_91731] +[group_91732] +[group_91733] +[group_91734] +[group_91735] +[group_91736] +[group_91737] +[group_91738] +[group_91739] +[group_91740] +[group_91741] +[group_91742] +[group_91743] +[group_91744] +[group_91745] +[group_91746] +[group_91747] +[group_91748] +[group_91749] +[group_91750] +[group_91751] +[group_91752] +[group_91753] +[group_91754] +[group_91755] +[group_91756] +[group_91757] +[group_91758] +[group_91759] +[group_91760] +[group_91761] +[group_91762] +[group_91763] +[group_91764] +[group_91765] +[group_91766] +[group_91767] +[group_91768] +[group_91769] +[group_91770] +[group_91771] +[group_91772] +[group_91773] +[group_91774] +[group_91775] +[group_91776] +[group_91777] +[group_91778] +[group_91779] +[group_91780] +[group_91781] +[group_91782] +[group_91783] +[group_91784] +[group_91785] +[group_91786] +[group_91787] +[group_91788] +[group_91789] +[group_91790] +[group_91791] +[group_91792] +[group_91793] +[group_91794] +[group_91795] +[group_91796] +[group_91797] +[group_91798] +[group_91799] +[group_91800] +[group_91801] +[group_91802] +[group_91803] +[group_91804] +[group_91805] +[group_91806] +[group_91807] +[group_91808] +[group_91809] +[group_91810] +[group_91811] +[group_91812] +[group_91813] +[group_91814] +[group_91815] +[group_91816] +[group_91817] +[group_91818] +[group_91819] +[group_91820] +[group_91821] +[group_91822] +[group_91823] +[group_91824] +[group_91825] +[group_91826] +[group_91827] +[group_91828] +[group_91829] +[group_91830] +[group_91831] +[group_91832] +[group_91833] +[group_91834] +[group_91835] +[group_91836] +[group_91837] +[group_91838] +[group_91839] +[group_91840] +[group_91841] +[group_91842] +[group_91843] +[group_91844] +[group_91845] +[group_91846] +[group_91847] +[group_91848] +[group_91849] +[group_91850] +[group_91851] +[group_91852] +[group_91853] +[group_91854] +[group_91855] +[group_91856] +[group_91857] +[group_91858] +[group_91859] +[group_91860] +[group_91861] +[group_91862] +[group_91863] +[group_91864] +[group_91865] +[group_91866] +[group_91867] +[group_91868] +[group_91869] +[group_91870] +[group_91871] +[group_91872] +[group_91873] +[group_91874] +[group_91875] +[group_91876] +[group_91877] +[group_91878] +[group_91879] +[group_91880] +[group_91881] +[group_91882] +[group_91883] +[group_91884] +[group_91885] +[group_91886] +[group_91887] +[group_91888] +[group_91889] +[group_91890] +[group_91891] +[group_91892] +[group_91893] +[group_91894] +[group_91895] +[group_91896] +[group_91897] +[group_91898] +[group_91899] +[group_91900] +[group_91901] +[group_91902] +[group_91903] +[group_91904] +[group_91905] +[group_91906] +[group_91907] +[group_91908] +[group_91909] +[group_91910] +[group_91911] +[group_91912] +[group_91913] +[group_91914] +[group_91915] +[group_91916] +[group_91917] +[group_91918] +[group_91919] +[group_91920] +[group_91921] +[group_91922] +[group_91923] +[group_91924] +[group_91925] +[group_91926] +[group_91927] +[group_91928] +[group_91929] +[group_91930] +[group_91931] +[group_91932] +[group_91933] +[group_91934] +[group_91935] +[group_91936] +[group_91937] +[group_91938] +[group_91939] +[group_91940] +[group_91941] +[group_91942] +[group_91943] +[group_91944] +[group_91945] +[group_91946] +[group_91947] +[group_91948] +[group_91949] +[group_91950] +[group_91951] +[group_91952] +[group_91953] +[group_91954] +[group_91955] +[group_91956] +[group_91957] +[group_91958] +[group_91959] +[group_91960] +[group_91961] +[group_91962] +[group_91963] +[group_91964] +[group_91965] +[group_91966] +[group_91967] +[group_91968] +[group_91969] +[group_91970] +[group_91971] +[group_91972] +[group_91973] +[group_91974] +[group_91975] +[group_91976] +[group_91977] +[group_91978] +[group_91979] +[group_91980] +[group_91981] +[group_91982] +[group_91983] +[group_91984] +[group_91985] +[group_91986] +[group_91987] +[group_91988] +[group_91989] +[group_91990] +[group_91991] +[group_91992] +[group_91993] +[group_91994] +[group_91995] +[group_91996] +[group_91997] +[group_91998] +[group_91999] +[group_92000] +[group_92001] +[group_92002] +[group_92003] +[group_92004] +[group_92005] +[group_92006] +[group_92007] +[group_92008] +[group_92009] +[group_92010] +[group_92011] +[group_92012] +[group_92013] +[group_92014] +[group_92015] +[group_92016] +[group_92017] +[group_92018] +[group_92019] +[group_92020] +[group_92021] +[group_92022] +[group_92023] +[group_92024] +[group_92025] +[group_92026] +[group_92027] +[group_92028] +[group_92029] +[group_92030] +[group_92031] +[group_92032] +[group_92033] +[group_92034] +[group_92035] +[group_92036] +[group_92037] +[group_92038] +[group_92039] +[group_92040] +[group_92041] +[group_92042] +[group_92043] +[group_92044] +[group_92045] +[group_92046] +[group_92047] +[group_92048] +[group_92049] +[group_92050] +[group_92051] +[group_92052] +[group_92053] +[group_92054] +[group_92055] +[group_92056] +[group_92057] +[group_92058] +[group_92059] +[group_92060] +[group_92061] +[group_92062] +[group_92063] +[group_92064] +[group_92065] +[group_92066] +[group_92067] +[group_92068] +[group_92069] +[group_92070] +[group_92071] +[group_92072] +[group_92073] +[group_92074] +[group_92075] +[group_92076] +[group_92077] +[group_92078] +[group_92079] +[group_92080] +[group_92081] +[group_92082] +[group_92083] +[group_92084] +[group_92085] +[group_92086] +[group_92087] +[group_92088] +[group_92089] +[group_92090] +[group_92091] +[group_92092] +[group_92093] +[group_92094] +[group_92095] +[group_92096] +[group_92097] +[group_92098] +[group_92099] +[group_92100] +[group_92101] +[group_92102] +[group_92103] +[group_92104] +[group_92105] +[group_92106] +[group_92107] +[group_92108] +[group_92109] +[group_92110] +[group_92111] +[group_92112] +[group_92113] +[group_92114] +[group_92115] +[group_92116] +[group_92117] +[group_92118] +[group_92119] +[group_92120] +[group_92121] +[group_92122] +[group_92123] +[group_92124] +[group_92125] +[group_92126] +[group_92127] +[group_92128] +[group_92129] +[group_92130] +[group_92131] +[group_92132] +[group_92133] +[group_92134] +[group_92135] +[group_92136] +[group_92137] +[group_92138] +[group_92139] +[group_92140] +[group_92141] +[group_92142] +[group_92143] +[group_92144] +[group_92145] +[group_92146] +[group_92147] +[group_92148] +[group_92149] +[group_92150] +[group_92151] +[group_92152] +[group_92153] +[group_92154] +[group_92155] +[group_92156] +[group_92157] +[group_92158] +[group_92159] +[group_92160] +[group_92161] +[group_92162] +[group_92163] +[group_92164] +[group_92165] +[group_92166] +[group_92167] +[group_92168] +[group_92169] +[group_92170] +[group_92171] +[group_92172] +[group_92173] +[group_92174] +[group_92175] +[group_92176] +[group_92177] +[group_92178] +[group_92179] +[group_92180] +[group_92181] +[group_92182] +[group_92183] +[group_92184] +[group_92185] +[group_92186] +[group_92187] +[group_92188] +[group_92189] +[group_92190] +[group_92191] +[group_92192] +[group_92193] +[group_92194] +[group_92195] +[group_92196] +[group_92197] +[group_92198] +[group_92199] +[group_92200] +[group_92201] +[group_92202] +[group_92203] +[group_92204] +[group_92205] +[group_92206] +[group_92207] +[group_92208] +[group_92209] +[group_92210] +[group_92211] +[group_92212] +[group_92213] +[group_92214] +[group_92215] +[group_92216] +[group_92217] +[group_92218] +[group_92219] +[group_92220] +[group_92221] +[group_92222] +[group_92223] +[group_92224] +[group_92225] +[group_92226] +[group_92227] +[group_92228] +[group_92229] +[group_92230] +[group_92231] +[group_92232] +[group_92233] +[group_92234] +[group_92235] +[group_92236] +[group_92237] +[group_92238] +[group_92239] +[group_92240] +[group_92241] +[group_92242] +[group_92243] +[group_92244] +[group_92245] +[group_92246] +[group_92247] +[group_92248] +[group_92249] +[group_92250] +[group_92251] +[group_92252] +[group_92253] +[group_92254] +[group_92255] +[group_92256] +[group_92257] +[group_92258] +[group_92259] +[group_92260] +[group_92261] +[group_92262] +[group_92263] +[group_92264] +[group_92265] +[group_92266] +[group_92267] +[group_92268] +[group_92269] +[group_92270] +[group_92271] +[group_92272] +[group_92273] +[group_92274] +[group_92275] +[group_92276] +[group_92277] +[group_92278] +[group_92279] +[group_92280] +[group_92281] +[group_92282] +[group_92283] +[group_92284] +[group_92285] +[group_92286] +[group_92287] +[group_92288] +[group_92289] +[group_92290] +[group_92291] +[group_92292] +[group_92293] +[group_92294] +[group_92295] +[group_92296] +[group_92297] +[group_92298] +[group_92299] +[group_92300] +[group_92301] +[group_92302] +[group_92303] +[group_92304] +[group_92305] +[group_92306] +[group_92307] +[group_92308] +[group_92309] +[group_92310] +[group_92311] +[group_92312] +[group_92313] +[group_92314] +[group_92315] +[group_92316] +[group_92317] +[group_92318] +[group_92319] +[group_92320] +[group_92321] +[group_92322] +[group_92323] +[group_92324] +[group_92325] +[group_92326] +[group_92327] +[group_92328] +[group_92329] +[group_92330] +[group_92331] +[group_92332] +[group_92333] +[group_92334] +[group_92335] +[group_92336] +[group_92337] +[group_92338] +[group_92339] +[group_92340] +[group_92341] +[group_92342] +[group_92343] +[group_92344] +[group_92345] +[group_92346] +[group_92347] +[group_92348] +[group_92349] +[group_92350] +[group_92351] +[group_92352] +[group_92353] +[group_92354] +[group_92355] +[group_92356] +[group_92357] +[group_92358] +[group_92359] +[group_92360] +[group_92361] +[group_92362] +[group_92363] +[group_92364] +[group_92365] +[group_92366] +[group_92367] +[group_92368] +[group_92369] +[group_92370] +[group_92371] +[group_92372] +[group_92373] +[group_92374] +[group_92375] +[group_92376] +[group_92377] +[group_92378] +[group_92379] +[group_92380] +[group_92381] +[group_92382] +[group_92383] +[group_92384] +[group_92385] +[group_92386] +[group_92387] +[group_92388] +[group_92389] +[group_92390] +[group_92391] +[group_92392] +[group_92393] +[group_92394] +[group_92395] +[group_92396] +[group_92397] +[group_92398] +[group_92399] +[group_92400] +[group_92401] +[group_92402] +[group_92403] +[group_92404] +[group_92405] +[group_92406] +[group_92407] +[group_92408] +[group_92409] +[group_92410] +[group_92411] +[group_92412] +[group_92413] +[group_92414] +[group_92415] +[group_92416] +[group_92417] +[group_92418] +[group_92419] +[group_92420] +[group_92421] +[group_92422] +[group_92423] +[group_92424] +[group_92425] +[group_92426] +[group_92427] +[group_92428] +[group_92429] +[group_92430] +[group_92431] +[group_92432] +[group_92433] +[group_92434] +[group_92435] +[group_92436] +[group_92437] +[group_92438] +[group_92439] +[group_92440] +[group_92441] +[group_92442] +[group_92443] +[group_92444] +[group_92445] +[group_92446] +[group_92447] +[group_92448] +[group_92449] +[group_92450] +[group_92451] +[group_92452] +[group_92453] +[group_92454] +[group_92455] +[group_92456] +[group_92457] +[group_92458] +[group_92459] +[group_92460] +[group_92461] +[group_92462] +[group_92463] +[group_92464] +[group_92465] +[group_92466] +[group_92467] +[group_92468] +[group_92469] +[group_92470] +[group_92471] +[group_92472] +[group_92473] +[group_92474] +[group_92475] +[group_92476] +[group_92477] +[group_92478] +[group_92479] +[group_92480] +[group_92481] +[group_92482] +[group_92483] +[group_92484] +[group_92485] +[group_92486] +[group_92487] +[group_92488] +[group_92489] +[group_92490] +[group_92491] +[group_92492] +[group_92493] +[group_92494] +[group_92495] +[group_92496] +[group_92497] +[group_92498] +[group_92499] +[group_92500] +[group_92501] +[group_92502] +[group_92503] +[group_92504] +[group_92505] +[group_92506] +[group_92507] +[group_92508] +[group_92509] +[group_92510] +[group_92511] +[group_92512] +[group_92513] +[group_92514] +[group_92515] +[group_92516] +[group_92517] +[group_92518] +[group_92519] +[group_92520] +[group_92521] +[group_92522] +[group_92523] +[group_92524] +[group_92525] +[group_92526] +[group_92527] +[group_92528] +[group_92529] +[group_92530] +[group_92531] +[group_92532] +[group_92533] +[group_92534] +[group_92535] +[group_92536] +[group_92537] +[group_92538] +[group_92539] +[group_92540] +[group_92541] +[group_92542] +[group_92543] +[group_92544] +[group_92545] +[group_92546] +[group_92547] +[group_92548] +[group_92549] +[group_92550] +[group_92551] +[group_92552] +[group_92553] +[group_92554] +[group_92555] +[group_92556] +[group_92557] +[group_92558] +[group_92559] +[group_92560] +[group_92561] +[group_92562] +[group_92563] +[group_92564] +[group_92565] +[group_92566] +[group_92567] +[group_92568] +[group_92569] +[group_92570] +[group_92571] +[group_92572] +[group_92573] +[group_92574] +[group_92575] +[group_92576] +[group_92577] +[group_92578] +[group_92579] +[group_92580] +[group_92581] +[group_92582] +[group_92583] +[group_92584] +[group_92585] +[group_92586] +[group_92587] +[group_92588] +[group_92589] +[group_92590] +[group_92591] +[group_92592] +[group_92593] +[group_92594] +[group_92595] +[group_92596] +[group_92597] +[group_92598] +[group_92599] +[group_92600] +[group_92601] +[group_92602] +[group_92603] +[group_92604] +[group_92605] +[group_92606] +[group_92607] +[group_92608] +[group_92609] +[group_92610] +[group_92611] +[group_92612] +[group_92613] +[group_92614] +[group_92615] +[group_92616] +[group_92617] +[group_92618] +[group_92619] +[group_92620] +[group_92621] +[group_92622] +[group_92623] +[group_92624] +[group_92625] +[group_92626] +[group_92627] +[group_92628] +[group_92629] +[group_92630] +[group_92631] +[group_92632] +[group_92633] +[group_92634] +[group_92635] +[group_92636] +[group_92637] +[group_92638] +[group_92639] +[group_92640] +[group_92641] +[group_92642] +[group_92643] +[group_92644] +[group_92645] +[group_92646] +[group_92647] +[group_92648] +[group_92649] +[group_92650] +[group_92651] +[group_92652] +[group_92653] +[group_92654] +[group_92655] +[group_92656] +[group_92657] +[group_92658] +[group_92659] +[group_92660] +[group_92661] +[group_92662] +[group_92663] +[group_92664] +[group_92665] +[group_92666] +[group_92667] +[group_92668] +[group_92669] +[group_92670] +[group_92671] +[group_92672] +[group_92673] +[group_92674] +[group_92675] +[group_92676] +[group_92677] +[group_92678] +[group_92679] +[group_92680] +[group_92681] +[group_92682] +[group_92683] +[group_92684] +[group_92685] +[group_92686] +[group_92687] +[group_92688] +[group_92689] +[group_92690] +[group_92691] +[group_92692] +[group_92693] +[group_92694] +[group_92695] +[group_92696] +[group_92697] +[group_92698] +[group_92699] +[group_92700] +[group_92701] +[group_92702] +[group_92703] +[group_92704] +[group_92705] +[group_92706] +[group_92707] +[group_92708] +[group_92709] +[group_92710] +[group_92711] +[group_92712] +[group_92713] +[group_92714] +[group_92715] +[group_92716] +[group_92717] +[group_92718] +[group_92719] +[group_92720] +[group_92721] +[group_92722] +[group_92723] +[group_92724] +[group_92725] +[group_92726] +[group_92727] +[group_92728] +[group_92729] +[group_92730] +[group_92731] +[group_92732] +[group_92733] +[group_92734] +[group_92735] +[group_92736] +[group_92737] +[group_92738] +[group_92739] +[group_92740] +[group_92741] +[group_92742] +[group_92743] +[group_92744] +[group_92745] +[group_92746] +[group_92747] +[group_92748] +[group_92749] +[group_92750] +[group_92751] +[group_92752] +[group_92753] +[group_92754] +[group_92755] +[group_92756] +[group_92757] +[group_92758] +[group_92759] +[group_92760] +[group_92761] +[group_92762] +[group_92763] +[group_92764] +[group_92765] +[group_92766] +[group_92767] +[group_92768] +[group_92769] +[group_92770] +[group_92771] +[group_92772] +[group_92773] +[group_92774] +[group_92775] +[group_92776] +[group_92777] +[group_92778] +[group_92779] +[group_92780] +[group_92781] +[group_92782] +[group_92783] +[group_92784] +[group_92785] +[group_92786] +[group_92787] +[group_92788] +[group_92789] +[group_92790] +[group_92791] +[group_92792] +[group_92793] +[group_92794] +[group_92795] +[group_92796] +[group_92797] +[group_92798] +[group_92799] +[group_92800] +[group_92801] +[group_92802] +[group_92803] +[group_92804] +[group_92805] +[group_92806] +[group_92807] +[group_92808] +[group_92809] +[group_92810] +[group_92811] +[group_92812] +[group_92813] +[group_92814] +[group_92815] +[group_92816] +[group_92817] +[group_92818] +[group_92819] +[group_92820] +[group_92821] +[group_92822] +[group_92823] +[group_92824] +[group_92825] +[group_92826] +[group_92827] +[group_92828] +[group_92829] +[group_92830] +[group_92831] +[group_92832] +[group_92833] +[group_92834] +[group_92835] +[group_92836] +[group_92837] +[group_92838] +[group_92839] +[group_92840] +[group_92841] +[group_92842] +[group_92843] +[group_92844] +[group_92845] +[group_92846] +[group_92847] +[group_92848] +[group_92849] +[group_92850] +[group_92851] +[group_92852] +[group_92853] +[group_92854] +[group_92855] +[group_92856] +[group_92857] +[group_92858] +[group_92859] +[group_92860] +[group_92861] +[group_92862] +[group_92863] +[group_92864] +[group_92865] +[group_92866] +[group_92867] +[group_92868] +[group_92869] +[group_92870] +[group_92871] +[group_92872] +[group_92873] +[group_92874] +[group_92875] +[group_92876] +[group_92877] +[group_92878] +[group_92879] +[group_92880] +[group_92881] +[group_92882] +[group_92883] +[group_92884] +[group_92885] +[group_92886] +[group_92887] +[group_92888] +[group_92889] +[group_92890] +[group_92891] +[group_92892] +[group_92893] +[group_92894] +[group_92895] +[group_92896] +[group_92897] +[group_92898] +[group_92899] +[group_92900] +[group_92901] +[group_92902] +[group_92903] +[group_92904] +[group_92905] +[group_92906] +[group_92907] +[group_92908] +[group_92909] +[group_92910] +[group_92911] +[group_92912] +[group_92913] +[group_92914] +[group_92915] +[group_92916] +[group_92917] +[group_92918] +[group_92919] +[group_92920] +[group_92921] +[group_92922] +[group_92923] +[group_92924] +[group_92925] +[group_92926] +[group_92927] +[group_92928] +[group_92929] +[group_92930] +[group_92931] +[group_92932] +[group_92933] +[group_92934] +[group_92935] +[group_92936] +[group_92937] +[group_92938] +[group_92939] +[group_92940] +[group_92941] +[group_92942] +[group_92943] +[group_92944] +[group_92945] +[group_92946] +[group_92947] +[group_92948] +[group_92949] +[group_92950] +[group_92951] +[group_92952] +[group_92953] +[group_92954] +[group_92955] +[group_92956] +[group_92957] +[group_92958] +[group_92959] +[group_92960] +[group_92961] +[group_92962] +[group_92963] +[group_92964] +[group_92965] +[group_92966] +[group_92967] +[group_92968] +[group_92969] +[group_92970] +[group_92971] +[group_92972] +[group_92973] +[group_92974] +[group_92975] +[group_92976] +[group_92977] +[group_92978] +[group_92979] +[group_92980] +[group_92981] +[group_92982] +[group_92983] +[group_92984] +[group_92985] +[group_92986] +[group_92987] +[group_92988] +[group_92989] +[group_92990] +[group_92991] +[group_92992] +[group_92993] +[group_92994] +[group_92995] +[group_92996] +[group_92997] +[group_92998] +[group_92999] +[group_93000] +[group_93001] +[group_93002] +[group_93003] +[group_93004] +[group_93005] +[group_93006] +[group_93007] +[group_93008] +[group_93009] +[group_93010] +[group_93011] +[group_93012] +[group_93013] +[group_93014] +[group_93015] +[group_93016] +[group_93017] +[group_93018] +[group_93019] +[group_93020] +[group_93021] +[group_93022] +[group_93023] +[group_93024] +[group_93025] +[group_93026] +[group_93027] +[group_93028] +[group_93029] +[group_93030] +[group_93031] +[group_93032] +[group_93033] +[group_93034] +[group_93035] +[group_93036] +[group_93037] +[group_93038] +[group_93039] +[group_93040] +[group_93041] +[group_93042] +[group_93043] +[group_93044] +[group_93045] +[group_93046] +[group_93047] +[group_93048] +[group_93049] +[group_93050] +[group_93051] +[group_93052] +[group_93053] +[group_93054] +[group_93055] +[group_93056] +[group_93057] +[group_93058] +[group_93059] +[group_93060] +[group_93061] +[group_93062] +[group_93063] +[group_93064] +[group_93065] +[group_93066] +[group_93067] +[group_93068] +[group_93069] +[group_93070] +[group_93071] +[group_93072] +[group_93073] +[group_93074] +[group_93075] +[group_93076] +[group_93077] +[group_93078] +[group_93079] +[group_93080] +[group_93081] +[group_93082] +[group_93083] +[group_93084] +[group_93085] +[group_93086] +[group_93087] +[group_93088] +[group_93089] +[group_93090] +[group_93091] +[group_93092] +[group_93093] +[group_93094] +[group_93095] +[group_93096] +[group_93097] +[group_93098] +[group_93099] +[group_93100] +[group_93101] +[group_93102] +[group_93103] +[group_93104] +[group_93105] +[group_93106] +[group_93107] +[group_93108] +[group_93109] +[group_93110] +[group_93111] +[group_93112] +[group_93113] +[group_93114] +[group_93115] +[group_93116] +[group_93117] +[group_93118] +[group_93119] +[group_93120] +[group_93121] +[group_93122] +[group_93123] +[group_93124] +[group_93125] +[group_93126] +[group_93127] +[group_93128] +[group_93129] +[group_93130] +[group_93131] +[group_93132] +[group_93133] +[group_93134] +[group_93135] +[group_93136] +[group_93137] +[group_93138] +[group_93139] +[group_93140] +[group_93141] +[group_93142] +[group_93143] +[group_93144] +[group_93145] +[group_93146] +[group_93147] +[group_93148] +[group_93149] +[group_93150] +[group_93151] +[group_93152] +[group_93153] +[group_93154] +[group_93155] +[group_93156] +[group_93157] +[group_93158] +[group_93159] +[group_93160] +[group_93161] +[group_93162] +[group_93163] +[group_93164] +[group_93165] +[group_93166] +[group_93167] +[group_93168] +[group_93169] +[group_93170] +[group_93171] +[group_93172] +[group_93173] +[group_93174] +[group_93175] +[group_93176] +[group_93177] +[group_93178] +[group_93179] +[group_93180] +[group_93181] +[group_93182] +[group_93183] +[group_93184] +[group_93185] +[group_93186] +[group_93187] +[group_93188] +[group_93189] +[group_93190] +[group_93191] +[group_93192] +[group_93193] +[group_93194] +[group_93195] +[group_93196] +[group_93197] +[group_93198] +[group_93199] +[group_93200] +[group_93201] +[group_93202] +[group_93203] +[group_93204] +[group_93205] +[group_93206] +[group_93207] +[group_93208] +[group_93209] +[group_93210] +[group_93211] +[group_93212] +[group_93213] +[group_93214] +[group_93215] +[group_93216] +[group_93217] +[group_93218] +[group_93219] +[group_93220] +[group_93221] +[group_93222] +[group_93223] +[group_93224] +[group_93225] +[group_93226] +[group_93227] +[group_93228] +[group_93229] +[group_93230] +[group_93231] +[group_93232] +[group_93233] +[group_93234] +[group_93235] +[group_93236] +[group_93237] +[group_93238] +[group_93239] +[group_93240] +[group_93241] +[group_93242] +[group_93243] +[group_93244] +[group_93245] +[group_93246] +[group_93247] +[group_93248] +[group_93249] +[group_93250] +[group_93251] +[group_93252] +[group_93253] +[group_93254] +[group_93255] +[group_93256] +[group_93257] +[group_93258] +[group_93259] +[group_93260] +[group_93261] +[group_93262] +[group_93263] +[group_93264] +[group_93265] +[group_93266] +[group_93267] +[group_93268] +[group_93269] +[group_93270] +[group_93271] +[group_93272] +[group_93273] +[group_93274] +[group_93275] +[group_93276] +[group_93277] +[group_93278] +[group_93279] +[group_93280] +[group_93281] +[group_93282] +[group_93283] +[group_93284] +[group_93285] +[group_93286] +[group_93287] +[group_93288] +[group_93289] +[group_93290] +[group_93291] +[group_93292] +[group_93293] +[group_93294] +[group_93295] +[group_93296] +[group_93297] +[group_93298] +[group_93299] +[group_93300] +[group_93301] +[group_93302] +[group_93303] +[group_93304] +[group_93305] +[group_93306] +[group_93307] +[group_93308] +[group_93309] +[group_93310] +[group_93311] +[group_93312] +[group_93313] +[group_93314] +[group_93315] +[group_93316] +[group_93317] +[group_93318] +[group_93319] +[group_93320] +[group_93321] +[group_93322] +[group_93323] +[group_93324] +[group_93325] +[group_93326] +[group_93327] +[group_93328] +[group_93329] +[group_93330] +[group_93331] +[group_93332] +[group_93333] +[group_93334] +[group_93335] +[group_93336] +[group_93337] +[group_93338] +[group_93339] +[group_93340] +[group_93341] +[group_93342] +[group_93343] +[group_93344] +[group_93345] +[group_93346] +[group_93347] +[group_93348] +[group_93349] +[group_93350] +[group_93351] +[group_93352] +[group_93353] +[group_93354] +[group_93355] +[group_93356] +[group_93357] +[group_93358] +[group_93359] +[group_93360] +[group_93361] +[group_93362] +[group_93363] +[group_93364] +[group_93365] +[group_93366] +[group_93367] +[group_93368] +[group_93369] +[group_93370] +[group_93371] +[group_93372] +[group_93373] +[group_93374] +[group_93375] +[group_93376] +[group_93377] +[group_93378] +[group_93379] +[group_93380] +[group_93381] +[group_93382] +[group_93383] +[group_93384] +[group_93385] +[group_93386] +[group_93387] +[group_93388] +[group_93389] +[group_93390] +[group_93391] +[group_93392] +[group_93393] +[group_93394] +[group_93395] +[group_93396] +[group_93397] +[group_93398] +[group_93399] +[group_93400] +[group_93401] +[group_93402] +[group_93403] +[group_93404] +[group_93405] +[group_93406] +[group_93407] +[group_93408] +[group_93409] +[group_93410] +[group_93411] +[group_93412] +[group_93413] +[group_93414] +[group_93415] +[group_93416] +[group_93417] +[group_93418] +[group_93419] +[group_93420] +[group_93421] +[group_93422] +[group_93423] +[group_93424] +[group_93425] +[group_93426] +[group_93427] +[group_93428] +[group_93429] +[group_93430] +[group_93431] +[group_93432] +[group_93433] +[group_93434] +[group_93435] +[group_93436] +[group_93437] +[group_93438] +[group_93439] +[group_93440] +[group_93441] +[group_93442] +[group_93443] +[group_93444] +[group_93445] +[group_93446] +[group_93447] +[group_93448] +[group_93449] +[group_93450] +[group_93451] +[group_93452] +[group_93453] +[group_93454] +[group_93455] +[group_93456] +[group_93457] +[group_93458] +[group_93459] +[group_93460] +[group_93461] +[group_93462] +[group_93463] +[group_93464] +[group_93465] +[group_93466] +[group_93467] +[group_93468] +[group_93469] +[group_93470] +[group_93471] +[group_93472] +[group_93473] +[group_93474] +[group_93475] +[group_93476] +[group_93477] +[group_93478] +[group_93479] +[group_93480] +[group_93481] +[group_93482] +[group_93483] +[group_93484] +[group_93485] +[group_93486] +[group_93487] +[group_93488] +[group_93489] +[group_93490] +[group_93491] +[group_93492] +[group_93493] +[group_93494] +[group_93495] +[group_93496] +[group_93497] +[group_93498] +[group_93499] +[group_93500] +[group_93501] +[group_93502] +[group_93503] +[group_93504] +[group_93505] +[group_93506] +[group_93507] +[group_93508] +[group_93509] +[group_93510] +[group_93511] +[group_93512] +[group_93513] +[group_93514] +[group_93515] +[group_93516] +[group_93517] +[group_93518] +[group_93519] +[group_93520] +[group_93521] +[group_93522] +[group_93523] +[group_93524] +[group_93525] +[group_93526] +[group_93527] +[group_93528] +[group_93529] +[group_93530] +[group_93531] +[group_93532] +[group_93533] +[group_93534] +[group_93535] +[group_93536] +[group_93537] +[group_93538] +[group_93539] +[group_93540] +[group_93541] +[group_93542] +[group_93543] +[group_93544] +[group_93545] +[group_93546] +[group_93547] +[group_93548] +[group_93549] +[group_93550] +[group_93551] +[group_93552] +[group_93553] +[group_93554] +[group_93555] +[group_93556] +[group_93557] +[group_93558] +[group_93559] +[group_93560] +[group_93561] +[group_93562] +[group_93563] +[group_93564] +[group_93565] +[group_93566] +[group_93567] +[group_93568] +[group_93569] +[group_93570] +[group_93571] +[group_93572] +[group_93573] +[group_93574] +[group_93575] +[group_93576] +[group_93577] +[group_93578] +[group_93579] +[group_93580] +[group_93581] +[group_93582] +[group_93583] +[group_93584] +[group_93585] +[group_93586] +[group_93587] +[group_93588] +[group_93589] +[group_93590] +[group_93591] +[group_93592] +[group_93593] +[group_93594] +[group_93595] +[group_93596] +[group_93597] +[group_93598] +[group_93599] +[group_93600] +[group_93601] +[group_93602] +[group_93603] +[group_93604] +[group_93605] +[group_93606] +[group_93607] +[group_93608] +[group_93609] +[group_93610] +[group_93611] +[group_93612] +[group_93613] +[group_93614] +[group_93615] +[group_93616] +[group_93617] +[group_93618] +[group_93619] +[group_93620] +[group_93621] +[group_93622] +[group_93623] +[group_93624] +[group_93625] +[group_93626] +[group_93627] +[group_93628] +[group_93629] +[group_93630] +[group_93631] +[group_93632] +[group_93633] +[group_93634] +[group_93635] +[group_93636] +[group_93637] +[group_93638] +[group_93639] +[group_93640] +[group_93641] +[group_93642] +[group_93643] +[group_93644] +[group_93645] +[group_93646] +[group_93647] +[group_93648] +[group_93649] +[group_93650] +[group_93651] +[group_93652] +[group_93653] +[group_93654] +[group_93655] +[group_93656] +[group_93657] +[group_93658] +[group_93659] +[group_93660] +[group_93661] +[group_93662] +[group_93663] +[group_93664] +[group_93665] +[group_93666] +[group_93667] +[group_93668] +[group_93669] +[group_93670] +[group_93671] +[group_93672] +[group_93673] +[group_93674] +[group_93675] +[group_93676] +[group_93677] +[group_93678] +[group_93679] +[group_93680] +[group_93681] +[group_93682] +[group_93683] +[group_93684] +[group_93685] +[group_93686] +[group_93687] +[group_93688] +[group_93689] +[group_93690] +[group_93691] +[group_93692] +[group_93693] +[group_93694] +[group_93695] +[group_93696] +[group_93697] +[group_93698] +[group_93699] +[group_93700] +[group_93701] +[group_93702] +[group_93703] +[group_93704] +[group_93705] +[group_93706] +[group_93707] +[group_93708] +[group_93709] +[group_93710] +[group_93711] +[group_93712] +[group_93713] +[group_93714] +[group_93715] +[group_93716] +[group_93717] +[group_93718] +[group_93719] +[group_93720] +[group_93721] +[group_93722] +[group_93723] +[group_93724] +[group_93725] +[group_93726] +[group_93727] +[group_93728] +[group_93729] +[group_93730] +[group_93731] +[group_93732] +[group_93733] +[group_93734] +[group_93735] +[group_93736] +[group_93737] +[group_93738] +[group_93739] +[group_93740] +[group_93741] +[group_93742] +[group_93743] +[group_93744] +[group_93745] +[group_93746] +[group_93747] +[group_93748] +[group_93749] +[group_93750] +[group_93751] +[group_93752] +[group_93753] +[group_93754] +[group_93755] +[group_93756] +[group_93757] +[group_93758] +[group_93759] +[group_93760] +[group_93761] +[group_93762] +[group_93763] +[group_93764] +[group_93765] +[group_93766] +[group_93767] +[group_93768] +[group_93769] +[group_93770] +[group_93771] +[group_93772] +[group_93773] +[group_93774] +[group_93775] +[group_93776] +[group_93777] +[group_93778] +[group_93779] +[group_93780] +[group_93781] +[group_93782] +[group_93783] +[group_93784] +[group_93785] +[group_93786] +[group_93787] +[group_93788] +[group_93789] +[group_93790] +[group_93791] +[group_93792] +[group_93793] +[group_93794] +[group_93795] +[group_93796] +[group_93797] +[group_93798] +[group_93799] +[group_93800] +[group_93801] +[group_93802] +[group_93803] +[group_93804] +[group_93805] +[group_93806] +[group_93807] +[group_93808] +[group_93809] +[group_93810] +[group_93811] +[group_93812] +[group_93813] +[group_93814] +[group_93815] +[group_93816] +[group_93817] +[group_93818] +[group_93819] +[group_93820] +[group_93821] +[group_93822] +[group_93823] +[group_93824] +[group_93825] +[group_93826] +[group_93827] +[group_93828] +[group_93829] +[group_93830] +[group_93831] +[group_93832] +[group_93833] +[group_93834] +[group_93835] +[group_93836] +[group_93837] +[group_93838] +[group_93839] +[group_93840] +[group_93841] +[group_93842] +[group_93843] +[group_93844] +[group_93845] +[group_93846] +[group_93847] +[group_93848] +[group_93849] +[group_93850] +[group_93851] +[group_93852] +[group_93853] +[group_93854] +[group_93855] +[group_93856] +[group_93857] +[group_93858] +[group_93859] +[group_93860] +[group_93861] +[group_93862] +[group_93863] +[group_93864] +[group_93865] +[group_93866] +[group_93867] +[group_93868] +[group_93869] +[group_93870] +[group_93871] +[group_93872] +[group_93873] +[group_93874] +[group_93875] +[group_93876] +[group_93877] +[group_93878] +[group_93879] +[group_93880] +[group_93881] +[group_93882] +[group_93883] +[group_93884] +[group_93885] +[group_93886] +[group_93887] +[group_93888] +[group_93889] +[group_93890] +[group_93891] +[group_93892] +[group_93893] +[group_93894] +[group_93895] +[group_93896] +[group_93897] +[group_93898] +[group_93899] +[group_93900] +[group_93901] +[group_93902] +[group_93903] +[group_93904] +[group_93905] +[group_93906] +[group_93907] +[group_93908] +[group_93909] +[group_93910] +[group_93911] +[group_93912] +[group_93913] +[group_93914] +[group_93915] +[group_93916] +[group_93917] +[group_93918] +[group_93919] +[group_93920] +[group_93921] +[group_93922] +[group_93923] +[group_93924] +[group_93925] +[group_93926] +[group_93927] +[group_93928] +[group_93929] +[group_93930] +[group_93931] +[group_93932] +[group_93933] +[group_93934] +[group_93935] +[group_93936] +[group_93937] +[group_93938] +[group_93939] +[group_93940] +[group_93941] +[group_93942] +[group_93943] +[group_93944] +[group_93945] +[group_93946] +[group_93947] +[group_93948] +[group_93949] +[group_93950] +[group_93951] +[group_93952] +[group_93953] +[group_93954] +[group_93955] +[group_93956] +[group_93957] +[group_93958] +[group_93959] +[group_93960] +[group_93961] +[group_93962] +[group_93963] +[group_93964] +[group_93965] +[group_93966] +[group_93967] +[group_93968] +[group_93969] +[group_93970] +[group_93971] +[group_93972] +[group_93973] +[group_93974] +[group_93975] +[group_93976] +[group_93977] +[group_93978] +[group_93979] +[group_93980] +[group_93981] +[group_93982] +[group_93983] +[group_93984] +[group_93985] +[group_93986] +[group_93987] +[group_93988] +[group_93989] +[group_93990] +[group_93991] +[group_93992] +[group_93993] +[group_93994] +[group_93995] +[group_93996] +[group_93997] +[group_93998] +[group_93999] +[group_94000] +[group_94001] +[group_94002] +[group_94003] +[group_94004] +[group_94005] +[group_94006] +[group_94007] +[group_94008] +[group_94009] +[group_94010] +[group_94011] +[group_94012] +[group_94013] +[group_94014] +[group_94015] +[group_94016] +[group_94017] +[group_94018] +[group_94019] +[group_94020] +[group_94021] +[group_94022] +[group_94023] +[group_94024] +[group_94025] +[group_94026] +[group_94027] +[group_94028] +[group_94029] +[group_94030] +[group_94031] +[group_94032] +[group_94033] +[group_94034] +[group_94035] +[group_94036] +[group_94037] +[group_94038] +[group_94039] +[group_94040] +[group_94041] +[group_94042] +[group_94043] +[group_94044] +[group_94045] +[group_94046] +[group_94047] +[group_94048] +[group_94049] +[group_94050] +[group_94051] +[group_94052] +[group_94053] +[group_94054] +[group_94055] +[group_94056] +[group_94057] +[group_94058] +[group_94059] +[group_94060] +[group_94061] +[group_94062] +[group_94063] +[group_94064] +[group_94065] +[group_94066] +[group_94067] +[group_94068] +[group_94069] +[group_94070] +[group_94071] +[group_94072] +[group_94073] +[group_94074] +[group_94075] +[group_94076] +[group_94077] +[group_94078] +[group_94079] +[group_94080] +[group_94081] +[group_94082] +[group_94083] +[group_94084] +[group_94085] +[group_94086] +[group_94087] +[group_94088] +[group_94089] +[group_94090] +[group_94091] +[group_94092] +[group_94093] +[group_94094] +[group_94095] +[group_94096] +[group_94097] +[group_94098] +[group_94099] +[group_94100] +[group_94101] +[group_94102] +[group_94103] +[group_94104] +[group_94105] +[group_94106] +[group_94107] +[group_94108] +[group_94109] +[group_94110] +[group_94111] +[group_94112] +[group_94113] +[group_94114] +[group_94115] +[group_94116] +[group_94117] +[group_94118] +[group_94119] +[group_94120] +[group_94121] +[group_94122] +[group_94123] +[group_94124] +[group_94125] +[group_94126] +[group_94127] +[group_94128] +[group_94129] +[group_94130] +[group_94131] +[group_94132] +[group_94133] +[group_94134] +[group_94135] +[group_94136] +[group_94137] +[group_94138] +[group_94139] +[group_94140] +[group_94141] +[group_94142] +[group_94143] +[group_94144] +[group_94145] +[group_94146] +[group_94147] +[group_94148] +[group_94149] +[group_94150] +[group_94151] +[group_94152] +[group_94153] +[group_94154] +[group_94155] +[group_94156] +[group_94157] +[group_94158] +[group_94159] +[group_94160] +[group_94161] +[group_94162] +[group_94163] +[group_94164] +[group_94165] +[group_94166] +[group_94167] +[group_94168] +[group_94169] +[group_94170] +[group_94171] +[group_94172] +[group_94173] +[group_94174] +[group_94175] +[group_94176] +[group_94177] +[group_94178] +[group_94179] +[group_94180] +[group_94181] +[group_94182] +[group_94183] +[group_94184] +[group_94185] +[group_94186] +[group_94187] +[group_94188] +[group_94189] +[group_94190] +[group_94191] +[group_94192] +[group_94193] +[group_94194] +[group_94195] +[group_94196] +[group_94197] +[group_94198] +[group_94199] +[group_94200] +[group_94201] +[group_94202] +[group_94203] +[group_94204] +[group_94205] +[group_94206] +[group_94207] +[group_94208] +[group_94209] +[group_94210] +[group_94211] +[group_94212] +[group_94213] +[group_94214] +[group_94215] +[group_94216] +[group_94217] +[group_94218] +[group_94219] +[group_94220] +[group_94221] +[group_94222] +[group_94223] +[group_94224] +[group_94225] +[group_94226] +[group_94227] +[group_94228] +[group_94229] +[group_94230] +[group_94231] +[group_94232] +[group_94233] +[group_94234] +[group_94235] +[group_94236] +[group_94237] +[group_94238] +[group_94239] +[group_94240] +[group_94241] +[group_94242] +[group_94243] +[group_94244] +[group_94245] +[group_94246] +[group_94247] +[group_94248] +[group_94249] +[group_94250] +[group_94251] +[group_94252] +[group_94253] +[group_94254] +[group_94255] +[group_94256] +[group_94257] +[group_94258] +[group_94259] +[group_94260] +[group_94261] +[group_94262] +[group_94263] +[group_94264] +[group_94265] +[group_94266] +[group_94267] +[group_94268] +[group_94269] +[group_94270] +[group_94271] +[group_94272] +[group_94273] +[group_94274] +[group_94275] +[group_94276] +[group_94277] +[group_94278] +[group_94279] +[group_94280] +[group_94281] +[group_94282] +[group_94283] +[group_94284] +[group_94285] +[group_94286] +[group_94287] +[group_94288] +[group_94289] +[group_94290] +[group_94291] +[group_94292] +[group_94293] +[group_94294] +[group_94295] +[group_94296] +[group_94297] +[group_94298] +[group_94299] +[group_94300] +[group_94301] +[group_94302] +[group_94303] +[group_94304] +[group_94305] +[group_94306] +[group_94307] +[group_94308] +[group_94309] +[group_94310] +[group_94311] +[group_94312] +[group_94313] +[group_94314] +[group_94315] +[group_94316] +[group_94317] +[group_94318] +[group_94319] +[group_94320] +[group_94321] +[group_94322] +[group_94323] +[group_94324] +[group_94325] +[group_94326] +[group_94327] +[group_94328] +[group_94329] +[group_94330] +[group_94331] +[group_94332] +[group_94333] +[group_94334] +[group_94335] +[group_94336] +[group_94337] +[group_94338] +[group_94339] +[group_94340] +[group_94341] +[group_94342] +[group_94343] +[group_94344] +[group_94345] +[group_94346] +[group_94347] +[group_94348] +[group_94349] +[group_94350] +[group_94351] +[group_94352] +[group_94353] +[group_94354] +[group_94355] +[group_94356] +[group_94357] +[group_94358] +[group_94359] +[group_94360] +[group_94361] +[group_94362] +[group_94363] +[group_94364] +[group_94365] +[group_94366] +[group_94367] +[group_94368] +[group_94369] +[group_94370] +[group_94371] +[group_94372] +[group_94373] +[group_94374] +[group_94375] +[group_94376] +[group_94377] +[group_94378] +[group_94379] +[group_94380] +[group_94381] +[group_94382] +[group_94383] +[group_94384] +[group_94385] +[group_94386] +[group_94387] +[group_94388] +[group_94389] +[group_94390] +[group_94391] +[group_94392] +[group_94393] +[group_94394] +[group_94395] +[group_94396] +[group_94397] +[group_94398] +[group_94399] +[group_94400] +[group_94401] +[group_94402] +[group_94403] +[group_94404] +[group_94405] +[group_94406] +[group_94407] +[group_94408] +[group_94409] +[group_94410] +[group_94411] +[group_94412] +[group_94413] +[group_94414] +[group_94415] +[group_94416] +[group_94417] +[group_94418] +[group_94419] +[group_94420] +[group_94421] +[group_94422] +[group_94423] +[group_94424] +[group_94425] +[group_94426] +[group_94427] +[group_94428] +[group_94429] +[group_94430] +[group_94431] +[group_94432] +[group_94433] +[group_94434] +[group_94435] +[group_94436] +[group_94437] +[group_94438] +[group_94439] +[group_94440] +[group_94441] +[group_94442] +[group_94443] +[group_94444] +[group_94445] +[group_94446] +[group_94447] +[group_94448] +[group_94449] +[group_94450] +[group_94451] +[group_94452] +[group_94453] +[group_94454] +[group_94455] +[group_94456] +[group_94457] +[group_94458] +[group_94459] +[group_94460] +[group_94461] +[group_94462] +[group_94463] +[group_94464] +[group_94465] +[group_94466] +[group_94467] +[group_94468] +[group_94469] +[group_94470] +[group_94471] +[group_94472] +[group_94473] +[group_94474] +[group_94475] +[group_94476] +[group_94477] +[group_94478] +[group_94479] +[group_94480] +[group_94481] +[group_94482] +[group_94483] +[group_94484] +[group_94485] +[group_94486] +[group_94487] +[group_94488] +[group_94489] +[group_94490] +[group_94491] +[group_94492] +[group_94493] +[group_94494] +[group_94495] +[group_94496] +[group_94497] +[group_94498] +[group_94499] +[group_94500] +[group_94501] +[group_94502] +[group_94503] +[group_94504] +[group_94505] +[group_94506] +[group_94507] +[group_94508] +[group_94509] +[group_94510] +[group_94511] +[group_94512] +[group_94513] +[group_94514] +[group_94515] +[group_94516] +[group_94517] +[group_94518] +[group_94519] +[group_94520] +[group_94521] +[group_94522] +[group_94523] +[group_94524] +[group_94525] +[group_94526] +[group_94527] +[group_94528] +[group_94529] +[group_94530] +[group_94531] +[group_94532] +[group_94533] +[group_94534] +[group_94535] +[group_94536] +[group_94537] +[group_94538] +[group_94539] +[group_94540] +[group_94541] +[group_94542] +[group_94543] +[group_94544] +[group_94545] +[group_94546] +[group_94547] +[group_94548] +[group_94549] +[group_94550] +[group_94551] +[group_94552] +[group_94553] +[group_94554] +[group_94555] +[group_94556] +[group_94557] +[group_94558] +[group_94559] +[group_94560] +[group_94561] +[group_94562] +[group_94563] +[group_94564] +[group_94565] +[group_94566] +[group_94567] +[group_94568] +[group_94569] +[group_94570] +[group_94571] +[group_94572] +[group_94573] +[group_94574] +[group_94575] +[group_94576] +[group_94577] +[group_94578] +[group_94579] +[group_94580] +[group_94581] +[group_94582] +[group_94583] +[group_94584] +[group_94585] +[group_94586] +[group_94587] +[group_94588] +[group_94589] +[group_94590] +[group_94591] +[group_94592] +[group_94593] +[group_94594] +[group_94595] +[group_94596] +[group_94597] +[group_94598] +[group_94599] +[group_94600] +[group_94601] +[group_94602] +[group_94603] +[group_94604] +[group_94605] +[group_94606] +[group_94607] +[group_94608] +[group_94609] +[group_94610] +[group_94611] +[group_94612] +[group_94613] +[group_94614] +[group_94615] +[group_94616] +[group_94617] +[group_94618] +[group_94619] +[group_94620] +[group_94621] +[group_94622] +[group_94623] +[group_94624] +[group_94625] +[group_94626] +[group_94627] +[group_94628] +[group_94629] +[group_94630] +[group_94631] +[group_94632] +[group_94633] +[group_94634] +[group_94635] +[group_94636] +[group_94637] +[group_94638] +[group_94639] +[group_94640] +[group_94641] +[group_94642] +[group_94643] +[group_94644] +[group_94645] +[group_94646] +[group_94647] +[group_94648] +[group_94649] +[group_94650] +[group_94651] +[group_94652] +[group_94653] +[group_94654] +[group_94655] +[group_94656] +[group_94657] +[group_94658] +[group_94659] +[group_94660] +[group_94661] +[group_94662] +[group_94663] +[group_94664] +[group_94665] +[group_94666] +[group_94667] +[group_94668] +[group_94669] +[group_94670] +[group_94671] +[group_94672] +[group_94673] +[group_94674] +[group_94675] +[group_94676] +[group_94677] +[group_94678] +[group_94679] +[group_94680] +[group_94681] +[group_94682] +[group_94683] +[group_94684] +[group_94685] +[group_94686] +[group_94687] +[group_94688] +[group_94689] +[group_94690] +[group_94691] +[group_94692] +[group_94693] +[group_94694] +[group_94695] +[group_94696] +[group_94697] +[group_94698] +[group_94699] +[group_94700] +[group_94701] +[group_94702] +[group_94703] +[group_94704] +[group_94705] +[group_94706] +[group_94707] +[group_94708] +[group_94709] +[group_94710] +[group_94711] +[group_94712] +[group_94713] +[group_94714] +[group_94715] +[group_94716] +[group_94717] +[group_94718] +[group_94719] +[group_94720] +[group_94721] +[group_94722] +[group_94723] +[group_94724] +[group_94725] +[group_94726] +[group_94727] +[group_94728] +[group_94729] +[group_94730] +[group_94731] +[group_94732] +[group_94733] +[group_94734] +[group_94735] +[group_94736] +[group_94737] +[group_94738] +[group_94739] +[group_94740] +[group_94741] +[group_94742] +[group_94743] +[group_94744] +[group_94745] +[group_94746] +[group_94747] +[group_94748] +[group_94749] +[group_94750] +[group_94751] +[group_94752] +[group_94753] +[group_94754] +[group_94755] +[group_94756] +[group_94757] +[group_94758] +[group_94759] +[group_94760] +[group_94761] +[group_94762] +[group_94763] +[group_94764] +[group_94765] +[group_94766] +[group_94767] +[group_94768] +[group_94769] +[group_94770] +[group_94771] +[group_94772] +[group_94773] +[group_94774] +[group_94775] +[group_94776] +[group_94777] +[group_94778] +[group_94779] +[group_94780] +[group_94781] +[group_94782] +[group_94783] +[group_94784] +[group_94785] +[group_94786] +[group_94787] +[group_94788] +[group_94789] +[group_94790] +[group_94791] +[group_94792] +[group_94793] +[group_94794] +[group_94795] +[group_94796] +[group_94797] +[group_94798] +[group_94799] +[group_94800] +[group_94801] +[group_94802] +[group_94803] +[group_94804] +[group_94805] +[group_94806] +[group_94807] +[group_94808] +[group_94809] +[group_94810] +[group_94811] +[group_94812] +[group_94813] +[group_94814] +[group_94815] +[group_94816] +[group_94817] +[group_94818] +[group_94819] +[group_94820] +[group_94821] +[group_94822] +[group_94823] +[group_94824] +[group_94825] +[group_94826] +[group_94827] +[group_94828] +[group_94829] +[group_94830] +[group_94831] +[group_94832] +[group_94833] +[group_94834] +[group_94835] +[group_94836] +[group_94837] +[group_94838] +[group_94839] +[group_94840] +[group_94841] +[group_94842] +[group_94843] +[group_94844] +[group_94845] +[group_94846] +[group_94847] +[group_94848] +[group_94849] +[group_94850] +[group_94851] +[group_94852] +[group_94853] +[group_94854] +[group_94855] +[group_94856] +[group_94857] +[group_94858] +[group_94859] +[group_94860] +[group_94861] +[group_94862] +[group_94863] +[group_94864] +[group_94865] +[group_94866] +[group_94867] +[group_94868] +[group_94869] +[group_94870] +[group_94871] +[group_94872] +[group_94873] +[group_94874] +[group_94875] +[group_94876] +[group_94877] +[group_94878] +[group_94879] +[group_94880] +[group_94881] +[group_94882] +[group_94883] +[group_94884] +[group_94885] +[group_94886] +[group_94887] +[group_94888] +[group_94889] +[group_94890] +[group_94891] +[group_94892] +[group_94893] +[group_94894] +[group_94895] +[group_94896] +[group_94897] +[group_94898] +[group_94899] +[group_94900] +[group_94901] +[group_94902] +[group_94903] +[group_94904] +[group_94905] +[group_94906] +[group_94907] +[group_94908] +[group_94909] +[group_94910] +[group_94911] +[group_94912] +[group_94913] +[group_94914] +[group_94915] +[group_94916] +[group_94917] +[group_94918] +[group_94919] +[group_94920] +[group_94921] +[group_94922] +[group_94923] +[group_94924] +[group_94925] +[group_94926] +[group_94927] +[group_94928] +[group_94929] +[group_94930] +[group_94931] +[group_94932] +[group_94933] +[group_94934] +[group_94935] +[group_94936] +[group_94937] +[group_94938] +[group_94939] +[group_94940] +[group_94941] +[group_94942] +[group_94943] +[group_94944] +[group_94945] +[group_94946] +[group_94947] +[group_94948] +[group_94949] +[group_94950] +[group_94951] +[group_94952] +[group_94953] +[group_94954] +[group_94955] +[group_94956] +[group_94957] +[group_94958] +[group_94959] +[group_94960] +[group_94961] +[group_94962] +[group_94963] +[group_94964] +[group_94965] +[group_94966] +[group_94967] +[group_94968] +[group_94969] +[group_94970] +[group_94971] +[group_94972] +[group_94973] +[group_94974] +[group_94975] +[group_94976] +[group_94977] +[group_94978] +[group_94979] +[group_94980] +[group_94981] +[group_94982] +[group_94983] +[group_94984] +[group_94985] +[group_94986] +[group_94987] +[group_94988] +[group_94989] +[group_94990] +[group_94991] +[group_94992] +[group_94993] +[group_94994] +[group_94995] +[group_94996] +[group_94997] +[group_94998] +[group_94999] +[group_95000] +[group_95001] +[group_95002] +[group_95003] +[group_95004] +[group_95005] +[group_95006] +[group_95007] +[group_95008] +[group_95009] +[group_95010] +[group_95011] +[group_95012] +[group_95013] +[group_95014] +[group_95015] +[group_95016] +[group_95017] +[group_95018] +[group_95019] +[group_95020] +[group_95021] +[group_95022] +[group_95023] +[group_95024] +[group_95025] +[group_95026] +[group_95027] +[group_95028] +[group_95029] +[group_95030] +[group_95031] +[group_95032] +[group_95033] +[group_95034] +[group_95035] +[group_95036] +[group_95037] +[group_95038] +[group_95039] +[group_95040] +[group_95041] +[group_95042] +[group_95043] +[group_95044] +[group_95045] +[group_95046] +[group_95047] +[group_95048] +[group_95049] +[group_95050] +[group_95051] +[group_95052] +[group_95053] +[group_95054] +[group_95055] +[group_95056] +[group_95057] +[group_95058] +[group_95059] +[group_95060] +[group_95061] +[group_95062] +[group_95063] +[group_95064] +[group_95065] +[group_95066] +[group_95067] +[group_95068] +[group_95069] +[group_95070] +[group_95071] +[group_95072] +[group_95073] +[group_95074] +[group_95075] +[group_95076] +[group_95077] +[group_95078] +[group_95079] +[group_95080] +[group_95081] +[group_95082] +[group_95083] +[group_95084] +[group_95085] +[group_95086] +[group_95087] +[group_95088] +[group_95089] +[group_95090] +[group_95091] +[group_95092] +[group_95093] +[group_95094] +[group_95095] +[group_95096] +[group_95097] +[group_95098] +[group_95099] +[group_95100] +[group_95101] +[group_95102] +[group_95103] +[group_95104] +[group_95105] +[group_95106] +[group_95107] +[group_95108] +[group_95109] +[group_95110] +[group_95111] +[group_95112] +[group_95113] +[group_95114] +[group_95115] +[group_95116] +[group_95117] +[group_95118] +[group_95119] +[group_95120] +[group_95121] +[group_95122] +[group_95123] +[group_95124] +[group_95125] +[group_95126] +[group_95127] +[group_95128] +[group_95129] +[group_95130] +[group_95131] +[group_95132] +[group_95133] +[group_95134] +[group_95135] +[group_95136] +[group_95137] +[group_95138] +[group_95139] +[group_95140] +[group_95141] +[group_95142] +[group_95143] +[group_95144] +[group_95145] +[group_95146] +[group_95147] +[group_95148] +[group_95149] +[group_95150] +[group_95151] +[group_95152] +[group_95153] +[group_95154] +[group_95155] +[group_95156] +[group_95157] +[group_95158] +[group_95159] +[group_95160] +[group_95161] +[group_95162] +[group_95163] +[group_95164] +[group_95165] +[group_95166] +[group_95167] +[group_95168] +[group_95169] +[group_95170] +[group_95171] +[group_95172] +[group_95173] +[group_95174] +[group_95175] +[group_95176] +[group_95177] +[group_95178] +[group_95179] +[group_95180] +[group_95181] +[group_95182] +[group_95183] +[group_95184] +[group_95185] +[group_95186] +[group_95187] +[group_95188] +[group_95189] +[group_95190] +[group_95191] +[group_95192] +[group_95193] +[group_95194] +[group_95195] +[group_95196] +[group_95197] +[group_95198] +[group_95199] +[group_95200] +[group_95201] +[group_95202] +[group_95203] +[group_95204] +[group_95205] +[group_95206] +[group_95207] +[group_95208] +[group_95209] +[group_95210] +[group_95211] +[group_95212] +[group_95213] +[group_95214] +[group_95215] +[group_95216] +[group_95217] +[group_95218] +[group_95219] +[group_95220] +[group_95221] +[group_95222] +[group_95223] +[group_95224] +[group_95225] +[group_95226] +[group_95227] +[group_95228] +[group_95229] +[group_95230] +[group_95231] +[group_95232] +[group_95233] +[group_95234] +[group_95235] +[group_95236] +[group_95237] +[group_95238] +[group_95239] +[group_95240] +[group_95241] +[group_95242] +[group_95243] +[group_95244] +[group_95245] +[group_95246] +[group_95247] +[group_95248] +[group_95249] +[group_95250] +[group_95251] +[group_95252] +[group_95253] +[group_95254] +[group_95255] +[group_95256] +[group_95257] +[group_95258] +[group_95259] +[group_95260] +[group_95261] +[group_95262] +[group_95263] +[group_95264] +[group_95265] +[group_95266] +[group_95267] +[group_95268] +[group_95269] +[group_95270] +[group_95271] +[group_95272] +[group_95273] +[group_95274] +[group_95275] +[group_95276] +[group_95277] +[group_95278] +[group_95279] +[group_95280] +[group_95281] +[group_95282] +[group_95283] +[group_95284] +[group_95285] +[group_95286] +[group_95287] +[group_95288] +[group_95289] +[group_95290] +[group_95291] +[group_95292] +[group_95293] +[group_95294] +[group_95295] +[group_95296] +[group_95297] +[group_95298] +[group_95299] +[group_95300] +[group_95301] +[group_95302] +[group_95303] +[group_95304] +[group_95305] +[group_95306] +[group_95307] +[group_95308] +[group_95309] +[group_95310] +[group_95311] +[group_95312] +[group_95313] +[group_95314] +[group_95315] +[group_95316] +[group_95317] +[group_95318] +[group_95319] +[group_95320] +[group_95321] +[group_95322] +[group_95323] +[group_95324] +[group_95325] +[group_95326] +[group_95327] +[group_95328] +[group_95329] +[group_95330] +[group_95331] +[group_95332] +[group_95333] +[group_95334] +[group_95335] +[group_95336] +[group_95337] +[group_95338] +[group_95339] +[group_95340] +[group_95341] +[group_95342] +[group_95343] +[group_95344] +[group_95345] +[group_95346] +[group_95347] +[group_95348] +[group_95349] +[group_95350] +[group_95351] +[group_95352] +[group_95353] +[group_95354] +[group_95355] +[group_95356] +[group_95357] +[group_95358] +[group_95359] +[group_95360] +[group_95361] +[group_95362] +[group_95363] +[group_95364] +[group_95365] +[group_95366] +[group_95367] +[group_95368] +[group_95369] +[group_95370] +[group_95371] +[group_95372] +[group_95373] +[group_95374] +[group_95375] +[group_95376] +[group_95377] +[group_95378] +[group_95379] +[group_95380] +[group_95381] +[group_95382] +[group_95383] +[group_95384] +[group_95385] +[group_95386] +[group_95387] +[group_95388] +[group_95389] +[group_95390] +[group_95391] +[group_95392] +[group_95393] +[group_95394] +[group_95395] +[group_95396] +[group_95397] +[group_95398] +[group_95399] +[group_95400] +[group_95401] +[group_95402] +[group_95403] +[group_95404] +[group_95405] +[group_95406] +[group_95407] +[group_95408] +[group_95409] +[group_95410] +[group_95411] +[group_95412] +[group_95413] +[group_95414] +[group_95415] +[group_95416] +[group_95417] +[group_95418] +[group_95419] +[group_95420] +[group_95421] +[group_95422] +[group_95423] +[group_95424] +[group_95425] +[group_95426] +[group_95427] +[group_95428] +[group_95429] +[group_95430] +[group_95431] +[group_95432] +[group_95433] +[group_95434] +[group_95435] +[group_95436] +[group_95437] +[group_95438] +[group_95439] +[group_95440] +[group_95441] +[group_95442] +[group_95443] +[group_95444] +[group_95445] +[group_95446] +[group_95447] +[group_95448] +[group_95449] +[group_95450] +[group_95451] +[group_95452] +[group_95453] +[group_95454] +[group_95455] +[group_95456] +[group_95457] +[group_95458] +[group_95459] +[group_95460] +[group_95461] +[group_95462] +[group_95463] +[group_95464] +[group_95465] +[group_95466] +[group_95467] +[group_95468] +[group_95469] +[group_95470] +[group_95471] +[group_95472] +[group_95473] +[group_95474] +[group_95475] +[group_95476] +[group_95477] +[group_95478] +[group_95479] +[group_95480] +[group_95481] +[group_95482] +[group_95483] +[group_95484] +[group_95485] +[group_95486] +[group_95487] +[group_95488] +[group_95489] +[group_95490] +[group_95491] +[group_95492] +[group_95493] +[group_95494] +[group_95495] +[group_95496] +[group_95497] +[group_95498] +[group_95499] +[group_95500] +[group_95501] +[group_95502] +[group_95503] +[group_95504] +[group_95505] +[group_95506] +[group_95507] +[group_95508] +[group_95509] +[group_95510] +[group_95511] +[group_95512] +[group_95513] +[group_95514] +[group_95515] +[group_95516] +[group_95517] +[group_95518] +[group_95519] +[group_95520] +[group_95521] +[group_95522] +[group_95523] +[group_95524] +[group_95525] +[group_95526] +[group_95527] +[group_95528] +[group_95529] +[group_95530] +[group_95531] +[group_95532] +[group_95533] +[group_95534] +[group_95535] +[group_95536] +[group_95537] +[group_95538] +[group_95539] +[group_95540] +[group_95541] +[group_95542] +[group_95543] +[group_95544] +[group_95545] +[group_95546] +[group_95547] +[group_95548] +[group_95549] +[group_95550] +[group_95551] +[group_95552] +[group_95553] +[group_95554] +[group_95555] +[group_95556] +[group_95557] +[group_95558] +[group_95559] +[group_95560] +[group_95561] +[group_95562] +[group_95563] +[group_95564] +[group_95565] +[group_95566] +[group_95567] +[group_95568] +[group_95569] +[group_95570] +[group_95571] +[group_95572] +[group_95573] +[group_95574] +[group_95575] +[group_95576] +[group_95577] +[group_95578] +[group_95579] +[group_95580] +[group_95581] +[group_95582] +[group_95583] +[group_95584] +[group_95585] +[group_95586] +[group_95587] +[group_95588] +[group_95589] +[group_95590] +[group_95591] +[group_95592] +[group_95593] +[group_95594] +[group_95595] +[group_95596] +[group_95597] +[group_95598] +[group_95599] +[group_95600] +[group_95601] +[group_95602] +[group_95603] +[group_95604] +[group_95605] +[group_95606] +[group_95607] +[group_95608] +[group_95609] +[group_95610] +[group_95611] +[group_95612] +[group_95613] +[group_95614] +[group_95615] +[group_95616] +[group_95617] +[group_95618] +[group_95619] +[group_95620] +[group_95621] +[group_95622] +[group_95623] +[group_95624] +[group_95625] +[group_95626] +[group_95627] +[group_95628] +[group_95629] +[group_95630] +[group_95631] +[group_95632] +[group_95633] +[group_95634] +[group_95635] +[group_95636] +[group_95637] +[group_95638] +[group_95639] +[group_95640] +[group_95641] +[group_95642] +[group_95643] +[group_95644] +[group_95645] +[group_95646] +[group_95647] +[group_95648] +[group_95649] +[group_95650] +[group_95651] +[group_95652] +[group_95653] +[group_95654] +[group_95655] +[group_95656] +[group_95657] +[group_95658] +[group_95659] +[group_95660] +[group_95661] +[group_95662] +[group_95663] +[group_95664] +[group_95665] +[group_95666] +[group_95667] +[group_95668] +[group_95669] +[group_95670] +[group_95671] +[group_95672] +[group_95673] +[group_95674] +[group_95675] +[group_95676] +[group_95677] +[group_95678] +[group_95679] +[group_95680] +[group_95681] +[group_95682] +[group_95683] +[group_95684] +[group_95685] +[group_95686] +[group_95687] +[group_95688] +[group_95689] +[group_95690] +[group_95691] +[group_95692] +[group_95693] +[group_95694] +[group_95695] +[group_95696] +[group_95697] +[group_95698] +[group_95699] +[group_95700] +[group_95701] +[group_95702] +[group_95703] +[group_95704] +[group_95705] +[group_95706] +[group_95707] +[group_95708] +[group_95709] +[group_95710] +[group_95711] +[group_95712] +[group_95713] +[group_95714] +[group_95715] +[group_95716] +[group_95717] +[group_95718] +[group_95719] +[group_95720] +[group_95721] +[group_95722] +[group_95723] +[group_95724] +[group_95725] +[group_95726] +[group_95727] +[group_95728] +[group_95729] +[group_95730] +[group_95731] +[group_95732] +[group_95733] +[group_95734] +[group_95735] +[group_95736] +[group_95737] +[group_95738] +[group_95739] +[group_95740] +[group_95741] +[group_95742] +[group_95743] +[group_95744] +[group_95745] +[group_95746] +[group_95747] +[group_95748] +[group_95749] +[group_95750] +[group_95751] +[group_95752] +[group_95753] +[group_95754] +[group_95755] +[group_95756] +[group_95757] +[group_95758] +[group_95759] +[group_95760] +[group_95761] +[group_95762] +[group_95763] +[group_95764] +[group_95765] +[group_95766] +[group_95767] +[group_95768] +[group_95769] +[group_95770] +[group_95771] +[group_95772] +[group_95773] +[group_95774] +[group_95775] +[group_95776] +[group_95777] +[group_95778] +[group_95779] +[group_95780] +[group_95781] +[group_95782] +[group_95783] +[group_95784] +[group_95785] +[group_95786] +[group_95787] +[group_95788] +[group_95789] +[group_95790] +[group_95791] +[group_95792] +[group_95793] +[group_95794] +[group_95795] +[group_95796] +[group_95797] +[group_95798] +[group_95799] +[group_95800] +[group_95801] +[group_95802] +[group_95803] +[group_95804] +[group_95805] +[group_95806] +[group_95807] +[group_95808] +[group_95809] +[group_95810] +[group_95811] +[group_95812] +[group_95813] +[group_95814] +[group_95815] +[group_95816] +[group_95817] +[group_95818] +[group_95819] +[group_95820] +[group_95821] +[group_95822] +[group_95823] +[group_95824] +[group_95825] +[group_95826] +[group_95827] +[group_95828] +[group_95829] +[group_95830] +[group_95831] +[group_95832] +[group_95833] +[group_95834] +[group_95835] +[group_95836] +[group_95837] +[group_95838] +[group_95839] +[group_95840] +[group_95841] +[group_95842] +[group_95843] +[group_95844] +[group_95845] +[group_95846] +[group_95847] +[group_95848] +[group_95849] +[group_95850] +[group_95851] +[group_95852] +[group_95853] +[group_95854] +[group_95855] +[group_95856] +[group_95857] +[group_95858] +[group_95859] +[group_95860] +[group_95861] +[group_95862] +[group_95863] +[group_95864] +[group_95865] +[group_95866] +[group_95867] +[group_95868] +[group_95869] +[group_95870] +[group_95871] +[group_95872] +[group_95873] +[group_95874] +[group_95875] +[group_95876] +[group_95877] +[group_95878] +[group_95879] +[group_95880] +[group_95881] +[group_95882] +[group_95883] +[group_95884] +[group_95885] +[group_95886] +[group_95887] +[group_95888] +[group_95889] +[group_95890] +[group_95891] +[group_95892] +[group_95893] +[group_95894] +[group_95895] +[group_95896] +[group_95897] +[group_95898] +[group_95899] +[group_95900] +[group_95901] +[group_95902] +[group_95903] +[group_95904] +[group_95905] +[group_95906] +[group_95907] +[group_95908] +[group_95909] +[group_95910] +[group_95911] +[group_95912] +[group_95913] +[group_95914] +[group_95915] +[group_95916] +[group_95917] +[group_95918] +[group_95919] +[group_95920] +[group_95921] +[group_95922] +[group_95923] +[group_95924] +[group_95925] +[group_95926] +[group_95927] +[group_95928] +[group_95929] +[group_95930] +[group_95931] +[group_95932] +[group_95933] +[group_95934] +[group_95935] +[group_95936] +[group_95937] +[group_95938] +[group_95939] +[group_95940] +[group_95941] +[group_95942] +[group_95943] +[group_95944] +[group_95945] +[group_95946] +[group_95947] +[group_95948] +[group_95949] +[group_95950] +[group_95951] +[group_95952] +[group_95953] +[group_95954] +[group_95955] +[group_95956] +[group_95957] +[group_95958] +[group_95959] +[group_95960] +[group_95961] +[group_95962] +[group_95963] +[group_95964] +[group_95965] +[group_95966] +[group_95967] +[group_95968] +[group_95969] +[group_95970] +[group_95971] +[group_95972] +[group_95973] +[group_95974] +[group_95975] +[group_95976] +[group_95977] +[group_95978] +[group_95979] +[group_95980] +[group_95981] +[group_95982] +[group_95983] +[group_95984] +[group_95985] +[group_95986] +[group_95987] +[group_95988] +[group_95989] +[group_95990] +[group_95991] +[group_95992] +[group_95993] +[group_95994] +[group_95995] +[group_95996] +[group_95997] +[group_95998] +[group_95999] +[group_96000] +[group_96001] +[group_96002] +[group_96003] +[group_96004] +[group_96005] +[group_96006] +[group_96007] +[group_96008] +[group_96009] +[group_96010] +[group_96011] +[group_96012] +[group_96013] +[group_96014] +[group_96015] +[group_96016] +[group_96017] +[group_96018] +[group_96019] +[group_96020] +[group_96021] +[group_96022] +[group_96023] +[group_96024] +[group_96025] +[group_96026] +[group_96027] +[group_96028] +[group_96029] +[group_96030] +[group_96031] +[group_96032] +[group_96033] +[group_96034] +[group_96035] +[group_96036] +[group_96037] +[group_96038] +[group_96039] +[group_96040] +[group_96041] +[group_96042] +[group_96043] +[group_96044] +[group_96045] +[group_96046] +[group_96047] +[group_96048] +[group_96049] +[group_96050] +[group_96051] +[group_96052] +[group_96053] +[group_96054] +[group_96055] +[group_96056] +[group_96057] +[group_96058] +[group_96059] +[group_96060] +[group_96061] +[group_96062] +[group_96063] +[group_96064] +[group_96065] +[group_96066] +[group_96067] +[group_96068] +[group_96069] +[group_96070] +[group_96071] +[group_96072] +[group_96073] +[group_96074] +[group_96075] +[group_96076] +[group_96077] +[group_96078] +[group_96079] +[group_96080] +[group_96081] +[group_96082] +[group_96083] +[group_96084] +[group_96085] +[group_96086] +[group_96087] +[group_96088] +[group_96089] +[group_96090] +[group_96091] +[group_96092] +[group_96093] +[group_96094] +[group_96095] +[group_96096] +[group_96097] +[group_96098] +[group_96099] +[group_96100] +[group_96101] +[group_96102] +[group_96103] +[group_96104] +[group_96105] +[group_96106] +[group_96107] +[group_96108] +[group_96109] +[group_96110] +[group_96111] +[group_96112] +[group_96113] +[group_96114] +[group_96115] +[group_96116] +[group_96117] +[group_96118] +[group_96119] +[group_96120] +[group_96121] +[group_96122] +[group_96123] +[group_96124] +[group_96125] +[group_96126] +[group_96127] +[group_96128] +[group_96129] +[group_96130] +[group_96131] +[group_96132] +[group_96133] +[group_96134] +[group_96135] +[group_96136] +[group_96137] +[group_96138] +[group_96139] +[group_96140] +[group_96141] +[group_96142] +[group_96143] +[group_96144] +[group_96145] +[group_96146] +[group_96147] +[group_96148] +[group_96149] +[group_96150] +[group_96151] +[group_96152] +[group_96153] +[group_96154] +[group_96155] +[group_96156] +[group_96157] +[group_96158] +[group_96159] +[group_96160] +[group_96161] +[group_96162] +[group_96163] +[group_96164] +[group_96165] +[group_96166] +[group_96167] +[group_96168] +[group_96169] +[group_96170] +[group_96171] +[group_96172] +[group_96173] +[group_96174] +[group_96175] +[group_96176] +[group_96177] +[group_96178] +[group_96179] +[group_96180] +[group_96181] +[group_96182] +[group_96183] +[group_96184] +[group_96185] +[group_96186] +[group_96187] +[group_96188] +[group_96189] +[group_96190] +[group_96191] +[group_96192] +[group_96193] +[group_96194] +[group_96195] +[group_96196] +[group_96197] +[group_96198] +[group_96199] +[group_96200] +[group_96201] +[group_96202] +[group_96203] +[group_96204] +[group_96205] +[group_96206] +[group_96207] +[group_96208] +[group_96209] +[group_96210] +[group_96211] +[group_96212] +[group_96213] +[group_96214] +[group_96215] +[group_96216] +[group_96217] +[group_96218] +[group_96219] +[group_96220] +[group_96221] +[group_96222] +[group_96223] +[group_96224] +[group_96225] +[group_96226] +[group_96227] +[group_96228] +[group_96229] +[group_96230] +[group_96231] +[group_96232] +[group_96233] +[group_96234] +[group_96235] +[group_96236] +[group_96237] +[group_96238] +[group_96239] +[group_96240] +[group_96241] +[group_96242] +[group_96243] +[group_96244] +[group_96245] +[group_96246] +[group_96247] +[group_96248] +[group_96249] +[group_96250] +[group_96251] +[group_96252] +[group_96253] +[group_96254] +[group_96255] +[group_96256] +[group_96257] +[group_96258] +[group_96259] +[group_96260] +[group_96261] +[group_96262] +[group_96263] +[group_96264] +[group_96265] +[group_96266] +[group_96267] +[group_96268] +[group_96269] +[group_96270] +[group_96271] +[group_96272] +[group_96273] +[group_96274] +[group_96275] +[group_96276] +[group_96277] +[group_96278] +[group_96279] +[group_96280] +[group_96281] +[group_96282] +[group_96283] +[group_96284] +[group_96285] +[group_96286] +[group_96287] +[group_96288] +[group_96289] +[group_96290] +[group_96291] +[group_96292] +[group_96293] +[group_96294] +[group_96295] +[group_96296] +[group_96297] +[group_96298] +[group_96299] +[group_96300] +[group_96301] +[group_96302] +[group_96303] +[group_96304] +[group_96305] +[group_96306] +[group_96307] +[group_96308] +[group_96309] +[group_96310] +[group_96311] +[group_96312] +[group_96313] +[group_96314] +[group_96315] +[group_96316] +[group_96317] +[group_96318] +[group_96319] +[group_96320] +[group_96321] +[group_96322] +[group_96323] +[group_96324] +[group_96325] +[group_96326] +[group_96327] +[group_96328] +[group_96329] +[group_96330] +[group_96331] +[group_96332] +[group_96333] +[group_96334] +[group_96335] +[group_96336] +[group_96337] +[group_96338] +[group_96339] +[group_96340] +[group_96341] +[group_96342] +[group_96343] +[group_96344] +[group_96345] +[group_96346] +[group_96347] +[group_96348] +[group_96349] +[group_96350] +[group_96351] +[group_96352] +[group_96353] +[group_96354] +[group_96355] +[group_96356] +[group_96357] +[group_96358] +[group_96359] +[group_96360] +[group_96361] +[group_96362] +[group_96363] +[group_96364] +[group_96365] +[group_96366] +[group_96367] +[group_96368] +[group_96369] +[group_96370] +[group_96371] +[group_96372] +[group_96373] +[group_96374] +[group_96375] +[group_96376] +[group_96377] +[group_96378] +[group_96379] +[group_96380] +[group_96381] +[group_96382] +[group_96383] +[group_96384] +[group_96385] +[group_96386] +[group_96387] +[group_96388] +[group_96389] +[group_96390] +[group_96391] +[group_96392] +[group_96393] +[group_96394] +[group_96395] +[group_96396] +[group_96397] +[group_96398] +[group_96399] +[group_96400] +[group_96401] +[group_96402] +[group_96403] +[group_96404] +[group_96405] +[group_96406] +[group_96407] +[group_96408] +[group_96409] +[group_96410] +[group_96411] +[group_96412] +[group_96413] +[group_96414] +[group_96415] +[group_96416] +[group_96417] +[group_96418] +[group_96419] +[group_96420] +[group_96421] +[group_96422] +[group_96423] +[group_96424] +[group_96425] +[group_96426] +[group_96427] +[group_96428] +[group_96429] +[group_96430] +[group_96431] +[group_96432] +[group_96433] +[group_96434] +[group_96435] +[group_96436] +[group_96437] +[group_96438] +[group_96439] +[group_96440] +[group_96441] +[group_96442] +[group_96443] +[group_96444] +[group_96445] +[group_96446] +[group_96447] +[group_96448] +[group_96449] +[group_96450] +[group_96451] +[group_96452] +[group_96453] +[group_96454] +[group_96455] +[group_96456] +[group_96457] +[group_96458] +[group_96459] +[group_96460] +[group_96461] +[group_96462] +[group_96463] +[group_96464] +[group_96465] +[group_96466] +[group_96467] +[group_96468] +[group_96469] +[group_96470] +[group_96471] +[group_96472] +[group_96473] +[group_96474] +[group_96475] +[group_96476] +[group_96477] +[group_96478] +[group_96479] +[group_96480] +[group_96481] +[group_96482] +[group_96483] +[group_96484] +[group_96485] +[group_96486] +[group_96487] +[group_96488] +[group_96489] +[group_96490] +[group_96491] +[group_96492] +[group_96493] +[group_96494] +[group_96495] +[group_96496] +[group_96497] +[group_96498] +[group_96499] +[group_96500] +[group_96501] +[group_96502] +[group_96503] +[group_96504] +[group_96505] +[group_96506] +[group_96507] +[group_96508] +[group_96509] +[group_96510] +[group_96511] +[group_96512] +[group_96513] +[group_96514] +[group_96515] +[group_96516] +[group_96517] +[group_96518] +[group_96519] +[group_96520] +[group_96521] +[group_96522] +[group_96523] +[group_96524] +[group_96525] +[group_96526] +[group_96527] +[group_96528] +[group_96529] +[group_96530] +[group_96531] +[group_96532] +[group_96533] +[group_96534] +[group_96535] +[group_96536] +[group_96537] +[group_96538] +[group_96539] +[group_96540] +[group_96541] +[group_96542] +[group_96543] +[group_96544] +[group_96545] +[group_96546] +[group_96547] +[group_96548] +[group_96549] +[group_96550] +[group_96551] +[group_96552] +[group_96553] +[group_96554] +[group_96555] +[group_96556] +[group_96557] +[group_96558] +[group_96559] +[group_96560] +[group_96561] +[group_96562] +[group_96563] +[group_96564] +[group_96565] +[group_96566] +[group_96567] +[group_96568] +[group_96569] +[group_96570] +[group_96571] +[group_96572] +[group_96573] +[group_96574] +[group_96575] +[group_96576] +[group_96577] +[group_96578] +[group_96579] +[group_96580] +[group_96581] +[group_96582] +[group_96583] +[group_96584] +[group_96585] +[group_96586] +[group_96587] +[group_96588] +[group_96589] +[group_96590] +[group_96591] +[group_96592] +[group_96593] +[group_96594] +[group_96595] +[group_96596] +[group_96597] +[group_96598] +[group_96599] +[group_96600] +[group_96601] +[group_96602] +[group_96603] +[group_96604] +[group_96605] +[group_96606] +[group_96607] +[group_96608] +[group_96609] +[group_96610] +[group_96611] +[group_96612] +[group_96613] +[group_96614] +[group_96615] +[group_96616] +[group_96617] +[group_96618] +[group_96619] +[group_96620] +[group_96621] +[group_96622] +[group_96623] +[group_96624] +[group_96625] +[group_96626] +[group_96627] +[group_96628] +[group_96629] +[group_96630] +[group_96631] +[group_96632] +[group_96633] +[group_96634] +[group_96635] +[group_96636] +[group_96637] +[group_96638] +[group_96639] +[group_96640] +[group_96641] +[group_96642] +[group_96643] +[group_96644] +[group_96645] +[group_96646] +[group_96647] +[group_96648] +[group_96649] +[group_96650] +[group_96651] +[group_96652] +[group_96653] +[group_96654] +[group_96655] +[group_96656] +[group_96657] +[group_96658] +[group_96659] +[group_96660] +[group_96661] +[group_96662] +[group_96663] +[group_96664] +[group_96665] +[group_96666] +[group_96667] +[group_96668] +[group_96669] +[group_96670] +[group_96671] +[group_96672] +[group_96673] +[group_96674] +[group_96675] +[group_96676] +[group_96677] +[group_96678] +[group_96679] +[group_96680] +[group_96681] +[group_96682] +[group_96683] +[group_96684] +[group_96685] +[group_96686] +[group_96687] +[group_96688] +[group_96689] +[group_96690] +[group_96691] +[group_96692] +[group_96693] +[group_96694] +[group_96695] +[group_96696] +[group_96697] +[group_96698] +[group_96699] +[group_96700] +[group_96701] +[group_96702] +[group_96703] +[group_96704] +[group_96705] +[group_96706] +[group_96707] +[group_96708] +[group_96709] +[group_96710] +[group_96711] +[group_96712] +[group_96713] +[group_96714] +[group_96715] +[group_96716] +[group_96717] +[group_96718] +[group_96719] +[group_96720] +[group_96721] +[group_96722] +[group_96723] +[group_96724] +[group_96725] +[group_96726] +[group_96727] +[group_96728] +[group_96729] +[group_96730] +[group_96731] +[group_96732] +[group_96733] +[group_96734] +[group_96735] +[group_96736] +[group_96737] +[group_96738] +[group_96739] +[group_96740] +[group_96741] +[group_96742] +[group_96743] +[group_96744] +[group_96745] +[group_96746] +[group_96747] +[group_96748] +[group_96749] +[group_96750] +[group_96751] +[group_96752] +[group_96753] +[group_96754] +[group_96755] +[group_96756] +[group_96757] +[group_96758] +[group_96759] +[group_96760] +[group_96761] +[group_96762] +[group_96763] +[group_96764] +[group_96765] +[group_96766] +[group_96767] +[group_96768] +[group_96769] +[group_96770] +[group_96771] +[group_96772] +[group_96773] +[group_96774] +[group_96775] +[group_96776] +[group_96777] +[group_96778] +[group_96779] +[group_96780] +[group_96781] +[group_96782] +[group_96783] +[group_96784] +[group_96785] +[group_96786] +[group_96787] +[group_96788] +[group_96789] +[group_96790] +[group_96791] +[group_96792] +[group_96793] +[group_96794] +[group_96795] +[group_96796] +[group_96797] +[group_96798] +[group_96799] +[group_96800] +[group_96801] +[group_96802] +[group_96803] +[group_96804] +[group_96805] +[group_96806] +[group_96807] +[group_96808] +[group_96809] +[group_96810] +[group_96811] +[group_96812] +[group_96813] +[group_96814] +[group_96815] +[group_96816] +[group_96817] +[group_96818] +[group_96819] +[group_96820] +[group_96821] +[group_96822] +[group_96823] +[group_96824] +[group_96825] +[group_96826] +[group_96827] +[group_96828] +[group_96829] +[group_96830] +[group_96831] +[group_96832] +[group_96833] +[group_96834] +[group_96835] +[group_96836] +[group_96837] +[group_96838] +[group_96839] +[group_96840] +[group_96841] +[group_96842] +[group_96843] +[group_96844] +[group_96845] +[group_96846] +[group_96847] +[group_96848] +[group_96849] +[group_96850] +[group_96851] +[group_96852] +[group_96853] +[group_96854] +[group_96855] +[group_96856] +[group_96857] +[group_96858] +[group_96859] +[group_96860] +[group_96861] +[group_96862] +[group_96863] +[group_96864] +[group_96865] +[group_96866] +[group_96867] +[group_96868] +[group_96869] +[group_96870] +[group_96871] +[group_96872] +[group_96873] +[group_96874] +[group_96875] +[group_96876] +[group_96877] +[group_96878] +[group_96879] +[group_96880] +[group_96881] +[group_96882] +[group_96883] +[group_96884] +[group_96885] +[group_96886] +[group_96887] +[group_96888] +[group_96889] +[group_96890] +[group_96891] +[group_96892] +[group_96893] +[group_96894] +[group_96895] +[group_96896] +[group_96897] +[group_96898] +[group_96899] +[group_96900] +[group_96901] +[group_96902] +[group_96903] +[group_96904] +[group_96905] +[group_96906] +[group_96907] +[group_96908] +[group_96909] +[group_96910] +[group_96911] +[group_96912] +[group_96913] +[group_96914] +[group_96915] +[group_96916] +[group_96917] +[group_96918] +[group_96919] +[group_96920] +[group_96921] +[group_96922] +[group_96923] +[group_96924] +[group_96925] +[group_96926] +[group_96927] +[group_96928] +[group_96929] +[group_96930] +[group_96931] +[group_96932] +[group_96933] +[group_96934] +[group_96935] +[group_96936] +[group_96937] +[group_96938] +[group_96939] +[group_96940] +[group_96941] +[group_96942] +[group_96943] +[group_96944] +[group_96945] +[group_96946] +[group_96947] +[group_96948] +[group_96949] +[group_96950] +[group_96951] +[group_96952] +[group_96953] +[group_96954] +[group_96955] +[group_96956] +[group_96957] +[group_96958] +[group_96959] +[group_96960] +[group_96961] +[group_96962] +[group_96963] +[group_96964] +[group_96965] +[group_96966] +[group_96967] +[group_96968] +[group_96969] +[group_96970] +[group_96971] +[group_96972] +[group_96973] +[group_96974] +[group_96975] +[group_96976] +[group_96977] +[group_96978] +[group_96979] +[group_96980] +[group_96981] +[group_96982] +[group_96983] +[group_96984] +[group_96985] +[group_96986] +[group_96987] +[group_96988] +[group_96989] +[group_96990] +[group_96991] +[group_96992] +[group_96993] +[group_96994] +[group_96995] +[group_96996] +[group_96997] +[group_96998] +[group_96999] +[group_97000] +[group_97001] +[group_97002] +[group_97003] +[group_97004] +[group_97005] +[group_97006] +[group_97007] +[group_97008] +[group_97009] +[group_97010] +[group_97011] +[group_97012] +[group_97013] +[group_97014] +[group_97015] +[group_97016] +[group_97017] +[group_97018] +[group_97019] +[group_97020] +[group_97021] +[group_97022] +[group_97023] +[group_97024] +[group_97025] +[group_97026] +[group_97027] +[group_97028] +[group_97029] +[group_97030] +[group_97031] +[group_97032] +[group_97033] +[group_97034] +[group_97035] +[group_97036] +[group_97037] +[group_97038] +[group_97039] +[group_97040] +[group_97041] +[group_97042] +[group_97043] +[group_97044] +[group_97045] +[group_97046] +[group_97047] +[group_97048] +[group_97049] +[group_97050] +[group_97051] +[group_97052] +[group_97053] +[group_97054] +[group_97055] +[group_97056] +[group_97057] +[group_97058] +[group_97059] +[group_97060] +[group_97061] +[group_97062] +[group_97063] +[group_97064] +[group_97065] +[group_97066] +[group_97067] +[group_97068] +[group_97069] +[group_97070] +[group_97071] +[group_97072] +[group_97073] +[group_97074] +[group_97075] +[group_97076] +[group_97077] +[group_97078] +[group_97079] +[group_97080] +[group_97081] +[group_97082] +[group_97083] +[group_97084] +[group_97085] +[group_97086] +[group_97087] +[group_97088] +[group_97089] +[group_97090] +[group_97091] +[group_97092] +[group_97093] +[group_97094] +[group_97095] +[group_97096] +[group_97097] +[group_97098] +[group_97099] +[group_97100] +[group_97101] +[group_97102] +[group_97103] +[group_97104] +[group_97105] +[group_97106] +[group_97107] +[group_97108] +[group_97109] +[group_97110] +[group_97111] +[group_97112] +[group_97113] +[group_97114] +[group_97115] +[group_97116] +[group_97117] +[group_97118] +[group_97119] +[group_97120] +[group_97121] +[group_97122] +[group_97123] +[group_97124] +[group_97125] +[group_97126] +[group_97127] +[group_97128] +[group_97129] +[group_97130] +[group_97131] +[group_97132] +[group_97133] +[group_97134] +[group_97135] +[group_97136] +[group_97137] +[group_97138] +[group_97139] +[group_97140] +[group_97141] +[group_97142] +[group_97143] +[group_97144] +[group_97145] +[group_97146] +[group_97147] +[group_97148] +[group_97149] +[group_97150] +[group_97151] +[group_97152] +[group_97153] +[group_97154] +[group_97155] +[group_97156] +[group_97157] +[group_97158] +[group_97159] +[group_97160] +[group_97161] +[group_97162] +[group_97163] +[group_97164] +[group_97165] +[group_97166] +[group_97167] +[group_97168] +[group_97169] +[group_97170] +[group_97171] +[group_97172] +[group_97173] +[group_97174] +[group_97175] +[group_97176] +[group_97177] +[group_97178] +[group_97179] +[group_97180] +[group_97181] +[group_97182] +[group_97183] +[group_97184] +[group_97185] +[group_97186] +[group_97187] +[group_97188] +[group_97189] +[group_97190] +[group_97191] +[group_97192] +[group_97193] +[group_97194] +[group_97195] +[group_97196] +[group_97197] +[group_97198] +[group_97199] +[group_97200] +[group_97201] +[group_97202] +[group_97203] +[group_97204] +[group_97205] +[group_97206] +[group_97207] +[group_97208] +[group_97209] +[group_97210] +[group_97211] +[group_97212] +[group_97213] +[group_97214] +[group_97215] +[group_97216] +[group_97217] +[group_97218] +[group_97219] +[group_97220] +[group_97221] +[group_97222] +[group_97223] +[group_97224] +[group_97225] +[group_97226] +[group_97227] +[group_97228] +[group_97229] +[group_97230] +[group_97231] +[group_97232] +[group_97233] +[group_97234] +[group_97235] +[group_97236] +[group_97237] +[group_97238] +[group_97239] +[group_97240] +[group_97241] +[group_97242] +[group_97243] +[group_97244] +[group_97245] +[group_97246] +[group_97247] +[group_97248] +[group_97249] +[group_97250] +[group_97251] +[group_97252] +[group_97253] +[group_97254] +[group_97255] +[group_97256] +[group_97257] +[group_97258] +[group_97259] +[group_97260] +[group_97261] +[group_97262] +[group_97263] +[group_97264] +[group_97265] +[group_97266] +[group_97267] +[group_97268] +[group_97269] +[group_97270] +[group_97271] +[group_97272] +[group_97273] +[group_97274] +[group_97275] +[group_97276] +[group_97277] +[group_97278] +[group_97279] +[group_97280] +[group_97281] +[group_97282] +[group_97283] +[group_97284] +[group_97285] +[group_97286] +[group_97287] +[group_97288] +[group_97289] +[group_97290] +[group_97291] +[group_97292] +[group_97293] +[group_97294] +[group_97295] +[group_97296] +[group_97297] +[group_97298] +[group_97299] +[group_97300] +[group_97301] +[group_97302] +[group_97303] +[group_97304] +[group_97305] +[group_97306] +[group_97307] +[group_97308] +[group_97309] +[group_97310] +[group_97311] +[group_97312] +[group_97313] +[group_97314] +[group_97315] +[group_97316] +[group_97317] +[group_97318] +[group_97319] +[group_97320] +[group_97321] +[group_97322] +[group_97323] +[group_97324] +[group_97325] +[group_97326] +[group_97327] +[group_97328] +[group_97329] +[group_97330] +[group_97331] +[group_97332] +[group_97333] +[group_97334] +[group_97335] +[group_97336] +[group_97337] +[group_97338] +[group_97339] +[group_97340] +[group_97341] +[group_97342] +[group_97343] +[group_97344] +[group_97345] +[group_97346] +[group_97347] +[group_97348] +[group_97349] +[group_97350] +[group_97351] +[group_97352] +[group_97353] +[group_97354] +[group_97355] +[group_97356] +[group_97357] +[group_97358] +[group_97359] +[group_97360] +[group_97361] +[group_97362] +[group_97363] +[group_97364] +[group_97365] +[group_97366] +[group_97367] +[group_97368] +[group_97369] +[group_97370] +[group_97371] +[group_97372] +[group_97373] +[group_97374] +[group_97375] +[group_97376] +[group_97377] +[group_97378] +[group_97379] +[group_97380] +[group_97381] +[group_97382] +[group_97383] +[group_97384] +[group_97385] +[group_97386] +[group_97387] +[group_97388] +[group_97389] +[group_97390] +[group_97391] +[group_97392] +[group_97393] +[group_97394] +[group_97395] +[group_97396] +[group_97397] +[group_97398] +[group_97399] +[group_97400] +[group_97401] +[group_97402] +[group_97403] +[group_97404] +[group_97405] +[group_97406] +[group_97407] +[group_97408] +[group_97409] +[group_97410] +[group_97411] +[group_97412] +[group_97413] +[group_97414] +[group_97415] +[group_97416] +[group_97417] +[group_97418] +[group_97419] +[group_97420] +[group_97421] +[group_97422] +[group_97423] +[group_97424] +[group_97425] +[group_97426] +[group_97427] +[group_97428] +[group_97429] +[group_97430] +[group_97431] +[group_97432] +[group_97433] +[group_97434] +[group_97435] +[group_97436] +[group_97437] +[group_97438] +[group_97439] +[group_97440] +[group_97441] +[group_97442] +[group_97443] +[group_97444] +[group_97445] +[group_97446] +[group_97447] +[group_97448] +[group_97449] +[group_97450] +[group_97451] +[group_97452] +[group_97453] +[group_97454] +[group_97455] +[group_97456] +[group_97457] +[group_97458] +[group_97459] +[group_97460] +[group_97461] +[group_97462] +[group_97463] +[group_97464] +[group_97465] +[group_97466] +[group_97467] +[group_97468] +[group_97469] +[group_97470] +[group_97471] +[group_97472] +[group_97473] +[group_97474] +[group_97475] +[group_97476] +[group_97477] +[group_97478] +[group_97479] +[group_97480] +[group_97481] +[group_97482] +[group_97483] +[group_97484] +[group_97485] +[group_97486] +[group_97487] +[group_97488] +[group_97489] +[group_97490] +[group_97491] +[group_97492] +[group_97493] +[group_97494] +[group_97495] +[group_97496] +[group_97497] +[group_97498] +[group_97499] +[group_97500] +[group_97501] +[group_97502] +[group_97503] +[group_97504] +[group_97505] +[group_97506] +[group_97507] +[group_97508] +[group_97509] +[group_97510] +[group_97511] +[group_97512] +[group_97513] +[group_97514] +[group_97515] +[group_97516] +[group_97517] +[group_97518] +[group_97519] +[group_97520] +[group_97521] +[group_97522] +[group_97523] +[group_97524] +[group_97525] +[group_97526] +[group_97527] +[group_97528] +[group_97529] +[group_97530] +[group_97531] +[group_97532] +[group_97533] +[group_97534] +[group_97535] +[group_97536] +[group_97537] +[group_97538] +[group_97539] +[group_97540] +[group_97541] +[group_97542] +[group_97543] +[group_97544] +[group_97545] +[group_97546] +[group_97547] +[group_97548] +[group_97549] +[group_97550] +[group_97551] +[group_97552] +[group_97553] +[group_97554] +[group_97555] +[group_97556] +[group_97557] +[group_97558] +[group_97559] +[group_97560] +[group_97561] +[group_97562] +[group_97563] +[group_97564] +[group_97565] +[group_97566] +[group_97567] +[group_97568] +[group_97569] +[group_97570] +[group_97571] +[group_97572] +[group_97573] +[group_97574] +[group_97575] +[group_97576] +[group_97577] +[group_97578] +[group_97579] +[group_97580] +[group_97581] +[group_97582] +[group_97583] +[group_97584] +[group_97585] +[group_97586] +[group_97587] +[group_97588] +[group_97589] +[group_97590] +[group_97591] +[group_97592] +[group_97593] +[group_97594] +[group_97595] +[group_97596] +[group_97597] +[group_97598] +[group_97599] +[group_97600] +[group_97601] +[group_97602] +[group_97603] +[group_97604] +[group_97605] +[group_97606] +[group_97607] +[group_97608] +[group_97609] +[group_97610] +[group_97611] +[group_97612] +[group_97613] +[group_97614] +[group_97615] +[group_97616] +[group_97617] +[group_97618] +[group_97619] +[group_97620] +[group_97621] +[group_97622] +[group_97623] +[group_97624] +[group_97625] +[group_97626] +[group_97627] +[group_97628] +[group_97629] +[group_97630] +[group_97631] +[group_97632] +[group_97633] +[group_97634] +[group_97635] +[group_97636] +[group_97637] +[group_97638] +[group_97639] +[group_97640] +[group_97641] +[group_97642] +[group_97643] +[group_97644] +[group_97645] +[group_97646] +[group_97647] +[group_97648] +[group_97649] +[group_97650] +[group_97651] +[group_97652] +[group_97653] +[group_97654] +[group_97655] +[group_97656] +[group_97657] +[group_97658] +[group_97659] +[group_97660] +[group_97661] +[group_97662] +[group_97663] +[group_97664] +[group_97665] +[group_97666] +[group_97667] +[group_97668] +[group_97669] +[group_97670] +[group_97671] +[group_97672] +[group_97673] +[group_97674] +[group_97675] +[group_97676] +[group_97677] +[group_97678] +[group_97679] +[group_97680] +[group_97681] +[group_97682] +[group_97683] +[group_97684] +[group_97685] +[group_97686] +[group_97687] +[group_97688] +[group_97689] +[group_97690] +[group_97691] +[group_97692] +[group_97693] +[group_97694] +[group_97695] +[group_97696] +[group_97697] +[group_97698] +[group_97699] +[group_97700] +[group_97701] +[group_97702] +[group_97703] +[group_97704] +[group_97705] +[group_97706] +[group_97707] +[group_97708] +[group_97709] +[group_97710] +[group_97711] +[group_97712] +[group_97713] +[group_97714] +[group_97715] +[group_97716] +[group_97717] +[group_97718] +[group_97719] +[group_97720] +[group_97721] +[group_97722] +[group_97723] +[group_97724] +[group_97725] +[group_97726] +[group_97727] +[group_97728] +[group_97729] +[group_97730] +[group_97731] +[group_97732] +[group_97733] +[group_97734] +[group_97735] +[group_97736] +[group_97737] +[group_97738] +[group_97739] +[group_97740] +[group_97741] +[group_97742] +[group_97743] +[group_97744] +[group_97745] +[group_97746] +[group_97747] +[group_97748] +[group_97749] +[group_97750] +[group_97751] +[group_97752] +[group_97753] +[group_97754] +[group_97755] +[group_97756] +[group_97757] +[group_97758] +[group_97759] +[group_97760] +[group_97761] +[group_97762] +[group_97763] +[group_97764] +[group_97765] +[group_97766] +[group_97767] +[group_97768] +[group_97769] +[group_97770] +[group_97771] +[group_97772] +[group_97773] +[group_97774] +[group_97775] +[group_97776] +[group_97777] +[group_97778] +[group_97779] +[group_97780] +[group_97781] +[group_97782] +[group_97783] +[group_97784] +[group_97785] +[group_97786] +[group_97787] +[group_97788] +[group_97789] +[group_97790] +[group_97791] +[group_97792] +[group_97793] +[group_97794] +[group_97795] +[group_97796] +[group_97797] +[group_97798] +[group_97799] +[group_97800] +[group_97801] +[group_97802] +[group_97803] +[group_97804] +[group_97805] +[group_97806] +[group_97807] +[group_97808] +[group_97809] +[group_97810] +[group_97811] +[group_97812] +[group_97813] +[group_97814] +[group_97815] +[group_97816] +[group_97817] +[group_97818] +[group_97819] +[group_97820] +[group_97821] +[group_97822] +[group_97823] +[group_97824] +[group_97825] +[group_97826] +[group_97827] +[group_97828] +[group_97829] +[group_97830] +[group_97831] +[group_97832] +[group_97833] +[group_97834] +[group_97835] +[group_97836] +[group_97837] +[group_97838] +[group_97839] +[group_97840] +[group_97841] +[group_97842] +[group_97843] +[group_97844] +[group_97845] +[group_97846] +[group_97847] +[group_97848] +[group_97849] +[group_97850] +[group_97851] +[group_97852] +[group_97853] +[group_97854] +[group_97855] +[group_97856] +[group_97857] +[group_97858] +[group_97859] +[group_97860] +[group_97861] +[group_97862] +[group_97863] +[group_97864] +[group_97865] +[group_97866] +[group_97867] +[group_97868] +[group_97869] +[group_97870] +[group_97871] +[group_97872] +[group_97873] +[group_97874] +[group_97875] +[group_97876] +[group_97877] +[group_97878] +[group_97879] +[group_97880] +[group_97881] +[group_97882] +[group_97883] +[group_97884] +[group_97885] +[group_97886] +[group_97887] +[group_97888] +[group_97889] +[group_97890] +[group_97891] +[group_97892] +[group_97893] +[group_97894] +[group_97895] +[group_97896] +[group_97897] +[group_97898] +[group_97899] +[group_97900] +[group_97901] +[group_97902] +[group_97903] +[group_97904] +[group_97905] +[group_97906] +[group_97907] +[group_97908] +[group_97909] +[group_97910] +[group_97911] +[group_97912] +[group_97913] +[group_97914] +[group_97915] +[group_97916] +[group_97917] +[group_97918] +[group_97919] +[group_97920] +[group_97921] +[group_97922] +[group_97923] +[group_97924] +[group_97925] +[group_97926] +[group_97927] +[group_97928] +[group_97929] +[group_97930] +[group_97931] +[group_97932] +[group_97933] +[group_97934] +[group_97935] +[group_97936] +[group_97937] +[group_97938] +[group_97939] +[group_97940] +[group_97941] +[group_97942] +[group_97943] +[group_97944] +[group_97945] +[group_97946] +[group_97947] +[group_97948] +[group_97949] +[group_97950] +[group_97951] +[group_97952] +[group_97953] +[group_97954] +[group_97955] +[group_97956] +[group_97957] +[group_97958] +[group_97959] +[group_97960] +[group_97961] +[group_97962] +[group_97963] +[group_97964] +[group_97965] +[group_97966] +[group_97967] +[group_97968] +[group_97969] +[group_97970] +[group_97971] +[group_97972] +[group_97973] +[group_97974] +[group_97975] +[group_97976] +[group_97977] +[group_97978] +[group_97979] +[group_97980] +[group_97981] +[group_97982] +[group_97983] +[group_97984] +[group_97985] +[group_97986] +[group_97987] +[group_97988] +[group_97989] +[group_97990] +[group_97991] +[group_97992] +[group_97993] +[group_97994] +[group_97995] +[group_97996] +[group_97997] +[group_97998] +[group_97999] +[group_98000] +[group_98001] +[group_98002] +[group_98003] +[group_98004] +[group_98005] +[group_98006] +[group_98007] +[group_98008] +[group_98009] +[group_98010] +[group_98011] +[group_98012] +[group_98013] +[group_98014] +[group_98015] +[group_98016] +[group_98017] +[group_98018] +[group_98019] +[group_98020] +[group_98021] +[group_98022] +[group_98023] +[group_98024] +[group_98025] +[group_98026] +[group_98027] +[group_98028] +[group_98029] +[group_98030] +[group_98031] +[group_98032] +[group_98033] +[group_98034] +[group_98035] +[group_98036] +[group_98037] +[group_98038] +[group_98039] +[group_98040] +[group_98041] +[group_98042] +[group_98043] +[group_98044] +[group_98045] +[group_98046] +[group_98047] +[group_98048] +[group_98049] +[group_98050] +[group_98051] +[group_98052] +[group_98053] +[group_98054] +[group_98055] +[group_98056] +[group_98057] +[group_98058] +[group_98059] +[group_98060] +[group_98061] +[group_98062] +[group_98063] +[group_98064] +[group_98065] +[group_98066] +[group_98067] +[group_98068] +[group_98069] +[group_98070] +[group_98071] +[group_98072] +[group_98073] +[group_98074] +[group_98075] +[group_98076] +[group_98077] +[group_98078] +[group_98079] +[group_98080] +[group_98081] +[group_98082] +[group_98083] +[group_98084] +[group_98085] +[group_98086] +[group_98087] +[group_98088] +[group_98089] +[group_98090] +[group_98091] +[group_98092] +[group_98093] +[group_98094] +[group_98095] +[group_98096] +[group_98097] +[group_98098] +[group_98099] +[group_98100] +[group_98101] +[group_98102] +[group_98103] +[group_98104] +[group_98105] +[group_98106] +[group_98107] +[group_98108] +[group_98109] +[group_98110] +[group_98111] +[group_98112] +[group_98113] +[group_98114] +[group_98115] +[group_98116] +[group_98117] +[group_98118] +[group_98119] +[group_98120] +[group_98121] +[group_98122] +[group_98123] +[group_98124] +[group_98125] +[group_98126] +[group_98127] +[group_98128] +[group_98129] +[group_98130] +[group_98131] +[group_98132] +[group_98133] +[group_98134] +[group_98135] +[group_98136] +[group_98137] +[group_98138] +[group_98139] +[group_98140] +[group_98141] +[group_98142] +[group_98143] +[group_98144] +[group_98145] +[group_98146] +[group_98147] +[group_98148] +[group_98149] +[group_98150] +[group_98151] +[group_98152] +[group_98153] +[group_98154] +[group_98155] +[group_98156] +[group_98157] +[group_98158] +[group_98159] +[group_98160] +[group_98161] +[group_98162] +[group_98163] +[group_98164] +[group_98165] +[group_98166] +[group_98167] +[group_98168] +[group_98169] +[group_98170] +[group_98171] +[group_98172] +[group_98173] +[group_98174] +[group_98175] +[group_98176] +[group_98177] +[group_98178] +[group_98179] +[group_98180] +[group_98181] +[group_98182] +[group_98183] +[group_98184] +[group_98185] +[group_98186] +[group_98187] +[group_98188] +[group_98189] +[group_98190] +[group_98191] +[group_98192] +[group_98193] +[group_98194] +[group_98195] +[group_98196] +[group_98197] +[group_98198] +[group_98199] +[group_98200] +[group_98201] +[group_98202] +[group_98203] +[group_98204] +[group_98205] +[group_98206] +[group_98207] +[group_98208] +[group_98209] +[group_98210] +[group_98211] +[group_98212] +[group_98213] +[group_98214] +[group_98215] +[group_98216] +[group_98217] +[group_98218] +[group_98219] +[group_98220] +[group_98221] +[group_98222] +[group_98223] +[group_98224] +[group_98225] +[group_98226] +[group_98227] +[group_98228] +[group_98229] +[group_98230] +[group_98231] +[group_98232] +[group_98233] +[group_98234] +[group_98235] +[group_98236] +[group_98237] +[group_98238] +[group_98239] +[group_98240] +[group_98241] +[group_98242] +[group_98243] +[group_98244] +[group_98245] +[group_98246] +[group_98247] +[group_98248] +[group_98249] +[group_98250] +[group_98251] +[group_98252] +[group_98253] +[group_98254] +[group_98255] +[group_98256] +[group_98257] +[group_98258] +[group_98259] +[group_98260] +[group_98261] +[group_98262] +[group_98263] +[group_98264] +[group_98265] +[group_98266] +[group_98267] +[group_98268] +[group_98269] +[group_98270] +[group_98271] +[group_98272] +[group_98273] +[group_98274] +[group_98275] +[group_98276] +[group_98277] +[group_98278] +[group_98279] +[group_98280] +[group_98281] +[group_98282] +[group_98283] +[group_98284] +[group_98285] +[group_98286] +[group_98287] +[group_98288] +[group_98289] +[group_98290] +[group_98291] +[group_98292] +[group_98293] +[group_98294] +[group_98295] +[group_98296] +[group_98297] +[group_98298] +[group_98299] +[group_98300] +[group_98301] +[group_98302] +[group_98303] +[group_98304] +[group_98305] +[group_98306] +[group_98307] +[group_98308] +[group_98309] +[group_98310] +[group_98311] +[group_98312] +[group_98313] +[group_98314] +[group_98315] +[group_98316] +[group_98317] +[group_98318] +[group_98319] +[group_98320] +[group_98321] +[group_98322] +[group_98323] +[group_98324] +[group_98325] +[group_98326] +[group_98327] +[group_98328] +[group_98329] +[group_98330] +[group_98331] +[group_98332] +[group_98333] +[group_98334] +[group_98335] +[group_98336] +[group_98337] +[group_98338] +[group_98339] +[group_98340] +[group_98341] +[group_98342] +[group_98343] +[group_98344] +[group_98345] +[group_98346] +[group_98347] +[group_98348] +[group_98349] +[group_98350] +[group_98351] +[group_98352] +[group_98353] +[group_98354] +[group_98355] +[group_98356] +[group_98357] +[group_98358] +[group_98359] +[group_98360] +[group_98361] +[group_98362] +[group_98363] +[group_98364] +[group_98365] +[group_98366] +[group_98367] +[group_98368] +[group_98369] +[group_98370] +[group_98371] +[group_98372] +[group_98373] +[group_98374] +[group_98375] +[group_98376] +[group_98377] +[group_98378] +[group_98379] +[group_98380] +[group_98381] +[group_98382] +[group_98383] +[group_98384] +[group_98385] +[group_98386] +[group_98387] +[group_98388] +[group_98389] +[group_98390] +[group_98391] +[group_98392] +[group_98393] +[group_98394] +[group_98395] +[group_98396] +[group_98397] +[group_98398] +[group_98399] +[group_98400] +[group_98401] +[group_98402] +[group_98403] +[group_98404] +[group_98405] +[group_98406] +[group_98407] +[group_98408] +[group_98409] +[group_98410] +[group_98411] +[group_98412] +[group_98413] +[group_98414] +[group_98415] +[group_98416] +[group_98417] +[group_98418] +[group_98419] +[group_98420] +[group_98421] +[group_98422] +[group_98423] +[group_98424] +[group_98425] +[group_98426] +[group_98427] +[group_98428] +[group_98429] +[group_98430] +[group_98431] +[group_98432] +[group_98433] +[group_98434] +[group_98435] +[group_98436] +[group_98437] +[group_98438] +[group_98439] +[group_98440] +[group_98441] +[group_98442] +[group_98443] +[group_98444] +[group_98445] +[group_98446] +[group_98447] +[group_98448] +[group_98449] +[group_98450] +[group_98451] +[group_98452] +[group_98453] +[group_98454] +[group_98455] +[group_98456] +[group_98457] +[group_98458] +[group_98459] +[group_98460] +[group_98461] +[group_98462] +[group_98463] +[group_98464] +[group_98465] +[group_98466] +[group_98467] +[group_98468] +[group_98469] +[group_98470] +[group_98471] +[group_98472] +[group_98473] +[group_98474] +[group_98475] +[group_98476] +[group_98477] +[group_98478] +[group_98479] +[group_98480] +[group_98481] +[group_98482] +[group_98483] +[group_98484] +[group_98485] +[group_98486] +[group_98487] +[group_98488] +[group_98489] +[group_98490] +[group_98491] +[group_98492] +[group_98493] +[group_98494] +[group_98495] +[group_98496] +[group_98497] +[group_98498] +[group_98499] +[group_98500] +[group_98501] +[group_98502] +[group_98503] +[group_98504] +[group_98505] +[group_98506] +[group_98507] +[group_98508] +[group_98509] +[group_98510] +[group_98511] +[group_98512] +[group_98513] +[group_98514] +[group_98515] +[group_98516] +[group_98517] +[group_98518] +[group_98519] +[group_98520] +[group_98521] +[group_98522] +[group_98523] +[group_98524] +[group_98525] +[group_98526] +[group_98527] +[group_98528] +[group_98529] +[group_98530] +[group_98531] +[group_98532] +[group_98533] +[group_98534] +[group_98535] +[group_98536] +[group_98537] +[group_98538] +[group_98539] +[group_98540] +[group_98541] +[group_98542] +[group_98543] +[group_98544] +[group_98545] +[group_98546] +[group_98547] +[group_98548] +[group_98549] +[group_98550] +[group_98551] +[group_98552] +[group_98553] +[group_98554] +[group_98555] +[group_98556] +[group_98557] +[group_98558] +[group_98559] +[group_98560] +[group_98561] +[group_98562] +[group_98563] +[group_98564] +[group_98565] +[group_98566] +[group_98567] +[group_98568] +[group_98569] +[group_98570] +[group_98571] +[group_98572] +[group_98573] +[group_98574] +[group_98575] +[group_98576] +[group_98577] +[group_98578] +[group_98579] +[group_98580] +[group_98581] +[group_98582] +[group_98583] +[group_98584] +[group_98585] +[group_98586] +[group_98587] +[group_98588] +[group_98589] +[group_98590] +[group_98591] +[group_98592] +[group_98593] +[group_98594] +[group_98595] +[group_98596] +[group_98597] +[group_98598] +[group_98599] +[group_98600] +[group_98601] +[group_98602] +[group_98603] +[group_98604] +[group_98605] +[group_98606] +[group_98607] +[group_98608] +[group_98609] +[group_98610] +[group_98611] +[group_98612] +[group_98613] +[group_98614] +[group_98615] +[group_98616] +[group_98617] +[group_98618] +[group_98619] +[group_98620] +[group_98621] +[group_98622] +[group_98623] +[group_98624] +[group_98625] +[group_98626] +[group_98627] +[group_98628] +[group_98629] +[group_98630] +[group_98631] +[group_98632] +[group_98633] +[group_98634] +[group_98635] +[group_98636] +[group_98637] +[group_98638] +[group_98639] +[group_98640] +[group_98641] +[group_98642] +[group_98643] +[group_98644] +[group_98645] +[group_98646] +[group_98647] +[group_98648] +[group_98649] +[group_98650] +[group_98651] +[group_98652] +[group_98653] +[group_98654] +[group_98655] +[group_98656] +[group_98657] +[group_98658] +[group_98659] +[group_98660] +[group_98661] +[group_98662] +[group_98663] +[group_98664] +[group_98665] +[group_98666] +[group_98667] +[group_98668] +[group_98669] +[group_98670] +[group_98671] +[group_98672] +[group_98673] +[group_98674] +[group_98675] +[group_98676] +[group_98677] +[group_98678] +[group_98679] +[group_98680] +[group_98681] +[group_98682] +[group_98683] +[group_98684] +[group_98685] +[group_98686] +[group_98687] +[group_98688] +[group_98689] +[group_98690] +[group_98691] +[group_98692] +[group_98693] +[group_98694] +[group_98695] +[group_98696] +[group_98697] +[group_98698] +[group_98699] +[group_98700] +[group_98701] +[group_98702] +[group_98703] +[group_98704] +[group_98705] +[group_98706] +[group_98707] +[group_98708] +[group_98709] +[group_98710] +[group_98711] +[group_98712] +[group_98713] +[group_98714] +[group_98715] +[group_98716] +[group_98717] +[group_98718] +[group_98719] +[group_98720] +[group_98721] +[group_98722] +[group_98723] +[group_98724] +[group_98725] +[group_98726] +[group_98727] +[group_98728] +[group_98729] +[group_98730] +[group_98731] +[group_98732] +[group_98733] +[group_98734] +[group_98735] +[group_98736] +[group_98737] +[group_98738] +[group_98739] +[group_98740] +[group_98741] +[group_98742] +[group_98743] +[group_98744] +[group_98745] +[group_98746] +[group_98747] +[group_98748] +[group_98749] +[group_98750] +[group_98751] +[group_98752] +[group_98753] +[group_98754] +[group_98755] +[group_98756] +[group_98757] +[group_98758] +[group_98759] +[group_98760] +[group_98761] +[group_98762] +[group_98763] +[group_98764] +[group_98765] +[group_98766] +[group_98767] +[group_98768] +[group_98769] +[group_98770] +[group_98771] +[group_98772] +[group_98773] +[group_98774] +[group_98775] +[group_98776] +[group_98777] +[group_98778] +[group_98779] +[group_98780] +[group_98781] +[group_98782] +[group_98783] +[group_98784] +[group_98785] +[group_98786] +[group_98787] +[group_98788] +[group_98789] +[group_98790] +[group_98791] +[group_98792] +[group_98793] +[group_98794] +[group_98795] +[group_98796] +[group_98797] +[group_98798] +[group_98799] +[group_98800] +[group_98801] +[group_98802] +[group_98803] +[group_98804] +[group_98805] +[group_98806] +[group_98807] +[group_98808] +[group_98809] +[group_98810] +[group_98811] +[group_98812] +[group_98813] +[group_98814] +[group_98815] +[group_98816] +[group_98817] +[group_98818] +[group_98819] +[group_98820] +[group_98821] +[group_98822] +[group_98823] +[group_98824] +[group_98825] +[group_98826] +[group_98827] +[group_98828] +[group_98829] +[group_98830] +[group_98831] +[group_98832] +[group_98833] +[group_98834] +[group_98835] +[group_98836] +[group_98837] +[group_98838] +[group_98839] +[group_98840] +[group_98841] +[group_98842] +[group_98843] +[group_98844] +[group_98845] +[group_98846] +[group_98847] +[group_98848] +[group_98849] +[group_98850] +[group_98851] +[group_98852] +[group_98853] +[group_98854] +[group_98855] +[group_98856] +[group_98857] +[group_98858] +[group_98859] +[group_98860] +[group_98861] +[group_98862] +[group_98863] +[group_98864] +[group_98865] +[group_98866] +[group_98867] +[group_98868] +[group_98869] +[group_98870] +[group_98871] +[group_98872] +[group_98873] +[group_98874] +[group_98875] +[group_98876] +[group_98877] +[group_98878] +[group_98879] +[group_98880] +[group_98881] +[group_98882] +[group_98883] +[group_98884] +[group_98885] +[group_98886] +[group_98887] +[group_98888] +[group_98889] +[group_98890] +[group_98891] +[group_98892] +[group_98893] +[group_98894] +[group_98895] +[group_98896] +[group_98897] +[group_98898] +[group_98899] +[group_98900] +[group_98901] +[group_98902] +[group_98903] +[group_98904] +[group_98905] +[group_98906] +[group_98907] +[group_98908] +[group_98909] +[group_98910] +[group_98911] +[group_98912] +[group_98913] +[group_98914] +[group_98915] +[group_98916] +[group_98917] +[group_98918] +[group_98919] +[group_98920] +[group_98921] +[group_98922] +[group_98923] +[group_98924] +[group_98925] +[group_98926] +[group_98927] +[group_98928] +[group_98929] +[group_98930] +[group_98931] +[group_98932] +[group_98933] +[group_98934] +[group_98935] +[group_98936] +[group_98937] +[group_98938] +[group_98939] +[group_98940] +[group_98941] +[group_98942] +[group_98943] +[group_98944] +[group_98945] +[group_98946] +[group_98947] +[group_98948] +[group_98949] +[group_98950] +[group_98951] +[group_98952] +[group_98953] +[group_98954] +[group_98955] +[group_98956] +[group_98957] +[group_98958] +[group_98959] +[group_98960] +[group_98961] +[group_98962] +[group_98963] +[group_98964] +[group_98965] +[group_98966] +[group_98967] +[group_98968] +[group_98969] +[group_98970] +[group_98971] +[group_98972] +[group_98973] +[group_98974] +[group_98975] +[group_98976] +[group_98977] +[group_98978] +[group_98979] +[group_98980] +[group_98981] +[group_98982] +[group_98983] +[group_98984] +[group_98985] +[group_98986] +[group_98987] +[group_98988] +[group_98989] +[group_98990] +[group_98991] +[group_98992] +[group_98993] +[group_98994] +[group_98995] +[group_98996] +[group_98997] +[group_98998] +[group_98999] +[group_99000] +[group_99001] +[group_99002] +[group_99003] +[group_99004] +[group_99005] +[group_99006] +[group_99007] +[group_99008] +[group_99009] +[group_99010] +[group_99011] +[group_99012] +[group_99013] +[group_99014] +[group_99015] +[group_99016] +[group_99017] +[group_99018] +[group_99019] +[group_99020] +[group_99021] +[group_99022] +[group_99023] +[group_99024] +[group_99025] +[group_99026] +[group_99027] +[group_99028] +[group_99029] +[group_99030] +[group_99031] +[group_99032] +[group_99033] +[group_99034] +[group_99035] +[group_99036] +[group_99037] +[group_99038] +[group_99039] +[group_99040] +[group_99041] +[group_99042] +[group_99043] +[group_99044] +[group_99045] +[group_99046] +[group_99047] +[group_99048] +[group_99049] +[group_99050] +[group_99051] +[group_99052] +[group_99053] +[group_99054] +[group_99055] +[group_99056] +[group_99057] +[group_99058] +[group_99059] +[group_99060] +[group_99061] +[group_99062] +[group_99063] +[group_99064] +[group_99065] +[group_99066] +[group_99067] +[group_99068] +[group_99069] +[group_99070] +[group_99071] +[group_99072] +[group_99073] +[group_99074] +[group_99075] +[group_99076] +[group_99077] +[group_99078] +[group_99079] +[group_99080] +[group_99081] +[group_99082] +[group_99083] +[group_99084] +[group_99085] +[group_99086] +[group_99087] +[group_99088] +[group_99089] +[group_99090] +[group_99091] +[group_99092] +[group_99093] +[group_99094] +[group_99095] +[group_99096] +[group_99097] +[group_99098] +[group_99099] +[group_99100] +[group_99101] +[group_99102] +[group_99103] +[group_99104] +[group_99105] +[group_99106] +[group_99107] +[group_99108] +[group_99109] +[group_99110] +[group_99111] +[group_99112] +[group_99113] +[group_99114] +[group_99115] +[group_99116] +[group_99117] +[group_99118] +[group_99119] +[group_99120] +[group_99121] +[group_99122] +[group_99123] +[group_99124] +[group_99125] +[group_99126] +[group_99127] +[group_99128] +[group_99129] +[group_99130] +[group_99131] +[group_99132] +[group_99133] +[group_99134] +[group_99135] +[group_99136] +[group_99137] +[group_99138] +[group_99139] +[group_99140] +[group_99141] +[group_99142] +[group_99143] +[group_99144] +[group_99145] +[group_99146] +[group_99147] +[group_99148] +[group_99149] +[group_99150] +[group_99151] +[group_99152] +[group_99153] +[group_99154] +[group_99155] +[group_99156] +[group_99157] +[group_99158] +[group_99159] +[group_99160] +[group_99161] +[group_99162] +[group_99163] +[group_99164] +[group_99165] +[group_99166] +[group_99167] +[group_99168] +[group_99169] +[group_99170] +[group_99171] +[group_99172] +[group_99173] +[group_99174] +[group_99175] +[group_99176] +[group_99177] +[group_99178] +[group_99179] +[group_99180] +[group_99181] +[group_99182] +[group_99183] +[group_99184] +[group_99185] +[group_99186] +[group_99187] +[group_99188] +[group_99189] +[group_99190] +[group_99191] +[group_99192] +[group_99193] +[group_99194] +[group_99195] +[group_99196] +[group_99197] +[group_99198] +[group_99199] +[group_99200] +[group_99201] +[group_99202] +[group_99203] +[group_99204] +[group_99205] +[group_99206] +[group_99207] +[group_99208] +[group_99209] +[group_99210] +[group_99211] +[group_99212] +[group_99213] +[group_99214] +[group_99215] +[group_99216] +[group_99217] +[group_99218] +[group_99219] +[group_99220] +[group_99221] +[group_99222] +[group_99223] +[group_99224] +[group_99225] +[group_99226] +[group_99227] +[group_99228] +[group_99229] +[group_99230] +[group_99231] +[group_99232] +[group_99233] +[group_99234] +[group_99235] +[group_99236] +[group_99237] +[group_99238] +[group_99239] +[group_99240] +[group_99241] +[group_99242] +[group_99243] +[group_99244] +[group_99245] +[group_99246] +[group_99247] +[group_99248] +[group_99249] +[group_99250] +[group_99251] +[group_99252] +[group_99253] +[group_99254] +[group_99255] +[group_99256] +[group_99257] +[group_99258] +[group_99259] +[group_99260] +[group_99261] +[group_99262] +[group_99263] +[group_99264] +[group_99265] +[group_99266] +[group_99267] +[group_99268] +[group_99269] +[group_99270] +[group_99271] +[group_99272] +[group_99273] +[group_99274] +[group_99275] +[group_99276] +[group_99277] +[group_99278] +[group_99279] +[group_99280] +[group_99281] +[group_99282] +[group_99283] +[group_99284] +[group_99285] +[group_99286] +[group_99287] +[group_99288] +[group_99289] +[group_99290] +[group_99291] +[group_99292] +[group_99293] +[group_99294] +[group_99295] +[group_99296] +[group_99297] +[group_99298] +[group_99299] +[group_99300] +[group_99301] +[group_99302] +[group_99303] +[group_99304] +[group_99305] +[group_99306] +[group_99307] +[group_99308] +[group_99309] +[group_99310] +[group_99311] +[group_99312] +[group_99313] +[group_99314] +[group_99315] +[group_99316] +[group_99317] +[group_99318] +[group_99319] +[group_99320] +[group_99321] +[group_99322] +[group_99323] +[group_99324] +[group_99325] +[group_99326] +[group_99327] +[group_99328] +[group_99329] +[group_99330] +[group_99331] +[group_99332] +[group_99333] +[group_99334] +[group_99335] +[group_99336] +[group_99337] +[group_99338] +[group_99339] +[group_99340] +[group_99341] +[group_99342] +[group_99343] +[group_99344] +[group_99345] +[group_99346] +[group_99347] +[group_99348] +[group_99349] +[group_99350] +[group_99351] +[group_99352] +[group_99353] +[group_99354] +[group_99355] +[group_99356] +[group_99357] +[group_99358] +[group_99359] +[group_99360] +[group_99361] +[group_99362] +[group_99363] +[group_99364] +[group_99365] +[group_99366] +[group_99367] +[group_99368] +[group_99369] +[group_99370] +[group_99371] +[group_99372] +[group_99373] +[group_99374] +[group_99375] +[group_99376] +[group_99377] +[group_99378] +[group_99379] +[group_99380] +[group_99381] +[group_99382] +[group_99383] +[group_99384] +[group_99385] +[group_99386] +[group_99387] +[group_99388] +[group_99389] +[group_99390] +[group_99391] +[group_99392] +[group_99393] +[group_99394] +[group_99395] +[group_99396] +[group_99397] +[group_99398] +[group_99399] +[group_99400] +[group_99401] +[group_99402] +[group_99403] +[group_99404] +[group_99405] +[group_99406] +[group_99407] +[group_99408] +[group_99409] +[group_99410] +[group_99411] +[group_99412] +[group_99413] +[group_99414] +[group_99415] +[group_99416] +[group_99417] +[group_99418] +[group_99419] +[group_99420] +[group_99421] +[group_99422] +[group_99423] +[group_99424] +[group_99425] +[group_99426] +[group_99427] +[group_99428] +[group_99429] +[group_99430] +[group_99431] +[group_99432] +[group_99433] +[group_99434] +[group_99435] +[group_99436] +[group_99437] +[group_99438] +[group_99439] +[group_99440] +[group_99441] +[group_99442] +[group_99443] +[group_99444] +[group_99445] +[group_99446] +[group_99447] +[group_99448] +[group_99449] +[group_99450] +[group_99451] +[group_99452] +[group_99453] +[group_99454] +[group_99455] +[group_99456] +[group_99457] +[group_99458] +[group_99459] +[group_99460] +[group_99461] +[group_99462] +[group_99463] +[group_99464] +[group_99465] +[group_99466] +[group_99467] +[group_99468] +[group_99469] +[group_99470] +[group_99471] +[group_99472] +[group_99473] +[group_99474] +[group_99475] +[group_99476] +[group_99477] +[group_99478] +[group_99479] +[group_99480] +[group_99481] +[group_99482] +[group_99483] +[group_99484] +[group_99485] +[group_99486] +[group_99487] +[group_99488] +[group_99489] +[group_99490] +[group_99491] +[group_99492] +[group_99493] +[group_99494] +[group_99495] +[group_99496] +[group_99497] +[group_99498] +[group_99499] +[group_99500] +[group_99501] +[group_99502] +[group_99503] +[group_99504] +[group_99505] +[group_99506] +[group_99507] +[group_99508] +[group_99509] +[group_99510] +[group_99511] +[group_99512] +[group_99513] +[group_99514] +[group_99515] +[group_99516] +[group_99517] +[group_99518] +[group_99519] +[group_99520] +[group_99521] +[group_99522] +[group_99523] +[group_99524] +[group_99525] +[group_99526] +[group_99527] +[group_99528] +[group_99529] +[group_99530] +[group_99531] +[group_99532] +[group_99533] +[group_99534] +[group_99535] +[group_99536] +[group_99537] +[group_99538] +[group_99539] +[group_99540] +[group_99541] +[group_99542] +[group_99543] +[group_99544] +[group_99545] +[group_99546] +[group_99547] +[group_99548] +[group_99549] +[group_99550] +[group_99551] +[group_99552] +[group_99553] +[group_99554] +[group_99555] +[group_99556] +[group_99557] +[group_99558] +[group_99559] +[group_99560] +[group_99561] +[group_99562] +[group_99563] +[group_99564] +[group_99565] +[group_99566] +[group_99567] +[group_99568] +[group_99569] +[group_99570] +[group_99571] +[group_99572] +[group_99573] +[group_99574] +[group_99575] +[group_99576] +[group_99577] +[group_99578] +[group_99579] +[group_99580] +[group_99581] +[group_99582] +[group_99583] +[group_99584] +[group_99585] +[group_99586] +[group_99587] +[group_99588] +[group_99589] +[group_99590] +[group_99591] +[group_99592] +[group_99593] +[group_99594] +[group_99595] +[group_99596] +[group_99597] +[group_99598] +[group_99599] +[group_99600] +[group_99601] +[group_99602] +[group_99603] +[group_99604] +[group_99605] +[group_99606] +[group_99607] +[group_99608] +[group_99609] +[group_99610] +[group_99611] +[group_99612] +[group_99613] +[group_99614] +[group_99615] +[group_99616] +[group_99617] +[group_99618] +[group_99619] +[group_99620] +[group_99621] +[group_99622] +[group_99623] +[group_99624] +[group_99625] +[group_99626] +[group_99627] +[group_99628] +[group_99629] +[group_99630] +[group_99631] +[group_99632] +[group_99633] +[group_99634] +[group_99635] +[group_99636] +[group_99637] +[group_99638] +[group_99639] +[group_99640] +[group_99641] +[group_99642] +[group_99643] +[group_99644] +[group_99645] +[group_99646] +[group_99647] +[group_99648] +[group_99649] +[group_99650] +[group_99651] +[group_99652] +[group_99653] +[group_99654] +[group_99655] +[group_99656] +[group_99657] +[group_99658] +[group_99659] +[group_99660] +[group_99661] +[group_99662] +[group_99663] +[group_99664] +[group_99665] +[group_99666] +[group_99667] +[group_99668] +[group_99669] +[group_99670] +[group_99671] +[group_99672] +[group_99673] +[group_99674] +[group_99675] +[group_99676] +[group_99677] +[group_99678] +[group_99679] +[group_99680] +[group_99681] +[group_99682] +[group_99683] +[group_99684] +[group_99685] +[group_99686] +[group_99687] +[group_99688] +[group_99689] +[group_99690] +[group_99691] +[group_99692] +[group_99693] +[group_99694] +[group_99695] +[group_99696] +[group_99697] +[group_99698] +[group_99699] +[group_99700] +[group_99701] +[group_99702] +[group_99703] +[group_99704] +[group_99705] +[group_99706] +[group_99707] +[group_99708] +[group_99709] +[group_99710] +[group_99711] +[group_99712] +[group_99713] +[group_99714] +[group_99715] +[group_99716] +[group_99717] +[group_99718] +[group_99719] +[group_99720] +[group_99721] +[group_99722] +[group_99723] +[group_99724] +[group_99725] +[group_99726] +[group_99727] +[group_99728] +[group_99729] +[group_99730] +[group_99731] +[group_99732] +[group_99733] +[group_99734] +[group_99735] +[group_99736] +[group_99737] +[group_99738] +[group_99739] +[group_99740] +[group_99741] +[group_99742] +[group_99743] +[group_99744] +[group_99745] +[group_99746] +[group_99747] +[group_99748] +[group_99749] +[group_99750] +[group_99751] +[group_99752] +[group_99753] +[group_99754] +[group_99755] +[group_99756] +[group_99757] +[group_99758] +[group_99759] +[group_99760] +[group_99761] +[group_99762] +[group_99763] +[group_99764] +[group_99765] +[group_99766] +[group_99767] +[group_99768] +[group_99769] +[group_99770] +[group_99771] +[group_99772] +[group_99773] +[group_99774] +[group_99775] +[group_99776] +[group_99777] +[group_99778] +[group_99779] +[group_99780] +[group_99781] +[group_99782] +[group_99783] +[group_99784] +[group_99785] +[group_99786] +[group_99787] +[group_99788] +[group_99789] +[group_99790] +[group_99791] +[group_99792] +[group_99793] +[group_99794] +[group_99795] +[group_99796] +[group_99797] +[group_99798] +[group_99799] +[group_99800] +[group_99801] +[group_99802] +[group_99803] +[group_99804] +[group_99805] +[group_99806] +[group_99807] +[group_99808] +[group_99809] +[group_99810] +[group_99811] +[group_99812] +[group_99813] +[group_99814] +[group_99815] +[group_99816] +[group_99817] +[group_99818] +[group_99819] +[group_99820] +[group_99821] +[group_99822] +[group_99823] +[group_99824] +[group_99825] +[group_99826] +[group_99827] +[group_99828] +[group_99829] +[group_99830] +[group_99831] +[group_99832] +[group_99833] +[group_99834] +[group_99835] +[group_99836] +[group_99837] +[group_99838] +[group_99839] +[group_99840] +[group_99841] +[group_99842] +[group_99843] +[group_99844] +[group_99845] +[group_99846] +[group_99847] +[group_99848] +[group_99849] +[group_99850] +[group_99851] +[group_99852] +[group_99853] +[group_99854] +[group_99855] +[group_99856] +[group_99857] +[group_99858] +[group_99859] +[group_99860] +[group_99861] +[group_99862] +[group_99863] +[group_99864] +[group_99865] +[group_99866] +[group_99867] +[group_99868] +[group_99869] +[group_99870] +[group_99871] +[group_99872] +[group_99873] +[group_99874] +[group_99875] +[group_99876] +[group_99877] +[group_99878] +[group_99879] +[group_99880] +[group_99881] +[group_99882] +[group_99883] +[group_99884] +[group_99885] +[group_99886] +[group_99887] +[group_99888] +[group_99889] +[group_99890] +[group_99891] +[group_99892] +[group_99893] +[group_99894] +[group_99895] +[group_99896] +[group_99897] +[group_99898] +[group_99899] +[group_99900] +[group_99901] +[group_99902] +[group_99903] +[group_99904] +[group_99905] +[group_99906] +[group_99907] +[group_99908] +[group_99909] +[group_99910] +[group_99911] +[group_99912] +[group_99913] +[group_99914] +[group_99915] +[group_99916] +[group_99917] +[group_99918] +[group_99919] +[group_99920] +[group_99921] +[group_99922] +[group_99923] +[group_99924] +[group_99925] +[group_99926] +[group_99927] +[group_99928] +[group_99929] +[group_99930] +[group_99931] +[group_99932] +[group_99933] +[group_99934] +[group_99935] +[group_99936] +[group_99937] +[group_99938] +[group_99939] +[group_99940] +[group_99941] +[group_99942] +[group_99943] +[group_99944] +[group_99945] +[group_99946] +[group_99947] +[group_99948] +[group_99949] +[group_99950] +[group_99951] +[group_99952] +[group_99953] +[group_99954] +[group_99955] +[group_99956] +[group_99957] +[group_99958] +[group_99959] +[group_99960] +[group_99961] +[group_99962] +[group_99963] +[group_99964] +[group_99965] +[group_99966] +[group_99967] +[group_99968] +[group_99969] +[group_99970] +[group_99971] +[group_99972] +[group_99973] +[group_99974] +[group_99975] +[group_99976] +[group_99977] +[group_99978] +[group_99979] +[group_99980] +[group_99981] +[group_99982] +[group_99983] +[group_99984] +[group_99985] +[group_99986] +[group_99987] +[group_99988] +[group_99989] +[group_99990] +[group_99991] +[group_99992] +[group_99993] +[group_99994] +[group_99995] +[group_99996] +[group_99997] +[group_99998] +[group_99999] +[group_100000] diff --git a/configure/test/test_group/conf/dupgroup.conf b/configure/test/test_group/conf/dupgroup.conf new file mode 100644 index 0000000000000000000000000000000000000000..22243f143b1f73bf2e7d5f40d318057e52df6ee1 --- /dev/null +++ b/configure/test/test_group/conf/dupgroup.conf @@ -0,0 +1,28 @@ +[aaa] +sda:1223 +[.xfs] +[.xfs.xes] +[bbb] +asdf:122 +[ccc] +[.xfs] +[.xsas] +[aaa] +[.xfs.xes] +[ggg] +[.asdqq] +dsfa:132 +[ccc] +qwer:3612 +[.xsas] +[ccc] +[ccc.xsas] +adf:2221 +[bbb] + +#4 top groups, 2 of them are duplicate +#5 lower groups, 2 of them are duplicate +#9 all groups, 4 of them... + + +#level1 4, level2 4, level3 9 diff --git a/configure/test/test_group/conf/genconf.sh b/configure/test/test_group/conf/genconf.sh new file mode 100755 index 0000000000000000000000000000000000000000..f2a32d162c9196dc26a1ed41f6c77fe078616273 --- /dev/null +++ b/configure/test/test_group/conf/genconf.sh @@ -0,0 +1,15 @@ +#! /bin/sh + +times=10000 + +if [ $# == 1 ] +then + times=$1 +fi + +cat /dev/null > bigconf.conf + +for((i=1;i<=$times;i++)) +do + echo [group_$i] +done >> bigconf.conf diff --git a/configure/test/test_group/conf/nodupgroup.conf b/configure/test/test_group/conf/nodupgroup.conf new file mode 100644 index 0000000000000000000000000000000000000000..802fee270af9b7f86ec2847338f64856202e8870 --- /dev/null +++ b/configure/test/test_group/conf/nodupgroup.conf @@ -0,0 +1,11 @@ +[a] +[a.b] +xxx:123 +yy:2312 +[.c] +[b] +zzz:2222 +[c] +dd:45324 +[a.d] +asd:22234 diff --git a/configure/test/test_group/conf/nullgroup.conf b/configure/test/test_group/conf/nullgroup.conf new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/configure/test/test_group/conf/vecgroup.conf b/configure/test/test_group/conf/vecgroup.conf new file mode 100644 index 0000000000000000000000000000000000000000..6d5d8a53df72d3dcc5a52c31e3a528b8904cff40 --- /dev/null +++ b/configure/test/test_group/conf/vecgroup.conf @@ -0,0 +1,13 @@ +[@abc] +[love] +[@bbb] +[@abc] +[here] +[.is] +[here.is.baidu] +[@abc] +[.i] +[..@love] +[..@love] +[...baidu] +[@bbb] diff --git a/configure/test/test_group/test_Configure.cpp b/configure/test/test_group/test_Configure.cpp new file mode 100644 index 0000000000000000000000000000000000000000..7874257cfef1a5aee360e37db10dab7cc29799ca --- /dev/null +++ b/configure/test/test_group/test_Configure.cpp @@ -0,0 +1,109 @@ +#include +#include +#include + + +int main(int argc, char **argv) +{ + testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} +/** + * @brief +**/ +class test_load_ex_suite : public ::testing::Test{ + protected: + test_load_ex_suite(){}; + virtual ~test_load_ex_suite(){}; + virtual void SetUp() { + //Called befor every TEST_F(test_load_ex_suite, *) + }; + virtual void TearDown() { + //Called after every TEST_F(test_load_ex_suite, *) + }; +}; + + +/** + * @brief check invalid @dupLevel + * @begin_version + **/ +TEST_F(test_load_ex_suite, case_invalidParam) +{ + //TODO + comcfg::Configure conf[3]; + int ret = conf[0].load_ex("conf/", "nullgroup.conf", NULL, -1); + ASSERT_NE(0, ret); + ret = conf[1].load_ex("conf/", "nullgroup.conf", NULL, 4); + ASSERT_NE(0, ret); + ret = conf[2].load_ex("conf/", "nullgroup.conf", NULL, 999); + ASSERT_NE(0, ret); +} + + /** + * @brief check return value with non-duplicate conf + * @begin_version + **/ + TEST_F(test_load_ex_suite, case_nodupGroup) + { + //TODO + comcfg::Configure conf[4]; + int ret = conf[0].load_ex("conf/", "nodupgroup.conf", NULL, 0); + ASSERT_EQ(0, ret); + ret = conf[1].load_ex("conf/", "nodupgroup.conf", NULL, 1); + ASSERT_EQ(0, ret); + ret = conf[2].load_ex("conf/", "nodupgroup.conf", NULL, 2); + ASSERT_EQ(0, ret); + ret = conf[3].load_ex("conf/", "nodupgroup.conf", NULL, 3); + ASSERT_EQ(0, ret); + } + + + /** + * @brief check return value with non-duplicate conf + * @begin_version + **/ + TEST_F(test_load_ex_suite, case_dupGroup) + { + //TODO + comcfg::Configure conf[4]; + int ret = conf[0].load_ex("conf/", "dupgroup.conf", NULL, 0); + ASSERT_EQ(0, ret); + ret = conf[1].load_ex("conf/", "dupgroup.conf", NULL, 1); + ASSERT_EQ(12, ret); + ret = conf[2].load_ex("conf/", "dupgroup.conf", NULL, 2); + ASSERT_EQ(12, ret); + ret = conf[3].load_ex("conf/", "dupgroup.conf", NULL, 3); + ASSERT_EQ(0, ret); + } + + /** + * @brief test big configure file + * @begin_version + **/ + TEST_F(test_load_ex_suite, case_bigConf) + { + //TODO + //call genconf.sh to generate a bigconf.conf + comcfg::Configure conf; + int ret = conf.load_ex("conf/", "bigconf.conf", NULL, 3); + ASSERT_EQ(0, ret); + } + + /** + * @brief test vector in configure file, which should not be regarded as duplicate groups, even not a group + * @begin_version + **/ + TEST_F(test_load_ex_suite, case_vectorInConf) + { + //TODO + comcfg::Configure conf[4]; + int ret = conf[0].load_ex("conf/", "vecgroup.conf", NULL, 0); + ASSERT_EQ(0, ret); + ret = conf[1].load_ex("conf/", "vecgroup.conf", NULL, 1); + ASSERT_EQ(0, ret); + ret = conf[2].load_ex("conf/", "vecgroup.conf", NULL, 2); + ASSERT_EQ(0, ret); + ret = conf[3].load_ex("conf/", "vecgroup.conf", NULL, 3); + ASSERT_EQ(0, ret); + } diff --git a/configure/test/test_ivar.cpp b/configure/test/test_ivar.cpp new file mode 100644 index 0000000000000000000000000000000000000000..d119cdb8d45ab7a32a908818d4adbd1e42fff871 --- /dev/null +++ b/configure/test/test_ivar.cpp @@ -0,0 +1,55 @@ +/*************************************************************************** + * + * Copyright (c) 2009 Baidu.com, Inc. All Rights Reserved + * $Id: test_ivar.cpp,v 1.3 2009/08/13 07:23:01 scmpf Exp $ + * + **************************************************************************/ + + + +/** + * @file test_ivar.cpp + * @author yingxiang(com@baidu.com) + * @date 2009/03/11 22:59:17 + * @version $Revision: 1.3 $ + * @brief + * + **/ + +#include "Configure.h" + +int main(){ + //comcfg::Log::openLowLevel(); + comcfg::Configure conf; + conf.load(".", "t1.conf"); + conf.print(); + bsl::ResourcePool rp; + bsl::var::IVar& ivar = conf.to_IVar(&rp); + //printf("\nivar to_string === \n%s\n\n", ivar.to_string(5).c_str()); + + comcfg::Configure cf2; + printf("\nloadIvar ===> %d \n", cf2.loadIVar(ivar)); + printf("\n=== conf2.dump ===\n%s\n\n", cf2.dump(NULL)); + printf("\n=== conf2.print ===\n"); + cf2.print(); + + return 0; +} + + + + + + + + + + + + + + + + + +/* vim: set ts=4 sw=4 sts=4 tw=100 */ diff --git a/configure/test/test_option.cpp b/configure/test/test_option.cpp new file mode 100644 index 0000000000000000000000000000000000000000..c274e281ff9493b29d974b254823bc5fed3d54e2 --- /dev/null +++ b/configure/test/test_option.cpp @@ -0,0 +1,53 @@ +/*************************************************************************** + * + * Copyright (c) 2008 Baidu.com, Inc. All Rights Reserved + * $Id: test_option.cpp,v 1.2 2009/01/13 13:35:13 yingxiang Exp $ + * + **************************************************************************/ + + + +/** + * @file test_option.cpp + * @author yingxiang(com@baidu.com) + * @date 2008/12/29 23:54:04 + * @version $Revision: 1.2 $ + * @brief + * + **/ + +#include "CmdOption.h" + +int showVersion(comcfg::CmdOption * cmd){ + printf("Version : %g\n", (*cmd)["v"].to_float()); + return 0; +} + +int main(){ + char *s[] = {"-a", "-h", "-v1.0", "--port=80", "roba", "cnhawk", "-ccode", "wtommy", "-f"}; + + comcfg:: CmdOption cmd; + cmd.init(7, s, "a:hv::c::"); + cmd.registHook("v", showVersion); + cmd.runHook(); + return 0; +} + + + + + + + + + + + + + + + + + + +/* vim: set ts=4 sw=4 sts=4 tw=100 */ diff --git a/configure/test/test_option.res b/configure/test/test_option.res new file mode 100644 index 0000000000000000000000000000000000000000..bb0b8cd56fb14286ae754369711731d19326c622 --- /dev/null +++ b/configure/test/test_option.res @@ -0,0 +1 @@ +Version : 1 diff --git a/configure/test/test_rawdata.cpp b/configure/test/test_rawdata.cpp new file mode 100644 index 0000000000000000000000000000000000000000..600b2f92153094fd1f91eeac411f54e6b22ab4a1 --- /dev/null +++ b/configure/test/test_rawdata.cpp @@ -0,0 +1,40 @@ +/*************************************************************************** + * + * Copyright (c) 2008 Baidu.com, Inc. All Rights Reserved + * $Id: test_rawdata.cpp,v 1.2 2009/01/13 13:35:13 yingxiang Exp $ + * + **************************************************************************/ + + + +/** + * @file test_rawdata.cpp + * @author yingxiang(com@baidu.com) + * @date 2008/12/20 23:06:45 + * @version $Revision: 1.2 $ + * @brief + * + **/ + +#include "reader/RawData.h" +#include + +int main(){ + comcfg::RawData rd; + rd.load("raw.conf"); + for(int i = 0; (size_t)i < rd.lineNum(); ++i){ + printf("%s\n", rd.getLine(i)); + } + return 0; +} + + + + + + + + + + +/* vim: set ts=4 sw=4 sts=4 tw=100 */ diff --git a/configure/test/test_rawdata.res b/configure/test/test_rawdata.res new file mode 100644 index 0000000000000000000000000000000000000000..56436034e4c0882d90ea0df42ee60995d38c15a9 --- /dev/null +++ b/configure/test/test_rawdata.res @@ -0,0 +1,57 @@ +#进程名 +COMLOG_PROCNAME : test_others +COMLOG_LEVEL : 16 +#支持的设备数目 +COMLOG_DEVICE_NUM : 5 +#支持的自定义等级 +COMLOG_SELFDEFINE : xiaowei, hello +#支持的设备名 +COMLOG_DEVICE0 : FILE +COMLOG_DEVICE1 : AFILE +COMLOG_DEVICE2 : NET +COMLOG_DEVICE3 : ULLOG +COMLOG_DEVICE4 : ULNET + +#device 0: FILE +FILE_TYPE : FILE +FILE_NAME : test_others_file.log +FILE_PATH : ./log +FILE_SYSLEVEL : 16 +FILE_OPEN : 1 +FILE_SELFLEVEL : xiaowei, hello +FILE_SIZE : 2000 + +#device 1: AFILE +AFILE_TYPE : AFILE +AFILE_NAME : test_others_afile.log +AFILE_PATH : ./log +AFILE_SYSLEVEL : 16 +AFILE_OPEN : 1 +AFILE_SELFLEVEL : xiaowei, hello +AFILE_SIZE : 2000 + +#device 2: NET +NET_TYPE : NET +NET_NAME : test_others_net.log +NET_PATH : 127.0.0.1:9898/data +NET_OPEN : 1 +NET_SYSLEVEL : 16 +NET_SELFLEVEL : xiaowei, hello + +#device 3: ULLOG +ULLOG_TYPE : ULLOG +ULLOG_NAME : test_others_ullog.log +ULLOG_PATH : ./log +ULLOG_SYSLEVEL : 16 +ULLOG_OPEN : 1 +ULLOG_SELFLEVEL : xiaowei, hello +ULLOG_SIZE : 2000 + +#device 4: ULNET +ULNET_TYPE : ULNET +ULNET_NAME : test_others_ulnet.log +ULNET_PATH : 127.0.0.1:9898/log +ULNET_OPEN : 1 +ULNET_SYSLEVEL : 16 +ULNET_SELFLEVEL : xiaowei, hello + diff --git a/configure/test/test_reader.cpp b/configure/test/test_reader.cpp new file mode 100644 index 0000000000000000000000000000000000000000..d3c338b39d9b057e519230c289e6c7221f26bfb5 --- /dev/null +++ b/configure/test/test_reader.cpp @@ -0,0 +1,46 @@ +/*************************************************************************** + * + * Copyright (c) 2008 Baidu.com, Inc. All Rights Reserved + * $Id: test_reader.cpp,v 1.3 2009/02/13 15:25:31 yingxiang Exp $ + * + **************************************************************************/ + + + +/** + * @file test_reader.cpp + * @author yingxiang(com@baidu.com) + * @date 2008/12/21 20:14:22 + * @version $Revision: 1.3 $ + * @brief i + * + **/ + +#include "Configure.h" +#include "stdio.h" + +int main(){ + comcfg::Configure conf; + conf.load(".", "new.conf"); + return 0; +} + + + + + + + + + + + + + + + + + + + +/* vim: set ts=4 sw=4 sts=4 tw=100 */ diff --git a/configure/test/test_reader.res b/configure/test/test_reader.res new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/configure/test/test_rebuild.cpp b/configure/test/test_rebuild.cpp new file mode 100644 index 0000000000000000000000000000000000000000..069d6545883f9851d412c8092886361dfc461dea --- /dev/null +++ b/configure/test/test_rebuild.cpp @@ -0,0 +1,50 @@ +/*************************************************************************** + * + * Copyright (c) 2008 Baidu.com, Inc. All Rights Reserved + * $Id: test_rebuild.cpp,v 1.3 2009/02/13 15:25:31 yingxiang Exp $ + * + **************************************************************************/ + + + +/** + * @file test_rebuild.cpp + * @author yingxiang(com@baidu.com) + * @date 2008/12/29 21:29:18 + * @version $Revision: 1.3 $ + * @brief i + * + **/ + +#include "Configure.h" + +int main(){ + comcfg :: Configure conf; + conf.load(".", "rebuild.conf"); + printf("key: %d\n", conf["all"]["xxx"]["key"].to_int32()); + size_t sz; + char * s = conf.dump(&sz); + comcfg :: Configure cf2; + char * buf = cf2.getRebuildBuffer(sz); + memcpy(buf, s, sz); + cf2.rebuild(); + printf("key: %d\n", cf2["all"]["xxx"]["key"].to_int32()); + return 0; +} + + + + + + + + + + + + + + + + +/* vim: set ts=4 sw=4 sts=4 tw=100 */ diff --git a/configure/test/test_rebuild.res b/configure/test/test_rebuild.res new file mode 100644 index 0000000000000000000000000000000000000000..7818de3e4d7a88aba1a2566f792f2c17b2248be8 --- /dev/null +++ b/configure/test/test_rebuild.res @@ -0,0 +1,2 @@ +key: 10086 +key: 10086 diff --git a/configure/test/test_reloader.cpp b/configure/test/test_reloader.cpp new file mode 100644 index 0000000000000000000000000000000000000000..76d01b9bdf63bd28b193e3916a10eefe15d57722 --- /dev/null +++ b/configure/test/test_reloader.cpp @@ -0,0 +1,162 @@ +/*************************************************************************** + * + * Copyright (c) 2008 Baidu.com, Inc. All Rights Reserved + * $Id: test_reloader.cpp,v 1.2 2010/02/09 01:58:01 scmpf Exp $ + * + **************************************************************************/ + + + +/** + * @file test_conf.cpp + * @author yingxiang(com@baidu.com) + * @date 2008/12/24 18:47:10 + * @version $Revision: 1.2 $ + * @brief + * + **/ + +#include "ul_conf.h" +#include "Configure.h" +#include +#include +#include "stdio.h" +#include + +using namespace comcfg; + +static int g_run = 0; + +static void * change_threadfun(void *param) +{ + ConfigReloader * prd = (ConfigReloader *)param; + while (g_run) { + printf("g_run:%d, monitor: %d\n",g_run, prd->monitor()); + sleep(10); + } + return NULL; +} + +int int_key_change(const ConfigUnit &keyold, const ConfigUnit &keynew, void * ) { + printf("old:%d, new:%d\n", keyold.to_int32(), keynew.to_int32()); + if (g_run) { + if (++g_run >3) { + g_run = 0; + } + } + return 0; +} + +int int_string_change(const ConfigUnit &keyold, const ConfigUnit &keynew, void * ) { + printf("old:%s, new:%s\n", keyold.to_bsl_string().c_str(), keynew.to_bsl_string().c_str()); + if (g_run) { + if (++g_run >3) { + g_run = 0; + } + } + return 0; +} + +int uint64_key_change(const ConfigUnit &keyold, const ConfigUnit &keynew, void * ) { + printf("[%s]old:%llu, new:%llu\n",keynew.get_key_name().c_str(), keyold.to_uint64(), keynew.to_uint64()); + if (g_run) { + if (++g_run >3) { + g_run = 0; + } + } + return 0; +} + +int char_key_change(const ConfigUnit &keyold, const ConfigUnit &keynew, void * ) { + printf("[%s]old:%c, new:%c\n",keynew.get_key_name().c_str(), keyold.to_char(), keynew.to_char()); + if (g_run) { + if (++g_run >3) { + g_run = 0; + } + } + return 0; +} + +int float_key_change(const ConfigUnit &keyold, const ConfigUnit &keynew, void * ) { + printf("[%s]old:%f, new:%f\n",keynew.get_key_name().c_str(), keyold.to_double(), keynew.to_double()); + if (g_run) { + if (++g_run >3) { + g_run = 0; + } + } + return 0; +} + +int group_change(const ConfigUnit &, const ConfigUnit &keynew, void * ) { +// printf("[%s]\n",keynew.print()); + keynew.print(); + if (g_run) { + if (++g_run >3) { + g_run = 0; + } + } + return 0; +} + +int file_change(const ConfigUnit &, const ConfigUnit &keynew, void * ) { + printf("file[ivar]:\n"); + keynew["ivar"].print(); + if (g_run) { + if (++g_run >3) { + g_run = 0; + } + } + return 0; +} + +int main(){ + ConfigReloader rd; + if (0 != rd.init("./", "reload.conf","reload.range")) { + printf("init failed\n"); + return 1; + } + rd.add_key_char("ivar.b", char_key_change, NULL); + rd.add_key_char("ivar.b", int_key_change, NULL); + rd.add_key_char("ivar.b", char_key_change, NULL); + printf("add char:%c\n", rd.get_config()->deepGet("ivar.a").to_char()); + rd.add_key_int("ivar.a", char_key_change, NULL); + rd.add_key_int("ivar.a", int_key_change, NULL); + printf("add int:%d\n", rd.get_config()->deepGet("ivar.a").to_int32()); + rd.add_key_uint64("ivar.c", uint64_key_change, NULL); + printf("add int:%llu\n", rd.get_config()->deepGet("ivar.c").to_uint64()); + rd.add_key_float("ivar.d", float_key_change, NULL); + printf("add char:%c\n", rd.get_config()->deepGet("ivar.a").to_char()); + rd.add_key_string("ubclient.proto[4].method[5].name", int_string_change, NULL); + printf("add string:%s\n", rd.get_config()->deepGet("ubclient.proto[4].method[5].name").to_bsl_string().c_str()); + + rd.add_file_monitor(file_change, NULL); + rd.add_file_monitor(file_change, NULL); + printf("add file\n"); + + rd.add_group_monitor("ivar.g", group_change, NULL); + rd.add_group_monitor("ivar", group_change, NULL); + printf("\ngroup:\n");rd.get_config()->deepGet("ivar").print(); + g_run = 1; + pthread_t tid; + pthread_create(&tid, NULL, change_threadfun, &rd); + pthread_join(tid, NULL); + return 0; +} + + + + + + + + + + + + + + + + + +/* vim: set ts=4 sw=4 sts=4 tw=100 */ diff --git a/configure/test/test_sigreload.cpp b/configure/test/test_sigreload.cpp new file mode 100644 index 0000000000000000000000000000000000000000..cdd6e5b0ea3c5026374495d552bb00986fd208c8 --- /dev/null +++ b/configure/test/test_sigreload.cpp @@ -0,0 +1,165 @@ +/*************************************************************************** + * + * Copyright (c) 2010 Baidu.com, Inc. All Rights Reserved + * + **************************************************************************/ + + + +/** + * @file test_sigreload.cpp + * @author zhang_rui(com@baidu.com) + * @date 2010-1-28 + * @brief + * + **/ + + +#include "ul_conf.h" +#include "Configure.h" +#include +#include +#include +#include "stdio.h" +#include + +using namespace comcfg; + +static int g_run = 0; +static ConfigReloader rd; +static int selfpipe[2]; + + +static void * change_threadfun(void *param) +{ + ConfigReloader * prd = (ConfigReloader *)param; + while (g_run) { + char ch; + read(selfpipe[0],&ch,1); + printf("g_run:%d, monitor: %d\n",g_run, prd->monitor()); + } + return NULL; +} + +static void change_sig(int) +{ + write(selfpipe[1],"",1); +} + +int int_key_change(const ConfigUnit &keyold, const ConfigUnit &keynew, void * ) { + printf("old:%d, new:%d\n", keyold.to_int32(), keynew.to_int32()); + if (g_run) { + if (++g_run >3) { + g_run = 0; + } + } + return 0; +} + +int int_string_change(const ConfigUnit &keyold, const ConfigUnit &keynew, void * ) { + printf("old:%s, new:%s\n", keyold.to_bsl_string().c_str(), keynew.to_bsl_string().c_str()); + if (g_run) { + if (++g_run >3) { + g_run = 0; + } + } + return 0; +} + +int uint64_key_change(const ConfigUnit &keyold, const ConfigUnit &keynew, void * ) { + printf("[%s]old:%llu, new:%llu\n",keynew.get_key_name().c_str(), keyold.to_uint64(), keynew.to_uint64()); + if (g_run) { + if (++g_run >3) { + g_run = 0; + } + } + return 0; +} + +int char_key_change(const ConfigUnit &keyold, const ConfigUnit &keynew, void * ) { + printf("[%s]old:%c, new:%c\n",keynew.get_key_name().c_str(), keyold.to_char(), keynew.to_char()); + if (g_run) { + if (++g_run >3) { + g_run = 0; + } + } + return 0; +} + +int float_key_change(const ConfigUnit &keyold, const ConfigUnit &keynew, void * ) { + printf("[%s]old:%f, new:%f\n",keynew.get_key_name().c_str(), keyold.to_double(), keynew.to_double()); + if (g_run) { + if (++g_run >3) { + g_run = 0; + } + } + return 0; +} + +int group_change(const ConfigUnit &, const ConfigUnit &keynew, void * ) { +// printf("[%s]\n",keynew.print()); + keynew.print(); + if (g_run) { + if (++g_run >3) { + g_run = 0; + } + } + return 0; +} + +int file_change(const ConfigUnit &, const ConfigUnit &keynew, void * ) { + printf("file[ivar]:\n"); + keynew["ivar"].print(); + if (g_run) { + if (++g_run >3) { + g_run = 0; + } + } + return 0; +} + +int main(){ + + if (0 != rd.init("./", "reload.conf","reload.range")) { + printf("init failed\n"); + return 1; + } + rd.add_key_char("ivar.b", char_key_change, NULL); + printf("add char:%c\n", rd.get_config()->deepGet("ivar.a").to_char()); + rd.add_key_int("ivar.a", int_key_change, NULL); + printf("add int:%d\n", rd.get_config()->deepGet("ivar.a").to_int32()); + rd.add_key_uint64("ivar.c", uint64_key_change, NULL); + printf("add int:%llu\n", rd.get_config()->deepGet("ivar.c").to_uint64()); + rd.add_key_float("ivar.d", float_key_change, NULL); + printf("add char:%c\n", rd.get_config()->deepGet("ivar.a").to_char()); + rd.add_key_string("ubclient.proto[4].method[5].name", int_string_change, NULL); + printf("add string:%s\n", rd.get_config()->deepGet("ubclient.proto[4].method[5].name").to_bsl_string().c_str()); + + rd.add_file_monitor(file_change, NULL); + printf("add file\n"); + + rd.add_group_monitor("ivar", group_change, NULL); + printf("\ngroup:\n");rd.get_config()->deepGet("ivar").print(); + g_run = 1; + + if (pipe(selfpipe) == -1) { + printf("create pipe failed\n"); + return 1; + } + signal(SIGINT, change_sig); + sigset_t zm; + sigemptyset(&zm); + + pthread_t tid; + pthread_create(&tid, NULL, change_threadfun, &rd); + +// for (int i=0;i<3;++i) { +// sigsuspend(&zm); +// } + + pthread_join(tid, NULL); + return 0; +} + + +/* vim: set ts=4 sw=4 sts=4 tw=100 */ diff --git a/configure/test/test_str.cpp b/configure/test/test_str.cpp new file mode 100644 index 0000000000000000000000000000000000000000..5ed71c0bc81d7da07e0e15d2718601fbb7dbba86 --- /dev/null +++ b/configure/test/test_str.cpp @@ -0,0 +1,57 @@ +/*************************************************************************** + * + * Copyright (c) 2008 Baidu.com, Inc. All Rights Reserved + * $Id: test_str.cpp,v 1.5 2009/02/13 15:25:31 yingxiang Exp $ + * + **************************************************************************/ + + + +/** + * @file test_str.cpp + * @author yingxiang(com@baidu.com) + * @date 2008/12/30 00:57:26 + * @version $Revision: 1.5 $ + * @brief i + * + **/ + +#include "Configure.h" +#include + +int main(){ + comcfg :: Configure conf; + char buf[128]; + conf.load(".", "str.conf"); + + std::cout<<"str1 : to raw : "< +#include "bsl/var/implement.h" +int main(){ + comcfg::Configure conf, conf2; + conf.load(".", "r.conf", "r.cons"); + printf("=======conf1=========\n"); + conf.print(0); + bsl::var::Dict dict; + bsl::var::Int32 i32 = 1234; + dict["key"] = i32; + bsl :: ResourcePool rp; + conf2.loadIVar(dict);//conf.to_IVar(&rp) + printf("=======conf2=========\n"); + conf2.print(0); + return 0; +} + + + + + + + + + + + + + + + + + +/* vim: set ts=4 sw=4 sts=4 tw=100 */ diff --git a/configure/test/test_t1.res b/configure/test/test_t1.res new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/configure/test/test_to_default.cpp b/configure/test/test_to_default.cpp new file mode 100644 index 0000000000000000000000000000000000000000..78488e723174f372700baa2a43c9a85e762ea468 --- /dev/null +++ b/configure/test/test_to_default.cpp @@ -0,0 +1,97 @@ +/*************************************************************************** + * + * Copyright (c) 2009 Baidu.com, Inc. All Rights Reserved + * $Id: test_to_default.cpp,v 1.3 2009/11/10 04:50:30 scmpf Exp $ + * + **************************************************************************/ + + + +/** + * @file test_to_default.cpp + * @author yingxiang(com@baidu.com) + * @date 2009/03/12 01:30:32 + * @version $Revision: 1.3 $ + * @brief + * + **/ + +#include "Configure.h" + + +#define ASSERT(x) do{\ + if(!(x))printf("Assert failed %s:%d\n", __FILE__, __LINE__);\ + else printf("Assertion Successful. %s:%d\n", __FILE__, __LINE__);\ +}while(0) + +int main(){ + using namespace comcfg; + system("touch Nothing.conf"); + system("echo A : B > Nothing.conf"); + comcfg::Configure conf; + int ret = conf.load(".", "Nothing.conf"); + ASSERT(ret == 0); + + int err=99; + char v0 = conf["xxx"].to_char(&err, '0') ; + ASSERT( comcfg::NOSUCHKEY == err); + ASSERT( v0 == '0' ); + unsigned char v1 = conf["xxx"].to_uchar(&err, '1'); + ASSERT( comcfg::NOSUCHKEY == err ); + ASSERT( v1 == '1' ); + int16_t v2 =conf["xxx"].to_int16(&err, 2) ; + ASSERT( comcfg::NOSUCHKEY == err); + ASSERT( v2 == 2 ); + u_int16_t v3 =conf["xxx"].to_uint16(&err, 3); + ASSERT( comcfg::NOSUCHKEY == err); + ASSERT( v3 == 3 ); + int v4=conf["xxx"].to_int32(&err, 4); + ASSERT( comcfg::NOSUCHKEY == err); + ASSERT( v4 == 4 ); + u_int32_t v5 =conf["xxx"].to_uint32(&err, 5); + ASSERT( comcfg::NOSUCHKEY == err); + ASSERT( v5 == 5 ); + long long v6 =conf["xxx"].to_int64(&err, 6); + ASSERT( comcfg::NOSUCHKEY == err); + ASSERT( v6 == 6 ); + unsigned long long v7 =conf["xxx"].to_uint64(&err, 7); + ASSERT( comcfg::NOSUCHKEY == err); + ASSERT( v7 == 7 ); + float v8 =conf["xxx"].to_float(&err, 8); + ASSERT( comcfg::NOSUCHKEY == err); + ASSERT( v8 == 8 ); + double v9 =conf["xxx"].to_double(&err, 9); + ASSERT( comcfg::NOSUCHKEY == err); + ASSERT( v9 == 9 ); + bsl_string v10 =conf["xxx"].to_bsl_string(&err, "10"); + ASSERT( comcfg::NOSUCHKEY == err); + ASSERT( v10 == str_t("10") ); + str_t v11 =conf["xxx"].to_raw_string(&err, "11"); + ASSERT( comcfg::NOSUCHKEY == err); + ASSERT( v11 == str_t("11") ); + const char * s =conf["xxx"].to_cstr(&err, "12"); + ASSERT( comcfg::NOSUCHKEY == err); + ASSERT(strcmp(s, "12") == 0); + const char * s2 =conf["xxx"].to_cstr(&err); + ASSERT( comcfg::NOSUCHKEY == err); + + return 0; +} + + + + + + + + + + + + + + + + + +/* vim: set ts=4 sw=4 sts=4 tw=100 */ diff --git a/configure/test/test_trans_float.cpp b/configure/test/test_trans_float.cpp new file mode 100644 index 0000000000000000000000000000000000000000..3aacff69ccd57d2c0664982bee49270810f9e254 --- /dev/null +++ b/configure/test/test_trans_float.cpp @@ -0,0 +1,66 @@ +/*************************************************************************** + * + * Copyright (c) 2008 Baidu.com, Inc. All Rights Reserved + * $Id: test_trans_float.cpp,v 1.3 2009/01/20 14:27:12 yingxiang Exp $ + * + **************************************************************************/ + + + +/** + * @file test_trans_float.cpp + * @author yingxiang(com@baidu.com) + * @date 2008/12/24 16:17:34 + * @version $Revision: 1.3 $ + * @brief + * + **/ +#include "utils/cc_utils.h" +#include +#include + +void check(const char * s, bool is){ + bool tmp = comcfg::Trans::isFloat(comcfg::str_t(s)); + double k = 0.0; + if(tmp)sscanf(s, "%lf", &k); + printf("[%s] check [%s] %s a float[%g]\n", tmp==is?"OK":"Error", s, tmp?"IS":"ISNOT", k); +} + +int main(){ + check("3.1415926", 1); + check("3.1415926e100", 1); + check("3.1415926E-10", 1); + check("3.1415926e", 0); + check(".1415926", 1); + check("-.1415926", 1); + check("3.E", 0); + check("+-3.1", 0); + check("e103", 0); + check("3.1415926e1.1", 0); + check("3.1415926e-10", 1); + check("3.1415926E+0997", 1); + check("-.141e5926", 1); + check("3+.1415926", 0); + return 0; +} + + + + + + + + + + + + + + + + + + + + +/* vim: set ts=4 sw=4 sts=4 tw=100 */ diff --git a/configure/test/test_trans_float.res b/configure/test/test_trans_float.res new file mode 100644 index 0000000000000000000000000000000000000000..0327fb74077adade86eeec7bc74117b7f84b270c --- /dev/null +++ b/configure/test/test_trans_float.res @@ -0,0 +1,14 @@ +[OK] check [3.1415926] IS a float[3.14159] +[OK] check [3.1415926e100] IS a float[3.14159e+100] +[OK] check [3.1415926E-10] IS a float[3.14159e-10] +[OK] check [3.1415926e] ISNOT a float[0] +[OK] check [.1415926] IS a float[0.141593] +[OK] check [-.1415926] IS a float[-0.141593] +[OK] check [3.E] ISNOT a float[0] +[OK] check [+-3.1] ISNOT a float[0] +[OK] check [e103] ISNOT a float[0] +[OK] check [3.1415926e1.1] ISNOT a float[0] +[OK] check [3.1415926e-10] IS a float[3.14159e-10] +[OK] check [3.1415926E+0997] IS a float[inf] +[OK] check [-.141e5926] IS a float[-inf] +[OK] check [3+.1415926] ISNOT a float[0] diff --git a/configure/test/test_trans_str2str.cpp b/configure/test/test_trans_str2str.cpp new file mode 100644 index 0000000000000000000000000000000000000000..fc39013ee9217c5c1372930ede13a1050ffe608a --- /dev/null +++ b/configure/test/test_trans_str2str.cpp @@ -0,0 +1,52 @@ +/*************************************************************************** + * + * Copyright (c) 2008 Baidu.com, Inc. All Rights Reserved + * $Id: test_trans_str2str.cpp,v 1.3 2009/01/20 14:27:12 yingxiang Exp $ + * + **************************************************************************/ + + + +/** + * @file test_trans_str2str.cpp + * @author yingxiang(com@baidu.com) + * @date 2008/12/24 18:08:20 + * @version $Revision: 1.3 $ + * @brief + * + **/ +#include "utils/cc_trans.h" +#include +#include + +int main(){ + FILE * fp = fopen("str2str", "r"); + assert(fp); + char buf[1024]; + while(fgets(buf, 1024, fp) != NULL){ + buf[strlen(buf) - 1] = 0; + comcfg::str_t str; + if(comcfg::Trans::str2str(comcfg::str_t(buf), &str) == 0){ + puts("----- Read -----"); + puts(buf); + puts("----- trans to -----"); + puts(str.c_str()); + puts("------ Finish -----"); + } + else { + puts("Error"); + } + } + return 0; +} + + + + + + + + + + +/* vim: set ts=4 sw=4 sts=4 tw=100 */ diff --git a/configure/test/test_trans_str2str.res b/configure/test/test_trans_str2str.res new file mode 100644 index 0000000000000000000000000000000000000000..21bd8bfefc8629bc20e300af87c3479d0f855ed0 --- /dev/null +++ b/configure/test/test_trans_str2str.res @@ -0,0 +1,31 @@ +----- Read ----- +"test" +----- trans to ----- +test +------ Finish ----- +----- Read ----- +"Haha"ddd +----- trans to ----- +Haha +------ Finish ----- +----- Read ----- +"\tThis is \"Hawk\".\n"sadf +----- trans to ----- + This is "Hawk". + +------ Finish ----- +----- Read ----- +askdfj;aj jaskdfj;askf +----- trans to ----- +askdfj;aj jaskdfj;askf +------ Finish ----- +----- Read ----- +"\x41---" +----- trans to ----- +A--- +------ Finish ----- +----- Read ----- +"\101---" +----- trans to ----- +A--- +------ Finish ----- diff --git a/configure/test/test_value.conf b/configure/test/test_value.conf new file mode 100644 index 0000000000000000000000000000000000000000..4a8b7d0dd652a2a49ceaf2a3976aaba8a7447a76 --- /dev/null +++ b/configure/test/test_value.conf @@ -0,0 +1,4 @@ +test_int : 57 +test_float : -.01e-1 +test_str : "\"Hello world ~\"" + diff --git a/configure/test/test_vec_overflow/COMAKE b/configure/test/test_vec_overflow/COMAKE new file mode 100644 index 0000000000000000000000000000000000000000..d0de1b26d6c9a9451d849448b387a09bfbe7fbe4 --- /dev/null +++ b/configure/test/test_vec_overflow/COMAKE @@ -0,0 +1,60 @@ +#edit-mode: -*- python -*- +#coding:gbk + +#工作路径. +WORKROOT('../../../../') + +#使用硬链接copy. +CopyUsingHardLink(True) + +#支持32位/64位平台编译 +#ENABLE_MULTI_LIBS(True) + +#C预处理器参数. +CPPFLAGS('-D_GNU_SOURCE -D__STDC_LIMIT_MACROS -DVERSION=\\\"1.9.8.7\\\"') +#为32位目标编译指定额外的预处理参数 +#CPPFLAGS_32('-D_XOPEN_SOURE=500') + +#C编译参数. +CFLAGS('-g -pipe -W -Wall -fPIC') + +#C++编译参数. +CXXFLAGS('-g -pipe -W -Wall -fPIC') + +#IDL编译参数 +IDLFLAGS('--compack') + +#UBRPC编译参数 +UBRPCFLAGS('--compack') + +#头文件路径. +INCPATHS('. ../../ ./include ./output ./output/include') + +#使用库 +LIBS('../../libconfig.a') + +#链接参数. +LDFLAGS('-lpthread -lcrypto -lrt') + +#依赖模块 +CONFIGS('lib2-64/ullib') +CONFIGS('lib2-64/bsl') +CONFIGS('public/spreg') +CONFIGS('com/btest/gtest') + +#为32位/64位指定不同的依赖路径. +#CONFIGS_32('lib2/ullib') +#CONFIGS_64('lib2-64/ullib') + +user_sources='' +user_headers='' + +#可执行文件 +Application('test_vec',Sources('test_vec.cpp')) +#静态库 +#StaticLibrary('test_group',Sources(user_sources),HeaderFiles(user_headers)) +#共享库 +#SharedLibrary('test_group',Sources(user_sources),HeaderFiles(user_headers)) +#子目录 +#Directory('demo') + diff --git a/configure/test/test_vec_overflow/Makefile b/configure/test/test_vec_overflow/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..652cff2749ee9eaed76be6e01c836df20dc6f5ba --- /dev/null +++ b/configure/test/test_vec_overflow/Makefile @@ -0,0 +1,137 @@ +#COMAKE2 edit-mode: -*- Makefile -*- +####################64Bit Mode#################### +ifeq ($(shell uname -m),x86_64) +CC=gcc +CXX=g++ +CXXFLAGS=-g \ + -pipe \ + -W \ + -Wall \ + -fPIC +CFLAGS=-g \ + -pipe \ + -W \ + -Wall \ + -fPIC +CPPFLAGS=-D_GNU_SOURCE \ + -D__STDC_LIMIT_MACROS \ + -DVERSION=\"1.9.8.7\" +INCPATH=-I. \ + -I../../ \ + -I./include \ + -I./output \ + -I./output/include +DEP_INCPATH=-I../../../../com/btest/gtest \ + -I../../../../com/btest/gtest/include \ + -I../../../../com/btest/gtest/output \ + -I../../../../com/btest/gtest/output/include \ + -I../../../../lib2-64/bsl \ + -I../../../../lib2-64/bsl/include \ + -I../../../../lib2-64/bsl/output \ + -I../../../../lib2-64/bsl/output/include \ + -I../../../../lib2-64/ullib \ + -I../../../../lib2-64/ullib/include \ + -I../../../../lib2-64/ullib/output \ + -I../../../../lib2-64/ullib/output/include \ + -I../../../../public/spreg \ + -I../../../../public/spreg/include \ + -I../../../../public/spreg/output \ + -I../../../../public/spreg/output/include \ + -I../../../../quality/autotest/reportlib/cpp \ + -I../../../../quality/autotest/reportlib/cpp/include \ + -I../../../../quality/autotest/reportlib/cpp/output \ + -I../../../../quality/autotest/reportlib/cpp/output/include \ + -I../../../../third-64/pcre \ + -I../../../../third-64/pcre/include \ + -I../../../../third-64/pcre/output \ + -I../../../../third-64/pcre/output/include + +#============ CCP vars ============ +CCHECK=@ccheck.py +CCHECK_FLAGS= +PCLINT=@pclint +PCLINT_FLAGS= +CCP=@ccp.py +CCP_FLAGS= + + +#COMAKE UUID +COMAKE_MD5=ddd9a97bcbeb7916c2105aa8e4027ac1 COMAKE + + +.PHONY:all +all:comake2_makefile_check test_vec + @echo "[COMAKE:BUILD][Target:'all']" + @echo "make all done" + +.PHONY:comake2_makefile_check +comake2_makefile_check: + @echo "[COMAKE:BUILD][Target:'comake2_makefile_check']" + #in case of error, update 'Makefile' by 'comake2' + @echo "$(COMAKE_MD5)">comake2.md5 + @md5sum -c --status comake2.md5 + @rm -f comake2.md5 + +.PHONY:ccpclean +ccpclean: + @echo "[COMAKE:BUILD][Target:'ccpclean']" + @echo "make ccpclean done" + +.PHONY:clean +clean:ccpclean + @echo "[COMAKE:BUILD][Target:'clean']" + rm -rf test_vec + rm -rf ./output/bin/test_vec + rm -rf test_vec_test_vec.o + +.PHONY:dist +dist: + @echo "[COMAKE:BUILD][Target:'dist']" + tar czvf output.tar.gz output + @echo "make dist done" + +.PHONY:distclean +distclean:clean + @echo "[COMAKE:BUILD][Target:'distclean']" + rm -f output.tar.gz + @echo "make distclean done" + +.PHONY:love +love: + @echo "[COMAKE:BUILD][Target:'love']" + @echo "make love done" + +test_vec:test_vec_test_vec.o \ + ../../libconfig.a + @echo "[COMAKE:BUILD][Target:'test_vec']" + $(CXX) test_vec_test_vec.o -Xlinker "-(" ../../libconfig.a ../../../../com/btest/gtest/output/lib/libgtest.a \ + ../../../../com/btest/gtest/output/lib/libgtest_main.a \ + ../../../../lib2-64/bsl/lib/libbsl.a \ + ../../../../lib2-64/bsl/lib/libbsl_ResourcePool.a \ + ../../../../lib2-64/bsl/lib/libbsl_archive.a \ + ../../../../lib2-64/bsl/lib/libbsl_buffer.a \ + ../../../../lib2-64/bsl/lib/libbsl_check_cast.a \ + ../../../../lib2-64/bsl/lib/libbsl_exception.a \ + ../../../../lib2-64/bsl/lib/libbsl_pool.a \ + ../../../../lib2-64/bsl/lib/libbsl_utils.a \ + ../../../../lib2-64/bsl/lib/libbsl_var.a \ + ../../../../lib2-64/bsl/lib/libbsl_var_implement.a \ + ../../../../lib2-64/bsl/lib/libbsl_var_utils.a \ + ../../../../lib2-64/ullib/lib/libullib.a \ + ../../../../public/spreg/libspreg.a \ + ../../../../quality/autotest/reportlib/cpp/libautotest.a \ + ../../../../third-64/pcre/lib/libpcre.a \ + ../../../../third-64/pcre/lib/libpcrecpp.a \ + ../../../../third-64/pcre/lib/libpcreposix.a -lpthread \ + -lcrypto \ + -lrt -Xlinker "-)" -o test_vec + mkdir -p ./output/bin + cp -f --link test_vec ./output/bin + +test_vec_test_vec.o:test_vec.cpp + @echo "[COMAKE:BUILD][Target:'test_vec_test_vec.o']" + $(CXX) -c $(INCPATH) $(DEP_INCPATH) $(CPPFLAGS) $(CXXFLAGS) -o test_vec_test_vec.o test_vec.cpp + +endif #ifeq ($(shell uname -m),x86_64) + + diff --git a/configure/test/test_vec_overflow/test_vec.cpp b/configure/test/test_vec_overflow/test_vec.cpp new file mode 100644 index 0000000000000000000000000000000000000000..eea245383d5307e1fc8247d4936290c0c7fdf13d --- /dev/null +++ b/configure/test/test_vec_overflow/test_vec.cpp @@ -0,0 +1,45 @@ +#include +#include +#include +#include "plugin/plgcomlog.h" + +int main(int argc, char **argv) +{ + testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} +/** + * @brief check if the lib reports the vector overflow situation +**/ +class test_vof_suite : public ::testing::Test{ + protected: + test_vof_suite(){}; + virtual ~test_vof_suite(){}; + virtual void SetUp() { + //Called befor every TEST_F(test_vof_suite, *) + }; + virtual void TearDown() { + //Called after every TEST_F(test_vof_suite, *) + }; +}; + + +/** + * @brief check the log to see the info, and the ret is always 0 + * @begin_version + **/ +TEST_F(test_vof_suite, case_vof) +{ + //TODO + //comcfg::Log::openLowLevel(); + const char *res_file = "vec.res"; + freopen(res_file, "w+", stderr); + comcfg::Configure conf; + int ret = conf.load("./", "vec.conf", "vec.range"); + ASSERT_NE(-1, ret); + + fflush(stderr); + fclose(stderr); + ASSERT_COMLOG_INCLUDE(res_file, "array has too many elements!"); + remove(res_file); +} diff --git a/configure/test/test_vec_overflow/vec.conf b/configure/test/test_vec_overflow/vec.conf new file mode 100644 index 0000000000000000000000000000000000000000..5bf32d0a0e41fcc9e45408c8b195f91d07b97214 --- /dev/null +++ b/configure/test/test_vec_overflow/vec.conf @@ -0,0 +1,5 @@ +[@v1] +[@v2] +[@v1] +[@v2] +[@v1] diff --git a/configure/test/test_vec_overflow/vec.range b/configure/test/test_vec_overflow/vec.range new file mode 100644 index 0000000000000000000000000000000000000000..e50ad3ea9316bb3aae706bb25f307b34ae3211ac --- /dev/null +++ b/configure/test/test_vec_overflow/vec.range @@ -0,0 +1,9 @@ +struct myvec1{ +}; + +struct myvec2{ +}; + +myvec1 v1[2]; + +myvec2 v2[2]; diff --git a/configure/test/test_xiaowei.cpp b/configure/test/test_xiaowei.cpp new file mode 100644 index 0000000000000000000000000000000000000000..5ff3bee6c2f963d8dcc841c2347110c833984569 --- /dev/null +++ b/configure/test/test_xiaowei.cpp @@ -0,0 +1,58 @@ +/*************************************************************************** + * + * Copyright (c) 2009 Baidu.com, Inc. All Rights Reserved + * $Id: test_xiaowei.cpp,v 1.4 2009/02/13 15:25:31 yingxiang Exp $ + * + **************************************************************************/ + + + +/** + * @file test_xiaowei.cpp + * @author yingxiang(com@baidu.com) + * @date 2009/01/05 11:43:08 + * @version $Revision: 1.4 $ + * @brief i + * + **/ +#include "Configure.h" +#include +int main(){ + //comcfg :: Log :: closeLowLevel(); + comcfg :: Configure conf; + conf.load(".", "xiaowei.conf", NULL); + conf.print(); + std::cout<<"conf size = "< + +using namespace comcfg; +ENV_CHAR_DECL(MAC, 0); +ENV_UCHAR_DECL(MAC, 0); +ENV_INT16_DECL(MAC, 0); +ENV_UINT16_DECL(MAC, 0); +ENV_INT32_DECL(MAC, 0); +ENV_UINT32_DECL(MAC, 0); +ENV_INT64_DECL(MAC, 0); +ENV_UINT64_DECL(MAC, 0); +ENV_FLOAT_DECL(MAC, 0); +ENV_DOUBLE_DECL(MAC, 0); +ENV_BSLSTR_DECL(MAC, 0); + +int main(){ + comcfg::Configure conf; + // test Configure::getErrKeyPath() + conf.load("./", "new.conf"); + comcfg::str_t str; + if(conf["COMLOG"]["FILE"]["TYPE"].get_bsl_string(&str) == 0){ + printf("read = [%s]\n", str.c_str()); + }else{ + printf("No such key: %s\n", conf.getErrKeyPath()); + } + if(conf["COMLOG"]["FILEx"]["TYPE"][2].get_bsl_string(&str) == 0){ + printf("read = [%s]\n", str.c_str()); + }else{ + printf("No such key: %s\n", conf.getErrKeyPath()); + } + try{ + str = conf["COMLOG"]["FILE"]["TYPE"].to_bsl_string(); + printf("to bsl string: %s\n", str.c_str()); + } + catch(bsl::Exception e){ + printf("%s\n", e.what()); + printf("No such key: %s\n", conf.getErrKeyPath()); + } + try{ + conf["COMLOG"]["FILE"]["abc"].to_char(); + } + catch(bsl::Exception e){ + printf("%s\n", e.what()); + printf("No such key: %s\n", conf.getErrKeyPath()); + } + int err; + int tmp; + try { + tmp = conf["COMLOG"]["FILE"]["SIZE"].to_int32(); + printf("read = [%d]\n", tmp);} + catch (bsl::Exception e) { + printf("%s\n", e.what()); + } + + //test ConfigUnit::deepGet() + if(conf.deepGet("COMLOG.FILE.TYPE").get_bsl_string(&str) == 0){ + printf("deepGet(\"COMLOG.FILE.TYPE\") = [%s]\n", str.c_str()); + }else{ + printf("No such key: %s\n", conf.getErrKeyPath()); + } + if(conf.deepGet("COMLOG.DEVICE[2]").get_bsl_string(&str) == 0){ + printf("deepGet(\"COMLOG.DEVICE[2]\") = [%s]\n", str.c_str()); + }else{ + printf("No such key: %s\n", conf.getErrKeyPath()); + } + + printf("dump:%s\n%s\n\n", conf.dump(NULL)); + + comcfg::Configure nc; + bsl::ResourcePool rp; + nc.loadIVar(conf.to_IVar(&rp,&err)); + printf("new dump:%s\n%s\n\n", nc.dump(NULL)); + + //test enviroment macro + printf("ENV_CHAR: MAC= %c\n", g_char_MAC); + printf("ENV_UCHAR: MAC= %c\n", g_uchar_MAC); + printf("ENV_INT16: MAC= %d\n", g_int16_MAC); + printf("ENV_UINT16: MAC= %d\n", g_uint16_MAC); + printf("ENV_INT32: MAC= %d\n", g_int32_MAC); + printf("ENV_UINT32: MAC= %d\n", g_uint32_MAC); + printf("ENV_INT64: MAC= %lld\n", g_int64_MAC); + printf("ENV_UINT64: MAC= %lld\n", g_uint64_MAC); + printf("ENV_FLOAT: MAC= %f\n", g_float_MAC); + printf("ENV_DOUBLE: MAC= %f\n", g_double_MAC); + printf("ENV_BSLSTR: MAC= %s\n", g_bslstr_MAC.c_str()); + + bsl::string a; + printf("%s\n", a.c_str()); + if (a == "") printf("NULL STR\n"); + + + comcfg::Configure conf1; + conf1.load("./","zr.conf"); + const char * tstr; + try { + tstr = conf1["server"][1]["ip"].to_cstr(); + } + catch (bsl::Exception e){ + printf("%s\n", e.what()); + } + printf("to server[1].ip: %s\n", tstr); + printf("to server[1].ip: %s\n", conf1["server"][1]["ip"].to_bsl_string().c_str()); + printf("to person.name: %s\n", conf1["person"]["name"].to_bsl_string().c_str()); + printf("to person.age: %s\n", conf1["person"]["age"].to_bsl_string().c_str()); + printf("to int person.age: %d\n", conf1["person"]["age"].to_int32()); + + + + return 0; +} + + + + + + + + + + + + + + + + + +/* vim: set ts=4 sw=4 sts=4 tw=100 */ diff --git a/configure/test/xiaowei.conf b/configure/test/xiaowei.conf new file mode 100644 index 0000000000000000000000000000000000000000..394c58f386232c101342f5f316f5e8473cfbb1b6 --- /dev/null +++ b/configure/test/xiaowei.conf @@ -0,0 +1,14 @@ +[@server] +ip : 127.0.0.1 +port : 5123 +[@server] +ip : 127.0.0.2 +port : 1123 +[@server] +ip : 138.3.1.2 +port : 1234 + +[person] +name : xiaowei +age : 1 + diff --git a/configure/utils/cc_exception.h b/configure/utils/cc_exception.h new file mode 100644 index 0000000000000000000000000000000000000000..55f25d0dd1efe6f507b891be4c099e81aad554c1 --- /dev/null +++ b/configure/utils/cc_exception.h @@ -0,0 +1,121 @@ +/*************************************************************************** + * + * Copyright (c) 2008 Baidu.com, Inc. All Rights Reserved + * $Id: cc_exception.h,v 1.12 2010/04/13 09:59:41 scmpf Exp $ + * + **************************************************************************/ + + + +/** + * @file exception.h + * @author yingxiang(com@baidu.com) + * @date 2008/12/10 17:49:16 + * @version $Revision: 1.12 $ + * @brief + * + **/ + + +#ifndef __CC_EXCEPTION_H_ +#define __CC_EXCEPTION_H_ + +#include "cc_struct.h" +#include "bsl/exception/bsl_exception.h" +#include "ul_error.h" + + +namespace comcfg{ + enum { + OK = 0, + ERROR,// other error + CONSTRAINT_ERROR, + CONFIG_ERROR, + UNKNOWN, + NOSUCHKEY, + FORMATERROR, + OUTOFRANGE,//超过范围 + NULLVALUE, //空值(get_string时不会返回此错误) + NULLBUFFER, //传入的buf为空 + GROUPTOUNIT, //访问group的to_xxx或get_xxx方法 + DUPLICATED_KEY, /**< 修改configure时,造成重复key */ + DUPLICATED_GROUP, + }; + /* + * @brief configure抛出的所有异常都是ConfigException的子类 + */ + class ConfigException : public bsl::BasicException{ + public: + ConfigException(){}; + ConfigException(const char * s){ + msg = s; + } + ConfigException(const str_t& s){ + msg = s; + } + virtual ~ConfigException() throw(){}; + const char *seeError() throw() { + return msg.c_str(); + } + void pushMsg(const str_t & s) throw(){ + msg.append(str_t(" | ")).append(s); + } + protected: + str_t msg; + }; + class NoSuchKeyException : public bsl::BasicException{}; + class FormatErrorException : public bsl::BasicException{}; + class UnknownException : public bsl::BasicException{}; + class OutOfRangeException : public bsl::BasicException{}; + class NullValueException : public bsl::BasicException{}; + class NullBufferException : public bsl::BasicException{}; + class GroupToUnitException : public bsl::BasicException{}; +#if 0 + class DebugException : protected ConfigException {}; + class TraceException : protected DebugException {}; + class NoticeException : protected TraceException {}; + class WarningException : protected NoticeException {}; + class FatalException : protected WarningException {}; +#endif + class ConfigThrower { + public: + static void throwException(const ErrCode & err){ + switch(err){ + case OK: + break; + case NOSUCHKEY: + throw NoSuchKeyException().pushf("ConfigException.NoSuchKey: %s", ul_geterrbuf()); + break; + case OUTOFRANGE: + throw OutOfRangeException().pushf("ConfigException.OutOfRange: %s", ul_geterrbuf()); + break; + case FORMATERROR: + throw FormatErrorException().pushf("ConfigException.FormatError: %s", ul_geterrbuf()); + break; + case NULLVALUE: + throw NullValueException().pushf("ConfigException.NullValue: %s", ul_geterrbuf()); + break; + case NULLBUFFER: + throw NullBufferException().pushf("ConfigException.NullBuffer: %s", ul_geterrbuf()); + break; + case GROUPTOUNIT: + throw GroupToUnitException().pushf("ConfigException.GroupToUnit: %s", ul_geterrbuf()); + break; + case UNKNOWN: + default: + throw UnknownException().push("ConfigException.Unknown"); + } + } + }; + +} + + + + + + + +#endif //__CC_EXCEPTION_H_ + +/* vim: set ts=4 sw=4 sts=4 tw=100 */ diff --git a/configure/utils/cc_log.h b/configure/utils/cc_log.h new file mode 100644 index 0000000000000000000000000000000000000000..fe2a1ba017705373f677fdd19ab4bc2fa1aa0f4d --- /dev/null +++ b/configure/utils/cc_log.h @@ -0,0 +1,94 @@ +/*************************************************************************** + * + * Copyright (c) 2008 Baidu.com, Inc. All Rights Reserved + * $Id: cc_log.h,v 1.5 2009/03/23 03:14:53 yingxiang Exp $ + * + **************************************************************************/ + + + +/** + * @file cc_log.h + * @author yingxiang(com@baidu.com) + * @date 2008/12/21 15:57:50 + * @version $Revision: 1.5 $ + * @brief + * + **/ + + +#ifndef __CC_LOG_H_ +#define __CC_LOG_H_ + +#include "ul_log.h" + +namespace comcfg{ + class Log{ + static int _fatal, + _warning, + _notice, + _trace, + _debug; + public: + + static void setFatal(int level){ + _fatal = level; + } + + static void setWarning(int level){ + _warning = level; + } + + static void setNotice(int level){ + _notice = level; + } + + static void setTrace(int level){ + _trace = level; + } + + static void setDebug(int level){ + _debug = level; + } + + /** + * @brief 打开低等级的日志 + * + * @return void + * @retval + * @see + * @author yingxiang + * @date 2009/03/19 22:23:50 + **/ + static void openLowLevel(){ + _debug = UL_LOG_DEBUG; + _trace = UL_LOG_TRACE; + _notice = UL_LOG_NOTICE; + } + + static int fatal(){ return _fatal; } + static int warning(){ return _warning; } + static int notice(){ return _notice; } + static int trace(){ return _trace; } + static int debug(){ return _debug; } + }; +} + + + + + + + + + + + + + + + + +#endif //__CC_LOG_H_ + + /* vim: set ts=4 sw=4 sts=4 tw=100 */ diff --git a/configure/utils/cc_struct.h b/configure/utils/cc_struct.h new file mode 100644 index 0000000000000000000000000000000000000000..a7dd07c353478a15719c2d3b27507f80f62bc1e5 --- /dev/null +++ b/configure/utils/cc_struct.h @@ -0,0 +1,63 @@ +/*************************************************************************** + * + * Copyright (c) 2008 Baidu.com, Inc. All Rights Reserved + * $Id: cc_struct.h,v 1.6 2009/11/10 04:50:30 scmpf Exp $ + * + **************************************************************************/ + + + +/** + * @file cc_struct.h + * @author yingxiang(com@baidu.com) + * @date 2008/11/26 20:57:17 + * @version $Revision: 1.6 $ + * @brief + * + **/ + + +#ifndef __CC_STRUCT_H_ +#define __CC_STRUCT_H_ + +#include + +#include +#include +#include +#include "bsl/containers/string/bsl_string.h" + +namespace comcfg{ + + + + typedef unsigned char comcfg_type_uchar; /**< uchar */ + typedef signed short comcfg_type_int16; /**< int16 */ + typedef unsigned short comcfg_type_uint16; /**< uint16 */ + typedef signed int comcfg_type_int32; /**< int32 */ + typedef unsigned int comcfg_type_uint32; /**< uint32 */ + typedef signed long long comcfg_type_int64; /**< int64 */ + typedef unsigned long long comcfg_type_uint64; /**< uing64 */ + typedef std::string std_string; /**< std::string */ + typedef bsl::string bsl_string; /**< bsl::string */ +#define CC_CHAR "char" /**< char,出现在约束文件中的类型,下同 */ +#define CC_UCHAR "uchar" /**< uchar */ +#define CC_INT16 "int16_t" /**< int16 */ +#define CC_UINT16 "uint16_t" /**< uint16 */ +#define CC_INT32 "int32_t" /**< int32 */ +#define CC_UINT32 "uint32_t" /**< uint32 */ +#define CC_INT64 "int64_t" /**< int64 */ +#define CC_UINT64 "uint64_t" /**< uing64 */ +#define CC_FLOAT "float" /**< float */ +#define CC_DOUBLE "double" /**< double */ +#define CC_STRING "string" /**< 实际上是bsl::string */ + typedef bsl::string str_t; /**< 标准的内部string类型 */ + typedef int ErrCode; /**< 错误号 */ + +} + + + +#endif //__CC_STRUCT_H_ + +/* vim: set ts=4 sw=4 sts=4 tw=100 */ diff --git a/configure/utils/cc_trans.h b/configure/utils/cc_trans.h new file mode 100644 index 0000000000000000000000000000000000000000..c30c290858918e8aa927657a806eaf14559438aa --- /dev/null +++ b/configure/utils/cc_trans.h @@ -0,0 +1,139 @@ +/*************************************************************************** + * + * Copyright (c) 2008 Baidu.com, Inc. All Rights Reserved + * $Id: cc_trans.h,v 1.5 2009/11/10 04:50:30 scmpf Exp $ + * + **************************************************************************/ + + + +/** + * @file cc_trans.h + * @author yingxiang(com@baidu.com) + * @date 2008/12/10 17:48:14 + * @version $Revision: 1.5 $ + * @brief + * + **/ + + +#ifndef __CC_TRANS_H_ +#define __CC_TRANS_H_ + +#include "cc_struct.h" + +namespace comcfg{ + class Trans{ + public: +#if 0 + static const unsigned long long max_uint64 = 0xFFFFFFFFFFFFFFFF; + static const unsigned long long min_uint64 = 0x0; + static const unsigned long long max_int64 = 0x7FFFFFFFFFFFFFFF; + static const unsigned long long min_int64 = 0x8000000000000000; + static const unsigned long long max_uint32 = 0xFFFFFFFF; + static const unsigned long long min_uint32 = 0x0; + static const unsigned long long max_int32 = 0x7FFFFFFF; + static const unsigned long long min_int32 = 0x80000000; + static const unsigned long long max_uint16 = 0xFFFF; + static const unsigned long long min_uint16 = 0x0; + static const unsigned long long max_int16 = 0x7FFF; + static const unsigned long long min_int16 = 0x8000; +#endif + public: + /** + * @brief 判断一个字符串是否是整数格式 + * + * @param [in] str : const str_t& + * @return bool + * @retval + * @see + * @author yingxiang + * @date 2009/03/19 22:36:03 + **/ + static bool isInteger(const str_t & str); + /** + * @brief 判断一个字符串是否是浮点数格式(不检查精度范围) + * + * @param [in] str : const str_t& + * @return bool + * @retval + * @see + * @author yingxiang + * @date 2009/03/19 22:36:52 + **/ + static bool isFloat(const str_t & str); + /** + * @brief 把一个字符串转换成一个int64 + * + * @param [in] __str : const str_t& bsl::string类型的字符串 + * @param [out] buf : int64* 转换结果 + * @return int 0成功,失败:OUTOFRANGE, NULLVALUE, FORMATERROR + * @retval + * @see + * @author yingxiang + * @date 2009/03/19 22:37:22 + **/ + static int str2int64(const str_t & __str, long long * buf); + /** + * @brief 把一个字符串转换成一个uint64 + * + * @param [in] __str : const str_t& bsl::string类型的字符串 + * @param [out] buf : uint64* 转换结果 + * @return int 0成功,失败:OUTOFRANGE, NULLVALUE, FORMATERROR + * @retval + * @see + * @author yingxiang + * @date 2009/03/19 22:40:42 + **/ + static int str2uint64(const str_t & __str, unsigned long long * buf); + /** + * @brief 把一个带有转义字符的字符串进行解析(把\xFF, \022, \n之类的文本转换成实际的字符) + * 这个串必须是双引号开头、双引号结尾。 + * + * 【configure内部使用,如不熟悉内部行为,不推荐使用】 + * + * @param [in] __str : const str_t& bsl::string类型的字符串 + * @param [out] buf : uint64* 转换结果 + * @return int 0成功,失败:FORMATERROR + * @retval + * @see + * @author yingxiang + * @date 2009/03/19 22:40:42 + **/ + static int str2str(const str_t & str, str_t * buf); + /** + * @brief 把一个字符串转换成一个double + * + * @param [in] __str : const str_t& bsl::string类型的字符串 + * @param [out] buf : double* 转换结果 + * @return int 0成功,失败:OUTOFRANGE, NULLVALUE, FORMATERROR + * @retval + * @see + * @author yingxiang + * @date 2009/03/19 22:45:33 + **/ + static int str2double(const str_t & str, double * buf); + + //仅限configure使用 + static str_t cutComment(const str_t & str); + }; +} + + + + + + + + + + + + + + + + +#endif //__CC_TRANS_H_ + +/* vim: set ts=4 sw=4 sts=4 tw=100 */ diff --git a/configure/utils/cc_utils.h b/configure/utils/cc_utils.h new file mode 100644 index 0000000000000000000000000000000000000000..accc8aaddfe24baffec4588bf63d755b23d8bc65 --- /dev/null +++ b/configure/utils/cc_utils.h @@ -0,0 +1,47 @@ +/*************************************************************************** + * + * Copyright (c) 2008 Baidu.com, Inc. All Rights Reserved + * $Id: cc_utils.h,v 1.2 2009/08/13 07:23:01 scmpf Exp $ + * + **************************************************************************/ + + + +/** + * @file cc_utils.h + * @author yingxiang(com@baidu.com) + * @date 2008/12/21 17:55:49 + * @version $Revision: 1.2 $ + * @brief + * + **/ + + +#ifndef __CC_UTILS_H_ +#define __CC_UTILS_H_ + +//#include "cc_error.h" +#include "cc_exception.h" +// #include "cc_log.h" +#include "butil/logging.h" +#include "cc_struct.h" +#include "cc_trans.h" +#include "ul_error.h" + + + + + + + + + + + + + + + +#endif //__CC_UTILS_H_ + +/* vim: set ts=4 sw=4 sts=4 tw=100 */ diff --git a/configure/utils/init.cpp b/configure/utils/init.cpp new file mode 100644 index 0000000000000000000000000000000000000000..67ba51d1910bc8666c790b236f4a59f41aa75db3 --- /dev/null +++ b/configure/utils/init.cpp @@ -0,0 +1,49 @@ +/*************************************************************************** + * + * Copyright (c) 2008 Baidu.com, Inc. All Rights Reserved + * $Id: init.cpp,v 1.3 2009/02/13 15:25:31 yingxiang Exp $ + * + **************************************************************************/ + + + +/** + * @file init.cpp + * @author yingxiang(com@baidu.com) + * @date 2008/12/21 16:04:17 + * @version $Revision: 1.3 $ + * @brief + * + **/ + +#include "cc_log.h" +#include "ul_log.h" + +namespace comcfg{ + const int NO_LOG = 0x7fff; + int Log::_fatal = UL_LOG_FATAL; + int Log::_warning = UL_LOG_WARNING; + int Log::_notice = NO_LOG; + int Log::_trace = NO_LOG; + int Log::_debug = NO_LOG; +} + + + + + + + + + + + + + + + + + + + +/* vim: set ts=4 sw=4 sts=4 tw=100 */ diff --git a/configure/utils/trans.cpp b/configure/utils/trans.cpp new file mode 100644 index 0000000000000000000000000000000000000000..1e28affb7f9716dd0505d9e1c45fa0a1f31b17b3 --- /dev/null +++ b/configure/utils/trans.cpp @@ -0,0 +1,353 @@ +/*************************************************************************** + * + * Copyright (c) 2008 Baidu.com, Inc. All Rights Reserved + * $Id: trans.cpp,v 1.8 2009/11/10 04:50:30 scmpf Exp $ + * + **************************************************************************/ + + + +/** + * @file trans.cpp + * @author yingxiang(com@baidu.com) + * @date 2008/12/24 15:17:20 + * @version $Revision: 1.8 $ + * @brief + * + **/ +#include "cc_utils.h" + +namespace comcfg{ + + bool Trans :: isInteger(const str_t & str){ + for(int i = 0; i < (int)str.size(); ++i){ + if(isdigit(str[i]) || (str[i] == '-' && i == 0) || + (str[i] == '+' && i == 0)){ + continue; + } + else{ + return false; + } + } + return true; + } + + //Float状态机,检查某个字符串是否为float + //float的组成如下,第二行为状态号: + // [+-][digit][.][digit][Ee][+-][digit] '\0' -> true false + // 0 1 2 3 4 5 6 7 -1 -2 + enum{digit = 0, sig=1, dot=2, E=3, end=4}; + static int g_float_table[8][5] = { + //digit sig dot E end + {2, 1, 3, -2, -2}, // 0 + {2, -2, 3, -2, -2},// 1 + {2, -2, 3, 5, -1},//2 + {4, -2, -2, -2, -2},//3 + {4, -2, -2, 5, -1}, //4 + {7, 6, -2, -2, -2},//5 + {7, -2, -2, -2, -2},//6 + {7, -2, -2, -2, -1} //7 + }; + //举例:以g_float_table[2]为例: + //当前处于状态2 (digit),如果读到数字,仍然处于状态2.如果读到正负号,出错(-2) + //如果读到点,变为状态3,如果读到字母E,变为状态5,如果读到结尾,此时已经满足isFloat为true(-1) + bool floatAutoMachine(int status, const str_t & str, int nextpos){ + if(status == -1){ + return true; + }else if(status == -2){ + return false; + } + char nextchar = (int)str.size() > nextpos ? str[nextpos] : '\0'; + int next; + if(isdigit(nextchar)){ + next = digit; + }else if(nextchar == '+' || nextchar == '-'){ + next = sig; + }else if(nextchar == '.'){ + next = dot; + }else if(nextchar == 'E' || nextchar == 'e'){ + next = E; + }else if(nextchar == '\0'){ + next = end; + }else{ + return false; + } + return floatAutoMachine(g_float_table[status][next], str, nextpos+1); + } + + bool Trans :: isFloat(const str_t & str){ + return floatAutoMachine(0, str, 0); + } + + static str_t getFirstPart(const str_t & str){ + for(int i = 0; i < (int)str.size(); ++i){ + if(isspace(str[i]) || str[i] == '#'){ + return str.substr(0, i); + } + } + return str; + } + +#if 0 + int Trans :: str2double(const str_t & __str, double * buf){ + if(! __str.size()){ + ul_writelog(Log::notice(), "Config : Null value"); + return NULLVALUE; + } + str_t str = getFirstPart(__str); + if(isFloat(str)){ + if( sscanf(str.c_str(), "%lf", buf) == 1 ){ + ul_writelog(Log::trace(), "Read value [%s] as double/float = [%g]", __str.c_str(), *buf); + return 0; + } + } + ul_writelog(Log::notice(), "Config : Format error"); + return FORMATERROR; + } +#endif + int Trans :: str2double(const str_t & __str, double * buf){ + if(! __str.size()){ + LOG(INFO) << "Config : Null value"; + return NULLVALUE; + } + str_t str = getFirstPart(__str); + char *endptr = NULL; + errno = 0; + *buf = strtod(str.c_str(), &endptr); + if(errno == ERANGE){ + LOG(INFO) << "Config : str2double : out of range"; + return OUTOFRANGE; + } + if(*endptr != '\0'){ + LOG(INFO) << "Config : str2double : Format error char=[" << *endptr << "]"; + return FORMATERROR; + } + return 0; + } +#if 0 + static const str_t max_uint = "18446744073709551615"; + static bool uint64_range(str_t str){ + int i; + for(i = 0; i < (int)str.size(); ++i){ + if(str[i] != '0'){ + break; + } + } + if(i){ + str = str.substr(i); + } + if(str.size() > max_uint.size() || + (str.size() == max_uint.size() && max_uint < str)){ + return false; + } + return true; + } +#endif + int Trans :: str2uint64(const str_t & __str, unsigned long long * buf){ + if(! __str.size()){ + LOG(INFO) << "Config : Null value"; + return NULLVALUE; + } + str_t str = getFirstPart(__str); + char *endptr = NULL; + if(str[0] == '-'){ + //strtoull有一个问题,会将-1转化成0xFFFFFFFF + return FORMATERROR; + } + errno = 0; + *buf = strtoull(str.c_str(), &endptr, 0); + if(errno == ERANGE){ + LOG(INFO) << "Config : str2uint64 : Out of range"; + return OUTOFRANGE; + } + if(*endptr != '\0'){ + LOG(INFO) << "Config : str2uint64 : Format error char=[" << *endptr << "]"; + return FORMATERROR; + } + return 0; + } + + int Trans :: str2int64(const str_t & __str, long long * buf){ + if(! __str.size()){ + LOG(INFO) << "Config : Null value"; + return NULLVALUE; + } + str_t str = getFirstPart(__str); + char *endptr = NULL; + errno = 0; + *buf = strtoll(str.c_str(), &endptr, 0); + if(errno == ERANGE){ + LOG(INFO) << "Config : str2int64 : Out of range"; + return OUTOFRANGE; + } + if(*endptr != '\0'){ + LOG(INFO) << "Config : str2int64 : " << __str.c_str() << " Format error char=[" << *endptr << "]"; + return FORMATERROR; + } + return 0; + } +#if 0 + //废弃接口 + int Trans :: str2int(const str_t & __str, Trans :: Integer * buf){ + if(! __str.size()){ + ul_writelog(Log::notice(), "Config : Null value"); + return NULLVALUE; + } + str_t str = getFirstPart(__str); + if(isInteger(str)){ + if(str[0] == '-'){ + if(! uint64_range(str.substr(1))){ + ul_writelog(Log::notice(), "Config : Out of range"); + return OUTOFRANGE; + } + buf->negative = true; + if( sscanf(str.c_str(), "%llu", &buf->val) == 1){ + ul_writelog(Log::debug(), "Read value [%s] as Integer = [-%llu]", __str.c_str(), buf->val); + return 0; + } + } + else{ + if(! uint64_range(str)){ + ul_writelog(Log::notice(), "Config : Out of range"); + return OUTOFRANGE; + } + buf->negative = false; + if( sscanf(str.c_str(), "%llu", &buf->val) == 1){ + ul_writelog(Log::debug(), "Read value [%s] as Integer = [%llu]", __str.c_str(), buf->val); + return 0; + } + } + } + ul_writelog(Log::notice(), "Config : Format error"); + return FORMATERROR; + } +#endif + /** + * \0 空字符(NULL) 00H/0 + * \n 换行符(LF) 0AH/10 + * \r 回车符(CR) 0DH/13 + * \t 水平制表符(HT) 09H/9 + * \v 垂直制表(VT) 0B/11 + * \a 响铃(BEL) 07/7 + * \b 退格符(BS) 08H/8 + * \f 换页符(FF) 0CH/12 + * \’ 单引号 27H/39 + * \" 双引号 22H/34 + * \\ 反斜杠 5CH/92 + * \ddd 任意字符 三位八进制 + * \xhh 任意字符 二位十六进制 + */ + static int hex2int(char c){ + if(c >= 'A' && c <= 'F'){ + return int(c - 'A' + 10); + } + if(c >= 'a' && c <= 'f'){ + return int(c - 'a' + 10); + } + if(c >= '0' && c <= '9'){ + return int(c - '0'); + } + return -255; + } + int Trans :: str2str(const str_t & str, str_t * buf){ + if(str.size() == 0 || str[0] != '\"'){ + *buf = str; + return 0; + } + else{ + *buf = ""; + for(int i = 1; i < (int)str.size(); ++i){ + if( str[i] == '\"'){ + return 0; + } + else if(str[i] == '\\'){ + ++i; + if(i >= (int)str.size()){ + return FORMATERROR; + } + switch(str[i]){ + case '0': + buf->push_back('\0');break; + case 'n': + buf->push_back('\n');break; + case 'r': + buf->push_back('\r');break; + case 't': + buf->push_back('\t');break; + case 'v': + buf->push_back('\v');break; + case 'a': + buf->push_back('\a');break; + case 'b': + buf->push_back('\b');break; + case 'f': + buf->push_back('\f');break; + case '\'': + buf->push_back('\'');break; + case '\"': + buf->push_back('\"');break; + case '\\': + buf->push_back('\\');break; + case 'x': + default: + if(i+2 >= (int)str.size()){ + return FORMATERROR; + } + if(str[i] == 'x'){ + int c = hex2int(str[i+1]) * 16 + hex2int(str[i+2]); + if(c < 0){ + return FORMATERROR; + } + else{ + buf->push_back(char(c)); + } + } + else if(str[i] >= '0' && str[i] < '8'){ + int c = int(str[i] - '0') * 64 + int(str[i+1] - '0') * 8 + int(str[i+2] - '0'); + if(c > 255){ + return FORMATERROR; + } + else{ + buf->push_back(char(c)); + } + } + else{ + return FORMATERROR; + } + i += 2; + } + } + else{ + buf->push_back(str[i]); + } + } + } + return FORMATERROR; + } + + str_t Trans :: cutComment(const str_t & str){ + for(int i = 0; i < (int)str.size(); ++i){ + if(str[i] == '#'){ + return str.substr(0, i); + } + } + return str; + } + +} + + + + + + + + + + + + + + + +/* vim: set ts=4 sw=4 sts=4 tw=100 */ diff --git a/predictor/common/CMakeLists.txt b/predictor/common/CMakeLists.txt index 53b42e351f9b48b66d618316382857b99bd2b4d5..9708b7ed32e22abef4703a2da60c5d64dce807a6 100644 --- a/predictor/common/CMakeLists.txt +++ b/predictor/common/CMakeLists.txt @@ -1,4 +1,4 @@ add_library(common ${CMAKE_CURRENT_LIST_DIR}/constant.cpp ) -add_dependencies(common brpc) +add_dependencies(common brpc configure) diff --git a/predictor/op/CMakeLists.txt b/predictor/op/CMakeLists.txt index 8f1ece687d3c0fc3e2bcf92f0edc688fc13b2a66..ea21de118107ce473a42e3362660f12393fbe513 100644 --- a/predictor/op/CMakeLists.txt +++ b/predictor/op/CMakeLists.txt @@ -5,4 +5,4 @@ add_library(op STATIC ${CMAKE_CURRENT_LIST_DIR}/sparse_echo_op.cpp ${CMAKE_CURRENT_LIST_DIR}/write_json_op.cpp ) -add_dependencies(op proto) +add_dependencies(op proto brpc configure) diff --git a/spreg/CMakeLists.txt b/spreg/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..3b4b837da7cf06958e61e74cd7c4b93f2e8cb54e --- /dev/null +++ b/spreg/CMakeLists.txt @@ -0,0 +1,4 @@ +FILE(GLOB spreg_srcs ${CMAKE_CURRENT_LIST_DIR}/*.cpp) +add_library(spreg ${spreg_srcs}) +include_directories(${CMAKE_CURRENT_LIST_DIR}/include) +message(STATUS ${CMAKE_CURRENT_LIST_DIR}/include) diff --git a/spreg/spreg.cpp b/spreg/spreg.cpp new file mode 100644 index 0000000000000000000000000000000000000000..cc6d90a0e692f68bd1d0606ec952e767d5ec442b --- /dev/null +++ b/spreg/spreg.cpp @@ -0,0 +1,475 @@ +/*************************************************************************** + * + * Copyright (c) 2008 Baidu.com, Inc. All Rights Reserved + * $Id: spreg.cpp,v 1.9 2009/02/06 07:16:04 baonh Exp $ + * + **************************************************************************/ + + + +/** + * @file spreg.cpp + * @author baonh(baonenghui@baidu.com) + * @date 2008/05/27 20:03:06 + * @version $Revision: 1.9 $ + * @brief + * + **/ + +#include +#include +#include + +#include "spreg.h" + +struct _spreg_t { + pcre *_re; + pcre_extra *_extra; +}; + +static const char *const spreg_err_list[] = { + "", + "no match", + "bad argument", + "bad option", + "bad magic", + "unknown opcode", + "unknown node", + "no memory", + "no substring", + "match limit", + "callout", + "bad utf8", + "bad utf8 offset", + "partial", + "bad partial", + "internal error", + "bad count", + "dfa uitem", + "dfa ucond", + "dfa match limit", + "dfa recurse", + "recurse limit", + "null wslimit", + "bad newline" +}; + + + +spreg_match_t *spreg_match_init (int n) +{ + spreg_match_t *re_match; + re_match = (spreg_match_t *)malloc(sizeof(spreg_match_t)*((n/2)+1)*3); + return re_match; +} + +spreg_t * spreg_init(const char *reg, + const char **errinfo, + int option) +{ + static const char *memory_error = "failed to get memory"; + static const char *reg_null = "reg is NULL"; + char const *err = NULL; + int erroffset = 0; + spreg_t *re = NULL; + + if (NULL == reg) { + err = reg_null; + goto fail; + } + re = (spreg_t *)calloc(sizeof(spreg_t), 1); + if (NULL == re) { + err = memory_error; + goto fail; + } + re->_re = pcre_compile(reg, option, &err, &erroffset, NULL); + if (NULL == re->_re) { + goto fail; + } + re->_extra = pcre_study(re->_re, 0, &err); + if (err != NULL) { + goto fail; + } + if (errinfo != NULL) { + *errinfo = err; + } + return re; + +fail: + if (errinfo != NULL) { + *errinfo = err; + } + if (re != NULL) { + if (re->_re != NULL) { + pcre_free(re->_re); + } + if (re->_extra != NULL) { + pcre_free(re->_extra); + } + free(re); + } + return NULL; +} + + +int spreg_search(const spreg_t* re, + const char* src, + int src_size, + spreg_match_t *rmatch, + int n, + int option) +{ + if (NULL == re || NULL == src || src_size < 0) { + return SPREG_NULL; + } + + int ret = pcre_exec(re->_re, + re->_extra, + src, + src_size, + 0, + option, + (int*)rmatch, + 3*n); + + if (0 == ret) { + ret = n; + } + return ret; + +} + + + +int spreg_match(const spreg_t* re, + const char *src, + int src_size, + spreg_match_t *rmatch, + int n, + int option) +{ + spreg_match_t *res = rmatch; + int res_n = n; + int ret = 0; + if (NULL == re || NULL == src || src_size < 0) { + return SPREG_NULL; + } + if (NULL == rmatch || 0 == n) { + int capturecount = 0; + pcre_fullinfo(re->_re, NULL, PCRE_INFO_CAPTURECOUNT, &capturecount); + res_n = capturecount + 1; + res = spreg_match_init(res_n); + if (NULL == res) { + return SPREG_NOMEMORY; + } + } + ret = spreg_search(re, src, src_size, res, res_n, option); + + + if (!(ret > 0 && 0 == res[0].match_begin && src_size == res[0].match_end)) { + ret = SPREG_NOMATCH; + } + if (NULL == rmatch || 0 == n) { + spreg_match_destroy(res); + } + return ret; + +} + + +int spreg_search_all(const spreg_t *re, + const char *src, + int src_size, + spreg_callback_t *callback, + void *arg, + int option) +{ + if (NULL == re || NULL == callback || src_size < 0) { + return SPREG_NULL; + } + int n = 0; + spreg_match_t *res = NULL; + int capturecount = 0; + int offset = 0; + int ret = 0; + int capn = 0; + spreg_callback_param_t callback_match; + + pcre_fullinfo(re->_re, NULL, PCRE_INFO_CAPTURECOUNT, &capturecount); + n = capturecount + 1; + res = spreg_match_init(n); + if (NULL == res) { + return SPREG_NOMEMORY; + } + callback_match.src = src; + callback_match.src_size = src_size; + callback_match.rmatch = res; + callback_match.arg = arg; + do { + capn = spreg_search(re, src + offset, + src_size - offset, res, n, option); + + if (capn > 0) { + ret ++; + callback_match.nrmatch = capn; + for (int i = 0; i < callback_match.nrmatch; ++i) { + res[i].match_begin += offset; + res[i].match_end += offset; + } + + if (res[0].match_end == res[0].match_begin) { + offset = res[0].match_end + 1; + } else { + offset = res[0].match_end; + } + if (callback(&callback_match) < 0) { + break; + } + if (offset >= src_size) break; + } + } while (capn > 0); + + spreg_match_destroy(res); + return ret; +} + +int spreg_split(const spreg_t* re, + const char* src, + int src_size, + spreg_callback_t *callback, + void *arg, + int option) +{ + if (NULL == re || NULL == src || NULL == callback || + src_size < 0) { + return SPREG_NULL; + } + int n = 0; + spreg_match_t *res = NULL; + spreg_callback_param_t callback_match; + int capturecount = 0; + int offset = 0; + int ret = 0; + int capn = 0; + pcre_fullinfo(re->_re, NULL, PCRE_INFO_CAPTURECOUNT, &capturecount); + n = capturecount + 1; + res = spreg_match_init(n + 1); + if (NULL == res) { + return SPREG_NOMEMORY; + } + callback_match.src = src; + callback_match.src_size = src_size; + callback_match.rmatch = res; + callback_match.arg = arg; + do { + capn = spreg_search(re, src + offset, + src_size - offset, (res+1), n, option); + + + if (capn > 0) { + ret ++; + callback_match.nrmatch = capn + 1; + for (int i = 1; i < callback_match.nrmatch; ++i) { + res[i].match_begin += offset; + res[i].match_end += offset; + } + res[0].match_begin = offset; + res[0].match_end = res[1].match_begin; + + if (res[1].match_end == res[1].match_begin) { + offset = res[1].match_end + 1; + res[0].match_end ++; + } else { + offset = res[1].match_end; + } + + if (callback(&callback_match) < 0) { + goto end; + } + if (offset >= src_size) break; + + } + } while (capn > 0 && offset < src_size); + + if (offset < src_size) { + res[1].match_begin = -1; + res[1].match_end = -1; + res[0].match_begin = offset; + res[0].match_end = src_size; + callback_match.nrmatch = 1; + ret ++; + if (callback(&callback_match) < 0) { + goto end; + } + } +end: + spreg_match_destroy(res); + + return ret; +} + +typedef struct _replace_type_t { + int error; + int limit; + int last_match; + const char *replace_string; + char *dst; + char *dst_end; +} replace_type_t; + +static int replace_call_back(spreg_callback_param_t *callback_match) +{ + replace_type_t *replace = (replace_type_t *)(callback_match->arg); + + int match_len = 0; + int n = callback_match->nrmatch; + const char *walk = replace->replace_string; + const char *src = callback_match->src; + char *buffer = replace->dst; + char *buffer_end = replace->dst_end; + spreg_match_t *rmatch = callback_match->rmatch; + int copy_len = rmatch[0].match_begin - replace->last_match; + + int backref = 0; + + if (copy_len != 0) { + if (buffer + copy_len < buffer_end) { + memcpy(buffer, src + replace->last_match, copy_len); + buffer += copy_len; + } else { + replace->error = -1; + } + } + replace->last_match = rmatch[0].match_end; + while (*walk && buffer + 1 < buffer_end) { + if ('\\' == *walk) { + if (walk[1] > '9' || walk[1] < '1') { + if (walk[1] == '\\') { + *buffer++ = '\\'; + walk += 2; + } else { + ++ walk; + } + continue; + } + backref = walk[1] - '0'; + if (backref < n) { + match_len = rmatch[backref].match_end - rmatch[backref].match_begin; + if (buffer + match_len >= buffer_end) { + match_len = buffer_end - buffer; + replace->error = -1; + } + memcpy(buffer, src + rmatch[backref].match_begin, (size_t)match_len); + buffer += match_len; + walk += 2; + continue; + } + } + *buffer++ = *walk++; + } + replace->dst = buffer; + if (1 == replace->limit) { + //达到替换的数量限制,直接memcpy + if (replace->dst + callback_match->src_size - rmatch[0].match_end < buffer_end) { + memcpy(buffer, src + rmatch[0].match_end, + (size_t)(callback_match->src_size - rmatch[0].match_end)); + replace->dst += callback_match->src_size - rmatch[0].match_end; + } else { + //超过buffer的大小 + replace->error = -1; + } + return -1; + } else if (replace->error < 0) { + return -1; + } else if (replace->limit > 1) { + replace->limit --; + } + return 0; +} + +int spreg_replace(const spreg_t *re, + const char *src, + int src_size, + const char *replace_string, + char * dst, + int dst_size, + int limit, + int option) +{ + if (NULL == re || NULL == src || NULL == dst || + NULL == replace_string || src_size <= 0 || + dst_size <= 0 || limit < 0) { + return SPREG_NULL; + } + replace_type_t replace; + + replace.replace_string = replace_string; + replace.dst = dst; + replace.dst_end = dst + dst_size; + replace.error = 0; + replace.limit = limit; + replace.last_match = 0; + int ret = 0; + ret = spreg_search_all(re, src, src_size, replace_call_back, &replace, option); + + if (ret > 0) { + ret = replace.dst - dst; + if (replace.error < 0) { + return SPREG_BADBUFFER; + } else { + if (src_size != replace.last_match && replace.limit != 1) { + memcpy(replace.dst, src + replace.last_match, src_size - replace.last_match); + ret += src_size - replace.last_match; + } + } + } else if (0 == ret) { + //没有找到要替换的字符串,直接memcpy + if (src_size > dst_size) { + ret = SPREG_BADBUFFER; + } else { + memcpy(dst, src, (size_t)src_size); + ret = src_size; + } + } + return ret; +} + +int spreg_destroy(spreg_t *re) +{ + if (NULL != re) { + if (NULL != re->_re) { + pcre_free(re->_re); + re->_re = NULL; + } + + if (NULL != re->_extra) { + pcre_free(re->_extra); + re->_extra = NULL; + } + free(re); + } + return 0; +} + +int spreg_match_destroy(spreg_match_t *rmatch) +{ + if (NULL != rmatch) { + free(rmatch); + } + return 0; +} + +const char *spreg_error(int err) +{ + static const char *unknown = "unknown error code"; + static const char *badbuffer = "buffer is too small"; + err = -err; + if (err < 0) { + return unknown; + } + if (err >= (int)(sizeof(spreg_err_list)/sizeof(spreg_err_list[0]))) { + return badbuffer; + } + return spreg_err_list[err]; +} +/* vim: set ts=4 sw=4 sts=4 tw=100 noet: */ diff --git a/spreg/spreg.h b/spreg/spreg.h new file mode 100644 index 0000000000000000000000000000000000000000..00089c1ca5123f128cc9d83f036be190d56bc022 --- /dev/null +++ b/spreg/spreg.h @@ -0,0 +1,300 @@ +/*************************************************************************** + * + * Copyright (c) 2008 Baidu.com, Inc. All Rights Reserved + * $Id: spreg.h,v 1.6 2009/02/06 07:16:04 baonh Exp $ + * + **************************************************************************/ + + + +/** + * @file regexapi.h + * @author baonh(baonenghui@baidu.com) + * @version $Revision: 1.6 $ + * @brief COM REGEX 是对正则表式库PCRE进行的封装,在PCRE的基础上增加一些功能, + * 并进行了一定的简化,方便使用 + * + **/ + + +#ifndef __SPREG_H_ +#define __SPREG_H_ + +#include "pcre.h" + +/** +* @brief 错误码 +* +* +*/ +enum { + SPREG_NOMATCH = PCRE_ERROR_NOMATCH, /**< 不匹配 -1 */ + SPREG_NULL = PCRE_ERROR_NULL, /**< 传入参数非法 -2 */ + SPREG_BADOPTION = PCRE_ERROR_BADOPTION, /**< 匹配选项设置错误 -3 */ + SPREG_NOMEMORY = PCRE_ERROR_NOMEMORY, /**< 内存不够 -6 */ + SPREG_MATCHLIMIT = PCRE_ERROR_MATCHLIMIT, /**< 匹配数量过多 -8 */ + SPREG_BADUTF8 = PCRE_ERROR_BADUTF8, /**< 错误的UTF8编码 -10 */ + SPREG_INTERNAL = PCRE_ERROR_INTERNAL, /**< 内部错误 -14 */ + SPREG_BADNEWLINE = PCRE_ERROR_BADNEWLINE, /**< NEWLINE错误 -23 */ + SPREG_BADBUFFER = -99 /**< buffer不足,在PCRE中没有这个错误号*/ + /**< 是在@spreg_replace中替换结果的*/ + /**< 串缓冲空间太小时返回 */ +}; + +//正则匹配的选项 +#define SPREG_DEFAULT 0 /**< 默认选项 */ +#define SPREG_CASELESS PCRE_CASELESS /**< 忽略大小写 */ +#define SPREG_MULTILINE PCRE_MULTILINE /**< 采用多行模式,^ $可以匹配\r\n */ +#define SPREG_DOTALL PCRE_DOTALL /**< .号可以匹配\r\n */ +#define SPREG_NOTBOL PCRE_NOTBOL /**< ^不匹配串开头 */ +#define SPREG_NOTEOL PCRE_NOTEOL /**< $不匹配串末尾 */ +#define SPREG_UNGREEDY PCRE_UNGREEDY /**< 非贪婪模式 */ +#define SPREG_NOTEMPTY PCRE_NOTEMPTY /**< 匹配时不匹配空串 */ +#define SPREG_UTF8 PCRE_UTF8 /**< UTF8模式 */ +#define SPREG_NO_UTF8_CHECK PCRE_NO_UTF8_CHECK /**< 使用UTF8模式但不检查UTF8是否合法*/ + + + +/** + * @brief 存储每个匹配的返回结果 + * + * 每次匹配后除了 整个正则表达式匹配的串位置,还包括使用'('')'包含的子匹配表达式 + * + * + * 使用需要spreg_match_init出来,当成数组进行使用.下标0的位置是整个正则表达式匹配的串位置, + * 子匹配表达式顺序和'('出现的先后顺序相同 + * +**/ +typedef struct _spreg_match_t { + int match_begin; /**< 匹配串在原串中的开始位置 */ + int match_end; /**< 匹配串在原串中终止位置 */ +} spreg_match_t; + +/** + * @brief 用来做匹配的结构体 + * + * 使用需要spreg_init出来,使用后需要销毁 + * 一个spreg_t init好后在多个线程中使用是安全的 + * +**/ +typedef struct _spreg_t spreg_t; + + + +/** +* @brief 回调函数传入的参数,包括了匹配结果和进行匹配的目标串 +* +* 回调函数类型spreg_callback_t使用的参数,@spreg_search_all和 @spreg_split需要使用到 +* +* @note 在@spreg_search_all中rmatch中是代表的是每一次的匹配结果,包括了子匹配串。下标0位置表示 +* 完整的匹配串的位置。 +* +* 在@spreg_split中,rmatch[0]的表示分割串的位置,rmatch[1]的位置代表分割串后面第一个满足正则 +* 表达式的位置,rmatch[2]以后是其匹配的子匹配串 +*/ +typedef struct _spreg_callback_param_t { + spreg_match_t *rmatch; /**< 每一次的匹配结果,包括了子匹配串 */ + const char *src; /**< 进行匹配的目标串指针 */ + void *arg; /**< 用户传入自定义参数 */ + int nrmatch; /**< (子)匹配串个数 */ + int src_size; /**< 进行匹配的目标串长度 */ +} spreg_callback_param_t; + +/** + * @brief 回调函数类型 + * + * @param [in] callback_match : 回调函数传入的参数,包括了匹配结果和进行匹配的目标串 + * 回调函数返回值小于0,将停止匹配过程 + * 见@spreg_callback_param_t + * @author baonh +**/ +typedef int spreg_callback_t(spreg_callback_param_t *callback_match); + +/** + * @brief 分配返回结果使用的空间 + * + * 分配返回结果使用的空间,n为可存放的最大的匹配串个数, + * 正则表达式中用()包起来的子字符串的个数 + * + * @param [in] n : 最大的(子)匹配串个数 + * @return 存放正则匹配的返回结果 NULL为失败 + * @author baonh +**/ +spreg_match_t *spreg_match_init (int n); + +/** + * @brief 用正则表达式进行初始化 + * + * @param [in] reg : 需要初始化的正则表达式 + * @param [in] errinfo : 如果出错返回结果的错误描述,由于出错的类型非常多,不适合使用返回值 + * @param [in] option : 进行初始化的选项 + * - SPREG_DEFAULT 默认选项 + * - SPREG_CASELESS 忽略大小写 + * - SPREG_MULTILINE 使用多行模式 ^ $ 可以匹配 \r\n前后 + * - SPREG_DOTALL . 号可以匹配包括 \r\n在内的换行符 + * - SPREG_UNGREEDY 使用非贪婪模式 + * - SPREG_UTF8 使用UTF8模式,可以检查UTF8编码是否合法 + * - SPREG_NO_UTF8_CHECK 不检查UTF8编码是否合法 + * + * @return 初始化后的spreg_t, 是进行正则表达式匹配使用的句柄 + * @author baonh +**/ +spreg_t * spreg_init(const char *reg, + const char **errinfo = NULL, + int option = SPREG_DEFAULT); + +/** + * @brief 在src中查找符合re 的字符串 + * + * @param [in] : 进行查找的正则表达式句柄,由spreg_init初始化 + * @param [in] src : 需要查找的目标字符串 + * @param [in] src_size : 需要查找的目标字符串长度 + * @param [out] rmatch : 匹配的结果,如果这里设为NULL, n必须为0,否则会报错, + *             此时返回值为0表示src中存在符合re 的字符串 + * @param [in] n : 匹配的结果的最大(子)匹配串个数 + * @param [in] option : 进行匹配的选项 + * - SPREG_DEFAULT 默认选项 + * - SPREG_NO_UTF8_CHECK 不检查UTF8编码是否合法(re使用UTF8模式) + * - SPREG_NOTBOL 使用了SPREG_MULTILINE 后^不匹配字符串开头, + * 只匹配’\r’’\n’之后的新行开始, + * 没有指定PCRE_MULTILINE,这个选项无效 + * - SPREG_NOTEOL 使用了SPREG_MULTILINE后$不匹配字符串末尾, + * 只匹配以’\r’’\n’做为结束符的末尾, + * 没有指定PCRE_MULTILINE,这个选项无效 + * @return >0成功,返回匹配的子匹配串数量 非0为返回错误 见 错误码说明 + * 0 是当n == 0 时, 匹配成功返回的 + * @author baonh +**/ +int spreg_search(const spreg_t *re, + const char *src, + int src_size, + spreg_match_t *rmatch, + int n, + int option = SPREG_DEFAULT); +/** + * @brief 判断目标串 src是否完全匹配 正则表达式 re + * + * + * @param [in] re : 进行查找的正则表达式句柄,由spreg_init初始化 + * @param [in] src : 需要匹配的目标字符串 + * @param [in] src_size : 需要查找的目标字符串长度 + * @param [out] rmatch : 匹配的结果, 设为 NULL,不获取匹配结果 + * @param [in] n : 匹配的结果的最大(子)匹配串个数, 设0 不获取匹配结果 + * @param [in] option : 进行匹配的选项,见 spreg_search的option说明 + * @return >0匹配成功, 非0错误或不匹配 + * @author baonh +**/ + +int spreg_match(const spreg_t *re, + const char *src, + int src_size, + spreg_match_t *rmatch = NULL, + int n = 0, + int option = SPREG_DEFAULT); + +/** + * @brief 在src中查找所有符合re 的字符串 + * + * 通过 callback 对每个匹配项进行操作, callback返回值小于0,则停止匹配 + * callback中的参数说明见@spreg_callback_param_t + * + * @param [in] re : 进行查找的正则表达式句柄,由spreg_init初始化 + * @param [in] src : 需要查找的目标字符串 + * @param [in] src_size : 需要查找的目标字符串长度 + * @param [in] callback : 处理单个匹配的callback, + * @param [in] arg : 用户传入callback使用的参数,默认为NULL + * @param [in] option : 进行匹配的选项,见spreg_search的option说明 + * @return >0返回匹配成功的个数(包括callback返回值小于的最后一个匹配), <0 返回错误码 + * @author baonh +**/ + +int spreg_search_all(const spreg_t *re, + const char *src, + int src_size, + spreg_callback_t *callback, + void *arg = NULL, + int option = SPREG_DEFAULT); + +/** + * @brief 在src中按照 re 匹配的字符串进行分割 + * + * 通过 callback 对每个分割结果进行操作, callback返回值小于0,则停止匹配 + * callback 中的参数说明见@spreg_callback_param_t + * 注意:这里的分割的串包括空串 + * + * @param [in] re : 进行匹配的正则表达式句柄,由spreg_init初始化 + * @param [in] src : 需要分割的目标字符串 + * @param [in] src_size : 需要分割的目标字符串长度 + * @param [in] callback : 处理单个分割结果的callback + * @param [in] arg : 用户传入callback使用的参数,默认为NULL + * @param [in] option : 进行匹配的选项,见 spreg_search的option说明 + * @return >=0返回分割结果的个数(包括callback返回值小于的最后一个匹配), <0 返回错误码 + * @author baonh +**/ + +int spreg_split(const spreg_t *re, + const char *src, + int src_size, + spreg_callback_t *callback, + void *arg = NULL, + int option = SPREG_DEFAULT); + + +/** + * @brief 对目标串中满足re的串用replace_string进行替换 + * + * + * replace_string中可以使用特殊语法用\\1 \\2 表示匹配串的子串, 支持1-9 反向引用 + * + * @param [in] : 进行查找的正则表达式句柄,由spreg_init初始化 + * @param [in] src : 需要替换的目标字符串 + * @param [in] src_size : 需要查找的目标字符串长度 + * @param [in] replace_string : 用来替换的字符串 + * @param [in] dst : 替换后的结果 + * @param [in] dst_size : dst 的最大长度 + * @param [in] limit : 最多替换的个数,默认0为全部替换 + * @param [in] option : 进行匹配的选项,见 spreg_search的option说明 + * @return >=0匹配成功,返回结果字符串实际长度, 非0错误 + * @author baonh +**/ +int spreg_replace(const spreg_t *re, + const char *src, + int src_size, + const char *replace_string, + char *dst, + int dst_size, + int limit = 0, + int option = SPREG_DEFAULT); + + +/** + * @brief 销毁 spreg_t 结构体 + * + * @param [in] re : 需要销毁的spreg_t 结构体 + * @return 0返回成功 + * @author baonh +**/ +int spreg_destroy(spreg_t *re); + + +/** + * @brief 销毁 spreg_match_t 结构体 + * + * @param [in] rmatch : 需要销毁的spreg_match_t 结构体 + * @return 0 返回成功 + * @author baonh +**/ +int spreg_match_destroy(spreg_match_t *rmatch); + + +/** + * @brief 将匹配的错误信息已字符串形式输出,主要用于打错误日志 + * + * @param [in] err : 匹配时返回的错误信息 + * @author baonh +**/ +const char *spreg_error(int err); + +#endif //__SPREG_H_ + +/* vim: set ts=4 sw=4 sts=4 tw=100 noet: */ diff --git a/ullib/CMakeLists.txt b/ullib/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..c582086eb1966d0c635d194cf463a6c4d5c41264 --- /dev/null +++ b/ullib/CMakeLists.txt @@ -0,0 +1,4 @@ +FILE(GLOB ullib_srcs ${CMAKE_CURRENT_LIST_DIR}/src/*.cpp) +add_library(ullib ${ullib_srcs}) +include_directories(${CMAKE_CURRENT_LIST_DIR}/include) +message(STATUS ${CMAKE_CURRENT_LIST_DIR}/include) diff --git a/ullib/include/ul_error.h b/ullib/include/ul_error.h new file mode 100644 index 0000000000000000000000000000000000000000..c2c0f7541c15ab8b28d74d805cdd762698dc2940 --- /dev/null +++ b/ullib/include/ul_error.h @@ -0,0 +1,88 @@ +/*************************************************************************** + * + * Copyright (c) 2008 Baidu.com, Inc. All Rights Reserved + * $Id: ul_error.h,v 1.3 2009/12/29 03:24:00 baonh Exp $ + * + **************************************************************************/ + + + +/** + * @file ul_error.h + * @author xiaowei(xiaowei@baidu.com) + * @version $Revision: 1.3 $ + * @brief + * + **/ +#ifndef _UL_ERROR_H +#define _UL_ERROR_H +enum { + UL_SUCCESS = 0, //澶勭悊鎴愬姛 + UL_DETAIL_ERR, //缁嗚妭閿欒锛寀l鍐呴儴灏嗛敊璇俊鎭墦鍗板埌绾跨▼缂撳啿鍖哄幓 + UL_ALLOC_ERR, //鍐呭瓨鍒嗛厤閿欒 + UL_MEMSEG, //鍐呭瓨瓒婄晫 + UL_READ_ERR, //io璇诲け璐 + UL_WRITE_ERR, //io鍐欏け璐 + UL_INVALID_FD, //鏃犳晥鐨勫彞鏌 + UL_NETCONNET_ERR, //缃戠粶杩炴帴澶辫触 + UL_INVALID_PARAM, //鏃犳晥鐨勪紶鍏ュ弬鏁 + UL_OPEN_FILE_ERR, //鎵撳紑鏂囦欢鍙ユ焺澶辫触 +}; +/** + * @brief 璁剧疆閿欒鍙 + * + * @param [in] err : int 瑕佽缃殑閿欒鍙蜂唬鐮 + * @return int 鎴愬姛杩斿洖0锛屽叾浠栧け璐 + * @retval + * @see + * @author xiaowei + * @date 2007/12/03 21:13:41 +**/ +int ul_seterrno(int err); +/** + * @brief 鑾峰彇閿欒鍙 + * + * @return int 杩斿洖閿欒鍙蜂唬鐮 + * @retval + * @see + * @author xiaowei + * @date 2007/12/03 21:14:21 +**/ +int ul_geterrno(); +/** + * @brief 鏍规嵁閿欒鍙疯幏鍙栭敊璇俊鎭 + * + * @return const char* 杩斿洖閿欒鍙风殑閿欒鎻忚堪 + * @param [in] err : int 閿欒鍙蜂唬鍙 + * @retval + * @see + * @author xiaowei + * @date 2007/12/05 13:56:12 +**/ +const char *ul_geterrstr(int err); +/** + * @brief 璁剧疆閿欒鎻愮ず + * + * @param [in] format : const char* 璁剧疆閿欒淇℃伅 + * @return int 璁剧疆鎴愬姛杩斿洖0锛屽叾浠栧け璐 + * @retval + * @see + * @author xiaowei + * @date 2007/12/03 21:14:45 +**/ +int ul_seterrbuf(const char *format, ...); +/** + * @brief 鑾峰彇鎻愮ず淇℃伅缂撳啿鍖 + * + * @return const char* 鎴愬姛杩斿洖鍑洪敊缂撳啿鍖猴紝 + * 澶辫触杩斿洖""瀛楃涓 + * 涓嶄細杩斿洖NULL鎸囬拡 + * @retval + * @see + * @author xiaowei + * @date 2007/12/03 21:15:28 +**/ +const char *ul_geterrbuf(); +#endif +/* vim: set ts=4 sw=4 tw=100 noet: */ +/* vim: set ts=4 sw=4 sts=4 tw=100 noet: */ diff --git a/ullib/src/ul_error.cpp b/ullib/src/ul_error.cpp new file mode 100644 index 0000000000000000000000000000000000000000..d4032b29d16f2acce2298c5d3ea2d2e6b447755d --- /dev/null +++ b/ullib/src/ul_error.cpp @@ -0,0 +1,152 @@ +#include +#include +#include +#include +#include +#include "ul_error.h" +static const char *g_errstr[] = { + "CALL SUCCESS", + "CALL UL_GETERR(INT ERRNO) TO FIND DETAIL", + "ALLOC MEMORY FAIL", + "MEMORY SEGMENT", + "READ ERR", + "WRITE ERR", + "INVALID FILE[NET] HANDLE", + "NET CONNECT FAIL", + "INVALID INPUT PARAM", + "OPEN FILE ERR", +}; +/** + * 绾跨▼鍐呴儴浣跨敤鐨勭粺涓閿欒鍙 + */ +static pthread_key_t g_ulerrno_key = PTHREAD_KEYS_MAX; +static pthread_once_t g_ulerrno_ronce = PTHREAD_ONCE_INIT; +static void +ul_errno_destroy(void *ptr) +{ + if (ptr) { + free(ptr); + } +} +static void +ul_errno_runonce() +{ + pthread_key_create(&g_ulerrno_key, ul_errno_destroy); +} +static int * +ul_errno_get_ptr() +{ + void *ptr = NULL; + pthread_once(&g_ulerrno_ronce, ul_errno_runonce); + ptr = pthread_getspecific(g_ulerrno_key); + if (ptr == NULL) { + ptr = calloc(1, sizeof(int)); + pthread_setspecific(g_ulerrno_key, ptr); + } + return (int *) ptr; +} +int +ul_geterrno() +{ + int *errno = ul_errno_get_ptr(); + if (errno == NULL) { + return 0; + } + return *errno; +} +int +ul_seterrno(int err) +{ + int *errno = ul_errno_get_ptr(); + if (errno == NULL) { + return -1; + } + *errno = err; + return 0; +} +const char * +ul_geterrstr(int errno) +{ + if (errno < 0 || errno >= (int) (sizeof(g_errstr) / sizeof(g_errstr[0]))) { + return "INVALID ERRNO"; + } + if (errno == UL_DETAIL_ERR) { + return ul_geterrbuf(); + } + return g_errstr[errno]; +} +/** + * 绾跨▼鍐呴儴浣跨敤鐨勯敊璇紦鍐插尯 + */ +static const unsigned int UL_ERRSTR_BUFSIZE = 1024; +static pthread_key_t g_ulerrbuf_key = PTHREAD_KEYS_MAX; +static pthread_once_t g_ulerrbuf_ronce = PTHREAD_ONCE_INIT; +static void +ul_errbuf_destroy(void *ptr) +{ + if (ptr) { + free(ptr); + } +} +static void +ul_errbuf_runonce() +{ + pthread_key_create(&g_ulerrbuf_key, ul_errbuf_destroy); +} +static char * +ul_errbuf_get_ptr() +{ + void *ptr = NULL; + pthread_once(&g_ulerrbuf_ronce, ul_errbuf_runonce); + ptr = pthread_getspecific(g_ulerrbuf_key); + if (ptr == NULL) { + ptr = calloc(UL_ERRSTR_BUFSIZE, sizeof(char)); + pthread_setspecific(g_ulerrbuf_key, ptr); + } + return (char *) ptr; +} +const char * +ul_geterrbuf() +{ + char *errbuf = ul_errbuf_get_ptr(); + if (errbuf == NULL) { + return ""; + } + return (const char *) errbuf; +} +int +ul_seterrbuf(const char *format, ...) +{ + char *errbuf = ul_errbuf_get_ptr(); + if (errbuf == NULL) { + return -1; + } + va_list args; + va_start(args, format); + vsnprintf(errbuf, UL_ERRSTR_BUFSIZE, format, args); + va_end(args); + return 0; +} +//############################################################ +//modified by zhangyan04@baidu.com +class GlobalDestroy +{ + public: + ~GlobalDestroy() + { + void *ptr; + ptr=pthread_getspecific(g_ulerrno_key); + if(ptr){ + free(ptr); + pthread_setspecific(g_ulerrno_key, NULL); + } + ptr=pthread_getspecific(g_ulerrbuf_key); + if(ptr){ + free(ptr); + pthread_setspecific(g_ulerrbuf_key, NULL); + } + } +}; +static GlobalDestroy g_global_destroy; +//############################################################ +/* vim: set ts=4 sw=4 tw=100 noet: */