/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements. See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership. The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the  "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#if !defined(INDEX_FILE_DATA_1357924680)
#define INDEX_FILE_DATA_1357924680

#include <xercesc/util/XercesDefs.hpp>


const char* szApacheLicense[]={ 
 "/*\n",
 "* Copyright 1999-2004 The Apache Software Foundation.\n",
 "*\n",
 "* Licensed under the Apache License, Version 2.0 (the \"License\");\n",
 "* you may not use this file except in compliance with the License.\n",
 "* You may obtain a copy of the License at\n",
 "*\n",
 "*     http://www.apache.org/licenses/LICENSE-2.0\n",
 "*\n",
 "* Unless required by applicable law or agreed to in writing, software\n",
 "* distributed under the License is distributed on an \"AS IS\" BASIS,\n",
 "* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n",
 "* See the License for the specific language governing permissions and\n",
 "* limitations under the License.\n",
 "*/\n",
 "\n",
 "\n",
 "// ----------------------------------------------------------------\n",
 "//  This file was generated from the XalanC error message source.\n",
 "//  so do not edit this file directly!!\n",
 "// ----------------------------------------------------------------\n",
 0};


static const char* szStartIndexFile[]=
{

"\n",
"\n",
"\n",
"\n",
"#if !defined(XALAN_MSG_LOADER_INDEX_GUARD_1357924680) \n",
"#define XALAN_MSG_LOADER_INDEX_GUARD_1357924680 \n",
"\n",
"\n",
"\n",
"XALAN_CPP_NAMESPACE_BEGIN\n",
"\n",
"\n",
"class XalanMessages",
"{ \n",
"public : \n",
"    enum Codes \n",
"   { \n",
"      ",
0
};

static const char* szEndIndexFile[]=
{
"   };\n",
"\n",
"\n",
"};\n",
"\n",
"\n",
"XALAN_CPP_NAMESPACE_END \n",
"\n",
"\n",
"#endif //XALAN_MSG_LOADER_INDEX_GUARD_1357924680  \n",
"\n",
"\n",
0

};

static const char* szBeginIndexLine[]=
{ 
"     ,",
0
};


#endif //INDEX_FILE_DATA_1357924680


